@rivet-health/design-system 40.44.0 → 40.44.2

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 (321) hide show
  1. package/{esm2020 → esm2022}/lib/accessibility/sr-only/sr-only.component.mjs +4 -4
  2. package/esm2022/lib/download/download.service.mjs +47 -0
  3. package/{esm2020 → esm2022}/lib/format/pipes/common.mjs +5 -5
  4. package/{esm2020 → esm2022}/lib/format/pipes/date.pipe.mjs +4 -4
  5. package/{esm2020 → esm2022}/lib/format/pipes/days.pipe.mjs +4 -4
  6. package/{esm2020 → esm2022}/lib/format/pipes/dollars.pipe.mjs +4 -4
  7. package/{esm2020 → esm2022}/lib/format/pipes/number.pipe.mjs +4 -4
  8. package/{esm2020 → esm2022}/lib/format/pipes/percentage.pipe.mjs +4 -4
  9. package/esm2022/lib/format/pipes/sentence-case.pipe.mjs +61 -0
  10. package/esm2022/lib/format/pipes/small-currency.pipe.mjs +24 -0
  11. package/esm2022/lib/format/pipes/small-number.pipe.mjs +29 -0
  12. package/esm2022/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +62 -0
  13. package/esm2022/lib/format/truncate/truncate.component.mjs +51 -0
  14. package/esm2022/lib/icon/dom-cache.mjs +32 -0
  15. package/esm2022/lib/icon/icon.component.mjs +86 -0
  16. package/{esm2020 → esm2022}/lib/icon/icons.mjs +1 -1
  17. package/{esm2020 → esm2022}/lib/input/alphabetic-field/alphabetic-field.component.mjs +4 -4
  18. package/esm2022/lib/input/auto-focus/auto-focus.directive.mjs +48 -0
  19. package/esm2022/lib/input/button/button.component.mjs +139 -0
  20. package/esm2022/lib/input/button-group/button-group.component.mjs +39 -0
  21. package/{esm2020 → esm2022}/lib/input/calendar/calendar.component.mjs +4 -4
  22. package/{esm2020 → esm2022}/lib/input/card-checkbox/card-checkbox.component.mjs +4 -4
  23. package/{esm2020 → esm2022}/lib/input/checkbox/checkbox.component.mjs +4 -4
  24. package/{esm2020 → esm2022}/lib/input/currency-field/currency-field.component.mjs +4 -4
  25. package/esm2022/lib/input/date/date.component.mjs +279 -0
  26. package/esm2022/lib/input/date-range/date-range.component.mjs +477 -0
  27. package/esm2022/lib/input/filter-chip/filter-chip.component.mjs +47 -0
  28. package/{esm2020 → esm2022}/lib/input/filter-dropdown/filter-dropdown.component.mjs +5 -5
  29. package/{esm2020 → esm2022}/lib/input/input-label/input-label.component.mjs +4 -4
  30. package/esm2022/lib/input/mentions-input/mentions-input.component.mjs +745 -0
  31. package/esm2022/lib/input/number-field/number-field.component.mjs +125 -0
  32. package/{esm2020 → esm2022}/lib/input/percentage-field/percentage-field.component.mjs +4 -4
  33. package/esm2022/lib/input/phone-field/phone-field.component.mjs +74 -0
  34. package/{esm2020 → esm2022}/lib/input/radio/radio.component.mjs +4 -4
  35. package/{esm2020 → esm2022}/lib/input/search/search.component.mjs +4 -4
  36. package/esm2022/lib/input/search-select/search-select.component.mjs +189 -0
  37. package/esm2022/lib/input/select/select/select.component.mjs +178 -0
  38. package/{esm2020 → esm2022}/lib/input/select/select-node/select-node.component.mjs +4 -4
  39. package/esm2022/lib/input/select/state.mjs +882 -0
  40. package/{esm2020 → esm2022}/lib/input/simple-select/option-group.pipe.mjs +4 -4
  41. package/esm2022/lib/input/simple-select/simple-select.component.mjs +178 -0
  42. package/esm2022/lib/input/switch-checkbox/switch-checkbox.component.mjs +33 -0
  43. package/esm2022/lib/input/text-field/text-field.component.mjs +115 -0
  44. package/{esm2020 → esm2022}/lib/input/textarea-field/textarea-field.component.mjs +4 -4
  45. package/{esm2020 → esm2022}/lib/input/validation-message/validation-message.component.mjs +4 -4
  46. package/{esm2020 → esm2022}/lib/layout/card/card-actions.component.mjs +4 -4
  47. package/esm2022/lib/layout/card/card-content.component.mjs +64 -0
  48. package/esm2022/lib/layout/card/card-header.component.mjs +201 -0
  49. package/{esm2020 → esm2022}/lib/layout/card/card-link.component.mjs +5 -5
  50. package/{esm2020 → esm2022}/lib/layout/card/card-media.component.mjs +4 -4
  51. package/esm2022/lib/layout/card/card.component.mjs +291 -0
  52. package/{esm2020 → esm2022}/lib/layout/setting-row/setting-row.component.mjs +4 -4
  53. package/esm2022/lib/load/loading/loading.component.mjs +43 -0
  54. package/{esm2020 → esm2022}/lib/load/loading-cover/loading-cover.component.mjs +4 -4
  55. package/esm2022/lib/navigation/editable-heading/editable-heading.component.mjs +243 -0
  56. package/{esm2020 → esm2022}/lib/navigation/link/link.component.mjs +6 -6
  57. package/{esm2020 → esm2022}/lib/navigation/page-header/page-header.component.mjs +4 -4
  58. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tab/simple-tab.component.mjs +4 -4
  59. package/{esm2020 → esm2022}/lib/navigation/simple-tabs/simple-tabs/simple-tabs.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/navigation/tabs/tab/tab.component.mjs +4 -4
  61. package/{esm2020 → esm2022}/lib/navigation/tabs/tabs/tabs.component.mjs +4 -4
  62. package/{esm2020 → esm2022}/lib/navigation/views/all-views-modal/all-views-modal.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/navigation/views/edit-view/edit-view.component.mjs +9 -9
  64. package/esm2022/lib/navigation/views/permission-picker/permission-picker.component.mjs +151 -0
  65. package/esm2022/lib/navigation/views/state.mjs +456 -0
  66. package/{esm2020 → esm2022}/lib/navigation/views/view-menu/view-menu.component.mjs +5 -5
  67. package/esm2022/lib/navigation/views/views/views.component.mjs +90 -0
  68. package/{esm2020 → esm2022}/lib/notification/badge/badge.component.mjs +4 -4
  69. package/esm2022/lib/notification/banner/banner-action.component.mjs +48 -0
  70. package/esm2022/lib/notification/banner/banner.component.mjs +61 -0
  71. package/esm2022/lib/notification/map-indicator/map-indicator.component.mjs +50 -0
  72. package/esm2022/lib/notification/map-indicator/map-indicators.mjs +15 -0
  73. package/{esm2020 → esm2022}/lib/notification/notification-badge/notification-badge.component.mjs +4 -4
  74. package/esm2022/lib/overlay/callout/callout.component.mjs +130 -0
  75. package/esm2022/lib/overlay/callout/callout.helpers.mjs +113 -0
  76. package/{esm2020 → esm2022}/lib/overlay/callout/help/help.component.mjs +4 -4
  77. package/esm2022/lib/overlay/callout/lock-scroll.directive.mjs +69 -0
  78. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu-item/menu-item.component.mjs +5 -5
  79. package/{esm2020 → esm2022}/lib/overlay/callout/menu/menu.component.mjs +4 -4
  80. package/esm2022/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +30 -0
  81. package/{esm2020 → esm2022}/lib/overlay/callout/tooltip/tooltip.component.mjs +4 -4
  82. package/esm2022/lib/overlay/callout/tooltip/tooltip.directive.mjs +138 -0
  83. package/esm2022/lib/overlay/modal/dialog/dialog.component.mjs +47 -0
  84. package/{esm2020 → esm2022}/lib/overlay/modal/dialog-stack.service.mjs +4 -4
  85. package/esm2022/lib/overlay/modal/form-dialog/form-dialog.component.mjs +146 -0
  86. package/esm2022/lib/overlay/modal/modal.component.mjs +31 -0
  87. package/{esm2020 → esm2022}/lib/overlay/modal/side-sheet/side-sheet.component.mjs +4 -4
  88. package/esm2022/lib/overlay/overlay-outlet.component.mjs +98 -0
  89. package/{esm2020 → esm2022}/lib/overlay/overlay.directive.mjs +5 -5
  90. package/{esm2020 → esm2022}/lib/overlay/overlay.service.mjs +5 -5
  91. package/{esm2020 → esm2022}/lib/overlay/toast/toast-action.component.mjs +4 -4
  92. package/esm2022/lib/overlay/toast/toast.component.mjs +41 -0
  93. package/{esm2020 → esm2022}/lib/riv.module.mjs +227 -227
  94. package/esm2022/lib/size/size.directive.mjs +33 -0
  95. package/esm2022/lib/table/simple-table/coordinate-helper.mjs +61 -0
  96. package/esm2022/lib/table/simple-table/simple-table-cell.component.mjs +36 -0
  97. package/esm2022/lib/table/simple-table/simple-table-header-cell.component.mjs +37 -0
  98. package/{esm2020 → esm2022}/lib/table/simple-table/simple-table-row.component.mjs +4 -4
  99. package/esm2022/lib/table/simple-table/simple-table.component.mjs +104 -0
  100. package/esm2022/lib/table/table/clipboard.mjs +182 -0
  101. package/esm2022/lib/table/table/state-helpers/collapse-helpers.mjs +116 -0
  102. package/esm2022/lib/table/table/state-helpers/column-helpers.mjs +383 -0
  103. package/{esm2020 → esm2022}/lib/table/table/state-helpers/display-helpers.mjs +1 -1
  104. package/esm2022/lib/table/table/state-helpers/nesting-helpers.mjs +123 -0
  105. package/esm2022/lib/table/table/state-helpers/order-helpers.mjs +164 -0
  106. package/esm2022/lib/table/table/state-helpers/pagination-helpers.mjs +139 -0
  107. package/esm2022/lib/table/table/state-helpers/result-helpers.mjs +70 -0
  108. package/esm2022/lib/table/table/state-helpers/search-helpers.mjs +72 -0
  109. package/esm2022/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
  110. package/esm2022/lib/table/table/state.mjs +1035 -0
  111. package/esm2022/lib/table/table/table/table.component.mjs +367 -0
  112. package/{esm2020 → esm2022}/lib/table/table/table-collapse-all/table-collapse-all.component.mjs +5 -5
  113. package/esm2022/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +227 -0
  114. package/esm2022/lib/table/table/table-column-settings/table-column-settings.component.mjs +134 -0
  115. package/esm2022/lib/table/table/table-csv-export/table-csv-export.component.mjs +35 -0
  116. package/{esm2020 → esm2022}/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +6 -6
  117. package/esm2022/lib/table/table/table-search/table-search.component.mjs +71 -0
  118. package/{esm2020 → esm2022}/lib/table/table/table-search-columns/table-search-columns.component.mjs +4 -4
  119. package/esm2022/lib/visibility/visibility.directive.mjs +34 -0
  120. package/esm2022/lib/visualization/chart/chart-scaling.mjs +380 -0
  121. package/esm2022/lib/visualization/chart/chart.component.mjs +626 -0
  122. package/esm2022/lib/visualization/chart/chart.mjs +3768 -0
  123. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-cell.component.mjs +5 -5
  124. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-header-cell.component.mjs +4 -4
  125. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table-row.component.mjs +4 -4
  126. package/{esm2020 → esm2022}/lib/visualization/data-table/data-table.component.mjs +4 -4
  127. package/{esm2020 → esm2022}/lib/visualization/donut/donut.component.mjs +4 -4
  128. package/{esm2020 → esm2022}/lib/visualization/funnel-chart/funnel-chart.component.mjs +5 -5
  129. package/esm2022/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +33 -0
  130. package/{esm2020 → esm2022}/lib/visualization/highlight/highlight.component.mjs +4 -4
  131. package/esm2022/lib/visualization/highlight/highlight.helpers.mjs +20 -0
  132. package/esm2022/lib/visualization/intervals.mjs +63 -0
  133. package/{esm2020 → esm2022}/lib/visualization/issue/issue.component.mjs +4 -4
  134. package/{esm2020 → esm2022}/lib/visualization/legend-item/legend-item.component.mjs +4 -4
  135. package/{esm2020 → esm2022}/lib/visualization/metric/metric.component.mjs +4 -4
  136. package/{esm2020 → esm2022}/lib/visualization/mini-pie/mini-pie.component.mjs +4 -4
  137. package/{esm2020 → esm2022}/lib/visualization/progress/progress.component.mjs +5 -5
  138. package/esm2022/lib/visualization/stacked-column/stacked-column.component.mjs +377 -0
  139. package/esm2022/lib/visualization/stacked-column/stacked-column.helpers.mjs +18 -0
  140. package/esm2022/lib/visualization/stacked-row/stacked-row.component.mjs +270 -0
  141. package/esm2022/lib/visualization/stacked-row/stacked-row.helpers.mjs +74 -0
  142. package/esm2022/lib/visualization/time-series/time-series.component.mjs +374 -0
  143. package/esm2022/lib/visualization/time-series/time-series.helpers.mjs +15 -0
  144. package/esm2022/lib/visualization/trend/trend.component.mjs +51 -0
  145. package/{esm2020 → esm2022}/lib/visualization/zero-state/zero-state.component.mjs +4 -4
  146. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs +670 -670
  147. package/{fesm2020 → fesm2022}/rivet-health-design-system.mjs.map +1 -1
  148. package/lib/format/svg-text-truncate/svg-text-truncate.directive.d.ts +1 -1
  149. package/lib/format/truncate/truncate.component.d.ts +1 -1
  150. package/lib/icon/icon.component.d.ts +1 -1
  151. package/lib/input/auto-focus/auto-focus.directive.d.ts +1 -1
  152. package/lib/input/button/button.component.d.ts +1 -1
  153. package/lib/input/calendar/calendar.component.d.ts +1 -1
  154. package/lib/input/checkbox/checkbox.component.d.ts +1 -1
  155. package/lib/input/currency-field/currency-field.component.d.ts +1 -1
  156. package/lib/input/date/date.component.d.ts +1 -1
  157. package/lib/input/date-range/date-range.component.d.ts +1 -1
  158. package/lib/input/filter-chip/filter-chip.component.d.ts +1 -1
  159. package/lib/input/filter-dropdown/filter-dropdown.component.d.ts +1 -1
  160. package/lib/input/input-label/input-label.component.d.ts +1 -1
  161. package/lib/input/mentions-input/mentions-input.component.d.ts +1 -1
  162. package/lib/input/number-field/number-field.component.d.ts +1 -1
  163. package/lib/input/percentage-field/percentage-field.component.d.ts +1 -1
  164. package/lib/input/phone-field/phone-field.component.d.ts +1 -1
  165. package/lib/input/radio/radio.component.d.ts +1 -1
  166. package/lib/input/search/search.component.d.ts +1 -1
  167. package/lib/input/search-select/search-select.component.d.ts +1 -1
  168. package/lib/input/select/select/select.component.d.ts +1 -1
  169. package/lib/input/select/select-node/select-node.component.d.ts +1 -1
  170. package/lib/input/simple-select/simple-select.component.d.ts +1 -1
  171. package/lib/input/switch-checkbox/switch-checkbox.component.d.ts +1 -1
  172. package/lib/input/text-field/text-field.component.d.ts +1 -1
  173. package/lib/input/textarea-field/textarea-field.component.d.ts +1 -1
  174. package/lib/input/validation-message/validation-message.component.d.ts +1 -1
  175. package/lib/layout/card/card-actions.component.d.ts +1 -1
  176. package/lib/layout/card/card-content.component.d.ts +1 -1
  177. package/lib/layout/card/card-header.component.d.ts +1 -1
  178. package/lib/layout/card/card-link.component.d.ts +1 -1
  179. package/lib/layout/card/card-media.component.d.ts +1 -1
  180. package/lib/layout/card/card.component.d.ts +1 -1
  181. package/lib/layout/setting-row/setting-row.component.d.ts +1 -1
  182. package/lib/load/loading/loading.component.d.ts +1 -1
  183. package/lib/load/loading-cover/loading-cover.component.d.ts +1 -1
  184. package/lib/navigation/editable-heading/editable-heading.component.d.ts +1 -1
  185. package/lib/navigation/link/link.component.d.ts +1 -1
  186. package/lib/navigation/page-header/page-header.component.d.ts +1 -1
  187. package/lib/navigation/simple-tabs/simple-tab/simple-tab.component.d.ts +1 -1
  188. package/lib/navigation/tabs/tab/tab.component.d.ts +1 -1
  189. package/lib/navigation/views/all-views-modal/all-views-modal.component.d.ts +1 -1
  190. package/lib/navigation/views/edit-view/edit-view.component.d.ts +1 -1
  191. package/lib/navigation/views/permission-picker/permission-picker.component.d.ts +3 -3
  192. package/lib/navigation/views/view-menu/view-menu.component.d.ts +1 -1
  193. package/lib/navigation/views/views/views.component.d.ts +1 -1
  194. package/lib/notification/badge/badge.component.d.ts +1 -1
  195. package/lib/notification/banner/banner-action.component.d.ts +1 -1
  196. package/lib/notification/banner/banner.component.d.ts +1 -1
  197. package/lib/notification/map-indicator/map-indicator.component.d.ts +1 -1
  198. package/lib/notification/notification-badge/notification-badge.component.d.ts +1 -1
  199. package/lib/overlay/callout/callout.component.d.ts +1 -1
  200. package/lib/overlay/callout/help/help.component.d.ts +1 -1
  201. package/lib/overlay/callout/lock-scroll.directive.d.ts +1 -1
  202. package/lib/overlay/callout/menu/menu-item/menu-item.component.d.ts +1 -1
  203. package/lib/overlay/callout/menu/menu.component.d.ts +1 -1
  204. package/lib/overlay/callout/tooltip/locked-tooltip.directive.d.ts +1 -1
  205. package/lib/overlay/callout/tooltip/tooltip.component.d.ts +1 -1
  206. package/lib/overlay/callout/tooltip/tooltip.directive.d.ts +1 -1
  207. package/lib/overlay/modal/dialog/dialog.component.d.ts +1 -1
  208. package/lib/overlay/modal/form-dialog/form-dialog.component.d.ts +1 -1
  209. package/lib/overlay/modal/modal.component.d.ts +1 -1
  210. package/lib/overlay/modal/side-sheet/side-sheet.component.d.ts +1 -1
  211. package/lib/overlay/toast/toast.component.d.ts +1 -1
  212. package/lib/table/simple-table/simple-table-header-cell.component.d.ts +1 -1
  213. package/lib/table/simple-table/simple-table-row.component.d.ts +1 -1
  214. package/lib/table/table/table/table.component.d.ts +1 -1
  215. package/lib/table/table/table-collapse-all/table-collapse-all.component.d.ts +1 -1
  216. package/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.d.ts +1 -1
  217. package/lib/table/table/table-column-settings/table-column-settings.component.d.ts +1 -1
  218. package/lib/table/table/table-csv-export/table-csv-export.component.d.ts +1 -1
  219. package/lib/table/table/table-search/table-search.component.d.ts +1 -1
  220. package/lib/table/table/table-search-columns/table-search-columns.component.d.ts +1 -1
  221. package/lib/visualization/chart/chart.component.d.ts +1 -1
  222. package/lib/visualization/data-table/data-table-row.component.d.ts +1 -1
  223. package/lib/visualization/donut/donut.component.d.ts +1 -1
  224. package/lib/visualization/funnel-chart/funnel-chart.component.d.ts +1 -1
  225. package/lib/visualization/highlight/highlight.component.d.ts +1 -1
  226. package/lib/visualization/issue/issue.component.d.ts +1 -1
  227. package/lib/visualization/legend-item/legend-item.component.d.ts +1 -1
  228. package/lib/visualization/metric/metric.component.d.ts +1 -1
  229. package/lib/visualization/mini-pie/mini-pie.component.d.ts +1 -1
  230. package/lib/visualization/progress/progress.component.d.ts +1 -1
  231. package/lib/visualization/stacked-column/stacked-column.component.d.ts +3 -3
  232. package/lib/visualization/stacked-row/stacked-row.component.d.ts +1 -1
  233. package/lib/visualization/time-series/time-series.component.d.ts +3 -3
  234. package/lib/visualization/trend/trend.component.d.ts +1 -1
  235. package/lib/visualization/zero-state/zero-state.component.d.ts +1 -1
  236. package/package.json +5 -11
  237. package/esm2020/lib/download/download.service.mjs +0 -47
  238. package/esm2020/lib/format/pipes/sentence-case.pipe.mjs +0 -61
  239. package/esm2020/lib/format/pipes/small-currency.pipe.mjs +0 -24
  240. package/esm2020/lib/format/pipes/small-number.pipe.mjs +0 -29
  241. package/esm2020/lib/format/svg-text-truncate/svg-text-truncate.directive.mjs +0 -62
  242. package/esm2020/lib/format/truncate/truncate.component.mjs +0 -51
  243. package/esm2020/lib/icon/dom-cache.mjs +0 -32
  244. package/esm2020/lib/icon/icon.component.mjs +0 -86
  245. package/esm2020/lib/input/auto-focus/auto-focus.directive.mjs +0 -48
  246. package/esm2020/lib/input/button/button.component.mjs +0 -139
  247. package/esm2020/lib/input/button-group/button-group.component.mjs +0 -39
  248. package/esm2020/lib/input/date/date.component.mjs +0 -279
  249. package/esm2020/lib/input/date-range/date-range.component.mjs +0 -477
  250. package/esm2020/lib/input/filter-chip/filter-chip.component.mjs +0 -47
  251. package/esm2020/lib/input/mentions-input/mentions-input.component.mjs +0 -745
  252. package/esm2020/lib/input/number-field/number-field.component.mjs +0 -125
  253. package/esm2020/lib/input/phone-field/phone-field.component.mjs +0 -74
  254. package/esm2020/lib/input/search-select/search-select.component.mjs +0 -189
  255. package/esm2020/lib/input/select/select/select.component.mjs +0 -178
  256. package/esm2020/lib/input/select/state.mjs +0 -882
  257. package/esm2020/lib/input/simple-select/simple-select.component.mjs +0 -178
  258. package/esm2020/lib/input/switch-checkbox/switch-checkbox.component.mjs +0 -33
  259. package/esm2020/lib/input/text-field/text-field.component.mjs +0 -115
  260. package/esm2020/lib/layout/card/card-content.component.mjs +0 -64
  261. package/esm2020/lib/layout/card/card-header.component.mjs +0 -201
  262. package/esm2020/lib/layout/card/card.component.mjs +0 -291
  263. package/esm2020/lib/load/loading/loading.component.mjs +0 -43
  264. package/esm2020/lib/navigation/editable-heading/editable-heading.component.mjs +0 -243
  265. package/esm2020/lib/navigation/views/permission-picker/permission-picker.component.mjs +0 -151
  266. package/esm2020/lib/navigation/views/state.mjs +0 -456
  267. package/esm2020/lib/navigation/views/views/views.component.mjs +0 -90
  268. package/esm2020/lib/notification/banner/banner-action.component.mjs +0 -48
  269. package/esm2020/lib/notification/banner/banner.component.mjs +0 -61
  270. package/esm2020/lib/notification/map-indicator/map-indicator.component.mjs +0 -50
  271. package/esm2020/lib/notification/map-indicator/map-indicators.mjs +0 -15
  272. package/esm2020/lib/overlay/callout/callout.component.mjs +0 -130
  273. package/esm2020/lib/overlay/callout/callout.helpers.mjs +0 -113
  274. package/esm2020/lib/overlay/callout/lock-scroll.directive.mjs +0 -69
  275. package/esm2020/lib/overlay/callout/tooltip/locked-tooltip.directive.mjs +0 -30
  276. package/esm2020/lib/overlay/callout/tooltip/tooltip.directive.mjs +0 -138
  277. package/esm2020/lib/overlay/modal/dialog/dialog.component.mjs +0 -47
  278. package/esm2020/lib/overlay/modal/form-dialog/form-dialog.component.mjs +0 -146
  279. package/esm2020/lib/overlay/modal/modal.component.mjs +0 -31
  280. package/esm2020/lib/overlay/overlay-outlet.component.mjs +0 -98
  281. package/esm2020/lib/overlay/toast/toast.component.mjs +0 -41
  282. package/esm2020/lib/size/size.directive.mjs +0 -33
  283. package/esm2020/lib/table/simple-table/coordinate-helper.mjs +0 -61
  284. package/esm2020/lib/table/simple-table/simple-table-cell.component.mjs +0 -36
  285. package/esm2020/lib/table/simple-table/simple-table-header-cell.component.mjs +0 -37
  286. package/esm2020/lib/table/simple-table/simple-table.component.mjs +0 -104
  287. package/esm2020/lib/table/table/clipboard.mjs +0 -182
  288. package/esm2020/lib/table/table/state-helpers/collapse-helpers.mjs +0 -116
  289. package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +0 -383
  290. package/esm2020/lib/table/table/state-helpers/nesting-helpers.mjs +0 -123
  291. package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +0 -164
  292. package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +0 -139
  293. package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +0 -70
  294. package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +0 -72
  295. package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +0 -180
  296. package/esm2020/lib/table/table/state.mjs +0 -1035
  297. package/esm2020/lib/table/table/table/table.component.mjs +0 -367
  298. package/esm2020/lib/table/table/table-column-settings/table-column-settings-side-sheet.component.mjs +0 -227
  299. package/esm2020/lib/table/table/table-column-settings/table-column-settings.component.mjs +0 -134
  300. package/esm2020/lib/table/table/table-csv-export/table-csv-export.component.mjs +0 -35
  301. package/esm2020/lib/table/table/table-search/table-search.component.mjs +0 -71
  302. package/esm2020/lib/visibility/visibility.directive.mjs +0 -34
  303. package/esm2020/lib/visualization/chart/chart-scaling.mjs +0 -380
  304. package/esm2020/lib/visualization/chart/chart.component.mjs +0 -626
  305. package/esm2020/lib/visualization/chart/chart.mjs +0 -3768
  306. package/esm2020/lib/visualization/funnel-chart/funnel-chart.helpers.mjs +0 -33
  307. package/esm2020/lib/visualization/highlight/highlight.helpers.mjs +0 -20
  308. package/esm2020/lib/visualization/intervals.mjs +0 -63
  309. package/esm2020/lib/visualization/stacked-column/stacked-column.component.mjs +0 -377
  310. package/esm2020/lib/visualization/stacked-column/stacked-column.helpers.mjs +0 -18
  311. package/esm2020/lib/visualization/stacked-row/stacked-row.component.mjs +0 -270
  312. package/esm2020/lib/visualization/stacked-row/stacked-row.helpers.mjs +0 -74
  313. package/esm2020/lib/visualization/time-series/time-series.component.mjs +0 -374
  314. package/esm2020/lib/visualization/time-series/time-series.helpers.mjs +0 -15
  315. package/esm2020/lib/visualization/trend/trend.component.mjs +0 -51
  316. package/fesm2015/rivet-health-design-system.mjs +0 -18370
  317. package/fesm2015/rivet-health-design-system.mjs.map +0 -1
  318. /package/{esm2020 → esm2022}/lib/overlay/callout/select-callout-defaults.mjs +0 -0
  319. /package/{esm2020 → esm2022}/lib/util/local-storage.mjs +0 -0
  320. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  321. /package/{esm2020 → esm2022}/rivet-health-design-system.mjs +0 -0
@@ -0,0 +1,1035 @@
1
+ import Fuse from 'fuse.js';
2
+ import { defaultsDeep, isEqual } from 'lodash';
3
+ import { connectable, filter, from, map, mergeScan, ReplaySubject, scan, share, Subject, } from 'rxjs';
4
+ import { toSentenceCase } from '../../format/pipes/sentence-case.pipe';
5
+ import { TableCollapseHelpers } from './state-helpers/collapse-helpers';
6
+ import { TableColumnHelpers } from './state-helpers/column-helpers';
7
+ import { TableDisplayHelpers } from './state-helpers/display-helpers';
8
+ import { TableNestingHelpers } from './state-helpers/nesting-helpers';
9
+ import { TableOrderHelpers } from './state-helpers/order-helpers';
10
+ import { TablePaginationHelpers } from './state-helpers/pagination-helpers';
11
+ import { TableResultHelpers } from './state-helpers/result-helpers';
12
+ import { TableSearchHelpers } from './state-helpers/search-helpers';
13
+ import { TableSelectionHelpers } from './state-helpers/selection-helpers';
14
+ export var RivTable;
15
+ (function (RivTable) {
16
+ RivTable.pageSizes = [25, 50, 100, 250];
17
+ // Full state (core state plus pure derivations) //
18
+ RivTable.ColumnsMaxShown = 50;
19
+ RivTable.ColumnDataTypes = [
20
+ 'advanced',
21
+ 'currency',
22
+ 'date',
23
+ 'icon',
24
+ 'longText',
25
+ 'number',
26
+ 'shortText',
27
+ ];
28
+ function createManager(source, columns, pluralEntityName, options) {
29
+ // Set up the initial table state.
30
+ const searchableColumnMap = new Map(Array.from(columns.entries()).map(([key, metadata]) => [
31
+ key,
32
+ metadata.searchable ?? true,
33
+ ]));
34
+ const defaultState = {
35
+ query: {
36
+ order: null,
37
+ search: '',
38
+ searchColumns: new Map(Array.from(columns.keys())
39
+ .filter(key => searchableColumnMap.get(key))
40
+ .map(key => [key, true])),
41
+ pagination: {
42
+ page: 0,
43
+ pageSize: 25,
44
+ },
45
+ grouping: {
46
+ viewMoreKey: null,
47
+ groupsPerPage: 5,
48
+ countPerGroup: 10,
49
+ },
50
+ filters: null,
51
+ },
52
+ load: { loading: false, error: null },
53
+ result: {
54
+ currentPageData: [],
55
+ totalMatchingRowCount: 0,
56
+ },
57
+ display: {
58
+ columnSettings: [],
59
+ cellRowSpan: (_i, _column) => 1,
60
+ },
61
+ selection: {
62
+ mostRecentlySelected: null,
63
+ mode: 'include',
64
+ included: new Set(),
65
+ },
66
+ collapseState: {
67
+ defaultTo: 'expanded',
68
+ collapsedRows: new Set(),
69
+ collapsedHeaders: new Set(),
70
+ },
71
+ };
72
+ const defaultedInitialState = defaultsDeep({}, options?.initialState, defaultState);
73
+ const columnNameMap = new Map(Array.from(columns.entries()).map(([key, metadata]) => {
74
+ const columnDisplayName = metadata.displayName ?? key;
75
+ const formattedColumnName = options?.columnsUseOriginalCasing
76
+ ? columnDisplayName
77
+ : toSentenceCase(columnDisplayName);
78
+ return [key, formattedColumnName];
79
+ }));
80
+ const defaultColumnState = options?.defaultColumnState ??
81
+ defaultedInitialState.display.columnSettings;
82
+ // Wire up reduced state from actions and initial state.
83
+ const actions = new Subject();
84
+ const coreState = actions.pipe(mergeScan(({ state }, action) => from(reduce(state, action, columns, source, columnNameMap, defaultColumnState)), { state: defaultedInitialState, effect: null }, 1), share({
85
+ connector: () => new ReplaySubject(1),
86
+ resetOnError: false,
87
+ resetOnComplete: false,
88
+ resetOnRefCountZero: false,
89
+ }));
90
+ const csvExportAllowed = !(options?.getRowSpanForCell || options?.customSummaryRow);
91
+ // Augment state with derived state, and subscribe.
92
+ const state = connectable(coreState.pipe(map(({ state: s }) => {
93
+ const resolvedColumns = TableColumnHelpers.resolveColumns(s, columns, columnNameMap, !!options?.allowSelection, 'enabled', !!options?.hasNestedHeaders);
94
+ const resolvedDisabledColumns = TableColumnHelpers.resolveColumns(s, columns, columnNameMap, !!options?.allowSelection, 'disabled', !!options?.hasNestedHeaders);
95
+ if (TableResultHelpers.isGroupResult(s.result)) {
96
+ return deriveFullStateFromGroupResult({
97
+ s,
98
+ stateResult: s.result,
99
+ source,
100
+ columns,
101
+ pluralEntityName,
102
+ columnNameMap,
103
+ resolvedColumns,
104
+ resolvedDisabledColumns,
105
+ searchableColumnMap,
106
+ csvExportAllowed,
107
+ options,
108
+ });
109
+ }
110
+ else if (TableResultHelpers.isNestedResult(s.result)) {
111
+ return deriveFullStateFromNestedResult({
112
+ s,
113
+ stateResult: s.result,
114
+ source,
115
+ columns,
116
+ pluralEntityName,
117
+ columnNameMap,
118
+ resolvedColumns,
119
+ resolvedDisabledColumns,
120
+ searchableColumnMap,
121
+ csvExportAllowed,
122
+ options,
123
+ });
124
+ }
125
+ else {
126
+ return deriveFullStateFromRegularResult({
127
+ s,
128
+ stateResult: s.result,
129
+ source,
130
+ columns,
131
+ pluralEntityName,
132
+ columnNameMap,
133
+ resolvedColumns,
134
+ resolvedDisabledColumns,
135
+ searchableColumnMap,
136
+ csvExportAllowed,
137
+ options,
138
+ });
139
+ }
140
+ }), scan((stable, newState) => stableState(stable, newState))), {
141
+ connector: () => new ReplaySubject(1),
142
+ resetOnDisconnect: false,
143
+ });
144
+ state.connect();
145
+ const effects = connectable(coreState.pipe(filter(({ effect }) => effect !== null), map(({ effect }) => effect)), {
146
+ connector: () => new ReplaySubject(1),
147
+ resetOnDisconnect: false,
148
+ });
149
+ effects.connect();
150
+ // Load initial table row data.
151
+ actions.next({ type: 'load' });
152
+ return { actions, state, effects };
153
+ }
154
+ RivTable.createManager = createManager;
155
+ function deriveFullStateFromGroupResult(props) {
156
+ const { s, stateResult, source, columns, pluralEntityName, columnNameMap, resolvedColumns, resolvedDisabledColumns, searchableColumnMap, csvExportAllowed, options, } = props;
157
+ if (options?.getRowSpanForCell) {
158
+ // eslint-disable-next-line no-console
159
+ console.warn('Heads up! Custom row spans are not supported for grouped tables.');
160
+ }
161
+ if (options?.customSummaryRow) {
162
+ // eslint-disable-next-line no-console
163
+ console.warn('Heads up! Custom summary rows are not supported for grouped tables.');
164
+ }
165
+ const rowGroups = stateResult.groupResults.map(group => ({
166
+ rows: group.currentPageData.map(row => ({
167
+ ...row,
168
+ rowLink: options?.rowLink
169
+ ? options.rowLink(row, group.groupData)
170
+ : null,
171
+ selected: TableSelectionHelpers.isRowSelected(s, row.id),
172
+ isCollapsed: false,
173
+ })),
174
+ selected: TableSelectionHelpers.isGroupSelected(s, group),
175
+ totalMatchingRowCount: group.totalMatchingRowCount,
176
+ groupData: group.groupData,
177
+ }));
178
+ async function* csvData(mode = 'full') {
179
+ const cellFormatter = options?.csvCellFormatter;
180
+ const groupCellFormatter = options?.csvGroupCellFormatter;
181
+ if (!cellFormatter)
182
+ throw new Error('options.csvCellFormatter is required for CSV export');
183
+ yield { loading: true, data: null };
184
+ const dataSet = await source({
185
+ ...s.query,
186
+ pagination: {
187
+ page: 0,
188
+ pageSize: stateResult.totalMatchingRowCount,
189
+ },
190
+ }, { type: 'load' });
191
+ if (!TableResultHelpers.isGroupResult(dataSet)) {
192
+ throw new Error('Returned non-grouped CSV data for grouped table');
193
+ }
194
+ const fullColumns = TableColumnHelpers.resolveColumns(s, columns, columnNameMap, !!options.allowSelection, 'enabled', !!options.hasNestedHeaders);
195
+ const data = [];
196
+ data.push(fullColumns.map(({ key }) => columnNameMap.get(key) ?? key));
197
+ if (groupCellFormatter) {
198
+ data[0].push('');
199
+ }
200
+ for (const rowItem of dataSet.groupResults.flatMap(groups => groups.currentPageData.map(row => ({
201
+ row,
202
+ group: groups.groupData,
203
+ })))) {
204
+ const record = rowItem.row;
205
+ if (mode === 'selection' &&
206
+ !TableSelectionHelpers.isRowSelected(s, record.id))
207
+ continue;
208
+ const row = [];
209
+ for (const column of fullColumns) {
210
+ row.push(await cellFormatter(record, column));
211
+ }
212
+ if (groupCellFormatter && rowItem.group) {
213
+ row.push(await groupCellFormatter(record, rowItem.group));
214
+ }
215
+ data.push(row);
216
+ }
217
+ yield { loading: false, data };
218
+ }
219
+ return {
220
+ ...s,
221
+ query: derivedFullStateQuery(s),
222
+ display: derivedFullStateDisplay({
223
+ coreState: s,
224
+ columns: columns,
225
+ pluralEntityName: pluralEntityName,
226
+ columnNameMap: columnNameMap,
227
+ resolvedColumns: resolvedColumns,
228
+ resolvedDisabledColumns: resolvedDisabledColumns,
229
+ searchableColumnMap: searchableColumnMap,
230
+ csvExportAllowed: csvExportAllowed,
231
+ options: options,
232
+ }),
233
+ selection: derivedFullStateSelection(s, options),
234
+ result: {
235
+ ...stateResult,
236
+ isGrouped: true,
237
+ resultType: 'table-grouping',
238
+ rowGroups,
239
+ rows: rowGroups.flatMap(group => group.rows),
240
+ csvData,
241
+ csvFilename: TableResultHelpers.getCsvFilename(pluralEntityName, options),
242
+ },
243
+ };
244
+ }
245
+ function deriveFullStateFromNestedResult(props) {
246
+ const { s, stateResult, source, columns, pluralEntityName, columnNameMap, resolvedColumns, resolvedDisabledColumns, searchableColumnMap, csvExportAllowed, options, } = props;
247
+ if (options?.getRowSpanForCell) {
248
+ // eslint-disable-next-line no-console
249
+ console.warn('Heads up! Custom row spans are not supported for tables with nested data.');
250
+ }
251
+ if (options?.customSummaryRow) {
252
+ // eslint-disable-next-line no-console
253
+ console.warn('Heads up! Custom summary rows are not supported for tables with nested data.');
254
+ }
255
+ const fullNestedHeaderRows = [];
256
+ for (const nestedRow of stateResult.currentPageNestedHeaders) {
257
+ const newFullRow = TableNestingHelpers.convertToFullNestedHeaderRow(nestedRow, s, options?.rowLink);
258
+ fullNestedHeaderRows.push(newFullRow);
259
+ }
260
+ async function* csvData(mode = 'full') {
261
+ if (!csvExportAllowed) {
262
+ throw new Error('CSV export is not supported when row spanning or a custom summary row is enabled.');
263
+ }
264
+ const cellFormatter = options?.csvCellFormatter;
265
+ if (!cellFormatter) {
266
+ throw new Error('options.csvCellFormatter is required for CSV export');
267
+ }
268
+ yield { loading: true, data: null };
269
+ const dataSet = await source({
270
+ ...s.query,
271
+ pagination: {
272
+ page: 0,
273
+ pageSize: stateResult.totalMatchingRowCount,
274
+ },
275
+ }, { type: 'load' });
276
+ if (TableResultHelpers.isRegularResult(dataSet)) {
277
+ throw new Error('Returned non-nested CSV data for a nested with header result table');
278
+ }
279
+ if (TableResultHelpers.isGroupResult(dataSet)) {
280
+ throw new Error('Returned grouped CSV data for a nested with header result table');
281
+ }
282
+ const fullColumns = TableColumnHelpers.resolveColumns(s, columns, columnNameMap, !!options.allowSelection, 'enabled', !!options.hasNestedHeaders);
283
+ const data = [];
284
+ data.push(fullColumns.map(({ key }) => columnNameMap.get(key) ?? key));
285
+ const allRows = TableResultHelpers.getAllRowsFromResult(dataSet);
286
+ for (const currentRow of allRows) {
287
+ if (mode === 'selection' &&
288
+ !TableSelectionHelpers.isRowSelected(s, currentRow.id)) {
289
+ return;
290
+ }
291
+ const row = [];
292
+ for (const column of fullColumns) {
293
+ row.push(await cellFormatter(currentRow, column));
294
+ }
295
+ data.push(row);
296
+ }
297
+ yield { loading: false, data };
298
+ }
299
+ return {
300
+ ...s,
301
+ query: derivedFullStateQuery(s),
302
+ display: derivedFullStateDisplay({
303
+ coreState: s,
304
+ columns: columns,
305
+ pluralEntityName: pluralEntityName,
306
+ columnNameMap: columnNameMap,
307
+ resolvedColumns: resolvedColumns,
308
+ resolvedDisabledColumns: resolvedDisabledColumns,
309
+ searchableColumnMap: searchableColumnMap,
310
+ csvExportAllowed: csvExportAllowed,
311
+ options: options,
312
+ }),
313
+ selection: derivedFullStateSelection(s, options),
314
+ result: {
315
+ ...stateResult,
316
+ rows: [],
317
+ isGrouped: false,
318
+ resultType: 'nested-rows',
319
+ nestedHeaderRows: fullNestedHeaderRows,
320
+ csvData,
321
+ csvFilename: TableResultHelpers.getCsvFilename(pluralEntityName, options),
322
+ },
323
+ };
324
+ }
325
+ function deriveFullStateFromRegularResult(props) {
326
+ const { s, stateResult, source, columns, pluralEntityName, columnNameMap, resolvedColumns, resolvedDisabledColumns, searchableColumnMap, csvExportAllowed, options, } = props;
327
+ const rows = stateResult.currentPageData.map(row => ({
328
+ ...row,
329
+ rowLink: options?.rowLink ? options.rowLink(row) : null,
330
+ selected: TableSelectionHelpers.isRowSelected(s, row.id),
331
+ isCollapsed: false,
332
+ }));
333
+ const cellRowSpanCache = TableDisplayHelpers.memoizedCellRowSpan(s, resolvedColumns, options);
334
+ const cellRowSpan = (rowIndex, column) => cellRowSpanCache?.get(column)?.[rowIndex] ?? 1;
335
+ const hasAnyRowSpans = cellRowSpanCache
336
+ ? [...cellRowSpanCache.values()].some(spans => spans.some(span => span > 1))
337
+ : false;
338
+ const resolvedColumnKeys = resolvedColumns.map(({ key }) => key);
339
+ async function* csvData(mode = 'full') {
340
+ if (!csvExportAllowed) {
341
+ throw new Error('CSV export is not supported when row spanning or a custom summary row is enabled.');
342
+ }
343
+ const cellFormatter = options?.csvCellFormatter;
344
+ if (!cellFormatter)
345
+ throw new Error('options.csvCellFormatter is required for CSV export');
346
+ yield { loading: true, data: null };
347
+ const dataSet = await source({
348
+ ...s.query,
349
+ pagination: {
350
+ page: 0,
351
+ pageSize: stateResult.totalMatchingRowCount,
352
+ },
353
+ }, { type: 'load' });
354
+ if (TableResultHelpers.isGroupResult(dataSet)) {
355
+ throw new Error('Returned grouped CSV data for non-grouped table');
356
+ }
357
+ if (TableResultHelpers.isNestedResult(dataSet)) {
358
+ throw new Error('Returned nested CSV data for non-nested table');
359
+ }
360
+ const fullColumns = TableColumnHelpers.resolveColumns(s, columns, columnNameMap, !!options.allowSelection, 'enabled', !!options.hasNestedHeaders);
361
+ const data = [];
362
+ data.push(fullColumns.map(({ key }) => columnNameMap.get(key) ?? key));
363
+ for (const record of dataSet.currentPageData) {
364
+ if (mode === 'selection' &&
365
+ !TableSelectionHelpers.isRowSelected(s, record.id))
366
+ continue;
367
+ const row = [];
368
+ for (const column of fullColumns) {
369
+ row.push(await cellFormatter(record, column));
370
+ }
371
+ data.push(row);
372
+ }
373
+ yield { loading: false, data };
374
+ }
375
+ return {
376
+ ...s,
377
+ query: derivedFullStateQuery(s, {
378
+ order: hasAnyRowSpans ? null : s.query.order,
379
+ }),
380
+ display: derivedFullStateDisplay({
381
+ coreState: s,
382
+ columns: columns,
383
+ pluralEntityName: pluralEntityName,
384
+ columnNameMap: columnNameMap,
385
+ resolvedColumns: resolvedColumns,
386
+ resolvedDisabledColumns: resolvedDisabledColumns,
387
+ searchableColumnMap: searchableColumnMap,
388
+ csvExportAllowed: csvExportAllowed,
389
+ options: options,
390
+ }, {
391
+ columns: resolvedColumns.map(column => hasAnyRowSpans ? { ...column, orderable: false } : column),
392
+ cellRowSpan: cellRowSpan,
393
+ needsRightBorder: (rowIndex, column) => {
394
+ const i = resolvedColumnKeys.findIndex(key => key === column);
395
+ if (i < 0 || i === resolvedColumnKeys.length - 1)
396
+ return false;
397
+ const rightColKey = resolvedColumnKeys[i + 1];
398
+ const spanOnRight = cellRowSpan(rowIndex, rightColKey);
399
+ return spanOnRight > 1 || spanOnRight === 0;
400
+ },
401
+ }),
402
+ selection: derivedFullStateSelection(s, options),
403
+ result: {
404
+ ...stateResult,
405
+ isGrouped: false,
406
+ resultType: 'normal-rows',
407
+ rows,
408
+ rowsAsGroup: {
409
+ rows,
410
+ selected: false,
411
+ totalMatchingRowCount: rows.length,
412
+ groupData: { key: '' },
413
+ },
414
+ csvFilename: TableResultHelpers.getCsvFilename(pluralEntityName, options),
415
+ csvData,
416
+ },
417
+ };
418
+ }
419
+ function derivedFullStateQuery(coreState, partialQuery = {}) {
420
+ return {
421
+ ...coreState.query,
422
+ pagination: derivedFullStatePagination(coreState),
423
+ noSearchColumnsSelected: TableSearchHelpers.getSearchColumnsSelectedState(coreState, 'none'),
424
+ ...partialQuery,
425
+ };
426
+ }
427
+ function derivedFullStatePagination(coreState) {
428
+ return {
429
+ ...coreState.query.pagination,
430
+ previous: TablePaginationHelpers.getPreviousPage(coreState),
431
+ pages: TablePaginationHelpers.getPages(coreState),
432
+ next: TablePaginationHelpers.getNextPage(coreState),
433
+ pageCount: TablePaginationHelpers.getPageCount(coreState),
434
+ showControls: TablePaginationHelpers.getShowPaginationControls(coreState),
435
+ pageRowStart: TablePaginationHelpers.getPageRowStart(coreState),
436
+ pageRowEnd: TablePaginationHelpers.getPageRowEnd(coreState),
437
+ };
438
+ }
439
+ function derivedFullStateDisplay(props, partialDisplay = {}) {
440
+ const { coreState, columns, pluralEntityName, columnNameMap, resolvedColumns, resolvedDisabledColumns, searchableColumnMap, csvExportAllowed, options, } = props;
441
+ return {
442
+ ...coreState.display,
443
+ columns: resolvedColumns,
444
+ disabledColumns: resolvedDisabledColumns,
445
+ allColumns: TableColumnHelpers.getAllColumns(coreState, columns, columnNameMap),
446
+ columnNameMap: columnNameMap,
447
+ searchableColumnMap: searchableColumnMap,
448
+ zeroStateMessage: TableDisplayHelpers.getZeroStateMessage(coreState, pluralEntityName),
449
+ columnsAreFreezable: !!options?.columnsAreFreezable,
450
+ columnsAreHideable: !!options?.columnsAreHideable,
451
+ columnsAreReorderable: options?.columnsAreReorderable ?? true,
452
+ rowsAreGrayed: !!options?.rowsAreGrayed,
453
+ customSummaryRow: !!options?.customSummaryRow,
454
+ csvExportAllowed: csvExportAllowed,
455
+ enabledCount: resolvedColumns.length,
456
+ hidePageSizeSelector: !!options?.hidePageSizeSelector,
457
+ cellRowSpan: (_i, _column) => 1,
458
+ needsRightBorder: () => false,
459
+ unavailableColumnKeys: options?.unavailableColumnKeys ?? [],
460
+ unavailableFolderTitle: options?.unavailableFolderTitle ?? 'Unavailable',
461
+ ...partialDisplay,
462
+ };
463
+ }
464
+ function derivedFullStateSelection(coreState, options) {
465
+ return {
466
+ ...coreState.selection,
467
+ allowSelection: options?.allowSelection ?? false,
468
+ isAllSelected: TableSelectionHelpers.isAllSelected(coreState),
469
+ isCurrentPageSelected: TableSelectionHelpers.isCurrentPageSelected(coreState),
470
+ selectedCount: TableSelectionHelpers.selectedCount(coreState),
471
+ };
472
+ }
473
+ /**
474
+ * What a nested table's page size and total count count: every bottom-level
475
+ * row, which can split a row's subrows across pages, or each top-level row
476
+ * together with all of its subrows.
477
+ */
478
+ RivTable.NestedPaginateByOptions = ['bottomRows', 'topRows'];
479
+ function createInMemoryManager(fetchDataset, columns, pluralEntityName, options) {
480
+ columns = TableSearchHelpers.markColumnsOutsideFuseKeysUnsearchable(columns, options?.fuseOptions);
481
+ let data;
482
+ let fuse;
483
+ const source = async (query, mostRecentAction) => {
484
+ if (mostRecentAction.type === 'load' ||
485
+ mostRecentAction.type === 'searchColumnsChange' ||
486
+ mostRecentAction.type === 'toggleAllSearchColumns') {
487
+ data = await fetchDataset();
488
+ fuse = new Fuse(data, TableSearchHelpers.fuseOptionsForSearchColumns(options?.fuseOptions, columns, query));
489
+ }
490
+ const orderColumn = query.order
491
+ ? columns.get(query.order.column)?.orderKey
492
+ : undefined;
493
+ const hasExplicitSort = query.order != null && orderColumn !== undefined;
494
+ const defaultSortSpec = (() => {
495
+ if (options?.defaultSort) {
496
+ const key = columns.get(options.defaultSort.column)?.orderKey;
497
+ if (key !== undefined) {
498
+ return { key, direction: options.defaultSort.direction };
499
+ }
500
+ }
501
+ const firstOrderable = [...columns.entries()].find(([, meta]) => meta.orderKey != null);
502
+ const key = firstOrderable?.[1].orderKey;
503
+ return key !== undefined ? { key, direction: 'asc' } : null;
504
+ })();
505
+ let ordered;
506
+ if (query.search) {
507
+ const matches = fuse.search(query.search).map(result => result.item);
508
+ ordered =
509
+ hasExplicitSort && query.order
510
+ ? TableOrderHelpers.orderEmptyLast(matches, orderColumn, query.order.direction)
511
+ : matches;
512
+ }
513
+ else if (hasExplicitSort && query.order) {
514
+ ordered = TableOrderHelpers.orderEmptyLast(data, orderColumn, query.order.direction);
515
+ }
516
+ else if (query.order == null && defaultSortSpec) {
517
+ ordered = TableOrderHelpers.orderEmptyLast(data, defaultSortSpec.key, defaultSortSpec.direction);
518
+ }
519
+ else {
520
+ ordered = data;
521
+ }
522
+ const filter = options?.filter;
523
+ const filtered = filter
524
+ ? ordered.filter(row => filter(query.filters, row))
525
+ : ordered;
526
+ const startIdx = query.pagination.pageSize * query.pagination.page;
527
+ const endIdx = startIdx + query.pagination.pageSize;
528
+ const paginated = filtered.slice(startIdx, endIdx);
529
+ return {
530
+ currentPageData: paginated,
531
+ totalMatchingRowCount: filtered.length,
532
+ };
533
+ };
534
+ const columnMetadata = TableColumnHelpers.convertInMemoryColumnMetadataMap(columns);
535
+ /*
536
+ When a defaultSort is specified, seed the initial query.order so the
537
+ table header shows the sort indicator from the start.
538
+ */
539
+ options = TableOrderHelpers.seedDefaultSortOption(options);
540
+ return createManager(source, columnMetadata, pluralEntityName, options);
541
+ }
542
+ RivTable.createInMemoryManager = createInMemoryManager;
543
+ function createInMemoryManagerNested(fetchDataset, columns, pluralEntityName, options) {
544
+ columns = TableSearchHelpers.markColumnsOutsideFuseKeysUnsearchable(columns, options?.fuseOptions);
545
+ let data;
546
+ let rowsFromData;
547
+ // The fuse will search the individual rows
548
+ let fuse;
549
+ const source = async (query, mostRecentAction) => {
550
+ if (mostRecentAction.type === 'load' ||
551
+ mostRecentAction.type === 'searchColumnsChange' ||
552
+ mostRecentAction.type === 'toggleAllSearchColumns') {
553
+ data = await fetchDataset();
554
+ rowsFromData = TableResultHelpers.getAllRowsFromNestedHeaders(data);
555
+ fuse = new Fuse(rowsFromData, TableSearchHelpers.fuseOptionsForSearchColumns(options?.fuseOptions, columns, query));
556
+ }
557
+ const orderColumn = query.order
558
+ ? columns.get(query.order.column)?.orderKey
559
+ : undefined;
560
+ const hasExplicitSort = query.order != null && orderColumn !== undefined;
561
+ const defaultSortSpec = (() => {
562
+ if (options?.defaultSort) {
563
+ const key = columns.get(options.defaultSort.column)?.orderKey;
564
+ if (key !== undefined) {
565
+ return { key, direction: options.defaultSort.direction };
566
+ }
567
+ }
568
+ const firstOrderable = [...columns.entries()].find(([, meta]) => meta.orderKey != null);
569
+ const key = firstOrderable?.[1].orderKey;
570
+ return key !== undefined ? { key, direction: 'asc' } : null;
571
+ })();
572
+ // Search, then filter, then sort
573
+ let didRestrictDisplayedRows = false;
574
+ let rowsMatchingSearch = rowsFromData;
575
+ if (query.search) {
576
+ rowsMatchingSearch = fuse
577
+ .search(query.search)
578
+ .map(result => result.item);
579
+ didRestrictDisplayedRows = true;
580
+ }
581
+ let rowsMatchingFilters = rowsMatchingSearch;
582
+ const filterToApply = options?.filter;
583
+ if (filterToApply) {
584
+ rowsMatchingFilters = rowsMatchingSearch.filter(row => filterToApply(query.filters, row));
585
+ didRestrictDisplayedRows = true;
586
+ }
587
+ const nestedRowsToDisplay = didRestrictDisplayedRows
588
+ ? TableNestingHelpers.findNestedRowsWithHeadersToKeep(data, rowsMatchingFilters)
589
+ : data;
590
+ const matchingRowCount = TableNestingHelpers.countNestedRows(nestedRowsToDisplay, options?.paginateBy ?? 'bottomRows');
591
+ let sortedNestedRows;
592
+ if (hasExplicitSort && query.order) {
593
+ // Explicit sort override has priority over everything else
594
+ sortedNestedRows = TableOrderHelpers.sortLowLevelNestedRowsWithHeaders(nestedRowsToDisplay, orderColumn, query.order.direction);
595
+ }
596
+ else if (query.search) {
597
+ // Sort on the Fuse relevance order
598
+ const idToSearchIndexMap = TableOrderHelpers.createIdToSearchIndexMap(rowsMatchingSearch);
599
+ sortedNestedRows =
600
+ TableOrderHelpers.sortNestedRowsWithHeadersBasedOnSearchMatches(nestedRowsToDisplay, idToSearchIndexMap);
601
+ }
602
+ else if (query.order == null && defaultSortSpec) {
603
+ // Use the default sort, if we have one
604
+ sortedNestedRows = TableOrderHelpers.sortLowLevelNestedRowsWithHeaders(nestedRowsToDisplay, defaultSortSpec.key, defaultSortSpec.direction);
605
+ }
606
+ else {
607
+ // Don't sort if we have no information to use to sort
608
+ sortedNestedRows = nestedRowsToDisplay;
609
+ }
610
+ const paginatedHeaderRows = TablePaginationHelpers.paginateNestedHeaderRows(sortedNestedRows, query.pagination.page, query.pagination.pageSize, options?.paginateBy ?? 'bottomRows');
611
+ const hasHeaders = options?.hasNestedHeaders ?? false;
612
+ return {
613
+ currentPageNestedHeaders: paginatedHeaderRows,
614
+ totalMatchingRowCount: matchingRowCount,
615
+ hasHeaders: hasHeaders,
616
+ };
617
+ };
618
+ const columnMetadata = TableColumnHelpers.convertInMemoryColumnMetadataMap(columns);
619
+ /*
620
+ When a defaultSort is specified, seed the initial query.order so the
621
+ table header shows the sort indicator from the start.
622
+ */
623
+ options = TableOrderHelpers.seedDefaultSortOption(options);
624
+ return createManager(source, columnMetadata, pluralEntityName, options);
625
+ }
626
+ RivTable.createInMemoryManagerNested = createInMemoryManagerNested;
627
+ })(RivTable || (RivTable = {}));
628
+ /**
629
+ * This function keeps the state object references as stable as possible, which
630
+ * helps Angular reduce unnecessary re-renders. For now, simple isEqual()
631
+ * checks at the state's top-level keys are sufficient to dramatically speed up
632
+ * rendering, but if other performance issues arise, we could implement more
633
+ * granular checks/surgical updates as needed (the state.result being the most
634
+ * likely candidate, since many types of state updates affect parts of the
635
+ * result rows).
636
+ */
637
+ function stableState(target, source) {
638
+ if (!isEqual(target.query, source.query)) {
639
+ target.query = source.query;
640
+ }
641
+ if (!isEqual(target.load, source.load)) {
642
+ target.load = source.load;
643
+ }
644
+ if (!isEqual(target.result.csvData, source.result.csvData)) {
645
+ target.result.csvData = source.result.csvData;
646
+ }
647
+ if (!isEqual(target.result.csvFilename, source.result.csvFilename)) {
648
+ target.result.csvFilename = source.result.csvFilename;
649
+ }
650
+ if (!isEqual(target.result.totalMatchingRowCount, source.result.totalMatchingRowCount)) {
651
+ target.result.totalMatchingRowCount = source.result.totalMatchingRowCount;
652
+ }
653
+ if (!isEqual(target.result, source.result)) {
654
+ target.result = source.result;
655
+ }
656
+ if (!isEqual(target.display, source.display)) {
657
+ target.display = source.display;
658
+ }
659
+ if (!isEqual(target.selection, source.selection)) {
660
+ target.selection = source.selection;
661
+ }
662
+ if (!isEqual(target.collapseState, source.collapseState)) {
663
+ target.collapseState = source.collapseState;
664
+ }
665
+ return target;
666
+ }
667
+ async function* refreshResultWith(state, source, mostRecentAction) {
668
+ yield {
669
+ state: {
670
+ ...state,
671
+ load: {
672
+ loading: true,
673
+ error: null,
674
+ },
675
+ },
676
+ effect: null,
677
+ };
678
+ try {
679
+ const result = await source(state.query, mostRecentAction);
680
+ if (TablePaginationHelpers.isPageOutOfBounds(state, result)) {
681
+ state.query.pagination.page = 0;
682
+ }
683
+ yield {
684
+ state: {
685
+ ...state,
686
+ load: {
687
+ loading: false,
688
+ error: null,
689
+ },
690
+ result,
691
+ },
692
+ effect: null,
693
+ };
694
+ }
695
+ catch (error) {
696
+ // eslint-disable-next-line no-console
697
+ console.error(error);
698
+ yield {
699
+ state: {
700
+ ...state,
701
+ load: {
702
+ loading: false,
703
+ error,
704
+ },
705
+ },
706
+ effect: null,
707
+ };
708
+ }
709
+ }
710
+ async function* reduce(state, action, columns, source, columnNameMap, defaultColumnState) {
711
+ switch (action.type) {
712
+ case 'load':
713
+ yield* refreshResultWith(state, source, action);
714
+ break;
715
+ case 'orderChange':
716
+ yield* refreshResultWith({
717
+ ...state,
718
+ query: {
719
+ ...state.query,
720
+ order: action.payload,
721
+ },
722
+ selection: {
723
+ mostRecentlySelected: null,
724
+ mode: 'include',
725
+ included: new Set(),
726
+ },
727
+ }, source, action);
728
+ break;
729
+ case 'orderColumnToggle':
730
+ yield* refreshResultWith(TableOrderHelpers.toggleColumnOrder(state, action.column), source, action);
731
+ break;
732
+ case 'searchChange':
733
+ yield* refreshResultWith({
734
+ ...state,
735
+ query: {
736
+ ...state.query,
737
+ search: action.payload,
738
+ pagination: {
739
+ ...state.query.pagination,
740
+ page: 0,
741
+ },
742
+ },
743
+ selection: {
744
+ mostRecentlySelected: null,
745
+ mode: 'include',
746
+ included: new Set(),
747
+ },
748
+ collapseState: {
749
+ defaultTo: 'expanded',
750
+ collapsedHeaders: new Set(),
751
+ collapsedRows: new Set(),
752
+ },
753
+ }, source, action);
754
+ break;
755
+ case 'searchColumnsChange':
756
+ yield* refreshResultWith({
757
+ ...state,
758
+ query: {
759
+ ...state.query,
760
+ searchColumns: new Map([
761
+ ...state.query.searchColumns,
762
+ ...action.payload,
763
+ ]),
764
+ pagination: {
765
+ ...state.query.pagination,
766
+ page: 0,
767
+ },
768
+ },
769
+ selection: {
770
+ mostRecentlySelected: null,
771
+ mode: 'include',
772
+ included: new Set(),
773
+ },
774
+ collapseState: {
775
+ defaultTo: 'expanded',
776
+ collapsedHeaders: new Set(),
777
+ collapsedRows: new Set(),
778
+ },
779
+ }, source, action);
780
+ break;
781
+ case 'paginationChange':
782
+ yield* refreshResultWith({
783
+ ...state,
784
+ query: {
785
+ ...state.query,
786
+ pagination: action.payload,
787
+ },
788
+ }, source, action);
789
+ break;
790
+ case 'groupingChange':
791
+ yield* refreshResultWith({
792
+ ...state,
793
+ query: {
794
+ ...state.query,
795
+ grouping: action.payload,
796
+ },
797
+ }, source, action);
798
+ break;
799
+ case 'previousPageNavigate':
800
+ yield* refreshResultWith({
801
+ ...state,
802
+ query: {
803
+ ...state.query,
804
+ pagination: {
805
+ ...state.query.pagination,
806
+ page: TablePaginationHelpers.getPreviousPage(state) ?? 0,
807
+ },
808
+ },
809
+ }, source, action);
810
+ break;
811
+ case 'nextPageNavigate':
812
+ yield* refreshResultWith({
813
+ ...state,
814
+ query: {
815
+ ...state.query,
816
+ pagination: {
817
+ ...state.query.pagination,
818
+ page: TablePaginationHelpers.getNextPage(state) ??
819
+ TablePaginationHelpers.getPageCount(state) - 1,
820
+ },
821
+ },
822
+ }, source, action);
823
+ break;
824
+ case 'pageChange':
825
+ yield* refreshResultWith({
826
+ ...state,
827
+ query: {
828
+ ...state.query,
829
+ pagination: {
830
+ ...state.query.pagination,
831
+ page: action.page,
832
+ },
833
+ },
834
+ }, source, action);
835
+ break;
836
+ case 'pageSizeChange':
837
+ yield* refreshResultWith({
838
+ ...state,
839
+ query: {
840
+ ...state.query,
841
+ pagination: {
842
+ ...state.query.pagination,
843
+ pageSize: action.size,
844
+ page: 0,
845
+ },
846
+ },
847
+ }, source, action);
848
+ break;
849
+ case 'filtersChange':
850
+ yield* refreshResultWith({
851
+ ...state,
852
+ query: {
853
+ ...state.query,
854
+ filters: action.payload,
855
+ pagination: {
856
+ ...state.query.pagination,
857
+ page: 0,
858
+ },
859
+ },
860
+ selection: {
861
+ mostRecentlySelected: null,
862
+ mode: 'include',
863
+ included: new Set(),
864
+ },
865
+ collapseState: {
866
+ defaultTo: 'expanded',
867
+ collapsedHeaders: new Set(),
868
+ collapsedRows: new Set(),
869
+ },
870
+ }, source, action);
871
+ break;
872
+ case 'filterAdd':
873
+ // Parent component is responsible for subscribing and adding the filter
874
+ yield { state: { ...state }, effect: null };
875
+ break;
876
+ case 'columnSettingsChange':
877
+ yield {
878
+ state: {
879
+ ...state,
880
+ display: {
881
+ ...state.display,
882
+ columnSettings: action.payload,
883
+ },
884
+ },
885
+ // do not output changes when triggered from the outside world
886
+ effect: null,
887
+ };
888
+ break;
889
+ case 'columnPinChange':
890
+ yield {
891
+ state: TableColumnHelpers.changeColumnPin(state, columns, columnNameMap, action.column, action.pinned),
892
+ effect: 'saveColumnPreferences',
893
+ };
894
+ break;
895
+ case 'columnsFreezeUpToChange':
896
+ yield {
897
+ state: TableColumnHelpers.changeColumnsFreezeState(state, columns, columnNameMap, action.index, action.freeze),
898
+ effect: 'saveColumnPreferences',
899
+ };
900
+ break;
901
+ case 'columnOrderChange':
902
+ yield {
903
+ state: TableColumnHelpers.changeColumnOrder(state, columns, columnNameMap, action.previousIndex, action.newIndex),
904
+ effect: 'saveColumnPreferences',
905
+ };
906
+ break;
907
+ case 'columnMoveToChange':
908
+ yield {
909
+ state: TableColumnHelpers.moveColumnTo(state, columns, columnNameMap, action.column, action.position),
910
+ effect: 'saveColumnPreferences',
911
+ };
912
+ break;
913
+ case 'columnEnabledChange':
914
+ yield {
915
+ state: TableColumnHelpers.changeColumnEnabled(state, columns, columnNameMap, action.column, action.enabled),
916
+ effect: 'saveColumnPreferences',
917
+ };
918
+ break;
919
+ case 'enableAllColumnsChange':
920
+ yield {
921
+ state: TableColumnHelpers.enableAllColumns(state, columns, columnNameMap, action.enabled),
922
+ effect: 'saveColumnPreferences',
923
+ };
924
+ break;
925
+ case 'columnWidthChange':
926
+ yield {
927
+ state: TableColumnHelpers.changeColumnWidth(state, columns, columnNameMap, action.column, action.preferredWidth),
928
+ effect: 'saveColumnPreferences',
929
+ };
930
+ break;
931
+ case 'resetToDefaultColumns':
932
+ yield {
933
+ state: TableColumnHelpers.resetToDefaultColumns(state, columns, columnNameMap, defaultColumnState),
934
+ effect: 'saveColumnPreferences',
935
+ };
936
+ break;
937
+ case 'selectionChange':
938
+ yield {
939
+ state: {
940
+ ...state,
941
+ selection: action.payload,
942
+ },
943
+ effect: null,
944
+ };
945
+ break;
946
+ case 'rowSelectedChange':
947
+ yield {
948
+ state: TableSelectionHelpers.setRowSelected(state, action.id, action.selected, action.contiguous),
949
+ effect: null,
950
+ };
951
+ break;
952
+ case 'pageSelectedChange':
953
+ yield {
954
+ state: TableSelectionHelpers.togglePageSelected(state),
955
+ effect: null,
956
+ };
957
+ break;
958
+ case 'allSelectedChange':
959
+ yield {
960
+ state: TableSelectionHelpers.toggleAllSelected(state),
961
+ effect: null,
962
+ };
963
+ break;
964
+ case 'selectionClear':
965
+ yield {
966
+ state: TableSelectionHelpers.clearSelection(state),
967
+ effect: null,
968
+ };
969
+ break;
970
+ case 'groupSelectionChange':
971
+ yield {
972
+ state: TableSelectionHelpers.toggleGroupSelected(state, action.payload),
973
+ effect: null,
974
+ };
975
+ break;
976
+ case 'groupsPerPageChange':
977
+ yield* refreshResultWith({
978
+ ...state,
979
+ query: {
980
+ ...state.query,
981
+ grouping: {
982
+ ...state.query.grouping,
983
+ groupsPerPage: action.groupsPerPage,
984
+ },
985
+ },
986
+ }, source, action);
987
+ break;
988
+ case 'countPerGroupChange':
989
+ yield* refreshResultWith({
990
+ ...state,
991
+ query: {
992
+ ...state.query,
993
+ grouping: {
994
+ ...state.query.grouping,
995
+ countPerGroup: action.countPerGroup,
996
+ },
997
+ },
998
+ }, source, action);
999
+ break;
1000
+ case 'viewMoreKeyChange':
1001
+ yield* refreshResultWith({
1002
+ ...state,
1003
+ query: {
1004
+ ...state.query,
1005
+ grouping: {
1006
+ ...state.query.grouping,
1007
+ viewMoreKey: action.viewMoreKey,
1008
+ },
1009
+ },
1010
+ }, source, action);
1011
+ break;
1012
+ case 'toggleAllSearchColumns':
1013
+ yield* refreshResultWith(TableSearchHelpers.toggleAllSearchColumns(state), source, action);
1014
+ break;
1015
+ case 'toggleRowCollapse':
1016
+ yield {
1017
+ state: TableCollapseHelpers.toggleRowCollapse(state, action.id),
1018
+ effect: null,
1019
+ };
1020
+ break;
1021
+ case 'toggleHeaderCollapse':
1022
+ yield {
1023
+ state: TableCollapseHelpers.toggleHeaderCollapse(state, action.id),
1024
+ effect: null,
1025
+ };
1026
+ break;
1027
+ case 'toggleAllCollapsed':
1028
+ yield {
1029
+ state: TableCollapseHelpers.toggleAllCollapsed(state),
1030
+ effect: null,
1031
+ };
1032
+ break;
1033
+ }
1034
+ }
1035
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi90YWJsZS90YWJsZS9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLElBQXNCLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9DLE9BQU8sRUFFTCxXQUFXLEVBQ1gsTUFBTSxFQUNOLElBQUksRUFDSixHQUFHLEVBQ0gsU0FBUyxFQUVULGFBQWEsRUFDYixJQUFJLEVBQ0osS0FBSyxFQUNMLE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRSxNQUFNLEtBQVcsUUFBUSxDQTBvRHhCO0FBMW9ERCxXQUFpQixRQUFRO0lBMkNWLGtCQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENB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aUJBQ0Y7YUFDRixFQUNELE1BQU0sRUFDTixNQUFNLENBQ1AsQ0FBQztZQUNGLE1BQU07UUFDUixLQUFLLHdCQUF3QjtZQUMzQixLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FDdEIsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLEVBQ2hELE1BQU0sRUFDTixNQUFNLENBQ1AsQ0FBQztZQUNGLE1BQU07UUFDUixLQUFLLG1CQUFtQjtZQUN0QixNQUFNO2dCQUNKLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsTUFBTSxFQUFFLElBQUk7YUFDYixDQUFDO1lBQ0YsTUFBTTtRQUNSLEtBQUssc0JBQXNCO1lBQ3pCLE1BQU07Z0JBQ0osS0FBSyxFQUFFLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNsRSxNQUFNLEVBQUUsSUFBSTthQUNiLENBQUM7WUFDRixNQUFNO1FBQ1IsS0FBSyxvQkFBb0I7WUFDdkIsTUFBTTtnQkFDSixLQUFLLEVBQUUsb0JBQW9CLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDO2dCQUNyRCxNQUFNLEVBQUUsSUFBSTthQUNiLENBQUM7WUFDRixNQUFNO0lBQ1YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhcmFtcywgUXVlcnlQYXJhbXNIYW5kbGluZyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgRnVzZSwgeyBJRnVzZU9wdGlvbnMgfSBmcm9tICdmdXNlLmpzJztcbmltcG9ydCB7IGRlZmF1bHRzRGVlcCwgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBDb25uZWN0YWJsZSxcbiAgY29ubmVjdGFibGUsXG4gIGZpbHRlcixcbiAgZnJvbSxcbiAgbWFwLFxuICBtZXJnZVNjYW4sXG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG4gIHNjYW4sXG4gIHNoYXJlLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5pbXBvcnQgeyB0b1NlbnRlbmNlQ2FzZSB9IGZyb20gJy4uLy4uL2Zvcm1hdC9waXBlcy9zZW50ZW5jZS1jYXNlLnBpcGUnO1xuaW1wb3J0IHsgVGFibGVDb2xsYXBzZUhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvY29sbGFwc2UtaGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtbkhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvY29sdW1uLWhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVEaXNwbGF5SGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9kaXNwbGF5LWhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVOZXN0aW5nSGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9uZXN0aW5nLWhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVPcmRlckhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvb3JkZXItaGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZVBhZ2luYXRpb25IZWxwZXJzIH0gZnJvbSAnLi9zdGF0ZS1oZWxwZXJzL3BhZ2luYXRpb24taGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZVJlc3VsdEhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvcmVzdWx0LWhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVTZWFyY2hIZWxwZXJzIH0gZnJvbSAnLi9zdGF0ZS1oZWxwZXJzL3NlYXJjaC1oZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlU2VsZWN0aW9uSGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9zZWxlY3Rpb24taGVscGVycyc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgUml2VGFibGUge1xuICBleHBvcnQgdHlwZSBSb3cgPSB7IGlkOiBzdHJpbmcgfCBudW1iZXIgfTtcbiAgZXhwb3J0IHR5cGUgQ29sdW1uID0gc3RyaW5nO1xuICBleHBvcnQgdHlwZSBGaWx0ZXJzID0gYW55O1xuICBleHBvcnQgdHlwZSBHcm91cCA9IHsga2V5OiBzdHJpbmcgfCBudW1iZXIgfTtcblxuICAvKipcbiAgICogUml2VGFibGUncyBzdGF0ZSBhbmQgdXNlciBhY3Rpb25zIGFyZSBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBjaHVua3M6XG4gICAqXG4gICAqIC0gUXVlcnkgKGZvciB0aGluZ3MgbGlrZSBmaWx0ZXJzLCBwYWdpbmF0aW9uLCBzZWFyY2gsIGV0Yy4pXG4gICAqIC0gTG9hZGluZyAoZm9yIHdoZXRoZXIgb3Igbm90IHRoZSB0YWJsZSBpcyBsb2FkaW5nIHJvdyBkYXRhKVxuICAgKiAtIFJlc3VsdCAoZm9yIHRoZSByb3cgZGF0YSBpdHNlbGYpXG4gICAqIC0gRGlzcGxheSAoZm9yIHRoaW5ncyBsaWtlIGNvbHVtbiBjb25maWd1cmF0aW9uKVxuICAgKiAtIFNlbGVjdGlvbiAoZm9yIHRyYWNraW5nIHRoZSB1c2VyJ3Mgcm93IHNlbGVjdGlvbnMpXG4gICAqIC0gQ29sbGFwc2VTdGF0ZSAoZm9yIHRyYWNraW5nIHRoZSByb3dzL2hlYWRlcnMgdGhhdCBhcmUgY29sbGFwc2VkKVxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIGRhdGEgZmxvdyBpcyB1bmlkaXJlY3Rpb25hbDogdGhlIFVJIGlzc3VlcyBhY3Rpb25zLCB3aGljaFxuICAgKiBhZmZlY3QgdGhlIHN0YXRlLCBhbmQgdGhlIHN0YXRlIGdldHMgcGFzc2VkIGJhY2sgdG8gdGhlIFVJIGZvciBkaXNwbGF5LlxuICAgKlxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSCICBVSSAg4peE4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUlOKUgOKUgOKUrOKUgOKUgOKUgOKUmCAgICAgICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIJcbiAgICog4pSCICBBY3Rpb25zICDilIIgICDilIJcbiAgICog4pSU4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilJBcbiAgICog4pSCICBTdGF0ZSByZWR1Y2VyICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqXG4gICAqIEZyb20gdGhlIGNvcmUgc3RhdGUsIGNhbGN1bGF0ZWQgc3RhdGUgaXMgZGVyaXZlZCBhbmQgYWRkZWQgdG8gdGhlIGNvcmVcbiAgICogc3RhdGUgKGUuZy4sIGZyb20gdGhlIHJhdyBzZWxlY3Rpb24gc3RhdGUgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdFxuICAgKiBhbGwgdGhlIHJvd3Mgb24gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZSBhcmUgc2VsZWN0ZWQsIGV0Yy4pLlxuICAgKi9cblxuICAvLy8vLy8vLy8vL1xuICAvLyBRdWVyeSAvL1xuICAvLy8vLy8vLy8vL1xuXG4gIC8vIFF1ZXJ5IHN0YXRlIC8vXG5cbiAgZXhwb3J0IHR5cGUgT3JkZXJEaXJlY3Rpb24gPSAnYXNjJyB8ICdkZXNjJztcbiAgZXhwb3J0IGNvbnN0IHBhZ2VTaXplcyA9IFsyNSwgNTAsIDEwMCwgMjUwXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgUXVlcnk8QyBleHRlbmRzIENvbHVtbiwgRiBleHRlbmRzIEZpbHRlcnM+ID0ge1xuICAgIG9yZGVyOiB7XG4gICAgICBkaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uO1xuICAgICAgY29sdW1uOiBDO1xuICAgIH0gfCBudWxsO1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIHNlYXJjaENvbHVtbnM6IE1hcDxDLCBib29sZWFuPjtcbiAgICBmaWx0ZXJzOiBGIHwgbnVsbDtcbiAgICBwYWdpbmF0aW9uOiB7XG4gICAgICBwYWdlOiBudW1iZXI7XG4gICAgICBwYWdlU2l6ZTogbnVtYmVyO1xuICAgIH07XG4gICAgZ3JvdXBpbmc6IHtcbiAgICAgIHZpZXdNb3JlS2V5OiBzdHJpbmcgfCBudWxsO1xuICAgICAgZ3JvdXBzUGVyUGFnZTogbnVtYmVyO1xuICAgICAgY291bnRQZXJHcm91cDogbnVtYmVyO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUXVlcnkgYWN0aW9ucyAvL1xuXG4gIGV4cG9ydCB0eXBlIFF1ZXJ5QWN0aW9uPEMgZXh0ZW5kcyBDb2x1bW4sIEYgZXh0ZW5kcyBGaWx0ZXJzPiA9XG4gICAgfCB7IHR5cGU6ICdsb2FkJyB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdvcmRlckNoYW5nZSc7XG4gICAgICAgIHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydvcmRlciddO1xuICAgICAgICBzb3VyY2U/OiAnaGVhZGVyTWVudSc7XG4gICAgICB9XG4gICAgfCB7IHR5cGU6ICdvcmRlckNvbHVtblRvZ2dsZSc7IGNvbHVtbjogQyB9XG4gICAgfCB7IHR5cGU6ICdzZWFyY2hDaGFuZ2UnOyBwYXlsb2FkOiBRdWVyeTxDLCBGPlsnc2VhcmNoJ10gfVxuICAgIHwgeyB0eXBlOiAnc2VhcmNoQ29sdW1uc0NoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydzZWFyY2hDb2x1bW5zJ10gfVxuICAgIHwgeyB0eXBlOiAnZmlsdGVyc0NoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydmaWx0ZXJzJ10gfVxuICAgIHwgeyB0eXBlOiAnZmlsdGVyQWRkJzsgY29sdW1uS2V5OiBzdHJpbmcgfVxuICAgIHwgeyB0eXBlOiAncGFnaW5hdGlvbkNoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydwYWdpbmF0aW9uJ10gfVxuICAgIHwgeyB0eXBlOiAnZ3JvdXBpbmdDaGFuZ2UnOyBwYXlsb2FkOiBRdWVyeTxDLCBGPlsnZ3JvdXBpbmcnXSB9XG4gICAgfCB7IHR5cGU6ICduZXh0UGFnZU5hdmlnYXRlJyB9XG4gICAgfCB7IHR5cGU6ICdwcmV2aW91c1BhZ2VOYXZpZ2F0ZScgfVxuICAgIHwgeyB0eXBlOiAncGFnZUNoYW5nZSc7IHBhZ2U6IG51bWJlciB9XG4gICAgfCB7IHR5cGU6ICdwYWdlU2l6ZUNoYW5nZSc7IHNpemU6IG51bWJlciB9XG4gICAgfCB7IHR5cGU6ICdncm91cHNQZXJQYWdlQ2hhbmdlJzsgZ3JvdXBzUGVyUGFnZTogbnVtYmVyIH1cbiAgICB8IHsgdHlwZTogJ2NvdW50UGVyR3JvdXBDaGFuZ2UnOyBjb3VudFBlckdyb3VwOiBudW1iZXIgfVxuICAgIHwgeyB0eXBlOiAndmlld01vcmVLZXlDaGFuZ2UnOyB2aWV3TW9yZUtleTogc3RyaW5nIH1cbiAgICB8IHsgdHlwZTogJ3RvZ2dsZUFsbFNlYXJjaENvbHVtbnMnIH07XG5cbiAgLy8vLy8vLy8vL1xuICAvLyBMb2FkIC8vXG4gIC8vLy8vLy8vLy9cblxuICBleHBvcnQgdHlwZSBMb2FkID0ge1xuICAgIGxvYWRpbmc6IGJvb2xlYW47XG4gICAgZXJyb3I6IHVua25vd24gfCBudWxsO1xuICB9O1xuXG4gIC8vLy8vLy8vLy8vL1xuICAvLyBSZXN1bHQgLy9cbiAgLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IHR5cGUgUmVzdWx0PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHJvdyBkYXRhIGZvciB0aGUgY3VycmVudCBwYWdlLCBhZnRlciBmaWx0ZXJzLCBzZWFyY2ggcXVlcnksIGFuZFxuICAgICAqIHJvdyBvcmRlcmluZyBhcmUgYXBwbGllZC5cbiAgICAgKi9cbiAgICBjdXJyZW50UGFnZURhdGE6IFJbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgKHJlZ2FyZGxlc3Mgb2YgcGFnaW5hdGlvbikgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBmaWx0ZXJzIGFuZCBzZWFyY2ggcXVlcnkuXG4gICAgICovXG4gICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiBudW1iZXI7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU3ViR3JvdXBSZXN1bHQ8UiBleHRlbmRzIFJvdywgRyBleHRlbmRzIEdyb3VwPiA9IFJlc3VsdDxSPiAmIHtcbiAgICAvKipcbiAgICAgKiBBbnkgb3RoZXIgcmVsZXZhbnQgZ3JvdXAgZGF0YSwgdXNlZCBmb3IgdGhlIHN1YmhlYWRlclxuICAgICAqL1xuICAgIGdyb3VwRGF0YTogRztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBHcm91cFJlc3VsdDxSIGV4dGVuZHMgUm93LCBHIGV4dGVuZHMgR3JvdXA+ID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHJvdyBkYXRhIGZvciB0aGUgY3VycmVudCBwYWdlLCBhZnRlciBmaWx0ZXJzLCBzZWFyY2ggcXVlcnksIGFuZFxuICAgICAqIHJvdyBvcmRlcmluZyBhcmUgYXBwbGllZCwgc3BsaXQgaW50byBncm91cHNcbiAgICAgKi9cbiAgICBncm91cFJlc3VsdHM6IFN1Ykdyb3VwUmVzdWx0PFIsIEc+W107XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBncm91cHMgKHJlZ2FyZGxlc3Mgb2YgcGFnaW5hdGlvbikgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBmaWx0ZXJzIGFuZCBzZWFyY2ggcXVlcnkuXG4gICAgICovXG4gICAgdG90YWxHcm91cENvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiByb3dzIChyZWdhcmRsZXNzIG9mIHBhZ2luYXRpb24pIHRoYXQgbWF0Y2ggdGhlXG4gICAgICogZmlsdGVycyBhbmQgc2VhcmNoIHF1ZXJ5LlxuICAgICAqL1xuICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogbnVtYmVyO1xuICB9O1xuXG4gIC8qXG4gICAgTmVzdGVkUmVzdWx0XG4gICAgICBOZXN0ZWRIZWFkZXJSb3dcbiAgICAgICAgTmVzdGVkUm93IC0gd2l0aCBzdWJyb3dzXG4gICAgICAgICAgTmVzdGVkUm93IC0gd2l0aCBubyBzdWJyb3dzXG4gICovXG4gIGV4cG9ydCB0eXBlIE5lc3RlZEhlYWRlclJvdzxSIGV4dGVuZHMgUm93PiA9IHtcbiAgICAvLyBUaGUgcm93cyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gd2hlbiB0aGUgdG9nZ2xlIG9uIHRoaXMgaGVhZGVyIGlzIHRvZ2dsZWQuXG4gICAgc3ViUm93czogTmVzdGVkUm93PFI+W107XG5cbiAgICAvLyBUaGUgdGV4dCB0byBzaG93IG5leHQgdG8gdGhlIHRvZ2dsZWFibGUgY2hldnJvbiwgb3IgbnVsbCBpZiB3ZSBkb24ndCBzaG93IHRoZSBoZWFkZXJcbiAgICBoZWFkZXJUZXh0OiBzdHJpbmcgfCBudWxsO1xuICB9O1xuICBleHBvcnQgdHlwZSBOZXN0ZWRSb3c8UiBleHRlbmRzIFJvdz4gPSB7XG4gICAgLy8gVGhlIHJvd3MgdGhhdCBzaG91bGQgYmUgaGlkZGVuIHdoZW4gdGhlIHRvZ2dsZSBvbiB0aGlzIHJvdyBpcyB0b2dnbGVkLlxuICAgIHN1YlJvd3M/OiBOZXN0ZWRSb3c8Uj5bXTtcblxuICAgIC8vIFRoZSByZWxldmFudCBkYXRhIHVzZWQgdG8gZGlzcGxheSB0aGlzIHJvdy5cbiAgICBkYXRhOiBSO1xuICB9O1xuICAvKlxuICAgIE5lc3RlZCBoZWFkZXIgcm93cyBhcmUgdG9nZ2xlYWJsZSBoZWFkZXJzIGZvciBncm91cHMgb2Ygcm93cy5cbiAgKi9cbiAgZXhwb3J0IHR5cGUgTmVzdGVkUmVzdWx0PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHJvdyBkYXRhIGZvciB0aGUgY3VycmVudCBwYWdlLCBhZnRlciBmaWx0ZXJzLCBzZWFyY2ggcXVlcnksIGFuZFxuICAgICAqIHJvdyBvcmRlcmluZyBhcmUgYXBwbGllZCwgbmVzdGVkIGludG8gXCJoZWFkZXJzIHdpdGggc3Vicm93c1wiLlxuICAgICAqL1xuICAgIGN1cnJlbnRQYWdlTmVzdGVkSGVhZGVyczogTmVzdGVkSGVhZGVyUm93PFI+W107XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiByb3dzIChyZWdhcmRsZXNzIG9mIHBhZ2luYXRpb24pIHRoYXQgbWF0Y2ggdGhlXG4gICAgICogZmlsdGVycyBhbmQgc2VhcmNoIHF1ZXJ5LlxuICAgICAqXG4gICAgICogT25seSBjb3VudHMgcm93cyBhdCB0aGUgYm90dG9tIGxldmVsIG9mIG5lc3RpbmcuXG4gICAgICovXG4gICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiBudW1iZXI7XG5cbiAgICAvKlxuICAgICAgVGhpcyB0eXBlIGFsc28gc3VwcG9ydHMgbmVzdGVkIHJvd3Mgd2l0aG91dCBoZWFkZXIgcm93cywgc28gdGhpcyBwcm9wZXJ0eVxuICAgICAgaGVscHMgdXMgdGVsbCB3aGV0aGVyIHRvIHNob3cgdGhlIGhlYWRlcnMuXG4gICAgKi9cbiAgICBoYXNIZWFkZXJzOiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFNvdXJjZTxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4gPSAoXG4gICAgcXVlcnk6IFF1ZXJ5PEMsIEY+LFxuICAgIG1vc3RSZWNlbnRBY3Rpb246IEFjdGlvbjxSLCBDLCBGLCBHPixcbiAgKSA9PiBQcm9taXNlPFJlc3VsdDxSPiB8IEdyb3VwUmVzdWx0PFIsIEc+IHwgTmVzdGVkUmVzdWx0PFI+PjtcblxuICAvLy8vLy8vLy8vLy8vXG4gIC8vIERpc3BsYXkgLy9cbiAgLy8vLy8vLy8vLy8vL1xuXG4gIC8vIERpc3BsYXkgc3RhdGUgLy9cblxuICBleHBvcnQgdHlwZSBDb2x1bW5TZXR0aW5nczxDIGV4dGVuZHMgQ29sdW1uPiA9IHtcbiAgICBrZXk6IEM7XG4gICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICBwcmVmZXJyZWRXaWR0aDogbnVtYmVyIHwgJ2F1dG8nO1xuICAgIHBpbm5lZDogYm9vbGVhbjtcbiAgfTtcbiAgZXhwb3J0IHR5cGUgRGlzcGxheTxDIGV4dGVuZHMgQ29sdW1uPiA9IHtcbiAgICBjb2x1bW5TZXR0aW5nczogQ29sdW1uU2V0dGluZ3M8Qz5bXTtcbiAgICBjZWxsUm93U3BhbjogKHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbjogQykgPT4gbnVtYmVyO1xuICB9O1xuXG4gIC8vIERpc3BsYXkgYWN0aW9ucyAvL1xuXG4gIGV4cG9ydCB0eXBlIERpc3BsYXlBY3Rpb248QyBleHRlbmRzIENvbHVtbj4gPVxuICAgIHwgeyB0eXBlOiAnY29sdW1uU2V0dGluZ3NDaGFuZ2UnOyBwYXlsb2FkOiBEaXNwbGF5PEM+Wydjb2x1bW5TZXR0aW5ncyddIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtblBpbkNoYW5nZSc7XG4gICAgICAgIGNvbHVtbjogQztcbiAgICAgICAgcGlubmVkOiBib29sZWFuO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnY29sdW1uc0ZyZWV6ZVVwVG9DaGFuZ2UnO1xuICAgICAgICBpbmRleDogbnVtYmVyO1xuICAgICAgICBmcmVlemU6IGJvb2xlYW47XG4gICAgICAgIHNvdXJjZT86ICdoZWFkZXJNZW51JyB8ICdvcHRpb25zTWVudScgfCAnZnJlZXplRGl2aWRlcic7XG4gICAgICAgIGNvbHVtbj86IEM7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdjb2x1bW5PcmRlckNoYW5nZSc7XG4gICAgICAgIHByZXZpb3VzSW5kZXg6IG51bWJlcjtcbiAgICAgICAgbmV3SW5kZXg6IG51bWJlcjtcbiAgICAgICAgc291cmNlPzogJ3RhYmxlRHJhZycgfCAnbWVudURyYWcnO1xuICAgICAgICBjb2x1bW4/OiBDO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnY29sdW1uTW92ZVRvQ2hhbmdlJztcbiAgICAgICAgY29sdW1uOiBDO1xuICAgICAgICBwb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnY29sdW1uRW5hYmxlZENoYW5nZSc7XG4gICAgICAgIGNvbHVtbjogQztcbiAgICAgICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAgICAgc291cmNlPzogJ2hlYWRlck1lbnUnIHwgJ29wdGlvbnNNZW51JyB8ICdkcmFnRHJvcCcgfCAnZXllSWNvbic7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdlbmFibGVBbGxDb2x1bW5zQ2hhbmdlJztcbiAgICAgICAgZW5hYmxlZDogYm9vbGVhbjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbldpZHRoQ2hhbmdlJztcbiAgICAgICAgY29sdW1uOiBDO1xuICAgICAgICBwcmVmZXJyZWRXaWR0aDogbnVtYmVyIHwgJ2F1dG8nO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncmVzZXRUb0RlZmF1bHRDb2x1bW5zJztcbiAgICAgIH07XG5cbiAgLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFNlbGVjdGlvbiAvL1xuICAvLy8vLy8vLy8vLy8vLy9cblxuICAvLyBTZWxlY3Rpb24gc3RhdGUgLy9cblxuICBleHBvcnQgdHlwZSBTZWxlY3Rpb248UiBleHRlbmRzIFJvdz4gPSB7XG4gICAgbW9zdFJlY2VudGx5U2VsZWN0ZWQ6IFJbJ2lkJ10gfCBudWxsO1xuICB9ICYgKFxuICAgIHwge1xuICAgICAgICBtb2RlOiAnaW5jbHVkZSc7XG4gICAgICAgIGluY2x1ZGVkOiBTZXQ8UlsnaWQnXT47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIG1vZGU6ICdleGNsdWRlJztcbiAgICAgICAgZXhjbHVkZWQ6IFNldDxSWydpZCddPjtcbiAgICAgIH1cbiAgKTtcblxuICAvLyBTZWxlY3Rpb24gYWN0aW9ucyAvL1xuXG4gIGV4cG9ydCB0eXBlIFNlbGVjdGlvbkFjdGlvbjxSIGV4dGVuZHMgUm93LCBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfT4gPVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnc2VsZWN0aW9uQ2hhbmdlJztcbiAgICAgICAgcGF5bG9hZDogU2VsZWN0aW9uPFI+O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZ3JvdXBTZWxlY3Rpb25DaGFuZ2UnO1xuICAgICAgICBwYXlsb2FkOiBSb3dHcm91cDxSLCBHPjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3Jvd1NlbGVjdGVkQ2hhbmdlJztcbiAgICAgICAgaWQ6IFJbJ2lkJ107XG4gICAgICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICAgICAgICBjb250aWd1b3VzOiBib29sZWFuO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncGFnZVNlbGVjdGVkQ2hhbmdlJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2FsbFNlbGVjdGVkQ2hhbmdlJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3NlbGVjdGlvbkNsZWFyJztcbiAgICAgIH07XG5cbiAgZXhwb3J0IHR5cGUgQ29sbGFwc2VTdGF0ZTxSIGV4dGVuZHMgUm93PiA9XG4gICAgfCB7XG4gICAgICAgIGRlZmF1bHRUbzogJ2NvbGxhcHNlZCc7XG4gICAgICAgIGV4cGFuZGVkUm93czogU2V0PFJbJ2lkJ10+O1xuICAgICAgICBleHBhbmRlZEhlYWRlcnM6IFNldDxzdHJpbmc+O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBkZWZhdWx0VG86ICdleHBhbmRlZCc7XG4gICAgICAgIGNvbGxhcHNlZFJvd3M6IFNldDxSWydpZCddPjtcbiAgICAgICAgY29sbGFwc2VkSGVhZGVyczogU2V0PHN0cmluZz47XG4gICAgICB9O1xuXG4gIGV4cG9ydCB0eXBlIENvbGxhcHNlQWN0aW9uPFIgZXh0ZW5kcyBSb3c+ID1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZVJvd0NvbGxhcHNlJztcbiAgICAgICAgaWQ6IFJbJ2lkJ107XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICd0b2dnbGVIZWFkZXJDb2xsYXBzZSc7XG4gICAgICAgIGlkOiBzdHJpbmc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICd0b2dnbGVBbGxDb2xsYXBzZWQnO1xuICAgICAgfTtcblxuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuICAvLyBQdXR0aW5nIGl0IGFsbCB0b2dldGhlciAvL1xuICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4gIC8vIENvbWJpbmVkIHN0YXRlIC8vXG5cbiAgZXhwb3J0IHR5cGUgQ29yZVN0YXRlPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IHtcbiAgICBxdWVyeTogUXVlcnk8QywgRj47XG4gICAgbG9hZDogTG9hZDtcbiAgICByZXN1bHQ6IFJlc3VsdDxSPiB8IEdyb3VwUmVzdWx0PFIsIEc+IHwgTmVzdGVkUmVzdWx0PFI+O1xuICAgIGRpc3BsYXk6IERpc3BsYXk8Qz47XG4gICAgc2VsZWN0aW9uOiBTZWxlY3Rpb248Uj47XG4gICAgY29sbGFwc2VTdGF0ZTogQ29sbGFwc2VTdGF0ZTxSPjtcbiAgfTtcblxuICAvLyBDb21iaW5lZCBhY3Rpb25zIC8vXG5cbiAgZXhwb3J0IHR5cGUgQWN0aW9uPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9XG4gICAgfCBRdWVyeUFjdGlvbjxDLCBGPlxuICAgIHwgRGlzcGxheUFjdGlvbjxDPlxuICAgIHwgU2VsZWN0aW9uQWN0aW9uPFIsIEc+XG4gICAgfCBDb2xsYXBzZUFjdGlvbjxSPjtcblxuICBleHBvcnQgdHlwZSBFZmZlY3QgPSAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJztcblxuICAvLyBGdWxsIHN0YXRlIChjb3JlIHN0YXRlIHBsdXMgcHVyZSBkZXJpdmF0aW9ucykgLy9cbiAgZXhwb3J0IGNvbnN0IENvbHVtbnNNYXhTaG93bjogbnVtYmVyID0gNTA7XG4gIGV4cG9ydCBjb25zdCBDb2x1bW5EYXRhVHlwZXMgPSBbXG4gICAgJ2FkdmFuY2VkJyxcbiAgICAnY3VycmVuY3knLFxuICAgICdkYXRlJyxcbiAgICAnaWNvbicsXG4gICAgJ2xvbmdUZXh0JyxcbiAgICAnbnVtYmVyJyxcbiAgICAnc2hvcnRUZXh0JyxcbiAgXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgQ29sdW1uRGF0YVR5cGUgPSAodHlwZW9mIENvbHVtbkRhdGFUeXBlcylbbnVtYmVyXTtcbiAgZXhwb3J0IHR5cGUgQ29sdW1uQWxpZ25tZW50ID0gJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnO1xuICBleHBvcnQgdHlwZSBDb2x1bW5NZXRhZGF0YSA9IHtcbiAgICBvcmRlcmFibGU6IGJvb2xlYW47XG4gICAgZmlsdGVyYWJsZT86IGJvb2xlYW47XG4gICAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gICAgbWluV2lkdGg6IG51bWJlcjtcbiAgICBkYXRhVHlwZTogQ29sdW1uRGF0YVR5cGU7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgZGVmYXVsdFBpbm5lZD86IGJvb2xlYW47XG4gICAgYWx3YXlzUGlubmVkPzogYm9vbGVhbjtcbiAgICB0b29sdGlwRm9yUmVvcmRlckljb24/OiBzdHJpbmc7XG4gICAgY2xpY2tQcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG4gICAgY2xpY2tTdG9wUHJvcGFnYXRpb24/OiBib29sZWFuO1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAgIGFsd2F5c1Zpc2libGU/OiBib29sZWFuO1xuICAgIHRvb2x0aXBGb3JIaWRlSWNvbj86IHN0cmluZztcbiAgfTtcbiAgZXhwb3J0IHR5cGUgRXh0ZXJuYWxSb3dMaW5rID0ge1xuICAgIHR5cGU6ICdleHRlcm5hbCc7XG4gICAgaHJlZjogc3RyaW5nO1xuICB9O1xuICBleHBvcnQgdHlwZSBJbnRlcm5hbFJvd0xpbmsgPSB7XG4gICAgdHlwZTogJ2ludGVybmFsJztcbiAgICByb3V0ZXJMaW5rOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgICBxdWVyeVBhcmFtcz86IFBhcmFtcztcbiAgICBxdWVyeVBhcmFtc0hhbmRsaW5nPzogUXVlcnlQYXJhbXNIYW5kbGluZztcbiAgICBhY3RpdmU/OiBib29sZWFuO1xuICB9O1xuICBleHBvcnQgdHlwZSBSb3dMaW5rID0gRXh0ZXJuYWxSb3dMaW5rIHwgSW50ZXJuYWxSb3dMaW5rO1xuICBleHBvcnQgdHlwZSBGdWxsUm93PFIgZXh0ZW5kcyBSb3c+ID0gUiAmIHtcbiAgICByb3dMaW5rOiBSb3dMaW5rIHwgbnVsbDtcbiAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICBpc0NvbGxhcHNlZDogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBSb3dHcm91cDxSIGV4dGVuZHMgUm93LCBHIGV4dGVuZHMgR3JvdXA+ID0ge1xuICAgIHJvd3M6IEZ1bGxSb3c8Uj5bXTtcbiAgICBzZWxlY3RlZDogTXVsdGlTZWxlY3Rpb25TdGF0ZTtcbiAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IG51bWJlcjtcbiAgICBncm91cERhdGE6IEc7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgRnVsbE5lc3RlZFJvdzxSIGV4dGVuZHMgUm93PiA9IHtcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHN1YlJvd3M/OiBGdWxsTmVzdGVkUm93PFI+W107XG4gICAgZGF0YTogUjtcbiAgICByb3dMaW5rOiBSb3dMaW5rIHwgbnVsbDtcbiAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICBpc0NvbGxhcHNlZDogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsTmVzdGVkSGVhZGVyUm93PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc3ViUm93czogRnVsbE5lc3RlZFJvdzxSPltdO1xuICAgIGhlYWRlclRleHQ6IHN0cmluZyB8IG51bGw7XG4gICAgaXNDb2xsYXBzZWQ6IGJvb2xlYW47XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgRnVsbENvbHVtbjxDIGV4dGVuZHMgQ29sdW1uPiA9IENvbHVtblNldHRpbmdzPEM+ICZcbiAgICBDb2x1bW5NZXRhZGF0YSAmIHtcbiAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICBsZWZ0OiBudW1iZXIgfCBudWxsO1xuICAgICAgYWxpZ25tZW50OiBDb2x1bW5BbGlnbm1lbnQ7XG4gICAgfTtcbiAgZXhwb3J0IHR5cGUgTXVsdGlTZWxlY3Rpb25TdGF0ZSA9IGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZSc7XG4gIGV4cG9ydCB0eXBlIFNlbGVjdGlvbkNvbmZpZ3VyYXRpb24gPSBib29sZWFuIHwgJ2luZGl2aWR1YWwnO1xuXG4gIGV4cG9ydCB0eXBlIFJvd1NwYW5HZXR0ZXI8QyBleHRlbmRzIENvbHVtbj4gPSAoXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBjb2x1bW46IEMsXG4gICkgPT4gbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBleHBvcnQgdHlwZSBWYWxpZFJvd1NwYW5HZXR0ZXI8QyBleHRlbmRzIENvbHVtbj4gPSAoXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBjb2x1bW46IEMsXG4gICkgPT4gbnVtYmVyO1xuXG4gIGV4cG9ydCB0eXBlIENzdkNlbGxGb3JtYXR0ZXI8UiBleHRlbmRzIFJvdywgQyBleHRlbmRzIENvbHVtbj4gPSAoXG4gICAgcm93OiBSLFxuICAgIGNvbHVtbjogRnVsbENvbHVtbjxDPixcbiAgKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG4gIGV4cG9ydCB0eXBlIENzdkdyb3VwQ2VsbEZvcm1hdHRlcjxSIGV4dGVuZHMgUm93LCBHIGV4dGVuZHMgR3JvdXA+ID0gKFxuICAgIHJvdzogUixcbiAgICBncm91cDogRyxcbiAgKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG4gIGV4cG9ydCB0eXBlIENzdlJvdyA9IHN0cmluZ1tdO1xuICBleHBvcnQgdHlwZSBDc3YgPSBDc3ZSb3dbXTtcbiAgZXhwb3J0IHR5cGUgQ3N2TW9kZSA9ICdmdWxsJyB8ICdzZWxlY3Rpb24nO1xuICBleHBvcnQgdHlwZSBDc3ZPdXRwdXQgPVxuICAgIHwgeyBsb2FkaW5nOiB0cnVlOyBkYXRhOiBudWxsIH1cbiAgICB8IHsgbG9hZGluZzogZmFsc2U7IGRhdGE6IENzdiB9O1xuXG4gIGV4cG9ydCB0eXBlIENvbHVtbk5hbWVNYXA8QyBleHRlbmRzIENvbHVtbj4gPSBNYXA8QywgQyB8IHN0cmluZz47XG5cbiAgZXhwb3J0IHR5cGUgU2VhcmNoYWJsZUNvbHVtbk1hcDxDIGV4dGVuZHMgQ29sdW1uPiA9IE1hcDxDLCBib29sZWFuPjtcblxuICBleHBvcnQgdHlwZSBGdWxsU3RhdGU8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0gQ29yZVN0YXRlPFIsIEMsIEYsIEc+ICYge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHByZXZpb3VzOiBudW1iZXIgfCBudWxsO1xuICAgICAgICBwYWdlczogbnVtYmVyW107XG4gICAgICAgIG5leHQ6IG51bWJlciB8IG51bGw7XG4gICAgICAgIHBhZ2VDb3VudDogbnVtYmVyO1xuICAgICAgICBzaG93Q29udHJvbHM6IGJvb2xlYW47XG4gICAgICAgIHBhZ2VSb3dTdGFydDogbnVtYmVyO1xuICAgICAgICBwYWdlUm93RW5kOiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgbm9TZWFyY2hDb2x1bW5zU2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgfTtcbiAgICByZXN1bHQ6XG4gICAgICB8IHtcbiAgICAgICAgICByb3dzOiBGdWxsUm93PFI+W107XG4gICAgICAgICAgcm93c0FzR3JvdXA6IFJvd0dyb3VwPFIsIEc+O1xuICAgICAgICAgIGlzR3JvdXBlZDogZmFsc2U7XG4gICAgICAgICAgcmVzdWx0VHlwZTogJ25vcm1hbC1yb3dzJztcbiAgICAgICAgICBjc3ZEYXRhOiAobW9kZT86IENzdk1vZGUpID0+IEFzeW5jR2VuZXJhdG9yPENzdk91dHB1dD47XG4gICAgICAgICAgY3N2RmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgcm93czogRnVsbFJvdzxSPltdO1xuICAgICAgICAgIHJvd0dyb3VwczogUm93R3JvdXA8UiwgRz5bXTtcbiAgICAgICAgICBpc0dyb3VwZWQ6IHRydWU7XG4gICAgICAgICAgcmVzdWx0VHlwZTogJ3RhYmxlLWdyb3VwaW5nJztcbiAgICAgICAgICBjc3ZEYXRhOiAobW9kZT86IENzdk1vZGUpID0+IEFzeW5jR2VuZXJhdG9yPENzdk91dHB1dD47XG4gICAgICAgICAgY3N2RmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgcm93czogRnVsbFJvdzxSPltdO1xuICAgICAgICAgIG5lc3RlZEhlYWRlclJvd3M6IEZ1bGxOZXN0ZWRIZWFkZXJSb3c8Uj5bXTtcbiAgICAgICAgICBpc0dyb3VwZWQ6IGZhbHNlO1xuICAgICAgICAgIHJlc3VsdFR5cGU6ICduZXN0ZWQtcm93cyc7XG4gICAgICAgICAgY3N2RGF0YTogKG1vZGU/OiBDc3ZNb2RlKSA9PiBBc3luY0dlbmVyYXRvcjxDc3ZPdXRwdXQ+O1xuICAgICAgICAgIGNzdkZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgY29sdW1uczogRnVsbENvbHVtbjxDPltdO1xuICAgICAgZGlzYWJsZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgICBhbGxDb2x1bW5zOiBDb2x1bW5TZXR0aW5nczxDPltdO1xuICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogU2VhcmNoYWJsZUNvbHVtbk1hcDxDPjtcbiAgICAgIGNvbHVtbk5hbWVNYXA6IENvbHVtbk5hbWVNYXA8Qz47XG4gICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgICAgY29sdW1uc0FyZUZyZWV6YWJsZTogYm9vbGVhbjtcbiAgICAgIGNvbHVtbnNBcmVIaWRlYWJsZTogYm9vbGVhbjtcbiAgICAgIGNvbHVtbnNBcmVSZW9yZGVyYWJsZTogYm9vbGVhbjtcbiAgICAgIHJvd3NBcmVHcmF5ZWQ6IGJvb2xlYW47XG4gICAgICBjdXN0b21TdW1tYXJ5Um93OiBib29sZWFuO1xuICAgICAgY3N2RXhwb3J0QWxsb3dlZDogYm9vbGVhbjtcbiAgICAgIGVuYWJsZWRDb3VudDogbnVtYmVyO1xuICAgICAgaGlkZVBhZ2VTaXplU2VsZWN0b3I6IGJvb2xlYW47XG4gICAgICBuZWVkc1JpZ2h0Qm9yZGVyOiAocm93SW5kZXg6IG51bWJlciwgY29sdW1uOiBDKSA9PiBib29sZWFuO1xuICAgICAgdW5hdmFpbGFibGVDb2x1bW5LZXlzOiBDW107XG4gICAgICB1bmF2YWlsYWJsZUZvbGRlclRpdGxlOiBzdHJpbmc7XG4gICAgfTtcbiAgICBzZWxlY3Rpb246IHtcbiAgICAgIGFsbG93U2VsZWN0aW9uOiBTZWxlY3Rpb25Db25maWd1cmF0aW9uO1xuICAgICAgaXNBbGxTZWxlY3RlZDogTXVsdGlTZWxlY3Rpb25TdGF0ZTtcbiAgICAgIGlzQ3VycmVudFBhZ2VTZWxlY3RlZDogTXVsdGlTZWxlY3Rpb25TdGF0ZTtcbiAgICAgIHNlbGVjdGVkQ291bnQ6IG51bWJlcjtcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciBpcyB3aGF0IHNldHMgdXAgdGhlIGluaXRpYWwgc3RhdGUgYW5kIHRyYW5zbGF0ZXMgdXNlciBhY3Rpb25zXG4gICAqIChsaWtlIHBhZ2luYXRpb24gb3IgZmlsdGVyIGNoYW5nZXMsIGV0Yy4pIGludG8gbmV3IHJvdyBkYXRhIGJ5IGNhbGxpbmcgdGhlXG4gICAqIHJlZHVjZXIgZnVuY3Rpb24uIEl0IGFsc28gYXVnbWVudHMgdGhlIGNvcmUgc3RhdGUgd2l0aCBhZGRpdGlvbmFsIGRlcml2ZWRcbiAgICogc3RhdGUuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXI8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0ge1xuICAgIGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPFIsIEMsIEYsIEc+PjtcbiAgICBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPFIsIEMsIEYsIEc+PjtcbiAgICBlZmZlY3RzOiBDb25uZWN0YWJsZTxFZmZlY3Q+O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXJPcHRpb25zPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IHtcbiAgICBpbml0aWFsU3RhdGU/OiBEZWVwUGFydGlhbDxDb3JlU3RhdGU8UiwgQywgRiwgRz4+O1xuICAgIHJvd0xpbms/OiAocm93OiBSLCBncm91cD86IEcpID0+IFJvd0xpbms7XG4gICAgY3N2Q2VsbEZvcm1hdHRlcj86IENzdkNlbGxGb3JtYXR0ZXI8UiwgQz47XG4gICAgY3N2R3JvdXBDZWxsRm9ybWF0dGVyPzogQ3N2R3JvdXBDZWxsRm9ybWF0dGVyPFIsIEc+O1xuICAgIGNzdkZpbGVCYXNlbmFtZT86IHN0cmluZztcbiAgICBhbGxvd1NlbGVjdGlvbj86IFNlbGVjdGlvbkNvbmZpZ3VyYXRpb247XG4gICAgY29sdW1uc0FyZUZyZWV6YWJsZT86IGJvb2xlYW47XG4gICAgY29sdW1uc0FyZUhpZGVhYmxlPzogYm9vbGVhbjtcbiAgICBjb2x1bW5zQXJlUmVvcmRlcmFibGU/OiBib29sZWFuO1xuICAgIGNvbHVtbnNVc2VPcmlnaW5hbENhc2luZz86IGJvb2xlYW47XG4gICAgZGVmYXVsdENvbHVtblN0YXRlPzogQ29sdW1uU2V0dGluZ3M8Qz5bXTtcbiAgICByb3dzQXJlR3JheWVkPzogYm9vbGVhbjtcbiAgICBjdXN0b21TdW1tYXJ5Um93PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoZSBcIlJlc3VsdHMgcGVyIHBhZ2VcIiBsYWJlbCBhbmQgcGFnZS1zaXplIGRyb3Bkb3duIGFyZVxuICAgICAqIGhpZGRlbi4gUGFnZSBuYXZpZ2F0aW9uIGFycm93cyBhbmQgcGFnZSBudW1iZXJzIHJlbWFpbiB2aXNpYmxlLlxuICAgICAqL1xuICAgIGhpZGVQYWdlU2l6ZVNlbGVjdG9yPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBQYXJlbnQtY29udHJvbGxlZCByb3cgc3Bhbm5pbmcuXG4gICAgICogUmV0dXJuIDAgdG8gc3VwcHJlc3MgdGhlIGNlbGwsID49MSBmb3IgYSByZWFsIHJvd3NwYW4uXG4gICAgICogSWYgb21pdHRlZCBvciBpbnZhbGlkLCBkZWZhdWx0cyB0byAxLlxuICAgICAqL1xuICAgIGdldFJvd1NwYW5Gb3JDZWxsPzogUm93U3BhbkdldHRlcjxDPjtcbiAgICBoYXNOZXN0ZWRIZWFkZXJzPzogYm9vbGVhbjtcbiAgICB1bmF2YWlsYWJsZUNvbHVtbktleXM/OiBDW107XG4gICAgdW5hdmFpbGFibGVGb2xkZXJUaXRsZT86IHN0cmluZztcbiAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWFuYWdlcjxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4oXG4gICAgc291cmNlOiBTb3VyY2U8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIENvbHVtbk1ldGFkYXRhPixcbiAgICBwbHVyYWxFbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+LFxuICApOiBNYW5hZ2VyPFIsIEMsIEYsIEc+IHtcbiAgICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgdGFibGUgc3RhdGUuXG5cbiAgICBjb25zdCBzZWFyY2hhYmxlQ29sdW1uTWFwOiBTZWFyY2hhYmxlQ29sdW1uTWFwPEM+ID0gbmV3IE1hcDxDLCBib29sZWFuPihcbiAgICAgIEFycmF5LmZyb20oY29sdW1ucy5lbnRyaWVzKCkpLm1hcCgoW2tleSwgbWV0YWRhdGFdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgbWV0YWRhdGEuc2VhcmNoYWJsZSA/PyB0cnVlLFxuICAgICAgXSksXG4gICAgKTtcbiAgICBjb25zdCBkZWZhdWx0U3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPiA9IHtcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIG9yZGVyOiBudWxsLFxuICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICBzZWFyY2hDb2x1bW5zOiBuZXcgTWFwKFxuICAgICAgICAgIEFycmF5LmZyb20oY29sdW1ucy5rZXlzKCkpXG4gICAgICAgICAgICAuZmlsdGVyKGtleSA9PiBzZWFyY2hhYmxlQ29sdW1uTWFwLmdldChrZXkpKVxuICAgICAgICAgICAgLm1hcChrZXkgPT4gW2tleSwgdHJ1ZV0pLFxuICAgICAgICApLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICBwYWdlU2l6ZTogMjUsXG4gICAgICAgIH0sXG4gICAgICAgIGdyb3VwaW5nOiB7XG4gICAgICAgICAgdmlld01vcmVLZXk6IG51bGwsXG4gICAgICAgICAgZ3JvdXBzUGVyUGFnZTogNSxcbiAgICAgICAgICBjb3VudFBlckdyb3VwOiAxMCxcbiAgICAgICAgfSxcbiAgICAgICAgZmlsdGVyczogbnVsbCxcbiAgICAgIH0sXG4gICAgICBsb2FkOiB7IGxvYWRpbmc6IGZhbHNlLCBlcnJvcjogbnVsbCB9LFxuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIGN1cnJlbnRQYWdlRGF0YTogW10sXG4gICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogMCxcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIGNvbHVtblNldHRpbmdzOiBbXSxcbiAgICAgICAgY2VsbFJvd1NwYW46IChfaTogbnVtYmVyLCBfY29sdW1uOiBDKSA9PiAxLFxuICAgICAgfSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICBpbmNsdWRlZDogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICAgIGNvbGxhcHNlU3RhdGU6IHtcbiAgICAgICAgZGVmYXVsdFRvOiAnZXhwYW5kZWQnLFxuICAgICAgICBjb2xsYXBzZWRSb3dzOiBuZXcgU2V0KCksXG4gICAgICAgIGNvbGxhcHNlZEhlYWRlcnM6IG5ldyBTZXQoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0ZWRJbml0aWFsU3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPiA9IGRlZmF1bHRzRGVlcChcbiAgICAgIHt9LFxuICAgICAgb3B0aW9ucz8uaW5pdGlhbFN0YXRlLFxuICAgICAgZGVmYXVsdFN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBjb2x1bW5OYW1lTWFwOiBDb2x1bW5OYW1lTWFwPEM+ID0gbmV3IE1hcDxDLCBDIHwgc3RyaW5nPihcbiAgICAgIEFycmF5LmZyb20oY29sdW1ucy5lbnRyaWVzKCkpLm1hcCgoW2tleSwgbWV0YWRhdGFdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbHVtbkRpc3BsYXlOYW1lOiBzdHJpbmcgPSBtZXRhZGF0YS5kaXNwbGF5TmFtZSA/PyBrZXk7XG4gICAgICAgIGNvbnN0IGZvcm1hdHRlZENvbHVtbk5hbWU6IHN0cmluZyA9IG9wdGlvbnM/LmNvbHVtbnNVc2VPcmlnaW5hbENhc2luZ1xuICAgICAgICAgID8gY29sdW1uRGlzcGxheU5hbWVcbiAgICAgICAgICA6IHRvU2VudGVuY2VDYXNlKGNvbHVtbkRpc3BsYXlOYW1lKTtcblxuICAgICAgICByZXR1cm4gW2tleSwgZm9ybWF0dGVkQ29sdW1uTmFtZV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgZGVmYXVsdENvbHVtblN0YXRlID1cbiAgICAgIG9wdGlvbnM/LmRlZmF1bHRDb2x1bW5TdGF0ZSA/P1xuICAgICAgZGVmYXVsdGVkSW5pdGlhbFN0YXRlLmRpc3BsYXkuY29sdW1uU2V0dGluZ3M7XG5cbiAgICAvLyBXaXJlIHVwIHJlZHVjZWQgc3RhdGUgZnJvbSBhY3Rpb25zIGFuZCBpbml0aWFsIHN0YXRlLlxuICAgIGNvbnN0IGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPFIsIEMsIEYsIEc+PiA9IG5ldyBTdWJqZWN0KCk7XG4gICAgY29uc3QgY29yZVN0YXRlOiBPYnNlcnZhYmxlPHtcbiAgICAgIHN0YXRlOiBDb3JlU3RhdGU8UiwgQywgRiwgRz47XG4gICAgICBlZmZlY3Q6IEVmZmVjdCB8IG51bGw7XG4gICAgfT4gPSBhY3Rpb25zLnBpcGUoXG4gICAgICBtZXJnZVNjYW48XG4gICAgICAgIEFjdGlvbjxSLCBDLCBGLCBHPixcbiAgICAgICAge1xuICAgICAgICAgIHN0YXRlOiBDb3JlU3RhdGU8UiwgQywgRiwgRz47XG4gICAgICAgICAgZWZmZWN0OiBFZmZlY3QgfCBudWxsO1xuICAgICAgICB9XG4gICAgICA+KFxuICAgICAgICAoeyBzdGF0ZSB9LCBhY3Rpb24pID0+XG4gICAgICAgICAgZnJvbShcbiAgICAgICAgICAgIHJlZHVjZShcbiAgICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgICAgICBkZWZhdWx0Q29sdW1uU3RhdGUsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIHsgc3RhdGU6IGRlZmF1bHRlZEluaXRpYWxTdGF0ZSwgZWZmZWN0OiBudWxsIH0sXG4gICAgICAgIDEsXG4gICAgICApLFxuICAgICAgc2hhcmUoe1xuICAgICAgICBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLFxuICAgICAgICByZXNldE9uRXJyb3I6IGZhbHNlLFxuICAgICAgICByZXNldE9uQ29tcGxldGU6IGZhbHNlLFxuICAgICAgICByZXNldE9uUmVmQ291bnRaZXJvOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBjc3ZFeHBvcnRBbGxvd2VkID0gIShcbiAgICAgIG9wdGlvbnM/LmdldFJvd1NwYW5Gb3JDZWxsIHx8IG9wdGlvbnM/LmN1c3RvbVN1bW1hcnlSb3dcbiAgICApO1xuXG4gICAgLy8gQXVnbWVudCBzdGF0ZSB3aXRoIGRlcml2ZWQgc3RhdGUsIGFuZCBzdWJzY3JpYmUuXG4gICAgY29uc3Qgc3RhdGU6IENvbm5lY3RhYmxlPEZ1bGxTdGF0ZTxSLCBDLCBGLCBHPj4gPSBjb25uZWN0YWJsZShcbiAgICAgIGNvcmVTdGF0ZS5waXBlKFxuICAgICAgICBtYXAoKHsgc3RhdGU6IHMgfSk6IEZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiA9PiB7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWRDb2x1bW5zID0gVGFibGVDb2x1bW5IZWxwZXJzLnJlc29sdmVDb2x1bW5zKFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgICAgISFvcHRpb25zPy5hbGxvd1NlbGVjdGlvbixcbiAgICAgICAgICAgICdlbmFibGVkJyxcbiAgICAgICAgICAgICEhb3B0aW9ucz8uaGFzTmVzdGVkSGVhZGVycyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zID0gVGFibGVDb2x1bW5IZWxwZXJzLnJlc29sdmVDb2x1bW5zKFxuICAgICAgICAgICAgcyxcbiAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgICAgISFvcHRpb25zPy5hbGxvd1NlbGVjdGlvbixcbiAgICAgICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICAgICAhIW9wdGlvbnM/Lmhhc05lc3RlZEhlYWRlcnMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChUYWJsZVJlc3VsdEhlbHBlcnMuaXNHcm91cFJlc3VsdChzLnJlc3VsdCkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZXJpdmVGdWxsU3RhdGVGcm9tR3JvdXBSZXN1bHQoe1xuICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICBzdGF0ZVJlc3VsdDogcy5yZXN1bHQsXG4gICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgICAgICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgICAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgICAgICAgY3N2RXhwb3J0QWxsb3dlZCxcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoVGFibGVSZXN1bHRIZWxwZXJzLmlzTmVzdGVkUmVzdWx0KHMucmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlcml2ZUZ1bGxTdGF0ZUZyb21OZXN0ZWRSZXN1bHQoe1xuICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICBzdGF0ZVJlc3VsdDogcy5yZXN1bHQsXG4gICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgICAgICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgICAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgICAgICAgY3N2RXhwb3J0QWxsb3dlZCxcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGVyaXZlRnVsbFN0YXRlRnJvbVJlZ3VsYXJSZXN1bHQoe1xuICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICBzdGF0ZVJlc3VsdDogcy5yZXN1bHQsXG4gICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgICAgICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgICAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgICAgICAgY3N2RXhwb3J0QWxsb3dlZCxcbiAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHNjYW4oKHN0YWJsZSwgbmV3U3RhdGUpID0+IHN0YWJsZVN0YXRlKHN0YWJsZSwgbmV3U3RhdGUpKSxcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgIHJlc2V0T25EaXNjb25uZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBzdGF0ZS5jb25uZWN0KCk7XG5cbiAgICBjb25zdCBlZmZlY3RzOiBDb25uZWN0YWJsZTxFZmZlY3Q+ID0gY29ubmVjdGFibGUoXG4gICAgICBjb3JlU3RhdGUucGlwZShcbiAgICAgICAgZmlsdGVyKCh7IGVmZmVjdCB9KSA9PiBlZmZlY3QgIT09IG51bGwpLFxuICAgICAgICBtYXAoKHsgZWZmZWN0IH0pID0+IGVmZmVjdCBhcyBFZmZlY3QpLFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSxcbiAgICAgICAgcmVzZXRPbkRpc2Nvbm5lY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICAgIGVmZmVjdHMuY29ubmVjdCgpO1xuXG4gICAgLy8gTG9hZCBpbml0aWFsIHRhYmxlIHJvdyBkYXRhLlxuICAgIGFjdGlvbnMubmV4dCh7IHR5cGU6ICdsb2FkJyB9KTtcblxuICAgIHJldHVybiB7IGFjdGlvbnMsIHN0YXRlLCBlZmZlY3RzIH07XG4gIH1cblxuICBmdW5jdGlvbiBkZXJpdmVGdWxsU3RhdGVGcm9tR3JvdXBSZXN1bHQ8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+KHByb3BzOiB7XG4gICAgczogQ29yZVN0YXRlPFIsIEMsIEYsIEc+O1xuICAgIHN0YXRlUmVzdWx0OiBHcm91cFJlc3VsdDxSLCBHPjtcbiAgICBzb3VyY2U6IFNvdXJjZTxSLCBDLCBGLCBHPjtcbiAgICBjb2x1bW5zOiBNYXA8QywgQ29sdW1uTWV0YWRhdGE+O1xuICAgIHBsdXJhbEVudGl0eU5hbWU6IHN0cmluZztcbiAgICBjb2x1bW5OYW1lTWFwOiBDb2x1bW5OYW1lTWFwPEM+O1xuICAgIHJlc29sdmVkQ29sdW1uczogRnVsbENvbHVtbjxDPltdO1xuICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogU2VhcmNoYWJsZUNvbHVtbk1hcDxDPjtcbiAgICBjc3ZFeHBvcnRBbGxvd2VkOiBib29sZWFuO1xuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxSLCBDLCBGLCBHPjtcbiAgfSk6IEZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3Qge1xuICAgICAgcyxcbiAgICAgIHN0YXRlUmVzdWx0LFxuICAgICAgc291cmNlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnMsXG4gICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgY3N2RXhwb3J0QWxsb3dlZCxcbiAgICAgIG9wdGlvbnMsXG4gICAgfSA9IHByb3BzO1xuICAgIGlmIChvcHRpb25zPy5nZXRSb3dTcGFuRm9yQ2VsbCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ0hlYWRzIHVwISBDdXN0b20gcm93IHNwYW5zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBncm91cGVkIHRhYmxlcy4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnM/LmN1c3RvbVN1bW1hcnlSb3cpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdIZWFkcyB1cCEgQ3VzdG9tIHN1bW1hcnkgcm93cyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgZ3JvdXBlZCB0YWJsZXMuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm93R3JvdXBzOiBSb3dHcm91cDxSLCBHPltdID0gc3RhdGVSZXN1bHQuZ3JvdXBSZXN1bHRzLm1hcChncm91cCA9PiAoe1xuICAgICAgcm93czogZ3JvdXAuY3VycmVudFBhZ2VEYXRhLm1hcChyb3cgPT4gKHtcbiAgICAgICAgLi4ucm93LFxuICAgICAgICByb3dMaW5rOiBvcHRpb25zPy5yb3dMaW5rXG4gICAgICAgICAgPyBvcHRpb25zLnJvd0xpbmsocm93LCBncm91cC5ncm91cERhdGEpXG4gICAgICAgICAgOiBudWxsLFxuICAgICAgICBzZWxlY3RlZDogVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzUm93U2VsZWN0ZWQocywgcm93LmlkKSxcbiAgICAgICAgaXNDb2xsYXBzZWQ6IGZhbHNlLFxuICAgICAgfSkpLFxuICAgICAgc2VsZWN0ZWQ6IFRhYmxlU2VsZWN0aW9uSGVscGVycy5pc0dyb3VwU2VsZWN0ZWQocywgZ3JvdXApLFxuICAgICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiBncm91cC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICAgICBncm91cERhdGE6IGdyb3VwLmdyb3VwRGF0YSxcbiAgICB9KSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiogY3N2RGF0YShtb2RlOiBDc3ZNb2RlID0gJ2Z1bGwnKTogQXN5bmNHZW5lcmF0b3I8Q3N2T3V0cHV0PiB7XG4gICAgICBjb25zdCBjZWxsRm9ybWF0dGVyID0gb3B0aW9ucz8uY3N2Q2VsbEZvcm1hdHRlcjtcbiAgICAgIGNvbnN0IGdyb3VwQ2VsbEZvcm1hdHRlciA9IG9wdGlvbnM/LmNzdkdyb3VwQ2VsbEZvcm1hdHRlcjtcbiAgICAgIGlmICghY2VsbEZvcm1hdHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLmNzdkNlbGxGb3JtYXR0ZXIgaXMgcmVxdWlyZWQgZm9yIENTViBleHBvcnQnKTtcbiAgICAgIHlpZWxkIHsgbG9hZGluZzogdHJ1ZSwgZGF0YTogbnVsbCB9O1xuICAgICAgY29uc3QgZGF0YVNldCA9IGF3YWl0IHNvdXJjZShcbiAgICAgICAge1xuICAgICAgICAgIC4uLnMucXVlcnksXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIHBhZ2VTaXplOiBzdGF0ZVJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyB0eXBlOiAnbG9hZCcgfSxcbiAgICAgICk7XG5cbiAgICAgIGlmICghVGFibGVSZXN1bHRIZWxwZXJzLmlzR3JvdXBSZXN1bHQoZGF0YVNldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXR1cm5lZCBub24tZ3JvdXBlZCBDU1YgZGF0YSBmb3IgZ3JvdXBlZCB0YWJsZScpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmdWxsQ29sdW1ucyA9IFRhYmxlQ29sdW1uSGVscGVycy5yZXNvbHZlQ29sdW1ucyhcbiAgICAgICAgcyxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgISFvcHRpb25zLmFsbG93U2VsZWN0aW9uLFxuICAgICAgICAnZW5hYmxlZCcsXG4gICAgICAgICEhb3B0aW9ucy5oYXNOZXN0ZWRIZWFkZXJzLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRhdGE6IENzdiA9IFtdO1xuICAgICAgZGF0YS5wdXNoKGZ1bGxDb2x1bW5zLm1hcCgoeyBrZXkgfSkgPT4gY29sdW1uTmFtZU1hcC5nZXQoa2V5KSA/PyBrZXkpKTtcblxuICAgICAgaWYgKGdyb3VwQ2VsbEZvcm1hdHRlcikge1xuICAgICAgICBkYXRhWzBdLnB1c2goJycpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJvd0l0ZW0gb2YgZGF0YVNldC5ncm91cFJlc3VsdHMuZmxhdE1hcChncm91cHMgPT5cbiAgICAgICAgZ3JvdXBzLmN1cnJlbnRQYWdlRGF0YS5tYXAocm93ID0+ICh7XG4gICAgICAgICAgcm93LFxuICAgICAgICAgIGdyb3VwOiBncm91cHMuZ3JvdXBEYXRhLFxuICAgICAgICB9KSksXG4gICAgICApKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IHJvd0l0ZW0ucm93O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbW9kZSA9PT0gJ3NlbGVjdGlvbicgJiZcbiAgICAgICAgICAhVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzUm93U2VsZWN0ZWQocywgcmVjb3JkLmlkKVxuICAgICAgICApXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJvdzogQ3N2Um93ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGZ1bGxDb2x1bW5zKSB7XG4gICAgICAgICAgcm93LnB1c2goYXdhaXQgY2VsbEZvcm1hdHRlcihyZWNvcmQsIGNvbHVtbikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChncm91cENlbGxGb3JtYXR0ZXIgJiYgcm93SXRlbS5ncm91cCkge1xuICAgICAgICAgIHJvdy5wdXNoKGF3YWl0IGdyb3VwQ2VsbEZvcm1hdHRlcihyZWNvcmQsIHJvd0l0ZW0uZ3JvdXApKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhLnB1c2gocm93KTtcbiAgICAgIH1cbiAgICAgIHlpZWxkIHsgbG9hZGluZzogZmFsc2UsIGRhdGEgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucyxcbiAgICAgIHF1ZXJ5OiBkZXJpdmVkRnVsbFN0YXRlUXVlcnkocyksXG4gICAgICBkaXNwbGF5OiBkZXJpdmVkRnVsbFN0YXRlRGlzcGxheSh7XG4gICAgICAgIGNvcmVTdGF0ZTogcyxcbiAgICAgICAgY29sdW1uczogY29sdW1ucyxcbiAgICAgICAgcGx1cmFsRW50aXR5TmFtZTogcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgY29sdW1uTmFtZU1hcDogY29sdW1uTmFtZU1hcCxcbiAgICAgICAgcmVzb2x2ZWRDb2x1bW5zOiByZXNvbHZlZENvbHVtbnMsXG4gICAgICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zOiByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgY3N2RXhwb3J0QWxsb3dlZDogY3N2RXhwb3J0QWxsb3dlZCxcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH0pLFxuICAgICAgc2VsZWN0aW9uOiBkZXJpdmVkRnVsbFN0YXRlU2VsZWN0aW9uKHMsIG9wdGlvbnMpLFxuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIC4uLnN0YXRlUmVzdWx0LFxuICAgICAgICBpc0dyb3VwZWQ6IHRydWUsXG4gICAgICAgIHJlc3VsdFR5cGU6ICd0YWJsZS1ncm91cGluZycsXG4gICAgICAgIHJvd0dyb3VwcyxcbiAgICAgICAgcm93czogcm93R3JvdXBzLmZsYXRNYXAoZ3JvdXAgPT4gZ3JvdXAucm93cyksXG4gICAgICAgIGNzdkRhdGEsXG4gICAgICAgIGNzdkZpbGVuYW1lOiBUYWJsZVJlc3VsdEhlbHBlcnMuZ2V0Q3N2RmlsZW5hbWUoXG4gICAgICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgICBvcHRpb25zLFxuICAgICAgICApLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVyaXZlRnVsbFN0YXRlRnJvbU5lc3RlZFJlc3VsdDxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4ocHJvcHM6IHtcbiAgICBzOiBDb3JlU3RhdGU8UiwgQywgRiwgRz47XG4gICAgc3RhdGVSZXN1bHQ6IE5lc3RlZFJlc3VsdDxSPjtcbiAgICBzb3VyY2U6IFNvdXJjZTxSLCBDLCBGLCBHPjtcbiAgICBjb2x1bW5zOiBNYXA8QywgQ29sdW1uTWV0YWRhdGE+O1xuICAgIHBsdXJhbEVudGl0eU5hbWU6IHN0cmluZztcbiAgICBjb2x1bW5OYW1lTWFwOiBDb2x1bW5OYW1lTWFwPEM+O1xuICAgIHJlc29sdmVkQ29sdW1uczogRnVsbENvbHVtbjxDPltdO1xuICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogU2VhcmNoYWJsZUNvbHVtbk1hcDxDPjtcbiAgICBjc3ZFeHBvcnRBbGxvd2VkOiBib29sZWFuO1xuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxSLCBDLCBGLCBHPjtcbiAgfSk6IEZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3Qge1xuICAgICAgcyxcbiAgICAgIHN0YXRlUmVzdWx0LFxuICAgICAgc291cmNlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnMsXG4gICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgY3N2RXhwb3J0QWxsb3dlZCxcbiAgICAgIG9wdGlvbnMsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgaWYgKG9wdGlvbnM/LmdldFJvd1NwYW5Gb3JDZWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnSGVhZHMgdXAhIEN1c3RvbSByb3cgc3BhbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHRhYmxlcyB3aXRoIG5lc3RlZCBkYXRhLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvdykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ0hlYWRzIHVwISBDdXN0b20gc3VtbWFyeSByb3dzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0YWJsZXMgd2l0aCBuZXN0ZWQgZGF0YS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBmdWxsTmVzdGVkSGVhZGVyUm93czogRnVsbE5lc3RlZEhlYWRlclJvdzxSPltdID0gW107XG4gICAgZm9yIChjb25zdCBuZXN0ZWRSb3cgb2Ygc3RhdGVSZXN1bHQuY3VycmVudFBhZ2VOZXN0ZWRIZWFkZXJzKSB7XG4gICAgICBjb25zdCBuZXdGdWxsUm93OiBGdWxsTmVzdGVkSGVhZGVyUm93PFI+ID1cbiAgICAgICAgVGFibGVOZXN0aW5nSGVscGVycy5jb252ZXJ0VG9GdWxsTmVzdGVkSGVhZGVyUm93KFxuICAgICAgICAgIG5lc3RlZFJvdyxcbiAgICAgICAgICBzLFxuICAgICAgICAgIG9wdGlvbnM/LnJvd0xpbmssXG4gICAgICAgICk7XG4gICAgICBmdWxsTmVzdGVkSGVhZGVyUm93cy5wdXNoKG5ld0Z1bGxSb3cpO1xuICAgIH1cblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBjc3ZEYXRhKG1vZGUgPSAnZnVsbCcpOiBBc3luY0dlbmVyYXRvcjxDc3ZPdXRwdXQ+IHtcbiAgICAgIGlmICghY3N2RXhwb3J0QWxsb3dlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0NTViBleHBvcnQgaXMgbm90IHN1cHBvcnRlZCB3aGVuIHJvdyBzcGFubmluZyBvciBhIGN1c3RvbSBzdW1tYXJ5IHJvdyBpcyBlbmFibGVkLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNlbGxGb3JtYXR0ZXIgPSBvcHRpb25zPy5jc3ZDZWxsRm9ybWF0dGVyO1xuICAgICAgaWYgKCFjZWxsRm9ybWF0dGVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5jc3ZDZWxsRm9ybWF0dGVyIGlzIHJlcXVpcmVkIGZvciBDU1YgZXhwb3J0Jyk7XG4gICAgICB9XG4gICAgICB5aWVsZCB7IGxvYWRpbmc6IHRydWUsIGRhdGE6IG51bGwgfTtcbiAgICAgIGNvbnN0IGRhdGFTZXQgPSBhd2FpdCBzb3VyY2UoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICBwYWdlU2l6ZTogc3RhdGVSZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgdHlwZTogJ2xvYWQnIH0sXG4gICAgICApO1xuXG4gICAgICBpZiAoVGFibGVSZXN1bHRIZWxwZXJzLmlzUmVndWxhclJlc3VsdChkYXRhU2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1JldHVybmVkIG5vbi1uZXN0ZWQgQ1NWIGRhdGEgZm9yIGEgbmVzdGVkIHdpdGggaGVhZGVyIHJlc3VsdCB0YWJsZScsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoVGFibGVSZXN1bHRIZWxwZXJzLmlzR3JvdXBSZXN1bHQoZGF0YVNldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdSZXR1cm5lZCBncm91cGVkIENTViBkYXRhIGZvciBhIG5lc3RlZCB3aXRoIGhlYWRlciByZXN1bHQgdGFibGUnLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmdWxsQ29sdW1ucyA9IFRhYmxlQ29sdW1uSGVscGVycy5yZXNvbHZlQ29sdW1ucyhcbiAgICAgICAgcyxcbiAgICAgICAgY29sdW1ucyxcbiAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgISFvcHRpb25zLmFsbG93U2VsZWN0aW9uLFxuICAgICAgICAnZW5hYmxlZCcsXG4gICAgICAgICEhb3B0aW9ucy5oYXNOZXN0ZWRIZWFkZXJzLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRhdGE6IENzdiA9IFtdO1xuICAgICAgZGF0YS5wdXNoKGZ1bGxDb2x1bW5zLm1hcCgoeyBrZXkgfSkgPT4gY29sdW1uTmFtZU1hcC5nZXQoa2V5KSA/PyBrZXkpKTtcblxuICAgICAgY29uc3QgYWxsUm93czogUltdID0gVGFibGVSZXN1bHRIZWxwZXJzLmdldEFsbFJvd3NGcm9tUmVzdWx0KGRhdGFTZXQpO1xuXG4gICAgICBmb3IgKGNvbnN0IGN1cnJlbnRSb3cgb2YgYWxsUm93cykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbW9kZSA9PT0gJ3NlbGVjdGlvbicgJiZcbiAgICAgICAgICAhVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzUm93U2VsZWN0ZWQocywgY3VycmVudFJvdy5pZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm93OiBDc3ZSb3cgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZnVsbENvbHVtbnMpIHtcbiAgICAgICAgICByb3cucHVzaChhd2FpdCBjZWxsRm9ybWF0dGVyKGN1cnJlbnRSb3csIGNvbHVtbikpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEucHVzaChyb3cpO1xuICAgICAgfVxuICAgICAgeWllbGQgeyBsb2FkaW5nOiBmYWxzZSwgZGF0YSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zLFxuICAgICAgcXVlcnk6IGRlcml2ZWRGdWxsU3RhdGVRdWVyeShzKSxcbiAgICAgIGRpc3BsYXk6IGRlcml2ZWRGdWxsU3RhdGVEaXNwbGF5KHtcbiAgICAgICAgY29yZVN0YXRlOiBzLFxuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICBwbHVyYWxFbnRpdHlOYW1lOiBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgICBjb2x1bW5OYW1lTWFwOiBjb2x1bW5OYW1lTWFwLFxuICAgICAgICByZXNvbHZlZENvbHVtbnM6IHJlc29sdmVkQ29sdW1ucyxcbiAgICAgICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnM6IHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zLFxuICAgICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkOiBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgfSksXG4gICAgICBzZWxlY3Rpb246IGRlcml2ZWRGdWxsU3RhdGVTZWxlY3Rpb24ocywgb3B0aW9ucyksXG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgLi4uc3RhdGVSZXN1bHQsXG4gICAgICAgIHJvd3M6IFtdLFxuICAgICAgICBpc0dyb3VwZWQ6IGZhbHNlLFxuICAgICAgICByZXN1bHRUeXBlOiAnbmVzdGVkLXJvd3MnLFxuICAgICAgICBuZXN0ZWRIZWFkZXJSb3dzOiBmdWxsTmVzdGVkSGVhZGVyUm93cyxcbiAgICAgICAgY3N2RGF0YSxcbiAgICAgICAgY3N2RmlsZW5hbWU6IFRhYmxlUmVzdWx0SGVscGVycy5nZXRDc3ZGaWxlbmFtZShcbiAgICAgICAgICBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBkZXJpdmVGdWxsU3RhdGVGcm9tUmVndWxhclJlc3VsdDxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4ocHJvcHM6IHtcbiAgICBzOiBDb3JlU3RhdGU8UiwgQywgRiwgRz47XG4gICAgc3RhdGVSZXN1bHQ6IFJlc3VsdDxSPjtcbiAgICBzb3VyY2U6IFNvdXJjZTxSLCBDLCBGLCBHPjtcbiAgICBjb2x1bW5zOiBNYXA8QywgQ29sdW1uTWV0YWRhdGE+O1xuICAgIHBsdXJhbEVudGl0eU5hbWU6IHN0cmluZztcbiAgICBjb2x1bW5OYW1lTWFwOiBDb2x1bW5OYW1lTWFwPEM+O1xuICAgIHJlc29sdmVkQ29sdW1uczogRnVsbENvbHVtbjxDPltdO1xuICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogU2VhcmNoYWJsZUNvbHVtbk1hcDxDPjtcbiAgICBjc3ZFeHBvcnRBbGxvd2VkOiBib29sZWFuO1xuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxSLCBDLCBGLCBHPjtcbiAgfSk6IEZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gICAgY29uc3Qge1xuICAgICAgcyxcbiAgICAgIHN0YXRlUmVzdWx0LFxuICAgICAgc291cmNlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnMsXG4gICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgY3N2RXhwb3J0QWxsb3dlZCxcbiAgICAgIG9wdGlvbnMsXG4gICAgfSA9IHByb3BzO1xuICAgIGNvbnN0IHJvd3MgPSBzdGF0ZVJlc3VsdC5jdXJyZW50UGFnZURhdGEubWFwKHJvdyA9PiAoe1xuICAgICAgLi4ucm93LFxuICAgICAgcm93TGluazogb3B0aW9ucz8ucm93TGluayA/IG9wdGlvbnMucm93TGluayhyb3cpIDogbnVsbCxcbiAgICAgIHNlbGVjdGVkOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNSb3dTZWxlY3RlZChzLCByb3cuaWQpLFxuICAgICAgaXNDb2xsYXBzZWQ6IGZhbHNlLFxuICAgIH0pKTtcblxuICAgIGNvbnN0IGNlbGxSb3dTcGFuQ2FjaGUgPSBUYWJsZURpc3BsYXlIZWxwZXJzLm1lbW9pemVkQ2VsbFJvd1NwYW4oXG4gICAgICBzLFxuICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIGNvbnN0IGNlbGxSb3dTcGFuOiBWYWxpZFJvd1NwYW5HZXR0ZXI8Qz4gPSAocm93SW5kZXgsIGNvbHVtbikgPT5cbiAgICAgIGNlbGxSb3dTcGFuQ2FjaGU/LmdldChjb2x1bW4pPy5bcm93SW5kZXhdID8/IDE7XG4gICAgY29uc3QgaGFzQW55Um93U3BhbnMgPSBjZWxsUm93U3BhbkNhY2hlXG4gICAgICA/IFsuLi5jZWxsUm93U3BhbkNhY2hlLnZhbHVlcygpXS5zb21lKHNwYW5zID0+XG4gICAgICAgICAgc3BhbnMuc29tZShzcGFuID0+IHNwYW4gPiAxKSxcbiAgICAgICAgKVxuICAgICAgOiBmYWxzZTtcblxuICAgIGNvbnN0IHJlc29sdmVkQ29sdW1uS2V5cyA9IHJlc29sdmVkQ29sdW1ucy5tYXAoKHsga2V5IH0pID0+IGtleSk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiogY3N2RGF0YShtb2RlID0gJ2Z1bGwnKTogQXN5bmNHZW5lcmF0b3I8Q3N2T3V0cHV0PiB7XG4gICAgICBpZiAoIWNzdkV4cG9ydEFsbG93ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdDU1YgZXhwb3J0IGlzIG5vdCBzdXBwb3J0ZWQgd2hlbiByb3cgc3Bhbm5pbmcgb3IgYSBjdXN0b20gc3VtbWFyeSByb3cgaXMgZW5hYmxlZC4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjZWxsRm9ybWF0dGVyID0gb3B0aW9ucz8uY3N2Q2VsbEZvcm1hdHRlcjtcbiAgICAgIGlmICghY2VsbEZvcm1hdHRlcilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLmNzdkNlbGxGb3JtYXR0ZXIgaXMgcmVxdWlyZWQgZm9yIENTViBleHBvcnQnKTtcbiAgICAgIHlpZWxkIHsgbG9hZGluZzogdHJ1ZSwgZGF0YTogbnVsbCB9O1xuICAgICAgY29uc3QgZGF0YVNldCA9IGF3YWl0IHNvdXJjZShcbiAgICAgICAge1xuICAgICAgICAgIC4uLnMucXVlcnksXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIHBhZ2VTaXplOiBzdGF0ZVJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyB0eXBlOiAnbG9hZCcgfSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChUYWJsZVJlc3VsdEhlbHBlcnMuaXNHcm91cFJlc3VsdChkYXRhU2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JldHVybmVkIGdyb3VwZWQgQ1NWIGRhdGEgZm9yIG5vbi1ncm91cGVkIHRhYmxlJyk7XG4gICAgICB9XG4gICAgICBpZiAoVGFibGVSZXN1bHRIZWxwZXJzLmlzTmVzdGVkUmVzdWx0KGRhdGFTZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmV0dXJuZWQgbmVzdGVkIENTViBkYXRhIGZvciBub24tbmVzdGVkIHRhYmxlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZ1bGxDb2x1bW5zID0gVGFibGVDb2x1bW5IZWxwZXJzLnJlc29sdmVDb2x1bW5zKFxuICAgICAgICBzLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAhIW9wdGlvbnMuYWxsb3dTZWxlY3Rpb24sXG4gICAgICAgICdlbmFibGVkJyxcbiAgICAgICAgISFvcHRpb25zLmhhc05lc3RlZEhlYWRlcnMsXG4gICAgICApO1xuICAgICAgY29uc3QgZGF0YTogQ3N2ID0gW107XG4gICAgICBkYXRhLnB1c2goZnVsbENvbHVtbnMubWFwKCh7IGtleSB9KSA9PiBjb2x1bW5OYW1lTWFwLmdldChrZXkpID8/IGtleSkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBkYXRhU2V0LmN1cnJlbnRQYWdlRGF0YSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgbW9kZSA9PT0gJ3NlbGVjdGlvbicgJiZcbiAgICAgICAgICAhVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzUm93U2VsZWN0ZWQocywgcmVjb3JkLmlkKVxuICAgICAgICApXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJvdzogQ3N2Um93ID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGZ1bGxDb2x1bW5zKSB7XG4gICAgICAgICAgcm93LnB1c2goYXdhaXQgY2VsbEZvcm1hdHRlcihyZWNvcmQsIGNvbHVtbikpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEucHVzaChyb3cpO1xuICAgICAgfVxuICAgICAgeWllbGQgeyBsb2FkaW5nOiBmYWxzZSwgZGF0YSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zLFxuICAgICAgcXVlcnk6IGRlcml2ZWRGdWxsU3RhdGVRdWVyeShzLCB7XG4gICAgICAgIG9yZGVyOiBoYXNBbnlSb3dTcGFucyA/IG51bGwgOiBzLnF1ZXJ5Lm9yZGVyLFxuICAgICAgfSksXG4gICAgICBkaXNwbGF5OiBkZXJpdmVkRnVsbFN0YXRlRGlzcGxheShcbiAgICAgICAge1xuICAgICAgICAgIGNvcmVTdGF0ZTogcyxcbiAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICAgIHBsdXJhbEVudGl0eU5hbWU6IHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcDogY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICByZXNvbHZlZENvbHVtbnM6IHJlc29sdmVkQ29sdW1ucyxcbiAgICAgICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1uczogcmVzb2x2ZWREaXNhYmxlZENvbHVtbnMsXG4gICAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkOiBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjb2x1bW5zOiByZXNvbHZlZENvbHVtbnMubWFwKGNvbHVtbiA9PlxuICAgICAgICAgICAgaGFzQW55Um93U3BhbnMgPyB7IC4uLmNvbHVtbiwgb3JkZXJhYmxlOiBmYWxzZSB9IDogY29sdW1uLFxuICAgICAgICAgICksXG4gICAgICAgICAgY2VsbFJvd1NwYW46IGNlbGxSb3dTcGFuLFxuICAgICAgICAgIG5lZWRzUmlnaHRCb3JkZXI6IChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW46IEMpOiBib29sZWFuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGkgPSByZXNvbHZlZENvbHVtbktleXMuZmluZEluZGV4KGtleSA9PiBrZXkgPT09IGNvbHVtbik7XG4gICAgICAgICAgICBpZiAoaSA8IDAgfHwgaSA9PT0gcmVzb2x2ZWRDb2x1bW5LZXlzLmxlbmd0aCAtIDEpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcmlnaHRDb2xLZXkgPSByZXNvbHZlZENvbHVtbktleXNbaSArIDFdO1xuICAgICAgICAgICAgY29uc3Qgc3Bhbk9uUmlnaHQgPSBjZWxsUm93U3Bhbihyb3dJbmRleCwgcmlnaHRDb2xLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIHNwYW5PblJpZ2h0ID4gMSB8fCBzcGFuT25SaWdodCA9PT0gMDtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgKSxcbiAgICAgIHNlbGVjdGlvbjogZGVyaXZlZEZ1bGxTdGF0ZVNlbGVjdGlvbihzLCBvcHRpb25zKSxcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICAuLi5zdGF0ZVJlc3VsdCxcbiAgICAgICAgaXNHcm91cGVkOiBmYWxzZSxcbiAgICAgICAgcmVzdWx0VHlwZTogJ25vcm1hbC1yb3dzJyxcbiAgICAgICAgcm93cyxcbiAgICAgICAgcm93c0FzR3JvdXA6IHtcbiAgICAgICAgICByb3dzLFxuICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IHJvd3MubGVuZ3RoLFxuICAgICAgICAgIGdyb3VwRGF0YTogeyBrZXk6ICcnIH0gYXMgRyxcbiAgICAgICAgfSxcbiAgICAgICAgY3N2RmlsZW5hbWU6IFRhYmxlUmVzdWx0SGVscGVycy5nZXRDc3ZGaWxlbmFtZShcbiAgICAgICAgICBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICksXG4gICAgICAgIGNzdkRhdGEsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBkZXJpdmVkRnVsbFN0YXRlUXVlcnk8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+KFxuICAgIGNvcmVTdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIHBhcnRpYWxRdWVyeTogUGFydGlhbDxGdWxsU3RhdGU8UiwgQywgRiwgRz5bJ3F1ZXJ5J10+ID0ge30sXG4gICk6IEZ1bGxTdGF0ZTxSLCBDLCBGLCBHPlsncXVlcnknXSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvcmVTdGF0ZS5xdWVyeSxcbiAgICAgIHBhZ2luYXRpb246IGRlcml2ZWRGdWxsU3RhdGVQYWdpbmF0aW9uKGNvcmVTdGF0ZSksXG4gICAgICBub1NlYXJjaENvbHVtbnNTZWxlY3RlZDogVGFibGVTZWFyY2hIZWxwZXJzLmdldFNlYXJjaENvbHVtbnNTZWxlY3RlZFN0YXRlKFxuICAgICAgICBjb3JlU3RhdGUsXG4gICAgICAgICdub25lJyxcbiAgICAgICksXG4gICAgICAuLi5wYXJ0aWFsUXVlcnksXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlcml2ZWRGdWxsU3RhdGVQYWdpbmF0aW9uPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPihcbiAgICBjb3JlU3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgKTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+WydxdWVyeSddWydwYWdpbmF0aW9uJ10ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5jb3JlU3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgIHByZXZpb3VzOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFByZXZpb3VzUGFnZShjb3JlU3RhdGUpLFxuICAgICAgcGFnZXM6IFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0UGFnZXMoY29yZVN0YXRlKSxcbiAgICAgIG5leHQ6IFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0TmV4dFBhZ2UoY29yZVN0YXRlKSxcbiAgICAgIHBhZ2VDb3VudDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQYWdlQ291bnQoY29yZVN0YXRlKSxcbiAgICAgIHNob3dDb250cm9sczogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRTaG93UGFnaW5hdGlvbkNvbnRyb2xzKGNvcmVTdGF0ZSksXG4gICAgICBwYWdlUm93U3RhcnQ6IFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0UGFnZVJvd1N0YXJ0KGNvcmVTdGF0ZSksXG4gICAgICBwYWdlUm93RW5kOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFBhZ2VSb3dFbmQoY29yZVN0YXRlKSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVyaXZlZEZ1bGxTdGF0ZURpc3BsYXk8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+KFxuICAgIHByb3BzOiB7XG4gICAgICBjb3JlU3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICAgIGNvbHVtbnM6IE1hcDxDLCBDb2x1bW5NZXRhZGF0YT47XG4gICAgICBwbHVyYWxFbnRpdHlOYW1lOiBzdHJpbmc7XG4gICAgICBjb2x1bW5OYW1lTWFwOiBDb2x1bW5OYW1lTWFwPEM+O1xuICAgICAgcmVzb2x2ZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1uczogRnVsbENvbHVtbjxDPltdO1xuICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogU2VhcmNoYWJsZUNvbHVtbk1hcDxDPjtcbiAgICAgIGNzdkV4cG9ydEFsbG93ZWQ6IGJvb2xlYW47XG4gICAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8UiwgQywgRiwgRz47XG4gICAgfSxcbiAgICBwYXJ0aWFsRGlzcGxheTogUGFydGlhbDxGdWxsU3RhdGU8UiwgQywgRiwgRz5bJ2Rpc3BsYXknXT4gPSB7fSxcbiAgKTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+WydkaXNwbGF5J10ge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvcmVTdGF0ZSxcbiAgICAgIGNvbHVtbnMsXG4gICAgICBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgIHJlc29sdmVkQ29sdW1ucyxcbiAgICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zLFxuICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgIGNzdkV4cG9ydEFsbG93ZWQsXG4gICAgICBvcHRpb25zLFxuICAgIH0gPSBwcm9wcztcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb3JlU3RhdGUuZGlzcGxheSxcbiAgICAgIGNvbHVtbnM6IHJlc29sdmVkQ29sdW1ucyxcbiAgICAgIGRpc2FibGVkQ29sdW1uczogcmVzb2x2ZWREaXNhYmxlZENvbHVtbnMsXG4gICAgICBhbGxDb2x1bW5zOiBUYWJsZUNvbHVtbkhlbHBlcnMuZ2V0QWxsQ29sdW1ucyhcbiAgICAgICAgY29yZVN0YXRlLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgKSxcbiAgICAgIGNvbHVtbk5hbWVNYXA6IGNvbHVtbk5hbWVNYXAsXG4gICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgemVyb1N0YXRlTWVzc2FnZTogVGFibGVEaXNwbGF5SGVscGVycy5nZXRaZXJvU3RhdGVNZXNzYWdlKFxuICAgICAgICBjb3JlU3RhdGUsXG4gICAgICAgIHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICApLFxuICAgICAgY29sdW1uc0FyZUZyZWV6YWJsZTogISFvcHRpb25zPy5jb2x1bW5zQXJlRnJlZXphYmxlLFxuICAgICAgY29sdW1uc0FyZUhpZGVhYmxlOiAhIW9wdGlvbnM/LmNvbHVtbnNBcmVIaWRlYWJsZSxcbiAgICAgIGNvbHVtbnNBcmVSZW9yZGVyYWJsZTogb3B0aW9ucz8uY29sdW1uc0FyZVJlb3JkZXJhYmxlID8/IHRydWUsXG4gICAgICByb3dzQXJlR3JheWVkOiAhIW9wdGlvbnM/LnJvd3NBcmVHcmF5ZWQsXG4gICAgICBjdXN0b21TdW1tYXJ5Um93OiAhIW9wdGlvbnM/LmN1c3RvbVN1bW1hcnlSb3csXG4gICAgICBjc3ZFeHBvcnRBbGxvd2VkOiBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgZW5hYmxlZENvdW50OiByZXNvbHZlZENvbHVtbnMubGVuZ3RoLFxuICAgICAgaGlkZVBhZ2VTaXplU2VsZWN0b3I6ICEhb3B0aW9ucz8uaGlkZVBhZ2VTaXplU2VsZWN0b3IsXG4gICAgICBjZWxsUm93U3BhbjogKF9pOiBudW1iZXIsIF9jb2x1bW46IEMpID0+IDEsXG4gICAgICBuZWVkc1JpZ2h0Qm9yZGVyOiAoKSA9PiBmYWxzZSxcbiAgICAgIHVuYXZhaWxhYmxlQ29sdW1uS2V5czogb3B0aW9ucz8udW5hdmFpbGFibGVDb2x1bW5LZXlzID8/IFtdLFxuICAgICAgdW5hdmFpbGFibGVGb2xkZXJUaXRsZTogb3B0aW9ucz8udW5hdmFpbGFibGVGb2xkZXJUaXRsZSA/PyAnVW5hdmFpbGFibGUnLFxuICAgICAgLi4ucGFydGlhbERpc3BsYXksXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlcml2ZWRGdWxsU3RhdGVTZWxlY3Rpb248XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+KFxuICAgIGNvcmVTdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxSLCBDLCBGLCBHPixcbiAgKTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+WydzZWxlY3Rpb24nXSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvcmVTdGF0ZS5zZWxlY3Rpb24sXG4gICAgICBhbGxvd1NlbGVjdGlvbjogb3B0aW9ucz8uYWxsb3dTZWxlY3Rpb24gPz8gZmFsc2UsXG4gICAgICBpc0FsbFNlbGVjdGVkOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNBbGxTZWxlY3RlZChjb3JlU3RhdGUpLFxuICAgICAgaXNDdXJyZW50UGFnZVNlbGVjdGVkOlxuICAgICAgICBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNDdXJyZW50UGFnZVNlbGVjdGVkKGNvcmVTdGF0ZSksXG4gICAgICBzZWxlY3RlZENvdW50OiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuc2VsZWN0ZWRDb3VudChjb3JlU3RhdGUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU29tZSB0YWJsZXMgdXNlIHJlbW90ZSBiYWNrZW5kcyB0byBmZXRjaCBkYXRhIGFzeW5jaHJvbm91c2x5LCBidXQgbW9zdCB0YWJsZXMgdXNlIGFuXG4gICAqIGluLW1lbW9yeSBzb3VyY2UsIHdoaWNoIGlzIHVzZWZ1bCBmb3Igc21hbGwgZGF0YXNldHMsIHdoZW4gUml2VGFibGUgZmVhdHVyZXMgbGlrZVxuICAgKiBvcmRlcmluZyBhbmQgcGFnaW5hdGlvbiBhcmUgZGVzaXJlZC5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgSW5NZW1vcnlDb2x1bW5NZXRhZGF0YTxSIGV4dGVuZHMgUm93PiA9IE9taXQ8XG4gICAgQ29sdW1uTWV0YWRhdGEsXG4gICAgJ29yZGVyYWJsZSdcbiAgPiAmIHsgb3JkZXJLZXk/OiBrZXlvZiBSIH07XG5cbiAgZXhwb3J0IHR5cGUgSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4gPSBNYW5hZ2VyT3B0aW9uczxSLCBDLCBGLCBHPiAmIHtcbiAgICBmdXNlT3B0aW9ucz86IElGdXNlT3B0aW9uczxSPjtcbiAgICBmaWx0ZXI/OiAoZmlsdGVyczogRiB8IG51bGwsIHJvdzogUikgPT4gYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGBxdWVyeS5vcmRlcmAgaXMgbnVsbCBhbmQgdGhlcmUgaXMgbm8gYWN0aXZlIHNlYXJjaCwgcm93cyBhcmUgb3JkZXJlZFxuICAgICAqIGJ5IHRoaXMgY29sdW1uLiBJZiBvbWl0dGVkLCB0aGUgZmlyc3QgY29sdW1uIHdpdGggYW4gYG9yZGVyS2V5YCBpcyB1c2VkXG4gICAgICogKGFzY2VuZGluZykuXG4gICAgICovXG4gICAgZGVmYXVsdFNvcnQ/OiB7IGNvbHVtbjogQzsgZGlyZWN0aW9uOiBPcmRlckRpcmVjdGlvbiB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBXaGF0IGEgbmVzdGVkIHRhYmxlJ3MgcGFnZSBzaXplIGFuZCB0b3RhbCBjb3VudCBjb3VudDogZXZlcnkgYm90dG9tLWxldmVsXG4gICAqIHJvdywgd2hpY2ggY2FuIHNwbGl0IGEgcm93J3Mgc3Vicm93cyBhY3Jvc3MgcGFnZXMsIG9yIGVhY2ggdG9wLWxldmVsIHJvd1xuICAgKiB0b2dldGhlciB3aXRoIGFsbCBvZiBpdHMgc3Vicm93cy5cbiAgICovXG4gIGV4cG9ydCBjb25zdCBOZXN0ZWRQYWdpbmF0ZUJ5T3B0aW9ucyA9IFsnYm90dG9tUm93cycsICd0b3BSb3dzJ10gYXMgY29uc3Q7XG4gIGV4cG9ydCB0eXBlIE5lc3RlZFBhZ2luYXRlQnkgPSAodHlwZW9mIE5lc3RlZFBhZ2luYXRlQnlPcHRpb25zKVtudW1iZXJdO1xuXG4gIGV4cG9ydCB0eXBlIEluTWVtb3J5TmVzdGVkTWFuYWdlck9wdGlvbnM8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICA+ID0gSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxSLCBDLCBGPiAmIHtcbiAgICAvKiogRGVmYXVsdHMgdG8gJ2JvdHRvbVJvd3MnLiAqL1xuICAgIHBhZ2luYXRlQnk/OiBOZXN0ZWRQYWdpbmF0ZUJ5O1xuICB9O1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbk1lbW9yeU1hbmFnZXI8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICA+KFxuICAgIGZldGNoRGF0YXNldDogKCkgPT4gUHJvbWlzZTxSW10+IHwgUltdLFxuICAgIGNvbHVtbnM6IE1hcDxDLCBJbk1lbW9yeUNvbHVtbk1ldGFkYXRhPFI+PixcbiAgICBwbHVyYWxFbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEluTWVtb3J5TWFuYWdlck9wdGlvbnM8UiwgQywgRj4sXG4gICk6IE1hbmFnZXI8UiwgQywgRj4ge1xuICAgIGNvbHVtbnMgPSBUYWJsZVNlYXJjaEhlbHBlcnMubWFya0NvbHVtbnNPdXRzaWRlRnVzZUtleXNVbnNlYXJjaGFibGUoXG4gICAgICBjb2x1bW5zLFxuICAgICAgb3B0aW9ucz8uZnVzZU9wdGlvbnMsXG4gICAgKTtcbiAgICBsZXQgZGF0YTogUltdO1xuICAgIGxldCBmdXNlOiBGdXNlPFI+O1xuXG4gICAgY29uc3Qgc291cmNlOiBTb3VyY2U8UiwgQywgRj4gPSBhc3luYyAocXVlcnksIG1vc3RSZWNlbnRBY3Rpb24pID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnbG9hZCcgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnc2VhcmNoQ29sdW1uc0NoYW5nZScgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAndG9nZ2xlQWxsU2VhcmNoQ29sdW1ucydcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhc2V0KCk7XG4gICAgICAgIGZ1c2UgPSBuZXcgRnVzZShcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIFRhYmxlU2VhcmNoSGVscGVycy5mdXNlT3B0aW9uc0ZvclNlYXJjaENvbHVtbnMoXG4gICAgICAgICAgICBvcHRpb25zPy5mdXNlT3B0aW9ucyxcbiAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3JkZXJDb2x1bW46IGtleW9mIFIgfCB1bmRlZmluZWQgPSBxdWVyeS5vcmRlclxuICAgICAgICA/IGNvbHVtbnMuZ2V0KHF1ZXJ5Lm9yZGVyLmNvbHVtbik/Lm9yZGVyS2V5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzRXhwbGljaXRTb3J0ID0gcXVlcnkub3JkZXIgIT0gbnVsbCAmJiBvcmRlckNvbHVtbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZGVmYXVsdFNvcnRTcGVjID0gKCgpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gY29sdW1ucy5nZXQob3B0aW9ucy5kZWZhdWx0U29ydC5jb2x1bW4pPy5vcmRlcktleTtcbiAgICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGtleSwgZGlyZWN0aW9uOiBvcHRpb25zLmRlZmF1bHRTb3J0LmRpcmVjdGlvbiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdE9yZGVyYWJsZSA9IFsuLi5jb2x1bW5zLmVudHJpZXMoKV0uZmluZChcbiAgICAgICAgICAoWywgbWV0YV0pID0+IG1ldGEub3JkZXJLZXkgIT0gbnVsbCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZmlyc3RPcmRlcmFibGU/LlsxXS5vcmRlcktleTtcbiAgICAgICAgcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8geyBrZXksIGRpcmVjdGlvbjogJ2FzYycgYXMgY29uc3QgfSA6IG51bGw7XG4gICAgICB9KSgpO1xuXG4gICAgICBsZXQgb3JkZXJlZDogUltdO1xuICAgICAgaWYgKHF1ZXJ5LnNlYXJjaCkge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gZnVzZS5zZWFyY2gocXVlcnkuc2VhcmNoKS5tYXAocmVzdWx0ID0+IHJlc3VsdC5pdGVtKTtcbiAgICAgICAgb3JkZXJlZCA9XG4gICAgICAgICAgaGFzRXhwbGljaXRTb3J0ICYmIHF1ZXJ5Lm9yZGVyXG4gICAgICAgICAgICA/IFRhYmxlT3JkZXJIZWxwZXJzLm9yZGVyRW1wdHlMYXN0KFxuICAgICAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICAgICAgb3JkZXJDb2x1bW4sXG4gICAgICAgICAgICAgICAgcXVlcnkub3JkZXIuZGlyZWN0aW9uLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IG1hdGNoZXM7XG4gICAgICB9IGVsc2UgaWYgKGhhc0V4cGxpY2l0U29ydCAmJiBxdWVyeS5vcmRlcikge1xuICAgICAgICBvcmRlcmVkID0gVGFibGVPcmRlckhlbHBlcnMub3JkZXJFbXB0eUxhc3QoXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBvcmRlckNvbHVtbixcbiAgICAgICAgICBxdWVyeS5vcmRlci5kaXJlY3Rpb24sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHF1ZXJ5Lm9yZGVyID09IG51bGwgJiYgZGVmYXVsdFNvcnRTcGVjKSB7XG4gICAgICAgIG9yZGVyZWQgPSBUYWJsZU9yZGVySGVscGVycy5vcmRlckVtcHR5TGFzdChcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGRlZmF1bHRTb3J0U3BlYy5rZXksXG4gICAgICAgICAgZGVmYXVsdFNvcnRTcGVjLmRpcmVjdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yZGVyZWQgPSBkYXRhO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0gb3B0aW9ucz8uZmlsdGVyO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBmaWx0ZXJcbiAgICAgICAgPyBvcmRlcmVkLmZpbHRlcihyb3cgPT4gZmlsdGVyKHF1ZXJ5LmZpbHRlcnMsIHJvdykpXG4gICAgICAgIDogb3JkZXJlZDtcbiAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gcXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZSAqIHF1ZXJ5LnBhZ2luYXRpb24ucGFnZTtcbiAgICAgIGNvbnN0IGVuZElkeCA9IHN0YXJ0SWR4ICsgcXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZTtcbiAgICAgIGNvbnN0IHBhZ2luYXRlZCA9IGZpbHRlcmVkLnNsaWNlKHN0YXJ0SWR4LCBlbmRJZHgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudFBhZ2VEYXRhOiBwYWdpbmF0ZWQsXG4gICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogZmlsdGVyZWQubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgY29sdW1uTWV0YWRhdGE6IE1hcDxDLCBDb2x1bW5NZXRhZGF0YT4gPVxuICAgICAgVGFibGVDb2x1bW5IZWxwZXJzLmNvbnZlcnRJbk1lbW9yeUNvbHVtbk1ldGFkYXRhTWFwKGNvbHVtbnMpO1xuXG4gICAgLypcbiAgICAgIFdoZW4gYSBkZWZhdWx0U29ydCBpcyBzcGVjaWZpZWQsIHNlZWQgdGhlIGluaXRpYWwgcXVlcnkub3JkZXIgc28gdGhlXG4gICAgICB0YWJsZSBoZWFkZXIgc2hvd3MgdGhlIHNvcnQgaW5kaWNhdG9yIGZyb20gdGhlIHN0YXJ0LlxuICAgICovXG4gICAgb3B0aW9ucyA9IFRhYmxlT3JkZXJIZWxwZXJzLnNlZWREZWZhdWx0U29ydE9wdGlvbihvcHRpb25zKTtcblxuICAgIHJldHVybiBjcmVhdGVNYW5hZ2VyKHNvdXJjZSwgY29sdW1uTWV0YWRhdGEsIHBsdXJhbEVudGl0eU5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluTWVtb3J5TWFuYWdlck5lc3RlZDxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gID4oXG4gICAgZmV0Y2hEYXRhc2V0OiAoKSA9PiBQcm9taXNlPE5lc3RlZEhlYWRlclJvdzxSPltdPiB8IE5lc3RlZEhlYWRlclJvdzxSPltdLFxuICAgIGNvbHVtbnM6IE1hcDxDLCBJbk1lbW9yeUNvbHVtbk1ldGFkYXRhPFI+PixcbiAgICBwbHVyYWxFbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEluTWVtb3J5TmVzdGVkTWFuYWdlck9wdGlvbnM8UiwgQywgRj4sXG4gICk6IE1hbmFnZXI8UiwgQywgRj4ge1xuICAgIGNvbHVtbnMgPSBUYWJsZVNlYXJjaEhlbHBlcnMubWFya0NvbHVtbnNPdXRzaWRlRnVzZUtleXNVbnNlYXJjaGFibGUoXG4gICAgICBjb2x1bW5zLFxuICAgICAgb3B0aW9ucz8uZnVzZU9wdGlvbnMsXG4gICAgKTtcbiAgICBsZXQgZGF0YTogTmVzdGVkSGVhZGVyUm93PFI+W107XG4gICAgbGV0IHJvd3NGcm9tRGF0YTogUltdO1xuICAgIC8vIFRoZSBmdXNlIHdpbGwgc2VhcmNoIHRoZSBpbmRpdmlkdWFsIHJvd3NcbiAgICBsZXQgZnVzZTogRnVzZTxSPjtcblxuICAgIGNvbnN0IHNvdXJjZTogU291cmNlPFIsIEMsIEY+ID0gYXN5bmMgKHF1ZXJ5LCBtb3N0UmVjZW50QWN0aW9uKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ2xvYWQnIHx8XG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ3NlYXJjaENvbHVtbnNDaGFuZ2UnIHx8XG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ3RvZ2dsZUFsbFNlYXJjaENvbHVtbnMnXG4gICAgICApIHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IGZldGNoRGF0YXNldCgpO1xuICAgICAgICByb3dzRnJvbURhdGEgPSBUYWJsZVJlc3VsdEhlbHBlcnMuZ2V0QWxsUm93c0Zyb21OZXN0ZWRIZWFkZXJzKGRhdGEpO1xuICAgICAgICBmdXNlID0gbmV3IEZ1c2UoXG4gICAgICAgICAgcm93c0Zyb21EYXRhLFxuICAgICAgICAgIFRhYmxlU2VhcmNoSGVscGVycy5mdXNlT3B0aW9uc0ZvclNlYXJjaENvbHVtbnMoXG4gICAgICAgICAgICBvcHRpb25zPy5mdXNlT3B0aW9ucyxcbiAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3JkZXJDb2x1bW46IGtleW9mIFIgfCB1bmRlZmluZWQgPSBxdWVyeS5vcmRlclxuICAgICAgICA/IGNvbHVtbnMuZ2V0KHF1ZXJ5Lm9yZGVyLmNvbHVtbik/Lm9yZGVyS2V5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzRXhwbGljaXRTb3J0ID0gcXVlcnkub3JkZXIgIT0gbnVsbCAmJiBvcmRlckNvbHVtbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZGVmYXVsdFNvcnRTcGVjID0gKCgpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gY29sdW1ucy5nZXQob3B0aW9ucy5kZWZhdWx0U29ydC5jb2x1bW4pPy5vcmRlcktleTtcbiAgICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGtleSwgZGlyZWN0aW9uOiBvcHRpb25zLmRlZmF1bHRTb3J0LmRpcmVjdGlvbiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdE9yZGVyYWJsZSA9IFsuLi5jb2x1bW5zLmVudHJpZXMoKV0uZmluZChcbiAgICAgICAgICAoWywgbWV0YV0pID0+IG1ldGEub3JkZXJLZXkgIT0gbnVsbCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZmlyc3RPcmRlcmFibGU/LlsxXS5vcmRlcktleTtcbiAgICAgICAgcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8geyBrZXksIGRpcmVjdGlvbjogJ2FzYycgYXMgY29uc3QgfSA6IG51bGw7XG4gICAgICB9KSgpO1xuXG4gICAgICAvLyBTZWFyY2gsIHRoZW4gZmlsdGVyLCB0aGVuIHNvcnRcbiAgICAgIGxldCBkaWRSZXN0cmljdERpc3BsYXllZFJvd3M6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgbGV0IHJvd3NNYXRjaGluZ1NlYXJjaDogUltdID0gcm93c0Zyb21EYXRhO1xuICAgICAgaWYgKHF1ZXJ5LnNlYXJjaCkge1xuICAgICAgICByb3dzTWF0Y2hpbmdTZWFyY2ggPSBmdXNlXG4gICAgICAgICAgLnNlYXJjaChxdWVyeS5zZWFyY2gpXG4gICAgICAgICAgLm1hcChyZXN1bHQgPT4gcmVzdWx0Lml0ZW0pO1xuXG4gICAgICAgIGRpZFJlc3RyaWN0RGlzcGxheWVkUm93cyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGxldCByb3dzTWF0Y2hpbmdGaWx0ZXJzOiBSW10gPSByb3dzTWF0Y2hpbmdTZWFyY2g7XG4gICAgICBjb25zdCBmaWx0ZXJUb0FwcGx5ID0gb3B0aW9ucz8uZmlsdGVyO1xuICAgICAgaWYgKGZpbHRlclRvQXBwbHkpIHtcbiAgICAgICAgcm93c01hdGNoaW5nRmlsdGVycyA9IHJvd3NNYXRjaGluZ1NlYXJjaC5maWx0ZXIocm93ID0+XG4gICAgICAgICAgZmlsdGVyVG9BcHBseShxdWVyeS5maWx0ZXJzLCByb3cpLFxuICAgICAgICApO1xuXG4gICAgICAgIGRpZFJlc3RyaWN0RGlzcGxheWVkUm93cyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5lc3RlZFJvd3NUb0Rpc3BsYXk6IE5lc3RlZEhlYWRlclJvdzxSPltdID0gZGlkUmVzdHJpY3REaXNwbGF5ZWRSb3dzXG4gICAgICAgID8gVGFibGVOZXN0aW5nSGVscGVycy5maW5kTmVzdGVkUm93c1dpdGhIZWFkZXJzVG9LZWVwKFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHJvd3NNYXRjaGluZ0ZpbHRlcnMsXG4gICAgICAgICAgKVxuICAgICAgICA6IGRhdGE7XG4gICAgICBjb25zdCBtYXRjaGluZ1Jvd0NvdW50OiBudW1iZXIgPSBUYWJsZU5lc3RpbmdIZWxwZXJzLmNvdW50TmVzdGVkUm93cyhcbiAgICAgICAgbmVzdGVkUm93c1RvRGlzcGxheSxcbiAgICAgICAgb3B0aW9ucz8ucGFnaW5hdGVCeSA/PyAnYm90dG9tUm93cycsXG4gICAgICApO1xuXG4gICAgICBsZXQgc29ydGVkTmVzdGVkUm93czogTmVzdGVkSGVhZGVyUm93PFI+W107XG4gICAgICBpZiAoaGFzRXhwbGljaXRTb3J0ICYmIHF1ZXJ5Lm9yZGVyKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0IHNvcnQgb3ZlcnJpZGUgaGFzIHByaW9yaXR5IG92ZXIgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgIHNvcnRlZE5lc3RlZFJvd3MgPSBUYWJsZU9yZGVySGVscGVycy5zb3J0TG93TGV2ZWxOZXN0ZWRSb3dzV2l0aEhlYWRlcnMoXG4gICAgICAgICAgbmVzdGVkUm93c1RvRGlzcGxheSxcbiAgICAgICAgICBvcmRlckNvbHVtbixcbiAgICAgICAgICBxdWVyeS5vcmRlci5kaXJlY3Rpb24sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHF1ZXJ5LnNlYXJjaCkge1xuICAgICAgICAvLyBTb3J0IG9uIHRoZSBGdXNlIHJlbGV2YW5jZSBvcmRlclxuICAgICAgICBjb25zdCBpZFRvU2VhcmNoSW5kZXhNYXA6IE1hcDxzdHJpbmcgfCBudW1iZXIsIG51bWJlcj4gPVxuICAgICAgICAgIFRhYmxlT3JkZXJIZWxwZXJzLmNyZWF0ZUlkVG9TZWFyY2hJbmRleE1hcChyb3dzTWF0Y2hpbmdTZWFyY2gpO1xuICAgICAgICBzb3J0ZWROZXN0ZWRSb3dzID1cbiAgICAgICAgICBUYWJsZU9yZGVySGVscGVycy5zb3J0TmVzdGVkUm93c1dpdGhIZWFkZXJzQmFzZWRPblNlYXJjaE1hdGNoZXMoXG4gICAgICAgICAgICBuZXN0ZWRSb3dzVG9EaXNwbGF5LFxuICAgICAgICAgICAgaWRUb1NlYXJjaEluZGV4TWFwLFxuICAgICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHF1ZXJ5Lm9yZGVyID09IG51bGwgJiYgZGVmYXVsdFNvcnRTcGVjKSB7XG4gICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3J0LCBpZiB3ZSBoYXZlIG9uZVxuICAgICAgICBzb3J0ZWROZXN0ZWRSb3dzID0gVGFibGVPcmRlckhlbHBlcnMuc29ydExvd0xldmVsTmVzdGVkUm93c1dpdGhIZWFkZXJzKFxuICAgICAgICAgIG5lc3RlZFJvd3NUb0Rpc3BsYXksXG4gICAgICAgICAgZGVmYXVsdFNvcnRTcGVjLmtleSxcbiAgICAgICAgICBkZWZhdWx0U29ydFNwZWMuZGlyZWN0aW9uLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG9uJ3Qgc29ydCBpZiB3ZSBoYXZlIG5vIGluZm9ybWF0aW9uIHRvIHVzZSB0byBzb3J0XG4gICAgICAgIHNvcnRlZE5lc3RlZFJvd3MgPSBuZXN0ZWRSb3dzVG9EaXNwbGF5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWdpbmF0ZWRIZWFkZXJSb3dzOiBOZXN0ZWRIZWFkZXJSb3c8Uj5bXSA9XG4gICAgICAgIFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMucGFnaW5hdGVOZXN0ZWRIZWFkZXJSb3dzKFxuICAgICAgICAgIHNvcnRlZE5lc3RlZFJvd3MsXG4gICAgICAgICAgcXVlcnkucGFnaW5hdGlvbi5wYWdlLFxuICAgICAgICAgIHF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemUsXG4gICAgICAgICAgb3B0aW9ucz8ucGFnaW5hdGVCeSA/PyAnYm90dG9tUm93cycsXG4gICAgICAgICk7XG4gICAgICBjb25zdCBoYXNIZWFkZXJzOiBib29sZWFuID0gb3B0aW9ucz8uaGFzTmVzdGVkSGVhZGVycyA/PyBmYWxzZTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudFBhZ2VOZXN0ZWRIZWFkZXJzOiBwYWdpbmF0ZWRIZWFkZXJSb3dzLFxuICAgICAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IG1hdGNoaW5nUm93Q291bnQsXG4gICAgICAgIGhhc0hlYWRlcnM6IGhhc0hlYWRlcnMsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBjb2x1bW5NZXRhZGF0YTogTWFwPEMsIENvbHVtbk1ldGFkYXRhPiA9XG4gICAgICBUYWJsZUNvbHVtbkhlbHBlcnMuY29udmVydEluTWVtb3J5Q29sdW1uTWV0YWRhdGFNYXAoY29sdW1ucyk7XG5cbiAgICAvKlxuICAgICAgV2hlbiBhIGRlZmF1bHRTb3J0IGlzIHNwZWNpZmllZCwgc2VlZCB0aGUgaW5pdGlhbCBxdWVyeS5vcmRlciBzbyB0aGVcbiAgICAgIHRhYmxlIGhlYWRlciBzaG93cyB0aGUgc29ydCBpbmRpY2F0b3IgZnJvbSB0aGUgc3RhcnQuXG4gICAgKi9cbiAgICBvcHRpb25zID0gVGFibGVPcmRlckhlbHBlcnMuc2VlZERlZmF1bHRTb3J0T3B0aW9uKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZU1hbmFnZXIoc291cmNlLCBjb2x1bW5NZXRhZGF0YSwgcGx1cmFsRW50aXR5TmFtZSwgb3B0aW9ucyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIGtlZXBzIHRoZSBzdGF0ZSBvYmplY3QgcmVmZXJlbmNlcyBhcyBzdGFibGUgYXMgcG9zc2libGUsIHdoaWNoXG4gKiBoZWxwcyBBbmd1bGFyIHJlZHVjZSB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzLiBGb3Igbm93LCBzaW1wbGUgaXNFcXVhbCgpXG4gKiBjaGVja3MgYXQgdGhlIHN0YXRlJ3MgdG9wLWxldmVsIGtleXMgYXJlIHN1ZmZpY2llbnQgdG8gZHJhbWF0aWNhbGx5IHNwZWVkIHVwXG4gKiByZW5kZXJpbmcsIGJ1dCBpZiBvdGhlciBwZXJmb3JtYW5jZSBpc3N1ZXMgYXJpc2UsIHdlIGNvdWxkIGltcGxlbWVudCBtb3JlXG4gKiBncmFudWxhciBjaGVja3Mvc3VyZ2ljYWwgdXBkYXRlcyBhcyBuZWVkZWQgKHRoZSBzdGF0ZS5yZXN1bHQgYmVpbmcgdGhlIG1vc3RcbiAqIGxpa2VseSBjYW5kaWRhdGUsIHNpbmNlIG1hbnkgdHlwZXMgb2Ygc3RhdGUgdXBkYXRlcyBhZmZlY3QgcGFydHMgb2YgdGhlXG4gKiByZXN1bHQgcm93cykuXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZVN0YXRlPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgdGFyZ2V0OiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4sXG4gIHNvdXJjZTogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+LFxuKTogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5xdWVyeSwgc291cmNlLnF1ZXJ5KSkge1xuICAgIHRhcmdldC5xdWVyeSA9IHNvdXJjZS5xdWVyeTtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LmxvYWQsIHNvdXJjZS5sb2FkKSkge1xuICAgIHRhcmdldC5sb2FkID0gc291cmNlLmxvYWQ7XG4gIH1cblxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LnJlc3VsdC5jc3ZEYXRhLCBzb3VyY2UucmVzdWx0LmNzdkRhdGEpKSB7XG4gICAgdGFyZ2V0LnJlc3VsdC5jc3ZEYXRhID0gc291cmNlLnJlc3VsdC5jc3ZEYXRhO1xuICB9XG4gIGlmICghaXNFcXVhbCh0YXJnZXQucmVzdWx0LmNzdkZpbGVuYW1lLCBzb3VyY2UucmVzdWx0LmNzdkZpbGVuYW1lKSkge1xuICAgIHRhcmdldC5yZXN1bHQuY3N2RmlsZW5hbWUgPSBzb3VyY2UucmVzdWx0LmNzdkZpbGVuYW1lO1xuICB9XG4gIGlmIChcbiAgICAhaXNFcXVhbChcbiAgICAgIHRhcmdldC5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50LFxuICAgICAgc291cmNlLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICAgKVxuICApIHtcbiAgICB0YXJnZXQucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCA9IHNvdXJjZS5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50O1xuICB9XG4gIGlmICghaXNFcXVhbCh0YXJnZXQucmVzdWx0LCBzb3VyY2UucmVzdWx0KSkge1xuICAgIHRhcmdldC5yZXN1bHQgPSBzb3VyY2UucmVzdWx0O1xuICB9XG4gIGlmICghaXNFcXVhbCh0YXJnZXQuZGlzcGxheSwgc291cmNlLmRpc3BsYXkpKSB7XG4gICAgdGFyZ2V0LmRpc3BsYXkgPSBzb3VyY2UuZGlzcGxheTtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LnNlbGVjdGlvbiwgc291cmNlLnNlbGVjdGlvbikpIHtcbiAgICB0YXJnZXQuc2VsZWN0aW9uID0gc291cmNlLnNlbGVjdGlvbjtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LmNvbGxhcHNlU3RhdGUsIHNvdXJjZS5jb2xsYXBzZVN0YXRlKSkge1xuICAgIHRhcmdldC5jb2xsYXBzZVN0YXRlID0gc291cmNlLmNvbGxhcHNlU3RhdGU7XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24qIHJlZnJlc2hSZXN1bHRXaXRoPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgc291cmNlOiBSaXZUYWJsZS5Tb3VyY2U8UiwgQywgRiwgRz4sXG4gIG1vc3RSZWNlbnRBY3Rpb246IFJpdlRhYmxlLkFjdGlvbjxSLCBDLCBGLCBHPixcbik6IEFzeW5jR2VuZXJhdG9yPHtcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgZWZmZWN0OiBSaXZUYWJsZS5FZmZlY3QgfCBudWxsO1xufT4ge1xuICB5aWVsZCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbG9hZDoge1xuICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlZmZlY3Q6IG51bGwsXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc291cmNlKHN0YXRlLnF1ZXJ5LCBtb3N0UmVjZW50QWN0aW9uKTtcbiAgICBpZiAoVGFibGVQYWdpbmF0aW9uSGVscGVycy5pc1BhZ2VPdXRPZkJvdW5kcyhzdGF0ZSwgcmVzdWx0KSkge1xuICAgICAgc3RhdGUucXVlcnkucGFnaW5hdGlvbi5wYWdlID0gMDtcbiAgICB9XG4gICAgeWllbGQge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgfSxcbiAgICAgIGVmZmVjdDogbnVsbCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgeWllbGQge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlZmZlY3Q6IG51bGwsXG4gICAgfTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiogcmVkdWNlPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgYWN0aW9uOiBSaXZUYWJsZS5BY3Rpb248UiwgQywgRiwgRz4sXG4gIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gIHNvdXJjZTogUml2VGFibGUuU291cmNlPFIsIEMsIEYsIEc+LFxuICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICBkZWZhdWx0Q29sdW1uU3RhdGU6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10sXG4pOiBBc3luY0dlbmVyYXRvcjx7XG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz47XG4gIGVmZmVjdDogUml2VGFibGUuRWZmZWN0IHwgbnVsbDtcbn0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ2xvYWQnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKHN0YXRlLCBzb3VyY2UsIGFjdGlvbik7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcmRlckNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBvcmRlcjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcmRlckNvbHVtblRvZ2dsZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIFRhYmxlT3JkZXJIZWxwZXJzLnRvZ2dsZUNvbHVtbk9yZGVyKHN0YXRlLCBhY3Rpb24uY29sdW1uKSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VhcmNoQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaDogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgICAgIG1vZGU6ICdpbmNsdWRlJyxcbiAgICAgICAgICAgIGluY2x1ZGVkOiBuZXcgU2V0KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb2xsYXBzZVN0YXRlOiB7XG4gICAgICAgICAgICBkZWZhdWx0VG86ICdleHBhbmRlZCcsXG4gICAgICAgICAgICBjb2xsYXBzZWRIZWFkZXJzOiBuZXcgU2V0KCksXG4gICAgICAgICAgICBjb2xsYXBzZWRSb3dzOiBuZXcgU2V0KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VhcmNoQ29sdW1uc0NoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2hDb2x1bW5zOiBuZXcgTWFwKFtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuc2VhcmNoQ29sdW1ucyxcbiAgICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbGxhcHNlU3RhdGU6IHtcbiAgICAgICAgICAgIGRlZmF1bHRUbzogJ2V4cGFuZGVkJyxcbiAgICAgICAgICAgIGNvbGxhcHNlZEhlYWRlcnM6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIGNvbGxhcHNlZFJvd3M6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwYWdpbmF0aW9uQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dyb3VwaW5nQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIGdyb3VwaW5nOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwcmV2aW91c1BhZ2VOYXZpZ2F0ZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0UHJldmlvdXNQYWdlKHN0YXRlKSA/PyAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICduZXh0UGFnZU5hdmlnYXRlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTpcbiAgICAgICAgICAgICAgICBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldE5leHRQYWdlKHN0YXRlKSA/P1xuICAgICAgICAgICAgICAgIFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0UGFnZUNvdW50KHN0YXRlKSAtIDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3BhZ2VDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLFxuICAgICAgICAgICAgICBwYWdlOiBhY3Rpb24ucGFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncGFnZVNpemVDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLFxuICAgICAgICAgICAgICBwYWdlU2l6ZTogYWN0aW9uLnNpemUsXG4gICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpbHRlcnNDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZmlsdGVyczogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgICAgIG1vZGU6ICdpbmNsdWRlJyxcbiAgICAgICAgICAgIGluY2x1ZGVkOiBuZXcgU2V0KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb2xsYXBzZVN0YXRlOiB7XG4gICAgICAgICAgICBkZWZhdWx0VG86ICdleHBhbmRlZCcsXG4gICAgICAgICAgICBjb2xsYXBzZWRIZWFkZXJzOiBuZXcgU2V0KCksXG4gICAgICAgICAgICBjb2xsYXBzZWRSb3dzOiBuZXcgU2V0KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmlsdGVyQWRkJzpcbiAgICAgIC8vIFBhcmVudCBjb21wb25lbnQgaXMgcmVzcG9uc2libGUgZm9yIHN1YnNjcmliaW5nIGFuZCBhZGRpbmcgdGhlIGZpbHRlclxuICAgICAgeWllbGQgeyBzdGF0ZTogeyAuLi5zdGF0ZSB9LCBlZmZlY3Q6IG51bGwgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtblNldHRpbmdzQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICAgICAgY29sdW1uU2V0dGluZ3M6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8vIGRvIG5vdCBvdXRwdXQgY2hhbmdlcyB3aGVuIHRyaWdnZXJlZCBmcm9tIHRoZSBvdXRzaWRlIHdvcmxkXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb2x1bW5QaW5DaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLmNoYW5nZUNvbHVtblBpbihcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLmNvbHVtbixcbiAgICAgICAgICBhY3Rpb24ucGlubmVkLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbnNGcmVlemVVcFRvQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5jaGFuZ2VDb2x1bW5zRnJlZXplU3RhdGUoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGFjdGlvbi5pbmRleCxcbiAgICAgICAgICBhY3Rpb24uZnJlZXplLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbk9yZGVyQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5jaGFuZ2VDb2x1bW5PcmRlcihcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLnByZXZpb3VzSW5kZXgsXG4gICAgICAgICAgYWN0aW9uLm5ld0luZGV4LFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbk1vdmVUb0NoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZUNvbHVtbkhlbHBlcnMubW92ZUNvbHVtblRvKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24uY29sdW1uLFxuICAgICAgICAgIGFjdGlvbi5wb3NpdGlvbixcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJyxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb2x1bW5FbmFibGVkQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5jaGFuZ2VDb2x1bW5FbmFibGVkKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24uY29sdW1uLFxuICAgICAgICAgIGFjdGlvbi5lbmFibGVkLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuYWJsZUFsbENvbHVtbnNDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLmVuYWJsZUFsbENvbHVtbnMoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGFjdGlvbi5lbmFibGVkLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbldpZHRoQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5jaGFuZ2VDb2x1bW5XaWR0aChcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLmNvbHVtbixcbiAgICAgICAgICBhY3Rpb24ucHJlZmVycmVkV2lkdGgsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmVzZXRUb0RlZmF1bHRDb2x1bW5zJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5yZXNldFRvRGVmYXVsdENvbHVtbnMoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGRlZmF1bHRDb2x1bW5TdGF0ZSxcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJyxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHNlbGVjdGlvbjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIH0sXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyb3dTZWxlY3RlZENoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuc2V0Um93U2VsZWN0ZWQoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYWN0aW9uLmlkLFxuICAgICAgICAgIGFjdGlvbi5zZWxlY3RlZCxcbiAgICAgICAgICBhY3Rpb24uY29udGlndW91cyxcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3BhZ2VTZWxlY3RlZENoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMudG9nZ2xlUGFnZVNlbGVjdGVkKHN0YXRlKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FsbFNlbGVjdGVkQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlU2VsZWN0aW9uSGVscGVycy50b2dnbGVBbGxTZWxlY3RlZChzdGF0ZSksXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3Rpb25DbGVhcic6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuY2xlYXJTZWxlY3Rpb24oc3RhdGUpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ3JvdXBTZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVTZWxlY3Rpb25IZWxwZXJzLnRvZ2dsZUdyb3VwU2VsZWN0ZWQoc3RhdGUsIGFjdGlvbi5wYXlsb2FkKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dyb3Vwc1BlclBhZ2VDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuZ3JvdXBpbmcsXG4gICAgICAgICAgICAgIGdyb3Vwc1BlclBhZ2U6IGFjdGlvbi5ncm91cHNQZXJQYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb3VudFBlckdyb3VwQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIGdyb3VwaW5nOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5Lmdyb3VwaW5nLFxuICAgICAgICAgICAgICBjb3VudFBlckdyb3VwOiBhY3Rpb24uY291bnRQZXJHcm91cCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmlld01vcmVLZXlDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuZ3JvdXBpbmcsXG4gICAgICAgICAgICAgIHZpZXdNb3JlS2V5OiBhY3Rpb24udmlld01vcmVLZXksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvZ2dsZUFsbFNlYXJjaENvbHVtbnMnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICBUYWJsZVNlYXJjaEhlbHBlcnMudG9nZ2xlQWxsU2VhcmNoQ29sdW1ucyhzdGF0ZSksXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvZ2dsZVJvd0NvbGxhcHNlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sbGFwc2VIZWxwZXJzLnRvZ2dsZVJvd0NvbGxhcHNlKHN0YXRlLCBhY3Rpb24uaWQpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9nZ2xlSGVhZGVyQ29sbGFwc2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2xsYXBzZUhlbHBlcnMudG9nZ2xlSGVhZGVyQ29sbGFwc2Uoc3RhdGUsIGFjdGlvbi5pZCksXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b2dnbGVBbGxDb2xsYXBzZWQnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2xsYXBzZUhlbHBlcnMudG9nZ2xlQWxsQ29sbGFwc2VkKHN0YXRlKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iXX0=