@alfresco/aca-content 5.1.1 → 5.2.0

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 (396) hide show
  1. package/assets/app.extensions.json +9 -0
  2. package/assets/i18n/ar.json +600 -599
  3. package/assets/i18n/cs.json +600 -599
  4. package/assets/i18n/da.json +600 -599
  5. package/assets/i18n/de.json +600 -599
  6. package/assets/i18n/en.json +40 -1
  7. package/assets/i18n/es.json +600 -599
  8. package/assets/i18n/fi.json +600 -599
  9. package/assets/i18n/fr.json +600 -599
  10. package/assets/i18n/it.json +600 -599
  11. package/assets/i18n/ja.json +600 -599
  12. package/assets/i18n/nb.json +600 -599
  13. package/assets/i18n/nl.json +600 -599
  14. package/assets/i18n/pl.json +600 -599
  15. package/assets/i18n/pt-BR.json +600 -599
  16. package/assets/i18n/ru.json +600 -599
  17. package/assets/i18n/sv.json +600 -599
  18. package/assets/i18n/zh-CN.json +600 -599
  19. package/esm2022/about/about.component.mjs +70 -0
  20. package/esm2022/about/aca-about.module.mjs +47 -0
  21. package/esm2022/folder-rules/folder-rules.module.mjs +116 -0
  22. package/esm2022/folder-rules/manage-rules/manage-rules.smart-component.mjs +280 -0
  23. package/esm2022/folder-rules/rule-details/actions/rule-action-list.ui-component.mjs +117 -0
  24. package/esm2022/folder-rules/rule-details/actions/rule-action.ui-component.mjs +359 -0
  25. package/esm2022/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.mjs +171 -0
  26. package/esm2022/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.mjs +237 -0
  27. package/esm2022/folder-rules/rule-details/edit-rule-dialog.ui-component.mjs +80 -0
  28. package/esm2022/folder-rules/rule-details/options/rule-options.ui-component.mjs +129 -0
  29. package/esm2022/folder-rules/rule-details/rule-details.ui-component.mjs +192 -0
  30. package/esm2022/folder-rules/rule-details/triggers/rule-triggers.ui-component.mjs +87 -0
  31. package/esm2022/folder-rules/rule-details/validators/rule-actions.validator.mjs +36 -0
  32. package/esm2022/folder-rules/rule-list/rule-list/rule-list.ui-component.mjs +166 -0
  33. package/esm2022/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.mjs +80 -0
  34. package/esm2022/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.mjs +59 -0
  35. package/esm2022/folder-rules/rule-set-picker/rule-set-picker.smart-component.mjs +125 -0
  36. package/esm2022/folder-rules/services/actions.service.mjs +117 -0
  37. package/esm2022/folder-rules/services/folder-rule-sets.service.mjs +230 -0
  38. package/esm2022/folder-rules/services/folder-rules.service.mjs +195 -0
  39. package/esm2022/lib/aca-content.module.mjs +303 -0
  40. package/esm2022/lib/aca-content.routes.mjs +369 -0
  41. package/esm2022/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.mjs +82 -0
  42. package/{esm2020 → esm2022}/lib/components/common/language-picker/language-picker.component.mjs +9 -8
  43. package/esm2022/lib/components/common/location-link/location-link.component.mjs +182 -0
  44. package/{esm2020 → esm2022}/lib/components/common/logout/logout.component.mjs +8 -6
  45. package/esm2022/lib/components/common/toggle-shared/toggle-shared.component.mjs +81 -0
  46. package/esm2022/lib/components/common/user-info/user-info.component.mjs +46 -0
  47. package/esm2022/lib/components/context-menu/base-context-menu.directive.mjs +77 -0
  48. package/esm2022/lib/components/context-menu/context-menu-item.component.mjs +65 -0
  49. package/esm2022/lib/components/context-menu/context-menu-outside-event.directive.mjs +62 -0
  50. package/esm2022/lib/components/context-menu/context-menu-overlay.mjs +33 -0
  51. package/esm2022/lib/components/context-menu/context-menu.component.mjs +84 -0
  52. package/esm2022/lib/components/context-menu/context-menu.service.mjs +127 -0
  53. package/esm2022/lib/components/context-menu/custom-context-menu-actions.token.mjs +26 -0
  54. package/esm2022/lib/components/context-menu/custom-context-menu.component.mjs +79 -0
  55. package/esm2022/lib/components/details/details.component.mjs +154 -0
  56. package/esm2022/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.mjs +75 -0
  57. package/esm2022/lib/components/dl-custom-components/name-column/name-column.component.mjs +106 -0
  58. package/esm2022/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +52 -0
  59. package/esm2022/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +77 -0
  60. package/esm2022/lib/components/favorite-libraries/favorite-libraries.component.mjs +126 -0
  61. package/esm2022/lib/components/favorites/favorites.component.mjs +105 -0
  62. package/esm2022/lib/components/files/files.component.mjs +336 -0
  63. package/esm2022/lib/components/home/home.component.mjs +46 -0
  64. package/esm2022/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +62 -0
  65. package/esm2022/lib/components/info-drawer/info.drawer.module.mjs +74 -0
  66. package/esm2022/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +213 -0
  67. package/esm2022/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +47 -0
  68. package/esm2022/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +145 -0
  69. package/esm2022/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +107 -0
  70. package/esm2022/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.mjs +135 -0
  71. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.mjs +181 -0
  72. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.mjs +77 -0
  73. package/esm2022/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.mjs +210 -0
  74. package/esm2022/lib/components/libraries/libraries.component.mjs +81 -0
  75. package/esm2022/lib/components/recent-files/recent-files.component.mjs +80 -0
  76. package/esm2022/lib/components/search/search-action-menu/search-action-menu.component.mjs +66 -0
  77. package/esm2022/lib/components/search/search-input/search-input.component.mjs +297 -0
  78. package/esm2022/lib/components/search/search-input-control/search-input-control.component.mjs +94 -0
  79. package/esm2022/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +93 -0
  80. package/esm2022/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +155 -0
  81. package/esm2022/lib/components/search/search-navigation.service.mjs +62 -0
  82. package/esm2022/lib/components/search/search-results/search-results.component.mjs +279 -0
  83. package/esm2022/lib/components/search/search-results-row/search-results-row.component.mjs +149 -0
  84. package/esm2022/lib/components/search/search-save/dialog/delete/saved-search-delete-dialog.component.mjs +82 -0
  85. package/esm2022/lib/components/search/search-save/dialog/edit/saved-search-edit-dialog.component.mjs +116 -0
  86. package/esm2022/lib/components/search/search-save/dialog/save-search-dialog.component.mjs +125 -0
  87. package/esm2022/lib/components/search/search-save/dialog/saved-search-form.interface.mjs +25 -0
  88. package/esm2022/lib/components/search/search-save/dialog/unique-search-name-validator.mjs +45 -0
  89. package/esm2022/lib/components/search/search-save/directive/save-search.directive.mjs +64 -0
  90. package/esm2022/lib/components/search/search-save/list/saved-searches-list-ui.service.mjs +51 -0
  91. package/esm2022/lib/components/search/search-save/list/smart-list/saved-searches-list-schema.mjs +44 -0
  92. package/esm2022/lib/components/search/search-save/list/smart-list/saved-searches-smart-list.component.mjs +50 -0
  93. package/esm2022/lib/components/search/search-save/list/ui-list/saved-searches-list.ui-component.mjs +153 -0
  94. package/esm2022/lib/components/search/search-save/sidenav/save-search-sidenav.component.mjs +94 -0
  95. package/esm2022/lib/components/shared-files/shared-files.component.mjs +85 -0
  96. package/esm2022/lib/components/shared-link-view/shared-link-view.component.mjs +89 -0
  97. package/esm2022/lib/components/sidenav/components/button-menu.component.mjs +66 -0
  98. package/esm2022/lib/components/sidenav/components/expand-menu.component.mjs +73 -0
  99. package/esm2022/lib/components/sidenav/components/sidenav-header.component.mjs +65 -0
  100. package/esm2022/lib/components/sidenav/directives/action.directive.mjs +86 -0
  101. package/esm2022/lib/components/sidenav/directives/active-link.directive.mjs +100 -0
  102. package/esm2022/lib/components/sidenav/directives/expansion-panel.directive.mjs +107 -0
  103. package/esm2022/lib/components/sidenav/directives/menu-panel.directive.mjs +103 -0
  104. package/esm2022/lib/components/sidenav/sidenav.component.mjs +101 -0
  105. package/esm2022/lib/components/sidenav/user-menu/user-menu.component.mjs +57 -0
  106. package/esm2022/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +143 -0
  107. package/esm2022/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +91 -0
  108. package/esm2022/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +112 -0
  109. package/esm2022/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +77 -0
  110. package/esm2022/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +107 -0
  111. package/{esm2020 → esm2022}/lib/components/toolbar/toggle-join-library/toggle-join-library-menu.component.mjs +7 -6
  112. package/esm2022/lib/components/toolbar/view-node/view-node.component.mjs +128 -0
  113. package/esm2022/lib/components/trashcan/trashcan.component.mjs +66 -0
  114. package/esm2022/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +55 -0
  115. package/esm2022/lib/components/view-profile/view-profile.component.mjs +200 -0
  116. package/esm2022/lib/dialogs/node-template/create-from-template.dialog.mjs +127 -0
  117. package/esm2022/lib/directives/document-list.directive.mjs +207 -0
  118. package/esm2022/lib/extensions/core.extensions.module.mjs +56 -0
  119. package/esm2022/lib/services/content-management.service.mjs +892 -0
  120. package/esm2022/lib/services/content-url.service.mjs +74 -0
  121. package/esm2022/lib/services/modal-ai.service.mjs +65 -0
  122. package/esm2022/lib/services/node-actions.service.mjs +609 -0
  123. package/esm2022/lib/services/node-template.service.mjs +145 -0
  124. package/esm2022/lib/services/search-ai-navigation.service.mjs +63 -0
  125. package/esm2022/lib/store/app-store.module.mjs +101 -0
  126. package/esm2022/lib/store/effects/app.effects.mjs +46 -0
  127. package/esm2022/lib/store/effects/contextmenu.effects.mjs +65 -0
  128. package/esm2022/lib/store/effects/download.effects.mjs +153 -0
  129. package/esm2022/lib/store/effects/favorite.effects.mjs +72 -0
  130. package/esm2022/lib/store/effects/library.effects.mjs +108 -0
  131. package/esm2022/lib/store/effects/node.effects.mjs +318 -0
  132. package/esm2022/lib/store/effects/search-ai.effects.mjs +54 -0
  133. package/esm2022/lib/store/effects/search.effects.mjs +52 -0
  134. package/esm2022/lib/store/effects/template.effects.mjs +116 -0
  135. package/esm2022/lib/store/effects/upload.effects.mjs +166 -0
  136. package/esm2022/lib/store/effects/viewer.effects.mjs +169 -0
  137. package/esm2022/lib/utils/aca-search-utils.mjs +129 -0
  138. package/esm2022/ms-office/actions/aos.actions.mjs +32 -0
  139. package/esm2022/ms-office/aos-extension.module.mjs +53 -0
  140. package/esm2022/ms-office/aos-extension.service.mjs +136 -0
  141. package/esm2022/ms-office/effects/aos.effects.mjs +45 -0
  142. package/esm2022/public-api.mjs +33 -0
  143. package/esm2022/viewer/lib/components/preview/preview.component.mjs +246 -0
  144. package/esm2022/viewer/lib/components/viewer/viewer.component.mjs +261 -0
  145. package/esm2022/viewer/lib/services/viewer.service.mjs +229 -0
  146. package/esm2022/viewer/lib/viewer.module.mjs +53 -0
  147. package/{fesm2015 → fesm2022}/alfresco-aca-content-about.mjs +17 -19
  148. package/fesm2022/alfresco-aca-content-about.mjs.map +1 -0
  149. package/{fesm2020 → fesm2022}/alfresco-aca-content-folder-rules.mjs +357 -316
  150. package/fesm2022/alfresco-aca-content-folder-rules.mjs.map +1 -0
  151. package/{fesm2020 → fesm2022}/alfresco-aca-content-ms-office.mjs +28 -26
  152. package/fesm2022/alfresco-aca-content-ms-office.mjs.map +1 -0
  153. package/{fesm2020 → fesm2022}/alfresco-aca-content-viewer.mjs +95 -64
  154. package/fesm2022/alfresco-aca-content-viewer.mjs.map +1 -0
  155. package/fesm2022/alfresco-aca-content.mjs +11091 -0
  156. package/fesm2022/alfresco-aca-content.mjs.map +1 -0
  157. package/folder-rules/rule-details/actions/rule-action-list.ui-component.d.ts +1 -1
  158. package/folder-rules/rule-details/actions/rule-action.ui-component.d.ts +1 -1
  159. package/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.d.ts +1 -1
  160. package/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.d.ts +1 -1
  161. package/folder-rules/rule-details/options/rule-options.ui-component.d.ts +1 -1
  162. package/folder-rules/rule-details/rule-details.ui-component.d.ts +1 -1
  163. package/folder-rules/rule-list/rule-list/rule-list.ui-component.d.ts +1 -1
  164. package/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.d.ts +1 -1
  165. package/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.d.ts +1 -1
  166. package/folder-rules/services/folder-rule-sets.service.d.ts +4 -4
  167. package/folder-rules/services/folder-rules.service.d.ts +1 -1
  168. package/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.d.ts +5 -10
  169. package/lib/components/common/location-link/location-link.component.d.ts +1 -1
  170. package/lib/components/common/toggle-shared/toggle-shared.component.d.ts +1 -1
  171. package/lib/components/context-menu/base-context-menu.directive.d.ts +20 -0
  172. package/lib/components/context-menu/context-menu-item.component.d.ts +1 -1
  173. package/lib/components/context-menu/context-menu-outside-event.directive.d.ts +1 -1
  174. package/lib/components/context-menu/context-menu.component.d.ts +4 -15
  175. package/lib/components/context-menu/context-menu.service.d.ts +4 -1
  176. package/lib/components/{knowledge-retrieval/search-ai/search-ai-utils.d.ts → context-menu/custom-context-menu-actions.token.d.ts} +2 -2
  177. package/lib/components/context-menu/custom-context-menu.component.d.ts +36 -0
  178. package/lib/components/details/details.component.d.ts +1 -1
  179. package/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.d.ts +1 -1
  180. package/lib/components/dl-custom-components/tags-column/tags-column.component.d.ts +1 -1
  181. package/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.d.ts +1 -1
  182. package/lib/components/info-drawer/comments-tab/comments-tab.component.d.ts +1 -1
  183. package/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.d.ts +1 -1
  184. package/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.d.ts +1 -1
  185. package/lib/components/info-drawer/metadata-tab/metadata-tab.component.d.ts +1 -1
  186. package/lib/components/info-drawer/versions-tab/versions-tab.component.d.ts +1 -1
  187. package/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.d.ts +1 -2
  188. package/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.d.ts +4 -5
  189. package/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.d.ts +8 -8
  190. package/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.d.ts +2 -3
  191. package/lib/components/search/search-input/search-input.component.d.ts +12 -14
  192. package/lib/components/search/search-input-control/search-input-control.component.d.ts +1 -1
  193. package/lib/components/search/search-libraries-results/search-libraries-results.component.d.ts +0 -1
  194. package/lib/components/search/search-results/search-results.component.d.ts +15 -9
  195. package/lib/components/search/search-results-row/search-results-row.component.d.ts +1 -1
  196. package/lib/components/search/search-save/dialog/delete/saved-search-delete-dialog.component.d.ts +16 -0
  197. package/lib/components/search/search-save/dialog/edit/saved-search-edit-dialog.component.d.ts +22 -0
  198. package/lib/components/search/search-save/dialog/save-search-dialog.component.d.ts +23 -0
  199. package/lib/components/search/search-save/dialog/saved-search-form.interface.d.ts +28 -0
  200. package/lib/components/search/search-save/dialog/unique-search-name-validator.d.ts +34 -0
  201. package/lib/components/search/search-save/directive/save-search.directive.d.ts +13 -0
  202. package/lib/components/search/search-save/list/saved-searches-list-ui.service.d.ts +9 -0
  203. package/lib/components/search/search-save/list/smart-list/saved-searches-list-schema.d.ts +33 -0
  204. package/lib/components/search/search-save/list/smart-list/saved-searches-smart-list.component.d.ts +13 -0
  205. package/lib/components/search/search-save/list/ui-list/saved-searches-list.ui-component.d.ts +66 -0
  206. package/lib/components/search/search-save/sidenav/save-search-sidenav.component.d.ts +44 -0
  207. package/lib/components/sidenav/components/button-menu.component.d.ts +1 -1
  208. package/lib/components/sidenav/components/expand-menu.component.d.ts +3 -2
  209. package/lib/components/sidenav/directives/action.directive.d.ts +28 -1
  210. package/lib/components/sidenav/directives/active-link.directive.d.ts +2 -2
  211. package/lib/components/sidenav/directives/expansion-panel.directive.d.ts +1 -1
  212. package/lib/components/sidenav/directives/menu-panel.directive.d.ts +1 -1
  213. package/lib/components/sidenav/sidenav.component.d.ts +4 -3
  214. package/lib/components/sidenav/user-menu/user-menu.component.d.ts +1 -1
  215. package/lib/components/toolbar/toggle-favorite/toggle-favorite.component.d.ts +1 -1
  216. package/lib/components/toolbar/view-node/view-node.component.d.ts +1 -1
  217. package/lib/services/search-ai-navigation.service.d.ts +4 -2
  218. package/lib/store/effects/app.effects.d.ts +2 -3
  219. package/lib/store/effects/contextmenu.effects.d.ts +3 -3
  220. package/lib/store/effects/download.effects.d.ts +0 -30
  221. package/lib/store/effects/favorite.effects.d.ts +0 -28
  222. package/lib/store/effects/library.effects.d.ts +2 -7
  223. package/lib/store/effects/node.effects.d.ts +7 -38
  224. package/lib/store/effects/search-ai.effects.d.ts +0 -4
  225. package/lib/store/effects/search.effects.d.ts +3 -30
  226. package/lib/store/effects/template.effects.d.ts +5 -7
  227. package/lib/store/effects/upload.effects.d.ts +8 -32
  228. package/lib/store/effects/viewer.effects.d.ts +0 -29
  229. package/lib/utils/aca-search-utils.d.ts +67 -0
  230. package/ms-office/effects/aos.effects.d.ts +0 -3
  231. package/package.json +21 -35
  232. package/public-api.d.ts +1 -0
  233. package/ui/overrides/adf-pagination.theme.scss +0 -4
  234. package/ui/theme.scss +9 -4
  235. package/assets/images/agent-avatar-blue.png +0 -0
  236. package/assets/images/agent-avatar-gold.png +0 -0
  237. package/assets/images/agent-avatar-pink.png +0 -0
  238. package/esm2020/about/about.component.mjs +0 -71
  239. package/esm2020/about/aca-about.module.mjs +0 -46
  240. package/esm2020/folder-rules/folder-rules.module.mjs +0 -115
  241. package/esm2020/folder-rules/manage-rules/manage-rules.smart-component.mjs +0 -261
  242. package/esm2020/folder-rules/rule-details/actions/rule-action-list.ui-component.mjs +0 -117
  243. package/esm2020/folder-rules/rule-details/actions/rule-action.ui-component.mjs +0 -351
  244. package/esm2020/folder-rules/rule-details/conditions/rule-composite-condition.ui-component.mjs +0 -172
  245. package/esm2020/folder-rules/rule-details/conditions/rule-simple-condition.ui-component.mjs +0 -234
  246. package/esm2020/folder-rules/rule-details/edit-rule-dialog.ui-component.mjs +0 -74
  247. package/esm2020/folder-rules/rule-details/options/rule-options.ui-component.mjs +0 -129
  248. package/esm2020/folder-rules/rule-details/rule-details.ui-component.mjs +0 -185
  249. package/esm2020/folder-rules/rule-details/triggers/rule-triggers.ui-component.mjs +0 -88
  250. package/esm2020/folder-rules/rule-details/validators/rule-actions.validator.mjs +0 -37
  251. package/esm2020/folder-rules/rule-list/rule-list/rule-list.ui-component.mjs +0 -164
  252. package/esm2020/folder-rules/rule-list/rule-list-grouping/rule-list-grouping.ui-component.mjs +0 -81
  253. package/esm2020/folder-rules/rule-list/rule-list-item/rule-list-item.ui-component.mjs +0 -58
  254. package/esm2020/folder-rules/rule-set-picker/rule-set-picker.smart-component.mjs +0 -120
  255. package/esm2020/folder-rules/services/actions.service.mjs +0 -114
  256. package/esm2020/folder-rules/services/folder-rule-sets.service.mjs +0 -225
  257. package/esm2020/folder-rules/services/folder-rules.service.mjs +0 -193
  258. package/esm2020/lib/aca-content.module.mjs +0 -299
  259. package/esm2020/lib/aca-content.routes.mjs +0 -359
  260. package/esm2020/lib/components/bulk-actions-dropdown/bulk-actions-dropdown.component.mjs +0 -83
  261. package/esm2020/lib/components/common/location-link/location-link.component.mjs +0 -180
  262. package/esm2020/lib/components/common/toggle-shared/toggle-shared.component.mjs +0 -76
  263. package/esm2020/lib/components/common/user-info/user-info.component.mjs +0 -47
  264. package/esm2020/lib/components/context-menu/context-menu-item.component.mjs +0 -62
  265. package/esm2020/lib/components/context-menu/context-menu-outside-event.directive.mjs +0 -63
  266. package/esm2020/lib/components/context-menu/context-menu-overlay.mjs +0 -32
  267. package/esm2020/lib/components/context-menu/context-menu.component.mjs +0 -114
  268. package/esm2020/lib/components/context-menu/context-menu.service.mjs +0 -99
  269. package/esm2020/lib/components/details/details.component.mjs +0 -147
  270. package/esm2020/lib/components/dl-custom-components/datatable-cell-badges/datatable-cell-badges.component.mjs +0 -71
  271. package/esm2020/lib/components/dl-custom-components/name-column/name-column.component.mjs +0 -101
  272. package/esm2020/lib/components/dl-custom-components/tags-column/tags-column.component.mjs +0 -48
  273. package/esm2020/lib/components/dl-custom-components/thumbnail-column/thumbnail-column.component.mjs +0 -75
  274. package/esm2020/lib/components/favorite-libraries/favorite-libraries.component.mjs +0 -120
  275. package/esm2020/lib/components/favorites/favorites.component.mjs +0 -103
  276. package/esm2020/lib/components/files/files.component.mjs +0 -330
  277. package/esm2020/lib/components/home/home.component.mjs +0 -47
  278. package/esm2020/lib/components/info-drawer/comments-tab/comments-tab.component.mjs +0 -59
  279. package/esm2020/lib/components/info-drawer/info.drawer.module.mjs +0 -73
  280. package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-form.component.mjs +0 -206
  281. package/esm2020/lib/components/info-drawer/library-metadata-tab/library-metadata-tab.component.mjs +0 -45
  282. package/esm2020/lib/components/info-drawer/metadata-tab/metadata-tab.component.mjs +0 -134
  283. package/esm2020/lib/components/info-drawer/versions-tab/versions-tab.component.mjs +0 -95
  284. package/esm2020/lib/components/knowledge-retrieval/search-ai/agents-button/agents-button.component.mjs +0 -129
  285. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-input/search-ai-input.component.mjs +0 -171
  286. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-input-container/search-ai-input-container.component.mjs +0 -82
  287. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-results/search-ai-results.component.mjs +0 -199
  288. package/esm2020/lib/components/knowledge-retrieval/search-ai/search-ai-utils.mjs +0 -33
  289. package/esm2020/lib/components/libraries/libraries.component.mjs +0 -79
  290. package/esm2020/lib/components/recent-files/recent-files.component.mjs +0 -82
  291. package/esm2020/lib/components/search/search-action-menu/search-action-menu.component.mjs +0 -64
  292. package/esm2020/lib/components/search/search-input/search-input.component.mjs +0 -301
  293. package/esm2020/lib/components/search/search-input-control/search-input-control.component.mjs +0 -94
  294. package/esm2020/lib/components/search/search-libraries-results/search-libraries-query-builder.service.mjs +0 -90
  295. package/esm2020/lib/components/search/search-libraries-results/search-libraries-results.component.mjs +0 -153
  296. package/esm2020/lib/components/search/search-navigation.service.mjs +0 -60
  297. package/esm2020/lib/components/search/search-results/search-results.component.mjs +0 -255
  298. package/esm2020/lib/components/search/search-results-row/search-results-row.component.mjs +0 -142
  299. package/esm2020/lib/components/shared-files/shared-files.component.mjs +0 -83
  300. package/esm2020/lib/components/shared-link-view/shared-link-view.component.mjs +0 -82
  301. package/esm2020/lib/components/sidenav/components/button-menu.component.mjs +0 -62
  302. package/esm2020/lib/components/sidenav/components/expand-menu.component.mjs +0 -67
  303. package/esm2020/lib/components/sidenav/components/sidenav-header.component.mjs +0 -66
  304. package/esm2020/lib/components/sidenav/directives/action.directive.mjs +0 -75
  305. package/esm2020/lib/components/sidenav/directives/active-link.directive.mjs +0 -93
  306. package/esm2020/lib/components/sidenav/directives/expansion-panel.directive.mjs +0 -102
  307. package/esm2020/lib/components/sidenav/directives/menu-panel.directive.mjs +0 -99
  308. package/esm2020/lib/components/sidenav/sidenav.component.mjs +0 -89
  309. package/esm2020/lib/components/sidenav/user-menu/user-menu.component.mjs +0 -56
  310. package/esm2020/lib/components/toolbar/toggle-edit-offline/toggle-edit-offline.component.mjs +0 -137
  311. package/esm2020/lib/components/toolbar/toggle-favorite/toggle-favorite.component.mjs +0 -86
  312. package/esm2020/lib/components/toolbar/toggle-favorite-library/toggle-favorite-library.component.mjs +0 -107
  313. package/esm2020/lib/components/toolbar/toggle-info-drawer/toggle-info-drawer.component.mjs +0 -74
  314. package/esm2020/lib/components/toolbar/toggle-join-library/toggle-join-library-button.component.mjs +0 -105
  315. package/esm2020/lib/components/toolbar/view-node/view-node.component.mjs +0 -122
  316. package/esm2020/lib/components/trashcan/trashcan.component.mjs +0 -68
  317. package/esm2020/lib/components/upload-files-dialog/upload-files-dialog.component.mjs +0 -52
  318. package/esm2020/lib/components/view-profile/view-profile.component.mjs +0 -193
  319. package/esm2020/lib/dialogs/node-template/create-from-template.dialog.mjs +0 -120
  320. package/esm2020/lib/directives/document-list.directive.mjs +0 -199
  321. package/esm2020/lib/extensions/core.extensions.module.mjs +0 -55
  322. package/esm2020/lib/services/content-management.service.mjs +0 -873
  323. package/esm2020/lib/services/content-url.service.mjs +0 -71
  324. package/esm2020/lib/services/modal-ai.service.mjs +0 -66
  325. package/esm2020/lib/services/node-actions.service.mjs +0 -600
  326. package/esm2020/lib/services/node-template.service.mjs +0 -144
  327. package/esm2020/lib/services/search-ai-navigation.service.mjs +0 -52
  328. package/esm2020/lib/store/app-store.module.mjs +0 -102
  329. package/esm2020/lib/store/effects/app.effects.mjs +0 -49
  330. package/esm2020/lib/store/effects/contextmenu.effects.mjs +0 -55
  331. package/esm2020/lib/store/effects/download.effects.mjs +0 -159
  332. package/esm2020/lib/store/effects/favorite.effects.mjs +0 -76
  333. package/esm2020/lib/store/effects/library.effects.mjs +0 -113
  334. package/esm2020/lib/store/effects/node.effects.mjs +0 -325
  335. package/esm2020/lib/store/effects/search-ai.effects.mjs +0 -57
  336. package/esm2020/lib/store/effects/search.effects.mjs +0 -60
  337. package/esm2020/lib/store/effects/template.effects.mjs +0 -121
  338. package/esm2020/lib/store/effects/upload.effects.mjs +0 -166
  339. package/esm2020/lib/store/effects/viewer.effects.mjs +0 -175
  340. package/esm2020/ms-office/actions/aos.actions.mjs +0 -31
  341. package/esm2020/ms-office/aos-extension.module.mjs +0 -52
  342. package/esm2020/ms-office/aos-extension.service.mjs +0 -132
  343. package/esm2020/ms-office/effects/aos.effects.mjs +0 -48
  344. package/esm2020/public-api.mjs +0 -32
  345. package/esm2020/viewer/lib/components/preview/preview.component.mjs +0 -236
  346. package/esm2020/viewer/lib/components/viewer/viewer.component.mjs +0 -240
  347. package/esm2020/viewer/lib/services/viewer.service.mjs +0 -226
  348. package/esm2020/viewer/lib/viewer.module.mjs +0 -52
  349. package/fesm2015/alfresco-aca-content-about.mjs.map +0 -1
  350. package/fesm2015/alfresco-aca-content-folder-rules.mjs +0 -2662
  351. package/fesm2015/alfresco-aca-content-folder-rules.mjs.map +0 -1
  352. package/fesm2015/alfresco-aca-content-ms-office.mjs +0 -256
  353. package/fesm2015/alfresco-aca-content-ms-office.mjs.map +0 -1
  354. package/fesm2015/alfresco-aca-content-viewer.mjs +0 -700
  355. package/fesm2015/alfresco-aca-content-viewer.mjs.map +0 -1
  356. package/fesm2015/alfresco-aca-content.mjs +0 -9835
  357. package/fesm2015/alfresco-aca-content.mjs.map +0 -1
  358. package/fesm2020/alfresco-aca-content-about.mjs +0 -193
  359. package/fesm2020/alfresco-aca-content-about.mjs.map +0 -1
  360. package/fesm2020/alfresco-aca-content-folder-rules.mjs.map +0 -1
  361. package/fesm2020/alfresco-aca-content-ms-office.mjs.map +0 -1
  362. package/fesm2020/alfresco-aca-content-viewer.mjs.map +0 -1
  363. package/fesm2020/alfresco-aca-content.mjs +0 -9934
  364. package/fesm2020/alfresco-aca-content.mjs.map +0 -1
  365. /package/{esm2020 → esm2022}/about/alfresco-aca-content-about.mjs +0 -0
  366. /package/{esm2020 → esm2022}/about/dev-mode.tokens.mjs +0 -0
  367. /package/{esm2020 → esm2022}/about/package-json.token.mjs +0 -0
  368. /package/{esm2020 → esm2022}/about/public-api.mjs +0 -0
  369. /package/{esm2020 → esm2022}/alfresco-aca-content.mjs +0 -0
  370. /package/{esm2020 → esm2022}/folder-rules/alfresco-aca-content-folder-rules.mjs +0 -0
  371. /package/{esm2020 → esm2022}/folder-rules/folder-rules.rules.mjs +0 -0
  372. /package/{esm2020 → esm2022}/folder-rules/model/action-parameter-constraint.model.mjs +0 -0
  373. /package/{esm2020 → esm2022}/folder-rules/model/rule-action.model.mjs +0 -0
  374. /package/{esm2020 → esm2022}/folder-rules/model/rule-composite-condition.model.mjs +0 -0
  375. /package/{esm2020 → esm2022}/folder-rules/model/rule-grouping-item.model.mjs +0 -0
  376. /package/{esm2020 → esm2022}/folder-rules/model/rule-set.model.mjs +0 -0
  377. /package/{esm2020 → esm2022}/folder-rules/model/rule-simple-condition.model.mjs +0 -0
  378. /package/{esm2020 → esm2022}/folder-rules/model/rule.model.mjs +0 -0
  379. /package/{esm2020 → esm2022}/folder-rules/public-api.mjs +0 -0
  380. /package/{esm2020 → esm2022}/folder-rules/rule-details/conditions/rule-condition-comparators.mjs +0 -0
  381. /package/{esm2020 → esm2022}/folder-rules/rule-details/conditions/rule-condition-fields.mjs +0 -0
  382. /package/{esm2020 → esm2022}/folder-rules/rule-details/validators/rule-composite-condition.validator.mjs +0 -0
  383. /package/{esm2020 → esm2022}/lib/components/common/index.mjs +0 -0
  384. /package/{esm2020 → esm2022}/lib/components/context-menu/direction.token.mjs +0 -0
  385. /package/{esm2020 → esm2022}/lib/components/context-menu/interfaces.mjs +0 -0
  386. /package/{esm2020 → esm2022}/lib/components/search/index.mjs +0 -0
  387. /package/{esm2020 → esm2022}/lib/components/sidenav/index.mjs +0 -0
  388. /package/{esm2020 → esm2022}/lib/components/toolbar/index.mjs +0 -0
  389. /package/{esm2020 → esm2022}/lib/components/view-profile/view-profile.guard.mjs +0 -0
  390. /package/{esm2020 → esm2022}/lib/store/effects.mjs +0 -0
  391. /package/{esm2020 → esm2022}/lib/store/initial-state.mjs +0 -0
  392. /package/{esm2020 → esm2022}/lib/store/reducers/app.reducer.mjs +0 -0
  393. /package/{esm2020 → esm2022}/ms-office/alfresco-aca-content-ms-office.mjs +0 -0
  394. /package/{esm2020 → esm2022}/ms-office/public-api.mjs +0 -0
  395. /package/{esm2020 → esm2022}/viewer/alfresco-aca-content-viewer.mjs +0 -0
  396. /package/{esm2020 → esm2022}/viewer/public-api.mjs +0 -0
@@ -0,0 +1,892 @@
1
+ /*!
2
+ * Copyright © 2005-2024 Hyland Software, Inc. and its affiliates. All rights reserved.
3
+ *
4
+ * Alfresco Example Content Application
5
+ *
6
+ * This file is part of the Alfresco Example Content Application.
7
+ * If the software was purchased under a paid Alfresco license, the terms of
8
+ * the paid license agreement will prevail. Otherwise, the software is
9
+ * provided under the following open source license terms:
10
+ *
11
+ * The Alfresco Example Content Application is free software: you can redistribute it and/or modify
12
+ * it under the terms of the GNU Lesser General Public License as published by
13
+ * the Free Software Foundation, either version 3 of the License, or
14
+ * (at your option) any later version.
15
+ *
16
+ * The Alfresco Example Content Application is distributed in the hope that it will be useful,
17
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
+ * GNU Lesser General Public License for more details.
20
+ *
21
+ * You should have received a copy of the GNU Lesser General Public License
22
+ * from Hyland Software. If not, see <http://www.gnu.org/licenses/>.
23
+ */
24
+ import { AppHookService, AppSettingsService, ContentApiService, NodePermissionService } from '@alfresco/aca-shared';
25
+ import { getAppSelection, NavigateRouteAction, NavigateToParentFolder, RefreshPreviewAction, SetSelectedNodesAction, ShowLoaderAction, SnackbarErrorAction, SnackbarInfoAction, SnackbarUserAction, SnackbarWarningAction, UndoDeleteNodesAction, UnlockWriteAction, ViewNodeVersionAction } from '@alfresco/aca-shared/store';
26
+ import { DocumentListService, FolderDialogComponent, LibraryDialogComponent, NewVersionUploaderDataAction, NewVersionUploaderService, NodeAspectService, NodesApiService, ShareDialogComponent } from '@alfresco/adf-content-services';
27
+ import { NotificationService, TranslationService, ConfirmDialogComponent } from '@alfresco/adf-core';
28
+ import { inject, Injectable } from '@angular/core';
29
+ import { MatDialog } from '@angular/material/dialog';
30
+ import { Store } from '@ngrx/store';
31
+ import { forkJoin, of, zip } from 'rxjs';
32
+ import { catchError, map, mergeMap, take, tap } from 'rxjs/operators';
33
+ import { NodeActionsService } from './node-actions.service';
34
+ import { Router } from '@angular/router';
35
+ import * as i0 from "@angular/core";
36
+ import * as i1 from "@alfresco/adf-content-services";
37
+ import * as i2 from "@ngrx/store";
38
+ import * as i3 from "@alfresco/aca-shared";
39
+ import * as i4 from "@angular/material/dialog";
40
+ import * as i5 from "./node-actions.service";
41
+ import * as i6 from "@alfresco/adf-core";
42
+ import * as i7 from "@angular/router";
43
+ class ContentManagementService {
44
+ nodesApiService;
45
+ store;
46
+ contentApi;
47
+ permission;
48
+ dialogRef;
49
+ nodeActionsService;
50
+ translation;
51
+ nodeAspectService;
52
+ appHookService;
53
+ newVersionUploaderService;
54
+ router;
55
+ appSettingsService;
56
+ documentListService;
57
+ notificationService = inject(NotificationService);
58
+ createMenuButtonSelector = 'app-toolbar-menu button[id="app.toolbar.create"]';
59
+ constructor(nodesApiService, store, contentApi, permission, dialogRef, nodeActionsService, translation, nodeAspectService, appHookService, newVersionUploaderService, router, appSettingsService, documentListService) {
60
+ this.nodesApiService = nodesApiService;
61
+ this.store = store;
62
+ this.contentApi = contentApi;
63
+ this.permission = permission;
64
+ this.dialogRef = dialogRef;
65
+ this.nodeActionsService = nodeActionsService;
66
+ this.translation = translation;
67
+ this.nodeAspectService = nodeAspectService;
68
+ this.appHookService = appHookService;
69
+ this.newVersionUploaderService = newVersionUploaderService;
70
+ this.router = router;
71
+ this.appSettingsService = appSettingsService;
72
+ this.documentListService = documentListService;
73
+ }
74
+ addFavorite(nodes) {
75
+ if (nodes && nodes.length > 0) {
76
+ this.contentApi.addFavorite(nodes).subscribe(() => {
77
+ const favoriteNodes = nodes.map((node) => {
78
+ const newNode = JSON.parse(JSON.stringify(node));
79
+ newNode.entry.isFavorite = true;
80
+ return newNode;
81
+ });
82
+ this.store.dispatch(new SetSelectedNodesAction(favoriteNodes));
83
+ });
84
+ }
85
+ }
86
+ removeFavorite(nodes) {
87
+ if (nodes && nodes.length > 0) {
88
+ this.contentApi.removeFavorite(nodes).subscribe(() => {
89
+ const favoriteNodes = nodes.map((node) => {
90
+ const newNode = JSON.parse(JSON.stringify(node));
91
+ newNode.entry.isFavorite = false;
92
+ return newNode;
93
+ });
94
+ this.store.dispatch(new SetSelectedNodesAction(favoriteNodes));
95
+ });
96
+ }
97
+ }
98
+ manageVersions(node, focusedElementOnCloseSelector) {
99
+ if (node?.entry) {
100
+ // shared and favorite
101
+ const id = node.entry.nodeId || node.entry.guid;
102
+ if (id) {
103
+ this.contentApi.getNodeInfo(id).subscribe((entry) => {
104
+ this.openVersionManagerDialog(entry, focusedElementOnCloseSelector);
105
+ });
106
+ }
107
+ else {
108
+ this.openVersionManagerDialog(node.entry, focusedElementOnCloseSelector);
109
+ }
110
+ }
111
+ }
112
+ manageAspects(node, focusedElementOnCloseSelector) {
113
+ if (node?.entry) {
114
+ // shared and favorite
115
+ const id = node.entry.nodeId || node.entry.guid;
116
+ if (id) {
117
+ this.contentApi.getNodeInfo(id).subscribe((entry) => {
118
+ this.openAspectListDialog(entry, focusedElementOnCloseSelector);
119
+ });
120
+ }
121
+ else {
122
+ this.openAspectListDialog(node.entry, focusedElementOnCloseSelector);
123
+ }
124
+ }
125
+ }
126
+ versionUpdateDialog(node, file) {
127
+ this.contentApi.getNodeVersions(node.id).subscribe(({ list }) => {
128
+ const newVersionUploaderDialogData = {
129
+ node,
130
+ file,
131
+ currentVersion: list.entries[0].entry,
132
+ title: 'VERSION.DIALOG.TITLE',
133
+ showComments: this.appSettingsService.uploadAllowComments,
134
+ allowDownload: this.appSettingsService.uploadAllowDownload
135
+ };
136
+ const dialogConfig = { width: '600px' };
137
+ this.newVersionUploaderService.openUploadNewVersionDialog(newVersionUploaderDialogData, dialogConfig).subscribe((data) => {
138
+ if (data.action === NewVersionUploaderDataAction.upload) {
139
+ if (data.newVersion.value.entry.properties['cm:lockType'] === 'WRITE_LOCK') {
140
+ this.store.dispatch(new UnlockWriteAction(data.newVersion.value));
141
+ }
142
+ }
143
+ }, (error) => this.notificationService.showError(error));
144
+ });
145
+ }
146
+ shareNode(node, focusedElementOnCloseSelector) {
147
+ if (node?.entry) {
148
+ // shared and favorite
149
+ const id = node.entry.nodeId || node.entry.guid;
150
+ if (id) {
151
+ this.contentApi.getNodeInfo(id).subscribe((entry) => {
152
+ this.openShareLinkDialog({ entry }, focusedElementOnCloseSelector);
153
+ });
154
+ }
155
+ else {
156
+ this.openShareLinkDialog(node, focusedElementOnCloseSelector);
157
+ }
158
+ }
159
+ }
160
+ openShareLinkDialog(node, focusedElementOnCloseSelector) {
161
+ const baseShareUrl = this.appSettingsService.baseShareUrl;
162
+ this.dialogRef
163
+ .open(ShareDialogComponent, {
164
+ restoreFocus: true,
165
+ width: '600px',
166
+ panelClass: 'adf-share-link-dialog',
167
+ data: {
168
+ node,
169
+ baseShareUrl
170
+ }
171
+ })
172
+ .afterClosed()
173
+ .subscribe(() => {
174
+ this.store.dispatch(new SetSelectedNodesAction([node]));
175
+ this.appHookService.linksUnshared.next();
176
+ this.focusAfterClose(focusedElementOnCloseSelector);
177
+ });
178
+ }
179
+ createFolder(parentNodeId) {
180
+ const dialogInstance = this.dialogRef.open(FolderDialogComponent, {
181
+ data: {
182
+ parentNodeId,
183
+ createTitle: undefined,
184
+ nodeType: 'cm:folder'
185
+ },
186
+ width: '400px',
187
+ role: 'dialog'
188
+ });
189
+ dialogInstance.componentInstance.error.subscribe((message) => {
190
+ this.notificationService.showError(message);
191
+ });
192
+ dialogInstance.afterClosed().subscribe((node) => {
193
+ if (node) {
194
+ this.documentListService.reload();
195
+ }
196
+ this.focusAfterClose(this.createMenuButtonSelector);
197
+ });
198
+ }
199
+ editFolder(folder, focusedElementOnCloseSelector) {
200
+ if (!folder) {
201
+ return;
202
+ }
203
+ const dialog = this.dialogRef.open(FolderDialogComponent, {
204
+ data: {
205
+ folder: folder.entry
206
+ },
207
+ width: '400px'
208
+ });
209
+ dialog.componentInstance.error.subscribe((message) => {
210
+ this.notificationService.showError(message);
211
+ });
212
+ dialog.afterClosed().subscribe((node) => {
213
+ if (node) {
214
+ this.store.dispatch(new SetSelectedNodesAction([{ entry: node }]));
215
+ this.nodesApiService.nodeUpdated.next(node);
216
+ }
217
+ this.focusAfterClose(focusedElementOnCloseSelector);
218
+ });
219
+ }
220
+ createLibrary() {
221
+ const dialogInstance = this.dialogRef.open(LibraryDialogComponent, {
222
+ width: '400px'
223
+ });
224
+ dialogInstance.componentInstance.error.subscribe((message) => {
225
+ this.notificationService.showError(message);
226
+ });
227
+ return dialogInstance.afterClosed().pipe(tap((node) => {
228
+ if (node) {
229
+ this.appHookService.libraryCreated.next(node);
230
+ }
231
+ this.focusAfterClose(this.createMenuButtonSelector);
232
+ }), map((node) => {
233
+ if (node?.entry?.guid) {
234
+ return node.entry.guid;
235
+ }
236
+ return null;
237
+ }));
238
+ }
239
+ deleteLibrary(id) {
240
+ this.contentApi.deleteSite(id).subscribe(() => {
241
+ this.appHookService.libraryDeleted.next(id);
242
+ this.notificationService.showInfo('APP.MESSAGES.INFO.LIBRARY_DELETED');
243
+ this.store.dispatch(new NavigateRouteAction(['/libraries']));
244
+ }, () => {
245
+ this.notificationService.showError('APP.MESSAGES.ERRORS.DELETE_LIBRARY_FAILED');
246
+ });
247
+ }
248
+ leaveLibrary(siteId, focusedElementOnCloseSelector) {
249
+ const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {
250
+ data: {
251
+ title: 'APP.DIALOGS.CONFIRM_LEAVE.TITLE',
252
+ message: 'APP.DIALOGS.CONFIRM_LEAVE.MESSAGE',
253
+ yesLabel: 'APP.DIALOGS.CONFIRM_LEAVE.YES_LABEL',
254
+ noLabel: 'APP.DIALOGS.CONFIRM_LEAVE.NO_LABEL'
255
+ },
256
+ minWidth: '250px'
257
+ });
258
+ dialogRef.afterClosed().subscribe((result) => {
259
+ if (result === true) {
260
+ this.contentApi.leaveSite(siteId).subscribe(() => {
261
+ this.appHookService.libraryLeft.next(siteId);
262
+ this.notificationService.showInfo('APP.MESSAGES.INFO.LEFT_LIBRARY');
263
+ }, () => {
264
+ this.notificationService.showError('APP.MESSAGES.ERRORS.LEAVE_LIBRARY_FAILED');
265
+ });
266
+ }
267
+ this.focusAfterClose(focusedElementOnCloseSelector);
268
+ });
269
+ }
270
+ updateLibrary(siteId, siteBody) {
271
+ this.contentApi.updateLibrary(siteId, siteBody).subscribe((siteEntry) => {
272
+ this.appHookService.libraryUpdated.next(siteEntry);
273
+ this.notificationService.showInfo('LIBRARY.SUCCESS.LIBRARY_UPDATED');
274
+ }, () => {
275
+ this.notificationService.showError('LIBRARY.ERRORS.LIBRARY_UPDATE_ERROR');
276
+ });
277
+ }
278
+ async unshareNodes(links) {
279
+ const promises = links.map((link) => this.contentApi.deleteSharedLink(link.entry.id).toPromise());
280
+ await Promise.all(promises);
281
+ this.appHookService.linksUnshared.next();
282
+ }
283
+ canUpdateNode(node) {
284
+ return this.permission.check(node, ['update']);
285
+ }
286
+ canUploadContent(folderNode) {
287
+ return this.permission.check(folderNode, ['create']);
288
+ }
289
+ purgeDeletedNodes(nodes) {
290
+ if (!nodes || nodes.length === 0) {
291
+ return;
292
+ }
293
+ const dialogRef = this.dialogRef.open(ConfirmDialogComponent, {
294
+ data: {
295
+ title: 'APP.DIALOGS.CONFIRM_PURGE.TITLE',
296
+ message: 'APP.DIALOGS.CONFIRM_PURGE.MESSAGE',
297
+ yesLabel: 'APP.DIALOGS.CONFIRM_PURGE.YES_LABEL',
298
+ noLabel: 'APP.DIALOGS.CONFIRM_PURGE.NO_LABEL'
299
+ },
300
+ minWidth: '250px'
301
+ });
302
+ dialogRef.afterClosed().subscribe((result) => {
303
+ if (result === true) {
304
+ const nodesToDelete = nodes.map((node) => {
305
+ const { name } = node.entry;
306
+ const id = node.entry.nodeId || node.entry.id;
307
+ return {
308
+ id,
309
+ name
310
+ };
311
+ });
312
+ this.purgeNodes(nodesToDelete);
313
+ }
314
+ });
315
+ }
316
+ restoreDeletedNodes(selection = []) {
317
+ if (!selection.length) {
318
+ return;
319
+ }
320
+ const nodesWithPath = selection.filter((node) => node.entry.path);
321
+ if (selection.length && !nodesWithPath.length) {
322
+ const failedStatus = this.processStatus([]);
323
+ failedStatus.fail.push(...selection);
324
+ this.showRestoreNotification(failedStatus);
325
+ this.documentListService.reload();
326
+ return;
327
+ }
328
+ let status;
329
+ forkJoin(nodesWithPath.map((node) => this.restoreNode(node)))
330
+ .pipe(tap((restoredNodes) => {
331
+ status = this.processStatus(restoredNodes);
332
+ }), mergeMap(() => this.contentApi.getDeletedNodes()))
333
+ .subscribe((nodes) => {
334
+ const selectedNodes = this.diff(status.fail, selection, false);
335
+ const remainingNodes = this.diff(selectedNodes, nodes.list.entries);
336
+ if (!remainingNodes.length) {
337
+ this.showRestoreNotification(status);
338
+ this.documentListService.reload();
339
+ }
340
+ else {
341
+ this.restoreDeletedNodes(remainingNodes);
342
+ }
343
+ });
344
+ }
345
+ copyNodes(nodes, focusedElementOnCloseSelector) {
346
+ zip(this.nodeActionsService.copyNodes(nodes, undefined, focusedElementOnCloseSelector), this.nodeActionsService.contentCopied).subscribe((result) => {
347
+ const [operationResult, newItems] = result;
348
+ this.showCopyMessage(operationResult, nodes, newItems);
349
+ }, (error) => {
350
+ this.showCopyMessage(error, nodes);
351
+ });
352
+ }
353
+ moveNodes(nodes, focusedElementOnCloseSelector) {
354
+ const permissionForMove = '!';
355
+ zip(this.nodeActionsService.moveNodes(nodes, permissionForMove, focusedElementOnCloseSelector), this.nodeActionsService.contentMoved).subscribe((result) => {
356
+ const [operationResult, moveResponse] = result;
357
+ this.showMoveMessage(nodes, operationResult, moveResponse);
358
+ this.documentListService.reload();
359
+ }, (error) => {
360
+ this.showMoveMessage(nodes, error);
361
+ });
362
+ }
363
+ getErrorMessage(errorObject) {
364
+ let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
365
+ try {
366
+ const { error: { statusCode } } = JSON.parse(errorObject.message);
367
+ if (statusCode === 409) {
368
+ i18nMessageString = 'APP.MESSAGES.ERRORS.NODE_MOVE';
369
+ }
370
+ else if (statusCode === 403) {
371
+ i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
372
+ }
373
+ }
374
+ catch (err) {
375
+ /* Do nothing, keep the original message */
376
+ }
377
+ return i18nMessageString;
378
+ }
379
+ getNodeInfo() {
380
+ return this.store.select(getAppSelection).pipe(take(1), mergeMap(({ file }) => {
381
+ const id = file.entry.nodeId || file.entry.guid;
382
+ if (!id) {
383
+ return of(file.entry);
384
+ }
385
+ else {
386
+ return this.contentApi.getNodeInfo(id);
387
+ }
388
+ }));
389
+ }
390
+ unlockNode(node) {
391
+ return this.contentApi.unlockNode(node.entry.id).catch(() => {
392
+ this.notificationService.showError('APP.MESSAGES.ERRORS.UNLOCK_NODE', null, { fileName: node.entry.name });
393
+ });
394
+ }
395
+ showCopyMessage(info, nodes, newItems) {
396
+ const numberOfCopiedItems = newItems ? newItems.length : 0;
397
+ const failedItems = nodes.length - numberOfCopiedItems;
398
+ let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
399
+ if (typeof info === 'string') {
400
+ if (info.toLowerCase().indexOf('succes') !== -1) {
401
+ let i18MessageSuffix;
402
+ if (failedItems) {
403
+ if (numberOfCopiedItems) {
404
+ i18MessageSuffix = numberOfCopiedItems === 1 ? 'PARTIAL_SINGULAR' : 'PARTIAL_PLURAL';
405
+ }
406
+ else {
407
+ i18MessageSuffix = failedItems === 1 ? 'FAIL_SINGULAR' : 'FAIL_PLURAL';
408
+ }
409
+ }
410
+ else {
411
+ i18MessageSuffix = numberOfCopiedItems === 1 ? 'SINGULAR' : 'PLURAL';
412
+ }
413
+ i18nMessageString = `APP.MESSAGES.INFO.NODE_COPY.${i18MessageSuffix}`;
414
+ }
415
+ }
416
+ else {
417
+ try {
418
+ const { error: { statusCode } } = JSON.parse(info.message);
419
+ if (statusCode === 403) {
420
+ i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
421
+ }
422
+ }
423
+ catch { }
424
+ }
425
+ const undo = numberOfCopiedItems > 0 ? this.translation.instant('APP.ACTIONS.UNDO') : '';
426
+ const message = this.translation.instant(i18nMessageString, {
427
+ success: numberOfCopiedItems,
428
+ failed: failedItems
429
+ });
430
+ this.notificationService
431
+ .openSnackMessageAction(message, undo, {
432
+ panelClass: 'info-snackbar'
433
+ })
434
+ .onAction()
435
+ .subscribe(() => this.undoCopyNodes(newItems));
436
+ }
437
+ undoCopyNodes(nodes) {
438
+ const batch = this.nodeActionsService
439
+ .flatten(nodes)
440
+ .filter((item) => item.entry)
441
+ .map((item) => this.contentApi.deleteNode(item.entry.id, { permanent: true }));
442
+ forkJoin(...batch).subscribe(() => {
443
+ this.appHookService.nodesDeleted.next(null);
444
+ this.documentListService.reload();
445
+ }, (error) => {
446
+ let i18nMessageString = 'APP.MESSAGES.ERRORS.GENERIC';
447
+ let errorJson = null;
448
+ try {
449
+ errorJson = JSON.parse(error.message);
450
+ }
451
+ catch { }
452
+ if (errorJson?.error?.statusCode === 403) {
453
+ i18nMessageString = 'APP.MESSAGES.ERRORS.PERMISSION';
454
+ }
455
+ this.notificationService.showError(i18nMessageString);
456
+ });
457
+ }
458
+ openVersionManagerDialog(node, focusedElementOnCloseSelector) {
459
+ // workaround Shared
460
+ if (node.isFile || node.nodeId) {
461
+ const newVersionUploaderDialogData = {
462
+ node,
463
+ showVersionsOnly: true,
464
+ title: 'VERSION.DIALOG.TITLE',
465
+ allowDownload: this.appSettingsService.uploadAllowDownload,
466
+ showComments: this.appSettingsService.uploadAllowComments,
467
+ showActions: this.appSettingsService.versionManagerShowActions,
468
+ allowViewVersions: this.appSettingsService.versionManagerAllowViewVersions,
469
+ allowVersionDelete: this.appSettingsService.versionManagerAllowVersionDelete
470
+ };
471
+ this.newVersionUploaderService
472
+ .openUploadNewVersionDialog(newVersionUploaderDialogData, { width: '630px', role: 'dialog' }, focusedElementOnCloseSelector)
473
+ .subscribe({
474
+ next: (newVersionUploaderData) => {
475
+ switch (newVersionUploaderData.action) {
476
+ case NewVersionUploaderDataAction.refresh:
477
+ this.documentListService.reload();
478
+ this.store.dispatch(new RefreshPreviewAction(newVersionUploaderData.node));
479
+ break;
480
+ case NewVersionUploaderDataAction.view:
481
+ this.store.dispatch(new ViewNodeVersionAction(node.id, newVersionUploaderData.versionId, {
482
+ location: this.router.url
483
+ }));
484
+ break;
485
+ default:
486
+ break;
487
+ }
488
+ }
489
+ });
490
+ }
491
+ else {
492
+ this.notificationService.showError('APP.MESSAGES.ERRORS.PERMISSION');
493
+ }
494
+ }
495
+ openAspectListDialog(node, focusedElementOnCloseSelector) {
496
+ // workaround Shared
497
+ if (node.isFile || node.id) {
498
+ this.nodeAspectService.updateNodeAspects(node.id, focusedElementOnCloseSelector);
499
+ }
500
+ else {
501
+ this.notificationService.showError('APP.MESSAGES.ERRORS.PERMISSION');
502
+ }
503
+ }
504
+ undoMoveNodes(moveResponse, selectionParentId) {
505
+ const movedNodes = moveResponse?.['succeeded'] ?? [];
506
+ const partiallyMovedNodes = moveResponse?.['partiallySucceeded'] ?? [];
507
+ const restoreDeletedNodesBatch = this.nodeActionsService.moveDeletedEntries.map((folderEntry) => this.contentApi.restoreNode(folderEntry.nodeId || folderEntry.id).pipe(map((node) => node.entry)));
508
+ zip(...restoreDeletedNodesBatch, of(null))
509
+ .pipe(mergeMap(() => {
510
+ const nodesToBeMovedBack = [...partiallyMovedNodes, ...movedNodes];
511
+ const revertMoveBatch = this.nodeActionsService
512
+ .flatten(nodesToBeMovedBack)
513
+ .filter((node) => node.entry || node.itemMoved?.entry)
514
+ .map((node) => {
515
+ if (node.itemMoved) {
516
+ return this.nodeActionsService.moveNodeAction(node.itemMoved.entry, node.initialParentId);
517
+ }
518
+ else {
519
+ return this.nodeActionsService.moveNodeAction(node.entry, selectionParentId);
520
+ }
521
+ });
522
+ return zip(...revertMoveBatch, of(null));
523
+ }))
524
+ .subscribe(() => {
525
+ this.documentListService.reload();
526
+ }, (error) => {
527
+ let message = 'APP.MESSAGES.ERRORS.GENERIC';
528
+ let errorJson = null;
529
+ try {
530
+ errorJson = JSON.parse(error.message);
531
+ }
532
+ catch { }
533
+ if (errorJson?.error?.statusCode === 403) {
534
+ message = 'APP.MESSAGES.ERRORS.PERMISSION';
535
+ }
536
+ this.notificationService.showError(message);
537
+ });
538
+ }
539
+ deleteNodes(items) {
540
+ const batch = [];
541
+ items.forEach((node) => {
542
+ batch.push(this.deleteNode(node));
543
+ });
544
+ forkJoin(...batch).subscribe((data) => {
545
+ const status = this.processStatus(data);
546
+ const message = this.getDeleteMessage(status);
547
+ if (message && status.someSucceeded) {
548
+ message.userAction = new SnackbarUserAction('APP.ACTIONS.UNDO', new UndoDeleteNodesAction([...status.success]));
549
+ }
550
+ this.store.dispatch(message);
551
+ if (status.someSucceeded) {
552
+ this.appHookService.nodesDeleted.next();
553
+ this.documentListService.reload();
554
+ }
555
+ this.store.dispatch(new ShowLoaderAction(false));
556
+ });
557
+ }
558
+ undoDeleteNodes(items) {
559
+ const batch = [];
560
+ items.forEach((item) => {
561
+ batch.push(this.undoDeleteNode(item));
562
+ });
563
+ forkJoin(...batch).subscribe((data) => {
564
+ const processedData = this.processStatus(data);
565
+ if (processedData.fail.length) {
566
+ const message = this.getUndoDeleteMessage(processedData);
567
+ this.store.dispatch(message);
568
+ }
569
+ if (processedData.someSucceeded) {
570
+ this.documentListService.reload();
571
+ }
572
+ });
573
+ }
574
+ undoDeleteNode(item) {
575
+ const { id, name } = item;
576
+ return this.contentApi.restoreNode(id).pipe(map(() => ({
577
+ id,
578
+ name,
579
+ status: 1
580
+ })), catchError(() => of({
581
+ id,
582
+ name,
583
+ status: 0
584
+ })));
585
+ }
586
+ getUndoDeleteMessage(status) {
587
+ if (status.someFailed && !status.oneFailed) {
588
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_RESTORE_PLURAL', { number: status.fail.length });
589
+ }
590
+ if (status.oneFailed) {
591
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_RESTORE', {
592
+ name: status.fail[0].name
593
+ });
594
+ }
595
+ return null;
596
+ }
597
+ restoreNode(node) {
598
+ const { entry } = node;
599
+ return this.contentApi.restoreNode(entry.id).pipe(map(() => ({
600
+ status: 1,
601
+ entry
602
+ })), catchError((error) => {
603
+ const { statusCode } = JSON.parse(error.message).error;
604
+ return of({
605
+ status: 0,
606
+ statusCode,
607
+ entry
608
+ });
609
+ }));
610
+ }
611
+ purgeNodes(selection = []) {
612
+ if (!selection.length) {
613
+ return;
614
+ }
615
+ const batch = selection.map((node) => this.purgeDeletedNode(node));
616
+ forkJoin(batch).subscribe((purgedNodes) => {
617
+ const status = this.processStatus(purgedNodes);
618
+ if (status.success.length) {
619
+ this.documentListService.reload();
620
+ }
621
+ this.sendPurgeMessage(status);
622
+ });
623
+ }
624
+ purgeDeletedNode(node) {
625
+ const { id, name } = node;
626
+ return this.contentApi.purgeDeletedNode(id).pipe(map(() => ({
627
+ status: 1,
628
+ id,
629
+ name
630
+ })), catchError(() => of({
631
+ status: 0,
632
+ id,
633
+ name
634
+ })));
635
+ }
636
+ processStatus(data = []) {
637
+ const status = {
638
+ fail: [],
639
+ success: [],
640
+ get someFailed() {
641
+ return !!this.fail.length;
642
+ },
643
+ get someSucceeded() {
644
+ return !!this.success.length;
645
+ },
646
+ get oneFailed() {
647
+ return this.fail.length === 1;
648
+ },
649
+ get oneSucceeded() {
650
+ return this.success.length === 1;
651
+ },
652
+ get allSucceeded() {
653
+ return this.someSucceeded && !this.someFailed;
654
+ },
655
+ get allFailed() {
656
+ return this.someFailed && !this.someSucceeded;
657
+ },
658
+ reset() {
659
+ this.fail = [];
660
+ this.success = [];
661
+ }
662
+ };
663
+ return data.reduce((acc, node) => {
664
+ if (node.status) {
665
+ acc.success.push(node);
666
+ }
667
+ else {
668
+ acc.fail.push(node);
669
+ }
670
+ return acc;
671
+ }, status);
672
+ }
673
+ sendPurgeMessage(status) {
674
+ if (status.oneSucceeded && status.someFailed && !status.oneFailed) {
675
+ this.notificationService.showWarning('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PARTIAL_SINGULAR', null, {
676
+ name: status.success[0].name,
677
+ failed: status.fail.length
678
+ });
679
+ return;
680
+ }
681
+ if (status.someSucceeded && !status.oneSucceeded && status.someFailed) {
682
+ this.notificationService.showWarning('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PARTIAL_PLURAL', null, {
683
+ number: status.success.length,
684
+ failed: status.fail.length
685
+ });
686
+ return;
687
+ }
688
+ if (status.oneSucceeded) {
689
+ this.notificationService.showInfo('APP.MESSAGES.INFO.TRASH.NODES_PURGE.SINGULAR', null, { name: status.success[0].name });
690
+ return;
691
+ }
692
+ if (status.oneFailed) {
693
+ this.notificationService.showError('APP.MESSAGES.ERRORS.TRASH.NODES_PURGE.SINGULAR', null, { name: status.fail[0].name });
694
+ return;
695
+ }
696
+ if (status.allSucceeded) {
697
+ this.notificationService.showInfo('APP.MESSAGES.INFO.TRASH.NODES_PURGE.PLURAL', null, { number: status.success.length });
698
+ return;
699
+ }
700
+ if (status.allFailed) {
701
+ this.notificationService.showError('APP.MESSAGES.ERRORS.TRASH.NODES_PURGE.PLURAL', null, { number: status.fail.length });
702
+ return;
703
+ }
704
+ }
705
+ showRestoreNotification(status) {
706
+ const message = this.getRestoreMessage(status);
707
+ if (message) {
708
+ if (status.oneSucceeded && !status.someFailed) {
709
+ const isSite = this.isSite(status.success[0].entry);
710
+ const path = status.success[0].entry.path;
711
+ const parent = path.elements[path.elements.length - 1];
712
+ const route = isSite ? ['/libraries', parent.id] : ['/personal-files', parent.id];
713
+ let navigate;
714
+ if (this.isLibraryContent(path)) {
715
+ navigate = new NavigateToParentFolder(status.success[0]);
716
+ }
717
+ else {
718
+ navigate = new NavigateRouteAction(route);
719
+ }
720
+ message.userAction = new SnackbarUserAction('APP.ACTIONS.VIEW', navigate);
721
+ }
722
+ this.store.dispatch(message);
723
+ }
724
+ }
725
+ isSite(entry) {
726
+ return entry.nodeType === 'st:site';
727
+ }
728
+ isLibraryContent(path) {
729
+ return path && path.elements.length >= 2 && path.elements[1].name === 'Sites';
730
+ }
731
+ getRestoreMessage(status) {
732
+ if (status.someFailed && !status.oneFailed) {
733
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.PARTIAL_PLURAL', {
734
+ number: status.fail.length
735
+ });
736
+ }
737
+ if (status.oneFailed && status.fail[0].statusCode) {
738
+ if (status.fail[0].statusCode === 409) {
739
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.NODE_EXISTS', {
740
+ name: status.fail[0].entry.name
741
+ });
742
+ }
743
+ else {
744
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.GENERIC', {
745
+ name: status.fail[0].entry.name
746
+ });
747
+ }
748
+ }
749
+ if (status.oneFailed && !status.fail[0].statusCode) {
750
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.TRASH.NODES_RESTORE.LOCATION_MISSING', {
751
+ name: status.fail[0].entry.name
752
+ });
753
+ }
754
+ if (status.allSucceeded && !status.oneSucceeded) {
755
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_RESTORE.PLURAL');
756
+ }
757
+ if (status.allSucceeded && status.oneSucceeded) {
758
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.TRASH.NODES_RESTORE.SINGULAR', {
759
+ name: status.success[0].entry.name
760
+ });
761
+ }
762
+ return null;
763
+ }
764
+ diff(selection, list, fromList = true) {
765
+ const ids = selection.map((item) => item.entry.id);
766
+ return list.filter((item) => {
767
+ if (fromList) {
768
+ return ids.includes(item.entry.id) ? item : null;
769
+ }
770
+ else {
771
+ return !ids.includes(item.entry.id) ? item : null;
772
+ }
773
+ });
774
+ }
775
+ deleteNode(node) {
776
+ const { name } = node.entry;
777
+ const id = node.entry.nodeId || node.entry.id;
778
+ return this.contentApi.deleteNode(id).pipe(map(() => ({
779
+ id,
780
+ name,
781
+ status: 1
782
+ })), catchError(() => of({
783
+ id,
784
+ name,
785
+ status: 0
786
+ })));
787
+ }
788
+ getDeleteMessage(status) {
789
+ if (status.allFailed && !status.oneFailed) {
790
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_DELETION_PLURAL', { number: status.fail.length });
791
+ }
792
+ if (status.allSucceeded && !status.oneSucceeded) {
793
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.NODE_DELETION.PLURAL', {
794
+ number: status.success.length
795
+ });
796
+ }
797
+ if (status.someFailed && status.someSucceeded && !status.oneSucceeded) {
798
+ return new SnackbarWarningAction('APP.MESSAGES.INFO.NODE_DELETION.PARTIAL_PLURAL', {
799
+ success: status.success.length,
800
+ failed: status.fail.length
801
+ });
802
+ }
803
+ if (status.someFailed && status.oneSucceeded) {
804
+ return new SnackbarWarningAction('APP.MESSAGES.INFO.NODE_DELETION.PARTIAL_SINGULAR', {
805
+ success: status.success.length,
806
+ failed: status.fail.length
807
+ });
808
+ }
809
+ if (status.oneFailed && !status.someSucceeded) {
810
+ return new SnackbarErrorAction('APP.MESSAGES.ERRORS.NODE_DELETION', {
811
+ name: status.fail[0].name
812
+ });
813
+ }
814
+ if (status.oneSucceeded && !status.someFailed) {
815
+ return new SnackbarInfoAction('APP.MESSAGES.INFO.NODE_DELETION.SINGULAR', { name: status.success[0].name });
816
+ }
817
+ return null;
818
+ }
819
+ showMoveMessage(nodes, info, moveResponse) {
820
+ const succeeded = moveResponse?.['succeeded'].length ?? 0;
821
+ const partiallySucceeded = moveResponse?.['partiallySucceeded'].length ?? 0;
822
+ const failures = moveResponse?.['failed'].length ?? 0;
823
+ let successMessage = '';
824
+ let partialSuccessMessage = '';
825
+ let failedMessage = '';
826
+ let errorMessage = '';
827
+ if (typeof info === 'string') {
828
+ // in case of success
829
+ if (info.toLowerCase().indexOf('succes') !== -1) {
830
+ const i18nMessageString = 'APP.MESSAGES.INFO.NODE_MOVE.';
831
+ let i18MessageSuffix = '';
832
+ if (succeeded) {
833
+ i18MessageSuffix = succeeded === 1 ? 'SINGULAR' : 'PLURAL';
834
+ successMessage = `${i18nMessageString}${i18MessageSuffix}`;
835
+ }
836
+ if (partiallySucceeded) {
837
+ i18MessageSuffix = partiallySucceeded === 1 ? 'PARTIAL.SINGULAR' : 'PARTIAL.PLURAL';
838
+ partialSuccessMessage = `${i18nMessageString}${i18MessageSuffix}`;
839
+ }
840
+ if (failures) {
841
+ // if moving failed for ALL nodes, emit error
842
+ if (failures === nodes.length) {
843
+ const errors = this.nodeActionsService.flatten(moveResponse['failed']);
844
+ errorMessage = this.getErrorMessage(errors[0]);
845
+ }
846
+ else {
847
+ i18MessageSuffix = 'PARTIAL.FAIL';
848
+ failedMessage = `${i18nMessageString}${i18MessageSuffix}`;
849
+ }
850
+ }
851
+ }
852
+ else {
853
+ errorMessage = 'APP.MESSAGES.ERRORS.GENERIC';
854
+ }
855
+ }
856
+ else {
857
+ errorMessage = this.getErrorMessage(info);
858
+ }
859
+ const undo = succeeded + partiallySucceeded > 0 ? this.translation.instant('APP.ACTIONS.UNDO') : '';
860
+ failedMessage = errorMessage ? errorMessage : failedMessage;
861
+ const beforePartialSuccessMessage = successMessage && partialSuccessMessage ? ' ' : '';
862
+ const beforeFailedMessage = (successMessage || partialSuccessMessage) && failedMessage ? ' ' : '';
863
+ const initialParentId = this.nodeActionsService.getEntryParentId(nodes[0].entry);
864
+ const messages = this.translation.instant([successMessage, partialSuccessMessage, failedMessage], {
865
+ success: succeeded,
866
+ failed: failures,
867
+ partially: partiallySucceeded
868
+ });
869
+ // TODO: review in terms of i18n
870
+ this.notificationService
871
+ .openSnackMessageAction(messages[successMessage] + beforePartialSuccessMessage + messages[partialSuccessMessage] + beforeFailedMessage + messages[failedMessage], undo, {
872
+ panelClass: 'info-snackbar'
873
+ })
874
+ .onAction()
875
+ .subscribe(() => this.undoMoveNodes(moveResponse, initialParentId));
876
+ }
877
+ focusAfterClose(focusedElementSelector) {
878
+ if (focusedElementSelector) {
879
+ document.querySelector(focusedElementSelector)?.focus();
880
+ }
881
+ }
882
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ContentManagementService, deps: [{ token: i1.NodesApiService }, { token: i2.Store }, { token: i3.ContentApiService }, { token: i3.NodePermissionService }, { token: i4.MatDialog }, { token: i5.NodeActionsService }, { token: i6.TranslationService }, { token: i1.NodeAspectService }, { token: i3.AppHookService }, { token: i1.NewVersionUploaderService }, { token: i7.Router }, { token: i3.AppSettingsService }, { token: i1.DocumentListService }], target: i0.ɵɵFactoryTarget.Injectable });
883
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ContentManagementService, providedIn: 'root' });
884
+ }
885
+ export { ContentManagementService };
886
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.9", ngImport: i0, type: ContentManagementService, decorators: [{
887
+ type: Injectable,
888
+ args: [{
889
+ providedIn: 'root'
890
+ }]
891
+ }], ctorParameters: function () { return [{ type: i1.NodesApiService }, { type: i2.Store }, { type: i3.ContentApiService }, { type: i3.NodePermissionService }, { type: i4.MatDialog }, { type: i5.NodeActionsService }, { type: i6.TranslationService }, { type: i1.NodeAspectService }, { type: i3.AppHookService }, { type: i1.NewVersionUploaderService }, { type: i7.Router }, { type: i3.AppSettingsService }, { type: i1.DocumentListService }]; } });
892
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1tYW5hZ2VtZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hY2EtY29udGVudC9zcmMvbGliL3NlcnZpY2VzL2NvbnRlbnQtbWFuYWdlbWVudC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BILE9BQU8sRUFJTCxlQUFlLEVBQ2YsbUJBQW1CLEVBQ25CLHNCQUFzQixFQUV0QixvQkFBb0IsRUFDcEIsc0JBQXNCLEVBQ3RCLGdCQUFnQixFQUVoQixtQkFBbUIsRUFDbkIsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDdEIsTUFBTSw0QkFBNEIsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsNEJBQTRCLEVBRTVCLHlCQUF5QixFQUN6QixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLG9CQUFvQixFQUNyQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXJHLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQW1CLE1BQU0sMEJBQTBCLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNwQyxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7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b3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIENvcHlyaWdodCDCqSAyMDA1LTIwMjQgSHlsYW5kIFNvZnR3YXJlLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb25cbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uLlxuICogSWYgdGhlIHNvZnR3YXJlIHdhcyBwdXJjaGFzZWQgdW5kZXIgYSBwYWlkIEFsZnJlc2NvIGxpY2Vuc2UsIHRoZSB0ZXJtcyBvZlxuICogdGhlIHBhaWQgbGljZW5zZSBhZ3JlZW1lbnQgd2lsbCBwcmV2YWlsLiBPdGhlcndpc2UsIHRoZSBzb2Z0d2FyZSBpc1xuICogcHJvdmlkZWQgdW5kZXIgdGhlIGZvbGxvd2luZyBvcGVuIHNvdXJjZSBsaWNlbnNlIHRlcm1zOlxuICpcbiAqIFRoZSBBbGZyZXNjbyBFeGFtcGxlIENvbnRlbnQgQXBwbGljYXRpb24gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiAqXG4gKiBUaGUgQWxmcmVzY28gRXhhbXBsZSBDb250ZW50IEFwcGxpY2F0aW9uIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlXG4gKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiAqIGZyb20gSHlsYW5kIFNvZnR3YXJlLiBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4gKi9cblxuaW1wb3J0IHsgQXBwSG9va1NlcnZpY2UsIEFwcFNldHRpbmdzU2VydmljZSwgQ29udGVudEFwaVNlcnZpY2UsIE5vZGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hY2Etc2hhcmVkJztcbmltcG9ydCB7XG4gIEFwcFN0b3JlLFxuICBEZWxldGVkTm9kZUluZm8sXG4gIERlbGV0ZVN0YXR1cyxcbiAgZ2V0QXBwU2VsZWN0aW9uLFxuICBOYXZpZ2F0ZVJvdXRlQWN0aW9uLFxuICBOYXZpZ2F0ZVRvUGFyZW50Rm9sZGVyLFxuICBOb2RlSW5mbyxcbiAgUmVmcmVzaFByZXZpZXdBY3Rpb24sXG4gIFNldFNlbGVjdGVkTm9kZXNBY3Rpb24sXG4gIFNob3dMb2FkZXJBY3Rpb24sXG4gIFNuYWNrYmFyQWN0aW9uLFxuICBTbmFja2JhckVycm9yQWN0aW9uLFxuICBTbmFja2JhckluZm9BY3Rpb24sXG4gIFNuYWNrYmFyVXNlckFjdGlvbixcbiAgU25hY2tiYXJXYXJuaW5nQWN0aW9uLFxuICBVbmRvRGVsZXRlTm9kZXNBY3Rpb24sXG4gIFVubG9ja1dyaXRlQWN0aW9uLFxuICBWaWV3Tm9kZVZlcnNpb25BY3Rpb25cbn0gZnJvbSAnQGFsZnJlc2NvL2FjYS1zaGFyZWQvc3RvcmUnO1xuaW1wb3J0IHtcbiAgRG9jdW1lbnRMaXN0U2VydmljZSxcbiAgRm9sZGVyRGlhbG9nQ29tcG9uZW50LFxuICBMaWJyYXJ5RGlhbG9nQ29tcG9uZW50LFxuICBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLFxuICBOZXdWZXJzaW9uVXBsb2FkZXJEaWFsb2dEYXRhLFxuICBOZXdWZXJzaW9uVXBsb2FkZXJTZXJ2aWNlLFxuICBOb2RlQXNwZWN0U2VydmljZSxcbiAgTm9kZXNBcGlTZXJ2aWNlLFxuICBTaGFyZURpYWxvZ0NvbXBvbmVudFxufSBmcm9tICdAYWxmcmVzY28vYWRmLWNvbnRlbnQtc2VydmljZXMnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSwgVHJhbnNsYXRpb25TZXJ2aWNlLCBDb25maXJtRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnQGFsZnJlc2NvL2FkZi1jb3JlJztcbmltcG9ydCB7IERlbGV0ZWROb2Rlc1BhZ2luZywgTm9kZSwgTm9kZUVudHJ5LCBQYXRoSW5mbywgU2l0ZUJvZHlDcmVhdGUsIFNpdGVFbnRyeSB9IGZyb20gJ0BhbGZyZXNjby9qcy1hcGknO1xuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBTdG9yZSB9IGZyb20gJ0BuZ3J4L3N0b3JlJztcbmltcG9ydCB7IGZvcmtKb2luLCBPYnNlcnZhYmxlLCBvZiwgemlwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIG1lcmdlTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBOb2RlQWN0aW9uc1NlcnZpY2UgfSBmcm9tICcuL25vZGUtYWN0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5cbmludGVyZmFjZSBSZXN0b3JlZE5vZGUge1xuICBzdGF0dXM6IG51bWJlcjtcbiAgZW50cnk6IE5vZGU7XG4gIHN0YXR1c0NvZGU/OiBudW1iZXI7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvbnRlbnRNYW5hZ2VtZW50U2VydmljZSB7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjcmVhdGVNZW51QnV0dG9uU2VsZWN0b3IgPSAnYXBwLXRvb2xiYXItbWVudSBidXR0b25baWQ9XCJhcHAudG9vbGJhci5jcmVhdGVcIl0nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbm9kZXNBcGlTZXJ2aWNlOiBOb2Rlc0FwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogU3RvcmU8QXBwU3RvcmU+LFxuICAgIHByaXZhdGUgY29udGVudEFwaTogQ29udGVudEFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBwZXJtaXNzaW9uOiBOb2RlUGVybWlzc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2dSZWY6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIG5vZGVBY3Rpb25zU2VydmljZTogTm9kZUFjdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIG5vZGVBc3BlY3RTZXJ2aWNlOiBOb2RlQXNwZWN0U2VydmljZSxcbiAgICBwcml2YXRlIGFwcEhvb2tTZXJ2aWNlOiBBcHBIb29rU2VydmljZSxcbiAgICBwcml2YXRlIG5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2U6IE5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFwcFNldHRpbmdzU2VydmljZTogQXBwU2V0dGluZ3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG9jdW1lbnRMaXN0U2VydmljZTogRG9jdW1lbnRMaXN0U2VydmljZVxuICApIHt9XG5cbiAgYWRkRmF2b3JpdGUobm9kZXM6IEFycmF5PE5vZGVFbnRyeT4pIHtcbiAgICBpZiAobm9kZXMgJiYgbm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZW50QXBpLmFkZEZhdm9yaXRlKG5vZGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBmYXZvcml0ZU5vZGVzID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZSkpO1xuICAgICAgICAgIG5ld05vZGUuZW50cnkuaXNGYXZvcml0ZSA9IHRydWU7XG4gICAgICAgICAgcmV0dXJuIG5ld05vZGU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IFNldFNlbGVjdGVkTm9kZXNBY3Rpb24oZmF2b3JpdGVOb2RlcykpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlRmF2b3JpdGUobm9kZXM6IEFycmF5PE5vZGVFbnRyeT4pIHtcbiAgICBpZiAobm9kZXMgJiYgbm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZW50QXBpLnJlbW92ZUZhdm9yaXRlKG5vZGVzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCBmYXZvcml0ZU5vZGVzID0gbm9kZXMubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV3Tm9kZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZSkpO1xuICAgICAgICAgIG5ld05vZGUuZW50cnkuaXNGYXZvcml0ZSA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybiBuZXdOb2RlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTZXRTZWxlY3RlZE5vZGVzQWN0aW9uKGZhdm9yaXRlTm9kZXMpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG1hbmFnZVZlcnNpb25zKG5vZGU6IGFueSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICBpZiAobm9kZT8uZW50cnkpIHtcbiAgICAgIC8vIHNoYXJlZCBhbmQgZmF2b3JpdGVcbiAgICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgKG5vZGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVJbmZvKGlkKS5zdWJzY3JpYmUoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuVmVyc2lvbk1hbmFnZXJEaWFsb2coZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5WZXJzaW9uTWFuYWdlckRpYWxvZyhub2RlLmVudHJ5LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbWFuYWdlQXNwZWN0cyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgaWYgKG5vZGU/LmVudHJ5KSB7XG4gICAgICAvLyBzaGFyZWQgYW5kIGZhdm9yaXRlXG4gICAgICBjb25zdCBpZCA9IG5vZGUuZW50cnkubm9kZUlkIHx8IChub2RlIGFzIGFueSkuZW50cnkuZ3VpZDtcblxuICAgICAgaWYgKGlkKSB7XG4gICAgICAgIHRoaXMuY29udGVudEFwaS5nZXROb2RlSW5mbyhpZCkuc3Vic2NyaWJlKChlbnRyeSkgPT4ge1xuICAgICAgICAgIHRoaXMub3BlbkFzcGVjdExpc3REaWFsb2coZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9wZW5Bc3BlY3RMaXN0RGlhbG9nKG5vZGUuZW50cnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB2ZXJzaW9uVXBkYXRlRGlhbG9nKG5vZGU6IE5vZGUsIGZpbGU6IEZpbGUpIHtcbiAgICB0aGlzLmNvbnRlbnRBcGkuZ2V0Tm9kZVZlcnNpb25zKG5vZGUuaWQpLnN1YnNjcmliZSgoeyBsaXN0IH0pID0+IHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGEgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIGZpbGUsXG4gICAgICAgIGN1cnJlbnRWZXJzaW9uOiBsaXN0LmVudHJpZXNbMF0uZW50cnksXG4gICAgICAgIHRpdGxlOiAnVkVSU0lPTi5ESUFMT0cuVElUTEUnLFxuICAgICAgICBzaG93Q29tbWVudHM6IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLnVwbG9hZEFsbG93Q29tbWVudHMsXG4gICAgICAgIGFsbG93RG93bmxvYWQ6IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLnVwbG9hZEFsbG93RG93bmxvYWRcbiAgICAgIH0gYXMgTmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YTtcbiAgICAgIGNvbnN0IGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnID0geyB3aWR0aDogJzYwMHB4JyB9O1xuXG4gICAgICB0aGlzLm5ld1ZlcnNpb25VcGxvYWRlclNlcnZpY2Uub3BlblVwbG9hZE5ld1ZlcnNpb25EaWFsb2cobmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YSwgZGlhbG9nQ29uZmlnKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEuYWN0aW9uID09PSBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLnVwbG9hZCkge1xuICAgICAgICAgICAgaWYgKGRhdGEubmV3VmVyc2lvbi52YWx1ZS5lbnRyeS5wcm9wZXJ0aWVzWydjbTpsb2NrVHlwZSddID09PSAnV1JJVEVfTE9DSycpIHtcbiAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgVW5sb2NrV3JpdGVBY3Rpb24oZGF0YS5uZXdWZXJzaW9uLnZhbHVlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZXJyb3IpID0+IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoZXJyb3IpXG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgc2hhcmVOb2RlKG5vZGU6IGFueSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAobm9kZT8uZW50cnkpIHtcbiAgICAgIC8vIHNoYXJlZCBhbmQgZmF2b3JpdGVcbiAgICAgIGNvbnN0IGlkID0gbm9kZS5lbnRyeS5ub2RlSWQgfHwgKG5vZGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuXG4gICAgICBpZiAoaWQpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmdldE5vZGVJbmZvKGlkKS5zdWJzY3JpYmUoKGVudHJ5KSA9PiB7XG4gICAgICAgICAgdGhpcy5vcGVuU2hhcmVMaW5rRGlhbG9nKHsgZW50cnkgfSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3BlblNoYXJlTGlua0RpYWxvZyhub2RlLCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb3BlblNoYXJlTGlua0RpYWxvZyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVNoYXJlVXJsID0gdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UuYmFzZVNoYXJlVXJsO1xuXG4gICAgdGhpcy5kaWFsb2dSZWZcbiAgICAgIC5vcGVuKFNoYXJlRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgIHJlc3RvcmVGb2N1czogdHJ1ZSxcbiAgICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICAgIHBhbmVsQ2xhc3M6ICdhZGYtc2hhcmUtbGluay1kaWFsb2cnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBiYXNlU2hhcmVVcmxcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU2V0U2VsZWN0ZWROb2Rlc0FjdGlvbihbbm9kZV0pKTtcbiAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5saW5rc1Vuc2hhcmVkLm5leHQoKTtcbiAgICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgICAgfSk7XG4gIH1cblxuICBjcmVhdGVGb2xkZXIocGFyZW50Tm9kZUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBkaWFsb2dJbnN0YW5jZSA9IHRoaXMuZGlhbG9nUmVmLm9wZW4oRm9sZGVyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHBhcmVudE5vZGVJZCxcbiAgICAgICAgY3JlYXRlVGl0bGU6IHVuZGVmaW5lZCxcbiAgICAgICAgbm9kZVR5cGU6ICdjbTpmb2xkZXInXG4gICAgICB9LFxuICAgICAgd2lkdGg6ICc0MDBweCcsXG4gICAgICByb2xlOiAnZGlhbG9nJ1xuICAgIH0pO1xuXG4gICAgZGlhbG9nSW5zdGFuY2UuY29tcG9uZW50SW5zdGFuY2UuZXJyb3Iuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgfSk7XG5cbiAgICBkaWFsb2dJbnN0YW5jZS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UodGhpcy5jcmVhdGVNZW51QnV0dG9uU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgZWRpdEZvbGRlcihmb2xkZXI6IE5vZGVFbnRyeSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICBpZiAoIWZvbGRlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuZGlhbG9nUmVmLm9wZW4oRm9sZGVyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIGZvbGRlcjogZm9sZGVyLmVudHJ5XG4gICAgICB9LFxuICAgICAgd2lkdGg6ICc0MDBweCdcbiAgICB9KTtcblxuICAgIGRpYWxvZy5jb21wb25lbnRJbnN0YW5jZS5lcnJvci5zdWJzY3JpYmUoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICB9KTtcblxuICAgIGRpYWxvZy5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgobm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuZXcgU2V0U2VsZWN0ZWROb2Rlc0FjdGlvbihbeyBlbnRyeTogbm9kZSB9XSkpO1xuICAgICAgICB0aGlzLm5vZGVzQXBpU2VydmljZS5ub2RlVXBkYXRlZC5uZXh0KG5vZGUpO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgY3JlYXRlTGlicmFyeSgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGNvbnN0IGRpYWxvZ0luc3RhbmNlID0gdGhpcy5kaWFsb2dSZWYub3BlbihMaWJyYXJ5RGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzQwMHB4J1xuICAgIH0pO1xuXG4gICAgZGlhbG9nSW5zdGFuY2UuY29tcG9uZW50SW5zdGFuY2UuZXJyb3Iuc3Vic2NyaWJlKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IobWVzc2FnZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZGlhbG9nSW5zdGFuY2UuYWZ0ZXJDbG9zZWQoKS5waXBlKFxuICAgICAgdGFwKChub2RlKSA9PiB7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5saWJyYXJ5Q3JlYXRlZC5uZXh0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZm9jdXNBZnRlckNsb3NlKHRoaXMuY3JlYXRlTWVudUJ1dHRvblNlbGVjdG9yKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKChub2RlOiBTaXRlRW50cnkpID0+IHtcbiAgICAgICAgaWYgKG5vZGU/LmVudHJ5Py5ndWlkKSB7XG4gICAgICAgICAgcmV0dXJuIG5vZGUuZW50cnkuZ3VpZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIGRlbGV0ZUxpYnJhcnkoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29udGVudEFwaS5kZWxldGVTaXRlKGlkKS5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlicmFyeURlbGV0ZWQubmV4dChpZCk7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uTElCUkFSWV9ERUxFVEVEJyk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobmV3IE5hdmlnYXRlUm91dGVBY3Rpb24oWycvbGlicmFyaWVzJ10pKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuREVMRVRFX0xJQlJBUllfRkFJTEVEJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGxlYXZlTGlicmFyeShzaXRlSWQ6IHN0cmluZywgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZi5vcGVuKENvbmZpcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdGl0bGU6ICdBUFAuRElBTE9HUy5DT05GSVJNX0xFQVZFLlRJVExFJyxcbiAgICAgICAgbWVzc2FnZTogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fTEVBVkUuTUVTU0FHRScsXG4gICAgICAgIHllc0xhYmVsOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9MRUFWRS5ZRVNfTEFCRUwnLFxuICAgICAgICBub0xhYmVsOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9MRUFWRS5OT19MQUJFTCdcbiAgICAgIH0sXG4gICAgICBtaW5XaWR0aDogJzI1MHB4J1xuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5jb250ZW50QXBpLmxlYXZlU2l0ZShzaXRlSWQpLnN1YnNjcmliZShcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLmxpYnJhcnlMZWZ0Lm5leHQoc2l0ZUlkKTtcbiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93SW5mbygnQVBQLk1FU1NBR0VTLklORk8uTEVGVF9MSUJSQVJZJyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdBUFAuTUVTU0FHRVMuRVJST1JTLkxFQVZFX0xJQlJBUllfRkFJTEVEJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5mb2N1c0FmdGVyQ2xvc2UoZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgIH0pO1xuICB9XG5cbiAgdXBkYXRlTGlicmFyeShzaXRlSWQ6IHN0cmluZywgc2l0ZUJvZHk6IFNpdGVCb2R5Q3JlYXRlKSB7XG4gICAgdGhpcy5jb250ZW50QXBpLnVwZGF0ZUxpYnJhcnkoc2l0ZUlkLCBzaXRlQm9keSkuc3Vic2NyaWJlKFxuICAgICAgKHNpdGVFbnRyeTogU2l0ZUVudHJ5KSA9PiB7XG4gICAgICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlicmFyeVVwZGF0ZWQubmV4dChzaXRlRW50cnkpO1xuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0luZm8oJ0xJQlJBUlkuU1VDQ0VTUy5MSUJSQVJZX1VQREFURUQnKTtcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0xJQlJBUlkuRVJST1JTLkxJQlJBUllfVVBEQVRFX0VSUk9SJyk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVuc2hhcmVOb2RlcyhsaW5rczogQXJyYXk8Tm9kZUVudHJ5Pikge1xuICAgIGNvbnN0IHByb21pc2VzID0gbGlua3MubWFwKChsaW5rKSA9PiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlU2hhcmVkTGluayhsaW5rLmVudHJ5LmlkKS50b1Byb21pc2UoKSk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIHRoaXMuYXBwSG9va1NlcnZpY2UubGlua3NVbnNoYXJlZC5uZXh0KCk7XG4gIH1cblxuICBjYW5VcGRhdGVOb2RlKG5vZGU6IE5vZGVFbnRyeSB8IE5vZGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZXJtaXNzaW9uLmNoZWNrKG5vZGUsIFsndXBkYXRlJ10pO1xuICB9XG5cbiAgY2FuVXBsb2FkQ29udGVudChmb2xkZXJOb2RlOiBOb2RlRW50cnkgfCBOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVybWlzc2lvbi5jaGVjayhmb2xkZXJOb2RlLCBbJ2NyZWF0ZSddKTtcbiAgfVxuXG4gIHB1cmdlRGVsZXRlZE5vZGVzKG5vZGVzOiBOb2RlRW50cnlbXSkge1xuICAgIGlmICghbm9kZXMgfHwgbm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dSZWYub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRpdGxlOiAnQVBQLkRJQUxPR1MuQ09ORklSTV9QVVJHRS5USVRMRScsXG4gICAgICAgIG1lc3NhZ2U6ICdBUFAuRElBTE9HUy5DT05GSVJNX1BVUkdFLk1FU1NBR0UnLFxuICAgICAgICB5ZXNMYWJlbDogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fUFVSR0UuWUVTX0xBQkVMJyxcbiAgICAgICAgbm9MYWJlbDogJ0FQUC5ESUFMT0dTLkNPTkZJUk1fUFVSR0UuTk9fTEFCRUwnXG4gICAgICB9LFxuICAgICAgbWluV2lkdGg6ICcyNTBweCdcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzVG9EZWxldGU6IE5vZGVJbmZvW10gPSBub2Rlcy5tYXAoKG5vZGUpID0+IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuZW50cnk7XG4gICAgICAgICAgY29uc3QgaWQgPSAobm9kZSBhcyBhbnkpLmVudHJ5Lm5vZGVJZCB8fCBub2RlLmVudHJ5LmlkO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgbmFtZVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnB1cmdlTm9kZXMobm9kZXNUb0RlbGV0ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICByZXN0b3JlRGVsZXRlZE5vZGVzKHNlbGVjdGlvbjogTm9kZUVudHJ5W10gPSBbXSkge1xuICAgIGlmICghc2VsZWN0aW9uLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG5vZGVzV2l0aFBhdGggPSBzZWxlY3Rpb24uZmlsdGVyKChub2RlKSA9PiBub2RlLmVudHJ5LnBhdGgpO1xuXG4gICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggJiYgIW5vZGVzV2l0aFBhdGgubGVuZ3RoKSB7XG4gICAgICBjb25zdCBmYWlsZWRTdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMoW10pO1xuICAgICAgZmFpbGVkU3RhdHVzLmZhaWwucHVzaCguLi5zZWxlY3Rpb24pO1xuICAgICAgdGhpcy5zaG93UmVzdG9yZU5vdGlmaWNhdGlvbihmYWlsZWRTdGF0dXMpO1xuICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzdGF0dXM6IERlbGV0ZVN0YXR1cztcblxuICAgIGZvcmtKb2luKG5vZGVzV2l0aFBhdGgubWFwKChub2RlKSA9PiB0aGlzLnJlc3RvcmVOb2RlKG5vZGUpKSlcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKHJlc3RvcmVkTm9kZXMpID0+IHtcbiAgICAgICAgICBzdGF0dXMgPSB0aGlzLnByb2Nlc3NTdGF0dXMocmVzdG9yZWROb2Rlcyk7XG4gICAgICAgIH0pLFxuICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLmNvbnRlbnRBcGkuZ2V0RGVsZXRlZE5vZGVzKCkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChub2RlczogRGVsZXRlZE5vZGVzUGFnaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTm9kZXMgPSB0aGlzLmRpZmYoc3RhdHVzLmZhaWwsIHNlbGVjdGlvbiwgZmFsc2UpO1xuICAgICAgICBjb25zdCByZW1haW5pbmdOb2RlcyA9IHRoaXMuZGlmZihzZWxlY3RlZE5vZGVzLCBub2Rlcy5saXN0LmVudHJpZXMpO1xuXG4gICAgICAgIGlmICghcmVtYWluaW5nTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5zaG93UmVzdG9yZU5vdGlmaWNhdGlvbihzdGF0dXMpO1xuICAgICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlc3RvcmVEZWxldGVkTm9kZXMocmVtYWluaW5nTm9kZXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIGNvcHlOb2Rlcyhub2RlczogQXJyYXk8Tm9kZUVudHJ5PiwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3I/OiBzdHJpbmcpIHtcbiAgICB6aXAodGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29weU5vZGVzKG5vZGVzLCB1bmRlZmluZWQsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKSwgdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29udGVudENvcGllZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBjb25zdCBbb3BlcmF0aW9uUmVzdWx0LCBuZXdJdGVtc10gPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2hvd0NvcHlNZXNzYWdlKG9wZXJhdGlvblJlc3VsdCwgbm9kZXMsIG5ld0l0ZW1zKTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5zaG93Q29weU1lc3NhZ2UoZXJyb3IsIG5vZGVzKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgbW92ZU5vZGVzKG5vZGVzOiBBcnJheTxOb2RlRW50cnk+LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZykge1xuICAgIGNvbnN0IHBlcm1pc3Npb25Gb3JNb3ZlID0gJyEnO1xuXG4gICAgemlwKHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLm1vdmVOb2Rlcyhub2RlcywgcGVybWlzc2lvbkZvck1vdmUsIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yKSwgdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UuY29udGVudE1vdmVkKS5zdWJzY3JpYmUoXG4gICAgICAocmVzdWx0KSA9PiB7XG4gICAgICAgIGNvbnN0IFtvcGVyYXRpb25SZXN1bHQsIG1vdmVSZXNwb25zZV0gPSByZXN1bHQ7XG4gICAgICAgIHRoaXMuc2hvd01vdmVNZXNzYWdlKG5vZGVzLCBvcGVyYXRpb25SZXN1bHQsIG1vdmVSZXNwb25zZSk7XG5cbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgfSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLnNob3dNb3ZlTWVzc2FnZShub2RlcywgZXJyb3IpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnZXRFcnJvck1lc3NhZ2UoZXJyb3JPYmplY3Q6IHsgbWVzc2FnZTogYW55IH0pOiBzdHJpbmcge1xuICAgIGxldCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICB9ID0gSlNPTi5wYXJzZShlcnJvck9iamVjdC5tZXNzYWdlKTtcblxuICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwOSkge1xuICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfTU9WRSc7XG4gICAgICB9IGVsc2UgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLlBFUk1JU1NJT04nO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLyogRG8gbm90aGluZywga2VlcCB0aGUgb3JpZ2luYWwgbWVzc2FnZSAqL1xuICAgIH1cblxuICAgIHJldHVybiBpMThuTWVzc2FnZVN0cmluZztcbiAgfVxuXG4gIGdldE5vZGVJbmZvKCk6IE9ic2VydmFibGU8Tm9kZT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChnZXRBcHBTZWxlY3Rpb24pLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWVyZ2VNYXAoKHsgZmlsZSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gKGZpbGUgYXMgYW55KS5lbnRyeS5ub2RlSWQgfHwgKGZpbGUgYXMgYW55KS5lbnRyeS5ndWlkO1xuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKGZpbGUuZW50cnkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkuZ2V0Tm9kZUluZm8oaWQpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICB1bmxvY2tOb2RlKG5vZGU6IE5vZGVFbnRyeSk6IFByb21pc2U8dm9pZCB8IE5vZGVFbnRyeT4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkudW5sb2NrTm9kZShub2RlLmVudHJ5LmlkKS5jYXRjaCgoKSA9PiB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdBUFAuTUVTU0FHRVMuRVJST1JTLlVOTE9DS19OT0RFJywgbnVsbCwgeyBmaWxlTmFtZTogbm9kZS5lbnRyeS5uYW1lIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaG93Q29weU1lc3NhZ2UoaW5mbzogYW55LCBub2RlczogQXJyYXk8Tm9kZUVudHJ5PiwgbmV3SXRlbXM/OiBBcnJheTxOb2RlRW50cnk+KSB7XG4gICAgY29uc3QgbnVtYmVyT2ZDb3BpZWRJdGVtcyA9IG5ld0l0ZW1zID8gbmV3SXRlbXMubGVuZ3RoIDogMDtcbiAgICBjb25zdCBmYWlsZWRJdGVtcyA9IG5vZGVzLmxlbmd0aCAtIG51bWJlck9mQ29waWVkSXRlbXM7XG5cbiAgICBsZXQgaTE4bk1lc3NhZ2VTdHJpbmcgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5HRU5FUklDJztcblxuICAgIGlmICh0eXBlb2YgaW5mbyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmIChpbmZvLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc3VjY2VzJykgIT09IC0xKSB7XG4gICAgICAgIGxldCBpMThNZXNzYWdlU3VmZml4O1xuXG4gICAgICAgIGlmIChmYWlsZWRJdGVtcykge1xuICAgICAgICAgIGlmIChudW1iZXJPZkNvcGllZEl0ZW1zKSB7XG4gICAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gbnVtYmVyT2ZDb3BpZWRJdGVtcyA9PT0gMSA/ICdQQVJUSUFMX1NJTkdVTEFSJyA6ICdQQVJUSUFMX1BMVVJBTCc7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSBmYWlsZWRJdGVtcyA9PT0gMSA/ICdGQUlMX1NJTkdVTEFSJyA6ICdGQUlMX1BMVVJBTCc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSBudW1iZXJPZkNvcGllZEl0ZW1zID09PSAxID8gJ1NJTkdVTEFSJyA6ICdQTFVSQUwnO1xuICAgICAgICB9XG5cbiAgICAgICAgaTE4bk1lc3NhZ2VTdHJpbmcgPSBgQVBQLk1FU1NBR0VTLklORk8uTk9ERV9DT1BZLiR7aTE4TWVzc2FnZVN1ZmZpeH1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZXJyb3I6IHsgc3RhdHVzQ29kZSB9XG4gICAgICAgIH0gPSBKU09OLnBhcnNlKGluZm8ubWVzc2FnZSk7XG5cbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwMykge1xuICAgICAgICAgIGkxOG5NZXNzYWdlU3RyaW5nID0gJ0FQUC5NRVNTQUdFUy5FUlJPUlMuUEVSTUlTU0lPTic7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG5cbiAgICBjb25zdCB1bmRvID0gbnVtYmVyT2ZDb3BpZWRJdGVtcyA+IDAgPyB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5BQ1RJT05TLlVORE8nKSA6ICcnO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRpb24uaW5zdGFudChpMThuTWVzc2FnZVN0cmluZywge1xuICAgICAgc3VjY2VzczogbnVtYmVyT2ZDb3BpZWRJdGVtcyxcbiAgICAgIGZhaWxlZDogZmFpbGVkSXRlbXNcbiAgICB9KTtcblxuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZVxuICAgICAgLm9wZW5TbmFja01lc3NhZ2VBY3Rpb24obWVzc2FnZSwgdW5kbywge1xuICAgICAgICBwYW5lbENsYXNzOiAnaW5mby1zbmFja2JhcidcbiAgICAgIH0pXG4gICAgICAub25BY3Rpb24oKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVuZG9Db3B5Tm9kZXMobmV3SXRlbXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5kb0NvcHlOb2Rlcyhub2RlczogTm9kZUVudHJ5W10pIHtcbiAgICBjb25zdCBiYXRjaCA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlXG4gICAgICAuZmxhdHRlbihub2RlcylcbiAgICAgIC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uZW50cnkpXG4gICAgICAubWFwKChpdGVtKSA9PiB0aGlzLmNvbnRlbnRBcGkuZGVsZXRlTm9kZShpdGVtLmVudHJ5LmlkLCB7IHBlcm1hbmVudDogdHJ1ZSB9KSk7XG5cbiAgICBmb3JrSm9pbiguLi5iYXRjaCkuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcEhvb2tTZXJ2aWNlLm5vZGVzRGVsZXRlZC5uZXh0KG51bGwpO1xuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIGxldCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuRVJST1JTLkdFTkVSSUMnO1xuXG4gICAgICAgIGxldCBlcnJvckpzb24gPSBudWxsO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGVycm9ySnNvbiA9IEpTT04ucGFyc2UoZXJyb3IubWVzc2FnZSk7XG4gICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICBpZiAoZXJyb3JKc29uPy5lcnJvcj8uc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgaTE4bk1lc3NhZ2VTdHJpbmcgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5QRVJNSVNTSU9OJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoaTE4bk1lc3NhZ2VTdHJpbmcpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5WZXJzaW9uTWFuYWdlckRpYWxvZyhub2RlOiBhbnksIGZvY3VzZWRFbGVtZW50T25DbG9zZVNlbGVjdG9yPzogc3RyaW5nKSB7XG4gICAgLy8gd29ya2Fyb3VuZCBTaGFyZWRcbiAgICBpZiAobm9kZS5pc0ZpbGUgfHwgbm9kZS5ub2RlSWQpIHtcbiAgICAgIGNvbnN0IG5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGE6IE5ld1ZlcnNpb25VcGxvYWRlckRpYWxvZ0RhdGEgPSB7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIHNob3dWZXJzaW9uc09ubHk6IHRydWUsXG4gICAgICAgIHRpdGxlOiAnVkVSU0lPTi5ESUFMT0cuVElUTEUnLFxuICAgICAgICBhbGxvd0Rvd25sb2FkOiB0aGlzLmFwcFNldHRpbmdzU2VydmljZS51cGxvYWRBbGxvd0Rvd25sb2FkLFxuICAgICAgICBzaG93Q29tbWVudHM6IHRoaXMuYXBwU2V0dGluZ3NTZXJ2aWNlLnVwbG9hZEFsbG93Q29tbWVudHMsXG4gICAgICAgIHNob3dBY3Rpb25zOiB0aGlzLmFwcFNldHRpbmdzU2VydmljZS52ZXJzaW9uTWFuYWdlclNob3dBY3Rpb25zLFxuICAgICAgICBhbGxvd1ZpZXdWZXJzaW9uczogdGhpcy5hcHBTZXR0aW5nc1NlcnZpY2UudmVyc2lvbk1hbmFnZXJBbGxvd1ZpZXdWZXJzaW9ucyxcbiAgICAgICAgYWxsb3dWZXJzaW9uRGVsZXRlOiB0aGlzLmFwcFNldHRpbmdzU2VydmljZS52ZXJzaW9uTWFuYWdlckFsbG93VmVyc2lvbkRlbGV0ZVxuICAgICAgfTtcbiAgICAgIHRoaXMubmV3VmVyc2lvblVwbG9hZGVyU2VydmljZVxuICAgICAgICAub3BlblVwbG9hZE5ld1ZlcnNpb25EaWFsb2cobmV3VmVyc2lvblVwbG9hZGVyRGlhbG9nRGF0YSwgeyB3aWR0aDogJzYzMHB4Jywgcm9sZTogJ2RpYWxvZycgfSwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpXG4gICAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChuZXdWZXJzaW9uVXBsb2FkZXJEYXRhKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKG5ld1ZlcnNpb25VcGxvYWRlckRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgIGNhc2UgTmV3VmVyc2lvblVwbG9hZGVyRGF0YUFjdGlvbi5yZWZyZXNoOlxuICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnRMaXN0U2VydmljZS5yZWxvYWQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBSZWZyZXNoUHJldmlld0FjdGlvbihuZXdWZXJzaW9uVXBsb2FkZXJEYXRhLm5vZGUpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBOZXdWZXJzaW9uVXBsb2FkZXJEYXRhQWN0aW9uLnZpZXc6XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICAgIG5ldyBWaWV3Tm9kZVZlcnNpb25BY3Rpb24obm9kZS5pZCwgbmV3VmVyc2lvblVwbG9hZGVyRGF0YS52ZXJzaW9uSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IHRoaXMucm91dGVyLnVybFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuUEVSTUlTU0lPTicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgb3BlbkFzcGVjdExpc3REaWFsb2cobm9kZTogYW55LCBmb2N1c2VkRWxlbWVudE9uQ2xvc2VTZWxlY3Rvcj86IHN0cmluZykge1xuICAgIC8vIHdvcmthcm91bmQgU2hhcmVkXG4gICAgaWYgKG5vZGUuaXNGaWxlIHx8IG5vZGUuaWQpIHtcbiAgICAgIHRoaXMubm9kZUFzcGVjdFNlcnZpY2UudXBkYXRlTm9kZUFzcGVjdHMobm9kZS5pZCwgZm9jdXNlZEVsZW1lbnRPbkNsb3NlU2VsZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdBUFAuTUVTU0FHRVMuRVJST1JTLlBFUk1JU1NJT04nKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVuZG9Nb3ZlTm9kZXMobW92ZVJlc3BvbnNlLCBzZWxlY3Rpb25QYXJlbnRJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgbW92ZWROb2RlcyA9IG1vdmVSZXNwb25zZT8uWydzdWNjZWVkZWQnXSA/PyBbXTtcbiAgICBjb25zdCBwYXJ0aWFsbHlNb3ZlZE5vZGVzID0gbW92ZVJlc3BvbnNlPy5bJ3BhcnRpYWxseVN1Y2NlZWRlZCddID8/IFtdO1xuXG4gICAgY29uc3QgcmVzdG9yZURlbGV0ZWROb2Rlc0JhdGNoID0gdGhpcy5ub2RlQWN0aW9uc1NlcnZpY2UubW92ZURlbGV0ZWRFbnRyaWVzLm1hcCgoZm9sZGVyRW50cnkpID0+XG4gICAgICB0aGlzLmNvbnRlbnRBcGkucmVzdG9yZU5vZGUoZm9sZGVyRW50cnkubm9kZUlkIHx8IGZvbGRlckVudHJ5LmlkKS5waXBlKG1hcCgobm9kZSkgPT4gbm9kZS5lbnRyeSkpXG4gICAgKTtcblxuICAgIHppcCguLi5yZXN0b3JlRGVsZXRlZE5vZGVzQmF0Y2gsIG9mKG51bGwpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1lcmdlTWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBub2Rlc1RvQmVNb3ZlZEJhY2sgPSBbLi4ucGFydGlhbGx5TW92ZWROb2RlcywgLi4ubW92ZWROb2Rlc107XG5cbiAgICAgICAgICBjb25zdCByZXZlcnRNb3ZlQmF0Y2ggPSB0aGlzLm5vZGVBY3Rpb25zU2VydmljZVxuICAgICAgICAgICAgLmZsYXR0ZW4obm9kZXNUb0JlTW92ZWRCYWNrKVxuICAgICAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gbm9kZS5lbnRyeSB8fCBub2RlLml0ZW1Nb3ZlZD8uZW50cnkpXG4gICAgICAgICAgICAubWFwKChub2RlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChub2RlLml0ZW1Nb3ZlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVBY3Rpb25zU2VydmljZS5tb3ZlTm9kZUFjdGlvbihub2RlLml0ZW1Nb3ZlZC5lbnRyeSwgbm9kZS5pbml0aWFsUGFyZW50SWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVBY3Rpb25zU2VydmljZS5tb3ZlTm9kZUFjdGlvbihub2RlLmVudHJ5LCBzZWxlY3Rpb25QYXJlbnRJZCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHppcCguLi5yZXZlcnRNb3ZlQmF0Y2gsIG9mKG51bGwpKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGxldCBtZXNzYWdlID0gJ0FQUC5NRVNTQUdFUy5FUlJPUlMuR0VORVJJQyc7XG5cbiAgICAgICAgICBsZXQgZXJyb3JKc29uID0gbnVsbDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZXJyb3JKc29uID0gSlNPTi5wYXJzZShlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgICBpZiAoZXJyb3JKc29uPy5lcnJvcj8uc3RhdHVzQ29kZSA9PT0gNDAzKSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gJ0FQUC5NRVNTQUdFUy5FUlJPUlMuUEVSTUlTU0lPTic7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIGRlbGV0ZU5vZGVzKGl0ZW1zOiBOb2RlRW50cnlbXSk6IHZvaWQge1xuICAgIGNvbnN0IGJhdGNoOiBPYnNlcnZhYmxlPERlbGV0ZWROb2RlSW5mbz5bXSA9IFtdO1xuXG4gICAgaXRlbXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgYmF0Y2gucHVzaCh0aGlzLmRlbGV0ZU5vZGUobm9kZSkpO1xuICAgIH0pO1xuXG4gICAgZm9ya0pvaW4oLi4uYmF0Y2gpLnN1YnNjcmliZSgoZGF0YTogRGVsZXRlZE5vZGVJbmZvW10pID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMucHJvY2Vzc1N0YXR1cyhkYXRhKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldERlbGV0ZU1lc3NhZ2Uoc3RhdHVzKTtcblxuICAgICAgaWYgKG1lc3NhZ2UgJiYgc3RhdHVzLnNvbWVTdWNjZWVkZWQpIHtcbiAgICAgICAgbWVzc2FnZS51c2VyQWN0aW9uID0gbmV3IFNuYWNrYmFyVXNlckFjdGlvbignQVBQLkFDVElPTlMuVU5ETycsIG5ldyBVbmRvRGVsZXRlTm9kZXNBY3Rpb24oWy4uLnN0YXR1cy5zdWNjZXNzXSkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG1lc3NhZ2UpO1xuXG4gICAgICBpZiAoc3RhdHVzLnNvbWVTdWNjZWVkZWQpIHtcbiAgICAgICAgdGhpcy5hcHBIb29rU2VydmljZS5ub2Rlc0RlbGV0ZWQubmV4dCgpO1xuICAgICAgICB0aGlzLmRvY3VtZW50TGlzdFNlcnZpY2UucmVsb2FkKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5ldyBTaG93TG9hZGVyQWN0aW9uKGZhbHNlKSk7XG4gICAgfSk7XG4gIH1cblxuICB1bmRvRGVsZXRlTm9kZXMoaXRlbXM6IERlbGV0ZWROb2RlSW5mb1tdKTogdm9pZCB7XG4gICAgY29uc3QgYmF0Y2g6IE9ic2VydmFibGU8RGVsZXRlZE5vZGVJbmZvPltdID0gW107XG5cbiAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICBiYXRjaC5wdXNoKHRoaXMudW5kb0RlbGV0ZU5vZGUoaXRlbSkpO1xuICAgIH0pO1xuXG4gICAgZm9ya0pvaW4oLi4uYmF0Y2gpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgcHJvY2Vzc2VkRGF0YSA9IHRoaXMucHJvY2Vzc1N0YXR1cyhkYXRhKTtcblxuICAgICAgaWYgKHByb2Nlc3NlZERhdGEuZmFpbC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0VW5kb0RlbGV0ZU1lc3NhZ2UocHJvY2Vzc2VkRGF0YSk7XG4gICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm9jZXNzZWREYXRhLnNvbWVTdWNjZWVkZWQpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1bmRvRGVsZXRlTm9kZShpdGVtOiBEZWxldGVkTm9kZUluZm8pOiBPYnNlcnZhYmxlPERlbGV0ZWROb2RlSW5mbz4ge1xuICAgIGNvbnN0IHsgaWQsIG5hbWUgfSA9IGl0ZW07XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50QXBpLnJlc3RvcmVOb2RlKGlkKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7XG4gICAgICAgIGlkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzdGF0dXM6IDFcbiAgICAgIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgb2Yoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc3RhdHVzOiAwXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5kb0RlbGV0ZU1lc3NhZ2Uoc3RhdHVzOiBEZWxldGVTdGF0dXMpOiBTbmFja2JhckFjdGlvbiB7XG4gICAgaWYgKHN0YXR1cy5zb21lRmFpbGVkICYmICFzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuTk9ERV9SRVNUT1JFX1BMVVJBTCcsIHsgbnVtYmVyOiBzdGF0dXMuZmFpbC5sZW5ndGggfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5vbmVGYWlsZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5OT0RFX1JFU1RPUkUnLCB7XG4gICAgICAgIG5hbWU6IHN0YXR1cy5mYWlsWzBdLm5hbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlTm9kZShub2RlOiBOb2RlRW50cnkpOiBPYnNlcnZhYmxlPFJlc3RvcmVkTm9kZT4ge1xuICAgIGNvbnN0IHsgZW50cnkgfSA9IG5vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5jb250ZW50QXBpLnJlc3RvcmVOb2RlKGVudHJ5LmlkKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7XG4gICAgICAgIHN0YXR1czogMSxcbiAgICAgICAgZW50cnlcbiAgICAgIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKGVycm9yKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzQ29kZSB9ID0gSlNPTi5wYXJzZShlcnJvci5tZXNzYWdlKS5lcnJvcjtcblxuICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgIGVudHJ5XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXJnZU5vZGVzKHNlbGVjdGlvbjogTm9kZUluZm9bXSA9IFtdKSB7XG4gICAgaWYgKCFzZWxlY3Rpb24ubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgYmF0Y2ggPSBzZWxlY3Rpb24ubWFwKChub2RlKSA9PiB0aGlzLnB1cmdlRGVsZXRlZE5vZGUobm9kZSkpO1xuXG4gICAgZm9ya0pvaW4oYmF0Y2gpLnN1YnNjcmliZSgocHVyZ2VkTm9kZXMpID0+IHtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHRoaXMucHJvY2Vzc1N0YXR1cyhwdXJnZWROb2Rlcyk7XG5cbiAgICAgIGlmIChzdGF0dXMuc3VjY2Vzcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5kb2N1bWVudExpc3RTZXJ2aWNlLnJlbG9hZCgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNlbmRQdXJnZU1lc3NhZ2Uoc3RhdHVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcHVyZ2VEZWxldGVkTm9kZShub2RlOiBOb2RlSW5mbyk6IE9ic2VydmFibGU8RGVsZXRlZE5vZGVJbmZvPiB7XG4gICAgY29uc3QgeyBpZCwgbmFtZSB9ID0gbm9kZTtcblxuICAgIHJldHVybiB0aGlzLmNvbnRlbnRBcGkucHVyZ2VEZWxldGVkTm9kZShpZCkucGlwZShcbiAgICAgIG1hcCgoKSA9PiAoe1xuICAgICAgICBzdGF0dXM6IDEsXG4gICAgICAgIGlkLFxuICAgICAgICBuYW1lXG4gICAgICB9KSksXG4gICAgICBjYXRjaEVycm9yKCgpID0+XG4gICAgICAgIG9mKHtcbiAgICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgbmFtZVxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NTdGF0dXMoZGF0YTogQXJyYXk8eyBzdGF0dXM6IG51bWJlciB9PiA9IFtdKTogRGVsZXRlU3RhdHVzIHtcbiAgICBjb25zdCBzdGF0dXMgPSB7XG4gICAgICBmYWlsOiBbXSxcbiAgICAgIHN1Y2Nlc3M6IFtdLFxuICAgICAgZ2V0IHNvbWVGYWlsZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuZmFpbC5sZW5ndGg7XG4gICAgICB9LFxuICAgICAgZ2V0IHNvbWVTdWNjZWVkZWQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuc3VjY2Vzcy5sZW5ndGg7XG4gICAgICB9LFxuICAgICAgZ2V0IG9uZUZhaWxlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmFpbC5sZW5ndGggPT09IDE7XG4gICAgICB9LFxuICAgICAgZ2V0IG9uZVN1Y2NlZWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3VjY2Vzcy5sZW5ndGggPT09IDE7XG4gICAgICB9LFxuICAgICAgZ2V0IGFsbFN1Y2NlZWRlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc29tZVN1Y2NlZWRlZCAmJiAhdGhpcy5zb21lRmFpbGVkO1xuICAgICAgfSxcbiAgICAgIGdldCBhbGxGYWlsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvbWVGYWlsZWQgJiYgIXRoaXMuc29tZVN1Y2NlZWRlZDtcbiAgICAgIH0sXG4gICAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5mYWlsID0gW107XG4gICAgICAgIHRoaXMuc3VjY2VzcyA9IFtdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gZGF0YS5yZWR1Y2UoKGFjYywgbm9kZSkgPT4ge1xuICAgICAgaWYgKG5vZGUuc3RhdHVzKSB7XG4gICAgICAgIGFjYy5zdWNjZXNzLnB1c2gobm9kZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY2MuZmFpbC5wdXNoKG5vZGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHN0YXR1cyk7XG4gIH1cblxuICBwcml2YXRlIHNlbmRQdXJnZU1lc3NhZ2Uoc3RhdHVzOiBEZWxldGVTdGF0dXMpOiB2b2lkIHtcbiAgICBpZiAoc3RhdHVzLm9uZVN1Y2NlZWRlZCAmJiBzdGF0dXMuc29tZUZhaWxlZCAmJiAhc3RhdHVzLm9uZUZhaWxlZCkge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLnNob3dXYXJuaW5nKCdBUFAuTUVTU0FHRVMuSU5GTy5UUkFTSC5OT0RFU19QVVJHRS5QQVJUSUFMX1NJTkdVTEFSJywgbnVsbCwge1xuICAgICAgICBuYW1lOiBzdGF0dXMuc3VjY2Vzc1swXS5uYW1lLFxuICAgICAgICBmYWlsZWQ6IHN0YXR1cy5mYWlsLmxlbmd0aFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5zb21lU3VjY2VlZGVkICYmICFzdGF0dXMub25lU3VjY2VlZGVkICYmIHN0YXR1cy5zb21lRmFpbGVkKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd1dhcm5pbmcoJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1BVUkdFLlBBUlRJQUxfUExVUkFMJywgbnVsbCwge1xuICAgICAgICBudW1iZXI6IHN0YXR1cy5zdWNjZXNzLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkOiBzdGF0dXMuZmFpbC5sZW5ndGhcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0luZm8oJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1BVUkdFLlNJTkdVTEFSJywgbnVsbCwgeyBuYW1lOiBzdGF0dXMuc3VjY2Vzc1swXS5uYW1lIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0Vycm9yKCdBUFAuTUVTU0FHRVMuRVJST1JTLlRSQVNILk5PREVTX1BVUkdFLlNJTkdVTEFSJywgbnVsbCwgeyBuYW1lOiBzdGF0dXMuZmFpbFswXS5uYW1lIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuYWxsU3VjY2VlZGVkKSB7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0luZm8oJ0FQUC5NRVNTQUdFUy5JTkZPLlRSQVNILk5PREVTX1BVUkdFLlBMVVJBTCcsIG51bGwsIHsgbnVtYmVyOiBzdGF0dXMuc3VjY2Vzcy5sZW5ndGggfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5hbGxGYWlsZWQpIHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93RXJyb3IoJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUFVSR0UuUExVUkFMJywgbnVsbCwgeyBudW1iZXI6IHN0YXR1cy5mYWlsLmxlbmd0aCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNob3dSZXN0b3JlTm90aWZpY2F0aW9uKHN0YXR1czogRGVsZXRlU3RhdHVzKTogdm9pZCB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuZ2V0UmVzdG9yZU1lc3NhZ2Uoc3RhdHVzKTtcblxuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICBpZiAoc3RhdHVzLm9uZVN1Y2NlZWRlZCAmJiAhc3RhdHVzLnNvbWVGYWlsZWQpIHtcbiAgICAgICAgY29uc3QgaXNTaXRlID0gdGhpcy5pc1NpdGUoc3RhdHVzLnN1Y2Nlc3NbMF0uZW50cnkpO1xuICAgICAgICBjb25zdCBwYXRoOiBQYXRoSW5mbyA9IHN0YXR1cy5zdWNjZXNzWzBdLmVudHJ5LnBhdGg7XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGguZWxlbWVudHNbcGF0aC5lbGVtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY29uc3Qgcm91dGUgPSBpc1NpdGUgPyBbJy9saWJyYXJpZXMnLCBwYXJlbnQuaWRdIDogWycvcGVyc29uYWwtZmlsZXMnLCBwYXJlbnQuaWRdO1xuXG4gICAgICAgIGxldCBuYXZpZ2F0ZTtcblxuICAgICAgICBpZiAodGhpcy5pc0xpYnJhcnlDb250ZW50KHBhdGgpKSB7XG4gICAgICAgICAgbmF2aWdhdGUgPSBuZXcgTmF2aWdhdGVUb1BhcmVudEZvbGRlcihzdGF0dXMuc3VjY2Vzc1swXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmF2aWdhdGUgPSBuZXcgTmF2aWdhdGVSb3V0ZUFjdGlvbihyb3V0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBtZXNzYWdlLnVzZXJBY3Rpb24gPSBuZXcgU25hY2tiYXJVc2VyQWN0aW9uKCdBUFAuQUNUSU9OUy5WSUVXJywgbmF2aWdhdGUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNTaXRlKGVudHJ5OiBOb2RlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVudHJ5Lm5vZGVUeXBlID09PSAnc3Q6c2l0ZSc7XG4gIH1cblxuICBwcml2YXRlIGlzTGlicmFyeUNvbnRlbnQocGF0aDogUGF0aEluZm8pOiBib29sZWFuIHtcbiAgICByZXR1cm4gcGF0aCAmJiBwYXRoLmVsZW1lbnRzLmxlbmd0aCA+PSAyICYmIHBhdGguZWxlbWVudHNbMV0ubmFtZSA9PT0gJ1NpdGVzJztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVzdG9yZU1lc3NhZ2Uoc3RhdHVzOiBEZWxldGVTdGF0dXMpOiBTbmFja2JhckFjdGlvbiB7XG4gICAgaWYgKHN0YXR1cy5zb21lRmFpbGVkICYmICFzdGF0dXMub25lRmFpbGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyRXJyb3JBY3Rpb24oJ0FQUC5NRVNTQUdFUy5FUlJPUlMuVFJBU0guTk9ERVNfUkVTVE9SRS5QQVJUSUFMX1BMVVJBTCcsIHtcbiAgICAgICAgbnVtYmVyOiBzdGF0dXMuZmFpbC5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lRmFpbGVkICYmIHN0YXR1cy5mYWlsWzBdLnN0YXR1c0NvZGUpIHtcbiAgICAgIGlmIChzdGF0dXMuZmFpbFswXS5zdGF0dXNDb2RlID09PSA0MDkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLlRSQVNILk5PREVTX1JFU1RPUkUuTk9ERV9FWElTVFMnLCB7XG4gICAgICAgICAgbmFtZTogc3RhdHVzLmZhaWxbMF0uZW50cnkubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgU25hY2tiYXJFcnJvckFjdGlvbignQVBQLk1FU1NBR0VTLkVSUk9SUy5UUkFTSC5OT0RFU19SRVNUT1JFLkdFTkVSSUMnLCB7XG4gICAgICAgICAgbmFtZTogc3RhdHVzLmZhaWxbMF0uZW50cnkubmFtZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLm9uZUZhaWxlZCAmJiAhc3RhdHVzLmZhaWxbMF0uc3RhdHVzQ29kZSkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLlRSQVNILk5PREVTX1JFU1RPUkUuTE9DQVRJT05fTUlTU0lORycsIHtcbiAgICAgICAgbmFtZTogc3RhdHVzLmZhaWxbMF0uZW50cnkubmFtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5hbGxTdWNjZWVkZWQgJiYgIXN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJJbmZvQWN0aW9uKCdBUFAuTUVTU0FHRVMuSU5GTy5UUkFTSC5OT0RFU19SRVNUT1JFLlBMVVJBTCcpO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMuYWxsU3VjY2VlZGVkICYmIHN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJJbmZvQWN0aW9uKCdBUFAuTUVTU0FHRVMuSU5GTy5UUkFTSC5OT0RFU19SRVNUT1JFLlNJTkdVTEFSJywge1xuICAgICAgICBuYW1lOiBzdGF0dXMuc3VjY2Vzc1swXS5lbnRyeS5uYW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZGlmZihzZWxlY3Rpb246IGFueVtdLCBsaXN0OiBhbnlbXSwgZnJvbUxpc3QgPSB0cnVlKTogYW55IHtcbiAgICBjb25zdCBpZHMgPSBzZWxlY3Rpb24ubWFwKChpdGVtKSA9PiBpdGVtLmVudHJ5LmlkKTtcblxuICAgIHJldHVybiBsaXN0LmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgaWYgKGZyb21MaXN0KSB7XG4gICAgICAgIHJldHVybiBpZHMuaW5jbHVkZXMoaXRlbS5lbnRyeS5pZCkgPyBpdGVtIDogbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAhaWRzLmluY2x1ZGVzKGl0ZW0uZW50cnkuaWQpID8gaXRlbSA6IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRlbGV0ZU5vZGUobm9kZTogYW55KTogT2JzZXJ2YWJsZTxEZWxldGVkTm9kZUluZm8+IHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IG5vZGUuZW50cnk7XG4gICAgY29uc3QgaWQgPSBub2RlLmVudHJ5Lm5vZGVJZCB8fCBub2RlLmVudHJ5LmlkO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudEFwaS5kZWxldGVOb2RlKGlkKS5waXBlKFxuICAgICAgbWFwKCgpID0+ICh7XG4gICAgICAgIGlkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBzdGF0dXM6IDFcbiAgICAgIH0pKSxcbiAgICAgIGNhdGNoRXJyb3IoKCkgPT5cbiAgICAgICAgb2Yoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgc3RhdHVzOiAwXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVsZXRlTWVzc2FnZShzdGF0dXM6IERlbGV0ZVN0YXR1cyk6IFNuYWNrYmFyQWN0aW9uIHtcbiAgICBpZiAoc3RhdHVzLmFsbEZhaWxlZCAmJiAhc3RhdHVzLm9uZUZhaWxlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfREVMRVRJT05fUExVUkFMJywgeyBudW1iZXI6IHN0YXR1cy5mYWlsLmxlbmd0aCB9KTtcbiAgICB9XG5cbiAgICBpZiAoc3RhdHVzLmFsbFN1Y2NlZWRlZCAmJiAhc3RhdHVzLm9uZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckluZm9BY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLk5PREVfREVMRVRJT04uUExVUkFMJywge1xuICAgICAgICBudW1iZXI6IHN0YXR1cy5zdWNjZXNzLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5zb21lRmFpbGVkICYmIHN0YXR1cy5zb21lU3VjY2VlZGVkICYmICFzdGF0dXMub25lU3VjY2VlZGVkKSB7XG4gICAgICByZXR1cm4gbmV3IFNuYWNrYmFyV2FybmluZ0FjdGlvbignQVBQLk1FU1NBR0VTLklORk8uTk9ERV9ERUxFVElPTi5QQVJUSUFMX1BMVVJBTCcsIHtcbiAgICAgICAgc3VjY2Vzczogc3RhdHVzLnN1Y2Nlc3MubGVuZ3RoLFxuICAgICAgICBmYWlsZWQ6IHN0YXR1cy5mYWlsLmxlbmd0aFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cy5zb21lRmFpbGVkICYmIHN0YXR1cy5vbmVTdWNjZWVkZWQpIHtcbiAgICAgIHJldHVybiBuZXcgU25hY2tiYXJXYXJuaW5nQWN0aW9uKCdBUFAuTUVTU0FHRVMuSU5GTy5OT0RFX0RFTEVUSU9OLlBBUlRJQUxfU0lOR1VMQVInLCB7XG4gICAgICAgIHN1Y2Nlc3M6IHN0YXR1cy5zdWNjZXNzLmxlbmd0aCxcbiAgICAgICAgZmFpbGVkOiBzdGF0dXMuZmFpbC5sZW5ndGhcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lRmFpbGVkICYmICFzdGF0dXMuc29tZVN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckVycm9yQWN0aW9uKCdBUFAuTUVTU0FHRVMuRVJST1JTLk5PREVfREVMRVRJT04nLCB7XG4gICAgICAgIG5hbWU6IHN0YXR1cy5mYWlsWzBdLm5hbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChzdGF0dXMub25lU3VjY2VlZGVkICYmICFzdGF0dXMuc29tZUZhaWxlZCkge1xuICAgICAgcmV0dXJuIG5ldyBTbmFja2JhckluZm9BY3Rpb24oJ0FQUC5NRVNTQUdFUy5JTkZPLk5PREVfREVMRVRJT04uU0lOR1VMQVInLCB7IG5hbWU6IHN0YXR1cy5zdWNjZXNzWzBdLm5hbWUgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIHNob3dNb3ZlTWVzc2FnZShub2RlczogQXJyYXk8Tm9kZUVudHJ5PiwgaW5mbzogYW55LCBtb3ZlUmVzcG9uc2U/OiBhbnkpIHtcbiAgICBjb25zdCBzdWNjZWVkZWQgPSBtb3ZlUmVzcG9uc2U/Llsnc3VjY2VlZGVkJ10ubGVuZ3RoID8/IDA7XG4gICAgY29uc3QgcGFydGlhbGx5U3VjY2VlZGVkID0gbW92ZVJlc3BvbnNlPy5bJ3BhcnRpYWxseVN1Y2NlZWRlZCddLmxlbmd0aCA/PyAwO1xuICAgIGNvbnN0IGZhaWx1cmVzID0gbW92ZVJlc3BvbnNlPy5bJ2ZhaWxlZCddLmxlbmd0aCA/PyAwO1xuXG4gICAgbGV0IHN1Y2Nlc3NNZXNzYWdlID0gJyc7XG4gICAgbGV0IHBhcnRpYWxTdWNjZXNzTWVzc2FnZSA9ICcnO1xuICAgIGxldCBmYWlsZWRNZXNzYWdlID0gJyc7XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9ICcnO1xuXG4gICAgaWYgKHR5cGVvZiBpbmZvID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gaW4gY2FzZSBvZiBzdWNjZXNzXG4gICAgICBpZiAoaW5mby50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3N1Y2NlcycpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBpMThuTWVzc2FnZVN0cmluZyA9ICdBUFAuTUVTU0FHRVMuSU5GTy5OT0RFX01PVkUuJztcbiAgICAgICAgbGV0IGkxOE1lc3NhZ2VTdWZmaXggPSAnJztcblxuICAgICAgICBpZiAoc3VjY2VlZGVkKSB7XG4gICAgICAgICAgaTE4TWVzc2FnZVN1ZmZpeCA9IHN1Y2NlZWRlZCA9PT0gMSA/ICdTSU5HVUxBUicgOiAnUExVUkFMJztcbiAgICAgICAgICBzdWNjZXNzTWVzc2FnZSA9IGAke2kxOG5NZXNzYWdlU3RyaW5nfSR7aTE4TWVzc2FnZVN1ZmZpeH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhcnRpYWxseVN1Y2NlZWRlZCkge1xuICAgICAgICAgIGkxOE1lc3NhZ2VTdWZmaXggPSBwYXJ0aWFsbHlTdWNjZWVkZWQgPT09IDEgPyAnUEFSVElBTC5TSU5HVUxBUicgOiAnUEFSVElBTC5QTFVSQUwnO1xuICAgICAgICAgIHBhcnRpYWxTdWNjZXNzTWVzc2FnZSA9IGAke2kxOG5NZXNzYWdlU3RyaW5nfSR7aTE4TWVzc2FnZVN1ZmZpeH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZhaWx1cmVzKSB7XG4gICAgICAgICAgLy8gaWYgbW92aW5nIGZhaWxlZCBmb3IgQUxMIG5vZGVzLCBlbWl0IGVycm9yXG4gICAgICAgICAgaWYgKGZhaWx1cmVzID09PSBub2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLmZsYXR0ZW4obW92ZVJlc3BvbnNlWydmYWlsZWQnXSk7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcnNbMF0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpMThNZXNzYWdlU3VmZml4ID0gJ1BBUlRJQUwuRkFJTCc7XG4gICAgICAgICAgICBmYWlsZWRNZXNzYWdlID0gYCR7aTE4bk1lc3NhZ2VTdHJpbmd9JHtpMThNZXNzYWdlU3VmZml4fWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSAnQVBQLk1FU1NBR0VTLkVSUk9SUy5HRU5FUklDJztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JNZXNzYWdlID0gdGhpcy5nZXRFcnJvck1lc3NhZ2UoaW5mbyk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5kbyA9IHN1Y2NlZWRlZCArIHBhcnRpYWxseVN1Y2NlZWRlZCA+IDAgPyB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoJ0FQUC5BQ1RJT05TLlVORE8nKSA6ICcnO1xuICAgIGZhaWxlZE1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgPyBlcnJvck1lc3NhZ2UgOiBmYWlsZWRNZXNzYWdlO1xuXG4gICAgY29uc3QgYmVmb3JlUGFydGlhbFN1Y2Nlc3NNZXNzYWdlID0gc3VjY2Vzc01lc3NhZ2UgJiYgcGFydGlhbFN1Y2Nlc3NNZXNzYWdlID8gJyAnIDogJyc7XG4gICAgY29uc3QgYmVmb3JlRmFpbGVkTWVzc2FnZSA9IChzdWNjZXNzTWVzc2FnZSB8fCBwYXJ0aWFsU3VjY2Vzc01lc3NhZ2UpICYmIGZhaWxlZE1lc3NhZ2UgPyAnICcgOiAnJztcblxuICAgIGNvbnN0IGluaXRpYWxQYXJlbnRJZCA9IHRoaXMubm9kZUFjdGlvbnNTZXJ2aWNlLmdldEVudHJ5UGFyZW50SWQobm9kZXNbMF0uZW50cnkpO1xuXG4gICAgY29uc3QgbWVzc2FnZXMgPSB0aGlzLnRyYW5zbGF0aW9uLmluc3RhbnQoW3N1Y2Nlc3NNZXNzYWdlLCBwYXJ0aWFsU3VjY2Vzc01lc3NhZ2UsIGZhaWxlZE1lc3NhZ2VdLCB7XG4gICAgICBzdWNjZXNzOiBzdWNjZWVkZWQsXG4gICAgICBmYWlsZWQ6IGZhaWx1cmVzLFxuICAgICAgcGFydGlhbGx5OiBwYXJ0aWFsbHlTdWNjZWVkZWRcbiAgICB9KTtcblxuICAgIC8vIFRPRE86IHJldmlldyBpbiB0ZXJtcyBvZiBpMThuXG4gICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlXG4gICAgICAub3BlblNuYWNrTWVzc2FnZUFjdGlvbihcbiAgICAgICAgbWVzc2FnZXNbc3VjY2Vzc01lc3NhZ2VdICsgYmVmb3JlUGFydGlhbFN1Y2Nlc3NNZXNzYWdlICsgbWVzc2FnZXNbcGFydGlhbFN1Y2Nlc3NNZXNzYWdlXSArIGJlZm9yZUZhaWxlZE1lc3NhZ2UgKyBtZXNzYWdlc1tmYWlsZWRNZXNzYWdlXSxcbiAgICAgICAgdW5kbyxcbiAgICAgICAge1xuICAgICAgICAgIHBhbmVsQ2xhc3M6ICdpbmZvLXNuYWNrYmFyJ1xuICAgICAgICB9XG4gICAgICApXG4gICAgICAub25BY3Rpb24oKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVuZG9Nb3ZlTm9kZXMobW92ZVJlc3BvbnNlLCBpbml0aWFsUGFyZW50SWQpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9jdXNBZnRlckNsb3NlKGZvY3VzZWRFbGVtZW50U2VsZWN0b3I6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChmb2N1c2VkRWxlbWVudFNlbGVjdG9yKSB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50Pihmb2N1c2VkRWxlbWVudFNlbGVjdG9yKT8uZm9jdXMoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==