@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,367 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ContentChild, HostListener, Input, } from '@angular/core';
2
- import { sum } from 'lodash';
3
- import { combineLatest, map, Subject, takeUntil } from 'rxjs';
4
- import { RivTableClipboard } from '../clipboard';
5
- import { RivTable } from '../state';
6
- import { TableResultHelpers } from '../state-helpers/result-helpers';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common";
9
- import * as i2 from "@angular/router";
10
- import * as i3 from "../../../input/button/button.component";
11
- import * as i4 from "../../../overlay/callout/callout.component";
12
- import * as i5 from "../../../input/checkbox/checkbox.component";
13
- import * as i6 from "../../../icon/icon.component";
14
- import * as i7 from "../../../navigation/link/link.component";
15
- import * as i8 from "../../../load/loading-cover/loading-cover.component";
16
- import * as i9 from "../../../overlay/callout/menu/menu.component";
17
- import * as i10 from "../../../overlay/callout/menu/menu-item/menu-item.component";
18
- import * as i11 from "../../../overlay/overlay.directive";
19
- import * as i12 from "../../../input/simple-select/simple-select.component";
20
- import * as i13 from "../../../size/size.directive";
21
- import * as i14 from "../../../accessibility/sr-only/sr-only.component";
22
- import * as i15 from "../table-header-resize-handle/table-header-resize-handle.component";
23
- import * as i16 from "../../../visualization/zero-state/zero-state.component";
24
- import * as i17 from "../../../format/pipes/number.pipe";
25
- export class TableComponent {
26
- constructor(elementRef, zone) {
27
- this.elementRef = elementRef;
28
- this.zone = zone;
29
- this.destroy = new Subject();
30
- this.containerSize = new Subject();
31
- this.selectionCalloutPosition = this.containerSize.pipe(map(rect => new DOMRect(rect.x + 44, rect.y - 12, 0, 0)));
32
- this.hoveredRow = null;
33
- this.rowHoverCleanup = null;
34
- // We only care about when we have entered a drop zone for applying our visual
35
- // treatment. However, in order to trigger the drop event, you must call preventDefault
36
- // on the dragover. We are handling this natively on the document, outside of angular
37
- // as a performance optimization. If we have a draggedOverColumnIdx and we drag over an
38
- // element with class drop-zone, we will assume you want to the drop element enabled
39
- // and we will preventDefault.
40
- this.handleDragOver = (event) => {
41
- const target = event.target;
42
- if (this.draggedOverColumnIdx != null && target.closest('.drop-zone')) {
43
- event.preventDefault();
44
- }
45
- };
46
- this.pageSizeOptions = [
47
- {
48
- options: RivTable.pageSizes.map(pageSize => ({
49
- id: pageSize.toString(),
50
- title: pageSize.toString(),
51
- value: pageSize,
52
- })),
53
- },
54
- ];
55
- this.trackByRow = (_, row) => row.id;
56
- this.trackByGroup = (_, group) => group.groupData.key;
57
- this.trackByNestedRow = (_, row) => row.id;
58
- this.trackByNestedHeader = (_, row) => row.id;
59
- this.trackByColumn = (_, column) => column.key;
60
- this.temporaryWidths = new Map();
61
- this.draggedColumnIdx = null;
62
- this.draggedColumnKey = null;
63
- this.draggedOverColumnIdx = null;
64
- this.shift = false;
65
- this.isRegularResult = (TableResultHelpers.isRegularResult);
66
- this.isGroupResult = (TableResultHelpers.isGroupResult);
67
- this.isNestedResult = (TableResultHelpers.isNestedResult);
68
- }
69
- ngAfterViewInit() {
70
- combineLatest([this.manager.state, this.containerSize])
71
- .pipe(takeUntil(this.destroy))
72
- .subscribe(([state, containerSize]) => {
73
- const containerWidth = containerSize.width;
74
- const totalFrozenWidth = sum(state.display.columns.filter(c => c.pinned).map(c => c.width));
75
- if (totalFrozenWidth > containerWidth) {
76
- // Check how many columns can be pinned without overflowing.
77
- for (const [i] of state.display.columns
78
- .filter(c => c.pinned)
79
- .entries()) {
80
- const slicedFrozenWidth = sum(state.display.columns.slice(0, i + 1).map(c => c.width));
81
- if (slicedFrozenWidth > containerWidth) {
82
- this.manager?.actions.next({
83
- type: 'columnsFreezeUpToChange',
84
- index: i - 1,
85
- freeze: i > 0,
86
- });
87
- break;
88
- }
89
- }
90
- }
91
- });
92
- document.addEventListener('dragover', this.handleDragOver);
93
- this.setupRowSpanHover();
94
- }
95
- ngOnDestroy() {
96
- document.removeEventListener('dragover', this.handleDragOver);
97
- this.rowHoverCleanup?.();
98
- this.destroy.next(null);
99
- }
100
- setWidth(column, width) {
101
- if (width === null) {
102
- const temporaryWidth = this.temporaryWidths.get(column);
103
- if (temporaryWidth) {
104
- this.manager?.actions.next({
105
- type: 'columnWidthChange',
106
- column,
107
- preferredWidth: temporaryWidth,
108
- });
109
- }
110
- this.temporaryWidths.delete(column);
111
- }
112
- else {
113
- this.temporaryWidths.set(column, width);
114
- }
115
- }
116
- getWidth(column) {
117
- if (this.temporaryWidths.has(column.key)) {
118
- return Math.max(this.temporaryWidths.get(column.key), column.minWidth);
119
- }
120
- else {
121
- return column.width;
122
- }
123
- }
124
- dragStart(idx, key) {
125
- this.draggedColumnIdx = idx;
126
- this.draggedColumnKey = key;
127
- }
128
- dragOver(ontoIdx) {
129
- this.draggedOverColumnIdx = ontoIdx;
130
- }
131
- drop(ontoIdx, enabledColumnCount) {
132
- if (this.draggedColumnIdx !== null) {
133
- this.manager?.actions.next({
134
- type: 'columnOrderChange',
135
- previousIndex: this.draggedColumnIdx,
136
- newIndex: ontoIdx,
137
- source: 'tableDrag',
138
- column: this.draggedColumnKey || undefined,
139
- });
140
- const enabled = ontoIdx < enabledColumnCount;
141
- this.dropEnabledState(enabled, enabledColumnCount);
142
- this.draggedOverColumnIdx = null;
143
- this.draggedColumnKey = null;
144
- }
145
- }
146
- dropEnabledState(enabled, enabledColumnCount) {
147
- if (this.draggedColumnKey !== null && this.draggedColumnIdx !== null) {
148
- const isEnabled = enabledColumnCount > this.draggedColumnIdx;
149
- const shouldFire = enabled ? !isEnabled : isEnabled;
150
- if (shouldFire) {
151
- this.manager?.actions.next({
152
- type: 'columnEnabledChange',
153
- column: this.draggedColumnKey,
154
- enabled: enabled,
155
- source: 'dragDrop',
156
- });
157
- }
158
- this.draggedOverColumnIdx = null;
159
- this.draggedColumnKey = null;
160
- }
161
- }
162
- getErrorMessage(e) {
163
- if (e instanceof Error)
164
- return e.message;
165
- if (typeof e === 'string')
166
- return e;
167
- if (typeof e === 'object' && e !== null)
168
- return e.toString();
169
- else
170
- return 'An error occurred.';
171
- }
172
- keyDown(event) {
173
- this.shift = event.shiftKey;
174
- }
175
- keyUp(event) {
176
- this.shift = event.shiftKey;
177
- }
178
- // Rows with links render as `<a class="row-link">` rather than `<tr>`, which
179
- // the browser does not serialize as a table row. Copying is handled on the
180
- // document because a select-all dispatches the event from the selection root
181
- // rather than from within the table.
182
- onCopy(event) {
183
- const selection = document.getSelection();
184
- if (!event.clipboardData ||
185
- !selection ||
186
- selection.isCollapsed ||
187
- RivTableClipboard.isEditable(event.target))
188
- return;
189
- const ranges = Array.from({ length: selection.rangeCount }, (_, i) => selection.getRangeAt(i));
190
- const isSelected = (node) => ranges.some(range => range.intersectsNode(node));
191
- const host = this.elementRef.nativeElement;
192
- if (!RivTableClipboard.ownsSelection(host, isSelected))
193
- return;
194
- const payload = RivTableClipboard.extract(
195
- // A grouped table renders one table per group, and a cell may hold a
196
- // nested table that serializes itself.
197
- Array.from(host.querySelectorAll('table')).filter(table => table.closest(host.localName) === host), isSelected,
198
- // Where the drag started and ended, which narrows the copy to the dragged
199
- // columns rather than every column the range passes through.
200
- [selection.anchorNode, selection.focusNode]);
201
- if (!payload)
202
- return;
203
- event.clipboardData.setData('text/plain', payload.text);
204
- event.clipboardData.setData('text/html', payload.html);
205
- event.preventDefault();
206
- }
207
- selectionChange(rowId, selected) {
208
- this.manager?.actions.next({
209
- type: 'rowSelectedChange',
210
- id: rowId,
211
- selected,
212
- contiguous: this.shift,
213
- });
214
- }
215
- toggleRowCollapse(rowId) {
216
- this.manager?.actions.next({
217
- type: 'toggleRowCollapse',
218
- id: rowId,
219
- });
220
- }
221
- toggleHeaderCollapse(headerId) {
222
- this.manager?.actions.next({
223
- type: 'toggleHeaderCollapse',
224
- id: headerId,
225
- });
226
- }
227
- handleClick(event, column) {
228
- if (column.clickPreventDefault)
229
- event.preventDefault();
230
- if (column.clickStopPropagation)
231
- event.stopPropagation();
232
- }
233
- isExternalRowLink(rowLink) {
234
- return rowLink.type === 'external';
235
- }
236
- isInternalRowLink(rowLink) {
237
- return rowLink.type === 'internal';
238
- }
239
- // Returns true if this is the right row + column to display a chevron, when nesting rows
240
- showChevronForCell(columnIndex, hasSubRows, depth) {
241
- // Only show the chevron on rows with subrows
242
- if (!hasSubRows) {
243
- return false;
244
- }
245
- /*
246
- Only show the chevron on the column matching the level of nesting:
247
- v Payer
248
- v Code
249
- */
250
- if (columnIndex != depth) {
251
- return false;
252
- }
253
- return true;
254
- }
255
- // When we are nesting rows, we don't want to show the parent's data in its children's rows
256
- blankCellDueToNesting(columnIndex, depth) {
257
- /*
258
- Top-level row is 0 depth, and should have no columns blank.
259
- Second-level nested row is 1 depth, and should have the first column blank.
260
- Etc.
261
- */
262
- return columnIndex < depth;
263
- }
264
- showMenuOnColumnName(fullState, column) {
265
- return (column.orderable ||
266
- column.filterable ||
267
- this.columnCanFreeze(fullState, column) ||
268
- this.columnCanHide(fullState, column));
269
- }
270
- columnCanFreeze(fullState, column) {
271
- return fullState.display.columnsAreFreezable && !column.alwaysPinned;
272
- }
273
- columnCanHide(fullState, column) {
274
- return (fullState.display.columnsAreHideable &&
275
- !column.alwaysVisible &&
276
- !column.alwaysPinned);
277
- }
278
- setupRowSpanHover() {
279
- this.zone.runOutsideAngular(() => {
280
- const host = this.elementRef.nativeElement;
281
- const onMouseOver = (event) => {
282
- const row = event.target.closest('a.row-link, tbody > tr');
283
- if (row === this.hoveredRow)
284
- return;
285
- if (this.hoveredRow)
286
- this.clearRowSpanHover(this.hoveredRow);
287
- this.hoveredRow = row;
288
- if (row?.matches('a.row-link'))
289
- this.applyRowSpanHover(row);
290
- };
291
- const onMouseOut = (event) => {
292
- const related = event.relatedTarget?.closest('a.row-link, tbody > tr');
293
- if (!related || related !== this.hoveredRow) {
294
- if (this.hoveredRow)
295
- this.clearRowSpanHover(this.hoveredRow);
296
- this.hoveredRow = null;
297
- }
298
- };
299
- host.addEventListener('mouseover', onMouseOver);
300
- host.addEventListener('mouseout', onMouseOut);
301
- this.rowHoverCleanup = () => {
302
- host.removeEventListener('mouseover', onMouseOver);
303
- host.removeEventListener('mouseout', onMouseOut);
304
- };
305
- });
306
- }
307
- applyRowSpanHover(row) {
308
- this.forEachCoveringRowSpanCell(row, cell => cell.classList.add('rs-hover'));
309
- }
310
- clearRowSpanHover(row) {
311
- this.forEachCoveringRowSpanCell(row, cell => cell.classList.remove('rs-hover'));
312
- }
313
- forEachCoveringRowSpanCell(row, fn) {
314
- const tbody = row.closest('tbody');
315
- if (!tbody)
316
- return;
317
- const rows = Array.from(tbody.querySelectorAll(':scope > a.row-link, :scope > tr'));
318
- const rowIndex = rows.indexOf(row);
319
- if (rowIndex < 0)
320
- return;
321
- for (let i = 0; i < rowIndex; i++) {
322
- const cells = rows[i].querySelectorAll('td[rowspan]');
323
- cells.forEach(cell => {
324
- const span = parseInt(cell.getAttribute('rowspan') || '1', 10);
325
- if (span > 1 && i + span > rowIndex) {
326
- fn(cell);
327
- }
328
- });
329
- }
330
- }
331
- }
332
- TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
333
- TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "riv-table", inputs: { manager: "manager" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:copy": "onCopy($event)" } }, queries: [{ propertyName: "cellTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "summaryTemplate", first: true, predicate: ["summary"], descendants: true }, { propertyName: "menuTemplate", first: true, predicate: ["menu"], descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: ["selection"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: ["subheader"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"\n s.display.columnsAreReorderable && !column.alwaysPinned\n \"\n [attr.droppable]=\"!column.alwaysPinned\"\n [class.drop-zone]=\"!column.alwaysPinned\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i &&\n !column.alwaysPinned\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i &&\n !column.alwaysPinned\n \"\n >\n <div\n *ngIf=\"!showMenuOnColumnName(s, column)\"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </div>\n <riv-menu *ngIf=\"showMenuOnColumnName(s, column)\">\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <!-- We only show the divider when we will have an item both above and below the divider. -->\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (columnCanFreeze(s, column) ||\n columnCanHide(s, column))\n \"\n ></div>\n <ng-container *ngIf=\"columnCanFreeze(s, column)\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"columnCanHide(s, column)\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td class=\"toggle-body\">\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n <span class=\"toggle-header-text\">\n {{ headerRow.headerText }}\n </span>\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <ng-template #cellContent>\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <div\n *ngIf=\"\n showChevronForCell(\n columnIndex,\n hasSubRows,\n depth\n );\n else cellContent\n \"\n class=\"toggleable-cell-content\"\n >\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n <div class=\"toggleable-cell-value\">\n <ng-container\n *ngTemplateOutlet=\"cellContent\"\n ></ng-container>\n </div>\n </div>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n &hellip;\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n &hellip;\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body,td.toggle-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}.toggleable-cell-content{display:flex;align-items:center}.toggleable-cell-value{flex:1 1 auto;min-width:0}td.toggle-header{text-align:left}.toggle-header-text{position:sticky;z-index:1;left:calc(var(--size-xxlarge) + var(--size-small))}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: i4.CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: i5.CheckboxComponent, selector: "riv-checkbox", inputs: ["name", "identifier", "value", "checkedColorToken", "indeterminateColorToken", "checkboxTooltip", "indeterminate", "disabled", "required", "state", "errorMessage", "ariaLabel"], outputs: ["valueChange"] }, { kind: "component", type: i6.IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: i7.LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "component", type: i8.LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "zIndexOverride", "errorMessage"] }, { kind: "component", type: i9.MenuComponent, selector: "riv-menu", inputs: ["preferredPosition", "disabled"] }, { kind: "component", type: i10.MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "directive", type: i11.OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: i12.SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: i13.SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: i14.SrOnlyComponent, selector: "riv-sr-only" }, { kind: "component", type: i15.TableHeaderResizeHandleComponent, selector: "riv-table-header-resize-handle", outputs: ["dragResize"] }, { kind: "component", type: i16.ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i17.NumberPipe, name: "rivNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
334
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, decorators: [{
335
- type: Component,
336
- args: [{ selector: 'riv-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"\n s.display.columnsAreReorderable && !column.alwaysPinned\n \"\n [attr.droppable]=\"!column.alwaysPinned\"\n [class.drop-zone]=\"!column.alwaysPinned\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i &&\n !column.alwaysPinned\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i &&\n !column.alwaysPinned\n \"\n >\n <div\n *ngIf=\"!showMenuOnColumnName(s, column)\"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </div>\n <riv-menu *ngIf=\"showMenuOnColumnName(s, column)\">\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <!-- We only show the divider when we will have an item both above and below the divider. -->\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (columnCanFreeze(s, column) ||\n columnCanHide(s, column))\n \"\n ></div>\n <ng-container *ngIf=\"columnCanFreeze(s, column)\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"columnCanHide(s, column)\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td class=\"toggle-body\">\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n <span class=\"toggle-header-text\">\n {{ headerRow.headerText }}\n </span>\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <ng-template #cellContent>\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <div\n *ngIf=\"\n showChevronForCell(\n columnIndex,\n hasSubRows,\n depth\n );\n else cellContent\n \"\n class=\"toggleable-cell-content\"\n >\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n <div class=\"toggleable-cell-value\">\n <ng-container\n *ngTemplateOutlet=\"cellContent\"\n ></ng-container>\n </div>\n </div>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n &hellip;\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n &hellip;\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body,td.toggle-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}.toggleable-cell-content{display:flex;align-items:center}.toggleable-cell-value{flex:1 1 auto;min-width:0}td.toggle-header{text-align:left}.toggle-header-text{position:sticky;z-index:1;left:calc(var(--size-xxlarge) + var(--size-small))}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"] }]
337
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { manager: [{
338
- type: Input
339
- }], cellTemplate: [{
340
- type: ContentChild,
341
- args: ['cell']
342
- }], summaryTemplate: [{
343
- type: ContentChild,
344
- args: ['summary']
345
- }], menuTemplate: [{
346
- type: ContentChild,
347
- args: ['menu']
348
- }], selectionTemplate: [{
349
- type: ContentChild,
350
- args: ['selection']
351
- }], headerTemplate: [{
352
- type: ContentChild,
353
- args: ['header']
354
- }], subheaderTemplate: [{
355
- type: ContentChild,
356
- args: ['subheader']
357
- }], keyDown: [{
358
- type: HostListener,
359
- args: ['document:keydown', ['$event']]
360
- }], keyUp: [{
361
- type: HostListener,
362
- args: ['document:keyup', ['$event']]
363
- }], onCopy: [{
364
- type: HostListener,
365
- args: ['document:copy', ['$event']]
366
- }] } });
367
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcml2L3NyYy9saWIvdGFibGUvdGFibGUvdGFibGUvdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixLQUFLLEdBS04sTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBY3JFLE1BQU0sT0FBTyxjQUFjO0lBT3pCLFlBQW9CLFVBQXNCLEVBQVUsSUFBWTtRQUE1QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsU0FBSSxHQUFKLElBQUksQ0FBUTtRQStCdkQsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFeEIsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ3ZDLDZCQUF3QixHQUMvQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFB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O3VCQUFDLFdBQVc7Z0JBSXpCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxRQUFRO2dCQUl0QixpQkFBaUI7c0JBRGhCLFlBQVk7dUJBQUMsV0FBVztnQkFpTHpCLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFNNUMsS0FBSztzQkFESixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVUxQyxNQUFNO3NCQURMLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgQ29udGVudENoaWxkLFxuICBFbGVtZW50UmVmLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgVGVtcGxhdGVSZWYsXG4gIFRyYWNrQnlGdW5jdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBzdW0gfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgbWFwLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFJpdlNlbGVjdCB9IGZyb20gJy4uLy4uLy4uL2lucHV0L3NlbGVjdC9zdGF0ZSc7XG5pbXBvcnQgeyBSaXZUYWJsZUNsaXBib2FyZCB9IGZyb20gJy4uL2NsaXBib2FyZCc7XG5pbXBvcnQgeyBSaXZUYWJsZSB9IGZyb20gJy4uL3N0YXRlJztcbmltcG9ydCB7IFRhYmxlUmVzdWx0SGVscGVycyB9IGZyb20gJy4uL3N0YXRlLWhlbHBlcnMvcmVzdWx0LWhlbHBlcnMnO1xuXG50eXBlIFBhZ2VTaXplT3B0aW9uID0ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB2YWx1ZTogbnVtYmVyO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncml2LXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFibGUuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGFibGVDb21wb25lbnQ8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAgPSB7IGtleTogJycgfSxcbj4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3lcbntcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHpvbmU6IE5nWm9uZSkge31cblxuICBASW5wdXQoKVxuICBtYW5hZ2VyPzogUml2VGFibGUuTWFuYWdlcjxSLCBDLCBGLCBHPjtcblxuICBAQ29udGVudENoaWxkKCdjZWxsJylcbiAgY2VsbFRlbXBsYXRlPzogVGVtcGxhdGVSZWY8e1xuICAgIHJvdzogUjtcbiAgICBjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz47XG4gIH0+O1xuXG4gIEBDb250ZW50Q2hpbGQoJ3N1bW1hcnknKVxuICBzdW1tYXJ5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7XG4gICAgY29sdW1uOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+O1xuICB9PjtcblxuICBAQ29udGVudENoaWxkKCdtZW51JylcbiAgbWVudVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8eyByb3c6IFJpdlRhYmxlLkZ1bGxSb3c8Uj4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnc2VsZWN0aW9uJylcbiAgc2VsZWN0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IHN0YXRlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnaGVhZGVyJylcbiAgaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7IHN0YXRlOiBSaXZUYWJsZS5GdWxsU3RhdGU8UiwgQywgRiwgRz4gfT47XG5cbiAgQENvbnRlbnRDaGlsZCgnc3ViaGVhZGVyJylcbiAgc3ViaGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx7XG4gICAgc3RhdGU6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICBncm91cDogUml2VGFibGUuUm93R3JvdXA8UiwgRz47XG4gIH0+O1xuXG4gIHJlYWRvbmx5IGRlc3Ryb3kgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHJlYWRvbmx5IGNvbnRhaW5lclNpemUgPSBuZXcgU3ViamVjdDxET01SZWN0PigpO1xuICByZWFkb25seSBzZWxlY3Rpb25DYWxsb3V0UG9zaXRpb246IE9ic2VydmFibGU8RE9NUmVjdD4gPVxuICAgIHRoaXMuY29udGFpbmVyU2l6ZS5waXBlKFxuICAgICAgbWFwKHJlY3QgPT4gbmV3IERPTVJlY3QocmVjdC54ICsgNDQsIHJlY3QueSAtIDEyLCAwLCAwKSksXG4gICAgKTtcblxuICBwcml2YXRlIGhvdmVyZWRSb3c6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcm93SG92ZXJDbGVhbnVwOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgY29tYmluZUxhdGVzdChbdGhpcy5tYW5hZ2VyIS5zdGF0ZSwgdGhpcy5jb250YWluZXJTaXplXSlcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kpKVxuICAgICAgLnN1YnNjcmliZSgoW3N0YXRlLCBjb250YWluZXJTaXplXSkgPT4ge1xuICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGNvbnRhaW5lclNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHRvdGFsRnJvemVuV2lkdGggPSBzdW0oXG4gICAgICAgICAgc3RhdGUuZGlzcGxheS5jb2x1bW5zLmZpbHRlcihjID0+IGMucGlubmVkKS5tYXAoYyA9PiBjLndpZHRoKSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRvdGFsRnJvemVuV2lkdGggPiBjb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIC8vIENoZWNrIGhvdyBtYW55IGNvbHVtbnMgY2FuIGJlIHBpbm5lZCB3aXRob3V0IG92ZXJmbG93aW5nLlxuICAgICAgICAgIGZvciAoY29uc3QgW2ldIG9mIHN0YXRlLmRpc3BsYXkuY29sdW1uc1xuICAgICAgICAgICAgLmZpbHRlcihjID0+IGMucGlubmVkKVxuICAgICAgICAgICAgLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3Qgc2xpY2VkRnJvemVuV2lkdGggPSBzdW0oXG4gICAgICAgICAgICAgIHN0YXRlLmRpc3BsYXkuY29sdW1ucy5zbGljZSgwLCBpICsgMSkubWFwKGMgPT4gYy53aWR0aCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHNsaWNlZEZyb3plbldpZHRoID4gY29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZScsXG4gICAgICAgICAgICAgICAgaW5kZXg6IGkgLSAxLFxuICAgICAgICAgICAgICAgIGZyZWV6ZTogaSA+IDAsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCB0aGlzLmhhbmRsZURyYWdPdmVyKTtcbiAgICB0aGlzLnNldHVwUm93U3BhbkhvdmVyKCk7XG4gIH1cblxuICAvLyBXZSBvbmx5IGNhcmUgYWJvdXQgd2hlbiB3ZSBoYXZlIGVudGVyZWQgYSBkcm9wIHpvbmUgZm9yIGFwcGx5aW5nIG91ciB2aXN1YWxcbiAgLy8gdHJlYXRtZW50LiBIb3dldmVyLCBpbiBvcmRlciB0byB0cmlnZ2VyIHRoZSBkcm9wIGV2ZW50LCB5b3UgbXVzdCBjYWxsIHByZXZlbnREZWZhdWx0XG4gIC8vIG9uIHRoZSBkcmFnb3Zlci4gV2UgYXJlIGhhbmRsaW5nIHRoaXMgbmF0aXZlbHkgb24gdGhlIGRvY3VtZW50LCBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgLy8gYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24uIElmIHdlIGhhdmUgYSBkcmFnZ2VkT3ZlckNvbHVtbklkeCBhbmQgd2UgZHJhZyBvdmVyIGFuXG4gIC8vIGVsZW1lbnQgd2l0aCBjbGFzcyBkcm9wLXpvbmUsIHdlIHdpbGwgYXNzdW1lIHlvdSB3YW50IHRvIHRoZSBkcm9wIGVsZW1lbnQgZW5hYmxlZFxuICAvLyBhbmQgd2Ugd2lsbCBwcmV2ZW50RGVmYXVsdC5cbiAgaGFuZGxlRHJhZ092ZXIgPSAoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAodGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCAhPSBudWxsICYmIHRhcmdldC5jbG9zZXN0KCcuZHJvcC16b25lJykpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9O1xuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgdGhpcy5oYW5kbGVEcmFnT3Zlcik7XG4gICAgdGhpcy5yb3dIb3ZlckNsZWFudXA/LigpO1xuICAgIHRoaXMuZGVzdHJveS5uZXh0KG51bGwpO1xuICB9XG5cbiAgcmVhZG9ubHkgcGFnZVNpemVPcHRpb25zOiBSaXZTZWxlY3QuT3B0aW9uR3JvdXA8UGFnZVNpemVPcHRpb24+W10gPSBbXG4gICAge1xuICAgICAgb3B0aW9uczogUml2VGFibGUucGFnZVNpemVzLm1hcChwYWdlU2l6ZSA9PiAoe1xuICAgICAgICBpZDogcGFnZVNpemUudG9TdHJpbmcoKSxcbiAgICAgICAgdGl0bGU6IHBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiBwYWdlU2l6ZSxcbiAgICAgIH0pKSxcbiAgICB9LFxuICBdO1xuXG4gIHJlYWRvbmx5IHRyYWNrQnlSb3c6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5GdWxsUm93PFI+PiA9IChfLCByb3cpID0+XG4gICAgcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5R3JvdXA6IFRyYWNrQnlGdW5jdGlvbjxSaXZUYWJsZS5Sb3dHcm91cDxSLCBHPj4gPSAoXG4gICAgXyxcbiAgICBncm91cCxcbiAgKSA9PiBncm91cC5ncm91cERhdGEua2V5O1xuICByZWFkb25seSB0cmFja0J5TmVzdGVkUm93OiBUcmFja0J5RnVuY3Rpb248Uml2VGFibGUuRnVsbE5lc3RlZFJvdzxSPj4gPSAoXG4gICAgXyxcbiAgICByb3csXG4gICkgPT4gcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5TmVzdGVkSGVhZGVyOiBUcmFja0J5RnVuY3Rpb248XG4gICAgUml2VGFibGUuRnVsbE5lc3RlZEhlYWRlclJvdzxSPlxuICA+ID0gKF8sIHJvdykgPT4gcm93LmlkO1xuICByZWFkb25seSB0cmFja0J5Q29sdW1uOiBUcmFja0J5RnVuY3Rpb248Uml2VGFibGUuRnVsbENvbHVtbjxDPj4gPSAoXG4gICAgXyxcbiAgICBjb2x1bW4sXG4gICkgPT4gY29sdW1uLmtleTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBvcmFyeVdpZHRoczogTWFwPEMsIG51bWJlcj4gPSBuZXcgTWFwKCk7XG4gIHNldFdpZHRoKGNvbHVtbjogQywgd2lkdGg6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAod2lkdGggPT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeVdpZHRoID0gdGhpcy50ZW1wb3JhcnlXaWR0aHMuZ2V0KGNvbHVtbik7XG4gICAgICBpZiAodGVtcG9yYXJ5V2lkdGgpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5XaWR0aENoYW5nZScsXG4gICAgICAgICAgY29sdW1uLFxuICAgICAgICAgIHByZWZlcnJlZFdpZHRoOiB0ZW1wb3JhcnlXaWR0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aGlzLnRlbXBvcmFyeVdpZHRocy5kZWxldGUoY29sdW1uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50ZW1wb3JhcnlXaWR0aHMuc2V0KGNvbHVtbiwgd2lkdGgpO1xuICAgIH1cbiAgfVxuICBnZXRXaWR0aChjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnRlbXBvcmFyeVdpZHRocy5oYXMoY29sdW1uLmtleSkpIHtcbiAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnRlbXBvcmFyeVdpZHRocy5nZXQoY29sdW1uLmtleSkhLCBjb2x1bW4ubWluV2lkdGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29sdW1uLndpZHRoO1xuICAgIH1cbiAgfVxuXG4gIGRyYWdnZWRDb2x1bW5JZHg6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBkcmFnZ2VkQ29sdW1uS2V5OiBDIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdnZWRPdmVyQ29sdW1uSWR4OiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBkcmFnU3RhcnQoaWR4OiBudW1iZXIsIGtleTogQykge1xuICAgIHRoaXMuZHJhZ2dlZENvbHVtbklkeCA9IGlkeDtcbiAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBrZXk7XG4gIH1cblxuICBkcmFnT3ZlcihvbnRvSWR4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRyYWdnZWRPdmVyQ29sdW1uSWR4ID0gb250b0lkeDtcbiAgfVxuXG4gIGRyb3Aob250b0lkeDogbnVtYmVyLCBlbmFibGVkQ29sdW1uQ291bnQ6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRyYWdnZWRDb2x1bW5JZHggIT09IG51bGwpIHtcbiAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbk9yZGVyQ2hhbmdlJyxcbiAgICAgICAgcHJldmlvdXNJbmRleDogdGhpcy5kcmFnZ2VkQ29sdW1uSWR4LFxuICAgICAgICBuZXdJbmRleDogb250b0lkeCxcbiAgICAgICAgc291cmNlOiAndGFibGVEcmFnJyxcbiAgICAgICAgY29sdW1uOiB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgfHwgdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBlbmFibGVkID0gb250b0lkeCA8IGVuYWJsZWRDb2x1bW5Db3VudDtcbiAgICAgIHRoaXMuZHJvcEVuYWJsZWRTdGF0ZShlbmFibGVkLCBlbmFibGVkQ29sdW1uQ291bnQpO1xuICAgICAgdGhpcy5kcmFnZ2VkT3ZlckNvbHVtbklkeCA9IG51bGw7XG4gICAgICB0aGlzLmRyYWdnZWRDb2x1bW5LZXkgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGRyb3BFbmFibGVkU3RhdGUoZW5hYmxlZDogYm9vbGVhbiwgZW5hYmxlZENvbHVtbkNvdW50OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kcmFnZ2VkQ29sdW1uS2V5ICE9PSBudWxsICYmIHRoaXMuZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgaXNFbmFibGVkID0gZW5hYmxlZENvbHVtbkNvdW50ID4gdGhpcy5kcmFnZ2VkQ29sdW1uSWR4O1xuICAgICAgY29uc3Qgc2hvdWxkRmlyZSA9IGVuYWJsZWQgPyAhaXNFbmFibGVkIDogaXNFbmFibGVkO1xuICAgICAgaWYgKHNob3VsZEZpcmUpIHtcbiAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgICAgIHR5cGU6ICdjb2x1bW5FbmFibGVkQ2hhbmdlJyxcbiAgICAgICAgICBjb2x1bW46IHRoaXMuZHJhZ2dlZENvbHVtbktleSxcbiAgICAgICAgICBlbmFibGVkOiBlbmFibGVkLFxuICAgICAgICAgIHNvdXJjZTogJ2RyYWdEcm9wJyxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHJhZ2dlZE92ZXJDb2x1bW5JZHggPSBudWxsO1xuICAgICAgdGhpcy5kcmFnZ2VkQ29sdW1uS2V5ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZTogdW5rbm93bik6IHN0cmluZyB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikgcmV0dXJuIGUubWVzc2FnZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSByZXR1cm4gZTtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdvYmplY3QnICYmIGUgIT09IG51bGwpIHJldHVybiBlLnRvU3RyaW5nKCk7XG4gICAgZWxzZSByZXR1cm4gJ0FuIGVycm9yIG9jY3VycmVkLic7XG4gIH1cblxuICBwcml2YXRlIHNoaWZ0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIGtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICB0aGlzLnNoaWZ0ID0gZXZlbnQuc2hpZnRLZXk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXl1cCcsIFsnJGV2ZW50J10pXG4gIGtleVVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgdGhpcy5zaGlmdCA9IGV2ZW50LnNoaWZ0S2V5O1xuICB9XG5cbiAgLy8gUm93cyB3aXRoIGxpbmtzIHJlbmRlciBhcyBgPGEgY2xhc3M9XCJyb3ctbGlua1wiPmAgcmF0aGVyIHRoYW4gYDx0cj5gLCB3aGljaFxuICAvLyB0aGUgYnJvd3NlciBkb2VzIG5vdCBzZXJpYWxpemUgYXMgYSB0YWJsZSByb3cuIENvcHlpbmcgaXMgaGFuZGxlZCBvbiB0aGVcbiAgLy8gZG9jdW1lbnQgYmVjYXVzZSBhIHNlbGVjdC1hbGwgZGlzcGF0Y2hlcyB0aGUgZXZlbnQgZnJvbSB0aGUgc2VsZWN0aW9uIHJvb3RcbiAgLy8gcmF0aGVyIHRoYW4gZnJvbSB3aXRoaW4gdGhlIHRhYmxlLlxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjb3B5JywgWyckZXZlbnQnXSlcbiAgb25Db3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgIGlmIChcbiAgICAgICFldmVudC5jbGlwYm9hcmREYXRhIHx8XG4gICAgICAhc2VsZWN0aW9uIHx8XG4gICAgICBzZWxlY3Rpb24uaXNDb2xsYXBzZWQgfHxcbiAgICAgIFJpdlRhYmxlQ2xpcGJvYXJkLmlzRWRpdGFibGUoZXZlbnQudGFyZ2V0KVxuICAgIClcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IHJhbmdlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHNlbGVjdGlvbi5yYW5nZUNvdW50IH0sIChfLCBpKSA9PlxuICAgICAgc2VsZWN0aW9uLmdldFJhbmdlQXQoaSksXG4gICAgKTtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gKG5vZGU6IE5vZGUpID0+XG4gICAgICByYW5nZXMuc29tZShyYW5nZSA9PiByYW5nZS5pbnRlcnNlY3RzTm9kZShub2RlKSk7XG5cbiAgICBjb25zdCBob3N0OiBIVE1MRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghUml2VGFibGVDbGlwYm9hcmQub3duc1NlbGVjdGlvbihob3N0LCBpc1NlbGVjdGVkKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IFJpdlRhYmxlQ2xpcGJvYXJkLmV4dHJhY3QoXG4gICAgICAvLyBBIGdyb3VwZWQgdGFibGUgcmVuZGVycyBvbmUgdGFibGUgcGVyIGdyb3VwLCBhbmQgYSBjZWxsIG1heSBob2xkIGFcbiAgICAgIC8vIG5lc3RlZCB0YWJsZSB0aGF0IHNlcmlhbGl6ZXMgaXRzZWxmLlxuICAgICAgQXJyYXkuZnJvbShob3N0LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RhYmxlJykpLmZpbHRlcihcbiAgICAgICAgdGFibGUgPT4gdGFibGUuY2xvc2VzdChob3N0LmxvY2FsTmFtZSkgPT09IGhvc3QsXG4gICAgICApLFxuICAgICAgaXNTZWxlY3RlZCxcbiAgICAgIC8vIFdoZXJlIHRoZSBkcmFnIHN0YXJ0ZWQgYW5kIGVuZGVkLCB3aGljaCBuYXJyb3dzIHRoZSBjb3B5IHRvIHRoZSBkcmFnZ2VkXG4gICAgICAvLyBjb2x1bW5zIHJhdGhlciB0aGFuIGV2ZXJ5IGNvbHVtbiB0aGUgcmFuZ2UgcGFzc2VzIHRocm91Z2guXG4gICAgICBbc2VsZWN0aW9uLmFuY2hvck5vZGUsIHNlbGVjdGlvbi5mb2N1c05vZGVdLFxuICAgICk7XG4gICAgaWYgKCFwYXlsb2FkKSByZXR1cm47XG5cbiAgICBldmVudC5jbGlwYm9hcmREYXRhLnNldERhdGEoJ3RleHQvcGxhaW4nLCBwYXlsb2FkLnRleHQpO1xuICAgIGV2ZW50LmNsaXBib2FyZERhdGEuc2V0RGF0YSgndGV4dC9odG1sJywgcGF5bG9hZC5odG1sKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlKHJvd0lkOiBSWydpZCddLCBzZWxlY3RlZDogYm9vbGVhbikge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICdyb3dTZWxlY3RlZENoYW5nZScsXG4gICAgICBpZDogcm93SWQsXG4gICAgICBzZWxlY3RlZCxcbiAgICAgIGNvbnRpZ3VvdXM6IHRoaXMuc2hpZnQsXG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVSb3dDb2xsYXBzZShyb3dJZDogUlsnaWQnXSkge1xuICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucy5uZXh0KHtcbiAgICAgIHR5cGU6ICd0b2dnbGVSb3dDb2xsYXBzZScsXG4gICAgICBpZDogcm93SWQsXG4gICAgfSk7XG4gIH1cblxuICB0b2dnbGVIZWFkZXJDb2xsYXBzZShoZWFkZXJJZDogc3RyaW5nKSB7XG4gICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zLm5leHQoe1xuICAgICAgdHlwZTogJ3RvZ2dsZUhlYWRlckNvbGxhcHNlJyxcbiAgICAgIGlkOiBoZWFkZXJJZCxcbiAgICB9KTtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBjb2x1bW46IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz4pIHtcbiAgICBpZiAoY29sdW1uLmNsaWNrUHJldmVudERlZmF1bHQpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGNvbHVtbi5jbGlja1N0b3BQcm9wYWdhdGlvbikgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBpc0V4dGVybmFsUm93TGluayhcbiAgICByb3dMaW5rOiBSaXZUYWJsZS5Sb3dMaW5rLFxuICApOiByb3dMaW5rIGlzIFJpdlRhYmxlLkV4dGVybmFsUm93TGluayB7XG4gICAgcmV0dXJuIHJvd0xpbmsudHlwZSA9PT0gJ2V4dGVybmFsJztcbiAgfVxuXG4gIGlzSW50ZXJuYWxSb3dMaW5rKFxuICAgIHJvd0xpbms6IFJpdlRhYmxlLlJvd0xpbmssXG4gICk6IHJvd0xpbmsgaXMgUml2VGFibGUuSW50ZXJuYWxSb3dMaW5rIHtcbiAgICByZXR1cm4gcm93TGluay50eXBlID09PSAnaW50ZXJuYWwnO1xuICB9XG5cbiAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHJvdyArIGNvbHVtbiB0byBkaXNwbGF5IGEgY2hldnJvbiwgd2hlbiBuZXN0aW5nIHJvd3NcbiAgc2hvd0NoZXZyb25Gb3JDZWxsKFxuICAgIGNvbHVtbkluZGV4OiBudW1iZXIsXG4gICAgaGFzU3ViUm93czogYm9vbGVhbixcbiAgICBkZXB0aDogbnVtYmVyLFxuICApOiBib29sZWFuIHtcbiAgICAvLyBPbmx5IHNob3cgdGhlIGNoZXZyb24gb24gcm93cyB3aXRoIHN1YnJvd3NcbiAgICBpZiAoIWhhc1N1YlJvd3MpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLypcbiAgICAgIE9ubHkgc2hvdyB0aGUgY2hldnJvbiBvbiB0aGUgY29sdW1uIG1hdGNoaW5nIHRoZSBsZXZlbCBvZiBuZXN0aW5nOlxuICAgICAgdiBQYXllclxuICAgICAgICB2IENvZGVcbiAgICAqL1xuICAgIGlmIChjb2x1bW5JbmRleCAhPSBkZXB0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gV2hlbiB3ZSBhcmUgbmVzdGluZyByb3dzLCB3ZSBkb24ndCB3YW50IHRvIHNob3cgdGhlIHBhcmVudCdzIGRhdGEgaW4gaXRzIGNoaWxkcmVuJ3Mgcm93c1xuICBibGFua0NlbGxEdWVUb05lc3RpbmcoY29sdW1uSW5kZXg6IG51bWJlciwgZGVwdGg6IG51bWJlcikge1xuICAgIC8qXG4gICAgICBUb3AtbGV2ZWwgcm93IGlzIDAgZGVwdGgsIGFuZCBzaG91bGQgaGF2ZSBubyBjb2x1bW5zIGJsYW5rLlxuICAgICAgU2Vjb25kLWxldmVsIG5lc3RlZCByb3cgaXMgMSBkZXB0aCwgYW5kIHNob3VsZCBoYXZlIHRoZSBmaXJzdCBjb2x1bW4gYmxhbmsuXG4gICAgICBFdGMuXG4gICAgKi9cbiAgICByZXR1cm4gY29sdW1uSW5kZXggPCBkZXB0aDtcbiAgfVxuXG4gIHNob3dNZW51T25Db2x1bW5OYW1lKFxuICAgIGZ1bGxTdGF0ZTogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbjogUml2VGFibGUuRnVsbENvbHVtbjxDPixcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNvbHVtbi5vcmRlcmFibGUgfHxcbiAgICAgIGNvbHVtbi5maWx0ZXJhYmxlIHx8XG4gICAgICB0aGlzLmNvbHVtbkNhbkZyZWV6ZShmdWxsU3RhdGUsIGNvbHVtbikgfHxcbiAgICAgIHRoaXMuY29sdW1uQ2FuSGlkZShmdWxsU3RhdGUsIGNvbHVtbilcbiAgICApO1xuICB9XG5cbiAgY29sdW1uQ2FuRnJlZXplKFxuICAgIGZ1bGxTdGF0ZTogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbjogUml2VGFibGUuRnVsbENvbHVtbjxDPixcbiAgKSB7XG4gICAgcmV0dXJuIGZ1bGxTdGF0ZS5kaXNwbGF5LmNvbHVtbnNBcmVGcmVlemFibGUgJiYgIWNvbHVtbi5hbHdheXNQaW5uZWQ7XG4gIH1cblxuICBjb2x1bW5DYW5IaWRlKFxuICAgIGZ1bGxTdGF0ZTogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbjogUml2VGFibGUuRnVsbENvbHVtbjxDPixcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGZ1bGxTdGF0ZS5kaXNwbGF5LmNvbHVtbnNBcmVIaWRlYWJsZSAmJlxuICAgICAgIWNvbHVtbi5hbHdheXNWaXNpYmxlICYmXG4gICAgICAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwUm93U3BhbkhvdmVyKCkge1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBob3N0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGNvbnN0IG9uTW91c2VPdmVyID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdyA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXG4gICAgICAgICAgJ2Eucm93LWxpbmssIHRib2R5ID4gdHInLFxuICAgICAgICApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgaWYgKHJvdyA9PT0gdGhpcy5ob3ZlcmVkUm93KSByZXR1cm47XG4gICAgICAgIGlmICh0aGlzLmhvdmVyZWRSb3cpIHRoaXMuY2xlYXJSb3dTcGFuSG92ZXIodGhpcy5ob3ZlcmVkUm93KTtcbiAgICAgICAgdGhpcy5ob3ZlcmVkUm93ID0gcm93O1xuICAgICAgICBpZiAocm93Py5tYXRjaGVzKCdhLnJvdy1saW5rJykpIHRoaXMuYXBwbHlSb3dTcGFuSG92ZXIocm93KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uTW91c2VPdXQgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgcmVsYXRlZCA9IChldmVudC5yZWxhdGVkVGFyZ2V0IGFzIEhUTUxFbGVtZW50IHwgbnVsbCk/LmNsb3Nlc3QoXG4gICAgICAgICAgJ2Eucm93LWxpbmssIHRib2R5ID4gdHInLFxuICAgICAgICApIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgaWYgKCFyZWxhdGVkIHx8IHJlbGF0ZWQgIT09IHRoaXMuaG92ZXJlZFJvdykge1xuICAgICAgICAgIGlmICh0aGlzLmhvdmVyZWRSb3cpIHRoaXMuY2xlYXJSb3dTcGFuSG92ZXIodGhpcy5ob3ZlcmVkUm93KTtcbiAgICAgICAgICB0aGlzLmhvdmVyZWRSb3cgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBob3N0LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIG9uTW91c2VPdmVyKTtcbiAgICAgIGhvc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VvdXQnLCBvbk1vdXNlT3V0KTtcbiAgICAgIHRoaXMucm93SG92ZXJDbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICBob3N0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlb3ZlcicsIG9uTW91c2VPdmVyKTtcbiAgICAgICAgaG9zdC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW91dCcsIG9uTW91c2VPdXQpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlSb3dTcGFuSG92ZXIocm93OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuZm9yRWFjaENvdmVyaW5nUm93U3BhbkNlbGwocm93LCBjZWxsID0+XG4gICAgICBjZWxsLmNsYXNzTGlzdC5hZGQoJ3JzLWhvdmVyJyksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJSb3dTcGFuSG92ZXIocm93OiBIVE1MRWxlbWVudCkge1xuICAgIHRoaXMuZm9yRWFjaENvdmVyaW5nUm93U3BhbkNlbGwocm93LCBjZWxsID0+XG4gICAgICBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ3JzLWhvdmVyJyksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9yRWFjaENvdmVyaW5nUm93U3BhbkNlbGwoXG4gICAgcm93OiBIVE1MRWxlbWVudCxcbiAgICBmbjogKGNlbGw6IEhUTUxFbGVtZW50KSA9PiB2b2lkLFxuICApIHtcbiAgICBjb25zdCB0Ym9keSA9IHJvdy5jbG9zZXN0KCd0Ym9keScpO1xuICAgIGlmICghdGJvZHkpIHJldHVybjtcblxuICAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKFxuICAgICAgdGJvZHkucXVlcnlTZWxlY3RvckFsbCgnOnNjb3BlID4gYS5yb3ctbGluaywgOnNjb3BlID4gdHInKSxcbiAgICApO1xuICAgIGNvbnN0IHJvd0luZGV4ID0gcm93cy5pbmRleE9mKHJvdyk7XG4gICAgaWYgKHJvd0luZGV4IDwgMCkgcmV0dXJuO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dJbmRleDsgaSsrKSB7XG4gICAgICBjb25zdCBjZWxscyA9IHJvd3NbaV0ucXVlcnlTZWxlY3RvckFsbCgndGRbcm93c3Bhbl0nKTtcbiAgICAgIGNlbGxzLmZvckVhY2goY2VsbCA9PiB7XG4gICAgICAgIGNvbnN0IHNwYW4gPSBwYXJzZUludChjZWxsLmdldEF0dHJpYnV0ZSgncm93c3BhbicpIHx8ICcxJywgMTApO1xuICAgICAgICBpZiAoc3BhbiA+IDEgJiYgaSArIHNwYW4gPiByb3dJbmRleCkge1xuICAgICAgICAgIGZuKGNlbGwgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpc1JlZ3VsYXJSZXN1bHQgPSBUYWJsZVJlc3VsdEhlbHBlcnMuaXNSZWd1bGFyUmVzdWx0PFIsIEc+O1xuICBpc0dyb3VwUmVzdWx0ID0gVGFibGVSZXN1bHRIZWxwZXJzLmlzR3JvdXBSZXN1bHQ8UiwgRz47XG4gIGlzTmVzdGVkUmVzdWx0ID0gVGFibGVSZXN1bHRIZWxwZXJzLmlzTmVzdGVkUmVzdWx0PFIsIEc+O1xufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1hbmFnZXI/LnN0YXRlIHwgYXN5bmM7IGxldCBzXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25DYWxsb3V0UG9zaXRpb24gfCBhc3luYzsgbGV0IHBvc2l0aW9uXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInMuc2VsZWN0aW9uLnNlbGVjdGVkQ291bnQgPiAwICYmIHNlbGVjdGlvblRlbXBsYXRlXCI+XG4gICAgICA8cml2LWNhbGxvdXRcbiAgICAgICAgKnJpdi1vdmVybGF5XG4gICAgICAgIFthbmNob3JdPVwicG9zaXRpb25cIlxuICAgICAgICBbaXNNb2RhbF09XCJmYWxzZVwiXG4gICAgICAgIFt0aGVtZV09XCInbGlnaHQnXCJcbiAgICAgICAgW3Nob3dDYXJldF09XCJmYWxzZVwiXG4gICAgICAgIFtwcmVmZXJyZWRQb3NpdGlvbl09XCIndG9wLXJpZ2h0J1wiXG4gICAgICA+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInNlbGVjdGlvblRlbXBsYXRlOyBjb250ZXh0OiB7IHN0YXRlOiBzIH1cIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8L3Jpdi1jYWxsb3V0PlxuICAgIDwvbmctY29udGFpbmVyPlxuICA8L25nLWNvbnRhaW5lcj5cbiAgPGRpdiBjbGFzcz1cImxvYWRpbmctY29udGFpbmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImhlYWRlclwiICpuZ0lmPVwiaGVhZGVyVGVtcGxhdGVcIj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJoZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyBzdGF0ZTogcyB9XCJcbiAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8cml2LWxvYWRpbmctY292ZXJcbiAgICAgIGNsYXNzPVwiY29udGFpbmVyLWxvYWRlci13cmFwcGVyXCJcbiAgICAgIFtsb2FkaW5nXT1cInMubG9hZC5sb2FkaW5nXCJcbiAgICAgIFtlcnJvck1lc3NhZ2VdPVwicy5sb2FkLmVycm9yID8gZ2V0RXJyb3JNZXNzYWdlKHMubG9hZC5lcnJvcikgOiB1bmRlZmluZWRcIlxuICAgID5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJjb250YWluZXJcIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgJ2NvbnRhaW5lci11bmdyb3VwZWQnOiAhaXNHcm91cFJlc3VsdChzLnJlc3VsdCksXG4gICAgICAgICAgJ2hhcy1oZWFkZXInOiAhaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgaGVhZGVyVGVtcGxhdGUsXG4gICAgICAgICAgJ3dpdGhvdXQtY29sdW1ucyc6IHMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aCA9PT0gMFxuICAgICAgICB9XCJcbiAgICAgICAgKHJpdkNsaWVudFNpemUpPVwiY29udGFpbmVyU2l6ZS5uZXh0KCRldmVudClcIlxuICAgICAgPlxuICAgICAgICA8cml2LXplcm8tc3RhdGVcbiAgICAgICAgICAqbmdJZj1cInMuZGlzcGxheS5jb2x1bW5zLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgY2xhc3M9XCJuby1jb2x1bW5zLW1lc3NhZ2VcIlxuICAgICAgICAgIFttZXNzYWdlXT1cIlxuICAgICAgICAgICAgJ0FsbCBjb2x1bW5zIGRpc2FibGVkLiBFbmFibGUgYXQgbGVhc3Qgb25lIGNvbHVtbiB0byB2aWV3IHRhYmxlIGRhdGEuJ1xuICAgICAgICAgIFwiXG4gICAgICAgID48L3Jpdi16ZXJvLXN0YXRlPlxuXG4gICAgICAgIDwhLS1cbiAgICAgICAgICBBbiBvdmVydmlldyBvZiB0aGUgdGVtcGxhdGVzIHdlIGFyZSB1c2luZzpcblxuICAgICAgICAgIGhlYWRlcnNBbmRUYWJsZUJvZHkgLSBoZWxwcyB1cyBjcmVhdGUgbXVsdGlwbGUgdGFibGVzIGZvciBncm91cGVkIHJlc3VsdHNcbiAgICAgICAgICAgIGhlYWRlclJvd1dpdGhTdWJSb3dzIC0gaGVscHMgdXMgY3JlYXRlIGhlYWRlciByb3dzIGZvciBuZXN0ZWQgd2l0aCBoZWFkZXIgcmVzdWx0c1xuICAgICAgICAgICAgICBuZXN0ZWRSb3dXaXRoU3ViUm93cyAtIGhlbHBzIHVzIGNyZWF0ZSBuZXN0ZWQgcm93cyBmb3IgdGhlIG5lc3RlZCByZXN1bHQgdHlwZXNcbiAgICAgICAgICAgICAgICByb3dXcmFwcGVkV2l0aFJvd0xpbmsgLSBoZWxwcyB1cyBhZGQgYSByb3dsaW5rIHRvIGEgcm93XG4gICAgICAgICAgICAgICAgICByb3dCb2R5IC0gZGlzcGxheXMgdGhlIHJvdyBjb250ZW50XG4gICAgICAgIC0tPlxuXG4gICAgICAgIDwhLS0gV2hlbiB3ZSBhcmUgZ3JvdXBlZCwgd2Ugc2hvdyBvbmUgdGFibGUgcGVyIGdyb3VwIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgIGlzR3JvdXBSZXN1bHQocy5yZXN1bHQpICYmIHMucmVzdWx0LnJlc3VsdFR5cGUgPT09ICd0YWJsZS1ncm91cGluZydcbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgIGxldCBncm91cCBvZiBzLnJlc3VsdC5yb3dHcm91cHM7XG4gICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlHcm91cDtcbiAgICAgICAgICAgICAgbGV0IGxhc3QgPSBsYXN0XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICBoZWFkZXJzQW5kVGFibGVCb2R5O1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgZ3JvdXA6IGdyb3VwLCBsYXN0OiBsYXN0IH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBXaGVuIHdlIGFyZW4ndCBncm91cGVkLCB3ZSBzaG93IG9uZSB0YWJsZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiaXNSZWd1bGFyUmVzdWx0KHMucmVzdWx0KSB8fCBpc05lc3RlZFJlc3VsdChzLnJlc3VsdClcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgaGVhZGVyc0FuZFRhYmxlQm9keTtcbiAgICAgICAgICAgICAgY29udGV4dDogeyBncm91cDogbnVsbCwgbGFzdDogdHJ1ZSB9XG4gICAgICAgICAgICBcIlxuICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1ncm91cD1cImdyb3VwXCIgbGV0LWxhc3Q9XCJsYXN0XCIgI2hlYWRlcnNBbmRUYWJsZUJvZHk+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzR3JvdXBSZXN1bHQocy5yZXN1bHQpICYmIGdyb3VwICE9PSBudWxsXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgc3ViaGVhZGVyVGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7IHN0YXRlOiBzLCBncm91cCB9XG4gICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7ICdzdWJjb250YWluZXItZ3JvdXBlZCc6IGlzR3JvdXBSZXN1bHQocy5yZXN1bHQpIH1cIj5cbiAgICAgICAgICAgIDx0YWJsZT5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEhcy5zZWxlY3Rpb24uYWxsb3dTZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1oZWFkXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1zci1vbmx5PlNlbGVjdCByb3dzPC9yaXYtc3Itb25seT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiAhPT0gJ2luZGl2aWR1YWwnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiA9PT0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGVja2JveC13cmFwcGVyXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxyaXYtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzR3JvdXBSZXN1bHQocy5yZXN1bHQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzLnNlbGVjdGlvbi5pc0FsbFNlbGVjdGVkID09PSB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5pc0FsbFNlbGVjdGVkID09PSAnaW5kZXRlcm1pbmF0ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoeyB0eXBlOiAnYWxsU2VsZWN0ZWRDaGFuZ2UnIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiU2VsZWN0IGFsbCByb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0dyb3VwUmVzdWx0KHMucmVzdWx0KSAmJiBncm91cCAhPT0gbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiZ3JvdXAuc2VsZWN0ZWQgPT09IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiZ3JvdXAuc2VsZWN0ZWQgPT09ICdpbmRldGVybWluYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdncm91cFNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhTGFiZWw9XCJTZWxlY3QgZ3JvdXAgcm93c1wiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcml2LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc05lc3RlZFJlc3VsdChzLnJlc3VsdCkgJiYgISFzLnJlc3VsdC5oYXNIZWFkZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtaGVhZFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQWRkIGEgY29sdW1uIGZvciB0aGUgY2hldnJvbnMsIGlmIHdlIGhhdmUgdG9nZ2xhYmxlIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxyaXYtc3Itb25seT5Ub2dnbGVzPC9yaXYtc3Itb25seT5cbiAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBzLmRpc3BsYXkuY29sdW1uczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5waW5uZWRdPVwiY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNvbHVtbi5sZWZ0XCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImdldFdpZHRoKGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kcmFnZ2FibGVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgcy5kaXNwbGF5LmNvbHVtbnNBcmVSZW9yZGVyYWJsZSAmJiAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kcm9wcGFibGVdPVwiIWNvbHVtbi5hbHdheXNQaW5uZWRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHJvcC16b25lXT1cIiFjb2x1bW4uYWx3YXlzUGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgKGRyYWdzdGFydCk9XCJkcmFnU3RhcnQoaSwgY29sdW1uLmtleSlcIlxuICAgICAgICAgICAgICAgICAgICAoZHJhZ2VudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBkcmFnT3ZlcihpKVwiXG4gICAgICAgICAgICAgICAgICAgIChkcm9wKT1cImRyb3AoaSwgcy5kaXNwbGF5LmVuYWJsZWRDb3VudClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHJhZ2dlZC1vdmVyLWxlZnRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZE92ZXJDb2x1bW5JZHggPT09IGkgJiZcbiAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2VkQ29sdW1uSWR4ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCA+IGkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhY29sdW1uLmFsd2F5c1Bpbm5lZFxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZHJhZ2dlZC1vdmVyLXJpZ2h0XT1cIlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRPdmVyQ29sdW1uSWR4ID09PSBpICYmXG4gICAgICAgICAgICAgICAgICAgICAgZHJhZ2dlZENvbHVtbklkeCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWRDb2x1bW5JZHggPCBpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWNvbHVtbi5hbHdheXNQaW5uZWRcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXNob3dNZW51T25Db2x1bW5OYW1lKHMsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5sZWZ0XT1cImNvbHVtbi5hbGlnbm1lbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJpZ2h0XT1cImNvbHVtbi5hbGlnbm1lbnQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgcy5kaXNwbGF5LmNvbHVtbk5hbWVNYXAuZ2V0KGNvbHVtbi5rZXkpIH19XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi10YWJsZS1oZWFkZXItcmVzaXplLWhhbmRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdSZXNpemUpPVwic2V0V2lkdGgoY29sdW1uLmtleSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvcml2LXRhYmxlLWhlYWRlci1yZXNpemUtaGFuZGxlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1tZW51ICpuZ0lmPVwic2hvd01lbnVPbkNvbHVtbk5hbWUocywgY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MubGVmdF09XCJjb2x1bW4uYWxpZ25tZW50ID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MucmlnaHRdPVwiY29sdW1uLmFsaWdubWVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicy5xdWVyeS5vcmRlcj8uY29sdW1uID09PSBjb2x1bW4ua2V5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3sgcy5kaXNwbGF5LmNvbHVtbk5hbWVNYXAuZ2V0KGNvbHVtbi5rZXkpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjEyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5kaXJlY3Rpb24gPT09ICdkZXNjJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ0Fycm93RG93bidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICdBcnJvd1VwJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJpdi10YWJsZS1oZWFkZXItcmVzaXplLWhhbmRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoZHJhZ1Jlc2l6ZSk9XCJzZXRXaWR0aChjb2x1bW4ua2V5LCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3Jpdi10YWJsZS1oZWFkZXItcmVzaXplLWhhbmRsZT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ub3JkZXJhYmxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnF1ZXJ5Lm9yZGVyPy5jb2x1bW4gPT09IGNvbHVtbi5rZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmRpcmVjdGlvbiA9PT0gJ2FzYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdhc2MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi5rZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0IGFzY2VuZGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInMucXVlcnkub3JkZXI/LmNvbHVtbiA9PT0gY29sdW1uLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZSBzb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMucXVlcnkub3JkZXI/LmNvbHVtbiA9PT0gY29sdW1uLmtleSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5xdWVyeS5vcmRlcj8uZGlyZWN0aW9uID09PSAnZGVzYydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdkZXNjJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydCBkZXNjZW5kaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJpdi1kaXZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLm9yZGVyYWJsZSAmJiBjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4uZmlsdGVyYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICByaXYtbWVudS1pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2ZpbHRlckFkZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uS2V5OiBjb2x1bW4ua2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBhIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2Ugb25seSBzaG93IHRoZSBkaXZpZGVyIHdoZW4gd2Ugd2lsbCBoYXZlIGFuIGl0ZW0gYm90aCBhYm92ZSBhbmQgYmVsb3cgdGhlIGRpdmlkZXIuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicml2LWRpdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbHVtbi5vcmRlcmFibGUgfHwgY29sdW1uLmZpbHRlcmFibGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb2x1bW5DYW5GcmVlemUocywgY29sdW1uKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbkNhbkhpZGUocywgY29sdW1uKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5DYW5GcmVlemUocywgY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhY29sdW1uLnBpbm5lZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFuYWdlcj8uYWN0aW9ucz8ubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uc0ZyZWV6ZVVwVG9DaGFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdoZWFkZXJNZW51JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLmtleVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWV6ZSB1cCB0byBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcml2LW1lbnUtaXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlemU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6ICdoZWFkZXJNZW51JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLmtleVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFVuLWZyZWV6ZSBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uQ2FuSGlkZShzLCBjb2x1bW4pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpdi1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29sdW1uRW5hYmxlZENoYW5nZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4ua2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2hlYWRlck1lbnUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEhpZGUgY29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvcml2LW1lbnU+XG4gICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwibWVudVRlbXBsYXRlXCIgY2xhc3M9XCJtZW51LWhlYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHJpdi1zci1vbmx5Pk1lbnU8L3Jpdi1zci1vbmx5PlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPiAwOyBlbHNlIGVtcHR5XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8IS0tIEdyb3VwZWQgcmVzdWx0cyBkbyBub3QgaGF2ZSBzdWJyb3dzIG9yIGhlYWRlcnMgLS0+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgZ3JvdXAgIT09IG51bGxcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93IG9mIGdyb3VwLnJvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm93SW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlSb3dcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcm93V3JhcHBlZFdpdGhSb3dMaW5rO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93OiByb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1YlJvd3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd0lzQ29sbGFwc2VkOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgPCEtLSBSZWd1bGFyIHJlc3VsdHMgZG8gbm90IGhhdmUgc3Vicm93cyBvciBoZWFkZXJzIC0tPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgIGlzUmVndWxhclJlc3VsdChzLnJlc3VsdCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICBzLnJlc3VsdC5yZXN1bHRUeXBlID09PSAnbm9ybWFsLXJvd3MnXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3cgb2Ygcy5yZXN1bHQucm93c0FzR3JvdXAucm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3dJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeVJvd1xuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICByb3dXcmFwcGVkV2l0aFJvd0xpbms7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3c6IHJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dJbmRleDogcm93SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SXNDb2xsYXBzZWQ6IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICA8IS0tIE5lc3RlZCB3aXRoIGhlYWRlciByZXN1bHRzIGhhdmUgc3Vicm93cyBhbmQgaGVhZGVycyAtLT5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICBpc05lc3RlZFJlc3VsdChzLnJlc3VsdCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICBzLnJlc3VsdC5yZXN1bHRUeXBlID09PSAnbmVzdGVkLXJvd3MnXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkZXJSb3cgb2Ygcy5yZXN1bHQubmVzdGVkSGVhZGVyUm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlOZXN0ZWRIZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUm93V2l0aFN1YlJvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgaGVhZGVyUm93OiBoZWFkZXJSb3cgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtaGVhZGVyUm93PVwiaGVhZGVyUm93XCIgI2hlYWRlclJvd1dpdGhTdWJSb3dzPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIERpc3BsYXkgdGhlIGhlYWRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhlYWRlclJvdy5oZWFkZXJUZXh0ICE9PSBudWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1oZWFkZXItcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVIZWFkZXJDb2xsYXBzZShoZWFkZXJSb3cuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ0b2dnbGUtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvd3Mgd2l0aCBzdWJyb3dzIGhhdmUgYSBjaGV2cm9uIGluZGljYXRpbmcgeW91IGNhbiBjbGljayB0aGUgcm93IHRvIHNlZSB0aGUgc3Vicm93cy4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxyaXYtaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJldmVudC1zaHJpbmsgY2hldnJvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25hbWVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJSb3cuaXNDb2xsYXBzZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnQ2hldnJvbkRvd24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ0NoZXZyb25VcCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE2XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcml2LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmNvbHNwYW5dPVwicy5kaXNwbGF5LmNvbHVtbnMubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtaGVhZGVyLXRleHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBoZWFkZXJSb3cuaGVhZGVyVGV4dCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwibWVudVRlbXBsYXRlXCI+PC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIElmIGEgaGVhZGVyIGlzIG5vdCBjb2xsYXBzZWQsIGFsc28gc2hvdyBpdHMgc3Vicm93cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAhaGVhZGVyUm93LmlzQ29sbGFwc2VkICYmIGhlYWRlclJvdy5zdWJSb3dzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXN0ZWRSb3cgb2YgaGVhZGVyUm93LnN1YlJvd3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlOZXN0ZWRSb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJvd1dpdGhTdWJSb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgbmVzdGVkUm93OiBuZXN0ZWRSb3csIGRlcHRoOiAwIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgICAgICAgICAgbGV0LW5lc3RlZFJvdz1cIm5lc3RlZFJvd1wiXG4gICAgICAgICAgICAgICAgICAgIGxldC1kZXB0aD1cImRlcHRoXCJcbiAgICAgICAgICAgICAgICAgICAgI25lc3RlZFJvd1dpdGhTdWJSb3dzXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGlzcGxheSB0aGUgY3VycmVudCByb3cgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dXcmFwcGVkV2l0aFJvd0xpbmtcIlxuICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3c6IG5lc3RlZFJvdy5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IC0xLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogbmVzdGVkUm93LnN1YlJvd3M/Lmxlbmd0aCA+IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICByb3dJc0NvbGxhcHNlZDogbmVzdGVkUm93LmlzQ29sbGFwc2VkXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBJZiBhIHJvdyBpcyBub3QgY29sbGFwc2VkLCBhbHNvIHNob3cgaXRzIHN1YnJvd3MgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgIW5lc3RlZFJvdy5pc0NvbGxhcHNlZCAmJiBuZXN0ZWRSb3cuc3ViUm93cz8ubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YlJvdyBvZiBuZXN0ZWRSb3cuc3ViUm93cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeU5lc3RlZFJvd1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm5lc3RlZFJvd1dpdGhTdWJSb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSb3c6IHN1YlJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogZGVwdGggKyAxXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3c9XCJyb3dcIlxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1kZXB0aD1cImRlcHRoXCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LWhhc1N1YlJvd3M9XCJoYXNTdWJSb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0lzQ29sbGFwc2VkPVwicm93SXNDb2xsYXBzZWRcIlxuICAgICAgICAgICAgICAgICAgICAjcm93V3JhcHBlZFdpdGhSb3dMaW5rXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogcm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgcm93SW5kZXg6IHJvd0luZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFzU3ViUm93czogaGFzU3ViUm93cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0lzQ29sbGFwc2VkOiByb3dJc0NvbGxhcHNlZFxuICAgICAgICAgICAgICAgICAgICAgIH0gYXMgcm93Q29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LnJvd0xpbms7IGxldCBybFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc0V4dGVybmFsUm93TGluayhybClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaHJlZl09XCJybC5ocmVmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhZ2dhYmxlPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdy1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmdyYXllZF09XCJzLmRpc3BsYXkucm93c0FyZUdyYXllZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cInJvd0JvZHk7IGNvbnRleHQ6IHJvd0NvbnRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzSW50ZXJuYWxSb3dMaW5rKHJsKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwicmwucm91dGVyTGlua1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJybC5xdWVyeVBhcmFtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtxdWVyeVBhcmFtc0hhbmRsaW5nXT1cInJsLnF1ZXJ5UGFyYW1zSGFuZGxpbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdy1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmdyYXllZF09XCJzLmRpc3BsYXkucm93c0FyZUdyYXllZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwicmwuYWN0aXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93Qm9keTsgY29udGV4dDogcm93Q29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIXJvdy5yb3dMaW5rXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5ncmF5ZWRdPVwicy5kaXNwbGF5LnJvd3NBcmVHcmF5ZWRcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJyb3dCb2R5OyBjb250ZXh0OiByb3dDb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICBsZXQtcm93PVwicm93XCJcbiAgICAgICAgICAgICAgICAgICAgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBsZXQtZGVwdGg9XCJkZXB0aFwiXG4gICAgICAgICAgICAgICAgICAgIGxldC1oYXNTdWJSb3dzPVwiaGFzU3ViUm93c1wiXG4gICAgICAgICAgICAgICAgICAgIGxldC1yb3dJc0NvbGxhcHNlZD1cInJvd0lzQ29sbGFwc2VkXCJcbiAgICAgICAgICAgICAgICAgICAgI3Jvd0JvZHlcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHMuc2VsZWN0aW9uLmFsbG93U2VsZWN0aW9uID09PSB0cnVlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBzLnNlbGVjdGlvbi5hbGxvd1NlbGVjdGlvbiA9PT0gJ2luZGl2aWR1YWwnXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGVjdGlvbi1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImNoZWNrYm94LXdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJpdi1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRlbnRpZmllcl09XCIncml2LXRhYmxlLXNlbGVjdGlvbi0nICsgcm93LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInJvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2Uocm93LmlkLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYUxhYmVsPVwiU2VsZWN0IHJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc05lc3RlZFJlc3VsdChzLnJlc3VsdCkgJiYgISFzLnJlc3VsdC5oYXNIZWFkZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGhpcyB0ZCBsaW5lcyB1cCB3aXRoIHRoZSBoZWFkZXIgY2hldnJvbiBjb2x1bW4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gb2Ygcy5kaXNwbGF5LmNvbHVtbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCBhcyBjb2x1bW5JbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrQnk6IHRyYWNrQnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcy5kaXNwbGF5LmNlbGxSb3dTcGFuKHJvd0luZGV4LCBjb2x1bW4ua2V5KSBhcyBzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNwYW4gPiAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm93c3Bhbl09XCJzcGFuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnJzLXJpZ2h0LWJvcmRlcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLmRpc3BsYXkubmVlZHNSaWdodEJvcmRlcihyb3dJbmRleCwgY29sdW1uLmtleSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFkdmFuY2VkXT1cImNvbHVtbi5kYXRhVHlwZSA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy50b2dnbGVhYmxlLWNlbGxdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NoZXZyb25Gb3JDZWxsKGNvbHVtbkluZGV4LCBoYXNTdWJSb3dzLCBkZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLmxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUudGV4dC1hbGlnbl09XCJjb2x1bW4uYWxpZ25tZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGV2cm9uRm9yQ2VsbChjb2x1bW5JbmRleCwgaGFzU3ViUm93cywgZGVwdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRvZ2dsZVJvd0NvbGxhcHNlKHJvdy5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaGFuZGxlQ2xpY2soJGV2ZW50LCBjb2x1bW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2VsbENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhYmxhbmtDZWxsRHVlVG9OZXN0aW5nKGNvbHVtbkluZGV4LCBkZXB0aClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsVGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3dzIHdpdGggc3Vicm93cyBoYXZlIGEgY2hldnJvbiBpbmRpY2F0aW5nIHlvdSBjYW4gY2xpY2sgdGhlIHJvdyB0byBzZWUgdGhlIHN1YnJvd3MuIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDaGV2cm9uRm9yQ2VsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1YlJvd3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjZWxsQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGVhYmxlLWNlbGwtY29udGVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cml2LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicHJldmVudC1zaHJpbmsgY2hldnJvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93SXNDb2xsYXBzZWQgPyAnQ2hldnJvbkRvd24nIDogJ0NoZXZyb25VcCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvcml2LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvZ2dsZWFibGUtY2VsbC12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxDb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJtZW51VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWVudS1ib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVUZW1wbGF0ZSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7IHJvdzogcm93IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwicy5kaXNwbGF5LmN1c3RvbVN1bW1hcnlSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sdW1uIG9mIHMuZGlzcGxheS5jb2x1bW5zO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tCeTogdHJhY2tCeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBpbm5lZF09XCJjb2x1bW4ucGlubmVkXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWR2YW5jZWRdPVwiY29sdW1uLmRhdGFUeXBlID09PSAnYWR2YW5jZWQnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb2x1bW4ubGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRleHQtYWxpZ25dPVwiY29sdW1uLmFsaWdubWVudFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5VGVtcGxhdGUgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBjb2x1bW46IGNvbHVtbiB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNlbXB0eT5cbiAgICAgICAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwicy5kaXNwbGF5LmNvbHVtbnMubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJpdi16ZXJvLXN0YXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInMuZGlzcGxheS56ZXJvU3RhdGVNZXNzYWdlOyBsZXQgbWVzc2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWVzc2FnZV09XCJtZXNzYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9yaXYtemVyby1zdGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJmb290ZXJcIlxuICAgICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICAgaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiZcbiAgICAgICAgICAgICAgZ3JvdXAgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgZ3JvdXAudG90YWxNYXRjaGluZ1Jvd0NvdW50ID4gcy5xdWVyeS5ncm91cGluZy5jb3VudFBlckdyb3VwICYmXG4gICAgICAgICAgICAgIGdyb3VwLnJvd3MubGVuZ3RoID09PSBzLnF1ZXJ5Lmdyb3VwaW5nLmNvdW50UGVyR3JvdXBcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgcml2TGlua1xuICAgICAgICAgICAgICBjbGFzcz1cImZvb3Rlci1saW5rXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIlxuICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3ZpZXdNb3JlS2V5Q2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHZpZXdNb3JlS2V5OiBncm91cC5ncm91cERhdGEua2V5LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICA+VmlldyBhbGwge3sgZ3JvdXAudG90YWxNYXRjaGluZ1Jvd0NvdW50IH19PC9zcGFuXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJyICpuZ0lmPVwiIWxhc3RcIiAvPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnNob3dDb250cm9sc1wiIGNsYXNzPVwicGFnaW5hdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFnZS1zaXplLWNvbnRyb2xzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgKm5nSWY9XCIhaXNHcm91cFJlc3VsdChzLnJlc3VsdCkgJiYgIXMuZGlzcGxheS5oaWRlUGFnZVNpemVTZWxlY3RvclwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4+IFJlc3VsdHMgcGVyIHBhZ2U6IDwvc3Bhbj5cbiAgICAgICAgICAgIDxyaXYtc2ltcGxlLXNlbGVjdFxuICAgICAgICAgICAgICBbc2VsZWN0ZWRPcHRpb25dPVwie1xuICAgICAgICAgICAgICAgIGlkOiBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemUudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICB0aXRsZTogcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplLnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZVxuICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgKHNlbGVjdGVkT3B0aW9uQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgIG1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoe1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3BhZ2VTaXplQ2hhbmdlJyxcbiAgICAgICAgICAgICAgICAgIHNpemU6ICRldmVudD8udmFsdWUgfHwgMjVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICBbb3B0aW9uR3JvdXBzXT1cInBhZ2VTaXplT3B0aW9uc1wiXG4gICAgICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgICAgICBbb3JkZXJCeV09XCInc291cmNlJ1wiXG4gICAgICAgICAgICA+PC9yaXYtc2ltcGxlLXNlbGVjdD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgKm5nSWY9XCJzLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPiAwICYmICFpc0dyb3VwUmVzdWx0KHMucmVzdWx0KVwiXG4gICAgICAgICAgY2xhc3M9XCJwYWdlLWRhdGEtaW5kaWNhdG9yXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlUm93U3RhcnQgfCByaXZOdW1iZXIgfX0te3tcbiAgICAgICAgICAgIHMucXVlcnkucGFnaW5hdGlvbi5wYWdlUm93RW5kIHwgcml2TnVtYmVyXG4gICAgICAgICAgfX1cbiAgICAgICAgICBvZlxuICAgICAgICAgIHt7IHMucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCB8IHJpdk51bWJlciB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cInMucXVlcnkucGFnaW5hdGlvbi5zaG93Q29udHJvbHNcIlxuICAgICAgICAgIGNsYXNzPVwicGFnaW5hdGlvbi1jb250cm9sc1wiXG4gICAgICAgID5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICByaXZCdXR0b25cbiAgICAgICAgICAgIFt2YXJpYW50XT1cIidiYXNpYydcIlxuICAgICAgICAgICAgW3NpemVdPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgICBbaWNvbl09XCInQXJyb3dMZWZ0J1wiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJzLnF1ZXJ5LnBhZ2luYXRpb24ucHJldmlvdXMgPT09IG51bGxcIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm1hbmFnZXI/LmFjdGlvbnM/Lm5leHQoeyB0eXBlOiAncHJldmlvdXNQYWdlTmF2aWdhdGUnIH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwicy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VzWzBdID4gMFwiXG4gICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1wYWdlcyBsZWZ0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICAmaGVsbGlwO1xuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgcGFnZSBvZiBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXNcIlxuICAgICAgICAgICAgY2xhc3M9XCJwYWdlXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInBhZ2UgPT09IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgIHBhZ2UgPT09IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlID8gJ3RydWUnIDogbnVsbFxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHsgdHlwZTogJ3BhZ2VDaGFuZ2UnLCBwYWdlIH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyBwYWdlICsgMSB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgICBzLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZXNbcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VzLmxlbmd0aCAtIDFdIDxcbiAgICAgICAgICAgICAgcy5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VDb3VudCAtIDFcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBjbGFzcz1cInRydW5jYXRlZC1wYWdlcyByaWdodFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgJmhlbGxpcDtcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgcml2QnV0dG9uXG4gICAgICAgICAgICBbdmFyaWFudF09XCInYmFzaWMnXCJcbiAgICAgICAgICAgIFtzaXplXT1cIidzbWFsbCdcIlxuICAgICAgICAgICAgW2ljb25dPVwiJ0Fycm93UmlnaHQnXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInMucXVlcnkucGFnaW5hdGlvbi5uZXh0ID09PSBudWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJtYW5hZ2VyPy5hY3Rpb25zPy5uZXh0KHsgdHlwZTogJ25leHRQYWdlTmF2aWdhdGUnIH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9yaXYtbG9hZGluZy1jb3Zlcj5cbiAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==