@bizdoc/core 2.3.31 → 2.3.34

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 (407) hide show
  1. package/assets/bizdoc-schema.json +1 -0
  2. package/esm2022/lib/admin/admin-dismiss.service.mjs +3 -3
  3. package/esm2022/lib/admin/admin-menu.component.mjs +5 -5
  4. package/esm2022/lib/admin/architecture/cube-axes-filter.component.mjs +3 -3
  5. package/esm2022/lib/admin/architecture/designer-element.component.mjs +35 -27
  6. package/esm2022/lib/admin/architecture/designer-privileges.component.mjs +3 -3
  7. package/esm2022/lib/admin/architecture/designer.base.mjs +9 -9
  8. package/esm2022/lib/admin/architecture/designer.component.mjs +16 -8
  9. package/esm2022/lib/admin/architecture/elements/action.component.mjs +3 -3
  10. package/esm2022/lib/admin/architecture/elements/analysis-view.component.mjs +3 -3
  11. package/esm2022/lib/admin/architecture/elements/analysis-widget.component.mjs +3 -3
  12. package/esm2022/lib/admin/architecture/elements/anomaly-rule.component.mjs +3 -3
  13. package/esm2022/lib/admin/architecture/elements/attribute.component.mjs +3 -3
  14. package/esm2022/lib/admin/architecture/elements/box-form.component.mjs +3 -3
  15. package/esm2022/lib/admin/architecture/elements/configuration-datasource.component.mjs +3 -3
  16. package/esm2022/lib/admin/architecture/elements/control.component.mjs +3 -3
  17. package/esm2022/lib/admin/architecture/elements/cube-index-utility.component.mjs +3 -3
  18. package/esm2022/lib/admin/architecture/elements/cube-view.component.mjs +3 -3
  19. package/esm2022/lib/admin/architecture/elements/cube.component.mjs +3 -3
  20. package/esm2022/lib/admin/architecture/elements/document-state-widget.component.mjs +3 -3
  21. package/esm2022/lib/admin/architecture/elements/documents-report.component.mjs +3 -3
  22. package/esm2022/lib/admin/architecture/elements/documents-widget.component.mjs +3 -3
  23. package/esm2022/lib/admin/architecture/elements/explore-view.component.mjs +3 -3
  24. package/esm2022/lib/admin/architecture/elements/folder.component.mjs +3 -3
  25. package/esm2022/lib/admin/architecture/elements/form-invite.dialog.mjs +3 -3
  26. package/esm2022/lib/admin/architecture/elements/form.component.mjs +3 -3
  27. package/esm2022/lib/admin/architecture/elements/guide.component.mjs +3 -3
  28. package/esm2022/lib/admin/architecture/elements/job.component.mjs +3 -3
  29. package/esm2022/lib/admin/architecture/elements/matrix-view.component.mjs +8 -8
  30. package/esm2022/lib/admin/architecture/elements/node.component.mjs +3 -3
  31. package/esm2022/lib/admin/architecture/elements/parallel-view.component.mjs +3 -3
  32. package/esm2022/lib/admin/architecture/elements/performance-report.component.mjs +3 -3
  33. package/esm2022/lib/admin/architecture/elements/performance-widget.component.mjs +3 -3
  34. package/esm2022/lib/admin/architecture/elements/pivot-view.component.mjs +3 -3
  35. package/esm2022/lib/admin/architecture/elements/policy.component.mjs +3 -3
  36. package/esm2022/lib/admin/architecture/elements/report.component.mjs +3 -3
  37. package/esm2022/lib/admin/architecture/elements/return-to-role-action.component.mjs +3 -3
  38. package/esm2022/lib/admin/architecture/elements/role.component.mjs +3 -3
  39. package/esm2022/lib/admin/architecture/elements/rule.component.mjs +3 -3
  40. package/esm2022/lib/admin/architecture/elements/source.component.mjs +3 -3
  41. package/esm2022/lib/admin/architecture/elements/state.component.mjs +3 -3
  42. package/esm2022/lib/admin/architecture/elements/sum-view.component.mjs +3 -3
  43. package/esm2022/lib/admin/architecture/elements/tasks-report.component.mjs +3 -3
  44. package/esm2022/lib/admin/architecture/elements/type.component.mjs +3 -3
  45. package/esm2022/lib/admin/architecture/elements/usage-report.component.mjs +3 -3
  46. package/esm2022/lib/admin/architecture/elements/utility.component.mjs +3 -3
  47. package/esm2022/lib/admin/architecture/elements/view.component.mjs +3 -3
  48. package/esm2022/lib/admin/architecture/elements/widget.component.mjs +3 -3
  49. package/esm2022/lib/admin/architecture/icon-picker.component.mjs +3 -3
  50. package/esm2022/lib/admin/core/ace.input.mjs +3 -3
  51. package/esm2022/lib/admin/core/color-picker.input.mjs +3 -3
  52. package/esm2022/lib/admin/core/localized-string.component.mjs +3 -3
  53. package/esm2022/lib/admin/core/search.input.mjs +3 -3
  54. package/esm2022/lib/admin/diff/configuration-diff.component.mjs +5 -5
  55. package/esm2022/lib/admin/document-trace/document-trace.component.mjs +3 -3
  56. package/esm2022/lib/admin/document-trace/reassign.dialog.mjs +3 -3
  57. package/esm2022/lib/admin/document-trace/trace-element.component.mjs +3 -3
  58. package/esm2022/lib/admin/form/designer/box-designer.component.mjs +3 -3
  59. package/esm2022/lib/admin/form/designer/design-control.component.mjs +3 -3
  60. package/esm2022/lib/admin/form/designer/properties.component.mjs +3 -3
  61. package/esm2022/lib/admin/form/designer/section.component.mjs +3 -3
  62. package/esm2022/lib/admin/form/designer/settings.component.mjs +3 -3
  63. package/esm2022/lib/admin/form/form.resolve.service.mjs +3 -3
  64. package/esm2022/lib/admin/form/workflow/node.component.mjs +3 -3
  65. package/esm2022/lib/admin/form/workflow/role-node.component.mjs +3 -3
  66. package/esm2022/lib/admin/form/workflow/workflow.component.mjs +3 -3
  67. package/esm2022/lib/admin/indices/manage-cube-index.component.mjs +3 -3
  68. package/esm2022/lib/admin/patterns/patterns.component.mjs +3 -3
  69. package/esm2022/lib/admin/permissions/permissions.component.mjs +3 -3
  70. package/esm2022/lib/admin/positions/positions-popup.component.mjs +3 -3
  71. package/esm2022/lib/admin/positions/positions.component.mjs +3 -3
  72. package/esm2022/lib/admin/profiler/outofoffice.component.mjs +3 -3
  73. package/esm2022/lib/admin/profiler/profiler.component.mjs +3 -3
  74. package/esm2022/lib/admin/system.service.mjs +3 -3
  75. package/esm2022/lib/admin/utility-wrapper.component.mjs +3 -3
  76. package/esm2022/lib/admin/utility.pane.component.mjs +3 -3
  77. package/esm2022/lib/app.component.mjs +6 -6
  78. package/esm2022/lib/bizdoc.module.mjs +4 -4
  79. package/esm2022/lib/browse/browse-items.component.mjs +3 -3
  80. package/esm2022/lib/browse/browse.mobile.component.mjs +3 -3
  81. package/esm2022/lib/browse/browse.pane.component.mjs +22 -11
  82. package/esm2022/lib/browse/expanded-item/expanded-item.component.mjs +3 -3
  83. package/esm2022/lib/browse/filter/filter.component.mjs +28 -38
  84. package/esm2022/lib/browse/folders-menu.component.mjs +3 -3
  85. package/esm2022/lib/chat/chat-info.mjs +3 -3
  86. package/esm2022/lib/chat/chat.mobile.component.mjs +3 -3
  87. package/esm2022/lib/chat/chat.service.mjs +3 -3
  88. package/esm2022/lib/chat/contacts.component.mjs +15 -14
  89. package/esm2022/lib/chat/contacts.pane.component.mjs +3 -3
  90. package/esm2022/lib/chat/conversation.component.mjs +5 -5
  91. package/esm2022/lib/chat/conversation.pane.component.mjs +3 -3
  92. package/esm2022/lib/compose/action/action-picker.component.mjs +3 -3
  93. package/esm2022/lib/compose/action/action.dialog.mjs +3 -3
  94. package/esm2022/lib/compose/action/action.pane.dialog.exp.mjs +3 -3
  95. package/esm2022/lib/compose/action/assign-action.component.mjs +3 -3
  96. package/esm2022/lib/compose/action/moveto-action.component.mjs +3 -3
  97. package/esm2022/lib/compose/action/return-action.component.mjs +3 -3
  98. package/esm2022/lib/compose/attachments/attachments.component.mjs +3 -3
  99. package/esm2022/lib/compose/attachments/preview/attachment-preview.component.mjs +3 -3
  100. package/esm2022/lib/compose/attachments/progress-button.directive.mjs +3 -3
  101. package/esm2022/lib/compose/box/box.component.mjs +3 -3
  102. package/esm2022/lib/compose/box/control.component.mjs +3 -3
  103. package/esm2022/lib/compose/box/row.component.mjs +3 -3
  104. package/esm2022/lib/compose/can-deactivate-changes.service.mjs +3 -3
  105. package/esm2022/lib/compose/comments/comment.component.mjs +3 -3
  106. package/esm2022/lib/compose/comments/comments.component.mjs +3 -3
  107. package/esm2022/lib/compose/comments/comments.pane.component.mjs +3 -3
  108. package/esm2022/lib/compose/comments/edit-comment.component.mjs +3 -3
  109. package/esm2022/lib/compose/comments/edits.component.mjs +3 -3
  110. package/esm2022/lib/compose/comments/quick-comment.component.exp.mjs +3 -3
  111. package/esm2022/lib/compose/comments/votes.component.mjs +3 -3
  112. package/esm2022/lib/compose/compose-resolve.service.mjs +6 -6
  113. package/esm2022/lib/compose/compose.mobile.component.mjs +3 -3
  114. package/esm2022/lib/compose/compose.pane.component.mjs +3 -3
  115. package/esm2022/lib/compose/copy/copy.dialog.mjs +3 -3
  116. package/esm2022/lib/compose/dismiss.service.mjs +3 -3
  117. package/esm2022/lib/compose/document-resolver.service.mjs +3 -3
  118. package/esm2022/lib/compose/document.component.mjs +3 -3
  119. package/esm2022/lib/compose/document.mobile.component.mjs +3 -3
  120. package/esm2022/lib/compose/document.pane.component.mjs +3 -3
  121. package/esm2022/lib/compose/events/events.component.mjs +3 -3
  122. package/esm2022/lib/compose/form-selector/form-selector.sheet.mjs +3 -3
  123. package/esm2022/lib/compose/form.component.mjs +3 -3
  124. package/esm2022/lib/compose/new-menu.component.mjs +5 -5
  125. package/esm2022/lib/compose/privilage.directive.mjs +6 -6
  126. package/esm2022/lib/compose/recipient-resolver.service.mjs +3 -3
  127. package/esm2022/lib/compose/state.component.mjs +3 -3
  128. package/esm2022/lib/compose/tag/tags.component.mjs +3 -3
  129. package/esm2022/lib/compose/trace/flow.component.mjs +8 -4
  130. package/esm2022/lib/compose/trace/people.component.mjs +3 -3
  131. package/esm2022/lib/compose/trace/trace.base.mjs +3 -3
  132. package/esm2022/lib/compose/trace/trace.component.mjs +3 -3
  133. package/esm2022/lib/compose/trace/trace.pane.component.mjs +7 -9
  134. package/esm2022/lib/compose/version-compare/version-compare.component.mjs +3 -3
  135. package/esm2022/lib/compose/version-compare/version-compare.directive.mjs +9 -9
  136. package/esm2022/lib/compose/version-compare/version.pane.component.mjs +3 -3
  137. package/esm2022/lib/core/StickyToolbar.mjs +3 -3
  138. package/esm2022/lib/core/account.service.mjs +3 -3
  139. package/esm2022/lib/core/animated-icon/animated-icon.directive.mjs +3 -3
  140. package/esm2022/lib/core/avatar/avatar.component.mjs +3 -3
  141. package/esm2022/lib/core/checkbox.mjs +3 -3
  142. package/esm2022/lib/core/component-factory-resolver.mjs +3 -3
  143. package/esm2022/lib/core/datasource.service.mjs +3 -3
  144. package/esm2022/lib/core/fields/address.designer.mjs +3 -3
  145. package/esm2022/lib/core/fields/address.field.mjs +3 -3
  146. package/esm2022/lib/core/fields/autocomplete.field.mjs +6 -6
  147. package/esm2022/lib/core/fields/checkbox.designer.mjs +3 -3
  148. package/esm2022/lib/core/fields/checkbox.field.mjs +3 -3
  149. package/esm2022/lib/core/fields/checklist.designer.mjs +3 -3
  150. package/esm2022/lib/core/fields/checklist.field.mjs +3 -3
  151. package/esm2022/lib/core/fields/date-range.designer.mjs +3 -3
  152. package/esm2022/lib/core/fields/date-range.field.mjs +3 -3
  153. package/esm2022/lib/core/fields/date.designer.mjs +3 -3
  154. package/esm2022/lib/core/fields/date.field.mjs +3 -3
  155. package/esm2022/lib/core/fields/expression.field.mjs +6 -6
  156. package/esm2022/lib/core/fields/file.designer.mjs +3 -3
  157. package/esm2022/lib/core/fields/file.field.mjs +3 -3
  158. package/esm2022/lib/core/fields/html.designer.mjs +3 -3
  159. package/esm2022/lib/core/fields/html.field.mjs +3 -3
  160. package/esm2022/lib/core/fields/input.designer.mjs +3 -3
  161. package/esm2022/lib/core/fields/input.field.mjs +3 -3
  162. package/esm2022/lib/core/fields/localized-string.field.mjs +6 -6
  163. package/esm2022/lib/core/fields/numeric.designer.mjs +3 -3
  164. package/esm2022/lib/core/fields/numeric.field.mjs +3 -3
  165. package/esm2022/lib/core/fields/options.base.mjs +6 -6
  166. package/esm2022/lib/core/fields/options.component.mjs +3 -3
  167. package/esm2022/lib/core/fields/radio-button.designer.mjs +3 -3
  168. package/esm2022/lib/core/fields/radio-button.field.mjs +3 -3
  169. package/esm2022/lib/core/fields/select.designer.mjs +3 -3
  170. package/esm2022/lib/core/fields/select.field.mjs +3 -3
  171. package/esm2022/lib/core/fields/signature.designer.mjs +3 -3
  172. package/esm2022/lib/core/fields/signature.field.mjs +3 -3
  173. package/esm2022/lib/core/fields/switch.field.mjs +3 -3
  174. package/esm2022/lib/core/fields/tags.designer.mjs +3 -3
  175. package/esm2022/lib/core/fields/tags.field.mjs +3 -3
  176. package/esm2022/lib/core/fields/textarea.designer.mjs +3 -3
  177. package/esm2022/lib/core/fields/textarea.field.mjs +3 -3
  178. package/esm2022/lib/core/fields/time.designer.mjs +3 -3
  179. package/esm2022/lib/core/fields/time.field.mjs +3 -3
  180. package/esm2022/lib/core/fields/timespan.field.mjs +6 -6
  181. package/esm2022/lib/core/fields/yesno.designer.mjs +3 -3
  182. package/esm2022/lib/core/fields/yesno.field.mjs +3 -3
  183. package/esm2022/lib/core/guide/guide.component.mjs +8 -8
  184. package/esm2022/lib/core/guide/guide.service.mjs +3 -3
  185. package/esm2022/lib/core/guide/help-tip.component.mjs +3 -3
  186. package/esm2022/lib/core/http.interceptor.mjs +3 -3
  187. package/esm2022/lib/core/hub.service.mjs +3 -3
  188. package/esm2022/lib/core/identity/identity.component.mjs +3 -3
  189. package/esm2022/lib/core/info/attachment-info.service.mjs +3 -3
  190. package/esm2022/lib/core/info/document-info.service.mjs +3 -3
  191. package/esm2022/lib/core/info/location-info.component.mjs +3 -3
  192. package/esm2022/lib/core/info/map-info.mjs +3 -3
  193. package/esm2022/lib/core/inputs/address.input.mjs +3 -3
  194. package/esm2022/lib/core/inputs/auto-complete.input.mjs +3 -3
  195. package/esm2022/lib/core/inputs/combination-picker-body.mjs +4 -4
  196. package/esm2022/lib/core/inputs/combination-picker.mjs +3 -3
  197. package/esm2022/lib/core/inputs/combination-pool.mjs +3 -3
  198. package/esm2022/lib/core/inputs/file.input.mjs +3 -3
  199. package/esm2022/lib/core/inputs/select.input.mjs +3 -3
  200. package/esm2022/lib/core/inputs/signature.input.mjs +3 -3
  201. package/esm2022/lib/core/inputs/time-picker.mjs +3 -3
  202. package/esm2022/lib/core/inputs/timespan.input.mjs +3 -3
  203. package/esm2022/lib/core/layout.component.mjs +3 -3
  204. package/esm2022/lib/core/lottie-animation.mjs +3 -3
  205. package/esm2022/lib/core/mailbox.service.mjs +3 -3
  206. package/esm2022/lib/core/none.component.mjs +3 -3
  207. package/esm2022/lib/core/pipes/action.pipe.mjs +3 -3
  208. package/esm2022/lib/core/pipes/calendar.pipe.mjs +3 -3
  209. package/esm2022/lib/core/pipes/date-format.pipe.mjs +3 -3
  210. package/esm2022/lib/core/pipes/daterange.pipe.mjs +6 -6
  211. package/esm2022/lib/core/pipes/difference.pipe.mjs +3 -3
  212. package/esm2022/lib/core/pipes/duration-format.pipe.mjs +3 -3
  213. package/esm2022/lib/core/pipes/duration.pipe.mjs +3 -3
  214. package/esm2022/lib/core/pipes/form.pipe.mjs +3 -3
  215. package/esm2022/lib/core/pipes/join.pipe.mjs +3 -3
  216. package/esm2022/lib/core/pipes/localized-string.pipe.mjs +3 -3
  217. package/esm2022/lib/core/pipes/role.pipe.mjs +3 -3
  218. package/esm2022/lib/core/pipes/sanitize-html.pipe.mjs +3 -3
  219. package/esm2022/lib/core/pipes/sort.pipe.mjs +9 -9
  220. package/esm2022/lib/core/pipes/state.pipe.mjs +3 -3
  221. package/esm2022/lib/core/pipes/time-ago.pipe.mjs +6 -6
  222. package/esm2022/lib/core/pipes/translate.pipe.mjs +9 -9
  223. package/esm2022/lib/core/pipes/type-value.pipe.mjs +3 -3
  224. package/esm2022/lib/core/pipes/user-name.pipe.mjs +3 -3
  225. package/esm2022/lib/core/popup/popup.component.mjs +3 -3
  226. package/esm2022/lib/core/popup/popup.service.mjs +3 -3
  227. package/esm2022/lib/core/popup/tooltip.directive.mjs +6 -6
  228. package/esm2022/lib/core/prompt/ask/ask.dialog.mjs +3 -3
  229. package/esm2022/lib/core/prompt/mask/mask.component.mjs +3 -3
  230. package/esm2022/lib/core/prompt.service.mjs +3 -3
  231. package/esm2022/lib/core/router.mjs +6 -6
  232. package/esm2022/lib/core/save-changes.dialog.mjs +3 -3
  233. package/esm2022/lib/core/session.service.mjs +3 -3
  234. package/esm2022/lib/core/slots/router.directive.mjs +3 -3
  235. package/esm2022/lib/core/slots/router.service.mjs +3 -3
  236. package/esm2022/lib/core/slots/slots.component.mjs +32 -32
  237. package/esm2022/lib/core/tagging/documents.component.mjs +3 -3
  238. package/esm2022/lib/core/tagging/edit-input.component.mjs +3 -3
  239. package/esm2022/lib/core/tagging/emoji.component.mjs +3 -3
  240. package/esm2022/lib/core/tagging/tagging-item.directive.mjs +3 -3
  241. package/esm2022/lib/core/tagging/tagging.component-base.mjs +3 -3
  242. package/esm2022/lib/core/tagging/tagging.directive.mjs +3 -3
  243. package/esm2022/lib/core/tagging/tagging.pipe.mjs +3 -3
  244. package/esm2022/lib/core/tagging/users.component.mjs +3 -3
  245. package/esm2022/lib/core/translate.service.mjs +3 -3
  246. package/esm2022/lib/core/translations.mjs +27 -7
  247. package/esm2022/lib/core/window-title.service.mjs +3 -3
  248. package/esm2022/lib/cube/accum/accum.component.mjs +3 -3
  249. package/esm2022/lib/cube/chart/chart.component.mjs +3 -3
  250. package/esm2022/lib/cube/cube-info.service.mjs +3 -3
  251. package/esm2022/lib/cube/cube-menu.component.mjs +5 -5
  252. package/esm2022/lib/cube/cube-view.component.mjs +3 -3
  253. package/esm2022/lib/cube/cube.service.mjs +3 -3
  254. package/esm2022/lib/cube/explore/document-item.component.mjs +3 -3
  255. package/esm2022/lib/cube/explore/explore-item.component.mjs +3 -3
  256. package/esm2022/lib/cube/explore/explore-items.component.mjs +3 -3
  257. package/esm2022/lib/cube/explore/explore.pane.component.mjs +3 -3
  258. package/esm2022/lib/cube/explore/item-resolver.service.mjs +6 -6
  259. package/esm2022/lib/cube/explore/item.pane.component.mjs +3 -3
  260. package/esm2022/lib/cube/filter/filter-tags.component.exp.mjs +3 -3
  261. package/esm2022/lib/cube/filter/filter.component.mjs +3 -3
  262. package/esm2022/lib/cube/grid/grid.component.mjs +3 -3
  263. package/esm2022/lib/cube/matrix/matrix.base.mjs +3 -3
  264. package/esm2022/lib/cube/matrix/matrix.mobile.component.mjs +3 -3
  265. package/esm2022/lib/cube/matrix/matrix.pane.component.mjs +3 -3
  266. package/esm2022/lib/cube/matrix/popup.component.mjs +3 -3
  267. package/esm2022/lib/cube/matrix/table.component.mjs +177 -164
  268. package/esm2022/lib/cube/parallel/parallel.component.mjs +3 -3
  269. package/esm2022/lib/cube/pivot/pivot.component.mjs +3 -3
  270. package/esm2022/lib/cube/spreadsheet/spreadsheet.component.mjs +3 -3
  271. package/esm2022/lib/cube/spreadsheet/spreadsheet.container.mjs +3 -3
  272. package/esm2022/lib/cube/sum/sum.component.mjs +3 -3
  273. package/esm2022/lib/cube/view-base.mjs +3 -3
  274. package/esm2022/lib/cube/view.mobile.component.mjs +3 -3
  275. package/esm2022/lib/cube/view.pane.component.mjs +27 -13
  276. package/esm2022/lib/dashboard/actions/actions.widget.mjs +3 -3
  277. package/esm2022/lib/dashboard/cube/accum-cube.widget.mjs +3 -3
  278. package/esm2022/lib/dashboard/cube/compare.widget.mjs +3 -3
  279. package/esm2022/lib/dashboard/cube/cube-analysis.base.mjs +3 -3
  280. package/esm2022/lib/dashboard/cube/cube-analysis.widget.mjs +3 -3
  281. package/esm2022/lib/dashboard/cube/cube-chart.widget.mjs +3 -3
  282. package/esm2022/lib/dashboard/cube/document-state.widget.mjs +3 -3
  283. package/esm2022/lib/dashboard/cube/documents.widget.mjs +3 -3
  284. package/esm2022/lib/dashboard/cube/filter/filter.component.mjs +3 -3
  285. package/esm2022/lib/dashboard/dashboard.component.mjs +3 -3
  286. package/esm2022/lib/dashboard/dashboard.pane.component.mjs +3 -3
  287. package/esm2022/lib/dashboard/recents/recents.widget.mjs +3 -3
  288. package/esm2022/lib/dashboard/score/activity.widget.mjs +3 -3
  289. package/esm2022/lib/dashboard/score/compare-groups.widget.mjs +3 -3
  290. package/esm2022/lib/dashboard/score/peers-performance.widget.mjs +3 -3
  291. package/esm2022/lib/dashboard/score/pending-results.widget.mjs +3 -3
  292. package/esm2022/lib/dashboard/score/personal-score.widget.mjs +3 -3
  293. package/esm2022/lib/dashboard/widget-item.component.mjs +3 -3
  294. package/esm2022/lib/designer.module.mjs +4 -4
  295. package/esm2022/lib/desktop.module.mjs +5 -8
  296. package/esm2022/lib/home/about/about.dialog.mjs +3 -3
  297. package/esm2022/lib/home/home-base.component.mjs +5 -5
  298. package/esm2022/lib/home/home.desktop.component.mjs +133 -42
  299. package/esm2022/lib/home/home.mobile.component.mjs +5 -5
  300. package/esm2022/lib/home/notifications/notifications.component.mjs +3 -3
  301. package/esm2022/lib/home/options/options.component.mjs +34 -37
  302. package/esm2022/lib/home/outofoffice/outofoffice.component.mjs +5 -5
  303. package/esm2022/lib/home/sign/sign.component.mjs +3 -3
  304. package/esm2022/lib/impersonate/impersonate.component.mjs +3 -3
  305. package/esm2022/lib/mobile.module.mjs +4 -4
  306. package/esm2022/lib/modules/chart.module.mjs +4 -4
  307. package/esm2022/lib/modules/circular-gauge.module.mjs +4 -4
  308. package/esm2022/lib/modules/datepicker.intl.mjs +3 -3
  309. package/esm2022/lib/modules/dayjs.module.mjs +4 -4
  310. package/esm2022/lib/modules/diagram.module.mjs +4 -4
  311. package/esm2022/lib/modules/gantt.module.mjs +4 -4
  312. package/esm2022/lib/modules/grid.module.mjs +4 -4
  313. package/esm2022/lib/modules/linear-gauge.module.mjs +4 -4
  314. package/esm2022/lib/modules/material.module.mjs +4 -4
  315. package/esm2022/lib/modules/paginator.intl.mjs +3 -3
  316. package/esm2022/lib/modules/pivot.module.mjs +4 -4
  317. package/esm2022/lib/modules/schedule.module.mjs +4 -4
  318. package/esm2022/lib/modules/spreadsheet.module.mjs +4 -4
  319. package/esm2022/lib/modules/stepper.intl.mjs +3 -3
  320. package/esm2022/lib/modules/texteditor.module.mjs +4 -4
  321. package/esm2022/lib/notifications/filter.component.mjs +3 -3
  322. package/esm2022/lib/notifications/notifications-table.component.mjs +3 -3
  323. package/esm2022/lib/notifications/notifications.mobile.component.mjs +3 -3
  324. package/esm2022/lib/notifications/notifications.pane.component.mjs +3 -3
  325. package/esm2022/lib/notifications/notifications.service.mjs +3 -3
  326. package/esm2022/lib/notifications/types/commented.notification.mjs +3 -3
  327. package/esm2022/lib/notifications/types/cube-anomaly.notification.mjs +3 -3
  328. package/esm2022/lib/notifications/types/escalated.notification.mjs +3 -3
  329. package/esm2022/lib/notifications/types/invite.notification.mjs +3 -3
  330. package/esm2022/lib/notifications/types/liked.notification.mjs +3 -3
  331. package/esm2022/lib/notifications/types/long-running-task.notification.mjs +3 -3
  332. package/esm2022/lib/notifications/types/notification-base.mjs +3 -3
  333. package/esm2022/lib/notifications/types/nudge.notification.mjs +3 -3
  334. package/esm2022/lib/notifications/types/state-changed.notification.mjs +3 -3
  335. package/esm2022/lib/notifications/types/tagged.notification.mjs +3 -3
  336. package/esm2022/lib/notifications/types/text.notification.mjs +3 -3
  337. package/esm2022/lib/notifications/types/upcoming-event.notification.mjs +3 -3
  338. package/esm2022/lib/options/options.component.mjs +72 -81
  339. package/esm2022/lib/options/options.service.mjs +9 -29
  340. package/esm2022/lib/reports/arguments-component.mjs +3 -3
  341. package/esm2022/lib/reports/cube/documents.component.mjs +3 -3
  342. package/esm2022/lib/reports/cube/grid-documents.component.mjs +3 -3
  343. package/esm2022/lib/reports/cube/role-performance.component.mjs +3 -3
  344. package/esm2022/lib/reports/cube/table-documents.component.mjs +3 -3
  345. package/esm2022/lib/reports/cube/usage-args.component.mjs +3 -3
  346. package/esm2022/lib/reports/cube/usage-base.mjs +3 -3
  347. package/esm2022/lib/reports/cube/usage-chart.component.mjs +3 -3
  348. package/esm2022/lib/reports/cube/usage-pivot.component.mjs +3 -3
  349. package/esm2022/lib/reports/cube/usage.component.mjs +3 -3
  350. package/esm2022/lib/reports/report-viewer.component.mjs +3 -3
  351. package/esm2022/lib/reports/report.mobile.component.mjs +3 -3
  352. package/esm2022/lib/reports/report.pane.component.mjs +28 -11
  353. package/esm2022/lib/reports/reports-menu.component.mjs +5 -5
  354. package/esm2022/lib/reports/substitution/substitution.component.mjs +3 -3
  355. package/esm2022/lib/reports/table/table-view.component.mjs +3 -3
  356. package/esm2022/lib/reports/tasks/tasks.component.mjs +3 -3
  357. package/esm2022/lib/scheduler/schedule.component.mjs +3 -3
  358. package/esm2022/lib/scheduler/scheduler.mobile.component.mjs +3 -3
  359. package/esm2022/lib/scheduler/scheduler.pane.component.mjs +3 -3
  360. package/esm2022/lib/search/cube.component.mjs +9 -7
  361. package/esm2022/lib/search/document.component.mjs +6 -6
  362. package/esm2022/lib/search/guide.component.mjs +10 -9
  363. package/esm2022/lib/search/path.component.mjs +6 -6
  364. package/esm2022/lib/search/search.service.mjs +3 -3
  365. package/esm2022/lib/shared.module.mjs +7 -7
  366. package/esm2022/lib/system.module.mjs +11 -5
  367. package/esm2022/lib/views/cube/chart.component.mjs +3 -3
  368. package/esm2022/lib/views/cube/cube-base.mjs +3 -3
  369. package/esm2022/lib/views/cube/explore.component.mjs +3 -3
  370. package/esm2022/lib/views/cube/matrix.component.mjs +7 -5
  371. package/esm2022/lib/views/cube/parallel.component.mjs +3 -3
  372. package/esm2022/lib/views/cube/pivot.component.mjs +3 -3
  373. package/esm2022/lib/views/cube/sum.component.mjs +3 -3
  374. package/esm2022/lib/views/cube/view.component.mjs +3 -3
  375. package/esm2022/lib/views/timeline/timeline.component.mjs +3 -3
  376. package/esm2022/lib/views/view-item.component.mjs +3 -3
  377. package/esm2022/lib/views/views.component.mjs +3 -3
  378. package/esm2022/lib/views/views.mobile.component.mjs +3 -3
  379. package/esm2022/lib/views/views.pane.component.mjs +3 -3
  380. package/esm2022/public-api.mjs +2 -1
  381. package/fesm2022/bizdoc-core.mjs +3285 -3200
  382. package/fesm2022/bizdoc-core.mjs.map +1 -1
  383. package/lib/admin/architecture/designer-element.component.d.ts +12 -2
  384. package/lib/admin/architecture/designer.component.d.ts +2 -1
  385. package/lib/admin/architecture/elements/matrix-view.component.d.ts +1 -1
  386. package/lib/browse/browse.pane.component.d.ts +3 -2
  387. package/lib/browse/filter/filter.component.d.ts +2 -5
  388. package/lib/compose/trace/trace.pane.component.d.ts +1 -1
  389. package/lib/core/guide/guide.component.d.ts +1 -1
  390. package/lib/core/slots/slots.component.d.ts +6 -4
  391. package/lib/core/translations.d.ts +22 -2
  392. package/lib/cube/matrix/table.component.d.ts +16 -11
  393. package/lib/cube/view.pane.component.d.ts +8 -3
  394. package/lib/desktop.module.d.ts +37 -38
  395. package/lib/home/home-base.component.d.ts +1 -1
  396. package/lib/home/home.desktop.component.d.ts +31 -6
  397. package/lib/home/home.mobile.component.d.ts +1 -1
  398. package/lib/home/options/options.component.d.ts +10 -13
  399. package/lib/options/options.component.d.ts +18 -21
  400. package/lib/options/options.service.d.ts +2 -7
  401. package/lib/reports/report.pane.component.d.ts +8 -2
  402. package/lib/shared.module.d.ts +1 -1
  403. package/lib/views/cube/matrix.component.d.ts +2 -0
  404. package/package.json +6 -6
  405. package/public-api.d.ts +1 -0
  406. package/esm2022/lib/home/tools.component.mjs +0 -82
  407. package/lib/home/tools.component.d.ts +0 -35
@@ -13,35 +13,12 @@ import * as i2 from "../cube.service";
13
13
  import * as i3 from "../../core/session.service";
14
14
  import * as i4 from "../../core/translate.service";
15
15
  import * as i5 from "../../core/datasource.service";
16
- const LOADING_DELAY = 200, SUM_PREFIX = '_sum';
16
+ const LOADING_GRACE = 200;
17
17
  /** cube matrix component*/
18
18
  export class CubeMatrixComponent {
19
19
  set sum(val) {
20
20
  if (val)
21
- this._sum = (isArray(val) ? val : [val]).
22
- map(sum => {
23
- let value;
24
- if (sum.value)
25
- value = sum.value.toString();
26
- else if (sum.calculate)
27
- switch (sum.calculate) {
28
- case 'Month':
29
- value = 'M' + ('0' + (new Date().getMonth() + 1).toString()).slice(-2);
30
- break;
31
- case 'Year':
32
- value = new Date().getFullYear().toString();
33
- break;
34
- case 'Quarter':
35
- value = Math.ceil((new Date().getMonth() + 1) / 3).toString();
36
- break;
37
- case 'Sum':
38
- value = '~';
39
- }
40
- return {
41
- ...sum,
42
- value
43
- };
44
- });
21
+ this._sum = (isArray(val) ? val : [val]).map(evalSumSettings);
45
22
  }
46
23
  get interactive() {
47
24
  return this._interactive;
@@ -84,37 +61,36 @@ export class CubeMatrixComponent {
84
61
  this.xAxis = this.cube.axes.find(a => a.name === this._xAxis);
85
62
  this.series = this.cube.axes.find(a => a.name === this._series);
86
63
  this.data = null;
87
- this._prepare = firstValueFrom(forkJoin([this._ds.all(this.series.dataType).pipe(tap(r => this.rows = r)),
88
- this._ds.all(this.xAxis.dataType).pipe(tap(c => this.columns = c)).pipe(tap(() => {
89
- this._indices && this._addindices();
90
- this._sum && this._addsumheaders();
91
- }))]));
64
+ this._prepare = firstValueFrom(forkJoin([
65
+ this._ds.all(this.series.dataType).pipe(tap(r => this.rows = r)),
66
+ this._ds.all(this.xAxis.dataType).pipe(tap(c => this.columns = c))
67
+ ]).pipe(tap(this._addAccumHeaders.bind(this))));
92
68
  this.refresh();
93
69
  }
94
70
  else if (changes['filters'])
95
71
  this.refresh();
96
72
  }
97
- _addindices() {
98
- const collection = this.indexAt === 'XAxis' ? this.columns : this.rows;
99
- this.indices.forEach((x, i) => {
100
- const header = {
101
- key: x.name,
102
- value: x.title,
103
- index: x,
104
- accumulate: x.accumulate
105
- };
106
- if (this.placeAt === 'Trailing')
107
- collection.push(header);
108
- else
109
- collection.splice(i, 0, header);
110
- });
111
- }
112
- _addsumheaders() {
113
- this._sum.forEach((s, i) => {
114
- const { value, axis } = s;
73
+ _addAccumHeaders() {
74
+ if (this._indices) {
75
+ const collection = this.indexAt === 'XAxis' ? this.columns : this.rows;
76
+ this.indices.forEach((x, i) => {
77
+ const header = {
78
+ key: x.name,
79
+ value: x.title,
80
+ index: x,
81
+ accumulate: x.accumulate
82
+ };
83
+ if (this.placeAt === 'Trailing')
84
+ collection.push(header);
85
+ else
86
+ collection.splice(i, 0, header);
87
+ });
88
+ }
89
+ this._sum && this._sum.forEach((s, i) => {
90
+ const { title, axis, value } = s;
115
91
  const header = {
116
- key: SUM_PREFIX + i,
117
- value: s.title,
92
+ key: '_sum' + i,
93
+ value: title,
118
94
  accumulate: !isFunction(s.calculate) && s.calculate !== 'Sum',
119
95
  explorable: !isFunction(s.calculate) && s.explorable !== false,
120
96
  precision: s.precision,
@@ -146,7 +122,7 @@ export class CubeMatrixComponent {
146
122
  });
147
123
  }
148
124
  refresh() {
149
- const progressTask = setTimeout(() => this.loadingChange.next(this.loading = true), LOADING_DELAY);
125
+ const progressTask = setTimeout(() => this.loadingChange.next(this.loading = true), LOADING_GRACE);
150
126
  this._prepare.then(() => this._service.series(this.cube.name, this._xAxis, {
151
127
  series: this._series,
152
128
  indices: this._indices,
@@ -155,100 +131,57 @@ export class CubeMatrixComponent {
155
131
  scope: this.scope
156
132
  }).subscribe({
157
133
  next: r => {
158
- const data = this._serialize(r);
159
- this._clone(data);
160
- this._sum && this._calculatesum(data);
161
- this._totals(data);
162
- this._stringify(data);
163
- this.data = data;
164
- clearTimeout(progressTask);
165
- this.loadingChange.next(this.loading = false);
134
+ const map = this._map(r);
135
+ this._clone(map);
136
+ this._totals(map);
137
+ this._stringify(map);
138
+ this.data = map;
166
139
  },
167
140
  error: (e) => {
168
141
  this._sb.error(errResource(e));
142
+ this.loadingChange.error(e);
143
+ }, complete: () => {
169
144
  clearTimeout(progressTask);
170
145
  this.loadingChange.next(this.loading = false);
171
- this.loadingChange.error(e);
172
146
  }
173
147
  }));
174
148
  }
175
- _serialize(series) {
176
- const d = {};
149
+ _map(series) {
150
+ const map = {};
177
151
  series.forEach(s => {
178
152
  if (s.index) {
179
153
  if (this.indexAt === 'XAxis')
180
154
  s.points.forEach(p => {
181
- let row = d[p.x];
155
+ let row = map[p.x];
182
156
  if (!row)
183
- row = d[p.x] = {};
157
+ row = map[p.x] = {};
184
158
  row[s.index] = p.y;
185
159
  });
186
160
  else {
187
- const row = d[s.index] = {};
161
+ const row = map[s.index] = {};
188
162
  s.points.forEach(p => row[p.x] = p.y);
189
163
  }
190
164
  }
191
165
  else {
192
- const row = d[s.name] = {};
166
+ const row = map[s.name] = {};
193
167
  s.points.forEach(p => row[p.x] = p.y);
194
168
  }
195
169
  });
196
- return d;
170
+ return map;
197
171
  }
198
172
  _clone(data) {
199
- this._data = {};
173
+ this._rawdata = {};
200
174
  this.rows.forEach(r => {
201
175
  const key = r.key;
202
176
  if (!data[key])
203
177
  data[key] = {};
204
- Object.assign(this._data[key] = {}, data[key]);
178
+ Object.assign(this._rawdata[key] = {}, data[key]);
205
179
  });
206
180
  }
207
181
  _totals(data) {
208
- let grand = 0;
209
- this.rows.forEach(r => {
210
- const datarow = data[r.key];
211
- if (datarow) {
212
- let columnTotal = 0;
213
- this.columns.forEach(c => {
214
- if (c.accumulate === false || c.sum !== undefined)
215
- return;
216
- const val = datarow[c.key];
217
- if (val !== undefined)
218
- columnTotal += this.indices.length === 0 || this.indexAt !== 'XAxis' ||
219
- c.index !== undefined ? val : -val;
220
- });
221
- datarow['_total'] = this._format(columnTotal, r);
222
- if (!r.sum)
223
- grand += this.indices.length === 0 ||
224
- this.indexAt === 'XAxis' ||
225
- r.index !== undefined ? columnTotal : -columnTotal;
226
- }
227
- else
228
- data[r.key] = {
229
- '_total': '0'
230
- };
231
- });
232
- const totals = data['_total'] = this.totals = {};
233
- totals['_grand'] = this._format(grand);
234
- this.columns.forEach(c => {
235
- let rowTotal = 0;
236
- this.rows.forEach(row => {
237
- if (row.accumulate === false || row.sum !== undefined)
238
- return;
239
- const val = data[row.key][c.key];
240
- if (val !== undefined)
241
- rowTotal += this.indices.length === 0 || this.indexAt === 'XAxis' ||
242
- row.index !== undefined ? val : -val;
243
- });
244
- totals[c.key] = this._format(rowTotal, c);
245
- });
246
- }
247
- _calculatesum(data) {
248
- this._sum.forEach((s, i) => {
249
- const { axis, value, calculate } = s;
250
- const name = SUM_PREFIX + i;
251
- if (axis === 'XAxis') {
182
+ this._sum?.forEach((s, i) => {
183
+ const { axis, value: key, calculate } = s, name = '_sum' + i;
184
+ if (axis === 'XAxis')
252
185
  this.rows.forEach(r => {
253
186
  if (r.accumulate === false)
254
187
  return;
@@ -257,42 +190,37 @@ export class CubeMatrixComponent {
257
190
  return;
258
191
  let sum = 0;
259
192
  for (const column of this.columns) {
260
- if (column.index)
261
- continue;
262
- const key = column.key;
263
- if (column.sum)
193
+ if (column.index || column.sum)
264
194
  continue;
265
195
  if (isFunction(calculate)) {
266
- const val = calculate(r.key, this._data);
196
+ const val = calculate(r.key, this._rawdata);
267
197
  if (val !== undefined && val !== null)
268
198
  sum += val;
269
199
  }
270
200
  else {
271
- const val = datarow[key];
201
+ const val = datarow[column.key];
272
202
  if (val !== undefined)
273
203
  sum += val;
274
- if (key === value)
204
+ if (column.key === key)
275
205
  break;
276
206
  }
277
207
  }
278
208
  datarow[name] = sum;
279
209
  });
280
- }
281
210
  else {
282
- const datarow = data[name] = {};
211
+ const sumrow = data[name] = {};
283
212
  this.columns.forEach(column => {
284
213
  let sum = 0;
285
214
  for (const row of this.rows) {
286
- if (row.index)
215
+ if (row.index || row.sum)
287
216
  continue;
288
- const key = row.key;
289
217
  if (isFunction(calculate)) {
290
- const val = calculate(row.key, this._data);
218
+ const val = calculate(row.key, this._rawdata);
291
219
  if (val !== undefined && val !== null)
292
220
  sum += val;
293
221
  }
294
222
  else {
295
- const datarow = data[key];
223
+ const datarow = data[row.key];
296
224
  if (!datarow)
297
225
  continue;
298
226
  if (column.sum) {
@@ -305,31 +233,67 @@ export class CubeMatrixComponent {
305
233
  if (val !== undefined)
306
234
  sum += val;
307
235
  }
308
- if (key === value)
236
+ if (row.key === key)
309
237
  break;
310
238
  }
311
239
  }
312
- datarow[column.key] = sum;
240
+ sumrow[column.key] = sum;
313
241
  });
314
242
  }
315
243
  });
244
+ let grand = 0;
245
+ this.rows.forEach(r => {
246
+ const datarow = data[r.key];
247
+ if (datarow) {
248
+ let columnTotal = 0;
249
+ this.columns.forEach(c => {
250
+ if (c.accumulate === false || c.sum !== undefined)
251
+ return;
252
+ const val = datarow[c.key];
253
+ if (val !== undefined)
254
+ columnTotal += this.indices.length === 0 || this.indexAt !== 'XAxis' ||
255
+ c.index !== undefined ? val : -val;
256
+ });
257
+ datarow['_total'] = this._format(columnTotal, r);
258
+ if (!r.sum)
259
+ grand += this.indices.length === 0 ||
260
+ this.indexAt === 'XAxis' ||
261
+ r.index !== undefined ? columnTotal : -columnTotal;
262
+ }
263
+ else
264
+ data[r.key] = {
265
+ '_total': '0'
266
+ };
267
+ });
268
+ this.totals = {};
269
+ this.columns.forEach(c => {
270
+ let rowTotal = 0;
271
+ this.rows.forEach(row => {
272
+ if (row.accumulate === false || row.sum !== undefined)
273
+ return;
274
+ const val = data[row.key][c.key];
275
+ if (val !== undefined)
276
+ rowTotal += this.indices.length === 0 || this.indexAt === 'XAxis' ||
277
+ row.index !== undefined ? val : -val;
278
+ });
279
+ this.totals[c.key] = this._format(rowTotal, c);
280
+ });
281
+ this.totals['_grand'] = this._format(grand);
316
282
  }
317
283
  _stringify(data) {
318
284
  this.columns.forEach(c => {
285
+ const series = c.key;
319
286
  this.rows.forEach(r => {
320
- const xAxis = r.key, series = c.key;
321
- if (c.sum)
322
- data[xAxis][series] = this._format(data[xAxis][series], c.sum);
323
- else if (r.sum)
324
- data[xAxis][series] = this._format(data[xAxis][series], r.sum);
325
- else
326
- data[xAxis][series] =
327
- formatNumber(data[xAxis][series] || 0, this.LANGUAGE, this.PRECISION);
287
+ const xAxis = r.key, value = data[xAxis][series];
288
+ data[xAxis][series] =
289
+ (c.sum ? this._format(value, c.sum) :
290
+ r.sum ? this._format(value, r.sum) :
291
+ this._format(value));
328
292
  });
329
293
  });
330
294
  }
331
295
  _format(val, options) {
332
- if (val === 0)
296
+ if (val === 0 || val === undefined)
333
297
  return '0';
334
298
  if (options) {
335
299
  if (options.format === 'Percent')
@@ -388,28 +352,29 @@ export class CubeMatrixComponent {
388
352
  }
389
353
  this.onExplore.emit({ axes, index });
390
354
  }
355
+ /** */
391
356
  export() {
392
- const numberFormat = this._service.numberFormat, columns = this.columns.filter(c => !c.sum), cells = [], rows = [{ index: 1, cells }];
393
- columns.forEach((c, j) => cells.push({
394
- index: j + 2,
395
- value: c.value, style: { bold: true }
396
- }));
397
- this.rows.filter(r => !r.sum).forEach((r, i) => {
398
- const data = this._data[r.key], cells = [{ index: 1, value: r.value, style: { bold: true } }];
399
- columns.forEach((c, j) => cells.push({
400
- type: 'number',
401
- index: j + 2,
402
- value: data && data[c.key] !== undefined ? data[c.key] : 0,
403
- style: {
404
- numberFormat,
405
- hAlign: 'right',
406
- }
407
- }));
408
- rows.push({
409
- index: i + 2,
410
- cells
411
- });
412
- });
357
+ const numberFormat = this._service.numberFormat, columns = this.columns.filter(c => !c.sum), rows = [{
358
+ index: 1, cells: columns.map((c, j) => ({
359
+ index: j + 2,
360
+ value: c.value, style: { bold: true }
361
+ }))
362
+ }, ...this.rows.filter(r => !r.sum).map((r, i) => {
363
+ const data = this._rawdata[r.key];
364
+ return {
365
+ index: i + 2,
366
+ cells: [{ index: 1, value: r.value, style: { bold: true } },
367
+ ...columns.map((c, j) => ({
368
+ type: 'number',
369
+ index: j + 2,
370
+ value: data && data[c.key] !== undefined ? data[c.key] : 0,
371
+ style: {
372
+ numberFormat,
373
+ hAlign: 'right',
374
+ }
375
+ }))]
376
+ };
377
+ })];
413
378
  const book = new Workbook({
414
379
  worksheets: [
415
380
  {
@@ -417,11 +382,16 @@ export class CubeMatrixComponent {
417
382
  name: this._translate.get('SheetN', 1),
418
383
  columns: columns.map((_, i) => ({ index: i + 1, width: 150 })),
419
384
  rows,
420
- },
421
- ],
385
+ }
386
+ ]
422
387
  }, 'xlsx');
423
388
  this._service.nameOf(this.filters, this.cube.name).subscribe(n => book.save(`${n || this._translate.get('Matrix')}.xlsx`));
424
389
  }
390
+ /**
391
+ *
392
+ * @param x
393
+ * @param y
394
+ */
425
395
  _move(x, y) {
426
396
  let rowIndex = 0;
427
397
  for (let b = 0; b < this.tableElement.nativeElement.tBodies.length; b++) {
@@ -451,10 +421,10 @@ export class CubeMatrixComponent {
451
421
  }
452
422
  }
453
423
  }
454
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: CubeMatrixComponent, deps: [{ token: i1.PromptService }, { token: i2.CubeService }, { token: i3.SessionService }, { token: i4.TranslateService }, { token: i5.DatasourceService }], target: i0.ɵɵFactoryTarget.Component }); }
455
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.3", type: CubeMatrixComponent, selector: "bizdoc-cube-matrix", inputs: { seriesTotalLabel: "seriesTotalLabel", xAxisTotalLabel: "xAxisTotalLabel", _cube: ["cube", "_cube"], _xAxis: ["xAxis", "_xAxis"], _series: ["series", "_series"], _indices: ["indices", "_indices"], indexAt: "indexAt", placeAt: "placeAt", scope: "scope", sum: "sum", filters: "filters", loading: "loading", interactive: "interactive" }, outputs: { onExplore: "explore", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "tableElement", first: true, predicate: ["table"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (data) {\n <table #table class=\"mat-mdc-table cube-table\" (mouseleave)=\"_move(-1, -1)\">\n <thead>\n <!-- headers -->\n <tr class=\"mat-mdc-header-row\">\n <th></th>\n @for (column of columns; track column; let x = $index) {\n <th\n (mouseenter)=\"_move(x + 1, -2)\" class=\"mat-mdc-header-cell\">\n {{ column.value }}\n </th>\n }\n <th class=\"mat-mdc-header-cell\">{{xAxisTotalLabel}}</th>\n </tr>\n </thead>\n <tbody>\n <!-- rows -->\n @for (row of rows; track row; let y = $index) {\n <tr class=\"mat-mdc-row\"\n [class.cube-index]=\"row.index\">\n <th class=\"mat-mdc-header-cell\" (mouseenter)=\"_move(-2, y )\">{{ row.value }}</th>\n @for (column of columns; track column; let x = $index) {\n <td class=\"mat-mdc-cell figure\"\n (mouseenter)=\"_move(x + 1, y )\">\n @if (data[row.key][column.key] !== '0') {\n <span\n [class.explorable]=\"interactive && column.explorable !== false && row.explorable !== false\"\n (click)=\"explore(column, row)\">\n {{ data[row.key][column.key] }}\n </span>\n } @else {\n 0\n }\n </td>\n }\n <th class=\"mat-mdc-cell figure\" (mouseenter)=\"_move(-1, y )\">\n {{ data[row.key]['_total'] }}\n </th>\n </tr>\n }\n </tbody>\n <tfoot>\n <!-- footer -->\n <tr class=\"mat-mdc-footer-row\">\n <td class=\"mat-mdc-footer-cell\">{{seriesTotalLabel}}</td>\n @for (column of columns; track column; let x = $index) {\n <td class=\"mat-mdc-footer-cell figure\"\n (mouseenter)=\"_move(x + 1, -2)\"\n [class.negative-figure]=\"totals[column.key].startsWith('-')\">\n @if (totals[column.key] !== undefined) {\n {{ totals[column.key] }}\n }\n </td>\n }\n <th class=\"mat-mdc-footer-cell figure\">{{ totals['_grand'] }}</th>\n </tr>\n </tfoot>\n </table>\n}\n", styles: [".explorable{cursor:pointer}.cube-table{width:100%;table-layout:fixed}.cube-table th{cursor:default}.cube-table th.figure{font-weight:500}.cube-table td,.cube-table th{padding-right:8px}.cube-table tfoot tr td{border-bottom:none}\n"], animations: [matrixAnimation] }); }
424
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: CubeMatrixComponent, deps: [{ token: i1.PromptService }, { token: i2.CubeService }, { token: i3.SessionService }, { token: i4.TranslateService }, { token: i5.DatasourceService }], target: i0.ɵɵFactoryTarget.Component }); }
425
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.2.1", type: CubeMatrixComponent, selector: "bizdoc-cube-matrix", inputs: { seriesTotalLabel: "seriesTotalLabel", xAxisTotalLabel: "xAxisTotalLabel", _cube: ["cube", "_cube"], _xAxis: ["xAxis", "_xAxis"], _series: ["series", "_series"], _indices: ["indices", "_indices"], indexAt: "indexAt", placeAt: "placeAt", scope: "scope", sum: "sum", filters: "filters", loading: "loading", interactive: "interactive" }, outputs: { onExplore: "explore", loadingChange: "loadingChange" }, viewQueries: [{ propertyName: "tableElement", first: true, predicate: ["table"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (data) {\n <table #table class=\"mat-mdc-table cube-table\" (mouseleave)=\"_move(-1, -1)\">\n <thead>\n <!-- headers -->\n <tr class=\"mat-mdc-header-row\">\n <th></th>\n @for (column of columns; track column; let x = $index) {\n <th\n (mouseenter)=\"_move(x + 1, -2)\" class=\"mat-mdc-header-cell\">\n {{ column.value }}\n </th>\n }\n <th class=\"mat-mdc-header-cell\">{{xAxisTotalLabel}}</th>\n </tr>\n </thead>\n <tbody>\n <!-- rows -->\n @for (row of rows; track row; let y = $index) {\n <tr class=\"mat-mdc-row\"\n [class.cube-index]=\"row.index\">\n <th class=\"mat-mdc-header-cell\" (mouseenter)=\"_move(-2, y )\">{{ row.value }}</th>\n @for (column of columns; track column; let x = $index) {\n <td class=\"mat-mdc-cell figure\"\n (mouseenter)=\"_move(x + 1, y )\">\n @if (data[row.key][column.key] !== '0') {\n <span\n [class.explorable]=\"interactive && column.explorable !== false && row.explorable !== false\"\n (click)=\"explore(column, row)\">\n {{ data[row.key][column.key] }}\n </span>\n } @else {\n 0\n }\n </td>\n }\n <th class=\"mat-mdc-cell figure\" (mouseenter)=\"_move(-1, y )\">\n {{ data[row.key]['_total'] }}\n </th>\n </tr>\n }\n </tbody>\n <tfoot>\n <!-- footer -->\n <tr class=\"mat-mdc-footer-row\">\n <td class=\"mat-mdc-footer-cell\">{{seriesTotalLabel}}</td>\n @for (column of columns; track column; let x = $index) {\n <td class=\"mat-mdc-footer-cell figure\"\n (mouseenter)=\"_move(x + 1, -2)\"\n [class.negative-figure]=\"totals[column.key].startsWith('-')\">\n @if (totals[column.key] !== undefined) {\n {{ totals[column.key] }}\n }\n </td>\n }\n <th class=\"mat-mdc-footer-cell figure\">{{ totals['_grand'] }}</th>\n </tr>\n </tfoot>\n </table>\n}\n", styles: [".explorable{cursor:pointer}.cube-table{width:100%;table-layout:fixed}.cube-table th{cursor:default}.cube-table th.figure{font-weight:500}.cube-table td,.cube-table th{padding-right:8px}.cube-table tfoot tr td{border-bottom:none}\n"], animations: [matrixAnimation] }); }
456
426
  }
457
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: CubeMatrixComponent, decorators: [{
427
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: CubeMatrixComponent, decorators: [{
458
428
  type: Component,
459
429
  args: [{ selector: 'bizdoc-cube-matrix', animations: [matrixAnimation], template: "@if (data) {\n <table #table class=\"mat-mdc-table cube-table\" (mouseleave)=\"_move(-1, -1)\">\n <thead>\n <!-- headers -->\n <tr class=\"mat-mdc-header-row\">\n <th></th>\n @for (column of columns; track column; let x = $index) {\n <th\n (mouseenter)=\"_move(x + 1, -2)\" class=\"mat-mdc-header-cell\">\n {{ column.value }}\n </th>\n }\n <th class=\"mat-mdc-header-cell\">{{xAxisTotalLabel}}</th>\n </tr>\n </thead>\n <tbody>\n <!-- rows -->\n @for (row of rows; track row; let y = $index) {\n <tr class=\"mat-mdc-row\"\n [class.cube-index]=\"row.index\">\n <th class=\"mat-mdc-header-cell\" (mouseenter)=\"_move(-2, y )\">{{ row.value }}</th>\n @for (column of columns; track column; let x = $index) {\n <td class=\"mat-mdc-cell figure\"\n (mouseenter)=\"_move(x + 1, y )\">\n @if (data[row.key][column.key] !== '0') {\n <span\n [class.explorable]=\"interactive && column.explorable !== false && row.explorable !== false\"\n (click)=\"explore(column, row)\">\n {{ data[row.key][column.key] }}\n </span>\n } @else {\n 0\n }\n </td>\n }\n <th class=\"mat-mdc-cell figure\" (mouseenter)=\"_move(-1, y )\">\n {{ data[row.key]['_total'] }}\n </th>\n </tr>\n }\n </tbody>\n <tfoot>\n <!-- footer -->\n <tr class=\"mat-mdc-footer-row\">\n <td class=\"mat-mdc-footer-cell\">{{seriesTotalLabel}}</td>\n @for (column of columns; track column; let x = $index) {\n <td class=\"mat-mdc-footer-cell figure\"\n (mouseenter)=\"_move(x + 1, -2)\"\n [class.negative-figure]=\"totals[column.key].startsWith('-')\">\n @if (totals[column.key] !== undefined) {\n {{ totals[column.key] }}\n }\n </td>\n }\n <th class=\"mat-mdc-footer-cell figure\">{{ totals['_grand'] }}</th>\n </tr>\n </tfoot>\n </table>\n}\n", styles: [".explorable{cursor:pointer}.cube-table{width:100%;table-layout:fixed}.cube-table th{cursor:default}.cube-table th.figure{font-weight:500}.cube-table td,.cube-table th{padding-right:8px}.cube-table tfoot tr td{border-bottom:none}\n"] }]
460
430
  }], ctorParameters: () => [{ type: i1.PromptService }, { type: i2.CubeService }, { type: i3.SessionService }, { type: i4.TranslateService }, { type: i5.DatasourceService }], propDecorators: { tableElement: [{
@@ -496,4 +466,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImpor
496
466
  }], loadingChange: [{
497
467
  type: Output
498
468
  }] } });
499
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9jdWJlL21hdHJpeC90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2N1YmUvbWF0cml4L3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLFFBQVEsRUFBMEIsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBZSxXQUFXLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQU1uRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7QUFLeEQsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFLFVBQVUsR0FBRyxNQUFNLENBQUM7QUFFL0MsMkJBQTJCO0FBTzNCLE1BQU0sT0FBTyxtQkFBbUI7SUFtQjlCLElBQWEsR0FBRyxDQUFDLEdBQWdDO1FBQy9DLElBQUksR0FBRztZQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FB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U0FBUztnQkFDRSxhQUFhO3NCQUEvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZvcm1hdEN1cnJlbmN5LCBmb3JtYXRQZXJjZW50LCBmb3JtYXROdW1iZXIsIGdldEN1cnJlbmN5U3ltYm9sIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tLCBmb3JrSm9pbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFdvcmtib29rLCBXb3Jrc2hlZXQsIFJvdywgQ29sdW1uIH0gZnJvbSAnQHN5bmNmdXNpb24vZWoyLWV4Y2VsLWV4cG9ydCc7XHJcbmltcG9ydCB7IGlzQXJyYXksIGlzRnVuY3Rpb24gfSBmcm9tICcuLi8uLi9jb3JlL2Z1bmN0aW9ucyc7XHJcbmltcG9ydCB7IEN1YmVTZXJ2aWNlLCBlcnJSZXNvdXJjZSwgU2VyaWVzIH0gZnJvbSAnLi4vY3ViZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Vzc2lvblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3Nlc3Npb24uc2VydmljZSc7XHJcbmltcG9ydCB7IERhdGFzb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9kYXRhc291cmNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQcm9tcHRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9wcm9tcHQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3RyYW5zbGF0ZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQXhlc01hcCwgQXhpc1ZhbHVlLCBDdWJlLCBDdWJlQXhpcywgQ3ViZUluZGV4IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBtYXRyaXhBbmltYXRpb24gfSBmcm9tICcuLi8uLi9jb3JlL2FuaW1hdGlvbnMnO1xyXG5pbXBvcnQgeyBTY29wZVR5cGUgfSBmcm9tICcuLi8uLi9jb3JlL2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBBeGlzQ2xpY2tFdmVudCB9IGZyb20gJy4uL2RlY2xhcmF0aW9ucyc7XHJcbmltcG9ydCB7IEF4aXNQbGFjZSwgQXhpc1R5cGUgfSBmcm9tICcuLi9kZWNsYXJhdGlvbnMnO1xyXG5cclxuY29uc3QgTE9BRElOR19ERUxBWSA9IDIwMCwgU1VNX1BSRUZJWCA9ICdfc3VtJztcclxuXHJcbi8qKiBjdWJlIG1hdHJpeCBjb21wb25lbnQqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2JpemRvYy1jdWJlLW1hdHJpeCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3RhYmxlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90YWJsZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFttYXRyaXhBbmltYXRpb25dXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDdWJlTWF0cml4Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcclxuICByZWFkb25seSBQUkVDSVNJT04gPSB0aGlzLl9zZXJ2aWNlLmRpZ2l0c0luZm87XHJcbiAgcmVhZG9ubHkgTEFOR1VBR0UgPSB0aGlzLl9zZXNzaW9uLmxhbmd1YWdlO1xyXG4gIENVUlJFTkNZOiBzdHJpbmc7XHJcbiAgU1lNQk9MOiBzdHJpbmc7XHJcbiAgQFZpZXdDaGlsZCgndGFibGUnKSB0YWJsZUVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTFRhYmxlRWxlbWVudD47XHJcbiAgQElucHV0KCkgc2VyaWVzVG90YWxMYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHhBeGlzVG90YWxMYWJlbDogc3RyaW5nO1xyXG4gIEBJbnB1dCgnY3ViZScpIF9jdWJlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgneEF4aXMnKSBfeEF4aXMhOiBzdHJpbmc7XHJcbiAgQElucHV0KCdzZXJpZXMnKSBfc2VyaWVzITogc3RyaW5nO1xyXG4gIEBJbnB1dCgnaW5kaWNlcycpXHJcbiAgX2luZGljZXM/OiBzdHJpbmdbXSB8IHN0cmluZztcclxuICBASW5wdXQoKVxyXG4gIGluZGV4QXQ6IEF4aXNUeXBlID0gJ1Nlcmllcyc7XHJcbiAgQElucHV0KClcclxuICBwbGFjZUF0OiBBeGlzUGxhY2UgPSAnTGVhZGluZyc7XHJcbiAgQElucHV0KCkgc2NvcGU6IFNjb3BlVHlwZTtcclxuICBwcml2YXRlIF9zdW06IFN1bVNldHRpbmdzW107XHJcbiAgQElucHV0KCkgc2V0IHN1bSh2YWw6IFN1bVNldHRpbmdzIHwgU3VtU2V0dGluZ3NbXSkge1xyXG4gICAgaWYgKHZhbCkgdGhpcy5fc3VtID0gKGlzQXJyYXkodmFsKSA/IHZhbCA6IFt2YWxdKS5cclxuICAgICAgbWFwKHN1bSA9PiB7XHJcbiAgICAgICAgbGV0IHZhbHVlO1xyXG4gICAgICAgIGlmIChzdW0udmFsdWUpXHJcbiAgICAgICAgICB2YWx1ZSA9IHN1bS52YWx1ZS50b1N0cmluZygpO1xyXG4gICAgICAgIGVsc2UgaWYgKHN1bS5jYWxjdWxhdGUpXHJcbiAgICAgICAgICBzd2l0Y2ggKHN1bS5jYWxjdWxhdGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnTW9udGgnOlxyXG4gICAgICAgICAgICAgIHZhbHVlID0gJ00nICsgKCcwJyArIChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxKS50b1N0cmluZygpKS5zbGljZSgtMik7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ1llYXInOlxyXG4gICAgICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ1F1YXJ0ZXInOlxyXG4gICAgICAgICAgICAgIHZhbHVlID0gTWF0aC5jZWlsKChuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxKSAvIDMpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgJ1N1bSc6XHJcbiAgICAgICAgICAgICAgdmFsdWUgPSAnfic7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLnN1bSxcclxuICAgICAgICAgIHZhbHVlXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGZpbHRlcnM6IEF4ZXNNYXA7XHJcbiAgcHJpdmF0ZSBfaW50ZXJhY3RpdmUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGxvYWRpbmc6IGJvb2xlYW47XHJcbiAgcHVibGljIGdldCBpbnRlcmFjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGl2ZTtcclxuICB9XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGludGVyYWN0aXZlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pbnRlcmFjdGl2ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG4gIEBPdXRwdXQoJ2V4cGxvcmUnKSByZWFkb25seSBvbkV4cGxvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPEF4aXNDbGlja0V2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBsb2FkaW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIHJvd3M6IEhlYWRlckluZm9bXTtcclxuICBjb2x1bW5zOiBIZWFkZXJJbmZvW107XHJcbiAgaW5kaWNlczogQ3ViZUluZGV4W10gPSBbXTtcclxuICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9OyB9O1xyXG4gIHRvdGFsczogeyBbeEF4aXM6IHN0cmluZ106IHN0cmluZyB9O1xyXG4gIGN1YmU6IEN1YmU7XHJcbiAgeEF4aXM6IEN1YmVBeGlzO1xyXG4gIHNlcmllczogQ3ViZUF4aXM7XHJcbiAgcHJpdmF0ZSBfZGF0YTogRGF0YU1hcDtcclxuICBwcml2YXRlIF9wcmVwYXJlOiBQcm9taXNlPGFueT47XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zYjogUHJvbXB0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IEN1YmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kczogRGF0YXNvdXJjZVNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydfY3ViZSddKSB7XHJcbiAgICAgIHRoaXMuY3ViZSA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5jdWJlcy5maW5kKGMgPT4gYy5uYW1lID09PSB0aGlzLl9jdWJlKTtcclxuICAgICAgdGhpcy5DVVJSRU5DWSA9IHRoaXMuY3ViZS5jdXJyZW5jeUNvZGUgLyp8fCB0aGlzLl9zZXJ2aWNlLmN1cnJlbmN5Q29kZSovO1xyXG4gICAgICB0aGlzLlNZTUJPTCA9IGdldEN1cnJlbmN5U3ltYm9sKHRoaXMuQ1VSUkVOQ1ksICduYXJyb3cnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5jdWJlKSB7XHJcbiAgICAgIHRoaXMuY3ViZSA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5jdWJlc1swXTtcclxuICAgICAgdGhpcy5DVVJSRU5DWSA9IHRoaXMuY3ViZS5jdXJyZW5jeUNvZGUgLyp8fCB0aGlzLl9zZXJ2aWNlLmN1cnJlbmN5Q29kZSovO1xyXG4gICAgICB0aGlzLlNZTUJPTCA9IGdldEN1cnJlbmN5U3ltYm9sKHRoaXMuQ1VSUkVOQ1ksICduYXJyb3cnKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydfaW5kaWNlcyddICYmIHRoaXMuX2luZGljZXMpIHtcclxuICAgICAgaWYgKCF0aGlzLmN1YmUuaW5kaWNlcykgdGhyb3cgYGN1YmUgJHt0aGlzLmN1YmUubmFtZX0gZXhwZWN0cyBvbmUgb3IgbW9yZSBpbmRpY2VzLmA7XHJcbiAgICAgIHRoaXMuaW5kaWNlcyA9IHRoaXMuY3ViZS5pbmRpY2VzLmZpbHRlcihpID0+IGlzQXJyYXkodGhpcy5faW5kaWNlcykgPyB0aGlzLl9pbmRpY2VzLmluZGV4T2YoaS5uYW1lKSA+IC0xIDogdGhpcy5faW5kaWNlcyA9PT0gaS5uYW1lKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydfeEF4aXMnXSB8fCBjaGFuZ2VzWydfc2VyaWVzJ10pIHtcclxuICAgICAgdGhpcy54QXhpcyA9IHRoaXMuY3ViZS5heGVzLmZpbmQoYSA9PiBhLm5hbWUgPT09IHRoaXMuX3hBeGlzKTtcclxuICAgICAgdGhpcy5zZXJpZXMgPSB0aGlzLmN1YmUuYXhlcy5maW5kKGEgPT4gYS5uYW1lID09PSB0aGlzLl9zZXJpZXMpO1xyXG4gICAgICB0aGlzLmRhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLl9wcmVwYXJlID0gZmlyc3RWYWx1ZUZyb20oIGZvcmtKb2luKFt0aGlzLl9kcy5hbGwodGhpcy5zZXJpZXMuZGF0YVR5cGUpLnBpcGUodGFwKHIgPT5cclxuICAgICAgICB0aGlzLnJvd3MgPSByXHJcbiAgICAgICkpLFxyXG4gICAgICAgIHRoaXMuX2RzLmFsbCh0aGlzLnhBeGlzLmRhdGFUeXBlKS5waXBlKHRhcChjID0+XHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBjXHJcbiAgICAgICAgKSkucGlwZSh0YXAoXHJcbiAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2luZGljZXMgJiYgdGhpcy5fYWRkaW5kaWNlcygpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdW0gJiYgdGhpcy5fYWRkc3VtaGVhZGVycygpO1xyXG4gICAgICAgICAgfSkpXSkpO1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNoYW5nZXNbJ2ZpbHRlcnMnXSlcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2FkZGluZGljZXMoKSB7XHJcbiAgICBjb25zdCBjb2xsZWN0aW9uID0gdGhpcy5pbmRleEF0ID09PSAnWEF4aXMnID8gdGhpcy5jb2x1bW5zIDogdGhpcy5yb3dzO1xyXG4gICAgdGhpcy5pbmRpY2VzLmZvckVhY2goKHgsIGkpID0+IHtcclxuICAgICAgY29uc3QgaGVhZGVyID0ge1xyXG4gICAgICAgIGtleTogeC5uYW1lLFxyXG4gICAgICAgIHZhbHVlOiB4LnRpdGxlLFxyXG4gICAgICAgIGluZGV4OiB4LFxyXG4gICAgICAgIGFjY3VtdWxhdGU6IHguYWNjdW11bGF0ZVxyXG4gICAgICB9IGFzIEhlYWRlckluZm87XHJcbiAgICAgIGlmICh0aGlzLnBsYWNlQXQgPT09ICdUcmFpbGluZycpXHJcbiAgICAgICAgY29sbGVjdGlvbi5wdXNoKGhlYWRlcik7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShpLCAwLCBoZWFkZXIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2FkZHN1bWhlYWRlcnMoKSB7XHJcbiAgICB0aGlzLl9zdW0uZm9yRWFjaCgocywgaSkgPT4ge1xyXG4gICAgICBjb25zdCB7IHZhbHVlLCBheGlzIH0gPSBzO1xyXG4gICAgICBjb25zdCBoZWFkZXIgPSB7XHJcbiAgICAgICAga2V5OiBTVU1fUFJFRklYICsgaSxcclxuICAgICAgICB2YWx1ZTogcy50aXRsZSxcclxuICAgICAgICBhY2N1bXVsYXRlOiAhaXNGdW5jdGlvbihzLmNhbGN1bGF0ZSkgJiYgcy5jYWxjdWxhdGUgIT09ICdTdW0nLFxyXG4gICAgICAgIGV4cGxvcmFibGU6ICFpc0Z1bmN0aW9uKHMuY2FsY3VsYXRlKSAmJiBzLmV4cGxvcmFibGUgIT09IGZhbHNlLFxyXG4gICAgICAgIHByZWNpc2lvbjogcy5wcmVjaXNpb24sXHJcbiAgICAgICAgc3VtOiBzXHJcbiAgICAgIH0gYXMgSGVhZGVySW5mbztcclxuICAgICAgbGV0IGogPSAwO1xyXG4gICAgICBpZiAoYXhpcyA9PT0gJ1hBeGlzJykge1xyXG4gICAgICAgIHdoaWxlIChqIDwgdGhpcy5jb2x1bW5zLmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29sdW1uc1tqXS5rZXkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29sdW1ucy5zcGxpY2UoaiArIDEsIDAsIGhlYWRlcik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaisrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaiA9PT0gdGhpcy5jb2x1bW5zLmxlbmd0aClcclxuICAgICAgICAgIHRoaXMuY29sdW1ucy5wdXNoKGhlYWRlcik7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgd2hpbGUgKGogPCB0aGlzLnJvd3MubGVuZ3RoKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5yb3dzW2pdLmtleSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5yb3dzLnNwbGljZShqICsgMSwgMCwgaGVhZGVyKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBqKys7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChqID09PSB0aGlzLnJvd3MubGVuZ3RoKVxyXG4gICAgICAgICAgdGhpcy5yb3dzLnB1c2goaGVhZGVyKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICByZWZyZXNoKCkge1xyXG4gICAgY29uc3QgcHJvZ3Jlc3NUYXNrID0gc2V0VGltZW91dCgoKSA9PlxyXG4gICAgICB0aGlzLmxvYWRpbmdDaGFuZ2UubmV4dCh0aGlzLmxvYWRpbmcgPSB0cnVlKVxyXG4gICAgICAsIExPQURJTkdfREVMQVkpO1xyXG4gICAgdGhpcy5fcHJlcGFyZS50aGVuKCgpID0+XHJcbiAgICAgIHRoaXMuX3NlcnZpY2Uuc2VyaWVzKHRoaXMuY3ViZS5uYW1lLCB0aGlzLl94QXhpcywge1xyXG4gICAgICAgIHNlcmllczogdGhpcy5fc2VyaWVzLFxyXG4gICAgICAgIGluZGljZXM6IHRoaXMuX2luZGljZXMsXHJcbiAgICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxyXG4gICAgICAgIGludmVyc2VJbmRpY2VzOiB0aGlzLmluZGV4QXQgPT09ICdYQXhpcycsXHJcbiAgICAgICAgc2NvcGU6IHRoaXMuc2NvcGVcclxuICAgICAgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiByID0+IHtcclxuICAgICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9zZXJpYWxpemUocik7XHJcbiAgICAgICAgICB0aGlzLl9jbG9uZShkYXRhKTtcclxuICAgICAgICAgIHRoaXMuX3N1bSAmJiB0aGlzLl9jYWxjdWxhdGVzdW0oZGF0YSk7XHJcbiAgICAgICAgICB0aGlzLl90b3RhbHMoZGF0YSk7XHJcbiAgICAgICAgICB0aGlzLl9zdHJpbmdpZnkoZGF0YSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhIGFzIGFueTtcclxuICAgICAgICAgIGNsZWFyVGltZW91dChwcm9ncmVzc1Rhc2spO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nQ2hhbmdlLm5leHQodGhpcy5sb2FkaW5nID0gZmFsc2UpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZXJyb3I6KGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgdGhpcy5fc2IuZXJyb3IoZXJyUmVzb3VyY2UoZSkpO1xyXG4gICAgICAgIGNsZWFyVGltZW91dChwcm9ncmVzc1Rhc2spO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nQ2hhbmdlLm5leHQodGhpcy5sb2FkaW5nID0gZmFsc2UpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ0NoYW5nZS5lcnJvcihlKTtcclxuICAgICAgfX0pXHJcbiAgICApO1xyXG4gIH1cclxuICBwcml2YXRlIF9zZXJpYWxpemUoc2VyaWVzOiBTZXJpZXNbXSkge1xyXG4gICAgY29uc3QgZCA9IHt9IGFzIHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBudW1iZXI7IH07IH07XHJcbiAgICBzZXJpZXMuZm9yRWFjaChzID0+IHtcclxuICAgICAgaWYgKHMuaW5kZXgpIHtcclxuICAgICAgICBpZiAodGhpcy5pbmRleEF0ID09PSAnWEF4aXMnKVxyXG4gICAgICAgICAgcy5wb2ludHMuZm9yRWFjaChwID0+IHtcclxuICAgICAgICAgICAgbGV0IHJvdyA9IGRbcC54XTtcclxuICAgICAgICAgICAgaWYgKCFyb3cpXHJcbiAgICAgICAgICAgICAgcm93ID0gZFtwLnhdID0ge307XHJcbiAgICAgICAgICAgIHJvd1tzLmluZGV4XSA9IHAueTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uc3Qgcm93ID0gZFtzLmluZGV4XSA9IHt9O1xyXG4gICAgICAgICAgcy5wb2ludHMuZm9yRWFjaChwID0+IHJvd1twLnhdID0gcC55KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IGRbcy5uYW1lXSA9IHt9O1xyXG4gICAgICAgIHMucG9pbnRzLmZvckVhY2gocCA9PiByb3dbcC54XSA9IHAueSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jbG9uZShkYXRhKSB7XHJcbiAgICB0aGlzLl9kYXRhID0ge307XHJcbiAgICB0aGlzLnJvd3MuZm9yRWFjaChyID0+IHtcclxuICAgICAgY29uc3Qga2V5ID0gci5rZXk7XHJcbiAgICAgIGlmICghZGF0YVtrZXldKSBkYXRhW2tleV0gPSB7fTtcclxuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9kYXRhW2tleV0gPSB7fSwgZGF0YVtrZXldKTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBwcml2YXRlIF90b3RhbHMoZGF0YTogRGF0YU1hcCkge1xyXG4gICAgbGV0IGdyYW5kID0gMDtcclxuICAgIHRoaXMucm93cy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhcm93ID0gZGF0YVtyLmtleV07XHJcbiAgICAgIGlmIChkYXRhcm93KSB7XHJcbiAgICAgICAgbGV0IGNvbHVtblRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgIGlmIChjLmFjY3VtdWxhdGUgPT09IGZhbHNlIHx8IGMuc3VtICE9PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgICAgICAgIGNvbnN0IHZhbCA9IGRhdGFyb3dbYy5rZXldO1xyXG4gICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICBjb2x1bW5Ub3RhbCArPSB0aGlzLmluZGljZXMubGVuZ3RoID09PSAwIHx8IHRoaXMuaW5kZXhBdCAhPT0gJ1hBeGlzJyB8fFxyXG4gICAgICAgICAgICAgIGMuaW5kZXggIT09IHVuZGVmaW5lZCA/IHZhbCA6IC12YWw7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZGF0YXJvd1snX3RvdGFsJ10gPSB0aGlzLl9mb3JtYXQoY29sdW1uVG90YWwsIHIpIGFzIGFueTtcclxuICAgICAgICBpZiAoIXIuc3VtKVxyXG4gICAgICAgICAgZ3JhbmQgKz0gdGhpcy5pbmRpY2VzLmxlbmd0aCA9PT0gMCB8fFxyXG4gICAgICAgICAgICB0aGlzLmluZGV4QXQgPT09ICdYQXhpcycgfHxcclxuICAgICAgICAgICAgci5pbmRleCAhPT0gdW5kZWZpbmVkID8gY29sdW1uVG90YWwgOiAtY29sdW1uVG90YWw7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIGRhdGFbci5rZXldID0ge1xyXG4gICAgICAgICAgJ190b3RhbCc6ICcwJyBhcyBhbnlcclxuICAgICAgICB9O1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCB0b3RhbHMgPSBkYXRhWydfdG90YWwnXSA9IHRoaXMudG90YWxzID0ge307XHJcbiAgICB0b3RhbHNbJ19ncmFuZCddID0gdGhpcy5fZm9ybWF0KGdyYW5kKTtcclxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICBsZXQgcm93VG90YWwgPSAwO1xyXG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaChyb3cgPT4ge1xyXG4gICAgICAgIGlmIChyb3cuYWNjdW11bGF0ZSA9PT0gZmFsc2UgfHwgcm93LnN1bSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgdmFsID0gZGF0YVtyb3cua2V5XVtjLmtleV07XHJcbiAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgcm93VG90YWwgKz0gdGhpcy5pbmRpY2VzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmluZGV4QXQgPT09ICdYQXhpcycgfHxcclxuICAgICAgICAgICAgcm93LmluZGV4ICE9PSB1bmRlZmluZWQgPyB2YWwgOiAtdmFsO1xyXG4gICAgICB9KTtcclxuICAgICAgdG90YWxzW2Mua2V5XSA9IHRoaXMuX2Zvcm1hdChyb3dUb3RhbCwgYyk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY2FsY3VsYXRlc3VtKGRhdGE6IERhdGFNYXApIHtcclxuICAgIHRoaXMuX3N1bS5mb3JFYWNoKChzLCBpKSA9PiB7XHJcbiAgICAgIGNvbnN0IHsgYXhpcywgdmFsdWUsIGNhbGN1bGF0ZSB9ID0gcztcclxuICAgICAgY29uc3QgbmFtZSA9IFNVTV9QUkVGSVggKyBpO1xyXG4gICAgICBpZiAoYXhpcyA9PT0gJ1hBeGlzJykge1xyXG4gICAgICAgIHRoaXMucm93cy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgICAgaWYgKHIuYWNjdW11bGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgICAgICAgIGNvbnN0IGRhdGFyb3cgPSBkYXRhW3Iua2V5XTtcclxuICAgICAgICAgIGlmICghZGF0YXJvdylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgbGV0IHN1bSA9IDA7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgICAgICAgaWYgKGNvbHVtbi5pbmRleCkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGNvbHVtbi5rZXk7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4uc3VtKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsY3VsYXRlKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjYWxjdWxhdGUgYXMgQ2FsY3VsYXRlRm4pKHIua2V5LCB0aGlzLl9kYXRhKTtcclxuICAgICAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQgJiYgdmFsICE9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgc3VtICs9IHZhbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCB2YWwgPSBkYXRhcm93W2tleV07XHJcbiAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgc3VtICs9IHZhbDtcclxuICAgICAgICAgICAgICBpZiAoa2V5ID09PSB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhcm93W25hbWVdID0gc3VtO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGRhdGFyb3cgPSBkYXRhW25hbWVdID0ge307XHJcbiAgICAgICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgICAgIGxldCBzdW0gPSAwO1xyXG4gICAgICAgICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yb3dzKSB7XHJcbiAgICAgICAgICAgIGlmIChyb3cuaW5kZXgpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBrZXkgPSByb3cua2V5O1xyXG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxjdWxhdGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGNhbGN1bGF0ZSBhcyBDYWxjdWxhdGVGbikocm93LmtleSwgdGhpcy5fZGF0YSk7XHJcbiAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkICYmIHZhbCAhPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHN1bSArPSB2YWw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZGF0YXJvdyA9IGRhdGFba2V5XTtcclxuICAgICAgICAgICAgICBpZiAoIWRhdGFyb3cpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgIGlmIChjb2x1bW4uc3VtKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBkYXRhcm93W2NvbHVtbi5rZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPSB1bmRlZmluZWQpIHN1bSArPSB2YWw7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gZGF0YXJvd1tjb2x1bW4ua2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgICAgc3VtICs9IHZhbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGtleSA9PT0gdmFsdWUpXHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YXJvd1tjb2x1bW4ua2V5XSA9IHN1bTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3N0cmluZ2lmeShkYXRhOiBEYXRhTWFwKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuICAgICAgdGhpcy5yb3dzLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgY29uc3QgeEF4aXMgPSByLmtleSwgc2VyaWVzID0gYy5rZXk7XHJcbiAgICAgICAgaWYgKGMuc3VtKSBkYXRhW3hBeGlzXVtzZXJpZXNdID0gdGhpcy5fZm9ybWF0KGRhdGFbeEF4aXNdW3Nlcmllc10sIGMuc3VtKTtcclxuICAgICAgICBlbHNlIGlmIChyLnN1bSkgZGF0YVt4QXhpc11bc2VyaWVzXSA9IHRoaXMuX2Zvcm1hdChkYXRhW3hBeGlzXVtzZXJpZXNdLCByLnN1bSk7XHJcbiAgICAgICAgZWxzZSBkYXRhW3hBeGlzXVtzZXJpZXNdID1cclxuICAgICAgICAgIGZvcm1hdE51bWJlcihkYXRhW3hBeGlzXVtzZXJpZXNdIHx8IDAsIHRoaXMuTEFOR1VBR0UsIHRoaXMuUFJFQ0lTSU9OKSBhcyBhbnk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2Zvcm1hdCh2YWwsIG9wdGlvbnM/OiB7IGZvcm1hdD86IEZvcm1hdFR5cGUsIHByZWNpc2lvbj86IHN0cmluZyB9KTogYW55IHtcclxuICAgIGlmICh2YWwgPT09IDApIHJldHVybiAnMCc7XHJcbiAgICBpZiAob3B0aW9ucykge1xyXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdQZXJjZW50JylcclxuICAgICAgICByZXR1cm4gZm9ybWF0UGVyY2VudCh2YWwsIHRoaXMuTEFOR1VBR0UsIG9wdGlvbnMucHJlY2lzaW9uIHx8IHRoaXMuUFJFQ0lTSU9OKTtcclxuICAgICAgZWxzZSBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdDdXJyZW5jeScpXHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KHZhbCwgdGhpcy5MQU5HVUFHRSwgdGhpcy5TWU1CT0wsIHRoaXMuQ1VSUkVOQ1ksIG9wdGlvbnMucHJlY2lzaW9uIHx8IHRoaXMuUFJFQ0lTSU9OKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLkNVUlJFTkNZKVxyXG4gICAgICByZXR1cm4gZm9ybWF0Q3VycmVuY3kodmFsLCB0aGlzLkxBTkdVQUdFLCB0aGlzLlNZTUJPTCwgdGhpcy5DVVJSRU5DWSwgdGhpcy5QUkVDSVNJT04pO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKHZhbCwgdGhpcy5MQU5HVUFHRSwgdGhpcy5QUkVDSVNJT04pO1xyXG4gIH1cclxuICBleHBsb3JlKGNvbHVtbjogSGVhZGVySW5mbywgcm93OiBIZWFkZXJJbmZvKSB7XHJcbiAgICBpZiAoIXRoaXMuaW50ZXJhY3RpdmUgfHwgY29sdW1uLmV4cGxvcmFibGUgPT09IGZhbHNlIHx8IHJvdy5leHBsb3JhYmxlID09PSBmYWxzZSkgcmV0dXJuO1xyXG4gICAgbGV0IHg6IEF4aXNWYWx1ZSwgc2VyaWVzOiBBeGlzVmFsdWUsIGluZGV4O1xyXG4gICAgY29uc3QgYXhlcyA9IHsgLi4udGhpcy5maWx0ZXJzIH0gYXMgQXhlc01hcDtcclxuICAgIGlmICghY29sdW1uLnN1bSlcclxuICAgICAgeCA9IGNvbHVtbi5rZXk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgY29uc3QgeyB2YWx1ZSwgY2FsY3VsYXRlIH0gPSBjb2x1bW4uc3VtO1xyXG4gICAgICBpZiAoaXNGdW5jdGlvbihjYWxjdWxhdGUpKSByZXR1cm47XHJcbiAgICAgIHggPSBbXSBhcyBzdHJpbmdbXTtcclxuICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKGNvbHVtbi5zdW0pXHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICBjb25zdCBrZXkgPSBjb2x1bW4ua2V5O1xyXG4gICAgICAgIHgucHVzaChrZXkpO1xyXG4gICAgICAgIGlmIChrZXkgPT09IHZhbHVlKVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF4ZXNbdGhpcy54QXhpcy5uYW1lXSA9IHg7XHJcbiAgICBpZiAocm93LmluZGV4KVxyXG4gICAgICBpbmRleCA9IHJvdy5pbmRleC5uYW1lO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmIChyb3cuc3VtKSB7XHJcbiAgICAgICAgY29uc3QgeyB2YWx1ZSwgY2FsY3VsYXRlIH0gPSByb3cuc3VtO1xyXG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKGNhbGN1bGF0ZSkpIHJldHVybjtcclxuICAgICAgICBzZXJpZXMgPSBbXSBhcyBzdHJpbmdbXTtcclxuICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcclxuICAgICAgICAgIGlmIChyb3cuc3VtKVxyXG4gICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgIGNvbnN0IGtleSA9IHJvdy5rZXk7XHJcbiAgICAgICAgICBzZXJpZXMucHVzaChrZXkpO1xyXG4gICAgICAgICAgaWYgKGtleSA9PT0gdmFsdWUpXHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgc2VyaWVzID0gcm93LmtleTtcclxuICAgICAgYXhlc1t0aGlzLnNlcmllcy5uYW1lXSA9IHNlcmllcztcclxuICAgICAgaW5kZXggPSBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vbkV4cGxvcmUuZW1pdCh7IGF4ZXMsIGluZGV4IH0pO1xyXG4gIH1cclxuICBleHBvcnQoKSB7XHJcbiAgICBjb25zdCBudW1iZXJGb3JtYXQgPSB0aGlzLl9zZXJ2aWNlLm51bWJlckZvcm1hdCxcclxuICAgICAgY29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiAhYy5zdW0pLFxyXG4gICAgICBjZWxscyA9IFtdIGFzIENlbGxbXSxcclxuICAgICAgcm93cyA9IFt7IGluZGV4OiAxLCBjZWxscyB9XTtcclxuICAgIGNvbHVtbnMuZm9yRWFjaCgoYywgaikgPT4gY2VsbHMucHVzaCh7XHJcbiAgICAgIGluZGV4OiBqICsgMixcclxuICAgICAgdmFsdWU6IGMudmFsdWUsIHN0eWxlOiB7IGJvbGQ6IHRydWUgfVxyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMucm93cy5maWx0ZXIociA9PiAhci5zdW0pLmZvckVhY2goKHIsIGkpID0+IHtcclxuICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX2RhdGFbci5rZXldLFxyXG4gICAgICAgIGNlbGxzID0gW3sgaW5kZXg6IDEsIHZhbHVlOiByLnZhbHVlLCBzdHlsZTogeyBib2xkOiB0cnVlIH0gfV0gYXMgQ2VsbFtdO1xyXG4gICAgICBjb2x1bW5zLmZvckVhY2goKGMsIGopID0+IGNlbGxzLnB1c2goe1xyXG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgIGluZGV4OiBqICsgMixcclxuICAgICAgICB2YWx1ZTogZGF0YSAmJiBkYXRhW2Mua2V5XSAhPT0gdW5kZWZpbmVkID8gZGF0YVtjLmtleV0gOiAwLFxyXG4gICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICBudW1iZXJGb3JtYXQsXHJcbiAgICAgICAgICBoQWxpZ246ICdyaWdodCcsXHJcbiAgICAgICAgfVxyXG4gICAgICB9IGFzIENlbGwpKTtcclxuICAgICAgcm93cy5wdXNoKHtcclxuICAgICAgICBpbmRleDogaSArIDIsXHJcbiAgICAgICAgY2VsbHNcclxuICAgICAgfSBhcyBSb3cpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zdCBib29rID0gbmV3IFdvcmtib29rKFxyXG4gICAgICB7XHJcbiAgICAgICAgd29ya3NoZWV0czogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBlbmFibGVSdGw6IHRoaXMuX3Nlc3Npb24uaW52ZXJzZSxcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5fdHJhbnNsYXRlLmdldCgnU2hlZXROJywgMSksXHJcbiAgICAgICAgICAgIGNvbHVtbnM6IGNvbHVtbnMubWFwKChfLCBpKSA9PiAoeyBpbmRleDogaSArIDEsIHdpZHRoOiAxNTAgfSBhcyBDb2x1bW4pKSxcclxuICAgICAgICAgICAgcm93cyxcclxuICAgICAgICAgIH0gYXMgV29ya3NoZWV0LFxyXG4gICAgICAgIF0sXHJcbiAgICAgIH0sXHJcbiAgICAgICd4bHN4J1xyXG4gICAgKTtcclxuICAgIHRoaXMuX3NlcnZpY2UubmFtZU9mKHRoaXMuZmlsdGVycywgdGhpcy5jdWJlLm5hbWUpLnN1YnNjcmliZShuID0+XHJcbiAgICAgIGJvb2suc2F2ZShgJHtuIHx8IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ01hdHJpeCcpfS54bHN4YCkpO1xyXG4gIH1cclxuICBfbW92ZSh4LCB5KSB7XHJcbiAgICBsZXQgcm93SW5kZXggPSAwO1xyXG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCB0aGlzLnRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnRCb2RpZXMubGVuZ3RoOyBiKyspIHtcclxuICAgICAgY29uc3QgdEJvZHkgPSB0aGlzLnRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnRCb2RpZXMuaXRlbShiKTtcclxuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB0Qm9keS5yb3dzLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgY29uc3Qgcm93ID0gdEJvZHkucm93cy5pdGVtKHIpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcm93LmNlbGxzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICBjb25zdCBjZWxsID0gcm93LmNlbGxzLml0ZW0oYyk7XHJcbiAgICAgICAgICBpZiAoYyA9PT0geClcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdjZWxsLXgnKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QucmVtb3ZlKCdjZWxsLXgnKTtcclxuICAgICAgICAgIGlmIChyb3dJbmRleCA9PT0geSlcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdjZWxsLXknKTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgY2VsbC5jbGFzc0xpc3QucmVtb3ZlKCdjZWxsLXknKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcm93SW5kZXgrKztcclxuICAgICAgfVxyXG4gICAgICBjb25zdCB0Rm9vdCA9IHRoaXMudGFibGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudEZvb3QsIHJvdyA9IHRGb290LnJvd3NbMF07XHJcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcm93LmNlbGxzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxscy5pdGVtKGMpO1xyXG4gICAgICAgIGlmIChjID09PSB4KVxyXG4gICAgICAgICAgY2VsbC5jbGFzc0xpc3QuYWRkKCdjZWxsLXgnKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBjZWxsLmNsYXNzTGlzdC5yZW1vdmUoJ2NlbGwteCcpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbnR5cGUgRGF0YU1hcCA9IHsgW3Nlcmllczogc3RyaW5nXTogeyBbeEF4aXM6IHN0cmluZ106IG51bWJlcjsgfTsgfTtcclxuXHJcbmV4cG9ydCB0eXBlIFN1bVNldHRpbmdzID0ge1xyXG4gIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGF4aXM6IEF4aXNUeXBlO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZm9ybWF0PzogRm9ybWF0VHlwZTtcclxuICBwcmVjaXNpb24/OiBzdHJpbmc7XHJcbiAgZXhwbG9yYWJsZT86IGJvb2xlYW47XHJcbiAgcGxhY2U/OiBBeGlzUGxhY2U7XHJcbiAgY2FsY3VsYXRlPzogQ2FsY3VsYXRlVHlwZTtcclxufVxyXG5leHBvcnQgZGVjbGFyZSB0eXBlIEZvcm1hdFR5cGUgPSAnUGVyY2VudCcgfCAnQ3VycmVuY3knIHwgJ051bWJlcic7XHJcbmV4cG9ydCBkZWNsYXJlIHR5cGUgQ2FsY3VsYXRlVHlwZSA9ICdRdWFydGVyJyB8ICdZZWFyJyB8ICdNb250aCcgfCAnU3VtJyB8IENhbGN1bGF0ZUZuO1xyXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQ2FsY3VsYXRlRm4ge1xyXG4gICh2YWx1ZTogc3RyaW5nLCBkYXRhOiB7IFtzZXJpZXM6IHN0cmluZ106IHsgW3hBeGlzOiBzdHJpbmddOiBudW1iZXI7IH07IH0pOiBudW1iZXI7XHJcbn1cclxuXHJcbnR5cGUgSGVhZGVySW5mbyA9IHtcclxuICBrZXk6IHN0cmluZztcclxuICB2YWx1ZTogYW55O1xyXG4gIHByZWNpc2lvbj86IHN0cmluZztcclxuICBleHBsb3JhYmxlPzogYm9vbGVhbjtcclxuICBhY2N1bXVsYXRlPzogYm9vbGVhbjtcclxuICBzdW0/OiBTdW1TZXR0aW5ncztcclxuICBpbmRleD86IEN1YmVJbmRleDtcclxufTtcclxuaW50ZXJmYWNlIENlbGwgeyB9XHJcbiIsIkBpZiAoZGF0YSkge1xuICA8dGFibGUgI3RhYmxlIGNsYXNzPVwibWF0LW1kYy10YWJsZSBjdWJlLXRhYmxlXCIgKG1vdXNlbGVhdmUpPVwiX21vdmUoLTEsIC0xKVwiPlxuICAgIDx0aGVhZD5cbiAgICAgIDwhLS0gaGVhZGVycyAtLT5cbiAgICAgIDx0ciBjbGFzcz1cIm1hdC1tZGMtaGVhZGVyLXJvd1wiPlxuICAgICAgICA8dGg+PC90aD5cbiAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrIGNvbHVtbjsgbGV0IHggPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dGhcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIl9tb3ZlKHggKyAxLCAtMilcIiBjbGFzcz1cIm1hdC1tZGMtaGVhZGVyLWNlbGxcIj5cbiAgICAgICAgICAgIHt7IGNvbHVtbi52YWx1ZSB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIH1cbiAgICAgICAgPHRoIGNsYXNzPVwibWF0LW1kYy1oZWFkZXItY2VsbFwiPnt7eEF4aXNUb3RhbExhYmVsfX08L3RoPlxuICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keT5cbiAgICAgIDwhLS0gcm93cyAtLT5cbiAgICAgIEBmb3IgKHJvdyBvZiByb3dzOyB0cmFjayByb3c7IGxldCB5ID0gJGluZGV4KSB7XG4gICAgICAgIDx0ciBjbGFzcz1cIm1hdC1tZGMtcm93XCJcbiAgICAgICAgICBbY2xhc3MuY3ViZS1pbmRleF09XCJyb3cuaW5kZXhcIj5cbiAgICAgICAgICA8dGggY2xhc3M9XCJtYXQtbWRjLWhlYWRlci1jZWxsXCIgKG1vdXNlZW50ZXIpPVwiX21vdmUoLTIsIHkgKVwiPnt7IHJvdy52YWx1ZSB9fTwvdGg+XG4gICAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrIGNvbHVtbjsgbGV0IHggPSAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtY2VsbCBmaWd1cmVcIlxuICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJfbW92ZSh4ICsgMSwgeSApXCI+XG4gICAgICAgICAgICAgIEBpZiAoZGF0YVtyb3cua2V5XVtjb2x1bW4ua2V5XSAhPT0gJzAnKSB7XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5leHBsb3JhYmxlXT1cImludGVyYWN0aXZlICYmIGNvbHVtbi5leHBsb3JhYmxlICE9PSBmYWxzZSAmJiByb3cuZXhwbG9yYWJsZSAhPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cGxvcmUoY29sdW1uLCByb3cpXCI+XG4gICAgICAgICAgICAgICAgICB7eyBkYXRhW3Jvdy5rZXldW2NvbHVtbi5rZXldIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIDx0aCBjbGFzcz1cIm1hdC1tZGMtY2VsbCBmaWd1cmVcIiAobW91c2VlbnRlcik9XCJfbW92ZSgtMSwgeSApXCI+XG4gICAgICAgICAgICB7eyBkYXRhW3Jvdy5rZXldWydfdG90YWwnXSB9fVxuICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgICB9XG4gICAgPC90Ym9keT5cbiAgICA8dGZvb3Q+XG4gICAgICA8IS0tIGZvb3RlciAtLT5cbiAgICAgIDx0ciBjbGFzcz1cIm1hdC1tZGMtZm9vdGVyLXJvd1wiPlxuICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWZvb3Rlci1jZWxsXCI+e3tzZXJpZXNUb3RhbExhYmVsfX08L3RkPlxuICAgICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uczsgdHJhY2sgY29sdW1uOyBsZXQgeCA9ICRpbmRleCkge1xuICAgICAgICAgIDx0ZCBjbGFzcz1cIm1hdC1tZGMtZm9vdGVyLWNlbGwgZmlndXJlXCJcbiAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIl9tb3ZlKHggKyAxLCAtMilcIlxuICAgICAgICAgICAgW2NsYXNzLm5lZ2F0aXZlLWZpZ3VyZV09XCJ0b3RhbHNbY29sdW1uLmtleV0uc3RhcnRzV2l0aCgnLScpXCI+XG4gICAgICAgICAgICBAaWYgKHRvdGFsc1tjb2x1bW4ua2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHt7IHRvdGFsc1tjb2x1bW4ua2V5XSB9fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgIH1cbiAgICAgICAgPHRoIGNsYXNzPVwibWF0LW1kYy1mb290ZXItY2VsbCBmaWd1cmVcIj57eyB0b3RhbHNbJ19ncmFuZCddIH19PC90aD5cbiAgICAgIDwvdHI+XG4gICAgPC90Zm9vdD5cbiAgPC90YWJsZT5cbn1cbiJdfQ==
469
+ function evalSumSettings(sum, index, array) {
470
+ let value;
471
+ if (sum.value)
472
+ value = sum.value.toString();
473
+ else if (sum.calculate)
474
+ switch (sum.calculate) {
475
+ case 'Month':
476
+ {
477
+ const month = new Date().getMonth() + 1;
478
+ value = 'M' + ('0' + month.toString()).slice(-2);
479
+ break;
480
+ }
481
+ case 'Year':
482
+ {
483
+ const date = new Date();
484
+ let year = date.getFullYear();
485
+ if (sum.startMonth) {
486
+ const month = date.getMonth() + 1;
487
+ if (month < sum.startMonth)
488
+ year -= 1;
489
+ }
490
+ value = year.toString();
491
+ break;
492
+ }
493
+ case 'Quarter':
494
+ {
495
+ let month = new Date().getMonth() + 1;
496
+ if (sum.startMonth && sum.startMonth > 1)
497
+ month = 12 - sum.startMonth >= month ?
498
+ 12 - month + sum.startMonth
499
+ : month - sum.startMonth;
500
+ value = Math.ceil(month / 3).toString();
501
+ break;
502
+ }
503
+ case 'Sum':
504
+ // greater than any char, sums all columns / rows
505
+ value = '~';
506
+ }
507
+ return {
508
+ ...sum,
509
+ value
510
+ };
511
+ }
512
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9jdWJlL21hdHJpeC90YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJpZXMvY29yZS9zcmMvbGliL2N1YmUvbWF0cml4L3RhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLFFBQVEsRUFBMEIsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNELE9BQU8sRUFBZSxXQUFXLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQU1uRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7QUFLeEQsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBRTFCLDJCQUEyQjtBQU8zQixNQUFNLE9BQU8sbUJBQW1CO0lBZ0I5QixJQUFhLEdBQUcsQ0FBQyxHQUFnQztRQUMvQyxJQUFJLEdBQUc7WUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FB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LENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3hDLE1BQU07Z0JBQ1IsQ0FBQztZQUNILEtBQUssS0FBSztnQkFDUixpREFBaUQ7Z0JBQ2pELEtBQUssR0FBRyxHQUFHLENBQUM7UUFDaEIsQ0FBQztJQUNILE9BQU87UUFDTCxHQUFHLEdBQUc7UUFDTixLQUFLO0tBQ04sQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZm9ybWF0Q3VycmVuY3ksIGZvcm1hdFBlcmNlbnQsIGZvcm1hdE51bWJlciwgZ2V0Q3VycmVuY3lTeW1ib2wgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIGZvcmtKb2luIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgV29ya2Jvb2ssIFdvcmtzaGVldCwgUm93LCBDb2x1bW4gfSBmcm9tICdAc3luY2Z1c2lvbi9lajItZXhjZWwtZXhwb3J0JztcclxuaW1wb3J0IHsgaXNBcnJheSwgaXNGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgQ3ViZVNlcnZpY2UsIGVyclJlc291cmNlLCBTZXJpZXMgfSBmcm9tICcuLi9jdWJlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTZXNzaW9uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2Vzc2lvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGF0YXNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2RhdGFzb3VyY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFByb21wdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3Byb21wdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdHJhbnNsYXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBeGVzTWFwLCBBeGlzVmFsdWUsIEN1YmUsIEN1YmVBeGlzLCBDdWJlSW5kZXggfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IG1hdHJpeEFuaW1hdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IFNjb3BlVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvY29uZmlndXJhdGlvbic7XHJcbmltcG9ydCB7IEF4aXNDbGlja0V2ZW50IH0gZnJvbSAnLi4vZGVjbGFyYXRpb25zJztcclxuaW1wb3J0IHsgQXhpc1BsYWNlLCBBeGlzVHlwZSB9IGZyb20gJy4uL2RlY2xhcmF0aW9ucyc7XHJcblxyXG5jb25zdCBMT0FESU5HX0dSQUNFID0gMjAwO1xyXG5cclxuLyoqIGN1YmUgbWF0cml4IGNvbXBvbmVudCovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYml6ZG9jLWN1YmUtbWF0cml4JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3RhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgYW5pbWF0aW9uczogW21hdHJpeEFuaW1hdGlvbl1cclxufSlcclxuZXhwb3J0IGNsYXNzIEN1YmVNYXRyaXhDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIHJlYWRvbmx5IFBSRUNJU0lPTiA9IHRoaXMuX3NlcnZpY2UuZGlnaXRzSW5mbztcclxuICByZWFkb25seSBMQU5HVUFHRSA9IHRoaXMuX3Nlc3Npb24ubGFuZ3VhZ2U7XHJcbiAgQ1VSUkVOQ1k6IHN0cmluZztcclxuICBTWU1CT0w6IHN0cmluZztcclxuICBAVmlld0NoaWxkKCd0YWJsZScpIHRhYmxlRWxlbWVudDogRWxlbWVudFJlZjxIVE1MVGFibGVFbGVtZW50PjtcclxuICBASW5wdXQoKSBzZXJpZXNUb3RhbExhYmVsPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHhBeGlzVG90YWxMYWJlbD86IHN0cmluZztcclxuICBASW5wdXQoJ2N1YmUnKSBfY3ViZT86IHN0cmluZztcclxuICBASW5wdXQoJ3hBeGlzJykgX3hBeGlzITogc3RyaW5nO1xyXG4gIEBJbnB1dCgnc2VyaWVzJykgX3NlcmllcyE6IHN0cmluZztcclxuICBASW5wdXQoJ2luZGljZXMnKSBfaW5kaWNlcz86IHN0cmluZ1tdIHwgc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGluZGV4QXQ/OiBBeGlzVHlwZSA9ICdTZXJpZXMnO1xyXG4gIEBJbnB1dCgpIHBsYWNlQXQ/OiBBeGlzUGxhY2UgPSAnTGVhZGluZyc7XHJcbiAgQElucHV0KCkgc2NvcGU/OiBTY29wZVR5cGU7XHJcbiAgcHJpdmF0ZSBfc3VtOiBTdW1TZXR0aW5nc1tdO1xyXG4gIEBJbnB1dCgpIHNldCBzdW0odmFsOiBTdW1TZXR0aW5ncyB8IFN1bVNldHRpbmdzW10pIHtcclxuICAgIGlmICh2YWwpIHRoaXMuX3N1bSA9IChpc0FycmF5KHZhbCkgPyB2YWwgOiBbdmFsXSkubWFwKGV2YWxTdW1TZXR0aW5ncyk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIGZpbHRlcnM6IEF4ZXNNYXA7XHJcbiAgQElucHV0KCkgbG9hZGluZzogYm9vbGVhbjtcclxuICBwcml2YXRlIF9pbnRlcmFjdGl2ZSA9IHRydWU7XHJcbiAgcHVibGljIGdldCBpbnRlcmFjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9pbnRlcmFjdGl2ZTtcclxuICB9XHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgc2V0IGludGVyYWN0aXZlKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9pbnRlcmFjdGl2ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XHJcbiAgfVxyXG4gIEBPdXRwdXQoJ2V4cGxvcmUnKSByZWFkb25seSBvbkV4cGxvcmUgPSBuZXcgRXZlbnRFbWl0dGVyPEF4aXNDbGlja0V2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSByZWFkb25seSBsb2FkaW5nQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xyXG4gIHJvd3M6IEhlYWRlckluZm9bXTtcclxuICBjb2x1bW5zOiBIZWFkZXJJbmZvW107XHJcbiAgaW5kaWNlczogQ3ViZUluZGV4W10gPSBbXTtcclxuICBkYXRhOiB7IFtrZXk6IHN0cmluZ106IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9OyB9O1xyXG4gIHRvdGFsczogeyBbeEF4aXM6IHN0cmluZ106IHN0cmluZyB9O1xyXG4gIGN1YmU6IEN1YmU7XHJcbiAgeEF4aXM6IEN1YmVBeGlzO1xyXG4gIHNlcmllczogQ3ViZUF4aXM7XHJcbiAgcHJpdmF0ZSBfcmF3ZGF0YTogRGF0YU1hcDtcclxuICBwcml2YXRlIF9wcmVwYXJlOiBQcm9taXNlPGFueT47XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIF9zYjogUHJvbXB0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IEN1YmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kczogRGF0YXNvdXJjZVNlcnZpY2UpIHtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydfY3ViZSddKSB7XHJcbiAgICAgIHRoaXMuY3ViZSA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5jdWJlcy5maW5kKGMgPT4gYy5uYW1lID09PSB0aGlzLl9jdWJlKTtcclxuICAgICAgdGhpcy5DVVJSRU5DWSA9IHRoaXMuY3ViZS5jdXJyZW5jeUNvZGUgLyp8fCB0aGlzLl9zZXJ2aWNlLmN1cnJlbmN5Q29kZSovO1xyXG4gICAgICB0aGlzLlNZTUJPTCA9IGdldEN1cnJlbmN5U3ltYm9sKHRoaXMuQ1VSUkVOQ1ksICduYXJyb3cnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5jdWJlKSB7XHJcbiAgICAgIHRoaXMuY3ViZSA9IHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5jdWJlc1swXTtcclxuICAgICAgdGhpcy5DVVJSRU5DWSA9IHRoaXMuY3ViZS5jdXJyZW5jeUNvZGUgLyp8fCB0aGlzLl9zZXJ2aWNlLmN1cnJlbmN5Q29kZSovO1xyXG4gICAgICB0aGlzLlNZTUJPTCA9IGdldEN1cnJlbmN5U3ltYm9sKHRoaXMuQ1VSUkVOQ1ksICduYXJyb3cnKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydfaW5kaWNlcyddICYmIHRoaXMuX2luZGljZXMpIHtcclxuICAgICAgaWYgKCF0aGlzLmN1YmUuaW5kaWNlcykgdGhyb3cgYGN1YmUgJHt0aGlzLmN1YmUubmFtZX0gZXhwZWN0cyBvbmUgb3IgbW9yZSBpbmRpY2VzLmA7XHJcbiAgICAgIHRoaXMuaW5kaWNlcyA9IHRoaXMuY3ViZS5pbmRpY2VzLmZpbHRlcihpID0+IGlzQXJyYXkodGhpcy5faW5kaWNlcykgPyB0aGlzLl9pbmRpY2VzLmluZGV4T2YoaS5uYW1lKSA+IC0xIDogdGhpcy5faW5kaWNlcyA9PT0gaS5uYW1lKTtcclxuICAgIH1cclxuICAgIGlmIChjaGFuZ2VzWydfeEF4aXMnXSB8fCBjaGFuZ2VzWydfc2VyaWVzJ10pIHtcclxuICAgICAgdGhpcy54QXhpcyA9IHRoaXMuY3ViZS5heGVzLmZpbmQoYSA9PiBhLm5hbWUgPT09IHRoaXMuX3hBeGlzKTtcclxuICAgICAgdGhpcy5zZXJpZXMgPSB0aGlzLmN1YmUuYXhlcy5maW5kKGEgPT4gYS5uYW1lID09PSB0aGlzLl9zZXJpZXMpO1xyXG4gICAgICB0aGlzLmRhdGEgPSBudWxsO1xyXG4gICAgICB0aGlzLl9wcmVwYXJlID0gZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgZm9ya0pvaW4oW1xyXG4gICAgICAgICAgdGhpcy5fZHMuYWxsKHRoaXMuc2VyaWVzLmRhdGFUeXBlKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAociA9PlxyXG4gICAgICAgICAgICAgIHRoaXMucm93cyA9IHJcclxuICAgICAgICAgICAgKSksXHJcbiAgICAgICAgICB0aGlzLl9kcy5hbGwodGhpcy54QXhpcy5kYXRhVHlwZSkucGlwZShcclxuICAgICAgICAgICAgdGFwKGMgPT5cclxuICAgICAgICAgICAgICB0aGlzLmNvbHVtbnMgPSBjXHJcbiAgICAgICAgICAgICkpXSkucGlwZSh0YXAodGhpcy5fYWRkQWNjdW1IZWFkZXJzLmJpbmQodGhpcylcclxuICAgICAgICAgICAgKSkpO1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKGNoYW5nZXNbJ2ZpbHRlcnMnXSlcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2FkZEFjY3VtSGVhZGVycygpIHtcclxuICAgIGlmICh0aGlzLl9pbmRpY2VzKSB7XHJcbiAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLmluZGV4QXQgPT09ICdYQXhpcycgPyB0aGlzLmNvbHVtbnMgOiB0aGlzLnJvd3M7XHJcbiAgICAgIHRoaXMuaW5kaWNlcy5mb3JFYWNoKCh4LCBpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGVhZGVyID0ge1xyXG4gICAgICAgICAga2V5OiB4Lm5hbWUsXHJcbiAgICAgICAgICB2YWx1ZTogeC50aXRsZSxcclxuICAgICAgICAgIGluZGV4OiB4LFxyXG4gICAgICAgICAgYWNjdW11bGF0ZTogeC5hY2N1bXVsYXRlXHJcbiAgICAgICAgfSBhcyBIZWFkZXJJbmZvO1xyXG4gICAgICAgIGlmICh0aGlzLnBsYWNlQXQgPT09ICdUcmFpbGluZycpXHJcbiAgICAgICAgICBjb2xsZWN0aW9uLnB1c2goaGVhZGVyKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBjb2xsZWN0aW9uLnNwbGljZShpLCAwLCBoZWFkZXIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuX3N1bSAmJiB0aGlzLl9zdW0uZm9yRWFjaCgocywgaSkgPT4ge1xyXG4gICAgICBjb25zdCB7IHRpdGxlLCBheGlzLCB2YWx1ZSB9ID0gcztcclxuICAgICAgY29uc3QgaGVhZGVyID0ge1xyXG4gICAgICAgIGtleTogJ19zdW0nICsgaSxcclxuICAgICAgICB2YWx1ZTogdGl0bGUsXHJcbiAgICAgICAgYWNjdW11bGF0ZTogIWlzRnVuY3Rpb24ocy5jYWxjdWxhdGUpICYmIHMuY2FsY3VsYXRlICE9PSAnU3VtJyxcclxuICAgICAgICBleHBsb3JhYmxlOiAhaXNGdW5jdGlvbihzLmNhbGN1bGF0ZSkgJiYgcy5leHBsb3JhYmxlICE9PSBmYWxzZSxcclxuICAgICAgICBwcmVjaXNpb246IHMucHJlY2lzaW9uLFxyXG4gICAgICAgIHN1bTogc1xyXG4gICAgICB9IGFzIEhlYWRlckluZm87XHJcbiAgICAgIGxldCBqID0gMDtcclxuICAgICAgaWYgKGF4aXMgPT09ICdYQXhpcycpIHtcclxuICAgICAgICB3aGlsZSAoaiA8IHRoaXMuY29sdW1ucy5sZW5ndGgpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbHVtbnNbal0ua2V5ID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMuc3BsaWNlKGogKyAxLCAwLCBoZWFkZXIpO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGorKztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGogPT09IHRoaXMuY29sdW1ucy5sZW5ndGgpXHJcbiAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChoZWFkZXIpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHdoaWxlIChqIDwgdGhpcy5yb3dzLmxlbmd0aCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMucm93c1tqXS5rZXkgPT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm93cy5zcGxpY2UoaiArIDEsIDAsIGhlYWRlcik7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaisrO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaiA9PT0gdGhpcy5yb3dzLmxlbmd0aClcclxuICAgICAgICAgIHRoaXMucm93cy5wdXNoKGhlYWRlcik7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaCgpIHtcclxuICAgIGNvbnN0IHByb2dyZXNzVGFzayA9IHNldFRpbWVvdXQoKCkgPT5cclxuICAgICAgdGhpcy5sb2FkaW5nQ2hhbmdlLm5leHQodGhpcy5sb2FkaW5nID0gdHJ1ZSlcclxuICAgICAgLCBMT0FESU5HX0dSQUNFKTtcclxuICAgIHRoaXMuX3ByZXBhcmUudGhlbigoKSA9PlxyXG4gICAgICB0aGlzLl9zZXJ2aWNlLnNlcmllcyh0aGlzLmN1YmUubmFtZSwgdGhpcy5feEF4aXMsIHtcclxuICAgICAgICBzZXJpZXM6IHRoaXMuX3NlcmllcyxcclxuICAgICAgICBpbmRpY2VzOiB0aGlzLl9pbmRpY2VzLFxyXG4gICAgICAgIGZpbHRlcnM6IHRoaXMuZmlsdGVycyxcclxuICAgICAgICBpbnZlcnNlSW5kaWNlczogdGhpcy5pbmRleEF0ID09PSAnWEF4aXMnLFxyXG4gICAgICAgIHNjb3BlOiB0aGlzLnNjb3BlXHJcbiAgICAgIH0pLnN1YnNjcmliZSh7XHJcbiAgICAgICAgbmV4dDogciA9PiB7XHJcbiAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9tYXAocik7XHJcbiAgICAgICAgICB0aGlzLl9jbG9uZShtYXApO1xyXG4gICAgICAgICAgdGhpcy5fdG90YWxzKG1hcCk7XHJcbiAgICAgICAgICB0aGlzLl9zdHJpbmdpZnkobWFwKTtcclxuICAgICAgICAgIHRoaXMuZGF0YSA9IG1hcCBhcyBhbnk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKGU6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLl9zYi5lcnJvcihlcnJSZXNvdXJjZShlKSk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRpbmdDaGFuZ2UuZXJyb3IoZSk7XHJcbiAgICAgICAgfSwgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIGNsZWFyVGltZW91dChwcm9ncmVzc1Rhc2spO1xyXG4gICAgICAgICAgdGhpcy5sb2FkaW5nQ2hhbmdlLm5leHQodGhpcy5sb2FkaW5nID0gZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX21hcChzZXJpZXM6IFNlcmllc1tdKSB7XHJcbiAgICBjb25zdCBtYXAgPSB7fSBhcyBEYXRhTWFwO1xyXG4gICAgc2VyaWVzLmZvckVhY2gocyA9PiB7XHJcbiAgICAgIGlmIChzLmluZGV4KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaW5kZXhBdCA9PT0gJ1hBeGlzJylcclxuICAgICAgICAgIHMucG9pbnRzLmZvckVhY2gocCA9PiB7XHJcbiAgICAgICAgICAgIGxldCByb3cgPSBtYXBbcC54XTtcclxuICAgICAgICAgICAgaWYgKCFyb3cpXHJcbiAgICAgICAgICAgICAgcm93ID0gbWFwW3AueF0gPSB7fTtcclxuICAgICAgICAgICAgcm93W3MuaW5kZXhdID0gcC55O1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCByb3cgPSBtYXBbcy5pbmRleF0gPSB7fTtcclxuICAgICAgICAgIHMucG9pbnRzLmZvckVhY2gocCA9PiByb3dbcC54XSA9IHAueSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICBjb25zdCByb3cgPSBtYXBbcy5uYW1lXSA9IHt9O1xyXG4gICAgICAgIHMucG9pbnRzLmZvckVhY2gocCA9PiByb3dbcC54XSA9IHAueSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1hcDtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY2xvbmUoZGF0YTogRGF0YU1hcCkge1xyXG4gICAgdGhpcy5fcmF3ZGF0YSA9IHt9O1xyXG4gICAgdGhpcy5yb3dzLmZvckVhY2gociA9PiB7XHJcbiAgICAgIGNvbnN0IGtleSA9IHIua2V5O1xyXG4gICAgICBpZiAoIWRhdGFba2V5XSkgZGF0YVtrZXldID0ge307XHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fcmF3ZGF0YVtrZXldID0ge30sIGRhdGFba2V5XSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfdG90YWxzKGRhdGE6IERhdGFNYXApIHtcclxuICAgIHRoaXMuX3N1bT8uZm9yRWFjaCgocywgaSkgPT4ge1xyXG4gICAgICBjb25zdCB7IGF4aXMsIHZhbHVlOiBrZXksIGNhbGN1bGF0ZSB9ID0gcyxcclxuICAgICAgICBuYW1lID0gJ19zdW0nICsgaTtcclxuICAgICAgaWYgKGF4aXMgPT09ICdYQXhpcycpXHJcbiAgICAgICAgdGhpcy5yb3dzLmZvckVhY2gociA9PiB7XHJcbiAgICAgICAgICBpZiAoci5hY2N1bXVsYXRlID09PSBmYWxzZSkgcmV0dXJuO1xyXG4gICAgICAgICAgY29uc3QgZGF0YXJvdyA9IGRhdGFbci5rZXldO1xyXG4gICAgICAgICAgaWYgKCFkYXRhcm93KSByZXR1cm47XHJcbiAgICAgICAgICBsZXQgc3VtID0gMDtcclxuICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1ucykge1xyXG4gICAgICAgICAgICBpZiAoY29sdW1uLmluZGV4IHx8IGNvbHVtbi5zdW0pIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxjdWxhdGUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGNhbGN1bGF0ZSBhcyBDYWxjdWxhdGVGbikoci5rZXksIHRoaXMuX3Jhd2RhdGEpO1xyXG4gICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBzdW0gKz0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGRhdGFyb3dbY29sdW1uLmtleV07XHJcbiAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgc3VtICs9IHZhbDtcclxuICAgICAgICAgICAgICBpZiAoY29sdW1uLmtleSA9PT0ga2V5KVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRhdGFyb3dbbmFtZV0gPSBzdW07XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IHN1bXJvdyA9IGRhdGFbbmFtZV0gPSB7fTtcclxuICAgICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICAgICAgbGV0IHN1bSA9IDA7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiB0aGlzLnJvd3MpIHtcclxuICAgICAgICAgICAgaWYgKHJvdy5pbmRleCB8fCByb3cuc3VtKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsY3VsYXRlKSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjYWxjdWxhdGUgYXMgQ2FsY3VsYXRlRm4pKHJvdy5rZXksIHRoaXMuX3Jhd2RhdGEpO1xyXG4gICAgICAgICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZCAmJiB2YWwgIT09IG51bGwpXHJcbiAgICAgICAgICAgICAgICBzdW0gKz0gdmFsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGRhdGFyb3cgPSBkYXRhW3Jvdy5rZXldO1xyXG4gICAgICAgICAgICAgIGlmICghZGF0YXJvdykgY29udGludWU7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi5zdW0pIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGRhdGFyb3dbY29sdW1uLmtleV07XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsICE9IHVuZGVmaW5lZCkgc3VtICs9IHZhbDtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBkYXRhcm93W2NvbHVtbi5rZXldO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgICBzdW0gKz0gdmFsO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBpZiAocm93LmtleSA9PT0ga2V5KVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHN1bXJvd1tjb2x1bW4ua2V5XSA9IHN1bTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBsZXQgZ3JhbmQgPSAwO1xyXG4gICAgdGhpcy5yb3dzLmZvckVhY2gociA9PiB7XHJcbiAgICAgIGNvbnN0IGRhdGFyb3cgPSBkYXRhW3Iua2V5XTtcclxuICAgICAgaWYgKGRhdGFyb3cpIHtcclxuICAgICAgICBsZXQgY29sdW1uVG90YWwgPSAwO1xyXG4gICAgICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgaWYgKGMuYWNjdW11bGF0ZSA9PT0gZmFsc2UgfHwgYy5zdW0gIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgICAgY29uc3QgdmFsID0gZGF0YXJvd1tjLmtleV07XHJcbiAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgIGNvbHVtblRvdGFsICs9IHRoaXMuaW5kaWNlcy5sZW5ndGggPT09IDAgfHwgdGhpcy5pbmRleEF0ICE9PSAnWEF4aXMnIHx8XHJcbiAgICAgICAgICAgICAgYy5pbmRleCAhPT0gdW5kZWZpbmVkID8gdmFsIDogLXZhbDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBkYXRhcm93WydfdG90YWwnXSA9IHRoaXMuX2Zvcm1hdChjb2x1bW5Ub3RhbCwgcikgYXMgYW55O1xyXG4gICAgICAgIGlmICghci5zdW0pXHJcbiAgICAgICAgICBncmFuZCArPSB0aGlzLmluZGljZXMubGVuZ3RoID09PSAwIHx8XHJcbiAgICAgICAgICAgIHRoaXMuaW5kZXhBdCA9PT0gJ1hBeGlzJyB8fFxyXG4gICAgICAgICAgICByLmluZGV4ICE9PSB1bmRlZmluZWQgPyBjb2x1bW5Ub3RhbCA6IC1jb2x1bW5Ub3RhbDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlXHJcbiAgICAgICAgZGF0YVtyLmtleV0gPSB7XHJcbiAgICAgICAgICAnX3RvdGFsJzogJzAnIGFzIGFueVxyXG4gICAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIHRoaXMudG90YWxzID0ge307XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuICAgICAgbGV0IHJvd1RvdGFsID0gMDtcclxuICAgICAgdGhpcy5yb3dzLmZvckVhY2gocm93ID0+IHtcclxuICAgICAgICBpZiAocm93LmFjY3VtdWxhdGUgPT09IGZhbHNlIHx8IHJvdy5zdW0gIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHZhbCA9IGRhdGFbcm93LmtleV1bYy5rZXldO1xyXG4gICAgICAgIGlmICh2YWwgIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgIHJvd1RvdGFsICs9IHRoaXMuaW5kaWNlcy5sZW5ndGggPT09IDAgfHwgdGhpcy5pbmRleEF0ID09PSAnWEF4aXMnIHx8XHJcbiAgICAgICAgICAgIHJvdy5pbmRleCAhPT0gdW5kZWZpbmVkID8gdmFsIDogLXZhbDtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG90YWxzW2Mua2V5XSA9IHRoaXMuX2Zvcm1hdChyb3dUb3RhbCwgYyk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudG90YWxzWydfZ3JhbmQnXSA9IHRoaXMuX2Zvcm1hdChncmFuZCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3N0cmluZ2lmeShkYXRhOiBEYXRhTWFwKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjID0+IHtcclxuICAgICAgY29uc3Qgc2VyaWVzID0gYy5rZXk7XHJcbiAgICAgIHRoaXMucm93cy5mb3JFYWNoKHIgPT4ge1xyXG4gICAgICAgIGNvbnN0IHhBeGlzID0gci5rZXksIHZhbHVlID0gZGF0YVt4QXhpc11bc2VyaWVzXTtcclxuICAgICAgICBkYXRhW3hBeGlzXVtzZXJpZXNdID1cclxuICAgICAgICAgIChjLnN1bSA/IHRoaXMuX2Zvcm1hdCh2YWx1ZSwgYy5zdW0pIDpcclxuICAgICAgICAgICAgci5zdW0gPyB0aGlzLl9mb3JtYXQodmFsdWUsIHIuc3VtKSA6XHJcbiAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0KHZhbHVlKSkgYXMgYW55O1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBwcml2YXRlIF9mb3JtYXQodmFsLCBvcHRpb25zPzogeyBmb3JtYXQ/OiBGb3JtYXRUeXBlLCBwcmVjaXNpb24/OiBzdHJpbmcgfSk6IHN0cmluZyB7XHJcbiAgICBpZiAodmFsID09PSAwIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJzAnO1xyXG4gICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnUGVyY2VudCcpXHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdFBlcmNlbnQodmFsLCB0aGlzLkxBTkdVQUdFLCBvcHRpb25zLnByZWNpc2lvbiB8fCB0aGlzLlBSRUNJU0lPTik7XHJcbiAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnQ3VycmVuY3knKVxyXG4gICAgICAgIHJldHVybiBmb3JtYXRDdXJyZW5jeSh2YWwsIHRoaXMuTEFOR1VBR0UsIHRoaXMuU1lNQk9MLCB0aGlzLkNVUlJFTkNZLCBvcHRpb25zLnByZWNpc2lvbiB8fCB0aGlzLlBSRUNJU0lPTik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5DVVJSRU5DWSlcclxuICAgICAgcmV0dXJuIGZvcm1hdEN1cnJlbmN5KHZhbCwgdGhpcy5MQU5HVUFHRSwgdGhpcy5TWU1CT0wsIHRoaXMuQ1VSUkVOQ1ksIHRoaXMuUFJFQ0lTSU9OKTtcclxuICAgIGVsc2VcclxuICAgICAgcmV0dXJuIGZvcm1hdE51bWJlcih2YWwsIHRoaXMuTEFOR1VBR0UsIHRoaXMuUFJFQ0lTSU9OKTtcclxuICB9XHJcbiAgZXhwbG9yZShjb2x1bW46IEhlYWRlckluZm8sIHJvdzogSGVhZGVySW5mbykge1xyXG4gICAgaWYgKCF0aGlzLmludGVyYWN0aXZlIHx8IGNvbHVtbi5leHBsb3JhYmxlID09PSBmYWxzZSB8fCByb3cuZXhwbG9yYWJsZSA9PT0gZmFsc2UpIHJldHVybjtcclxuICAgIGxldCB4OiBBeGlzVmFsdWUsIHNlcmllczogQXhpc1ZhbHVlLCBpbmRleDtcclxuICAgIGNvbnN0IGF4ZXMgPSB7IC4uLnRoaXMuZmlsdGVycyB9IGFzIEF4ZXNNYXA7XHJcbiAgICBpZiAoIWNvbHVtbi5zdW0pXHJcbiAgICAgIHggPSBjb2x1bW4ua2V5O1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIGNvbnN0IHsgdmFsdWUsIGNhbGN1bGF0ZSB9ID0gY29sdW1uLnN1bTtcclxuICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsY3VsYXRlKSkgcmV0dXJuO1xyXG4gICAgICB4ID0gW10gYXMgc3RyaW5nW107XHJcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHRoaXMuY29sdW1ucykge1xyXG4gICAgICAgIGlmIChjb2x1bW4uc3VtKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gY29sdW1uLmtleTtcclxuICAgICAgICB4LnB1c2goa2V5KTtcclxuICAgICAgICBpZiAoa2V5ID09PSB2YWx1ZSlcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBheGVzW3RoaXMueEF4aXMubmFtZV0gPSB4O1xyXG4gICAgaWYgKHJvdy5pbmRleClcclxuICAgICAgaW5kZXggPSByb3cuaW5kZXgubmFtZTtcclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAocm93LnN1bSkge1xyXG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIGNhbGN1bGF0ZSB9ID0gcm93LnN1bTtcclxuICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxjdWxhdGUpKSByZXR1cm47XHJcbiAgICAgICAgc2VyaWVzID0gW10gYXMgc3RyaW5nW107XHJcbiAgICAgICAgZm9yIChjb25zdCByb3cgb2YgdGhpcy5yb3dzKSB7XHJcbiAgICAgICAgICBpZiAocm93LnN1bSlcclxuICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICBjb25zdCBrZXkgPSByb3cua2V5O1xyXG4gICAgICAgICAgc2VyaWVzLnB1c2goa2V5KTtcclxuICAgICAgICAgIGlmIChrZXkgPT09IHZhbHVlKVxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZVxyXG4gICAgICAgIHNlcmllcyA9IHJvdy5rZXk7XHJcbiAgICAgIGF4ZXNbdGhpcy5zZXJpZXMubmFtZV0gPSBzZXJpZXM7XHJcbiAgICAgIGluZGV4ID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMub25FeHBsb3JlLmVtaXQoeyBheGVzLCBpbmRleCB9KTtcclxuICB9XHJcbiAgLyoqICovXHJcbiAgZXhwb3J0KCkge1xyXG4gICAgY29uc3QgbnVtYmVyRm9ybWF0ID0gdGhpcy5fc2VydmljZS5udW1iZXJGb3JtYXQsXHJcbiAgICAgIGNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuZmlsdGVyKGMgPT4gIWMuc3VtKSxcclxuICAgICAgcm93cyA9IFt7XHJcbiAgICAgICAgaW5kZXg6IDEsIGNlbGxzOiBjb2x1bW5zLm1hcCgoYywgaikgPT4gKHtcclxuICAgICAgICAgIGluZGV4OiBqICsgMixcclxuICAgICAgICAgIHZhbHVlOiBjLnZhbHVlLCBzdHlsZTogeyBib2xkOiB0cnVlIH1cclxuICAgICAgICB9IGFzIENlbGwpKVxyXG4gICAgICB9LCAuLi50aGlzLnJvd3MuZmlsdGVyKHIgPT4gIXIuc3VtKS5tYXAoKHIsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5fcmF3ZGF0YVtyLmtleV07XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIGluZGV4OiBpICsgMixcclxuICAgICAgICAgIGNlbGxzOiBbeyBpbmRleDogMSwgdmFsdWU6IHIudmFsdWUsIHN0eWxlOiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgLi4uY29sdW1ucy5tYXAoKGMsIGopID0+ICh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxyXG4gICAgICAgICAgICBpbmRleDogaiArIDIsXHJcbiAgICAgICAgICAgIHZhbHVlOiBkYXRhICYmIGRhdGFbYy5rZXldICE9PSB1bmRlZmluZWQgPyBkYXRhW2Mua2V5XSA6IDAsXHJcbiAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgbnVtYmVyRm9ybWF0LFxyXG4gICAgICAgICAgICAgIGhBbGlnbjogJ3JpZ2h0JyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBhcyBDZWxsKSldXHJcbiAgICAgICAgfSBhcyBSb3c7XHJcbiAgICAgIH0pXTtcclxuICAgIGNvbnN0IGJvb2sgPSBuZXcgV29ya2Jvb2soXHJcbiAgICAgIHtcclxuICAgICAgICB3b3Jrc2hlZXRzOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGVuYWJsZVJ0bDogdGhpcy5fc2Vzc2lvbi5pbnZlcnNlLFxyXG4gICAgICAgICAgICBuYW1lOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdTaGVldE4nLCAxKSxcclxuICAgICAgICAgICAgY29sdW1uczogY29sdW1ucy5tYXAoKF8sIGkpID0+ICh7IGluZGV4OiBpICsgMSwgd2lkdGg6IDE1MCB9IGFzIENvbHVtbikpLFxyXG4gICAgICAgICAgICByb3dzLFxyXG4gICAgICAgICAgfSBhcyBXb3Jrc2hlZXRcclxuICAgICAgICBdXHJcbiAgICAgIH0sXHJcbiAgICAgICd4bHN4J1xyXG4gICAgKTtcclxuICAgIHRoaXMuX3NlcnZpY2UubmFtZU9mKHRoaXMuZmlsdGVycywgdGhpcy5jdWJlLm5hbWUpLnN1YnNjcmliZShuID0+XHJcbiAgICAgIGJvb2suc2F2ZShgJHtuIHx8IHRoaXMuX3RyYW5zbGF0ZS5nZXQoJ01hdHJpeCcpfS54bHN4YCkpO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBcclxuICAgKiBAcGFyYW0geFxyXG4gICAqIEBwYXJhbSB5XHJcbiAgICovXHJcbiAgX21vdmUoeCwgeSkge1xyXG4gICAgbGV0IHJvd0luZGV4ID0gMDtcclxuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgdGhpcy50YWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudC50Qm9kaWVzLmxlbmd0aDsgYisrKSB7XHJcbiAgICAgIGNvbnN0IHRCb2R5ID0gdGhpcy50YWJsZUVsZW1lbnQubmF0aXZlRWxlbWVudC50Qm9kaWVzLml0ZW0oYik7XHJcbiAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgdEJvZHkucm93cy5sZW5ndGg7IHIrKykge1xyXG4gICAgICAgIGNvbnN0IHJvdyA9IHRCb2R5LnJvd3MuaXRlbShyKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5jZWxscy5pdGVtKGMpO1xyXG4gICAgICAgICAgaWYgKGMgPT09IHgpXHJcbiAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnY2VsbC14Jyk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LnJlbW92ZSgnY2VsbC14Jyk7XHJcbiAgICAgICAgICBpZiAocm93SW5kZXggPT09IHkpXHJcbiAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnY2VsbC15Jyk7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LnJlbW92ZSgnY2VsbC15Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJvd0luZGV4Kys7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdEZvb3QgPSB0aGlzLnRhYmxlRWxlbWVudC5uYXRpdmVFbGVtZW50LnRGb290LCByb3cgPSB0Rm9vdC5yb3dzWzBdO1xyXG4gICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgIGNvbnN0IGNlbGwgPSByb3cuY2VsbHMuaXRlbShjKTtcclxuICAgICAgICBpZiAoYyA9PT0geClcclxuICAgICAgICAgIGNlbGwuY2xhc3NMaXN0LmFkZCgnY2VsbC14Jyk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgY2VsbC5jbGFzc0xpc3QucmVtb3ZlKCdjZWxsLXgnKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG50eXBlIERhdGFNYXAgPSB7IFtzZXJpZXM6IHN0cmluZ106IHsgW3hBeGlzOiBzdHJpbmddOiBudW1iZXI7IH07IH07XHJcblxyXG5leHBvcnQgdHlwZSBTdW1TZXR0aW5ncyA9IHtcclxuICBzdGFydE1vbnRoPzogbnVtYmVyO1xyXG4gIHZhbHVlPzogc3RyaW5nIHwgbnVtYmVyO1xyXG4gIGF4aXM6IEF4aXNUeXBlO1xyXG4gIHRpdGxlOiBzdHJpbmc7XHJcbiAgZm9ybWF0PzogRm9ybWF0VHlwZTtcclxuICBwcmVjaXNpb24/OiBzdHJpbmc7XHJcbiAgZXhwbG9yYWJsZT86IGJvb2xlYW47XHJcbiAgcGxhY2U/OiBBeGlzUGxhY2U7XHJcbiAgY2FsY3VsYXRlPzogQ2FsY3VsYXRlVHlwZTtcclxufVxyXG5leHBvcnQgZGVjbGFyZSB0eXBlIEZvcm1hdFR5cGUgPSAnUGVyY2VudCcgfCAnQ3VycmVuY3knIHwgJ051bWJlcic7XHJcbmV4cG9ydCBkZWNsYXJlIHR5cGUgQ2FsY3VsYXRlVHlwZSA9ICdRdWFydGVyJyB8ICdZZWFyJyB8ICdNb250aCcgfCAnU3VtJyB8IENhbGN1bGF0ZUZuO1xyXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQ2FsY3VsYXRlRm4ge1xyXG4gICh2YWx1ZTogc3RyaW5nLCBkYXRhOiB7IFtzZXJpZXM6IHN0cmluZ106IHsgW3hBeGlzOiBzdHJpbmddOiBudW1iZXI7IH07IH0pOiBudW1iZXI7XHJcbn1cclxuXHJcbnR5cGUgSGVhZGVySW5mbyA9IHtcclxuICBrZXk6IHN0cmluZztcclxuICB2YWx1ZTogYW55O1xyXG4gIHByZWNpc2lvbj86IHN0cmluZztcclxuICBleHBsb3JhYmxlPzogYm9vbGVhbjtcclxuICBhY2N1bXVsYXRlPzogYm9vbGVhbjtcclxuICBzdW0/OiBTdW1TZXR0aW5ncztcclxuICBpbmRleD86IEN1YmVJbmRleDtcclxufTtcclxuaW50ZXJmYWNlIENlbGwgeyB9XHJcblxyXG5mdW5jdGlvbiBldmFsU3VtU2V0dGluZ3Moc3VtOiBTdW1TZXR0aW5ncywgaW5kZXg6IG51bWJlciwgYXJyYXk6IFN1bVNldHRpbmdzW10pOiBTdW1TZXR0aW5ncyB7XHJcbiAgbGV0IHZhbHVlO1xyXG4gIGlmIChzdW0udmFsdWUpXHJcbiAgICB2YWx1ZSA9IHN1bS52YWx1ZS50b1N0cmluZygpO1xyXG4gIGVsc2UgaWYgKHN1bS5jYWxjdWxhdGUpXHJcbiAgICBzd2l0Y2ggKHN1bS5jYWxjdWxhdGUpIHtcclxuICAgICAgY2FzZSAnTW9udGgnOlxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGNvbnN0IG1vbnRoID0gbmV3IERhdGUoKS5nZXRNb250aCgpICsgMTtcclxuICAgICAgICAgIHZhbHVlID0gJ00nICsgKCcwJyArIG1vbnRoLnRvU3RyaW5nKCkpLnNsaWNlKC0yKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSAnWWVhcic6XHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgICAgICAgICBsZXQgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgIGlmIChzdW0uc3RhcnRNb250aCkge1xyXG4gICAgICAgICAgICBjb25zdCBtb250aCA9IGRhdGUuZ2V0TW9udGgoKSArIDE7XHJcbiAgICAgICAgICAgIGlmIChtb250aCA8IHN1bS5zdGFydE1vbnRoKVxyXG4gICAgICAgICAgICAgIHllYXIgLT0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHZhbHVlID0geWVhci50b1N0cmluZygpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICBjYXNlICdRdWFydGVyJzpcclxuICAgICAgICB7XHJcbiAgICAgICAgICBsZXQgbW9udGggPSBuZXcgRGF0ZSgpLmdldE1vbnRoKCkgKyAxO1xyXG4gICAgICAgICAgaWYgKHN1bS5zdGFydE1vbnRoICYmIHN1bS5zdGFydE1vbnRoID4gMSkgbW9udGggPSAxMiAtIHN1bS5zdGFydE1vbnRoID49IG1vbnRoID9cclxuICAgICAgICAgICAgMTIgLSBtb250aCArIHN1bS5zdGFydE1vbnRoXHJcbiAgICAgICAgICAgIDogbW9udGggLSBzdW0uc3RhcnRNb250aDtcclxuICAgICAgICAgIHZhbHVlID0gTWF0aC5jZWlsKG1vbnRoIC8gMykudG9TdHJpbmcoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgY2FzZSAnU3VtJzpcclxuICAgICAgICAvLyBncmVhdGVyIHRoYW4gYW55IGNoYXIsIHN1bXMgYWxsIGNvbHVtbnMgLyByb3dzXHJcbiAgICAgICAgdmFsdWUgPSAnfic7XHJcbiAgICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIC4uLnN1bSxcclxuICAgIHZhbHVlXHJcbiAgfTtcclxufVxyXG4iLCJAaWYgKGRhdGEpIHtcbiAgPHRhYmxlICN0YWJsZSBjbGFzcz1cIm1hdC1tZGMtdGFibGUgY3ViZS10YWJsZVwiIChtb3VzZWxlYXZlKT1cIl9tb3ZlKC0xLCAtMSlcIj5cbiAgICA8dGhlYWQ+XG4gICAgICA8IS0tIGhlYWRlcnMgLS0+XG4gICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLWhlYWRlci1yb3dcIj5cbiAgICAgICAgPHRoPjwvdGg+XG4gICAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zOyB0cmFjayBjb2x1bW47IGxldCB4ID0gJGluZGV4KSB7XG4gICAgICAgICAgPHRoXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJfbW92ZSh4ICsgMSwgLTIpXCIgY2xhc3M9XCJtYXQtbWRjLWhlYWRlci1jZWxsXCI+XG4gICAgICAgICAgICB7eyBjb2x1bW4udmFsdWUgfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICB9XG4gICAgICAgIDx0aCBjbGFzcz1cIm1hdC1tZGMtaGVhZGVyLWNlbGxcIj57e3hBeGlzVG90YWxMYWJlbH19PC90aD5cbiAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgICA8dGJvZHk+XG4gICAgICA8IS0tIHJvd3MgLS0+XG4gICAgICBAZm9yIChyb3cgb2Ygcm93czsgdHJhY2sgcm93OyBsZXQgeSA9ICRpbmRleCkge1xuICAgICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLXJvd1wiXG4gICAgICAgICAgW2NsYXNzLmN1YmUtaW5kZXhdPVwicm93LmluZGV4XCI+XG4gICAgICAgICAgPHRoIGNsYXNzPVwibWF0LW1kYy1oZWFkZXItY2VsbFwiIChtb3VzZWVudGVyKT1cIl9tb3ZlKC0yLCB5IClcIj57eyByb3cudmFsdWUgfX08L3RoPlxuICAgICAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5zOyB0cmFjayBjb2x1bW47IGxldCB4ID0gJGluZGV4KSB7XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWNlbGwgZmlndXJlXCJcbiAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiX21vdmUoeCArIDEsIHkgKVwiPlxuICAgICAgICAgICAgICBAaWYgKGRhdGFbcm93LmtleV1bY29sdW1uLmtleV0gIT09ICcwJykge1xuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZXhwbG9yYWJsZV09XCJpbnRlcmFjdGl2ZSAmJiBjb2x1bW4uZXhwbG9yYWJsZSAhPT0gZmFsc2UgJiYgcm93LmV4cGxvcmFibGUgIT09IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBsb3JlKGNvbHVtbiwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAge3sgZGF0YVtyb3cua2V5XVtjb2x1bW4ua2V5XSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgMFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8dGggY2xhc3M9XCJtYXQtbWRjLWNlbGwgZmlndXJlXCIgKG1vdXNlZW50ZXIpPVwiX21vdmUoLTEsIHkgKVwiPlxuICAgICAgICAgICAge3sgZGF0YVtyb3cua2V5XVsnX3RvdGFsJ10gfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgfVxuICAgIDwvdGJvZHk+XG4gICAgPHRmb290PlxuICAgICAgPCEtLSBmb290ZXIgLS0+XG4gICAgICA8dHIgY2xhc3M9XCJtYXQtbWRjLWZvb3Rlci1yb3dcIj5cbiAgICAgICAgPHRkIGNsYXNzPVwibWF0LW1kYy1mb290ZXItY2VsbFwiPnt7c2VyaWVzVG90YWxMYWJlbH19PC90ZD5cbiAgICAgICAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnM7IHRyYWNrIGNvbHVtbjsgbGV0IHggPSAkaW5kZXgpIHtcbiAgICAgICAgICA8dGQgY2xhc3M9XCJtYXQtbWRjLWZvb3Rlci1jZWxsIGZpZ3VyZVwiXG4gICAgICAgICAgICAobW91c2VlbnRlcik9XCJfbW92ZSh4ICsgMSwgLTIpXCJcbiAgICAgICAgICAgIFtjbGFzcy5uZWdhdGl2ZS1maWd1cmVdPVwidG90YWxzW2NvbHVtbi5rZXldLnN0YXJ0c1dpdGgoJy0nKVwiPlxuICAgICAgICAgICAgQGlmICh0b3RhbHNbY29sdW1uLmtleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB7eyB0b3RhbHNbY29sdW1uLmtleV0gfX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RkPlxuICAgICAgICB9XG4gICAgICAgIDx0aCBjbGFzcz1cIm1hdC1tZGMtZm9vdGVyLWNlbGwgZmlndXJlXCI+e3sgdG90YWxzWydfZ3JhbmQnXSB9fTwvdGg+XG4gICAgICA8L3RyPlxuICAgIDwvdGZvb3Q+XG4gIDwvdGFibGU+XG59XG4iXX0=