@scion/workbench 18.0.0-beta.9 → 19.0.0-beta.1

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 (253) hide show
  1. package/design/_workbench-view-global-styles.scss +0 -1
  2. package/fesm2022/scion-workbench.mjs +8556 -8622
  3. package/fesm2022/scion-workbench.mjs.map +1 -1
  4. package/lib/common/css-class.util.d.ts +5 -0
  5. package/lib/common/math.util.d.ts +7 -0
  6. package/lib/common/objects.util.d.ts +1 -1
  7. package/lib/dialog/workbench-dialog.component.d.ts +1 -2
  8. package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
  9. package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
  10. package/lib/layout/workbench-layout.model.d.ts +0 -1
  11. package/lib/layout/workbench-layout.service.d.ts +10 -12
  12. package/lib/layout/workench-layout-serializer.service.d.ts +1 -2
  13. package/lib/part/part-action-bar/part-action-bar.component.d.ts +2 -6
  14. package/lib/part/part-bar/part-bar.component.d.ts +66 -48
  15. package/lib/part/view-tab/view-tab.component.d.ts +3 -3
  16. package/lib/public_api.d.ts +0 -2
  17. package/lib/routing/routing.util.d.ts +2 -2
  18. package/lib/view/view-move-handler.service.d.ts +16 -14
  19. package/lib/view/view.component.d.ts +1 -2
  20. package/lib/view//311/265workbench-view.model.d.ts +1 -9
  21. package/lib/view-dnd/grid-drop-targets.util.d.ts +1 -1
  22. package/lib/view-dnd/view-drag.service.d.ts +72 -49
  23. package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +11 -36
  24. package/package.json +8 -10
  25. package/esm2022/lib/activation-instant.provider.mjs +0 -29
  26. package/esm2022/lib/common/animation-frame.observable.mjs +0 -37
  27. package/esm2022/lib/common/asserts.util.mjs +0 -31
  28. package/esm2022/lib/common/class-list.mjs +0 -99
  29. package/esm2022/lib/common/coerce-observable.pipe.mjs +0 -28
  30. package/esm2022/lib/common/disposable.mjs +0 -11
  31. package/esm2022/lib/common/dom.util.mjs +0 -100
  32. package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +0 -32
  33. package/esm2022/lib/common/instanceof.pipe.mjs +0 -26
  34. package/esm2022/lib/common/map-coerce.pipe.mjs +0 -28
  35. package/esm2022/lib/common/null-if-empty.pipe.mjs +0 -38
  36. package/esm2022/lib/common/objects.util.mjs +0 -40
  37. package/esm2022/lib/common/observables.mjs +0 -72
  38. package/esm2022/lib/common/operators.mjs +0 -27
  39. package/esm2022/lib/common/public_api.mjs +0 -11
  40. package/esm2022/lib/common/stringify-error.util.mjs +0 -19
  41. package/esm2022/lib/common/throw-error.util.mjs +0 -16
  42. package/esm2022/lib/common/typeof.pipe.mjs +0 -26
  43. package/esm2022/lib/common/uid.util.mjs +0 -22
  44. package/esm2022/lib/common//311/265destroy-ref.mjs +0 -36
  45. package/esm2022/lib/communication/workbench-broadcast-channel.mjs +0 -38
  46. package/esm2022/lib/content-projection/content-as-overlay.component.mjs +0 -114
  47. package/esm2022/lib/content-projection/workbench-element-references.mjs +0 -32
  48. package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +0 -26
  49. package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +0 -34
  50. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +0 -51
  51. package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +0 -46
  52. package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +0 -33
  53. package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +0 -46
  54. package/esm2022/lib/dialog/movable.directive.mjs +0 -126
  55. package/esm2022/lib/dialog/public_api.mjs +0 -15
  56. package/esm2022/lib/dialog/resizable.directive.mjs +0 -392
  57. package/esm2022/lib/dialog/workbench-dialog.component.mjs +0 -250
  58. package/esm2022/lib/dialog/workbench-dialog.mjs +0 -79
  59. package/esm2022/lib/dialog/workbench-dialog.options.mjs +0 -11
  60. package/esm2022/lib/dialog/workbench-dialog.registry.mjs +0 -73
  61. package/esm2022/lib/dialog/workbench-dialog.service.mjs +0 -96
  62. package/esm2022/lib/dialog//311/265workbench-dialog.mjs +0 -310
  63. package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +0 -98
  64. package/esm2022/lib/executor/latest-task-executor.mjs +0 -55
  65. package/esm2022/lib/executor/single-task-executor.mjs +0 -72
  66. package/esm2022/lib/filter-field/filter-field.component.mjs +0 -130
  67. package/esm2022/lib/glass-pane/blockable.mjs +0 -11
  68. package/esm2022/lib/glass-pane/blocking.mjs +0 -11
  69. package/esm2022/lib/glass-pane/glass-pane.directive.mjs +0 -120
  70. package/esm2022/lib/layout/grid-element/grid-element.component.mjs +0 -111
  71. package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +0 -97
  72. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +0 -11
  73. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +0 -11
  74. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +0 -11
  75. package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +0 -11
  76. package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +0 -117
  77. package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +0 -57
  78. package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +0 -67
  79. package/esm2022/lib/layout/public_api.mjs +0 -12
  80. package/esm2022/lib/layout/stringifier.mjs +0 -70
  81. package/esm2022/lib/layout/workbench-layout.component.mjs +0 -90
  82. package/esm2022/lib/layout/workbench-layout.factory.mjs +0 -24
  83. package/esm2022/lib/layout/workbench-layout.mjs +0 -16
  84. package/esm2022/lib/layout/workbench-layout.model.mjs +0 -62
  85. package/esm2022/lib/layout/workbench-layout.service.mjs +0 -68
  86. package/esm2022/lib/layout/workbench-layouts.util.mjs +0 -58
  87. package/esm2022/lib/layout/workench-layout-serializer.service.mjs +0 -109
  88. package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +0 -54
  89. package/esm2022/lib/layout//311/265workbench-layout.mjs +0 -876
  90. package/esm2022/lib/logging/console-appender.service.mjs +0 -46
  91. package/esm2022/lib/logging/index.mjs +0 -15
  92. package/esm2022/lib/logging/logger-names.mjs +0 -32
  93. package/esm2022/lib/logging/logger.mjs +0 -36
  94. package/esm2022/lib/logging/logging-support.mjs +0 -26
  95. package/esm2022/lib/logging/logging.model.mjs +0 -45
  96. package/esm2022/lib/logging/public_api.mjs +0 -12
  97. package/esm2022/lib/logging//311/265logger.mjs +0 -73
  98. package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +0 -69
  99. package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +0 -28
  100. package/esm2022/lib/message-box/public_api.mjs +0 -11
  101. package/esm2022/lib/message-box/workbench-message-box.component.mjs +0 -102
  102. package/esm2022/lib/message-box/workbench-message-box.options.mjs +0 -2
  103. package/esm2022/lib/message-box/workbench-message-box.service.mjs +0 -39
  104. package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +0 -45
  105. package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +0 -71
  106. package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +0 -126
  107. package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +0 -36
  108. package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +0 -84
  109. package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +0 -63
  110. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +0 -54
  111. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +0 -85
  112. package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +0 -140
  113. package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +0 -133
  114. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +0 -113
  115. package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +0 -43
  116. package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +0 -101
  117. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +0 -35
  118. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +0 -88
  119. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +0 -32
  120. package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +0 -121
  121. package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +0 -45
  122. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +0 -39
  123. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +0 -120
  124. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +0 -55
  125. package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +0 -19
  126. package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +0 -13
  127. package/esm2022/lib/microfrontend-platform/microfrontend-platform.config.mjs +0 -11
  128. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +0 -31
  129. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +0 -132
  130. package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +0 -115
  131. package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +0 -21
  132. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +0 -112
  133. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +0 -313
  134. package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +0 -23
  135. package/esm2022/lib/microfrontend-platform/public_api.mjs +0 -13
  136. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +0 -31
  137. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +0 -127
  138. package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +0 -125
  139. package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +0 -32
  140. package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +0 -191
  141. package/esm2022/lib/migration/workbench-migration.mjs +0 -11
  142. package/esm2022/lib/migration/workbench-migrator.mjs +0 -38
  143. package/esm2022/lib/notification/notification-css-classes.pipe.mjs +0 -24
  144. package/esm2022/lib/notification/notification-list.component.mjs +0 -51
  145. package/esm2022/lib/notification/notification.component.mjs +0 -109
  146. package/esm2022/lib/notification/notification.config.mjs +0 -11
  147. package/esm2022/lib/notification/notification.mjs +0 -19
  148. package/esm2022/lib/notification/notification.service.mjs +0 -134
  149. package/esm2022/lib/notification/public_api.mjs +0 -12
  150. package/esm2022/lib/notification/text-notification.component.mjs +0 -23
  151. package/esm2022/lib/notification//311/265notification.mjs +0 -42
  152. package/esm2022/lib/page-not-found/page-not-found.component.mjs +0 -26
  153. package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +0 -31
  154. package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +0 -77
  155. package/esm2022/lib/part/part-bar/part-bar.component.mjs +0 -444
  156. package/esm2022/lib/part/part-portal.pipe.mjs +0 -35
  157. package/esm2022/lib/part/part.component.mjs +0 -135
  158. package/esm2022/lib/part/public_api.mjs +0 -13
  159. package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +0 -31
  160. package/esm2022/lib/part/view-context-menu/text.component.mjs +0 -38
  161. package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +0 -89
  162. package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +0 -76
  163. package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +0 -340
  164. package/esm2022/lib/part/view-list/view-list.component.mjs +0 -117
  165. package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +0 -82
  166. package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +0 -60
  167. package/esm2022/lib/part/view-tab/view-tab.component.mjs +0 -218
  168. package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +0 -29
  169. package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +0 -81
  170. package/esm2022/lib/part/workbench-part-action.registry.mjs +0 -23
  171. package/esm2022/lib/part/workbench-part.model.mjs +0 -19
  172. package/esm2022/lib/part/workbench-part.registry.mjs +0 -23
  173. package/esm2022/lib/part//311/265workbench-part.model.mjs +0 -146
  174. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +0 -11
  175. package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +0 -11
  176. package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +0 -57
  177. package/esm2022/lib/perspective/public_api.mjs +0 -11
  178. package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +0 -39
  179. package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +0 -72
  180. package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +0 -50
  181. package/esm2022/lib/perspective/workbench-perspective.model.mjs +0 -2
  182. package/esm2022/lib/perspective/workbench-perspective.registry.mjs +0 -23
  183. package/esm2022/lib/perspective/workbench-perspective.service.mjs +0 -180
  184. package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +0 -62
  185. package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +0 -210
  186. package/esm2022/lib/popup/popup.component.mjs +0 -124
  187. package/esm2022/lib/popup/popup.config.mjs +0 -100
  188. package/esm2022/lib/popup/popup.origin.mjs +0 -11
  189. package/esm2022/lib/popup/popup.service.mjs +0 -339
  190. package/esm2022/lib/popup/public_api.mjs +0 -12
  191. package/esm2022/lib/portal/wb-component-portal.mjs +0 -130
  192. package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +0 -68
  193. package/esm2022/lib/public_api.mjs +0 -32
  194. package/esm2022/lib/registry/workbench-object-registry.mjs +0 -104
  195. package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +0 -31
  196. package/esm2022/lib/routing/public_api.mjs +0 -14
  197. package/esm2022/lib/routing/routing.model.mjs +0 -11
  198. package/esm2022/lib/routing/routing.util.mjs +0 -215
  199. package/esm2022/lib/routing/url-segment-matcher.mjs +0 -46
  200. package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +0 -110
  201. package/esm2022/lib/routing/workbench-dialog-differ.mjs +0 -51
  202. package/esm2022/lib/routing/workbench-layout-differ.mjs +0 -61
  203. package/esm2022/lib/routing/workbench-message-box-differ.mjs +0 -51
  204. package/esm2022/lib/routing/workbench-navigational-states.mjs +0 -33
  205. package/esm2022/lib/routing/workbench-popup-differ.mjs +0 -51
  206. package/esm2022/lib/routing/workbench-route-data.mjs +0 -39
  207. package/esm2022/lib/routing/workbench-route-guards.mjs +0 -57
  208. package/esm2022/lib/routing/workbench-router-link.directive.mjs +0 -124
  209. package/esm2022/lib/routing/workbench-router.service.mjs +0 -19
  210. package/esm2022/lib/routing/workbench-url-observer.service.mjs +0 -305
  211. package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +0 -58
  212. package/esm2022/lib/routing//311/265location.mjs +0 -70
  213. package/esm2022/lib/routing//311/265workbench-router.service.mjs +0 -359
  214. package/esm2022/lib/startup/public_api.mjs +0 -12
  215. package/esm2022/lib/startup/splash/splash.component.mjs +0 -24
  216. package/esm2022/lib/startup/workbench-initializer.mjs +0 -96
  217. package/esm2022/lib/startup/workbench-launcher.service.mjs +0 -173
  218. package/esm2022/lib/storage/public_api.mjs +0 -11
  219. package/esm2022/lib/storage/workbench-storage.mjs +0 -37
  220. package/esm2022/lib/testing/public_api.mjs +0 -12
  221. package/esm2022/lib/testing/workbench-testing.module.mjs +0 -49
  222. package/esm2022/lib/testing/workbench.provider.mjs +0 -60
  223. package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +0 -72
  224. package/esm2022/lib/view/public_api.mjs +0 -11
  225. package/esm2022/lib/view/view-context-provider.mjs +0 -31
  226. package/esm2022/lib/view/view-move-handler.service.mjs +0 -145
  227. package/esm2022/lib/view/view-portal.pipe.mjs +0 -33
  228. package/esm2022/lib/view/view.component.mjs +0 -128
  229. package/esm2022/lib/view/workbench-view.model.mjs +0 -12
  230. package/esm2022/lib/view/workbench-view.registry.mjs +0 -23
  231. package/esm2022/lib/view//311/265workbench-view.model.mjs +0 -375
  232. package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +0 -49
  233. package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +0 -58
  234. package/esm2022/lib/view-dnd/view-drag.service.mjs +0 -213
  235. package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +0 -89
  236. package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +0 -183
  237. package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +0 -224
  238. package/esm2022/lib/workbench-config.mjs +0 -15
  239. package/esm2022/lib/workbench-id.mjs +0 -21
  240. package/esm2022/lib/workbench.component.mjs +0 -146
  241. package/esm2022/lib/workbench.constants.mjs +0 -41
  242. package/esm2022/lib/workbench.model.mjs +0 -11
  243. package/esm2022/lib/workbench.module.mjs +0 -101
  244. package/esm2022/lib/workbench.provider.mjs +0 -111
  245. package/esm2022/lib/workbench.service.mjs +0 -29
  246. package/esm2022/lib//311/265workbench.service.mjs +0 -102
  247. package/esm2022/public-api.mjs +0 -14
  248. package/esm2022/scion-workbench.mjs +0 -5
  249. package/lib/common/animation-frame.observable.d.ts +0 -10
  250. package/lib/testing/public_api.d.ts +0 -2
  251. package/lib/testing/workbench-testing.module.d.ts +0 -40
  252. package/lib/testing/workbench.provider.d.ts +0 -31
  253. package/lib/workbench.module.d.ts +0 -65
@@ -1,213 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2022 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { Injectable, NgZone } from '@angular/core';
11
- import { BehaviorSubject, EMPTY, fromEvent, merge, Observable, of, zip } from 'rxjs';
12
- import { filter, map, take } from 'rxjs/operators';
13
- import { Arrays } from '@scion/toolkit/util';
14
- import { WorkbenchBroadcastChannel } from '../communication/workbench-broadcast-channel';
15
- import { observeIn, subscribeIn } from '@scion/toolkit/operators';
16
- import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
17
- import * as i0 from "@angular/core";
18
- /**
19
- * Transfer type for dragging a view.
20
- */
21
- export const VIEW_DRAG_TRANSFER_TYPE = 'workbench/view';
22
- /**
23
- * Manages the drag & drop behavior when the user drags a view.
24
- */
25
- export class ViewDragService {
26
- constructor(_zone) {
27
- this._zone = _zone;
28
- /**
29
- * Reference to the view drag data of the ongoing view drag operation, if any, or `null` otherwise.
30
- */
31
- this._viewDragData = null;
32
- this._viewDragStartBroadcastChannel = new WorkbenchBroadcastChannel('workbench/view/dragstart');
33
- this._viewDragEndBroadcastChannel = new WorkbenchBroadcastChannel('workbench/view/dragend');
34
- this._viewMoveBroadcastChannel = new WorkbenchBroadcastChannel('workbench/view/move');
35
- this._tabbarDragOver$ = new BehaviorSubject(null);
36
- /**
37
- * Emits when the user starts dragging a viewtab. The event is received across app instances of the same origin.
38
- */
39
- this.viewDragStart$ = this._viewDragStartBroadcastChannel.observe$;
40
- /**
41
- * Emits when the user ends dragging a viewtab. The event is received across app instances of the same origin.
42
- */
43
- this.viewDragEnd$ = this._viewDragEndBroadcastChannel.observe$;
44
- /**
45
- * Emits when the user moves a view. The event is received across app instances of the same origin.
46
- */
47
- this.viewMove$ = this._viewMoveBroadcastChannel.observe$;
48
- /**
49
- * Emits the identity of the part when the user is dragging a view over its tabbar, or `null` if not dragging over a tabbar.
50
- * The event is NOT received across app instances.
51
- *
52
- * Upon subscription, emits the current state, and then each time the state changes. The observable never completes.
53
- */
54
- this.tabbarDragOver$ = this._tabbarDragOver$;
55
- /**
56
- * Indicates if a drag operation is in progress.
57
- */
58
- this.dragging = toSignal(merge(this.viewDragStart$.pipe(map(() => true)), this.viewDragEnd$.pipe(map(() => false))), { initialValue: false });
59
- this.viewDragStart$
60
- .pipe(takeUntilDestroyed())
61
- .subscribe(viewDragData => {
62
- this._viewDragData = viewDragData;
63
- });
64
- this.viewDragEnd$
65
- .pipe(takeUntilDestroyed())
66
- .subscribe(() => {
67
- this._viewDragData = null;
68
- });
69
- }
70
- /**
71
- * Set when dragging a view over specified tabbar.
72
- */
73
- setTabbarDragover(partId) {
74
- this._tabbarDragOver$.next(partId);
75
- }
76
- /**
77
- * Unset when not dragging a view over specified tabbar anymore.
78
- */
79
- unsetTabbarDragover(partId) {
80
- if (this._tabbarDragOver$.value === partId) {
81
- this._tabbarDragOver$.next(null);
82
- }
83
- }
84
- /**
85
- * Indicates if dragging a view tab over a tabbar.
86
- *
87
- * Returns the identity of the part if the user is dragging a view over its tabbar, or `null` if not dragging over a tabbar.
88
- */
89
- get isDragOverTabbar() {
90
- return this._tabbarDragOver$.value;
91
- }
92
- /**
93
- * Checks if the given event is a view drag event with the same origin.
94
- */
95
- isViewDragEvent(event) {
96
- return !!event.dataTransfer && event.dataTransfer.types.includes(VIEW_DRAG_TRANSFER_TYPE) && this.viewDragData !== null;
97
- }
98
- /**
99
- * Listens for same-origin view drag events on the given target element.
100
- *
101
- * Unlike when installing a "native" event handler for `dragenter` and/or `dragleave` events,
102
- * this observable does not emit when dragging over child elements of the target element.
103
- *
104
- * Following drag events are emitted:
105
- * - dragstart: when start dragging a view tab
106
- * - dragend: when end dragging a view tab
107
- * - dragenter: when entering the target element while dragging a view tab
108
- * - dragover: when dragging a view tab over the target element, every few hundred milliseconds
109
- * - dragleave: when leaving the target element while dragging a view tab
110
- * - drop: when dropping a view tab on a valid drop target
111
- *
112
- * As by design of native drag and drop, the `dragleave` event is not fired on drop action.
113
- * Therefore, always handle both events, `dragleave` and `drop` events, respectively.
114
- *
115
- * @param target - Specifies the element on which to subscribe for drag events.
116
- * @param options - Controls how to subscribe for drag events.
117
- * @param options.eventType - Filters for specified drag events; defaults to any event.
118
- * @param options.capture - Controls whether to subscribe for drag events in the capturing phase; defaults to `false`, i.e., `bubbling` phase.
119
- */
120
- viewDrag$(target, options) {
121
- const filteredEventTypes = new Set(Arrays.coerce(options?.eventType));
122
- const isViewDragEvent = this.isViewDragEvent.bind(this);
123
- return new Observable((observer) => {
124
- const insideAngular = NgZone.isInAngularZone();
125
- const subscription = merge(shouldSubscribe('dragstart') ? dragstart$() : EMPTY, shouldSubscribe('dragend') ? dragend$() : EMPTY, shouldSubscribe('dragover') ? dragover$() : EMPTY, shouldSubscribe('dragenter') || shouldSubscribe('dragleave') || shouldSubscribe('drop') ? dragenterOrDragleaveOrDrop$() : EMPTY)
126
- .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), observeIn(fn => insideAngular ? this._zone.run(fn) : this._zone.runOutsideAngular(fn)))
127
- .subscribe(observer);
128
- return () => subscription.unsubscribe();
129
- });
130
- function dragstart$() {
131
- return fromEvent(target, 'dragstart', options ?? {})
132
- .pipe(filter(event => isViewDragEvent(event)));
133
- }
134
- function dragend$() {
135
- // The `dragend` event does not contain a drag transfer type. To still filter view-related `dragend` events,
136
- // we combine `dragstart` and `dragend` events, i.e., when a view-related `dragstart` event occurs, we expect
137
- // the next `dragend` event to be view-related.
138
- return zip(fromEvent(target, 'dragstart', options ?? {}).pipe(filter(event => isViewDragEvent(event))), fromEvent(target, 'dragend', options ?? {})).pipe(map(([_, dragendEvent]) => dragendEvent));
139
- }
140
- function dragover$() {
141
- return fromEvent(target, 'dragover', options ?? {})
142
- .pipe(filter(event => isViewDragEvent(event)));
143
- }
144
- function dragenterOrDragleaveOrDrop$() {
145
- // We emit `dragenter` only when entering the target element (or any child element) for the first time
146
- // and only again after entering it again. The same applies for `dragleave`.
147
- let dragEnterCount = 0;
148
- return merge(fromEvent(target, 'dragenter', options ?? {}), fromEvent(target, 'dragleave', options ?? {}), fromEvent(target, 'drop', options ?? {}))
149
- .pipe(filter(event => isViewDragEvent(event)), filter((event) => {
150
- switch (event.type) {
151
- case 'dragenter': {
152
- return (++dragEnterCount === 1);
153
- }
154
- case 'dragleave':
155
- case 'drop': {
156
- return (--dragEnterCount === 0);
157
- }
158
- default:
159
- return true;
160
- }
161
- }), filter(event => shouldSubscribe(event.type)));
162
- }
163
- function shouldSubscribe(eventType) {
164
- return !filteredEventTypes.size || filteredEventTypes.has(eventType);
165
- }
166
- }
167
- /**
168
- * Dispatches the given view move event to app instances of the same origin.
169
- */
170
- dispatchViewMoveEvent(event) {
171
- // Wait to dispatch the event until the drag operation finished, if any, because if the drag source element
172
- // is destroyed during the drag operation, e.g. if moved to another part, the drag operation would not
173
- // ordinarily complete, meaning 'dragend' or 'dragleave' would not be called.
174
- const isDragging = this.viewDragData !== null;
175
- (isDragging ? this.viewDragEnd$ : of(undefined))
176
- .pipe(take(1))
177
- .subscribe(() => this._viewMoveBroadcastChannel.postMessage(event));
178
- }
179
- /**
180
- * Makes the given view drag data available to app instances of the same origin.
181
- *
182
- * Invoke this method inside 'dragstart' event handler of the element where the drag operation started.
183
- */
184
- setViewDragData(viewDragData) {
185
- this._viewDragStartBroadcastChannel.postMessage(viewDragData);
186
- }
187
- /**
188
- * Removes the view drag data.
189
- *
190
- * Invoke this method inside 'dragend' event handler of the element where the drag operation started.
191
- */
192
- unsetViewDragData() {
193
- this._viewDragEndBroadcastChannel.postMessage();
194
- }
195
- /**
196
- * Returns the view drag data of the ongoing view drag operation or `null` if no drag operation is in progress.
197
- */
198
- get viewDragData() {
199
- return this._viewDragData;
200
- }
201
- ngOnDestroy() {
202
- this._viewMoveBroadcastChannel.destroy();
203
- this._viewDragStartBroadcastChannel.destroy();
204
- this._viewDragEndBroadcastChannel.destroy();
205
- }
206
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDragService, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
207
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDragService, providedIn: 'root' }); }
208
- }
209
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDragService, decorators: [{
210
- type: Injectable,
211
- args: [{ providedIn: 'root' }]
212
- }], ctorParameters: () => [{ type: i0.NgZone }] });
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1kcmFnLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi92aWV3LWRuZC92aWV3LWRyYWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFZLEVBQUUsRUFBaUIsR0FBRyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQzVHLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUUzQyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQzs7QUFTeEU7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUV4RDs7R0FFRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBMEMxQixZQUFvQixLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQXhDakM7O1dBRUc7UUFDSyxrQkFBYSxHQUF3QixJQUFJLENBQUM7UUFDMUMsbUNBQThCLEdBQUcsSUFBSSx5QkFBeUIsQ0FBZSwwQkFBMEIsQ0FBQyxDQUFDO1FBQ3pHLGlDQUE0QixHQUFHLElBQUkseUJBQXlCLENBQU8sd0JBQXdCLENBQUMsQ0FBQztRQUM3Riw4QkFBeUIsR0FBRyxJ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QUVEOztPQUVHO0lBQ0gsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMseUJBQXlCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxDQUFDOzhHQWxPVSxlQUFlO2tIQUFmLGVBQWUsY0FESCxNQUFNOzsyRkFDbEIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjIgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7SW5qZWN0YWJsZSwgTmdab25lLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCZWhhdmlvclN1YmplY3QsIEVNUFRZLCBmcm9tRXZlbnQsIG1lcmdlLCBPYnNlcnZhYmxlLCBPYnNlcnZlciwgb2YsIFRlYXJkb3duTG9naWMsIHppcH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCB0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0FycmF5c30gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge1VybFNlZ21lbnR9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1dvcmtiZW5jaEJyb2FkY2FzdENoYW5uZWx9IGZyb20gJy4uL2NvbW11bmljYXRpb24vd29ya2JlbmNoLWJyb2FkY2FzdC1jaGFubmVsJztcbmltcG9ydCB7b2JzZXJ2ZUluLCBzdWJzY3JpYmVJbn0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b1NpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtWaWV3SWR9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcubW9kZWwnO1xuaW1wb3J0IHtDbGFzc0xpc3RNYXB9IGZyb20gJy4uL2NvbW1vbi9jbGFzcy1saXN0JztcbmltcG9ydCB7TmF2aWdhdGlvbkRhdGF9IGZyb20gJy4uL3JvdXRpbmcvcm91dGluZy5tb2RlbCc7XG5cbi8qKlxuICogRXZlbnRzIGZpcmVkIGR1cmluZyB2aWV3IGRyYWcgYW5kIGRyb3Agb3BlcmF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBWaWV3RHJhZ0V2ZW50VHlwZSA9ICdkcmFnc3RhcnQnIHwgJ2RyYWdlbmQnIHwgJ2RyYWdlbnRlcicgfCAnZHJhZ292ZXInIHwgJ2RyYWdsZWF2ZScgfCAnZHJvcCc7XG4vKipcbiAqIFRyYW5zZmVyIHR5cGUgZm9yIGRyYWdnaW5nIGEgdmlldy5cbiAqL1xuZXhwb3J0IGNvbnN0IFZJRVdfRFJBR19UUkFOU0ZFUl9UWVBFID0gJ3dvcmtiZW5jaC92aWV3JztcblxuLyoqXG4gKiBNYW5hZ2VzIHRoZSBkcmFnICYgZHJvcCBiZWhhdmlvciB3aGVuIHRoZSB1c2VyIGRyYWdzIGEgdmlldy5cbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgVmlld0RyYWdTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSB2aWV3IGRyYWcgZGF0YSBvZiB0aGUgb25nb2luZyB2aWV3IGRyYWcgb3BlcmF0aW9uLCBpZiBhbnksIG9yIGBudWxsYCBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIF92aWV3RHJhZ0RhdGE6IFZpZXdEcmFnRGF0YSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF92aWV3RHJhZ1N0YXJ0QnJvYWRjYXN0Q2hhbm5lbCA9IG5ldyBXb3JrYmVuY2hCcm9hZGNhc3RDaGFubmVsPFZpZXdEcmFnRGF0YT4oJ3dvcmtiZW5jaC92aWV3L2RyYWdzdGFydCcpO1xuICBwcml2YXRlIF92aWV3RHJhZ0VuZEJyb2FkY2FzdENoYW5uZWwgPSBuZXcgV29ya2JlbmNoQnJvYWRjYXN0Q2hhbm5lbDx2b2lkPignd29ya2JlbmNoL3ZpZXcvZHJhZ2VuZCcpO1xuICBwcml2YXRlIF92aWV3TW92ZUJyb2FkY2FzdENoYW5uZWwgPSBuZXcgV29ya2JlbmNoQnJvYWRjYXN0Q2hhbm5lbDxWaWV3TW92ZUV2ZW50Pignd29ya2JlbmNoL3ZpZXcvbW92ZScpO1xuICBwcml2YXRlIF90YWJiYXJEcmFnT3ZlciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZyAvKiBwYXJ0SWQgKi8gfCBudWxsPihudWxsKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciBzdGFydHMgZHJhZ2dpbmcgYSB2aWV3dGFiLiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgYWNyb3NzIGFwcCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgb3JpZ2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZpZXdEcmFnU3RhcnQkOiBPYnNlcnZhYmxlPFZpZXdEcmFnRGF0YT4gPSB0aGlzLl92aWV3RHJhZ1N0YXJ0QnJvYWRjYXN0Q2hhbm5lbC5vYnNlcnZlJDtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiB0aGUgdXNlciBlbmRzIGRyYWdnaW5nIGEgdmlld3RhYi4gVGhlIGV2ZW50IGlzIHJlY2VpdmVkIGFjcm9zcyBhcHAgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIG9yaWdpbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB2aWV3RHJhZ0VuZCQ6IE9ic2VydmFibGU8dm9pZD4gPSB0aGlzLl92aWV3RHJhZ0VuZEJyb2FkY2FzdENoYW5uZWwub2JzZXJ2ZSQ7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIHVzZXIgbW92ZXMgYSB2aWV3LiBUaGUgZXZlbnQgaXMgcmVjZWl2ZWQgYWNyb3NzIGFwcCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgb3JpZ2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHZpZXdNb3ZlJDogT2JzZXJ2YWJsZTxWaWV3TW92ZUV2ZW50PiA9IHRoaXMuX3ZpZXdNb3ZlQnJvYWRjYXN0Q2hhbm5lbC5vYnNlcnZlJDtcblxuICAvKipcbiAgICogRW1pdHMgdGhlIGlkZW50aXR5IG9mIHRoZSBwYXJ0IHdoZW4gdGhlIHVzZXIgaXMgZHJhZ2dpbmcgYSB2aWV3IG92ZXIgaXRzIHRhYmJhciwgb3IgYG51bGxgIGlmIG5vdCBkcmFnZ2luZyBvdmVyIGEgdGFiYmFyLlxuICAgKiBUaGUgZXZlbnQgaXMgTk9UIHJlY2VpdmVkIGFjcm9zcyBhcHAgaW5zdGFuY2VzLlxuICAgKlxuICAgKiBVcG9uIHN1YnNjcmlwdGlvbiwgZW1pdHMgdGhlIGN1cnJlbnQgc3RhdGUsIGFuZCB0aGVuIGVhY2ggdGltZSB0aGUgc3RhdGUgY2hhbmdlcy4gVGhlIG9ic2VydmFibGUgbmV2ZXIgY29tcGxldGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhYmJhckRyYWdPdmVyJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPiA9IHRoaXMuX3RhYmJhckRyYWdPdmVyJDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGEgZHJhZyBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZHJhZ2dpbmcgPSB0b1NpZ25hbChtZXJnZShcbiAgICB0aGlzLnZpZXdEcmFnU3RhcnQkLnBpcGUobWFwKCgpID0+IHRydWUpKSxcbiAgICB0aGlzLnZpZXdEcmFnRW5kJC5waXBlKG1hcCgoKSA9PiBmYWxzZSkpLFxuICApLCB7aW5pdGlhbFZhbHVlOiBmYWxzZX0pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3pvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMudmlld0RyYWdTdGFydCRcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZSh2aWV3RHJhZ0RhdGEgPT4ge1xuICAgICAgICB0aGlzLl92aWV3RHJhZ0RhdGEgPSB2aWV3RHJhZ0RhdGE7XG4gICAgICB9KTtcbiAgICB0aGlzLnZpZXdEcmFnRW5kJFxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdmlld0RyYWdEYXRhID0gbnVsbDtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB3aGVuIGRyYWdnaW5nIGEgdmlldyBvdmVyIHNwZWNpZmllZCB0YWJiYXIuXG4gICAqL1xuICBwdWJsaWMgc2V0VGFiYmFyRHJhZ292ZXIocGFydElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl90YWJiYXJEcmFnT3ZlciQubmV4dChwYXJ0SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc2V0IHdoZW4gbm90IGRyYWdnaW5nIGEgdmlldyBvdmVyIHNwZWNpZmllZCB0YWJiYXIgYW55bW9yZS5cbiAgICovXG4gIHB1YmxpYyB1bnNldFRhYmJhckRyYWdvdmVyKHBhcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3RhYmJhckRyYWdPdmVyJC52YWx1ZSA9PT0gcGFydElkKSB7XG4gICAgICB0aGlzLl90YWJiYXJEcmFnT3ZlciQubmV4dChudWxsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIGRyYWdnaW5nIGEgdmlldyB0YWIgb3ZlciBhIHRhYmJhci5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgaWRlbnRpdHkgb2YgdGhlIHBhcnQgaWYgdGhlIHVzZXIgaXMgZHJhZ2dpbmcgYSB2aWV3IG92ZXIgaXRzIHRhYmJhciwgb3IgYG51bGxgIGlmIG5vdCBkcmFnZ2luZyBvdmVyIGEgdGFiYmFyLlxuICAgKi9cbiAgcHVibGljIGdldCBpc0RyYWdPdmVyVGFiYmFyKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl90YWJiYXJEcmFnT3ZlciQudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBldmVudCBpcyBhIHZpZXcgZHJhZyBldmVudCB3aXRoIHRoZSBzYW1lIG9yaWdpbi5cbiAgICovXG4gIHB1YmxpYyBpc1ZpZXdEcmFnRXZlbnQoZXZlbnQ6IERyYWdFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWV2ZW50LmRhdGFUcmFuc2ZlciAmJiBldmVudC5kYXRhVHJhbnNmZXIudHlwZXMuaW5jbHVkZXMoVklFV19EUkFHX1RSQU5TRkVSX1RZUEUpICYmIHRoaXMudmlld0RyYWdEYXRhICE9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbnMgZm9yIHNhbWUtb3JpZ2luIHZpZXcgZHJhZyBldmVudHMgb24gdGhlIGdpdmVuIHRhcmdldCBlbGVtZW50LlxuICAgKlxuICAgKiBVbmxpa2Ugd2hlbiBpbnN0YWxsaW5nIGEgXCJuYXRpdmVcIiBldmVudCBoYW5kbGVyIGZvciBgZHJhZ2VudGVyYCBhbmQvb3IgYGRyYWdsZWF2ZWAgZXZlbnRzLFxuICAgKiB0aGlzIG9ic2VydmFibGUgZG9lcyBub3QgZW1pdCB3aGVuIGRyYWdnaW5nIG92ZXIgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxuICAgKlxuICAgKiBGb2xsb3dpbmcgZHJhZyBldmVudHMgYXJlIGVtaXR0ZWQ6XG4gICAqIC0gZHJhZ3N0YXJ0OiB3aGVuIHN0YXJ0IGRyYWdnaW5nIGEgdmlldyB0YWJcbiAgICogLSBkcmFnZW5kOiB3aGVuIGVuZCBkcmFnZ2luZyBhIHZpZXcgdGFiXG4gICAqIC0gZHJhZ2VudGVyOiB3aGVuIGVudGVyaW5nIHRoZSB0YXJnZXQgZWxlbWVudCB3aGlsZSBkcmFnZ2luZyBhIHZpZXcgdGFiXG4gICAqIC0gZHJhZ292ZXI6IHdoZW4gZHJhZ2dpbmcgYSB2aWV3IHRhYiBvdmVyIHRoZSB0YXJnZXQgZWxlbWVudCwgZXZlcnkgZmV3IGh1bmRyZWQgbWlsbGlzZWNvbmRzXG4gICAqIC0gZHJhZ2xlYXZlOiB3aGVuIGxlYXZpbmcgdGhlIHRhcmdldCBlbGVtZW50IHdoaWxlIGRyYWdnaW5nIGEgdmlldyB0YWJcbiAgICogLSBkcm9wOiB3aGVuIGRyb3BwaW5nIGEgdmlldyB0YWIgb24gYSB2YWxpZCBkcm9wIHRhcmdldFxuICAgKlxuICAgKiBBcyBieSBkZXNpZ24gb2YgbmF0aXZlIGRyYWcgYW5kIGRyb3AsIHRoZSBgZHJhZ2xlYXZlYCBldmVudCBpcyBub3QgZmlyZWQgb24gZHJvcCBhY3Rpb24uXG4gICAqIFRoZXJlZm9yZSwgYWx3YXlzIGhhbmRsZSBib3RoIGV2ZW50cywgYGRyYWdsZWF2ZWAgYW5kIGBkcm9wYCBldmVudHMsIHJlc3BlY3RpdmVseS5cbiAgICpcbiAgICogQHBhcmFtIHRhcmdldCAtIFNwZWNpZmllcyB0aGUgZWxlbWVudCBvbiB3aGljaCB0byBzdWJzY3JpYmUgZm9yIGRyYWcgZXZlbnRzLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbnRyb2xzIGhvdyB0byBzdWJzY3JpYmUgZm9yIGRyYWcgZXZlbnRzLlxuICAgKiBAcGFyYW0gb3B0aW9ucy5ldmVudFR5cGUgLSBGaWx0ZXJzIGZvciBzcGVjaWZpZWQgZHJhZyBldmVudHM7IGRlZmF1bHRzIHRvIGFueSBldmVudC5cbiAgICogQHBhcmFtIG9wdGlvbnMuY2FwdHVyZSAtIENvbnRyb2xzIHdoZXRoZXIgdG8gc3Vic2NyaWJlIGZvciBkcmFnIGV2ZW50cyBpbiB0aGUgY2FwdHVyaW5nIHBoYXNlOyBkZWZhdWx0cyB0byBgZmFsc2VgLCBpLmUuLCBgYnViYmxpbmdgIHBoYXNlLlxuICAgKi9cbiAgcHVibGljIHZpZXdEcmFnJCh0YXJnZXQ6IEVsZW1lbnQgfCBXaW5kb3csIG9wdGlvbnM/OiBWaWV3RHJhZ0V2ZW50TGlzdGVuZXJPcHRpb25zKTogT2JzZXJ2YWJsZTxEcmFnRXZlbnQ+IHtcbiAgICBjb25zdCBmaWx0ZXJlZEV2ZW50VHlwZXMgPSBuZXcgU2V0PHN0cmluZz4oQXJyYXlzLmNvZXJjZShvcHRpb25zPy5ldmVudFR5cGUpKTtcbiAgICBjb25zdCBpc1ZpZXdEcmFnRXZlbnQgPSB0aGlzLmlzVmlld0RyYWdFdmVudC5iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogT2JzZXJ2ZXI8RHJhZ0V2ZW50Pik6IFRlYXJkb3duTG9naWMgPT4ge1xuICAgICAgY29uc3QgaW5zaWRlQW5ndWxhciA9IE5nWm9uZS5pc0luQW5ndWxhclpvbmUoKTtcblxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbWVyZ2UoXG4gICAgICAgIHNob3VsZFN1YnNjcmliZSgnZHJhZ3N0YXJ0JykgPyBkcmFnc3RhcnQkKCkgOiBFTVBUWSxcbiAgICAgICAgc2hvdWxkU3Vic2NyaWJlKCdkcmFnZW5kJykgPyBkcmFnZW5kJCgpIDogRU1QVFksXG4gICAgICAgIHNob3VsZFN1YnNjcmliZSgnZHJhZ292ZXInKSA/IGRyYWdvdmVyJCgpIDogRU1QVFksXG4gICAgICAgIHNob3VsZFN1YnNjcmliZSgnZHJhZ2VudGVyJykgfHwgc2hvdWxkU3Vic2NyaWJlKCdkcmFnbGVhdmUnKSB8fCBzaG91bGRTdWJzY3JpYmUoJ2Ryb3AnKSA/IGRyYWdlbnRlck9yRHJhZ2xlYXZlT3JEcm9wJCgpIDogRU1QVFksXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN1YnNjcmliZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgICBvYnNlcnZlSW4oZm4gPT4gaW5zaWRlQW5ndWxhciA/IHRoaXMuX3pvbmUucnVuKGZuKSA6IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKG9ic2VydmVyKTtcblxuICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuXG4gICAgZnVuY3Rpb24gZHJhZ3N0YXJ0JCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudD4ge1xuICAgICAgcmV0dXJuIGZyb21FdmVudDxEcmFnRXZlbnQ+KHRhcmdldCwgJ2RyYWdzdGFydCcsIG9wdGlvbnMgPz8ge30pXG4gICAgICAgIC5waXBlKGZpbHRlcihldmVudCA9PiBpc1ZpZXdEcmFnRXZlbnQoZXZlbnQpKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZHJhZ2VuZCQoKTogT2JzZXJ2YWJsZTxEcmFnRXZlbnQ+IHtcbiAgICAgIC8vIFRoZSBgZHJhZ2VuZGAgZXZlbnQgZG9lcyBub3QgY29udGFpbiBhIGRyYWcgdHJhbnNmZXIgdHlwZS4gVG8gc3RpbGwgZmlsdGVyIHZpZXctcmVsYXRlZCBgZHJhZ2VuZGAgZXZlbnRzLFxuICAgICAgLy8gd2UgY29tYmluZSBgZHJhZ3N0YXJ0YCBhbmQgYGRyYWdlbmRgIGV2ZW50cywgaS5lLiwgd2hlbiBhIHZpZXctcmVsYXRlZCBgZHJhZ3N0YXJ0YCBldmVudCBvY2N1cnMsIHdlIGV4cGVjdFxuICAgICAgLy8gdGhlIG5leHQgYGRyYWdlbmRgIGV2ZW50IHRvIGJlIHZpZXctcmVsYXRlZC5cbiAgICAgIHJldHVybiB6aXAoXG4gICAgICAgIGZyb21FdmVudDxEcmFnRXZlbnQ+KHRhcmdldCwgJ2RyYWdzdGFydCcsIG9wdGlvbnMgPz8ge30pLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGlzVmlld0RyYWdFdmVudChldmVudCkpKSxcbiAgICAgICAgZnJvbUV2ZW50PERyYWdFdmVudD4odGFyZ2V0LCAnZHJhZ2VuZCcsIG9wdGlvbnMgPz8ge30pLFxuICAgICAgKS5waXBlKG1hcCgoW18sIGRyYWdlbmRFdmVudF0pID0+IGRyYWdlbmRFdmVudCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRyYWdvdmVyJCgpOiBPYnNlcnZhYmxlPERyYWdFdmVudD4ge1xuICAgICAgcmV0dXJuIGZyb21FdmVudDxEcmFnRXZlbnQ+KHRhcmdldCwgJ2RyYWdvdmVyJywgb3B0aW9ucyA/PyB7fSlcbiAgICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGlzVmlld0RyYWdFdmVudChldmVudCkpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkcmFnZW50ZXJPckRyYWdsZWF2ZU9yRHJvcCQoKTogT2JzZXJ2YWJsZTxEcmFnRXZlbnQ+IHtcbiAgICAgIC8vIFdlIGVtaXQgYGRyYWdlbnRlcmAgb25seSB3aGVuIGVudGVyaW5nIHRoZSB0YXJnZXQgZWxlbWVudCAob3IgYW55IGNoaWxkIGVsZW1lbnQpIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgLy8gYW5kIG9ubHkgYWdhaW4gYWZ0ZXIgZW50ZXJpbmcgaXQgYWdhaW4uIFRoZSBzYW1lIGFwcGxpZXMgZm9yIGBkcmFnbGVhdmVgLlxuICAgICAgbGV0IGRyYWdFbnRlckNvdW50ID0gMDtcbiAgICAgIHJldHVybiBtZXJnZShcbiAgICAgICAgZnJvbUV2ZW50PERyYWdFdmVudD4odGFyZ2V0LCAnZHJhZ2VudGVyJywgb3B0aW9ucyA/PyB7fSksXG4gICAgICAgIGZyb21FdmVudDxEcmFnRXZlbnQ+KHRhcmdldCwgJ2RyYWdsZWF2ZScsIG9wdGlvbnMgPz8ge30pLFxuICAgICAgICBmcm9tRXZlbnQ8RHJhZ0V2ZW50Pih0YXJnZXQsICdkcm9wJywgb3B0aW9ucyA/PyB7fSksXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihldmVudCA9PiBpc1ZpZXdEcmFnRXZlbnQoZXZlbnQpKSxcbiAgICAgICAgICBmaWx0ZXIoKGV2ZW50OiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgICAgICBjYXNlICdkcmFnZW50ZXInOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgrK2RyYWdFbnRlckNvdW50ID09PSAxKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdkcmFnbGVhdmUnOlxuICAgICAgICAgICAgICBjYXNlICdkcm9wJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAoLS1kcmFnRW50ZXJDb3VudCA9PT0gMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gc2hvdWxkU3Vic2NyaWJlKGV2ZW50LnR5cGUpKSxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzaG91bGRTdWJzY3JpYmUoZXZlbnRUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiAhZmlsdGVyZWRFdmVudFR5cGVzLnNpemUgfHwgZmlsdGVyZWRFdmVudFR5cGVzLmhhcyhldmVudFR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIHRoZSBnaXZlbiB2aWV3IG1vdmUgZXZlbnQgdG8gYXBwIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBvcmlnaW4uXG4gICAqL1xuICBwdWJsaWMgZGlzcGF0Y2hWaWV3TW92ZUV2ZW50KGV2ZW50OiBWaWV3TW92ZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gV2FpdCB0byBkaXNwYXRjaCB0aGUgZXZlbnQgdW50aWwgdGhlIGRyYWcgb3BlcmF0aW9uIGZpbmlzaGVkLCBpZiBhbnksIGJlY2F1c2UgaWYgdGhlIGRyYWcgc291cmNlIGVsZW1lbnRcbiAgICAvLyBpcyBkZXN0cm95ZWQgZHVyaW5nIHRoZSBkcmFnIG9wZXJhdGlvbiwgZS5nLiBpZiBtb3ZlZCB0byBhbm90aGVyIHBhcnQsIHRoZSBkcmFnIG9wZXJhdGlvbiB3b3VsZCBub3RcbiAgICAvLyBvcmRpbmFyaWx5IGNvbXBsZXRlLCBtZWFuaW5nICdkcmFnZW5kJyBvciAnZHJhZ2xlYXZlJyB3b3VsZCBub3QgYmUgY2FsbGVkLlxuICAgIGNvbnN0IGlzRHJhZ2dpbmcgPSB0aGlzLnZpZXdEcmFnRGF0YSAhPT0gbnVsbDtcbiAgICAoaXNEcmFnZ2luZyA/IHRoaXMudmlld0RyYWdFbmQkIDogb2YodW5kZWZpbmVkKSlcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuX3ZpZXdNb3ZlQnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZShldmVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIHRoZSBnaXZlbiB2aWV3IGRyYWcgZGF0YSBhdmFpbGFibGUgdG8gYXBwIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBvcmlnaW4uXG4gICAqXG4gICAqIEludm9rZSB0aGlzIG1ldGhvZCBpbnNpZGUgJ2RyYWdzdGFydCcgZXZlbnQgaGFuZGxlciBvZiB0aGUgZWxlbWVudCB3aGVyZSB0aGUgZHJhZyBvcGVyYXRpb24gc3RhcnRlZC5cbiAgICovXG4gIHB1YmxpYyBzZXRWaWV3RHJhZ0RhdGEodmlld0RyYWdEYXRhOiBWaWV3RHJhZ0RhdGEpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3RHJhZ1N0YXJ0QnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSh2aWV3RHJhZ0RhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHZpZXcgZHJhZyBkYXRhLlxuICAgKlxuICAgKiBJbnZva2UgdGhpcyBtZXRob2QgaW5zaWRlICdkcmFnZW5kJyBldmVudCBoYW5kbGVyIG9mIHRoZSBlbGVtZW50IHdoZXJlIHRoZSBkcmFnIG9wZXJhdGlvbiBzdGFydGVkLlxuICAgKi9cbiAgcHVibGljIHVuc2V0Vmlld0RyYWdEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXdEcmFnRW5kQnJvYWRjYXN0Q2hhbm5lbC5wb3N0TWVzc2FnZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZpZXcgZHJhZyBkYXRhIG9mIHRoZSBvbmdvaW5nIHZpZXcgZHJhZyBvcGVyYXRpb24gb3IgYG51bGxgIGlmIG5vIGRyYWcgb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLlxuICAgKi9cbiAgcHVibGljIGdldCB2aWV3RHJhZ0RhdGEoKTogVmlld0RyYWdEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdEcmFnRGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3TW92ZUJyb2FkY2FzdENoYW5uZWwuZGVzdHJveSgpO1xuICAgIHRoaXMuX3ZpZXdEcmFnU3RhcnRCcm9hZGNhc3RDaGFubmVsLmRlc3Ryb3koKTtcbiAgICB0aGlzLl92aWV3RHJhZ0VuZEJyb2FkY2FzdENoYW5uZWwuZGVzdHJveSgpO1xuICB9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBkYXRhIG9mIGEgdmlldyBkcmFnIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3RHJhZ0RhdGEge1xuICAvKipcbiAgICogWC1jb29yZGluYXRlIG9mIHRoZSBtb3VzZSBwb2ludGVyLCByZWxhdGl2ZSB0byB0aGUgdmlldyB0YWIgZHJhZyBpbWFnZS5cbiAgICovXG4gIHZpZXdUYWJQb2ludGVyT2Zmc2V0WDogbnVtYmVyO1xuICAvKipcbiAgICogWS1jb29yZGluYXRlIG9mIHRoZSBtb3VzZSBwb2ludGVyLCByZWxhdGl2ZSB0byB0aGUgdmlldyB0YWIgZHJhZyBpbWFnZS5cbiAgICovXG4gIHZpZXdUYWJQb2ludGVyT2Zmc2V0WTogbnVtYmVyO1xuICB2aWV3SWQ6IFZpZXdJZDtcbiAgYWx0ZXJuYXRpdmVWaWV3SWQ/OiBzdHJpbmc7XG4gIHZpZXdUaXRsZTogc3RyaW5nIHwgbnVsbDtcbiAgdmlld0hlYWRpbmc6IHN0cmluZyB8IG51bGw7XG4gIHZpZXdVcmxTZWdtZW50czogVXJsU2VnbWVudFtdO1xuICBuYXZpZ2F0aW9uSGludD86IHN0cmluZztcbiAgbmF2aWdhdGlvbkRhdGE/OiBOYXZpZ2F0aW9uRGF0YTtcbiAgdmlld0Nsb3NhYmxlOiBib29sZWFuO1xuICB2aWV3RGlydHk6IGJvb2xlYW47XG4gIHBhcnRJZDogc3RyaW5nO1xuICB2aWV3VGFiV2lkdGg6IG51bWJlcjtcbiAgdmlld1RhYkhlaWdodDogbnVtYmVyO1xuICB3b3JrYmVuY2hJZDogc3RyaW5nO1xuICBjbGFzc0xpc3Q/OiBDbGFzc0xpc3RNYXA7XG59XG5cbi8qKlxuICogRXZlbnQgZW1pdHRlZCB3aGVuIG1vdmluZyBhIHZpZXcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlld01vdmVFdmVudCB7XG4gIHNvdXJjZTogVmlld01vdmVFdmVudFNvdXJjZTtcbiAgdGFyZ2V0OiBWaWV3TW92ZUV2ZW50VGFyZ2V0O1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHZpZXcgdG8gYmUgbW92ZWQgdG8gYW5vdGhlciBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3TW92ZUV2ZW50U291cmNlIHtcbiAgdmlld0lkOiBWaWV3SWQ7XG4gIHBhcnRJZDogc3RyaW5nO1xuICBuYXZpZ2F0aW9uSGludD86IHN0cmluZztcbiAgbmF2aWdhdGlvbkRhdGE/OiBOYXZpZ2F0aW9uRGF0YTtcbiAgYWx0ZXJuYXRpdmVWaWV3SWQ/OiBzdHJpbmc7XG4gIHZpZXdVcmxTZWdtZW50czogVXJsU2VnbWVudFtdO1xuICB3b3JrYmVuY2hJZDogc3RyaW5nO1xuICBjbGFzc0xpc3Q/OiBDbGFzc0xpc3RNYXA7XG59XG5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSB0YXJnZXQgbG9jYXRpb24gZm9yIG1vdmluZyBhIHZpZXcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlld01vdmVFdmVudFRhcmdldCB7XG4gIC8qKlxuICAgKiBQYXJ0IChvciBub2RlKSB3aGVyZSAob3IgcmVsYXRpdmUgdG8gd2hpY2gpIHRvIGFkZCB0aGUgdmlldy5cbiAgICpcbiAgICogUnVsZXMgZm9yIGRpZmZlcmVudCByZWdpb25zOlxuICAgKiAtIElmIG5vdCBzcGVjaWZ5aW5nIGEgcmVnaW9uLCB7QGxpbmsgZWxlbWVudElkfSBpcyBtYW5kYXRvcnkgYW5kIG11c3QgcmVmZXJlbmNlIGEgcGFydC5cbiAgICogLSBGb3IgcmVnaW9ucyBgbm9ydGhgLCBgc291dGhgLCBgZWFzdGAsIG9yIGB3ZXN0YCwge0BsaW5rIGVsZW1lbnRJZH0gY2FuIHJlZmVyZW5jZSBhIHBhcnQgb3Igbm9kZSxcbiAgICogICByZWxhdGl2ZSB0byB3aGljaCB0byBhbGlnbiB0aGUgdmlldy4gSWYgbm90IHNldCwgdGhlIHZpZXcgaXMgYWxpZ25lZCByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZlxuICAgKiAgIHRoZSBlbnRpcmUgbGF5b3V0LlxuICAgKlxuICAgKiBOb3RlOiBQcm9wZXJ0eSBpcyBpZ25vcmVkIHdoZW4gbW92aW5nIHRoZSB2aWV3IHRvIGEgbmV3IHdpbmRvdy5cbiAgICovXG4gIGVsZW1lbnRJZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFJlZ2lvbiBvZiB7QGxpbmsgZWxlbWVudElkfSB3aGVyZSB0byBhZGQgdGhlIHZpZXcgKGluIGEgbmV3IHBhcnQpLlxuICAgKlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCB7QGxpbmsgZWxlbWVudElkfSBtdXN0IHJlZmVyZW5jZSBhIHBhcnQgdG8gd2hpY2ggdG8gYWRkIHRoZSB2aWV3LlxuICAgKlxuICAgKiBOb3RlOlxuICAgKiAtIFByb3BlcnR5IGlzIGlnbm9yZWQgd2hlbiBtb3ZpbmcgdGhlIHZpZXcgdG8gYSBuZXcgd2luZG93LlxuICAgKiAtIFByb3BlcnR5IGlzIHJlcXVpcmVkIGlmIHtAbGluayBlbGVtZW50SWR9IGlzIGEgbm9kZS5cbiAgICovXG4gIHJlZ2lvbj86ICdub3J0aCcgfCAnZWFzdCcgfCAnc291dGgnIHwgJ3dlc3QnO1xuICAvKipcbiAgICogUG9zaXRpb24gd2hlcmUgdG8gaW5zZXJ0IHRoZSB2aWV3LiBUaGUgcG9zaXRpb24gaXMgemVyby1iYXNlZC4gSWYgbm90IHNldCwgYWRkcyB0aGUgdmlldyBhZnRlciB0aGUgYWN0aXZlIHZpZXcuXG4gICAqL1xuICBwb3NpdGlvbj86IG51bWJlciB8ICdzdGFydCcgfCAnZW5kJztcbiAgLyoqXG4gICAqIElkZW50aWZpZXIgb2YgdGhlIHRhcmdldCB3b3JrYmVuY2gsIG9yICduZXctd2luZG93JyB0byBtb3ZlIHRoZSB2aWV3IHRvIGEgbmV3IGJyb3dzZXIgd2luZG93LlxuICAgKi9cbiAgd29ya2JlbmNoSWQ6IHN0cmluZyB8ICduZXctd2luZG93JztcbiAgLyoqXG4gICAqIERlc2NyaWJlcyB0aGUgcGFydCB0byBiZSBjcmVhdGVkIGlmIHRoZSByZWdpb24gaXMgJ25vcnRoJywgJ2Vhc3QnLCAnc291dGgnLCBvciAnd2VzdCcuXG4gICAqL1xuICBuZXdQYXJ0Pzoge1xuICAgIC8qKlxuICAgICAqIElkZW50aXR5IG9mIHRoZSBuZXcgcGFydC4gSWYgbm90IHNldCwgYXNzaWducyBhIFVVSUQuXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUHJvcG9ydGlvbmFsIHNpemUgb2YgdGhlIHBhcnQgcmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZSBwYXJ0LlxuICAgICAqIFRoZSByYXRpbyBpcyB0aGUgY2xvc2VkIGludGVydmFsIFswLDFdLiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBgMC41YC5cbiAgICAgKi9cbiAgICByYXRpbz86IG51bWJlcjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaWV3RHJhZ0V2ZW50TGlzdGVuZXJPcHRpb25zIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck9wdGlvbnMge1xuICAvKipcbiAgICogQWxsb3dzIGZpbHRlcmluZyBmb3IgZ2l2ZW4gZHJhZyBldmVudCB0eXBlcy5cbiAgICovXG4gIGV2ZW50VHlwZT86IFZpZXdEcmFnRXZlbnRUeXBlIHwgVmlld0RyYWdFdmVudFR5cGVbXTtcbn1cbiJdfQ==
@@ -1,89 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2023 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { inject, Injectable } from '@angular/core';
11
- import { createElement, setStyle } from '../common/dom.util';
12
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
13
- import { subscribeIn } from '@scion/toolkit/operators';
14
- import { VIEW_DROP_ZONE_OVERLAY_HOST } from '../content-projection/workbench-element-references';
15
- import { filter } from 'rxjs/operators';
16
- import { merge } from 'rxjs';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "./view-drag.service";
19
- /**
20
- * Renders the visual placeholder when dragging a view over a valid drop zone.
21
- *
22
- * To animate the transition of the placeholder, we use a single HTML element for the placeholder and
23
- * adjust its position when the drop zone changes.
24
- */
25
- export class ViewDropPlaceholderRenderer {
26
- constructor(_viewDragService, _zone) {
27
- this._viewDragService = _viewDragService;
28
- this._zone = _zone;
29
- this._dropPlaceholderOverlayHost = inject(VIEW_DROP_ZONE_OVERLAY_HOST);
30
- this._dropPlaceholder = null;
31
- this.installDropPlaceholderDisposer();
32
- }
33
- /**
34
- * Repositions the placeholder, or creates it if not created yet.
35
- *
36
- * @param referenceElement - Specifies the element that serves as the reference point for positioning the placeholder.
37
- * @param inset - Specifies the spacing between the placeholder and the boundaries of the reference element.
38
- */
39
- updatePosition(referenceElement, inset) {
40
- this._dropPlaceholder ??= this.createDropPlaceholder();
41
- const referenceElementBounds = referenceElement.getBoundingClientRect();
42
- setStyle(this._dropPlaceholder, {
43
- top: `${referenceElementBounds.top + inset.top}px`,
44
- left: `${referenceElementBounds.left + inset.left}px`,
45
- width: `${referenceElement.clientWidth - inset.left - inset.right}px`,
46
- height: `${referenceElement.clientHeight - inset.top - inset.bottom}px`,
47
- });
48
- }
49
- createDropPlaceholder() {
50
- return createElement('div', {
51
- parent: this._dropPlaceholderOverlayHost().element.nativeElement,
52
- style: {
53
- 'position': 'fixed',
54
- 'background-color': 'var(--sci-workbench-part-dropzone-background-color)',
55
- 'border': '1px var(--sci-workbench-part-dropzone-border-style) var(--sci-workbench-part-dropzone-border-color)',
56
- 'border-radius': 'var(--sci-workbench-part-dropzone-border-radius)',
57
- 'pointer-events': 'none',
58
- 'transition-duration': '125ms',
59
- 'transition-property': 'top,left,width,height',
60
- 'transition-timing-function': 'ease-out',
61
- },
62
- });
63
- }
64
- /**
65
- * Disposes the drop placeholder in the following events:
66
- *
67
- * - When the user drags a view over the tab bar, as the tabbar takes precedence over the drop zones.
68
- * - When the user drags a view over a non-valid drop target, such as outside the workbench.
69
- * - When the user drags a view out of the window, cancels or completes the drag operation.
70
- */
71
- installDropPlaceholderDisposer() {
72
- const tabbarDragOver$ = this._viewDragService.tabbarDragOver$.pipe(filter(Boolean));
73
- const nonDropTargetDragOver$ = this._viewDragService.viewDrag$(window, { eventType: 'dragover' }).pipe(filter(event => !event.defaultPrevented));
74
- const dragEnd$ = this._viewDragService.viewDrag$(window, { eventType: ['dragend', 'drop', 'dragleave'] });
75
- merge(tabbarDragOver$, nonDropTargetDragOver$, dragEnd$)
76
- .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntilDestroyed())
77
- .subscribe(() => {
78
- this._dropPlaceholder?.remove();
79
- this._dropPlaceholder = null;
80
- });
81
- }
82
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropPlaceholderRenderer, deps: [{ token: i1.ViewDragService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
83
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropPlaceholderRenderer, providedIn: 'root' }); }
84
- }
85
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropPlaceholderRenderer, decorators: [{
86
- type: Injectable,
87
- args: [{ providedIn: 'root' }]
88
- }], ctorParameters: () => [{ type: i1.ViewDragService }, { type: i0.NgZone }] });
89
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1kcm9wLXBsYWNlaG9sZGVyLXJlbmRlcmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi92aWV3LWRuZC92aWV3LWRyb3AtcGxhY2Vob2xkZXItcmVuZGVyZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBQyxhQUFhLEVBQUUsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLG9EQUFvRCxDQUFDO0FBQy9GLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDOzs7QUFFM0I7Ozs7O0dBS0c7QUFFSCxNQUFNLE9BQU8sMkJBQTJCO0lBS3RDLFlBQW9CLGdCQUFpQyxFQUFVLEtBQWE7UUFBeEQscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQUFVLFVBQUssR0FBTCxLQUFLLENBQVE7UUFIcEUsZ0NBQTJCLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDbEUscUJBQWdCLEdBQXVCLElBQUksQ0FBQztRQUdsRCxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxjQUFjLENBQUMsZ0JBQTZCLEVBQUUsS0FBaUU7UUFDcEgsSUFBSSxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sc0JBQXNCLEdBQUcsZ0JBQWdCLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUV4RSxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzlCLEdBQUcsRUFBRSxHQUFHLHNCQUFzQixDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJO1lBQ2xELElBQUksRUFBRSxHQUFHLHNCQUFzQixDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJO1lBQ3JELEtBQUssRUFBRSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUk7WUFDckUsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSTtTQUN4RSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8scUJBQXFCO1FBQzNCLE9BQU8sYUFBYSxDQUFDLEtBQUssRUFBRTtZQUMxQixNQUFNLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixFQUFHLENBQUMsT0FBTyxDQUFDLGFBQWE7WUFDakUsS0FBSyxFQUFFO2dCQUNMLFVBQVUsRUFBRSxPQUFPO2dCQUNuQixrQkFBa0IsRUFBRSxxREFBcUQ7Z0JBQ3pFLFFBQVEsRUFBRSxxR0FBcUc7Z0JBQy9HLGVBQWUsRUFBRSxrREFBa0Q7Z0JBQ25FLGdCQUFnQixFQUFFLE1BQU07Z0JBQ3hCLHFCQUFxQixFQUFFLE9BQU87Z0JBQzlCLHFCQUFxQixFQUFFLHVCQUF1QjtnQkFDOUMsNEJBQTRCLEVBQUUsVUFBVTthQUN6QztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyw4QkFBOEI7UUFDcEMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDcEYsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDL0ksTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBQyxTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUV4RyxLQUFLLENBQUMsZUFBZSxFQUFFLHNCQUFzQixFQUFFLFFBQVEsQ0FBQzthQUNyRCxJQUFJLENBQ0gsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNuRCxrQkFBa0IsRUFBRSxDQUNyQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7OEdBaEVVLDJCQUEyQjtrSEFBM0IsMkJBQTJCLGNBRGYsTUFBTTs7MkZBQ2xCLDJCQUEyQjtrQkFEdkMsVUFBVTttQkFBQyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjMgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7aW5qZWN0LCBJbmplY3RhYmxlLCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtjcmVhdGVFbGVtZW50LCBzZXRTdHlsZX0gZnJvbSAnLi4vY29tbW9uL2RvbS51dGlsJztcbmltcG9ydCB7Vmlld0RyYWdTZXJ2aWNlfSBmcm9tICcuL3ZpZXctZHJhZy5zZXJ2aWNlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQge3N1YnNjcmliZUlufSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHtWSUVXX0RST1BfWk9ORV9PVkVSTEFZX0hPU1R9IGZyb20gJy4uL2NvbnRlbnQtcHJvamVjdGlvbi93b3JrYmVuY2gtZWxlbWVudC1yZWZlcmVuY2VzJztcbmltcG9ydCB7ZmlsdGVyfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge21lcmdlfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSB2aXN1YWwgcGxhY2Vob2xkZXIgd2hlbiBkcmFnZ2luZyBhIHZpZXcgb3ZlciBhIHZhbGlkIGRyb3Agem9uZS5cbiAqXG4gKiBUbyBhbmltYXRlIHRoZSB0cmFuc2l0aW9uIG9mIHRoZSBwbGFjZWhvbGRlciwgd2UgdXNlIGEgc2luZ2xlIEhUTUwgZWxlbWVudCBmb3IgdGhlIHBsYWNlaG9sZGVyIGFuZFxuICogYWRqdXN0IGl0cyBwb3NpdGlvbiB3aGVuIHRoZSBkcm9wIHpvbmUgY2hhbmdlcy5cbiAqL1xuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgVmlld0Ryb3BQbGFjZWhvbGRlclJlbmRlcmVyIHtcblxuICBwcml2YXRlIF9kcm9wUGxhY2Vob2xkZXJPdmVybGF5SG9zdCA9IGluamVjdChWSUVXX0RST1BfWk9ORV9PVkVSTEFZX0hPU1QpO1xuICBwcml2YXRlIF9kcm9wUGxhY2Vob2xkZXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdmlld0RyYWdTZXJ2aWNlOiBWaWV3RHJhZ1NlcnZpY2UsIHByaXZhdGUgX3pvbmU6IE5nWm9uZSkge1xuICAgIHRoaXMuaW5zdGFsbERyb3BQbGFjZWhvbGRlckRpc3Bvc2VyKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwb3NpdGlvbnMgdGhlIHBsYWNlaG9sZGVyLCBvciBjcmVhdGVzIGl0IGlmIG5vdCBjcmVhdGVkIHlldC5cbiAgICpcbiAgICogQHBhcmFtIHJlZmVyZW5jZUVsZW1lbnQgLSBTcGVjaWZpZXMgdGhlIGVsZW1lbnQgdGhhdCBzZXJ2ZXMgYXMgdGhlIHJlZmVyZW5jZSBwb2ludCBmb3IgcG9zaXRpb25pbmcgdGhlIHBsYWNlaG9sZGVyLlxuICAgKiBAcGFyYW0gaW5zZXQgLSBTcGVjaWZpZXMgdGhlIHNwYWNpbmcgYmV0d2VlbiB0aGUgcGxhY2Vob2xkZXIgYW5kIHRoZSBib3VuZGFyaWVzIG9mIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAgICovXG4gIHB1YmxpYyB1cGRhdGVQb3NpdGlvbihyZWZlcmVuY2VFbGVtZW50OiBIVE1MRWxlbWVudCwgaW5zZXQ6IHt0b3A6IG51bWJlcjsgcmlnaHQ6IG51bWJlcjsgYm90dG9tOiBudW1iZXI7IGxlZnQ6IG51bWJlcn0pOiB2b2lkIHtcbiAgICB0aGlzLl9kcm9wUGxhY2Vob2xkZXIgPz89IHRoaXMuY3JlYXRlRHJvcFBsYWNlaG9sZGVyKCk7XG4gICAgY29uc3QgcmVmZXJlbmNlRWxlbWVudEJvdW5kcyA9IHJlZmVyZW5jZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBzZXRTdHlsZSh0aGlzLl9kcm9wUGxhY2Vob2xkZXIsIHtcbiAgICAgIHRvcDogYCR7cmVmZXJlbmNlRWxlbWVudEJvdW5kcy50b3AgKyBpbnNldC50b3B9cHhgLFxuICAgICAgbGVmdDogYCR7cmVmZXJlbmNlRWxlbWVudEJvdW5kcy5sZWZ0ICsgaW5zZXQubGVmdH1weGAsXG4gICAgICB3aWR0aDogYCR7cmVmZXJlbmNlRWxlbWVudC5jbGllbnRXaWR0aCAtIGluc2V0LmxlZnQgLSBpbnNldC5yaWdodH1weGAsXG4gICAgICBoZWlnaHQ6IGAke3JlZmVyZW5jZUVsZW1lbnQuY2xpZW50SGVpZ2h0IC0gaW5zZXQudG9wIC0gaW5zZXQuYm90dG9tfXB4YCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRHJvcFBsYWNlaG9sZGVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgICAgcGFyZW50OiB0aGlzLl9kcm9wUGxhY2Vob2xkZXJPdmVybGF5SG9zdCgpIS5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBzdHlsZToge1xuICAgICAgICAncG9zaXRpb24nOiAnZml4ZWQnLFxuICAgICAgICAnYmFja2dyb3VuZC1jb2xvcic6ICd2YXIoLS1zY2ktd29ya2JlbmNoLXBhcnQtZHJvcHpvbmUtYmFja2dyb3VuZC1jb2xvciknLFxuICAgICAgICAnYm9yZGVyJzogJzFweCB2YXIoLS1zY2ktd29ya2JlbmNoLXBhcnQtZHJvcHpvbmUtYm9yZGVyLXN0eWxlKSB2YXIoLS1zY2ktd29ya2JlbmNoLXBhcnQtZHJvcHpvbmUtYm9yZGVyLWNvbG9yKScsXG4gICAgICAgICdib3JkZXItcmFkaXVzJzogJ3ZhcigtLXNjaS13b3JrYmVuY2gtcGFydC1kcm9wem9uZS1ib3JkZXItcmFkaXVzKScsXG4gICAgICAgICdwb2ludGVyLWV2ZW50cyc6ICdub25lJyxcbiAgICAgICAgJ3RyYW5zaXRpb24tZHVyYXRpb24nOiAnMTI1bXMnLFxuICAgICAgICAndHJhbnNpdGlvbi1wcm9wZXJ0eSc6ICd0b3AsbGVmdCx3aWR0aCxoZWlnaHQnLFxuICAgICAgICAndHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24nOiAnZWFzZS1vdXQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgZHJvcCBwbGFjZWhvbGRlciBpbiB0aGUgZm9sbG93aW5nIGV2ZW50czpcbiAgICpcbiAgICogLSBXaGVuIHRoZSB1c2VyIGRyYWdzIGEgdmlldyBvdmVyIHRoZSB0YWIgYmFyLCBhcyB0aGUgdGFiYmFyIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZHJvcCB6b25lcy5cbiAgICogLSBXaGVuIHRoZSB1c2VyIGRyYWdzIGEgdmlldyBvdmVyIGEgbm9uLXZhbGlkIGRyb3AgdGFyZ2V0LCBzdWNoIGFzIG91dHNpZGUgdGhlIHdvcmtiZW5jaC5cbiAgICogLSBXaGVuIHRoZSB1c2VyIGRyYWdzIGEgdmlldyBvdXQgb2YgdGhlIHdpbmRvdywgY2FuY2VscyBvciBjb21wbGV0ZXMgdGhlIGRyYWcgb3BlcmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnN0YWxsRHJvcFBsYWNlaG9sZGVyRGlzcG9zZXIoKTogdm9pZCB7XG4gICAgY29uc3QgdGFiYmFyRHJhZ092ZXIkID0gdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnRhYmJhckRyYWdPdmVyJC5waXBlKGZpbHRlcihCb29sZWFuKSk7XG4gICAgY29uc3Qgbm9uRHJvcFRhcmdldERyYWdPdmVyJCA9IHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZyQod2luZG93LCB7ZXZlbnRUeXBlOiAnZHJhZ292ZXInfSkucGlwZShmaWx0ZXIoZXZlbnQgPT4gIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKTtcbiAgICBjb25zdCBkcmFnRW5kJCA9IHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZyQod2luZG93LCB7ZXZlbnRUeXBlOiBbJ2RyYWdlbmQnLCAnZHJvcCcsICdkcmFnbGVhdmUnXX0pO1xuXG4gICAgbWVyZ2UodGFiYmFyRHJhZ092ZXIkLCBub25Ecm9wVGFyZ2V0RHJhZ092ZXIkLCBkcmFnRW5kJClcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2Ryb3BQbGFjZWhvbGRlcj8ucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuX2Ryb3BQbGFjZWhvbGRlciA9IG51bGw7XG4gICAgICB9KTtcbiAgfVxufVxuIl19
@@ -1,183 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2023 Swiss Federal Railways
3
- *
4
- * This program and the accompanying materials are made
5
- * available under the terms of the Eclipse Public License 2.0
6
- * which is available at https://www.eclipse.org/legal/epl-2.0/
7
- *
8
- * SPDX-License-Identifier: EPL-2.0
9
- */
10
- import { Directive, EventEmitter, Input, Output } from '@angular/core';
11
- import { createElement, setStyle } from '../common/dom.util';
12
- import { subscribeIn } from '@scion/toolkit/operators';
13
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
14
- import { Subject } from 'rxjs';
15
- import { takeUntil } from 'rxjs/operators';
16
- import { Arrays } from '@scion/toolkit/util';
17
- import * as i0 from "@angular/core";
18
- import * as i1 from "./view-drag.service";
19
- import * as i2 from "./view-drop-placeholder-renderer.service";
20
- /**
21
- * Adds view drop zones to the host element, allowing views to be dropped either in the north, east, south, west or center.
22
- *
23
- * The drop zones are aligned with the bounds of the host element, requiring the host to define a positioning context.
24
- * If not positioned, the element is changed to be positioned relative.
25
- */
26
- export class ViewDropZoneDirective {
27
- constructor(host, _viewDragService, _viewDropPlaceholderRenderer, _zone) {
28
- this._viewDragService = _viewDragService;
29
- this._viewDropPlaceholderRenderer = _viewDropPlaceholderRenderer;
30
- this._zone = _zone;
31
- /**
32
- * Specifies the size of the drop zone, either as percentage value [0,1] or absolute pixel value.
33
- */
34
- this.dropZoneSize = .5;
35
- /**
36
- * Emits upon a view drop action.
37
- */
38
- this.viewDrop = new EventEmitter();
39
- this._host = host.nativeElement;
40
- this.installDropZones();
41
- }
42
- ngOnInit() {
43
- this.ensureHostElementPositioned();
44
- }
45
- /**
46
- * Installs a drop zone for each specified region.
47
- *
48
- * - DOM elements for drop zones are created lazily when dragging a view over the host element.
49
- * - When dragging a view over a drop zone, renders the drop placeholder using the {@link ViewDropPlaceholderRenderer}.
50
- */
51
- installDropZones() {
52
- const disposables = new Array();
53
- // Create drop zones when entering the host element.
54
- this._viewDragService.viewDrag$(this._host, { eventType: 'dragenter' })
55
- .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntilDestroyed())
56
- .subscribe(() => {
57
- if (!this.regions || this.regions.center) {
58
- disposables.push(...this.createDropZone('center'));
59
- }
60
- if (!this.regions || this.regions.north) {
61
- disposables.push(...this.createDropZone('north'));
62
- }
63
- if (!this.regions || this.regions.south) {
64
- disposables.push(...this.createDropZone('south'));
65
- }
66
- if (!this.regions || this.regions.west) {
67
- disposables.push(...this.createDropZone('west'));
68
- }
69
- if (!this.regions || this.regions.east) {
70
- disposables.push(...this.createDropZone('east'));
71
- }
72
- });
73
- // Dispose drop zones when leaving the host element, or when the drag operation completes.
74
- this._viewDragService.viewDrag$(this._host, { eventType: ['dragleave', 'drop'] })
75
- .pipe(takeUntilDestroyed())
76
- .subscribe(() => {
77
- disposables.forEach(disposeFn => disposeFn());
78
- disposables.length = 0;
79
- });
80
- }
81
- /**
82
- * Creates the drop zone for the specified region.
83
- */
84
- createDropZone(region) {
85
- const dropZoneInset = this.calculateInset(region, this.dropZoneSize);
86
- const dropPlaceholderInset = this.calculateInset(region, this.dropPlaceholderSize ?? this.dropZoneSize);
87
- const dispose$ = new Subject();
88
- // Create the drop zone HTML element.
89
- const dropZoneElement = createElement('div', {
90
- parent: this._host,
91
- cssClass: ['e2e-view-drop-zone', `e2e-${region}`, ...Arrays.coerce(this.cssClass)],
92
- style: {
93
- position: 'absolute',
94
- top: `${dropZoneInset.top}px`,
95
- right: `${dropZoneInset.right}px`,
96
- bottom: `${dropZoneInset.bottom}px`,
97
- left: `${dropZoneInset.left}px`,
98
- },
99
- });
100
- // Install drag listener to render the drop placeholder and handle drop.
101
- this._viewDragService.viewDrag$(dropZoneElement, { eventType: ['dragenter', 'dragover', 'drop'] })
102
- .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntil(dispose$))
103
- .subscribe((event) => {
104
- switch (event.type) {
105
- case 'dragenter':
106
- this._viewDropPlaceholderRenderer.updatePosition(this._host, dropPlaceholderInset);
107
- break;
108
- case 'dragover':
109
- event.preventDefault(); // allow view drop
110
- break;
111
- case 'drop':
112
- this._zone.run(() => this.viewDrop.emit({
113
- dropRegion: region,
114
- dragData: this._viewDragService.viewDragData,
115
- }));
116
- break;
117
- }
118
- });
119
- // Disable the drop zone when dragging over the tab bar, allowing the user to change the tab order even for tabs covered by the drop zone.
120
- this._viewDragService.tabbarDragOver$
121
- .pipe(subscribeIn(fn => this._zone.runOutsideAngular(fn)), takeUntil(dispose$))
122
- .subscribe(dragOverTabbar => {
123
- if (dragOverTabbar) {
124
- setStyle(dropZoneElement, { 'pointer-events': 'none' });
125
- }
126
- else {
127
- setStyle(dropZoneElement, { 'pointer-events': null });
128
- }
129
- });
130
- return [
131
- () => dispose$.next(),
132
- () => dropZoneElement.remove(),
133
- ];
134
- }
135
- /**
136
- * Calculates the inset for the drop region based on the given size.
137
- *
138
- * If passing a ratio [0,1] for the size, the size is interpreted as a percentage value relative to the size of the host element.
139
- */
140
- calculateInset(region, size) {
141
- return {
142
- top: region === 'south' ? this._host.clientHeight - coercePixelValue(size, { containerSize: this._host.clientHeight }) : 0,
143
- right: region === 'west' ? this._host.clientWidth - coercePixelValue(size, { containerSize: this._host.clientWidth }) : 0,
144
- bottom: region === 'north' ? this._host.clientHeight - coercePixelValue(size, { containerSize: this._host.clientHeight }) : 0,
145
- left: region === 'east' ? this._host.clientWidth - coercePixelValue(size, { containerSize: this._host.clientWidth }) : 0,
146
- };
147
- }
148
- ensureHostElementPositioned() {
149
- if (getComputedStyle(this._host).position === 'static') {
150
- setStyle(this._host, { 'position': 'relative' });
151
- }
152
- }
153
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropZoneDirective, deps: [{ token: i0.ElementRef }, { token: i1.ViewDragService }, { token: i2.ViewDropPlaceholderRenderer }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
154
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.0.2", type: ViewDropZoneDirective, isStandalone: true, selector: "[wbViewDropZone]", inputs: { regions: ["wbViewDropZoneRegions", "regions"], cssClass: ["wbViewDropZoneCssClass", "cssClass"], dropZoneSize: ["wbViewDropZoneSize", "dropZoneSize"], dropPlaceholderSize: ["wbViewDropZonePlaceholderSize", "dropPlaceholderSize"] }, outputs: { viewDrop: "wbViewDropZoneDrop" }, ngImport: i0 }); }
155
- }
156
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewDropZoneDirective, decorators: [{
157
- type: Directive,
158
- args: [{ selector: '[wbViewDropZone]', standalone: true }]
159
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.ViewDragService }, { type: i2.ViewDropPlaceholderRenderer }, { type: i0.NgZone }], propDecorators: { regions: [{
160
- type: Input,
161
- args: ['wbViewDropZoneRegions']
162
- }], cssClass: [{
163
- type: Input,
164
- args: ['wbViewDropZoneCssClass']
165
- }], dropZoneSize: [{
166
- type: Input,
167
- args: [{ alias: 'wbViewDropZoneSize', required: true }]
168
- }], dropPlaceholderSize: [{
169
- type: Input,
170
- args: ['wbViewDropZonePlaceholderSize']
171
- }], viewDrop: [{
172
- type: Output,
173
- args: ['wbViewDropZoneDrop']
174
- }] } });
175
- /**
176
- * Coerces given value to a CSS pixel value.
177
- *
178
- * If passing a ratio [0,1], it is interpreted as a percentage value relative to the size of the container.
179
- */
180
- function coercePixelValue(pixelOrRatio, options) {
181
- return (pixelOrRatio <= 1) ? options.containerSize * pixelOrRatio : pixelOrRatio;
182
- }
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1kcm9wLXpvbmUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvdmlldy1kbmQvdmlldy1kcm9wLXpvbmUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFrQixNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakcsT0FBTyxFQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFOUQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDOzs7O0FBRTNDOzs7OztHQUtHO0FBRUgsTUFBTSxPQUFPLHFCQUFxQjtJQW1DaEMsWUFBWSxJQUE2QixFQUNyQixnQkFBaUMsRUFDakMsNEJBQXlELEVBQ3pELEtBQWE7UUFGYixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBQ2pDLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBNkI7UUFDekQsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQXRCakM7O1dBRUc7UUFFSSxpQkFBWSxHQUFHLEVBQUUsQ0FBQztRQVN6Qjs7V0FFRztRQUVJLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQU1wRCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxnQkFBZ0I7UUFDdEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLEVBQWEsQ0FBQztRQUUzQyxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUMsU0FBUyxFQUFFLFdBQVcsRUFBQyxDQUFDO2FBQ2xFLElBQUksQ0FDSCxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ25ELGtCQUFrQixFQUFFLENBQ3JCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ3hDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbkQsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUwsMEZBQTBGO1FBQzFGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFBQyxDQUFDO2FBQzVFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzFCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUM5QyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxNQUFzRDtRQUMzRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDckUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsbUJBQW1CLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hHLE1BQU0sUUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFckMscUNBQXFDO1FBQ3JDLE1BQU0sZUFBZSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUU7WUFDM0MsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLG9CQUFvQixFQUFFLE9BQU8sTUFBTSxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRixLQUFLLEVBQUU7Z0JBQ0wsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLEdBQUcsRUFBRSxHQUFHLGFBQWEsQ0FBQyxHQUFHLElBQUk7Z0JBQzdCLEtBQUssRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLElBQUk7Z0JBQ2pDLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLElBQUk7Z0JBQ25DLElBQUksRUFBRSxHQUFHLGFBQWEsQ0FBQyxJQUFJLElBQUk7YUFDaEM7U0FDRixDQUFDLENBQUM7UUFFSCx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsRUFBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxFQUFDLENBQUM7YUFDN0YsSUFBSSxDQUNILFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbkQsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUNwQjthQUNBLFNBQVMsQ0FBQyxDQUFDLEtBQWdCLEVBQUUsRUFBRTtZQUM5QixRQUFRLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxXQUFXO29CQUNkLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO29CQUNuRixNQUFNO2dCQUNSLEtBQUssVUFBVTtvQkFDYixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxrQkFBa0I7b0JBQzFDLE1BQU07Z0JBQ1IsS0FBSyxNQUFNO29CQUNULElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO3dCQUN0QyxVQUFVLEVBQUUsTUFBTTt3QkFDbEIsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFhO3FCQUM5QyxDQUFDLENBQUMsQ0FBQztvQkFDSixNQUFNO1lBQ1YsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUwsMElBQTBJO1FBQzFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlO2FBQ2xDLElBQUksQ0FDSCxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ25ELFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FDcEI7YUFDQSxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsUUFBUSxDQUFDLGVBQWUsRUFBRSxFQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7WUFDeEQsQ0FBQztpQkFDSSxDQUFDO2dCQUNKLFFBQVEsQ0FBQyxlQUFlLEVBQUUsRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVMLE9BQU87WUFDTCxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1lBQ3JCLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUU7U0FDL0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssY0FBYyxDQUFDLE1BQXNELEVBQUUsSUFBWTtRQUN6RixPQUFPO1lBQ0wsR0FBRyxFQUFFLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEgsS0FBSyxFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkgsTUFBTSxFQUFFLE1BQU0sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0gsSUFBSSxFQUFFLE1BQU0sS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkgsQ0FBQztJQUNKLENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3ZELFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7OEdBNUtVLHFCQUFxQjtrR0FBckIscUJBQXFCOzsyRkFBckIscUJBQXFCO2tCQURqQyxTQUFTO21CQUFDLEVBQUMsUUFBUSxFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUM7NEtBU2xELE9BQU87c0JBRGIsS0FBSzt1QkFBQyx1QkFBdUI7Z0JBT3ZCLFFBQVE7c0JBRGQsS0FBSzt1QkFBQyx3QkFBd0I7Z0JBT3hCLFlBQVk7c0JBRGxCLEtBQUs7dUJBQUMsRUFBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQztnQkFRN0MsbUJBQW1CO3NCQUR6QixLQUFLO3VCQUFDLCtCQUErQjtnQkFPL0IsUUFBUTtzQkFEZCxNQUFNO3VCQUFDLG9CQUFvQjs7QUErSTlCOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFlBQW9CLEVBQUUsT0FBZ0M7SUFDOUUsT0FBTyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztBQUNuRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIzIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgTmdab25lLCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2NyZWF0ZUVsZW1lbnQsIHNldFN0eWxlfSBmcm9tICcuLi9jb21tb24vZG9tLnV0aWwnO1xuaW1wb3J0IHtWaWV3RHJhZ0RhdGEsIFZpZXdEcmFnU2VydmljZX0gZnJvbSAnLi92aWV3LWRyYWcuc2VydmljZSc7XG5pbXBvcnQge3N1YnNjcmliZUlufSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7Vmlld0Ryb3BQbGFjZWhvbGRlclJlbmRlcmVyfSBmcm9tICcuL3ZpZXctZHJvcC1wbGFjZWhvbGRlci1yZW5kZXJlci5zZXJ2aWNlJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3Rha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtBcnJheXN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuXG4vKipcbiAqIEFkZHMgdmlldyBkcm9wIHpvbmVzIHRvIHRoZSBob3N0IGVsZW1lbnQsIGFsbG93aW5nIHZpZXdzIHRvIGJlIGRyb3BwZWQgZWl0aGVyIGluIHRoZSBub3J0aCwgZWFzdCwgc291dGgsIHdlc3Qgb3IgY2VudGVyLlxuICpcbiAqIFRoZSBkcm9wIHpvbmVzIGFyZSBhbGlnbmVkIHdpdGggdGhlIGJvdW5kcyBvZiB0aGUgaG9zdCBlbGVtZW50LCByZXF1aXJpbmcgdGhlIGhvc3QgdG8gZGVmaW5lIGEgcG9zaXRpb25pbmcgY29udGV4dC5cbiAqIElmIG5vdCBwb3NpdGlvbmVkLCB0aGUgZWxlbWVudCBpcyBjaGFuZ2VkIHRvIGJlIHBvc2l0aW9uZWQgcmVsYXRpdmUuXG4gKi9cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW3diVmlld0Ryb3Bab25lXScsIHN0YW5kYWxvbmU6IHRydWV9KVxuZXhwb3J0IGNsYXNzIFZpZXdEcm9wWm9uZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgcmVnaW9ucyB3aGVyZSBhIGRyb3Agem9uZSBzaG91bGQgYmUgaW5zdGFsbGVkLiBJZiBub3Qgc2V0LCBpbnN0YWxscyBhIGRyb3Agem9uZSBpbiBldmVyeSByZWdpb24uXG4gICAqL1xuICBASW5wdXQoJ3diVmlld0Ryb3Bab25lUmVnaW9ucycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBwdWJsaWMgcmVnaW9ucz86IERyb3Bab25lUmVnaW9uO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgQ1NTIGNsYXNzKGVzKSB0byBhZGQgdG8gdGhlIGRyb3Agem9uZS5cbiAgICovXG4gIEBJbnB1dCgnd2JWaWV3RHJvcFpvbmVDc3NDbGFzcycpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBwdWJsaWMgY3NzQ2xhc3M/OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBkcm9wIHpvbmUsIGVpdGhlciBhcyBwZXJjZW50YWdlIHZhbHVlIFswLDFdIG9yIGFic29sdXRlIHBpeGVsIHZhbHVlLlxuICAgKi9cbiAgQElucHV0KHthbGlhczogJ3diVmlld0Ryb3Bab25lU2l6ZScsIHJlcXVpcmVkOiB0cnVlfSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIHB1YmxpYyBkcm9wWm9uZVNpemUgPSAuNTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSB2aXN1YWwgcGxhY2Vob2xkZXIgd2hlbiBkcmFnZ2luZyBhIHZpZXcgb3ZlciBhIGRyb3Agem9uZS5cbiAgICogQ2FuIGJlIGEgcGVyY2VudGFnZSB2YWx1ZSBbMCwxXSBvciBhYnNvbHV0ZSBwaXhlbCB2YWx1ZS4gSWYgbm90IHNldCwgZGVmYXVsdHMgdG8ge0BsaW5rIGRyb3Bab25lU2l6ZX0uXG4gICAqL1xuICBASW5wdXQoJ3diVmlld0Ryb3Bab25lUGxhY2Vob2xkZXJTaXplJykgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lXG4gIHB1YmxpYyBkcm9wUGxhY2Vob2xkZXJTaXplPzogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB1cG9uIGEgdmlldyBkcm9wIGFjdGlvbi5cbiAgICovXG4gIEBPdXRwdXQoJ3diVmlld0Ryb3Bab25lRHJvcCcpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1yZW5hbWVcbiAgcHVibGljIHZpZXdEcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxXYlZpZXdEcm9wRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdEcmFnU2VydmljZTogVmlld0RyYWdTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3RHJvcFBsYWNlaG9sZGVyUmVuZGVyZXI6IFZpZXdEcm9wUGxhY2Vob2xkZXJSZW5kZXJlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lKSB7XG4gICAgdGhpcy5faG9zdCA9IGhvc3QubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLmluc3RhbGxEcm9wWm9uZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZUhvc3RFbGVtZW50UG9zaXRpb25lZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbGxzIGEgZHJvcCB6b25lIGZvciBlYWNoIHNwZWNpZmllZCByZWdpb24uXG4gICAqXG4gICAqIC0gRE9NIGVsZW1lbnRzIGZvciBkcm9wIHpvbmVzIGFyZSBjcmVhdGVkIGxhemlseSB3aGVuIGRyYWdnaW5nIGEgdmlldyBvdmVyIHRoZSBob3N0IGVsZW1lbnQuXG4gICAqIC0gV2hlbiBkcmFnZ2luZyBhIHZpZXcgb3ZlciBhIGRyb3Agem9uZSwgcmVuZGVycyB0aGUgZHJvcCBwbGFjZWhvbGRlciB1c2luZyB0aGUge0BsaW5rIFZpZXdEcm9wUGxhY2Vob2xkZXJSZW5kZXJlcn0uXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxEcm9wWm9uZXMoKTogdm9pZCB7XG4gICAgY29uc3QgZGlzcG9zYWJsZXMgPSBuZXcgQXJyYXk8RGlzcG9zZUZuPigpO1xuXG4gICAgLy8gQ3JlYXRlIGRyb3Agem9uZXMgd2hlbiBlbnRlcmluZyB0aGUgaG9zdCBlbGVtZW50LlxuICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZyQodGhpcy5faG9zdCwge2V2ZW50VHlwZTogJ2RyYWdlbnRlcid9KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN1YnNjcmliZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lvbnMgfHwgdGhpcy5yZWdpb25zLmNlbnRlcikge1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goLi4udGhpcy5jcmVhdGVEcm9wWm9uZSgnY2VudGVyJykpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5yZWdpb25zIHx8IHRoaXMucmVnaW9ucy5ub3J0aCkge1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goLi4udGhpcy5jcmVhdGVEcm9wWm9uZSgnbm9ydGgnKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLnJlZ2lvbnMgfHwgdGhpcy5yZWdpb25zLnNvdXRoKSB7XG4gICAgICAgICAgZGlzcG9zYWJsZXMucHVzaCguLi50aGlzLmNyZWF0ZURyb3Bab25lKCdzb3V0aCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucmVnaW9ucyB8fCB0aGlzLnJlZ2lvbnMud2VzdCkge1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goLi4udGhpcy5jcmVhdGVEcm9wWm9uZSgnd2VzdCcpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucmVnaW9ucyB8fCB0aGlzLnJlZ2lvbnMuZWFzdCkge1xuICAgICAgICAgIGRpc3Bvc2FibGVzLnB1c2goLi4udGhpcy5jcmVhdGVEcm9wWm9uZSgnZWFzdCcpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAvLyBEaXNwb3NlIGRyb3Agem9uZXMgd2hlbiBsZWF2aW5nIHRoZSBob3N0IGVsZW1lbnQsIG9yIHdoZW4gdGhlIGRyYWcgb3BlcmF0aW9uIGNvbXBsZXRlcy5cbiAgICB0aGlzLl92aWV3RHJhZ1NlcnZpY2Uudmlld0RyYWckKHRoaXMuX2hvc3QsIHtldmVudFR5cGU6IFsnZHJhZ2xlYXZlJywgJ2Ryb3AnXX0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQoKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBkaXNwb3NhYmxlcy5mb3JFYWNoKGRpc3Bvc2VGbiA9PiBkaXNwb3NlRm4oKSk7XG4gICAgICAgIGRpc3Bvc2FibGVzLmxlbmd0aCA9IDA7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBkcm9wIHpvbmUgZm9yIHRoZSBzcGVjaWZpZWQgcmVnaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVEcm9wWm9uZShyZWdpb246ICdub3J0aCcgfCAnZWFzdCcgfCAnc291dGgnIHwgJ3dlc3QnIHwgJ2NlbnRlcicpOiBEaXNwb3NlRm5bXSB7XG4gICAgY29uc3QgZHJvcFpvbmVJbnNldCA9IHRoaXMuY2FsY3VsYXRlSW5zZXQocmVnaW9uLCB0aGlzLmRyb3Bab25lU2l6ZSk7XG4gICAgY29uc3QgZHJvcFBsYWNlaG9sZGVySW5zZXQgPSB0aGlzLmNhbGN1bGF0ZUluc2V0KHJlZ2lvbiwgdGhpcy5kcm9wUGxhY2Vob2xkZXJTaXplID8/IHRoaXMuZHJvcFpvbmVTaXplKTtcbiAgICBjb25zdCBkaXNwb3NlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvLyBDcmVhdGUgdGhlIGRyb3Agem9uZSBIVE1MIGVsZW1lbnQuXG4gICAgY29uc3QgZHJvcFpvbmVFbGVtZW50ID0gY3JlYXRlRWxlbWVudCgnZGl2Jywge1xuICAgICAgcGFyZW50OiB0aGlzLl9ob3N0LFxuICAgICAgY3NzQ2xhc3M6IFsnZTJlLXZpZXctZHJvcC16b25lJywgYGUyZS0ke3JlZ2lvbn1gLCAuLi5BcnJheXMuY29lcmNlKHRoaXMuY3NzQ2xhc3MpXSxcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgICB0b3A6IGAke2Ryb3Bab25lSW5zZXQudG9wfXB4YCxcbiAgICAgICAgcmlnaHQ6IGAke2Ryb3Bab25lSW5zZXQucmlnaHR9cHhgLFxuICAgICAgICBib3R0b206IGAke2Ryb3Bab25lSW5zZXQuYm90dG9tfXB4YCxcbiAgICAgICAgbGVmdDogYCR7ZHJvcFpvbmVJbnNldC5sZWZ0fXB4YCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBJbnN0YWxsIGRyYWcgbGlzdGVuZXIgdG8gcmVuZGVyIHRoZSBkcm9wIHBsYWNlaG9sZGVyIGFuZCBoYW5kbGUgZHJvcC5cbiAgICB0aGlzLl92aWV3RHJhZ1NlcnZpY2Uudmlld0RyYWckKGRyb3Bab25lRWxlbWVudCwge2V2ZW50VHlwZTogWydkcmFnZW50ZXInLCAnZHJhZ292ZXInLCAnZHJvcCddfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzdWJzY3JpYmVJbihmbiA9PiB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSksXG4gICAgICAgIHRha2VVbnRpbChkaXNwb3NlJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2RyYWdlbnRlcic6XG4gICAgICAgICAgICB0aGlzLl92aWV3RHJvcFBsYWNlaG9sZGVyUmVuZGVyZXIudXBkYXRlUG9zaXRpb24odGhpcy5faG9zdCwgZHJvcFBsYWNlaG9sZGVySW5zZXQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZHJhZ292ZXInOlxuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gYWxsb3cgdmlldyBkcm9wXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkcm9wJzpcbiAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMudmlld0Ryb3AuZW1pdCh7XG4gICAgICAgICAgICAgIGRyb3BSZWdpb246IHJlZ2lvbixcbiAgICAgICAgICAgICAgZHJhZ0RhdGE6IHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZ0RhdGEhLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgLy8gRGlzYWJsZSB0aGUgZHJvcCB6b25lIHdoZW4gZHJhZ2dpbmcgb3ZlciB0aGUgdGFiIGJhciwgYWxsb3dpbmcgdGhlIHVzZXIgdG8gY2hhbmdlIHRoZSB0YWIgb3JkZXIgZXZlbiBmb3IgdGFicyBjb3ZlcmVkIGJ5IHRoZSBkcm9wIHpvbmUuXG4gICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnRhYmJhckRyYWdPdmVyJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHN1YnNjcmliZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgdGFrZVVudGlsKGRpc3Bvc2UkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZHJhZ092ZXJUYWJiYXIgPT4ge1xuICAgICAgICBpZiAoZHJhZ092ZXJUYWJiYXIpIHtcbiAgICAgICAgICBzZXRTdHlsZShkcm9wWm9uZUVsZW1lbnQsIHsncG9pbnRlci1ldmVudHMnOiAnbm9uZSd9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBzZXRTdHlsZShkcm9wWm9uZUVsZW1lbnQsIHsncG9pbnRlci1ldmVudHMnOiBudWxsfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgICgpID0+IGRpc3Bvc2UkLm5leHQoKSxcbiAgICAgICgpID0+IGRyb3Bab25lRWxlbWVudC5yZW1vdmUoKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgdGhlIGluc2V0IGZvciB0aGUgZHJvcCByZWdpb24gYmFzZWQgb24gdGhlIGdpdmVuIHNpemUuXG4gICAqXG4gICAqIElmIHBhc3NpbmcgYSByYXRpbyBbMCwxXSBmb3IgdGhlIHNpemUsIHRoZSBzaXplIGlzIGludGVycHJldGVkIGFzIGEgcGVyY2VudGFnZSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgaG9zdCBlbGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVJbnNldChyZWdpb246ICdub3J0aCcgfCAnZWFzdCcgfCAnc291dGgnIHwgJ3dlc3QnIHwgJ2NlbnRlcicsIHNpemU6IG51bWJlcik6IEluc2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdG9wOiByZWdpb24gPT09ICdzb3V0aCcgPyB0aGlzLl9ob3N0LmNsaWVudEhlaWdodCAtIGNvZXJjZVBpeGVsVmFsdWUoc2l6ZSwge2NvbnRhaW5lclNpemU6IHRoaXMuX2hvc3QuY2xpZW50SGVpZ2h0fSkgOiAwLFxuICAgICAgcmlnaHQ6IHJlZ2lvbiA9PT0gJ3dlc3QnID8gdGhpcy5faG9zdC5jbGllbnRXaWR0aCAtIGNvZXJjZVBpeGVsVmFsdWUoc2l6ZSwge2NvbnRhaW5lclNpemU6IHRoaXMuX2hvc3QuY2xpZW50V2lkdGh9KSA6IDAsXG4gICAgICBib3R0b206IHJlZ2lvbiA9PT0gJ25vcnRoJyA/IHRoaXMuX2hvc3QuY2xpZW50SGVpZ2h0IC0gY29lcmNlUGl4ZWxWYWx1ZShzaXplLCB7Y29udGFpbmVyU2l6ZTogdGhpcy5faG9zdC5jbGllbnRIZWlnaHR9KSA6IDAsXG4gICAgICBsZWZ0OiByZWdpb24gPT09ICdlYXN0JyA/IHRoaXMuX2hvc3QuY2xpZW50V2lkdGggLSBjb2VyY2VQaXhlbFZhbHVlKHNpemUsIHtjb250YWluZXJTaXplOiB0aGlzLl9ob3N0LmNsaWVudFdpZHRofSkgOiAwLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUhvc3RFbGVtZW50UG9zaXRpb25lZCgpOiB2b2lkIHtcbiAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9ob3N0KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIHNldFN0eWxlKHRoaXMuX2hvc3QsIHsncG9zaXRpb24nOiAncmVsYXRpdmUnfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29lcmNlcyBnaXZlbiB2YWx1ZSB0byBhIENTUyBwaXhlbCB2YWx1ZS5cbiAqXG4gKiBJZiBwYXNzaW5nIGEgcmF0aW8gWzAsMV0sIGl0IGlzIGludGVycHJldGVkIGFzIGEgcGVyY2VudGFnZSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLlxuICovXG5mdW5jdGlvbiBjb2VyY2VQaXhlbFZhbHVlKHBpeGVsT3JSYXRpbzogbnVtYmVyLCBvcHRpb25zOiB7Y29udGFpbmVyU2l6ZTogbnVtYmVyfSk6IG51bWJlciB7XG4gIHJldHVybiAocGl4ZWxPclJhdGlvIDw9IDEpID8gb3B0aW9ucy5jb250YWluZXJTaXplICogcGl4ZWxPclJhdGlvIDogcGl4ZWxPclJhdGlvO1xufVxuXG4vKipcbiAqIEV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuIGRyb3BwaW5nIGEgdmlldy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYlZpZXdEcm9wRXZlbnQge1xuICBkcm9wUmVnaW9uOiAnbm9ydGgnIHwgJ2Vhc3QnIHwgJ3NvdXRoJyB8ICd3ZXN0JyB8ICdjZW50ZXInO1xuICBkcmFnRGF0YTogVmlld0RyYWdEYXRhO1xufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGUgcmVnaW9ucyB3aGVyZSBhIGRyb3Agem9uZSBzaG91bGQgYmUgaW5zdGFsbGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERyb3Bab25lUmVnaW9uIHtcbiAgbm9ydGg6IGJvb2xlYW47XG4gIHNvdXRoOiBib29sZWFuO1xuICB3ZXN0OiBib29sZWFuO1xuICBlYXN0OiBib29sZWFuO1xuICBjZW50ZXI6IGJvb2xlYW47XG59XG5cbi8qKlxuICogRGlzdGFuY2UgYmV0d2VlbiBhbiBlbGVtZW50IGFuZCB0aGUgcGFyZW50IGVsZW1lbnQuXG4gKi9cbmludGVyZmFjZSBJbnNldCB7XG4gIHRvcDogbnVtYmVyO1xuICByaWdodDogbnVtYmVyO1xuICBib3R0b206IG51bWJlcjtcbiAgbGVmdDogbnVtYmVyO1xufVxuXG50eXBlIERpc3Bvc2VGbiA9ICgpID0+IHZvaWQ7XG4iXX0=