@smartbit4all/ng-client 4.2.34 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +12 -12
  2. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +1 -1
  3. package/fesm2022/smartbit4all-ng-client.mjs +521 -501
  4. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  5. package/lib/smart-client/smart-component-api-client.d.ts +2 -2
  6. package/lib/smart-component-layout/smart-component-layout.component.d.ts +1 -1
  7. package/lib/smart-dialog/smartdialog.module.d.ts +2 -1
  8. package/lib/smart-grid/smart-grid.component.d.ts +1 -1
  9. package/lib/smart-grid/smart-grid.module.d.ts +21 -19
  10. package/lib/smart-map/abstract-map.d.ts +1 -1
  11. package/lib/smart-ng-client.module.d.ts +4 -3
  12. package/lib/view-context/smart-view-context.module.d.ts +42 -43
  13. package/package.json +12 -14
  14. package/smartbit4all-ng-client-5.0.1.tgz +0 -0
  15. package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +0 -17
  16. package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +0 -35
  17. package/esm2022/lib/component-factory-service/projects.mjs +0 -6
  18. package/esm2022/lib/session/api/api/api.mjs +0 -4
  19. package/esm2022/lib/session/api/api/session.service.mjs +0 -306
  20. package/esm2022/lib/session/api/configuration.mjs +0 -91
  21. package/esm2022/lib/session/api/encoder.mjs +0 -19
  22. package/esm2022/lib/session/api/index.mjs +0 -3
  23. package/esm2022/lib/session/api/model/accountInfo.mjs +0 -13
  24. package/esm2022/lib/session/api/model/apiError.mjs +0 -13
  25. package/esm2022/lib/session/api/model/authenticationProviderData.mjs +0 -13
  26. package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +0 -2
  27. package/esm2022/lib/session/api/model/models.mjs +0 -9
  28. package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +0 -13
  29. package/esm2022/lib/session/api/model/session.mjs +0 -2
  30. package/esm2022/lib/session/api/model/sessionInfoData.mjs +0 -2
  31. package/esm2022/lib/session/api/model/userActivityLog.mjs +0 -13
  32. package/esm2022/lib/session/api/param.mjs +0 -2
  33. package/esm2022/lib/session/api/variables.mjs +0 -9
  34. package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +0 -225
  35. package/esm2022/lib/session/projects.mjs +0 -10
  36. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +0 -95
  37. package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +0 -46
  38. package/esm2022/lib/session/smart-session-handler.service.mjs +0 -6
  39. package/esm2022/lib/session/smart-session.module.mjs +0 -58
  40. package/esm2022/lib/session/smart-session.service.mjs +0 -230
  41. package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +0 -35
  42. package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +0 -58
  43. package/esm2022/lib/shared/projects.mjs +0 -4
  44. package/esm2022/lib/shared/shared.module.mjs +0 -19
  45. package/esm2022/lib/shared/smart-tooltip.directive.mjs +0 -58
  46. package/esm2022/lib/shared/smarttable.date-pipe.mjs +0 -43
  47. package/esm2022/lib/smart-client/projects.mjs +0 -5
  48. package/esm2022/lib/smart-client/smart-authentication.service.mjs +0 -21
  49. package/esm2022/lib/smart-client/smart-component-api-client.mjs +0 -786
  50. package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +0 -81
  51. package/esm2022/lib/smart-client/smart.component.mjs +0 -84
  52. package/esm2022/lib/smart-client/smart.service.mjs +0 -75
  53. package/esm2022/lib/smart-component-layout/api/api/api.mjs +0 -4
  54. package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +0 -133
  55. package/esm2022/lib/smart-component-layout/api/api.module.mjs +0 -40
  56. package/esm2022/lib/smart-component-layout/api/configuration.mjs +0 -91
  57. package/esm2022/lib/smart-component-layout/api/encoder.mjs +0 -19
  58. package/esm2022/lib/smart-component-layout/api/index.mjs +0 -7
  59. package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +0 -18
  60. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +0 -20
  61. package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +0 -17
  62. package/esm2022/lib/smart-component-layout/api/model/models.mjs +0 -6
  63. package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +0 -2
  64. package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +0 -2
  65. package/esm2022/lib/smart-component-layout/api/param.mjs +0 -2
  66. package/esm2022/lib/smart-component-layout/api/variables.mjs +0 -9
  67. package/esm2022/lib/smart-component-layout/projects.mjs +0 -8
  68. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +0 -111
  69. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +0 -307
  70. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +0 -45
  71. package/esm2022/lib/smart-dialog/projects.mjs +0 -8
  72. package/esm2022/lib/smart-dialog/smartdialog.component.mjs +0 -54
  73. package/esm2022/lib/smart-dialog/smartdialog.model.mjs +0 -16
  74. package/esm2022/lib/smart-dialog/smartdialog.module.mjs +0 -46
  75. package/esm2022/lib/smart-dialog/smartdialog.service.mjs +0 -90
  76. package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +0 -96
  77. package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +0 -12
  78. package/esm2022/lib/smart-expandable-section/projects.mjs +0 -8
  79. package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +0 -53
  80. package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +0 -14
  81. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +0 -17
  82. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +0 -2
  83. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +0 -8
  84. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +0 -2
  85. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +0 -2
  86. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +0 -20
  87. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +0 -2
  88. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +0 -2
  89. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +0 -28
  90. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +0 -2
  91. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +0 -2
  92. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +0 -32
  93. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +0 -18
  94. package/esm2022/lib/smart-filter/api/filter/model/model.mjs +0 -16
  95. package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +0 -2
  96. package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +0 -13
  97. package/esm2022/lib/smart-filter/api/value/model/value.mjs +0 -13
  98. package/esm2022/lib/smart-filter/projects.mjs +0 -9
  99. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +0 -14
  100. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +0 -165
  101. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +0 -45
  102. package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +0 -36
  103. package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +0 -31
  104. package/esm2022/lib/smart-filter/smart-filter.model.mjs +0 -13
  105. package/esm2022/lib/smart-filter/smart-filter.module.mjs +0 -33
  106. package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +0 -198
  107. package/esm2022/lib/smart-filter-editor/api/configuration.mjs +0 -91
  108. package/esm2022/lib/smart-filter-editor/api/encoder.mjs +0 -19
  109. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +0 -17
  110. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +0 -13
  111. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +0 -2
  112. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +0 -8
  113. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +0 -2
  114. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +0 -7
  115. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +0 -2
  116. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +0 -20
  117. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +0 -2
  118. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +0 -2
  119. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +0 -2
  120. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +0 -28
  121. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +0 -2
  122. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +0 -2
  123. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +0 -32
  124. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +0 -19
  125. package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +0 -17
  126. package/esm2022/lib/smart-filter-editor/api/param.mjs +0 -2
  127. package/esm2022/lib/smart-filter-editor/api/variables.mjs +0 -9
  128. package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +0 -15
  129. package/esm2022/lib/smart-filter-editor/project.mjs +0 -8
  130. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +0 -73
  131. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +0 -40
  132. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +0 -273
  133. package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +0 -2
  134. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +0 -69
  135. package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +0 -47
  136. package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +0 -24
  137. package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +0 -57
  138. package/esm2022/lib/smart-form/api/api/api.mjs +0 -4
  139. package/esm2022/lib/smart-form/api/api/default.service.mjs +0 -133
  140. package/esm2022/lib/smart-form/api/api.module.mjs +0 -40
  141. package/esm2022/lib/smart-form/api/configuration.mjs +0 -91
  142. package/esm2022/lib/smart-form/api/encoder.mjs +0 -19
  143. package/esm2022/lib/smart-form/api/index.mjs +0 -7
  144. package/esm2022/lib/smart-form/api/model/models.mjs +0 -12
  145. package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +0 -13
  146. package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +0 -7
  147. package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +0 -22
  148. package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +0 -17
  149. package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +0 -46
  150. package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +0 -2
  151. package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +0 -2
  152. package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +0 -2
  153. package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +0 -18
  154. package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +0 -13
  155. package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +0 -20
  156. package/esm2022/lib/smart-form/api/param.mjs +0 -2
  157. package/esm2022/lib/smart-form/api/variables.mjs +0 -9
  158. package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +0 -20
  159. package/esm2022/lib/smart-form/projects.mjs +0 -15
  160. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +0 -613
  161. package/esm2022/lib/smart-form/services/smartform.service.mjs +0 -673
  162. package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +0 -15
  163. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +0 -78
  164. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +0 -2
  165. package/esm2022/lib/smart-form/smartform.component.mjs +0 -185
  166. package/esm2022/lib/smart-form/smartform.form-model.mjs +0 -2
  167. package/esm2022/lib/smart-form/smartform.model.mjs +0 -38
  168. package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +0 -84
  169. package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +0 -36
  170. package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +0 -79
  171. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +0 -874
  172. package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +0 -78
  173. package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +0 -31
  174. package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +0 -4
  175. package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +0 -451
  176. package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +0 -40
  177. package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +0 -91
  178. package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +0 -19
  179. package/esm2022/lib/smart-grid/api/grid-api/index.mjs +0 -7
  180. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +0 -17
  181. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +0 -2
  182. package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +0 -20
  183. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +0 -2
  184. package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +0 -2
  185. package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +0 -2
  186. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +0 -13
  187. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +0 -18
  188. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +0 -17
  189. package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +0 -2
  190. package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +0 -2
  191. package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +0 -2
  192. package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +0 -8
  193. package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +0 -14
  194. package/esm2022/lib/smart-grid/api/grid-api/param.mjs +0 -2
  195. package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +0 -9
  196. package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +0 -20
  197. package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +0 -66
  198. package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +0 -182
  199. package/esm2022/lib/smart-grid/models/model.mjs +0 -29
  200. package/esm2022/lib/smart-grid/projects.mjs +0 -9
  201. package/esm2022/lib/smart-grid/smart-grid.component.mjs +0 -934
  202. package/esm2022/lib/smart-grid/smart-grid.module.mjs +0 -100
  203. package/esm2022/lib/smart-grid/smart-grid.service.mjs +0 -80
  204. package/esm2022/lib/smart-icon/projects.mjs +0 -7
  205. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +0 -53
  206. package/esm2022/lib/smart-icon/smart-icon.module.mjs +0 -22
  207. package/esm2022/lib/smart-icon/smart-icon.service.mjs +0 -74
  208. package/esm2022/lib/smart-map/abstract-map.mjs +0 -112
  209. package/esm2022/lib/smart-map/api/api/api.mjs +0 -4
  210. package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +0 -312
  211. package/esm2022/lib/smart-map/api/api.module.mjs +0 -40
  212. package/esm2022/lib/smart-map/api/configuration.mjs +0 -91
  213. package/esm2022/lib/smart-map/api/encoder.mjs +0 -19
  214. package/esm2022/lib/smart-map/api/index.mjs +0 -7
  215. package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +0 -13
  216. package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +0 -2
  217. package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +0 -2
  218. package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +0 -17
  219. package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +0 -2
  220. package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +0 -19
  221. package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +0 -2
  222. package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +0 -2
  223. package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +0 -2
  224. package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +0 -18
  225. package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +0 -2
  226. package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +0 -2
  227. package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +0 -2
  228. package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +0 -2
  229. package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +0 -17
  230. package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +0 -18
  231. package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +0 -2
  232. package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +0 -17
  233. package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +0 -2
  234. package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +0 -2
  235. package/esm2022/lib/smart-map/api/model/models.mjs +0 -21
  236. package/esm2022/lib/smart-map/api/param.mjs +0 -2
  237. package/esm2022/lib/smart-map/api/variables.mjs +0 -9
  238. package/esm2022/lib/smart-map/api-default/api-default.mjs +0 -2
  239. package/esm2022/lib/smart-map/impl/google-map.mjs +0 -221
  240. package/esm2022/lib/smart-map/impl/leaflet-map.mjs +0 -264
  241. package/esm2022/lib/smart-map/projects.mjs +0 -9
  242. package/esm2022/lib/smart-map/smart-map.component.mjs +0 -218
  243. package/esm2022/lib/smart-map/smart-map.module.mjs +0 -22
  244. package/esm2022/lib/smart-map/smart-map.types.mjs +0 -2
  245. package/esm2022/lib/smart-navbar/projects.mjs +0 -8
  246. package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +0 -61
  247. package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +0 -6
  248. package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +0 -63
  249. package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +0 -14
  250. package/esm2022/lib/smart-navigation/projects.mjs +0 -6
  251. package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +0 -2
  252. package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +0 -18
  253. package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +0 -56
  254. package/esm2022/lib/smart-ng-client.module.mjs +0 -130
  255. package/esm2022/lib/smart-ng-client.service.mjs +0 -19
  256. package/esm2022/lib/smart-subject/projects.mjs +0 -5
  257. package/esm2022/lib/smart-subject/smart-subject.mjs +0 -21
  258. package/esm2022/lib/smart-tab-group/projects.mjs +0 -9
  259. package/esm2022/lib/smart-tab-group/smart-tab-group.component.mjs +0 -43
  260. package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +0 -25
  261. package/esm2022/lib/smart-tab-group/smart-tab-group.service.mjs +0 -14
  262. package/esm2022/lib/smart-tab-group/tab-content/tab-content.component.mjs +0 -31
  263. package/esm2022/lib/smart-tab-group/tab-group-simplified/tab-group.component.mjs +0 -66
  264. package/esm2022/lib/smart-tab-group/tabTile.model.mjs +0 -2
  265. package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +0 -43
  266. package/esm2022/lib/smart-table/components/loading/loading.component.mjs +0 -15
  267. package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +0 -52
  268. package/esm2022/lib/smart-table/projects.mjs +0 -8
  269. package/esm2022/lib/smart-table/smarttable.component.mjs +0 -98
  270. package/esm2022/lib/smart-table/smarttable.model.mjs +0 -169
  271. package/esm2022/lib/smart-table/smarttable.module.mjs +0 -105
  272. package/esm2022/lib/smart-table/smarttable.service.mjs +0 -14
  273. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +0 -39
  274. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +0 -23
  275. package/esm2022/lib/smart-table/tables/table.mjs +0 -520
  276. package/esm2022/lib/smart-tree/projects.mjs +0 -9
  277. package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +0 -288
  278. package/esm2022/lib/smart-tree/smarttree.component.mjs +0 -181
  279. package/esm2022/lib/smart-tree/smarttree.model.mjs +0 -7
  280. package/esm2022/lib/smart-tree/smarttree.module.mjs +0 -60
  281. package/esm2022/lib/smart-tree/smarttree.node.model.mjs +0 -6
  282. package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +0 -2
  283. package/esm2022/lib/smart-tree/smarttree.service.mjs +0 -47
  284. package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +0 -1190
  285. package/esm2022/lib/smart-tree/tree-api/configuration.mjs +0 -91
  286. package/esm2022/lib/smart-tree/tree-api/encoder.mjs +0 -19
  287. package/esm2022/lib/smart-tree/tree-api/param.mjs +0 -2
  288. package/esm2022/lib/smart-tree/tree-api/variables.mjs +0 -9
  289. package/esm2022/lib/smart-validation/named-validator.service.mjs +0 -115
  290. package/esm2022/lib/smart-validation/projects.mjs +0 -4
  291. package/esm2022/lib/smart-validation/smart-validation.module.mjs +0 -24
  292. package/esm2022/lib/smart-validation/smart-validation.types.mjs +0 -4
  293. package/esm2022/lib/view-context/api/api/api.mjs +0 -4
  294. package/esm2022/lib/view-context/api/api/view.service.mjs +0 -903
  295. package/esm2022/lib/view-context/api/api.module.mjs +0 -40
  296. package/esm2022/lib/view-context/api/configuration.mjs +0 -91
  297. package/esm2022/lib/view-context/api/encoder.mjs +0 -19
  298. package/esm2022/lib/view-context/api/index.mjs +0 -7
  299. package/esm2022/lib/view-context/api/model/clipboardData.mjs +0 -13
  300. package/esm2022/lib/view-context/api/model/closeResult.mjs +0 -18
  301. package/esm2022/lib/view-context/api/model/componentConstraint.mjs +0 -2
  302. package/esm2022/lib/view-context/api/model/componentModel.mjs +0 -2
  303. package/esm2022/lib/view-context/api/model/componentModelChange.mjs +0 -13
  304. package/esm2022/lib/view-context/api/model/dataChange.mjs +0 -2
  305. package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +0 -2
  306. package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +0 -21
  307. package/esm2022/lib/view-context/api/model/deviceInfo.mjs +0 -13
  308. package/esm2022/lib/view-context/api/model/downloadedFile.mjs +0 -13
  309. package/esm2022/lib/view-context/api/model/iconPosition.mjs +0 -20
  310. package/esm2022/lib/view-context/api/model/imageResource.mjs +0 -8
  311. package/esm2022/lib/view-context/api/model/link.mjs +0 -20
  312. package/esm2022/lib/view-context/api/model/messageData.mjs +0 -2
  313. package/esm2022/lib/view-context/api/model/messageOption.mjs +0 -2
  314. package/esm2022/lib/view-context/api/model/messageOptionType.mjs +0 -18
  315. package/esm2022/lib/view-context/api/model/messageResult.mjs +0 -2
  316. package/esm2022/lib/view-context/api/model/messageTextType.mjs +0 -17
  317. package/esm2022/lib/view-context/api/model/messageType.mjs +0 -19
  318. package/esm2022/lib/view-context/api/model/models.mjs +0 -54
  319. package/esm2022/lib/view-context/api/model/namedValidator.mjs +0 -19
  320. package/esm2022/lib/view-context/api/model/openPendingData.mjs +0 -2
  321. package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +0 -2
  322. package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +0 -2
  323. package/esm2022/lib/view-context/api/model/serverRequestType.mjs +0 -24
  324. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +0 -2
  325. package/esm2022/lib/view-context/api/model/statisticRecord.mjs +0 -13
  326. package/esm2022/lib/view-context/api/model/style.mjs +0 -13
  327. package/esm2022/lib/view-context/api/model/uiAction.mjs +0 -2
  328. package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +0 -2
  329. package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +0 -27
  330. package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +0 -13
  331. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +0 -2
  332. package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +0 -2
  333. package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +0 -20
  334. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +0 -21
  335. package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +0 -13
  336. package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +0 -22
  337. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +0 -13
  338. package/esm2022/lib/view-context/api/model/uploadedFile.mjs +0 -13
  339. package/esm2022/lib/view-context/api/model/valueSet.mjs +0 -2
  340. package/esm2022/lib/view-context/api/model/view.mjs +0 -2
  341. package/esm2022/lib/view-context/api/model/viewApiError.mjs +0 -13
  342. package/esm2022/lib/view-context/api/model/viewConstraint.mjs +0 -2
  343. package/esm2022/lib/view-context/api/model/viewContext.mjs +0 -2
  344. package/esm2022/lib/view-context/api/model/viewContextChange.mjs +0 -2
  345. package/esm2022/lib/view-context/api/model/viewContextData.mjs +0 -2
  346. package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +0 -2
  347. package/esm2022/lib/view-context/api/model/viewData.mjs +0 -2
  348. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +0 -18
  349. package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +0 -13
  350. package/esm2022/lib/view-context/api/model/viewState.mjs +0 -22
  351. package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +0 -2
  352. package/esm2022/lib/view-context/api/model/viewType.mjs +0 -18
  353. package/esm2022/lib/view-context/api/param.mjs +0 -2
  354. package/esm2022/lib/view-context/api/variables.mjs +0 -9
  355. package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +0 -20
  356. package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +0 -74
  357. package/esm2022/lib/view-context/projects.mjs +0 -19
  358. package/esm2022/lib/view-context/property-definition-data.mjs +0 -2
  359. package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +0 -30
  360. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +0 -63
  361. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +0 -55
  362. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +0 -60
  363. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +0 -97
  364. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +0 -60
  365. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +0 -132
  366. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +0 -59
  367. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +0 -192
  368. package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +0 -183
  369. package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +0 -7
  370. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +0 -211
  371. package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +0 -83
  372. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +0 -29
  373. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +0 -75
  374. package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +0 -39
  375. package/esm2022/lib/view-context/smart-view-context.model.mjs +0 -2
  376. package/esm2022/lib/view-context/smart-view-context.module.mjs +0 -327
  377. package/esm2022/lib/view-context/smart-view-context.service.mjs +0 -696
  378. package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +0 -33
  379. package/esm2022/lib/view-context/utility/componentLibrary.mjs +0 -9
  380. package/esm2022/lib/view-context/utility/smart-object-utility.mjs +0 -44
  381. package/esm2022/lib/view-context/utility/smart-style-utility.mjs +0 -68
  382. package/esm2022/lib/view-context/value-api/api/api.mjs +0 -4
  383. package/esm2022/lib/view-context/value-api/api/value.service.mjs +0 -138
  384. package/esm2022/lib/view-context/value-api/api.module.mjs +0 -40
  385. package/esm2022/lib/view-context/value-api/configuration.mjs +0 -91
  386. package/esm2022/lib/view-context/value-api/encoder.mjs +0 -19
  387. package/esm2022/lib/view-context/value-api/index.mjs +0 -7
  388. package/esm2022/lib/view-context/value-api/model/genericValue.mjs +0 -13
  389. package/esm2022/lib/view-context/value-api/model/models.mjs +0 -11
  390. package/esm2022/lib/view-context/value-api/model/value.mjs +0 -13
  391. package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +0 -2
  392. package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +0 -2
  393. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +0 -2
  394. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +0 -13
  395. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +0 -24
  396. package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +0 -2
  397. package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +0 -2
  398. package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +0 -19
  399. package/esm2022/lib/view-context/value-api/param.mjs +0 -2
  400. package/esm2022/lib/view-context/value-api/variables.mjs +0 -9
  401. package/esm2022/projects.mjs +0 -28
  402. package/esm2022/smartbit4all-ng-client.mjs +0 -5
  403. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartData.mjs +0 -2
  404. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.mjs +0 -2
  405. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartOrientation.mjs +0 -16
  406. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartType.mjs +0 -21
  407. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartValue.mjs +0 -13
  408. package/esm2022/src/lib/smart-chart/smart-chart/api/model/models.mjs +0 -7
  409. package/esm2022/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.mjs +0 -16
  410. package/esm2022/src/lib/smart-chart/smart-chart/default-chart-options.provider.mjs +0 -233
  411. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.component.mjs +0 -285
  412. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.module.mjs +0 -39
  413. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.mjs +0 -2
  414. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api.module.mjs +0 -40
  415. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/configuration.mjs +0 -91
  416. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/index.mjs +0 -7
  417. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramColor.mjs +0 -13
  418. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataContainer.mjs +0 -2
  419. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataItem.mjs +0 -13
  420. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSet.mjs +0 -2
  421. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.mjs +0 -13
  422. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDescriptor.mjs +0 -2
  423. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramShape.mjs +0 -2
  424. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.mjs +0 -2
  425. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/drawTime.mjs +0 -18
  426. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/labelText.mjs +0 -2
  427. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/models.mjs +0 -11
  428. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/param.mjs +0 -2
  429. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/variables.mjs +0 -9
  430. package/esm2022/src/lib/smart-chart/smart-chart-projects.mjs +0 -9
  431. package/esm2022/src/lib/smart-chart/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -5
  432. package/esm2022/src/lib/smart-chart/view-context/utility/componentLibrary.mjs +0 -9
  433. package/smartbit4all-ng-client-4.2.34.tgz +0 -0
@@ -1,696 +0,0 @@
1
- import { Injectable, InjectionToken } from '@angular/core';
2
- import { Subject, takeUntil } from 'rxjs';
3
- import { LinkTargetEnum, ViewState, ViewType, } from './api';
4
- import { MessageDialogComponent } from './message-dialog/message-dialog.component';
5
- import { SmartSubject } from '../smart-subject/projects';
6
- import { MatDialogRef } from '@angular/material/dialog';
7
- import { DynamicDialogRef } from 'primeng/dynamicdialog';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "./api";
10
- import * as i2 from "../session/smart-session.service";
11
- import * as i3 from "../smart-navigation/projects";
12
- import * as i4 from "./smart-view-context-dialog.service";
13
- export const SmartViewContextErrorDialogButtonLabel = 'SmartViewContextErrorDialogButtonLabel';
14
- export const SmartViewContextErrorDialogTitle = 'SmartViewContextErrorDialogTitle';
15
- export const SmartViewContextErrorDialogMessage = 'SmartViewContextErrorDialogMessage';
16
- export const DefaultUiActionCode_CLOSE = 'DEFAULT_CLOSE';
17
- export const DIALOG_DISABLE_CLOSE = new InjectionToken('dialogDisableClose');
18
- export class SmartViewContextService {
19
- set translateService(translateService) {
20
- this._translateService = translateService;
21
- this.translateServiceChanged.next();
22
- this.translateServiceChanged.complete();
23
- }
24
- get translateService() {
25
- if (this._translateService) {
26
- return this._translateService;
27
- }
28
- return undefined;
29
- }
30
- constructor(view, session, navigation, dialog, apiQueueService, inject) {
31
- this.view = view;
32
- this.session = session;
33
- this.navigation = navigation;
34
- this.dialog = dialog;
35
- this.apiQueueService = apiQueueService;
36
- this.inject = inject;
37
- this.viewContextUuidName = 'viewContextUuid';
38
- this.viewContextUuidHeaderName = 'viewContextUuid';
39
- this.pageNamePrefix = 'page.';
40
- this.componentNamePrefix = 'component.';
41
- this.viewHandlers = new Array();
42
- this.openedViewUuids = new Array();
43
- this.openedViewData = new Array();
44
- this._destroy$ = new Subject();
45
- this.uuidOfPageHasBeenChanged = new SmartSubject(this._destroy$);
46
- this.viewContextHasBeenSynced = new SmartSubject(this._destroy$);
47
- this.openSmartLink = new SmartSubject(this._destroy$);
48
- this.isOpeningSmartLink = false;
49
- this.dialogRefs = [];
50
- this.smartApiClients = new Map();
51
- this.translateServiceChanged = new SmartSubject(this._destroy$);
52
- }
53
- ngOnDestroy() {
54
- this._destroy$.next();
55
- this._destroy$.complete();
56
- }
57
- follow(uuid, detectChange) {
58
- this.smartApiClients.set(uuid, detectChange);
59
- }
60
- unfollow(uuid) {
61
- this.smartApiClients.delete(uuid);
62
- }
63
- setActionDescriptors(actionDescriptors) {
64
- this.actionDescriptors = actionDescriptors;
65
- }
66
- getActionDescriptors() {
67
- if (!this.actionDescriptors) {
68
- console.error('No action descriptors has been set to ViewContext.');
69
- }
70
- return this.actionDescriptors;
71
- }
72
- setViewHandlers(viewHandlers) {
73
- this.viewHandlers = viewHandlers;
74
- }
75
- setViewApiErrors(viewApiErrors) {
76
- this.smartViewContextApiErrors = viewApiErrors;
77
- }
78
- setMessageDialogName(messageDialogName) {
79
- this.messageDialogname = messageDialogName;
80
- this.viewHandlers.push({
81
- name: messageDialogName,
82
- component: MessageDialogComponent,
83
- });
84
- }
85
- setUpUrlForViewService() {
86
- this.view.configuration.basePath = this.url;
87
- }
88
- setUrl(url) {
89
- this.url = url + '/view';
90
- this.setUpUrlForViewService();
91
- }
92
- async getAndSyncViewContext(uuid) {
93
- if (!uuid) {
94
- uuid = this.getViewContextUuid();
95
- }
96
- await this.getViewContext(uuid).then(() => {
97
- this.syncView();
98
- });
99
- }
100
- async getViewContext(uuid) {
101
- this.viewContext = await this.view.getViewContext(uuid).toPromise();
102
- if (!this.viewContext) {
103
- throw new Error('ViewContext does not exist with the given uuid.');
104
- }
105
- return this.viewContext;
106
- }
107
- async getViewContextDataByPageName(pageName) {
108
- if (!this.viewContext) {
109
- await this.getViewContext(this.getViewContextUuid());
110
- }
111
- let pageUuid = this.getUuidOfPage(pageName);
112
- let viewContextByPageName = this.viewContext?.views.find((view) => view.uuid === pageUuid);
113
- if (!viewContextByPageName) {
114
- throw new Error(`The ViewData of ${pageName} is not found!`);
115
- }
116
- return viewContextByPageName;
117
- }
118
- async updateViewContext(viewContextUpdate) {
119
- this.viewContext = await this.view.updateViewContext(viewContextUpdate).toPromise();
120
- return this.viewContext;
121
- }
122
- clearSessionStorage() {
123
- sessionStorage.clear();
124
- this.openedViewData = [];
125
- this.openedViewUuids = [];
126
- }
127
- async startViewContext() {
128
- this.clearSessionStorage();
129
- let newViewContext = await this.view
130
- .createViewContext()
131
- .toPromise();
132
- if (!newViewContext) {
133
- throw new Error('No ViewContext was created');
134
- }
135
- this.viewContext = newViewContext;
136
- this.setViewContextUuid(newViewContext.uuid);
137
- return this.viewContext;
138
- }
139
- async initialize(uuid) {
140
- if (this.initializeRunning) {
141
- return this.initializeRunning.toPromise();
142
- }
143
- else {
144
- this.initializeRunning = new SmartSubject(this._destroy$);
145
- try {
146
- if (this.viewHandlers.length === 0) {
147
- throw new Error("There aren't any viewHandlers in SmartViewContextService! Provide some to use its functions.");
148
- }
149
- if (!this.messageDialogname) {
150
- throw new Error('The messageDialogName provided by the backend has not been set.');
151
- }
152
- if (uuid) {
153
- this.setViewContextUuid(uuid);
154
- try {
155
- await this.getViewContext(uuid);
156
- }
157
- catch (err) {
158
- await this.startViewContext();
159
- }
160
- }
161
- else {
162
- await this.startViewContext();
163
- }
164
- return this.viewContext;
165
- }
166
- finally {
167
- this.initializeRunning.next(this.viewContext);
168
- this.initializeRunning.complete();
169
- this.initializeRunning = undefined;
170
- }
171
- }
172
- }
173
- openView(view) {
174
- let alreadyOpened = this.openedViewUuids.some((uuid) => uuid === view.uuid);
175
- if (alreadyOpened)
176
- return undefined;
177
- let viewHandler = this.viewHandlers.find((handler) => handler.name === view.viewName);
178
- if (!viewHandler) {
179
- throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName}`);
180
- }
181
- if (view.type === ViewType.DIALOG) {
182
- if (!viewHandler.component) {
183
- throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
184
- }
185
- let refIsAlradyAdded = this.dialogRefs.some((ref) => ref.uuid === view.uuid);
186
- if (!refIsAlradyAdded) {
187
- let dialogRef;
188
- try {
189
- this.openedViewUuids.push(view.uuid);
190
- this.openedViewData.push(view);
191
- this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
192
- dialogRef = this.dialog.openComponentAsDialog(viewHandler.component, viewHandler.name);
193
- }
194
- finally {
195
- const index = this.openedViewUuids.indexOf(view.uuid);
196
- if (index >= 0) {
197
- this.openedViewUuids.splice(index, 1);
198
- this.openedViewData.splice(index, 1);
199
- this.clearUuidOfPage(view.viewName, viewHandler.componentName);
200
- }
201
- this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
202
- }
203
- let dialogDisableClose = true;
204
- let isMessageDialog = view.viewName === this.messageDialogname;
205
- if (!isMessageDialog) {
206
- try {
207
- dialogDisableClose = this.inject.get(DIALOG_DISABLE_CLOSE);
208
- }
209
- catch {
210
- console.error('Error during reading DIALOG_DISABLE_CLOSE');
211
- }
212
- }
213
- if (dialogRef instanceof MatDialogRef) {
214
- dialogRef.disableClose = dialogDisableClose;
215
- // if (isMessageDialog) {
216
- // if (view.message?.options && view.message.options.length) {
217
- // }
218
- // }
219
- if (!dialogDisableClose) {
220
- dialogRef
221
- .afterClosed()
222
- .pipe(takeUntil(this._destroy$))
223
- .subscribe(() => {
224
- this.performAction(view.uuid, { code: DefaultUiActionCode_CLOSE, params: {} });
225
- });
226
- }
227
- }
228
- else if (dialogRef instanceof DynamicDialogRef) {
229
- if (!dialogDisableClose) {
230
- dialogRef.onDestroy.pipe(takeUntil(this._destroy$)).subscribe(() => {
231
- this.performAction(view.uuid, { code: DefaultUiActionCode_CLOSE, params: {} });
232
- });
233
- }
234
- }
235
- this.dialogRefs.push({
236
- uuid: view.uuid,
237
- dialogRef,
238
- });
239
- }
240
- }
241
- else if (view.type === ViewType.NORMAL) {
242
- if (viewHandler.route === undefined) {
243
- throw new Error(`Route is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
244
- }
245
- this.navigation.navigateTo(viewHandler.route.split('/'));
246
- }
247
- else {
248
- throw new Error('The type of the view and its viewHandler is not the same!');
249
- }
250
- view.state = ViewState.OPENED;
251
- this.openedViewUuids.push(view.uuid);
252
- this.openedViewData.push(view);
253
- this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
254
- this.uuidOfPageHasBeenChanged.next(view.viewName);
255
- return {
256
- state: ViewState.OPENED,
257
- uuid: view.uuid,
258
- };
259
- }
260
- closeView(view) {
261
- let viewHandler = this.viewHandlers.find((handler) => handler.name === view.viewName);
262
- if (!viewHandler) {
263
- throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName}`);
264
- }
265
- if (view.type === ViewType.DIALOG) {
266
- let dialogRef = this.dialogRefs.find((dialogRef) => dialogRef.uuid === view.uuid);
267
- if (dialogRef) {
268
- dialogRef.dialogRef.close();
269
- let index = this.dialogRefs.indexOf(dialogRef);
270
- this.dialogRefs.splice(index, 1);
271
- }
272
- else {
273
- console.log('DialogRef is not found by uuid.');
274
- }
275
- }
276
- else if (view.type === ViewType.NORMAL) {
277
- // TODO: close normal page???
278
- // this.navigation.navigateTo(viewHandler.route.split("/"));
279
- }
280
- else {
281
- throw new Error('The type of the view and its viewHandler is not the same!');
282
- }
283
- view.state = ViewState.CLOSED;
284
- const index = this.openedViewUuids.indexOf(view.uuid);
285
- if (index >= 0) {
286
- this.openedViewUuids.splice(index, 1);
287
- this.openedViewData.splice(index, 1);
288
- this.clearUuidOfPage(view.viewName, viewHandler.componentName);
289
- }
290
- return {
291
- state: ViewState.CLOSED,
292
- uuid: view.uuid,
293
- };
294
- }
295
- sendViewContextUpdates(updatesToSend) {
296
- const updates = [];
297
- updatesToSend.forEach((update) => {
298
- if (update !== undefined && update !== null)
299
- updates.push(update);
300
- });
301
- if (updates.length > 0) {
302
- this.updateViewContext({
303
- updates,
304
- uuid: this.viewContext?.uuid,
305
- });
306
- }
307
- }
308
- async restoreViews(uuid) {
309
- const updates = [];
310
- if (!this.viewContext) {
311
- await this.getViewContext(uuid);
312
- }
313
- this.viewContext.views.filter((view) => view.state === ViewState.OPENED || view.state === ViewState.TO_OPEN).map((view) => {
314
- const update = this.openView(view);
315
- if (update) {
316
- updates.push(update);
317
- }
318
- });
319
- this.sendViewContextUpdates(updates);
320
- }
321
- syncView() {
322
- const updates = [];
323
- this.viewContext?.views.map((view) => {
324
- switch (view.state) {
325
- case ViewState.TO_OPEN:
326
- updates.push(this.openView(view));
327
- break;
328
- case ViewState.TO_CLOSE:
329
- updates.push(this.closeView(view));
330
- break;
331
- }
332
- });
333
- const viewDataToClose = this.openedViewData.filter((viewData) => !this.viewContext?.views
334
- .flatMap((viewData) => viewData.uuid)
335
- .includes(viewData.uuid));
336
- if (viewDataToClose?.length) {
337
- viewDataToClose.map((viewData) => {
338
- updates.push(this.closeView(viewData));
339
- });
340
- }
341
- this.sendViewContextUpdates(updates);
342
- this.viewContext?.links?.map((data) => {
343
- const link = document.createElement('a');
344
- let target = '_blank'; // default
345
- switch (data.target ?? LinkTargetEnum.BLANK) {
346
- case 'SELF':
347
- target = '_self';
348
- break;
349
- case 'BLANK':
350
- target = '_blank';
351
- break;
352
- case 'PARENT':
353
- target = '_parent';
354
- break;
355
- case 'TOP':
356
- target = '_top';
357
- break;
358
- }
359
- link.setAttribute('target', target);
360
- link.setAttribute('href', data.url);
361
- if (data.download) {
362
- link.setAttribute('download', data.filename ?? '');
363
- }
364
- document.body.appendChild(link);
365
- link.click();
366
- link.remove();
367
- });
368
- this.viewContext?.downloads?.map(async (file) => {
369
- try {
370
- let blob = await this.downloadResource(file.uuid, file.identifier);
371
- let url = URL.createObjectURL(blob);
372
- const link = document.createElement('a');
373
- link.setAttribute('target', '_blank');
374
- link.setAttribute('href', url);
375
- link.setAttribute('download', file.filename);
376
- document.body.appendChild(link);
377
- link.click();
378
- link.remove();
379
- }
380
- catch (e) {
381
- console.error('Error downloading file');
382
- console.error(e);
383
- }
384
- });
385
- const clipboardText = this.viewContext?.clipboardData
386
- ?.map((cd) => cd.text || '')
387
- .join('');
388
- if (clipboardText) {
389
- const clipboard = navigator.clipboard;
390
- // available only in secure contexts.
391
- if (clipboard) {
392
- try {
393
- clipboard
394
- .writeText(clipboardText)
395
- .catch((e) => console.error('Failed to copy text to clipboard', e));
396
- }
397
- catch (e) {
398
- console.error('Error accessing clipboard', e);
399
- }
400
- }
401
- }
402
- this.viewContextHasBeenSynced.next();
403
- }
404
- setViewContextUuid(uuid) {
405
- sessionStorage.setItem(this.viewContextUuidName, uuid);
406
- this.session.addHeaderParam({
407
- headerName: this.viewContextUuidHeaderName,
408
- value: uuid,
409
- });
410
- }
411
- getViewContextUuid() {
412
- let viewContextUuid = sessionStorage.getItem(this.viewContextUuidName);
413
- if (!viewContextUuid) {
414
- throw new Error('View context is not initialized!');
415
- }
416
- return viewContextUuid;
417
- }
418
- hasViewContextUuid() {
419
- let viewContextUuid = sessionStorage.getItem(this.viewContextUuidName);
420
- return viewContextUuid !== null && viewContextUuid !== undefined;
421
- }
422
- setUuidOfPage(pageName, uuid, componentName) {
423
- sessionStorage.setItem(this.pageNamePrefix + pageName, uuid);
424
- if (componentName) {
425
- sessionStorage.setItem(this.componentNamePrefix + componentName, pageName);
426
- }
427
- }
428
- clearUuidOfPage(pageName, componentName) {
429
- sessionStorage.removeItem(this.pageNamePrefix + pageName);
430
- if (componentName) {
431
- sessionStorage.removeItem(this.componentNamePrefix + componentName);
432
- }
433
- }
434
- getUuidOfPage(pageName) {
435
- let uuid = sessionStorage.getItem(this.pageNamePrefix + pageName);
436
- if (!uuid) {
437
- throw new Error(`The uuid of ${pageName} is not available.`);
438
- }
439
- return uuid;
440
- }
441
- getPageNameOfComponent(componentName) {
442
- let pageName = sessionStorage.getItem(this.componentNamePrefix + componentName);
443
- if (!pageName) {
444
- throw new Error(`The pageName of ${componentName} is not available.`);
445
- }
446
- return pageName;
447
- }
448
- async message(messageData, messageResult) {
449
- return await this.handlePerformActionResponse(await this.view
450
- .message(messageData.viewUuid ?? '', messageData.uuid, messageResult)
451
- .toPromise());
452
- // in future use this.apiQueueService.addToQueue
453
- }
454
- async getSmartViewContextApiErrorByCode(code) {
455
- let buttonLabel;
456
- let dialogTitle;
457
- let message;
458
- if (this.translateService) {
459
- buttonLabel = await this.translateService
460
- .get(SmartViewContextErrorDialogButtonLabel)
461
- .toPromise();
462
- dialogTitle = await this.translateService.get(SmartViewContextErrorDialogTitle).toPromise();
463
- message = await this.translateService.get(SmartViewContextErrorDialogMessage).toPromise();
464
- }
465
- else {
466
- buttonLabel = 'Ok';
467
- dialogTitle = 'Hiba';
468
- message = 'An error has occured.';
469
- }
470
- if (!this.smartViewContextApiErrors) {
471
- return {
472
- code,
473
- message,
474
- buttonLabel,
475
- dialogTitle,
476
- };
477
- }
478
- let apiErrorsWithCode = this.smartViewContextApiErrors.viewContextApiErrors.filter((apiError) => {
479
- return apiError.code === code;
480
- });
481
- if (!apiErrorsWithCode || (apiErrorsWithCode && !apiErrorsWithCode.length)) {
482
- console.error(`SmartViewContextApiError with code ${code} could not be found.`);
483
- return {
484
- code,
485
- message,
486
- buttonLabel,
487
- dialogTitle,
488
- };
489
- }
490
- return apiErrorsWithCode[0];
491
- }
492
- async getViewConstraint(uuid) {
493
- let viewConstraintResponse = await this.view.getViewConstraint(uuid).toPromise();
494
- if (!viewConstraintResponse)
495
- throw new Error('Could not get ViewConstraint with the given uuid.');
496
- return viewConstraintResponse;
497
- }
498
- async showPublishedView(channel, uuid) {
499
- this.isOpeningSmartLink = true;
500
- await this.session.initialize();
501
- // TODO init view context automatically
502
- // await this.initialize();
503
- this.openSmartLink.next();
504
- await this.openSmartLink.toPromise();
505
- await this.view.showPublishedView(channel, uuid).toPromise();
506
- await this.getAndSyncViewContext();
507
- this.isOpeningSmartLink = false;
508
- }
509
- async downloadResource(uuid, item) {
510
- return await this.view.downloadItem(uuid, item).toPromise();
511
- }
512
- async performAction(uuid, uiActionRequest) {
513
- return await this._performAction({
514
- uuid,
515
- uiActionRequest,
516
- });
517
- // const isCompleted = new Subject<void>();
518
- // this.apiQueueService.addToQueue({
519
- // callback: this._performAction.bind(this),
520
- // config: {
521
- // uuid,
522
- // uiActionRequest,
523
- // },
524
- // isCompleted,
525
- // });
526
- // return await isCompleted.toPromise();
527
- }
528
- async performWidgetAction(uuid, widgetId, nodeId, uiActionRequest) {
529
- return await this._performWidgetAction({ uuid, widgetId, nodeId, uiActionRequest });
530
- // const isCompleted = new Subject<void>();
531
- // this.apiQueueService.addToQueue({
532
- // callback: this._performWidgetAction.bind(this),
533
- // config: {
534
- // uuid,
535
- // widgetId,
536
- // nodeId,
537
- // uiActionRequest,
538
- // },
539
- // isCompleted,
540
- // });
541
- // return await isCompleted.toPromise();
542
- }
543
- async performWidgetMainAction(uuid, widgetId, uiActionRequest) {
544
- return await this._performWidgetMainAction({ uuid, widgetId, uiActionRequest });
545
- // const isCompleted = new Subject<void>();
546
- // this.apiQueueService.addToQueue({
547
- // callback: this._performWidgetMainAction.bind(this),
548
- // config: {
549
- // uuid,
550
- // widgetId,
551
- // uiActionRequest,
552
- // },
553
- // isCompleted,
554
- // });
555
- // return await isCompleted.toPromise();
556
- }
557
- async performUploadAction(uuid, uiActionRequest, param, content) {
558
- this._performUploadAction({
559
- uuid,
560
- uiActionRequest,
561
- param,
562
- content,
563
- });
564
- }
565
- async performUploadMultipleAction(uuid, uiActionRequest, param, content) {
566
- this._performUploadMultipleAction({
567
- uuid,
568
- uiActionRequest,
569
- param,
570
- content,
571
- });
572
- }
573
- async dataChanged(uuid, dataChange) {
574
- return await this._dataChanged({ uuid, dataChange });
575
- // const isCompleted = new Subject<void>();
576
- // this.apiQueueService.addToQueue(
577
- // {
578
- // callback: this._dataChanged.bind(this),
579
- // config: {
580
- // uuid,
581
- // dataChange,
582
- // },
583
- // isCompleted,
584
- // },
585
- // true
586
- // );
587
- // return await isCompleted.toPromise();
588
- }
589
- async _performAction(config) {
590
- return await this.handlePerformActionResponse(await this.view.performAction(config.uuid, config.uiActionRequest).toPromise());
591
- }
592
- async _performWidgetAction(config) {
593
- return await this.handlePerformActionResponse(await this.view
594
- .performWidgetAction(config.uuid, config.widgetId, config.nodeId, config.uiActionRequest)
595
- .toPromise());
596
- }
597
- async _performWidgetMainAction(config) {
598
- return await this.handlePerformActionResponse(await this.view
599
- .performWidgetMainAction(config.uuid, config.widgetId, config.uiActionRequest)
600
- .toPromise());
601
- }
602
- async _performUploadAction(config) {
603
- return await this.handlePerformActionResponse(await this.view
604
- .uploadAction(config.uuid, JSON.stringify(config.uiActionRequest), config.param, config.content)
605
- .toPromise());
606
- }
607
- async _performUploadMultipleAction(config) {
608
- return await this.handlePerformActionResponse(await this.view
609
- .uploadMultipleAction(config.uuid, JSON.stringify(config.uiActionRequest), config.param, config.content)
610
- .toPromise());
611
- }
612
- async _dataChanged(config) {
613
- return await this.handlePerformActionResponse(await this.view.dataChanged(config.uuid, config.dataChange).toPromise());
614
- }
615
- async handlePerformActionResponse(viewContextChange) {
616
- this.viewContext = viewContextChange?.viewContext;
617
- this.syncView();
618
- if (viewContextChange?.changes) {
619
- this.handleChanges(viewContextChange.changes);
620
- }
621
- return viewContextChange?.result;
622
- }
623
- handleChanges(changes) {
624
- changes.forEach((componentModelChange) => {
625
- let detectChange = this.smartApiClients.get(componentModelChange.uuid);
626
- if (detectChange) {
627
- detectChange.next(componentModelChange);
628
- }
629
- });
630
- }
631
- async load(uuid) {
632
- return await this.view.getComponentModel(uuid).toPromise();
633
- }
634
- async load2(uuid) {
635
- let change = await this.view.getComponentModel2(uuid).toPromise();
636
- this.handlePerformActionResponse(change);
637
- return change;
638
- }
639
- getCurrentViewContext() {
640
- return this.viewContext;
641
- }
642
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, deps: [{ token: i1.ViewService }, { token: i2.SmartSessionService }, { token: i3.SmartNavigationService }, { token: i4.SmartViewContextDialogService }, { token: ApiQueueService }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
643
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, providedIn: 'root' }); }
644
- }
645
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, decorators: [{
646
- type: Injectable,
647
- args: [{
648
- providedIn: 'root',
649
- }]
650
- }], ctorParameters: () => [{ type: i1.ViewService }, { type: i2.SmartSessionService }, { type: i3.SmartNavigationService }, { type: i4.SmartViewContextDialogService }, { type: ApiQueueService }, { type: i0.Injector }] });
651
- export const IS_ASYNC_PARAM_NAME = 'isAsync';
652
- export class ApiQueueService {
653
- constructor() {
654
- this._destroy$ = new Subject();
655
- this.queue = [];
656
- this.isProcessing = false;
657
- this.queueSubject = new SmartSubject(this._destroy$);
658
- this.queueSubject.pipe(takeUntil(this._destroy$)).subscribe(() => this.processQueue());
659
- }
660
- ngOnDestroy() {
661
- this._destroy$.next();
662
- this._destroy$.complete();
663
- }
664
- addToQueue(call, priority = false) {
665
- if (priority) {
666
- this.queue.unshift(call); // Add at the beginning of the queue if it has higher priority
667
- }
668
- else {
669
- this.queue.push(call); // Add at the end of the queue if it has lower priority
670
- }
671
- if (!this.isProcessing) {
672
- this.processQueue();
673
- }
674
- }
675
- async processQueue() {
676
- if (this.queue.length === 0) {
677
- this.isProcessing = false;
678
- return;
679
- }
680
- const apiQueueCall = this.queue.shift();
681
- if (apiQueueCall) {
682
- await apiQueueCall.callback(apiQueueCall.config);
683
- apiQueueCall.isCompleted.complete();
684
- this.queueSubject.next();
685
- }
686
- }
687
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
688
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, providedIn: 'root' }); }
689
- }
690
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, decorators: [{
691
- type: Injectable,
692
- args: [{
693
- providedIn: 'root',
694
- }]
695
- }], ctorParameters: () => [] });
696
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFDLE9BQU8sRUFPTCxjQUFjLEVBV2QsU0FBUyxFQUVULFFBQVEsR0FDVCxNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBUW5GLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7OztBQUV6RCxNQUFNLENBQUMsTUFBTSxzQ0FBc0MsR0FBRyx3Q0FBd0MsQ0FBQztBQUMvRixNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FBRyxrQ0FBa0MsQ0FBQztBQUNuRixNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FBRyxvQ0FBb0MsQ0FBQztBQUN2RixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxlQUFlLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQVUsb0JBQW9CLENBQUMsQ0FBQztBQUt0RixNQUFNLE9BQU8sdUJBQXVCO0lBOEJsQyxJQUFXLGdCQUFnQixDQUFDLGdCQUFtRDtRQUM3RSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsZ0JBQWdCLENBQUM7UUFDMUMsSUFBSSxDQUFDLHVCQUF1QixD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bnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0aW9uVG9rZW4sIEluamVjdG9yLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFNtYXJ0U2Vzc2lvblNlcnZpY2UgfSBmcm9tICcuLi9zZXNzaW9uL3NtYXJ0LXNlc3Npb24uc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQ2xpcGJvYXJkRGF0YSxcclxuICBDb21wb25lbnRNb2RlbCxcclxuICBDb21wb25lbnRNb2RlbENoYW5nZSxcclxuICBEYXRhQ2hhbmdlLFxyXG4gIERvd25sb2FkZWRGaWxlLFxyXG4gIExpbmssXHJcbiAgTGlua1RhcmdldEVudW0sXHJcbiAgTWVzc2FnZURhdGEsXHJcbiAgTWVzc2FnZVJlc3VsdCxcclxuICBVaUFjdGlvbkRlc2NyaXB0b3IsXHJcbiAgVWlBY3Rpb25SZXF1ZXN0LFxyXG4gIFZpZXdDb25zdHJhaW50LFxyXG4gIFZpZXdDb250ZXh0Q2hhbmdlLFxyXG4gIFZpZXdDb250ZXh0RGF0YSxcclxuICBWaWV3Q29udGV4dFVwZGF0ZSxcclxuICBWaWV3RGF0YSxcclxuICBWaWV3U2VydmljZSxcclxuICBWaWV3U3RhdGUsXHJcbiAgVmlld1N0YXRlVXBkYXRlLFxyXG4gIFZpZXdUeXBlLFxyXG59IGZyb20gJy4vYXBpJztcclxuaW1wb3J0IHsgTWVzc2FnZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vbWVzc2FnZS1kaWFsb2cvbWVzc2FnZS1kaWFsb2cuY29tcG9uZW50JztcclxuaW1wb3J0IHtcclxuICBTbWFydFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgU21hcnRWaWV3Q29udGV4dEFwaUVycm9yLFxyXG4gIFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMsXHJcbiAgU21hcnRWaWV3RGlhbG9nUmVmLFxyXG4gIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCxcclxufSBmcm9tICcuL3NtYXJ0LXZpZXctY29udGV4dC5tb2RlbCc7XHJcbmltcG9ydCB7IFNtYXJ0U3ViamVjdCB9IGZyb20gJy4uL3NtYXJ0LXN1YmplY3QvcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBTbWFydE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vc21hcnQtbmF2aWdhdGlvbi9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IFNtYXJ0Vmlld0NvbnRleHREaWFsb2dTZXJ2aWNlIH0gZnJvbSAnLi9zbWFydC12aWV3LWNvbnRleHQtZGlhbG9nLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBEeW5hbWljRGlhbG9nUmVmIH0gZnJvbSAncHJpbWVuZy9keW5hbWljZGlhbG9nJztcclxuXHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbCA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dCdXR0b25MYWJlbCc7XHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSc7XHJcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlID0gJ1NtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ01lc3NhZ2UnO1xyXG5leHBvcnQgY29uc3QgRGVmYXVsdFVpQWN0aW9uQ29kZV9DTE9TRSA9ICdERUZBVUxUX0NMT1NFJztcclxuXHJcbmV4cG9ydCBjb25zdCBESUFMT0dfRElTQUJMRV9DTE9TRSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPignZGlhbG9nRGlzYWJsZUNsb3NlJyk7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgU21hcnRWaWV3Q29udGV4dFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRleHRVdWlkTmFtZTogc3RyaW5nID0gJ3ZpZXdDb250ZXh0VXVpZCc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3Q29udGV4dFV1aWRIZWFkZXJOYW1lOiBzdHJpbmcgPSAndmlld0NvbnRleHRVdWlkJztcclxuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VOYW1lUHJlZml4OiBzdHJpbmcgPSAncGFnZS4nO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50TmFtZVByZWZpeDogc3RyaW5nID0gJ2NvbXBvbmVudC4nO1xyXG4gIHB1YmxpYyBtZXNzYWdlRGlhbG9nbmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgdXJsPzogc3RyaW5nO1xyXG4gIHByaXZhdGUgdmlld0NvbnRleHQ/OiBWaWV3Q29udGV4dERhdGE7XHJcbiAgcHJpdmF0ZSB2aWV3SGFuZGxlcnM6IEFycmF5PFNtYXJ0Vmlld0hhbmRsZXJNb2RlbD4gPSBuZXcgQXJyYXkoKTtcclxuICBwcml2YXRlIG9wZW5lZFZpZXdVdWlkczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheSgpO1xyXG4gIHByaXZhdGUgb3BlbmVkVmlld0RhdGE6IEFycmF5PFZpZXdEYXRhPiA9IG5ldyBBcnJheSgpO1xyXG5cclxuICBwcml2YXRlIF9kZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgcHVibGljIHV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZDogU3ViamVjdDxzdHJpbmc+ID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XHJcbiAgcHVibGljIHZpZXdDb250ZXh0SGFzQmVlblN5bmNlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVJ1bm5pbmc6IFN1YmplY3Q8Vmlld0NvbnRleHREYXRhPiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHVibGljIHNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnM/OiBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzO1xyXG5cclxuICBwdWJsaWMgb3BlblNtYXJ0TGluazogU3ViamVjdDx2b2lkPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xyXG4gIHB1YmxpYyBpc09wZW5pbmdTbWFydExpbms6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBkaWFsb2dSZWZzOiBTbWFydFZpZXdEaWFsb2dSZWZbXSA9IFtdO1xyXG5cclxuICBwcml2YXRlIGFjdGlvbkRlc2NyaXB0b3JzPzogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPjtcclxuXHJcbiAgcHVibGljIGNvbW1vbkZlZWRiYWNrVGV4dD86IHN0cmluZztcclxuXHJcbiAgcHVibGljIHNtYXJ0QXBpQ2xpZW50czogTWFwPHN0cmluZywgU21hcnRTdWJqZWN0PGFueT4+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBwdWJsaWMgc2V0IHRyYW5zbGF0ZVNlcnZpY2UodHJhbnNsYXRlU2VydmljZTogU21hcnRUcmFuc2xhdGVTZXJ2aWNlIHwgdW5kZWZpbmVkKSB7XHJcbiAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlID0gdHJhbnNsYXRlU2VydmljZTtcclxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZUNoYW5nZWQubmV4dCgpO1xyXG4gICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlQ2hhbmdlZC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0cmFuc2xhdGVTZXJ2aWNlKCk6IFNtYXJ0VHJhbnNsYXRlU2VydmljZSB8IHVuZGVmaW5lZCB7XHJcbiAgICBpZiAodGhpcy5fdHJhbnNsYXRlU2VydmljZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fdHJhbnNsYXRlU2VydmljZTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlPzogU21hcnRUcmFuc2xhdGVTZXJ2aWNlO1xyXG4gIHB1YmxpYyB0cmFuc2xhdGVTZXJ2aWNlQ2hhbmdlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdmlldzogVmlld1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlc3Npb246IFNtYXJ0U2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb246IFNtYXJ0TmF2aWdhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZzogU21hcnRWaWV3Q29udGV4dERpYWxvZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGFwaVF1ZXVlU2VydmljZTogQXBpUXVldWVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBpbmplY3Q6IEluamVjdG9yXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9sbG93KHV1aWQ6IHN0cmluZywgZGV0ZWN0Q2hhbmdlOiBTbWFydFN1YmplY3Q8YW55Pik6IHZvaWQge1xyXG4gICAgdGhpcy5zbWFydEFwaUNsaWVudHMuc2V0KHV1aWQsIGRldGVjdENoYW5nZSk7XHJcbiAgfVxyXG4gIHB1YmxpYyB1bmZvbGxvdyh1dWlkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuc21hcnRBcGlDbGllbnRzLmRlbGV0ZSh1dWlkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRBY3Rpb25EZXNjcmlwdG9ycyhhY3Rpb25EZXNjcmlwdG9yczogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPik6IHZvaWQge1xyXG4gICAgdGhpcy5hY3Rpb25EZXNjcmlwdG9ycyA9IGFjdGlvbkRlc2NyaXB0b3JzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldEFjdGlvbkRlc2NyaXB0b3JzKCk6IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj4gfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKCF0aGlzLmFjdGlvbkRlc2NyaXB0b3JzKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ05vIGFjdGlvbiBkZXNjcmlwdG9ycyBoYXMgYmVlbiBzZXQgdG8gVmlld0NvbnRleHQuJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5hY3Rpb25EZXNjcmlwdG9ycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaWV3SGFuZGxlcnModmlld0hhbmRsZXJzOiBBcnJheTxTbWFydFZpZXdIYW5kbGVyTW9kZWw+KTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdIYW5kbGVycyA9IHZpZXdIYW5kbGVycztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRWaWV3QXBpRXJyb3JzKHZpZXdBcGlFcnJvcnM6IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMpOiB2b2lkIHtcclxuICAgIHRoaXMuc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycyA9IHZpZXdBcGlFcnJvcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0TWVzc2FnZURpYWxvZ05hbWUobWVzc2FnZURpYWxvZ05hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSA9IG1lc3NhZ2VEaWFsb2dOYW1lO1xyXG4gICAgdGhpcy52aWV3SGFuZGxlcnMucHVzaCh7XHJcbiAgICAgIG5hbWU6IG1lc3NhZ2VEaWFsb2dOYW1lLFxyXG4gICAgICBjb21wb25lbnQ6IE1lc3NhZ2VEaWFsb2dDb21wb25lbnQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VXBVcmxGb3JWaWV3U2VydmljZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlldy5jb25maWd1cmF0aW9uLmJhc2VQYXRoID0gdGhpcy51cmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VXJsKHVybDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLnVybCA9IHVybCArICcvdmlldyc7XHJcbiAgICB0aGlzLnNldFVwVXJsRm9yVmlld1NlcnZpY2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRBbmRTeW5jVmlld0NvbnRleHQodXVpZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCF1dWlkKSB7XHJcbiAgICAgIHV1aWQgPSB0aGlzLmdldFZpZXdDb250ZXh0VXVpZCgpO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5zeW5jVmlldygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnRleHQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGE+IHtcclxuICAgIHRoaXMudmlld0NvbnRleHQgPSBhd2FpdCB0aGlzLnZpZXcuZ2V0Vmlld0NvbnRleHQodXVpZCkudG9Qcm9taXNlKCk7XHJcbiAgICBpZiAoIXRoaXMudmlld0NvbnRleHQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWaWV3Q29udGV4dCBkb2VzIG5vdCBleGlzdCB3aXRoIHRoZSBnaXZlbiB1dWlkLicpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnRleHREYXRhQnlQYWdlTmFtZShwYWdlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxWaWV3RGF0YT4ge1xyXG4gICAgaWYgKCF0aGlzLnZpZXdDb250ZXh0KSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0NvbnRleHQodGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKSk7XHJcbiAgICB9XHJcbiAgICBsZXQgcGFnZVV1aWQgPSB0aGlzLmdldFV1aWRPZlBhZ2UocGFnZU5hbWUpO1xyXG5cclxuICAgIGxldCB2aWV3Q29udGV4dEJ5UGFnZU5hbWUgPSB0aGlzLnZpZXdDb250ZXh0Py52aWV3cy5maW5kKCh2aWV3KSA9PiB2aWV3LnV1aWQgPT09IHBhZ2VVdWlkKTtcclxuICAgIGlmICghdmlld0NvbnRleHRCeVBhZ2VOYW1lKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFZpZXdEYXRhIG9mICR7cGFnZU5hbWV9IGlzIG5vdCBmb3VuZCFgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2aWV3Q29udGV4dEJ5UGFnZU5hbWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgdXBkYXRlVmlld0NvbnRleHQoXHJcbiAgICB2aWV3Q29udGV4dFVwZGF0ZTogVmlld0NvbnRleHRVcGRhdGVcclxuICApOiBQcm9taXNlPFZpZXdDb250ZXh0RGF0YSB8IHVuZGVmaW5lZD4ge1xyXG4gICAgdGhpcy52aWV3Q29udGV4dCA9IGF3YWl0IHRoaXMudmlldy51cGRhdGVWaWV3Q29udGV4dCh2aWV3Q29udGV4dFVwZGF0ZSkudG9Qcm9taXNlKCk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsZWFyU2Vzc2lvblN0b3JhZ2UoKTogdm9pZCB7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5jbGVhcigpO1xyXG4gICAgdGhpcy5vcGVuZWRWaWV3RGF0YSA9IFtdO1xyXG4gICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMgPSBbXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzdGFydFZpZXdDb250ZXh0KCk6IFByb21pc2U8Vmlld0NvbnRleHREYXRhPiB7XHJcbiAgICB0aGlzLmNsZWFyU2Vzc2lvblN0b3JhZ2UoKTtcclxuXHJcbiAgICBsZXQgbmV3Vmlld0NvbnRleHQ6IFZpZXdDb250ZXh0RGF0YSB8IHVuZGVmaW5lZCA9IGF3YWl0IHRoaXMudmlld1xyXG4gICAgICAuY3JlYXRlVmlld0NvbnRleHQoKVxyXG4gICAgICAudG9Qcm9taXNlKCk7XHJcbiAgICBpZiAoIW5ld1ZpZXdDb250ZXh0KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gVmlld0NvbnRleHQgd2FzIGNyZWF0ZWQnKTtcclxuICAgIH1cclxuICAgIHRoaXMudmlld0NvbnRleHQgPSBuZXdWaWV3Q29udGV4dDtcclxuICAgIHRoaXMuc2V0Vmlld0NvbnRleHRVdWlkKG5ld1ZpZXdDb250ZXh0LnV1aWQhKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplKHV1aWQ/OiBzdHJpbmcpOiBQcm9taXNlPFZpZXdDb250ZXh0RGF0YSB8IHVuZGVmaW5lZD4ge1xyXG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcudG9Qcm9taXNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRpYWxpemVSdW5uaW5nID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgaWYgKHRoaXMudmlld0hhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICBcIlRoZXJlIGFyZW4ndCBhbnkgdmlld0hhbmRsZXJzIGluIFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlISBQcm92aWRlIHNvbWUgdG8gdXNlIGl0cyBmdW5jdGlvbnMuXCJcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgbWVzc2FnZURpYWxvZ05hbWUgcHJvdmlkZWQgYnkgdGhlIGJhY2tlbmQgaGFzIG5vdCBiZWVuIHNldC4nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHV1aWQpIHtcclxuICAgICAgICAgIHRoaXMuc2V0Vmlld0NvbnRleHRVdWlkKHV1aWQpO1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0Vmlld0NvbnRleHQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5zdGFydFZpZXdDb250ZXh0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy52aWV3Q29udGV4dCE7XHJcbiAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplUnVubmluZy5uZXh0KHRoaXMudmlld0NvbnRleHQhKTtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVSdW5uaW5nLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplUnVubmluZyA9IHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5WaWV3KHZpZXc6IFZpZXdEYXRhKTogVmlld1N0YXRlVXBkYXRlIHwgdW5kZWZpbmVkIHtcclxuICAgIGxldCBhbHJlYWR5T3BlbmVkID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuc29tZSgodXVpZCkgPT4gdXVpZCA9PT0gdmlldy51dWlkKTtcclxuICAgIGlmIChhbHJlYWR5T3BlbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xyXG5cclxuICAgIGxldCB2aWV3SGFuZGxlcjogU21hcnRWaWV3SGFuZGxlck1vZGVsIHwgdW5kZWZpbmVkID0gdGhpcy52aWV3SGFuZGxlcnMuZmluZChcclxuICAgICAgKGhhbmRsZXIpID0+IGhhbmRsZXIubmFtZSA9PT0gdmlldy52aWV3TmFtZVxyXG4gICAgKTtcclxuXHJcbiAgICBpZiAoIXZpZXdIYW5kbGVyKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU21hcnRWaWV3SGFuZGxlck1vZGVsIHdhcyBub3QgZm91bmQgYnkgdmlldyBuYW1lOiAke3ZpZXcudmlld05hbWV9YCk7XHJcbiAgICB9XHJcbiAgICBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5ESUFMT0cpIHtcclxuICAgICAgaWYgKCF2aWV3SGFuZGxlci5jb21wb25lbnQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBgQ29tcG9uZW50IGlzIHVuZGVmaW5lZCBpbiBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2l0aCBuYW1lOiAke3ZpZXcudmlld05hbWV9YFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHJlZklzQWxyYWR5QWRkZWQgPSB0aGlzLmRpYWxvZ1JlZnMuc29tZShcclxuICAgICAgICAocmVmOiBTbWFydFZpZXdEaWFsb2dSZWYpID0+IHJlZi51dWlkID09PSB2aWV3LnV1aWRcclxuICAgICAgKTtcclxuICAgICAgaWYgKCFyZWZJc0FscmFkeUFkZGVkKSB7XHJcbiAgICAgICAgbGV0IGRpYWxvZ1JlZjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMucHVzaCh2aWV3LnV1aWQpO1xyXG4gICAgICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5wdXNoKHZpZXcpO1xyXG4gICAgICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XHJcbiAgICAgICAgICBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuQ29tcG9uZW50QXNEaWFsb2codmlld0hhbmRsZXIuY29tcG9uZW50LCB2aWV3SGFuZGxlci5uYW1lKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm9wZW5lZFZpZXdVdWlkcy5pbmRleE9mKHZpZXcudXVpZCk7XHJcbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHRoaXMuc2V0VXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3LnV1aWQsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZGlhbG9nRGlzYWJsZUNsb3NlID0gdHJ1ZTtcclxuICAgICAgICBsZXQgaXNNZXNzYWdlRGlhbG9nID0gdmlldy52aWV3TmFtZSA9PT0gdGhpcy5tZXNzYWdlRGlhbG9nbmFtZTtcclxuICAgICAgICBpZiAoIWlzTWVzc2FnZURpYWxvZykge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGlhbG9nRGlzYWJsZUNsb3NlID0gdGhpcy5pbmplY3QuZ2V0KERJQUxPR19ESVNBQkxFX0NMT1NFKTtcclxuICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgcmVhZGluZyBESUFMT0dfRElTQUJMRV9DTE9TRScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGlhbG9nUmVmIGluc3RhbmNlb2YgTWF0RGlhbG9nUmVmKSB7XHJcbiAgICAgICAgICBkaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gZGlhbG9nRGlzYWJsZUNsb3NlO1xyXG4gICAgICAgICAgLy8gaWYgKGlzTWVzc2FnZURpYWxvZykge1xyXG4gICAgICAgICAgLy8gICBpZiAodmlldy5tZXNzYWdlPy5vcHRpb25zICYmIHZpZXcubWVzc2FnZS5vcHRpb25zLmxlbmd0aCkge1xyXG4gICAgICAgICAgLy8gICB9XHJcbiAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICBpZiAoIWRpYWxvZ0Rpc2FibGVDbG9zZSkge1xyXG4gICAgICAgICAgICBkaWFsb2dSZWZcclxuICAgICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxyXG4gICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb24odmlldy51dWlkLCB7IGNvZGU6IERlZmF1bHRVaUFjdGlvbkNvZGVfQ0xPU0UsIHBhcmFtczoge30gfSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChkaWFsb2dSZWYgaW5zdGFuY2VvZiBEeW5hbWljRGlhbG9nUmVmKSB7XHJcbiAgICAgICAgICBpZiAoIWRpYWxvZ0Rpc2FibGVDbG9zZSkge1xyXG4gICAgICAgICAgICBkaWFsb2dSZWYub25EZXN0cm95LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb24odmlldy51dWlkLCB7IGNvZGU6IERlZmF1bHRVaUFjdGlvbkNvZGVfQ0xPU0UsIHBhcmFtczoge30gfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kaWFsb2dSZWZzLnB1c2goe1xyXG4gICAgICAgICAgdXVpZDogdmlldy51dWlkLFxyXG4gICAgICAgICAgZGlhbG9nUmVmLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuTk9STUFMKSB7XHJcbiAgICAgIGlmICh2aWV3SGFuZGxlci5yb3V0ZSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb3V0ZSBpcyB1bmRlZmluZWQgaW4gU21hcnRWaWV3SGFuZGxlck1vZGVsIHdpdGggbmFtZTogJHt2aWV3LnZpZXdOYW1lfWApO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubmF2aWdhdGlvbi5uYXZpZ2F0ZVRvKHZpZXdIYW5kbGVyLnJvdXRlLnNwbGl0KCcvJykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdHlwZSBvZiB0aGUgdmlldyBhbmQgaXRzIHZpZXdIYW5kbGVyIGlzIG5vdCB0aGUgc2FtZSEnKTtcclxuICAgIH1cclxuXHJcbiAgICB2aWV3LnN0YXRlID0gVmlld1N0YXRlLk9QRU5FRDtcclxuXHJcbiAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5wdXNoKHZpZXcudXVpZCk7XHJcbiAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnB1c2godmlldyk7XHJcblxyXG4gICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XHJcbiAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZC5uZXh0KHZpZXcudmlld05hbWUpO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHN0YXRlOiBWaWV3U3RhdGUuT1BFTkVELFxyXG4gICAgICB1dWlkOiB2aWV3LnV1aWQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlVmlldyh2aWV3OiBWaWV3RGF0YSk6IFZpZXdTdGF0ZVVwZGF0ZSB7XHJcbiAgICBsZXQgdmlld0hhbmRsZXI6IFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB8IHVuZGVmaW5lZCA9IHRoaXMudmlld0hhbmRsZXJzLmZpbmQoXHJcbiAgICAgIChoYW5kbGVyKSA9PiBoYW5kbGVyLm5hbWUgPT09IHZpZXcudmlld05hbWVcclxuICAgICk7XHJcblxyXG4gICAgaWYgKCF2aWV3SGFuZGxlcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3YXMgbm90IGZvdW5kIGJ5IHZpZXcgbmFtZTogJHt2aWV3LnZpZXdOYW1lfWApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLkRJQUxPRykge1xyXG4gICAgICBsZXQgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2dSZWZzLmZpbmQoXHJcbiAgICAgICAgKGRpYWxvZ1JlZjogU21hcnRWaWV3RGlhbG9nUmVmKSA9PiBkaWFsb2dSZWYudXVpZCA9PT0gdmlldy51dWlkXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChkaWFsb2dSZWYpIHtcclxuICAgICAgICBkaWFsb2dSZWYuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kaWFsb2dSZWZzLmluZGV4T2YoZGlhbG9nUmVmKTtcclxuICAgICAgICB0aGlzLmRpYWxvZ1JlZnMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLmxvZygnRGlhbG9nUmVmIGlzIG5vdCBmb3VuZCBieSB1dWlkLicpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuTk9STUFMKSB7XHJcbiAgICAgIC8vIFRPRE86IGNsb3NlIG5vcm1hbCBwYWdlPz8/XHJcbiAgICAgIC8vIHRoaXMubmF2aWdhdGlvbi5uYXZpZ2F0ZVRvKHZpZXdIYW5kbGVyLnJvdXRlLnNwbGl0KFwiL1wiKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSB0eXBlIG9mIHRoZSB2aWV3IGFuZCBpdHMgdmlld0hhbmRsZXIgaXMgbm90IHRoZSBzYW1lIScpO1xyXG4gICAgfVxyXG5cclxuICAgIHZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuQ0xPU0VEO1xyXG5cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZih2aWV3LnV1aWQpO1xyXG4gICAgaWYgKGluZGV4ID49IDApIHtcclxuICAgICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLmNsZWFyVXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3SGFuZGxlci5jb21wb25lbnROYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBzdGF0ZTogVmlld1N0YXRlLkNMT1NFRCxcclxuICAgICAgdXVpZDogdmlldy51dWlkLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VuZFZpZXdDb250ZXh0VXBkYXRlcyh1cGRhdGVzVG9TZW5kOiAoVmlld1N0YXRlVXBkYXRlIHwgdW5kZWZpbmVkKVtdKSB7XHJcbiAgICBjb25zdCB1cGRhdGVzOiBWaWV3U3RhdGVVcGRhdGVbXSA9IFtdO1xyXG4gICAgdXBkYXRlc1RvU2VuZC5mb3JFYWNoKCh1cGRhdGUpID0+IHtcclxuICAgICAgaWYgKHVwZGF0ZSAhPT0gdW5kZWZpbmVkICYmIHVwZGF0ZSAhPT0gbnVsbCkgdXBkYXRlcy5wdXNoKHVwZGF0ZSk7XHJcbiAgICB9KTtcclxuICAgIGlmICh1cGRhdGVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy51cGRhdGVWaWV3Q29udGV4dCh7XHJcbiAgICAgICAgdXBkYXRlcyxcclxuICAgICAgICB1dWlkOiB0aGlzLnZpZXdDb250ZXh0Py51dWlkLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgcHVibGljIGFzeW5jIHJlc3RvcmVWaWV3cyh1dWlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHVwZGF0ZXM6IFZpZXdTdGF0ZVVwZGF0ZVtdID0gW107XHJcbiAgICBpZiAoIXRoaXMudmlld0NvbnRleHQpIHtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnZpZXdDb250ZXh0IS52aWV3cy5maWx0ZXIoXHJcbiAgICAgICh2aWV3KSA9PiB2aWV3LnN0YXRlID09PSBWaWV3U3RhdGUuT1BFTkVEIHx8IHZpZXcuc3RhdGUgPT09IFZpZXdTdGF0ZS5UT19PUEVOXHJcbiAgICApLm1hcCgodmlldzogVmlld0RhdGEpID0+IHtcclxuICAgICAgY29uc3QgdXBkYXRlID0gdGhpcy5vcGVuVmlldyh2aWV3KTtcclxuICAgICAgaWYgKHVwZGF0ZSkge1xyXG4gICAgICAgIHVwZGF0ZXMucHVzaCh1cGRhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2VuZFZpZXdDb250ZXh0VXBkYXRlcyh1cGRhdGVzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzeW5jVmlldygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHVwZGF0ZXM6IChWaWV3U3RhdGVVcGRhdGUgfCB1bmRlZmluZWQpW10gPSBbXTtcclxuICAgIHRoaXMudmlld0NvbnRleHQ/LnZpZXdzLm1hcCgodmlldzogVmlld0RhdGEpID0+IHtcclxuICAgICAgc3dpdGNoICh2aWV3LnN0YXRlKSB7XHJcbiAgICAgICAgY2FzZSBWaWV3U3RhdGUuVE9fT1BFTjpcclxuICAgICAgICAgIHVwZGF0ZXMucHVzaCh0aGlzLm9wZW5WaWV3KHZpZXcpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgVmlld1N0YXRlLlRPX0NMT1NFOlxyXG4gICAgICAgICAgdXBkYXRlcy5wdXNoKHRoaXMuY2xvc2VWaWV3KHZpZXcpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB2aWV3RGF0YVRvQ2xvc2UgPSB0aGlzLm9wZW5lZFZpZXdEYXRhLmZpbHRlcihcclxuICAgICAgKHZpZXdEYXRhOiBWaWV3RGF0YSkgPT5cclxuICAgICAgICAhdGhpcy52aWV3Q29udGV4dD8udmlld3NcclxuICAgICAgICAgIC5mbGF0TWFwKCh2aWV3RGF0YTogVmlld0RhdGEpID0+IHZpZXdEYXRhLnV1aWQpXHJcbiAgICAgICAgICAuaW5jbHVkZXModmlld0RhdGEudXVpZClcclxuICAgICk7XHJcbiAgICBpZiAodmlld0RhdGFUb0Nsb3NlPy5sZW5ndGgpIHtcclxuICAgICAgdmlld0RhdGFUb0Nsb3NlLm1hcCgodmlld0RhdGE6IFZpZXdEYXRhKSA9PiB7XHJcbiAgICAgICAgdXBkYXRlcy5wdXNoKHRoaXMuY2xvc2VWaWV3KHZpZXdEYXRhKSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZW5kVmlld0NvbnRleHRVcGRhdGVzKHVwZGF0ZXMpO1xyXG5cclxuICAgIHRoaXMudmlld0NvbnRleHQ/LmxpbmtzPy5tYXAoKGRhdGE6IExpbmspID0+IHtcclxuICAgICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgICAgbGV0IHRhcmdldCA9ICdfYmxhbmsnOyAvLyBkZWZhdWx0XHJcbiAgICAgIHN3aXRjaCAoZGF0YS50YXJnZXQgPz8gTGlua1RhcmdldEVudW0uQkxBTkspIHtcclxuICAgICAgICBjYXNlICdTRUxGJzpcclxuICAgICAgICAgIHRhcmdldCA9ICdfc2VsZic7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdCTEFOSyc6XHJcbiAgICAgICAgICB0YXJnZXQgPSAnX2JsYW5rJztcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgJ1BBUkVOVCc6XHJcbiAgICAgICAgICB0YXJnZXQgPSAnX3BhcmVudCc7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlICdUT1AnOlxyXG4gICAgICAgICAgdGFyZ2V0ID0gJ190b3AnO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIHRhcmdldCk7XHJcbiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdocmVmJywgZGF0YS51cmwpO1xyXG4gICAgICBpZiAoZGF0YS5kb3dubG9hZCkge1xyXG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGRhdGEuZmlsZW5hbWUgPz8gJycpO1xyXG4gICAgICB9XHJcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XHJcbiAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgbGluay5yZW1vdmUoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudmlld0NvbnRleHQ/LmRvd25sb2Fkcz8ubWFwKGFzeW5jIChmaWxlOiBEb3dubG9hZGVkRmlsZSk6IFByb21pc2U8dm9pZD4gPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGxldCBibG9iID0gYXdhaXQgdGhpcy5kb3dubG9hZFJlc291cmNlKGZpbGUudXVpZCEsIGZpbGUuaWRlbnRpZmllciEpO1xyXG4gICAgICAgIGxldCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG5cclxuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCd0YXJnZXQnLCAnX2JsYW5rJyk7XHJcbiAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCB1cmwpO1xyXG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGUuZmlsZW5hbWUhKTtcclxuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgIGxpbmsuY2xpY2soKTtcclxuICAgICAgICBsaW5rLnJlbW92ZSgpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZG93bmxvYWRpbmcgZmlsZScpO1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGNsaXBib2FyZFRleHQgPSB0aGlzLnZpZXdDb250ZXh0Py5jbGlwYm9hcmREYXRhXHJcbiAgICAgID8ubWFwKChjZDogQ2xpcGJvYXJkRGF0YSkgPT4gY2QudGV4dCB8fCAnJylcclxuICAgICAgLmpvaW4oJycpO1xyXG4gICAgaWYgKGNsaXBib2FyZFRleHQpIHtcclxuICAgICAgY29uc3QgY2xpcGJvYXJkID0gbmF2aWdhdG9yLmNsaXBib2FyZDtcclxuICAgICAgLy8gYXZhaWxhYmxlIG9ubHkgaW4gc2VjdXJlIGNvbnRleHRzLlxyXG4gICAgICBpZiAoY2xpcGJvYXJkKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNsaXBib2FyZFxyXG4gICAgICAgICAgICAud3JpdGVUZXh0KGNsaXBib2FyZFRleHQpXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4gY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNvcHkgdGV4dCB0byBjbGlwYm9hcmQnLCBlKSk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIGNsaXBib2FyZCcsIGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlld0NvbnRleHRIYXNCZWVuU3luY2VkLm5leHQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0Vmlld0NvbnRleHRVdWlkKHV1aWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnZpZXdDb250ZXh0VXVpZE5hbWUsIHV1aWQpO1xyXG4gICAgdGhpcy5zZXNzaW9uLmFkZEhlYWRlclBhcmFtKHtcclxuICAgICAgaGVhZGVyTmFtZTogdGhpcy52aWV3Q29udGV4dFV1aWRIZWFkZXJOYW1lLFxyXG4gICAgICB2YWx1ZTogdXVpZCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFZpZXdDb250ZXh0VXVpZCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IHZpZXdDb250ZXh0VXVpZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy52aWV3Q29udGV4dFV1aWROYW1lKTtcclxuICAgIGlmICghdmlld0NvbnRleHRVdWlkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmlldyBjb250ZXh0IGlzIG5vdCBpbml0aWFsaXplZCEnKTtcclxuICAgIH1cclxuICAgIHJldHVybiB2aWV3Q29udGV4dFV1aWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFzVmlld0NvbnRleHRVdWlkKCk6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHZpZXdDb250ZXh0VXVpZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy52aWV3Q29udGV4dFV1aWROYW1lKTtcclxuICAgIHJldHVybiB2aWV3Q29udGV4dFV1aWQgIT09IG51bGwgJiYgdmlld0NvbnRleHRVdWlkICE9PSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VXVpZE9mUGFnZShwYWdlTmFtZTogc3RyaW5nLCB1dWlkOiBzdHJpbmcsIGNvbXBvbmVudE5hbWU/OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5wYWdlTmFtZVByZWZpeCArIHBhZ2VOYW1lLCB1dWlkKTtcclxuICAgIGlmIChjb21wb25lbnROYW1lKSB7XHJcbiAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5jb21wb25lbnROYW1lUHJlZml4ICsgY29tcG9uZW50TmFtZSwgcGFnZU5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsZWFyVXVpZE9mUGFnZShwYWdlTmFtZTogc3RyaW5nLCBjb21wb25lbnROYW1lPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMucGFnZU5hbWVQcmVmaXggKyBwYWdlTmFtZSk7XHJcbiAgICBpZiAoY29tcG9uZW50TmFtZSkge1xyXG4gICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuY29tcG9uZW50TmFtZVByZWZpeCArIGNvbXBvbmVudE5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFV1aWRPZlBhZ2UocGFnZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgdXVpZCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0odGhpcy5wYWdlTmFtZVByZWZpeCArIHBhZ2VOYW1lKTtcclxuICAgIGlmICghdXVpZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSB1dWlkIG9mICR7cGFnZU5hbWV9IGlzIG5vdCBhdmFpbGFibGUuYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXVpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRQYWdlTmFtZU9mQ29tcG9uZW50KGNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBsZXQgcGFnZU5hbWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMuY29tcG9uZW50TmFtZVByZWZpeCArIGNvbXBvbmVudE5hbWUpO1xyXG4gICAgaWYgKCFwYWdlTmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYWdlTmFtZSBvZiAke2NvbXBvbmVudE5hbWV9IGlzIG5vdCBhdmFpbGFibGUuYCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcGFnZU5hbWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbWVzc2FnZShtZXNzYWdlRGF0YTogTWVzc2FnZURhdGEsIG1lc3NhZ2VSZXN1bHQ6IE1lc3NhZ2VSZXN1bHQpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcclxuICAgICAgYXdhaXQgdGhpcy52aWV3XHJcbiAgICAgICAgLm1lc3NhZ2UobWVzc2FnZURhdGEudmlld1V1aWQgPz8gJycsIG1lc3NhZ2VEYXRhLnV1aWQsIG1lc3NhZ2VSZXN1bHQpXHJcbiAgICAgICAgLnRvUHJvbWlzZSgpXHJcbiAgICApO1xyXG4gICAgLy8gaW4gZnV0dXJlIHVzZSB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0U21hcnRWaWV3Q29udGV4dEFwaUVycm9yQnlDb2RlKGNvZGU6IHN0cmluZyk6IFByb21pc2U8U21hcnRWaWV3Q29udGV4dEFwaUVycm9yPiB7XHJcbiAgICBsZXQgYnV0dG9uTGFiZWw7XHJcbiAgICBsZXQgZGlhbG9nVGl0bGU7XHJcbiAgICBsZXQgbWVzc2FnZTtcclxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICAgICAgYnV0dG9uTGFiZWwgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VcclxuICAgICAgICAuZ2V0KFNtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ0J1dHRvbkxhYmVsKVxyXG4gICAgICAgIC50b1Byb21pc2UoKTtcclxuICAgICAgZGlhbG9nVGl0bGUgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KFNtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ1RpdGxlKS50b1Byb21pc2UoKTtcclxuICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMudHJhbnNsYXRlU2VydmljZS5nZXQoU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nTWVzc2FnZSkudG9Qcm9taXNlKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBidXR0b25MYWJlbCA9ICdPayc7XHJcbiAgICAgIGRpYWxvZ1RpdGxlID0gJ0hpYmEnO1xyXG4gICAgICBtZXNzYWdlID0gJ0FuIGVycm9yIGhhcyBvY2N1cmVkLic7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMpIHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjb2RlLFxyXG4gICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgYnV0dG9uTGFiZWwsXHJcbiAgICAgICAgZGlhbG9nVGl0bGUsXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBsZXQgYXBpRXJyb3JzV2l0aENvZGUgPSB0aGlzLnNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMudmlld0NvbnRleHRBcGlFcnJvcnMuZmlsdGVyKFxyXG4gICAgICAoYXBpRXJyb3I6IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcikgPT4ge1xyXG4gICAgICAgIHJldHVybiBhcGlFcnJvci5jb2RlID09PSBjb2RlO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgaWYgKCFhcGlFcnJvcnNXaXRoQ29kZSB8fCAoYXBpRXJyb3JzV2l0aENvZGUgJiYgIWFwaUVycm9yc1dpdGhDb2RlLmxlbmd0aCkpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihgU21hcnRWaWV3Q29udGV4dEFwaUVycm9yIHdpdGggY29kZSAke2NvZGV9IGNvdWxkIG5vdCBiZSBmb3VuZC5gKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgY29kZSxcclxuICAgICAgICBtZXNzYWdlLFxyXG4gICAgICAgIGJ1dHRvbkxhYmVsLFxyXG4gICAgICAgIGRpYWxvZ1RpdGxlLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFwaUVycm9yc1dpdGhDb2RlWzBdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFZpZXdDb25zdHJhaW50KHV1aWQ6IHN0cmluZyk6IFByb21pc2U8Vmlld0NvbnN0cmFpbnQ+IHtcclxuICAgIGxldCB2aWV3Q29uc3RyYWludFJlc3BvbnNlID0gYXdhaXQgdGhpcy52aWV3LmdldFZpZXdDb25zdHJhaW50KHV1aWQpLnRvUHJvbWlzZSgpO1xyXG4gICAgaWYgKCF2aWV3Q29uc3RyYWludFJlc3BvbnNlKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgVmlld0NvbnN0cmFpbnQgd2l0aCB0aGUgZ2l2ZW4gdXVpZC4nKTtcclxuICAgIHJldHVybiB2aWV3Q29uc3RyYWludFJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNob3dQdWJsaXNoZWRWaWV3KGNoYW5uZWw6IHN0cmluZywgdXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzT3BlbmluZ1NtYXJ0TGluayA9IHRydWU7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5zZXNzaW9uLmluaXRpYWxpemUoKTtcclxuICAgIC8vIFRPRE8gaW5pdCB2aWV3IGNvbnRleHQgYXV0b21hdGljYWxseVxyXG4gICAgLy8gYXdhaXQgdGhpcy5pbml0aWFsaXplKCk7XHJcblxyXG4gICAgdGhpcy5vcGVuU21hcnRMaW5rLm5leHQoKTtcclxuICAgIGF3YWl0IHRoaXMub3BlblNtYXJ0TGluay50b1Byb21pc2UoKTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLnZpZXcuc2hvd1B1Ymxpc2hlZFZpZXcoY2hhbm5lbCwgdXVpZCkudG9Qcm9taXNlKCk7XHJcbiAgICBhd2FpdCB0aGlzLmdldEFuZFN5bmNWaWV3Q29udGV4dCgpO1xyXG4gICAgdGhpcy5pc09wZW5pbmdTbWFydExpbmsgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkb3dubG9hZFJlc291cmNlKHV1aWQ6IHN0cmluZywgaXRlbTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnZpZXcuZG93bmxvYWRJdGVtKHV1aWQsIGl0ZW0pLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHBlcmZvcm1BY3Rpb24odXVpZDogc3RyaW5nLCB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3BlcmZvcm1BY3Rpb24oe1xyXG4gICAgICB1dWlkLFxyXG4gICAgICB1aUFjdGlvblJlcXVlc3QsXHJcbiAgICB9KTtcclxuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIC8vIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWUoe1xyXG4gICAgLy8gICBjYWxsYmFjazogdGhpcy5fcGVyZm9ybUFjdGlvbi5iaW5kKHRoaXMpLFxyXG4gICAgLy8gICBjb25maWc6IHtcclxuICAgIC8vICAgICB1dWlkLFxyXG4gICAgLy8gICAgIHVpQWN0aW9uUmVxdWVzdCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgaXNDb21wbGV0ZWQsXHJcbiAgICAvLyB9KTtcclxuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtV2lkZ2V0QWN0aW9uKFxyXG4gICAgdXVpZDogc3RyaW5nLFxyXG4gICAgd2lkZ2V0SWQ6IHN0cmluZyxcclxuICAgIG5vZGVJZDogc3RyaW5nLFxyXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3RcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9wZXJmb3JtV2lkZ2V0QWN0aW9uKHsgdXVpZCwgd2lkZ2V0SWQsIG5vZGVJZCwgdWlBY3Rpb25SZXF1ZXN0IH0pO1xyXG4gICAgLy8gY29uc3QgaXNDb21wbGV0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgLy8gdGhpcy5hcGlRdWV1ZVNlcnZpY2UuYWRkVG9RdWV1ZSh7XHJcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtV2lkZ2V0QWN0aW9uLmJpbmQodGhpcyksXHJcbiAgICAvLyAgIGNvbmZpZzoge1xyXG4gICAgLy8gICAgIHV1aWQsXHJcbiAgICAvLyAgICAgd2lkZ2V0SWQsXHJcbiAgICAvLyAgICAgbm9kZUlkLFxyXG4gICAgLy8gICAgIHVpQWN0aW9uUmVxdWVzdCxcclxuICAgIC8vICAgfSxcclxuICAgIC8vICAgaXNDb21wbGV0ZWQsXHJcbiAgICAvLyB9KTtcclxuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbihcclxuICAgIHV1aWQ6IHN0cmluZyxcclxuICAgIHdpZGdldElkOiBzdHJpbmcsXHJcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdFxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX3BlcmZvcm1XaWRnZXRNYWluQWN0aW9uKHsgdXVpZCwgd2lkZ2V0SWQsIHVpQWN0aW9uUmVxdWVzdCB9KTtcclxuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIC8vIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWUoe1xyXG4gICAgLy8gICBjYWxsYmFjazogdGhpcy5fcGVyZm9ybVdpZGdldE1haW5BY3Rpb24uYmluZCh0aGlzKSxcclxuICAgIC8vICAgY29uZmlnOiB7XHJcbiAgICAvLyAgICAgdXVpZCxcclxuICAgIC8vICAgICB3aWRnZXRJZCxcclxuICAgIC8vICAgICB1aUFjdGlvblJlcXVlc3QsXHJcbiAgICAvLyAgIH0sXHJcbiAgICAvLyAgIGlzQ29tcGxldGVkLFxyXG4gICAgLy8gfSk7XHJcbiAgICAvLyByZXR1cm4gYXdhaXQgaXNDb21wbGV0ZWQudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVVwbG9hZEFjdGlvbihcclxuICAgIHV1aWQ6IHN0cmluZyxcclxuICAgIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0LFxyXG4gICAgcGFyYW06ICdpbnB1dCcgfCAnaW5wdXRcIicsXHJcbiAgICBjb250ZW50OiBhbnlcclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3BlcmZvcm1VcGxvYWRBY3Rpb24oe1xyXG4gICAgICB1dWlkLFxyXG4gICAgICB1aUFjdGlvblJlcXVlc3QsXHJcbiAgICAgIHBhcmFtLFxyXG4gICAgICBjb250ZW50LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVVwbG9hZE11bHRpcGxlQWN0aW9uKFxyXG4gICAgdXVpZDogc3RyaW5nLFxyXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICBwYXJhbTogJ2lucHV0JyB8ICdpbnB1dDInLFxyXG4gICAgY29udGVudDogYW55W11cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuX3BlcmZvcm1VcGxvYWRNdWx0aXBsZUFjdGlvbih7XHJcbiAgICAgIHV1aWQsXHJcbiAgICAgIHVpQWN0aW9uUmVxdWVzdCxcclxuICAgICAgcGFyYW0sXHJcbiAgICAgIGNvbnRlbnQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBkYXRhQ2hhbmdlZCh1dWlkOiBzdHJpbmcsIGRhdGFDaGFuZ2U6IERhdGFDaGFuZ2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9kYXRhQ2hhbmdlZCh7IHV1aWQsIGRhdGFDaGFuZ2UgfSk7XHJcbiAgICAvLyBjb25zdCBpc0NvbXBsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKFxyXG4gICAgLy8gICB7XHJcbiAgICAvLyAgICAgY2FsbGJhY2s6IHRoaXMuX2RhdGFDaGFuZ2VkLmJpbmQodGhpcyksXHJcbiAgICAvLyAgICAgY29uZmlnOiB7XHJcbiAgICAvLyAgICAgICB1dWlkLFxyXG4gICAgLy8gICAgICAgZGF0YUNoYW5nZSxcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICAgIGlzQ29tcGxldGVkLFxyXG4gICAgLy8gICB9LFxyXG4gICAgLy8gICB0cnVlXHJcbiAgICAvLyApO1xyXG4gICAgLy8gcmV0dXJuIGF3YWl0IGlzQ29tcGxldGVkLnRvUHJvbWlzZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcGVyZm9ybUFjdGlvbihjb25maWc6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxyXG4gICAgICBhd2FpdCB0aGlzLnZpZXcucGVyZm9ybUFjdGlvbihjb25maWcudXVpZCwgY29uZmlnLnVpQWN0aW9uUmVxdWVzdCkudG9Qcm9taXNlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtV2lkZ2V0QWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXHJcbiAgICAgIGF3YWl0IHRoaXMudmlld1xyXG4gICAgICAgIC5wZXJmb3JtV2lkZ2V0QWN0aW9uKGNvbmZpZy51dWlkLCBjb25maWcud2lkZ2V0SWQsIGNvbmZpZy5ub2RlSWQsIGNvbmZpZy51aUFjdGlvblJlcXVlc3QpXHJcbiAgICAgICAgLnRvUHJvbWlzZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcGVyZm9ybVdpZGdldE1haW5BY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcclxuICAgICAgYXdhaXQgdGhpcy52aWV3XHJcbiAgICAgICAgLnBlcmZvcm1XaWRnZXRNYWluQWN0aW9uKGNvbmZpZy51dWlkLCBjb25maWcud2lkZ2V0SWQsIGNvbmZpZy51aUFjdGlvblJlcXVlc3QpXHJcbiAgICAgICAgLnRvUHJvbWlzZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfcGVyZm9ybVVwbG9hZEFjdGlvbihjb25maWc6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxyXG4gICAgICBhd2FpdCB0aGlzLnZpZXdcclxuICAgICAgICAudXBsb2FkQWN0aW9uKFxyXG4gICAgICAgICAgY29uZmlnLnV1aWQsXHJcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25maWcudWlBY3Rpb25SZXF1ZXN0KSxcclxuICAgICAgICAgIGNvbmZpZy5wYXJhbSxcclxuICAgICAgICAgIGNvbmZpZy5jb250ZW50XHJcbiAgICAgICAgKVxyXG4gICAgICAgIC50b1Byb21pc2UoKVxyXG4gICAgKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBhc3luYyBfcGVyZm9ybVVwbG9hZE11bHRpcGxlQWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXHJcbiAgICAgIGF3YWl0IHRoaXMudmlld1xyXG4gICAgICAgIC51cGxvYWRNdWx0aXBsZUFjdGlvbihcclxuICAgICAgICAgIGNvbmZpZy51dWlkLFxyXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29uZmlnLnVpQWN0aW9uUmVxdWVzdCksXHJcbiAgICAgICAgICBjb25maWcucGFyYW0sXHJcbiAgICAgICAgICBjb25maWcuY29udGVudFxyXG4gICAgICAgIClcclxuICAgICAgICAudG9Qcm9taXNlKClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9kYXRhQ2hhbmdlZChjb25maWc6IGFueSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXHJcbiAgICAgIGF3YWl0IHRoaXMudmlldy5kYXRhQ2hhbmdlZChjb25maWcudXVpZCwgY29uZmlnLmRhdGFDaGFuZ2UpLnRvUHJvbWlzZSgpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcclxuICAgIHZpZXdDb250ZXh0Q2hhbmdlOiBWaWV3Q29udGV4dENoYW5nZSB8IHVuZGVmaW5lZFxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gdmlld0NvbnRleHRDaGFuZ2U/LnZpZXdDb250ZXh0O1xyXG4gICAgdGhpcy5zeW5jVmlldygpO1xyXG5cclxuICAgIGlmICh2aWV3Q29udGV4dENoYW5nZT8uY2hhbmdlcykge1xyXG4gICAgICB0aGlzLmhhbmRsZUNoYW5nZXModmlld0NvbnRleHRDaGFuZ2UuY2hhbmdlcyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmlld0NvbnRleHRDaGFuZ2U/LnJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlQ2hhbmdlcyhjaGFuZ2VzOiBBcnJheTxDb21wb25lbnRNb2RlbENoYW5nZT4pOiB2b2lkIHtcclxuICAgIGNoYW5nZXMuZm9yRWFjaCgoY29tcG9uZW50TW9kZWxDaGFuZ2U6IENvbXBvbmVudE1vZGVsQ2hhbmdlKSA9PiB7XHJcbiAgICAgIGxldCBkZXRlY3RDaGFuZ2U6IFNtYXJ0U3ViamVjdDxDb21wb25lbnRNb2RlbENoYW5nZT4gfCB1bmRlZmluZWQgPSB0aGlzLnNtYXJ0QXBpQ2xpZW50cy5nZXQoXHJcbiAgICAgICAgY29tcG9uZW50TW9kZWxDaGFuZ2UudXVpZFxyXG4gICAgICApO1xyXG4gICAgICBpZiAoZGV0ZWN0Q2hhbmdlKSB7XHJcbiAgICAgICAgZGV0ZWN0Q2hhbmdlLm5leHQoY29tcG9uZW50TW9kZWxDaGFuZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBsb2FkKHV1aWQ6IHN0cmluZyk6IFByb21pc2U8Q29tcG9uZW50TW9kZWwgfCB1bmRlZmluZWQ+IHtcclxuICAgIHJldHVybiBhd2FpdCB0aGlzLnZpZXcuZ2V0Q29tcG9uZW50TW9kZWwodXVpZCkudG9Qcm9taXNlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgbG9hZDIodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dENoYW5nZSB8IHVuZGVmaW5lZD4ge1xyXG4gICAgbGV0IGNoYW5nZSA9IGF3YWl0IHRoaXMudmlldy5nZXRDb21wb25lbnRNb2RlbDIodXVpZCkudG9Qcm9taXNlKCk7XHJcbiAgICB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShjaGFuZ2UpO1xyXG4gICAgcmV0dXJuIGNoYW5nZTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRWaWV3Q29udGV4dCgpOiBWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgSVNfQVNZTkNfUEFSQU1fTkFNRSA9ICdpc0FzeW5jJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXBpUXVldWVDYWxsIHtcclxuICBjYWxsYmFjazogKGNvbmZpZzogYW55KSA9PiBQcm9taXNlPGFueT47XHJcbiAgY29uZmlnOiBhbnk7XHJcbiAgaXNDb21wbGV0ZWQ6IFN1YmplY3Q8dm9pZD47XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcGlRdWV1ZVNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIHByaXZhdGUgX2Rlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHJpdmF0ZSBxdWV1ZTogQXBpUXVldWVDYWxsW10gPSBbXTtcclxuICBwcml2YXRlIGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gIHByaXZhdGUgcXVldWVTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5xdWV1ZVN1YmplY3QucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5wcm9jZXNzUXVldWUoKSk7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIGFkZFRvUXVldWUoY2FsbDogQXBpUXVldWVDYWxsLCBwcmlvcml0eTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICBpZiAocHJpb3JpdHkpIHtcclxuICAgICAgdGhpcy5xdWV1ZS51bnNoaWZ0KGNhbGwpOyAvLyBBZGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUgaWYgaXQgaGFzIGhpZ2hlciBwcmlvcml0eVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5xdWV1ZS5wdXNoKGNhbGwpOyAvLyBBZGQgYXQgdGhlIGVuZCBvZiB0aGUgcXVldWUgaWYgaXQgaGFzIGxvd2VyIHByaW9yaXR5XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMuaXNQcm9jZXNzaW5nKSB7XHJcbiAgICAgIHRoaXMucHJvY2Vzc1F1ZXVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBwcm9jZXNzUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5xdWV1ZS5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGFwaVF1ZXVlQ2FsbCA9IHRoaXMucXVldWUuc2hpZnQoKTtcclxuICAgIGlmIChhcGlRdWV1ZUNhbGwpIHtcclxuICAgICAgYXdhaXQgYXBpUXVldWVDYWxsLmNhbGxiYWNrKGFwaVF1ZXVlQ2FsbC5jb25maWcpO1xyXG4gICAgICBhcGlRdWV1ZUNhbGwuaXNDb21wbGV0ZWQuY29tcGxldGUoKTtcclxuICAgICAgdGhpcy5xdWV1ZVN1YmplY3QubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=