@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,444 +0,0 @@
1
- /*
2
- * Copyright (c) 2018-2024 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 { Component, computed, effect, ElementRef, HostListener, inject, Inject, NgZone, untracked, viewChild, viewChildren } from '@angular/core';
11
- import { ViewTabComponent } from '../view-tab/view-tab.component';
12
- import { first, map, mergeMap, take, takeUntil } from 'rxjs/operators';
13
- import { animationFrameScheduler, firstValueFrom, from, fromEvent, Subject } from 'rxjs';
14
- import { ViewDragImageRect } from '../../view-dnd/view-tab-drag-image-renderer.service';
15
- import { getCssTranslation, setCssClass, setCssVariable, unsetCssClass, unsetCssVariable } from '../../common/dom.util';
16
- import { filterArray, subscribeIn } from '@scion/toolkit/operators';
17
- import { SciViewportComponent } from '@scion/components/viewport';
18
- import { dimension } from '@scion/components/dimension';
19
- import { AsyncPipe } from '@angular/common';
20
- import { PartActionBarComponent } from '../part-action-bar/part-action-bar.component';
21
- import { ViewListButtonComponent } from '../view-list-button/view-list-button.component';
22
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
23
- import { WORKBENCH_ID } from '../../workbench-id';
24
- import { onEveryAnimationFrame$ } from '../../common/animation-frame.observable';
25
- import * as i0 from "@angular/core";
26
- import * as i1 from "../\u0275workbench-part.model";
27
- import * as i2 from "../../layout/workbench-layout.service";
28
- import * as i3 from "../../routing/\u0275workbench-router.service";
29
- import * as i4 from "../../view-dnd/view-tab-drag-image-renderer.service";
30
- import * as i5 from "../../view-dnd/view-drag.service";
31
- /**
32
- * Renders view tabs and actions of a {@link WorkbenchPart}.
33
- *
34
- * Tabs are added to a viewport, which the user can scroll if not enough space. The viewport grows with its tabs,
35
- * allowing actions to be placed directly after the last tab or on the right side.
36
- *
37
- * ## Drag Events
38
- * We use native drag and drop to support dragging views to other windows.
39
- *
40
- * By listening to drag events, the tabbar visualizes tabs during a drag operation. The drag operation is initiated in {@link ViewTabComponent}.
41
- * - `dragstart` and `dragend` events are fired in the tabbar where the drag operation was initiated.
42
- * - `dragenter` event is fired when a tab enters the tabbar.
43
- * - `dragover` events are fired when dragging a tab over the tabbar.
44
- * - `dragleave` event is fired when a tab leaves the tabbar.
45
- * - `drop` event is fired when the user drops a tab in the tabbar.
46
- * - Note that `dragleave` event is not fired on drop action. Therefore, always handle both events, `dragleave` and `drop` events, respectively.
47
- *
48
- * ## Terminology
49
- * - Drag source: Tab that is being dragged.
50
- * - Drop target: Tab before which to insert the drag source on drop, or `end` if dropping it after the last tab.
51
- * - Drag image: Image for the tab to be dragged. We do not use the native drag image support to control drag image position and size,
52
- * e.g., to snap the drag image to the tabbar when dragging near it.
53
- */
54
- export class PartBarComponent {
55
- constructor(host, _workbenchId, part, _workbenchLayoutService, _router, _viewTabDragImageRenderer, _viewDragService, _destroyRef) {
56
- this._workbenchId = _workbenchId;
57
- this.part = part;
58
- this._workbenchLayoutService = _workbenchLayoutService;
59
- this._router = _router;
60
- this._viewTabDragImageRenderer = _viewTabDragImageRenderer;
61
- this._viewDragService = _viewDragService;
62
- this._destroyRef = _destroyRef;
63
- this._viewportChange$ = new Subject();
64
- this._viewTabs = viewChildren(ViewTabComponent);
65
- this._dragenter$ = new Subject();
66
- this._dragleave$ = new Subject();
67
- this._dragend$ = new Subject();
68
- this._viewportComponent = viewChild.required(SciViewportComponent);
69
- this._viewportComponentElement = viewChild.required(SciViewportComponent, { read: (ElementRef) });
70
- this._tabCornerRadiusElement = viewChild.required('tab_corner_radius', { read: (ElementRef) });
71
- this._paddingInlineElement = viewChild.required('padding_inline', { read: (ElementRef) });
72
- /**
73
- * Reference to the tab before which to insert the drag source on drop, or `end` if dropping it after the last tab.
74
- */
75
- this.dropTargetViewTab = null;
76
- /**
77
- * Reference to the tab where the drag operation was started.
78
- * This reference is only set if the drag operation started on a tab of this tabbar.
79
- */
80
- this.dragSourceViewTab = null;
81
- /**
82
- * Transfer data of the tab being dragged over this tabbar.
83
- */
84
- this._dragData = null;
85
- /**
86
- * Function for snapping the drag image to the tabbar when dragging near it.
87
- */
88
- this._constrainFn = null;
89
- /**
90
- * Tabbar indents where to display the rounded bottom corners of the first and last view tab.
91
- */
92
- this._tabbarIndent = {
93
- left: 0,
94
- right: 0,
95
- };
96
- /**
97
- * Notifies when the drag animation has finished, i.e., tabs have transitioned to their final position.
98
- */
99
- this._dragAnimationStable$ = onEveryAnimationFrame$().pipe(first(() => this.isDragAnimationStable()));
100
- this._host = host.nativeElement;
101
- this.dragover$ = this._viewDragService.tabbarDragOver$.pipe(map(partId => partId === this.part.id));
102
- this.installActiveViewScroller();
103
- this.installScrolledIntoViewUpdater();
104
- this.installViewDragListener();
105
- this.installTabbarIndentSizeTracker();
106
- this.installViewportChangeTracker();
107
- }
108
- onDoubleClick(event) {
109
- if (this.part.isInMainArea) {
110
- this._router.navigate(layout => layout.toggleMaximized()).then();
111
- }
112
- event.stopPropagation();
113
- }
114
- /**
115
- * Method invoked when the user starts dragging a tab of this tabbar.
116
- */
117
- onViewDragStart(event) {
118
- if (!this._viewDragService.isViewDragEvent(event)) {
119
- return;
120
- }
121
- const dragData = this._viewDragService.viewDragData;
122
- const dragSourceIndex = this._viewTabs().findIndex(viewTab => viewTab.viewId === dragData.viewId);
123
- const dragSourceViewTab = this._viewTabs()[dragSourceIndex];
124
- const dropTargetViewTab = this._viewTabs()[dragSourceIndex + 1] ?? 'end';
125
- // Constrain function for snapping the drag image to the tabbar when dragging near it.
126
- this._constrainFn = this.createDragImageConstrainFn();
127
- this._viewTabDragImageRenderer.setConstrainDragImageRectFn(this._constrainFn);
128
- this._viewDragService.setTabbarDragover(this.part.id);
129
- // When start dragging a view tab, we remove it from the tabbar by setting its `display` to `none` and render its drag image in `ViewTabDragImageRenderer` instead.
130
- // However, do not unset the `display` of the drag source during `dragstart`. Otherwise, the native drag operation would be corrupted in Chrome and Edge (but not in Firefox).
131
- animationFrameScheduler.schedule(() => {
132
- this.dragSourceViewTab = dragSourceViewTab;
133
- this.dropTargetViewTab = dropTargetViewTab; // Set drop target to avoid tab animation.
134
- setCssVariable(this._host, {
135
- '--ɵpart-bar-drag-source-width': `${dragData.viewTabWidth}px`,
136
- '--ɵpart-bar-drag-image-placeholder-width': `${dragData.viewTabWidth}px`,
137
- });
138
- });
139
- // When dragging a tab very quickly out of this tabbar, only the `dragstart` event gets fired, but not the `dragenter` event.
140
- // Therefore, we subscribe to global `dragenter` events and manually invoke `onTabbarDragLeave` to correctly display the tabs and the active view.
141
- this._viewDragService.viewDrag$(window, { eventType: ['dragenter'] })
142
- .pipe(take(1), takeUntil(this._dragend$), takeUntilDestroyed(this._destroyRef))
143
- .subscribe(event => {
144
- // Check if the user continues dragging over this tabbar.
145
- // If not, the user has quickly dragged the tab out of the tabbar and we manually call `onTabbarDragLeave`.
146
- if ((this._host.compareDocumentPosition(event.target) & Node.DOCUMENT_POSITION_CONTAINED_BY) === 0) {
147
- this.onTabbarDragLeave();
148
- }
149
- });
150
- }
151
- /**
152
- * Method invoked when the user ends dragging a tab of this tabbar.
153
- *
154
- * Invoked only in the tabbar where the drag operation started, regardless of whether the drag operation was completed or canceled.
155
- */
156
- onViewDragEnd() {
157
- this._dragend$.next();
158
- this.unsetDragState();
159
- }
160
- /**
161
- * Method invoked when the user drags a tab into this tabbar.
162
- */
163
- onTabbarDragEnter(event) {
164
- this._dragenter$.next();
165
- this._viewDragService.setTabbarDragover(this.part.id);
166
- this._dragData = this._viewDragService.viewDragData;
167
- // Constrain function for snapping the drag image to the tabbar when dragging near it.
168
- if (!this._constrainFn) {
169
- this._constrainFn = this.createDragImageConstrainFn();
170
- this._viewTabDragImageRenderer.setConstrainDragImageRectFn(this._constrainFn);
171
- }
172
- // Locate drop target to have a nice animation for the drag source placeholder.
173
- this.dropTargetViewTab = this.computeDropTarget(event);
174
- // Set the CSS class 'drag-enter' to indicate entering the tabbar.
175
- setCssClass(this._host, 'drag-enter', 'drag-over');
176
- this._dragAnimationStable$
177
- .pipe(take(1), takeUntil(this._dragenter$), takeUntilDestroyed(this._destroyRef))
178
- .subscribe({ complete: () => unsetCssClass(this._host, 'drag-enter') });
179
- setCssVariable(this._host, {
180
- '--ɵpart-bar-drag-source-width': `${this._dragData.viewTabWidth}px`,
181
- '--ɵpart-bar-drag-image-placeholder-width': `${this._dragData.viewTabWidth}px`,
182
- });
183
- }
184
- /**
185
- * Method invoked when the user drags a tab out of this tabbar.
186
- */
187
- onTabbarDragLeave() {
188
- this._dragleave$.next();
189
- // Set the CSS class 'drag-leave' to indicate leaving the tabbar.
190
- setCssClass(this._host, 'drag-leave');
191
- this._dragAnimationStable$
192
- .pipe(take(1), takeUntil(this._dragleave$), takeUntilDestroyed(this._destroyRef))
193
- .subscribe({ complete: () => unsetCssClass(this._host, 'drag-leave') });
194
- this.unsetDragState({ unsetDragSource: false });
195
- // Activate the view next to the view being dragged out of this tabbar. But, do not push the navigation into browsing history stack.
196
- if (this.dragSourceViewTab && this.dragSourceViewTab.active) {
197
- this._router.navigate(layout => layout.activateAdjacentView(this.dragSourceViewTab.viewId), { skipLocationChange: true }).then();
198
- }
199
- }
200
- /**
201
- * Method invoked while the user is dragging a tab over this tabbar.
202
- */
203
- onTabbarDragOver(event) {
204
- event.preventDefault(); // allow view drop
205
- // Locate the tab over which the user is dragging the tab, but only after pending transitions have ended to prevent tabs from sliding back and forth.
206
- if (this.isDragAnimationStable()) {
207
- this.dropTargetViewTab = this.computeDropTarget(event);
208
- // Synchronize the width of the drag source placeholder with the drag pointer position to move actions along with the pointer.
209
- setCssVariable(this._host, { '--ɵpart-bar-drag-image-placeholder-width': `${this.calculateDragImagePlaceholderWidth(event)}px` });
210
- }
211
- }
212
- /**
213
- * Method invoked when the user drops a tab in this tabbar.
214
- */
215
- onTabbarDrop() {
216
- this._viewDragService.dispatchViewMoveEvent({
217
- source: {
218
- workbenchId: this._dragData.workbenchId,
219
- partId: this._dragData.partId,
220
- viewId: this._dragData.viewId,
221
- alternativeViewId: this._dragData.alternativeViewId,
222
- viewUrlSegments: this._dragData.viewUrlSegments,
223
- navigationHint: this._dragData.navigationHint,
224
- navigationData: this._dragData.navigationData,
225
- classList: this._dragData.classList,
226
- },
227
- target: {
228
- workbenchId: this._workbenchId,
229
- position: this.dropTargetViewTab === 'end' ? 'end' : this._viewTabs().indexOf(this.dropTargetViewTab),
230
- elementId: this.part.id,
231
- },
232
- });
233
- // Wait undoing the drag state until flushed tab changes to the DOM, i.e., after the layout routing cycle completes.
234
- // If we were to undo the drag state immediately during the course of the drop event, the tab layout would temporarily
235
- // revert to the state before the drag operation, resulting in an ugly flicker.
236
- firstValueFrom(this._workbenchLayoutService.onLayoutChange$).then(() => {
237
- this.unsetDragState();
238
- });
239
- }
240
- /**
241
- * Locates the tab before which the dragged tab is to be inserted when it is dropped. Dragging beyond the last tab returns `end`.
242
- */
243
- computeDropTarget(event) {
244
- const viewDragImageRect = this._viewTabDragImageRenderer.calculateDragImageRect(this._dragData, event);
245
- const viewTabs = this._viewTabs().filter(viewTab => viewTab !== this.dragSourceViewTab);
246
- for (const viewTab of viewTabs) {
247
- const viewTabRect = viewTab.host.getBoundingClientRect();
248
- const viewTabMiddle = viewTabRect.left + (viewTabRect.width / 2);
249
- if (viewDragImageRect.left < viewTabMiddle && (viewTab !== this.dropTargetViewTab || viewDragImageRect.right < viewTabMiddle)) {
250
- return viewTab;
251
- }
252
- }
253
- return 'end';
254
- }
255
- /**
256
- * Creates the function for snapping the drag image to the tabbar when dragging near it.
257
- */
258
- createDragImageConstrainFn() {
259
- const hostLeft = this._host.getBoundingClientRect().left;
260
- const maxViewportWidth = this.calculateMaxViewportWidth();
261
- return (rect) => {
262
- const viewportBoundingBox = this._viewportComponentElement().nativeElement.getBoundingClientRect();
263
- return new ViewDragImageRect({
264
- x: Math.min(Math.max(hostLeft + this._tabbarIndent.left, rect.x), hostLeft + maxViewportWidth - rect.width - this._tabbarIndent.right),
265
- y: viewportBoundingBox.top,
266
- width: rect.width,
267
- height: viewportBoundingBox.height, // fit into tabbar, e.g., when dragging a tab into a tabbar of a different height
268
- });
269
- };
270
- }
271
- /**
272
- * Calculates the maximum width of the tabbar viewport before an overflow would occur, which can then be used to constrain the drag image.
273
- *
274
- * To calculate the effective width, we need to simulate an overflow in the DOM. Therefore, call this method only from `dragstart` and not
275
- * from `dragover` and disable animations.
276
- */
277
- calculateMaxViewportWidth() {
278
- const currentWidth = this._host.style.getPropertyValue('--ɵpart-bar-drag-image-placeholder-width');
279
- // Disable animations during calculation and force the viewport to overflow.
280
- setCssClass(this._host, 'calculating-max-viewport-width');
281
- setCssVariable(this._host, { '--ɵpart-bar-drag-image-placeholder-width': `${this._host.clientWidth}px` });
282
- try {
283
- return this._viewportComponentElement().nativeElement.getBoundingClientRect().width;
284
- }
285
- finally {
286
- setCssVariable(this._host, { '--ɵpart-bar-drag-image-placeholder-width': currentWidth || null });
287
- unsetCssClass(this._host, 'calculating-max-viewport-width');
288
- }
289
- }
290
- /**
291
- * Calculates the width for the drag image placeholder.
292
- *
293
- * - When dragging over tabs, the width is equal to the width of the drag source.
294
- * - When dragging to the right of the last tab, the width of the placeholder is calculated as the distance between the
295
- * last tab and the position of the dragover event. Applying this width will resize the viewport, moving part actions along
296
- * with the dragover event.
297
- */
298
- calculateDragImagePlaceholderWidth(event) {
299
- const viewDragImageRect = this._viewTabDragImageRenderer.calculateDragImageRect(this._dragData, event);
300
- const lastViewTab = this._viewTabs().filter(viewTab => viewTab !== this.dragSourceViewTab).at(-1);
301
- const lastViewTabRight = lastViewTab?.host.getBoundingClientRect().right ?? this._host.getBoundingClientRect().left + this._tabbarIndent.left;
302
- return Math.max(lastViewTabRight + viewDragImageRect.width, viewDragImageRect.right) - lastViewTabRight;
303
- }
304
- /**
305
- * Indicates whether CSS animations have finished when dragging a tab over the tabbar.
306
- * The animation is considered stable when all tabs have moved to their final position.
307
- */
308
- isDragAnimationStable() {
309
- if (!this.dropTargetViewTab) {
310
- return this._viewTabs().every(viewTab => getCssTranslation(viewTab.host).translateX === 'none');
311
- }
312
- const viewTabs = this._viewTabs().filter(viewTab => viewTab !== this.dragSourceViewTab);
313
- const dropTargetIndex = this.dropTargetViewTab === 'end' ? viewTabs.length : viewTabs.indexOf(this.dropTargetViewTab);
314
- const dragSourceWidth = this._dragData.viewTabWidth;
315
- return viewTabs.every((viewTab, i) => {
316
- const viewTabTranslateX = getCssTranslation(viewTab.host).translateX;
317
- // Expect tabs preceding the drop target not to be shifted to the right.
318
- if (i < dropTargetIndex && viewTabTranslateX !== 'none') {
319
- return false;
320
- }
321
- // Expect drop target and tabs following the drop target to be shifted to the right.
322
- if (i >= dropTargetIndex && Math.floor(Number(viewTabTranslateX)) !== Math.floor(dragSourceWidth)) { // compare floored numbers because `translateX` is not precise
323
- return false;
324
- }
325
- return true;
326
- });
327
- }
328
- unsetDragState(options) {
329
- if (options?.unsetDragSource ?? true) {
330
- this.dragSourceViewTab = null;
331
- }
332
- this.dropTargetViewTab = null;
333
- this._dragData = null;
334
- this._viewTabDragImageRenderer.unsetConstrainDragImageRectFn(this._constrainFn);
335
- this._constrainFn = null;
336
- unsetCssClass(this._host, 'drag-over');
337
- unsetCssVariable(this._host, '--ɵpart-bar-drag-source-width', '--ɵpart-bar-drag-image-placeholder-width');
338
- this._viewDragService.unsetTabbarDragover(this.part.id);
339
- }
340
- /**
341
- * Scrolls the tab of the active view into view.
342
- */
343
- installActiveViewScroller() {
344
- effect(() => {
345
- const viewportComponent = this._viewportComponent();
346
- const activeViewId = this.part.activeViewId();
347
- // There may be no active view in the tabbar, e.g., when dragging the last view out of the tabbar.
348
- const activeViewTab = this._viewTabs().find(viewTab => viewTab.viewId === activeViewId);
349
- if (activeViewTab && !viewportComponent.isElementInView(activeViewTab.host, 'full')) {
350
- untracked(() => viewportComponent.scrollIntoView(activeViewTab.host));
351
- }
352
- });
353
- }
354
- /**
355
- * Updates {@link ɵWorkbenchView} when its tab is scrolled into view.
356
- */
357
- installScrolledIntoViewUpdater() {
358
- this._viewportChange$
359
- .pipe(map(() => this._viewTabs()), filterArray(viewTab => viewTab !== this.dragSourceViewTab), // skip drag source as always scrolled out of view
360
- mergeMap(viewTabs => from(viewTabs)), takeUntilDestroyed())
361
- .subscribe(viewTab => {
362
- viewTab.view().scrolledIntoView = this._viewportComponent().isElementInView(viewTab.host, 'full');
363
- });
364
- }
365
- installViewDragListener() {
366
- this._viewDragService.viewDrag$(this._host)
367
- .pipe(takeUntilDestroyed())
368
- .subscribe((event) => {
369
- switch (event.type) {
370
- case 'dragenter':
371
- this.onTabbarDragEnter(event);
372
- break;
373
- case 'dragover':
374
- this.onTabbarDragOver(event);
375
- break;
376
- case 'dragleave':
377
- this.onTabbarDragLeave();
378
- break;
379
- case 'drop':
380
- this.onTabbarDrop();
381
- break;
382
- }
383
- });
384
- }
385
- installViewportChangeTracker() {
386
- const viewportSize = dimension(computed(() => this._viewportComponentElement().nativeElement));
387
- const viewportClientSize = dimension(computed(() => this._viewportComponent().viewportClientElement));
388
- const zone = inject(NgZone);
389
- // Detect resizing.
390
- effect(() => {
391
- // Track viewport and viewport client sizes.
392
- viewportSize();
393
- viewportClientSize();
394
- untracked(() => this._viewportChange$.next());
395
- });
396
- // Detect scrolling.
397
- effect(onCleanup => {
398
- const viewport = this._viewportComponent().viewportElement;
399
- untracked(() => {
400
- const subscription = fromEvent(viewport, 'scroll')
401
- .pipe(subscribeIn(fn => zone.runOutsideAngular(fn)))
402
- .subscribe(() => this._viewportChange$.next());
403
- onCleanup(() => subscription.unsubscribe());
404
- });
405
- });
406
- }
407
- installTabbarIndentSizeTracker() {
408
- const tabCornerRadiusDimension = dimension(this._tabCornerRadiusElement);
409
- const paddingInlineDimension = dimension(this._paddingInlineElement);
410
- effect(() => {
411
- const indent = tabCornerRadiusDimension().clientWidth + paddingInlineDimension().clientWidth;
412
- this._tabbarIndent = { left: indent, right: indent };
413
- setCssVariable(this._host, {
414
- '--ɵpart-bar-indent-left': `${this._tabbarIndent.left}px`,
415
- '--ɵpart-bar-indent-right': `${this._tabbarIndent.right}px`,
416
- });
417
- });
418
- }
419
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartBarComponent, deps: [{ token: i0.ElementRef }, { token: WORKBENCH_ID }, { token: i1.ɵWorkbenchPart }, { token: i2.WorkbenchLayoutService }, { token: i3.ɵWorkbenchRouter }, { token: i4.ViewTabDragImageRenderer }, { token: i5.ViewDragService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
420
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: PartBarComponent, isStandalone: true, selector: "wb-part-bar", host: { listeners: { "dblclick": "onDoubleClick($event)", "dragstart": "onViewDragStart($event)", "dragend": "onViewDragEnd()" } }, viewQueries: [{ propertyName: "_viewTabs", predicate: ViewTabComponent, descendants: true, isSignal: true }, { propertyName: "_viewportComponent", first: true, predicate: SciViewportComponent, descendants: true, isSignal: true }, { propertyName: "_viewportComponentElement", first: true, predicate: SciViewportComponent, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_tabCornerRadiusElement", first: true, predicate: ["tab_corner_radius"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_paddingInlineElement", first: true, predicate: ["padding_inline"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<sci-viewport class=\"tabbar\" scrollbarStyle=\"hidden\" [class.dragover]=\"dragover$ | async\">\n @for (viewId of part.viewIds(); track viewId) {\n @if (viewtab === dropTargetViewTab) {\n <div class=\"divider\"></div>\n }\n <wb-view-tab #viewtab\n [viewId]=\"viewId\"\n [class.drag-source]=\"viewtab === dragSourceViewTab\"\n [class.drop-target]=\"viewtab === dropTargetViewTab\"/>\n <div class=\"divider\"></div>\n }\n\n <!-- Placeholder element to grow the viewport to fit the drag image. -->\n <div class=\"drag-image-placeholder\"></div>\n</sci-viewport>\n<wb-part-action-bar/>\n<wb-view-list-button/>\n\n<!-- Element for injecting the corner radius into the component. -->\n<div class=\"tab-corner-radius\" #tab_corner_radius></div>\n<!-- Element for injecting the tabbar padding into the component. -->\n<div class=\"padding-inline\" #padding_inline></div>\n", styles: ["@charset \"UTF-8\";:host{--\\275part-bar-indent-left: 0;--\\275part-bar-indent-right: 0;--\\275part-bar-drag-source-width: 0;--\\275part-bar-drag-image-placeholder-width: 0;display:flex;color:var(--sci-workbench-tab-text-color);background-color:var(--sci-workbench-part-bar-background-color);border-top:var(--sci-workbench-part-bar-padding-top) solid transparent;background-clip:border-box;height:var(--sci-workbench-tab-height);box-sizing:content-box;position:relative;container-name:viewtab;container-type:size}wb-workbench:has(wb-main-area-layout) wb-part:not(.main-area) :host{background-color:var(--sci-workbench-part-peripheral-bar-background-color)}:host>sci-viewport.tabbar{flex:initial}:host>sci-viewport.tabbar::part(content){display:flex;padding-left:var(--\\275part-bar-indent-left);padding-right:var(--\\275part-bar-indent-right)}:host>sci-viewport.tabbar:not(.dragover):not(:has(wb-view-tab:not(.drag-source)))::part(content){padding-right:0}:host>sci-viewport.tabbar>wb-view-tab{flex:none}:host>sci-viewport.tabbar>wb-view-tab.drag-source{display:none}:host>sci-viewport.tabbar>div.divider{flex:none;display:flex;position:relative;width:0}:host>sci-viewport.tabbar>div.divider:after{flex:none;align-self:center;content:\"\";position:absolute;width:1px;left:-1px;height:65%;background-color:var(--sci-workbench-part-bar-divider-color)}:host>sci-viewport.tabbar>div.drag-image-placeholder{flex:none;width:var(--\\275part-bar-drag-image-placeholder-width)}:host>sci-viewport.tabbar>wb-view-tab.drop-target,:host>sci-viewport.tabbar wb-view-tab.drop-target~:is(wb-view-tab,div.divider),:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.drop-target){transform:translate(var(--\\275part-bar-drag-source-width))}:host>sci-viewport.tabbar>wb-view-tab:is(.active,.drag-source)+div.divider{display:none}:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.active:not(.drag-source)){display:none}:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.drag-source:not(.active)){display:none}:host>wb-part-action-bar{flex:auto}:host>wb-view-list-button{flex:none}:host:before{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background-color:var(--sci-workbench-tab-border-color)}:host>div.tab-corner-radius{position:absolute;visibility:hidden;width:var(--sci-workbench-tab-border-radius)}:host>div.padding-inline{position:absolute;visibility:hidden;width:var(--sci-workbench-part-bar-padding-inline)}:host:not(.calculating-max-viewport-width).drag-enter wb-view-tab,:host:not(.calculating-max-viewport-width).drag-enter div.divider,:host:not(.calculating-max-viewport-width).drag-over wb-view-tab,:host:not(.calculating-max-viewport-width).drag-over div.divider,:host:not(.calculating-max-viewport-width).drag-leave wb-view-tab,:host:not(.calculating-max-viewport-width).drag-leave div.divider{transition:transform 175ms cubic-bezier(0,0,.2,1)}:host:not(.calculating-max-viewport-width).drag-enter div.drag-image-placeholder,:host:not(.calculating-max-viewport-width).drag-leave div.drag-image-placeholder{transition:width 175ms cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: SciViewportComponent, selector: "sci-viewport", inputs: ["scrollbarStyle"], outputs: ["scroll"] }, { kind: "component", type: ViewTabComponent, selector: "wb-view-tab", inputs: ["viewId"] }, { kind: "component", type: PartActionBarComponent, selector: "wb-part-action-bar" }, { kind: "component", type: ViewListButtonComponent, selector: "wb-view-list-button" }] }); }
421
- }
422
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartBarComponent, decorators: [{
423
- type: Component,
424
- args: [{ selector: 'wb-part-bar', standalone: true, imports: [
425
- AsyncPipe,
426
- SciViewportComponent,
427
- ViewTabComponent,
428
- PartActionBarComponent,
429
- ViewListButtonComponent,
430
- ], template: "<sci-viewport class=\"tabbar\" scrollbarStyle=\"hidden\" [class.dragover]=\"dragover$ | async\">\n @for (viewId of part.viewIds(); track viewId) {\n @if (viewtab === dropTargetViewTab) {\n <div class=\"divider\"></div>\n }\n <wb-view-tab #viewtab\n [viewId]=\"viewId\"\n [class.drag-source]=\"viewtab === dragSourceViewTab\"\n [class.drop-target]=\"viewtab === dropTargetViewTab\"/>\n <div class=\"divider\"></div>\n }\n\n <!-- Placeholder element to grow the viewport to fit the drag image. -->\n <div class=\"drag-image-placeholder\"></div>\n</sci-viewport>\n<wb-part-action-bar/>\n<wb-view-list-button/>\n\n<!-- Element for injecting the corner radius into the component. -->\n<div class=\"tab-corner-radius\" #tab_corner_radius></div>\n<!-- Element for injecting the tabbar padding into the component. -->\n<div class=\"padding-inline\" #padding_inline></div>\n", styles: ["@charset \"UTF-8\";:host{--\\275part-bar-indent-left: 0;--\\275part-bar-indent-right: 0;--\\275part-bar-drag-source-width: 0;--\\275part-bar-drag-image-placeholder-width: 0;display:flex;color:var(--sci-workbench-tab-text-color);background-color:var(--sci-workbench-part-bar-background-color);border-top:var(--sci-workbench-part-bar-padding-top) solid transparent;background-clip:border-box;height:var(--sci-workbench-tab-height);box-sizing:content-box;position:relative;container-name:viewtab;container-type:size}wb-workbench:has(wb-main-area-layout) wb-part:not(.main-area) :host{background-color:var(--sci-workbench-part-peripheral-bar-background-color)}:host>sci-viewport.tabbar{flex:initial}:host>sci-viewport.tabbar::part(content){display:flex;padding-left:var(--\\275part-bar-indent-left);padding-right:var(--\\275part-bar-indent-right)}:host>sci-viewport.tabbar:not(.dragover):not(:has(wb-view-tab:not(.drag-source)))::part(content){padding-right:0}:host>sci-viewport.tabbar>wb-view-tab{flex:none}:host>sci-viewport.tabbar>wb-view-tab.drag-source{display:none}:host>sci-viewport.tabbar>div.divider{flex:none;display:flex;position:relative;width:0}:host>sci-viewport.tabbar>div.divider:after{flex:none;align-self:center;content:\"\";position:absolute;width:1px;left:-1px;height:65%;background-color:var(--sci-workbench-part-bar-divider-color)}:host>sci-viewport.tabbar>div.drag-image-placeholder{flex:none;width:var(--\\275part-bar-drag-image-placeholder-width)}:host>sci-viewport.tabbar>wb-view-tab.drop-target,:host>sci-viewport.tabbar wb-view-tab.drop-target~:is(wb-view-tab,div.divider),:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.drop-target){transform:translate(var(--\\275part-bar-drag-source-width))}:host>sci-viewport.tabbar>wb-view-tab:is(.active,.drag-source)+div.divider{display:none}:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.active:not(.drag-source)){display:none}:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.drag-source:not(.active)){display:none}:host>wb-part-action-bar{flex:auto}:host>wb-view-list-button{flex:none}:host:before{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background-color:var(--sci-workbench-tab-border-color)}:host>div.tab-corner-radius{position:absolute;visibility:hidden;width:var(--sci-workbench-tab-border-radius)}:host>div.padding-inline{position:absolute;visibility:hidden;width:var(--sci-workbench-part-bar-padding-inline)}:host:not(.calculating-max-viewport-width).drag-enter wb-view-tab,:host:not(.calculating-max-viewport-width).drag-enter div.divider,:host:not(.calculating-max-viewport-width).drag-over wb-view-tab,:host:not(.calculating-max-viewport-width).drag-over div.divider,:host:not(.calculating-max-viewport-width).drag-leave wb-view-tab,:host:not(.calculating-max-viewport-width).drag-leave div.divider{transition:transform 175ms cubic-bezier(0,0,.2,1)}:host:not(.calculating-max-viewport-width).drag-enter div.drag-image-placeholder,:host:not(.calculating-max-viewport-width).drag-leave div.drag-image-placeholder{transition:width 175ms cubic-bezier(0,0,.2,1)}\n"] }]
431
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
432
- type: Inject,
433
- args: [WORKBENCH_ID]
434
- }] }, { type: i1.ɵWorkbenchPart }, { type: i2.WorkbenchLayoutService }, { type: i3.ɵWorkbenchRouter }, { type: i4.ViewTabDragImageRenderer }, { type: i5.ViewDragService }, { type: i0.DestroyRef }], propDecorators: { onDoubleClick: [{
435
- type: HostListener,
436
- args: ['dblclick', ['$event']]
437
- }], onViewDragStart: [{
438
- type: HostListener,
439
- args: ['dragstart', ['$event']]
440
- }], onViewDragEnd: [{
441
- type: HostListener,
442
- args: ['dragend']
443
- }] } });
444
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydC1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcGFydC9wYXJ0LWJhci9wYXJ0LWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9wYXJ0L3BhcnQtYmFyL3BhcnQtYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQWMsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFaEUsT0FBTyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25HLE9BQU8sRUFBYyxpQkFBaUIsRUFBMkIsTUFBTSxxREFBcUQsQ0FBQztBQUU3SCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0SCxPQUFPLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFDcEYsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sZ0RBQWdELENBQUM7QUFDdkYsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7O0FBRS9FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBY0gsTUFBTSxPQUFPLGdCQUFnQjtJQWlEM0IsWUFBWSxJQUE2QixFQUNDLFlBQW9CLEVBQ3hDLElBQW9CLEVBQ3RCLHVCQUErQyxFQUMvQyxPQUF5QixFQUN6Qix5QkFBbUQsRUFDbkQsZ0JBQWlDLEVBQ2pDLFdBQXVCO1FBTkQsaUJBQVksR0FBWixZQUFZLENBQVE7UUFDeEMsU0FBSSxHQUFKLElBQUksQ0FBZ0I7UUFDdEIsNEJBQXVCLEdBQXZCLHVCQUF1QixDQUF3QjtRQUMvQyxZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUN6Qiw4QkFBeUIsR0FBekIseUJBQXlCLENBQTBCO1FBQ25ELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQVk7UUFyRDFCLHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDdkMsY0FBUyxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzNDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNsQyxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDbEMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFHaEMsdUJBQWtCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzlELDhCQUF5QixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQSxVQUF1QixDQUFBLEVBQUMsQ0FBQyxDQUFDO1FBQ3RHLDRCQUF1QixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQSxVQUF1QixDQUFBLEVBQUMsQ0FBQyxDQUFDO1FBQ25HLDBCQUFxQixHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQSxVQUF1QixDQUFBLEVBQUMsQ0FBQyxDQUFDO1FBRS9HOztXQUVHO1FBQ0ksc0JBQWlCLEdBQW9DLElBQUksQ0FBQztRQUVqRTs7O1dBR0c7UUFDSSxzQkFBaUIsR0FBNEIsSUFBSSxDQUFDO1FBRXpEOztXQUVHO1FBQ0ssY0FBUyxHQUF3QixJQUFJLENBQUM7UUFFOUM7O1dBRUc7UUFDSyxpQkFBWSxHQUF1QixJQUFJLENBQUM7UUFFaEQ7O1dBRUc7UUFDSyxrQkFBYSxHQUFHO1lBQ3RCLElBQUksRUFBRSxDQUFDO1lBQ1AsS0FBSyxFQUFFLENBQUM7U0FDVCxDQUFDO1FBRUY7O1dBRUc7UUFDSywwQkFBcUIsR0FBRyxzQkFBc0IsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBVXZHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUdNLGFBQWEsQ0FBQyxLQUFpQjtRQUNwQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUVJLGVBQWUsQ0FBQyxLQUFnQjtRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xELE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQWEsQ0FBQztRQUNyRCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEcsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztRQUV6RSxzRkFBc0Y7UUFDdEYsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMseUJBQXlCLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXRELG1LQUFtSztRQUNuSyw4S0FBOEs7UUFDOUssdUJBQXVCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNwQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7WUFDM0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLENBQUMsMENBQTBDO1lBQ3RGLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUN6QiwrQkFBK0IsRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLElBQUk7Z0JBQzdELDBDQUEwQyxFQUFFLEdBQUcsUUFBUSxDQUFDLFlBQVksSUFBSTthQUN6RSxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILDZIQUE2SDtRQUM3SCxrSkFBa0o7UUFDbEosSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsRUFBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBQyxDQUFDO2FBQ2hFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDOUUsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLHlEQUF5RDtZQUN6RCw0R0FBNEc7WUFDNUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsS0FBSyxDQUFDLE1BQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUcsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7O09BSUc7SUFFSSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNLLGlCQUFpQixDQUFDLEtBQWdCO1FBQ3hDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBYSxDQUFDO1FBRXJELHNGQUFzRjtRQUN0RixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLHlCQUF5QixDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBRUQsK0VBQStFO1FBQy9FLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkQsa0VBQWtFO1FBQ2xFLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMscUJBQXFCO2FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7YUFDaEYsU0FBUyxDQUFDLEVBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxFQUFDLENBQUMsQ0FBQztRQUV4RSxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUN6QiwrQkFBK0IsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJO1lBQ25FLDBDQUEwQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLElBQUk7U0FDL0UsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFeEIsaUVBQWlFO1FBQ2pFLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxxQkFBcUI7YUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNoRixTQUFTLENBQUMsRUFBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1FBRXhFLElBQUksQ0FBQyxjQUFjLENBQUMsRUFBQyxlQUFlLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUU5QyxvSUFBb0k7UUFDcEksSUFBSSxJQUFJLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxpQkFBa0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFDLGtCQUFrQixFQUFFLElBQUksRUFBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEksQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGdCQUFnQixDQUFDLEtBQWdCO1FBQ3ZDLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLGtCQUFrQjtRQUUxQyxxSkFBcUo7UUFDckosSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkQsOEhBQThIO1lBQzlILGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUMsMENBQTBDLEVBQUUsR0FBRyxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBQyxDQUFDLENBQUM7UUFDbEksQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLFlBQVk7UUFDbEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFxQixDQUFDO1lBQzFDLE1BQU0sRUFBRTtnQkFDTixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVUsQ0FBQyxXQUFXO2dCQUN4QyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVUsQ0FBQyxNQUFNO2dCQUM5QixNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVUsQ0FBQyxNQUFNO2dCQUM5QixpQkFBaUIsRUFBRSxJQUFJLENBQUMsU0FBVSxDQUFDLGlCQUFpQjtnQkFDcEQsZUFBZSxFQUFFLElBQUksQ0FBQyxTQUFVLENBQUMsZUFBZTtnQkFDaEQsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFVLENBQUMsY0FBYztnQkFDOUMsY0FBYyxFQUFFLElBQUksQ0FBQyxTQUFVLENBQUMsY0FBYztnQkFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFVLENBQUMsU0FBUzthQUNyQztZQUNELE1BQU0sRUFBRTtnQkFDTixXQUFXLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQzlCLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGlCQUFrQixDQUFDO2dCQUN0RyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsb0hBQW9IO1FBQ3BILHNIQUFzSDtRQUN0SCwrRUFBK0U7UUFDL0UsY0FBYyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3JFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQixDQUFDLEtBQWdCO1FBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxTQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEcsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUV4RixLQUFLLE1BQU0sT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQy9CLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUN6RCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRSxJQUFJLGlCQUFpQixDQUFDLElBQUksR0FBRyxhQUFhLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLEtBQUssR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUM5SCxPQUFPLE9BQU8sQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCO1FBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDekQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUMxRCxPQUFPLENBQUMsSUFBdUIsRUFBcUIsRUFBRTtZQUNwRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ25HLE9BQU8sSUFBSSxpQkFBaUIsQ0FBQztnQkFDM0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO2dCQUN0SSxDQUFDLEVBQUUsbUJBQW1CLENBQUMsR0FBRztnQkFDMUIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixNQUFNLEVBQUUsbUJBQW1CLENBQUMsTUFBTSxFQUFFLGlGQUFpRjthQUN0SCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx5QkFBeUI7UUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUVuRyw0RUFBNEU7UUFDNUUsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUMxRCxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFDLDBDQUEwQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBQyxDQUFDLENBQUM7UUFDeEcsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxhQUFhLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUM7UUFDdEYsQ0FBQztnQkFDTyxDQUFDO1lBQ1AsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBQywwQ0FBMEMsRUFBRSxZQUFZLElBQUksSUFBSSxFQUFDLENBQUMsQ0FBQztZQUMvRixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGtDQUFrQyxDQUFDLEtBQWdCO1FBQ3pELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxTQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDeEcsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRyxNQUFNLGdCQUFnQixHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUM5SSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxHQUFHLGdCQUFnQixDQUFDO0lBQzFHLENBQUM7SUFFRDs7O09BR0c7SUFDSyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDbEcsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDeEYsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWtCLENBQUMsQ0FBQztRQUN2SCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsU0FBVSxDQUFDLFlBQVksQ0FBQztRQUVyRCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ3JFLHdFQUF3RTtZQUN4RSxJQUFJLENBQUMsR0FBRyxlQUFlLElBQUksaUJBQWlCLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQ3hELE9BQU8sS0FBSyxDQUFDO1lBQ2YsQ0FBQztZQUNELG9GQUFvRjtZQUNwRixJQUFJLENBQUMsSUFBSSxlQUFlLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhEQUE4RDtnQkFDakssT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsT0FBcUM7UUFDMUQsSUFBSSxPQUFPLEVBQUUsZUFBZSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDaEMsQ0FBQztRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxZQUFhLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUV6QixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN2QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLCtCQUErQixFQUFFLDBDQUEwQyxDQUFDLENBQUM7UUFDMUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVEOztPQUVHO0lBQ0sseUJBQXlCO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ3BELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFOUMsa0dBQWtHO1lBQ2xHLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFlBQVksQ0FBQyxDQUFDO1lBQ3hGLElBQUksYUFBYSxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDcEYsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4RSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyw4QkFBOEI7UUFDcEMsSUFBSSxDQUFDLGdCQUFnQjthQUNsQixJQUFJLENBQ0gsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUMzQixXQUFXLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsa0RBQWtEO1FBQzlHLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUNwQyxrQkFBa0IsRUFBRSxDQUNyQjthQUNBLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUNuQixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDcEcsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUN4QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzthQUMxQixTQUFTLENBQUMsQ0FBQyxLQUFnQixFQUFFLEVBQUU7WUFDOUIsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ25CLEtBQUssV0FBVztvQkFDZCxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzlCLE1BQU07Z0JBQ1IsS0FBSyxVQUFVO29CQUNiLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDN0IsTUFBTTtnQkFDUixLQUFLLFdBQVc7b0JBQ2QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ3pCLE1BQU07Z0JBQ1IsS0FBSyxNQUFNO29CQUNULElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDcEIsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQy9GLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUM7UUFDdEcsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVCLG1CQUFtQjtRQUNuQixNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsNENBQTRDO1lBQzVDLFlBQVksRUFBRSxDQUFDO1lBQ2Ysa0JBQWtCLEVBQUUsQ0FBQztZQUNyQixTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxvQkFBb0I7UUFDcEIsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUMzRCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNiLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO3FCQUMvQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQ25ELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDakQsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sOEJBQThCO1FBQ3BDLE1BQU0sd0JBQXdCLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sc0JBQXNCLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLE1BQU0sR0FBRyx3QkFBd0IsRUFBRSxDQUFDLFdBQVcsR0FBRyxzQkFBc0IsRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUM3RixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7WUFDbkQsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3pCLHlCQUF5QixFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLElBQUk7Z0JBQ3pELDBCQUEwQixFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUk7YUFDNUQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQXZhVSxnQkFBZ0IsNENBa0RQLFlBQVk7a0dBbERyQixnQkFBZ0IseU9BSWUsZ0JBQWdCLHFHQU1ELG9CQUFvQiw0R0FDYixvQkFBb0IsMkJBQVMsVUFBVSx1SUFDYixVQUFVLGtJQUNmLFVBQVUsNkNDL0VqRyx3NkJBc0JBLDhqR0RxQ0ksU0FBUyw4Q0FDVCxvQkFBb0IsMEdBQ3BCLGdCQUFnQiw0RUFDaEIsc0JBQXNCLCtEQUN0Qix1QkFBdUI7OzJGQUdkLGdCQUFnQjtrQkFiNUIsU0FBUzsrQkFDRSxhQUFhLGNBR1gsSUFBSSxXQUNQO3dCQUNQLFNBQVM7d0JBQ1Qsb0JBQW9CO3dCQUNwQixnQkFBZ0I7d0JBQ2hCLHNCQUFzQjt3QkFDdEIsdUJBQXVCO3FCQUN4Qjs7MEJBb0RZLE1BQU07MkJBQUMsWUFBWTt3T0FpQnpCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVk3QixlQUFlO3NCQURyQixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkE4QzlCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyNCBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgaW5qZWN0LCBJbmplY3QsIE5nWm9uZSwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIHZpZXdDaGlsZHJlbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1ZpZXdUYWJDb21wb25lbnR9IGZyb20gJy4uL3ZpZXctdGFiL3ZpZXctdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uLy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtmaXJzdCwgbWFwLCBtZXJnZU1hcCwgdGFrZSwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q29uc3RyYWluRm4sIFZpZXdEcmFnSW1hZ2VSZWN0LCBWaWV3VGFiRHJhZ0ltYWdlUmVuZGVyZXJ9IGZyb20gJy4uLy4uL3ZpZXctZG5kL3ZpZXctdGFiLWRyYWctaW1hZ2UtcmVuZGVyZXIuc2VydmljZSc7XG5pbXBvcnQge1ZpZXdEcmFnRGF0YSwgVmlld0RyYWdTZXJ2aWNlfSBmcm9tICcuLi8uLi92aWV3LWRuZC92aWV3LWRyYWcuc2VydmljZSc7XG5pbXBvcnQge2dldENzc1RyYW5zbGF0aW9uLCBzZXRDc3NDbGFzcywgc2V0Q3NzVmFyaWFibGUsIHVuc2V0Q3NzQ2xhc3MsIHVuc2V0Q3NzVmFyaWFibGV9IGZyb20gJy4uLy4uL2NvbW1vbi9kb20udXRpbCc7XG5pbXBvcnQge8m1V29ya2JlbmNoUGFydH0gZnJvbSAnLi4vybV3b3JrYmVuY2gtcGFydC5tb2RlbCc7XG5pbXBvcnQge2ZpbHRlckFycmF5LCBzdWJzY3JpYmVJbn0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7U2NpVmlld3BvcnRDb21wb25lbnR9IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL3ZpZXdwb3J0JztcbmltcG9ydCB7ybVXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4uLy4uL3JvdXRpbmcvybV3b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtkaW1lbnNpb259IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL2RpbWVuc2lvbic7XG5pbXBvcnQge0FzeW5jUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7UGFydEFjdGlvbkJhckNvbXBvbmVudH0gZnJvbSAnLi4vcGFydC1hY3Rpb24tYmFyL3BhcnQtYWN0aW9uLWJhci5jb21wb25lbnQnO1xuaW1wb3J0IHtWaWV3TGlzdEJ1dHRvbkNvbXBvbmVudH0gZnJvbSAnLi4vdmlldy1saXN0LWJ1dHRvbi92aWV3LWxpc3QtYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfSUR9IGZyb20gJy4uLy4uL3dvcmtiZW5jaC1pZCc7XG5pbXBvcnQge29uRXZlcnlBbmltYXRpb25GcmFtZSR9IGZyb20gJy4uLy4uL2NvbW1vbi9hbmltYXRpb24tZnJhbWUub2JzZXJ2YWJsZSc7XG5cbi8qKlxuICogUmVuZGVycyB2aWV3IHRhYnMgYW5kIGFjdGlvbnMgb2YgYSB7QGxpbmsgV29ya2JlbmNoUGFydH0uXG4gKlxuICogVGFicyBhcmUgYWRkZWQgdG8gYSB2aWV3cG9ydCwgd2hpY2ggdGhlIHVzZXIgY2FuIHNjcm9sbCBpZiBub3QgZW5vdWdoIHNwYWNlLiBUaGUgdmlld3BvcnQgZ3Jvd3Mgd2l0aCBpdHMgdGFicyxcbiAqIGFsbG93aW5nIGFjdGlvbnMgdG8gYmUgcGxhY2VkIGRpcmVjdGx5IGFmdGVyIHRoZSBsYXN0IHRhYiBvciBvbiB0aGUgcmlnaHQgc2lkZS5cbiAqXG4gKiAjIyBEcmFnIEV2ZW50c1xuICogV2UgdXNlIG5hdGl2ZSBkcmFnIGFuZCBkcm9wIHRvIHN1cHBvcnQgZHJhZ2dpbmcgdmlld3MgdG8gb3RoZXIgd2luZG93cy5cbiAqXG4gKiBCeSBsaXN0ZW5pbmcgdG8gZHJhZyBldmVudHMsIHRoZSB0YWJiYXIgdmlzdWFsaXplcyB0YWJzIGR1cmluZyBhIGRyYWcgb3BlcmF0aW9uLiBUaGUgZHJhZyBvcGVyYXRpb24gaXMgaW5pdGlhdGVkIGluIHtAbGluayBWaWV3VGFiQ29tcG9uZW50fS5cbiAqIC0gYGRyYWdzdGFydGAgYW5kIGBkcmFnZW5kYCBldmVudHMgYXJlIGZpcmVkIGluIHRoZSB0YWJiYXIgd2hlcmUgdGhlIGRyYWcgb3BlcmF0aW9uIHdhcyBpbml0aWF0ZWQuXG4gKiAtIGBkcmFnZW50ZXJgIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSB0YWIgZW50ZXJzIHRoZSB0YWJiYXIuXG4gKiAtIGBkcmFnb3ZlcmAgZXZlbnRzIGFyZSBmaXJlZCB3aGVuIGRyYWdnaW5nIGEgdGFiIG92ZXIgdGhlIHRhYmJhci5cbiAqIC0gYGRyYWdsZWF2ZWAgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIHRhYiBsZWF2ZXMgdGhlIHRhYmJhci5cbiAqIC0gYGRyb3BgIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHVzZXIgZHJvcHMgYSB0YWIgaW4gdGhlIHRhYmJhci5cbiAqIC0gTm90ZSB0aGF0IGBkcmFnbGVhdmVgIGV2ZW50IGlzIG5vdCBmaXJlZCBvbiBkcm9wIGFjdGlvbi4gVGhlcmVmb3JlLCBhbHdheXMgaGFuZGxlIGJvdGggZXZlbnRzLCBgZHJhZ2xlYXZlYCBhbmQgYGRyb3BgIGV2ZW50cywgcmVzcGVjdGl2ZWx5LlxuICpcbiAqICMjIFRlcm1pbm9sb2d5XG4gKiAtIERyYWcgc291cmNlOiBUYWIgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLlxuICogLSBEcm9wIHRhcmdldDogVGFiIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIGRyYWcgc291cmNlIG9uIGRyb3AsIG9yIGBlbmRgIGlmIGRyb3BwaW5nIGl0IGFmdGVyIHRoZSBsYXN0IHRhYi5cbiAqIC0gRHJhZyBpbWFnZTogIEltYWdlIGZvciB0aGUgdGFiIHRvIGJlIGRyYWdnZWQuIFdlIGRvIG5vdCB1c2UgdGhlIG5hdGl2ZSBkcmFnIGltYWdlIHN1cHBvcnQgdG8gY29udHJvbCBkcmFnIGltYWdlIHBvc2l0aW9uIGFuZCBzaXplLFxuICogICAgICAgICAgICAgICAgZS5nLiwgdG8gc25hcCB0aGUgZHJhZyBpbWFnZSB0byB0aGUgdGFiYmFyIHdoZW4gZHJhZ2dpbmcgbmVhciBpdC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2ItcGFydC1iYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFydC1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYXJ0LWJhci5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQXN5bmNQaXBlLFxuICAgIFNjaVZpZXdwb3J0Q29tcG9uZW50LFxuICAgIFZpZXdUYWJDb21wb25lbnQsXG4gICAgUGFydEFjdGlvbkJhckNvbXBvbmVudCxcbiAgICBWaWV3TGlzdEJ1dHRvbkNvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUGFydEJhckNvbXBvbmVudCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0Q2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdUYWJzID0gdmlld0NoaWxkcmVuKFZpZXdUYWJDb21wb25lbnQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnZW50ZXIkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZHJhZ2xlYXZlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdlbmQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGRyYWdvdmVyJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3cG9ydENvbXBvbmVudCA9IHZpZXdDaGlsZC5yZXF1aXJlZChTY2lWaWV3cG9ydENvbXBvbmVudCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0Q29tcG9uZW50RWxlbWVudCA9IHZpZXdDaGlsZC5yZXF1aXJlZChTY2lWaWV3cG9ydENvbXBvbmVudCwge3JlYWQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+fSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNvcm5lclJhZGl1c0VsZW1lbnQgPSB2aWV3Q2hpbGQucmVxdWlyZWQoJ3RhYl9jb3JuZXJfcmFkaXVzJywge3JlYWQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+fSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhZGRpbmdJbmxpbmVFbGVtZW50ID0gdmlld0NoaWxkLnJlcXVpcmVkKCdwYWRkaW5nX2lubGluZScsIHtyZWFkOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pn0pO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIHRhYiBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0IHRoZSBkcmFnIHNvdXJjZSBvbiBkcm9wLCBvciBgZW5kYCBpZiBkcm9wcGluZyBpdCBhZnRlciB0aGUgbGFzdCB0YWIuXG4gICAqL1xuICBwdWJsaWMgZHJvcFRhcmdldFZpZXdUYWI6IFZpZXdUYWJDb21wb25lbnQgfCAnZW5kJyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIHRhYiB3aGVyZSB0aGUgZHJhZyBvcGVyYXRpb24gd2FzIHN0YXJ0ZWQuXG4gICAqIFRoaXMgcmVmZXJlbmNlIGlzIG9ubHkgc2V0IGlmIHRoZSBkcmFnIG9wZXJhdGlvbiBzdGFydGVkIG9uIGEgdGFiIG9mIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgcHVibGljIGRyYWdTb3VyY2VWaWV3VGFiOiBWaWV3VGFiQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRyYW5zZmVyIGRhdGEgb2YgdGhlIHRhYiBiZWluZyBkcmFnZ2VkIG92ZXIgdGhpcyB0YWJiYXIuXG4gICAqL1xuICBwcml2YXRlIF9kcmFnRGF0YTogVmlld0RyYWdEYXRhIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGZvciBzbmFwcGluZyB0aGUgZHJhZyBpbWFnZSB0byB0aGUgdGFiYmFyIHdoZW4gZHJhZ2dpbmcgbmVhciBpdC5cbiAgICovXG4gIHByaXZhdGUgX2NvbnN0cmFpbkZuOiBDb25zdHJhaW5GbiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUYWJiYXIgaW5kZW50cyB3aGVyZSB0byBkaXNwbGF5IHRoZSByb3VuZGVkIGJvdHRvbSBjb3JuZXJzIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCB2aWV3IHRhYi5cbiAgICovXG4gIHByaXZhdGUgX3RhYmJhckluZGVudCA9IHtcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiAwLFxuICB9O1xuXG4gIC8qKlxuICAgKiBOb3RpZmllcyB3aGVuIHRoZSBkcmFnIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQsIGkuZS4sIHRhYnMgaGF2ZSB0cmFuc2l0aW9uZWQgdG8gdGhlaXIgZmluYWwgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIF9kcmFnQW5pbWF0aW9uU3RhYmxlJCA9IG9uRXZlcnlBbmltYXRpb25GcmFtZSQoKS5waXBlKGZpcnN0KCgpID0+IHRoaXMuaXNEcmFnQW5pbWF0aW9uU3RhYmxlKCkpKTtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgICAgICAgQEluamVjdChXT1JLQkVOQ0hfSUQpIHByaXZhdGUgX3dvcmtiZW5jaElkOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBwYXJ0OiDJtVdvcmtiZW5jaFBhcnQsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3dvcmtiZW5jaExheW91dFNlcnZpY2U6IFdvcmtiZW5jaExheW91dFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JvdXRlcjogybVXb3JrYmVuY2hSb3V0ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlcjogVmlld1RhYkRyYWdJbWFnZVJlbmRlcmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3RHJhZ1NlcnZpY2U6IFZpZXdEcmFnU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZGVzdHJveVJlZjogRGVzdHJveVJlZikge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5kcmFnb3ZlciQgPSB0aGlzLl92aWV3RHJhZ1NlcnZpY2UudGFiYmFyRHJhZ092ZXIkLnBpcGUobWFwKHBhcnRJZCA9PiBwYXJ0SWQgPT09IHRoaXMucGFydC5pZCkpO1xuICAgIHRoaXMuaW5zdGFsbEFjdGl2ZVZpZXdTY3JvbGxlcigpO1xuICAgIHRoaXMuaW5zdGFsbFNjcm9sbGVkSW50b1ZpZXdVcGRhdGVyKCk7XG4gICAgdGhpcy5pbnN0YWxsVmlld0RyYWdMaXN0ZW5lcigpO1xuICAgIHRoaXMuaW5zdGFsbFRhYmJhckluZGVudFNpemVUcmFja2VyKCk7XG4gICAgdGhpcy5pbnN0YWxsVmlld3BvcnRDaGFuZ2VUcmFja2VyKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkYmxjbGljaycsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbkRvdWJsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFydC5pc0luTWFpbkFyZWEpIHtcbiAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShsYXlvdXQgPT4gbGF5b3V0LnRvZ2dsZU1heGltaXplZCgpKS50aGVuKCk7XG4gICAgfVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpbnZva2VkIHdoZW4gdGhlIHVzZXIgc3RhcnRzIGRyYWdnaW5nIGEgdGFiIG9mIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ3N0YXJ0JywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uVmlld0RyYWdTdGFydChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3RHJhZ1NlcnZpY2UuaXNWaWV3RHJhZ0V2ZW50KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRyYWdEYXRhID0gdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnZpZXdEcmFnRGF0YSE7XG4gICAgY29uc3QgZHJhZ1NvdXJjZUluZGV4ID0gdGhpcy5fdmlld1RhYnMoKS5maW5kSW5kZXgodmlld1RhYiA9PiB2aWV3VGFiLnZpZXdJZCA9PT0gZHJhZ0RhdGEudmlld0lkKTtcbiAgICBjb25zdCBkcmFnU291cmNlVmlld1RhYiA9IHRoaXMuX3ZpZXdUYWJzKClbZHJhZ1NvdXJjZUluZGV4XTtcbiAgICBjb25zdCBkcm9wVGFyZ2V0Vmlld1RhYiA9IHRoaXMuX3ZpZXdUYWJzKClbZHJhZ1NvdXJjZUluZGV4ICsgMV0gPz8gJ2VuZCc7XG5cbiAgICAvLyBDb25zdHJhaW4gZnVuY3Rpb24gZm9yIHNuYXBwaW5nIHRoZSBkcmFnIGltYWdlIHRvIHRoZSB0YWJiYXIgd2hlbiBkcmFnZ2luZyBuZWFyIGl0LlxuICAgIHRoaXMuX2NvbnN0cmFpbkZuID0gdGhpcy5jcmVhdGVEcmFnSW1hZ2VDb25zdHJhaW5GbigpO1xuICAgIHRoaXMuX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlci5zZXRDb25zdHJhaW5EcmFnSW1hZ2VSZWN0Rm4odGhpcy5fY29uc3RyYWluRm4pO1xuICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS5zZXRUYWJiYXJEcmFnb3Zlcih0aGlzLnBhcnQuaWQpO1xuXG4gICAgLy8gV2hlbiBzdGFydCBkcmFnZ2luZyBhIHZpZXcgdGFiLCB3ZSByZW1vdmUgaXQgZnJvbSB0aGUgdGFiYmFyIGJ5IHNldHRpbmcgaXRzIGBkaXNwbGF5YCB0byBgbm9uZWAgYW5kIHJlbmRlciBpdHMgZHJhZyBpbWFnZSBpbiBgVmlld1RhYkRyYWdJbWFnZVJlbmRlcmVyYCBpbnN0ZWFkLlxuICAgIC8vIEhvd2V2ZXIsIGRvIG5vdCB1bnNldCB0aGUgYGRpc3BsYXlgIG9mIHRoZSBkcmFnIHNvdXJjZSBkdXJpbmcgYGRyYWdzdGFydGAuIE90aGVyd2lzZSwgdGhlIG5hdGl2ZSBkcmFnIG9wZXJhdGlvbiB3b3VsZCBiZSBjb3JydXB0ZWQgaW4gQ2hyb21lIGFuZCBFZGdlIChidXQgbm90IGluIEZpcmVmb3gpLlxuICAgIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHtcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZVZpZXdUYWIgPSBkcmFnU291cmNlVmlld1RhYjtcbiAgICAgIHRoaXMuZHJvcFRhcmdldFZpZXdUYWIgPSBkcm9wVGFyZ2V0Vmlld1RhYjsgLy8gU2V0IGRyb3AgdGFyZ2V0IHRvIGF2b2lkIHRhYiBhbmltYXRpb24uXG4gICAgICBzZXRDc3NWYXJpYWJsZSh0aGlzLl9ob3N0LCB7XG4gICAgICAgICctLcm1cGFydC1iYXItZHJhZy1zb3VyY2Utd2lkdGgnOiBgJHtkcmFnRGF0YS52aWV3VGFiV2lkdGh9cHhgLFxuICAgICAgICAnLS3JtXBhcnQtYmFyLWRyYWctaW1hZ2UtcGxhY2Vob2xkZXItd2lkdGgnOiBgJHtkcmFnRGF0YS52aWV3VGFiV2lkdGh9cHhgLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaGVuIGRyYWdnaW5nIGEgdGFiIHZlcnkgcXVpY2tseSBvdXQgb2YgdGhpcyB0YWJiYXIsIG9ubHkgdGhlIGBkcmFnc3RhcnRgIGV2ZW50IGdldHMgZmlyZWQsIGJ1dCBub3QgdGhlIGBkcmFnZW50ZXJgIGV2ZW50LlxuICAgIC8vIFRoZXJlZm9yZSwgd2Ugc3Vic2NyaWJlIHRvIGdsb2JhbCBgZHJhZ2VudGVyYCBldmVudHMgYW5kIG1hbnVhbGx5IGludm9rZSBgb25UYWJiYXJEcmFnTGVhdmVgIHRvIGNvcnJlY3RseSBkaXNwbGF5IHRoZSB0YWJzIGFuZCB0aGUgYWN0aXZlIHZpZXcuXG4gICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnZpZXdEcmFnJCh3aW5kb3csIHtldmVudFR5cGU6IFsnZHJhZ2VudGVyJ119KVxuICAgICAgLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuX2RyYWdlbmQkKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGNvbnRpbnVlcyBkcmFnZ2luZyBvdmVyIHRoaXMgdGFiYmFyLlxuICAgICAgICAvLyBJZiBub3QsIHRoZSB1c2VyIGhhcyBxdWlja2x5IGRyYWdnZWQgdGhlIHRhYiBvdXQgb2YgdGhlIHRhYmJhciBhbmQgd2UgIG1hbnVhbGx5IGNhbGwgYG9uVGFiYmFyRHJhZ0xlYXZlYC5cbiAgICAgICAgaWYgKCh0aGlzLl9ob3N0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMub25UYWJiYXJEcmFnTGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGludm9rZWQgd2hlbiB0aGUgdXNlciBlbmRzIGRyYWdnaW5nIGEgdGFiIG9mIHRoaXMgdGFiYmFyLlxuICAgKlxuICAgKiBJbnZva2VkIG9ubHkgaW4gdGhlIHRhYmJhciB3aGVyZSB0aGUgZHJhZyBvcGVyYXRpb24gc3RhcnRlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkcmFnIG9wZXJhdGlvbiB3YXMgY29tcGxldGVkIG9yIGNhbmNlbGVkLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2VuZCcpXG4gIHB1YmxpYyBvblZpZXdEcmFnRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuX2RyYWdlbmQkLm5leHQoKTtcbiAgICB0aGlzLnVuc2V0RHJhZ1N0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGludm9rZWQgd2hlbiB0aGUgdXNlciBkcmFncyBhIHRhYiBpbnRvIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgcHJpdmF0ZSBvblRhYmJhckRyYWdFbnRlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fZHJhZ2VudGVyJC5uZXh0KCk7XG4gICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnNldFRhYmJhckRyYWdvdmVyKHRoaXMucGFydC5pZCk7XG4gICAgdGhpcy5fZHJhZ0RhdGEgPSB0aGlzLl92aWV3RHJhZ1NlcnZpY2Uudmlld0RyYWdEYXRhITtcblxuICAgIC8vIENvbnN0cmFpbiBmdW5jdGlvbiBmb3Igc25hcHBpbmcgdGhlIGRyYWcgaW1hZ2UgdG8gdGhlIHRhYmJhciB3aGVuIGRyYWdnaW5nIG5lYXIgaXQuXG4gICAgaWYgKCF0aGlzLl9jb25zdHJhaW5Gbikge1xuICAgICAgdGhpcy5fY29uc3RyYWluRm4gPSB0aGlzLmNyZWF0ZURyYWdJbWFnZUNvbnN0cmFpbkZuKCk7XG4gICAgICB0aGlzLl92aWV3VGFiRHJhZ0ltYWdlUmVuZGVyZXIuc2V0Q29uc3RyYWluRHJhZ0ltYWdlUmVjdEZuKHRoaXMuX2NvbnN0cmFpbkZuKTtcbiAgICB9XG5cbiAgICAvLyBMb2NhdGUgZHJvcCB0YXJnZXQgdG8gaGF2ZSBhIG5pY2UgYW5pbWF0aW9uIGZvciB0aGUgZHJhZyBzb3VyY2UgcGxhY2Vob2xkZXIuXG4gICAgdGhpcy5kcm9wVGFyZ2V0Vmlld1RhYiA9IHRoaXMuY29tcHV0ZURyb3BUYXJnZXQoZXZlbnQpO1xuXG4gICAgLy8gU2V0IHRoZSBDU1MgY2xhc3MgJ2RyYWctZW50ZXInIHRvIGluZGljYXRlIGVudGVyaW5nIHRoZSB0YWJiYXIuXG4gICAgc2V0Q3NzQ2xhc3ModGhpcy5faG9zdCwgJ2RyYWctZW50ZXInLCAnZHJhZy1vdmVyJyk7XG4gICAgdGhpcy5fZHJhZ0FuaW1hdGlvblN0YWJsZSRcbiAgICAgIC5waXBlKHRha2UoMSksIHRha2VVbnRpbCh0aGlzLl9kcmFnZW50ZXIkKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7Y29tcGxldGU6ICgpID0+IHVuc2V0Q3NzQ2xhc3ModGhpcy5faG9zdCwgJ2RyYWctZW50ZXInKX0pO1xuXG4gICAgc2V0Q3NzVmFyaWFibGUodGhpcy5faG9zdCwge1xuICAgICAgJy0tybVwYXJ0LWJhci1kcmFnLXNvdXJjZS13aWR0aCc6IGAke3RoaXMuX2RyYWdEYXRhLnZpZXdUYWJXaWR0aH1weGAsXG4gICAgICAnLS3JtXBhcnQtYmFyLWRyYWctaW1hZ2UtcGxhY2Vob2xkZXItd2lkdGgnOiBgJHt0aGlzLl9kcmFnRGF0YS52aWV3VGFiV2lkdGh9cHhgLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpbnZva2VkIHdoZW4gdGhlIHVzZXIgZHJhZ3MgYSB0YWIgb3V0IG9mIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgcHJpdmF0ZSBvblRhYmJhckRyYWdMZWF2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kcmFnbGVhdmUkLm5leHQoKTtcblxuICAgIC8vIFNldCB0aGUgQ1NTIGNsYXNzICdkcmFnLWxlYXZlJyB0byBpbmRpY2F0ZSBsZWF2aW5nIHRoZSB0YWJiYXIuXG4gICAgc2V0Q3NzQ2xhc3ModGhpcy5faG9zdCwgJ2RyYWctbGVhdmUnKTtcbiAgICB0aGlzLl9kcmFnQW5pbWF0aW9uU3RhYmxlJFxuICAgICAgLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuX2RyYWdsZWF2ZSQpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtjb21wbGV0ZTogKCkgPT4gdW5zZXRDc3NDbGFzcyh0aGlzLl9ob3N0LCAnZHJhZy1sZWF2ZScpfSk7XG5cbiAgICB0aGlzLnVuc2V0RHJhZ1N0YXRlKHt1bnNldERyYWdTb3VyY2U6IGZhbHNlfSk7XG5cbiAgICAvLyBBY3RpdmF0ZSB0aGUgdmlldyBuZXh0IHRvIHRoZSB2aWV3IGJlaW5nIGRyYWdnZWQgb3V0IG9mIHRoaXMgdGFiYmFyLiBCdXQsIGRvIG5vdCBwdXNoIHRoZSBuYXZpZ2F0aW9uIGludG8gYnJvd3NpbmcgaGlzdG9yeSBzdGFjay5cbiAgICBpZiAodGhpcy5kcmFnU291cmNlVmlld1RhYiAmJiB0aGlzLmRyYWdTb3VyY2VWaWV3VGFiLmFjdGl2ZSkge1xuICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXQuYWN0aXZhdGVBZGphY2VudFZpZXcodGhpcy5kcmFnU291cmNlVmlld1RhYiEudmlld0lkKSwge3NraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZX0pLnRoZW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGludm9rZWQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcgYSB0YWIgb3ZlciB0aGlzIHRhYmJhci5cbiAgICovXG4gIHByaXZhdGUgb25UYWJiYXJEcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gYWxsb3cgdmlldyBkcm9wXG5cbiAgICAvLyBMb2NhdGUgdGhlIHRhYiBvdmVyIHdoaWNoIHRoZSB1c2VyIGlzIGRyYWdnaW5nIHRoZSB0YWIsIGJ1dCBvbmx5IGFmdGVyIHBlbmRpbmcgdHJhbnNpdGlvbnMgaGF2ZSBlbmRlZCB0byBwcmV2ZW50IHRhYnMgZnJvbSBzbGlkaW5nIGJhY2sgYW5kIGZvcnRoLlxuICAgIGlmICh0aGlzLmlzRHJhZ0FuaW1hdGlvblN0YWJsZSgpKSB7XG4gICAgICB0aGlzLmRyb3BUYXJnZXRWaWV3VGFiID0gdGhpcy5jb21wdXRlRHJvcFRhcmdldChldmVudCk7XG4gICAgICAvLyBTeW5jaHJvbml6ZSB0aGUgd2lkdGggb2YgdGhlIGRyYWcgc291cmNlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGRyYWcgcG9pbnRlciBwb3NpdGlvbiB0byBtb3ZlIGFjdGlvbnMgYWxvbmcgd2l0aCB0aGUgcG9pbnRlci5cbiAgICAgIHNldENzc1ZhcmlhYmxlKHRoaXMuX2hvc3QsIHsnLS3JtXBhcnQtYmFyLWRyYWctaW1hZ2UtcGxhY2Vob2xkZXItd2lkdGgnOiBgJHt0aGlzLmNhbGN1bGF0ZURyYWdJbWFnZVBsYWNlaG9sZGVyV2lkdGgoZXZlbnQpfXB4YH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGRyb3BzIGEgdGFiIGluIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgcHJpdmF0ZSBvblRhYmJhckRyb3AoKTogdm9pZCB7XG4gICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLmRpc3BhdGNoVmlld01vdmVFdmVudCh7XG4gICAgICBzb3VyY2U6IHtcbiAgICAgICAgd29ya2JlbmNoSWQ6IHRoaXMuX2RyYWdEYXRhIS53b3JrYmVuY2hJZCxcbiAgICAgICAgcGFydElkOiB0aGlzLl9kcmFnRGF0YSEucGFydElkLFxuICAgICAgICB2aWV3SWQ6IHRoaXMuX2RyYWdEYXRhIS52aWV3SWQsXG4gICAgICAgIGFsdGVybmF0aXZlVmlld0lkOiB0aGlzLl9kcmFnRGF0YSEuYWx0ZXJuYXRpdmVWaWV3SWQsXG4gICAgICAgIHZpZXdVcmxTZWdtZW50czogdGhpcy5fZHJhZ0RhdGEhLnZpZXdVcmxTZWdtZW50cyxcbiAgICAgICAgbmF2aWdhdGlvbkhpbnQ6IHRoaXMuX2RyYWdEYXRhIS5uYXZpZ2F0aW9uSGludCxcbiAgICAgICAgbmF2aWdhdGlvbkRhdGE6IHRoaXMuX2RyYWdEYXRhIS5uYXZpZ2F0aW9uRGF0YSxcbiAgICAgICAgY2xhc3NMaXN0OiB0aGlzLl9kcmFnRGF0YSEuY2xhc3NMaXN0LFxuICAgICAgfSxcbiAgICAgIHRhcmdldDoge1xuICAgICAgICB3b3JrYmVuY2hJZDogdGhpcy5fd29ya2JlbmNoSWQsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmRyb3BUYXJnZXRWaWV3VGFiID09PSAnZW5kJyA/ICdlbmQnIDogdGhpcy5fdmlld1RhYnMoKS5pbmRleE9mKHRoaXMuZHJvcFRhcmdldFZpZXdUYWIhKSxcbiAgICAgICAgZWxlbWVudElkOiB0aGlzLnBhcnQuaWQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCB1bmRvaW5nIHRoZSBkcmFnIHN0YXRlIHVudGlsIGZsdXNoZWQgdGFiIGNoYW5nZXMgdG8gdGhlIERPTSwgaS5lLiwgYWZ0ZXIgdGhlIGxheW91dCByb3V0aW5nIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICAvLyBJZiB3ZSB3ZXJlIHRvIHVuZG8gdGhlIGRyYWcgc3RhdGUgaW1tZWRpYXRlbHkgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgdGhlIGRyb3AgZXZlbnQsIHRoZSB0YWIgbGF5b3V0IHdvdWxkIHRlbXBvcmFyaWx5XG4gICAgLy8gcmV2ZXJ0IHRvIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIGRyYWcgb3BlcmF0aW9uLCByZXN1bHRpbmcgaW4gYW4gdWdseSBmbGlja2VyLlxuICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2Uub25MYXlvdXRDaGFuZ2UkKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMudW5zZXREcmFnU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NhdGVzIHRoZSB0YWIgYmVmb3JlIHdoaWNoIHRoZSBkcmFnZ2VkIHRhYiBpcyB0byBiZSBpbnNlcnRlZCB3aGVuIGl0IGlzIGRyb3BwZWQuIERyYWdnaW5nIGJleW9uZCB0aGUgbGFzdCB0YWIgcmV0dXJucyBgZW5kYC5cbiAgICovXG4gIHB1YmxpYyBjb21wdXRlRHJvcFRhcmdldChldmVudDogRHJhZ0V2ZW50KTogVmlld1RhYkNvbXBvbmVudCB8ICdlbmQnIHtcbiAgICBjb25zdCB2aWV3RHJhZ0ltYWdlUmVjdCA9IHRoaXMuX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlci5jYWxjdWxhdGVEcmFnSW1hZ2VSZWN0KHRoaXMuX2RyYWdEYXRhISwgZXZlbnQpO1xuICAgIGNvbnN0IHZpZXdUYWJzID0gdGhpcy5fdmlld1RhYnMoKS5maWx0ZXIodmlld1RhYiA9PiB2aWV3VGFiICE9PSB0aGlzLmRyYWdTb3VyY2VWaWV3VGFiKTtcblxuICAgIGZvciAoY29uc3Qgdmlld1RhYiBvZiB2aWV3VGFicykge1xuICAgICAgY29uc3Qgdmlld1RhYlJlY3QgPSB2aWV3VGFiLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB2aWV3VGFiTWlkZGxlID0gdmlld1RhYlJlY3QubGVmdCArICh2aWV3VGFiUmVjdC53aWR0aCAvIDIpO1xuICAgICAgaWYgKHZpZXdEcmFnSW1hZ2VSZWN0LmxlZnQgPCB2aWV3VGFiTWlkZGxlICYmICh2aWV3VGFiICE9PSB0aGlzLmRyb3BUYXJnZXRWaWV3VGFiIHx8IHZpZXdEcmFnSW1hZ2VSZWN0LnJpZ2h0IDwgdmlld1RhYk1pZGRsZSkpIHtcbiAgICAgICAgcmV0dXJuIHZpZXdUYWI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnZW5kJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBmdW5jdGlvbiBmb3Igc25hcHBpbmcgdGhlIGRyYWcgaW1hZ2UgdG8gdGhlIHRhYmJhciB3aGVuIGRyYWdnaW5nIG5lYXIgaXQuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURyYWdJbWFnZUNvbnN0cmFpbkZuKCk6IENvbnN0cmFpbkZuIHtcbiAgICBjb25zdCBob3N0TGVmdCA9IHRoaXMuX2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICBjb25zdCBtYXhWaWV3cG9ydFdpZHRoID0gdGhpcy5jYWxjdWxhdGVNYXhWaWV3cG9ydFdpZHRoKCk7XG4gICAgcmV0dXJuIChyZWN0OiBWaWV3RHJhZ0ltYWdlUmVjdCk6IFZpZXdEcmFnSW1hZ2VSZWN0ID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0Qm91bmRpbmdCb3ggPSB0aGlzLl92aWV3cG9ydENvbXBvbmVudEVsZW1lbnQoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIG5ldyBWaWV3RHJhZ0ltYWdlUmVjdCh7XG4gICAgICAgIHg6IE1hdGgubWluKE1hdGgubWF4KGhvc3RMZWZ0ICsgdGhpcy5fdGFiYmFySW5kZW50LmxlZnQsIHJlY3QueCksIGhvc3RMZWZ0ICsgbWF4Vmlld3BvcnRXaWR0aCAtIHJlY3Qud2lkdGggLSB0aGlzLl90YWJiYXJJbmRlbnQucmlnaHQpLFxuICAgICAgICB5OiB2aWV3cG9ydEJvdW5kaW5nQm94LnRvcCxcbiAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodDogdmlld3BvcnRCb3VuZGluZ0JveC5oZWlnaHQsIC8vIGZpdCBpbnRvIHRhYmJhciwgZS5nLiwgd2hlbiBkcmFnZ2luZyBhIHRhYiBpbnRvIGEgdGFiYmFyIG9mIGEgZGlmZmVyZW50IGhlaWdodFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSB0YWJiYXIgdmlld3BvcnQgYmVmb3JlIGFuIG92ZXJmbG93IHdvdWxkIG9jY3VyLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgZHJhZyBpbWFnZS5cbiAgICpcbiAgICogVG8gY2FsY3VsYXRlIHRoZSBlZmZlY3RpdmUgd2lkdGgsIHdlIG5lZWQgdG8gc2ltdWxhdGUgYW4gb3ZlcmZsb3cgaW4gdGhlIERPTS4gVGhlcmVmb3JlLCBjYWxsIHRoaXMgbWV0aG9kIG9ubHkgZnJvbSBgZHJhZ3N0YXJ0YCBhbmQgbm90XG4gICAqIGZyb20gYGRyYWdvdmVyYCBhbmQgZGlzYWJsZSBhbmltYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVNYXhWaWV3cG9ydFdpZHRoKCk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudFdpZHRoID0gdGhpcy5faG9zdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLcm1cGFydC1iYXItZHJhZy1pbWFnZS1wbGFjZWhvbGRlci13aWR0aCcpO1xuXG4gICAgLy8gRGlzYWJsZSBhbmltYXRpb25zIGR1cmluZyBjYWxjdWxhdGlvbiBhbmQgZm9yY2UgdGhlIHZpZXdwb3J0IHRvIG92ZXJmbG93LlxuICAgIHNldENzc0NsYXNzKHRoaXMuX2hvc3QsICdjYWxjdWxhdGluZy1tYXgtdmlld3BvcnQtd2lkdGgnKTtcbiAgICBzZXRDc3NWYXJpYWJsZSh0aGlzLl9ob3N0LCB7Jy0tybVwYXJ0LWJhci1kcmFnLWltYWdlLXBsYWNlaG9sZGVyLXdpZHRoJzogYCR7dGhpcy5faG9zdC5jbGllbnRXaWR0aH1weGB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q29tcG9uZW50RWxlbWVudCgpLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgc2V0Q3NzVmFyaWFibGUodGhpcy5faG9zdCwgeyctLcm1cGFydC1iYXItZHJhZy1pbWFnZS1wbGFjZWhvbGRlci13aWR0aCc6IGN1cnJlbnRXaWR0aCB8fCBudWxsfSk7XG4gICAgICB1bnNldENzc0NsYXNzKHRoaXMuX2hvc3QsICdjYWxjdWxhdGluZy1tYXgtdmlld3BvcnQtd2lkdGgnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgd2lkdGggZm9yIHRoZSBkcmFnIGltYWdlIHBsYWNlaG9sZGVyLlxuICAgKlxuICAgKiAtIFdoZW4gZHJhZ2dpbmcgb3ZlciB0YWJzLCB0aGUgd2lkdGggaXMgZXF1YWwgdG8gdGhlIHdpZHRoIG9mIHRoZSBkcmFnIHNvdXJjZS5cbiAgICogLSBXaGVuIGRyYWdnaW5nIHRvIHRoZSByaWdodCBvZiB0aGUgbGFzdCB0YWIsIHRoZSB3aWR0aCBvZiB0aGUgcGxhY2Vob2xkZXIgaXMgY2FsY3VsYXRlZCBhcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGVcbiAgICogICBsYXN0IHRhYiBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnb3ZlciBldmVudC4gQXBwbHlpbmcgdGhpcyB3aWR0aCB3aWxsIHJlc2l6ZSB0aGUgdmlld3BvcnQsIG1vdmluZyBwYXJ0IGFjdGlvbnMgYWxvbmdcbiAgICogICB3aXRoIHRoZSBkcmFnb3ZlciBldmVudC5cbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlRHJhZ0ltYWdlUGxhY2Vob2xkZXJXaWR0aChldmVudDogRHJhZ0V2ZW50KTogbnVtYmVyIHtcbiAgICBjb25zdCB2aWV3RHJhZ0ltYWdlUmVjdCA9IHRoaXMuX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlci5jYWxjdWxhdGVEcmFnSW1hZ2VSZWN0KHRoaXMuX2RyYWdEYXRhISwgZXZlbnQpO1xuICAgIGNvbnN0IGxhc3RWaWV3VGFiID0gdGhpcy5fdmlld1RhYnMoKS5maWx0ZXIodmlld1RhYiA9PiB2aWV3VGFiICE9PSB0aGlzLmRyYWdTb3VyY2VWaWV3VGFiKS5hdCgtMSk7XG4gICAgY29uc3QgbGFzdFZpZXdUYWJSaWdodCA9IGxhc3RWaWV3VGFiPy5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0ID8/IHRoaXMuX2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMuX3RhYmJhckluZGVudC5sZWZ0O1xuICAgIHJldHVybiBNYXRoLm1heChsYXN0Vmlld1RhYlJpZ2h0ICsgdmlld0RyYWdJbWFnZVJlY3Qud2lkdGgsIHZpZXdEcmFnSW1hZ2VSZWN0LnJpZ2h0KSAtIGxhc3RWaWV3VGFiUmlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgQ1NTIGFuaW1hdGlvbnMgaGF2ZSBmaW5pc2hlZCB3aGVuIGRyYWdnaW5nIGEgdGFiIG92ZXIgdGhlIHRhYmJhci5cbiAgICogVGhlIGFuaW1hdGlvbiBpcyBjb25zaWRlcmVkIHN0YWJsZSB3aGVuIGFsbCB0YWJzIGhhdmUgbW92ZWQgdG8gdGhlaXIgZmluYWwgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIGlzRHJhZ0FuaW1hdGlvblN0YWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZHJvcFRhcmdldFZpZXdUYWIpIHtcbiAgICAgIHJldHVybiB0aGlzLl92aWV3VGFicygpLmV2ZXJ5KHZpZXdUYWIgPT4gZ2V0Q3NzVHJhbnNsYXRpb24odmlld1RhYi5ob3N0KS50cmFuc2xhdGVYID09PSAnbm9uZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdUYWJzID0gdGhpcy5fdmlld1RhYnMoKS5maWx0ZXIodmlld1RhYiA9PiB2aWV3VGFiICE9PSB0aGlzLmRyYWdTb3VyY2VWaWV3VGFiKTtcbiAgICBjb25zdCBkcm9wVGFyZ2V0SW5kZXggPSB0aGlzLmRyb3BUYXJnZXRWaWV3VGFiID09PSAnZW5kJyA/IHZpZXdUYWJzLmxlbmd0aCA6IHZpZXdUYWJzLmluZGV4T2YodGhpcy5kcm9wVGFyZ2V0Vmlld1RhYiEpO1xuICAgIGNvbnN0IGRyYWdTb3VyY2VXaWR0aCA9IHRoaXMuX2RyYWdEYXRhIS52aWV3VGFiV2lkdGg7XG5cbiAgICByZXR1cm4gdmlld1RhYnMuZXZlcnkoKHZpZXdUYWIsIGkpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdUYWJUcmFuc2xhdGVYID0gZ2V0Q3NzVHJhbnNsYXRpb24odmlld1RhYi5ob3N0KS50cmFuc2xhdGVYO1xuICAgICAgLy8gRXhwZWN0IHRhYnMgcHJlY2VkaW5nIHRoZSBkcm9wIHRhcmdldCBub3QgdG8gYmUgc2hpZnRlZCB0byB0aGUgcmlnaHQuXG4gICAgICBpZiAoaSA8IGRyb3BUYXJnZXRJbmRleCAmJiB2aWV3VGFiVHJhbnNsYXRlWCAhPT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEV4cGVjdCBkcm9wIHRhcmdldCBhbmQgdGFicyBmb2xsb3dpbmcgdGhlIGRyb3AgdGFyZ2V0IHRvIGJlIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0LlxuICAgICAgaWYgKGkgPj0gZHJvcFRhcmdldEluZGV4ICYmIE1hdGguZmxvb3IoTnVtYmVyKHZpZXdUYWJUcmFuc2xhdGVYKSkgIT09IE1hdGguZmxvb3IoZHJhZ1NvdXJjZVdpZHRoKSkgeyAvLyBjb21wYXJlIGZsb29yZWQgbnVtYmVycyBiZWNhdXNlIGB0cmFuc2xhdGVYYCBpcyBub3QgcHJlY2lzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zZXREcmFnU3RhdGUob3B0aW9ucz86IHt1bnNldERyYWdTb3VyY2U/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy51bnNldERyYWdTb3VyY2UgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5kcmFnU291cmNlVmlld1RhYiA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kcm9wVGFyZ2V0Vmlld1RhYiA9IG51bGw7XG4gICAgdGhpcy5fZHJhZ0RhdGEgPSBudWxsO1xuICAgIHRoaXMuX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlci51bnNldENvbnN0cmFpbkRyYWdJbWFnZVJlY3RGbih0aGlzLl9jb25zdHJhaW5GbiEpO1xuICAgIHRoaXMuX2NvbnN0cmFpbkZuID0gbnVsbDtcblxuICAgIHVuc2V0Q3NzQ2xhc3ModGhpcy5faG9zdCwgJ2RyYWctb3ZlcicpO1xuICAgIHVuc2V0Q3NzVmFyaWFibGUodGhpcy5faG9zdCwgJy0tybVwYXJ0LWJhci1kcmFnLXNvdXJjZS13aWR0aCcsICctLcm1cGFydC1iYXItZHJhZy1pbWFnZS1wbGFjZWhvbGRlci13aWR0aCcpO1xuICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS51bnNldFRhYmJhckRyYWdvdmVyKHRoaXMucGFydC5pZCk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgdGFiIG9mIHRoZSBhY3RpdmUgdmlldyBpbnRvIHZpZXcuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxBY3RpdmVWaWV3U2Nyb2xsZXIoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0Q29tcG9uZW50ID0gdGhpcy5fdmlld3BvcnRDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGFjdGl2ZVZpZXdJZCA9IHRoaXMucGFydC5hY3RpdmVWaWV3SWQoKTtcblxuICAgICAgLy8gVGhlcmUgbWF5IGJlIG5vIGFjdGl2ZSB2aWV3IGluIHRoZSB0YWJiYXIsIGUuZy4sIHdoZW4gZHJhZ2dpbmcgdGhlIGxhc3QgdmlldyBvdXQgb2YgdGhlIHRhYmJhci5cbiAgICAgIGNvbnN0IGFjdGl2ZVZpZXdUYWIgPSB0aGlzLl92aWV3VGFicygpLmZpbmQodmlld1RhYiA9PiB2aWV3VGFiLnZpZXdJZCA9PT0gYWN0aXZlVmlld0lkKTtcbiAgICAgIGlmIChhY3RpdmVWaWV3VGFiICYmICF2aWV3cG9ydENvbXBvbmVudC5pc0VsZW1lbnRJblZpZXcoYWN0aXZlVmlld1RhYi5ob3N0LCAnZnVsbCcpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB2aWV3cG9ydENvbXBvbmVudC5zY3JvbGxJbnRvVmlldyhhY3RpdmVWaWV3VGFiLmhvc3QpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHtAbGluayDJtVdvcmtiZW5jaFZpZXd9IHdoZW4gaXRzIHRhYiBpcyBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxTY3JvbGxlZEludG9WaWV3VXBkYXRlcigpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3cG9ydENoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5fdmlld1RhYnMoKSksXG4gICAgICAgIGZpbHRlckFycmF5KHZpZXdUYWIgPT4gdmlld1RhYiAhPT0gdGhpcy5kcmFnU291cmNlVmlld1RhYiksIC8vIHNraXAgZHJhZyBzb3VyY2UgYXMgYWx3YXlzIHNjcm9sbGVkIG91dCBvZiB2aWV3XG4gICAgICAgIG1lcmdlTWFwKHZpZXdUYWJzID0+IGZyb20odmlld1RhYnMpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZpZXdUYWIgPT4ge1xuICAgICAgICB2aWV3VGFiLnZpZXcoKS5zY3JvbGxlZEludG9WaWV3ID0gdGhpcy5fdmlld3BvcnRDb21wb25lbnQoKS5pc0VsZW1lbnRJblZpZXcodmlld1RhYi5ob3N0LCAnZnVsbCcpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluc3RhbGxWaWV3RHJhZ0xpc3RlbmVyKCk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZyQodGhpcy5faG9zdClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAgICAgICAgdGhpcy5vblRhYmJhckRyYWdFbnRlcihldmVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgICAgICAgICB0aGlzLm9uVGFiYmFyRHJhZ092ZXIoZXZlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgICAgICAgIHRoaXMub25UYWJiYXJEcmFnTGVhdmUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgICAgICAgdGhpcy5vblRhYmJhckRyb3AoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbFZpZXdwb3J0Q2hhbmdlVHJhY2tlcigpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3cG9ydFNpemUgPSBkaW1lbnNpb24oY29tcHV0ZWQoKCkgPT4gdGhpcy5fdmlld3BvcnRDb21wb25lbnRFbGVtZW50KCkubmF0aXZlRWxlbWVudCkpO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2xpZW50U2l6ZSA9IGRpbWVuc2lvbihjb21wdXRlZCgoKSA9PiB0aGlzLl92aWV3cG9ydENvbXBvbmVudCgpLnZpZXdwb3J0Q2xpZW50RWxlbWVudCkpO1xuICAgIGNvbnN0IHpvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAgIC8vIERldGVjdCByZXNpemluZy5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gVHJhY2sgdmlld3BvcnQgYW5kIHZpZXdwb3J0IGNsaWVudCBzaXplcy5cbiAgICAgIHZpZXdwb3J0U2l6ZSgpO1xuICAgICAgdmlld3BvcnRDbGllbnRTaXplKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fdmlld3BvcnRDaGFuZ2UkLm5leHQoKSk7XG4gICAgfSk7XG5cbiAgICAvLyBEZXRlY3Qgc2Nyb2xsaW5nLlxuICAgIGVmZmVjdChvbkNsZWFudXAgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydENvbXBvbmVudCgpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGZyb21FdmVudCh2aWV3cG9ydCwgJ3Njcm9sbCcpXG4gICAgICAgICAgLnBpcGUoc3Vic2NyaWJlSW4oZm4gPT4gem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmbikpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fdmlld3BvcnRDaGFuZ2UkLm5leHQoKSk7XG4gICAgICAgIG9uQ2xlYW51cCgoKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbFRhYmJhckluZGVudFNpemVUcmFja2VyKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYkNvcm5lclJhZGl1c0RpbWVuc2lvbiA9IGRpbWVuc2lvbih0aGlzLl90YWJDb3JuZXJSYWRpdXNFbGVtZW50KTtcbiAgICBjb25zdCBwYWRkaW5nSW5saW5lRGltZW5zaW9uID0gZGltZW5zaW9uKHRoaXMuX3BhZGRpbmdJbmxpbmVFbGVtZW50KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpbmRlbnQgPSB0YWJDb3JuZXJSYWRpdXNEaW1lbnNpb24oKS5jbGllbnRXaWR0aCArIHBhZGRpbmdJbmxpbmVEaW1lbnNpb24oKS5jbGllbnRXaWR0aDtcbiAgICAgIHRoaXMuX3RhYmJhckluZGVudCA9IHtsZWZ0OiBpbmRlbnQsIHJpZ2h0OiBpbmRlbnR9O1xuICAgICAgc2V0Q3NzVmFyaWFibGUodGhpcy5faG9zdCwge1xuICAgICAgICAnLS3JtXBhcnQtYmFyLWluZGVudC1sZWZ0JzogYCR7dGhpcy5fdGFiYmFySW5kZW50LmxlZnR9cHhgLFxuICAgICAgICAnLS3JtXBhcnQtYmFyLWluZGVudC1yaWdodCc6IGAke3RoaXMuX3RhYmJhckluZGVudC5yaWdodH1weGAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPHNjaS12aWV3cG9ydCBjbGFzcz1cInRhYmJhclwiIHNjcm9sbGJhclN0eWxlPVwiaGlkZGVuXCIgW2NsYXNzLmRyYWdvdmVyXT1cImRyYWdvdmVyJCB8IGFzeW5jXCI+XG4gIEBmb3IgKHZpZXdJZCBvZiBwYXJ0LnZpZXdJZHMoKTsgdHJhY2sgdmlld0lkKSB7XG4gICAgQGlmICh2aWV3dGFiID09PSBkcm9wVGFyZ2V0Vmlld1RhYikge1xuICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICB9XG4gICAgPHdiLXZpZXctdGFiICN2aWV3dGFiXG4gICAgICAgICAgICAgICAgIFt2aWV3SWRdPVwidmlld0lkXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmRyYWctc291cmNlXT1cInZpZXd0YWIgPT09IGRyYWdTb3VyY2VWaWV3VGFiXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmRyb3AtdGFyZ2V0XT1cInZpZXd0YWIgPT09IGRyb3BUYXJnZXRWaWV3VGFiXCIvPlxuICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG4gIH1cblxuICA8IS0tIFBsYWNlaG9sZGVyIGVsZW1lbnQgdG8gZ3JvdyB0aGUgdmlld3BvcnQgdG8gZml0IHRoZSBkcmFnIGltYWdlLiAtLT5cbiAgPGRpdiBjbGFzcz1cImRyYWctaW1hZ2UtcGxhY2Vob2xkZXJcIj48L2Rpdj5cbjwvc2NpLXZpZXdwb3J0PlxuPHdiLXBhcnQtYWN0aW9uLWJhci8+XG48d2Itdmlldy1saXN0LWJ1dHRvbi8+XG5cbjwhLS0gRWxlbWVudCBmb3IgaW5qZWN0aW5nIHRoZSBjb3JuZXIgcmFkaXVzIGludG8gdGhlIGNvbXBvbmVudC4gLS0+XG48ZGl2IGNsYXNzPVwidGFiLWNvcm5lci1yYWRpdXNcIiAjdGFiX2Nvcm5lcl9yYWRpdXM+PC9kaXY+XG48IS0tIEVsZW1lbnQgZm9yIGluamVjdGluZyB0aGUgdGFiYmFyIHBhZGRpbmcgaW50byB0aGUgY29tcG9uZW50LiAtLT5cbjxkaXYgY2xhc3M9XCJwYWRkaW5nLWlubGluZVwiICNwYWRkaW5nX2lubGluZT48L2Rpdj5cbiJdfQ==
@@ -1,35 +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, Injector, Pipe } from '@angular/core';
11
- import { WORKBENCH_PART_REGISTRY } from './workbench-part.registry';
12
- import * as i0 from "@angular/core";
13
- /**
14
- * Constructs the portal for the given part in the calling injection context,
15
- * or throws an error if the part is not registered.
16
- */
17
- export class PartPortalPipe {
18
- constructor() {
19
- this._partRegistry = inject(WORKBENCH_PART_REGISTRY);
20
- this._injector = inject(Injector);
21
- }
22
- transform(partId) {
23
- if (!partId) {
24
- return null;
25
- }
26
- return this._partRegistry.get(partId).createPortalFromInjectionContext(this._injector);
27
- }
28
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartPortalPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
29
- static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.0.2", ngImport: i0, type: PartPortalPipe, isStandalone: true, name: "wbPartPortal" }); }
30
- }
31
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartPortalPipe, decorators: [{
32
- type: Pipe,
33
- args: [{ name: 'wbPartPortal', standalone: true }]
34
- }] });
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydC1wb3J0YWwucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3BhcnQvcGFydC1wb3J0YWwucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7O0FBS2xFOzs7R0FHRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBRDNCO1FBR21CLGtCQUFhLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDaEQsY0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQVMvQztJQVBRLFNBQVMsQ0FBQyxNQUFxQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6RixDQUFDOzhHQVhVLGNBQWM7NEdBQWQsY0FBYzs7MkZBQWQsY0FBYztrQkFEMUIsSUFBSTttQkFBQyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtpbmplY3QsIEluamVjdG9yLCBQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V09SS0JFTkNIX1BBUlRfUkVHSVNUUll9IGZyb20gJy4vd29ya2JlbmNoLXBhcnQucmVnaXN0cnknO1xuaW1wb3J0IHR5cGUge1BhcnRDb21wb25lbnR9IGZyb20gJy4vcGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUge01haW5BcmVhTGF5b3V0Q29tcG9uZW50fSBmcm9tICcuLi9sYXlvdXQvbWFpbi1hcmVhLWxheW91dC9tYWluLWFyZWEtbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQge0NvbXBvbmVudFBvcnRhbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5cbi8qKlxuICogQ29uc3RydWN0cyB0aGUgcG9ydGFsIGZvciB0aGUgZ2l2ZW4gcGFydCBpbiB0aGUgY2FsbGluZyBpbmplY3Rpb24gY29udGV4dCxcbiAqIG9yIHRocm93cyBhbiBlcnJvciBpZiB0aGUgcGFydCBpcyBub3QgcmVnaXN0ZXJlZC5cbiAqL1xuQFBpcGUoe25hbWU6ICd3YlBhcnRQb3J0YWwnLCBzdGFuZGFsb25lOiB0cnVlfSlcbmV4cG9ydCBjbGFzcyBQYXJ0UG9ydGFsUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcnRSZWdpc3RyeSA9IGluamVjdChXT1JLQkVOQ0hfUEFSVF9SRUdJU1RSWSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICBwdWJsaWMgdHJhbnNmb3JtKHBhcnRJZDogc3RyaW5nIHwgbnVsbCk6IENvbXBvbmVudFBvcnRhbDxQYXJ0Q29tcG9uZW50IHwgTWFpbkFyZWFMYXlvdXRDb21wb25lbnQ+IHwgbnVsbCB7XG4gICAgaWYgKCFwYXJ0SWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wYXJ0UmVnaXN0cnkuZ2V0KHBhcnRJZCkuY3JlYXRlUG9ydGFsRnJvbUluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IpO1xuICB9XG59XG4iXX0=