@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
@@ -1,1035 +0,0 @@
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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QkFDckQsTUFBTSxFQUFFLElBQUk7YUFDYixDQUFDO1lBQ0YsTUFBTTtLQUNUO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGFyYW1zLCBRdWVyeVBhcmFtc0hhbmRsaW5nIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCBGdXNlLCB7IElGdXNlT3B0aW9ucyB9IGZyb20gJ2Z1c2UuanMnO1xuaW1wb3J0IHsgZGVmYXVsdHNEZWVwLCBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIENvbm5lY3RhYmxlLFxuICBjb25uZWN0YWJsZSxcbiAgZmlsdGVyLFxuICBmcm9tLFxuICBtYXAsXG4gIG1lcmdlU2NhbixcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2NhbixcbiAgc2hhcmUsXG4gIFN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGVlcFBhcnRpYWwgfSBmcm9tICd1dGlsaXR5LXR5cGVzJztcbmltcG9ydCB7IHRvU2VudGVuY2VDYXNlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL3NlbnRlbmNlLWNhc2UucGlwZSc7XG5pbXBvcnQgeyBUYWJsZUNvbGxhcHNlSGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9jb2xsYXBzZS1oZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlQ29sdW1uSGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9jb2x1bW4taGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZURpc3BsYXlIZWxwZXJzIH0gZnJvbSAnLi9zdGF0ZS1oZWxwZXJzL2Rpc3BsYXktaGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZU5lc3RpbmdIZWxwZXJzIH0gZnJvbSAnLi9zdGF0ZS1oZWxwZXJzL25lc3RpbmctaGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZU9yZGVySGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9vcmRlci1oZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvcGFnaW5hdGlvbi1oZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlUmVzdWx0SGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9yZXN1bHQtaGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZVNlYXJjaEhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvc2VhcmNoLWhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVTZWxlY3Rpb25IZWxwZXJzIH0gZnJvbSAnLi9zdGF0ZS1oZWxwZXJzL3NlbGVjdGlvbi1oZWxwZXJzJztcblxuZXhwb3J0IG5hbWVzcGFjZSBSaXZUYWJsZSB7XG4gIGV4cG9ydCB0eXBlIFJvdyA9IHsgaWQ6IHN0cmluZyB8IG51bWJlciB9O1xuICBleHBvcnQgdHlwZSBDb2x1bW4gPSBzdHJpbmc7XG4gIGV4cG9ydCB0eXBlIEZpbHRlcnMgPSBhbnk7XG4gIGV4cG9ydCB0eXBlIEdyb3VwID0geyBrZXk6IHN0cmluZyB8IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBSaXZUYWJsZSdzIHN0YXRlIGFuZCB1c2VyIGFjdGlvbnMgYXJlIGRpdmlkZWQgaW50byB0aGUgZm9sbG93aW5nIGNodW5rczpcbiAgICpcbiAgICogLSBRdWVyeSAoZm9yIHRoaW5ncyBsaWtlIGZpbHRlcnMsIHBhZ2luYXRpb24sIHNlYXJjaCwgZXRjLilcbiAgICogLSBMb2FkaW5nIChmb3Igd2hldGhlciBvciBub3QgdGhlIHRhYmxlIGlzIGxvYWRpbmcgcm93IGRhdGEpXG4gICAqIC0gUmVzdWx0IChmb3IgdGhlIHJvdyBkYXRhIGl0c2VsZilcbiAgICogLSBEaXNwbGF5IChmb3IgdGhpbmdzIGxpa2UgY29sdW1uIGNvbmZpZ3VyYXRpb24pXG4gICAqIC0gU2VsZWN0aW9uIChmb3IgdHJhY2tpbmcgdGhlIHVzZXIncyByb3cgc2VsZWN0aW9ucylcbiAgICogLSBDb2xsYXBzZVN0YXRlIChmb3IgdHJhY2tpbmcgdGhlIHJvd3MvaGVhZGVycyB0aGF0IGFyZSBjb2xsYXBzZWQpXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgZGF0YSBmbG93IGlzIHVuaWRpcmVjdGlvbmFsOiB0aGUgVUkgaXNzdWVzIGFjdGlvbnMsIHdoaWNoXG4gICAqIGFmZmVjdCB0aGUgc3RhdGUsIGFuZCB0aGUgc3RhdGUgZ2V0cyBwYXNzZWQgYmFjayB0byB0aGUgVUkgZm9yIGRpc3BsYXkuXG4gICAqXG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgIFVJICDil4TilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSU4pSA4pSA4pSs4pSA4pSA4pSA4pSYICAgICAgICDilIJcbiAgICogICAg4pSCICAgICAgICAgICAg4pSCXG4gICAqIOKUjOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUglxuICAgKiDilIIgIEFjdGlvbnMgIOKUgiAgIOKUglxuICAgKiDilJTilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilJggICDilIJcbiAgICogICAg4pSCICAgICAgICAgICAg4pSCXG4gICAqIOKUjOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUkFxuICAgKiDilIIgIFN0YXRlIHJlZHVjZXIgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICpcbiAgICogRnJvbSB0aGUgY29yZSBzdGF0ZSwgY2FsY3VsYXRlZCBzdGF0ZSBpcyBkZXJpdmVkIGFuZCBhZGRlZCB0byB0aGUgY29yZVxuICAgKiBzdGF0ZSAoZS5nLiwgZnJvbSB0aGUgcmF3IHNlbGVjdGlvbiBzdGF0ZSB3ZSBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90XG4gICAqIGFsbCB0aGUgcm93cyBvbiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlIGFyZSBzZWxlY3RlZCwgZXRjLikuXG4gICAqL1xuXG4gIC8vLy8vLy8vLy8vXG4gIC8vIFF1ZXJ5IC8vXG4gIC8vLy8vLy8vLy8vXG5cbiAgLy8gUXVlcnkgc3RhdGUgLy9cblxuICBleHBvcnQgdHlwZSBPcmRlckRpcmVjdGlvbiA9ICdhc2MnIHwgJ2Rlc2MnO1xuICBleHBvcnQgY29uc3QgcGFnZVNpemVzID0gWzI1LCA1MCwgMTAwLCAyNTBdIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBRdWVyeTxDIGV4dGVuZHMgQ29sdW1uLCBGIGV4dGVuZHMgRmlsdGVycz4gPSB7XG4gICAgb3JkZXI6IHtcbiAgICAgIGRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb247XG4gICAgICBjb2x1bW46IEM7XG4gICAgfSB8IG51bGw7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgc2VhcmNoQ29sdW1uczogTWFwPEMsIGJvb2xlYW4+O1xuICAgIGZpbHRlcnM6IEYgfCBudWxsO1xuICAgIHBhZ2luYXRpb246IHtcbiAgICAgIHBhZ2U6IG51bWJlcjtcbiAgICAgIHBhZ2VTaXplOiBudW1iZXI7XG4gICAgfTtcbiAgICBncm91cGluZzoge1xuICAgICAgdmlld01vcmVLZXk6IHN0cmluZyB8IG51bGw7XG4gICAgICBncm91cHNQZXJQYWdlOiBudW1iZXI7XG4gICAgICBjb3VudFBlckdyb3VwOiBudW1iZXI7XG4gICAgfTtcbiAgfTtcblxuICAvLyBRdWVyeSBhY3Rpb25zIC8vXG5cbiAgZXhwb3J0IHR5cGUgUXVlcnlBY3Rpb248QyBleHRlbmRzIENvbHVtbiwgRiBleHRlbmRzIEZpbHRlcnM+ID1cbiAgICB8IHsgdHlwZTogJ2xvYWQnIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJztcbiAgICAgICAgcGF5bG9hZDogUXVlcnk8QywgRj5bJ29yZGVyJ107XG4gICAgICAgIHNvdXJjZT86ICdoZWFkZXJNZW51JztcbiAgICAgIH1cbiAgICB8IHsgdHlwZTogJ29yZGVyQ29sdW1uVG9nZ2xlJzsgY29sdW1uOiBDIH1cbiAgICB8IHsgdHlwZTogJ3NlYXJjaENoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydzZWFyY2gnXSB9XG4gICAgfCB7IHR5cGU6ICdzZWFyY2hDb2x1bW5zQ2hhbmdlJzsgcGF5bG9hZDogUXVlcnk8QywgRj5bJ3NlYXJjaENvbHVtbnMnXSB9XG4gICAgfCB7IHR5cGU6ICdmaWx0ZXJzQ2hhbmdlJzsgcGF5bG9hZDogUXVlcnk8QywgRj5bJ2ZpbHRlcnMnXSB9XG4gICAgfCB7IHR5cGU6ICdmaWx0ZXJBZGQnOyBjb2x1bW5LZXk6IHN0cmluZyB9XG4gICAgfCB7IHR5cGU6ICdwYWdpbmF0aW9uQ2hhbmdlJzsgcGF5bG9hZDogUXVlcnk8QywgRj5bJ3BhZ2luYXRpb24nXSB9XG4gICAgfCB7IHR5cGU6ICdncm91cGluZ0NoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+Wydncm91cGluZyddIH1cbiAgICB8IHsgdHlwZTogJ25leHRQYWdlTmF2aWdhdGUnIH1cbiAgICB8IHsgdHlwZTogJ3ByZXZpb3VzUGFnZU5hdmlnYXRlJyB9XG4gICAgfCB7IHR5cGU6ICdwYWdlQ2hhbmdlJzsgcGFnZTogbnVtYmVyIH1cbiAgICB8IHsgdHlwZTogJ3BhZ2VTaXplQ2hhbmdlJzsgc2l6ZTogbnVtYmVyIH1cbiAgICB8IHsgdHlwZTogJ2dyb3Vwc1BlclBhZ2VDaGFuZ2UnOyBncm91cHNQZXJQYWdlOiBudW1iZXIgfVxuICAgIHwgeyB0eXBlOiAnY291bnRQZXJHcm91cENoYW5nZSc7IGNvdW50UGVyR3JvdXA6IG51bWJlciB9XG4gICAgfCB7IHR5cGU6ICd2aWV3TW9yZUtleUNoYW5nZSc7IHZpZXdNb3JlS2V5OiBzdHJpbmcgfVxuICAgIHwgeyB0eXBlOiAndG9nZ2xlQWxsU2VhcmNoQ29sdW1ucycgfTtcblxuICAvLy8vLy8vLy8vXG4gIC8vIExvYWQgLy9cbiAgLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIExvYWQgPSB7XG4gICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICBlcnJvcjogdW5rbm93biB8IG51bGw7XG4gIH07XG5cbiAgLy8vLy8vLy8vLy8vXG4gIC8vIFJlc3VsdCAvL1xuICAvLy8vLy8vLy8vLy9cblxuICBleHBvcnQgdHlwZSBSZXN1bHQ8UiBleHRlbmRzIFJvdz4gPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgcm93IGRhdGEgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIGFmdGVyIGZpbHRlcnMsIHNlYXJjaCBxdWVyeSwgYW5kXG4gICAgICogcm93IG9yZGVyaW5nIGFyZSBhcHBsaWVkLlxuICAgICAqL1xuICAgIGN1cnJlbnRQYWdlRGF0YTogUltdO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyAocmVnYXJkbGVzcyBvZiBwYWdpbmF0aW9uKSB0aGF0IG1hdGNoIHRoZVxuICAgICAqIGZpbHRlcnMgYW5kIHNlYXJjaCBxdWVyeS5cbiAgICAgKi9cbiAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IG51bWJlcjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTdWJHcm91cFJlc3VsdDxSIGV4dGVuZHMgUm93LCBHIGV4dGVuZHMgR3JvdXA+ID0gUmVzdWx0PFI+ICYge1xuICAgIC8qKlxuICAgICAqIEFueSBvdGhlciByZWxldmFudCBncm91cCBkYXRhLCB1c2VkIGZvciB0aGUgc3ViaGVhZGVyXG4gICAgICovXG4gICAgZ3JvdXBEYXRhOiBHO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEdyb3VwUmVzdWx0PFIgZXh0ZW5kcyBSb3csIEcgZXh0ZW5kcyBHcm91cD4gPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgcm93IGRhdGEgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIGFmdGVyIGZpbHRlcnMsIHNlYXJjaCBxdWVyeSwgYW5kXG4gICAgICogcm93IG9yZGVyaW5nIGFyZSBhcHBsaWVkLCBzcGxpdCBpbnRvIGdyb3Vwc1xuICAgICAqL1xuICAgIGdyb3VwUmVzdWx0czogU3ViR3JvdXBSZXN1bHQ8UiwgRz5bXTtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGdyb3VwcyAocmVnYXJkbGVzcyBvZiBwYWdpbmF0aW9uKSB0aGF0IG1hdGNoIHRoZVxuICAgICAqIGZpbHRlcnMgYW5kIHNlYXJjaCBxdWVyeS5cbiAgICAgKi9cbiAgICB0b3RhbEdyb3VwQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgKHJlZ2FyZGxlc3Mgb2YgcGFnaW5hdGlvbikgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBmaWx0ZXJzIGFuZCBzZWFyY2ggcXVlcnkuXG4gICAgICovXG4gICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiBudW1iZXI7XG4gIH07XG5cbiAgLypcbiAgICBOZXN0ZWRSZXN1bHRcbiAgICAgIE5lc3RlZEhlYWRlclJvd1xuICAgICAgICBOZXN0ZWRSb3cgLSB3aXRoIHN1YnJvd3NcbiAgICAgICAgICBOZXN0ZWRSb3cgLSB3aXRoIG5vIHN1YnJvd3NcbiAgKi9cbiAgZXhwb3J0IHR5cGUgTmVzdGVkSGVhZGVyUm93PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIC8vIFRoZSByb3dzIHRoYXQgc2hvdWxkIGJlIGhpZGRlbiB3aGVuIHRoZSB0b2dnbGUgb24gdGhpcyBoZWFkZXIgaXMgdG9nZ2xlZC5cbiAgICBzdWJSb3dzOiBOZXN0ZWRSb3c8Uj5bXTtcblxuICAgIC8vIFRoZSB0ZXh0IHRvIHNob3cgbmV4dCB0byB0aGUgdG9nZ2xlYWJsZSBjaGV2cm9uLCBvciBudWxsIGlmIHdlIGRvbid0IHNob3cgdGhlIGhlYWRlclxuICAgIGhlYWRlclRleHQ6IHN0cmluZyB8IG51bGw7XG4gIH07XG4gIGV4cG9ydCB0eXBlIE5lc3RlZFJvdzxSIGV4dGVuZHMgUm93PiA9IHtcbiAgICAvLyBUaGUgcm93cyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gd2hlbiB0aGUgdG9nZ2xlIG9uIHRoaXMgcm93IGlzIHRvZ2dsZWQuXG4gICAgc3ViUm93cz86IE5lc3RlZFJvdzxSPltdO1xuXG4gICAgLy8gVGhlIHJlbGV2YW50IGRhdGEgdXNlZCB0byBkaXNwbGF5IHRoaXMgcm93LlxuICAgIGRhdGE6IFI7XG4gIH07XG4gIC8qXG4gICAgTmVzdGVkIGhlYWRlciByb3dzIGFyZSB0b2dnbGVhYmxlIGhlYWRlcnMgZm9yIGdyb3VwcyBvZiByb3dzLlxuICAqL1xuICBleHBvcnQgdHlwZSBOZXN0ZWRSZXN1bHQ8UiBleHRlbmRzIFJvdz4gPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgcm93IGRhdGEgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIGFmdGVyIGZpbHRlcnMsIHNlYXJjaCBxdWVyeSwgYW5kXG4gICAgICogcm93IG9yZGVyaW5nIGFyZSBhcHBsaWVkLCBuZXN0ZWQgaW50byBcImhlYWRlcnMgd2l0aCBzdWJyb3dzXCIuXG4gICAgICovXG4gICAgY3VycmVudFBhZ2VOZXN0ZWRIZWFkZXJzOiBOZXN0ZWRIZWFkZXJSb3c8Uj5bXTtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgKHJlZ2FyZGxlc3Mgb2YgcGFnaW5hdGlvbikgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBmaWx0ZXJzIGFuZCBzZWFyY2ggcXVlcnkuXG4gICAgICpcbiAgICAgKiBPbmx5IGNvdW50cyByb3dzIGF0IHRoZSBib3R0b20gbGV2ZWwgb2YgbmVzdGluZy5cbiAgICAgKi9cbiAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IG51bWJlcjtcblxuICAgIC8qXG4gICAgICBUaGlzIHR5cGUgYWxzbyBzdXBwb3J0cyBuZXN0ZWQgcm93cyB3aXRob3V0IGhlYWRlciByb3dzLCBzbyB0aGlzIHByb3BlcnR5XG4gICAgICBoZWxwcyB1cyB0ZWxsIHdoZXRoZXIgdG8gc2hvdyB0aGUgaGVhZGVycy5cbiAgICAqL1xuICAgIGhhc0hlYWRlcnM6IGJvb2xlYW47XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU291cmNlPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IChcbiAgICBxdWVyeTogUXVlcnk8QywgRj4sXG4gICAgbW9zdFJlY2VudEFjdGlvbjogQWN0aW9uPFIsIEMsIEYsIEc+LFxuICApID0+IFByb21pc2U8UmVzdWx0PFI+IHwgR3JvdXBSZXN1bHQ8UiwgRz4gfCBOZXN0ZWRSZXN1bHQ8Uj4+O1xuXG4gIC8vLy8vLy8vLy8vLy9cbiAgLy8gRGlzcGxheSAvL1xuICAvLy8vLy8vLy8vLy8vXG5cbiAgLy8gRGlzcGxheSBzdGF0ZSAvL1xuXG4gIGV4cG9ydCB0eXBlIENvbHVtblNldHRpbmdzPEMgZXh0ZW5kcyBDb2x1bW4+ID0ge1xuICAgIGtleTogQztcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIHByZWZlcnJlZFdpZHRoOiBudW1iZXIgfCAnYXV0byc7XG4gICAgcGlubmVkOiBib29sZWFuO1xuICB9O1xuICBleHBvcnQgdHlwZSBEaXNwbGF5PEMgZXh0ZW5kcyBDb2x1bW4+ID0ge1xuICAgIGNvbHVtblNldHRpbmdzOiBDb2x1bW5TZXR0aW5nczxDPltdO1xuICAgIGNlbGxSb3dTcGFuOiAocm93SW5kZXg6IG51bWJlciwgY29sdW1uOiBDKSA9PiBudW1iZXI7XG4gIH07XG5cbiAgLy8gRGlzcGxheSBhY3Rpb25zIC8vXG5cbiAgZXhwb3J0IHR5cGUgRGlzcGxheUFjdGlvbjxDIGV4dGVuZHMgQ29sdW1uPiA9XG4gICAgfCB7IHR5cGU6ICdjb2x1bW5TZXR0aW5nc0NoYW5nZSc7IHBheWxvYWQ6IERpc3BsYXk8Qz5bJ2NvbHVtblNldHRpbmdzJ10gfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnY29sdW1uUGluQ2hhbmdlJztcbiAgICAgICAgY29sdW1uOiBDO1xuICAgICAgICBwaW5uZWQ6IGJvb2xlYW47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZSc7XG4gICAgICAgIGluZGV4OiBudW1iZXI7XG4gICAgICAgIGZyZWV6ZTogYm9vbGVhbjtcbiAgICAgICAgc291cmNlPzogJ2hlYWRlck1lbnUnIHwgJ29wdGlvbnNNZW51JyB8ICdmcmVlemVEaXZpZGVyJztcbiAgICAgICAgY29sdW1uPzogQztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbk9yZGVyQ2hhbmdlJztcbiAgICAgICAgcHJldmlvdXNJbmRleDogbnVtYmVyO1xuICAgICAgICBuZXdJbmRleDogbnVtYmVyO1xuICAgICAgICBzb3VyY2U/OiAndGFibGVEcmFnJyB8ICdtZW51RHJhZyc7XG4gICAgICAgIGNvbHVtbj86IEM7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdjb2x1bW5Nb3ZlVG9DaGFuZ2UnO1xuICAgICAgICBjb2x1bW46IEM7XG4gICAgICAgIHBvc2l0aW9uOiAnc3RhcnQnIHwgJ2VuZCc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdjb2x1bW5FbmFibGVkQ2hhbmdlJztcbiAgICAgICAgY29sdW1uOiBDO1xuICAgICAgICBlbmFibGVkOiBib29sZWFuO1xuICAgICAgICBzb3VyY2U/OiAnaGVhZGVyTWVudScgfCAnb3B0aW9uc01lbnUnIHwgJ2RyYWdEcm9wJyB8ICdleWVJY29uJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2VuYWJsZUFsbENvbHVtbnNDaGFuZ2UnO1xuICAgICAgICBlbmFibGVkOiBib29sZWFuO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnY29sdW1uV2lkdGhDaGFuZ2UnO1xuICAgICAgICBjb2x1bW46IEM7XG4gICAgICAgIHByZWZlcnJlZFdpZHRoOiBudW1iZXIgfCAnYXV0byc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyZXNldFRvRGVmYXVsdENvbHVtbnMnO1xuICAgICAgfTtcblxuICAvLy8vLy8vLy8vLy8vLy9cbiAgLy8gU2VsZWN0aW9uIC8vXG4gIC8vLy8vLy8vLy8vLy8vL1xuXG4gIC8vIFNlbGVjdGlvbiBzdGF0ZSAvL1xuXG4gIGV4cG9ydCB0eXBlIFNlbGVjdGlvbjxSIGV4dGVuZHMgUm93PiA9IHtcbiAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogUlsnaWQnXSB8IG51bGw7XG4gIH0gJiAoXG4gICAgfCB7XG4gICAgICAgIG1vZGU6ICdpbmNsdWRlJztcbiAgICAgICAgaW5jbHVkZWQ6IFNldDxSWydpZCddPjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgbW9kZTogJ2V4Y2x1ZGUnO1xuICAgICAgICBleGNsdWRlZDogU2V0PFJbJ2lkJ10+O1xuICAgICAgfVxuICApO1xuXG4gIC8vIFNlbGVjdGlvbiBhY3Rpb25zIC8vXG5cbiAgZXhwb3J0IHR5cGUgU2VsZWN0aW9uQWN0aW9uPFIgZXh0ZW5kcyBSb3csIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9PiA9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3Rpb25DaGFuZ2UnO1xuICAgICAgICBwYXlsb2FkOiBTZWxlY3Rpb248Uj47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdncm91cFNlbGVjdGlvbkNoYW5nZSc7XG4gICAgICAgIHBheWxvYWQ6IFJvd0dyb3VwPFIsIEc+O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAncm93U2VsZWN0ZWRDaGFuZ2UnO1xuICAgICAgICBpZDogUlsnaWQnXTtcbiAgICAgICAgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgICAgIGNvbnRpZ3VvdXM6IGJvb2xlYW47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdwYWdlU2VsZWN0ZWRDaGFuZ2UnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnYWxsU2VsZWN0ZWRDaGFuZ2UnO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnc2VsZWN0aW9uQ2xlYXInO1xuICAgICAgfTtcblxuICBleHBvcnQgdHlwZSBDb2xsYXBzZVN0YXRlPFIgZXh0ZW5kcyBSb3c+ID1cbiAgICB8IHtcbiAgICAgICAgZGVmYXVsdFRvOiAnY29sbGFwc2VkJztcbiAgICAgICAgZXhwYW5kZWRSb3dzOiBTZXQ8UlsnaWQnXT47XG4gICAgICAgIGV4cGFuZGVkSGVhZGVyczogU2V0PHN0cmluZz47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIGRlZmF1bHRUbzogJ2V4cGFuZGVkJztcbiAgICAgICAgY29sbGFwc2VkUm93czogU2V0PFJbJ2lkJ10+O1xuICAgICAgICBjb2xsYXBzZWRIZWFkZXJzOiBTZXQ8c3RyaW5nPjtcbiAgICAgIH07XG5cbiAgZXhwb3J0IHR5cGUgQ29sbGFwc2VBY3Rpb248UiBleHRlbmRzIFJvdz4gPVxuICAgIHwge1xuICAgICAgICB0eXBlOiAndG9nZ2xlUm93Q29sbGFwc2UnO1xuICAgICAgICBpZDogUlsnaWQnXTtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZUhlYWRlckNvbGxhcHNlJztcbiAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3RvZ2dsZUFsbENvbGxhcHNlZCc7XG4gICAgICB9O1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyIC8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgLy8gQ29tYmluZWQgc3RhdGUgLy9cblxuICBleHBvcnQgdHlwZSBDb3JlU3RhdGU8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0ge1xuICAgIHF1ZXJ5OiBRdWVyeTxDLCBGPjtcbiAgICBsb2FkOiBMb2FkO1xuICAgIHJlc3VsdDogUmVzdWx0PFI+IHwgR3JvdXBSZXN1bHQ8UiwgRz4gfCBOZXN0ZWRSZXN1bHQ8Uj47XG4gICAgZGlzcGxheTogRGlzcGxheTxDPjtcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbjxSPjtcbiAgICBjb2xsYXBzZVN0YXRlOiBDb2xsYXBzZVN0YXRlPFI+O1xuICB9O1xuXG4gIC8vIENvbWJpbmVkIGFjdGlvbnMgLy9cblxuICBleHBvcnQgdHlwZSBBY3Rpb248XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID1cbiAgICB8IFF1ZXJ5QWN0aW9uPEMsIEY+XG4gICAgfCBEaXNwbGF5QWN0aW9uPEM+XG4gICAgfCBTZWxlY3Rpb25BY3Rpb248UiwgRz5cbiAgICB8IENvbGxhcHNlQWN0aW9uPFI+O1xuXG4gIGV4cG9ydCB0eXBlIEVmZmVjdCA9ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnO1xuXG4gIC8vIEZ1bGwgc3RhdGUgKGNvcmUgc3RhdGUgcGx1cyBwdXJlIGRlcml2YXRpb25zKSAvL1xuICBleHBvcnQgY29uc3QgQ29sdW1uc01heFNob3duOiBudW1iZXIgPSA1MDtcbiAgZXhwb3J0IGNvbnN0IENvbHVtbkRhdGFUeXBlcyA9IFtcbiAgICAnYWR2YW5jZWQnLFxuICAgICdjdXJyZW5jeScsXG4gICAgJ2RhdGUnLFxuICAgICdpY29uJyxcbiAgICAnbG9uZ1RleHQnLFxuICAgICdudW1iZXInLFxuICAgICdzaG9ydFRleHQnLFxuICBdIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBDb2x1bW5EYXRhVHlwZSA9ICh0eXBlb2YgQ29sdW1uRGF0YVR5cGVzKVtudW1iZXJdO1xuICBleHBvcnQgdHlwZSBDb2x1bW5BbGlnbm1lbnQgPSAnbGVmdCcgfCAnY2VudGVyJyB8ICdyaWdodCc7XG4gIGV4cG9ydCB0eXBlIENvbHVtbk1ldGFkYXRhID0ge1xuICAgIG9yZGVyYWJsZTogYm9vbGVhbjtcbiAgICBmaWx0ZXJhYmxlPzogYm9vbGVhbjtcbiAgICBzZWFyY2hhYmxlPzogYm9vbGVhbjtcbiAgICBtaW5XaWR0aDogbnVtYmVyO1xuICAgIGRhdGFUeXBlOiBDb2x1bW5EYXRhVHlwZTtcbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICBkZWZhdWx0UGlubmVkPzogYm9vbGVhbjtcbiAgICBhbHdheXNQaW5uZWQ/OiBib29sZWFuO1xuICAgIHRvb2x0aXBGb3JSZW9yZGVySWNvbj86IHN0cmluZztcbiAgICBjbGlja1ByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcbiAgICBjbGlja1N0b3BQcm9wYWdhdGlvbj86IGJvb2xlYW47XG4gICAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gICAgYWx3YXlzVmlzaWJsZT86IGJvb2xlYW47XG4gICAgdG9vbHRpcEZvckhpZGVJY29uPzogc3RyaW5nO1xuICB9O1xuICBleHBvcnQgdHlwZSBFeHRlcm5hbFJvd0xpbmsgPSB7XG4gICAgdHlwZTogJ2V4dGVybmFsJztcbiAgICBocmVmOiBzdHJpbmc7XG4gIH07XG4gIGV4cG9ydCB0eXBlIEludGVybmFsUm93TGluayA9IHtcbiAgICB0eXBlOiAnaW50ZXJuYWwnO1xuICAgIHJvdXRlckxpbms6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc/OiBRdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgIGFjdGl2ZT86IGJvb2xlYW47XG4gIH07XG4gIGV4cG9ydCB0eXBlIFJvd0xpbmsgPSBFeHRlcm5hbFJvd0xpbmsgfCBJbnRlcm5hbFJvd0xpbms7XG4gIGV4cG9ydCB0eXBlIEZ1bGxSb3c8UiBleHRlbmRzIFJvdz4gPSBSICYge1xuICAgIHJvd0xpbms6IFJvd0xpbmsgfCBudWxsO1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIGlzQ29sbGFwc2VkOiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFJvd0dyb3VwPFIgZXh0ZW5kcyBSb3csIEcgZXh0ZW5kcyBHcm91cD4gPSB7XG4gICAgcm93czogRnVsbFJvdzxSPltdO1xuICAgIHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogbnVtYmVyO1xuICAgIGdyb3VwRGF0YTogRztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsTmVzdGVkUm93PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc3ViUm93cz86IEZ1bGxOZXN0ZWRSb3c8Uj5bXTtcbiAgICBkYXRhOiBSO1xuICAgIHJvd0xpbms6IFJvd0xpbmsgfCBudWxsO1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICAgIGlzQ29sbGFwc2VkOiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxOZXN0ZWRIZWFkZXJSb3c8UiBleHRlbmRzIFJvdz4gPSB7XG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcjtcbiAgICBzdWJSb3dzOiBGdWxsTmVzdGVkUm93PFI+W107XG4gICAgaGVhZGVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbiAgICBpc0NvbGxhcHNlZDogYm9vbGVhbjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsQ29sdW1uPEMgZXh0ZW5kcyBDb2x1bW4+ID0gQ29sdW1uU2V0dGluZ3M8Qz4gJlxuICAgIENvbHVtbk1ldGFkYXRhICYge1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgIGxlZnQ6IG51bWJlciB8IG51bGw7XG4gICAgICBhbGlnbm1lbnQ6IENvbHVtbkFsaWdubWVudDtcbiAgICB9O1xuICBleHBvcnQgdHlwZSBNdWx0aVNlbGVjdGlvblN0YXRlID0gYm9vbGVhbiB8ICdpbmRldGVybWluYXRlJztcbiAgZXhwb3J0IHR5cGUgU2VsZWN0aW9uQ29uZmlndXJhdGlvbiA9IGJvb2xlYW4gfCAnaW5kaXZpZHVhbCc7XG5cbiAgZXhwb3J0IHR5cGUgUm93U3BhbkdldHRlcjxDIGV4dGVuZHMgQ29sdW1uPiA9IChcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIGNvbHVtbjogQyxcbiAgKSA9PiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGV4cG9ydCB0eXBlIFZhbGlkUm93U3BhbkdldHRlcjxDIGV4dGVuZHMgQ29sdW1uPiA9IChcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIGNvbHVtbjogQyxcbiAgKSA9PiBudW1iZXI7XG5cbiAgZXhwb3J0IHR5cGUgQ3N2Q2VsbEZvcm1hdHRlcjxSIGV4dGVuZHMgUm93LCBDIGV4dGVuZHMgQ29sdW1uPiA9IChcbiAgICByb3c6IFIsXG4gICAgY29sdW1uOiBGdWxsQ29sdW1uPEM+LFxuICApID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgZXhwb3J0IHR5cGUgQ3N2R3JvdXBDZWxsRm9ybWF0dGVyPFIgZXh0ZW5kcyBSb3csIEcgZXh0ZW5kcyBHcm91cD4gPSAoXG4gICAgcm93OiBSLFxuICAgIGdyb3VwOiBHLFxuICApID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgZXhwb3J0IHR5cGUgQ3N2Um93ID0gc3RyaW5nW107XG4gIGV4cG9ydCB0eXBlIENzdiA9IENzdlJvd1tdO1xuICBleHBvcnQgdHlwZSBDc3ZNb2RlID0gJ2Z1bGwnIHwgJ3NlbGVjdGlvbic7XG4gIGV4cG9ydCB0eXBlIENzdk91dHB1dCA9XG4gICAgfCB7IGxvYWRpbmc6IHRydWU7IGRhdGE6IG51bGwgfVxuICAgIHwgeyBsb2FkaW5nOiBmYWxzZTsgZGF0YTogQ3N2IH07XG5cbiAgZXhwb3J0IHR5cGUgQ29sdW1uTmFtZU1hcDxDIGV4dGVuZHMgQ29sdW1uPiA9IE1hcDxDLCBDIHwgc3RyaW5nPjtcblxuICBleHBvcnQgdHlwZSBTZWFyY2hhYmxlQ29sdW1uTWFwPEMgZXh0ZW5kcyBDb2x1bW4+ID0gTWFwPEMsIGJvb2xlYW4+O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxTdGF0ZTxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4gPSBDb3JlU3RhdGU8UiwgQywgRiwgRz4gJiB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgcHJldmlvdXM6IG51bWJlciB8IG51bGw7XG4gICAgICAgIHBhZ2VzOiBudW1iZXJbXTtcbiAgICAgICAgbmV4dDogbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgcGFnZUNvdW50OiBudW1iZXI7XG4gICAgICAgIHNob3dDb250cm9sczogYm9vbGVhbjtcbiAgICAgICAgcGFnZVJvd1N0YXJ0OiBudW1iZXI7XG4gICAgICAgIHBhZ2VSb3dFbmQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBub1NlYXJjaENvbHVtbnNTZWxlY3RlZDogYm9vbGVhbjtcbiAgICB9O1xuICAgIHJlc3VsdDpcbiAgICAgIHwge1xuICAgICAgICAgIHJvd3M6IEZ1bGxSb3c8Uj5bXTtcbiAgICAgICAgICByb3dzQXNHcm91cDogUm93R3JvdXA8UiwgRz47XG4gICAgICAgICAgaXNHcm91cGVkOiBmYWxzZTtcbiAgICAgICAgICByZXN1bHRUeXBlOiAnbm9ybWFsLXJvd3MnO1xuICAgICAgICAgIGNzdkRhdGE6IChtb2RlPzogQ3N2TW9kZSkgPT4gQXN5bmNHZW5lcmF0b3I8Q3N2T3V0cHV0PjtcbiAgICAgICAgICBjc3ZGaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICByb3dzOiBGdWxsUm93PFI+W107XG4gICAgICAgICAgcm93R3JvdXBzOiBSb3dHcm91cDxSLCBHPltdO1xuICAgICAgICAgIGlzR3JvdXBlZDogdHJ1ZTtcbiAgICAgICAgICByZXN1bHRUeXBlOiAndGFibGUtZ3JvdXBpbmcnO1xuICAgICAgICAgIGNzdkRhdGE6IChtb2RlPzogQ3N2TW9kZSkgPT4gQXN5bmNHZW5lcmF0b3I8Q3N2T3V0cHV0PjtcbiAgICAgICAgICBjc3ZGaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICB9XG4gICAgICB8IHtcbiAgICAgICAgICByb3dzOiBGdWxsUm93PFI+W107XG4gICAgICAgICAgbmVzdGVkSGVhZGVyUm93czogRnVsbE5lc3RlZEhlYWRlclJvdzxSPltdO1xuICAgICAgICAgIGlzR3JvdXBlZDogZmFsc2U7XG4gICAgICAgICAgcmVzdWx0VHlwZTogJ25lc3RlZC1yb3dzJztcbiAgICAgICAgICBjc3ZEYXRhOiAobW9kZT86IENzdk1vZGUpID0+IEFzeW5jR2VuZXJhdG9yPENzdk91dHB1dD47XG4gICAgICAgICAgY3N2RmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgfTtcbiAgICBkaXNwbGF5OiB7XG4gICAgICBjb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgICBkaXNhYmxlZENvbHVtbnM6IEZ1bGxDb2x1bW48Qz5bXTtcbiAgICAgIGFsbENvbHVtbnM6IENvbHVtblNldHRpbmdzPEM+W107XG4gICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBTZWFyY2hhYmxlQ29sdW1uTWFwPEM+O1xuICAgICAgY29sdW1uTmFtZU1hcDogQ29sdW1uTmFtZU1hcDxDPjtcbiAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgICBjb2x1bW5zQXJlRnJlZXphYmxlOiBib29sZWFuO1xuICAgICAgY29sdW1uc0FyZUhpZGVhYmxlOiBib29sZWFuO1xuICAgICAgY29sdW1uc0FyZVJlb3JkZXJhYmxlOiBib29sZWFuO1xuICAgICAgcm93c0FyZUdyYXllZDogYm9vbGVhbjtcbiAgICAgIGN1c3RvbVN1bW1hcnlSb3c6IGJvb2xlYW47XG4gICAgICBjc3ZFeHBvcnRBbGxvd2VkOiBib29sZWFuO1xuICAgICAgZW5hYmxlZENvdW50OiBudW1iZXI7XG4gICAgICBoaWRlUGFnZVNpemVTZWxlY3RvcjogYm9vbGVhbjtcbiAgICAgIG5lZWRzUmlnaHRCb3JkZXI6IChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW46IEMpID0+IGJvb2xlYW47XG4gICAgICB1bmF2YWlsYWJsZUNvbHVtbktleXM6IENbXTtcbiAgICAgIHVuYXZhaWxhYmxlRm9sZGVyVGl0bGU6IHN0cmluZztcbiAgICB9O1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgYWxsb3dTZWxlY3Rpb246IFNlbGVjdGlvbkNvbmZpZ3VyYXRpb247XG4gICAgICBpc0FsbFNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgICAgaXNDdXJyZW50UGFnZVNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgICAgc2VsZWN0ZWRDb3VudDogbnVtYmVyO1xuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBtYW5hZ2VyIGlzIHdoYXQgc2V0cyB1cCB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgdHJhbnNsYXRlcyB1c2VyIGFjdGlvbnNcbiAgICogKGxpa2UgcGFnaW5hdGlvbiBvciBmaWx0ZXIgY2hhbmdlcywgZXRjLikgaW50byBuZXcgcm93IGRhdGEgYnkgY2FsbGluZyB0aGVcbiAgICogcmVkdWNlciBmdW5jdGlvbi4gSXQgYWxzbyBhdWdtZW50cyB0aGUgY29yZSBzdGF0ZSB3aXRoIGFkZGl0aW9uYWwgZGVyaXZlZFxuICAgKiBzdGF0ZS5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlcjxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4gPSB7XG4gICAgYWN0aW9uczogU3ViamVjdDxBY3Rpb248UiwgQywgRiwgRz4+O1xuICAgIHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8UiwgQywgRiwgRz4+O1xuICAgIGVmZmVjdHM6IENvbm5lY3RhYmxlPEVmZmVjdD47XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlck9wdGlvbnM8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0ge1xuICAgIGluaXRpYWxTdGF0ZT86IERlZXBQYXJ0aWFsPENvcmVTdGF0ZTxSLCBDLCBGLCBHPj47XG4gICAgcm93TGluaz86IChyb3c6IFIsIGdyb3VwPzogRykgPT4gUm93TGluaztcbiAgICBjc3ZDZWxsRm9ybWF0dGVyPzogQ3N2Q2VsbEZvcm1hdHRlcjxSLCBDPjtcbiAgICBjc3ZHcm91cENlbGxGb3JtYXR0ZXI/OiBDc3ZHcm91cENlbGxGb3JtYXR0ZXI8UiwgRz47XG4gICAgY3N2RmlsZUJhc2VuYW1lPzogc3RyaW5nO1xuICAgIGFsbG93U2VsZWN0aW9uPzogU2VsZWN0aW9uQ29uZmlndXJhdGlvbjtcbiAgICBjb2x1bW5zQXJlRnJlZXphYmxlPzogYm9vbGVhbjtcbiAgICBjb2x1bW5zQXJlSGlkZWFibGU/OiBib29sZWFuO1xuICAgIGNvbHVtbnNBcmVSZW9yZGVyYWJsZT86IGJvb2xlYW47XG4gICAgY29sdW1uc1VzZU9yaWdpbmFsQ2FzaW5nPzogYm9vbGVhbjtcbiAgICBkZWZhdWx0Q29sdW1uU3RhdGU/OiBDb2x1bW5TZXR0aW5nczxDPltdO1xuICAgIHJvd3NBcmVHcmF5ZWQ/OiBib29sZWFuO1xuICAgIGN1c3RvbVN1bW1hcnlSb3c/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgdGhlIFwiUmVzdWx0cyBwZXIgcGFnZVwiIGxhYmVsIGFuZCBwYWdlLXNpemUgZHJvcGRvd24gYXJlXG4gICAgICogaGlkZGVuLiBQYWdlIG5hdmlnYXRpb24gYXJyb3dzIGFuZCBwYWdlIG51bWJlcnMgcmVtYWluIHZpc2libGUuXG4gICAgICovXG4gICAgaGlkZVBhZ2VTaXplU2VsZWN0b3I/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFBhcmVudC1jb250cm9sbGVkIHJvdyBzcGFubmluZy5cbiAgICAgKiBSZXR1cm4gMCB0byBzdXBwcmVzcyB0aGUgY2VsbCwgPj0xIGZvciBhIHJlYWwgcm93c3Bhbi5cbiAgICAgKiBJZiBvbWl0dGVkIG9yIGludmFsaWQsIGRlZmF1bHRzIHRvIDEuXG4gICAgICovXG4gICAgZ2V0Um93U3BhbkZvckNlbGw/OiBSb3dTcGFuR2V0dGVyPEM+O1xuICAgIGhhc05lc3RlZEhlYWRlcnM/OiBib29sZWFuO1xuICAgIHVuYXZhaWxhYmxlQ29sdW1uS2V5cz86IENbXTtcbiAgICB1bmF2YWlsYWJsZUZvbGRlclRpdGxlPzogc3RyaW5nO1xuICB9O1xuXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNYW5hZ2VyPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPihcbiAgICBzb3VyY2U6IFNvdXJjZTxSLCBDLCBGLCBHPixcbiAgICBjb2x1bW5zOiBNYXA8QywgQ29sdW1uTWV0YWRhdGE+LFxuICAgIHBsdXJhbEVudGl0eU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogTWFuYWdlck9wdGlvbnM8UiwgQywgRiwgRz4sXG4gICk6IE1hbmFnZXI8UiwgQywgRiwgRz4ge1xuICAgIC8vIFNldCB1cCB0aGUgaW5pdGlhbCB0YWJsZSBzdGF0ZS5cblxuICAgIGNvbnN0IHNlYXJjaGFibGVDb2x1bW5NYXA6IFNlYXJjaGFibGVDb2x1bW5NYXA8Qz4gPSBuZXcgTWFwPEMsIGJvb2xlYW4+KFxuICAgICAgQXJyYXkuZnJvbShjb2x1bW5zLmVudHJpZXMoKSkubWFwKChba2V5LCBtZXRhZGF0YV0pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICBtZXRhZGF0YS5zZWFyY2hhYmxlID8/IHRydWUsXG4gICAgICBdKSxcbiAgICApO1xuICAgIGNvbnN0IGRlZmF1bHRTdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+ID0ge1xuICAgICAgcXVlcnk6IHtcbiAgICAgICAgb3JkZXI6IG51bGwsXG4gICAgICAgIHNlYXJjaDogJycsXG4gICAgICAgIHNlYXJjaENvbHVtbnM6IG5ldyBNYXAoXG4gICAgICAgICAgQXJyYXkuZnJvbShjb2x1bW5zLmtleXMoKSlcbiAgICAgICAgICAgIC5maWx0ZXIoa2V5ID0+IHNlYXJjaGFibGVDb2x1bW5NYXAuZ2V0KGtleSkpXG4gICAgICAgICAgICAubWFwKGtleSA9PiBba2V5LCB0cnVlXSksXG4gICAgICAgICksXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBwYWdlOiAwLFxuICAgICAgICAgIHBhZ2VTaXplOiAyNSxcbiAgICAgICAgfSxcbiAgICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgICB2aWV3TW9yZUtleTogbnVsbCxcbiAgICAgICAgICBncm91cHNQZXJQYWdlOiA1LFxuICAgICAgICAgIGNvdW50UGVyR3JvdXA6IDEwLFxuICAgICAgICB9LFxuICAgICAgICBmaWx0ZXJzOiBudWxsLFxuICAgICAgfSxcbiAgICAgIGxvYWQ6IHsgbG9hZGluZzogZmFsc2UsIGVycm9yOiBudWxsIH0sXG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgY3VycmVudFBhZ2VEYXRhOiBbXSxcbiAgICAgICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiAwLFxuICAgICAgfSxcbiAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgY29sdW1uU2V0dGluZ3M6IFtdLFxuICAgICAgICBjZWxsUm93U3BhbjogKF9pOiBudW1iZXIsIF9jb2x1bW46IEMpID0+IDEsXG4gICAgICB9LFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICBtb2RlOiAnaW5jbHVkZScsXG4gICAgICAgIGluY2x1ZGVkOiBuZXcgU2V0KCksXG4gICAgICB9LFxuICAgICAgY29sbGFwc2VTdGF0ZToge1xuICAgICAgICBkZWZhdWx0VG86ICdleHBhbmRlZCcsXG4gICAgICAgIGNvbGxhcHNlZFJvd3M6IG5ldyBTZXQoKSxcbiAgICAgICAgY29sbGFwc2VkSGVhZGVyczogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGRlZmF1bHRlZEluaXRpYWxTdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+ID0gZGVmYXVsdHNEZWVwKFxuICAgICAge30sXG4gICAgICBvcHRpb25zPy5pbml0aWFsU3RhdGUsXG4gICAgICBkZWZhdWx0U3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbHVtbk5hbWVNYXA6IENvbHVtbk5hbWVNYXA8Qz4gPSBuZXcgTWFwPEMsIEMgfCBzdHJpbmc+KFxuICAgICAgQXJyYXkuZnJvbShjb2x1bW5zLmVudHJpZXMoKSkubWFwKChba2V5LCBtZXRhZGF0YV0pID0+IHtcbiAgICAgICAgY29uc3QgY29sdW1uRGlzcGxheU5hbWU6IHN0cmluZyA9IG1ldGFkYXRhLmRpc3BsYXlOYW1lID8/IGtleTtcbiAgICAgICAgY29uc3QgZm9ybWF0dGVkQ29sdW1uTmFtZTogc3RyaW5nID0gb3B0aW9ucz8uY29sdW1uc1VzZU9yaWdpbmFsQ2FzaW5nXG4gICAgICAgICAgPyBjb2x1bW5EaXNwbGF5TmFtZVxuICAgICAgICAgIDogdG9TZW50ZW5jZUNhc2UoY29sdW1uRGlzcGxheU5hbWUpO1xuXG4gICAgICAgIHJldHVybiBba2V5LCBmb3JtYXR0ZWRDb2x1bW5OYW1lXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29sdW1uU3RhdGUgPVxuICAgICAgb3B0aW9ucz8uZGVmYXVsdENvbHVtblN0YXRlID8/XG4gICAgICBkZWZhdWx0ZWRJbml0aWFsU3RhdGUuZGlzcGxheS5jb2x1bW5TZXR0aW5ncztcblxuICAgIC8vIFdpcmUgdXAgcmVkdWNlZCBzdGF0ZSBmcm9tIGFjdGlvbnMgYW5kIGluaXRpYWwgc3RhdGUuXG4gICAgY29uc3QgYWN0aW9uczogU3ViamVjdDxBY3Rpb248UiwgQywgRiwgRz4+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBjb25zdCBjb3JlU3RhdGU6IE9ic2VydmFibGU8e1xuICAgICAgc3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICAgIGVmZmVjdDogRWZmZWN0IHwgbnVsbDtcbiAgICB9PiA9IGFjdGlvbnMucGlwZShcbiAgICAgIG1lcmdlU2NhbjxcbiAgICAgICAgQWN0aW9uPFIsIEMsIEYsIEc+LFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdCB8IG51bGw7XG4gICAgICAgIH1cbiAgICAgID4oXG4gICAgICAgICh7IHN0YXRlIH0sIGFjdGlvbikgPT5cbiAgICAgICAgICBmcm9tKFxuICAgICAgICAgICAgcmVkdWNlKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAgIGRlZmF1bHRDb2x1bW5TdGF0ZSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgeyBzdGF0ZTogZGVmYXVsdGVkSW5pdGlhbFN0YXRlLCBlZmZlY3Q6IG51bGwgfSxcbiAgICAgICAgMSxcbiAgICAgICksXG4gICAgICBzaGFyZSh7XG4gICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgIHJlc2V0T25FcnJvcjogZmFsc2UsXG4gICAgICAgIHJlc2V0T25Db21wbGV0ZTogZmFsc2UsXG4gICAgICAgIHJlc2V0T25SZWZDb3VudFplcm86IGZhbHNlLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGNzdkV4cG9ydEFsbG93ZWQgPSAhKFxuICAgICAgb3B0aW9ucz8uZ2V0Um93U3BhbkZvckNlbGwgfHwgb3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvd1xuICAgICk7XG5cbiAgICAvLyBBdWdtZW50IHN0YXRlIHdpdGggZGVyaXZlZCBzdGF0ZSwgYW5kIHN1YnNjcmliZS5cbiAgICBjb25zdCBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPFIsIEMsIEYsIEc+PiA9IGNvbm5lY3RhYmxlKFxuICAgICAgY29yZVN0YXRlLnBpcGUoXG4gICAgICAgIG1hcCgoeyBzdGF0ZTogcyB9KTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+ID0+IHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZENvbHVtbnMgPSBUYWJsZUNvbHVtbkhlbHBlcnMucmVzb2x2ZUNvbHVtbnMoXG4gICAgICAgICAgICBzLFxuICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAhIW9wdGlvbnM/LmFsbG93U2VsZWN0aW9uLFxuICAgICAgICAgICAgJ2VuYWJsZWQnLFxuICAgICAgICAgICAgISFvcHRpb25zPy5oYXNOZXN0ZWRIZWFkZXJzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnMgPSBUYWJsZUNvbHVtbkhlbHBlcnMucmVzb2x2ZUNvbHVtbnMoXG4gICAgICAgICAgICBzLFxuICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAhIW9wdGlvbnM/LmFsbG93U2VsZWN0aW9uLFxuICAgICAgICAgICAgJ2Rpc2FibGVkJyxcbiAgICAgICAgICAgICEhb3B0aW9ucz8uaGFzTmVzdGVkSGVhZGVycyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKFRhYmxlUmVzdWx0SGVscGVycy5pc0dyb3VwUmVzdWx0KHMucmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIGRlcml2ZUZ1bGxTdGF0ZUZyb21Hcm91cFJlc3VsdCh7XG4gICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgIHN0YXRlUmVzdWx0OiBzLnJlc3VsdCxcbiAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgICAgICByZXNvbHZlZENvbHVtbnMsXG4gICAgICAgICAgICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zLFxuICAgICAgICAgICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChUYWJsZVJlc3VsdEhlbHBlcnMuaXNOZXN0ZWRSZXN1bHQocy5yZXN1bHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVyaXZlRnVsbFN0YXRlRnJvbU5lc3RlZFJlc3VsdCh7XG4gICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgIHN0YXRlUmVzdWx0OiBzLnJlc3VsdCxcbiAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgICAgICByZXNvbHZlZENvbHVtbnMsXG4gICAgICAgICAgICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zLFxuICAgICAgICAgICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkZXJpdmVGdWxsU3RhdGVGcm9tUmVndWxhclJlc3VsdCh7XG4gICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgIHN0YXRlUmVzdWx0OiBzLnJlc3VsdCxcbiAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgICAgICByZXNvbHZlZENvbHVtbnMsXG4gICAgICAgICAgICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zLFxuICAgICAgICAgICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgc2Nhbigoc3RhYmxlLCBuZXdTdGF0ZSkgPT4gc3RhYmxlU3RhdGUoc3RhYmxlLCBuZXdTdGF0ZSkpLFxuICAgICAgKSxcbiAgICAgIHtcbiAgICAgICAgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSxcbiAgICAgICAgcmVzZXRPbkRpc2Nvbm5lY3Q6IGZhbHNlLFxuICAgICAgfSxcbiAgICApO1xuICAgIHN0YXRlLmNvbm5lY3QoKTtcblxuICAgIGNvbnN0IGVmZmVjdHM6IENvbm5lY3RhYmxlPEVmZmVjdD4gPSBjb25uZWN0YWJsZShcbiAgICAgIGNvcmVTdGF0ZS5waXBlKFxuICAgICAgICBmaWx0ZXIoKHsgZWZmZWN0IH0pID0+IGVmZmVjdCAhPT0gbnVsbCksXG4gICAgICAgIG1hcCgoeyBlZmZlY3QgfSkgPT4gZWZmZWN0IGFzIEVmZmVjdCksXG4gICAgICApLFxuICAgICAge1xuICAgICAgICBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLFxuICAgICAgICByZXNldE9uRGlzY29ubmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICk7XG4gICAgZWZmZWN0cy5jb25uZWN0KCk7XG5cbiAgICAvLyBMb2FkIGluaXRpYWwgdGFibGUgcm93IGRhdGEuXG4gICAgYWN0aW9ucy5uZXh0KHsgdHlwZTogJ2xvYWQnIH0pO1xuXG4gICAgcmV0dXJuIHsgYWN0aW9ucywgc3RhdGUsIGVmZmVjdHMgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlcml2ZUZ1bGxTdGF0ZUZyb21Hcm91cFJlc3VsdDxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4ocHJvcHM6IHtcbiAgICBzOiBDb3JlU3RhdGU8UiwgQywgRiwgRz47XG4gICAgc3RhdGVSZXN1bHQ6IEdyb3VwUmVzdWx0PFIsIEc+O1xuICAgIHNvdXJjZTogU291cmNlPFIsIEMsIEYsIEc+O1xuICAgIGNvbHVtbnM6IE1hcDxDLCBDb2x1bW5NZXRhZGF0YT47XG4gICAgcGx1cmFsRW50aXR5TmFtZTogc3RyaW5nO1xuICAgIGNvbHVtbk5hbWVNYXA6IENvbHVtbk5hbWVNYXA8Qz47XG4gICAgcmVzb2x2ZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnM6IEZ1bGxDb2x1bW48Qz5bXTtcbiAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBTZWFyY2hhYmxlQ29sdW1uTWFwPEM+O1xuICAgIGNzdkV4cG9ydEFsbG93ZWQ6IGJvb2xlYW47XG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+O1xuICB9KTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCB7XG4gICAgICBzLFxuICAgICAgc3RhdGVSZXN1bHQsXG4gICAgICBzb3VyY2UsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICByZXNvbHZlZENvbHVtbnMsXG4gICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgIHNlYXJjaGFibGVDb2x1bW5NYXAsXG4gICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgb3B0aW9ucyxcbiAgICB9ID0gcHJvcHM7XG4gICAgaWYgKG9wdGlvbnM/LmdldFJvd1NwYW5Gb3JDZWxsKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnSGVhZHMgdXAhIEN1c3RvbSByb3cgc3BhbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGdyb3VwZWQgdGFibGVzLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvdykge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ0hlYWRzIHVwISBDdXN0b20gc3VtbWFyeSByb3dzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBncm91cGVkIHRhYmxlcy4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByb3dHcm91cHM6IFJvd0dyb3VwPFIsIEc+W10gPSBzdGF0ZVJlc3VsdC5ncm91cFJlc3VsdHMubWFwKGdyb3VwID0+ICh7XG4gICAgICByb3dzOiBncm91cC5jdXJyZW50UGFnZURhdGEubWFwKHJvdyA9PiAoe1xuICAgICAgICAuLi5yb3csXG4gICAgICAgIHJvd0xpbms6IG9wdGlvbnM/LnJvd0xpbmtcbiAgICAgICAgICA/IG9wdGlvbnMucm93TGluayhyb3csIGdyb3VwLmdyb3VwRGF0YSlcbiAgICAgICAgICA6IG51bGwsXG4gICAgICAgIHNlbGVjdGVkOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNSb3dTZWxlY3RlZChzLCByb3cuaWQpLFxuICAgICAgICBpc0NvbGxhcHNlZDogZmFsc2UsXG4gICAgICB9KSksXG4gICAgICBzZWxlY3RlZDogVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzR3JvdXBTZWxlY3RlZChzLCBncm91cCksXG4gICAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IGdyb3VwLnRvdGFsTWF0Y2hpbmdSb3dDb3VudCxcbiAgICAgIGdyb3VwRGF0YTogZ3JvdXAuZ3JvdXBEYXRhLFxuICAgIH0pKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBjc3ZEYXRhKG1vZGU6IENzdk1vZGUgPSAnZnVsbCcpOiBBc3luY0dlbmVyYXRvcjxDc3ZPdXRwdXQ+IHtcbiAgICAgIGNvbnN0IGNlbGxGb3JtYXR0ZXIgPSBvcHRpb25zPy5jc3ZDZWxsRm9ybWF0dGVyO1xuICAgICAgY29uc3QgZ3JvdXBDZWxsRm9ybWF0dGVyID0gb3B0aW9ucz8uY3N2R3JvdXBDZWxsRm9ybWF0dGVyO1xuICAgICAgaWYgKCFjZWxsRm9ybWF0dGVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMuY3N2Q2VsbEZvcm1hdHRlciBpcyByZXF1aXJlZCBmb3IgQ1NWIGV4cG9ydCcpO1xuICAgICAgeWllbGQgeyBsb2FkaW5nOiB0cnVlLCBkYXRhOiBudWxsIH07XG4gICAgICBjb25zdCBkYXRhU2V0ID0gYXdhaXQgc291cmNlKFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucy5xdWVyeSxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICBwYWdlOiAwLFxuICAgICAgICAgICAgcGFnZVNpemU6IHN0YXRlUmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdsb2FkJyB9LFxuICAgICAgKTtcblxuICAgICAgaWYgKCFUYWJsZVJlc3VsdEhlbHBlcnMuaXNHcm91cFJlc3VsdChkYXRhU2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JldHVybmVkIG5vbi1ncm91cGVkIENTViBkYXRhIGZvciBncm91cGVkIHRhYmxlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZ1bGxDb2x1bW5zID0gVGFibGVDb2x1bW5IZWxwZXJzLnJlc29sdmVDb2x1bW5zKFxuICAgICAgICBzLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAhIW9wdGlvbnMuYWxsb3dTZWxlY3Rpb24sXG4gICAgICAgICdlbmFibGVkJyxcbiAgICAgICAgISFvcHRpb25zLmhhc05lc3RlZEhlYWRlcnMsXG4gICAgICApO1xuICAgICAgY29uc3QgZGF0YTogQ3N2ID0gW107XG4gICAgICBkYXRhLnB1c2goZnVsbENvbHVtbnMubWFwKCh7IGtleSB9KSA9PiBjb2x1bW5OYW1lTWFwLmdldChrZXkpID8/IGtleSkpO1xuXG4gICAgICBpZiAoZ3JvdXBDZWxsRm9ybWF0dGVyKSB7XG4gICAgICAgIGRhdGFbMF0ucHVzaCgnJyk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgcm93SXRlbSBvZiBkYXRhU2V0Lmdyb3VwUmVzdWx0cy5mbGF0TWFwKGdyb3VwcyA9PlxuICAgICAgICBncm91cHMuY3VycmVudFBhZ2VEYXRhLm1hcChyb3cgPT4gKHtcbiAgICAgICAgICByb3csXG4gICAgICAgICAgZ3JvdXA6IGdyb3Vwcy5ncm91cERhdGEsXG4gICAgICAgIH0pKSxcbiAgICAgICkpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkID0gcm93SXRlbS5yb3c7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtb2RlID09PSAnc2VsZWN0aW9uJyAmJlxuICAgICAgICAgICFUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNSb3dTZWxlY3RlZChzLCByZWNvcmQuaWQpXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgcm93OiBDc3ZSb3cgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZnVsbENvbHVtbnMpIHtcbiAgICAgICAgICByb3cucHVzaChhd2FpdCBjZWxsRm9ybWF0dGVyKHJlY29yZCwgY29sdW1uKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdyb3VwQ2VsbEZvcm1hdHRlciAmJiByb3dJdGVtLmdyb3VwKSB7XG4gICAgICAgICAgcm93LnB1c2goYXdhaXQgZ3JvdXBDZWxsRm9ybWF0dGVyKHJlY29yZCwgcm93SXRlbS5ncm91cCkpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEucHVzaChyb3cpO1xuICAgICAgfVxuICAgICAgeWllbGQgeyBsb2FkaW5nOiBmYWxzZSwgZGF0YSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5zLFxuICAgICAgcXVlcnk6IGRlcml2ZWRGdWxsU3RhdGVRdWVyeShzKSxcbiAgICAgIGRpc3BsYXk6IGRlcml2ZWRGdWxsU3RhdGVEaXNwbGF5KHtcbiAgICAgICAgY29yZVN0YXRlOiBzLFxuICAgICAgICBjb2x1bW5zOiBjb2x1bW5zLFxuICAgICAgICBwbHVyYWxFbnRpdHlOYW1lOiBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgICBjb2x1bW5OYW1lTWFwOiBjb2x1bW5OYW1lTWFwLFxuICAgICAgICByZXNvbHZlZENvbHVtbnM6IHJlc29sdmVkQ29sdW1ucyxcbiAgICAgICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnM6IHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zLFxuICAgICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkOiBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgfSksXG4gICAgICBzZWxlY3Rpb246IGRlcml2ZWRGdWxsU3RhdGVTZWxlY3Rpb24ocywgb3B0aW9ucyksXG4gICAgICByZXN1bHQ6IHtcbiAgICAgICAgLi4uc3RhdGVSZXN1bHQsXG4gICAgICAgIGlzR3JvdXBlZDogdHJ1ZSxcbiAgICAgICAgcmVzdWx0VHlwZTogJ3RhYmxlLWdyb3VwaW5nJyxcbiAgICAgICAgcm93R3JvdXBzLFxuICAgICAgICByb3dzOiByb3dHcm91cHMuZmxhdE1hcChncm91cCA9PiBncm91cC5yb3dzKSxcbiAgICAgICAgY3N2RGF0YSxcbiAgICAgICAgY3N2RmlsZW5hbWU6IFRhYmxlUmVzdWx0SGVscGVycy5nZXRDc3ZGaWxlbmFtZShcbiAgICAgICAgICBwbHVyYWxFbnRpdHlOYW1lLFxuICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBkZXJpdmVGdWxsU3RhdGVGcm9tTmVzdGVkUmVzdWx0PFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPihwcm9wczoge1xuICAgIHM6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICBzdGF0ZVJlc3VsdDogTmVzdGVkUmVzdWx0PFI+O1xuICAgIHNvdXJjZTogU291cmNlPFIsIEMsIEYsIEc+O1xuICAgIGNvbHVtbnM6IE1hcDxDLCBDb2x1bW5NZXRhZGF0YT47XG4gICAgcGx1cmFsRW50aXR5TmFtZTogc3RyaW5nO1xuICAgIGNvbHVtbk5hbWVNYXA6IENvbHVtbk5hbWVNYXA8Qz47XG4gICAgcmVzb2x2ZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnM6IEZ1bGxDb2x1bW48Qz5bXTtcbiAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBTZWFyY2hhYmxlQ29sdW1uTWFwPEM+O1xuICAgIGNzdkV4cG9ydEFsbG93ZWQ6IGJvb2xlYW47XG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+O1xuICB9KTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCB7XG4gICAgICBzLFxuICAgICAgc3RhdGVSZXN1bHQsXG4gICAgICBzb3VyY2UsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICByZXNvbHZlZENvbHVtbnMsXG4gICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgIHNlYXJjaGFibGVDb2x1bW5NYXAsXG4gICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgb3B0aW9ucyxcbiAgICB9ID0gcHJvcHM7XG5cbiAgICBpZiAob3B0aW9ucz8uZ2V0Um93U3BhbkZvckNlbGwpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdIZWFkcyB1cCEgQ3VzdG9tIHJvdyBzcGFucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgdGFibGVzIHdpdGggbmVzdGVkIGRhdGEuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zPy5jdXN0b21TdW1tYXJ5Um93KSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnSGVhZHMgdXAhIEN1c3RvbSBzdW1tYXJ5IHJvd3MgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIHRhYmxlcyB3aXRoIG5lc3RlZCBkYXRhLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZ1bGxOZXN0ZWRIZWFkZXJSb3dzOiBGdWxsTmVzdGVkSGVhZGVyUm93PFI+W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5lc3RlZFJvdyBvZiBzdGF0ZVJlc3VsdC5jdXJyZW50UGFnZU5lc3RlZEhlYWRlcnMpIHtcbiAgICAgIGNvbnN0IG5ld0Z1bGxSb3c6IEZ1bGxOZXN0ZWRIZWFkZXJSb3c8Uj4gPVxuICAgICAgICBUYWJsZU5lc3RpbmdIZWxwZXJzLmNvbnZlcnRUb0Z1bGxOZXN0ZWRIZWFkZXJSb3coXG4gICAgICAgICAgbmVzdGVkUm93LFxuICAgICAgICAgIHMsXG4gICAgICAgICAgb3B0aW9ucz8ucm93TGluayxcbiAgICAgICAgKTtcbiAgICAgIGZ1bGxOZXN0ZWRIZWFkZXJSb3dzLnB1c2gobmV3RnVsbFJvdyk7XG4gICAgfVxuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGNzdkRhdGEobW9kZSA9ICdmdWxsJyk6IEFzeW5jR2VuZXJhdG9yPENzdk91dHB1dD4ge1xuICAgICAgaWYgKCFjc3ZFeHBvcnRBbGxvd2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQ1NWIGV4cG9ydCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gcm93IHNwYW5uaW5nIG9yIGEgY3VzdG9tIHN1bW1hcnkgcm93IGlzIGVuYWJsZWQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2VsbEZvcm1hdHRlciA9IG9wdGlvbnM/LmNzdkNlbGxGb3JtYXR0ZXI7XG4gICAgICBpZiAoIWNlbGxGb3JtYXR0ZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcHRpb25zLmNzdkNlbGxGb3JtYXR0ZXIgaXMgcmVxdWlyZWQgZm9yIENTViBleHBvcnQnKTtcbiAgICAgIH1cbiAgICAgIHlpZWxkIHsgbG9hZGluZzogdHJ1ZSwgZGF0YTogbnVsbCB9O1xuICAgICAgY29uc3QgZGF0YVNldCA9IGF3YWl0IHNvdXJjZShcbiAgICAgICAge1xuICAgICAgICAgIC4uLnMucXVlcnksXG4gICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIHBhZ2VTaXplOiBzdGF0ZVJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyB0eXBlOiAnbG9hZCcgfSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChUYWJsZVJlc3VsdEhlbHBlcnMuaXNSZWd1bGFyUmVzdWx0KGRhdGFTZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnUmV0dXJuZWQgbm9uLW5lc3RlZCBDU1YgZGF0YSBmb3IgYSBuZXN0ZWQgd2l0aCBoZWFkZXIgcmVzdWx0IHRhYmxlJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChUYWJsZVJlc3VsdEhlbHBlcnMuaXNHcm91cFJlc3VsdChkYXRhU2V0KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1JldHVybmVkIGdyb3VwZWQgQ1NWIGRhdGEgZm9yIGEgbmVzdGVkIHdpdGggaGVhZGVyIHJlc3VsdCB0YWJsZScsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZ1bGxDb2x1bW5zID0gVGFibGVDb2x1bW5IZWxwZXJzLnJlc29sdmVDb2x1bW5zKFxuICAgICAgICBzLFxuICAgICAgICBjb2x1bW5zLFxuICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAhIW9wdGlvbnMuYWxsb3dTZWxlY3Rpb24sXG4gICAgICAgICdlbmFibGVkJyxcbiAgICAgICAgISFvcHRpb25zLmhhc05lc3RlZEhlYWRlcnMsXG4gICAgICApO1xuICAgICAgY29uc3QgZGF0YTogQ3N2ID0gW107XG4gICAgICBkYXRhLnB1c2goZnVsbENvbHVtbnMubWFwKCh7IGtleSB9KSA9PiBjb2x1bW5OYW1lTWFwLmdldChrZXkpID8/IGtleSkpO1xuXG4gICAgICBjb25zdCBhbGxSb3dzOiBSW10gPSBUYWJsZVJlc3VsdEhlbHBlcnMuZ2V0QWxsUm93c0Zyb21SZXN1bHQoZGF0YVNldCk7XG5cbiAgICAgIGZvciAoY29uc3QgY3VycmVudFJvdyBvZiBhbGxSb3dzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtb2RlID09PSAnc2VsZWN0aW9uJyAmJlxuICAgICAgICAgICFUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNSb3dTZWxlY3RlZChzLCBjdXJyZW50Um93LmlkKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByb3c6IENzdlJvdyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBmdWxsQ29sdW1ucykge1xuICAgICAgICAgIHJvdy5wdXNoKGF3YWl0IGNlbGxGb3JtYXR0ZXIoY3VycmVudFJvdywgY29sdW1uKSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgICB5aWVsZCB7IGxvYWRpbmc6IGZhbHNlLCBkYXRhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnMsXG4gICAgICBxdWVyeTogZGVyaXZlZEZ1bGxTdGF0ZVF1ZXJ5KHMpLFxuICAgICAgZGlzcGxheTogZGVyaXZlZEZ1bGxTdGF0ZURpc3BsYXkoe1xuICAgICAgICBjb3JlU3RhdGU6IHMsXG4gICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgIHBsdXJhbEVudGl0eU5hbWU6IHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICAgIGNvbHVtbk5hbWVNYXA6IGNvbHVtbk5hbWVNYXAsXG4gICAgICAgIHJlc29sdmVkQ29sdW1uczogcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1uczogcmVzb2x2ZWREaXNhYmxlZENvbHVtbnMsXG4gICAgICAgIHNlYXJjaGFibGVDb2x1bW5NYXA6IHNlYXJjaGFibGVDb2x1bW5NYXAsXG4gICAgICAgIGNzdkV4cG9ydEFsbG93ZWQ6IGNzdkV4cG9ydEFsbG93ZWQsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB9KSxcbiAgICAgIHNlbGVjdGlvbjogZGVyaXZlZEZ1bGxTdGF0ZVNlbGVjdGlvbihzLCBvcHRpb25zKSxcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICAuLi5zdGF0ZVJlc3VsdCxcbiAgICAgICAgcm93czogW10sXG4gICAgICAgIGlzR3JvdXBlZDogZmFsc2UsXG4gICAgICAgIHJlc3VsdFR5cGU6ICduZXN0ZWQtcm93cycsXG4gICAgICAgIG5lc3RlZEhlYWRlclJvd3M6IGZ1bGxOZXN0ZWRIZWFkZXJSb3dzLFxuICAgICAgICBjc3ZEYXRhLFxuICAgICAgICBjc3ZGaWxlbmFtZTogVGFibGVSZXN1bHRIZWxwZXJzLmdldENzdkZpbGVuYW1lKFxuICAgICAgICAgIHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlcml2ZUZ1bGxTdGF0ZUZyb21SZWd1bGFyUmVzdWx0PFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPihwcm9wczoge1xuICAgIHM6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICBzdGF0ZVJlc3VsdDogUmVzdWx0PFI+O1xuICAgIHNvdXJjZTogU291cmNlPFIsIEMsIEYsIEc+O1xuICAgIGNvbHVtbnM6IE1hcDxDLCBDb2x1bW5NZXRhZGF0YT47XG4gICAgcGx1cmFsRW50aXR5TmFtZTogc3RyaW5nO1xuICAgIGNvbHVtbk5hbWVNYXA6IENvbHVtbk5hbWVNYXA8Qz47XG4gICAgcmVzb2x2ZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnM6IEZ1bGxDb2x1bW48Qz5bXTtcbiAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBTZWFyY2hhYmxlQ29sdW1uTWFwPEM+O1xuICAgIGNzdkV4cG9ydEFsbG93ZWQ6IGJvb2xlYW47XG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+O1xuICB9KTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgICBjb25zdCB7XG4gICAgICBzLFxuICAgICAgc3RhdGVSZXN1bHQsXG4gICAgICBzb3VyY2UsXG4gICAgICBjb2x1bW5zLFxuICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICByZXNvbHZlZENvbHVtbnMsXG4gICAgICByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgIHNlYXJjaGFibGVDb2x1bW5NYXAsXG4gICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgb3B0aW9ucyxcbiAgICB9ID0gcHJvcHM7XG4gICAgY29uc3Qgcm93cyA9IHN0YXRlUmVzdWx0LmN1cnJlbnRQYWdlRGF0YS5tYXAocm93ID0+ICh7XG4gICAgICAuLi5yb3csXG4gICAgICByb3dMaW5rOiBvcHRpb25zPy5yb3dMaW5rID8gb3B0aW9ucy5yb3dMaW5rKHJvdykgOiBudWxsLFxuICAgICAgc2VsZWN0ZWQ6IFRhYmxlU2VsZWN0aW9uSGVscGVycy5pc1Jvd1NlbGVjdGVkKHMsIHJvdy5pZCksXG4gICAgICBpc0NvbGxhcHNlZDogZmFsc2UsXG4gICAgfSkpO1xuXG4gICAgY29uc3QgY2VsbFJvd1NwYW5DYWNoZSA9IFRhYmxlRGlzcGxheUhlbHBlcnMubWVtb2l6ZWRDZWxsUm93U3BhbihcbiAgICAgIHMsXG4gICAgICByZXNvbHZlZENvbHVtbnMsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gICAgY29uc3QgY2VsbFJvd1NwYW46IFZhbGlkUm93U3BhbkdldHRlcjxDPiA9IChyb3dJbmRleCwgY29sdW1uKSA9PlxuICAgICAgY2VsbFJvd1NwYW5DYWNoZT8uZ2V0KGNvbHVtbik/Lltyb3dJbmRleF0gPz8gMTtcbiAgICBjb25zdCBoYXNBbnlSb3dTcGFucyA9IGNlbGxSb3dTcGFuQ2FjaGVcbiAgICAgID8gWy4uLmNlbGxSb3dTcGFuQ2FjaGUudmFsdWVzKCldLnNvbWUoc3BhbnMgPT5cbiAgICAgICAgICBzcGFucy5zb21lKHNwYW4gPT4gc3BhbiA+IDEpLFxuICAgICAgICApXG4gICAgICA6IGZhbHNlO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRDb2x1bW5LZXlzID0gcmVzb2x2ZWRDb2x1bW5zLm1hcCgoeyBrZXkgfSkgPT4ga2V5KTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uKiBjc3ZEYXRhKG1vZGUgPSAnZnVsbCcpOiBBc3luY0dlbmVyYXRvcjxDc3ZPdXRwdXQ+IHtcbiAgICAgIGlmICghY3N2RXhwb3J0QWxsb3dlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0NTViBleHBvcnQgaXMgbm90IHN1cHBvcnRlZCB3aGVuIHJvdyBzcGFubmluZyBvciBhIGN1c3RvbSBzdW1tYXJ5IHJvdyBpcyBlbmFibGVkLicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNlbGxGb3JtYXR0ZXIgPSBvcHRpb25zPy5jc3ZDZWxsRm9ybWF0dGVyO1xuICAgICAgaWYgKCFjZWxsRm9ybWF0dGVyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ29wdGlvbnMuY3N2Q2VsbEZvcm1hdHRlciBpcyByZXF1aXJlZCBmb3IgQ1NWIGV4cG9ydCcpO1xuICAgICAgeWllbGQgeyBsb2FkaW5nOiB0cnVlLCBkYXRhOiBudWxsIH07XG4gICAgICBjb25zdCBkYXRhU2V0ID0gYXdhaXQgc291cmNlKFxuICAgICAgICB7XG4gICAgICAgICAgLi4ucy5xdWVyeSxcbiAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICBwYWdlOiAwLFxuICAgICAgICAgICAgcGFnZVNpemU6IHN0YXRlUmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB7IHR5cGU6ICdsb2FkJyB9LFxuICAgICAgKTtcblxuICAgICAgaWYgKFRhYmxlUmVzdWx0SGVscGVycy5pc0dyb3VwUmVzdWx0KGRhdGFTZXQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUmV0dXJuZWQgZ3JvdXBlZCBDU1YgZGF0YSBmb3Igbm9uLWdyb3VwZWQgdGFibGUnKTtcbiAgICAgIH1cbiAgICAgIGlmIChUYWJsZVJlc3VsdEhlbHBlcnMuaXNOZXN0ZWRSZXN1bHQoZGF0YVNldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXR1cm5lZCBuZXN0ZWQgQ1NWIGRhdGEgZm9yIG5vbi1uZXN0ZWQgdGFibGUnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZnVsbENvbHVtbnMgPSBUYWJsZUNvbHVtbkhlbHBlcnMucmVzb2x2ZUNvbHVtbnMoXG4gICAgICAgIHMsXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICEhb3B0aW9ucy5hbGxvd1NlbGVjdGlvbixcbiAgICAgICAgJ2VuYWJsZWQnLFxuICAgICAgICAhIW9wdGlvbnMuaGFzTmVzdGVkSGVhZGVycyxcbiAgICAgICk7XG4gICAgICBjb25zdCBkYXRhOiBDc3YgPSBbXTtcbiAgICAgIGRhdGEucHVzaChmdWxsQ29sdW1ucy5tYXAoKHsga2V5IH0pID0+IGNvbHVtbk5hbWVNYXAuZ2V0KGtleSkgPz8ga2V5KSk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGRhdGFTZXQuY3VycmVudFBhZ2VEYXRhKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBtb2RlID09PSAnc2VsZWN0aW9uJyAmJlxuICAgICAgICAgICFUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNSb3dTZWxlY3RlZChzLCByZWNvcmQuaWQpXG4gICAgICAgIClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgcm93OiBDc3ZSb3cgPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZnVsbENvbHVtbnMpIHtcbiAgICAgICAgICByb3cucHVzaChhd2FpdCBjZWxsRm9ybWF0dGVyKHJlY29yZCwgY29sdW1uKSk7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YS5wdXNoKHJvdyk7XG4gICAgICB9XG4gICAgICB5aWVsZCB7IGxvYWRpbmc6IGZhbHNlLCBkYXRhIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnMsXG4gICAgICBxdWVyeTogZGVyaXZlZEZ1bGxTdGF0ZVF1ZXJ5KHMsIHtcbiAgICAgICAgb3JkZXI6IGhhc0FueVJvd1NwYW5zID8gbnVsbCA6IHMucXVlcnkub3JkZXIsXG4gICAgICB9KSxcbiAgICAgIGRpc3BsYXk6IGRlcml2ZWRGdWxsU3RhdGVEaXNwbGF5KFxuICAgICAgICB7XG4gICAgICAgICAgY29yZVN0YXRlOiBzLFxuICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMsXG4gICAgICAgICAgcGx1cmFsRW50aXR5TmFtZTogcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwOiBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIHJlc29sdmVkQ29sdW1uczogcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zOiByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgICAgIGNzdkV4cG9ydEFsbG93ZWQ6IGNzdkV4cG9ydEFsbG93ZWQsXG4gICAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbHVtbnM6IHJlc29sdmVkQ29sdW1ucy5tYXAoY29sdW1uID0+XG4gICAgICAgICAgICBoYXNBbnlSb3dTcGFucyA/IHsgLi4uY29sdW1uLCBvcmRlcmFibGU6IGZhbHNlIH0gOiBjb2x1bW4sXG4gICAgICAgICAgKSxcbiAgICAgICAgICBjZWxsUm93U3BhbjogY2VsbFJvd1NwYW4sXG4gICAgICAgICAgbmVlZHNSaWdodEJvcmRlcjogKHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbjogQyk6IGJvb2xlYW4gPT4ge1xuICAgICAgICAgICAgY29uc3QgaSA9IHJlc29sdmVkQ29sdW1uS2V5cy5maW5kSW5kZXgoa2V5ID0+IGtleSA9PT0gY29sdW1uKTtcbiAgICAgICAgICAgIGlmIChpIDwgMCB8fCBpID09PSByZXNvbHZlZENvbHVtbktleXMubGVuZ3RoIC0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCByaWdodENvbEtleSA9IHJlc29sdmVkQ29sdW1uS2V5c1tpICsgMV07XG4gICAgICAgICAgICBjb25zdCBzcGFuT25SaWdodCA9IGNlbGxSb3dTcGFuKHJvd0luZGV4LCByaWdodENvbEtleSk7XG4gICAgICAgICAgICByZXR1cm4gc3Bhbk9uUmlnaHQgPiAxIHx8IHNwYW5PblJpZ2h0ID09PSAwO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICApLFxuICAgICAgc2VsZWN0aW9uOiBkZXJpdmVkRnVsbFN0YXRlU2VsZWN0aW9uKHMsIG9wdGlvbnMpLFxuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIC4uLnN0YXRlUmVzdWx0LFxuICAgICAgICBpc0dyb3VwZWQ6IGZhbHNlLFxuICAgICAgICByZXN1bHRUeXBlOiAnbm9ybWFsLXJvd3MnLFxuICAgICAgICByb3dzLFxuICAgICAgICByb3dzQXNHcm91cDoge1xuICAgICAgICAgIHJvd3MsXG4gICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgICAgZ3JvdXBEYXRhOiB7IGtleTogJycgfSBhcyBHLFxuICAgICAgICB9LFxuICAgICAgICBjc3ZGaWxlbmFtZTogVGFibGVSZXN1bHRIZWxwZXJzLmdldENzdkZpbGVuYW1lKFxuICAgICAgICAgIHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgKSxcbiAgICAgICAgY3N2RGF0YSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlcml2ZWRGdWxsU3RhdGVRdWVyeTxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4oXG4gICAgY29yZVN0YXRlOiBDb3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgcGFydGlhbFF1ZXJ5OiBQYXJ0aWFsPEZ1bGxTdGF0ZTxSLCBDLCBGLCBHPlsncXVlcnknXT4gPSB7fSxcbiAgKTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+WydxdWVyeSddIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29yZVN0YXRlLnF1ZXJ5LFxuICAgICAgcGFnaW5hdGlvbjogZGVyaXZlZEZ1bGxTdGF0ZVBhZ2luYXRpb24oY29yZVN0YXRlKSxcbiAgICAgIG5vU2VhcmNoQ29sdW1uc1NlbGVjdGVkOiBUYWJsZVNlYXJjaEhlbHBlcnMuZ2V0U2VhcmNoQ29sdW1uc1NlbGVjdGVkU3RhdGUoXG4gICAgICAgIGNvcmVTdGF0ZSxcbiAgICAgICAgJ25vbmUnLFxuICAgICAgKSxcbiAgICAgIC4uLnBhcnRpYWxRdWVyeSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVyaXZlZEZ1bGxTdGF0ZVBhZ2luYXRpb248XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+KFxuICAgIGNvcmVTdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICApOiBGdWxsU3RhdGU8UiwgQywgRiwgRz5bJ3F1ZXJ5J11bJ3BhZ2luYXRpb24nXSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvcmVTdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLFxuICAgICAgcHJldmlvdXM6IFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0UHJldmlvdXNQYWdlKGNvcmVTdGF0ZSksXG4gICAgICBwYWdlczogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQYWdlcyhjb3JlU3RhdGUpLFxuICAgICAgbmV4dDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXROZXh0UGFnZShjb3JlU3RhdGUpLFxuICAgICAgcGFnZUNvdW50OiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFBhZ2VDb3VudChjb3JlU3RhdGUpLFxuICAgICAgc2hvd0NvbnRyb2xzOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFNob3dQYWdpbmF0aW9uQ29udHJvbHMoY29yZVN0YXRlKSxcbiAgICAgIHBhZ2VSb3dTdGFydDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQYWdlUm93U3RhcnQoY29yZVN0YXRlKSxcbiAgICAgIHBhZ2VSb3dFbmQ6IFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0UGFnZVJvd0VuZChjb3JlU3RhdGUpLFxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBkZXJpdmVkRnVsbFN0YXRlRGlzcGxheTxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4oXG4gICAgcHJvcHM6IHtcbiAgICAgIGNvcmVTdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+O1xuICAgICAgY29sdW1uczogTWFwPEMsIENvbHVtbk1ldGFkYXRhPjtcbiAgICAgIHBsdXJhbEVudGl0eU5hbWU6IHN0cmluZztcbiAgICAgIGNvbHVtbk5hbWVNYXA6IENvbHVtbk5hbWVNYXA8Qz47XG4gICAgICByZXNvbHZlZENvbHVtbnM6IEZ1bGxDb2x1bW48Qz5bXTtcbiAgICAgIHJlc29sdmVkRGlzYWJsZWRDb2x1bW5zOiBGdWxsQ29sdW1uPEM+W107XG4gICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBTZWFyY2hhYmxlQ29sdW1uTWFwPEM+O1xuICAgICAgY3N2RXhwb3J0QWxsb3dlZDogYm9vbGVhbjtcbiAgICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxSLCBDLCBGLCBHPjtcbiAgICB9LFxuICAgIHBhcnRpYWxEaXNwbGF5OiBQYXJ0aWFsPEZ1bGxTdGF0ZTxSLCBDLCBGLCBHPlsnZGlzcGxheSddPiA9IHt9LFxuICApOiBGdWxsU3RhdGU8UiwgQywgRiwgRz5bJ2Rpc3BsYXknXSB7XG4gICAgY29uc3Qge1xuICAgICAgY29yZVN0YXRlLFxuICAgICAgY29sdW1ucyxcbiAgICAgIHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgcmVzb2x2ZWREaXNhYmxlZENvbHVtbnMsXG4gICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwLFxuICAgICAgY3N2RXhwb3J0QWxsb3dlZCxcbiAgICAgIG9wdGlvbnMsXG4gICAgfSA9IHByb3BzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvcmVTdGF0ZS5kaXNwbGF5LFxuICAgICAgY29sdW1uczogcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgZGlzYWJsZWRDb2x1bW5zOiByZXNvbHZlZERpc2FibGVkQ29sdW1ucyxcbiAgICAgIGFsbENvbHVtbnM6IFRhYmxlQ29sdW1uSGVscGVycy5nZXRBbGxDb2x1bW5zKFxuICAgICAgICBjb3JlU3RhdGUsXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICApLFxuICAgICAgY29sdW1uTmFtZU1hcDogY29sdW1uTmFtZU1hcCxcbiAgICAgIHNlYXJjaGFibGVDb2x1bW5NYXA6IHNlYXJjaGFibGVDb2x1bW5NYXAsXG4gICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBUYWJsZURpc3BsYXlIZWxwZXJzLmdldFplcm9TdGF0ZU1lc3NhZ2UoXG4gICAgICAgIGNvcmVTdGF0ZSxcbiAgICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICksXG4gICAgICBjb2x1bW5zQXJlRnJlZXphYmxlOiAhIW9wdGlvbnM/LmNvbHVtbnNBcmVGcmVlemFibGUsXG4gICAgICBjb2x1bW5zQXJlSGlkZWFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUhpZGVhYmxlLFxuICAgICAgY29sdW1uc0FyZVJlb3JkZXJhYmxlOiBvcHRpb25zPy5jb2x1bW5zQXJlUmVvcmRlcmFibGUgPz8gdHJ1ZSxcbiAgICAgIHJvd3NBcmVHcmF5ZWQ6ICEhb3B0aW9ucz8ucm93c0FyZUdyYXllZCxcbiAgICAgIGN1c3RvbVN1bW1hcnlSb3c6ICEhb3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvdyxcbiAgICAgIGNzdkV4cG9ydEFsbG93ZWQ6IGNzdkV4cG9ydEFsbG93ZWQsXG4gICAgICBlbmFibGVkQ291bnQ6IHJlc29sdmVkQ29sdW1ucy5sZW5ndGgsXG4gICAgICBoaWRlUGFnZVNpemVTZWxlY3RvcjogISFvcHRpb25zPy5oaWRlUGFnZVNpemVTZWxlY3RvcixcbiAgICAgIGNlbGxSb3dTcGFuOiAoX2k6IG51bWJlciwgX2NvbHVtbjogQykgPT4gMSxcbiAgICAgIG5lZWRzUmlnaHRCb3JkZXI6ICgpID0+IGZhbHNlLFxuICAgICAgdW5hdmFpbGFibGVDb2x1bW5LZXlzOiBvcHRpb25zPy51bmF2YWlsYWJsZUNvbHVtbktleXMgPz8gW10sXG4gICAgICB1bmF2YWlsYWJsZUZvbGRlclRpdGxlOiBvcHRpb25zPy51bmF2YWlsYWJsZUZvbGRlclRpdGxlID8/ICdVbmF2YWlsYWJsZScsXG4gICAgICAuLi5wYXJ0aWFsRGlzcGxheSxcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gZGVyaXZlZEZ1bGxTdGF0ZVNlbGVjdGlvbjxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4oXG4gICAgY29yZVN0YXRlOiBDb3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+LFxuICApOiBGdWxsU3RhdGU8UiwgQywgRiwgRz5bJ3NlbGVjdGlvbiddIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29yZVN0YXRlLnNlbGVjdGlvbixcbiAgICAgIGFsbG93U2VsZWN0aW9uOiBvcHRpb25zPy5hbGxvd1NlbGVjdGlvbiA/PyBmYWxzZSxcbiAgICAgIGlzQWxsU2VsZWN0ZWQ6IFRhYmxlU2VsZWN0aW9uSGVscGVycy5pc0FsbFNlbGVjdGVkKGNvcmVTdGF0ZSksXG4gICAgICBpc0N1cnJlbnRQYWdlU2VsZWN0ZWQ6XG4gICAgICAgIFRhYmxlU2VsZWN0aW9uSGVscGVycy5pc0N1cnJlbnRQYWdlU2VsZWN0ZWQoY29yZVN0YXRlKSxcbiAgICAgIHNlbGVjdGVkQ291bnQ6IFRhYmxlU2VsZWN0aW9uSGVscGVycy5zZWxlY3RlZENvdW50KGNvcmVTdGF0ZSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb21lIHRhYmxlcyB1c2UgcmVtb3RlIGJhY2tlbmRzIHRvIGZldGNoIGRhdGEgYXN5bmNocm9ub3VzbHksIGJ1dCBtb3N0IHRhYmxlcyB1c2UgYW5cbiAgICogaW4tbWVtb3J5IHNvdXJjZSwgd2hpY2ggaXMgdXNlZnVsIGZvciBzbWFsbCBkYXRhc2V0cywgd2hlbiBSaXZUYWJsZSBmZWF0dXJlcyBsaWtlXG4gICAqIG9yZGVyaW5nIGFuZCBwYWdpbmF0aW9uIGFyZSBkZXNpcmVkLlxuICAgKi9cblxuICBleHBvcnQgdHlwZSBJbk1lbW9yeUNvbHVtbk1ldGFkYXRhPFIgZXh0ZW5kcyBSb3c+ID0gT21pdDxcbiAgICBDb2x1bW5NZXRhZGF0YSxcbiAgICAnb3JkZXJhYmxlJ1xuICA+ICYgeyBvcmRlcktleT86IGtleW9mIFIgfTtcblxuICBleHBvcnQgdHlwZSBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+ICYge1xuICAgIGZ1c2VPcHRpb25zPzogSUZ1c2VPcHRpb25zPFI+O1xuICAgIGZpbHRlcj86IChmaWx0ZXJzOiBGIHwgbnVsbCwgcm93OiBSKSA9PiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHF1ZXJ5Lm9yZGVyYCBpcyBudWxsIGFuZCB0aGVyZSBpcyBubyBhY3RpdmUgc2VhcmNoLCByb3dzIGFyZSBvcmRlcmVkXG4gICAgICogYnkgdGhpcyBjb2x1bW4uIElmIG9taXR0ZWQsIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBhbiBgb3JkZXJLZXlgIGlzIHVzZWRcbiAgICAgKiAoYXNjZW5kaW5nKS5cbiAgICAgKi9cbiAgICBkZWZhdWx0U29ydD86IHsgY29sdW1uOiBDOyBkaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoYXQgYSBuZXN0ZWQgdGFibGUncyBwYWdlIHNpemUgYW5kIHRvdGFsIGNvdW50IGNvdW50OiBldmVyeSBib3R0b20tbGV2ZWxcbiAgICogcm93LCB3aGljaCBjYW4gc3BsaXQgYSByb3cncyBzdWJyb3dzIGFjcm9zcyBwYWdlcywgb3IgZWFjaCB0b3AtbGV2ZWwgcm93XG4gICAqIHRvZ2V0aGVyIHdpdGggYWxsIG9mIGl0cyBzdWJyb3dzLlxuICAgKi9cbiAgZXhwb3J0IGNvbnN0IE5lc3RlZFBhZ2luYXRlQnlPcHRpb25zID0gWydib3R0b21Sb3dzJywgJ3RvcFJvd3MnXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgTmVzdGVkUGFnaW5hdGVCeSA9ICh0eXBlb2YgTmVzdGVkUGFnaW5hdGVCeU9wdGlvbnMpW251bWJlcl07XG5cbiAgZXhwb3J0IHR5cGUgSW5NZW1vcnlOZXN0ZWRNYW5hZ2VyT3B0aW9uczxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gID4gPSBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPFIsIEMsIEY+ICYge1xuICAgIC8qKiBEZWZhdWx0cyB0byAnYm90dG9tUm93cycuICovXG4gICAgcGFnaW5hdGVCeT86IE5lc3RlZFBhZ2luYXRlQnk7XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluTWVtb3J5TWFuYWdlcjxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gID4oXG4gICAgZmV0Y2hEYXRhc2V0OiAoKSA9PiBQcm9taXNlPFJbXT4gfCBSW10sXG4gICAgY29sdW1uczogTWFwPEMsIEluTWVtb3J5Q29sdW1uTWV0YWRhdGE8Uj4+LFxuICAgIHBsdXJhbEVudGl0eU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxSLCBDLCBGPixcbiAgKTogTWFuYWdlcjxSLCBDLCBGPiB7XG4gICAgY29sdW1ucyA9IFRhYmxlU2VhcmNoSGVscGVycy5tYXJrQ29sdW1uc091dHNpZGVGdXNlS2V5c1Vuc2VhcmNoYWJsZShcbiAgICAgIGNvbHVtbnMsXG4gICAgICBvcHRpb25zPy5mdXNlT3B0aW9ucyxcbiAgICApO1xuICAgIGxldCBkYXRhOiBSW107XG4gICAgbGV0IGZ1c2U6IEZ1c2U8Uj47XG5cbiAgICBjb25zdCBzb3VyY2U6IFNvdXJjZTxSLCBDLCBGPiA9IGFzeW5jIChxdWVyeSwgbW9zdFJlY2VudEFjdGlvbikgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBtb3N0UmVjZW50QWN0aW9uLnR5cGUgPT09ICdsb2FkJyB8fFxuICAgICAgICBtb3N0UmVjZW50QWN0aW9uLnR5cGUgPT09ICdzZWFyY2hDb2x1bW5zQ2hhbmdlJyB8fFxuICAgICAgICBtb3N0UmVjZW50QWN0aW9uLnR5cGUgPT09ICd0b2dnbGVBbGxTZWFyY2hDb2x1bW5zJ1xuICAgICAgKSB7XG4gICAgICAgIGRhdGEgPSBhd2FpdCBmZXRjaERhdGFzZXQoKTtcbiAgICAgICAgZnVzZSA9IG5ldyBGdXNlKFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgVGFibGVTZWFyY2hIZWxwZXJzLmZ1c2VPcHRpb25zRm9yU2VhcmNoQ29sdW1ucyhcbiAgICAgICAgICAgIG9wdGlvbnM/LmZ1c2VPcHRpb25zLFxuICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBvcmRlckNvbHVtbjoga2V5b2YgUiB8IHVuZGVmaW5lZCA9IHF1ZXJ5Lm9yZGVyXG4gICAgICAgID8gY29sdW1ucy5nZXQocXVlcnkub3JkZXIuY29sdW1uKT8ub3JkZXJLZXlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNFeHBsaWNpdFNvcnQgPSBxdWVyeS5vcmRlciAhPSBudWxsICYmIG9yZGVyQ29sdW1uICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBkZWZhdWx0U29ydFNwZWMgPSAoKCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8uZGVmYXVsdFNvcnQpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBjb2x1bW5zLmdldChvcHRpb25zLmRlZmF1bHRTb3J0LmNvbHVtbik/Lm9yZGVyS2V5O1xuICAgICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsga2V5LCBkaXJlY3Rpb246IG9wdGlvbnMuZGVmYXVsdFNvcnQuZGlyZWN0aW9uIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpcnN0T3JkZXJhYmxlID0gWy4uLmNvbHVtbnMuZW50cmllcygpXS5maW5kKFxuICAgICAgICAgIChbLCBtZXRhXSkgPT4gbWV0YS5vcmRlcktleSAhPSBudWxsLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBrZXkgPSBmaXJzdE9yZGVyYWJsZT8uWzFdLm9yZGVyS2V5O1xuICAgICAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgPyB7IGtleSwgZGlyZWN0aW9uOiAnYXNjJyBhcyBjb25zdCB9IDogbnVsbDtcbiAgICAgIH0pKCk7XG5cbiAgICAgIGxldCBvcmRlcmVkOiBSW107XG4gICAgICBpZiAocXVlcnkuc2VhcmNoKSB7XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSBmdXNlLnNlYXJjaChxdWVyeS5zZWFyY2gpLm1hcChyZXN1bHQgPT4gcmVzdWx0Lml0ZW0pO1xuICAgICAgICBvcmRlcmVkID1cbiAgICAgICAgICBoYXNFeHBsaWNpdFNvcnQgJiYgcXVlcnkub3JkZXJcbiAgICAgICAgICAgID8gVGFibGVPcmRlckhlbHBlcnMub3JkZXJFbXB0eUxhc3QoXG4gICAgICAgICAgICAgICAgbWF0Y2hlcyxcbiAgICAgICAgICAgICAgICBvcmRlckNvbHVtbixcbiAgICAgICAgICAgICAgICBxdWVyeS5vcmRlci5kaXJlY3Rpb24sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogbWF0Y2hlcztcbiAgICAgIH0gZWxzZSBpZiAoaGFzRXhwbGljaXRTb3J0ICYmIHF1ZXJ5Lm9yZGVyKSB7XG4gICAgICAgIG9yZGVyZWQgPSBUYWJsZU9yZGVySGVscGVycy5vcmRlckVtcHR5TGFzdChcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIG9yZGVyQ29sdW1uLFxuICAgICAgICAgIHF1ZXJ5Lm9yZGVyLmRpcmVjdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocXVlcnkub3JkZXIgPT0gbnVsbCAmJiBkZWZhdWx0U29ydFNwZWMpIHtcbiAgICAgICAgb3JkZXJlZCA9IFRhYmxlT3JkZXJIZWxwZXJzLm9yZGVyRW1wdHlMYXN0KFxuICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgZGVmYXVsdFNvcnRTcGVjLmtleSxcbiAgICAgICAgICBkZWZhdWx0U29ydFNwZWMuZGlyZWN0aW9uLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3JkZXJlZCA9IGRhdGE7XG4gICAgICB9XG4gICAgICBjb25zdCBmaWx0ZXIgPSBvcHRpb25zPy5maWx0ZXI7XG4gICAgICBjb25zdCBmaWx0ZXJlZCA9IGZpbHRlclxuICAgICAgICA/IG9yZGVyZWQuZmlsdGVyKHJvdyA9PiBmaWx0ZXIocXVlcnkuZmlsdGVycywgcm93KSlcbiAgICAgICAgOiBvcmRlcmVkO1xuICAgICAgY29uc3Qgc3RhcnRJZHggPSBxdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplICogcXVlcnkucGFnaW5hdGlvbi5wYWdlO1xuICAgICAgY29uc3QgZW5kSWR4ID0gc3RhcnRJZHggKyBxdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplO1xuICAgICAgY29uc3QgcGFnaW5hdGVkID0gZmlsdGVyZWQuc2xpY2Uoc3RhcnRJZHgsIGVuZElkeCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50UGFnZURhdGE6IHBhZ2luYXRlZCxcbiAgICAgICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiBmaWx0ZXJlZC5sZW5ndGgsXG4gICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBjb2x1bW5NZXRhZGF0YTogTWFwPEMsIENvbHVtbk1ldGFkYXRhPiA9XG4gICAgICBUYWJsZUNvbHVtbkhlbHBlcnMuY29udmVydEluTWVtb3J5Q29sdW1uTWV0YWRhdGFNYXAoY29sdW1ucyk7XG5cbiAgICAvKlxuICAgICAgV2hlbiBhIGRlZmF1bHRTb3J0IGlzIHNwZWNpZmllZCwgc2VlZCB0aGUgaW5pdGlhbCBxdWVyeS5vcmRlciBzbyB0aGVcbiAgICAgIHRhYmxlIGhlYWRlciBzaG93cyB0aGUgc29ydCBpbmRpY2F0b3IgZnJvbSB0aGUgc3RhcnQuXG4gICAgKi9cbiAgICBvcHRpb25zID0gVGFibGVPcmRlckhlbHBlcnMuc2VlZERlZmF1bHRTb3J0T3B0aW9uKG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIGNyZWF0ZU1hbmFnZXIoc291cmNlLCBjb2x1bW5NZXRhZGF0YSwgcGx1cmFsRW50aXR5TmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlSW5NZW1vcnlNYW5hZ2VyTmVzdGVkPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgPihcbiAgICBmZXRjaERhdGFzZXQ6ICgpID0+IFByb21pc2U8TmVzdGVkSGVhZGVyUm93PFI+W10+IHwgTmVzdGVkSGVhZGVyUm93PFI+W10sXG4gICAgY29sdW1uczogTWFwPEMsIEluTWVtb3J5Q29sdW1uTWV0YWRhdGE8Uj4+LFxuICAgIHBsdXJhbEVudGl0eU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogSW5NZW1vcnlOZXN0ZWRNYW5hZ2VyT3B0aW9uczxSLCBDLCBGPixcbiAgKTogTWFuYWdlcjxSLCBDLCBGPiB7XG4gICAgY29sdW1ucyA9IFRhYmxlU2VhcmNoSGVscGVycy5tYXJrQ29sdW1uc091dHNpZGVGdXNlS2V5c1Vuc2VhcmNoYWJsZShcbiAgICAgIGNvbHVtbnMsXG4gICAgICBvcHRpb25zPy5mdXNlT3B0aW9ucyxcbiAgICApO1xuICAgIGxldCBkYXRhOiBOZXN0ZWRIZWFkZXJSb3c8Uj5bXTtcbiAgICBsZXQgcm93c0Zyb21EYXRhOiBSW107XG4gICAgLy8gVGhlIGZ1c2Ugd2lsbCBzZWFyY2ggdGhlIGluZGl2aWR1YWwgcm93c1xuICAgIGxldCBmdXNlOiBGdXNlPFI+O1xuXG4gICAgY29uc3Qgc291cmNlOiBTb3VyY2U8UiwgQywgRj4gPSBhc3luYyAocXVlcnksIG1vc3RSZWNlbnRBY3Rpb24pID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnbG9hZCcgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnc2VhcmNoQ29sdW1uc0NoYW5nZScgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAndG9nZ2xlQWxsU2VhcmNoQ29sdW1ucydcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhc2V0KCk7XG4gICAgICAgIHJvd3NGcm9tRGF0YSA9IFRhYmxlUmVzdWx0SGVscGVycy5nZXRBbGxSb3dzRnJvbU5lc3RlZEhlYWRlcnMoZGF0YSk7XG4gICAgICAgIGZ1c2UgPSBuZXcgRnVzZShcbiAgICAgICAgICByb3dzRnJvbURhdGEsXG4gICAgICAgICAgVGFibGVTZWFyY2hIZWxwZXJzLmZ1c2VPcHRpb25zRm9yU2VhcmNoQ29sdW1ucyhcbiAgICAgICAgICAgIG9wdGlvbnM/LmZ1c2VPcHRpb25zLFxuICAgICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBvcmRlckNvbHVtbjoga2V5b2YgUiB8IHVuZGVmaW5lZCA9IHF1ZXJ5Lm9yZGVyXG4gICAgICAgID8gY29sdW1ucy5nZXQocXVlcnkub3JkZXIuY29sdW1uKT8ub3JkZXJLZXlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBoYXNFeHBsaWNpdFNvcnQgPSBxdWVyeS5vcmRlciAhPSBudWxsICYmIG9yZGVyQ29sdW1uICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBkZWZhdWx0U29ydFNwZWMgPSAoKCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8uZGVmYXVsdFNvcnQpIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBjb2x1bW5zLmdldChvcHRpb25zLmRlZmF1bHRTb3J0LmNvbHVtbik/Lm9yZGVyS2V5O1xuICAgICAgICAgIGlmIChrZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHsga2V5LCBkaXJlY3Rpb246IG9wdGlvbnMuZGVmYXVsdFNvcnQuZGlyZWN0aW9uIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpcnN0T3JkZXJhYmxlID0gWy4uLmNvbHVtbnMuZW50cmllcygpXS5maW5kKFxuICAgICAgICAgIChbLCBtZXRhXSkgPT4gbWV0YS5vcmRlcktleSAhPSBudWxsLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBrZXkgPSBmaXJzdE9yZGVyYWJsZT8uWzFdLm9yZGVyS2V5O1xuICAgICAgICByZXR1cm4ga2V5ICE9PSB1bmRlZmluZWQgPyB7IGtleSwgZGlyZWN0aW9uOiAnYXNjJyBhcyBjb25zdCB9IDogbnVsbDtcbiAgICAgIH0pKCk7XG5cbiAgICAgIC8vIFNlYXJjaCwgdGhlbiBmaWx0ZXIsIHRoZW4gc29ydFxuICAgICAgbGV0IGRpZFJlc3RyaWN0RGlzcGxheWVkUm93czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgICBsZXQgcm93c01hdGNoaW5nU2VhcmNoOiBSW10gPSByb3dzRnJvbURhdGE7XG4gICAgICBpZiAocXVlcnkuc2VhcmNoKSB7XG4gICAgICAgIHJvd3NNYXRjaGluZ1NlYXJjaCA9IGZ1c2VcbiAgICAgICAgICAuc2VhcmNoKHF1ZXJ5LnNlYXJjaClcbiAgICAgICAgICAubWFwKHJlc3VsdCA9PiByZXN1bHQuaXRlbSk7XG5cbiAgICAgICAgZGlkUmVzdHJpY3REaXNwbGF5ZWRSb3dzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IHJvd3NNYXRjaGluZ0ZpbHRlcnM6IFJbXSA9IHJvd3NNYXRjaGluZ1NlYXJjaDtcbiAgICAgIGNvbnN0IGZpbHRlclRvQXBwbHkgPSBvcHRpb25zPy5maWx0ZXI7XG4gICAgICBpZiAoZmlsdGVyVG9BcHBseSkge1xuICAgICAgICByb3dzTWF0Y2hpbmdGaWx0ZXJzID0gcm93c01hdGNoaW5nU2VhcmNoLmZpbHRlcihyb3cgPT5cbiAgICAgICAgICBmaWx0ZXJUb0FwcGx5KHF1ZXJ5LmZpbHRlcnMsIHJvdyksXG4gICAgICAgICk7XG5cbiAgICAgICAgZGlkUmVzdHJpY3REaXNwbGF5ZWRSb3dzID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmVzdGVkUm93c1RvRGlzcGxheTogTmVzdGVkSGVhZGVyUm93PFI+W10gPSBkaWRSZXN0cmljdERpc3BsYXllZFJvd3NcbiAgICAgICAgPyBUYWJsZU5lc3RpbmdIZWxwZXJzLmZpbmROZXN0ZWRSb3dzV2l0aEhlYWRlcnNUb0tlZXAoXG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcm93c01hdGNoaW5nRmlsdGVycyxcbiAgICAgICAgICApXG4gICAgICAgIDogZGF0YTtcbiAgICAgIGNvbnN0IG1hdGNoaW5nUm93Q291bnQ6IG51bWJlciA9IFRhYmxlTmVzdGluZ0hlbHBlcnMuY291bnROZXN0ZWRSb3dzKFxuICAgICAgICBuZXN0ZWRSb3dzVG9EaXNwbGF5LFxuICAgICAgICBvcHRpb25zPy5wYWdpbmF0ZUJ5ID8/ICdib3R0b21Sb3dzJyxcbiAgICAgICk7XG5cbiAgICAgIGxldCBzb3J0ZWROZXN0ZWRSb3dzOiBOZXN0ZWRIZWFkZXJSb3c8Uj5bXTtcbiAgICAgIGlmIChoYXNFeHBsaWNpdFNvcnQgJiYgcXVlcnkub3JkZXIpIHtcbiAgICAgICAgLy8gRXhwbGljaXQgc29ydCBvdmVycmlkZSBoYXMgcHJpb3JpdHkgb3ZlciBldmVyeXRoaW5nIGVsc2VcbiAgICAgICAgc29ydGVkTmVzdGVkUm93cyA9IFRhYmxlT3JkZXJIZWxwZXJzLnNvcnRMb3dMZXZlbE5lc3RlZFJvd3NXaXRoSGVhZGVycyhcbiAgICAgICAgICBuZXN0ZWRSb3dzVG9EaXNwbGF5LFxuICAgICAgICAgIG9yZGVyQ29sdW1uLFxuICAgICAgICAgIHF1ZXJ5Lm9yZGVyLmRpcmVjdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocXVlcnkuc2VhcmNoKSB7XG4gICAgICAgIC8vIFNvcnQgb24gdGhlIEZ1c2UgcmVsZXZhbmNlIG9yZGVyXG4gICAgICAgIGNvbnN0IGlkVG9TZWFyY2hJbmRleE1hcDogTWFwPHN0cmluZyB8IG51bWJlciwgbnVtYmVyPiA9XG4gICAgICAgICAgVGFibGVPcmRlckhlbHBlcnMuY3JlYXRlSWRUb1NlYXJjaEluZGV4TWFwKHJvd3NNYXRjaGluZ1NlYXJjaCk7XG4gICAgICAgIHNvcnRlZE5lc3RlZFJvd3MgPVxuICAgICAgICAgIFRhYmxlT3JkZXJIZWxwZXJzLnNvcnROZXN0ZWRSb3dzV2l0aEhlYWRlcnNCYXNlZE9uU2VhcmNoTWF0Y2hlcyhcbiAgICAgICAgICAgIG5lc3RlZFJvd3NUb0Rpc3BsYXksXG4gICAgICAgICAgICBpZFRvU2VhcmNoSW5kZXhNYXAsXG4gICAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAocXVlcnkub3JkZXIgPT0gbnVsbCAmJiBkZWZhdWx0U29ydFNwZWMpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IHNvcnQsIGlmIHdlIGhhdmUgb25lXG4gICAgICAgIHNvcnRlZE5lc3RlZFJvd3MgPSBUYWJsZU9yZGVySGVscGVycy5zb3J0TG93TGV2ZWxOZXN0ZWRSb3dzV2l0aEhlYWRlcnMoXG4gICAgICAgICAgbmVzdGVkUm93c1RvRGlzcGxheSxcbiAgICAgICAgICBkZWZhdWx0U29ydFNwZWMua2V5LFxuICAgICAgICAgIGRlZmF1bHRTb3J0U3BlYy5kaXJlY3Rpb24sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEb24ndCBzb3J0IGlmIHdlIGhhdmUgbm8gaW5mb3JtYXRpb24gdG8gdXNlIHRvIHNvcnRcbiAgICAgICAgc29ydGVkTmVzdGVkUm93cyA9IG5lc3RlZFJvd3NUb0Rpc3BsYXk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhZ2luYXRlZEhlYWRlclJvd3M6IE5lc3RlZEhlYWRlclJvdzxSPltdID1cbiAgICAgICAgVGFibGVQYWdpbmF0aW9uSGVscGVycy5wYWdpbmF0ZU5lc3RlZEhlYWRlclJvd3MoXG4gICAgICAgICAgc29ydGVkTmVzdGVkUm93cyxcbiAgICAgICAgICBxdWVyeS5wYWdpbmF0aW9uLnBhZ2UsXG4gICAgICAgICAgcXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZSxcbiAgICAgICAgICBvcHRpb25zPy5wYWdpbmF0ZUJ5ID8/ICdib3R0b21Sb3dzJyxcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IGhhc0hlYWRlcnM6IGJvb2xlYW4gPSBvcHRpb25zPy5oYXNOZXN0ZWRIZWFkZXJzID8/IGZhbHNlO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50UGFnZU5lc3RlZEhlYWRlcnM6IHBhZ2luYXRlZEhlYWRlclJvd3MsXG4gICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogbWF0Y2hpbmdSb3dDb3VudCxcbiAgICAgICAgaGFzSGVhZGVyczogaGFzSGVhZGVycyxcbiAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IGNvbHVtbk1ldGFkYXRhOiBNYXA8QywgQ29sdW1uTWV0YWRhdGE+ID1cbiAgICAgIFRhYmxlQ29sdW1uSGVscGVycy5jb252ZXJ0SW5NZW1vcnlDb2x1bW5NZXRhZGF0YU1hcChjb2x1bW5zKTtcblxuICAgIC8qXG4gICAgICBXaGVuIGEgZGVmYXVsdFNvcnQgaXMgc3BlY2lmaWVkLCBzZWVkIHRoZSBpbml0aWFsIHF1ZXJ5Lm9yZGVyIHNvIHRoZVxuICAgICAgdGFibGUgaGVhZGVyIHNob3dzIHRoZSBzb3J0IGluZGljYXRvciBmcm9tIHRoZSBzdGFydC5cbiAgICAqL1xuICAgIG9wdGlvbnMgPSBUYWJsZU9yZGVySGVscGVycy5zZWVkRGVmYXVsdFNvcnRPcHRpb24ob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gY3JlYXRlTWFuYWdlcihzb3VyY2UsIGNvbHVtbk1ldGFkYXRhLCBwbHVyYWxFbnRpdHlOYW1lLCBvcHRpb25zKTtcbiAgfVxufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24ga2VlcHMgdGhlIHN0YXRlIG9iamVjdCByZWZlcmVuY2VzIGFzIHN0YWJsZSBhcyBwb3NzaWJsZSwgd2hpY2hcbiAqIGhlbHBzIEFuZ3VsYXIgcmVkdWNlIHVubmVjZXNzYXJ5IHJlLXJlbmRlcnMuIEZvciBub3csIHNpbXBsZSBpc0VxdWFsKClcbiAqIGNoZWNrcyBhdCB0aGUgc3RhdGUncyB0b3AtbGV2ZWwga2V5cyBhcmUgc3VmZmljaWVudCB0byBkcmFtYXRpY2FsbHkgc3BlZWQgdXBcbiAqIHJlbmRlcmluZywgYnV0IGlmIG90aGVyIHBlcmZvcm1hbmNlIGlzc3VlcyBhcmlzZSwgd2UgY291bGQgaW1wbGVtZW50IG1vcmVcbiAqIGdyYW51bGFyIGNoZWNrcy9zdXJnaWNhbCB1cGRhdGVzIGFzIG5lZWRlZCAodGhlIHN0YXRlLnJlc3VsdCBiZWluZyB0aGUgbW9zdFxuICogbGlrZWx5IGNhbmRpZGF0ZSwgc2luY2UgbWFueSB0eXBlcyBvZiBzdGF0ZSB1cGRhdGVzIGFmZmVjdCBwYXJ0cyBvZiB0aGVcbiAqIHJlc3VsdCByb3dzKS5cbiAqL1xuZnVuY3Rpb24gc3RhYmxlU3RhdGU8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KFxuICB0YXJnZXQ6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPixcbiAgc291cmNlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4sXG4pOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4ge1xuICBpZiAoIWlzRXF1YWwodGFyZ2V0LnF1ZXJ5LCBzb3VyY2UucXVlcnkpKSB7XG4gICAgdGFyZ2V0LnF1ZXJ5ID0gc291cmNlLnF1ZXJ5O1xuICB9XG4gIGlmICghaXNFcXVhbCh0YXJnZXQubG9hZCwgc291cmNlLmxvYWQpKSB7XG4gICAgdGFyZ2V0LmxvYWQgPSBzb3VyY2UubG9hZDtcbiAgfVxuXG4gIGlmICghaXNFcXVhbCh0YXJnZXQucmVzdWx0LmNzdkRhdGEsIHNvdXJjZS5yZXN1bHQuY3N2RGF0YSkpIHtcbiAgICB0YXJnZXQucmVzdWx0LmNzdkRhdGEgPSBzb3VyY2UucmVzdWx0LmNzdkRhdGE7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5yZXN1bHQuY3N2RmlsZW5hbWUsIHNvdXJjZS5yZXN1bHQuY3N2RmlsZW5hbWUpKSB7XG4gICAgdGFyZ2V0LnJlc3VsdC5jc3ZGaWxlbmFtZSA9IHNvdXJjZS5yZXN1bHQuY3N2RmlsZW5hbWU7XG4gIH1cbiAgaWYgKFxuICAgICFpc0VxdWFsKFxuICAgICAgdGFyZ2V0LnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICAgICBzb3VyY2UucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCxcbiAgICApXG4gICkge1xuICAgIHRhcmdldC5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50ID0gc291cmNlLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQ7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5yZXN1bHQsIHNvdXJjZS5yZXN1bHQpKSB7XG4gICAgdGFyZ2V0LnJlc3VsdCA9IHNvdXJjZS5yZXN1bHQ7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5kaXNwbGF5LCBzb3VyY2UuZGlzcGxheSkpIHtcbiAgICB0YXJnZXQuZGlzcGxheSA9IHNvdXJjZS5kaXNwbGF5O1xuICB9XG4gIGlmICghaXNFcXVhbCh0YXJnZXQuc2VsZWN0aW9uLCBzb3VyY2Uuc2VsZWN0aW9uKSkge1xuICAgIHRhcmdldC5zZWxlY3Rpb24gPSBzb3VyY2Uuc2VsZWN0aW9uO1xuICB9XG4gIGlmICghaXNFcXVhbCh0YXJnZXQuY29sbGFwc2VTdGF0ZSwgc291cmNlLmNvbGxhcHNlU3RhdGUpKSB7XG4gICAgdGFyZ2V0LmNvbGxhcHNlU3RhdGUgPSBzb3VyY2UuY29sbGFwc2VTdGF0ZTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuXG5hc3luYyBmdW5jdGlvbiogcmVmcmVzaFJlc3VsdFdpdGg8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KFxuICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICBzb3VyY2U6IFJpdlRhYmxlLlNvdXJjZTxSLCBDLCBGLCBHPixcbiAgbW9zdFJlY2VudEFjdGlvbjogUml2VGFibGUuQWN0aW9uPFIsIEMsIEYsIEc+LFxuKTogQXN5bmNHZW5lcmF0b3I8e1xuICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+O1xuICBlZmZlY3Q6IFJpdlRhYmxlLkVmZmVjdCB8IG51bGw7XG59PiB7XG4gIHlpZWxkIHtcbiAgICBzdGF0ZToge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBsb2FkOiB7XG4gICAgICAgIGxvYWRpbmc6IHRydWUsXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGVmZmVjdDogbnVsbCxcbiAgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzb3VyY2Uoc3RhdGUucXVlcnksIG1vc3RSZWNlbnRBY3Rpb24pO1xuICAgIGlmIChUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmlzUGFnZU91dE9mQm91bmRzKHN0YXRlLCByZXN1bHQpKSB7XG4gICAgICBzdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLnBhZ2UgPSAwO1xuICAgIH1cbiAgICB5aWVsZCB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbG9hZDoge1xuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHQsXG4gICAgICB9LFxuICAgICAgZWZmZWN0OiBudWxsLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB5aWVsZCB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbG9hZDoge1xuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVmZmVjdDogbnVsbCxcbiAgICB9O1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uKiByZWR1Y2U8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KFxuICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICBhY3Rpb246IFJpdlRhYmxlLkFjdGlvbjxSLCBDLCBGLCBHPixcbiAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgc291cmNlOiBSaXZUYWJsZS5Tb3VyY2U8UiwgQywgRiwgRz4sXG4gIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gIGRlZmF1bHRDb2x1bW5TdGF0ZTogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSxcbik6IEFzeW5jR2VuZXJhdG9yPHtcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgZWZmZWN0OiBSaXZUYWJsZS5FZmZlY3QgfCBudWxsO1xufT4ge1xuICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gICAgY2FzZSAnbG9hZCc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoc3RhdGUsIHNvdXJjZSwgYWN0aW9uKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ29yZGVyQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIG9yZGVyOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgICAgbW9zdFJlY2VudGx5U2VsZWN0ZWQ6IG51bGwsXG4gICAgICAgICAgICBtb2RlOiAnaW5jbHVkZScsXG4gICAgICAgICAgICBpbmNsdWRlZDogbmV3IFNldCgpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ29yZGVyQ29sdW1uVG9nZ2xlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAgVGFibGVPcmRlckhlbHBlcnMudG9nZ2xlQ29sdW1uT3JkZXIoc3RhdGUsIGFjdGlvbi5jb2x1bW4pLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWFyY2hDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgc2VhcmNoOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbGxhcHNlU3RhdGU6IHtcbiAgICAgICAgICAgIGRlZmF1bHRUbzogJ2V4cGFuZGVkJyxcbiAgICAgICAgICAgIGNvbGxhcHNlZEhlYWRlcnM6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIGNvbGxhcHNlZFJvd3M6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWFyY2hDb2x1bW5zQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaENvbHVtbnM6IG5ldyBNYXAoW1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5zZWFyY2hDb2x1bW5zLFxuICAgICAgICAgICAgICAuLi5hY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLFxuICAgICAgICAgICAgICBwYWdlOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgICAgbW9zdFJlY2VudGx5U2VsZWN0ZWQ6IG51bGwsXG4gICAgICAgICAgICBtb2RlOiAnaW5jbHVkZScsXG4gICAgICAgICAgICBpbmNsdWRlZDogbmV3IFNldCgpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29sbGFwc2VTdGF0ZToge1xuICAgICAgICAgICAgZGVmYXVsdFRvOiAnZXhwYW5kZWQnLFxuICAgICAgICAgICAgY29sbGFwc2VkSGVhZGVyczogbmV3IFNldCgpLFxuICAgICAgICAgICAgY29sbGFwc2VkUm93czogbmV3IFNldCgpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3BhZ2luYXRpb25DaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgcGFnaW5hdGlvbjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ3JvdXBpbmdDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZ3JvdXBpbmc6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3ByZXZpb3VzUGFnZU5hdmlnYXRlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQcmV2aW91c1BhZ2Uoc3RhdGUpID8/IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ25leHRQYWdlTmF2aWdhdGUnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLFxuICAgICAgICAgICAgICBwYWdlOlxuICAgICAgICAgICAgICAgIFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0TmV4dFBhZ2Uoc3RhdGUpID8/XG4gICAgICAgICAgICAgICAgVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQYWdlQ291bnQoc3RhdGUpIC0gMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncGFnZUNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IGFjdGlvbi5wYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwYWdlU2l6ZUNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2VTaXplOiBhY3Rpb24uc2l6ZSxcbiAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmlsdGVyc0NoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBmaWx0ZXJzOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbGxhcHNlU3RhdGU6IHtcbiAgICAgICAgICAgIGRlZmF1bHRUbzogJ2V4cGFuZGVkJyxcbiAgICAgICAgICAgIGNvbGxhcHNlZEhlYWRlcnM6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIGNvbGxhcHNlZFJvd3M6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaWx0ZXJBZGQnOlxuICAgICAgLy8gUGFyZW50IGNvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3Igc3Vic2NyaWJpbmcgYW5kIGFkZGluZyB0aGUgZmlsdGVyXG4gICAgICB5aWVsZCB7IHN0YXRlOiB7IC4uLnN0YXRlIH0sIGVmZmVjdDogbnVsbCB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29sdW1uU2V0dGluZ3NDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nczogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gZG8gbm90IG91dHB1dCBjaGFuZ2VzIHdoZW4gdHJpZ2dlcmVkIGZyb20gdGhlIG91dHNpZGUgd29ybGRcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtblBpbkNoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZUNvbHVtbkhlbHBlcnMuY2hhbmdlQ29sdW1uUGluKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24uY29sdW1uLFxuICAgICAgICAgIGFjdGlvbi5waW5uZWQsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29sdW1uc0ZyZWV6ZVVwVG9DaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLmNoYW5nZUNvbHVtbnNGcmVlemVTdGF0ZShcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLmluZGV4LFxuICAgICAgICAgIGFjdGlvbi5mcmVlemUsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29sdW1uT3JkZXJDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLmNoYW5nZUNvbHVtbk9yZGVyKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24ucHJldmlvdXNJbmRleCxcbiAgICAgICAgICBhY3Rpb24ubmV3SW5kZXgsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29sdW1uTW92ZVRvQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5tb3ZlQ29sdW1uVG8oXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGFjdGlvbi5jb2x1bW4sXG4gICAgICAgICAgYWN0aW9uLnBvc2l0aW9uLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbkVuYWJsZWRDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLmNoYW5nZUNvbHVtbkVuYWJsZWQoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGFjdGlvbi5jb2x1bW4sXG4gICAgICAgICAgYWN0aW9uLmVuYWJsZWQsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZW5hYmxlQWxsQ29sdW1uc0NoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZUNvbHVtbkhlbHBlcnMuZW5hYmxlQWxsQ29sdW1ucyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLmVuYWJsZWQsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29sdW1uV2lkdGhDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLmNoYW5nZUNvbHVtbldpZHRoKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24uY29sdW1uLFxuICAgICAgICAgIGFjdGlvbi5wcmVmZXJyZWRXaWR0aCxcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJyxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZXNldFRvRGVmYXVsdENvbHVtbnMnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLnJlc2V0VG9EZWZhdWx0Q29sdW1ucyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgZGVmYXVsdENvbHVtblN0YXRlLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdGlvbkNoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgc2VsZWN0aW9uOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgfSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3Jvd1NlbGVjdGVkQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlU2VsZWN0aW9uSGVscGVycy5zZXRSb3dTZWxlY3RlZChcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBhY3Rpb24uaWQsXG4gICAgICAgICAgYWN0aW9uLnNlbGVjdGVkLFxuICAgICAgICAgIGFjdGlvbi5jb250aWd1b3VzLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncGFnZVNlbGVjdGVkQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlU2VsZWN0aW9uSGVscGVycy50b2dnbGVQYWdlU2VsZWN0ZWQoc3RhdGUpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWxsU2VsZWN0ZWRDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVTZWxlY3Rpb25IZWxwZXJzLnRvZ2dsZUFsbFNlbGVjdGVkKHN0YXRlKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3NlbGVjdGlvbkNsZWFyJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlU2VsZWN0aW9uSGVscGVycy5jbGVhclNlbGVjdGlvbihzdGF0ZSksXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdncm91cFNlbGVjdGlvbkNoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMudG9nZ2xlR3JvdXBTZWxlY3RlZChzdGF0ZSwgYWN0aW9uLnBheWxvYWQpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ3JvdXBzUGVyUGFnZUNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBncm91cGluZzoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5ncm91cGluZyxcbiAgICAgICAgICAgICAgZ3JvdXBzUGVyUGFnZTogYWN0aW9uLmdyb3Vwc1BlclBhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvdW50UGVyR3JvdXBDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuZ3JvdXBpbmcsXG4gICAgICAgICAgICAgIGNvdW50UGVyR3JvdXA6IGFjdGlvbi5jb3VudFBlckdyb3VwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2aWV3TW9yZUtleUNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBncm91cGluZzoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5ncm91cGluZyxcbiAgICAgICAgICAgICAgdmlld01vcmVLZXk6IGFjdGlvbi52aWV3TW9yZUtleSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9nZ2xlQWxsU2VhcmNoQ29sdW1ucyc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIFRhYmxlU2VhcmNoSGVscGVycy50b2dnbGVBbGxTZWFyY2hDb2x1bW5zKHN0YXRlKSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9nZ2xlUm93Q29sbGFwc2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2xsYXBzZUhlbHBlcnMudG9nZ2xlUm93Q29sbGFwc2Uoc3RhdGUsIGFjdGlvbi5pZCksXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICd0b2dnbGVIZWFkZXJDb2xsYXBzZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZUNvbGxhcHNlSGVscGVycy50b2dnbGVIZWFkZXJDb2xsYXBzZShzdGF0ZSwgYWN0aW9uLmlkKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvZ2dsZUFsbENvbGxhcHNlZCc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZUNvbGxhcHNlSGVscGVycy50b2dnbGVBbGxDb2xsYXBzZWQoc3RhdGUpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gIH1cbn1cbiJdfQ==