@bizdoc/core 3.2.9 → 3.3.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 (455) hide show
  1. package/assets/themes/brown.min.css +1 -1
  2. package/assets/themes/dark.min.css +3 -3
  3. package/assets/themes/deep-purple-light-blue.min.css +1 -1
  4. package/assets/themes/deep-purple-teal.min.css +1 -1
  5. package/assets/themes/default.min.css +8 -8
  6. package/assets/themes/green.min.css +1 -1
  7. package/assets/themes/indigo-amber.min.css +1 -1
  8. package/assets/themes/indigo.min.css +1 -1
  9. package/fesm2022/bizdoc-core.mjs +2152 -1924
  10. package/fesm2022/bizdoc-core.mjs.map +1 -1
  11. package/lib/admin/admin-menu.component.d.ts +1 -3
  12. package/lib/admin/architecture/designer.base.d.ts +3 -3
  13. package/lib/admin/architecture/elements/form.component.d.ts +1 -1
  14. package/lib/bizdoc.module.d.ts +6 -7
  15. package/lib/compose/trace/trace.base.d.ts +1 -1
  16. package/lib/core/base.d.ts +5 -0
  17. package/lib/core/configuration.d.ts +3 -0
  18. package/lib/core/fields/options.base.d.ts +2 -2
  19. package/lib/core/functions.d.ts +1 -1
  20. package/lib/core/inputs/combination-picker-body.d.ts +0 -2
  21. package/lib/core/inputs/combination-picker.d.ts +1 -1
  22. package/lib/core/session.service.d.ts +2 -2
  23. package/lib/core/slots/slots.component.d.ts +1 -0
  24. package/lib/core/tagging/edit-input.component.d.ts +7 -3
  25. package/lib/core/tagging/tagging.component-base.d.ts +2 -2
  26. package/lib/core/translate.service.d.ts +2 -2
  27. package/lib/core/window-title.service.d.ts +1 -0
  28. package/lib/cube/matrix/matrix.base.d.ts +1 -1
  29. package/lib/cube/view-base.d.ts +1 -1
  30. package/lib/dashboard/cube/cube-analysis.base.d.ts +1 -1
  31. package/lib/home/home-base.component.d.ts +1 -1
  32. package/lib/home/home.desktop.component.d.ts +5 -3
  33. package/lib/notifications/types/notification-base.d.ts +1 -1
  34. package/lib/reports/cube/usage-base.d.ts +1 -1
  35. package/lib/routes.mobile.d.ts +1 -1
  36. package/lib/views/cube/cube-base.d.ts +1 -1
  37. package/package.json +31 -33
  38. package/esm2022/bizdoc-core.mjs +0 -5
  39. package/esm2022/lib/admin/admin-dismiss.service.mjs +0 -28
  40. package/esm2022/lib/admin/admin-menu.component.mjs +0 -24
  41. package/esm2022/lib/admin/architecture/cube-axes-filter.component.mjs +0 -93
  42. package/esm2022/lib/admin/architecture/declarations.mjs +0 -79
  43. package/esm2022/lib/admin/architecture/designer-element.component.mjs +0 -270
  44. package/esm2022/lib/admin/architecture/designer-privileges.component.mjs +0 -96
  45. package/esm2022/lib/admin/architecture/designer.base.mjs +0 -136
  46. package/esm2022/lib/admin/architecture/designer.component.mjs +0 -396
  47. package/esm2022/lib/admin/architecture/elements/action.component.mjs +0 -43
  48. package/esm2022/lib/admin/architecture/elements/analysis-view.component.mjs +0 -50
  49. package/esm2022/lib/admin/architecture/elements/analysis-widget.component.mjs +0 -49
  50. package/esm2022/lib/admin/architecture/elements/anomaly-rule.component.mjs +0 -29
  51. package/esm2022/lib/admin/architecture/elements/attribute.component.mjs +0 -35
  52. package/esm2022/lib/admin/architecture/elements/box-form.component.mjs +0 -49
  53. package/esm2022/lib/admin/architecture/elements/configuration-datasource.component.mjs +0 -66
  54. package/esm2022/lib/admin/architecture/elements/control.component.mjs +0 -21
  55. package/esm2022/lib/admin/architecture/elements/cube-index-utility.component.mjs +0 -32
  56. package/esm2022/lib/admin/architecture/elements/cube-view.component.mjs +0 -34
  57. package/esm2022/lib/admin/architecture/elements/cube.component.mjs +0 -254
  58. package/esm2022/lib/admin/architecture/elements/document-state-widget.component.mjs +0 -40
  59. package/esm2022/lib/admin/architecture/elements/documents-report.component.mjs +0 -34
  60. package/esm2022/lib/admin/architecture/elements/documents-widget.component.mjs +0 -40
  61. package/esm2022/lib/admin/architecture/elements/explore-view.component.mjs +0 -35
  62. package/esm2022/lib/admin/architecture/elements/folder.component.mjs +0 -56
  63. package/esm2022/lib/admin/architecture/elements/form-invite.dialog.mjs +0 -126
  64. package/esm2022/lib/admin/architecture/elements/form.component.mjs +0 -156
  65. package/esm2022/lib/admin/architecture/elements/guide.component.mjs +0 -53
  66. package/esm2022/lib/admin/architecture/elements/job.component.mjs +0 -57
  67. package/esm2022/lib/admin/architecture/elements/matrix-view.component.mjs +0 -98
  68. package/esm2022/lib/admin/architecture/elements/node.component.mjs +0 -18
  69. package/esm2022/lib/admin/architecture/elements/parallel-view.component.mjs +0 -38
  70. package/esm2022/lib/admin/architecture/elements/performance-report.component.mjs +0 -32
  71. package/esm2022/lib/admin/architecture/elements/performance-widget.component.mjs +0 -34
  72. package/esm2022/lib/admin/architecture/elements/pivot-view.component.mjs +0 -40
  73. package/esm2022/lib/admin/architecture/elements/policy.component.mjs +0 -18
  74. package/esm2022/lib/admin/architecture/elements/report.component.mjs +0 -29
  75. package/esm2022/lib/admin/architecture/elements/return-to-role-action.component.mjs +0 -33
  76. package/esm2022/lib/admin/architecture/elements/role.component.mjs +0 -43
  77. package/esm2022/lib/admin/architecture/elements/rule.component.mjs +0 -18
  78. package/esm2022/lib/admin/architecture/elements/source.component.mjs +0 -25
  79. package/esm2022/lib/admin/architecture/elements/state.component.mjs +0 -44
  80. package/esm2022/lib/admin/architecture/elements/sum-view.component.mjs +0 -38
  81. package/esm2022/lib/admin/architecture/elements/tasks-report.component.mjs +0 -39
  82. package/esm2022/lib/admin/architecture/elements/type.component.mjs +0 -83
  83. package/esm2022/lib/admin/architecture/elements/usage-report.component.mjs +0 -64
  84. package/esm2022/lib/admin/architecture/elements/utility.component.mjs +0 -18
  85. package/esm2022/lib/admin/architecture/elements/view.component.mjs +0 -18
  86. package/esm2022/lib/admin/architecture/elements/widget.component.mjs +0 -29
  87. package/esm2022/lib/admin/architecture/icon-picker.component.mjs +0 -173
  88. package/esm2022/lib/admin/core/ace.input.mjs +0 -144
  89. package/esm2022/lib/admin/core/color-picker.input.mjs +0 -183
  90. package/esm2022/lib/admin/core/localized-string.component.mjs +0 -129
  91. package/esm2022/lib/admin/core/search.input.mjs +0 -52
  92. package/esm2022/lib/admin/diff/configuration-diff.component.mjs +0 -573
  93. package/esm2022/lib/admin/document-trace/document-trace.component.mjs +0 -537
  94. package/esm2022/lib/admin/document-trace/reassign.dialog.mjs +0 -39
  95. package/esm2022/lib/admin/document-trace/timeline.mjs +0 -2
  96. package/esm2022/lib/admin/document-trace/trace-element.component.mjs +0 -125
  97. package/esm2022/lib/admin/form/designer/box-designer.component.mjs +0 -270
  98. package/esm2022/lib/admin/form/designer/declarations.mjs +0 -2
  99. package/esm2022/lib/admin/form/designer/design-control.component.mjs +0 -41
  100. package/esm2022/lib/admin/form/designer/properties.component.mjs +0 -71
  101. package/esm2022/lib/admin/form/designer/section.component.mjs +0 -53
  102. package/esm2022/lib/admin/form/designer/settings.component.mjs +0 -51
  103. package/esm2022/lib/admin/form/form.resolve.service.mjs +0 -18
  104. package/esm2022/lib/admin/form/workflow/node-ref.mjs +0 -8
  105. package/esm2022/lib/admin/form/workflow/node.component.mjs +0 -156
  106. package/esm2022/lib/admin/form/workflow/role-node.component.mjs +0 -88
  107. package/esm2022/lib/admin/form/workflow/workflow.component.mjs +0 -586
  108. package/esm2022/lib/admin/indices/manage-cube-index.component.mjs +0 -160
  109. package/esm2022/lib/admin/patterns/patterns.component.mjs +0 -180
  110. package/esm2022/lib/admin/permissions/permissions.component.mjs +0 -98
  111. package/esm2022/lib/admin/positions/positions-popup.component.mjs +0 -75
  112. package/esm2022/lib/admin/positions/positions.component.mjs +0 -463
  113. package/esm2022/lib/admin/profiler/outofoffice.component.mjs +0 -156
  114. package/esm2022/lib/admin/profiler/profiler.component.mjs +0 -284
  115. package/esm2022/lib/admin/system.service.mjs +0 -127
  116. package/esm2022/lib/admin/utility-ref.mjs +0 -39
  117. package/esm2022/lib/admin/utility-wrapper.component.mjs +0 -53
  118. package/esm2022/lib/admin/utility.pane.component.mjs +0 -48
  119. package/esm2022/lib/app.component.mjs +0 -73
  120. package/esm2022/lib/bizdoc.module.mjs +0 -100
  121. package/esm2022/lib/browse/browse-items.component.mjs +0 -496
  122. package/esm2022/lib/browse/browse.mobile.component.mjs +0 -102
  123. package/esm2022/lib/browse/browse.pane.component.mjs +0 -169
  124. package/esm2022/lib/browse/expanded-item/expanded-item.component.mjs +0 -316
  125. package/esm2022/lib/browse/filter/filter.component.mjs +0 -140
  126. package/esm2022/lib/browse/folders-menu.component.mjs +0 -49
  127. package/esm2022/lib/chat/chat-info.mjs +0 -77
  128. package/esm2022/lib/chat/chat.mobile.component.mjs +0 -24
  129. package/esm2022/lib/chat/chat.service.mjs +0 -122
  130. package/esm2022/lib/chat/contacts.component.mjs +0 -107
  131. package/esm2022/lib/chat/contacts.pane.component.mjs +0 -26
  132. package/esm2022/lib/chat/conversation.component.mjs +0 -196
  133. package/esm2022/lib/chat/conversation.pane.component.mjs +0 -46
  134. package/esm2022/lib/compose/action/action-picker.component.mjs +0 -82
  135. package/esm2022/lib/compose/action/action-ref.mjs +0 -19
  136. package/esm2022/lib/compose/action/action.base.mjs +0 -50
  137. package/esm2022/lib/compose/action/action.dialog.mjs +0 -62
  138. package/esm2022/lib/compose/action/action.pane.dialog.exp.mjs +0 -68
  139. package/esm2022/lib/compose/action/assign-action.component.mjs +0 -77
  140. package/esm2022/lib/compose/action/moveto-action.component.mjs +0 -90
  141. package/esm2022/lib/compose/action/return-action.component.mjs +0 -51
  142. package/esm2022/lib/compose/attachments/attachments.component.mjs +0 -130
  143. package/esm2022/lib/compose/attachments/preview/attachment-preview.component.mjs +0 -157
  144. package/esm2022/lib/compose/attachments/progress-button.directive.mjs +0 -25
  145. package/esm2022/lib/compose/box/box.component.mjs +0 -44
  146. package/esm2022/lib/compose/box/control.component.mjs +0 -50
  147. package/esm2022/lib/compose/box/row.component.mjs +0 -41
  148. package/esm2022/lib/compose/can-deactivate-changes.service.mjs +0 -27
  149. package/esm2022/lib/compose/comments/comment.component.mjs +0 -188
  150. package/esm2022/lib/compose/comments/comments.component.mjs +0 -226
  151. package/esm2022/lib/compose/comments/comments.pane.component.mjs +0 -40
  152. package/esm2022/lib/compose/comments/edit-comment.component.mjs +0 -32
  153. package/esm2022/lib/compose/comments/edits.component.mjs +0 -30
  154. package/esm2022/lib/compose/comments/quick-comment.component.exp.mjs +0 -64
  155. package/esm2022/lib/compose/comments/votes.component.mjs +0 -42
  156. package/esm2022/lib/compose/compose-resolve.service.mjs +0 -34
  157. package/esm2022/lib/compose/compose.mobile.component.mjs +0 -114
  158. package/esm2022/lib/compose/compose.pane.component.mjs +0 -202
  159. package/esm2022/lib/compose/copy/copy.dialog.mjs +0 -45
  160. package/esm2022/lib/compose/dismiss.service.mjs +0 -25
  161. package/esm2022/lib/compose/document-resolve.service.mjs +0 -33
  162. package/esm2022/lib/compose/document-resolver.service.mjs +0 -17
  163. package/esm2022/lib/compose/document.component.mjs +0 -48
  164. package/esm2022/lib/compose/document.mobile.component.mjs +0 -23
  165. package/esm2022/lib/compose/document.pane.component.mjs +0 -27
  166. package/esm2022/lib/compose/events/events.component.mjs +0 -29
  167. package/esm2022/lib/compose/form-ref.mjs +0 -43
  168. package/esm2022/lib/compose/form-selector/form-selector.sheet.mjs +0 -57
  169. package/esm2022/lib/compose/form.component.mjs +0 -512
  170. package/esm2022/lib/compose/new-menu.component.mjs +0 -94
  171. package/esm2022/lib/compose/overlay.component.exp.mjs +0 -71
  172. package/esm2022/lib/compose/privilage.directive.mjs +0 -64
  173. package/esm2022/lib/compose/recipient-resolver.service.mjs +0 -18
  174. package/esm2022/lib/compose/state.component.mjs +0 -37
  175. package/esm2022/lib/compose/tag/tags.component.mjs +0 -89
  176. package/esm2022/lib/compose/trace/flow.component.mjs +0 -687
  177. package/esm2022/lib/compose/trace/people.component.mjs +0 -39
  178. package/esm2022/lib/compose/trace/trace.base.mjs +0 -79
  179. package/esm2022/lib/compose/trace/trace.component.mjs +0 -353
  180. package/esm2022/lib/compose/trace/trace.pane.component.mjs +0 -48
  181. package/esm2022/lib/compose/version-compare/version-compare.component.mjs +0 -58
  182. package/esm2022/lib/compose/version-compare/version-compare.directive.mjs +0 -345
  183. package/esm2022/lib/compose/version-compare/version.pane.component.mjs +0 -53
  184. package/esm2022/lib/core/account.service.mjs +0 -38
  185. package/esm2022/lib/core/animated-icon/animated-icon.directive.mjs +0 -17
  186. package/esm2022/lib/core/animations.mjs +0 -168
  187. package/esm2022/lib/core/authentication.mjs +0 -4
  188. package/esm2022/lib/core/avatar/avatar.component.mjs +0 -111
  189. package/esm2022/lib/core/base.mjs +0 -2
  190. package/esm2022/lib/core/checkbox.mjs +0 -38
  191. package/esm2022/lib/core/colors.mjs +0 -322
  192. package/esm2022/lib/core/component-factory-resolver.mjs +0 -48
  193. package/esm2022/lib/core/configuration.mjs +0 -17
  194. package/esm2022/lib/core/datasource.service.mjs +0 -75
  195. package/esm2022/lib/core/decorators.mjs +0 -46
  196. package/esm2022/lib/core/document-factory.service.mjs +0 -156
  197. package/esm2022/lib/core/fields/address.designer.mjs +0 -39
  198. package/esm2022/lib/core/fields/address.field.mjs +0 -65
  199. package/esm2022/lib/core/fields/autocomplete.field.mjs +0 -136
  200. package/esm2022/lib/core/fields/axes-picker.designer.mjs +0 -59
  201. package/esm2022/lib/core/fields/axes-picker.field.mjs +0 -46
  202. package/esm2022/lib/core/fields/checkbox.designer.mjs +0 -38
  203. package/esm2022/lib/core/fields/checkbox.field.mjs +0 -35
  204. package/esm2022/lib/core/fields/checklist.designer.mjs +0 -98
  205. package/esm2022/lib/core/fields/checklist.field.mjs +0 -36
  206. package/esm2022/lib/core/fields/date-range.designer.mjs +0 -43
  207. package/esm2022/lib/core/fields/date-range.field.mjs +0 -46
  208. package/esm2022/lib/core/fields/date.designer.mjs +0 -40
  209. package/esm2022/lib/core/fields/date.field.mjs +0 -40
  210. package/esm2022/lib/core/fields/expression.field.mjs +0 -87
  211. package/esm2022/lib/core/fields/file.designer.mjs +0 -39
  212. package/esm2022/lib/core/fields/file.field.mjs +0 -35
  213. package/esm2022/lib/core/fields/html.designer.mjs +0 -61
  214. package/esm2022/lib/core/fields/html.field.mjs +0 -44
  215. package/esm2022/lib/core/fields/input.designer.mjs +0 -38
  216. package/esm2022/lib/core/fields/input.field.mjs +0 -54
  217. package/esm2022/lib/core/fields/localized-string.field.mjs +0 -49
  218. package/esm2022/lib/core/fields/numeric.designer.mjs +0 -72
  219. package/esm2022/lib/core/fields/numeric.field.mjs +0 -37
  220. package/esm2022/lib/core/fields/options.base.mjs +0 -41
  221. package/esm2022/lib/core/fields/options.component.mjs +0 -58
  222. package/esm2022/lib/core/fields/radio-button.designer.mjs +0 -39
  223. package/esm2022/lib/core/fields/radio-button.field.mjs +0 -33
  224. package/esm2022/lib/core/fields/select.designer.mjs +0 -104
  225. package/esm2022/lib/core/fields/select.field.mjs +0 -36
  226. package/esm2022/lib/core/fields/signature.designer.mjs +0 -37
  227. package/esm2022/lib/core/fields/signature.field.mjs +0 -52
  228. package/esm2022/lib/core/fields/switch.field.mjs +0 -35
  229. package/esm2022/lib/core/fields/tags.designer.mjs +0 -28
  230. package/esm2022/lib/core/fields/tags.field.mjs +0 -51
  231. package/esm2022/lib/core/fields/textarea.designer.mjs +0 -33
  232. package/esm2022/lib/core/fields/textarea.field.mjs +0 -37
  233. package/esm2022/lib/core/fields/time.designer.mjs +0 -41
  234. package/esm2022/lib/core/fields/time.field.mjs +0 -39
  235. package/esm2022/lib/core/fields/timespan.field.mjs +0 -82
  236. package/esm2022/lib/core/fields/yesno.designer.mjs +0 -52
  237. package/esm2022/lib/core/fields/yesno.field.mjs +0 -34
  238. package/esm2022/lib/core/firebase.service.mjs +0 -51
  239. package/esm2022/lib/core/functions.mjs +0 -225
  240. package/esm2022/lib/core/guide/guide.component.mjs +0 -220
  241. package/esm2022/lib/core/guide/guide.service.mjs +0 -124
  242. package/esm2022/lib/core/guide/help-tip.component.mjs +0 -52
  243. package/esm2022/lib/core/http.interceptor.mjs +0 -63
  244. package/esm2022/lib/core/hub.service.mjs +0 -117
  245. package/esm2022/lib/core/identity/identity.component.mjs +0 -66
  246. package/esm2022/lib/core/info/attachment-info.service.mjs +0 -53
  247. package/esm2022/lib/core/info/document-info.service.mjs +0 -21
  248. package/esm2022/lib/core/info/location-info.component.mjs +0 -60
  249. package/esm2022/lib/core/info/map-info.mjs +0 -42
  250. package/esm2022/lib/core/inputs/address.input.mjs +0 -203
  251. package/esm2022/lib/core/inputs/auto-complete.input.mjs +0 -273
  252. package/esm2022/lib/core/inputs/combination-picker-body.mjs +0 -171
  253. package/esm2022/lib/core/inputs/combination-picker.mjs +0 -285
  254. package/esm2022/lib/core/inputs/combination-pool.mjs +0 -105
  255. package/esm2022/lib/core/inputs/file.input.mjs +0 -432
  256. package/esm2022/lib/core/inputs/select.input.mjs +0 -254
  257. package/esm2022/lib/core/inputs/signature.input.mjs +0 -150
  258. package/esm2022/lib/core/inputs/time-picker.mjs +0 -195
  259. package/esm2022/lib/core/inputs/timespan.input.mjs +0 -180
  260. package/esm2022/lib/core/layout.component.mjs +0 -93
  261. package/esm2022/lib/core/lottie-animation.exp.mjs +0 -49
  262. package/esm2022/lib/core/mailbox.service.mjs +0 -445
  263. package/esm2022/lib/core/models.mjs +0 -25
  264. package/esm2022/lib/core/none.component.mjs +0 -37
  265. package/esm2022/lib/core/pipes/action.pipe.mjs +0 -25
  266. package/esm2022/lib/core/pipes/calendar.pipe.mjs +0 -72
  267. package/esm2022/lib/core/pipes/date-format.pipe.mjs +0 -19
  268. package/esm2022/lib/core/pipes/daterange.pipe.mjs +0 -62
  269. package/esm2022/lib/core/pipes/difference.pipe.mjs +0 -15
  270. package/esm2022/lib/core/pipes/duration-format.pipe.mjs +0 -48
  271. package/esm2022/lib/core/pipes/duration.pipe.mjs +0 -19
  272. package/esm2022/lib/core/pipes/filter.pipe.mjs +0 -25
  273. package/esm2022/lib/core/pipes/form.pipe.mjs +0 -25
  274. package/esm2022/lib/core/pipes/join.pipe.mjs +0 -18
  275. package/esm2022/lib/core/pipes/localized-string.pipe.mjs +0 -26
  276. package/esm2022/lib/core/pipes/role.pipe.mjs +0 -25
  277. package/esm2022/lib/core/pipes/sanitize-html.pipe.mjs +0 -18
  278. package/esm2022/lib/core/pipes/sort.pipe.mjs +0 -42
  279. package/esm2022/lib/core/pipes/state.pipe.mjs +0 -25
  280. package/esm2022/lib/core/pipes/time-ago.pipe.mjs +0 -51
  281. package/esm2022/lib/core/pipes/to-now.pipe.mjs +0 -66
  282. package/esm2022/lib/core/pipes/translate.pipe.mjs +0 -58
  283. package/esm2022/lib/core/pipes/type-value.pipe.mjs +0 -42
  284. package/esm2022/lib/core/pipes/user-name.pipe.mjs +0 -21
  285. package/esm2022/lib/core/popup/popup-ref.mjs +0 -20
  286. package/esm2022/lib/core/popup/popup.component.mjs +0 -36
  287. package/esm2022/lib/core/popup/popup.service.mjs +0 -158
  288. package/esm2022/lib/core/popup/tooltip.directive.mjs +0 -81
  289. package/esm2022/lib/core/prompt/ask/ask.dialog.mjs +0 -29
  290. package/esm2022/lib/core/prompt/mask/mask.component.mjs +0 -21
  291. package/esm2022/lib/core/prompt.service.mjs +0 -88
  292. package/esm2022/lib/core/router.mjs +0 -37
  293. package/esm2022/lib/core/save-changes.dialog.mjs +0 -18
  294. package/esm2022/lib/core/session.service.mjs +0 -291
  295. package/esm2022/lib/core/slots/pane-ref.mjs +0 -152
  296. package/esm2022/lib/core/slots/router.directive.mjs +0 -68
  297. package/esm2022/lib/core/slots/router.service.mjs +0 -40
  298. package/esm2022/lib/core/slots/slots.component.mjs +0 -1191
  299. package/esm2022/lib/core/sticky-toolbar.exp.mjs +0 -33
  300. package/esm2022/lib/core/tagging/documents.component.mjs +0 -25
  301. package/esm2022/lib/core/tagging/edit-input.component.mjs +0 -231
  302. package/esm2022/lib/core/tagging/emoji.component.mjs +0 -35
  303. package/esm2022/lib/core/tagging/tagging-item.directive.mjs +0 -39
  304. package/esm2022/lib/core/tagging/tagging.component-base.mjs +0 -29
  305. package/esm2022/lib/core/tagging/tagging.directive.mjs +0 -137
  306. package/esm2022/lib/core/tagging/tagging.pipe.mjs +0 -72
  307. package/esm2022/lib/core/tagging/users.component.mjs +0 -32
  308. package/esm2022/lib/core/translate.service.mjs +0 -125
  309. package/esm2022/lib/core/translations.mjs +0 -1068
  310. package/esm2022/lib/core/virtual-tabs.component.exp.mjs +0 -84
  311. package/esm2022/lib/core/window-title.service.mjs +0 -61
  312. package/esm2022/lib/cube/accum/accum.component.mjs +0 -262
  313. package/esm2022/lib/cube/chart/chart.component.mjs +0 -345
  314. package/esm2022/lib/cube/cube-info.service.mjs +0 -103
  315. package/esm2022/lib/cube/cube-menu.component.mjs +0 -25
  316. package/esm2022/lib/cube/cube-view.component.mjs +0 -186
  317. package/esm2022/lib/cube/cube.service.mjs +0 -446
  318. package/esm2022/lib/cube/declarations.mjs +0 -2
  319. package/esm2022/lib/cube/explore/document-item.component.mjs +0 -38
  320. package/esm2022/lib/cube/explore/explore-item.component.mjs +0 -27
  321. package/esm2022/lib/cube/explore/explore-items.component.mjs +0 -193
  322. package/esm2022/lib/cube/explore/explore.pane.component.mjs +0 -78
  323. package/esm2022/lib/cube/explore/item-resolver.service.mjs +0 -30
  324. package/esm2022/lib/cube/explore/item.pane.component.mjs +0 -21
  325. package/esm2022/lib/cube/filter/filter-tags.component.exp.mjs +0 -75
  326. package/esm2022/lib/cube/filter/filter.component.mjs +0 -137
  327. package/esm2022/lib/cube/grid/grid.component.mjs +0 -210
  328. package/esm2022/lib/cube/matrix/matrix.base.mjs +0 -124
  329. package/esm2022/lib/cube/matrix/matrix.mobile.component.mjs +0 -67
  330. package/esm2022/lib/cube/matrix/matrix.pane.component.mjs +0 -78
  331. package/esm2022/lib/cube/matrix/popup.component.mjs +0 -70
  332. package/esm2022/lib/cube/matrix/table.component.mjs +0 -512
  333. package/esm2022/lib/cube/parallel/item.mjs +0 -40
  334. package/esm2022/lib/cube/parallel/parallel.component.mjs +0 -162
  335. package/esm2022/lib/cube/pivot/pivot.component.mjs +0 -564
  336. package/esm2022/lib/cube/spreadsheet/spreadsheet.component.mjs +0 -382
  337. package/esm2022/lib/cube/spreadsheet/spreadsheet.container.exp.mjs +0 -19
  338. package/esm2022/lib/cube/sum/sum.component.mjs +0 -403
  339. package/esm2022/lib/cube/view-base.mjs +0 -74
  340. package/esm2022/lib/cube/view.mobile.component.mjs +0 -121
  341. package/esm2022/lib/cube/view.pane.component.mjs +0 -99
  342. package/esm2022/lib/dashboard/actions/actions.widget.mjs +0 -127
  343. package/esm2022/lib/dashboard/cube/accum-cube.widget.mjs +0 -151
  344. package/esm2022/lib/dashboard/cube/compare.widget.mjs +0 -216
  345. package/esm2022/lib/dashboard/cube/cube-analysis.base.mjs +0 -117
  346. package/esm2022/lib/dashboard/cube/cube-analysis.widget.mjs +0 -50
  347. package/esm2022/lib/dashboard/cube/cube-chart.widget.mjs +0 -146
  348. package/esm2022/lib/dashboard/cube/document-state.widget.mjs +0 -85
  349. package/esm2022/lib/dashboard/cube/documents.widget.mjs +0 -66
  350. package/esm2022/lib/dashboard/cube/filter/filter.component.mjs +0 -61
  351. package/esm2022/lib/dashboard/dashboard.component.mjs +0 -67
  352. package/esm2022/lib/dashboard/dashboard.pane.component.mjs +0 -18
  353. package/esm2022/lib/dashboard/recents/recents.widget.mjs +0 -98
  354. package/esm2022/lib/dashboard/score/activity.widget.mjs +0 -177
  355. package/esm2022/lib/dashboard/score/compare-groups.widget.mjs +0 -215
  356. package/esm2022/lib/dashboard/score/peers-performance.widget.mjs +0 -251
  357. package/esm2022/lib/dashboard/score/pending-results.widget.mjs +0 -59
  358. package/esm2022/lib/dashboard/score/personal-score.widget.mjs +0 -222
  359. package/esm2022/lib/dashboard/widget-item.component.mjs +0 -91
  360. package/esm2022/lib/dashboard/widget-ref.mjs +0 -18
  361. package/esm2022/lib/designer.module.mjs +0 -106
  362. package/esm2022/lib/desktop.module.mjs +0 -140
  363. package/esm2022/lib/home/about/about.dialog.mjs +0 -25
  364. package/esm2022/lib/home/home-base.component.mjs +0 -92
  365. package/esm2022/lib/home/home.desktop.component.mjs +0 -286
  366. package/esm2022/lib/home/home.mobile.component.mjs +0 -131
  367. package/esm2022/lib/home/notifications/notifications.component.mjs +0 -64
  368. package/esm2022/lib/home/outofoffice/outofoffice.component.mjs +0 -37
  369. package/esm2022/lib/home/sign/sign.component.mjs +0 -56
  370. package/esm2022/lib/impersonate/impersonate.component.mjs +0 -77
  371. package/esm2022/lib/mobile.module.mjs +0 -61
  372. package/esm2022/lib/modules/chart.module.mjs +0 -44
  373. package/esm2022/lib/modules/circular-gauge.module.mjs +0 -20
  374. package/esm2022/lib/modules/date.adapter.mjs +0 -23
  375. package/esm2022/lib/modules/datepicker.intl.mjs +0 -41
  376. package/esm2022/lib/modules/dayjs.module.mjs +0 -43
  377. package/esm2022/lib/modules/diagram.module.mjs +0 -39
  378. package/esm2022/lib/modules/gantt.module.mjs +0 -22
  379. package/esm2022/lib/modules/grid.module.mjs +0 -26
  380. package/esm2022/lib/modules/linear-gauge.module.mjs +0 -17
  381. package/esm2022/lib/modules/material.module.mjs +0 -182
  382. package/esm2022/lib/modules/paginator.intl.mjs +0 -21
  383. package/esm2022/lib/modules/pivot.module.mjs +0 -24
  384. package/esm2022/lib/modules/schedule.module.mjs +0 -24
  385. package/esm2022/lib/modules/spreadsheet.module.mjs +0 -28
  386. package/esm2022/lib/modules/stepper.intl.mjs +0 -17
  387. package/esm2022/lib/modules/texteditor.module.mjs +0 -26
  388. package/esm2022/lib/notifications/filter.component.mjs +0 -24
  389. package/esm2022/lib/notifications/notifications-table.component.mjs +0 -105
  390. package/esm2022/lib/notifications/notifications.component-base.mjs +0 -50
  391. package/esm2022/lib/notifications/notifications.mobile.component.mjs +0 -20
  392. package/esm2022/lib/notifications/notifications.pane.component.mjs +0 -21
  393. package/esm2022/lib/notifications/notifications.service.mjs +0 -78
  394. package/esm2022/lib/notifications/types/commented.notification.mjs +0 -60
  395. package/esm2022/lib/notifications/types/cube-anomaly.notification.mjs +0 -58
  396. package/esm2022/lib/notifications/types/escalated.notification.mjs +0 -33
  397. package/esm2022/lib/notifications/types/invite.notification.mjs +0 -45
  398. package/esm2022/lib/notifications/types/liked.notification.mjs +0 -58
  399. package/esm2022/lib/notifications/types/long-running-task.notification.mjs +0 -31
  400. package/esm2022/lib/notifications/types/notification-base.mjs +0 -40
  401. package/esm2022/lib/notifications/types/nudge.notification.mjs +0 -31
  402. package/esm2022/lib/notifications/types/state-changed.notification.mjs +0 -30
  403. package/esm2022/lib/notifications/types/tagged.notification.mjs +0 -43
  404. package/esm2022/lib/notifications/types/text.notification.mjs +0 -23
  405. package/esm2022/lib/notifications/types/upcoming-event.notification.mjs +0 -36
  406. package/esm2022/lib/options/options.component.mjs +0 -308
  407. package/esm2022/lib/options/options.desktop.component.mjs +0 -26
  408. package/esm2022/lib/options/options.mobile.component.mjs +0 -23
  409. package/esm2022/lib/reports/arguments-component.mjs +0 -81
  410. package/esm2022/lib/reports/cube/documents.component.mjs +0 -38
  411. package/esm2022/lib/reports/cube/grid-documents.component.mjs +0 -72
  412. package/esm2022/lib/reports/cube/performance-hilo.component.mjs +0 -260
  413. package/esm2022/lib/reports/cube/performance-wind.component.mjs +0 -269
  414. package/esm2022/lib/reports/cube/table-documents.component.mjs +0 -57
  415. package/esm2022/lib/reports/cube/usage-args.component.mjs +0 -62
  416. package/esm2022/lib/reports/cube/usage-base.mjs +0 -79
  417. package/esm2022/lib/reports/cube/usage-chart.component.mjs +0 -354
  418. package/esm2022/lib/reports/cube/usage-pivot.component.mjs +0 -257
  419. package/esm2022/lib/reports/cube/usage.component.mjs +0 -40
  420. package/esm2022/lib/reports/report-ref.mjs +0 -38
  421. package/esm2022/lib/reports/report-viewer.component.mjs +0 -156
  422. package/esm2022/lib/reports/report.mobile.component.mjs +0 -127
  423. package/esm2022/lib/reports/report.pane.component.mjs +0 -109
  424. package/esm2022/lib/reports/reports-menu.component.mjs +0 -24
  425. package/esm2022/lib/reports/substitution/substitution.component.mjs +0 -39
  426. package/esm2022/lib/reports/table/table-view.component.mjs +0 -40
  427. package/esm2022/lib/reports/tasks/tasks.component.mjs +0 -95
  428. package/esm2022/lib/routes.desktop.mjs +0 -209
  429. package/esm2022/lib/routes.mobile.mjs +0 -85
  430. package/esm2022/lib/scheduler/schedule.component.mjs +0 -164
  431. package/esm2022/lib/scheduler/scheduler.mobile.component.mjs +0 -37
  432. package/esm2022/lib/scheduler/scheduler.pane.component.mjs +0 -50
  433. package/esm2022/lib/search/cube.component.mjs +0 -47
  434. package/esm2022/lib/search/declarations.mjs +0 -7
  435. package/esm2022/lib/search/document.component.mjs +0 -41
  436. package/esm2022/lib/search/guide.component.mjs +0 -28
  437. package/esm2022/lib/search/path.component.mjs +0 -44
  438. package/esm2022/lib/search/search.service.mjs +0 -155
  439. package/esm2022/lib/shared.module.mjs +0 -622
  440. package/esm2022/lib/system.module.mjs +0 -562
  441. package/esm2022/lib/views/cube/chart.component.mjs +0 -74
  442. package/esm2022/lib/views/cube/cube-base.mjs +0 -101
  443. package/esm2022/lib/views/cube/explore.component.mjs +0 -85
  444. package/esm2022/lib/views/cube/matrix.component.mjs +0 -101
  445. package/esm2022/lib/views/cube/parallel.component.mjs +0 -53
  446. package/esm2022/lib/views/cube/pivot.component.mjs +0 -50
  447. package/esm2022/lib/views/cube/sum.component.mjs +0 -66
  448. package/esm2022/lib/views/cube/view.component.mjs +0 -101
  449. package/esm2022/lib/views/document-view-ref.mjs +0 -27
  450. package/esm2022/lib/views/timeline/timeline.component.mjs +0 -329
  451. package/esm2022/lib/views/view-item.component.mjs +0 -68
  452. package/esm2022/lib/views/views.component.mjs +0 -32
  453. package/esm2022/lib/views/views.mobile.component.mjs +0 -21
  454. package/esm2022/lib/views/views.pane.component.mjs +0 -29
  455. package/esm2022/public-api.mjs +0 -182
@@ -1,463 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { Component, ViewChild, Inject, HostListener } from '@angular/core';
3
- import { Subject, of, EMPTY, forkJoin, firstValueFrom } from 'rxjs';
4
- import { takeUntil, filter, tap, switchMap } from 'rxjs/operators';
5
- import { FormControl, FormGroup, Validators } from '@angular/forms';
6
- import { MatSort } from '@angular/material/sort';
7
- import { MatTableDataSource } from '@angular/material/table';
8
- import { Workbook } from '@syncfusion/ej2-excel-export';
9
- import { UtilityRef } from '../utility-ref';
10
- import { BizDoc } from '../../core/decorators';
11
- import { PositionsPopup } from './positions-popup.component';
12
- import * as i0 from "@angular/core";
13
- import * as i1 from "../../core/session.service";
14
- import * as i2 from "../../core/datasource.service";
15
- import * as i3 from "../../core/prompt.service";
16
- import * as i4 from "../../core/window-title.service";
17
- import * as i5 from "../../core/translate.service";
18
- import * as i6 from "../../core/popup/popup.service";
19
- import * as i7 from "../system.service";
20
- import * as i8 from "@angular/material/dialog";
21
- import * as i9 from "@angular/forms";
22
- import * as i10 from "@angular/material/table";
23
- import * as i11 from "@angular/material/sort";
24
- import * as i12 from "@angular/material/progress-bar";
25
- import * as i13 from "@angular/material/list";
26
- import * as i14 from "@angular/material/divider";
27
- import * as i15 from "@angular/material/toolbar";
28
- import * as i16 from "@angular/material/core";
29
- import * as i17 from "@angular/material/form-field";
30
- import * as i18 from "@angular/material/select";
31
- import * as i19 from "@angular/material/button";
32
- import * as i20 from "@angular/material/input";
33
- import * as i21 from "@angular/material/icon";
34
- import * as i22 from "@angular/material/menu";
35
- import * as i23 from "../../core/popup/tooltip.directive";
36
- import * as i24 from "../core/search.input";
37
- import * as i25 from "../../core/pipes/sanitize-html.pipe";
38
- import * as i26 from "../../core/pipes/translate.pipe";
39
- import * as i27 from "../utility-ref";
40
- let PositionsComponent = class PositionsComponent {
41
- /** positions ctor */
42
- constructor(_session, _utilityRef, _datasources, _ps, title, _translate, _popup, _service, _dialog) {
43
- this._session = _session;
44
- this._utilityRef = _utilityRef;
45
- this._datasources = _datasources;
46
- this._ps = _ps;
47
- this._translate = _translate;
48
- this._popup = _popup;
49
- this._service = _service;
50
- this._dialog = _dialog;
51
- this.tools = true;
52
- this.dirty = false;
53
- this.saving = false;
54
- this.form = new FormGroup({});
55
- this.role = new FormGroup({
56
- title: new FormControl(null, Validators.required)
57
- });
58
- this.pattern = new FormGroup({
59
- title: new FormControl(null, Validators.required),
60
- expression: new FormControl(null, Validators.required)
61
- });
62
- this.group = new FormGroup({
63
- title: new FormControl(null, Validators.required),
64
- items: new FormControl(null, Validators.required)
65
- });
66
- this._destroy = new Subject();
67
- title.set(_translate.get('Roles'));
68
- }
69
- ngOnInit() {
70
- this.loading = 'query';
71
- this._prepare().subscribe(() => this._utilityRef.populate().subscribe(r => {
72
- this._everything = r;
73
- const type = this.datatypes.find(t => this._session.profile.roles.findIndex(r => r.dataType === t.name) > -1);
74
- type && this.change(type.name);
75
- this.loading = null;
76
- }));
77
- }
78
- _prepare() {
79
- return forkJoin([this._service.datatypes().
80
- pipe(tap(t => this.datatypes =
81
- t.filter(t => t.assignable))),
82
- this._datasources.map('users').pipe(tap(u => this.profiles = u))
83
- ]);
84
- }
85
- search(value) {
86
- this.dataSource.filter = value;
87
- }
88
- async change(name) {
89
- const type = this.type = this.datatypes.find(t => t.name === name);
90
- const roles = this.roles = this._session.profile.roles.filter(r => r.dataType === name);
91
- this.loading = 'query';
92
- this._datasources.all(type.name).subscribe({
93
- next: t => {
94
- this.source = t;
95
- const model = this._everything[type.name];
96
- let positions = model.positions;
97
- if (!positions)
98
- positions = model.positions = {};
99
- if (!model.groups)
100
- model.groups = [];
101
- if (!model.patterns)
102
- model.patterns = [];
103
- roles.forEach(r => {
104
- if (!positions[r.name])
105
- positions[r.name] = {};
106
- });
107
- this.positions = positions;
108
- const rows = [];
109
- model.patterns && model.patterns.forEach(p => {
110
- const row = { type: 'pattern', key: p.name };
111
- row[type.columns ? type.columns[0].name : 'value'] = p.title;
112
- rows.push(row);
113
- });
114
- model.groups && model.groups.forEach(g => {
115
- const row = { type: 'group', key: g.name };
116
- row[type.columns ? type.columns[0].name : 'value'] = g.title;
117
- rows.push(row);
118
- });
119
- t.forEach(t => {
120
- const row = { type: 'key', ...t };
121
- type.columns && type.columns.forEach(c => {
122
- row[c.name] = t.value[c.name];
123
- });
124
- rows.push(row);
125
- });
126
- this.dataSource = new MatTableDataSource(rows);
127
- this.dataSource.sort = this.sort;
128
- this._columns();
129
- !roles.length &&
130
- this._dialog.open(this.noRoleTpl).afterClosed().subscribe(ok => ok && this.newRole());
131
- this.loading = null;
132
- }, error: () => {
133
- this.loading = null;
134
- this._ps.error();
135
- }
136
- });
137
- }
138
- _columns() {
139
- this.displayedColumns = (this.type.columns ? this.type.columns.map(c => c.name) : ['key', 'value']).concat(this.roles.map(r => r.name)).concat(['options']);
140
- }
141
- /**
142
- *
143
- * @param key
144
- * @param evt
145
- */
146
- edit(key, evt) {
147
- if (evt.target.tagName === 'MAT-ICON')
148
- return;
149
- let cell = evt.target;
150
- while (cell.tagName !== 'TD')
151
- cell = cell.parentElement;
152
- const role = cell.getAttribute('data-role');
153
- if (!role)
154
- return;
155
- const crole = this.roles.find(r => r.name === role);
156
- let positions = this.positions[role][key];
157
- if (!positions)
158
- positions = this.positions[role][key] = [];
159
- this._popup.open(PositionsPopup, evt.target, {
160
- data: { title: crole.title, positions }
161
- }).opened().subscribe(e => e.valueChange.pipe(takeUntil(this._destroy)).subscribe(() => this.dirty = true));
162
- }
163
- _openDialog(tmpl, form, values) {
164
- form.reset(values);
165
- const dialogRef = this._dialog.open(tmpl);
166
- dialogRef.keydownEvents().pipe(filter(k => k.key === 'Enter'), takeUntil(dialogRef.afterClosed())).
167
- subscribe(() => form.valid && dialogRef.close(form.value));
168
- return dialogRef.afterClosed().pipe(switchMap(v => v ? of(v) : EMPTY));
169
- }
170
- newRole() {
171
- this._openDialog(this.roleTpl, this.role, { title: null }).
172
- subscribe((r) => {
173
- const name = r.title.normalize(), role = { ...r, name };
174
- this.positions[name] = {};
175
- this._everything[this.type.name].roles.push(role);
176
- this.roles.push(role);
177
- this._columns();
178
- this.dirty = true;
179
- });
180
- }
181
- newGroup() {
182
- this._openDialog(this.newGroupTpl, this.group, { items: [], title: null }).subscribe((g) => {
183
- const name = g.title.normalize();
184
- this._everything[this.type.name].groups.push({ name, ...g });
185
- const row = { key: name, type: 'group' };
186
- row[this.type.columns ? this.type.columns[0].name : 'value'] = g.title;
187
- this.dataSource.data.splice(0, 0, row);
188
- this.dataSource.filter = '';
189
- this.dirty = true;
190
- });
191
- }
192
- newPattern() {
193
- this._openDialog(this.patternTpl, this.pattern, { title: null, expression: null }).subscribe((p) => {
194
- const name = p.title.normalize();
195
- this._everything[this.type.name].patterns.push({ ...p, name });
196
- const row = { key: name, type: 'pattern' };
197
- row[this.type.columns ? this.type.columns[0].name : 'value'] = p.title;
198
- this.dataSource.data.splice(0, 0, row);
199
- this.dataSource.filter = '';
200
- this.dirty = true;
201
- });
202
- }
203
- deleteGroup(name) {
204
- const groups = this._everything[this.type.name].groups, group = groups.find(g => g.name === name);
205
- this._ps.ask('RemoveAsk', undefined, { ok: 'Yes', cancel: 'No' }).subscribe(ok => {
206
- if (ok) {
207
- groups.remove(group);
208
- Object.keys(this.positions).forEach(r => {
209
- const positions = this.positions[r][group.name];
210
- if (positions)
211
- delete this.positions[r][group.name];
212
- });
213
- this.dataSource.data.remove(this.dataSource.data.find(g => g.key === group.name && g.type === 'group'));
214
- this.dataSource.filter = '';
215
- }
216
- });
217
- }
218
- deletePattern(name) {
219
- const patterns = this._everything[this.type.name].patterns, pattern = patterns.find(p => p.name === name);
220
- this._ps.ask('RemoveAsk', undefined, { ok: 'Yes', cancel: 'No' }).subscribe(ok => {
221
- if (ok) {
222
- patterns.remove(pattern);
223
- this.dataSource.data.remove(this.dataSource.data.find(p => p.key === pattern.name && p.type === 'pattern'));
224
- this.dataSource.filter = '';
225
- Object.keys(this.positions).forEach(r => {
226
- const positions = this.positions[r][pattern.name];
227
- if (positions)
228
- delete this.positions[r][pattern.name];
229
- });
230
- }
231
- });
232
- }
233
- editGroup(name) {
234
- const groups = this._everything[this.type.name].groups, group = groups.find(g => g.name === name);
235
- this._openDialog(this.newGroupTpl, this.group, group).subscribe((g) => {
236
- Object.assign(group, g);
237
- this.dirty = true;
238
- });
239
- }
240
- editPattern(name) {
241
- const patterns = this._everything[this.type.name].patterns, pattern = patterns.find(p => p.name === name);
242
- this._openDialog(this.patternTpl, this.pattern, pattern).subscribe((p) => {
243
- Object.assign(pattern, p);
244
- this.dirty = true;
245
- });
246
- }
247
- /**
248
- * Ctrl-s save
249
- * @param event
250
- */
251
- handleKeyboardEvent(event) {
252
- if (this.dirty && event.ctrlKey && (event.key === 's' || event.key === 'S')) {
253
- this.save();
254
- event.preventDefault();
255
- }
256
- }
257
- save() {
258
- this.saving = true;
259
- this.loading = 'indeterminate';
260
- return firstValueFrom(this._utilityRef.execute(this._everything)).then(() => {
261
- this._ps.toast('ChangesSaved');
262
- this.dirty = false;
263
- this.loading = null;
264
- this._session.refresh().subscribe();
265
- }, () => this._ps.error()).finally(() => {
266
- this.saving = false;
267
- this.loading = null;
268
- });
269
- }
270
- async download() {
271
- const { profiles } = this, worksheets = [];
272
- for (let i = 0; i < this.datatypes.length; i++) {
273
- let type = this.datatypes[i];
274
- const model = this._everything[type.name];
275
- let positions = model.positions;
276
- if (!positions || !Object.keys(positions).length)
277
- continue;
278
- const roles = this._session.profile.roles.filter(r => r.dataType === type.name && positions[r.name]);
279
- const cells = [{
280
- index: 1,
281
- value: this._translate.get('Type'),
282
- style: {
283
- bold: true
284
- }
285
- }, {
286
- index: 2,
287
- value: this._translate.get('Value'),
288
- style: {
289
- bold: true
290
- }
291
- }, {
292
- index: 3,
293
- value: ''
294
- }];
295
- if (type.columns)
296
- type.columns.slice(2).forEach((c, i) => cells.push({
297
- index: i + 4,
298
- value: ''
299
- }));
300
- roles.forEach(r => cells.push({
301
- index: cells.length + 1,
302
- value: r.title,
303
- style: {
304
- bold: true
305
- }
306
- }));
307
- const rows = [];
308
- rows.push({
309
- index: 1,
310
- cells
311
- });
312
- model.patterns && model.patterns.forEach(p => {
313
- const row = {
314
- index: rows.length + 1,
315
- cells: [{
316
- index: 1,
317
- value: this._translate.get('Pattern')
318
- }, {
319
- index: 2,
320
- value: p.expression
321
- }, {
322
- index: 3,
323
- value: p.title
324
- }]
325
- };
326
- addcolumns(p.name, row);
327
- rows.push(row);
328
- });
329
- model.groups && model.groups.forEach(g => {
330
- const row = {
331
- index: rows.length + 1,
332
- cells: [{
333
- index: 1,
334
- value: this._translate.get('Group')
335
- }, {
336
- index: 2,
337
- value: g.items.join(', ')
338
- }, {
339
- index: 3,
340
- value: g.title
341
- }]
342
- };
343
- addcolumns(g.name, row);
344
- rows.push(row);
345
- });
346
- let datasource = await firstValueFrom(this._datasources.all(type.name));
347
- datasource.forEach(d => {
348
- const row = {
349
- index: rows.length + 1,
350
- cells: [{
351
- index: 1,
352
- value: this._translate.get('Key')
353
- }]
354
- };
355
- if (type.columns)
356
- type.columns.forEach((c, i) => row.cells.push({
357
- index: i + 2,
358
- value: d.value[c.name]
359
- }));
360
- else
361
- row.cells.push({ index: 2, value: d.value });
362
- addcolumns(d.key, row);
363
- rows.push(row);
364
- });
365
- const columns = [];
366
- type.columns && type.columns.forEach((_, i) => columns.push({ index: i + 1, width: 250 }));
367
- roles.forEach((_, i) => columns.push({ index: columns.length + i + 2 }));
368
- worksheets.push({
369
- name: type.title,
370
- columns,
371
- rows
372
- });
373
- function addcolumns(key, row) {
374
- roles.forEach(r => {
375
- const users = positions[r.name][key];
376
- row.cells.push({
377
- index: row.cells.length + 1,
378
- value: users ? users.map(u => profiles[u] ? profiles[u].name : u).join(', ') : ''
379
- });
380
- });
381
- }
382
- }
383
- const book = new Workbook({
384
- worksheets,
385
- }, 'xlsx');
386
- book.save(`${this._translate.get('Positions')}.xlsx`);
387
- }
388
- // async upload(evt: InputEvent) {
389
- // const { files } = evt.target as HTMLInputElement;
390
- // if (files && files.length) {
391
- // const file = files.item(0);
392
- // var reader = new FileReader();
393
- // reader.onload = e => { };
394
- // const text = await file.text();
395
- // //reader.readAs(text);
396
- // const wb = XLSX.readFile(file.name, {});
397
- // for (let i = 0; i < wb.SheetNames.length; i++) {
398
- // let title = wb.SheetNames[i], ws = wb.Sheets[title];
399
- // let type = this.types.find(t => t.title === title);
400
- // if (!type) throw '';
401
- // let roles = this._session.profile.roles.filter(r => r.dataType === type.name);
402
- // let row = ws['!rows'][0];
403
- // for (let c = 0; c < ws['!cols'].length; c++) {
404
- // let col = ws['!cols'][c];
405
- // //let role = roles.find(r => r.title === ws.);
406
- // // if (!role) {
407
- // // this._everything[type.name].roles.push({name: '', title: ''});
408
- // // }
409
- // }
410
- // for (let r = 0; r < ws['!rows'].length; r++) {
411
- // let row = ws['!rows'][r];
412
- // for (let c = 0; c < ws['!cols'].length; c++) {
413
- // let col = ws['!cols'][c], content = '';
414
- // if (content) {
415
- // //let users = content.split(', ').map(name=> this.profiles.find(u=> u.name === name));
416
- // }
417
- // else { }
418
- // }
419
- // }
420
- // }
421
- // }
422
- //}
423
- ngOnDestroy() {
424
- this._destroy.next();
425
- this._destroy.complete();
426
- }
427
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: PositionsComponent, deps: [{ token: i1.SessionService }, { token: UtilityRef }, { token: i2.DatasourceService }, { token: i3.PromptService }, { token: i4.WindowTitleService }, { token: i5.TranslateService }, { token: i6.Popup }, { token: i7.SystemService }, { token: i8.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
428
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.5", type: PositionsComponent, selector: "ng-component", host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, viewQueries: [{ propertyName: "_fileElement", first: true, predicate: ["file"], descendants: true, static: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "noRoleTpl", first: true, predicate: ["noRoleTpl"], descendants: true, static: true }, { propertyName: "roleTpl", first: true, predicate: ["roleTpl"], descendants: true, static: true }, { propertyName: "patternTpl", first: true, predicate: ["patternTpl"], descendants: true, static: true }, { propertyName: "newGroupTpl", first: true, predicate: ["groupTpl"], descendants: true, static: true }], ngImport: i0, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty\">{{'SaveChanges'|translate}}</button>\r\n <span class=\"divider\"></span>\r\n <bizdoc-search-input (valueChange)=\"search($event)\"></bizdoc-search-input>\r\n <button mat-icon-button [matMenuTriggerFor]=\"newMenu\" [bizdocTooltip]=\"'Add'|translate\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #newMenu>\r\n <button mat-menu-item (click)=\"newRole()\">{{'Role'|translate}}</button>\r\n <button mat-menu-item (click)=\"newPattern()\">{{'Pattern'|translate}}</button>\r\n <button mat-menu-item (click)=\"newGroup()\">{{'Group'|translate}} </button>\r\n </mat-menu>\r\n <button mat-icon-button [bizdocTooltip]=\"'Download' | translate\" (click)=\"download()\" [disabled]=\"dirty\"><mat-icon>save_alt</mat-icon></button>\r\n</mat-toolbar>\r\n<mat-progress-bar [mode]=\"loading\" [style.visibility]=\"loading ? 'visible':'hidden'\"></mat-progress-bar>\r\n<div class=\"row flex\">\r\n <mat-nav-list class=\"nav-list\" [style.display]=\"tools?'':'none'\">\r\n @for (t of datatypes; track t) {\r\n <mat-list-item (click)=\"change(t.name)\" [class.active]=\"t === type\">{{t.title}}</mat-list-item>\r\n }\r\n </mat-nav-list>\r\n <table mat-table matSort [dataSource]=\"dataSource\" [style.display]=\"dataSource ? '': 'none'\" class=\"flex\">\r\n @for (column of (type?.columns ||[]); track column) {\r\n <ng-container [matColumnDef]=\"column.name\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{column.label}}</th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.name]}} </td>\r\n </ng-container>\r\n }\r\n <ng-container matColumnDef=\"key\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span>\r\n @switch (element.type) {\r\n @case ('group') {\r\n ({{'Group'|translate}})\r\n }\r\n @case ('pattern') {\r\n ({{'Pattern'|translate}})\r\n }\r\n @default {\r\n {{element.key}}\r\n }\r\n }\r\n </span>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"value\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n {{element.value}}\r\n </td>\r\n </ng-container>\r\n @for (role of roles; track role) {\r\n <ng-container [matColumnDef]=\"role.name\">\r\n <th mat-header-cell *matHeaderCellDef>{{role.title}}</th>\r\n <td mat-cell *matCellDef=\"let element\" [attr.data-role]=\"role.name\" class=\"role-column\">\r\n @if (positions[role.name][element.key]) {\r\n @for (u of positions[role.name][element.key]; track u; let first = $first) {\r\n @if (!first) {\r\n ,\r\n }\r\n {{profiles[u]?.name}}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n <ng-container matColumnDef=\"options\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (element.type === 'pattern' || element.type === 'group') {\r\n <button mat-icon-button [matMenuTriggerFor]=\"options\"><mat-icon>more_vert</mat-icon></button>\r\n }\r\n <mat-menu #options>\r\n @if (element.type === 'pattern') {\r\n <button mat-menu-item (click)=\"editPattern(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deletePattern(element.key)\">{{'Remove'|translate}} </button>\r\n }\r\n @if (element.type === 'group') {\r\n <button mat-menu-item (click)=\"editGroup(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deleteGroup(element.key)\">{{'Remove'|translate}} </button>\r\n }\r\n </mat-menu>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: displayedColumns\" (click)=\"edit(element.key, $event)\"></tr>\r\n </table>\r\n</div>\r\n<!-- role template -->\r\n<ng-template #roleTpl>\r\n <h2 mat-dialog-title>{{'Role' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"role\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"role.value\" color=\"primary\" [disabled]=\"!role.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- pattern template -->\r\n<ng-template #patternTpl>\r\n <h2 mat-dialog-title>{{'Pattern' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"pattern\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <input matInput formControlName=\"expression\" [placeholder]=\"'Regex'| translate\" required autocomplete=\"off\" />\r\n <mat-hint><span [innerHTML]=\"'RegexHint' | translate : 'https://regex101.com/'| sanitizeHtml\"></span></mat-hint>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"pattern.value\" color=\"primary\" [disabled]=\"!pattern.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- group -->\r\n<ng-template #groupTpl>\r\n <h2 mat-dialog-title>{{'Group' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"group\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Items'|translate\" multiple formControlName=\"items\" required>\r\n <mat-select-trigger>\r\n {{group.value.items ? group.value.items[0] : ''}}\r\n @if (group.value.items?.length > 1) {\r\n <span class=\"additional-selection\">\r\n (+{{group.value.items.length - 1}} {{(group.value.items?.length === 2 ? 'Other' : 'Others')|translate}})\r\n </span>\r\n }\r\n </mat-select-trigger>\r\n @for (v of source; track v) {\r\n <mat-option [value]=\"v.key\">\r\n @if (!type.columns) {\r\n <span>{{v.value}}</span>\r\n }\r\n @if (type.columns) {\r\n <span>@for (c of type.columns; track c) {\r\n <span>{{v.value[c.name]}}</span>\r\n }</span>\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"group.value\" color=\"primary\" [disabled]=\"!group.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<ng-template #noRoleTpl>\r\n <mat-dialog-content>\r\n {{'NoRoles'|translate : type?.title}}\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">{{'CreateRole' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!--<form style=\"display:none\">\r\n<input type=\"file\" name=\"file\" (onchange)=\"upload($event)\" #file/>\r\n</form>-->\r\n", styles: [":host{-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.nav-list{min-width:180px}table{width:100%}.form{padding:8px}:host ::ng-deep .mat-mdc-list-item{cursor:pointer}table ::ng-deep .role-column{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i9.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i9.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i9.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i9.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i9.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i9.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i9.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i10.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i10.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i10.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i10.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i10.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i10.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i10.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i10.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i10.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i10.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i11.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i11.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i8.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i8.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i8.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i8.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i12.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i13.MatNavList, selector: "mat-nav-list", exportAs: ["matNavList"] }, { kind: "component", type: i13.MatListItem, selector: "mat-list-item, a[mat-list-item], button[mat-list-item]", inputs: ["activated"], exportAs: ["matListItem"] }, { kind: "component", type: i14.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i15.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i16.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i17.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i17.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "component", type: i18.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "directive", type: i18.MatSelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i19.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i19.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i20.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i21.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i22.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i22.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i22.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i23.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { kind: "component", type: i24.SearchInput, selector: "bizdoc-search-input", outputs: ["valueChange"] }, { kind: "pipe", type: i25.SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "pipe", type: i26.TranslatePipe, name: "translate" }] }); }
429
- };
430
- PositionsComponent = __decorate([
431
- BizDoc({ selector: 'bizdoc-positions' })
432
- /** positions component*/
433
- ], PositionsComponent);
434
- export { PositionsComponent };
435
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: PositionsComponent, decorators: [{
436
- type: Component,
437
- args: [{ template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty\">{{'SaveChanges'|translate}}</button>\r\n <span class=\"divider\"></span>\r\n <bizdoc-search-input (valueChange)=\"search($event)\"></bizdoc-search-input>\r\n <button mat-icon-button [matMenuTriggerFor]=\"newMenu\" [bizdocTooltip]=\"'Add'|translate\"><mat-icon>add</mat-icon></button>\r\n <mat-menu #newMenu>\r\n <button mat-menu-item (click)=\"newRole()\">{{'Role'|translate}}</button>\r\n <button mat-menu-item (click)=\"newPattern()\">{{'Pattern'|translate}}</button>\r\n <button mat-menu-item (click)=\"newGroup()\">{{'Group'|translate}} </button>\r\n </mat-menu>\r\n <button mat-icon-button [bizdocTooltip]=\"'Download' | translate\" (click)=\"download()\" [disabled]=\"dirty\"><mat-icon>save_alt</mat-icon></button>\r\n</mat-toolbar>\r\n<mat-progress-bar [mode]=\"loading\" [style.visibility]=\"loading ? 'visible':'hidden'\"></mat-progress-bar>\r\n<div class=\"row flex\">\r\n <mat-nav-list class=\"nav-list\" [style.display]=\"tools?'':'none'\">\r\n @for (t of datatypes; track t) {\r\n <mat-list-item (click)=\"change(t.name)\" [class.active]=\"t === type\">{{t.title}}</mat-list-item>\r\n }\r\n </mat-nav-list>\r\n <table mat-table matSort [dataSource]=\"dataSource\" [style.display]=\"dataSource ? '': 'none'\" class=\"flex\">\r\n @for (column of (type?.columns ||[]); track column) {\r\n <ng-container [matColumnDef]=\"column.name\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{column.label}}</th>\r\n <td mat-cell *matCellDef=\"let element\"> {{element[column.name]}} </td>\r\n </ng-container>\r\n }\r\n <ng-container matColumnDef=\"key\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n <span>\r\n @switch (element.type) {\r\n @case ('group') {\r\n ({{'Group'|translate}})\r\n }\r\n @case ('pattern') {\r\n ({{'Pattern'|translate}})\r\n }\r\n @default {\r\n {{element.key}}\r\n }\r\n }\r\n </span>\r\n </td>\r\n </ng-container>\r\n <ng-container matColumnDef=\"value\">\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header>{{''}}</th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n {{element.value}}\r\n </td>\r\n </ng-container>\r\n @for (role of roles; track role) {\r\n <ng-container [matColumnDef]=\"role.name\">\r\n <th mat-header-cell *matHeaderCellDef>{{role.title}}</th>\r\n <td mat-cell *matCellDef=\"let element\" [attr.data-role]=\"role.name\" class=\"role-column\">\r\n @if (positions[role.name][element.key]) {\r\n @for (u of positions[role.name][element.key]; track u; let first = $first) {\r\n @if (!first) {\r\n ,\r\n }\r\n {{profiles[u]?.name}}\r\n }\r\n }\r\n </td>\r\n </ng-container>\r\n }\r\n <ng-container matColumnDef=\"options\">\r\n <th mat-header-cell *matHeaderCellDef></th>\r\n <td mat-cell *matCellDef=\"let element\">\r\n @if (element.type === 'pattern' || element.type === 'group') {\r\n <button mat-icon-button [matMenuTriggerFor]=\"options\"><mat-icon>more_vert</mat-icon></button>\r\n }\r\n <mat-menu #options>\r\n @if (element.type === 'pattern') {\r\n <button mat-menu-item (click)=\"editPattern(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deletePattern(element.key)\">{{'Remove'|translate}} </button>\r\n }\r\n @if (element.type === 'group') {\r\n <button mat-menu-item (click)=\"editGroup(element.key)\">{{'Edit'|translate}}</button>\r\n <mat-divider></mat-divider>\r\n <button mat-menu-item (click)=\"deleteGroup(element.key)\">{{'Remove'|translate}} </button>\r\n }\r\n </mat-menu>\r\n </td>\r\n </ng-container>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let element; columns: displayedColumns\" (click)=\"edit(element.key, $event)\"></tr>\r\n </table>\r\n</div>\r\n<!-- role template -->\r\n<ng-template #roleTpl>\r\n <h2 mat-dialog-title>{{'Role' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"role\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"role.value\" color=\"primary\" [disabled]=\"!role.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- pattern template -->\r\n<ng-template #patternTpl>\r\n <h2 mat-dialog-title>{{'Pattern' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"pattern\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <input matInput formControlName=\"expression\" [placeholder]=\"'Regex'| translate\" required autocomplete=\"off\" />\r\n <mat-hint><span [innerHTML]=\"'RegexHint' | translate : 'https://regex101.com/'| sanitizeHtml\"></span></mat-hint>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"pattern.value\" color=\"primary\" [disabled]=\"!pattern.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!-- group -->\r\n<ng-template #groupTpl>\r\n <h2 mat-dialog-title>{{'Group' | translate }}</h2>\r\n <mat-dialog-content>\r\n <form [formGroup]=\"group\" class=\"column\">\r\n <mat-form-field>\r\n <input matInput formControlName=\"title\" [placeholder]=\"'Title'| translate\" required autocomplete=\"off\" />\r\n </mat-form-field>\r\n <mat-form-field>\r\n <mat-select [placeholder]=\"'Items'|translate\" multiple formControlName=\"items\" required>\r\n <mat-select-trigger>\r\n {{group.value.items ? group.value.items[0] : ''}}\r\n @if (group.value.items?.length > 1) {\r\n <span class=\"additional-selection\">\r\n (+{{group.value.items.length - 1}} {{(group.value.items?.length === 2 ? 'Other' : 'Others')|translate}})\r\n </span>\r\n }\r\n </mat-select-trigger>\r\n @for (v of source; track v) {\r\n <mat-option [value]=\"v.key\">\r\n @if (!type.columns) {\r\n <span>{{v.value}}</span>\r\n }\r\n @if (type.columns) {\r\n <span>@for (c of type.columns; track c) {\r\n <span>{{v.value[c.name]}}</span>\r\n }</span>\r\n }\r\n </mat-option>\r\n }\r\n </mat-select>\r\n </mat-form-field>\r\n </form>\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"group.value\" color=\"primary\" [disabled]=\"!group.valid\">{{'OK' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<ng-template #noRoleTpl>\r\n <mat-dialog-content>\r\n {{'NoRoles'|translate : type?.title}}\r\n </mat-dialog-content>\r\n <mat-dialog-actions>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"primary\">{{'CreateRole' | translate}}</button>\r\n <button mat-button mat-dialog-close>{{'Cancel' | translate}}</button>\r\n </mat-dialog-actions>\r\n</ng-template>\r\n<!--<form style=\"display:none\">\r\n<input type=\"file\" name=\"file\" (onchange)=\"upload($event)\" #file/>\r\n</form>-->\r\n", styles: [":host{-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.nav-list{min-width:180px}table{width:100%}.form{padding:8px}:host ::ng-deep .mat-mdc-list-item{cursor:pointer}table ::ng-deep .role-column{cursor:pointer}\n"] }]
438
- }], ctorParameters: () => [{ type: i1.SessionService }, { type: i27.UtilityRef, decorators: [{
439
- type: Inject,
440
- args: [UtilityRef]
441
- }] }, { type: i2.DatasourceService }, { type: i3.PromptService }, { type: i4.WindowTitleService }, { type: i5.TranslateService }, { type: i6.Popup }, { type: i7.SystemService }, { type: i8.MatDialog }], propDecorators: { _fileElement: [{
442
- type: ViewChild,
443
- args: ['file', { static: true }]
444
- }], sort: [{
445
- type: ViewChild,
446
- args: [MatSort]
447
- }], noRoleTpl: [{
448
- type: ViewChild,
449
- args: ['noRoleTpl', { static: true }]
450
- }], roleTpl: [{
451
- type: ViewChild,
452
- args: ['roleTpl', { static: true }]
453
- }], patternTpl: [{
454
- type: ViewChild,
455
- args: ['patternTpl', { static: true }]
456
- }], newGroupTpl: [{
457
- type: ViewChild,
458
- args: ['groupTpl', { static: true }]
459
- }], handleKeyboardEvent: [{
460
- type: HostListener,
461
- args: ['document:keydown', ['$event']]
462
- }] } });
463
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zaXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9hZG1pbi9wb3NpdGlvbnMvcG9zaXRpb25zLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9hZG1pbi9wb3NpdGlvbnMvcG9zaXRpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBMEIsTUFBTSxFQUFjLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV2SCxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRTdELE9BQU8sRUFBRSxRQUFRLEVBQXFCLE1BQU0sOEJBQThCLENBQUM7QUFXM0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFpQixNQUFNLDZCQUE2QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFyRSxJQUFNLGtCQUFrQixHQUF4QixNQUFNLGtCQUFrQjtJQWtDN0IscUJBQXFCO0lBQ3JCLFlBQW9C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QUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUVmLElBQUk7c0JBQXZCLFNBQVM7dUJBQUMsT0FBTztnQkFTd0IsU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLE9BQU87c0JBQTlDLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDSyxVQUFVO3NCQUFwRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0EsV0FBVztzQkFBbkQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQWdPdkMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgT25EZXN0cm95LCBUZW1wbGF0ZVJlZiwgSW5qZWN0LCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgU3ViamVjdCwgb2YsIEVNUFRZLCBmb3JrSm9pbiwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsLCBmaWx0ZXIsIHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRTb3J0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XHJcbmltcG9ydCB7IE1hdFRhYmxlRGF0YVNvdXJjZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgUHJvZ3Jlc3NCYXJNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcclxuaW1wb3J0IHsgV29ya2Jvb2ssIFdvcmtzaGVldCwgQ29sdW1uIH0gZnJvbSAnQHN5bmNmdXNpb24vZWoyLWV4Y2VsLWV4cG9ydCc7XHJcbmltcG9ydCB7IFJvbGUsIFR5cGUsIFVzZXJJbmZvIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBBZG1pbkNvbXBvbmVudCB9IGZyb20gJy4uL2FkbWluLWRpc21pc3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhc291cmNlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvZGF0YXNvdXJjZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUHJvbXB0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvcHJvbXB0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBXaW5kb3dUaXRsZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3dpbmRvdy10aXRsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdHJhbnNsYXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRhVHlwZUluZm8sIFN5c3RlbVNlcnZpY2UgfSBmcm9tICcuLi9zeXN0ZW0uc2VydmljZSc7XHJcbmltcG9ydCB7IFBvcHVwIH0gZnJvbSAnLi4vLi4vY29yZS9wb3B1cC9wb3B1cC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXRpbGl0eUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZSc7XHJcbmltcG9ydCB7IFV0aWxpdHlSZWYgfSBmcm9tICcuLi91dGlsaXR5LXJlZic7XHJcbmltcG9ydCB7IEJpekRvYyB9IGZyb20gJy4uLy4uL2NvcmUvZGVjb3JhdG9ycyc7XHJcbmltcG9ydCB7IFBvc2l0aW9uc1BvcHVwLCBQb3NpdGlvbnNEYXRhIH0gZnJvbSAnLi9wb3NpdGlvbnMtcG9wdXAuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHRlbXBsYXRlVXJsOiAnLi9wb3NpdGlvbnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3Bvc2l0aW9ucy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbkBCaXpEb2MoeyBzZWxlY3RvcjogJ2JpemRvYy1wb3NpdGlvbnMnIH0pXHJcbi8qKiBwb3NpdGlvbnMgY29tcG9uZW50Ki9cclxuZXhwb3J0IGNsYXNzIFBvc2l0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBVdGlsaXR5Q29tcG9uZW50PGJvb2xlYW4sIFR5cGVNYXA+LCBBZG1pbkNvbXBvbmVudCB7XHJcbiAgQFZpZXdDaGlsZCgnZmlsZScsIHsgc3RhdGljOiB0cnVlIH0pIF9maWxlRWxlbWVudDogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBkYXRhU291cmNlOiBNYXRUYWJsZURhdGFTb3VyY2U8YW55PjtcclxuICBAVmlld0NoaWxkKE1hdFNvcnQpIHNvcnQ6IE1hdFNvcnQ7XHJcbiAgZGF0YXR5cGVzOiBEYXRhVHlwZUluZm9bXTtcclxuICByb2xlczogUm9sZVtdO1xyXG4gIHRvb2xzOiBib29sZWFuID0gdHJ1ZTtcclxuICBkaXNwbGF5ZWRDb2x1bW5zOiBzdHJpbmdbXTtcclxuICBwcm9maWxlczogeyBbaWQ6IHN0cmluZ106IFVzZXJJbmZvIH07XHJcbiAgdHlwZT86IFR5cGU7XHJcbiAgZGlydHkgPSBmYWxzZTtcclxuICBzYXZpbmcgPSBmYWxzZTtcclxuICBAVmlld0NoaWxkKCdub1JvbGVUcGwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBub1JvbGVUcGw6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgncm9sZVRwbCcsIHsgc3RhdGljOiB0cnVlIH0pIHJvbGVUcGw6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgncGF0dGVyblRwbCcsIHsgc3RhdGljOiB0cnVlIH0pIHBhdHRlcm5UcGw6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnZ3JvdXBUcGwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBuZXdHcm91cFRwbDogVGVtcGxhdGVSZWY8YW55PjtcclxuICBzb3VyY2U6IHsga2V5OiBzdHJpbmc7IHZhbHVlOiBhbnk7IH1bXTtcclxuICByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XHJcbiAgfSk7XHJcbiAgcmVhZG9ubHkgcm9sZSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gIH0pO1xyXG4gIHJlYWRvbmx5IHBhdHRlcm4gPSBuZXcgRm9ybUdyb3VwKHtcclxuICAgIHRpdGxlOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXHJcbiAgICBleHByZXNzaW9uOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICB9KTtcclxuICByZWFkb25seSBncm91cCA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgdGl0bGU6IG5ldyBGb3JtQ29udHJvbChudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcclxuICAgIGl0ZW1zOiBuZXcgRm9ybUNvbnRyb2wobnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZClcclxuICB9KTtcclxuICBwcml2YXRlIF9ldmVyeXRoaW5nOiBUeXBlTWFwO1xyXG4gIHBvc2l0aW9uczogeyBbcm9sZTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9IH07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgbG9hZGluZzogUHJvZ3Jlc3NCYXJNb2RlIHwgbnVsbDtcclxuICAvKiogcG9zaXRpb25zIGN0b3IgKi9cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZXNzaW9uOiBTZXNzaW9uU2VydmljZSxcclxuICAgIEBJbmplY3QoVXRpbGl0eVJlZikgcHJpdmF0ZSBfdXRpbGl0eVJlZjogVXRpbGl0eVJlZjxib29sZWFuLCBUeXBlTWFwPixcclxuICAgIHByaXZhdGUgX2RhdGFzb3VyY2VzOiBEYXRhc291cmNlU2VydmljZSxcclxuICAgIHByaXZhdGUgX3BzOiBQcm9tcHRTZXJ2aWNlLFxyXG4gICAgdGl0bGU6IFdpbmRvd1RpdGxlU2VydmljZSxcclxuICAgIHByaXZhdGUgX3RyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgX3BvcHVwOiBQb3B1cCxcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IFN5c3RlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZykge1xyXG4gICAgdGl0bGUuc2V0KF90cmFuc2xhdGUuZ2V0KCdSb2xlcycpKTtcclxuICB9XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSAncXVlcnknO1xyXG4gICAgdGhpcy5fcHJlcGFyZSgpLnN1YnNjcmliZSgoKSA9PlxyXG4gICAgICB0aGlzLl91dGlsaXR5UmVmLnBvcHVsYXRlKCkuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICAgIHRoaXMuX2V2ZXJ5dGhpbmcgPSByO1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmRhdGF0eXBlcy5maW5kKHQgPT4gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLnJvbGVzLmZpbmRJbmRleChyID0+IHIuZGF0YVR5cGUgPT09IHQubmFtZSkgPiAtMSk7XHJcbiAgICAgICAgdHlwZSAmJiB0aGlzLmNoYW5nZSh0eXBlLm5hbWUpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuICBwcml2YXRlIF9wcmVwYXJlKCkge1xyXG4gICAgcmV0dXJuIGZvcmtKb2luKFt0aGlzLl9zZXJ2aWNlLmRhdGF0eXBlcygpLlxyXG4gICAgICBwaXBlKHRhcCh0ID0+XHJcbiAgICAgICAgdGhpcy5kYXRhdHlwZXMgPVxyXG4gICAgICAgIHQuZmlsdGVyKHQgPT4gdC5hc3NpZ25hYmxlKSkpLFxyXG4gICAgdGhpcy5fZGF0YXNvdXJjZXMubWFwKCd1c2VycycpLnBpcGUodGFwKHUgPT5cclxuICAgICAgdGhpcy5wcm9maWxlcyA9IHVcclxuICAgICkpXHJcbiAgICBdKTtcclxuICB9XHJcbiAgc2VhcmNoKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGF0YVNvdXJjZS5maWx0ZXIgPSB2YWx1ZTtcclxuICB9XHJcbiAgYXN5bmMgY2hhbmdlKG5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgdHlwZSA9IHRoaXMudHlwZSA9IHRoaXMuZGF0YXR5cGVzLmZpbmQodCA9PiB0Lm5hbWUgPT09IG5hbWUpITtcclxuICAgIGNvbnN0IHJvbGVzID0gdGhpcy5yb2xlcyA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5yb2xlcy5maWx0ZXIociA9PiByLmRhdGFUeXBlID09PSBuYW1lKTtcclxuICAgIHRoaXMubG9hZGluZyA9ICdxdWVyeSc7XHJcbiAgICB0aGlzLl9kYXRhc291cmNlcy5hbGwodHlwZS5uYW1lKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiB0ID0+IHtcclxuICAgICAgICB0aGlzLnNvdXJjZSA9IHQ7XHJcbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ldmVyeXRoaW5nW3R5cGUubmFtZV07XHJcbiAgICAgICAgbGV0IHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucztcclxuICAgICAgICBpZiAoIXBvc2l0aW9ucylcclxuICAgICAgICAgIHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucyA9IHt9O1xyXG4gICAgICAgIGlmICghbW9kZWwuZ3JvdXBzKSBtb2RlbC5ncm91cHMgPSBbXTtcclxuICAgICAgICBpZiAoIW1vZGVsLnBhdHRlcm5zKSBtb2RlbC5wYXR0ZXJucyA9IFtdO1xyXG4gICAgICAgIHJvbGVzLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgICBpZiAoIXBvc2l0aW9uc1tyLm5hbWVdKSBwb3NpdGlvbnNbci5uYW1lXSA9IHt9O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMucG9zaXRpb25zID0gcG9zaXRpb25zO1xyXG4gICAgICAgIGNvbnN0IHJvd3M6IE1vZGVsW10gPSBbXTtcclxuICAgICAgICBtb2RlbC5wYXR0ZXJucyAmJiBtb2RlbC5wYXR0ZXJucy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0geyB0eXBlOiAncGF0dGVybicsIGtleTogcC5uYW1lIH0gYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcclxuICAgICAgICAgIHJvd1t0eXBlLmNvbHVtbnMgPyB0eXBlLmNvbHVtbnNbMF0ubmFtZSA6ICd2YWx1ZSddID0gcC50aXRsZTtcclxuICAgICAgICAgIHJvd3MucHVzaChyb3cgYXMgTW9kZWwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGVsLmdyb3VwcyAmJiBtb2RlbC5ncm91cHMuZm9yRWFjaChnID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJvdyA9IHsgdHlwZTogJ2dyb3VwJywga2V5OiBnLm5hbWUgfSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xyXG4gICAgICAgICAgcm93W3R5cGUuY29sdW1ucyA/IHR5cGUuY29sdW1uc1swXS5uYW1lIDogJ3ZhbHVlJ10gPSBnLnRpdGxlO1xyXG4gICAgICAgICAgcm93cy5wdXNoKHJvdyBhcyBNb2RlbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdC5mb3JFYWNoKHQgPT4ge1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0geyB0eXBlOiAna2V5JywgLi4udCB9IGFzIHsgW2tleTogc3RyaW5nXTogYW55IH07XHJcbiAgICAgICAgICB0eXBlLmNvbHVtbnMgJiYgdHlwZS5jb2x1bW5zLmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgIHJvd1tjLm5hbWVdID0gdC52YWx1ZVtjLm5hbWVdO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICByb3dzLnB1c2gocm93IGFzIE1vZGVsKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlID0gbmV3IE1hdFRhYmxlRGF0YVNvdXJjZShyb3dzKTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMuc29ydDtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zKCk7XHJcbiAgICAgICAgIXJvbGVzLmxlbmd0aCAmJlxyXG4gICAgICAgICAgdGhpcy5fZGlhbG9nLm9wZW4odGhpcy5ub1JvbGVUcGwpLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKG9rID0+XHJcbiAgICAgICAgICAgIG9rICYmIHRoaXMubmV3Um9sZSgpKTtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xyXG4gICAgICB9LCBlcnJvcjogKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcHMuZXJyb3IoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2NvbHVtbnMoKSB7XHJcbiAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSAodGhpcy50eXBlIS5jb2x1bW5zID8gdGhpcy50eXBlIS5jb2x1bW5zLm1hcChjID0+IGMubmFtZSkgOiBbJ2tleScsICd2YWx1ZSddKS5jb25jYXQoXHJcbiAgICAgIHRoaXMucm9sZXMubWFwKHIgPT4gci5uYW1lKSkuY29uY2F0KFsnb3B0aW9ucyddKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGtleVxyXG4gICAqIEBwYXJhbSBldnRcclxuICAgKi9cclxuICBlZGl0KGtleTogYW55LCBldnQ6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICgoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCkudGFnTmFtZSA9PT0gJ01BVC1JQ09OJykgcmV0dXJuO1xyXG5cclxuICAgIGxldCBjZWxsID0gZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIHdoaWxlIChjZWxsLnRhZ05hbWUgIT09ICdURCcpXHJcbiAgICAgIGNlbGwgPSBjZWxsLnBhcmVudEVsZW1lbnQhO1xyXG5cclxuICAgIGNvbnN0IHJvbGUgPSBjZWxsLmdldEF0dHJpYnV0ZSgnZGF0YS1yb2xlJyk7XHJcblxyXG4gICAgaWYgKCFyb2xlKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgY3JvbGUgPSB0aGlzLnJvbGVzLmZpbmQociA9PiByLm5hbWUgPT09IHJvbGUpITtcclxuXHJcbiAgICBsZXQgcG9zaXRpb25zID0gdGhpcy5wb3NpdGlvbnNbcm9sZV1ba2V5XTtcclxuXHJcbiAgICBpZiAoIXBvc2l0aW9ucykgcG9zaXRpb25zID0gdGhpcy5wb3NpdGlvbnNbcm9sZV1ba2V5XSA9IFtdO1xyXG5cclxuICAgIHRoaXMuX3BvcHVwLm9wZW4oUG9zaXRpb25zUG9wdXAsIGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQsIHtcclxuICAgICAgZGF0YTogeyB0aXRsZTogY3JvbGUudGl0bGUsIHBvc2l0aW9ucyB9IGFzIFBvc2l0aW9uc0RhdGFcclxuICAgIH0pLm9wZW5lZCgpLnN1YnNjcmliZShlID0+IGUudmFsdWVDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmRpcnR5ID0gdHJ1ZSkpO1xyXG4gIH1cclxuICBwcml2YXRlIF9vcGVuRGlhbG9nKHRtcGw6IFRlbXBsYXRlUmVmPGFueT4sIGZvcm06IEZvcm1Hcm91cCwgdmFsdWVzOiBhbnkpIHtcclxuICAgIGZvcm0ucmVzZXQodmFsdWVzKTtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuKHRtcGwpO1xyXG4gICAgZGlhbG9nUmVmLmtleWRvd25FdmVudHMoKS5waXBlKGZpbHRlcihrID0+IGsua2V5ID09PSAnRW50ZXInKSwgdGFrZVVudGlsKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpKSkuXHJcbiAgICAgIHN1YnNjcmliZSgoKSA9PiBmb3JtLnZhbGlkICYmIGRpYWxvZ1JlZi5jbG9zZShmb3JtLnZhbHVlKSk7XHJcbiAgICByZXR1cm4gZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkucGlwZShzd2l0Y2hNYXAodiA9PiB2ID8gb2YodikgOiBFTVBUWSkpO1xyXG4gIH1cclxuICBuZXdSb2xlKCkge1xyXG4gICAgdGhpcy5fb3BlbkRpYWxvZyh0aGlzLnJvbGVUcGwsIHRoaXMucm9sZSwgeyB0aXRsZTogbnVsbCB9KS5cclxuICAgICAgc3Vic2NyaWJlKChyOiBSb2xlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IHIudGl0bGUubm9ybWFsaXplKCksIHJvbGUgPSB7IC4uLnIsIG5hbWUgfTtcclxuICAgICAgICB0aGlzLnBvc2l0aW9uc1tuYW1lXSA9IHt9O1xyXG4gICAgICAgIHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlIS5uYW1lXS5yb2xlcy5wdXNoKHJvbGUpO1xyXG4gICAgICAgIHRoaXMucm9sZXMucHVzaChyb2xlKTtcclxuICAgICAgICB0aGlzLl9jb2x1bW5zKCk7XHJcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuICBuZXdHcm91cCgpIHtcclxuICAgIHRoaXMuX29wZW5EaWFsb2codGhpcy5uZXdHcm91cFRwbCwgdGhpcy5ncm91cCwgeyBpdGVtczogW10sIHRpdGxlOiBudWxsIH0pLnN1YnNjcmliZSgoZzogeyB0aXRsZTogc3RyaW5nOyBpdGVtczogc3RyaW5nW10gfSkgPT4ge1xyXG4gICAgICBjb25zdCBuYW1lID0gZy50aXRsZS5ub3JtYWxpemUoKTtcclxuICAgICAgdGhpcy5fZXZlcnl0aGluZ1t0aGlzLnR5cGUhLm5hbWVdLmdyb3Vwcy5wdXNoKHsgbmFtZSwgLi4uZyB9KTtcclxuICAgICAgY29uc3Qgcm93ID0geyBrZXk6IG5hbWUsIHR5cGU6ICdncm91cCcgfSBhcyB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xyXG4gICAgICByb3dbdGhpcy50eXBlIS5jb2x1bW5zID8gdGhpcy50eXBlIS5jb2x1bW5zWzBdLm5hbWUgOiAndmFsdWUnXSA9IGcudGl0bGU7XHJcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhLnNwbGljZSgwLCAwLCByb3cpO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gJyc7XHJcbiAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG5ld1BhdHRlcm4oKSB7XHJcbiAgICB0aGlzLl9vcGVuRGlhbG9nKHRoaXMucGF0dGVyblRwbCwgdGhpcy5wYXR0ZXJuLCB7IHRpdGxlOiBudWxsLCBleHByZXNzaW9uOiBudWxsIH0pLnN1YnNjcmliZSgocDogUGF0dGVybikgPT4ge1xyXG4gICAgICBjb25zdCBuYW1lID0gcC50aXRsZS5ub3JtYWxpemUoKTtcclxuICAgICAgdGhpcy5fZXZlcnl0aGluZ1t0aGlzLnR5cGUhLm5hbWVdLnBhdHRlcm5zLnB1c2goeyAuLi5wLCBuYW1lIH0pO1xyXG4gICAgICBjb25zdCByb3cgPSB7IGtleTogbmFtZSwgdHlwZTogJ3BhdHRlcm4nIH0gYXMgeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcclxuICAgICAgcm93W3RoaXMudHlwZSEuY29sdW1ucyA/IHRoaXMudHlwZSEuY29sdW1uc1swXS5uYW1lIDogJ3ZhbHVlJ10gPSBwLnRpdGxlO1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YS5zcGxpY2UoMCwgMCwgcm93KTtcclxuICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9ICcnO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBkZWxldGVHcm91cChuYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGdyb3VwcyA9IHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlIS5uYW1lXS5ncm91cHMsXHJcbiAgICAgIGdyb3VwID0gZ3JvdXBzLmZpbmQoZyA9PiBnLm5hbWUgPT09IG5hbWUpITtcclxuICAgIHRoaXMuX3BzLmFzaygnUmVtb3ZlQXNrJywgdW5kZWZpbmVkLCB7IG9rOiAnWWVzJywgY2FuY2VsOiAnTm8nIH0pLnN1YnNjcmliZShvayA9PiB7XHJcbiAgICAgIGlmIChvaykge1xyXG4gICAgICAgIGdyb3Vwcy5yZW1vdmUoZ3JvdXApO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMucG9zaXRpb25zKS5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5wb3NpdGlvbnNbcl1bZ3JvdXAubmFtZV07XHJcbiAgICAgICAgICBpZiAocG9zaXRpb25zKVxyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5wb3NpdGlvbnNbcl1bZ3JvdXAubmFtZV07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEucmVtb3ZlKHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZpbmQoZyA9PiBnLmtleSA9PT0gZ3JvdXAubmFtZSAmJiBnLnR5cGUgPT09ICdncm91cCcpKTtcclxuICAgICAgICB0aGlzLmRhdGFTb3VyY2UuZmlsdGVyID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBkZWxldGVQYXR0ZXJuKG5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLl9ldmVyeXRoaW5nW3RoaXMudHlwZSEubmFtZV0ucGF0dGVybnMsIHBhdHRlcm4gPSBwYXR0ZXJucy5maW5kKHAgPT4gcC5uYW1lID09PSBuYW1lKSE7XHJcbiAgICB0aGlzLl9wcy5hc2soJ1JlbW92ZUFzaycsIHVuZGVmaW5lZCwgeyBvazogJ1llcycsIGNhbmNlbDogJ05vJyB9KS5zdWJzY3JpYmUob2sgPT4ge1xyXG4gICAgICBpZiAob2spIHtcclxuICAgICAgICBwYXR0ZXJucy5yZW1vdmUocGF0dGVybik7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmRhdGEucmVtb3ZlKHRoaXMuZGF0YVNvdXJjZS5kYXRhLmZpbmQocCA9PiBwLmtleSA9PT0gcGF0dGVybi5uYW1lICYmIHAudHlwZSA9PT0gJ3BhdHRlcm4nKSk7XHJcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLmZpbHRlciA9ICcnO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMucG9zaXRpb25zKS5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcG9zaXRpb25zID0gdGhpcy5wb3NpdGlvbnNbcl1bcGF0dGVybi5uYW1lXTtcclxuICAgICAgICAgIGlmIChwb3NpdGlvbnMpXHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnBvc2l0aW9uc1tyXVtwYXR0ZXJuLm5hbWVdO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZWRpdEdyb3VwKG5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZ3JvdXBzID0gdGhpcy5fZXZlcnl0aGluZ1t0aGlzLnR5cGUhLm5hbWVdLmdyb3VwcywgZ3JvdXAgPSBncm91cHMuZmluZChnID0+IGcubmFtZSA9PT0gbmFtZSkhO1xyXG4gICAgdGhpcy5fb3BlbkRpYWxvZyh0aGlzLm5ld0dyb3VwVHBsLCB0aGlzLmdyb3VwLCBncm91cCkuc3Vic2NyaWJlKChnOiBHcm91cCkgPT4ge1xyXG4gICAgICBPYmplY3QuYXNzaWduKGdyb3VwLCBnKTtcclxuICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgZWRpdFBhdHRlcm4obmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBwYXR0ZXJucyA9IHRoaXMuX2V2ZXJ5dGhpbmdbdGhpcy50eXBlIS5uYW1lXS5wYXR0ZXJucywgcGF0dGVybiA9IHBhdHRlcm5zLmZpbmQocCA9PiBwLm5hbWUgPT09IG5hbWUpITtcclxuICAgIHRoaXMuX29wZW5EaWFsb2codGhpcy5wYXR0ZXJuVHBsLCB0aGlzLnBhdHRlcm4sIHBhdHRlcm4pLnN1YnNjcmliZSgocDogUGF0dGVybikgPT4ge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHBhdHRlcm4sIHApO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDdHJsLXMgc2F2ZVxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRpcnR5ICYmIGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LmtleSA9PT0gJ3MnIHx8IGV2ZW50LmtleSA9PT0gJ1MnKSkge1xyXG4gICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgc2F2ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5zYXZpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkaW5nID0gJ2luZGV0ZXJtaW5hdGUnO1xyXG4gICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuX3V0aWxpdHlSZWYuZXhlY3V0ZSh0aGlzLl9ldmVyeXRoaW5nKSkudGhlbigoKSA9PiB7XHJcbiAgICAgIHRoaXMuX3BzLnRvYXN0KCdDaGFuZ2VzU2F2ZWQnKTtcclxuICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xyXG4gICAgICB0aGlzLl9zZXNzaW9uLnJlZnJlc2goKS5zdWJzY3JpYmUoKTtcclxuICAgIH0sICgpID0+XHJcbiAgICAgIHRoaXMuX3BzLmVycm9yKCkpLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2F2aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIGFzeW5jIGRvd25sb2FkKCkge1xyXG4gICAgY29uc3QgeyBwcm9maWxlcyB9ID0gdGhpcywgd29ya3NoZWV0cyA9IFtdO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRhdGF0eXBlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBsZXQgdHlwZSA9IHRoaXMuZGF0YXR5cGVzW2ldO1xyXG4gICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2V2ZXJ5dGhpbmdbdHlwZS5uYW1lXTtcclxuICAgICAgbGV0IHBvc2l0aW9ucyA9IG1vZGVsLnBvc2l0aW9ucztcclxuICAgICAgaWYgKCFwb3NpdGlvbnMgfHwgIU9iamVjdC5rZXlzKHBvc2l0aW9ucykubGVuZ3RoKSBjb250aW51ZTtcclxuICAgICAgY29uc3Qgcm9sZXMgPSB0aGlzLl9zZXNzaW9uLnByb2ZpbGUucm9sZXMuZmlsdGVyKHIgPT4gci5kYXRhVHlwZSA9PT0gdHlwZS5uYW1lICYmIHBvc2l0aW9uc1tyLm5hbWVdKTtcclxuICAgICAgY29uc3QgY2VsbHMgPSBbe1xyXG4gICAgICAgIGluZGV4OiAxLFxyXG4gICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdUeXBlJyksXHJcbiAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgIGJvbGQ6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHtcclxuICAgICAgICBpbmRleDogMixcclxuICAgICAgICB2YWx1ZTogdGhpcy5fdHJhbnNsYXRlLmdldCgnVmFsdWUnKSxcclxuICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgYm9sZDogdHJ1ZVxyXG4gICAgICAgIH1cclxuICAgICAgfSwge1xyXG4gICAgICAgIGluZGV4OiAzLFxyXG4gICAgICAgIHZhbHVlOiAnJ1xyXG4gICAgICB9XSBhcyBDZWxsW107XHJcbiAgICAgIGlmICh0eXBlLmNvbHVtbnMpIHR5cGUuY29sdW1ucy5zbGljZSgyKS5mb3JFYWNoKChjLCBpKSA9PiBjZWxscy5wdXNoKHtcclxuICAgICAgICBpbmRleDogaSArIDQsXHJcbiAgICAgICAgdmFsdWU6ICcnXHJcbiAgICAgIH0gYXMgQ2VsbCkpO1xyXG4gICAgICByb2xlcy5mb3JFYWNoKHIgPT4gY2VsbHMucHVzaCh7XHJcbiAgICAgICAgaW5kZXg6IGNlbGxzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgdmFsdWU6IHIudGl0bGUsXHJcbiAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgIGJvbGQ6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH0gYXMgQ2VsbCkpO1xyXG4gICAgICBjb25zdCByb3dzID0gW10gYXMgUm93W107XHJcbiAgICAgIHJvd3MucHVzaCh7XHJcbiAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgY2VsbHNcclxuICAgICAgfSBhcyBSb3cpO1xyXG4gICAgICBtb2RlbC5wYXR0ZXJucyAmJiBtb2RlbC5wYXR0ZXJucy5mb3JFYWNoKHAgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHtcclxuICAgICAgICAgIGluZGV4OiByb3dzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgICBjZWxsczogW3tcclxuICAgICAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdQYXR0ZXJuJylcclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgaW5kZXg6IDIsXHJcbiAgICAgICAgICAgIHZhbHVlOiBwLmV4cHJlc3Npb25cclxuICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgaW5kZXg6IDMsXHJcbiAgICAgICAgICAgIHZhbHVlOiBwLnRpdGxlXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0gYXMgUm93O1xyXG4gICAgICAgIGFkZGNvbHVtbnMocC5uYW1lLCByb3cpO1xyXG4gICAgICAgIHJvd3MucHVzaChyb3cpO1xyXG4gICAgICB9KTtcclxuICAgICAgbW9kZWwuZ3JvdXBzICYmIG1vZGVsLmdyb3Vwcy5mb3JFYWNoKGcgPT4ge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHtcclxuICAgICAgICAgIGluZGV4OiByb3dzLmxlbmd0aCArIDEsXHJcbiAgICAgICAgICBjZWxsczogW3tcclxuICAgICAgICAgICAgaW5kZXg6IDEsXHJcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdHcm91cCcpXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIGluZGV4OiAyLFxyXG4gICAgICAgICAgICB2YWx1ZTogZy5pdGVtcy5qb2luKCcsICcpXHJcbiAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIGluZGV4OiAzLFxyXG4gICAgICAgICAgICB2YWx1ZTogZy50aXRsZVxyXG4gICAgICAgICAgfV1cclxuICAgICAgICB9IGFzIFJvdztcclxuICAgICAgICBhZGRjb2x1bW5zKGcubmFtZSwgcm93KTtcclxuICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBkYXRhc291cmNlID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20odGhpcy5fZGF0YXNvdXJjZXMuYWxsKHR5cGUubmFtZSkpO1xyXG4gICAgICBkYXRhc291cmNlLmZvckVhY2goZCA9PiB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0ge1xyXG4gICAgICAgICAgaW5kZXg6IHJvd3MubGVuZ3RoICsgMSxcclxuICAgICAgICAgIGNlbGxzOiBbe1xyXG4gICAgICAgICAgICBpbmRleDogMSxcclxuICAgICAgICAgICAgdmFsdWU6IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ0tleScpXHJcbiAgICAgICAgICB9XVxyXG4gICAgICAgIH0gYXMgUm93O1xyXG4gICAgICAgIGlmICh0eXBlLmNvbHVtbnMpIHR5cGUuY29sdW1ucy5mb3JFYWNoKChjLCBpKSA9PiByb3cuY2VsbHMucHVzaCh7XHJcbiAgICAgICAgICBpbmRleDogaSArIDIsXHJcbiAgICAgICAgICB2YWx1ZTogZC52YWx1ZVtjLm5hbWVdXHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIGVsc2Ugcm93LmNlbGxzLnB1c2goeyBpbmRleDogMiwgdmFsdWU6IGQudmFsdWUgfSk7XHJcbiAgICAgICAgYWRkY29sdW1ucyhkLmtleSwgcm93KTtcclxuICAgICAgICByb3dzLnB1c2gocm93KTtcclxuICAgICAgfSk7XHJcbiAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXSBhcyB7IGluZGV4OiBudW1iZXIsIHdpZHRoOiBudW1iZXIgfVtdO1xyXG4gICAgICB0eXBlLmNvbHVtbnMgJiYgdHlwZS5jb2x1bW5zLmZvckVhY2goKF8sIGkpID0+IGNvbHVtbnMucHVzaCh7IGluZGV4OiBpICsgMSwgd2lkdGg6IDI1MCB9IGFzIENvbHVtbikpO1xyXG4gICAgICByb2xlcy5mb3JFYWNoKChfLCBpKSA9PiBjb2x1bW5zLnB1c2goeyBpbmRleDogY29sdW1ucy5sZW5ndGggKyBpICsgMiB9IGFzIENvbHVtbikpO1xyXG4gICAgICB3b3Jrc2hlZXRzLnB1c2goe1xyXG4gICAgICAgIG5hbWU6IHR5cGUudGl0bGUsXHJcbiAgICAgICAgY29sdW1ucyxcclxuICAgICAgICByb3dzXHJcbiAgICAgIH0gYXMgV29ya3NoZWV0XHJcbiAgICAgICk7XHJcbiAgICAgIGZ1bmN0aW9uIGFkZGNvbHVtbnMoa2V5OiBzdHJpbmcsIHJvdzogUm93KSB7XHJcbiAgICAgICAgcm9sZXMuZm9yRWFjaChyID0+IHtcclxuICAgICAgICAgIGNvbnN0IHVzZXJzID0gcG9zaXRpb25zW3IubmFtZV1ba2V5XTtcclxuICAgICAgICAgIHJvdy5jZWxscy5wdXNoKHtcclxuICAgICAgICAgICAgaW5kZXg6IHJvdy5jZWxscy5sZW5ndGggKyAxLFxyXG4gICAgICAgICAgICB2YWx1ZTogdXNlcnMgPyB1c2Vycy5tYXAodSA9PiBwcm9maWxlc1t1XSA/IHByb2ZpbGVzW3VdLm5hbWUgOiB1KS5qb2luKCcsICcpIDogJydcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBib29rID0gbmV3IFdvcmtib29rKFxyXG4gICAgICB7XHJcbiAgICAgICAgd29ya3NoZWV0cyxcclxuICAgICAgfSxcclxuICAgICAgJ3hsc3gnXHJcbiAgICApO1xyXG4gICAgYm9vay5zYXZlKGAke3RoaXMuX3RyYW5zbGF0ZS5nZXQoJ1Bvc2l0aW9ucycpfS54bHN4YCk7XHJcbiAgfVxyXG4gIC8vIGFzeW5jIHVwbG9hZChldnQ6IElucHV0RXZlbnQpIHtcclxuICAvLyAgIGNvbnN0IHsgZmlsZXMgfSA9IGV2dC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAvLyAgIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGgpIHtcclxuICAvLyAgICAgY29uc3QgZmlsZSA9IGZpbGVzLml0ZW0oMCk7XHJcbiAgLy8gICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gIC8vICAgICByZWFkZXIub25sb2FkID0gZSA9PiB7IH07XHJcbiAgLy8gICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmaWxlLnRleHQoKTtcclxuICAvLyAgICAgLy9yZWFkZXIucmVhZEFzKHRleHQpO1xyXG4gIC8vICAgICBjb25zdCB3YiA9IFhMU1gucmVhZEZpbGUoZmlsZS5uYW1lLCB7fSk7XHJcbiAgLy8gICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2IuU2hlZXROYW1lcy5sZW5ndGg7IGkrKykge1xyXG4gIC8vICAgICAgIGxldCB0aXRsZSA9IHdiLlNoZWV0TmFtZXNbaV0sIHdzID0gd2IuU2hlZXRzW3RpdGxlXTtcclxuICAvLyAgICAgICBsZXQgdHlwZSA9IHRoaXMudHlwZXMuZmluZCh0ID0+IHQudGl0bGUgPT09IHRpdGxlKTtcclxuICAvLyAgICAgICBpZiAoIXR5cGUpIHRocm93ICcnO1xyXG4gIC8vICAgICAgIGxldCByb2xlcyA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5yb2xlcy5maWx0ZXIociA9PiByLmRhdGFUeXBlID09PSB0eXBlLm5hbWUpO1xyXG4gIC8vICAgICAgIGxldCByb3cgPSB3c1snIXJvd3MnXVswXTtcclxuICAvLyAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHdzWychY29scyddLmxlbmd0aDsgYysrKSB7XHJcbiAgLy8gICAgICAgICBsZXQgY29sID0gd3NbJyFjb2xzJ11bY107XHJcbiAgLy8gICAgICAgICAvL2xldCByb2xlID0gcm9sZXMuZmluZChyID0+IHIudGl0bGUgPT09IHdzLik7XHJcbiAgLy8gICAgICAgLy8gIGlmICghcm9sZSkge1xyXG4gIC8vICAgICAgIC8vICAgIHRoaXMuX2V2ZXJ5dGhpbmdbdHlwZS5uYW1lXS5yb2xlcy5wdXNoKHtuYW1lOiAnJywgdGl0bGU6ICcnfSk7XHJcbiAgLy8gICAgICAgLy8gIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB3c1snIXJvd3MnXS5sZW5ndGg7IHIrKykge1xyXG4gIC8vICAgICAgICAgbGV0IHJvdyA9IHdzWychcm93cyddW3JdO1xyXG4gIC8vICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB3c1snIWNvbHMnXS5sZW5ndGg7IGMrKykge1xyXG4gIC8vICAgICAgICAgICBsZXQgY29sID0gd3NbJyFjb2xzJ11bY10sIGNvbnRlbnQgPSAnJztcclxuICAvLyAgICAgICAgICAgaWYgKGNvbnRlbnQpIHtcclxuICAvLyAgICAgICAgICAgICAvL2xldCB1c2VycyA9IGNvbnRlbnQuc3BsaXQoJywgJykubWFwKG5hbWU9PiB0aGlzLnByb2ZpbGVzLmZpbmQodT0+IHUubmFtZSA9PT0gbmFtZSkpO1xyXG5cclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgICBlbHNlIHsgfVxyXG5cclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgIH1cclxuICAvLyAgIH1cclxuICAvL31cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kubmV4dCgpO1xyXG4gICAgdGhpcy5fZGVzdHJveS5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG5pbnRlcmZhY2UgTW9kZWwge1xyXG4gIGtleTogYW55O1xyXG4gIHR5cGU6ICdncm91cCcgfCAncGF0dGVybicgfCAna2V5JztcclxufVxyXG5cclxudHlwZSBUeXBlTWFwID0geyBbbmFtZTogc3RyaW5nXTogRGF0YVR5cGVNb2RlbCB9XHJcblxyXG5pbnRlcmZhY2UgRGF0YVR5cGVNb2RlbCB7XHJcbiAgcGF0dGVybnM6IFBhdHRlcm5bXTtcclxuICBwb3NpdGlvbnM6IHsgW3JvbGU6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSB9O1xyXG4gIGdyb3VwczogR3JvdXBbXTtcclxuICByb2xlczogW3sgbmFtZTogc3RyaW5nOyB0aXRsZTogc3RyaW5nIH1dO1xyXG59XHJcbmludGVyZmFjZSBHcm91cCB7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgaXRlbXM6IHN0cmluZ1tdO1xyXG59XHJcbmludGVyZmFjZSBQYXR0ZXJuIHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBleHByZXNzaW9uOiBzdHJpbmc7XHJcbn1cclxuaW50ZXJmYWNlIENlbGwgeyB9XHJcbmludGVyZmFjZSBSb3cgeyBjZWxsczogQ2VsbFtdOyB9XHJcbiIsIjxtYXQtdG9vbGJhcj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwidG9vbHMgPSAhdG9vbHNcIiBbYml6ZG9jVG9vbHRpcF09XCInQ29sbGFwc2UnIHwgdHJhbnNsYXRlXCI+PG1hdC1pY29uPnZpZXdfc2lkZWJhcjwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJzYXZlKClcIiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIWRpcnR5XCI+e3snU2F2ZUNoYW5nZXMnfHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxyXG4gIDxiaXpkb2Mtc2VhcmNoLWlucHV0ICh2YWx1ZUNoYW5nZSk9XCJzZWFyY2goJGV2ZW50KVwiPjwvYml6ZG9jLXNlYXJjaC1pbnB1dD5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibmV3TWVudVwiIFtiaXpkb2NUb29sdGlwXT1cIidBZGQnfHRyYW5zbGF0ZVwiPjxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxtYXQtbWVudSAjbmV3TWVudT5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwibmV3Um9sZSgpXCI+e3snUm9sZSd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwibmV3UGF0dGVybigpXCI+e3snUGF0dGVybid8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwibmV3R3JvdXAoKVwiPnt7J0dyb3VwJ3x0cmFuc2xhdGV9fSA8L2J1dHRvbj5cclxuICA8L21hdC1tZW51PlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIFtiaXpkb2NUb29sdGlwXT1cIidEb3dubG9hZCcgfCB0cmFuc2xhdGVcIiAoY2xpY2spPVwiZG93bmxvYWQoKVwiIFtkaXNhYmxlZF09XCJkaXJ0eVwiPjxtYXQtaWNvbj5zYXZlX2FsdDwvbWF0LWljb24+PC9idXR0b24+XHJcbjwvbWF0LXRvb2xiYXI+XHJcbjxtYXQtcHJvZ3Jlc3MtYmFyIFttb2RlXT1cImxvYWRpbmdcIiBbc3R5bGUudmlzaWJpbGl0eV09XCJsb2FkaW5nID8gJ3Zpc2libGUnOidoaWRkZW4nXCI+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxyXG48ZGl2IGNsYXNzPVwicm93IGZsZXhcIj5cclxuICA8bWF0LW5hdi1saXN0IGNsYXNzPVwibmF2LWxpc3RcIiBbc3R5bGUuZGlzcGxheV09XCJ0b29scz8nJzonbm9uZSdcIj5cclxuICAgIEBmb3IgKHQgb2YgZGF0YXR5cGVzOyB0cmFjayB0KSB7XHJcbiAgICAgIDxtYXQtbGlzdC1pdGVtIChjbGljayk9XCJjaGFuZ2UodC5uYW1lKVwiIFtjbGFzcy5hY3RpdmVdPVwidCA9PT0gdHlwZVwiPnt7dC50aXRsZX19PC9tYXQtbGlzdC1pdGVtPlxyXG4gICAgfVxyXG4gIDwvbWF0LW5hdi1saXN0PlxyXG4gIDx0YWJsZSBtYXQtdGFibGUgbWF0U29ydCBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW3N0eWxlLmRpc3BsYXldPVwiZGF0YVNvdXJjZSA/ICcnOiAnbm9uZSdcIiBjbGFzcz1cImZsZXhcIj5cclxuICAgIEBmb3IgKGNvbHVtbiBvZiAodHlwZT8uY29sdW1ucyB8fFtdKTsgdHJhY2sgY29sdW1uKSB7XHJcbiAgICAgIDxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiPlxyXG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPnt7Y29sdW1uLmxhYmVsfX08L3RoPlxyXG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+IHt7ZWxlbWVudFtjb2x1bW4ubmFtZV19fSA8L3RkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIH1cclxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwia2V5XCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPnt7Jyd9fTwvdGg+XHJcbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICBAc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcclxuICAgICAgICAgICAgQGNhc2UgKCdncm91cCcpIHtcclxuICAgICAgICAgICAgICAoe3snR3JvdXAnfHRyYW5zbGF0ZX19KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIEBjYXNlICgncGF0dGVybicpIHtcclxuICAgICAgICAgICAgICAoe3snUGF0dGVybid8dHJhbnNsYXRlfX0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgQGRlZmF1bHQge1xyXG4gICAgICAgICAgICAgIHt7ZWxlbWVudC5rZXl9fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInZhbHVlXCI+XHJcbiAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPnt7Jyd9fTwvdGg+XHJcbiAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBlbGVtZW50XCI+XHJcbiAgICAgICAge3tlbGVtZW50LnZhbHVlfX1cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgQGZvciAocm9sZSBvZiByb2xlczsgdHJhY2sgcm9sZSkge1xyXG4gICAgICA8bmctY29udGFpbmVyIFttYXRDb2x1bW5EZWZdPVwicm9sZS5uYW1lXCI+XHJcbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj57e3JvbGUudGl0bGV9fTwvdGg+XHJcbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIiBbYXR0ci5kYXRhLXJvbGVdPVwicm9sZS5uYW1lXCIgY2xhc3M9XCJyb2xlLWNvbHVtblwiPlxyXG4gICAgICAgICAgQGlmIChwb3NpdGlvbnNbcm9sZS5uYW1lXVtlbGVtZW50LmtleV0pIHtcclxuICAgICAgICAgICAgQGZvciAodSBvZiBwb3NpdGlvbnNbcm9sZS5uYW1lXVtlbGVtZW50LmtleV07IHRyYWNrIHU7IGxldCBmaXJzdCA9ICRmaXJzdCkge1xyXG4gICAgICAgICAgICAgIEBpZiAoIWZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgICAsXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHt7cHJvZmlsZXNbdV0/Lm5hbWV9fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICB9XHJcbiAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cIm9wdGlvbnNcIj5cclxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj48L3RoPlxyXG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPlxyXG4gICAgICAgIEBpZiAoZWxlbWVudC50eXBlID09PSAncGF0dGVybicgfHwgZWxlbWVudC50eXBlID09PSAnZ3JvdXAnKSB7XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwib3B0aW9uc1wiPjxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuICAgICAgICA8bWF0LW1lbnUgI29wdGlvbnM+XHJcbiAgICAgICAgICBAaWYgKGVsZW1lbnQudHlwZSA9PT0gJ3BhdHRlcm4nKSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZWRpdFBhdHRlcm4oZWxlbWVudC5rZXkpXCI+e3snRWRpdCd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlUGF0dGVybihlbGVtZW50LmtleSlcIj57eydSZW1vdmUnfHRyYW5zbGF0ZX19IDwvYnV0dG9uPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgQGlmIChlbGVtZW50LnR5cGUgPT09ICdncm91cCcpIHtcclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJlZGl0R3JvdXAoZWxlbWVudC5rZXkpXCI+e3snRWRpdCd8dHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlR3JvdXAoZWxlbWVudC5rZXkpXCI+e3snUmVtb3ZlJ3x0cmFuc2xhdGV9fSA8L2J1dHRvbj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICA8L3RkPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zOyBzdGlja3k6IHRydWVcIj48L3RyPlxyXG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCBlbGVtZW50OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCIgKGNsaWNrKT1cImVkaXQoZWxlbWVudC5rZXksICRldmVudClcIj48L3RyPlxyXG4gIDwvdGFibGU+XHJcbjwvZGl2PlxyXG48IS0tIHJvbGUgdGVtcGxhdGUgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjcm9sZVRwbD5cclxuICA8aDIgbWF0LWRpYWxvZy10aXRsZT57eydSb2xlJyB8IHRyYW5zbGF0ZSB9fTwvaDI+XHJcbiAgPG1hdC1kaWFsb2ctY29udGVudD5cclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwicm9sZVwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBbcGxhY2Vob2xkZXJdPVwiJ1RpdGxlJ3wgdHJhbnNsYXRlXCIgcmVxdWlyZWQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZm9ybT5cclxuICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXQtZGlhbG9nLWNsb3NlXT1cInJvbGUudmFsdWVcIiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIXJvbGUudmFsaWRcIj57eydPSycgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gcGF0dGVybiB0ZW1wbGF0ZSAtLT5cclxuPG5nLXRlbXBsYXRlICNwYXR0ZXJuVHBsPlxyXG4gIDxoMiBtYXQtZGlhbG9nLXRpdGxlPnt7J1BhdHRlcm4nIHwgdHJhbnNsYXRlIH19PC9oMj5cclxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJwYXR0ZXJuXCIgY2xhc3M9XCJjb2x1bW5cIj5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxpbnB1dCBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJ0aXRsZVwiIFtwbGFjZWhvbGRlcl09XCInVGl0bGUnfCB0cmFuc2xhdGVcIiByZXF1aXJlZCBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPGlucHV0IG1hdElucHV0IGZvcm1Db250cm9sTmFtZT1cImV4cHJlc3Npb25cIiBbcGxhY2Vob2xkZXJdPVwiJ1JlZ2V4J3wgdHJhbnNsYXRlXCIgcmVxdWlyZWQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgICA8bWF0LWhpbnQ+PHNwYW4gW2lubmVySFRNTF09XCInUmVnZXhIaW50JyB8IHRyYW5zbGF0ZSA6ICdodHRwczovL3JlZ2V4MTAxLmNvbS8nfCBzYW5pdGl6ZUh0bWxcIj48L3NwYW4+PC9tYXQtaGludD5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDwvZm9ybT5cclxuICA8L21hdC1kaWFsb2ctY29udGVudD5cclxuICA8bWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXQtZGlhbG9nLWNsb3NlXT1cInBhdHRlcm4udmFsdWVcIiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIXBhdHRlcm4udmFsaWRcIj57eydPSycgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtYnV0dG9uIG1hdC1kaWFsb2ctY2xvc2U+e3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgPC9tYXQtZGlhbG9nLWFjdGlvbnM+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjwhLS0gZ3JvdXAgLS0+XHJcbjxuZy10ZW1wbGF0ZSAjZ3JvdXBUcGw+XHJcbiAgPGgyIG1hdC1kaWFsb2ctdGl0bGU+e3snR3JvdXAnIHwgdHJhbnNsYXRlIH19PC9oMj5cclxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJncm91cFwiIGNsYXNzPVwiY29sdW1uXCI+XHJcbiAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBbcGxhY2Vob2xkZXJdPVwiJ1RpdGxlJ3wgdHJhbnNsYXRlXCIgcmVxdWlyZWQgYXV0b2NvbXBsZXRlPVwib2ZmXCIgLz5cclxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDxtYXQtc2VsZWN0IFtwbGFjZWhvbGRlcl09XCInSXRlbXMnfHRyYW5zbGF0ZVwiIG11bHRpcGxlIGZvcm1Db250cm9sTmFtZT1cIml0ZW1zXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICA8bWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICAgICAgICB7e2dyb3VwLnZhbHVlLml0ZW1zID8gZ3JvdXAudmFsdWUuaXRlbXNbMF0gOiAnJ319XHJcbiAgICAgICAgICAgIEBpZiAoZ3JvdXAudmFsdWUuaXRlbXM/Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFkZGl0aW9uYWwtc2VsZWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAoK3t7Z3JvdXAudmFsdWUuaXRlbXMubGVuZ3RoIC0gMX19IHt7KGdyb3VwLnZhbHVlLml0ZW1zPy5sZW5ndGggPT09IDIgPyAnT3RoZXInIDogJ090aGVycycpfHRyYW5zbGF0ZX19KVxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgICBAZm9yICh2IG9mIHNvdXJjZTsgdHJhY2sgdikge1xyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwidi5rZXlcIj5cclxuICAgICAgICAgICAgICBAaWYgKCF0eXBlLmNvbHVtbnMpIHtcclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7di52YWx1ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBAaWYgKHR5cGUuY29sdW1ucykge1xyXG4gICAgICAgICAgICAgICAgPHNwYW4+QGZvciAoYyBvZiB0eXBlLmNvbHVtbnM7IHRyYWNrIGMpIHtcclxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3t2LnZhbHVlW2MubmFtZV19fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIH08L3NwYW4+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwiZ3JvdXAudmFsdWVcIiBjb2xvcj1cInByaW1hcnlcIiBbZGlzYWJsZWRdPVwiIWdyb3VwLnZhbGlkXCI+e3snT0snIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI25vUm9sZVRwbD5cclxuICA8bWF0LWRpYWxvZy1jb250ZW50PlxyXG4gICAge3snTm9Sb2xlcyd8dHJhbnNsYXRlIDogdHlwZT8udGl0bGV9fVxyXG4gIDwvbWF0LWRpYWxvZy1jb250ZW50PlxyXG4gIDxtYXQtZGlhbG9nLWFjdGlvbnM+XHJcbiAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiIGNvbG9yPVwicHJpbWFyeVwiPnt7J0NyZWF0ZVJvbGUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gIDwvbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG48L25nLXRlbXBsYXRlPlxyXG48IS0tPGZvcm0gc3R5bGU9XCJkaXNwbGF5Om5vbmVcIj5cclxuPGlucHV0IHR5cGU9XCJmaWxlXCIgbmFtZT1cImZpbGVcIiAob25jaGFuZ2UpPVwidXBsb2FkKCRldmVudClcIiAjZmlsZS8+XHJcbjwvZm9ybT4tLT5cclxuIl19