@trudb/tru-common-lib 0.0.725 → 0.0.728

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 (404) hide show
  1. package/{esm2020 → esm2022}/lib/assets/tru-icon-module.mjs +32 -32
  2. package/{esm2020 → esm2022}/lib/assets/tru-search-icon-module.mjs +36 -36
  3. package/{esm2020 → esm2022}/lib/base-classes/tru-component-config-base.mjs +3 -3
  4. package/{esm2020 → esm2022}/lib/base-classes/tru-control-component-config-base.mjs +3 -3
  5. package/{esm2020 → esm2022}/lib/base-classes/tru-edit-control-base.mjs +17 -17
  6. package/esm2022/lib/base-classes/tru-edit-control-config-base.mjs +6 -0
  7. package/{esm2020 → esm2022}/lib/base-classes/tru-edit-parent-control-config-base.mjs +3 -3
  8. package/{esm2020 → esm2022}/lib/base-classes/tru-edit-pkey-control-config-base.mjs +3 -3
  9. package/esm2022/lib/base-classes/tru-entity-base.mjs +14 -0
  10. package/esm2022/lib/base-classes/tru-list-control-config-base.mjs +6 -0
  11. package/{esm2020 → esm2022}/lib/base-classes/tru-property-config-base.mjs +14 -15
  12. package/{esm2020 → esm2022}/lib/base-classes/tru-search-config-base.mjs +3 -3
  13. package/esm2022/lib/base-classes/tru-search-control-base.mjs +45 -0
  14. package/esm2022/lib/base-classes/tru-search-control-config-base.mjs +5 -0
  15. package/esm2022/lib/base-classes/tru-search-control-range-base.mjs +45 -0
  16. package/esm2022/lib/base-classes/tru-table-config-base.mjs +12 -0
  17. package/{esm2020 → esm2022}/lib/base-views/detail/tru-detail-view-base-module.mjs +19 -19
  18. package/esm2022/lib/base-views/detail/tru-detail-view-base.mjs +83 -0
  19. package/esm2022/lib/base-views/search/services/tru-search-view-control-event-handler.mjs +25 -0
  20. package/esm2022/lib/base-views/search/services/tru-search-view-event-handler.mjs +25 -0
  21. package/{esm2020 → esm2022}/lib/base-views/search/tru-search-view-base-module.mjs +19 -19
  22. package/esm2022/lib/base-views/search/tru-search-view-base.mjs +68 -0
  23. package/{esm2020 → esm2022}/lib/base-views/search-result/tru-search-result-view-base-module.mjs +19 -19
  24. package/esm2022/lib/base-views/search-result/tru-search-result-view-base.mjs +54 -0
  25. package/{esm2020 → esm2022}/lib/classes/tru-choice.mjs +2 -2
  26. package/esm2022/lib/classes/tru-context-filter-choice.mjs +11 -0
  27. package/esm2022/lib/classes/tru-context-filter.mjs +16 -0
  28. package/esm2022/lib/classes/tru-data-change-parser.mjs +287 -0
  29. package/esm2022/lib/classes/tru-data-change.mjs +5 -0
  30. package/{esm2020 → esm2022}/lib/classes/tru-formula-eval.mjs +156 -156
  31. package/esm2022/lib/classes/tru-merge-data-set.mjs +11 -0
  32. package/esm2022/lib/classes/tru-merge-data.mjs +20 -0
  33. package/{esm2020 → esm2022}/lib/classes/tru-name-value.mjs +2 -2
  34. package/esm2022/lib/classes/tru-predicate.mjs +47 -0
  35. package/{esm2020 → esm2022}/lib/classes/tru-property-config-cloud-file.mjs +4 -4
  36. package/esm2022/lib/classes/tru-property-config-date.mjs +7 -0
  37. package/esm2022/lib/classes/tru-property-config-decimal.mjs +9 -0
  38. package/{esm2020 → esm2022}/lib/classes/tru-property-config-file.mjs +6 -8
  39. package/esm2022/lib/classes/tru-property-config-foreign-key.mjs +8 -0
  40. package/esm2022/lib/classes/tru-property-config-integer.mjs +7 -0
  41. package/esm2022/lib/classes/tru-property-config-password.mjs +6 -0
  42. package/esm2022/lib/classes/tru-property-config-percentage.mjs +7 -0
  43. package/esm2022/lib/classes/tru-property-config-scientific.mjs +7 -0
  44. package/{esm2020 → esm2022}/lib/classes/tru-property-config-text-choices.mjs +6 -8
  45. package/{esm2020 → esm2022}/lib/classes/tru-property-config-text.mjs +8 -10
  46. package/{esm2020 → esm2022}/lib/classes/tru-property-config-usa-address.mjs +6 -8
  47. package/{esm2020 → esm2022}/lib/classes/tru-property-config-zip-code.mjs +6 -8
  48. package/esm2022/lib/classes/tru-query-predicate-manager.mjs +49 -0
  49. package/{esm2020 → esm2022}/lib/components/confirm-dialog/tru-confirm-dialog-module.mjs +20 -20
  50. package/esm2022/lib/components/confirm-dialog/tru-confirm-dialog.mjs +59 -0
  51. package/{esm2020 → esm2022}/lib/components/data-grid/classes/tru-data-grid-config.mjs +1 -1
  52. package/{esm2020 → esm2022}/lib/components/data-grid/enums/tru-data-grid-types.mjs +6 -6
  53. package/esm2022/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.mjs +40 -0
  54. package/esm2022/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.mjs +27 -0
  55. package/esm2022/lib/components/data-grid/tru-data-grid-module.mjs +67 -0
  56. package/esm2022/lib/components/data-grid/tru-data-grid.mjs +382 -0
  57. package/{esm2020 → esm2022}/lib/components/desktop/classes/tru-desktop-title.mjs +2 -2
  58. package/esm2022/lib/components/desktop/classes/tru-desktop-view-config.mjs +21 -0
  59. package/{esm2020 → esm2022}/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.mjs +19 -19
  60. package/esm2022/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +122 -0
  61. package/{esm2020 → esm2022}/lib/components/desktop/menubar/tru-desktop-menubar-module.mjs +56 -56
  62. package/esm2022/lib/components/desktop/menubar/tru-desktop-menubar.mjs +36 -0
  63. package/esm2022/lib/components/desktop/services/tru-desktop-manager.mjs +86 -0
  64. package/esm2022/lib/components/desktop/services/tru-desktop-service.mjs +108 -0
  65. package/esm2022/lib/components/desktop/services/tru-window-action-event-handler.mjs +25 -0
  66. package/esm2022/lib/components/desktop/services/tru-window-event-args.mjs +24 -0
  67. package/esm2022/lib/components/desktop/services/tru-window-event-handler.mjs +42 -0
  68. package/{esm2020 → esm2022}/lib/components/desktop/statusbar/tru-desktop-statusbar-module.mjs +19 -19
  69. package/esm2022/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +20 -0
  70. package/{esm2020 → esm2022}/lib/components/desktop/taskbar/tru-desktop-taskbar-module.mjs +21 -21
  71. package/esm2022/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +41 -0
  72. package/{esm2020 → esm2022}/lib/components/desktop/tru-desktop-module.mjs +72 -72
  73. package/esm2022/lib/components/desktop/tru-desktop.mjs +737 -0
  74. package/{esm2020 → esm2022}/lib/components/desktop/view/tru-desktop-view-module.mjs +19 -19
  75. package/esm2022/lib/components/desktop/view/tru-desktop-view.mjs +29 -0
  76. package/{esm2020 → esm2022}/lib/components/desktop/viewport/tru-desktop-viewport-module.mjs +20 -20
  77. package/esm2022/lib/components/desktop/viewport/tru-desktop-viewport.mjs +117 -0
  78. package/{esm2020 → esm2022}/lib/components/desktop/window/tru-desktop-window-module.mjs +58 -58
  79. package/esm2022/lib/components/desktop/window/tru-desktop-window.mjs +467 -0
  80. package/{esm2020 → esm2022}/lib/components/export-dialog/tru-export-dialog-module.mjs +20 -20
  81. package/esm2022/lib/components/export-dialog/tru-export-dialog.mjs +61 -0
  82. package/{esm2020 → esm2022}/lib/components/layout/column/tru-column-module.mjs +19 -19
  83. package/{esm2020 → esm2022}/lib/components/layout/column/tru-column.mjs +12 -12
  84. package/{esm2020 → esm2022}/lib/components/layout/form/tru-form-module.mjs +19 -19
  85. package/esm2022/lib/components/layout/form/tru-form.mjs +35 -0
  86. package/{esm2020 → esm2022}/lib/components/layout/group-box/tru-group-box-module.mjs +19 -19
  87. package/{esm2020 → esm2022}/lib/components/layout/group-box/tru-group-box.mjs +12 -12
  88. package/{esm2020 → esm2022}/lib/components/layout/row/tru-row-module.mjs +19 -19
  89. package/{esm2020 → esm2022}/lib/components/layout/row/tru-row.mjs +12 -12
  90. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-config.mjs +7 -7
  91. package/esm2022/lib/components/login/classes/tru-auth-jwt-strategy.mjs +63 -0
  92. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-login-request.mjs +5 -3
  93. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-logout-request.mjs +4 -3
  94. package/esm2022/lib/components/login/classes/tru-auth-session-strategy.mjs +21 -0
  95. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-strategy-provider.mjs +19 -19
  96. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-token.mjs +11 -8
  97. package/{esm2020 → esm2022}/lib/components/login/classes/tru-auth-user-request.mjs +4 -3
  98. package/esm2022/lib/components/login/services/tru-auth-cache.mjs +20 -0
  99. package/esm2022/lib/components/login/services/tru-auth-interceptor.mjs +46 -0
  100. package/esm2022/lib/components/login/services/tru-auth.mjs +87 -0
  101. package/esm2022/lib/components/login/tru-login-module.mjs +46 -0
  102. package/esm2022/lib/components/login/tru-login.mjs +59 -0
  103. package/{esm2020 → esm2022}/lib/components/password-dialog/tru-password-dialog-module.mjs +20 -20
  104. package/esm2022/lib/components/password-dialog/tru-password-dialog.mjs +53 -0
  105. package/{esm2020 → esm2022}/lib/components/toolbar/button/tru-toolbar-button-module.mjs +32 -32
  106. package/esm2022/lib/components/toolbar/button/tru-toolbar-button.mjs +40 -0
  107. package/{esm2020 → esm2022}/lib/components/toolbar/classes/tru-toolbar-dropdown-option.mjs +1 -1
  108. package/{esm2020 → esm2022}/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.mjs +44 -44
  109. package/esm2022/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +26 -0
  110. package/{esm2020 → esm2022}/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.mjs +36 -36
  111. package/esm2022/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +45 -0
  112. package/{esm2020 → esm2022}/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.mjs +19 -19
  113. package/esm2022/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +17 -0
  114. package/{esm2020 → esm2022}/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.mjs +19 -19
  115. package/esm2022/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +26 -0
  116. package/{esm2020 → esm2022}/lib/components/toolbar/menu/tru-toolbar-menu-module.mjs +32 -32
  117. package/esm2022/lib/components/toolbar/menu/tru-toolbar-menu.mjs +33 -0
  118. package/{esm2020 → esm2022}/lib/components/toolbar/separator/tru-toolbar-separator-module.mjs +19 -19
  119. package/{esm2020 → esm2022}/lib/components/toolbar/separator/tru-toolbar-separator.mjs +12 -12
  120. package/{esm2020 → esm2022}/lib/components/toolbar/text/tru-toolbar-text-module.mjs +32 -32
  121. package/esm2022/lib/components/toolbar/text/tru-toolbar-text.mjs +27 -0
  122. package/{esm2020 → esm2022}/lib/components/toolbar/tru-toolbar-module.mjs +73 -73
  123. package/{esm2020 → esm2022}/lib/components/toolbar/tru-toolbar.mjs +20 -21
  124. package/{esm2020 → esm2022}/lib/components/toolbar/user-profile/tru-toolbar-user-profile-module.mjs +36 -36
  125. package/esm2022/lib/components/toolbar/user-profile/tru-toolbar-user-profile.mjs +38 -0
  126. package/esm2022/lib/components/validation-dialog/tru-validation-dialog-config.mjs +25 -0
  127. package/{esm2020 → esm2022}/lib/components/validation-dialog/tru-validation-dialog-module.mjs +19 -19
  128. package/esm2022/lib/components/validation-dialog/tru-validation-dialog.mjs +83 -0
  129. package/{esm2020 → esm2022}/lib/directives/breeze-validator/tru-breeze-validator-module.mjs +19 -19
  130. package/esm2022/lib/directives/breeze-validator/tru-breeze-validator.mjs +107 -0
  131. package/{esm2020 → esm2022}/lib/directives/search-panel-position-manager/tru-search-panel-position-manager-module.mjs +19 -19
  132. package/esm2022/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.mjs +155 -0
  133. package/{esm2020 → esm2022}/lib/directives/select-panel/tru-mat-select-panel-module.mjs +19 -19
  134. package/esm2022/lib/directives/select-panel/tru-mat-select-panel.mjs +69 -0
  135. package/{esm2020 → esm2022}/lib/interfaces/tru-value.mjs +1 -1
  136. package/{esm2020 → esm2022}/lib/material.module.mjs +192 -192
  137. package/esm2022/lib/services/tru-app-environment.mjs +113 -0
  138. package/esm2022/lib/services/tru-breeze-context-factory.mjs +84 -0
  139. package/esm2022/lib/services/tru-breeze-metadata-provider.mjs +21 -0
  140. package/esm2022/lib/services/tru-component-lookup.mjs +23 -0
  141. package/esm2022/lib/services/tru-connection-hub.mjs +52 -0
  142. package/esm2022/lib/services/tru-context-filters.mjs +28 -0
  143. package/esm2022/lib/services/tru-data-context.mjs +263 -0
  144. package/esm2022/lib/services/tru-entity-accessor.mjs +292 -0
  145. package/esm2022/lib/services/tru-model-property-lookup.mjs +21 -0
  146. package/{esm2020 → esm2022}/lib/services/tru-predicate-map.mjs +11 -11
  147. package/esm2022/lib/services/tru-search-result-view-manager.mjs +18 -0
  148. package/esm2022/lib/services/tru-sort.mjs +113 -0
  149. package/esm2022/lib/services/tru-table-registry.mjs +15 -0
  150. package/esm2022/lib/services/tru-text-manager.mjs +148 -0
  151. package/esm2022/lib/services/tru-ui-notification.mjs +107 -0
  152. package/esm2022/lib/services/tru-user.mjs +62 -0
  153. package/esm2022/lib/services/tru-util.mjs +76 -0
  154. package/{esm2020 → esm2022}/lib/tru-common-module.mjs +16 -16
  155. package/{esm2020 → esm2022}/public-api.mjs +144 -144
  156. package/{esm2020 → esm2022}/trudb-tru-common-lib.mjs +4 -4
  157. package/fesm2022/trudb-tru-common-lib.mjs +6932 -0
  158. package/fesm2022/trudb-tru-common-lib.mjs.map +1 -0
  159. package/index.d.ts +5 -5
  160. package/lib/assets/tru-icon-module.d.ts +11 -11
  161. package/lib/assets/tru-search-icon-module.d.ts +11 -11
  162. package/lib/base-classes/tru-component-config-base.d.ts +3 -3
  163. package/lib/base-classes/tru-control-component-config-base.d.ts +20 -20
  164. package/lib/base-classes/tru-edit-control-base.d.ts +10 -10
  165. package/lib/base-classes/tru-edit-control-config-base.d.ts +21 -21
  166. package/lib/base-classes/tru-edit-parent-control-config-base.d.ts +9 -9
  167. package/lib/base-classes/tru-edit-pkey-control-config-base.d.ts +11 -11
  168. package/lib/base-classes/tru-entity-base.d.ts +14 -14
  169. package/lib/base-classes/tru-list-control-config-base.d.ts +21 -21
  170. package/lib/base-classes/tru-property-config-base.d.ts +13 -13
  171. package/lib/base-classes/tru-search-config-base.d.ts +9 -9
  172. package/lib/base-classes/tru-search-control-base.d.ts +21 -21
  173. package/lib/base-classes/tru-search-control-config-base.d.ts +13 -13
  174. package/lib/base-classes/tru-search-control-range-base.d.ts +25 -25
  175. package/lib/base-classes/tru-table-config-base.d.ts +11 -11
  176. package/lib/base-views/detail/tru-detail-view-base-module.d.ts +9 -9
  177. package/lib/base-views/detail/tru-detail-view-base.d.ts +32 -32
  178. package/lib/base-views/search/services/tru-search-view-control-event-handler.d.ts +12 -12
  179. package/lib/base-views/search/services/tru-search-view-event-handler.d.ts +11 -11
  180. package/lib/base-views/search/tru-search-view-base-module.d.ts +9 -9
  181. package/lib/base-views/search/tru-search-view-base.d.ts +36 -36
  182. package/lib/base-views/search-result/tru-search-result-view-base-module.d.ts +9 -9
  183. package/lib/base-views/search-result/tru-search-result-view-base.d.ts +25 -25
  184. package/lib/classes/tru-choice.d.ts +8 -8
  185. package/lib/classes/tru-context-filter-choice.d.ts +6 -6
  186. package/lib/classes/tru-context-filter.d.ts +10 -10
  187. package/lib/classes/tru-data-change-parser.d.ts +33 -33
  188. package/lib/classes/tru-data-change.d.ts +4 -4
  189. package/lib/classes/tru-formula-eval.d.ts +31 -31
  190. package/lib/classes/tru-merge-data-set.d.ts +7 -7
  191. package/lib/classes/tru-merge-data.d.ts +9 -9
  192. package/lib/classes/tru-name-value.d.ts +9 -9
  193. package/lib/classes/tru-predicate.d.ts +8 -8
  194. package/lib/classes/tru-property-config-cloud-file.d.ts +4 -4
  195. package/lib/classes/tru-property-config-date.d.ts +6 -6
  196. package/lib/classes/tru-property-config-decimal.d.ts +8 -8
  197. package/lib/classes/tru-property-config-file.d.ts +5 -5
  198. package/lib/classes/tru-property-config-foreign-key.d.ts +7 -7
  199. package/lib/classes/tru-property-config-integer.d.ts +6 -6
  200. package/lib/classes/tru-property-config-password.d.ts +5 -5
  201. package/lib/classes/tru-property-config-percentage.d.ts +6 -6
  202. package/lib/classes/tru-property-config-scientific.d.ts +6 -6
  203. package/lib/classes/tru-property-config-text-choices.d.ts +5 -5
  204. package/lib/classes/tru-property-config-text.d.ts +7 -7
  205. package/lib/classes/tru-property-config-usa-address.d.ts +5 -5
  206. package/lib/classes/tru-property-config-zip-code.d.ts +5 -5
  207. package/lib/classes/tru-query-predicate-manager.d.ts +26 -26
  208. package/lib/components/confirm-dialog/tru-confirm-dialog-module.d.ts +10 -10
  209. package/lib/components/confirm-dialog/tru-confirm-dialog.d.ts +28 -28
  210. package/lib/components/data-grid/classes/tru-data-grid-config.d.ts +7 -7
  211. package/lib/components/data-grid/enums/tru-data-grid-types.d.ts +5 -5
  212. package/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.d.ts +13 -13
  213. package/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.d.ts +13 -13
  214. package/lib/components/data-grid/tru-data-grid-module.d.ts +15 -15
  215. package/lib/components/data-grid/tru-data-grid.d.ts +67 -67
  216. package/lib/components/desktop/classes/tru-desktop-title.d.ts +4 -4
  217. package/lib/components/desktop/classes/tru-desktop-view-config.d.ts +16 -16
  218. package/lib/components/desktop/directives/resizable/tru-desktop-resizable-module.d.ts +9 -9
  219. package/lib/components/desktop/directives/resizable/tru-desktop-resizable.d.ts +32 -32
  220. package/lib/components/desktop/menubar/tru-desktop-menubar-module.d.ts +17 -17
  221. package/lib/components/desktop/menubar/tru-desktop-menubar.d.ts +15 -15
  222. package/lib/components/desktop/services/tru-desktop-manager.d.ts +33 -33
  223. package/lib/components/desktop/services/tru-desktop-service.d.ts +95 -95
  224. package/lib/components/desktop/services/tru-window-action-event-handler.d.ts +12 -12
  225. package/lib/components/desktop/services/tru-window-event-args.d.ts +17 -17
  226. package/lib/components/desktop/services/tru-window-event-handler.d.ts +20 -20
  227. package/lib/components/desktop/statusbar/tru-desktop-statusbar-module.d.ts +9 -9
  228. package/lib/components/desktop/statusbar/tru-desktop-statusbar.d.ts +10 -10
  229. package/lib/components/desktop/taskbar/tru-desktop-taskbar-module.d.ts +11 -11
  230. package/lib/components/desktop/taskbar/tru-desktop-taskbar.d.ts +15 -15
  231. package/lib/components/desktop/tru-desktop-module.d.ts +20 -20
  232. package/lib/components/desktop/tru-desktop.d.ts +337 -337
  233. package/lib/components/desktop/view/tru-desktop-view-module.d.ts +9 -9
  234. package/lib/components/desktop/view/tru-desktop-view.d.ts +14 -14
  235. package/lib/components/desktop/viewport/tru-desktop-viewport-module.d.ts +10 -10
  236. package/lib/components/desktop/viewport/tru-desktop-viewport.d.ts +48 -48
  237. package/lib/components/desktop/window/tru-desktop-window-module.d.ts +17 -17
  238. package/lib/components/desktop/window/tru-desktop-window.d.ts +189 -189
  239. package/lib/components/export-dialog/tru-export-dialog-module.d.ts +10 -10
  240. package/lib/components/export-dialog/tru-export-dialog.d.ts +26 -26
  241. package/lib/components/layout/column/tru-column-module.d.ts +9 -9
  242. package/lib/components/layout/column/tru-column.d.ts +6 -6
  243. package/lib/components/layout/form/tru-form-module.d.ts +9 -9
  244. package/lib/components/layout/form/tru-form.d.ts +10 -10
  245. package/lib/components/layout/group-box/tru-group-box-module.d.ts +9 -9
  246. package/lib/components/layout/group-box/tru-group-box.d.ts +6 -6
  247. package/lib/components/layout/row/tru-row-module.d.ts +9 -9
  248. package/lib/components/layout/row/tru-row.d.ts +6 -6
  249. package/lib/components/login/classes/tru-auth-config.d.ts +16 -16
  250. package/lib/components/login/classes/tru-auth-jwt-strategy.d.ts +15 -15
  251. package/lib/components/login/classes/tru-auth-login-request.d.ts +4 -4
  252. package/lib/components/login/classes/tru-auth-logout-request.d.ts +3 -3
  253. package/lib/components/login/classes/tru-auth-session-strategy.d.ts +13 -13
  254. package/lib/components/login/classes/tru-auth-strategy-provider.d.ts +9 -9
  255. package/lib/components/login/classes/tru-auth-token.d.ts +6 -6
  256. package/lib/components/login/classes/tru-auth-user-request.d.ts +3 -3
  257. package/lib/components/login/services/tru-auth-cache.d.ts +11 -11
  258. package/lib/components/login/services/tru-auth-interceptor.d.ts +16 -16
  259. package/lib/components/login/services/tru-auth.d.ts +29 -29
  260. package/lib/components/login/tru-login-module.d.ts +11 -11
  261. package/lib/components/login/tru-login.d.ts +21 -21
  262. package/lib/components/password-dialog/tru-password-dialog-module.d.ts +10 -10
  263. package/lib/components/password-dialog/tru-password-dialog.d.ts +24 -23
  264. package/lib/components/toolbar/button/tru-toolbar-button-module.d.ts +11 -11
  265. package/lib/components/toolbar/button/tru-toolbar-button.d.ts +16 -16
  266. package/lib/components/toolbar/classes/tru-toolbar-dropdown-option.d.ts +4 -4
  267. package/lib/components/toolbar/context-filter/tru-toolbar-context-filter-module.d.ts +14 -14
  268. package/lib/components/toolbar/context-filter/tru-toolbar-context-filter.d.ts +13 -13
  269. package/lib/components/toolbar/dropdown/tru-toolbar-dropdown-module.d.ts +12 -12
  270. package/lib/components/toolbar/dropdown/tru-toolbar-dropdown.d.ts +18 -18
  271. package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button-module.d.ts +9 -9
  272. package/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.d.ts +7 -7
  273. package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item-module.d.ts +9 -9
  274. package/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.d.ts +8 -8
  275. package/lib/components/toolbar/menu/tru-toolbar-menu-module.d.ts +11 -11
  276. package/lib/components/toolbar/menu/tru-toolbar-menu.d.ts +10 -10
  277. package/lib/components/toolbar/separator/tru-toolbar-separator-module.d.ts +9 -9
  278. package/lib/components/toolbar/separator/tru-toolbar-separator.d.ts +6 -6
  279. package/lib/components/toolbar/text/tru-toolbar-text-module.d.ts +11 -11
  280. package/lib/components/toolbar/text/tru-toolbar-text.d.ts +12 -12
  281. package/lib/components/toolbar/tru-toolbar-module.d.ts +16 -16
  282. package/lib/components/toolbar/tru-toolbar.d.ts +9 -9
  283. package/lib/components/toolbar/user-profile/tru-toolbar-user-profile-module.d.ts +12 -12
  284. package/lib/components/toolbar/user-profile/tru-toolbar-user-profile.d.ts +17 -17
  285. package/lib/components/validation-dialog/tru-validation-dialog-config.d.ts +13 -13
  286. package/lib/components/validation-dialog/tru-validation-dialog-module.d.ts +9 -9
  287. package/lib/components/validation-dialog/tru-validation-dialog.d.ts +20 -20
  288. package/lib/directives/breeze-validator/tru-breeze-validator-module.d.ts +9 -9
  289. package/lib/directives/breeze-validator/tru-breeze-validator.d.ts +27 -27
  290. package/lib/directives/search-panel-position-manager/tru-search-panel-position-manager-module.d.ts +9 -9
  291. package/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.d.ts +40 -40
  292. package/lib/directives/select-panel/tru-mat-select-panel-module.d.ts +9 -9
  293. package/lib/directives/select-panel/tru-mat-select-panel.d.ts +17 -17
  294. package/lib/interfaces/tru-value.d.ts +6 -6
  295. package/lib/material.module.d.ts +50 -50
  296. package/lib/services/tru-app-environment.d.ts +57 -57
  297. package/lib/services/tru-breeze-context-factory.d.ts +32 -32
  298. package/lib/services/tru-breeze-metadata-provider.d.ts +9 -9
  299. package/lib/services/tru-component-lookup.d.ts +9 -9
  300. package/lib/services/tru-connection-hub.d.ts +18 -18
  301. package/lib/services/tru-context-filters.d.ts +10 -10
  302. package/lib/services/tru-data-context.d.ts +42 -42
  303. package/lib/services/tru-entity-accessor.d.ts +46 -46
  304. package/lib/services/tru-model-property-lookup.d.ts +10 -10
  305. package/lib/services/tru-predicate-map.d.ts +6 -6
  306. package/lib/services/tru-search-result-view-manager.d.ts +10 -10
  307. package/lib/services/tru-sort.d.ts +56 -56
  308. package/lib/services/tru-table-registry.d.ts +8 -8
  309. package/lib/services/tru-text-manager.d.ts +68 -68
  310. package/lib/services/tru-ui-notification.d.ts +36 -36
  311. package/lib/services/tru-user.d.ts +29 -29
  312. package/lib/services/tru-util.d.ts +14 -14
  313. package/lib/tru-common-module.d.ts +6 -6
  314. package/package.json +5 -11
  315. package/public-api.d.ts +117 -117
  316. package/esm2020/lib/base-classes/tru-edit-control-config-base.mjs +0 -4
  317. package/esm2020/lib/base-classes/tru-entity-base.mjs +0 -13
  318. package/esm2020/lib/base-classes/tru-list-control-config-base.mjs +0 -4
  319. package/esm2020/lib/base-classes/tru-search-control-base.mjs +0 -47
  320. package/esm2020/lib/base-classes/tru-search-control-config-base.mjs +0 -4
  321. package/esm2020/lib/base-classes/tru-search-control-range-base.mjs +0 -47
  322. package/esm2020/lib/base-classes/tru-table-config-base.mjs +0 -13
  323. package/esm2020/lib/base-views/detail/tru-detail-view-base.mjs +0 -76
  324. package/esm2020/lib/base-views/search/services/tru-search-view-control-event-handler.mjs +0 -27
  325. package/esm2020/lib/base-views/search/services/tru-search-view-event-handler.mjs +0 -27
  326. package/esm2020/lib/base-views/search/tru-search-view-base.mjs +0 -63
  327. package/esm2020/lib/base-views/search-result/tru-search-result-view-base.mjs +0 -51
  328. package/esm2020/lib/classes/tru-context-filter-choice.mjs +0 -8
  329. package/esm2020/lib/classes/tru-context-filter.mjs +0 -16
  330. package/esm2020/lib/classes/tru-data-change-parser.mjs +0 -277
  331. package/esm2020/lib/classes/tru-data-change.mjs +0 -7
  332. package/esm2020/lib/classes/tru-merge-data-set.mjs +0 -12
  333. package/esm2020/lib/classes/tru-merge-data.mjs +0 -17
  334. package/esm2020/lib/classes/tru-predicate.mjs +0 -47
  335. package/esm2020/lib/classes/tru-property-config-date.mjs +0 -9
  336. package/esm2020/lib/classes/tru-property-config-decimal.mjs +0 -11
  337. package/esm2020/lib/classes/tru-property-config-foreign-key.mjs +0 -10
  338. package/esm2020/lib/classes/tru-property-config-integer.mjs +0 -9
  339. package/esm2020/lib/classes/tru-property-config-password.mjs +0 -8
  340. package/esm2020/lib/classes/tru-property-config-percentage.mjs +0 -9
  341. package/esm2020/lib/classes/tru-property-config-scientific.mjs +0 -9
  342. package/esm2020/lib/classes/tru-query-predicate-manager.mjs +0 -49
  343. package/esm2020/lib/components/confirm-dialog/tru-confirm-dialog.mjs +0 -45
  344. package/esm2020/lib/components/data-grid/overlays/tru-data-grid-loading-overlay/tru-data-grid-loading-overlay.mjs +0 -39
  345. package/esm2020/lib/components/data-grid/overlays/tru-data-grid-no-rows-overlay/tru-data-grid-no-rows-overlay.mjs +0 -26
  346. package/esm2020/lib/components/data-grid/tru-data-grid-module.mjs +0 -67
  347. package/esm2020/lib/components/data-grid/tru-data-grid.mjs +0 -370
  348. package/esm2020/lib/components/desktop/classes/tru-desktop-view-config.mjs +0 -21
  349. package/esm2020/lib/components/desktop/directives/resizable/tru-desktop-resizable.mjs +0 -109
  350. package/esm2020/lib/components/desktop/menubar/tru-desktop-menubar.mjs +0 -34
  351. package/esm2020/lib/components/desktop/services/tru-desktop-manager.mjs +0 -84
  352. package/esm2020/lib/components/desktop/services/tru-desktop-service.mjs +0 -116
  353. package/esm2020/lib/components/desktop/services/tru-window-action-event-handler.mjs +0 -27
  354. package/esm2020/lib/components/desktop/services/tru-window-event-args.mjs +0 -26
  355. package/esm2020/lib/components/desktop/services/tru-window-event-handler.mjs +0 -44
  356. package/esm2020/lib/components/desktop/statusbar/tru-desktop-statusbar.mjs +0 -18
  357. package/esm2020/lib/components/desktop/taskbar/tru-desktop-taskbar.mjs +0 -40
  358. package/esm2020/lib/components/desktop/tru-desktop.mjs +0 -731
  359. package/esm2020/lib/components/desktop/view/tru-desktop-view.mjs +0 -25
  360. package/esm2020/lib/components/desktop/viewport/tru-desktop-viewport.mjs +0 -113
  361. package/esm2020/lib/components/desktop/window/tru-desktop-window.mjs +0 -457
  362. package/esm2020/lib/components/export-dialog/tru-export-dialog.mjs +0 -57
  363. package/esm2020/lib/components/layout/form/tru-form.mjs +0 -34
  364. package/esm2020/lib/components/login/classes/tru-auth-jwt-strategy.mjs +0 -65
  365. package/esm2020/lib/components/login/classes/tru-auth-session-strategy.mjs +0 -19
  366. package/esm2020/lib/components/login/services/tru-auth-cache.mjs +0 -22
  367. package/esm2020/lib/components/login/services/tru-auth-interceptor.mjs +0 -43
  368. package/esm2020/lib/components/login/services/tru-auth.mjs +0 -81
  369. package/esm2020/lib/components/login/tru-login-module.mjs +0 -46
  370. package/esm2020/lib/components/login/tru-login.mjs +0 -58
  371. package/esm2020/lib/components/password-dialog/tru-password-dialog.mjs +0 -44
  372. package/esm2020/lib/components/toolbar/button/tru-toolbar-button.mjs +0 -41
  373. package/esm2020/lib/components/toolbar/context-filter/tru-toolbar-context-filter.mjs +0 -24
  374. package/esm2020/lib/components/toolbar/dropdown/tru-toolbar-dropdown.mjs +0 -43
  375. package/esm2020/lib/components/toolbar/menu/menu-button/tru-toolbar-menu-button.mjs +0 -16
  376. package/esm2020/lib/components/toolbar/menu/menu-item/tru-toolbar-menu-item.mjs +0 -26
  377. package/esm2020/lib/components/toolbar/menu/tru-toolbar-menu.mjs +0 -33
  378. package/esm2020/lib/components/toolbar/text/tru-toolbar-text.mjs +0 -28
  379. package/esm2020/lib/components/toolbar/user-profile/tru-toolbar-user-profile.mjs +0 -35
  380. package/esm2020/lib/components/validation-dialog/tru-validation-dialog-config.mjs +0 -21
  381. package/esm2020/lib/components/validation-dialog/tru-validation-dialog.mjs +0 -79
  382. package/esm2020/lib/directives/breeze-validator/tru-breeze-validator.mjs +0 -100
  383. package/esm2020/lib/directives/search-panel-position-manager/tru-search-panel-position-manager.mjs +0 -151
  384. package/esm2020/lib/directives/select-panel/tru-mat-select-panel.mjs +0 -66
  385. package/esm2020/lib/services/tru-app-environment.mjs +0 -94
  386. package/esm2020/lib/services/tru-breeze-context-factory.mjs +0 -79
  387. package/esm2020/lib/services/tru-breeze-metadata-provider.mjs +0 -22
  388. package/esm2020/lib/services/tru-component-lookup.mjs +0 -25
  389. package/esm2020/lib/services/tru-connection-hub.mjs +0 -48
  390. package/esm2020/lib/services/tru-context-filters.mjs +0 -29
  391. package/esm2020/lib/services/tru-data-context.mjs +0 -258
  392. package/esm2020/lib/services/tru-entity-accessor.mjs +0 -287
  393. package/esm2020/lib/services/tru-model-property-lookup.mjs +0 -22
  394. package/esm2020/lib/services/tru-search-result-view-manager.mjs +0 -17
  395. package/esm2020/lib/services/tru-sort.mjs +0 -114
  396. package/esm2020/lib/services/tru-table-registry.mjs +0 -16
  397. package/esm2020/lib/services/tru-text-manager.mjs +0 -134
  398. package/esm2020/lib/services/tru-ui-notification.mjs +0 -103
  399. package/esm2020/lib/services/tru-user.mjs +0 -63
  400. package/esm2020/lib/services/tru-util.mjs +0 -77
  401. package/fesm2015/trudb-tru-common-lib.mjs +0 -6799
  402. package/fesm2015/trudb-tru-common-lib.mjs.map +0 -1
  403. package/fesm2020/trudb-tru-common-lib.mjs +0 -6776
  404. package/fesm2020/trudb-tru-common-lib.mjs.map +0 -1
@@ -1,731 +0,0 @@
1
- import { Component, Input, ViewChild } from '@angular/core';
2
- import { TruDesktopService } from './services/tru-desktop-service';
3
- import { TruDesktopViewConfig } from './classes/tru-desktop-view-config';
4
- import { TruDesktopViewport } from './viewport/tru-desktop-viewport';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./services/tru-desktop-service";
7
- import * as i2 from "../../services/tru-text-manager";
8
- import * as i3 from "./services/tru-window-event-handler";
9
- import * as i4 from "@angular/common";
10
- import * as i5 from "./menubar/tru-desktop-menubar";
11
- import * as i6 from "./taskbar/tru-desktop-taskbar";
12
- import * as i7 from "./viewport/tru-desktop-viewport";
13
- export class TruDesktop {
14
- constructor(desktopService, textManager, truWindowEventHandler) {
15
- this.desktopService = desktopService;
16
- this.textManager = textManager;
17
- this.truWindowEventHandler = truWindowEventHandler;
18
- this.minimizeAll = false;
19
- this.desktop = this.desktopService.createDesktop();
20
- this.minWindowCascadePosition = 40;
21
- this.maxWindowCascadePosition = 100;
22
- this.lastWindowCascadePosition = { top: this.minWindowCascadePosition, left: this.minWindowCascadePosition };
23
- this.shiftPressed = false;
24
- this.altPressed = false;
25
- this.xPressed = false;
26
- this.keyboardMap = ["", "", "", "CANCEL", "", "", "HELP", "", "BACK_SPACE", "TAB", "", "", "CLEAR", "ENTER", "RETURN", "", "SHIFT", "CONTROL", "ALT", "PAUSE", "CAPS_LOCK", "KANA", "EISU", "JUNJA", "FINAL", "HANJA", "", "ESCAPE", "CONVERT", "NONCONVERT", "ACCEPT", "MODECHANGE", "SPACE", "PAGE_UP", "PAGE_DOWN", "END", "HOME", "LEFT", "UP", "RIGHT", "DOWN", "SELECT", "PRINT", "EXECUTE", "PRINTSCREEN", "INSERT", "DELETE", "", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "COLON", "SEMICOLON", "LESS_THAN", "EQUALS", "GREATER_THAN", "QUESTION_MARK", "AT", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "WIN", "", "CONTEXT_MENU", "", "SLEEP", "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9", "MULTIPLY", "ADD", "SEPARATOR", "SUBTRACT", "DECIMAL", "DIVIDE", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16", "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "", "", "", "", "", "", "", "", "NUM_LOCK", "SCROLL_LOCK", "WIN_OEM_FJ_JISHO", "WIN_OEM_FJ_MASSHOU", "WIN_OEM_FJ_TOUROKU", "WIN_OEM_FJ_LOYA", "WIN_OEM_FJ_ROYA", "", "", "", "", "", "", "", "", "", "CIRCUMFLEX", "EXCLAMATION", "DOUBLE_QUOTE", "HASH", "DOLLAR", "PERCENT", "AMPERSAND", "UNDERSCORE", "OPEN_PAREN", "CLOSE_PAREN", "ASTERISK", "PLUS", "PIPE", "HYPHEN_MINUS", "OPEN_CURLY_BRACKET", "CLOSE_CURLY_BRACKET", "TILDE", "", "", "", "", "VOLUME_MUTE", "VOLUME_DOWN", "VOLUME_UP", "", "", "", "", "COMMA", "", "PERIOD", "SLASH", "BACK_QUOTE", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "OPEN_BRACKET", "BACK_SLASH", "CLOSE_BRACKET", "QUOTE", "", "META", "ALTGR", "", "WIN_ICO_HELP", "WIN_ICO_00", "", "WIN_ICO_CLEAR", "", "", "WIN_OEM_RESET", "WIN_OEM_JUMP", "WIN_OEM_PA1", "WIN_OEM_PA2", "WIN_OEM_PA3", "WIN_OEM_WSCTRL", "WIN_OEM_CUSEL", "WIN_OEM_ATTN", "WIN_OEM_FINISH", "WIN_OEM_COPY", "WIN_OEM_AUTO", "WIN_OEM_ENLW", "WIN_OEM_BACKTAB", "ATTN", "CRSEL", "EXSEL", "EREOF", "PLAY", "ZOOM", "", "PA1", "WIN_OEM_CLEAR", ""];
27
- this.logoUrl = null;
28
- /**
29
- * @tru.doc function
30
- * @name truDesktopComponent.getDesktop
31
- * @module tru.desktop
32
- *
33
- * @description
34
- * Return an object of desktop.
35
- *
36
- * @returns {object} desktop.
37
- */
38
- this.getDesktop = () => {
39
- return this.desktop;
40
- };
41
- /**
42
- * @tru.doc function
43
- * @name truDesktopComponent.getOptions
44
- * @module tru.desktop
45
- *
46
- * @description
47
- * Return an object of desktop options.
48
- *
49
- * @returns {object} options.
50
- */
51
- this.getOptions = () => {
52
- return this.options;
53
- };
54
- /**
55
- * @tru.doc function
56
- * @name truDesktopComponent.getWindows
57
- * @module tru.desktop
58
- *
59
- * @description
60
- * Return an array of windows.
61
- *
62
- * @returns {array} windows.
63
- */
64
- this.getWindows = () => {
65
- return this.windows;
66
- };
67
- /**
68
- * @tru.doc function
69
- * @name truDesktopComponent.getNextMaxZIndex
70
- * @module tru.desktop
71
- *
72
- * @description
73
- * Iterates through all window objects in the windows array to find the max z-index
74
- * and increases the value found by 1.
75
- *
76
- * @returns {int}
77
- */
78
- this.getNextMaxZIndex = () => {
79
- var max = 0;
80
- var tmp;
81
- for (var i = this.windows.length - 1; i >= 0; i--) {
82
- tmp = this.windows[i].zIndex;
83
- if (tmp > max)
84
- max = tmp;
85
- }
86
- return ++max;
87
- };
88
- /**
89
- * @tru.doc function
90
- * @name truDesktopComponent.clearActive
91
- * @module tru.desktop
92
- *
93
- * @description
94
- * Iterates through all window objects in the windows
95
- * and sets the active property to false.
96
- *
97
- */
98
- this.clearActive = () => {
99
- this.windows.forEach((window) => {
100
- window.active = false;
101
- });
102
- };
103
- /**
104
- * @tru.doc function
105
- * @name truDesktopComponent.getActiveWindow
106
- * @module tru.desktop
107
- *
108
- * @description
109
- * Gets the active window.
110
- *
111
- * @returns {object} view object.
112
- */
113
- this.getActiveWindow = () => {
114
- var activeWindow = null;
115
- this.windows.forEach((wdw) => {
116
- if (wdw.active === true) {
117
- activeWindow = wdw;
118
- }
119
- });
120
- return activeWindow;
121
- };
122
- /**
123
- * @tru.doc function
124
- * @name truDesktopComponent.getActiveView
125
- * @module tru.desktop
126
- *
127
- * @description
128
- * Gets the active view.
129
- *
130
- * @returns {object} view object.
131
- */
132
- this.getActiveView = (wdw) => {
133
- var activeView = null;
134
- wdw.views.forEach((view) => {
135
- if (view.active$.getValue() === true) {
136
- activeView = view;
137
- }
138
- });
139
- return activeView;
140
- };
141
- /**
142
- * @tru.doc function
143
- * @name truDesktopComponent.allWindowsAreMinimized
144
- * @module tru.desktop
145
- *
146
- * @description
147
- * Iterates through windows to determine if all are minimized.
148
- *
149
- */
150
- this.allWindowsAreMinimized = () => {
151
- var allMinimized = true;
152
- this.windows.forEach((window) => {
153
- if (!window.minimized) {
154
- allMinimized = false;
155
- }
156
- });
157
- return allMinimized;
158
- };
159
- /**
160
- * @tru.doc function
161
- * @name truDesktopComponent.hideShowAll
162
- * @module tru.desktop
163
- *
164
- * @description
165
- * Hides/shows all windows
166
- *
167
- */
168
- this.hideShowAll = () => {
169
- this.minimizeAll = this.allWindowsAreMinimized() ? false : !this.minimizeAll;
170
- this.windows.forEach((wdw) => {
171
- if (wdw.outOfBounds)
172
- this.recover(wdw);
173
- wdw.active = false;
174
- wdw.minimized = this.minimizeAll;
175
- });
176
- this.activateForemostWindow();
177
- return this.minimizeAll;
178
- };
179
- /**
180
- * @tru.doc function
181
- * @name truDesktopComponent.findWindowViewDirective
182
- * @module tru.desktop
183
- *
184
- * @description
185
- * Looks for previously open window with a view directive
186
- *
187
- */
188
- this.findWindowViewDirective = (windowViewDirective) => {
189
- for (let i = 0; i < this.windows.length; i++) {
190
- for (let j = 0; j < this.windows[i].views.length; j++) {
191
- if (this.windows[i].views[0].viewDirective === windowViewDirective)
192
- return this.windows[i];
193
- }
194
- }
195
- return null;
196
- };
197
- /**
198
- * @tru.doc function
199
- * @name truDesktopComponent.openWindow
200
- * @module tru.desktop
201
- *
202
- * @description
203
- * Displays a new window. All window properties defined by the application developer will be
204
- * overlaid here before displaying the window
205
- *
206
- */
207
- this.openWindow = (windowConfigOverlays, singleInstance) => {
208
- let activeWindow = this.getActiveWindow();
209
- if (activeWindow && activeWindow.isModal) {
210
- activeWindow.invalidOperation = true;
211
- return;
212
- }
213
- if (singleInstance) {
214
- let window = this.findWindowViewDirective(windowConfigOverlays.views[0].viewDirective);
215
- if (window) {
216
- this.updateWindowState(window);
217
- return;
218
- }
219
- }
220
- if (windowConfigOverlays.isModal) {
221
- let heightOffset = (parseInt(windowConfigOverlays.height, 10) / 2) + 30;
222
- let widthOffset = (parseInt(windowConfigOverlays.width, 10) / 2);
223
- windowConfigOverlays.top = 'calc(50% - ' + heightOffset + 'px )';
224
- windowConfigOverlays.left = 'calc(50% - ' + widthOffset + 'px )';
225
- }
226
- this.clearActive();
227
- let configuredWindow = this.configureWindow(windowConfigOverlays);
228
- configuredWindow.views = this.configureViews(windowConfigOverlays, configuredWindow);
229
- if (!configuredWindow.isModal) {
230
- configuredWindow.cascadeWindow = false;
231
- this.savePosition(configuredWindow);
232
- this.maximize(configuredWindow);
233
- this.windows.push(configuredWindow);
234
- }
235
- else {
236
- this.windows.push(configuredWindow);
237
- }
238
- };
239
- /**
240
- * @tru.doc function
241
- * @name truDesktopComponent.configureWindow
242
- * @module tru.desktop
243
- *
244
- * @description
245
- * Creates a new window instance.
246
- *
247
- */
248
- this.configureWindow = (windowConfigOverlays) => {
249
- var windowConfigInstance = Object.assign({}, this.desktop.windowConfig);
250
- windowConfigInstance.savedPosition = Object.create({ top: 0, left: 0, right: 0, bottom: 0, height: 0, width: 0 });
251
- windowConfigInstance.zIndex = this.getNextMaxZIndex();
252
- //windowConfigInstance.globals = Object.assign({}, $rootScope.$eval(this.options.globals));
253
- return Object.assign(windowConfigInstance, windowConfigOverlays);
254
- };
255
- /**
256
- * @tru.doc function
257
- * @name truDesktopComponent.configureViews
258
- * @module tru.desktop
259
- *
260
- * @description
261
- * Creates one or more view instances
262
- *
263
- */
264
- this.configureViews = (windowConfigOverlays, configuredWindow) => {
265
- let configuredViews = [];
266
- windowConfigOverlays.views.forEach((view) => {
267
- let configuredView = new TruDesktopViewConfig();
268
- configuredView.componentName = view.componentName;
269
- configuredView.entities = view.entities;
270
- configuredView.entityIndex = view.entityIndex;
271
- configuredView.isDirty = view.isDirty;
272
- configuredView.isEditing = view.isEditing;
273
- configuredView.isInvalid = view.isValid;
274
- configuredView.openAsDetaiView = view.openAsDetailView;
275
- //viewConfigInstance.globals = this.options.globals;
276
- //let configuredView = Object.assign(viewConfigInstance, view);
277
- configuredView.window = configuredWindow;
278
- configuredViews.push(configuredView);
279
- });
280
- return configuredViews;
281
- };
282
- /**
283
- * @tru.doc function
284
- * @name truDesktopComponent.closeWindow
285
- * @module tru.desktop
286
- *
287
- * @description
288
- * Remove a window {object} from the windows array.
289
- *
290
- * @returns {boolean} returns true if window was closed, false if not closed.
291
- */
292
- this.closeWindow = (wdw) => {
293
- if (!this.options.allowDirtyClose && wdw.isDirty) {
294
- alert("Unsaved Changes. Save changes before closing window.");
295
- return false;
296
- }
297
- if (!this.options.allowInvalidClose && wdw.isInvalid) {
298
- alert("Data is invalid. Correct Invalid data before closing window.");
299
- return false;
300
- }
301
- if (this.options.canCloseFn !== undefined) {
302
- if (this.options.canCloseFn(wdw)) {
303
- this.windows.splice(this.windows.indexOf(wdw), 1);
304
- this.activateForemostWindow();
305
- return true;
306
- }
307
- ;
308
- }
309
- else {
310
- this.windows.splice(this.windows.indexOf(wdw), 1);
311
- this.activateForemostWindow();
312
- return true;
313
- }
314
- return false;
315
- };
316
- /**
317
- * @tru.doc function
318
- * @name truDesktopComponent.activateForemostWindow
319
- * @module tru.desktop
320
- *
321
- * @description
322
- * Set the foremost window to an active state
323
- *
324
- */
325
- this.activateForemostWindow = () => {
326
- var foremost = undefined;
327
- for (var i = 0; i < this.windows.length; i++) {
328
- if ((foremost === undefined || this.windows[i].zIndex > foremost.zIndex) && !this.windows[i].minimized && !this.windows[i].outOfBounds)
329
- foremost = this.windows[i];
330
- }
331
- if (foremost)
332
- foremost.active = true;
333
- };
334
- /**
335
- * @tru.doc function
336
- * @name truDesktopComponent.activateNextWindow
337
- * @module tru.desktop
338
- *
339
- * @description
340
- * Set the next window to an active state
341
- *
342
- */
343
- this.activateNextWindow = (activeWindowLocation) => {
344
- if (this.windows.length <= 1)
345
- return;
346
- var backend = this.windows.slice(activeWindowLocation);
347
- var frontend = this.windows.slice(0, activeWindowLocation - 1);
348
- var sorted = backend.concat(frontend);
349
- var nextWindow = undefined;
350
- for (var i = 0; i < sorted.length; i++) {
351
- if (!sorted[i].minimized && !sorted[i].outOfBounds && !nextWindow)
352
- nextWindow = sorted[i];
353
- }
354
- if (nextWindow) {
355
- this.clearActive();
356
- nextWindow.zIndex = this.getNextMaxZIndex();
357
- nextWindow.active = true;
358
- }
359
- };
360
- /**
361
- * @tru.doc function
362
- * @name truDesktopComponent.activatePreviousWindow
363
- * @module tru.desktop
364
- *
365
- * @description
366
- * Set the previous window to an active state
367
- *
368
- */
369
- this.activatePreviousWindow = (activeWindowLocation) => {
370
- if (this.windows.length <= 1)
371
- return;
372
- var backend = this.windows.slice(activeWindowLocation);
373
- var frontend = this.windows.slice(0, activeWindowLocation - 1);
374
- var sorted = backend.concat(frontend);
375
- var nextWindow = undefined;
376
- for (var i = sorted.length - 1; i >= 0; i--) {
377
- if (!sorted[i].minimized && !sorted[i].outOfBounds && !nextWindow)
378
- nextWindow = sorted[i];
379
- }
380
- if (nextWindow) {
381
- this.clearActive();
382
- nextWindow.zIndex = this.getNextMaxZIndex();
383
- nextWindow.active = true;
384
- }
385
- };
386
- /**
387
- * @tru.doc function
388
- * @name truDesktopComponent.minimize
389
- * @module tru.desktop
390
- *
391
- * @description
392
- * Visually removes window from the viewport.
393
- *
394
- */
395
- this.minimize = (window) => {
396
- this.savePosition(window);
397
- window.active = false;
398
- window.minimized = true;
399
- this.activateForemostWindow();
400
- };
401
- /**
402
- * @tru.doc function
403
- * @name truDesktopComponent.maximize
404
- * @module tru.desktop
405
- *
406
- * @description
407
- * Positions window such that it fills the whole viewport.
408
- *
409
- */
410
- this.maximize = (window) => {
411
- window.top = 0;
412
- window.left = 0;
413
- window.right = 0;
414
- window.bottom = 0;
415
- window.height = 'auto';
416
- window.width = '100%';
417
- window.maximized = 'fill';
418
- };
419
- /**
420
- * @tru.doc function
421
- * @name truDesktopComponent.maximizeLeft
422
- * @module tru.desktop
423
- *
424
- * @description
425
- * Positions window such that it fills the left portion viewport.
426
- *
427
- */
428
- this.maximizeLeft = (window) => {
429
- window.split = true;
430
- window.top = 0;
431
- window.left = 0;
432
- window.bottom = 0;
433
- window.width = '50%';
434
- window.height = 'auto';
435
- window.maximized = 'left';
436
- };
437
- /**
438
- * @tru.doc function
439
- * @name truDesktopComponent.maximizeRight
440
- * @module tru.desktop
441
- *
442
- * @description
443
- * Positions window such that it fills the right portion viewport.
444
- *
445
- */
446
- this.maximizeRight = (window) => {
447
- window.top = 0;
448
- window.left = '50%';
449
- window.right = 0;
450
- window.bottom = 0;
451
- window.width = '50%';
452
- window.height = 'auto';
453
- window.maximized = 'right';
454
- };
455
- /**
456
- * @tru.doc function
457
- * @name truDesktopComponent.recover
458
- * @module tru.desktop
459
- *
460
- * @description
461
- * Brings window back into view when it has escaped the viewport.
462
- *
463
- */
464
- this.recover = (window) => {
465
- window.active = true;
466
- window.outOfBounds = false;
467
- window.minimized = false;
468
- window.zIndex = this.getNextMaxZIndex();
469
- this.cascadeWindow(window);
470
- this.clearActive();
471
- this.activateForemostWindow();
472
- };
473
- /**
474
- * @tru.doc function
475
- * @name truDesktopComponent.restore
476
- * @module tru.desktop
477
- *
478
- * @description
479
- *
480
- */
481
- this.restore = (wdw) => {
482
- if (wdw.maximized === 'fill') {
483
- this.maximize(wdw);
484
- }
485
- else if (wdw.maximized === 'left') {
486
- this.maximizeLeft(wdw);
487
- }
488
- else if (wdw.maximized === 'right') {
489
- this.maximizeRight(wdw);
490
- }
491
- this.updateWindowState(wdw);
492
- };
493
- /**
494
- * @tru.doc function
495
- * @name truDesktopComponent.bringToFront
496
- * @module tru.desktop
497
- *
498
- * @description
499
- *
500
- */
501
- this.updateWindowState = (wdw) => {
502
- if (wdw.outOfBounds) {
503
- this.recover(wdw);
504
- return;
505
- }
506
- if (wdw.maximized === 'fill') {
507
- this.maximize(wdw);
508
- }
509
- else if (wdw.maximized === 'left') {
510
- this.maximizeLeft(wdw);
511
- }
512
- else if (wdw.maximized === 'right') {
513
- this.maximizeRight(wdw);
514
- }
515
- this.clearActive();
516
- wdw.active = true;
517
- wdw.minimized = false;
518
- wdw.zIndex = this.getNextMaxZIndex();
519
- };
520
- /**
521
- * @tru.doc function
522
- * @name truDesktopComponent.restoreSavedPosition
523
- * @module tru.desktop
524
- *
525
- * @description
526
- * Set the windows last know position to the current position.
527
- *
528
- */
529
- this.restoreSavedPosition = (wdw) => {
530
- this.clearActive();
531
- wdw.top = wdw.savedPosition.top;
532
- wdw.left = wdw.savedPosition.left;
533
- wdw.right = wdw.savedPosition.right;
534
- wdw.bottom = wdw.savedPosition.bottom;
535
- wdw.height = wdw.savedPosition.height;
536
- wdw.width = wdw.savedPosition.width;
537
- wdw.maximized = undefined;
538
- wdw.minimized = undefined;
539
- wdw.active = true;
540
- wdw.minimized = false;
541
- wdw.zIndex = this.getNextMaxZIndex();
542
- };
543
- /**
544
- * @tru.doc function
545
- * @name truDesktopComponent.savePosition
546
- * @module tru.desktop
547
- *
548
- * @description
549
- * Save the windows last know position.
550
- *
551
- */
552
- this.savePosition = (wdw) => {
553
- wdw.savedPosition.top = wdw.top;
554
- wdw.savedPosition.left = wdw.left;
555
- wdw.savedPosition.right = wdw.right;
556
- wdw.savedPosition.bottom = wdw.bottom;
557
- wdw.savedPosition.height = wdw.height;
558
- wdw.savedPosition.width = wdw.width;
559
- };
560
- /**
561
- * @tru.doc function
562
- * @name truDesktopComponent.closeWindow
563
- * @module tru.desktop
564
- *
565
- * @description
566
- * Moves a window to the next cascade position.
567
- *
568
- */
569
- this.cascadeWindow = (window) => {
570
- if (!this.options.enableWindowCascading || window.isModal)
571
- return;
572
- this.lastWindowCascadePosition.top += 10;
573
- this.lastWindowCascadePosition.left += 10;
574
- if (this.lastWindowCascadePosition.top > this.maxWindowCascadePosition)
575
- this.lastWindowCascadePosition.top = this.minWindowCascadePosition;
576
- if (this.lastWindowCascadePosition.left > this.maxWindowCascadePosition)
577
- this.lastWindowCascadePosition.left = this.minWindowCascadePosition;
578
- window.top = this.lastWindowCascadePosition.top + 'px';
579
- window.left = this.lastWindowCascadePosition.left + 'px';
580
- };
581
- /**
582
- * @tru.doc function
583
- * @name truDesktopComponent.getKeyCode
584
- * @module tru.desktop
585
- *
586
- * @description
587
- *
588
- */
589
- this.getKeySequence = (event) => {
590
- var keys = [];
591
- if (event.shiftKey)
592
- keys.push('shift');
593
- if (event.ctrlKey)
594
- keys.push('ctrl');
595
- if (event.altKey)
596
- keys.push('alt');
597
- if (event.metaKey)
598
- keys.push('meta');
599
- var keyCode = event.keyCode || event.which;
600
- if (keyCode)
601
- keys.push(this.keyboardMap[keyCode].toLowerCase());
602
- return keys.join('+');
603
- };
604
- /**
605
- * @tru.doc event
606
- * @module tru.desktop
607
- *
608
- * @description
609
- *
610
- */
611
- this.onKeyDown = (event) => {
612
- var keySequence = this.getKeySequence(event);
613
- if (keySequence === 'alt+m') { //Maximize
614
- var activeWindow = this.getActiveWindow();
615
- if (activeWindow === null)
616
- return;
617
- if (!activeWindow.maximized) {
618
- this.savePosition(activeWindow);
619
- this.maximize(activeWindow);
620
- }
621
- else if (activeWindow.maximized === 'right' || activeWindow.maximized === 'left')
622
- this.maximize(activeWindow);
623
- else
624
- this.restoreSavedPosition(activeWindow);
625
- event.preventDefault();
626
- }
627
- if (keySequence === 'alt+n') { //Minimize
628
- var activeWindow = this.getActiveWindow();
629
- if (activeWindow === null || activeWindow.minimized)
630
- return;
631
- this.minimize(activeWindow);
632
- event.preventDefault();
633
- }
634
- if (keySequence === 'alt+w') { //Cycles Forward
635
- var index = this.windows.indexOf(this.getActiveWindow());
636
- this.activateNextWindow(index + 1);
637
- event.preventDefault();
638
- }
639
- if (keySequence === 'shift+alt+w') { //Cycles Backward
640
- var index = this.windows.indexOf(this.getActiveWindow());
641
- this.activatePreviousWindow(index + 1);
642
- event.preventDefault();
643
- }
644
- if (keySequence === 'shift+alt+x' && !(this.shiftPressed && this.altPressed && this.xPressed)) { //Close
645
- var activeWindow = this.getActiveWindow();
646
- if (!activeWindow)
647
- return;
648
- this.closeWindow(activeWindow);
649
- event.preventDefault();
650
- }
651
- if (keySequence === 'alt+d') { //Toggle Desktop
652
- //this.desktopShown = this.hideShowAll();
653
- event.preventDefault();
654
- }
655
- if (event.shiftKey)
656
- this.shiftPressed = true;
657
- if (event.altKey)
658
- this.altPressed = true;
659
- if (event.keyCode === 88)
660
- this.xPressed = true;
661
- };
662
- this.onKeyUp = (event) => {
663
- if (event.shiftKey)
664
- this.shiftPressed = false;
665
- if (event.altKey)
666
- this.altPressed = false;
667
- if (event.keyCode === 88)
668
- this.xPressed = false;
669
- };
670
- /**
671
- * @tru.doc function
672
- * @name truDesktopComponent.handleSelectAttempt
673
- * @module tru.desktop
674
- *
675
- * @description
676
- * Prevents the user from highlight desktop elements.
677
- *
678
- */
679
- this.handleSelectAttempt = (e) => {
680
- var nodeName = e.target.nodeName.toLowerCase();
681
- if (nodeName === 'input' || nodeName === 'textarea' || nodeName === 'select')
682
- return true;
683
- if (window.event) {
684
- e.preventDefault();
685
- }
686
- return true;
687
- };
688
- this.windows = [];
689
- }
690
- ngOnInit() {
691
- this.logoUrl = this.options.logoUrl;
692
- this.options = Object.assign(this.desktop.options, this.options);
693
- this.options.viewportTop = this.options.menubarConfig !== undefined ? this.options.menubarHeight + 1 : 0;
694
- this.truWindowEventHandler.onOpen().subscribe((windiowEvent) => {
695
- this.openWindow(windiowEvent, false);
696
- });
697
- document.onselectstart = this.handleSelectAttempt;
698
- window.addEventListener('keydown', this.onKeyDown);
699
- window.addEventListener('keyup', this.onKeyUp);
700
- window.onbeforeunload = (e) => {
701
- let hasChanges = this.viewportComponent.windowComponents.filter((w) => { return w.hasChanges() ? true : false; });
702
- if (hasChanges.length) {
703
- e = e || window.event;
704
- var msg = this.textManager.msgConfirmExitWithChangesPending;
705
- // For IE and Firefox
706
- if (e) {
707
- e.returnValue = msg;
708
- }
709
- // For Safari / chrome
710
- return msg;
711
- }
712
- return false;
713
- };
714
- }
715
- ngOnDestroy() {
716
- window.removeEventListener('keydown', this.onKeyDown);
717
- window.removeEventListener('keyup', this.onKeyUp);
718
- }
719
- }
720
- TruDesktop.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: TruDesktop, deps: [{ token: i1.TruDesktopService }, { token: i2.TruTextManager }, { token: i3.TruWindowEventHandler }], target: i0.ɵɵFactoryTarget.Component });
721
- TruDesktop.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.1", type: TruDesktop, selector: "tru-desktop", inputs: { options: "options" }, providers: [TruDesktopService], viewQueries: [{ propertyName: "viewportComponent", first: true, predicate: TruDesktopViewport, descendants: true }], ngImport: i0, template: "<div class=\"desktop-wrapper\">\r\n\r\n <div class=\"desktop-menubar-container\" [ngStyle]=\"{'height': options.menubarHeight + 'px'}\">\r\n <tru-desktop-menubar [desktopCtrl]=\"this\"></tru-desktop-menubar>\r\n </div>\r\n\r\n <tru-desktop-viewport [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-viewport>\r\n\r\n <tru-desktop-taskbar [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-taskbar>\r\n\r\n <img class=\"desktop-viewport-logo\" data-ng-show=\"logoUrl\" alt=\"\">\r\n</div>\r\n", styles: ["body{-webkit-user-select:none;user-select:none}input,textarea{-moz-user-select:text}.desktop-text{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:14px;line-height:1;color:#333}.desktop-wrapper{position:absolute!important;inset:0;background:#ffffff;overflow:hidden}.desktop-relative{position:relative}.desktop-display-none{display:none}.desktop-click-through{pointer-events:none}.desktop-menubar-container{position:absolute!important;top:0;left:0;right:0;height:26px;background:#f8f8f8;border-bottom:1px solid #e7e7e7;padding-left:5px}\n"], dependencies: [{ kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.TruDesktopMenubar, selector: "tru-desktop-menubar", inputs: ["desktopCtrl"] }, { kind: "component", type: i6.TruDesktopTaskbar, selector: "tru-desktop-taskbar", inputs: ["windows", "desktopCtrl"] }, { kind: "component", type: i7.TruDesktopViewport, selector: "tru-desktop-viewport", inputs: ["windows", "desktopCtrl"] }] });
722
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: TruDesktop, decorators: [{
723
- type: Component,
724
- args: [{ selector: 'tru-desktop', providers: [TruDesktopService], template: "<div class=\"desktop-wrapper\">\r\n\r\n <div class=\"desktop-menubar-container\" [ngStyle]=\"{'height': options.menubarHeight + 'px'}\">\r\n <tru-desktop-menubar [desktopCtrl]=\"this\"></tru-desktop-menubar>\r\n </div>\r\n\r\n <tru-desktop-viewport [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-viewport>\r\n\r\n <tru-desktop-taskbar [windows]=\"windows\" [desktopCtrl]=\"this\"></tru-desktop-taskbar>\r\n\r\n <img class=\"desktop-viewport-logo\" data-ng-show=\"logoUrl\" alt=\"\">\r\n</div>\r\n", styles: ["body{-webkit-user-select:none;user-select:none}input,textarea{-moz-user-select:text}.desktop-text{-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-size:14px;line-height:1;color:#333}.desktop-wrapper{position:absolute!important;inset:0;background:#ffffff;overflow:hidden}.desktop-relative{position:relative}.desktop-display-none{display:none}.desktop-click-through{pointer-events:none}.desktop-menubar-container{position:absolute!important;top:0;left:0;right:0;height:26px;background:#f8f8f8;border-bottom:1px solid #e7e7e7;padding-left:5px}\n"] }]
725
- }], ctorParameters: function () { return [{ type: i1.TruDesktopService }, { type: i2.TruTextManager }, { type: i3.TruWindowEventHandler }]; }, propDecorators: { options: [{
726
- type: Input
727
- }], viewportComponent: [{
728
- type: ViewChild,
729
- args: [TruDesktopViewport]
730
- }] } });
731
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1LWRlc2t0b3AuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90cnUtY29tbW9uLWxpYi9zcmMvbGliL2NvbXBvbmVudHMvZGVza3RvcC90cnUtZGVza3RvcC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RydS1jb21tb24tbGliL3NyYy9saWIvY29tcG9uZW50cy9kZXNrdG9wL3RydS1kZXNrdG9wLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRy9FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7Ozs7QUFRckUsTUFBTSxPQUFPLFVBQVU7SUFJckIsWUFDVSxjQUFpQyxFQUNqQyxXQUEyQixFQUMzQixxQkFBNEM7UUFGNUMsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUMzQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBR3RELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLFlBQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLDZCQUF3QixHQUFHLEVBQUUsQ0FBQztRQUM5Qiw2QkFBd0IsR0FBRyxHQUFHLENBQUM7UUFDL0IsOEJBQXlCLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLHdCQUF3QixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUN4RyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsZ0JBQVcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxvQkFBb0Is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aUJBQWlCO3NCQUF2RCxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVHJ1V2luZG93RXZlbnRBcmdzIH0gZnJvbSAnLi9zZXJ2aWNlcy90cnUtd2luZG93LWV2ZW50LWFyZ3MnO1xyXG5pbXBvcnQgeyBUcnVXaW5kb3dFdmVudEhhbmRsZXIgfSBmcm9tICcuL3NlcnZpY2VzL3RydS13aW5kb3ctZXZlbnQtaGFuZGxlcic7XG5pbXBvcnQgeyBUcnVEZXNrdG9wU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvdHJ1LWRlc2t0b3Atc2VydmljZSc7XG5pbXBvcnQgeyBUcnVEZXNrdG9wVmlld0NvbmZpZyB9IGZyb20gJy4vY2xhc3Nlcy90cnUtZGVza3RvcC12aWV3LWNvbmZpZyc7XHJcbmltcG9ydCB7IFRydVRleHRNYW5hZ2VyIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdHJ1LXRleHQtbWFuYWdlcic7XHJcbmltcG9ydCB7IFRydURlc2t0b3BXaW5kb3cgfSBmcm9tICcuL3dpbmRvdy90cnUtZGVza3RvcC13aW5kb3cnO1xyXG5pbXBvcnQgeyBUcnVEZXNrdG9wVmlld3BvcnQgfSBmcm9tICcuL3ZpZXdwb3J0L3RydS1kZXNrdG9wLXZpZXdwb3J0JztcclxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0cnUtZGVza3RvcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi90cnUtZGVza3RvcC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdHJ1LWRlc2t0b3AuY3NzJ10sXG4gIHByb3ZpZGVyczogW1RydURlc2t0b3BTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBUcnVEZXNrdG9wIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgb3B0aW9uczogYW55O1xuICBAVmlld0NoaWxkKFRydURlc2t0b3BWaWV3cG9ydCkgcHJpdmF0ZSB2aWV3cG9ydENvbXBvbmVudCE6IFRydURlc2t0b3BWaWV3cG9ydDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGRlc2t0b3BTZXJ2aWNlOiBUcnVEZXNrdG9wU2VydmljZSxcbiAgICBwcml2YXRlIHRleHRNYW5hZ2VyOiBUcnVUZXh0TWFuYWdlcixcbiAgICBwcml2YXRlIHRydVdpbmRvd0V2ZW50SGFuZGxlcjogVHJ1V2luZG93RXZlbnRIYW5kbGVyKSB7XG4gIH1cclxuXG4gIG1pbmltaXplQWxsID0gZmFsc2U7XG4gIGRlc2t0b3AgPSB0aGlzLmRlc2t0b3BTZXJ2aWNlLmNyZWF0ZURlc2t0b3AoKTtcbiAgbWluV2luZG93Q2FzY2FkZVBvc2l0aW9uID0gNDA7XG4gIG1heFdpbmRvd0Nhc2NhZGVQb3NpdGlvbiA9IDEwMDtcbiAgbGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbiA9IHsgdG9wOiB0aGlzLm1pbldpbmRvd0Nhc2NhZGVQb3NpdGlvbiwgbGVmdDogdGhpcy5taW5XaW5kb3dDYXNjYWRlUG9zaXRpb24gfTtcbiAgc2hpZnRQcmVzc2VkID0gZmFsc2U7XG4gIGFsdFByZXNzZWQgPSBmYWxzZTtcbiAgeFByZXNzZWQgPSBmYWxzZTtcbiAga2V5Ym9hcmRNYXAgPSBbXCJcIiwgXCJcIiwgXCJcIiwgXCJDQU5DRUxcIiwgXCJcIiwgXCJcIiwgXCJIRUxQXCIsIFwiXCIsIFwiQkFDS19TUEFDRVwiLCBcIlRBQlwiLCBcIlwiLCBcIlwiLCBcIkNMRUFSXCIsIFwiRU5URVJcIiwgXCJSRVRVUk5cIiwgXCJcIiwgXCJTSElGVFwiLCBcIkNPTlRST0xcIiwgXCJBTFRcIiwgXCJQQVVTRVwiLCBcIkNBUFNfTE9DS1wiLCBcIktBTkFcIiwgXCJFSVNVXCIsIFwiSlVOSkFcIiwgXCJGSU5BTFwiLCBcIkhBTkpBXCIsIFwiXCIsIFwiRVNDQVBFXCIsIFwiQ09OVkVSVFwiLCBcIk5PTkNPTlZFUlRcIiwgXCJBQ0NFUFRcIiwgXCJNT0RFQ0hBTkdFXCIsIFwiU1BBQ0VcIiwgXCJQQUdFX1VQXCIsIFwiUEFHRV9ET1dOXCIsIFwiRU5EXCIsIFwiSE9NRVwiLCBcIkxFRlRcIiwgXCJVUFwiLCBcIlJJR0hUXCIsIFwiRE9XTlwiLCBcIlNFTEVDVFwiLCBcIlBSSU5UXCIsIFwiRVhFQ1VURVwiLCBcIlBSSU5UU0NSRUVOXCIsIFwiSU5TRVJUXCIsIFwiREVMRVRFXCIsIFwiXCIsIFwiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcIkNPTE9OXCIsIFwiU0VNSUNPTE9OXCIsIFwiTEVTU19USEFOXCIsIFwiRVFVQUxTXCIsIFwiR1JFQVRFUl9USEFOXCIsIFwiUVVFU1RJT05fTUFSS1wiLCBcIkFUXCIsIFwiQVwiLCBcIkJcIiwgXCJDXCIsIFwiRFwiLCBcIkVcIiwgXCJGXCIsIFwiR1wiLCBcIkhcIiwgXCJJXCIsIFwiSlwiLCBcIktcIiwgXCJMXCIsIFwiTVwiLCBcIk5cIiwgXCJPXCIsIFwiUFwiLCBcIlFcIiwgXCJSXCIsIFwiU1wiLCBcIlRcIiwgXCJVXCIsIFwiVlwiLCBcIldcIiwgXCJYXCIsIFwiWVwiLCBcIlpcIiwgXCJXSU5cIiwgXCJcIiwgXCJDT05URVhUX01FTlVcIiwgXCJcIiwgXCJTTEVFUFwiLCBcIk5VTVBBRDBcIiwgXCJOVU1QQUQxXCIsIFwiTlVNUEFEMlwiLCBcIk5VTVBBRDNcIiwgXCJOVU1QQUQ0XCIsIFwiTlVNUEFENVwiLCBcIk5VTVBBRDZcIiwgXCJOVU1QQUQ3XCIsIFwiTlVNUEFEOFwiLCBcIk5VTVBBRDlcIiwgXCJNVUxUSVBMWVwiLCBcIkFERFwiLCBcIlNFUEFSQVRPUlwiLCBcIlNVQlRSQUNUXCIsIFwiREVDSU1BTFwiLCBcIkRJVklERVwiLCBcIkYxXCIsIFwiRjJcIiwgXCJGM1wiLCBcIkY0XCIsIFwiRjVcIiwgXCJGNlwiLCBcIkY3XCIsIFwiRjhcIiwgXCJGOVwiLCBcIkYxMFwiLCBcIkYxMVwiLCBcIkYxMlwiLCBcIkYxM1wiLCBcIkYxNFwiLCBcIkYxNVwiLCBcIkYxNlwiLCBcIkYxN1wiLCBcIkYxOFwiLCBcIkYxOVwiLCBcIkYyMFwiLCBcIkYyMVwiLCBcIkYyMlwiLCBcIkYyM1wiLCBcIkYyNFwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIk5VTV9MT0NLXCIsIFwiU0NST0xMX0xPQ0tcIiwgXCJXSU5fT0VNX0ZKX0pJU0hPXCIsIFwiV0lOX09FTV9GSl9NQVNTSE9VXCIsIFwiV0lOX09FTV9GSl9UT1VST0tVXCIsIFwiV0lOX09FTV9GSl9MT1lBXCIsIFwiV0lOX09FTV9GSl9ST1lBXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiXCIsIFwiQ0lSQ1VNRkxFWFwiLCBcIkVYQ0xBTUFUSU9OXCIsIFwiRE9VQkxFX1FVT1RFXCIsIFwiSEFTSFwiLCBcIkRPTExBUlwiLCBcIlBFUkNFTlRcIiwgXCJBTVBFUlNBTkRcIiwgXCJVTkRFUlNDT1JFXCIsIFwiT1BFTl9QQVJFTlwiLCBcIkNMT1NFX1BBUkVOXCIsIFwiQVNURVJJU0tcIiwgXCJQTFVTXCIsIFwiUElQRVwiLCBcIkhZUEhFTl9NSU5VU1wiLCBcIk9QRU5fQ1VSTFlfQlJBQ0tFVFwiLCBcIkNMT1NFX0NVUkxZX0JSQUNLRVRcIiwgXCJUSUxERVwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlZPTFVNRV9NVVRFXCIsIFwiVk9MVU1FX0RPV05cIiwgXCJWT0xVTUVfVVBcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJcIiwgXCJDT01NQVwiLCBcIlwiLCBcIlBFUklPRFwiLCBcIlNMQVNIXCIsIFwiQkFDS19RVU9URVwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIlwiLCBcIk9QRU5fQlJBQ0tFVFwiLCBcIkJBQ0tfU0xBU0hcIiwgXCJDTE9TRV9CUkFDS0VUXCIsIFwiUVVPVEVcIiwgXCJcIiwgXCJNRVRBXCIsIFwiQUxUR1JcIiwgXCJcIiwgXCJXSU5fSUNPX0hFTFBcIiwgXCJXSU5fSUNPXzAwXCIsIFwiXCIsIFwiV0lOX0lDT19DTEVBUlwiLCBcIlwiLCBcIlwiLCBcIldJTl9PRU1fUkVTRVRcIiwgXCJXSU5fT0VNX0pVTVBcIiwgXCJXSU5fT0VNX1BBMVwiLCBcIldJTl9PRU1fUEEyXCIsIFwiV0lOX09FTV9QQTNcIiwgXCJXSU5fT0VNX1dTQ1RSTFwiLCBcIldJTl9PRU1fQ1VTRUxcIiwgXCJXSU5fT0VNX0FUVE5cIiwgXCJXSU5fT0VNX0ZJTklTSFwiLCBcIldJTl9PRU1fQ09QWVwiLCBcIldJTl9PRU1fQVVUT1wiLCBcIldJTl9PRU1fRU5MV1wiLCBcIldJTl9PRU1fQkFDS1RBQlwiLCBcIkFUVE5cIiwgXCJDUlNFTFwiLCBcIkVYU0VMXCIsIFwiRVJFT0ZcIiwgXCJQTEFZXCIsIFwiWk9PTVwiLCBcIlwiLCBcIlBBMVwiLCBcIldJTl9PRU1fQ0xFQVJcIiwgXCJcIl07XG4gIGxvZ29VcmwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldERlc2t0b3BcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJuIGFuIG9iamVjdCBvZiBkZXNrdG9wLlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBkZXNrdG9wLlxuICAgKi9cbiAgZ2V0RGVza3RvcCA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy5kZXNrdG9wO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldE9wdGlvbnNcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUmV0dXJuIGFuIG9iamVjdCBvZiBkZXNrdG9wIG9wdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IG9wdGlvbnMuXG4gICAqL1xuICBnZXRPcHRpb25zID0gKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnM7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0V2luZG93c1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBSZXR1cm4gYW4gYXJyYXkgb2Ygd2luZG93cy5cbiAgICpcbiAgICogQHJldHVybnMge2FycmF5fSB3aW5kb3dzLlxuICAgKi9cbiAgZ2V0V2luZG93cyA9ICgpID0+IHtcbiAgICByZXR1cm4gdGhpcy53aW5kb3dzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldE5leHRNYXhaSW5kZXhcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgd2luZG93IG9iamVjdHMgaW4gdGhlIHdpbmRvd3MgYXJyYXkgdG8gZmluZCB0aGUgbWF4IHotaW5kZXhcbiAgICogYW5kIGluY3JlYXNlcyB0aGUgdmFsdWUgZm91bmQgYnkgMS5cbiAgICpcbiAgICogQHJldHVybnMge2ludH1cbiAgICovXG4gIGdldE5leHRNYXhaSW5kZXggPSAoKSA9PiB7XG4gICAgdmFyIG1heCA9IDA7XG4gICAgdmFyIHRtcDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy53aW5kb3dzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB0bXAgPSB0aGlzLndpbmRvd3NbaV0uekluZGV4O1xuICAgICAgaWYgKHRtcCA+IG1heCkgbWF4ID0gdG1wO1xuICAgIH1cbiAgICByZXR1cm4gKyttYXg7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuY2xlYXJBY3RpdmVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSXRlcmF0ZXMgdGhyb3VnaCBhbGwgd2luZG93IG9iamVjdHMgaW4gdGhlIHdpbmRvd3NcbiAgICogYW5kIHNldHMgdGhlIGFjdGl2ZSBwcm9wZXJ0eSB0byBmYWxzZS5cbiAgICpcbiAgICovXG4gIGNsZWFyQWN0aXZlID0gKCkgPT4ge1xuICAgIHRoaXMud2luZG93cy5mb3JFYWNoKCh3aW5kb3c6IGFueSkgPT4ge1xuICAgICAgd2luZG93LmFjdGl2ZSA9IGZhbHNlO1xuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmdldEFjdGl2ZVdpbmRvd1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBHZXRzIHRoZSBhY3RpdmUgd2luZG93LlxuICAgKlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSB2aWV3IG9iamVjdC5cbiAgICovXG4gIGdldEFjdGl2ZVdpbmRvdyA9ICgpOiBhbnkgPT4ge1xuICAgIHZhciBhY3RpdmVXaW5kb3cgPSBudWxsO1xuICAgIHRoaXMud2luZG93cy5mb3JFYWNoKCh3ZHc6IGFueSkgPT4ge1xuICAgICAgaWYgKHdkdy5hY3RpdmUgPT09IHRydWUpIHtcbiAgICAgICAgYWN0aXZlV2luZG93ID0gd2R3O1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhY3RpdmVXaW5kb3c7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuZ2V0QWN0aXZlVmlld1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBHZXRzIHRoZSBhY3RpdmUgdmlldy5cbiAgICpcbiAgICogQHJldHVybnMge29iamVjdH0gdmlldyBvYmplY3QuXG4gICAqL1xuICBnZXRBY3RpdmVWaWV3ID0gKHdkdzogYW55KSA9PiB7XG4gICAgdmFyIGFjdGl2ZVZpZXcgPSBudWxsO1xuICAgIHdkdy52aWV3cy5mb3JFYWNoKCh2aWV3OiBhbnkpID0+IHtcbiAgICAgIGlmICh2aWV3LmFjdGl2ZSQuZ2V0VmFsdWUoKSA9PT0gdHJ1ZSkge1xuICAgICAgICBhY3RpdmVWaWV3ID0gdmlldztcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gYWN0aXZlVmlldztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5hbGxXaW5kb3dzQXJlTWluaW1pemVkXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEl0ZXJhdGVzIHRocm91Z2ggd2luZG93cyB0byBkZXRlcm1pbmUgaWYgYWxsIGFyZSBtaW5pbWl6ZWQuXG4gICAqXG4gICAqL1xuICBhbGxXaW5kb3dzQXJlTWluaW1pemVkID0gKCkgPT4ge1xuICAgIHZhciBhbGxNaW5pbWl6ZWQgPSB0cnVlO1xuICAgIHRoaXMud2luZG93cy5mb3JFYWNoKCh3aW5kb3c6IGFueSkgPT4ge1xuICAgICAgaWYgKCF3aW5kb3cubWluaW1pemVkKSB7XG4gICAgICAgIGFsbE1pbmltaXplZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbGxNaW5pbWl6ZWQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuaGlkZVNob3dBbGxcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSGlkZXMvc2hvd3MgYWxsIHdpbmRvd3NcbiAgICpcbiAgICovXG4gIGhpZGVTaG93QWxsID0gKCkgPT4ge1xuICAgIHRoaXMubWluaW1pemVBbGwgPSB0aGlzLmFsbFdpbmRvd3NBcmVNaW5pbWl6ZWQoKSA/IGZhbHNlIDogIXRoaXMubWluaW1pemVBbGw7XG4gICAgdGhpcy53aW5kb3dzLmZvckVhY2goKHdkdzogYW55KSA9PiB7XG4gICAgICBpZiAod2R3Lm91dE9mQm91bmRzKSB0aGlzLnJlY292ZXIod2R3KTtcbiAgICAgIHdkdy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgIHdkdy5taW5pbWl6ZWQgPSB0aGlzLm1pbmltaXplQWxsO1xuICAgIH0pO1xuICAgIHRoaXMuYWN0aXZhdGVGb3JlbW9zdFdpbmRvdygpO1xuICAgIHJldHVybiB0aGlzLm1pbmltaXplQWxsO1xuICB9O1xuXG4gIC8qKlxyXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXHJcbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5maW5kV2luZG93Vmlld0RpcmVjdGl2ZVxyXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcclxuICAgKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIExvb2tzIGZvciBwcmV2aW91c2x5IG9wZW4gd2luZG93IHdpdGggYSB2aWV3IGRpcmVjdGl2ZVxyXG4gICAqXHJcbiAgICovXHJcbiAgZmluZFdpbmRvd1ZpZXdEaXJlY3RpdmUgPSAod2luZG93Vmlld0RpcmVjdGl2ZTogYW55KSA9PiB7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMud2luZG93cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMud2luZG93c1tpXS52aWV3cy5sZW5ndGg7IGorKykge1xyXG4gICAgICAgIGlmICh0aGlzLndpbmRvd3NbaV0udmlld3NbMF0udmlld0RpcmVjdGl2ZSA9PT0gd2luZG93Vmlld0RpcmVjdGl2ZSlcclxuICAgICAgICAgIHJldHVybiB0aGlzLndpbmRvd3NbaV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQub3BlbldpbmRvd1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNwbGF5cyBhIG5ldyB3aW5kb3cuIEFsbCB3aW5kb3cgcHJvcGVydGllcyBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgd2lsbCBiZVxuICAgKiBvdmVybGFpZCBoZXJlIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSB3aW5kb3dcbiAgICpcbiAgICovXG4gIG9wZW5XaW5kb3cgPSAod2luZG93Q29uZmlnT3ZlcmxheXM6IGFueSwgc2luZ2xlSW5zdGFuY2U6IGFueSkgPT4ge1xuICAgIGxldCBhY3RpdmVXaW5kb3cgPSB0aGlzLmdldEFjdGl2ZVdpbmRvdygpO1xyXG4gICAgaWYgKGFjdGl2ZVdpbmRvdyAmJiBhY3RpdmVXaW5kb3cuaXNNb2RhbCkge1xyXG4gICAgICBhY3RpdmVXaW5kb3cuaW52YWxpZE9wZXJhdGlvbiA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2luZ2xlSW5zdGFuY2UpIHtcclxuICAgICAgbGV0IHdpbmRvdyA9IHRoaXMuZmluZFdpbmRvd1ZpZXdEaXJlY3RpdmUod2luZG93Q29uZmlnT3ZlcmxheXMudmlld3NbMF0udmlld0RpcmVjdGl2ZSk7XHJcbiAgICAgIGlmICh3aW5kb3cpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVdpbmRvd1N0YXRlKHdpbmRvdyk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvd0NvbmZpZ092ZXJsYXlzLmlzTW9kYWwpIHtcclxuICAgICAgbGV0IGhlaWdodE9mZnNldCA9IChwYXJzZUludCh3aW5kb3dDb25maWdPdmVybGF5cy5oZWlnaHQsIDEwKSAvIDIpICsgMzA7XHJcbiAgICAgIGxldCB3aWR0aE9mZnNldCA9IChwYXJzZUludCh3aW5kb3dDb25maWdPdmVybGF5cy53aWR0aCwgMTApIC8gMik7XHJcbiAgICAgIHdpbmRvd0NvbmZpZ092ZXJsYXlzLnRvcCA9ICdjYWxjKDUwJSAtICcgKyBoZWlnaHRPZmZzZXQgKyAncHggKSc7XHJcbiAgICAgIHdpbmRvd0NvbmZpZ092ZXJsYXlzLmxlZnQgPSAnY2FsYyg1MCUgLSAnICsgd2lkdGhPZmZzZXQgKyAncHggKSc7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xyXG4gICAgbGV0IGNvbmZpZ3VyZWRXaW5kb3cgPSB0aGlzLmNvbmZpZ3VyZVdpbmRvdyh3aW5kb3dDb25maWdPdmVybGF5cyk7XHJcbiAgICBjb25maWd1cmVkV2luZG93LnZpZXdzID0gdGhpcy5jb25maWd1cmVWaWV3cyh3aW5kb3dDb25maWdPdmVybGF5cywgY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICBpZiAoIWNvbmZpZ3VyZWRXaW5kb3cuaXNNb2RhbCkge1xyXG4gICAgICBjb25maWd1cmVkV2luZG93LmNhc2NhZGVXaW5kb3cgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zYXZlUG9zaXRpb24oY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICAgIHRoaXMubWF4aW1pemUoY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICAgIHRoaXMud2luZG93cy5wdXNoKGNvbmZpZ3VyZWRXaW5kb3cpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53aW5kb3dzLnB1c2goY29uZmlndXJlZFdpbmRvdyk7XHJcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuY29uZmlndXJlV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIENyZWF0ZXMgYSBuZXcgd2luZG93IGluc3RhbmNlLlxuICAgKlxuICAgKi9cbiAgY29uZmlndXJlV2luZG93ID0gKHdpbmRvd0NvbmZpZ092ZXJsYXlzOiBhbnkpID0+IHtcbiAgICB2YXIgd2luZG93Q29uZmlnSW5zdGFuY2UgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlc2t0b3Aud2luZG93Q29uZmlnKTtcbiAgICB3aW5kb3dDb25maWdJbnN0YW5jZS5zYXZlZFBvc2l0aW9uID0gT2JqZWN0LmNyZWF0ZSh7IHRvcDogMCwgbGVmdDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgaGVpZ2h0OiAwLCB3aWR0aDogMCB9KTtcbiAgICB3aW5kb3dDb25maWdJbnN0YW5jZS56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgICAvL3dpbmRvd0NvbmZpZ0luc3RhbmNlLmdsb2JhbHMgPSBPYmplY3QuYXNzaWduKHt9LCAkcm9vdFNjb3BlLiRldmFsKHRoaXMub3B0aW9ucy5nbG9iYWxzKSk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24od2luZG93Q29uZmlnSW5zdGFuY2UsIHdpbmRvd0NvbmZpZ092ZXJsYXlzKTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5jb25maWd1cmVWaWV3c1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBDcmVhdGVzIG9uZSBvciBtb3JlIHZpZXcgaW5zdGFuY2VzXG4gICAqXG4gICAqL1xuICBjb25maWd1cmVWaWV3cyA9ICh3aW5kb3dDb25maWdPdmVybGF5czogYW55LCBjb25maWd1cmVkV2luZG93OiBhbnkpOiBBcnJheTxhbnk+ID0+IHtcbiAgICBsZXQgY29uZmlndXJlZFZpZXdzOiBBcnJheTxhbnk+ID0gW107XG4gICAgd2luZG93Q29uZmlnT3ZlcmxheXMudmlld3MuZm9yRWFjaCgodmlldzogYW55KSA9PiB7XG4gICAgICBsZXQgY29uZmlndXJlZFZpZXcgPSBuZXcgVHJ1RGVza3RvcFZpZXdDb25maWcoKTtcclxuICAgICAgY29uZmlndXJlZFZpZXcuY29tcG9uZW50TmFtZSA9IHZpZXcuY29tcG9uZW50TmFtZTtcclxuICAgICAgY29uZmlndXJlZFZpZXcuZW50aXRpZXMgPSB2aWV3LmVudGl0aWVzO1xyXG4gICAgICBjb25maWd1cmVkVmlldy5lbnRpdHlJbmRleCA9IHZpZXcuZW50aXR5SW5kZXg7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3LmlzRGlydHkgPSB2aWV3LmlzRGlydHk7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3LmlzRWRpdGluZyA9IHZpZXcuaXNFZGl0aW5nO1xyXG4gICAgICBjb25maWd1cmVkVmlldy5pc0ludmFsaWQgPSB2aWV3LmlzVmFsaWQ7XHJcbiAgICAgIGNvbmZpZ3VyZWRWaWV3Lm9wZW5Bc0RldGFpVmlldyA9IHZpZXcub3BlbkFzRGV0YWlsVmlldztcbiAgICAgIC8vdmlld0NvbmZpZ0luc3RhbmNlLmdsb2JhbHMgPSB0aGlzLm9wdGlvbnMuZ2xvYmFscztcbiAgICAgIC8vbGV0IGNvbmZpZ3VyZWRWaWV3ID0gT2JqZWN0LmFzc2lnbih2aWV3Q29uZmlnSW5zdGFuY2UsIHZpZXcpO1xuICAgICAgY29uZmlndXJlZFZpZXcud2luZG93ID0gY29uZmlndXJlZFdpbmRvdztcbiAgICAgIGNvbmZpZ3VyZWRWaWV3cy5wdXNoKGNvbmZpZ3VyZWRWaWV3KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29uZmlndXJlZFZpZXdzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmNsb3NlV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFJlbW92ZSBhIHdpbmRvdyB7b2JqZWN0fSBmcm9tIHRoZSB3aW5kb3dzIGFycmF5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gcmV0dXJucyB0cnVlIGlmIHdpbmRvdyB3YXMgY2xvc2VkLCBmYWxzZSBpZiBub3QgY2xvc2VkLlxuICAgKi9cbiAgY2xvc2VXaW5kb3cgPSAod2R3OiBhbnkpID0+IHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0RpcnR5Q2xvc2UgJiYgd2R3LmlzRGlydHkpIHtcbiAgICAgIGFsZXJ0KFwiVW5zYXZlZCBDaGFuZ2VzLiBTYXZlIGNoYW5nZXMgYmVmb3JlIGNsb3Npbmcgd2luZG93LlwiKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy5hbGxvd0ludmFsaWRDbG9zZSAmJiB3ZHcuaXNJbnZhbGlkKSB7XG4gICAgICBhbGVydChcIkRhdGEgaXMgaW52YWxpZC4gQ29ycmVjdCBJbnZhbGlkIGRhdGEgYmVmb3JlIGNsb3Npbmcgd2luZG93LlwiKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5vcHRpb25zLmNhbkNsb3NlRm4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5jYW5DbG9zZUZuKHdkdykpIHtcbiAgICAgICAgdGhpcy53aW5kb3dzLnNwbGljZSh0aGlzLndpbmRvd3MuaW5kZXhPZih3ZHcpLCAxKTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy53aW5kb3dzLnNwbGljZSh0aGlzLndpbmRvd3MuaW5kZXhPZih3ZHcpLCAxKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVGb3JlbW9zdFdpbmRvdygpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5hY3RpdmF0ZUZvcmVtb3N0V2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldCB0aGUgZm9yZW1vc3Qgd2luZG93IHRvIGFuIGFjdGl2ZSBzdGF0ZVxuICAgKlxuICAgKi9cbiAgYWN0aXZhdGVGb3JlbW9zdFdpbmRvdyA9ICgpID0+IHtcbiAgICB2YXIgZm9yZW1vc3QgPSB1bmRlZmluZWQ7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLndpbmRvd3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICgoZm9yZW1vc3QgPT09IHVuZGVmaW5lZCB8fCB0aGlzLndpbmRvd3NbaV0uekluZGV4ID4gZm9yZW1vc3QuekluZGV4KSAmJiAhdGhpcy53aW5kb3dzW2ldLm1pbmltaXplZCAmJiAhdGhpcy53aW5kb3dzW2ldLm91dE9mQm91bmRzKVxuICAgICAgICBmb3JlbW9zdCA9IHRoaXMud2luZG93c1tpXTtcbiAgICB9XG4gICAgaWYgKGZvcmVtb3N0KVxuICAgICAgZm9yZW1vc3QuYWN0aXZlID0gdHJ1ZTtcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5hY3RpdmF0ZU5leHRXaW5kb3dcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0IHRoZSBuZXh0IHdpbmRvdyB0byBhbiBhY3RpdmUgc3RhdGVcbiAgICpcbiAgICovXG4gIGFjdGl2YXRlTmV4dFdpbmRvdyA9IChhY3RpdmVXaW5kb3dMb2NhdGlvbjogYW55KSA9PiB7XG4gICAgaWYgKHRoaXMud2luZG93cy5sZW5ndGggPD0gMSkgcmV0dXJuO1xuICAgIHZhciBiYWNrZW5kID0gdGhpcy53aW5kb3dzLnNsaWNlKGFjdGl2ZVdpbmRvd0xvY2F0aW9uKTtcbiAgICB2YXIgZnJvbnRlbmQgPSB0aGlzLndpbmRvd3Muc2xpY2UoMCwgYWN0aXZlV2luZG93TG9jYXRpb24gLSAxKTtcbiAgICB2YXIgc29ydGVkID0gYmFja2VuZC5jb25jYXQoZnJvbnRlbmQpO1xuICAgIHZhciBuZXh0V2luZG93ID0gdW5kZWZpbmVkO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXNvcnRlZFtpXS5taW5pbWl6ZWQgJiYgIXNvcnRlZFtpXS5vdXRPZkJvdW5kcyAmJiAhbmV4dFdpbmRvdylcbiAgICAgICAgbmV4dFdpbmRvdyA9IHNvcnRlZFtpXTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFdpbmRvdykge1xuICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgbmV4dFdpbmRvdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgICAgIG5leHRXaW5kb3cuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuYWN0aXZhdGVQcmV2aW91c1dpbmRvd1xuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXQgdGhlIHByZXZpb3VzIHdpbmRvdyB0byBhbiBhY3RpdmUgc3RhdGVcbiAgICpcbiAgICovXG4gIGFjdGl2YXRlUHJldmlvdXNXaW5kb3cgPSAoYWN0aXZlV2luZG93TG9jYXRpb246IGFueSkgPT4ge1xuICAgIGlmICh0aGlzLndpbmRvd3MubGVuZ3RoIDw9IDEpIHJldHVybjtcbiAgICB2YXIgYmFja2VuZCA9IHRoaXMud2luZG93cy5zbGljZShhY3RpdmVXaW5kb3dMb2NhdGlvbik7XG4gICAgdmFyIGZyb250ZW5kID0gdGhpcy53aW5kb3dzLnNsaWNlKDAsIGFjdGl2ZVdpbmRvd0xvY2F0aW9uIC0gMSk7XG4gICAgdmFyIHNvcnRlZCA9IGJhY2tlbmQuY29uY2F0KGZyb250ZW5kKTtcbiAgICB2YXIgbmV4dFdpbmRvdyA9IHVuZGVmaW5lZDtcbiAgICBmb3IgKHZhciBpID0gc29ydGVkLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXNvcnRlZFtpXS5taW5pbWl6ZWQgJiYgIXNvcnRlZFtpXS5vdXRPZkJvdW5kcyAmJiAhbmV4dFdpbmRvdylcbiAgICAgICAgbmV4dFdpbmRvdyA9IHNvcnRlZFtpXTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFdpbmRvdykge1xuICAgICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgICAgbmV4dFdpbmRvdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcbiAgICAgIG5leHRXaW5kb3cuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQubWluaW1pemVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVmlzdWFsbHkgcmVtb3ZlcyB3aW5kb3cgZnJvbSB0aGUgdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICBtaW5pbWl6ZSA9ICh3aW5kb3c6IGFueSkgPT4ge1xuICAgIHRoaXMuc2F2ZVBvc2l0aW9uKHdpbmRvdyk7XG5cbiAgICB3aW5kb3cuYWN0aXZlID0gZmFsc2U7XG4gICAgd2luZG93Lm1pbmltaXplZCA9IHRydWU7XG4gICAgdGhpcy5hY3RpdmF0ZUZvcmVtb3N0V2luZG93KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQubWF4aW1pemVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUG9zaXRpb25zIHdpbmRvdyBzdWNoIHRoYXQgaXQgZmlsbHMgdGhlIHdob2xlIHZpZXdwb3J0LlxuICAgKlxuICAgKi9cbiAgbWF4aW1pemUgPSAod2luZG93OiBhbnkpID0+IHtcbiAgICB3aW5kb3cudG9wID0gMDtcbiAgICB3aW5kb3cubGVmdCA9IDA7XG4gICAgd2luZG93LnJpZ2h0ID0gMDtcbiAgICB3aW5kb3cuYm90dG9tID0gMDtcbiAgICB3aW5kb3cuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHdpbmRvdy53aWR0aCA9ICcxMDAlJztcbiAgICB3aW5kb3cubWF4aW1pemVkID0gJ2ZpbGwnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50Lm1heGltaXplTGVmdFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBQb3NpdGlvbnMgd2luZG93IHN1Y2ggdGhhdCBpdCBmaWxscyB0aGUgbGVmdCBwb3J0aW9uIHZpZXdwb3J0LlxuICAgKlxuICAgKi9cbiAgbWF4aW1pemVMZWZ0ID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgd2luZG93LnNwbGl0ID0gdHJ1ZTtcbiAgICB3aW5kb3cudG9wID0gMDtcbiAgICB3aW5kb3cubGVmdCA9IDA7XG4gICAgd2luZG93LmJvdHRvbSA9IDA7XG4gICAgd2luZG93LndpZHRoID0gJzUwJSc7XG4gICAgd2luZG93LmhlaWdodCA9ICdhdXRvJztcbiAgICB3aW5kb3cubWF4aW1pemVkID0gJ2xlZnQnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50Lm1heGltaXplUmlnaHRcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUG9zaXRpb25zIHdpbmRvdyBzdWNoIHRoYXQgaXQgZmlsbHMgdGhlIHJpZ2h0IHBvcnRpb24gdmlld3BvcnQuXG4gICAqXG4gICAqL1xuICBtYXhpbWl6ZVJpZ2h0ID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgd2luZG93LnRvcCA9IDA7XG4gICAgd2luZG93LmxlZnQgPSAnNTAlJztcbiAgICB3aW5kb3cucmlnaHQgPSAwO1xuICAgIHdpbmRvdy5ib3R0b20gPSAwO1xuICAgIHdpbmRvdy53aWR0aCA9ICc1MCUnO1xuICAgIHdpbmRvdy5oZWlnaHQgPSAnYXV0byc7XG4gICAgd2luZG93Lm1heGltaXplZCA9ICdyaWdodCc7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQucmVjb3ZlclxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBCcmluZ3Mgd2luZG93IGJhY2sgaW50byB2aWV3IHdoZW4gaXQgaGFzIGVzY2FwZWQgdGhlIHZpZXdwb3J0LlxuICAgKlxuICAgKi9cbiAgcmVjb3ZlciA9ICh3aW5kb3c6IGFueSkgPT4ge1xuICAgIHdpbmRvdy5hY3RpdmUgPSB0cnVlO1xuICAgIHdpbmRvdy5vdXRPZkJvdW5kcyA9IGZhbHNlO1xuICAgIHdpbmRvdy5taW5pbWl6ZWQgPSBmYWxzZTtcbiAgICB3aW5kb3cuekluZGV4ID0gdGhpcy5nZXROZXh0TWF4WkluZGV4KCk7XG4gICAgdGhpcy5jYXNjYWRlV2luZG93KHdpbmRvdyk7XG4gICAgdGhpcy5jbGVhckFjdGl2ZSgpO1xuICAgIHRoaXMuYWN0aXZhdGVGb3JlbW9zdFdpbmRvdygpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LnJlc3RvcmVcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICpcbiAgICovXG4gIHJlc3RvcmUgPSAod2R3OiBhbnkpID0+IHtcbiAgICBpZiAod2R3Lm1heGltaXplZCA9PT0gJ2ZpbGwnKSB7XG4gICAgICB0aGlzLm1heGltaXplKHdkdyk7XG4gICAgfSBlbHNlIGlmICh3ZHcubWF4aW1pemVkID09PSAnbGVmdCcpIHtcbiAgICAgIHRoaXMubWF4aW1pemVMZWZ0KHdkdyk7XG4gICAgfSBlbHNlIGlmICh3ZHcubWF4aW1pemVkID09PSAncmlnaHQnKSB7XG4gICAgICB0aGlzLm1heGltaXplUmlnaHQod2R3KTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVXaW5kb3dTdGF0ZSh3ZHcpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmJyaW5nVG9Gcm9udFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKi9cbiAgdXBkYXRlV2luZG93U3RhdGUgPSAod2R3OiBhbnkpID0+IHtcclxuICAgIGlmICh3ZHcub3V0T2ZCb3VuZHMpIHtcclxuICAgICAgdGhpcy5yZWNvdmVyKHdkdyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2R3Lm1heGltaXplZCA9PT0gJ2ZpbGwnKSB7XHJcbiAgICAgIHRoaXMubWF4aW1pemUod2R3KTtcclxuICAgIH0gZWxzZSBpZiAod2R3Lm1heGltaXplZCA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIHRoaXMubWF4aW1pemVMZWZ0KHdkdyk7XHJcbiAgICB9IGVsc2UgaWYgKHdkdy5tYXhpbWl6ZWQgPT09ICdyaWdodCcpIHtcclxuICAgICAgdGhpcy5tYXhpbWl6ZVJpZ2h0KHdkdyk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyQWN0aXZlKCk7XHJcbiAgICB3ZHcuYWN0aXZlID0gdHJ1ZTtcclxuICAgIHdkdy5taW5pbWl6ZWQgPSBmYWxzZTtcclxuICAgIHdkdy56SW5kZXggPSB0aGlzLmdldE5leHRNYXhaSW5kZXgoKTtcclxuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LnJlc3RvcmVTYXZlZFBvc2l0aW9uXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldCB0aGUgd2luZG93cyBsYXN0IGtub3cgcG9zaXRpb24gdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uXG4gICAqXG4gICAqL1xuICByZXN0b3JlU2F2ZWRQb3NpdGlvbiA9ICh3ZHc6IGFueSkgPT4ge1xuICAgIHRoaXMuY2xlYXJBY3RpdmUoKTtcbiAgICB3ZHcudG9wID0gd2R3LnNhdmVkUG9zaXRpb24udG9wO1xuICAgIHdkdy5sZWZ0ID0gd2R3LnNhdmVkUG9zaXRpb24ubGVmdDtcbiAgICB3ZHcucmlnaHQgPSB3ZHcuc2F2ZWRQb3NpdGlvbi5yaWdodDtcbiAgICB3ZHcuYm90dG9tID0gd2R3LnNhdmVkUG9zaXRpb24uYm90dG9tO1xuICAgIHdkdy5oZWlnaHQgPSB3ZHcuc2F2ZWRQb3NpdGlvbi5oZWlnaHQ7XG4gICAgd2R3LndpZHRoID0gd2R3LnNhdmVkUG9zaXRpb24ud2lkdGg7XG4gICAgd2R3Lm1heGltaXplZCA9IHVuZGVmaW5lZDtcbiAgICB3ZHcubWluaW1pemVkID0gdW5kZWZpbmVkO1xuICAgIHdkdy5hY3RpdmUgPSB0cnVlO1xuICAgIHdkdy5taW5pbWl6ZWQgPSBmYWxzZTtcbiAgICB3ZHcuekluZGV4ID0gdGhpcy5nZXROZXh0TWF4WkluZGV4KCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEB0cnUuZG9jIGZ1bmN0aW9uXG4gICAqIEBuYW1lIHRydURlc2t0b3BDb21wb25lbnQuc2F2ZVBvc2l0aW9uXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNhdmUgdGhlIHdpbmRvd3MgbGFzdCBrbm93IHBvc2l0aW9uLlxuICAgKlxuICAgKi9cbiAgc2F2ZVBvc2l0aW9uID0gKHdkdzogYW55KSA9PiB7XG4gICAgd2R3LnNhdmVkUG9zaXRpb24udG9wID0gd2R3LnRvcDtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi5sZWZ0ID0gd2R3LmxlZnQ7XG4gICAgd2R3LnNhdmVkUG9zaXRpb24ucmlnaHQgPSB3ZHcucmlnaHQ7XG4gICAgd2R3LnNhdmVkUG9zaXRpb24uYm90dG9tID0gd2R3LmJvdHRvbTtcbiAgICB3ZHcuc2F2ZWRQb3NpdGlvbi5oZWlnaHQgPSB3ZHcuaGVpZ2h0O1xuICAgIHdkdy5zYXZlZFBvc2l0aW9uLndpZHRoID0gd2R3LndpZHRoO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmNsb3NlV2luZG93XG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE1vdmVzIGEgd2luZG93IHRvIHRoZSBuZXh0IGNhc2NhZGUgcG9zaXRpb24uXG4gICAqXG4gICAqL1xuICBjYXNjYWRlV2luZG93ID0gKHdpbmRvdzogYW55KSA9PiB7XG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlV2luZG93Q2FzY2FkaW5nIHx8IHdpbmRvdy5pc01vZGFsKSByZXR1cm47XG4gICAgdGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLnRvcCArPSAxMDtcbiAgICB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24ubGVmdCArPSAxMDtcbiAgICBpZiAodGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLnRvcCA+IHRoaXMubWF4V2luZG93Q2FzY2FkZVBvc2l0aW9uKVxuICAgICAgdGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLnRvcCA9IHRoaXMubWluV2luZG93Q2FzY2FkZVBvc2l0aW9uO1xuICAgIGlmICh0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24ubGVmdCA+IHRoaXMubWF4V2luZG93Q2FzY2FkZVBvc2l0aW9uKVxuICAgICAgdGhpcy5sYXN0V2luZG93Q2FzY2FkZVBvc2l0aW9uLmxlZnQgPSB0aGlzLm1pbldpbmRvd0Nhc2NhZGVQb3NpdGlvbjtcblxuICAgIHdpbmRvdy50b3AgPSB0aGlzLmxhc3RXaW5kb3dDYXNjYWRlUG9zaXRpb24udG9wICsgJ3B4JztcbiAgICB3aW5kb3cubGVmdCA9IHRoaXMubGFzdFdpbmRvd0Nhc2NhZGVQb3NpdGlvbi5sZWZ0ICsgJ3B4JztcbiAgfTtcblxuICAvKipcbiAgICogQHRydS5kb2MgZnVuY3Rpb25cbiAgICogQG5hbWUgdHJ1RGVza3RvcENvbXBvbmVudC5nZXRLZXlDb2RlXG4gICAqIEBtb2R1bGUgdHJ1LmRlc2t0b3BcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqXG4gICAqL1xuICBnZXRLZXlTZXF1ZW5jZSA9IChldmVudDogYW55KSA9PiB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIGtleXMucHVzaCgnc2hpZnQnKTtcbiAgICBpZiAoZXZlbnQuY3RybEtleSkga2V5cy5wdXNoKCdjdHJsJyk7XG4gICAgaWYgKGV2ZW50LmFsdEtleSkga2V5cy5wdXNoKCdhbHQnKTtcbiAgICBpZiAoZXZlbnQubWV0YUtleSkga2V5cy5wdXNoKCdtZXRhJyk7XG5cbiAgICB2YXIga2V5Q29kZSA9IGV2ZW50LmtleUNvZGUgfHwgZXZlbnQud2hpY2g7XG4gICAgaWYgKGtleUNvZGUpIGtleXMucHVzaCh0aGlzLmtleWJvYXJkTWFwW2tleUNvZGVdLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgcmV0dXJuIGtleXMuam9pbignKycpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBldmVudFxuICAgKiBAbW9kdWxlIHRydS5kZXNrdG9wXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKlxuICAgKi9cbiAgb25LZXlEb3duID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICB2YXIga2V5U2VxdWVuY2UgPSB0aGlzLmdldEtleVNlcXVlbmNlKGV2ZW50KTtcbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdhbHQrbScpIHsgLy9NYXhpbWl6ZVxuICAgICAgdmFyIGFjdGl2ZVdpbmRvdyA9IHRoaXMuZ2V0QWN0aXZlV2luZG93KCk7XG4gICAgICBpZiAoYWN0aXZlV2luZG93ID09PSBudWxsKSByZXR1cm47XG4gICAgICBpZiAoIWFjdGl2ZVdpbmRvdy5tYXhpbWl6ZWQpIHtcbiAgICAgICAgdGhpcy5zYXZlUG9zaXRpb24oYWN0aXZlV2luZG93KTtcbiAgICAgICAgdGhpcy5tYXhpbWl6ZShhY3RpdmVXaW5kb3cpO1xuICAgICAgfSBlbHNlIGlmIChhY3RpdmVXaW5kb3cubWF4aW1pemVkID09PSAncmlnaHQnIHx8IGFjdGl2ZVdpbmRvdy5tYXhpbWl6ZWQgPT09ICdsZWZ0JylcbiAgICAgICAgdGhpcy5tYXhpbWl6ZShhY3RpdmVXaW5kb3cpO1xuICAgICAgZWxzZVxuICAgICAgICB0aGlzLnJlc3RvcmVTYXZlZFBvc2l0aW9uKGFjdGl2ZVdpbmRvdyk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdhbHQrbicpIHsgLy9NaW5pbWl6ZVxuICAgICAgdmFyIGFjdGl2ZVdpbmRvdyA9IHRoaXMuZ2V0QWN0aXZlV2luZG93KCk7XG4gICAgICBpZiAoYWN0aXZlV2luZG93ID09PSBudWxsIHx8IGFjdGl2ZVdpbmRvdy5taW5pbWl6ZWQpIHJldHVybjtcbiAgICAgIHRoaXMubWluaW1pemUoYWN0aXZlV2luZG93KTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIGlmIChrZXlTZXF1ZW5jZSA9PT0gJ2FsdCt3JykgeyAvL0N5Y2xlcyBGb3J3YXJkXG4gICAgICB2YXIgaW5kZXggPSB0aGlzLndpbmRvd3MuaW5kZXhPZih0aGlzLmdldEFjdGl2ZVdpbmRvdygpKTtcbiAgICAgIHRoaXMuYWN0aXZhdGVOZXh0V2luZG93KGluZGV4ICsgMSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdzaGlmdCthbHQrdycpIHsgLy9DeWNsZXMgQmFja3dhcmRcbiAgICAgIHZhciBpbmRleCA9IHRoaXMud2luZG93cy5pbmRleE9mKHRoaXMuZ2V0QWN0aXZlV2luZG93KCkpO1xuICAgICAgdGhpcy5hY3RpdmF0ZVByZXZpb3VzV2luZG93KGluZGV4ICsgMSk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoa2V5U2VxdWVuY2UgPT09ICdzaGlmdCthbHQreCcgJiYgISh0aGlzLnNoaWZ0UHJlc3NlZCAmJiB0aGlzLmFsdFByZXNzZWQgJiYgdGhpcy54UHJlc3NlZCkpIHsgLy9DbG9zZVxuICAgICAgdmFyIGFjdGl2ZVdpbmRvdyA9IHRoaXMuZ2V0QWN0aXZlV2luZG93KCk7XG4gICAgICBpZiAoIWFjdGl2ZVdpbmRvdykgcmV0dXJuO1xuICAgICAgdGhpcy5jbG9zZVdpbmRvdyhhY3RpdmVXaW5kb3cpO1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgaWYgKGtleVNlcXVlbmNlID09PSAnYWx0K2QnKSB7IC8vVG9nZ2xlIERlc2t0b3BcbiAgICAgIC8vdGhpcy5kZXNrdG9wU2hvd24gPSB0aGlzLmhpZGVTaG93QWxsKCk7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgIHRoaXMuc2hpZnRQcmVzc2VkID0gdHJ1ZTtcbiAgICBpZiAoZXZlbnQuYWx0S2V5KVxuICAgICAgdGhpcy5hbHRQcmVzc2VkID0gdHJ1ZTtcbiAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gODgpXG4gICAgICB0aGlzLnhQcmVzc2VkID0gdHJ1ZTtcbiAgfVxuXG4gIG9uS2V5VXAgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgIGlmIChldmVudC5zaGlmdEtleSlcbiAgICAgIHRoaXMuc2hpZnRQcmVzc2VkID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50LmFsdEtleSlcbiAgICAgIHRoaXMuYWx0UHJlc3NlZCA9IGZhbHNlO1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSA4OClcbiAgICAgIHRoaXMueFByZXNzZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHJ1LmRvYyBmdW5jdGlvblxuICAgKiBAbmFtZSB0cnVEZXNrdG9wQ29tcG9uZW50LmhhbmRsZVNlbGVjdEF0dGVtcHRcbiAgICogQG1vZHVsZSB0cnUuZGVza3RvcFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogUHJldmVudHMgdGhlIHVzZXIgZnJvbSBoaWdobGlnaHQgZGVza3RvcCBlbGVtZW50cy5cbiAgICpcbiAgICovXG4gIGhhbmRsZVNlbGVjdEF0dGVtcHQgPSAoZTogYW55KSA9PiB7XG4gICAgdmFyIG5vZGVOYW1lID0gZS50YXJnZXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYScgfHwgbm9kZU5hbWUgPT09ICdzZWxlY3QnKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAod2luZG93LmV2ZW50KSB7IGUucHJldmVudERlZmF1bHQoKTsgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgd2luZG93czogQXJyYXk8YW55PiA9IFtdO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2dvVXJsID0gdGhpcy5vcHRpb25zLmxvZ29Vcmw7XHJcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuZGVza3RvcC5vcHRpb25zLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgdGhpcy5vcHRpb25zLnZpZXdwb3J0VG9wID0gdGhpcy5vcHRpb25zLm1lbnViYXJDb25maWcgIT09IHVuZGVmaW5lZCA/IHRoaXMub3B0aW9ucy5tZW51YmFySGVpZ2h0ICsgMSA6IDA7XHJcbiAgICB0aGlzLnRydVdpbmRvd0V2ZW50SGFuZGxlci5vbk9wZW4oKS5zdWJzY3JpYmUoKHdpbmRpb3dFdmVudDogVHJ1V2luZG93RXZlbnRBcmdzKSA9PiB7XHJcbiAgICAgIHRoaXMub3BlbldpbmRvdyh3aW5kaW93RXZlbnQsIGZhbHNlKTtcclxuICAgIH0pO1xyXG4gICAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IHRoaXMuaGFuZGxlU2VsZWN0QXR0ZW1wdDtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgdGhpcy5vbktleVVwKTtcclxuICAgIHdpbmRvdy5vbmJlZm9yZXVubG9hZCA9IChlOiBhbnkpID0+IHtcclxuICAgICAgbGV0IGhhc0NoYW5nZXMgPSB0aGlzLnZpZXdwb3J0Q29tcG9uZW50LndpbmRvd0NvbXBvbmVudHMuZmlsdGVyKCh3OiBUcnVEZXNrdG9wV2luZG93KSA9PiB7IHJldHVybiB3Lmhhc0NoYW5nZXMoKSA/IHRydWUgOiBmYWxzZTsgfSlcclxuICAgICAgaWYgKGhhc0NoYW5nZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgZSA9IGUgfHwgd2luZG93LmV2ZW50O1xyXG4gICAgICAgIHZhciBtc2cgPSB0aGlzLnRleHRNYW5hZ2VyLm1zZ0NvbmZpcm1FeGl0V2l0aENoYW5nZXNQZW5kaW5nO1xyXG5cclxuICAgICAgICAvLyBGb3IgSUUgYW5kIEZpcmVmb3hcclxuICAgICAgICBpZiAoZSkge1xyXG4gICAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IG1zZztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEZvciBTYWZhcmkgLyBjaHJvbWVcclxuICAgICAgICByZXR1cm4gbXNnO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH07XHJcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXl1cCcsIHRoaXMub25LZXlVcCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJkZXNrdG9wLXdyYXBwZXJcIj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImRlc2t0b3AtbWVudWJhci1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7J2hlaWdodCc6IG9wdGlvbnMubWVudWJhckhlaWdodCArICdweCd9XCI+XHJcbiAgICA8dHJ1LWRlc2t0b3AtbWVudWJhciBbZGVza3RvcEN0cmxdPVwidGhpc1wiPjwvdHJ1LWRlc2t0b3AtbWVudWJhcj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPHRydS1kZXNrdG9wLXZpZXdwb3J0IFt3aW5kb3dzXT1cIndpbmRvd3NcIiBbZGVza3RvcEN0cmxdPVwidGhpc1wiPjwvdHJ1LWRlc2t0b3Atdmlld3BvcnQ+XHJcblxyXG4gIDx0cnUtZGVza3RvcC10YXNrYmFyIFt3aW5kb3dzXT1cIndpbmRvd3NcIiBbZGVza3RvcEN0cmxdPVwidGhpc1wiPjwvdHJ1LWRlc2t0b3AtdGFza2Jhcj5cclxuXHJcbiAgPGltZyBjbGFzcz1cImRlc2t0b3Atdmlld3BvcnQtbG9nb1wiIGRhdGEtbmctc2hvdz1cImxvZ29VcmxcIiBhbHQ9XCJcIj5cclxuPC9kaXY+XHJcbiJdfQ==