@smartbit4all/ng-client 5.0.21 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (677) hide show
  1. package/README.md +386 -386
  2. package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +17 -0
  3. package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +35 -0
  4. package/esm2022/lib/component-factory-service/projects.mjs +6 -0
  5. package/esm2022/lib/session/api/api/api.mjs +4 -0
  6. package/esm2022/lib/session/api/api/session.service.mjs +306 -0
  7. package/esm2022/lib/session/api/configuration.mjs +91 -0
  8. package/esm2022/lib/session/api/encoder.mjs +19 -0
  9. package/esm2022/lib/session/api/index.mjs +3 -0
  10. package/esm2022/lib/session/api/model/accountInfo.mjs +13 -0
  11. package/esm2022/lib/session/api/model/apiError.mjs +13 -0
  12. package/esm2022/lib/session/api/model/authenticationProviderData.mjs +13 -0
  13. package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +2 -0
  14. package/esm2022/lib/session/api/model/models.mjs +9 -0
  15. package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +13 -0
  16. package/esm2022/lib/session/api/model/session.mjs +2 -0
  17. package/esm2022/lib/session/api/model/sessionInfoData.mjs +2 -0
  18. package/esm2022/lib/session/api/model/userActivityLog.mjs +13 -0
  19. package/esm2022/lib/session/api/param.mjs +2 -0
  20. package/esm2022/lib/session/api/variables.mjs +9 -0
  21. package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +225 -0
  22. package/esm2022/lib/session/projects.mjs +13 -0
  23. package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +2 -0
  24. package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +214 -0
  25. package/esm2022/lib/session/smart-default-error-ui.service.mjs +134 -0
  26. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +109 -0
  27. package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +44 -0
  28. package/esm2022/lib/session/smart-session-handler.service.mjs +7 -0
  29. package/esm2022/lib/session/smart-session.module.mjs +58 -0
  30. package/esm2022/lib/session/smart-session.service.mjs +284 -0
  31. package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +39 -0
  32. package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +63 -0
  33. package/esm2022/lib/shared/projects.mjs +4 -0
  34. package/esm2022/lib/shared/shared.module.mjs +19 -0
  35. package/esm2022/lib/shared/smart-tooltip.directive.mjs +58 -0
  36. package/esm2022/lib/shared/smarttable.date-pipe.mjs +43 -0
  37. package/esm2022/lib/smart-client/projects.mjs +4 -0
  38. package/esm2022/lib/smart-client/smart-component-api-client.mjs +928 -0
  39. package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +79 -0
  40. package/esm2022/lib/smart-client/smart.component.mjs +88 -0
  41. package/esm2022/lib/smart-client/smart.service.mjs +71 -0
  42. package/esm2022/lib/smart-component-layout/api/api/api.mjs +4 -0
  43. package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +133 -0
  44. package/esm2022/lib/smart-component-layout/api/api.module.mjs +40 -0
  45. package/esm2022/lib/smart-component-layout/api/configuration.mjs +91 -0
  46. package/esm2022/lib/smart-component-layout/api/encoder.mjs +19 -0
  47. package/esm2022/lib/smart-component-layout/api/index.mjs +7 -0
  48. package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +18 -0
  49. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +22 -0
  50. package/esm2022/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.mjs +2 -0
  51. package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +17 -0
  52. package/esm2022/lib/smart-component-layout/api/model/models.mjs +9 -0
  53. package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +2 -0
  54. package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +2 -0
  55. package/esm2022/lib/smart-component-layout/api/model/toolbarDirection.mjs +17 -0
  56. package/esm2022/lib/smart-component-layout/api/model/toolbarProperties.mjs +2 -0
  57. package/esm2022/lib/smart-component-layout/api/param.mjs +2 -0
  58. package/esm2022/lib/smart-component-layout/api/variables.mjs +9 -0
  59. package/esm2022/lib/smart-component-layout/projects.mjs +8 -0
  60. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +169 -0
  61. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +433 -0
  62. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +57 -0
  63. package/esm2022/lib/smart-diagram/api/api/api.mjs +4 -0
  64. package/esm2022/lib/smart-diagram/api/api/diagramService.service.mjs +141 -0
  65. package/esm2022/lib/smart-diagram/api/api.module.mjs +40 -0
  66. package/esm2022/lib/smart-diagram/api/configuration.mjs +91 -0
  67. package/esm2022/lib/smart-diagram/api/encoder.mjs +19 -0
  68. package/esm2022/lib/smart-diagram/api/index.mjs +7 -0
  69. package/esm2022/lib/smart-diagram/api/model/diagramColor.mjs +13 -0
  70. package/esm2022/lib/smart-diagram/api/model/diagramDataContainer.mjs +2 -0
  71. package/esm2022/lib/smart-diagram/api/model/diagramDataItem.mjs +13 -0
  72. package/esm2022/lib/smart-diagram/api/model/diagramDataSet.mjs +2 -0
  73. package/esm2022/lib/smart-diagram/api/model/diagramDescriptor.mjs +2 -0
  74. package/esm2022/lib/smart-diagram/api/model/diagramModel.mjs +2 -0
  75. package/esm2022/lib/smart-diagram/api/model/diagramShape.mjs +2 -0
  76. package/esm2022/lib/smart-diagram/api/model/drawTime.mjs +18 -0
  77. package/esm2022/lib/smart-diagram/api/model/labelText.mjs +2 -0
  78. package/esm2022/lib/smart-diagram/api/model/models.mjs +10 -0
  79. package/esm2022/lib/smart-diagram/api/param.mjs +2 -0
  80. package/esm2022/lib/smart-diagram/api/variables.mjs +9 -0
  81. package/esm2022/lib/smart-diagram/component/default-smart-diagram-options.provider.mjs +312 -0
  82. package/esm2022/lib/smart-diagram/component/smart-diagram.component.mjs +359 -0
  83. package/esm2022/lib/smart-diagram/component/smart-diagram.module.mjs +40 -0
  84. package/esm2022/lib/smart-diagram/component/smart-diagram.util.mjs +10 -0
  85. package/esm2022/lib/smart-diagram/projects.mjs +5 -0
  86. package/esm2022/lib/smart-dialog/projects.mjs +8 -0
  87. package/esm2022/lib/smart-dialog/smartdialog.component.mjs +54 -0
  88. package/esm2022/lib/smart-dialog/smartdialog.model.mjs +16 -0
  89. package/esm2022/lib/smart-dialog/smartdialog.module.mjs +46 -0
  90. package/esm2022/lib/smart-dialog/smartdialog.service.mjs +86 -0
  91. package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +101 -0
  92. package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +12 -0
  93. package/esm2022/lib/smart-expandable-section/projects.mjs +8 -0
  94. package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +57 -0
  95. package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +14 -0
  96. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +17 -0
  97. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +2 -0
  98. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +8 -0
  99. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +2 -0
  100. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +2 -0
  101. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +20 -0
  102. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +2 -0
  103. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +2 -0
  104. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +28 -0
  105. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +2 -0
  106. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +2 -0
  107. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +32 -0
  108. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +18 -0
  109. package/esm2022/lib/smart-filter/api/filter/model/model.mjs +16 -0
  110. package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +2 -0
  111. package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +13 -0
  112. package/esm2022/lib/smart-filter/api/value/model/value.mjs +13 -0
  113. package/esm2022/lib/smart-filter/projects.mjs +9 -0
  114. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +14 -0
  115. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +166 -0
  116. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +45 -0
  117. package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +36 -0
  118. package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +31 -0
  119. package/esm2022/lib/smart-filter/smart-filter.model.mjs +13 -0
  120. package/esm2022/lib/smart-filter/smart-filter.module.mjs +33 -0
  121. package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +198 -0
  122. package/esm2022/lib/smart-filter-editor/api/configuration.mjs +91 -0
  123. package/esm2022/lib/smart-filter-editor/api/encoder.mjs +19 -0
  124. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +17 -0
  125. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +13 -0
  126. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +2 -0
  127. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +8 -0
  128. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +2 -0
  129. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +7 -0
  130. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +2 -0
  131. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +20 -0
  132. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +2 -0
  133. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +2 -0
  134. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +2 -0
  135. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +28 -0
  136. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +2 -0
  137. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +2 -0
  138. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +32 -0
  139. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +19 -0
  140. package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +17 -0
  141. package/esm2022/lib/smart-filter-editor/api/param.mjs +2 -0
  142. package/esm2022/lib/smart-filter-editor/api/variables.mjs +9 -0
  143. package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +15 -0
  144. package/esm2022/lib/smart-filter-editor/project.mjs +8 -0
  145. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +73 -0
  146. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +40 -0
  147. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +294 -0
  148. package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +2 -0
  149. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +69 -0
  150. package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +63 -0
  151. package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +24 -0
  152. package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +57 -0
  153. package/esm2022/lib/smart-form/api/api/api.mjs +4 -0
  154. package/esm2022/lib/smart-form/api/api/default.service.mjs +133 -0
  155. package/esm2022/lib/smart-form/api/api.module.mjs +40 -0
  156. package/esm2022/lib/smart-form/api/configuration.mjs +91 -0
  157. package/esm2022/lib/smart-form/api/encoder.mjs +19 -0
  158. package/esm2022/lib/smart-form/api/index.mjs +7 -0
  159. package/esm2022/lib/smart-form/api/model/dateFieldProperties.mjs +13 -0
  160. package/esm2022/lib/smart-form/api/model/fileUploaderProperties.mjs +2 -0
  161. package/esm2022/lib/smart-form/api/model/imageProperties.mjs +2 -0
  162. package/esm2022/lib/smart-form/api/model/models.mjs +19 -0
  163. package/esm2022/lib/smart-form/api/model/multiFileUploaderProperties.mjs +2 -0
  164. package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +13 -0
  165. package/esm2022/lib/smart-form/api/model/recordingUploaderProperties.mjs +7 -0
  166. package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +14 -0
  167. package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +22 -0
  168. package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +17 -0
  169. package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +49 -0
  170. package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +2 -0
  171. package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +2 -0
  172. package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +2 -0
  173. package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +18 -0
  174. package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +13 -0
  175. package/esm2022/lib/smart-form/api/model/textBoxProperties.mjs +13 -0
  176. package/esm2022/lib/smart-form/api/model/textFieldProperties.mjs +13 -0
  177. package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +21 -0
  178. package/esm2022/lib/smart-form/api/param.mjs +2 -0
  179. package/esm2022/lib/smart-form/api/variables.mjs +9 -0
  180. package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +20 -0
  181. package/esm2022/lib/smart-form/projects.mjs +18 -0
  182. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +753 -0
  183. package/esm2022/lib/smart-form/services/smartform.service.mjs +683 -0
  184. package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +15 -0
  185. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +193 -0
  186. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +2 -0
  187. package/esm2022/lib/smart-form/smartform.component.mjs +190 -0
  188. package/esm2022/lib/smart-form/smartform.form-model.mjs +2 -0
  189. package/esm2022/lib/smart-form/smartform.model.mjs +38 -0
  190. package/esm2022/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.mjs +179 -0
  191. package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +83 -0
  192. package/esm2022/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.mjs +170 -0
  193. package/esm2022/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.mjs +151 -0
  194. package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +35 -0
  195. package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +79 -0
  196. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +1038 -0
  197. package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +78 -0
  198. package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +31 -0
  199. package/esm2022/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.mjs +98 -0
  200. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCL.mjs +2 -0
  201. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.mjs +18 -0
  202. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.mjs +19 -0
  203. package/esm2022/lib/smart-generic-pages/api/platform/acl/model/subject.mjs +13 -0
  204. package/esm2022/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.mjs +2 -0
  205. package/esm2022/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.mjs +2 -0
  206. package/esm2022/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.mjs +13 -0
  207. package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationItem.mjs +2 -0
  208. package/esm2022/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.mjs +2 -0
  209. package/esm2022/lib/smart-generic-pages/generic-page/generic-page.component.mjs +54 -0
  210. package/esm2022/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.mjs +40 -0
  211. package/esm2022/lib/smart-generic-pages/no-permission-page/no-permission-page.component.mjs +40 -0
  212. package/esm2022/lib/smart-generic-pages/projects.mjs +13 -0
  213. package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +80 -0
  214. package/esm2022/lib/smart-generic-pages/smart-generic-pages.module.mjs +116 -0
  215. package/esm2022/lib/smart-generic-pages/subject-selector/subject-selector.component.mjs +77 -0
  216. package/esm2022/lib/smart-generic-pages/validation-result-page/validation-result-page.component.mjs +93 -0
  217. package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +4 -0
  218. package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +514 -0
  219. package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +40 -0
  220. package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +91 -0
  221. package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +19 -0
  222. package/esm2022/lib/smart-grid/api/grid-api/index.mjs +7 -0
  223. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +17 -0
  224. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +2 -0
  225. package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +20 -0
  226. package/esm2022/lib/smart-grid/api/grid-api/model/gridExportDescriptor.mjs +2 -0
  227. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +2 -0
  228. package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +2 -0
  229. package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +2 -0
  230. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +13 -0
  231. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +18 -0
  232. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +17 -0
  233. package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +2 -0
  234. package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +2 -0
  235. package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +2 -0
  236. package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +8 -0
  237. package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +15 -0
  238. package/esm2022/lib/smart-grid/api/grid-api/param.mjs +2 -0
  239. package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +9 -0
  240. package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +20 -0
  241. package/esm2022/lib/smart-grid/components/generic-component/expanded-row-renderer.component.mjs +47 -0
  242. package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +72 -0
  243. package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +200 -0
  244. package/esm2022/lib/smart-grid/models/model.mjs +29 -0
  245. package/esm2022/lib/smart-grid/projects.mjs +9 -0
  246. package/esm2022/lib/smart-grid/smart-grid-toolbar-util.mjs +65 -0
  247. package/esm2022/lib/smart-grid/smart-grid.component.mjs +1035 -0
  248. package/esm2022/lib/smart-grid/smart-grid.module.mjs +103 -0
  249. package/esm2022/lib/smart-grid/smart-grid.service.mjs +92 -0
  250. package/esm2022/lib/smart-icon/projects.mjs +9 -0
  251. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +95 -0
  252. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.mjs +40 -0
  253. package/esm2022/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.mjs +37 -0
  254. package/esm2022/lib/smart-icon/smart-icon.module.mjs +26 -0
  255. package/esm2022/lib/smart-icon/smart-icon.service.mjs +93 -0
  256. package/esm2022/lib/smart-map/abstract-map.mjs +112 -0
  257. package/esm2022/lib/smart-map/api/api/api.mjs +4 -0
  258. package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +312 -0
  259. package/esm2022/lib/smart-map/api/api.module.mjs +40 -0
  260. package/esm2022/lib/smart-map/api/configuration.mjs +91 -0
  261. package/esm2022/lib/smart-map/api/encoder.mjs +19 -0
  262. package/esm2022/lib/smart-map/api/index.mjs +7 -0
  263. package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +13 -0
  264. package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +2 -0
  265. package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +2 -0
  266. package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +17 -0
  267. package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +2 -0
  268. package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +19 -0
  269. package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +2 -0
  270. package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +2 -0
  271. package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +2 -0
  272. package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +18 -0
  273. package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +2 -0
  274. package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +2 -0
  275. package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +2 -0
  276. package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +2 -0
  277. package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +17 -0
  278. package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +18 -0
  279. package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +2 -0
  280. package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +17 -0
  281. package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +2 -0
  282. package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +2 -0
  283. package/esm2022/lib/smart-map/api/model/models.mjs +21 -0
  284. package/esm2022/lib/smart-map/api/param.mjs +2 -0
  285. package/esm2022/lib/smart-map/api/variables.mjs +9 -0
  286. package/esm2022/lib/smart-map/api-default/api-default.mjs +2 -0
  287. package/esm2022/lib/smart-map/impl/google-map.mjs +224 -0
  288. package/esm2022/lib/smart-map/impl/leaflet-map.mjs +422 -0
  289. package/esm2022/lib/smart-map/projects.mjs +9 -0
  290. package/esm2022/lib/smart-map/smart-map.component.mjs +222 -0
  291. package/esm2022/lib/smart-map/smart-map.module.mjs +22 -0
  292. package/esm2022/lib/smart-map/smart-map.types.mjs +2 -0
  293. package/esm2022/lib/smart-navbar/projects.mjs +8 -0
  294. package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +61 -0
  295. package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +6 -0
  296. package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +63 -0
  297. package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +14 -0
  298. package/esm2022/lib/smart-navigation/projects.mjs +6 -0
  299. package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +2 -0
  300. package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +18 -0
  301. package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +27 -0
  302. package/esm2022/lib/smart-ng-client.module.mjs +130 -0
  303. package/esm2022/lib/smart-ng-client.service.mjs +19 -0
  304. package/esm2022/lib/smart-subject/projects.mjs +5 -0
  305. package/esm2022/lib/smart-subject/smart-subject.mjs +21 -0
  306. package/esm2022/lib/smart-tab-group/projects.mjs +5 -0
  307. package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +22 -0
  308. package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +43 -0
  309. package/esm2022/lib/smart-table/components/loading/loading.component.mjs +15 -0
  310. package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +52 -0
  311. package/esm2022/lib/smart-table/projects.mjs +8 -0
  312. package/esm2022/lib/smart-table/smarttable.component.mjs +98 -0
  313. package/esm2022/lib/smart-table/smarttable.model.mjs +177 -0
  314. package/esm2022/lib/smart-table/smarttable.module.mjs +109 -0
  315. package/esm2022/lib/smart-table/smarttable.service.mjs +14 -0
  316. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +42 -0
  317. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +23 -0
  318. package/esm2022/lib/smart-table/tables/table.mjs +573 -0
  319. package/esm2022/lib/smart-tree/projects.mjs +9 -0
  320. package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +289 -0
  321. package/esm2022/lib/smart-tree/smarttree.component.mjs +187 -0
  322. package/esm2022/lib/smart-tree/smarttree.model.mjs +7 -0
  323. package/esm2022/lib/smart-tree/smarttree.module.mjs +60 -0
  324. package/esm2022/lib/smart-tree/smarttree.node.model.mjs +6 -0
  325. package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +2 -0
  326. package/esm2022/lib/smart-tree/smarttree.service.mjs +47 -0
  327. package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +1190 -0
  328. package/esm2022/lib/smart-tree/tree-api/configuration.mjs +91 -0
  329. package/esm2022/lib/smart-tree/tree-api/encoder.mjs +19 -0
  330. package/esm2022/lib/smart-tree/tree-api/param.mjs +2 -0
  331. package/esm2022/lib/smart-tree/tree-api/variables.mjs +9 -0
  332. package/esm2022/lib/smart-validation/named-validator.service.mjs +115 -0
  333. package/esm2022/lib/smart-validation/projects.mjs +4 -0
  334. package/esm2022/lib/smart-validation/smart-validation.module.mjs +24 -0
  335. package/esm2022/lib/smart-validation/smart-validation.types.mjs +4 -0
  336. package/esm2022/lib/view-context/api/api/api.mjs +4 -0
  337. package/esm2022/lib/view-context/api/api/view.service.mjs +903 -0
  338. package/esm2022/lib/view-context/api/api-default/binaryData.mjs +2 -0
  339. package/esm2022/lib/view-context/api/api-default/invocationError.mjs +2 -0
  340. package/esm2022/lib/view-context/api/api-default/invocationRequest.mjs +2 -0
  341. package/esm2022/lib/view-context/api/api-default/invocationRun.mjs +2 -0
  342. package/esm2022/lib/view-context/api/api.module.mjs +40 -0
  343. package/esm2022/lib/view-context/api/configuration.mjs +91 -0
  344. package/esm2022/lib/view-context/api/encoder.mjs +19 -0
  345. package/esm2022/lib/view-context/api/index.mjs +7 -0
  346. package/esm2022/lib/view-context/api/model/backgroundProcessInfo.mjs +2 -0
  347. package/esm2022/lib/view-context/api/model/badgeDescriptor.mjs +13 -0
  348. package/esm2022/lib/view-context/api/model/clipboardData.mjs +13 -0
  349. package/esm2022/lib/view-context/api/model/closeResult.mjs +18 -0
  350. package/esm2022/lib/view-context/api/model/componentConstraint.mjs +2 -0
  351. package/esm2022/lib/view-context/api/model/componentModel.mjs +2 -0
  352. package/esm2022/lib/view-context/api/model/componentModelChange.mjs +13 -0
  353. package/esm2022/lib/view-context/api/model/dataChange.mjs +2 -0
  354. package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +2 -0
  355. package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +21 -0
  356. package/esm2022/lib/view-context/api/model/deviceInfo.mjs +13 -0
  357. package/esm2022/lib/view-context/api/model/downloadedFile.mjs +13 -0
  358. package/esm2022/lib/view-context/api/model/iconPosition.mjs +21 -0
  359. package/esm2022/lib/view-context/api/model/imageResource.mjs +8 -0
  360. package/esm2022/lib/view-context/api/model/link.mjs +20 -0
  361. package/esm2022/lib/view-context/api/model/messageData.mjs +2 -0
  362. package/esm2022/lib/view-context/api/model/messageOption.mjs +2 -0
  363. package/esm2022/lib/view-context/api/model/messageOptionType.mjs +18 -0
  364. package/esm2022/lib/view-context/api/model/messageResult.mjs +2 -0
  365. package/esm2022/lib/view-context/api/model/messageTextType.mjs +17 -0
  366. package/esm2022/lib/view-context/api/model/messageType.mjs +19 -0
  367. package/esm2022/lib/view-context/api/model/models.mjs +63 -0
  368. package/esm2022/lib/view-context/api/model/multiComboBoxElement.mjs +13 -0
  369. package/esm2022/lib/view-context/api/model/multiComboBoxModel.mjs +2 -0
  370. package/esm2022/lib/view-context/api/model/namedValidator.mjs +19 -0
  371. package/esm2022/lib/view-context/api/model/openPendingData.mjs +2 -0
  372. package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +2 -0
  373. package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +2 -0
  374. package/esm2022/lib/view-context/api/model/serverRequestType.mjs +24 -0
  375. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +2 -0
  376. package/esm2022/lib/view-context/api/model/smartLinkMigrationStatus.mjs +8 -0
  377. package/esm2022/lib/view-context/api/model/statisticRecord.mjs +13 -0
  378. package/esm2022/lib/view-context/api/model/style.mjs +13 -0
  379. package/esm2022/lib/view-context/api/model/uiAction.mjs +2 -0
  380. package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +2 -0
  381. package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +27 -0
  382. package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +13 -0
  383. package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +2 -0
  384. package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +2 -0
  385. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +2 -0
  386. package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +2 -0
  387. package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +20 -0
  388. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +21 -0
  389. package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +13 -0
  390. package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +13 -0
  391. package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +22 -0
  392. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +2 -0
  393. package/esm2022/lib/view-context/api/model/uploadWidgetType.mjs +18 -0
  394. package/esm2022/lib/view-context/api/model/uploadedFile.mjs +2 -0
  395. package/esm2022/lib/view-context/api/model/valueSet.mjs +2 -0
  396. package/esm2022/lib/view-context/api/model/view.mjs +2 -0
  397. package/esm2022/lib/view-context/api/model/viewApiError.mjs +13 -0
  398. package/esm2022/lib/view-context/api/model/viewConstraint.mjs +2 -0
  399. package/esm2022/lib/view-context/api/model/viewContext.mjs +2 -0
  400. package/esm2022/lib/view-context/api/model/viewContextChange.mjs +2 -0
  401. package/esm2022/lib/view-context/api/model/viewContextData.mjs +2 -0
  402. package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +2 -0
  403. package/esm2022/lib/view-context/api/model/viewData.mjs +2 -0
  404. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +8 -0
  405. package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +13 -0
  406. package/esm2022/lib/view-context/api/model/viewState.mjs +22 -0
  407. package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +2 -0
  408. package/esm2022/lib/view-context/api/model/viewType.mjs +18 -0
  409. package/esm2022/lib/view-context/api/param.mjs +2 -0
  410. package/esm2022/lib/view-context/api/variables.mjs +9 -0
  411. package/esm2022/lib/view-context/default-view-components.token.mjs +9 -0
  412. package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +20 -0
  413. package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +93 -0
  414. package/esm2022/lib/view-context/projects.mjs +29 -0
  415. package/esm2022/lib/view-context/property-definition-data.mjs +2 -0
  416. package/esm2022/lib/view-context/reuse-router-slot.token.mjs +4 -0
  417. package/esm2022/lib/view-context/smart-embedded-slot.directive.mjs +55 -0
  418. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +199 -0
  419. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.constants.mjs +72 -0
  420. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.service.mjs +21 -0
  421. package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +30 -0
  422. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/photo-capture-widget/photo-capture-widget.component.mjs +198 -0
  423. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.mjs +95 -0
  424. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.mjs +134 -0
  425. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.mjs +12 -0
  426. package/esm2022/lib/view-context/smart-ui-action/components/upload-widget/voice-record-widget/voice-record-widget.component.mjs +256 -0
  427. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +77 -0
  428. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +54 -0
  429. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +60 -0
  430. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +106 -0
  431. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +60 -0
  432. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +132 -0
  433. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +58 -0
  434. package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +33 -0
  435. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +215 -0
  436. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +319 -0
  437. package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +185 -0
  438. package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +7 -0
  439. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +235 -0
  440. package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +77 -0
  441. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +35 -0
  442. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +74 -0
  443. package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +63 -0
  444. package/esm2022/lib/view-context/smart-view-context.model.mjs +2 -0
  445. package/esm2022/lib/view-context/smart-view-context.module.mjs +397 -0
  446. package/esm2022/lib/view-context/smart-view-context.service.mjs +1043 -0
  447. package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +41 -0
  448. package/esm2022/lib/view-context/utility/componentLibrary.mjs +9 -0
  449. package/esm2022/lib/view-context/utility/smart-object-utility.mjs +44 -0
  450. package/esm2022/lib/view-context/utility/smart-style-utility.mjs +68 -0
  451. package/esm2022/lib/view-context/value-api/api/api.mjs +4 -0
  452. package/esm2022/lib/view-context/value-api/api/value.service.mjs +138 -0
  453. package/esm2022/lib/view-context/value-api/api.module.mjs +40 -0
  454. package/esm2022/lib/view-context/value-api/configuration.mjs +91 -0
  455. package/esm2022/lib/view-context/value-api/encoder.mjs +19 -0
  456. package/esm2022/lib/view-context/value-api/index.mjs +7 -0
  457. package/esm2022/lib/view-context/value-api/model/genericValue.mjs +13 -0
  458. package/esm2022/lib/view-context/value-api/model/models.mjs +11 -0
  459. package/esm2022/lib/view-context/value-api/model/value.mjs +13 -0
  460. package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +2 -0
  461. package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +2 -0
  462. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +2 -0
  463. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +13 -0
  464. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +24 -0
  465. package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +2 -0
  466. package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +2 -0
  467. package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +19 -0
  468. package/esm2022/lib/view-context/value-api/param.mjs +2 -0
  469. package/esm2022/lib/view-context/value-api/variables.mjs +9 -0
  470. package/esm2022/lib/view-context/view-handler-resolution.mjs +21 -0
  471. package/esm2022/lib/view-context/view-op.mjs +41 -0
  472. package/esm2022/lib/view-context/view-slot-resolution.mjs +28 -0
  473. package/esm2022/projects.mjs +30 -0
  474. package/esm2022/smartbit4all-ng-client.mjs +5 -0
  475. package/fesm2022/smartbit4all-ng-client.mjs +8945 -4553
  476. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  477. package/lib/session/api/model/accountInfo.d.ts +2 -0
  478. package/lib/session/projects.d.ts +3 -0
  479. package/lib/session/smart-backend-bootstrap.config.d.ts +65 -0
  480. package/lib/session/smart-backend-bootstrap.service.d.ts +55 -0
  481. package/lib/session/smart-default-error-ui.service.d.ts +90 -0
  482. package/lib/session/smart-error-catching.interceptor.d.ts +4 -1
  483. package/lib/session/smart-session-handler.service.d.ts +2 -1
  484. package/lib/session/smart-session.service.d.ts +16 -1
  485. package/lib/session/smart-timer/smart-session-timer.component.d.ts +3 -1
  486. package/lib/smart-client/projects.d.ts +0 -1
  487. package/lib/smart-client/smart-component-api-client.d.ts +45 -19
  488. package/lib/smart-client/smart.component.d.ts +7 -5
  489. package/lib/smart-client/smart.service.d.ts +4 -5
  490. package/lib/smart-component-layout/api/model/componentWidgetType.d.ts +3 -1
  491. package/lib/smart-component-layout/api/model/layoutDefinitionDescriptor.d.ts +19 -0
  492. package/lib/smart-component-layout/api/model/models.d.ts +3 -0
  493. package/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.d.ts +2 -0
  494. package/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.d.ts +6 -0
  495. package/{src/lib/smart-chart/smart-chart/api/model/chartData.d.ts → lib/smart-component-layout/api/model/toolbarDirection.d.ts} +5 -6
  496. package/lib/smart-component-layout/api/model/toolbarProperties.d.ts +16 -0
  497. package/lib/smart-component-layout/smart-component-layout-utility.d.ts +9 -1
  498. package/lib/smart-component-layout/smart-component-layout.component.d.ts +31 -5
  499. package/lib/smart-component-layout/smart-component-layout.module.d.ts +4 -1
  500. package/lib/smart-diagram/api/api/api.d.ts +3 -0
  501. package/lib/smart-diagram/api/api/diagramService.service.d.ts +36 -0
  502. package/lib/smart-diagram/api/encoder.d.ts +11 -0
  503. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramColor.d.ts +2 -2
  504. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataContainer.d.ts +2 -3
  505. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataItem.d.ts +3 -3
  506. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDataSet.d.ts +4 -4
  507. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramDescriptor.d.ts +13 -9
  508. package/{src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.d.ts → lib/smart-diagram/api/model/diagramModel.d.ts} +5 -4
  509. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/diagramShape.d.ts +2 -2
  510. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/drawTime.d.ts +2 -2
  511. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/labelText.d.ts +2 -2
  512. package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/model/models.d.ts +1 -2
  513. package/lib/smart-diagram/component/default-smart-diagram-options.provider.d.ts +33 -0
  514. package/lib/smart-diagram/component/smart-diagram.component.d.ts +43 -0
  515. package/lib/smart-diagram/component/smart-diagram.module.d.ts +11 -0
  516. package/lib/smart-diagram/component/smart-diagram.util.d.ts +1 -0
  517. package/lib/smart-diagram/projects.d.ts +4 -0
  518. package/lib/smart-dialog/smartdialog.model.d.ts +2 -1
  519. package/lib/smart-dialog/smartdialog.module.d.ts +1 -2
  520. package/lib/smart-dialog/smartdialog.service.d.ts +1 -3
  521. package/lib/smart-expandable-section/expandable-section.component.d.ts +3 -1
  522. package/lib/smart-expandable-section/expandable-section.model.d.ts +1 -0
  523. package/lib/smart-expandable-section/smart-expandable-section.module.d.ts +2 -1
  524. package/lib/smart-filter-editor/smart-filter-editor.service.d.ts +4 -2
  525. package/{src/lib/smart-chart/smart-chart/api/model/chartOrientation.d.ts → lib/smart-form/api/model/dateFieldProperties.d.ts} +6 -7
  526. package/lib/smart-form/api/model/fileUploaderProperties.d.ts +20 -0
  527. package/lib/smart-form/api/model/imageProperties.d.ts +15 -0
  528. package/lib/smart-form/api/model/models.d.ts +7 -0
  529. package/lib/smart-form/api/model/multiFileUploaderProperties.d.ts +19 -0
  530. package/lib/smart-form/api/model/recordingUploaderProperties.d.ts +20 -0
  531. package/lib/smart-form/api/model/selectionDefinition.d.ts +17 -0
  532. package/lib/smart-form/api/model/smartFormWidgetType.d.ts +4 -1
  533. package/lib/smart-form/api/model/smartWidgetDefinition.d.ts +5 -0
  534. package/lib/smart-form/api/model/textBoxProperties.d.ts +15 -0
  535. package/{src/lib/smart-chart/smart-chart/api/model/chartValue.d.ts → lib/smart-form/api/model/textFieldProperties.d.ts} +4 -6
  536. package/lib/smart-form/api/model/valueChangeMode.d.ts +3 -2
  537. package/lib/smart-form/projects.d.ts +3 -0
  538. package/lib/smart-form/services/smartform.layout-definition.service.d.ts +6 -2
  539. package/lib/smart-form/services/smartform.service.d.ts +3 -2
  540. package/lib/smart-form/smartfileuploader/smartfileuploader.component.d.ts +19 -3
  541. package/lib/smart-form/smartform.component.d.ts +3 -2
  542. package/lib/smart-form/smartform.form-model.d.ts +160 -11
  543. package/lib/smart-form/widgets/components/smart-file-editor/smart-file-editor.component.d.ts +54 -0
  544. package/lib/smart-form/widgets/components/smart-multi-file-editor/smart-multi-file-editor.component.d.ts +57 -0
  545. package/lib/smart-form/widgets/components/smart-voice-recorder/smart-voice-recorder.component.d.ts +50 -0
  546. package/lib/smart-form/widgets/smartformwidget/smartformwidget.component.d.ts +38 -7
  547. package/lib/smart-generic-pages/acl-editing-view/acl-editing-view.component.d.ts +21 -0
  548. package/lib/smart-generic-pages/api/platform/acl/model/aCL.d.ts +18 -0
  549. package/lib/smart-generic-pages/api/platform/acl/model/aCLEntry.d.ts +54 -0
  550. package/lib/smart-generic-pages/api/platform/acl/model/objectValidationSeverity.d.ts +19 -0
  551. package/lib/smart-generic-pages/api/platform/acl/model/subject.d.ts +24 -0
  552. package/lib/smart-generic-pages/api/platform/api-default/objectHistoryRangeData.d.ts +2 -0
  553. package/lib/smart-generic-pages/api/platform/searchpage/model/searchPageModel.d.ts +27 -0
  554. package/lib/smart-generic-pages/api/platform/subjectselector/model/subjectSelectorPageModel.d.ts +14 -0
  555. package/lib/smart-generic-pages/api/platform/validation/model/validationItem.d.ts +17 -0
  556. package/lib/smart-generic-pages/api/platform/validation/model/validationResultPageModel.d.ts +18 -0
  557. package/lib/smart-generic-pages/generic-page/generic-page.component.d.ts +12 -0
  558. package/lib/smart-generic-pages/invalid-smartlink/invalid-smartlink.component.d.ts +11 -0
  559. package/lib/smart-generic-pages/no-permission-page/no-permission-page.component.d.ts +11 -0
  560. package/lib/smart-generic-pages/projects.d.ts +9 -0
  561. package/lib/smart-generic-pages/search-page/search-page.component.d.ts +25 -0
  562. package/lib/smart-generic-pages/smart-generic-pages.module.d.ts +19 -0
  563. package/lib/smart-generic-pages/subject-selector/subject-selector.component.d.ts +17 -0
  564. package/lib/smart-generic-pages/validation-result-page/validation-result-page.component.d.ts +25 -0
  565. package/lib/smart-grid/api/grid-api/api/grid.service.d.ts +27 -6
  566. package/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.d.ts +4 -0
  567. package/lib/smart-grid/api/grid-api/model/gridExportDescriptor.d.ts +2 -2
  568. package/lib/smart-grid/api/grid-api/model/gridModel.d.ts +2 -0
  569. package/lib/smart-grid/api/grid-api/model/gridSelectionChange.d.ts +6 -0
  570. package/lib/smart-grid/components/generic-component/expanded-row-renderer.component.d.ts +21 -0
  571. package/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.d.ts +1 -0
  572. package/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.d.ts +1 -0
  573. package/lib/smart-grid/smart-grid-toolbar-util.d.ts +1 -0
  574. package/lib/smart-grid/smart-grid.component.d.ts +20 -6
  575. package/lib/smart-grid/smart-grid.module.d.ts +20 -21
  576. package/lib/smart-grid/smart-grid.service.d.ts +2 -0
  577. package/lib/smart-icon/projects.d.ts +2 -0
  578. package/lib/smart-icon/smart-icon/smart-icon.component.d.ts +10 -4
  579. package/lib/smart-icon/smart-icon/ui-badge/ui-badge.component.d.ts +12 -0
  580. package/lib/smart-icon/smart-icon/ui-badge/ui-badge.directive.d.ts +14 -0
  581. package/lib/smart-icon/smart-icon.module.d.ts +8 -5
  582. package/lib/smart-map/abstract-map.d.ts +1 -1
  583. package/lib/smart-navigation/smart-navigation.interface.d.ts +1 -7
  584. package/lib/smart-navigation/smart-navigation.service.d.ts +2 -8
  585. package/lib/smart-ng-client.module.d.ts +3 -4
  586. package/lib/smart-tab-group/projects.d.ts +0 -4
  587. package/lib/smart-tab-group/smart-tab-group.module.d.ts +5 -8
  588. package/lib/smart-table/tables/material-table/material-table.component.d.ts +2 -3
  589. package/lib/smart-table/tables/mobile-table/mobile-table.component.d.ts +1 -2
  590. package/lib/smart-table/tables/table.d.ts +5 -5
  591. package/lib/smart-tree/smarttree-generic.service.d.ts +0 -1
  592. package/lib/smart-tree/smarttree.component.d.ts +1 -0
  593. package/lib/smart-tree/smarttree.model.d.ts +1 -0
  594. package/lib/smart-tree/smarttree.service.d.ts +1 -0
  595. package/lib/view-context/api/api/view.service.d.ts +14 -13
  596. package/lib/view-context/api/api-default/invocationRun.d.ts +2 -0
  597. package/lib/view-context/api/model/backgroundProcessInfo.d.ts +25 -0
  598. package/lib/view-context/api/model/componentModel.d.ts +5 -0
  599. package/lib/view-context/api/model/deviceInfo.d.ts +4 -0
  600. package/lib/view-context/api/model/iconPosition.d.ts +2 -1
  601. package/lib/view-context/api/model/imageResource.d.ts +2 -0
  602. package/lib/view-context/api/model/messageOption.d.ts +2 -0
  603. package/lib/view-context/api/model/models.d.ts +6 -0
  604. package/lib/view-context/api/model/multiComboBoxElement.d.ts +16 -0
  605. package/lib/view-context/api/model/multiComboBoxModel.d.ts +16 -0
  606. package/lib/view-context/api/model/namedValidator.d.ts +1 -0
  607. package/lib/view-context/api/model/smartLinkData.d.ts +3 -0
  608. package/lib/view-context/api/model/uiAction.d.ts +8 -0
  609. package/lib/view-context/api/model/uiActionDefinition.d.ts +19 -0
  610. package/lib/view-context/api/model/uiActionDefinitionEntry.d.ts +18 -0
  611. package/lib/view-context/api/model/uiActionDescriptor.d.ts +4 -0
  612. package/lib/view-context/api/model/uiActionRequest.d.ts +3 -0
  613. package/lib/view-context/api/model/uiActionSchedule.d.ts +14 -0
  614. package/lib/view-context/api/model/uiActionUploadDescriptor.d.ts +2 -0
  615. package/lib/view-context/api/model/view.d.ts +7 -0
  616. package/lib/view-context/api/model/viewContext.d.ts +1 -0
  617. package/lib/view-context/api/model/viewData.d.ts +2 -0
  618. package/lib/view-context/api/model/viewEventHandler.d.ts +5 -0
  619. package/lib/view-context/api/model/viewPlaceholder.d.ts +1 -0
  620. package/lib/view-context/default-view-components.token.d.ts +18 -0
  621. package/lib/view-context/message-dialog/message-dialog.component.d.ts +1 -0
  622. package/lib/view-context/projects.d.ts +8 -3
  623. package/lib/view-context/reuse-router-slot.token.d.ts +3 -0
  624. package/lib/view-context/smart-embedded-slot.directive.d.ts +20 -0
  625. package/lib/view-context/smart-ui-action/components/menu/menu.component.d.ts +6 -2
  626. package/lib/view-context/smart-ui-action/components/upload-widget/prime-file-uploader/prime-file-uploader.component.d.ts +32 -0
  627. package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.component.d.ts +40 -0
  628. package/lib/view-context/smart-ui-action/components/upload-widget/upload-widget.utils.d.ts +3 -0
  629. package/lib/view-context/smart-ui-action/{dialogs/ui-action-file-upload-dialog → components/upload-widget}/voice-record-widget/voice-record-widget.component.d.ts +15 -6
  630. package/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.d.ts +1 -2
  631. package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.d.ts +2 -16
  632. package/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.d.ts +3 -3
  633. package/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.d.ts +1 -2
  634. package/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.d.ts +13 -0
  635. package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +14 -7
  636. package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +27 -3
  637. package/lib/view-context/smart-ui-action/ui-action.service.d.ts +4 -3
  638. package/lib/view-context/smart-view-context-dialog.service.d.ts +1 -3
  639. package/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.d.ts +1 -2
  640. package/lib/view-context/smart-view-context.model.d.ts +7 -2
  641. package/lib/view-context/smart-view-context.module.d.ts +74 -65
  642. package/lib/view-context/smart-view-context.service.d.ts +54 -8
  643. package/lib/view-context/smart-view-redirect/smart-view-redirect.d.ts +3 -1
  644. package/lib/view-context/view-handler-resolution.d.ts +11 -0
  645. package/lib/view-context/view-op.d.ts +18 -0
  646. package/lib/view-context/view-slot-resolution.d.ts +15 -0
  647. package/package.json +16 -18
  648. package/projects.d.ts +2 -0
  649. package/smartbit4all-ng-client-6.0.0.tgz +0 -0
  650. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -686
  651. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +0 -1
  652. package/lib/smart-client/smart-authentication.service.d.ts +0 -15
  653. package/lib/smart-tab-group/smart-tab-group.component.d.ts +0 -21
  654. package/lib/smart-tab-group/smart-tab-group.service.d.ts +0 -6
  655. package/lib/smart-tab-group/tab-content/tab-content.component.d.ts +0 -14
  656. package/lib/smart-tab-group/tab-group-simplified/tab-group.component.d.ts +0 -29
  657. package/lib/smart-tab-group/tabTile.model.d.ts +0 -8
  658. package/lib/view-context/smart-ui-action/components/action-badge/action-badge.component.d.ts +0 -12
  659. package/smartbit4all-ng-client-5.0.21.tgz +0 -0
  660. package/src/lib/smart-chart/index.d.ts +0 -5
  661. package/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.d.ts +0 -37
  662. package/src/lib/smart-chart/smart-chart/api/model/chartType.d.ts +0 -21
  663. package/src/lib/smart-chart/smart-chart/api/model/models.d.ts +0 -6
  664. package/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.d.ts +0 -16
  665. package/src/lib/smart-chart/smart-chart/default-chart-options.provider.d.ts +0 -31
  666. package/src/lib/smart-chart/smart-chart/smart-chart.component.d.ts +0 -33
  667. package/src/lib/smart-chart/smart-chart/smart-chart.module.d.ts +0 -11
  668. package/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.d.ts +0 -1
  669. package/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.d.ts +0 -21
  670. package/src/lib/smart-chart/smart-chart-projects.d.ts +0 -5
  671. package/src/lib/smart-chart/view-context/utility/componentLibrary.d.ts +0 -6
  672. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/api.module.d.ts +0 -0
  673. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/configuration.d.ts +0 -0
  674. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/index.d.ts +0 -0
  675. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/param.d.ts +0 -0
  676. /package/{src/lib/smart-chart/smart-chart/smart-chart2 → lib/smart-diagram}/api/variables.d.ts +0 -0
  677. /package/lib/view-context/smart-ui-action/{dialogs/ui-action-file-upload-dialog → components/upload-widget}/photo-capture-widget/photo-capture-widget.component.d.ts +0 -0
@@ -0,0 +1,1043 @@
1
+ import { Inject, Injectable, InjectionToken, Optional, } 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 { COMPONENT_LIBRARY } from './utility/componentLibrary';
9
+ import { resolveSlot } from './view-slot-resolution';
10
+ import { SMART_DEFAULT_VIEW_COMPONENTS, } from './default-view-components.token';
11
+ import { resolveViewHandler } from './view-handler-resolution';
12
+ import { buildViewOps } from './view-op';
13
+ import { REUSE_ROUTER_SLOT_COMPONENT } from './reuse-router-slot.token';
14
+ import * as i0 from "@angular/core";
15
+ import * as i1 from "./api";
16
+ import * as i2 from "../session/smart-session.service";
17
+ import * as i3 from "./smart-view-context-dialog.service";
18
+ import * as i4 from "./utility/componentLibrary";
19
+ export const SmartViewContextErrorDialogButtonLabel = 'SmartViewContextErrorDialogButtonLabel';
20
+ export const SmartViewContextErrorDialogTitle = 'SmartViewContextErrorDialogTitle';
21
+ export const SmartViewContextErrorDialogMessage = 'SmartViewContextErrorDialogMessage';
22
+ export const DefaultUiActionCode_CLOSE = 'DEFAULT_CLOSE';
23
+ export const DIALOG_DISABLE_CLOSE = new InjectionToken('dialogDisableClose');
24
+ export class SmartViewContextService {
25
+ set translateService(translateService) {
26
+ this._translateService = translateService;
27
+ this.translateServiceChanged.next();
28
+ this.translateServiceChanged.complete();
29
+ }
30
+ get translateService() {
31
+ if (this._translateService) {
32
+ return this._translateService;
33
+ }
34
+ return undefined;
35
+ }
36
+ constructor(view, session, dialog, apiQueueService, inject, compLib, defaultViewComponents) {
37
+ this.view = view;
38
+ this.session = session;
39
+ this.dialog = dialog;
40
+ this.apiQueueService = apiQueueService;
41
+ this.inject = inject;
42
+ this.viewContextUuidName = 'viewContextUuid';
43
+ this.viewContextUuidHeaderName = 'viewContextUuid';
44
+ this.pageNamePrefix = 'page.';
45
+ this.componentNamePrefix = 'component.';
46
+ this.viewHandlers = new Array();
47
+ this.defaultComponents = new Map();
48
+ this.openedViewUuids = new Array();
49
+ this.openedViewData = new Array();
50
+ // Monotonic counter bumped on every successful startViewContext(). Callers
51
+ // that hold a reference to a view-uuid from a previous viewcontext can
52
+ // detect a rebuild by comparing snapshots of this value.
53
+ this.generation = 0;
54
+ this._destroy$ = new Subject();
55
+ this.uuidOfPageHasBeenChanged = new SmartSubject(this._destroy$);
56
+ this.viewContextHasBeenSynced = new SmartSubject(this._destroy$);
57
+ this.openSmartLink = new SmartSubject(this._destroy$);
58
+ this.isOpeningSmartLink = false;
59
+ this.dialogRefs = [];
60
+ this.embeddedContainers = new Map();
61
+ this.embeddedViewRefs = [];
62
+ this.pendingEmbeddedViews = [];
63
+ this.smartApiClients = new Map();
64
+ this.translateServiceChanged = new SmartSubject(this._destroy$);
65
+ this.componentLibrary = compLib;
66
+ for (const entry of defaultViewComponents ?? []) {
67
+ this.defaultComponents.set(entry.componentName, entry.component);
68
+ }
69
+ }
70
+ ngOnDestroy() {
71
+ this._destroy$.next();
72
+ this._destroy$.complete();
73
+ }
74
+ follow(uuid, detectChange) {
75
+ this.smartApiClients.set(uuid, detectChange);
76
+ }
77
+ unfollow(uuid) {
78
+ this.smartApiClients.delete(uuid);
79
+ }
80
+ registerEmbeddedSlot(containerUuid, containerId, vcRef) {
81
+ let innerMap = this.embeddedContainers.get(containerUuid);
82
+ if (!innerMap) {
83
+ innerMap = new Map();
84
+ this.embeddedContainers.set(containerUuid, innerMap);
85
+ }
86
+ innerMap.set(containerId, vcRef);
87
+ // Reattach embedded views that were detached before layout re-render
88
+ const existing = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid && ref.containerId === containerId);
89
+ for (const ref of existing) {
90
+ if (!ref.componentRef.hostView.destroyed) {
91
+ vcRef.insert(ref.componentRef.hostView);
92
+ }
93
+ }
94
+ // Drain pending queue (match on the resolved slot, so router-slot NORMAL views match too)
95
+ const matches = (v) => {
96
+ const s = resolveSlot(v);
97
+ return s.containerUuid === containerUuid && s.containerId === containerId;
98
+ };
99
+ const matching = this.pendingEmbeddedViews.filter(matches);
100
+ this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => !matches(v));
101
+ if (matching.length > 0) {
102
+ const updates = matching.map((v) => this.openView(v));
103
+ this.sendViewContextUpdates(updates);
104
+ }
105
+ }
106
+ detachAllEmbeddedViews(containerUuid) {
107
+ const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
108
+ for (const child of children) {
109
+ if (child.componentRef.hostView.destroyed) {
110
+ continue;
111
+ }
112
+ const vcRef = this.getEmbeddedSlot(containerUuid, child.containerId);
113
+ if (vcRef) {
114
+ const idx = vcRef.indexOf(child.componentRef.hostView);
115
+ if (idx >= 0) {
116
+ vcRef.detach(idx);
117
+ }
118
+ }
119
+ }
120
+ }
121
+ cleanupOrphanedEmbeddedViews(containerUuid) {
122
+ const orphaned = this.embeddedViewRefs.filter((ref) => {
123
+ if (ref.containerUuid !== containerUuid) {
124
+ return false;
125
+ }
126
+ if (ref.componentRef.hostView.destroyed) {
127
+ return true;
128
+ }
129
+ const vcRef = this.getEmbeddedSlot(containerUuid, ref.containerId);
130
+ return !vcRef || vcRef.indexOf(ref.componentRef.hostView) < 0;
131
+ });
132
+ for (const ref of orphaned) {
133
+ if (!ref.componentRef.hostView.destroyed) {
134
+ ref.componentRef.destroy();
135
+ }
136
+ const idx = this.openedViewUuids.indexOf(ref.uuid);
137
+ if (idx >= 0) {
138
+ this.openedViewUuids.splice(idx, 1);
139
+ this.openedViewData.splice(idx, 1);
140
+ }
141
+ }
142
+ this.embeddedViewRefs = this.embeddedViewRefs.filter((ref) => !orphaned.includes(ref));
143
+ }
144
+ getCompositeModel(containerUuid) {
145
+ const result = {};
146
+ const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
147
+ for (const child of children) {
148
+ result[child.uuid] = child.componentRef.instance.getModel();
149
+ Object.assign(result, this.getCompositeModel(child.uuid));
150
+ }
151
+ return result;
152
+ }
153
+ submitEmbeddedForms(containerUuid, validate) {
154
+ const allInvalidKeys = [];
155
+ const allInvalidNames = [];
156
+ const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
157
+ for (const child of children) {
158
+ const instance = child.componentRef.instance;
159
+ instance.submitForm(validate);
160
+ if (validate) {
161
+ const invalid = instance.getInvalidFields();
162
+ allInvalidKeys.push(...invalid.invalidFieldKeys);
163
+ allInvalidNames.push(...invalid.invalidFieldNames);
164
+ }
165
+ const nested = this.submitEmbeddedForms(child.uuid, validate);
166
+ allInvalidKeys.push(...nested.invalidFieldKeys);
167
+ allInvalidNames.push(...nested.invalidFieldNames);
168
+ }
169
+ return { invalidFieldKeys: allInvalidKeys, invalidFieldNames: allInvalidNames };
170
+ }
171
+ unregisterEmbeddedSlot(containerUuid, containerId) {
172
+ const innerMap = this.embeddedContainers.get(containerUuid);
173
+ if (innerMap) {
174
+ innerMap.delete(containerId);
175
+ if (innerMap.size === 0) {
176
+ this.embeddedContainers.delete(containerUuid);
177
+ }
178
+ }
179
+ }
180
+ getEmbeddedSlot(containerUuid, containerId) {
181
+ return this.embeddedContainers.get(containerUuid)?.get(containerId);
182
+ }
183
+ /**
184
+ * Create the view's component into its resolved slot. Returns false and queues
185
+ * the view if the slot is not registered yet (drained on registration).
186
+ */
187
+ insertViewIntoSlot(view, component) {
188
+ const { containerUuid, containerId } = resolveSlot(view);
189
+ const vcRef = this.getEmbeddedSlot(containerUuid, containerId);
190
+ if (!vcRef) {
191
+ this.pendingEmbeddedViews.push(view);
192
+ return false;
193
+ }
194
+ const componentRef = vcRef.createComponent(component);
195
+ componentRef.instance.uuid = view.uuid;
196
+ componentRef.instance.run();
197
+ this.embeddedViewRefs.push({ uuid: view.uuid, containerUuid, containerId, componentRef });
198
+ return true;
199
+ }
200
+ setActionDescriptors(actionDescriptors) {
201
+ this.actionDescriptors = actionDescriptors;
202
+ }
203
+ getActionDescriptors() {
204
+ if (!this.actionDescriptors) {
205
+ console.error('No action descriptors has been set to ViewContext.');
206
+ }
207
+ return this.actionDescriptors;
208
+ }
209
+ setViewHandlers(viewHandlers) {
210
+ this.viewHandlers = viewHandlers;
211
+ }
212
+ setViewApiErrors(viewApiErrors) {
213
+ this.smartViewContextApiErrors = viewApiErrors;
214
+ }
215
+ setMessageDialogName(messageDialogName) {
216
+ this.messageDialogname = messageDialogName;
217
+ this.viewHandlers.push({
218
+ name: messageDialogName,
219
+ component: MessageDialogComponent,
220
+ });
221
+ }
222
+ setUpUrlForViewService() {
223
+ this.view.configuration.basePath = this.url;
224
+ }
225
+ getModuleURL(module) {
226
+ if (!this.moduleUrlsByModule) {
227
+ throw new Error('ModulesMap does not exist.');
228
+ }
229
+ let moduleUrl = this.moduleUrlsByModule?.get(module);
230
+ if (!moduleUrl) {
231
+ throw new Error('ModuleUrl does not exist with the given module.');
232
+ }
233
+ return moduleUrl;
234
+ }
235
+ setModuleURL(modules) {
236
+ this.moduleUrlsByModule = modules;
237
+ }
238
+ setUrl(url) {
239
+ this.url = url + '/view';
240
+ this.setUpUrlForViewService();
241
+ }
242
+ async getAndSyncViewContext(uuid) {
243
+ if (!uuid) {
244
+ uuid = this.getViewContextUuid();
245
+ }
246
+ await this.getViewContext(uuid).then(async () => {
247
+ await this.syncView();
248
+ });
249
+ }
250
+ async getViewContext(uuid) {
251
+ this.viewContext = await this.view.getViewContext(uuid).toPromise();
252
+ if (!this.viewContext) {
253
+ throw new Error('ViewContext does not exist with the given uuid.');
254
+ }
255
+ return this.viewContext;
256
+ }
257
+ async getViewContextDataByPageName(pageName) {
258
+ if (!this.viewContext) {
259
+ await this.getViewContext(this.getViewContextUuid());
260
+ }
261
+ let pageUuid = this.getUuidOfPage(pageName);
262
+ let viewContextByPageName = this.viewContext?.views.find((view) => view.uuid === pageUuid);
263
+ if (!viewContextByPageName) {
264
+ throw new Error(`The ViewData of ${pageName} is not found!`);
265
+ }
266
+ return viewContextByPageName;
267
+ }
268
+ async updateViewContext(viewContextUpdate) {
269
+ viewContextUpdate.deviceInfo ??= {
270
+ deviceId: 'id',
271
+ userAgent: navigator.userAgent,
272
+ parameters: new Map(),
273
+ };
274
+ viewContextUpdate.deviceInfo.componentLibrary = this.componentLibrary;
275
+ this.viewContext = await this.view.updateViewContext(viewContextUpdate).toPromise();
276
+ return this.viewContext;
277
+ }
278
+ clearSessionStorage() {
279
+ sessionStorage.clear();
280
+ this.clearEmbeddedViews();
281
+ this.openedViewData = [];
282
+ this.openedViewUuids = [];
283
+ }
284
+ /**
285
+ * Tear down all slot-hosted view components on a viewContext reset (e.g. logout /
286
+ * viewcontext-lost). Without this the previous view tree stays mounted in the root
287
+ * slot and the new tree is appended alongside it. Destroying a parent cascades to
288
+ * its nested slot directives (which unregister their containers via ngOnDestroy),
289
+ * leaving only the host-owned root slot registered.
290
+ */
291
+ clearEmbeddedViews() {
292
+ for (const ref of this.embeddedViewRefs) {
293
+ if (!ref.componentRef.hostView.destroyed) {
294
+ ref.componentRef.destroy();
295
+ }
296
+ }
297
+ this.embeddedViewRefs = [];
298
+ this.pendingEmbeddedViews = [];
299
+ }
300
+ async startViewContext() {
301
+ this.clearSessionStorage();
302
+ this.session.addHeaderParam({
303
+ headerName: this.viewContextUuidHeaderName,
304
+ value: '',
305
+ });
306
+ let newViewContext = await this.view
307
+ .createViewContext()
308
+ .toPromise();
309
+ if (!newViewContext) {
310
+ throw new Error('No ViewContext was created');
311
+ }
312
+ this.viewContext = newViewContext;
313
+ this.setViewContextUuid(newViewContext.uuid);
314
+ this.generation++;
315
+ return this.viewContext;
316
+ }
317
+ getGeneration() {
318
+ return this.generation;
319
+ }
320
+ async initialize(uuid) {
321
+ if (this.initializeRunning) {
322
+ return this.initializeRunning.toPromise();
323
+ }
324
+ else {
325
+ this.initializeRunning = new SmartSubject(this._destroy$);
326
+ try {
327
+ if (this.viewHandlers.length === 0) {
328
+ throw new Error("There aren't any viewHandlers in SmartViewContextService! Provide some to use its functions.");
329
+ }
330
+ if (!this.messageDialogname) {
331
+ throw new Error('The messageDialogName provided by the backend has not been set.');
332
+ }
333
+ if (uuid) {
334
+ this.setViewContextUuid(uuid);
335
+ try {
336
+ await this.getViewContext(uuid);
337
+ }
338
+ catch (err) {
339
+ await this.startViewContext();
340
+ }
341
+ }
342
+ else {
343
+ await this.startViewContext();
344
+ }
345
+ return this.viewContext;
346
+ }
347
+ finally {
348
+ this.initializeRunning.next(this.viewContext);
349
+ this.initializeRunning.complete();
350
+ this.initializeRunning = undefined;
351
+ }
352
+ }
353
+ }
354
+ async initViewContext() {
355
+ let uuid;
356
+ try {
357
+ uuid = this.getViewContextUuid();
358
+ }
359
+ catch (error) {
360
+ await this.initialize();
361
+ uuid = this.getViewContextUuid();
362
+ }
363
+ await this.initialize(uuid);
364
+ await this.restoreViews(uuid);
365
+ await this.getAndSyncViewContext();
366
+ }
367
+ /**
368
+ * Hydrates the view-context state from an already-existing UUID provided
369
+ * externally (e.g. by a native mobile shell via URL fragment). Unlike
370
+ * `initialize(uuid)`, this method does NOT fall back to creating a fresh
371
+ * viewContext if the backend rejects the UUID — the caller is expected to
372
+ * surface the failure (typically via the bootstrap's `onStartError` hook).
373
+ */
374
+ async initFromExistingViewContext(uuid) {
375
+ this.setViewContextUuid(uuid);
376
+ await this.getViewContext(uuid);
377
+ await this.restoreViews(uuid);
378
+ }
379
+ async initNewViewContext() {
380
+ if (this.initiNewContextRunning) {
381
+ return this.initiNewContextRunning.toPromise();
382
+ }
383
+ this.initiNewContextRunning = new SmartSubject(this._destroy$);
384
+ try {
385
+ await this.startViewContext();
386
+ let uuid = this.getViewContextUuid();
387
+ await this.initialize(uuid);
388
+ await this.restoreViews(uuid);
389
+ }
390
+ finally {
391
+ this.initiNewContextRunning.next();
392
+ this.initiNewContextRunning.complete();
393
+ this.initiNewContextRunning = undefined;
394
+ }
395
+ }
396
+ openView(view) {
397
+ let alreadyOpened = this.openedViewUuids.some((uuid) => uuid === view.uuid);
398
+ if (alreadyOpened)
399
+ return undefined;
400
+ const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, view);
401
+ if (!viewHandler) {
402
+ throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName} (componentName: ${view.componentName})`);
403
+ }
404
+ if (view.type === ViewType.DIALOG) {
405
+ if (!viewHandler.component) {
406
+ throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
407
+ }
408
+ let refIsAlradyAdded = this.dialogRefs.some((ref) => ref.uuid === view.uuid);
409
+ if (!refIsAlradyAdded) {
410
+ let dialogRef;
411
+ try {
412
+ this.openedViewUuids.push(view.uuid);
413
+ this.openedViewData.push(view);
414
+ this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
415
+ dialogRef = this.dialog.openComponentAsDialog(viewHandler.component, viewHandler.name, view.uuid);
416
+ }
417
+ finally {
418
+ const index = this.openedViewUuids.indexOf(view.uuid);
419
+ if (index >= 0) {
420
+ this.openedViewUuids.splice(index, 1);
421
+ this.openedViewData.splice(index, 1);
422
+ this.clearUuidOfPage(view.viewName, viewHandler.componentName);
423
+ }
424
+ this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
425
+ }
426
+ let dialogDisableClose = true;
427
+ let isMessageDialog = view.viewName === this.messageDialogname;
428
+ if (!isMessageDialog) {
429
+ try {
430
+ dialogDisableClose = this.inject.get(DIALOG_DISABLE_CLOSE);
431
+ }
432
+ catch {
433
+ console.error('Error during reading DIALOG_DISABLE_CLOSE');
434
+ }
435
+ }
436
+ if (dialogRef instanceof MatDialogRef) {
437
+ dialogRef.disableClose = dialogDisableClose;
438
+ // if (isMessageDialog) {
439
+ // if (view.message?.options && view.message.options.length) {
440
+ // }
441
+ // }
442
+ if (!dialogDisableClose) {
443
+ dialogRef
444
+ .afterClosed()
445
+ .pipe(takeUntil(this._destroy$))
446
+ .subscribe(() => {
447
+ this.performAction(view.uuid, { code: DefaultUiActionCode_CLOSE, params: {} });
448
+ });
449
+ }
450
+ }
451
+ else if (dialogRef instanceof DynamicDialogRef) {
452
+ if (!dialogDisableClose) {
453
+ dialogRef.onDestroy.pipe(takeUntil(this._destroy$)).subscribe(() => {
454
+ this.performAction(view.uuid, { code: DefaultUiActionCode_CLOSE, params: {} });
455
+ });
456
+ }
457
+ }
458
+ this.dialogRefs.push({
459
+ uuid: view.uuid,
460
+ dialogRef,
461
+ });
462
+ }
463
+ }
464
+ else if (view.type === ViewType.NORMAL) {
465
+ if (!viewHandler.component) {
466
+ throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
467
+ }
468
+ // COMPATIBILITY SHIM (#28870, intentional): some child services (SmarttreeGenericService,
469
+ // SmartFilterEditorService) and generic components (SearchPageComponent, GenericPageComponent)
470
+ // still resolve their view uuid via the pageName -> getUuidOfPage(sessionStorage) indirection
471
+ // in their CONSTRUCTOR, which runs inside createComponent() below — before openView's normal
472
+ // bookkeeping. So the mapping must be written here, ahead of component creation. The proper
473
+ // fix (feed those consumers the injected uuid + defer their init) is deferred consumer plumbing;
474
+ // until then this write keeps the indirection correct in the slot world.
475
+ this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
476
+ // A NORMAL view with no containerUuid lands in the host root slot (resolveSlot maps
477
+ // it to ROOT_CONTAINER_UUID); if no slot is registered yet it queues and drains later.
478
+ const inserted = this.insertViewIntoSlot(view, viewHandler.component);
479
+ if (!inserted)
480
+ return undefined;
481
+ }
482
+ else if (view.type === ViewType.EMBEDDED) {
483
+ if (!viewHandler.component) {
484
+ throw new Error(`Component is undefined in SmartViewHandlerModel with name: ${view.viewName}`);
485
+ }
486
+ // Write the page-uuid mapping ahead of component creation so constructor-time
487
+ // and nested getUuidOfPage(viewName) consumers (filter, tree) resolve. The
488
+ // page.<viewName> key is distinct per view, so it never collides. The
489
+ // component.<componentName> reverse key CAN be overwritten by another
490
+ // concurrent dynamic view of the same default component, but it is read only
491
+ // synchronously in the constructor (right after this write) and slot views
492
+ // load via the injected _uuid afterwards, so the overwrite never mis-resolves
493
+ // at runtime. (#28870)
494
+ this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
495
+ const inserted = this.insertViewIntoSlot(view, viewHandler.component);
496
+ if (!inserted)
497
+ return undefined;
498
+ }
499
+ else {
500
+ throw new Error('The type of the view and its viewHandler is not the same!');
501
+ }
502
+ view.state = ViewState.OPENED;
503
+ this.openedViewUuids.push(view.uuid);
504
+ this.openedViewData.push(view);
505
+ if (view.type !== ViewType.EMBEDDED) {
506
+ this.setUuidOfPage(view.viewName, view.uuid, viewHandler.componentName);
507
+ this.uuidOfPageHasBeenChanged.next(view.viewName);
508
+ }
509
+ return {
510
+ state: ViewState.OPENED,
511
+ uuid: view.uuid,
512
+ };
513
+ }
514
+ closeView(view) {
515
+ const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, view);
516
+ if (!viewHandler) {
517
+ throw new Error(`SmartViewHandlerModel was not found by view name: ${view.viewName} (componentName: ${view.componentName})`);
518
+ }
519
+ const updates = [];
520
+ if (view.type === ViewType.DIALOG) {
521
+ let dialogRef = this.dialogRefs.find((dialogRef) => dialogRef.uuid === view.uuid);
522
+ if (dialogRef) {
523
+ dialogRef.dialogRef.close();
524
+ let index = this.dialogRefs.indexOf(dialogRef);
525
+ this.dialogRefs.splice(index, 1);
526
+ }
527
+ else {
528
+ // console.log('DialogRef is not found by uuid.');
529
+ }
530
+ updates.push(...this.cleanupEmbeddedChildren(view.uuid));
531
+ }
532
+ else if (view.type === ViewType.NORMAL) {
533
+ // Destroy nested children first, then the view's own slot component.
534
+ // destroyViewRef is a no-op for the legacy route-rendered (rootless) case.
535
+ updates.push(...this.cleanupEmbeddedChildren(view.uuid));
536
+ this.destroyViewRef(view.uuid);
537
+ }
538
+ else if (view.type === ViewType.EMBEDDED) {
539
+ this.destroyViewRef(view.uuid);
540
+ }
541
+ else {
542
+ throw new Error('The type of the view and its viewHandler is not the same!');
543
+ }
544
+ view.state = ViewState.CLOSED;
545
+ const index = this.openedViewUuids.indexOf(view.uuid);
546
+ if (index >= 0) {
547
+ this.openedViewUuids.splice(index, 1);
548
+ this.openedViewData.splice(index, 1);
549
+ // Clear for every type: openView now writes the page-uuid mapping for
550
+ // EMBEDDED views too (#28870), so the clear must be symmetric to avoid a
551
+ // stale sessionStorage entry. clearUuidOfPage is a no-op for keys never
552
+ // written, so this stays safe for the legacy rootless case.
553
+ this.clearUuidOfPage(view.viewName, viewHandler.componentName);
554
+ }
555
+ updates.push({
556
+ state: ViewState.CLOSED,
557
+ uuid: view.uuid,
558
+ });
559
+ return updates;
560
+ }
561
+ cleanupEmbeddedChildren(containerUuid) {
562
+ const updates = [];
563
+ const children = this.embeddedViewRefs.filter((ref) => ref.containerUuid === containerUuid);
564
+ for (const child of children) {
565
+ child.componentRef.destroy();
566
+ updates.push({ state: ViewState.CLOSED, uuid: child.uuid });
567
+ }
568
+ this.embeddedViewRefs = this.embeddedViewRefs.filter((ref) => ref.containerUuid !== containerUuid);
569
+ this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => v.containerUuid !== containerUuid);
570
+ this.embeddedContainers.delete(containerUuid);
571
+ return updates;
572
+ }
573
+ /** Destroy the component for a view living in a slot, if present (no-op for route-rendered views). */
574
+ destroyViewRef(uuid) {
575
+ const refIndex = this.embeddedViewRefs.findIndex((ref) => ref.uuid === uuid);
576
+ if (refIndex >= 0) {
577
+ this.embeddedViewRefs[refIndex].componentRef.destroy();
578
+ this.embeddedViewRefs.splice(refIndex, 1);
579
+ }
580
+ this.pendingEmbeddedViews = this.pendingEmbeddedViews.filter((v) => v.uuid !== uuid);
581
+ }
582
+ async sendViewContextUpdates(updatesToSend) {
583
+ const updates = [];
584
+ updatesToSend.forEach((update) => {
585
+ if (update !== undefined && update !== null)
586
+ updates.push(update);
587
+ });
588
+ if (updates.length > 0) {
589
+ await this.updateViewContext({
590
+ updates,
591
+ uuid: this.viewContext?.uuid,
592
+ });
593
+ }
594
+ }
595
+ async restoreViews(uuid) {
596
+ const updates = [];
597
+ if (!this.viewContext) {
598
+ await this.getViewContext(uuid);
599
+ }
600
+ this.viewContext.views.filter((view) => view.state === ViewState.OPENED || view.state === ViewState.TO_OPEN).map((view) => {
601
+ const update = this.openView(view);
602
+ if (update) {
603
+ updates.push(update);
604
+ }
605
+ });
606
+ await this.sendViewContextUpdates(updates);
607
+ }
608
+ reuseEnabled() {
609
+ try {
610
+ const value = this.inject.get(REUSE_ROUTER_SLOT_COMPONENT);
611
+ return value !== false; // default ON when unset/null
612
+ }
613
+ catch {
614
+ return true;
615
+ }
616
+ }
617
+ executeReuse(oldView, newView) {
618
+ const ref = this.embeddedViewRefs.find((r) => r.uuid === oldView.uuid);
619
+ if (!ref) {
620
+ // No live component to reuse (e.g. was route-rendered) — fall back to close + open.
621
+ const updates = [...this.closeView(oldView)];
622
+ const opened = this.openView(newView);
623
+ if (opened)
624
+ updates.push(opened);
625
+ return updates;
626
+ }
627
+ // The reused parent is logically a fresh page (new uuid); its previous embedded
628
+ // children do not carry over (the backend leaves them keyed under the old parent
629
+ // uuid). Tear them down here and report them CLOSED.
630
+ const childUpdates = this.cleanupEmbeddedChildren(oldView.uuid);
631
+ ref.componentRef.instance.uuid = newView.uuid; // setter runs unfollow(old)/follow(new)
632
+ ref.uuid = newView.uuid;
633
+ const oldIdx = this.openedViewUuids.indexOf(oldView.uuid);
634
+ if (oldIdx >= 0) {
635
+ this.openedViewUuids.splice(oldIdx, 1);
636
+ this.openedViewData.splice(oldIdx, 1);
637
+ }
638
+ this.openedViewUuids.push(newView.uuid);
639
+ this.openedViewData.push(newView);
640
+ ref.componentRef.instance.run();
641
+ oldView.state = ViewState.CLOSED;
642
+ newView.state = ViewState.OPENED;
643
+ // Mirror the normal openView tail so getUuidOfPage consumers (e.g. trees) resolve the new uuid.
644
+ const viewHandler = resolveViewHandler(this.viewHandlers, this.defaultComponents, newView);
645
+ this.setUuidOfPage(newView.viewName, newView.uuid, viewHandler?.componentName);
646
+ this.uuidOfPageHasBeenChanged.next(newView.viewName);
647
+ return [
648
+ ...childUpdates,
649
+ { state: ViewState.CLOSED, uuid: oldView.uuid },
650
+ { state: ViewState.OPENED, uuid: newView.uuid },
651
+ ];
652
+ }
653
+ async syncView() {
654
+ const updates = [];
655
+ const ops = buildViewOps(this.viewContext?.views ?? [], this.reuseEnabled());
656
+ for (const op of ops) {
657
+ if (op.kind === 'open') {
658
+ updates.push(this.openView(op.view));
659
+ }
660
+ else if (op.kind === 'close') {
661
+ updates.push(...this.closeView(op.view));
662
+ }
663
+ else {
664
+ updates.push(...this.executeReuse(op.oldView, op.newView));
665
+ }
666
+ }
667
+ const viewDataToClose = this.openedViewData.filter((viewData) => !this.viewContext?.views
668
+ .flatMap((viewData) => viewData.uuid)
669
+ .includes(viewData.uuid));
670
+ if (viewDataToClose?.length) {
671
+ viewDataToClose.map((viewData) => {
672
+ updates.push(...this.closeView(viewData));
673
+ });
674
+ }
675
+ this.viewContext?.links?.map((data) => {
676
+ const link = document.createElement('a');
677
+ let target = '_blank'; // default
678
+ switch (data.target ?? LinkTargetEnum.BLANK) {
679
+ case 'SELF':
680
+ target = '_self';
681
+ break;
682
+ case 'BLANK':
683
+ target = '_blank';
684
+ break;
685
+ case 'PARENT':
686
+ target = '_parent';
687
+ break;
688
+ case 'TOP':
689
+ target = '_top';
690
+ break;
691
+ }
692
+ link.setAttribute('target', target);
693
+ link.setAttribute('href', data.url);
694
+ if (data.download) {
695
+ link.setAttribute('download', data.filename ?? '');
696
+ }
697
+ document.body.appendChild(link);
698
+ link.click();
699
+ link.remove();
700
+ });
701
+ this.startDownloadsFiles(this.viewContext?.downloads || []);
702
+ const clipboardText = this.viewContext?.clipboardData
703
+ ?.map((cd) => cd.text || '')
704
+ .join('');
705
+ if (clipboardText) {
706
+ const clipboard = navigator.clipboard;
707
+ // available only in secure contexts.
708
+ if (clipboard) {
709
+ try {
710
+ clipboard
711
+ .writeText(clipboardText)
712
+ .catch((e) => console.error('Failed to copy text to clipboard', e));
713
+ }
714
+ catch (e) {
715
+ console.error('Error accessing clipboard', e);
716
+ }
717
+ }
718
+ }
719
+ await this.sendViewContextUpdates(updates);
720
+ this.viewContextHasBeenSynced.next();
721
+ }
722
+ async startDownloadsFiles(downloads) {
723
+ for (const file of downloads) {
724
+ try {
725
+ let blob = await this.downloadResource(file.uuid, file.identifier);
726
+ let url = URL.createObjectURL(blob);
727
+ const link = document.createElement('a');
728
+ link.setAttribute('target', '_blank');
729
+ link.setAttribute('href', url);
730
+ link.setAttribute('download', file.filename);
731
+ document.body.appendChild(link);
732
+ link.click();
733
+ link.remove();
734
+ }
735
+ catch (e) {
736
+ console.error('Error downloading file', e);
737
+ }
738
+ }
739
+ }
740
+ setViewContextUuid(uuid) {
741
+ sessionStorage.setItem(this.viewContextUuidName, uuid);
742
+ this.session.addHeaderParam({
743
+ headerName: this.viewContextUuidHeaderName,
744
+ value: uuid,
745
+ });
746
+ }
747
+ getViewContextUuid() {
748
+ let viewContextUuid = sessionStorage.getItem(this.viewContextUuidName);
749
+ if (!viewContextUuid) {
750
+ throw new Error('View context is not initialized!');
751
+ }
752
+ return viewContextUuid;
753
+ }
754
+ hasViewContextUuid() {
755
+ let viewContextUuid = sessionStorage.getItem(this.viewContextUuidName);
756
+ return viewContextUuid !== null && viewContextUuid !== undefined;
757
+ }
758
+ setUuidOfPage(pageName, uuid, componentName) {
759
+ sessionStorage.setItem(this.pageNamePrefix + pageName, uuid);
760
+ if (componentName) {
761
+ sessionStorage.setItem(this.componentNamePrefix + componentName, pageName);
762
+ }
763
+ }
764
+ clearUuidOfPage(pageName, componentName) {
765
+ sessionStorage.removeItem(this.pageNamePrefix + pageName);
766
+ if (componentName) {
767
+ sessionStorage.removeItem(this.componentNamePrefix + componentName);
768
+ }
769
+ }
770
+ getUuidOfPage(pageName) {
771
+ let uuid = sessionStorage.getItem(this.pageNamePrefix + pageName);
772
+ if (!uuid) {
773
+ throw new Error(`The uuid of ${pageName} is not available.`);
774
+ }
775
+ return uuid;
776
+ }
777
+ getPageNameOfComponent(componentName) {
778
+ let pageName = sessionStorage.getItem(this.componentNamePrefix + componentName);
779
+ if (!pageName) {
780
+ throw new Error(`The pageName of ${componentName} is not available.`);
781
+ }
782
+ return pageName;
783
+ }
784
+ async message(messageData, messageResult) {
785
+ return await this.handlePerformActionResponse(await this.view
786
+ .message(messageData.viewUuid ?? '', messageData.uuid, messageResult)
787
+ .toPromise());
788
+ // in future use this.apiQueueService.addToQueue
789
+ }
790
+ async getSmartViewContextApiErrorByCode(code) {
791
+ let buttonLabel;
792
+ let dialogTitle;
793
+ let message;
794
+ if (this.translateService) {
795
+ buttonLabel = await this.translateService
796
+ .get(SmartViewContextErrorDialogButtonLabel)
797
+ .toPromise();
798
+ dialogTitle = await this.translateService.get(SmartViewContextErrorDialogTitle).toPromise();
799
+ message = await this.translateService.get(SmartViewContextErrorDialogMessage).toPromise();
800
+ }
801
+ else {
802
+ buttonLabel = 'Ok';
803
+ dialogTitle = 'Hiba';
804
+ message = 'An error has occured.';
805
+ }
806
+ if (!this.smartViewContextApiErrors) {
807
+ return {
808
+ code,
809
+ message,
810
+ buttonLabel,
811
+ dialogTitle,
812
+ };
813
+ }
814
+ let apiErrorsWithCode = this.smartViewContextApiErrors.viewContextApiErrors.filter((apiError) => {
815
+ return apiError.code === code;
816
+ });
817
+ if (!apiErrorsWithCode || (apiErrorsWithCode && !apiErrorsWithCode.length)) {
818
+ console.error(`SmartViewContextApiError with code ${code} could not be found.`);
819
+ return {
820
+ code,
821
+ message,
822
+ buttonLabel,
823
+ dialogTitle,
824
+ };
825
+ }
826
+ return apiErrorsWithCode[0];
827
+ }
828
+ async getViewConstraint(uuid) {
829
+ let viewConstraintResponse = await this.view.getViewConstraint(uuid).toPromise();
830
+ if (!viewConstraintResponse)
831
+ throw new Error('Could not get ViewConstraint with the given uuid.');
832
+ return viewConstraintResponse;
833
+ }
834
+ async showPublishedView(channel, uuid) {
835
+ this.isOpeningSmartLink = true;
836
+ await this.session.initialize();
837
+ // TODO init view context automatically
838
+ // await this.initialize();
839
+ await this.initViewContext();
840
+ this.openSmartLink.next(channel);
841
+ await this.openSmartLink.toPromise();
842
+ await this.view.showPublishedView(channel, uuid).toPromise();
843
+ await this.getAndSyncViewContext();
844
+ this.isOpeningSmartLink = false;
845
+ }
846
+ async downloadResource(uuid, item) {
847
+ return await this.view.downloadItem(uuid, item).toPromise();
848
+ }
849
+ async performAction(uuid, uiActionRequest) {
850
+ return await this._performAction({
851
+ uuid,
852
+ uiActionRequest,
853
+ });
854
+ // const isCompleted = new Subject<void>();
855
+ // this.apiQueueService.addToQueue({
856
+ // callback: this._performAction.bind(this),
857
+ // config: {
858
+ // uuid,
859
+ // uiActionRequest,
860
+ // },
861
+ // isCompleted,
862
+ // });
863
+ // return await isCompleted.toPromise();
864
+ }
865
+ async performWidgetAction(uuid, widgetId, nodeId, uiActionRequest) {
866
+ return await this._performWidgetAction({ uuid, widgetId, nodeId, uiActionRequest });
867
+ // const isCompleted = new Subject<void>();
868
+ // this.apiQueueService.addToQueue({
869
+ // callback: this._performWidgetAction.bind(this),
870
+ // config: {
871
+ // uuid,
872
+ // widgetId,
873
+ // nodeId,
874
+ // uiActionRequest,
875
+ // },
876
+ // isCompleted,
877
+ // });
878
+ // return await isCompleted.toPromise();
879
+ }
880
+ async performWidgetMainAction(uuid, widgetId, uiActionRequest) {
881
+ return await this._performWidgetMainAction({ uuid, widgetId, uiActionRequest });
882
+ // const isCompleted = new Subject<void>();
883
+ // this.apiQueueService.addToQueue({
884
+ // callback: this._performWidgetMainAction.bind(this),
885
+ // config: {
886
+ // uuid,
887
+ // widgetId,
888
+ // uiActionRequest,
889
+ // },
890
+ // isCompleted,
891
+ // });
892
+ // return await isCompleted.toPromise();
893
+ }
894
+ async performUploadAction(uuid, uiActionRequest, param, content) {
895
+ this._performUploadAction({
896
+ uuid,
897
+ uiActionRequest,
898
+ param,
899
+ content,
900
+ });
901
+ }
902
+ async performUploadMultipleAction(uuid, uiActionRequest, param, content) {
903
+ this._performUploadMultipleAction({
904
+ uuid,
905
+ uiActionRequest,
906
+ param,
907
+ content,
908
+ });
909
+ }
910
+ async dataChanged(uuid, dataChange) {
911
+ return await this._dataChanged({ uuid, dataChange });
912
+ // const isCompleted = new Subject<void>();
913
+ // this.apiQueueService.addToQueue(
914
+ // {
915
+ // callback: this._dataChanged.bind(this),
916
+ // config: {
917
+ // uuid,
918
+ // dataChange,
919
+ // },
920
+ // isCompleted,
921
+ // },
922
+ // true
923
+ // );
924
+ // return await isCompleted.toPromise();
925
+ }
926
+ async _performAction(config) {
927
+ return await this.handlePerformActionResponse(await this.view.performAction(config.uuid, config.uiActionRequest).toPromise());
928
+ }
929
+ async _performWidgetAction(config) {
930
+ return await this.handlePerformActionResponse(await this.view
931
+ .performWidgetAction(config.uuid, config.widgetId, config.nodeId, config.uiActionRequest)
932
+ .toPromise());
933
+ }
934
+ async _performWidgetMainAction(config) {
935
+ return await this.handlePerformActionResponse(await this.view
936
+ .performWidgetMainAction(config.uuid, config.widgetId, config.uiActionRequest)
937
+ .toPromise());
938
+ }
939
+ async _performUploadAction(config) {
940
+ return await this.handlePerformActionResponse(await this.view
941
+ .uploadAction(config.uuid, JSON.stringify(config.uiActionRequest), config.param, config.content)
942
+ .toPromise());
943
+ }
944
+ async _performUploadMultipleAction(config) {
945
+ return await this.handlePerformActionResponse(await this.view
946
+ .uploadMultipleAction(config.uuid, JSON.stringify(config.uiActionRequest), config.param, config.content)
947
+ .toPromise());
948
+ }
949
+ async _dataChanged(config) {
950
+ return await this.handlePerformActionResponse(await this.view.dataChanged(config.uuid, config.dataChange).toPromise());
951
+ }
952
+ async handlePerformActionResponse(viewContextChange) {
953
+ this.viewContext = viewContextChange?.viewContext;
954
+ await this.syncView();
955
+ if (viewContextChange?.changes) {
956
+ this.handleChanges(viewContextChange.changes);
957
+ }
958
+ return viewContextChange?.result;
959
+ }
960
+ handleChanges(changes) {
961
+ changes.forEach((componentModelChange) => {
962
+ let detectChange = this.smartApiClients.get(componentModelChange.uuid);
963
+ if (detectChange) {
964
+ detectChange.next(componentModelChange);
965
+ }
966
+ });
967
+ }
968
+ async load(uuid) {
969
+ return await this.view.getComponentModel(uuid).toPromise();
970
+ }
971
+ async load2(uuid) {
972
+ let change = await this.view.getComponentModel2(uuid).toPromise();
973
+ this.handlePerformActionResponse(change);
974
+ return change;
975
+ }
976
+ getCurrentViewContext() {
977
+ return this.viewContext;
978
+ }
979
+ 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.SmartViewContextDialogService }, { token: ApiQueueService }, { token: i0.Injector }, { token: COMPONENT_LIBRARY, optional: true }, { token: SMART_DEFAULT_VIEW_COMPONENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
980
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, providedIn: 'root' }); }
981
+ }
982
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, decorators: [{
983
+ type: Injectable,
984
+ args: [{
985
+ providedIn: 'root',
986
+ }]
987
+ }], ctorParameters: () => [{ type: i1.ViewService }, { type: i2.SmartSessionService }, { type: i3.SmartViewContextDialogService }, { type: ApiQueueService }, { type: i0.Injector }, { type: i4.ComponentLibrary, decorators: [{
988
+ type: Inject,
989
+ args: [COMPONENT_LIBRARY]
990
+ }, {
991
+ type: Optional
992
+ }] }, { type: undefined, decorators: [{
993
+ type: Inject,
994
+ args: [SMART_DEFAULT_VIEW_COMPONENTS]
995
+ }, {
996
+ type: Optional
997
+ }] }] });
998
+ export const IS_ASYNC_PARAM_NAME = 'isAsync';
999
+ export class ApiQueueService {
1000
+ constructor() {
1001
+ this._destroy$ = new Subject();
1002
+ this.queue = [];
1003
+ this.isProcessing = false;
1004
+ this.queueSubject = new SmartSubject(this._destroy$);
1005
+ this.queueSubject.pipe(takeUntil(this._destroy$)).subscribe(() => this.processQueue());
1006
+ }
1007
+ ngOnDestroy() {
1008
+ this._destroy$.next();
1009
+ this._destroy$.complete();
1010
+ }
1011
+ addToQueue(call, priority = false) {
1012
+ if (priority) {
1013
+ this.queue.unshift(call); // Add at the beginning of the queue if it has higher priority
1014
+ }
1015
+ else {
1016
+ this.queue.push(call); // Add at the end of the queue if it has lower priority
1017
+ }
1018
+ if (!this.isProcessing) {
1019
+ this.processQueue();
1020
+ }
1021
+ }
1022
+ async processQueue() {
1023
+ if (this.queue.length === 0) {
1024
+ this.isProcessing = false;
1025
+ return;
1026
+ }
1027
+ const apiQueueCall = this.queue.shift();
1028
+ if (apiQueueCall) {
1029
+ await apiQueueCall.callback(apiQueueCall.config);
1030
+ apiQueueCall.isCompleted.complete();
1031
+ this.queueSubject.next();
1032
+ }
1033
+ }
1034
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1035
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, providedIn: 'root' }); }
1036
+ }
1037
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ApiQueueService, decorators: [{
1038
+ type: Injectable,
1039
+ args: [{
1040
+ providedIn: 'root',
1041
+ }]
1042
+ }], ctorParameters: () => [] });
1043
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi92aWV3LWNvbnRleHQvc21hcnQtdmlldy1jb250ZXh0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsY0FBYyxFQUlkLFFBQVEsR0FFVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcxQyxPQUFPLEVBT0wsY0FBYyxFQVdkLFNBQVMsRUFFVCxRQUFRLEdBQ1QsTUFBTSxPQUFPLENBQUM7QUFDZixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQVNuRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUNMLDZCQUE2QixHQUU5QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQUV4RSxNQUFNLENBQUMsTUFBTSxzQ0FBc0MsR0FBRyx3Q0FBd0MsQ0FBQztBQUMvRixNQUFNLENBQUMsTUFBTSxnQ0FBZ0MsR0FB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VSxDQUFDLElBQWtCLEVBQUUsV0FBb0IsS0FBSztRQUN0RCxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyw4REFBOEQ7UUFDMUYsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHVEQUF1RDtRQUNoRixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWTtRQUNoQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sWUFBWSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDakQsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDOytHQXRDVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIEluamVjdG9yLFxuICBtb2RlbCxcbiAgT25EZXN0cm95LFxuICBPcHRpb25hbCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFNtYXJ0Rm9ybUludmFsaWRGaWVsZHMgfSBmcm9tICcuLi9zbWFydC1mb3JtL3NtYXJ0Zm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBTbWFydFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vc2Vzc2lvbi9zbWFydC1zZXNzaW9uLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQ2xpcGJvYXJkRGF0YSxcbiAgQ29tcG9uZW50TW9kZWwsXG4gIENvbXBvbmVudE1vZGVsQ2hhbmdlLFxuICBEYXRhQ2hhbmdlLFxuICBEb3dubG9hZGVkRmlsZSxcbiAgTGluayxcbiAgTGlua1RhcmdldEVudW0sXG4gIE1lc3NhZ2VEYXRhLFxuICBNZXNzYWdlUmVzdWx0LFxuICBVaUFjdGlvbkRlc2NyaXB0b3IsXG4gIFVpQWN0aW9uUmVxdWVzdCxcbiAgVmlld0NvbnN0cmFpbnQsXG4gIFZpZXdDb250ZXh0Q2hhbmdlLFxuICBWaWV3Q29udGV4dERhdGEsXG4gIFZpZXdDb250ZXh0VXBkYXRlLFxuICBWaWV3RGF0YSxcbiAgVmlld1NlcnZpY2UsXG4gIFZpZXdTdGF0ZSxcbiAgVmlld1N0YXRlVXBkYXRlLFxuICBWaWV3VHlwZSxcbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHsgTWVzc2FnZURpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vbWVzc2FnZS1kaWFsb2cvbWVzc2FnZS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7XG4gIFNtYXJ0RW1iZWRkZWRWaWV3UmVmLFxuICBTbWFydFRyYW5zbGF0ZVNlcnZpY2UsXG4gIFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcixcbiAgU21hcnRWaWV3Q29udGV4dEFwaUVycm9ycyxcbiAgU21hcnRWaWV3RGlhbG9nUmVmLFxuICBTbWFydFZpZXdIYW5kbGVyTW9kZWwsXG59IGZyb20gJy4vc21hcnQtdmlldy1jb250ZXh0Lm1vZGVsJztcbmltcG9ydCB7IFNtYXJ0U3ViamVjdCB9IGZyb20gJy4uL3NtYXJ0LXN1YmplY3QvcHJvamVjdHMnO1xuaW1wb3J0IHsgU21hcnRWaWV3Q29udGV4dERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuL3NtYXJ0LXZpZXctY29udGV4dC1kaWFsb2cuc2VydmljZSc7XG5pbXBvcnQgeyBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgRHluYW1pY0RpYWxvZ1JlZiB9IGZyb20gJ3ByaW1lbmcvZHluYW1pY2RpYWxvZyc7XG5pbXBvcnQgeyBDT01QT05FTlRfTElCUkFSWSwgQ29tcG9uZW50TGlicmFyeSB9IGZyb20gJy4vdXRpbGl0eS9jb21wb25lbnRMaWJyYXJ5JztcbmltcG9ydCB7IENvbXBvbmVudFR5cGUgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IHJlc29sdmVTbG90IH0gZnJvbSAnLi92aWV3LXNsb3QtcmVzb2x1dGlvbic7XG5pbXBvcnQge1xuICBTTUFSVF9ERUZBVUxUX1ZJRVdfQ09NUE9ORU5UUyxcbiAgRGVmYXVsdFZpZXdDb21wb25lbnRFbnRyeSxcbn0gZnJvbSAnLi9kZWZhdWx0LXZpZXctY29tcG9uZW50cy50b2tlbic7XG5pbXBvcnQgeyByZXNvbHZlVmlld0hhbmRsZXIgfSBmcm9tICcuL3ZpZXctaGFuZGxlci1yZXNvbHV0aW9uJztcbmltcG9ydCB7IGJ1aWxkVmlld09wcyB9IGZyb20gJy4vdmlldy1vcCc7XG5pbXBvcnQgeyBSRVVTRV9ST1VURVJfU0xPVF9DT01QT05FTlQgfSBmcm9tICcuL3JldXNlLXJvdXRlci1zbG90LnRva2VuJztcblxuZXhwb3J0IGNvbnN0IFNtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ0J1dHRvbkxhYmVsID0gJ1NtYXJ0Vmlld0NvbnRleHRFcnJvckRpYWxvZ0J1dHRvbkxhYmVsJztcbmV4cG9ydCBjb25zdCBTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSc7XG5leHBvcnQgY29uc3QgU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nTWVzc2FnZSA9ICdTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlJztcbmV4cG9ydCBjb25zdCBEZWZhdWx0VWlBY3Rpb25Db2RlX0NMT1NFID0gJ0RFRkFVTFRfQ0xPU0UnO1xuXG5leHBvcnQgY29uc3QgRElBTE9HX0RJU0FCTEVfQ0xPU0UgPSBuZXcgSW5qZWN0aW9uVG9rZW48Ym9vbGVhbj4oJ2RpYWxvZ0Rpc2FibGVDbG9zZScpO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgU21hcnRWaWV3Q29udGV4dFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250ZXh0VXVpZE5hbWU6IHN0cmluZyA9ICd2aWV3Q29udGV4dFV1aWQnO1xuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250ZXh0VXVpZEhlYWRlck5hbWU6IHN0cmluZyA9ICd2aWV3Q29udGV4dFV1aWQnO1xuICBwcml2YXRlIHJlYWRvbmx5IHBhZ2VOYW1lUHJlZml4OiBzdHJpbmcgPSAncGFnZS4nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbXBvbmVudE5hbWVQcmVmaXg6IHN0cmluZyA9ICdjb21wb25lbnQuJztcbiAgcHVibGljIG1lc3NhZ2VEaWFsb2duYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgdXJsPzogc3RyaW5nO1xuICBwcml2YXRlIHZpZXdDb250ZXh0PzogVmlld0NvbnRleHREYXRhO1xuICBwcml2YXRlIHZpZXdIYW5kbGVyczogQXJyYXk8U21hcnRWaWV3SGFuZGxlck1vZGVsPiA9IG5ldyBBcnJheSgpO1xuICBwcml2YXRlIGRlZmF1bHRDb21wb25lbnRzOiBNYXA8c3RyaW5nLCBDb21wb25lbnRUeXBlPGFueT4+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIG9wZW5lZFZpZXdVdWlkczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheSgpO1xuICBwcml2YXRlIG9wZW5lZFZpZXdEYXRhOiBBcnJheTxWaWV3RGF0YT4gPSBuZXcgQXJyYXkoKTtcbiAgLy8gTW9ub3RvbmljIGNvdW50ZXIgYnVtcGVkIG9uIGV2ZXJ5IHN1Y2Nlc3NmdWwgc3RhcnRWaWV3Q29udGV4dCgpLiBDYWxsZXJzXG4gIC8vIHRoYXQgaG9sZCBhIHJlZmVyZW5jZSB0byBhIHZpZXctdXVpZCBmcm9tIGEgcHJldmlvdXMgdmlld2NvbnRleHQgY2FuXG4gIC8vIGRldGVjdCBhIHJlYnVpbGQgYnkgY29tcGFyaW5nIHNuYXBzaG90cyBvZiB0aGlzIHZhbHVlLlxuICBwcml2YXRlIGdlbmVyYXRpb246IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBfZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuICBwdWJsaWMgdXVpZE9mUGFnZUhhc0JlZW5DaGFuZ2VkOiBTdWJqZWN0PHN0cmluZz4gPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcbiAgcHVibGljIHZpZXdDb250ZXh0SGFzQmVlblN5bmNlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xuICBwcml2YXRlIGluaXRpYWxpemVSdW5uaW5nOiBTdWJqZWN0PFZpZXdDb250ZXh0RGF0YT4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgaW5pdGlOZXdDb250ZXh0UnVubmluZzogU3ViamVjdDx2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycz86IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnM7XG5cbiAgcHVibGljIG9wZW5TbWFydExpbms6IFN1YmplY3Q8c3RyaW5nPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xuICBwdWJsaWMgaXNPcGVuaW5nU21hcnRMaW5rOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkaWFsb2dSZWZzOiBTbWFydFZpZXdEaWFsb2dSZWZbXSA9IFtdO1xuXG4gIHByaXZhdGUgZW1iZWRkZWRDb250YWluZXJzOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBWaWV3Q29udGFpbmVyUmVmPj4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgZW1iZWRkZWRWaWV3UmVmczogU21hcnRFbWJlZGRlZFZpZXdSZWZbXSA9IFtdO1xuICBwcml2YXRlIHBlbmRpbmdFbWJlZGRlZFZpZXdzOiBWaWV3RGF0YVtdID0gW107XG5cbiAgcHJpdmF0ZSBhY3Rpb25EZXNjcmlwdG9ycz86IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj47XG5cbiAgcHJpdmF0ZSBtb2R1bGVVcmxzQnlNb2R1bGU/OiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIHB1YmxpYyBjb21tb25GZWVkYmFja1RleHQ/OiBzdHJpbmc7XG5cbiAgcHVibGljIHNtYXJ0QXBpQ2xpZW50czogTWFwPHN0cmluZywgU21hcnRTdWJqZWN0PGFueT4+ID0gbmV3IE1hcCgpO1xuXG4gIHB1YmxpYyBzZXQgdHJhbnNsYXRlU2VydmljZSh0cmFuc2xhdGVTZXJ2aWNlOiBTbWFydFRyYW5zbGF0ZVNlcnZpY2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlID0gdHJhbnNsYXRlU2VydmljZTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VDaGFuZ2VkLm5leHQoKTtcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2VDaGFuZ2VkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHRyYW5zbGF0ZVNlcnZpY2UoKTogU21hcnRUcmFuc2xhdGVTZXJ2aWNlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5fdHJhbnNsYXRlU2VydmljZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2U7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlPzogU21hcnRUcmFuc2xhdGVTZXJ2aWNlO1xuICBwdWJsaWMgdHJhbnNsYXRlU2VydmljZUNoYW5nZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcblxuICBwdWJsaWMgY29tcG9uZW50TGlicmFyeTogQ29tcG9uZW50TGlicmFyeSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHZpZXc6IFZpZXdTZXJ2aWNlLFxuICAgIHByaXZhdGUgc2Vzc2lvbjogU21hcnRTZXNzaW9uU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogU21hcnRWaWV3Q29udGV4dERpYWxvZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcGlRdWV1ZVNlcnZpY2U6IEFwaVF1ZXVlU2VydmljZSxcbiAgICBwcml2YXRlIGluamVjdDogSW5qZWN0b3IsXG4gICAgQEluamVjdChDT01QT05FTlRfTElCUkFSWSkgQE9wdGlvbmFsKCkgY29tcExpYj86IENvbXBvbmVudExpYnJhcnksXG4gICAgQEluamVjdChTTUFSVF9ERUZBVUxUX1ZJRVdfQ09NUE9ORU5UUylcbiAgICBAT3B0aW9uYWwoKVxuICAgIGRlZmF1bHRWaWV3Q29tcG9uZW50cz86IERlZmF1bHRWaWV3Q29tcG9uZW50RW50cnlbXVxuICApIHtcbiAgICB0aGlzLmNvbXBvbmVudExpYnJhcnkgPSBjb21wTGliO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgZGVmYXVsdFZpZXdDb21wb25lbnRzID8/IFtdKSB7XG4gICAgICB0aGlzLmRlZmF1bHRDb21wb25lbnRzLnNldChlbnRyeS5jb21wb25lbnROYW1lLCBlbnRyeS5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGZvbGxvdyh1dWlkOiBzdHJpbmcsIGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLnNtYXJ0QXBpQ2xpZW50cy5zZXQodXVpZCwgZGV0ZWN0Q2hhbmdlKTtcbiAgfVxuICBwdWJsaWMgdW5mb2xsb3codXVpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zbWFydEFwaUNsaWVudHMuZGVsZXRlKHV1aWQpO1xuICB9XG5cbiAgcmVnaXN0ZXJFbWJlZGRlZFNsb3QoY29udGFpbmVyVXVpZDogc3RyaW5nLCBjb250YWluZXJJZDogc3RyaW5nLCB2Y1JlZjogVmlld0NvbnRhaW5lclJlZik6IHZvaWQge1xuICAgIGxldCBpbm5lck1hcCA9IHRoaXMuZW1iZWRkZWRDb250YWluZXJzLmdldChjb250YWluZXJVdWlkKTtcbiAgICBpZiAoIWlubmVyTWFwKSB7XG4gICAgICBpbm5lck1hcCA9IG5ldyBNYXAoKTtcbiAgICAgIHRoaXMuZW1iZWRkZWRDb250YWluZXJzLnNldChjb250YWluZXJVdWlkLCBpbm5lck1hcCk7XG4gICAgfVxuICAgIGlubmVyTWFwLnNldChjb250YWluZXJJZCwgdmNSZWYpO1xuXG4gICAgLy8gUmVhdHRhY2ggZW1iZWRkZWQgdmlld3MgdGhhdCB3ZXJlIGRldGFjaGVkIGJlZm9yZSBsYXlvdXQgcmUtcmVuZGVyXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKFxuICAgICAgKHJlZikgPT4gcmVmLmNvbnRhaW5lclV1aWQgPT09IGNvbnRhaW5lclV1aWQgJiYgcmVmLmNvbnRhaW5lcklkID09PSBjb250YWluZXJJZFxuICAgICk7XG4gICAgZm9yIChjb25zdCByZWYgb2YgZXhpc3RpbmcpIHtcbiAgICAgIGlmICghcmVmLmNvbXBvbmVudFJlZi5ob3N0Vmlldy5kZXN0cm95ZWQpIHtcbiAgICAgICAgdmNSZWYuaW5zZXJ0KHJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERyYWluIHBlbmRpbmcgcXVldWUgKG1hdGNoIG9uIHRoZSByZXNvbHZlZCBzbG90LCBzbyByb3V0ZXItc2xvdCBOT1JNQUwgdmlld3MgbWF0Y2ggdG9vKVxuICAgIGNvbnN0IG1hdGNoZXMgPSAodjogVmlld0RhdGEpID0+IHtcbiAgICAgIGNvbnN0IHMgPSByZXNvbHZlU2xvdCh2KTtcbiAgICAgIHJldHVybiBzLmNvbnRhaW5lclV1aWQgPT09IGNvbnRhaW5lclV1aWQgJiYgcy5jb250YWluZXJJZCA9PT0gY29udGFpbmVySWQ7XG4gICAgfTtcbiAgICBjb25zdCBtYXRjaGluZyA9IHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MuZmlsdGVyKG1hdGNoZXMpO1xuICAgIHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MgPSB0aGlzLnBlbmRpbmdFbWJlZGRlZFZpZXdzLmZpbHRlcigodikgPT4gIW1hdGNoZXModikpO1xuXG4gICAgaWYgKG1hdGNoaW5nLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHVwZGF0ZXM6IChWaWV3U3RhdGVVcGRhdGUgfCB1bmRlZmluZWQpW10gPSBtYXRjaGluZy5tYXAoKHYpID0+IHRoaXMub3BlblZpZXcodikpO1xuICAgICAgdGhpcy5zZW5kVmlld0NvbnRleHRVcGRhdGVzKHVwZGF0ZXMpO1xuICAgIH1cbiAgfVxuXG4gIGRldGFjaEFsbEVtYmVkZGVkVmlld3MoY29udGFpbmVyVXVpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKChyZWYpID0+IHJlZi5jb250YWluZXJVdWlkID09PSBjb250YWluZXJVdWlkKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBpZiAoY2hpbGQuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZjUmVmID0gdGhpcy5nZXRFbWJlZGRlZFNsb3QoY29udGFpbmVyVXVpZCwgY2hpbGQuY29udGFpbmVySWQpO1xuICAgICAgaWYgKHZjUmVmKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHZjUmVmLmluZGV4T2YoY2hpbGQuY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcbiAgICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgICAgdmNSZWYuZGV0YWNoKGlkeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbGVhbnVwT3JwaGFuZWRFbWJlZGRlZFZpZXdzKGNvbnRhaW5lclV1aWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG9ycGhhbmVkID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbHRlcigocmVmKSA9PiB7XG4gICAgICBpZiAocmVmLmNvbnRhaW5lclV1aWQgIT09IGNvbnRhaW5lclV1aWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcuZGVzdHJveWVkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmNSZWYgPSB0aGlzLmdldEVtYmVkZGVkU2xvdChjb250YWluZXJVdWlkLCByZWYuY29udGFpbmVySWQpO1xuICAgICAgcmV0dXJuICF2Y1JlZiB8fCB2Y1JlZi5pbmRleE9mKHJlZi5jb21wb25lbnRSZWYuaG9zdFZpZXcpIDwgMDtcbiAgICB9KTtcbiAgICBmb3IgKGNvbnN0IHJlZiBvZiBvcnBoYW5lZCkge1xuICAgICAgaWYgKCFyZWYuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xuICAgICAgICByZWYuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGlkeCA9IHRoaXMub3BlbmVkVmlld1V1aWRzLmluZGV4T2YocmVmLnV1aWQpO1xuICAgICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICAgIHRoaXMub3BlbmVkVmlld1V1aWRzLnNwbGljZShpZHgsIDEpO1xuICAgICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnNwbGljZShpZHgsIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVtYmVkZGVkVmlld1JlZnMgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKChyZWYpID0+ICFvcnBoYW5lZC5pbmNsdWRlcyhyZWYpKTtcbiAgfVxuXG4gIGdldENvbXBvc2l0ZU1vZGVsKGNvbnRhaW5lclV1aWQ6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbHRlcigocmVmKSA9PiByZWYuY29udGFpbmVyVXVpZCA9PT0gY29udGFpbmVyVXVpZCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgcmVzdWx0W2NoaWxkLnV1aWRdID0gY2hpbGQuY29tcG9uZW50UmVmLmluc3RhbmNlLmdldE1vZGVsKCk7XG4gICAgICBPYmplY3QuYXNzaWduKHJlc3VsdCwgdGhpcy5nZXRDb21wb3NpdGVNb2RlbChjaGlsZC51dWlkKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdWJtaXRFbWJlZGRlZEZvcm1zKGNvbnRhaW5lclV1aWQ6IHN0cmluZywgdmFsaWRhdGU6IGJvb2xlYW4pOiBTbWFydEZvcm1JbnZhbGlkRmllbGRzIHtcbiAgICBjb25zdCBhbGxJbnZhbGlkS2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBhbGxJbnZhbGlkTmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKChyZWYpID0+IHJlZi5jb250YWluZXJVdWlkID09PSBjb250YWluZXJVdWlkKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZSA9IGNoaWxkLmNvbXBvbmVudFJlZi5pbnN0YW5jZTtcbiAgICAgIGluc3RhbmNlLnN1Ym1pdEZvcm0odmFsaWRhdGUpO1xuICAgICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIGNvbnN0IGludmFsaWQ6IFNtYXJ0Rm9ybUludmFsaWRGaWVsZHMgPSBpbnN0YW5jZS5nZXRJbnZhbGlkRmllbGRzKCk7XG4gICAgICAgIGFsbEludmFsaWRLZXlzLnB1c2goLi4uaW52YWxpZC5pbnZhbGlkRmllbGRLZXlzKTtcbiAgICAgICAgYWxsSW52YWxpZE5hbWVzLnB1c2goLi4uaW52YWxpZC5pbnZhbGlkRmllbGROYW1lcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXN0ZWQgPSB0aGlzLnN1Ym1pdEVtYmVkZGVkRm9ybXMoY2hpbGQudXVpZCwgdmFsaWRhdGUpO1xuICAgICAgYWxsSW52YWxpZEtleXMucHVzaCguLi5uZXN0ZWQuaW52YWxpZEZpZWxkS2V5cyk7XG4gICAgICBhbGxJbnZhbGlkTmFtZXMucHVzaCguLi5uZXN0ZWQuaW52YWxpZEZpZWxkTmFtZXMpO1xuICAgIH1cbiAgICByZXR1cm4geyBpbnZhbGlkRmllbGRLZXlzOiBhbGxJbnZhbGlkS2V5cywgaW52YWxpZEZpZWxkTmFtZXM6IGFsbEludmFsaWROYW1lcyB9O1xuICB9XG5cbiAgdW5yZWdpc3RlckVtYmVkZGVkU2xvdChjb250YWluZXJVdWlkOiBzdHJpbmcsIGNvbnRhaW5lcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBpbm5lck1hcCA9IHRoaXMuZW1iZWRkZWRDb250YWluZXJzLmdldChjb250YWluZXJVdWlkKTtcbiAgICBpZiAoaW5uZXJNYXApIHtcbiAgICAgIGlubmVyTWFwLmRlbGV0ZShjb250YWluZXJJZCk7XG4gICAgICBpZiAoaW5uZXJNYXAuc2l6ZSA9PT0gMCkge1xuICAgICAgICB0aGlzLmVtYmVkZGVkQ29udGFpbmVycy5kZWxldGUoY29udGFpbmVyVXVpZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbWJlZGRlZFNsb3QoXG4gICAgY29udGFpbmVyVXVpZDogc3RyaW5nLFxuICAgIGNvbnRhaW5lcklkOiBzdHJpbmdcbiAgKTogVmlld0NvbnRhaW5lclJlZiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZW1iZWRkZWRDb250YWluZXJzLmdldChjb250YWluZXJVdWlkKT8uZ2V0KGNvbnRhaW5lcklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIHZpZXcncyBjb21wb25lbnQgaW50byBpdHMgcmVzb2x2ZWQgc2xvdC4gUmV0dXJucyBmYWxzZSBhbmQgcXVldWVzXG4gICAqIHRoZSB2aWV3IGlmIHRoZSBzbG90IGlzIG5vdCByZWdpc3RlcmVkIHlldCAoZHJhaW5lZCBvbiByZWdpc3RyYXRpb24pLlxuICAgKi9cbiAgcHJpdmF0ZSBpbnNlcnRWaWV3SW50b1Nsb3QodmlldzogVmlld0RhdGEsIGNvbXBvbmVudDogQ29tcG9uZW50VHlwZTxhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBjb250YWluZXJVdWlkLCBjb250YWluZXJJZCB9ID0gcmVzb2x2ZVNsb3Qodmlldyk7XG4gICAgY29uc3QgdmNSZWYgPSB0aGlzLmdldEVtYmVkZGVkU2xvdChjb250YWluZXJVdWlkLCBjb250YWluZXJJZCk7XG4gICAgaWYgKCF2Y1JlZikge1xuICAgICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cy5wdXNoKHZpZXcpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB2Y1JlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UudXVpZCA9IHZpZXcudXVpZDtcbiAgICBjb21wb25lbnRSZWYuaW5zdGFuY2UucnVuKCk7XG4gICAgdGhpcy5lbWJlZGRlZFZpZXdSZWZzLnB1c2goeyB1dWlkOiB2aWV3LnV1aWQsIGNvbnRhaW5lclV1aWQsIGNvbnRhaW5lcklkLCBjb21wb25lbnRSZWYgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aW9uRGVzY3JpcHRvcnMoYWN0aW9uRGVzY3JpcHRvcnM6IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj4pOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkRlc2NyaXB0b3JzID0gYWN0aW9uRGVzY3JpcHRvcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWN0aW9uRGVzY3JpcHRvcnMoKTogTWFwPHN0cmluZywgVWlBY3Rpb25EZXNjcmlwdG9yPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLmFjdGlvbkRlc2NyaXB0b3JzKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBhY3Rpb24gZGVzY3JpcHRvcnMgaGFzIGJlZW4gc2V0IHRvIFZpZXdDb250ZXh0LicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hY3Rpb25EZXNjcmlwdG9ycztcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaWV3SGFuZGxlcnModmlld0hhbmRsZXJzOiBBcnJheTxTbWFydFZpZXdIYW5kbGVyTW9kZWw+KTogdm9pZCB7XG4gICAgdGhpcy52aWV3SGFuZGxlcnMgPSB2aWV3SGFuZGxlcnM7XG4gIH1cblxuICBwdWJsaWMgc2V0Vmlld0FwaUVycm9ycyh2aWV3QXBpRXJyb3JzOiBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzKTogdm9pZCB7XG4gICAgdGhpcy5zbWFydFZpZXdDb250ZXh0QXBpRXJyb3JzID0gdmlld0FwaUVycm9ycztcbiAgfVxuXG4gIHB1YmxpYyBzZXRNZXNzYWdlRGlhbG9nTmFtZShtZXNzYWdlRGlhbG9nTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSA9IG1lc3NhZ2VEaWFsb2dOYW1lO1xuICAgIHRoaXMudmlld0hhbmRsZXJzLnB1c2goe1xuICAgICAgbmFtZTogbWVzc2FnZURpYWxvZ05hbWUsXG4gICAgICBjb21wb25lbnQ6IE1lc3NhZ2VEaWFsb2dDb21wb25lbnQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldFVwVXJsRm9yVmlld1NlcnZpY2UoKTogdm9pZCB7XG4gICAgdGhpcy52aWV3LmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSB0aGlzLnVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNb2R1bGVVUkwobW9kdWxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5tb2R1bGVVcmxzQnlNb2R1bGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kdWxlc01hcCBkb2VzIG5vdCBleGlzdC4nKTtcbiAgICB9XG4gICAgbGV0IG1vZHVsZVVybCA9IHRoaXMubW9kdWxlVXJsc0J5TW9kdWxlPy5nZXQobW9kdWxlKTtcblxuICAgIGlmICghbW9kdWxlVXJsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vZHVsZVVybCBkb2VzIG5vdCBleGlzdCB3aXRoIHRoZSBnaXZlbiBtb2R1bGUuJyk7XG4gICAgfVxuICAgIHJldHVybiBtb2R1bGVVcmw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kdWxlVVJMKG1vZHVsZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm1vZHVsZVVybHNCeU1vZHVsZSA9IG1vZHVsZXM7XG4gIH1cblxuICBwdWJsaWMgc2V0VXJsKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy51cmwgPSB1cmwgKyAnL3ZpZXcnO1xuICAgIHRoaXMuc2V0VXBVcmxGb3JWaWV3U2VydmljZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFuZFN5bmNWaWV3Q29udGV4dCh1dWlkPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF1dWlkKSB7XG4gICAgICB1dWlkID0gdGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY1ZpZXcoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRWaWV3Q29udGV4dCh1dWlkOiBzdHJpbmcpOiBQcm9taXNlPFZpZXdDb250ZXh0RGF0YT4ge1xuICAgIHRoaXMudmlld0NvbnRleHQgPSBhd2FpdCB0aGlzLnZpZXcuZ2V0Vmlld0NvbnRleHQodXVpZCkudG9Qcm9taXNlKCk7XG4gICAgaWYgKCF0aGlzLnZpZXdDb250ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZXdDb250ZXh0IGRvZXMgbm90IGV4aXN0IHdpdGggdGhlIGdpdmVuIHV1aWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFZpZXdDb250ZXh0RGF0YUJ5UGFnZU5hbWUocGFnZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Vmlld0RhdGE+IHtcbiAgICBpZiAoIXRoaXMudmlld0NvbnRleHQpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0NvbnRleHQodGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKSk7XG4gICAgfVxuICAgIGxldCBwYWdlVXVpZCA9IHRoaXMuZ2V0VXVpZE9mUGFnZShwYWdlTmFtZSk7XG5cbiAgICBsZXQgdmlld0NvbnRleHRCeVBhZ2VOYW1lID0gdGhpcy52aWV3Q29udGV4dD8udmlld3MuZmluZCgodmlldykgPT4gdmlldy51dWlkID09PSBwYWdlVXVpZCk7XG4gICAgaWYgKCF2aWV3Q29udGV4dEJ5UGFnZU5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFZpZXdEYXRhIG9mICR7cGFnZU5hbWV9IGlzIG5vdCBmb3VuZCFgKTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXdDb250ZXh0QnlQYWdlTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB1cGRhdGVWaWV3Q29udGV4dChcbiAgICB2aWV3Q29udGV4dFVwZGF0ZTogVmlld0NvbnRleHRVcGRhdGVcbiAgKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQ+IHtcbiAgICB2aWV3Q29udGV4dFVwZGF0ZS5kZXZpY2VJbmZvID8/PSB7XG4gICAgICBkZXZpY2VJZDogJ2lkJyxcbiAgICAgIHVzZXJBZ2VudDogbmF2aWdhdG9yLnVzZXJBZ2VudCxcbiAgICAgIHBhcmFtZXRlcnM6IG5ldyBNYXAoKSxcbiAgICB9O1xuICAgIHZpZXdDb250ZXh0VXBkYXRlLmRldmljZUluZm8uY29tcG9uZW50TGlicmFyeSA9IHRoaXMuY29tcG9uZW50TGlicmFyeTtcblxuICAgIHRoaXMudmlld0NvbnRleHQgPSBhd2FpdCB0aGlzLnZpZXcudXBkYXRlVmlld0NvbnRleHQodmlld0NvbnRleHRVcGRhdGUpLnRvUHJvbWlzZSgpO1xuXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyU2Vzc2lvblN0b3JhZ2UoKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2UuY2xlYXIoKTtcbiAgICB0aGlzLmNsZWFyRW1iZWRkZWRWaWV3cygpO1xuICAgIHRoaXMub3BlbmVkVmlld0RhdGEgPSBbXTtcbiAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRlYXIgZG93biBhbGwgc2xvdC1ob3N0ZWQgdmlldyBjb21wb25lbnRzIG9uIGEgdmlld0NvbnRleHQgcmVzZXQgKGUuZy4gbG9nb3V0IC9cbiAgICogdmlld2NvbnRleHQtbG9zdCkuIFdpdGhvdXQgdGhpcyB0aGUgcHJldmlvdXMgdmlldyB0cmVlIHN0YXlzIG1vdW50ZWQgaW4gdGhlIHJvb3RcbiAgICogc2xvdCBhbmQgdGhlIG5ldyB0cmVlIGlzIGFwcGVuZGVkIGFsb25nc2lkZSBpdC4gRGVzdHJveWluZyBhIHBhcmVudCBjYXNjYWRlcyB0b1xuICAgKiBpdHMgbmVzdGVkIHNsb3QgZGlyZWN0aXZlcyAod2hpY2ggdW5yZWdpc3RlciB0aGVpciBjb250YWluZXJzIHZpYSBuZ09uRGVzdHJveSksXG4gICAqIGxlYXZpbmcgb25seSB0aGUgaG9zdC1vd25lZCByb290IHNsb3QgcmVnaXN0ZXJlZC5cbiAgICovXG4gIHByaXZhdGUgY2xlYXJFbWJlZGRlZFZpZXdzKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgcmVmIG9mIHRoaXMuZW1iZWRkZWRWaWV3UmVmcykge1xuICAgICAgaWYgKCFyZWYuY29tcG9uZW50UmVmLmhvc3RWaWV3LmRlc3Ryb3llZCkge1xuICAgICAgICByZWYuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lbWJlZGRlZFZpZXdSZWZzID0gW107XG4gICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0Vmlld0NvbnRleHQoKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGE+IHtcbiAgICB0aGlzLmNsZWFyU2Vzc2lvblN0b3JhZ2UoKTtcbiAgICB0aGlzLnNlc3Npb24uYWRkSGVhZGVyUGFyYW0oe1xuICAgICAgaGVhZGVyTmFtZTogdGhpcy52aWV3Q29udGV4dFV1aWRIZWFkZXJOYW1lLFxuICAgICAgdmFsdWU6ICcnLFxuICAgIH0pO1xuXG4gICAgbGV0IG5ld1ZpZXdDb250ZXh0OiBWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQgPSBhd2FpdCB0aGlzLnZpZXdcbiAgICAgIC5jcmVhdGVWaWV3Q29udGV4dCgpXG4gICAgICAudG9Qcm9taXNlKCk7XG4gICAgaWYgKCFuZXdWaWV3Q29udGV4dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBWaWV3Q29udGV4dCB3YXMgY3JlYXRlZCcpO1xuICAgIH1cbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gbmV3Vmlld0NvbnRleHQ7XG4gICAgdGhpcy5zZXRWaWV3Q29udGV4dFV1aWQobmV3Vmlld0NvbnRleHQudXVpZCEpO1xuICAgIHRoaXMuZ2VuZXJhdGlvbisrO1xuXG4gICAgcmV0dXJuIHRoaXMudmlld0NvbnRleHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0R2VuZXJhdGlvbigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRpb247XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSh1dWlkPzogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplUnVubmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcudG9Qcm9taXNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcgPSBuZXcgU21hcnRTdWJqZWN0KHRoaXMuX2Rlc3Ryb3kkKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdIYW5kbGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBcIlRoZXJlIGFyZW4ndCBhbnkgdmlld0hhbmRsZXJzIGluIFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlISBQcm92aWRlIHNvbWUgdG8gdXNlIGl0cyBmdW5jdGlvbnMuXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlRGlhbG9nbmFtZSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG1lc3NhZ2VEaWFsb2dOYW1lIHByb3ZpZGVkIGJ5IHRoZSBiYWNrZW5kIGhhcyBub3QgYmVlbiBzZXQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHV1aWQpIHtcbiAgICAgICAgICB0aGlzLnNldFZpZXdDb250ZXh0VXVpZCh1dWlkKTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RhcnRWaWV3Q29udGV4dCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0Vmlld0NvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0ITtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcubmV4dCh0aGlzLnZpZXdDb250ZXh0ISk7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZVJ1bm5pbmcuY29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplUnVubmluZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgaW5pdFZpZXdDb250ZXh0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB1dWlkO1xuICAgIHRyeSB7XG4gICAgICB1dWlkID0gdGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKCk7XG4gICAgICB1dWlkID0gdGhpcy5nZXRWaWV3Q29udGV4dFV1aWQoKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKHV1aWQpO1xuICAgIGF3YWl0IHRoaXMucmVzdG9yZVZpZXdzKHV1aWQpO1xuICAgIGF3YWl0IHRoaXMuZ2V0QW5kU3luY1ZpZXdDb250ZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogSHlkcmF0ZXMgdGhlIHZpZXctY29udGV4dCBzdGF0ZSBmcm9tIGFuIGFscmVhZHktZXhpc3RpbmcgVVVJRCBwcm92aWRlZFxuICAgKiBleHRlcm5hbGx5IChlLmcuIGJ5IGEgbmF0aXZlIG1vYmlsZSBzaGVsbCB2aWEgVVJMIGZyYWdtZW50KS4gVW5saWtlXG4gICAqIGBpbml0aWFsaXplKHV1aWQpYCwgdGhpcyBtZXRob2QgZG9lcyBOT1QgZmFsbCBiYWNrIHRvIGNyZWF0aW5nIGEgZnJlc2hcbiAgICogdmlld0NvbnRleHQgaWYgdGhlIGJhY2tlbmQgcmVqZWN0cyB0aGUgVVVJRCDigJQgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0b1xuICAgKiBzdXJmYWNlIHRoZSBmYWlsdXJlICh0eXBpY2FsbHkgdmlhIHRoZSBib290c3RyYXAncyBgb25TdGFydEVycm9yYCBob29rKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0RnJvbUV4aXN0aW5nVmlld0NvbnRleHQodXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZXRWaWV3Q29udGV4dFV1aWQodXVpZCk7XG4gICAgYXdhaXQgdGhpcy5nZXRWaWV3Q29udGV4dCh1dWlkKTtcbiAgICBhd2FpdCB0aGlzLnJlc3RvcmVWaWV3cyh1dWlkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbml0TmV3Vmlld0NvbnRleHQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZykge1xuICAgICAgcmV0dXJuIHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZy50b1Byb21pc2UoKTtcbiAgICB9XG4gICAgdGhpcy5pbml0aU5ld0NvbnRleHRSdW5uaW5nID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRWaWV3Q29udGV4dCgpO1xuICAgICAgbGV0IHV1aWQgPSB0aGlzLmdldFZpZXdDb250ZXh0VXVpZCgpO1xuICAgICAgYXdhaXQgdGhpcy5pbml0aWFsaXplKHV1aWQpO1xuICAgICAgYXdhaXQgdGhpcy5yZXN0b3JlVmlld3ModXVpZCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZy5uZXh0KCk7XG4gICAgICB0aGlzLmluaXRpTmV3Q29udGV4dFJ1bm5pbmcuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuaW5pdGlOZXdDb250ZXh0UnVubmluZyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3BlblZpZXcodmlldzogVmlld0RhdGEpOiBWaWV3U3RhdGVVcGRhdGUgfCB1bmRlZmluZWQge1xuICAgIGxldCBhbHJlYWR5T3BlbmVkID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuc29tZSgodXVpZCkgPT4gdXVpZCA9PT0gdmlldy51dWlkKTtcbiAgICBpZiAoYWxyZWFkeU9wZW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHZpZXdIYW5kbGVyID0gcmVzb2x2ZVZpZXdIYW5kbGVyKHRoaXMudmlld0hhbmRsZXJzLCB0aGlzLmRlZmF1bHRDb21wb25lbnRzLCB2aWV3KTtcblxuICAgIGlmICghdmlld0hhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3YXMgbm90IGZvdW5kIGJ5IHZpZXcgbmFtZTogJHt2aWV3LnZpZXdOYW1lfSAoY29tcG9uZW50TmFtZTogJHt2aWV3LmNvbXBvbmVudE5hbWV9KWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLkRJQUxPRykge1xuICAgICAgaWYgKCF2aWV3SGFuZGxlci5jb21wb25lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb21wb25lbnQgaXMgdW5kZWZpbmVkIGluIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3aXRoIG5hbWU6ICR7dmlldy52aWV3TmFtZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgcmVmSXNBbHJhZHlBZGRlZCA9IHRoaXMuZGlhbG9nUmVmcy5zb21lKFxuICAgICAgICAocmVmOiBTbWFydFZpZXdEaWFsb2dSZWYpID0+IHJlZi51dWlkID09PSB2aWV3LnV1aWRcbiAgICAgICk7XG4gICAgICBpZiAoIXJlZklzQWxyYWR5QWRkZWQpIHtcbiAgICAgICAgbGV0IGRpYWxvZ1JlZjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5wdXNoKHZpZXcudXVpZCk7XG4gICAgICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5wdXNoKHZpZXcpO1xuICAgICAgICAgIHRoaXMuc2V0VXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3LnV1aWQsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xuICAgICAgICAgIGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW5Db21wb25lbnRBc0RpYWxvZyhcbiAgICAgICAgICAgIHZpZXdIYW5kbGVyLmNvbXBvbmVudCxcbiAgICAgICAgICAgIHZpZXdIYW5kbGVyLm5hbWUsXG4gICAgICAgICAgICB2aWV3LnV1aWRcbiAgICAgICAgICApO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZih2aWV3LnV1aWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgdGhpcy5jbGVhclV1aWRPZlBhZ2Uodmlldy52aWV3TmFtZSwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRpYWxvZ0Rpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgICAgIGxldCBpc01lc3NhZ2VEaWFsb2cgPSB2aWV3LnZpZXdOYW1lID09PSB0aGlzLm1lc3NhZ2VEaWFsb2duYW1lO1xuICAgICAgICBpZiAoIWlzTWVzc2FnZURpYWxvZykge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkaWFsb2dEaXNhYmxlQ2xvc2UgPSB0aGlzLmluamVjdC5nZXQoRElBTE9HX0RJU0FCTEVfQ0xPU0UpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIHJlYWRpbmcgRElBTE9HX0RJU0FCTEVfQ0xPU0UnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRpYWxvZ1JlZiBpbnN0YW5jZW9mIE1hdERpYWxvZ1JlZikge1xuICAgICAgICAgIGRpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSBkaWFsb2dEaXNhYmxlQ2xvc2U7XG4gICAgICAgICAgLy8gaWYgKGlzTWVzc2FnZURpYWxvZykge1xuICAgICAgICAgIC8vICAgaWYgKHZpZXcubWVzc2FnZT8ub3B0aW9ucyAmJiB2aWV3Lm1lc3NhZ2Uub3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyAgIH1cbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgaWYgKCFkaWFsb2dEaXNhYmxlQ2xvc2UpIHtcbiAgICAgICAgICAgIGRpYWxvZ1JlZlxuICAgICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb24odmlldy51dWlkLCB7IGNvZGU6IERlZmF1bHRVaUFjdGlvbkNvZGVfQ0xPU0UsIHBhcmFtczoge30gfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkaWFsb2dSZWYgaW5zdGFuY2VvZiBEeW5hbWljRGlhbG9nUmVmKSB7XG4gICAgICAgICAgaWYgKCFkaWFsb2dEaXNhYmxlQ2xvc2UpIHtcbiAgICAgICAgICAgIGRpYWxvZ1JlZi5vbkRlc3Ryb3kucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb24odmlldy51dWlkLCB7IGNvZGU6IERlZmF1bHRVaUFjdGlvbkNvZGVfQ0xPU0UsIHBhcmFtczoge30gfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpYWxvZ1JlZnMucHVzaCh7XG4gICAgICAgICAgdXVpZDogdmlldy51dWlkLFxuICAgICAgICAgIGRpYWxvZ1JlZixcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2aWV3LnR5cGUgPT09IFZpZXdUeXBlLk5PUk1BTCkge1xuICAgICAgaWYgKCF2aWV3SGFuZGxlci5jb21wb25lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgaXMgdW5kZWZpbmVkIGluIFNtYXJ0Vmlld0hhbmRsZXJNb2RlbCB3aXRoIG5hbWU6ICR7dmlldy52aWV3TmFtZX1gKTtcbiAgICAgIH1cbiAgICAgIC8vIENPTVBBVElCSUxJVFkgU0hJTSAoIzI4ODcwLCBpbnRlbnRpb25hbCk6IHNvbWUgY2hpbGQgc2VydmljZXMgKFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlLFxuICAgICAgLy8gU21hcnRGaWx0ZXJFZGl0b3JTZXJ2aWNlKSBhbmQgZ2VuZXJpYyBjb21wb25lbnRzIChTZWFyY2hQYWdlQ29tcG9uZW50LCBHZW5lcmljUGFnZUNvbXBvbmVudClcbiAgICAgIC8vIHN0aWxsIHJlc29sdmUgdGhlaXIgdmlldyB1dWlkIHZpYSB0aGUgcGFnZU5hbWUgLT4gZ2V0VXVpZE9mUGFnZShzZXNzaW9uU3RvcmFnZSkgaW5kaXJlY3Rpb25cbiAgICAgIC8vIGluIHRoZWlyIENPTlNUUlVDVE9SLCB3aGljaCBydW5zIGluc2lkZSBjcmVhdGVDb21wb25lbnQoKSBiZWxvdyDigJQgYmVmb3JlIG9wZW5WaWV3J3Mgbm9ybWFsXG4gICAgICAvLyBib29ra2VlcGluZy4gU28gdGhlIG1hcHBpbmcgbXVzdCBiZSB3cml0dGVuIGhlcmUsIGFoZWFkIG9mIGNvbXBvbmVudCBjcmVhdGlvbi4gVGhlIHByb3BlclxuICAgICAgLy8gZml4IChmZWVkIHRob3NlIGNvbnN1bWVycyB0aGUgaW5qZWN0ZWQgdXVpZCArIGRlZmVyIHRoZWlyIGluaXQpIGlzIGRlZmVycmVkIGNvbnN1bWVyIHBsdW1iaW5nO1xuICAgICAgLy8gdW50aWwgdGhlbiB0aGlzIHdyaXRlIGtlZXBzIHRoZSBpbmRpcmVjdGlvbiBjb3JyZWN0IGluIHRoZSBzbG90IHdvcmxkLlxuICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XG4gICAgICAvLyBBIE5PUk1BTCB2aWV3IHdpdGggbm8gY29udGFpbmVyVXVpZCBsYW5kcyBpbiB0aGUgaG9zdCByb290IHNsb3QgKHJlc29sdmVTbG90IG1hcHNcbiAgICAgIC8vIGl0IHRvIFJPT1RfQ09OVEFJTkVSX1VVSUQpOyBpZiBubyBzbG90IGlzIHJlZ2lzdGVyZWQgeWV0IGl0IHF1ZXVlcyBhbmQgZHJhaW5zIGxhdGVyLlxuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLmluc2VydFZpZXdJbnRvU2xvdCh2aWV3LCB2aWV3SGFuZGxlci5jb21wb25lbnQpO1xuICAgICAgaWYgKCFpbnNlcnRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2UgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgIGlmICghdmlld0hhbmRsZXIuY29tcG9uZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ29tcG9uZW50IGlzIHVuZGVmaW5lZCBpbiBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2l0aCBuYW1lOiAke3ZpZXcudmlld05hbWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gV3JpdGUgdGhlIHBhZ2UtdXVpZCBtYXBwaW5nIGFoZWFkIG9mIGNvbXBvbmVudCBjcmVhdGlvbiBzbyBjb25zdHJ1Y3Rvci10aW1lXG4gICAgICAvLyBhbmQgbmVzdGVkIGdldFV1aWRPZlBhZ2Uodmlld05hbWUpIGNvbnN1bWVycyAoZmlsdGVyLCB0cmVlKSByZXNvbHZlLiBUaGVcbiAgICAgIC8vIHBhZ2UuPHZpZXdOYW1lPiBrZXkgaXMgZGlzdGluY3QgcGVyIHZpZXcsIHNvIGl0IG5ldmVyIGNvbGxpZGVzLiBUaGVcbiAgICAgIC8vIGNvbXBvbmVudC48Y29tcG9uZW50TmFtZT4gcmV2ZXJzZSBrZXkgQ0FOIGJlIG92ZXJ3cml0dGVuIGJ5IGFub3RoZXJcbiAgICAgIC8vIGNvbmN1cnJlbnQgZHluYW1pYyB2aWV3IG9mIHRoZSBzYW1lIGRlZmF1bHQgY29tcG9uZW50LCBidXQgaXQgaXMgcmVhZCBvbmx5XG4gICAgICAvLyBzeW5jaHJvbm91c2x5IGluIHRoZSBjb25zdHJ1Y3RvciAocmlnaHQgYWZ0ZXIgdGhpcyB3cml0ZSkgYW5kIHNsb3Qgdmlld3NcbiAgICAgIC8vIGxvYWQgdmlhIHRoZSBpbmplY3RlZCBfdXVpZCBhZnRlcndhcmRzLCBzbyB0aGUgb3ZlcndyaXRlIG5ldmVyIG1pcy1yZXNvbHZlc1xuICAgICAgLy8gYXQgcnVudGltZS4gKCMyODg3MClcbiAgICAgIHRoaXMuc2V0VXVpZE9mUGFnZSh2aWV3LnZpZXdOYW1lLCB2aWV3LnV1aWQsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xuICAgICAgY29uc3QgaW5zZXJ0ZWQgPSB0aGlzLmluc2VydFZpZXdJbnRvU2xvdCh2aWV3LCB2aWV3SGFuZGxlci5jb21wb25lbnQpO1xuICAgICAgaWYgKCFpbnNlcnRlZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdHlwZSBvZiB0aGUgdmlldyBhbmQgaXRzIHZpZXdIYW5kbGVyIGlzIG5vdCB0aGUgc2FtZSEnKTtcbiAgICB9XG5cbiAgICB2aWV3LnN0YXRlID0gVmlld1N0YXRlLk9QRU5FRDtcblxuICAgIHRoaXMub3BlbmVkVmlld1V1aWRzLnB1c2godmlldy51dWlkKTtcbiAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnB1c2godmlldyk7XG5cbiAgICBpZiAodmlldy50eXBlICE9PSBWaWV3VHlwZS5FTUJFRERFRCkge1xuICAgICAgdGhpcy5zZXRVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXcudXVpZCwgdmlld0hhbmRsZXIuY29tcG9uZW50TmFtZSk7XG4gICAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZC5uZXh0KHZpZXcudmlld05hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogVmlld1N0YXRlLk9QRU5FRCxcbiAgICAgIHV1aWQ6IHZpZXcudXVpZCxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGNsb3NlVmlldyh2aWV3OiBWaWV3RGF0YSk6IFZpZXdTdGF0ZVVwZGF0ZVtdIHtcbiAgICBjb25zdCB2aWV3SGFuZGxlciA9IHJlc29sdmVWaWV3SGFuZGxlcih0aGlzLnZpZXdIYW5kbGVycywgdGhpcy5kZWZhdWx0Q29tcG9uZW50cywgdmlldyk7XG5cbiAgICBpZiAoIXZpZXdIYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTbWFydFZpZXdIYW5kbGVyTW9kZWwgd2FzIG5vdCBmb3VuZCBieSB2aWV3IG5hbWU6ICR7dmlldy52aWV3TmFtZX0gKGNvbXBvbmVudE5hbWU6ICR7dmlldy5jb21wb25lbnROYW1lfSlgXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwZGF0ZXM6IFZpZXdTdGF0ZVVwZGF0ZVtdID0gW107XG5cbiAgICBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5ESUFMT0cpIHtcbiAgICAgIGxldCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZ1JlZnMuZmluZChcbiAgICAgICAgKGRpYWxvZ1JlZjogU21hcnRWaWV3RGlhbG9nUmVmKSA9PiBkaWFsb2dSZWYudXVpZCA9PT0gdmlldy51dWlkXG4gICAgICApO1xuICAgICAgaWYgKGRpYWxvZ1JlZikge1xuICAgICAgICBkaWFsb2dSZWYuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGlhbG9nUmVmcy5pbmRleE9mKGRpYWxvZ1JlZik7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ0RpYWxvZ1JlZiBpcyBub3QgZm91bmQgYnkgdXVpZC4nKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZXMucHVzaCguLi50aGlzLmNsZWFudXBFbWJlZGRlZENoaWxkcmVuKHZpZXcudXVpZCkpO1xuICAgIH0gZWxzZSBpZiAodmlldy50eXBlID09PSBWaWV3VHlwZS5OT1JNQUwpIHtcbiAgICAgIC8vIERlc3Ryb3kgbmVzdGVkIGNoaWxkcmVuIGZpcnN0LCB0aGVuIHRoZSB2aWV3J3Mgb3duIHNsb3QgY29tcG9uZW50LlxuICAgICAgLy8gZGVzdHJveVZpZXdSZWYgaXMgYSBuby1vcCBmb3IgdGhlIGxlZ2FjeSByb3V0ZS1yZW5kZXJlZCAocm9vdGxlc3MpIGNhc2UuXG4gICAgICB1cGRhdGVzLnB1c2goLi4udGhpcy5jbGVhbnVwRW1iZWRkZWRDaGlsZHJlbih2aWV3LnV1aWQpKTtcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdSZWYodmlldy51dWlkKTtcbiAgICB9IGVsc2UgaWYgKHZpZXcudHlwZSA9PT0gVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgIHRoaXMuZGVzdHJveVZpZXdSZWYodmlldy51dWlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgdHlwZSBvZiB0aGUgdmlldyBhbmQgaXRzIHZpZXdIYW5kbGVyIGlzIG5vdCB0aGUgc2FtZSEnKTtcbiAgICB9XG5cbiAgICB2aWV3LnN0YXRlID0gVmlld1N0YXRlLkNMT1NFRDtcblxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZih2aWV3LnV1aWQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgLy8gQ2xlYXIgZm9yIGV2ZXJ5IHR5cGU6IG9wZW5WaWV3IG5vdyB3cml0ZXMgdGhlIHBhZ2UtdXVpZCBtYXBwaW5nIGZvclxuICAgICAgLy8gRU1CRURERUQgdmlld3MgdG9vICgjMjg4NzApLCBzbyB0aGUgY2xlYXIgbXVzdCBiZSBzeW1tZXRyaWMgdG8gYXZvaWQgYVxuICAgICAgLy8gc3RhbGUgc2Vzc2lvblN0b3JhZ2UgZW50cnkuIGNsZWFyVXVpZE9mUGFnZSBpcyBhIG5vLW9wIGZvciBrZXlzIG5ldmVyXG4gICAgICAvLyB3cml0dGVuLCBzbyB0aGlzIHN0YXlzIHNhZmUgZm9yIHRoZSBsZWdhY3kgcm9vdGxlc3MgY2FzZS5cbiAgICAgIHRoaXMuY2xlYXJVdWlkT2ZQYWdlKHZpZXcudmlld05hbWUsIHZpZXdIYW5kbGVyLmNvbXBvbmVudE5hbWUpO1xuICAgIH1cblxuICAgIHVwZGF0ZXMucHVzaCh7XG4gICAgICBzdGF0ZTogVmlld1N0YXRlLkNMT1NFRCxcbiAgICAgIHV1aWQ6IHZpZXcudXVpZCxcbiAgICB9KTtcblxuICAgIHJldHVybiB1cGRhdGVzO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbnVwRW1iZWRkZWRDaGlsZHJlbihjb250YWluZXJVdWlkOiBzdHJpbmcpOiBWaWV3U3RhdGVVcGRhdGVbXSB7XG4gICAgY29uc3QgdXBkYXRlczogVmlld1N0YXRlVXBkYXRlW10gPSBbXTtcblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbHRlcigocmVmKSA9PiByZWYuY29udGFpbmVyVXVpZCA9PT0gY29udGFpbmVyVXVpZCk7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgY2hpbGQuY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIHVwZGF0ZXMucHVzaCh7IHN0YXRlOiBWaWV3U3RhdGUuQ0xPU0VELCB1dWlkOiBjaGlsZC51dWlkIH0pO1xuICAgIH1cbiAgICB0aGlzLmVtYmVkZGVkVmlld1JlZnMgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmlsdGVyKFxuICAgICAgKHJlZikgPT4gcmVmLmNvbnRhaW5lclV1aWQgIT09IGNvbnRhaW5lclV1aWRcbiAgICApO1xuXG4gICAgdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cyA9IHRoaXMucGVuZGluZ0VtYmVkZGVkVmlld3MuZmlsdGVyKFxuICAgICAgKHYpID0+IHYuY29udGFpbmVyVXVpZCAhPT0gY29udGFpbmVyVXVpZFxuICAgICk7XG5cbiAgICB0aGlzLmVtYmVkZGVkQ29udGFpbmVycy5kZWxldGUoY29udGFpbmVyVXVpZCk7XG5cbiAgICByZXR1cm4gdXBkYXRlcztcbiAgfVxuXG4gIC8qKiBEZXN0cm95IHRoZSBjb21wb25lbnQgZm9yIGEgdmlldyBsaXZpbmcgaW4gYSBzbG90LCBpZiBwcmVzZW50IChuby1vcCBmb3Igcm91dGUtcmVuZGVyZWQgdmlld3MpLiAqL1xuICBwcml2YXRlIGRlc3Ryb3lWaWV3UmVmKHV1aWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlZkluZGV4ID0gdGhpcy5lbWJlZGRlZFZpZXdSZWZzLmZpbmRJbmRleCgocmVmKSA9PiByZWYudXVpZCA9PT0gdXVpZCk7XG4gICAgaWYgKHJlZkluZGV4ID49IDApIHtcbiAgICAgIHRoaXMuZW1iZWRkZWRWaWV3UmVmc1tyZWZJbmRleF0uY29tcG9uZW50UmVmLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZW1iZWRkZWRWaWV3UmVmcy5zcGxpY2UocmVmSW5kZXgsIDEpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdFbWJlZGRlZFZpZXdzID0gdGhpcy5wZW5kaW5nRW1iZWRkZWRWaWV3cy5maWx0ZXIoKHYpID0+IHYudXVpZCAhPT0gdXVpZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRWaWV3Q29udGV4dFVwZGF0ZXModXBkYXRlc1RvU2VuZDogKFZpZXdTdGF0ZVVwZGF0ZSB8IHVuZGVmaW5lZClbXSkge1xuICAgIGNvbnN0IHVwZGF0ZXM6IFZpZXdTdGF0ZVVwZGF0ZVtdID0gW107XG4gICAgdXBkYXRlc1RvU2VuZC5mb3JFYWNoKCh1cGRhdGUpID0+IHtcbiAgICAgIGlmICh1cGRhdGUgIT09IHVuZGVmaW5lZCAmJiB1cGRhdGUgIT09IG51bGwpIHVwZGF0ZXMucHVzaCh1cGRhdGUpO1xuICAgIH0pO1xuICAgIGlmICh1cGRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IHRoaXMudXBkYXRlVmlld0NvbnRleHQoe1xuICAgICAgICB1cGRhdGVzLFxuICAgICAgICB1dWlkOiB0aGlzLnZpZXdDb250ZXh0Py51dWlkLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHB1YmxpYyBhc3luYyByZXN0b3JlVmlld3ModXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXBkYXRlczogVmlld1N0YXRlVXBkYXRlW10gPSBbXTtcbiAgICBpZiAoIXRoaXMudmlld0NvbnRleHQpIHtcbiAgICAgIGF3YWl0IHRoaXMuZ2V0Vmlld0NvbnRleHQodXVpZCk7XG4gICAgfVxuXG4gICAgdGhpcy52aWV3Q29udGV4dCEudmlld3MuZmlsdGVyKFxuICAgICAgKHZpZXcpID0+IHZpZXcuc3RhdGUgPT09IFZpZXdTdGF0ZS5PUEVORUQgfHwgdmlldy5zdGF0ZSA9PT0gVmlld1N0YXRlLlRPX09QRU5cbiAgICApLm1hcCgodmlldzogVmlld0RhdGEpID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZSA9IHRoaXMub3BlblZpZXcodmlldyk7XG4gICAgICBpZiAodXBkYXRlKSB7XG4gICAgICAgIHVwZGF0ZXMucHVzaCh1cGRhdGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMuc2VuZFZpZXdDb250ZXh0VXBkYXRlcyh1cGRhdGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmV1c2VFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuaW5qZWN0LmdldChSRVVTRV9ST1VURVJfU0xPVF9DT01QT05FTlQpO1xuICAgICAgcmV0dXJuIHZhbHVlICE9PSBmYWxzZTsgLy8gZGVmYXVsdCBPTiB3aGVuIHVuc2V0L251bGxcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVJldXNlKG9sZFZpZXc6IFZpZXdEYXRhLCBuZXdWaWV3OiBWaWV3RGF0YSk6IFZpZXdTdGF0ZVVwZGF0ZVtdIHtcbiAgICBjb25zdCByZWYgPSB0aGlzLmVtYmVkZGVkVmlld1JlZnMuZmluZCgocikgPT4gci51dWlkID09PSBvbGRWaWV3LnV1aWQpO1xuICAgIGlmICghcmVmKSB7XG4gICAgICAvLyBObyBsaXZlIGNvbXBvbmVudCB0byByZXVzZSAoZS5nLiB3YXMgcm91dGUtcmVuZGVyZWQpIOKAlCBmYWxsIGJhY2sgdG8gY2xvc2UgKyBvcGVuLlxuICAgICAgY29uc3QgdXBkYXRlcyA9IFsuLi50aGlzLmNsb3NlVmlldyhvbGRWaWV3KV07XG4gICAgICBjb25zdCBvcGVuZWQgPSB0aGlzLm9wZW5WaWV3KG5ld1ZpZXcpO1xuICAgICAgaWYgKG9wZW5lZCkgdXBkYXRlcy5wdXNoKG9wZW5lZCk7XG4gICAgICByZXR1cm4gdXBkYXRlcztcbiAgICB9XG4gICAgLy8gVGhlIHJldXNlZCBwYXJlbnQgaXMgbG9naWNhbGx5IGEgZnJlc2ggcGFnZSAobmV3IHV1aWQpOyBpdHMgcHJldmlvdXMgZW1iZWRkZWRcbiAgICAvLyBjaGlsZHJlbiBkbyBub3QgY2Fycnkgb3ZlciAodGhlIGJhY2tlbmQgbGVhdmVzIHRoZW0ga2V5ZWQgdW5kZXIgdGhlIG9sZCBwYXJlbnRcbiAgICAvLyB1dWlkKS4gVGVhciB0aGVtIGRvd24gaGVyZSBhbmQgcmVwb3J0IHRoZW0gQ0xPU0VELlxuICAgIGNvbnN0IGNoaWxkVXBkYXRlcyA9IHRoaXMuY2xlYW51cEVtYmVkZGVkQ2hpbGRyZW4ob2xkVmlldy51dWlkKTtcblxuICAgIHJlZi5jb21wb25lbnRSZWYuaW5zdGFuY2UudXVpZCA9IG5ld1ZpZXcudXVpZDsgLy8gc2V0dGVyIHJ1bnMgdW5mb2xsb3cob2xkKS9mb2xsb3cobmV3KVxuICAgIHJlZi51dWlkID0gbmV3Vmlldy51dWlkO1xuXG4gICAgY29uc3Qgb2xkSWR4ID0gdGhpcy5vcGVuZWRWaWV3VXVpZHMuaW5kZXhPZihvbGRWaWV3LnV1aWQpO1xuICAgIGlmIChvbGRJZHggPj0gMCkge1xuICAgICAgdGhpcy5vcGVuZWRWaWV3VXVpZHMuc3BsaWNlKG9sZElkeCwgMSk7XG4gICAgICB0aGlzLm9wZW5lZFZpZXdEYXRhLnNwbGljZShvbGRJZHgsIDEpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5lZFZpZXdVdWlkcy5wdXNoKG5ld1ZpZXcudXVpZCk7XG4gICAgdGhpcy5vcGVuZWRWaWV3RGF0YS5wdXNoKG5ld1ZpZXcpO1xuXG4gICAgcmVmLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5ydW4oKTtcblxuICAgIG9sZFZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuQ0xPU0VEO1xuICAgIG5ld1ZpZXcuc3RhdGUgPSBWaWV3U3RhdGUuT1BFTkVEO1xuXG4gICAgLy8gTWlycm9yIHRoZSBub3JtYWwgb3BlblZpZXcgdGFpbCBzbyBnZXRVdWlkT2ZQYWdlIGNvbnN1bWVycyAoZS5nLiB0cmVlcykgcmVzb2x2ZSB0aGUgbmV3IHV1aWQuXG4gICAgY29uc3Qgdmlld0hhbmRsZXIgPSByZXNvbHZlVmlld0hhbmRsZXIodGhpcy52aWV3SGFuZGxlcnMsIHRoaXMuZGVmYXVsdENvbXBvbmVudHMsIG5ld1ZpZXcpO1xuICAgIHRoaXMuc2V0VXVpZE9mUGFnZShuZXdWaWV3LnZpZXdOYW1lLCBuZXdWaWV3LnV1aWQsIHZpZXdIYW5kbGVyPy5jb21wb25lbnROYW1lKTtcbiAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZC5uZXh0KG5ld1ZpZXcudmlld05hbWUpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC4uLmNoaWxkVXBkYXRlcyxcbiAgICAgIHsgc3RhdGU6IFZpZXdTdGF0ZS5DTE9TRUQsIHV1aWQ6IG9sZFZpZXcudXVpZCB9LFxuICAgICAgeyBzdGF0ZTogVmlld1N0YXRlLk9QRU5FRCwgdXVpZDogbmV3Vmlldy51dWlkIH0sXG4gICAgXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzeW5jVmlldygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1cGRhdGVzOiAoVmlld1N0YXRlVXBkYXRlIHwgdW5kZWZpbmVkKVtdID0gW107XG4gICAgY29uc3Qgb3BzID0gYnVpbGRWaWV3T3BzKHRoaXMudmlld0NvbnRleHQ/LnZpZXdzID8/IFtdLCB0aGlzLnJldXNlRW5hYmxlZCgpKTtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIG9wcykge1xuICAgICAgaWYgKG9wLmtpbmQgPT09ICdvcGVuJykge1xuICAgICAgICB1cGRhdGVzLnB1c2godGhpcy5vcGVuVmlldyhvcC52aWV3KSk7XG4gICAgICB9IGVsc2UgaWYgKG9wLmtpbmQgPT09ICdjbG9zZScpIHtcbiAgICAgICAgdXBkYXRlcy5wdXNoKC4uLnRoaXMuY2xvc2VWaWV3KG9wLnZpZXcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVwZGF0ZXMucHVzaCguLi50aGlzLmV4ZWN1dGVSZXVzZShvcC5vbGRWaWV3LCBvcC5uZXdWaWV3KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgdmlld0RhdGFUb0Nsb3NlID0gdGhpcy5vcGVuZWRWaWV3RGF0YS5maWx0ZXIoXG4gICAgICAodmlld0RhdGE6IFZpZXdEYXRhKSA9PlxuICAgICAgICAhdGhpcy52aWV3Q29udGV4dD8udmlld3NcbiAgICAgICAgICAuZmxhdE1hcCgodmlld0RhdGE6IFZpZXdEYXRhKSA9PiB2aWV3RGF0YS51dWlkKVxuICAgICAgICAgIC5pbmNsdWRlcyh2aWV3RGF0YS51dWlkKVxuICAgICk7XG4gICAgaWYgKHZpZXdEYXRhVG9DbG9zZT8ubGVuZ3RoKSB7XG4gICAgICB2aWV3RGF0YVRvQ2xvc2UubWFwKCh2aWV3RGF0YTogVmlld0RhdGEpID0+IHtcbiAgICAgICAgdXBkYXRlcy5wdXNoKC4uLnRoaXMuY2xvc2VWaWV3KHZpZXdEYXRhKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdDb250ZXh0Py5saW5rcz8ubWFwKChkYXRhOiBMaW5rKSA9PiB7XG4gICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgbGV0IHRhcmdldCA9ICdfYmxhbmsnOyAvLyBkZWZhdWx0XG4gICAgICBzd2l0Y2ggKGRhdGEudGFyZ2V0ID8/IExpbmtUYXJnZXRFbnVtLkJMQU5LKSB7XG4gICAgICAgIGNhc2UgJ1NFTEYnOlxuICAgICAgICAgIHRhcmdldCA9ICdfc2VsZic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ0JMQU5LJzpcbiAgICAgICAgICB0YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnUEFSRU5UJzpcbiAgICAgICAgICB0YXJnZXQgPSAnX3BhcmVudCc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ1RPUCc6XG4gICAgICAgICAgdGFyZ2V0ID0gJ190b3AnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIHRhcmdldCk7XG4gICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIGRhdGEudXJsKTtcbiAgICAgIGlmIChkYXRhLmRvd25sb2FkKSB7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGRhdGEuZmlsZW5hbWUgPz8gJycpO1xuICAgICAgfVxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgIGxpbmsuY2xpY2soKTtcbiAgICAgIGxpbmsucmVtb3ZlKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnN0YXJ0RG93bmxvYWRzRmlsZXModGhpcy52aWV3Q29udGV4dD8uZG93bmxvYWRzIHx8IFtdKTtcblxuICAgIGNvbnN0IGNsaXBib2FyZFRleHQgPSB0aGlzLnZpZXdDb250ZXh0Py5jbGlwYm9hcmREYXRhXG4gICAgICA/Lm1hcCgoY2Q6IENsaXBib2FyZERhdGEpID0+IGNkLnRleHQgfHwgJycpXG4gICAgICAuam9pbignJyk7XG4gICAgaWYgKGNsaXBib2FyZFRleHQpIHtcbiAgICAgIGNvbnN0IGNsaXBib2FyZCA9IG5hdmlnYXRvci5jbGlwYm9hcmQ7XG4gICAgICAvLyBhdmFpbGFibGUgb25seSBpbiBzZWN1cmUgY29udGV4dHMuXG4gICAgICBpZiAoY2xpcGJvYXJkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xpcGJvYXJkXG4gICAgICAgICAgICAud3JpdGVUZXh0KGNsaXBib2FyZFRleHQpXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb3B5IHRleHQgdG8gY2xpcGJvYXJkJywgZSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWNjZXNzaW5nIGNsaXBib2FyZCcsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2VuZFZpZXdDb250ZXh0VXBkYXRlcyh1cGRhdGVzKTtcbiAgICB0aGlzLnZpZXdDb250ZXh0SGFzQmVlblN5bmNlZC5uZXh0KCk7XG4gIH1cblxuICBhc3luYyBzdGFydERvd25sb2Fkc0ZpbGVzKGRvd25sb2FkczogRG93bmxvYWRlZEZpbGVbXSkge1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBkb3dubG9hZHMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBibG9iID0gYXdhaXQgdGhpcy5kb3dubG9hZFJlc291cmNlKGZpbGUudXVpZCEsIGZpbGUuaWRlbnRpZmllciEpO1xuICAgICAgICBsZXQgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcblxuICAgICAgICBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgndGFyZ2V0JywgJ19ibGFuaycpO1xuICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7XG4gICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsIGZpbGUuZmlsZW5hbWUhKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICAgICAgbGluay5jbGljaygpO1xuICAgICAgICBsaW5rLnJlbW92ZSgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkb3dubG9hZGluZyBmaWxlJywgZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRWaWV3Q29udGV4dFV1aWQodXVpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnZpZXdDb250ZXh0VXVpZE5hbWUsIHV1aWQpO1xuICAgIHRoaXMuc2Vzc2lvbi5hZGRIZWFkZXJQYXJhbSh7XG4gICAgICBoZWFkZXJOYW1lOiB0aGlzLnZpZXdDb250ZXh0VXVpZEhlYWRlck5hbWUsXG4gICAgICB2YWx1ZTogdXVpZCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaWV3Q29udGV4dFV1aWQoKTogc3RyaW5nIHtcbiAgICBsZXQgdmlld0NvbnRleHRVdWlkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnZpZXdDb250ZXh0VXVpZE5hbWUpO1xuICAgIGlmICghdmlld0NvbnRleHRVdWlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZpZXcgY29udGV4dCBpcyBub3QgaW5pdGlhbGl6ZWQhJyk7XG4gICAgfVxuICAgIHJldHVybiB2aWV3Q29udGV4dFV1aWQ7XG4gIH1cblxuICBwdWJsaWMgaGFzVmlld0NvbnRleHRVdWlkKCk6IGJvb2xlYW4ge1xuICAgIGxldCB2aWV3Q29udGV4dFV1aWQgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHRoaXMudmlld0NvbnRleHRVdWlkTmFtZSk7XG4gICAgcmV0dXJuIHZpZXdDb250ZXh0VXVpZCAhPT0gbnVsbCAmJiB2aWV3Q29udGV4dFV1aWQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRVdWlkT2ZQYWdlKHBhZ2VOYW1lOiBzdHJpbmcsIHV1aWQ6IHN0cmluZywgY29tcG9uZW50TmFtZT86IHN0cmluZyk6IHZvaWQge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0odGhpcy5wYWdlTmFtZVByZWZpeCArIHBhZ2VOYW1lLCB1dWlkKTtcbiAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh0aGlzLmNvbXBvbmVudE5hbWVQcmVmaXggKyBjb21wb25lbnROYW1lLCBwYWdlTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyVXVpZE9mUGFnZShwYWdlTmFtZTogc3RyaW5nLCBjb21wb25lbnROYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnBhZ2VOYW1lUHJlZml4ICsgcGFnZU5hbWUpO1xuICAgIGlmIChjb21wb25lbnROYW1lKSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuY29tcG9uZW50TmFtZVByZWZpeCArIGNvbXBvbmVudE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRVdWlkT2ZQYWdlKHBhZ2VOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCB1dWlkID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnBhZ2VOYW1lUHJlZml4ICsgcGFnZU5hbWUpO1xuICAgIGlmICghdXVpZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgdXVpZCBvZiAke3BhZ2VOYW1lfSBpcyBub3QgYXZhaWxhYmxlLmApO1xuICAgIH1cbiAgICByZXR1cm4gdXVpZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYWdlTmFtZU9mQ29tcG9uZW50KGNvbXBvbmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHBhZ2VOYW1lID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmNvbXBvbmVudE5hbWVQcmVmaXggKyBjb21wb25lbnROYW1lKTtcbiAgICBpZiAoIXBhZ2VOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBwYWdlTmFtZSBvZiAke2NvbXBvbmVudE5hbWV9IGlzIG5vdCBhdmFpbGFibGUuYCk7XG4gICAgfVxuICAgIHJldHVybiBwYWdlTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBtZXNzYWdlKG1lc3NhZ2VEYXRhOiBNZXNzYWdlRGF0YSwgbWVzc2FnZVJlc3VsdDogTWVzc2FnZVJlc3VsdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcbiAgICAgIGF3YWl0IHRoaXMudmlld1xuICAgICAgICAubWVzc2FnZShtZXNzYWdlRGF0YS52aWV3VXVpZCA/PyAnJywgbWVzc2FnZURhdGEudXVpZCwgbWVzc2FnZVJlc3VsdClcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgKTtcbiAgICAvLyBpbiBmdXR1cmUgdXNlIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWVcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTbWFydFZpZXdDb250ZXh0QXBpRXJyb3JCeUNvZGUoY29kZTogc3RyaW5nKTogUHJvbWlzZTxTbWFydFZpZXdDb250ZXh0QXBpRXJyb3I+IHtcbiAgICBsZXQgYnV0dG9uTGFiZWw7XG4gICAgbGV0IGRpYWxvZ1RpdGxlO1xuICAgIGxldCBtZXNzYWdlO1xuICAgIGlmICh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UpIHtcbiAgICAgIGJ1dHRvbkxhYmVsID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlXG4gICAgICAgIC5nZXQoU21hcnRWaWV3Q29udGV4dEVycm9yRGlhbG9nQnV0dG9uTGFiZWwpXG4gICAgICAgIC50b1Byb21pc2UoKTtcbiAgICAgIGRpYWxvZ1RpdGxlID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dUaXRsZSkudG9Qcm9taXNlKCk7XG4gICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldChTbWFydFZpZXdDb250ZXh0RXJyb3JEaWFsb2dNZXNzYWdlKS50b1Byb21pc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnV0dG9uTGFiZWwgPSAnT2snO1xuICAgICAgZGlhbG9nVGl0bGUgPSAnSGliYSc7XG4gICAgICBtZXNzYWdlID0gJ0FuIGVycm9yIGhhcyBvY2N1cmVkLic7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcnMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvZGUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIGJ1dHRvbkxhYmVsLFxuICAgICAgICBkaWFsb2dUaXRsZSxcbiAgICAgIH07XG4gICAgfVxuICAgIGxldCBhcGlFcnJvcnNXaXRoQ29kZSA9IHRoaXMuc21hcnRWaWV3Q29udGV4dEFwaUVycm9ycy52aWV3Q29udGV4dEFwaUVycm9ycy5maWx0ZXIoXG4gICAgICAoYXBpRXJyb3I6IFNtYXJ0Vmlld0NvbnRleHRBcGlFcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gYXBpRXJyb3IuY29kZSA9PT0gY29kZTtcbiAgICAgIH1cbiAgICApO1xuICAgIGlmICghYXBpRXJyb3JzV2l0aENvZGUgfHwgKGFwaUVycm9yc1dpdGhDb2RlICYmICFhcGlFcnJvcnNXaXRoQ29kZS5sZW5ndGgpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGBTbWFydFZpZXdDb250ZXh0QXBpRXJyb3Igd2l0aCBjb2RlICR7Y29kZX0gY291bGQgbm90IGJlIGZvdW5kLmApO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2RlLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBidXR0b25MYWJlbCxcbiAgICAgICAgZGlhbG9nVGl0bGUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gYXBpRXJyb3JzV2l0aENvZGVbMF07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Vmlld0NvbnN0cmFpbnQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29uc3RyYWludD4ge1xuICAgIGxldCB2aWV3Q29uc3RyYWludFJlc3BvbnNlID0gYXdhaXQgdGhpcy52aWV3LmdldFZpZXdDb25zdHJhaW50KHV1aWQpLnRvUHJvbWlzZSgpO1xuICAgIGlmICghdmlld0NvbnN0cmFpbnRSZXNwb25zZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGdldCBWaWV3Q29uc3RyYWludCB3aXRoIHRoZSBnaXZlbiB1dWlkLicpO1xuICAgIHJldHVybiB2aWV3Q29uc3RyYWludFJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNob3dQdWJsaXNoZWRWaWV3KGNoYW5uZWw6IHN0cmluZywgdXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc09wZW5pbmdTbWFydExpbmsgPSB0cnVlO1xuXG4gICAgYXdhaXQgdGhpcy5zZXNzaW9uLmluaXRpYWxpemUoKTtcbiAgICAvLyBUT0RPIGluaXQgdmlldyBjb250ZXh0IGF1dG9tYXRpY2FsbHlcbiAgICAvLyBhd2FpdCB0aGlzLmluaXRpYWxpemUoKTtcbiAgICBhd2FpdCB0aGlzLmluaXRWaWV3Q29udGV4dCgpO1xuXG4gICAgdGhpcy5vcGVuU21hcnRMaW5rLm5leHQoY2hhbm5lbCk7XG4gICAgYXdhaXQgdGhpcy5vcGVuU21hcnRMaW5rLnRvUHJvbWlzZSgpO1xuXG4gICAgYXdhaXQgdGhpcy52aWV3LnNob3dQdWJsaXNoZWRWaWV3KGNoYW5uZWwsIHV1aWQpLnRvUHJvbWlzZSgpO1xuICAgIGF3YWl0IHRoaXMuZ2V0QW5kU3luY1ZpZXdDb250ZXh0KCk7XG4gICAgdGhpcy5pc09wZW5pbmdTbWFydExpbmsgPSBmYWxzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkb3dubG9hZFJlc291cmNlKHV1aWQ6IHN0cmluZywgaXRlbTogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy52aWV3LmRvd25sb2FkSXRlbSh1dWlkLCBpdGVtKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtQWN0aW9uKHV1aWQ6IHN0cmluZywgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyZm9ybUFjdGlvbih7XG4gICAgICB1dWlkLFxuICAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgIH0pO1xuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtQWN0aW9uLmJpbmQodGhpcyksXG4gICAgLy8gICBjb25maWc6IHtcbiAgICAvLyAgICAgdXVpZCxcbiAgICAvLyAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgIC8vICAgfSxcbiAgICAvLyAgIGlzQ29tcGxldGVkLFxuICAgIC8vIH0pO1xuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtV2lkZ2V0QWN0aW9uKFxuICAgIHV1aWQ6IHN0cmluZyxcbiAgICB3aWRnZXRJZDogc3RyaW5nLFxuICAgIG5vZGVJZDogc3RyaW5nLFxuICAgIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9wZXJmb3JtV2lkZ2V0QWN0aW9uKHsgdXVpZCwgd2lkZ2V0SWQsIG5vZGVJZCwgdWlBY3Rpb25SZXF1ZXN0IH0pO1xuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtV2lkZ2V0QWN0aW9uLmJpbmQodGhpcyksXG4gICAgLy8gICBjb25maWc6IHtcbiAgICAvLyAgICAgdXVpZCxcbiAgICAvLyAgICAgd2lkZ2V0SWQsXG4gICAgLy8gICAgIG5vZGVJZCxcbiAgICAvLyAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgIC8vICAgfSxcbiAgICAvLyAgIGlzQ29tcGxldGVkLFxuICAgIC8vIH0pO1xuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBwZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbihcbiAgICB1dWlkOiBzdHJpbmcsXG4gICAgd2lkZ2V0SWQ6IHN0cmluZyxcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fcGVyZm9ybVdpZGdldE1haW5BY3Rpb24oeyB1dWlkLCB3aWRnZXRJZCwgdWlBY3Rpb25SZXF1ZXN0IH0pO1xuICAgIC8vIGNvbnN0IGlzQ29tcGxldGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICAvLyB0aGlzLmFwaVF1ZXVlU2VydmljZS5hZGRUb1F1ZXVlKHtcbiAgICAvLyAgIGNhbGxiYWNrOiB0aGlzLl9wZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbi5iaW5kKHRoaXMpLFxuICAgIC8vICAgY29uZmlnOiB7XG4gICAgLy8gICAgIHV1aWQsXG4gICAgLy8gICAgIHdpZGdldElkLFxuICAgIC8vICAgICB1aUFjdGlvblJlcXVlc3QsXG4gICAgLy8gICB9LFxuICAgIC8vICAgaXNDb21wbGV0ZWQsXG4gICAgLy8gfSk7XG4gICAgLy8gcmV0dXJuIGF3YWl0IGlzQ29tcGxldGVkLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHBlcmZvcm1VcGxvYWRBY3Rpb24oXG4gICAgdXVpZDogc3RyaW5nLFxuICAgIHVpQWN0aW9uUmVxdWVzdDogVWlBY3Rpb25SZXF1ZXN0LFxuICAgIHBhcmFtOiAnaW5wdXQnIHwgJ2lucHV0XCInLFxuICAgIGNvbnRlbnQ6IGFueVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9wZXJmb3JtVXBsb2FkQWN0aW9uKHtcbiAgICAgIHV1aWQsXG4gICAgICB1aUFjdGlvblJlcXVlc3QsXG4gICAgICBwYXJhbSxcbiAgICAgIGNvbnRlbnQsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgcGVyZm9ybVVwbG9hZE11bHRpcGxlQWN0aW9uKFxuICAgIHV1aWQ6IHN0cmluZyxcbiAgICB1aUFjdGlvblJlcXVlc3Q6IFVpQWN0aW9uUmVxdWVzdCxcbiAgICBwYXJhbTogJ2lucHV0JyB8ICdpbnB1dDInLFxuICAgIGNvbnRlbnQ6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuX3BlcmZvcm1VcGxvYWRNdWx0aXBsZUFjdGlvbih7XG4gICAgICB1dWlkLFxuICAgICAgdWlBY3Rpb25SZXF1ZXN0LFxuICAgICAgcGFyYW0sXG4gICAgICBjb250ZW50LFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGRhdGFDaGFuZ2VkKHV1aWQ6IHN0cmluZywgZGF0YUNoYW5nZTogRGF0YUNoYW5nZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9kYXRhQ2hhbmdlZCh7IHV1aWQsIGRhdGFDaGFuZ2UgfSk7XG4gICAgLy8gY29uc3QgaXNDb21wbGV0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIC8vIHRoaXMuYXBpUXVldWVTZXJ2aWNlLmFkZFRvUXVldWUoXG4gICAgLy8gICB7XG4gICAgLy8gICAgIGNhbGxiYWNrOiB0aGlzLl9kYXRhQ2hhbmdlZC5iaW5kKHRoaXMpLFxuICAgIC8vICAgICBjb25maWc6IHtcbiAgICAvLyAgICAgICB1dWlkLFxuICAgIC8vICAgICAgIGRhdGFDaGFuZ2UsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIGlzQ29tcGxldGVkLFxuICAgIC8vICAgfSxcbiAgICAvLyAgIHRydWVcbiAgICAvLyApO1xuICAgIC8vIHJldHVybiBhd2FpdCBpc0NvbXBsZXRlZC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgX3BlcmZvcm1BY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXG4gICAgICBhd2FpdCB0aGlzLnZpZXcucGVyZm9ybUFjdGlvbihjb25maWcudXVpZCwgY29uZmlnLnVpQWN0aW9uUmVxdWVzdCkudG9Qcm9taXNlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcGVyZm9ybVdpZGdldEFjdGlvbihjb25maWc6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcbiAgICAgIGF3YWl0IHRoaXMudmlld1xuICAgICAgICAucGVyZm9ybVdpZGdldEFjdGlvbihjb25maWcudXVpZCwgY29uZmlnLndpZGdldElkLCBjb25maWcubm9kZUlkLCBjb25maWcudWlBY3Rpb25SZXF1ZXN0KVxuICAgICAgICAudG9Qcm9taXNlKClcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcGVyZm9ybVdpZGdldE1haW5BY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXG4gICAgICBhd2FpdCB0aGlzLnZpZXdcbiAgICAgICAgLnBlcmZvcm1XaWRnZXRNYWluQWN0aW9uKGNvbmZpZy51dWlkLCBjb25maWcud2lkZ2V0SWQsIGNvbmZpZy51aUFjdGlvblJlcXVlc3QpXG4gICAgICAgIC50b1Byb21pc2UoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtVXBsb2FkQWN0aW9uKGNvbmZpZzogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxuICAgICAgYXdhaXQgdGhpcy52aWV3XG4gICAgICAgIC51cGxvYWRBY3Rpb24oXG4gICAgICAgICAgY29uZmlnLnV1aWQsXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoY29uZmlnLnVpQWN0aW9uUmVxdWVzdCksXG4gICAgICAgICAgY29uZmlnLnBhcmFtLFxuICAgICAgICAgIGNvbmZpZy5jb250ZW50XG4gICAgICAgIClcbiAgICAgICAgLnRvUHJvbWlzZSgpXG4gICAgKTtcbiAgfVxuICBwcml2YXRlIGFzeW5jIF9wZXJmb3JtVXBsb2FkTXVsdGlwbGVBY3Rpb24oY29uZmlnOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2UoXG4gICAgICBhd2FpdCB0aGlzLnZpZXdcbiAgICAgICAgLnVwbG9hZE11bHRpcGxlQWN0aW9uKFxuICAgICAgICAgIGNvbmZpZy51dWlkLFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGNvbmZpZy51aUFjdGlvblJlcXVlc3QpLFxuICAgICAgICAgIGNvbmZpZy5wYXJhbSxcbiAgICAgICAgICBjb25maWcuY29udGVudFxuICAgICAgICApXG4gICAgICAgIC50b1Byb21pc2UoKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIF9kYXRhQ2hhbmdlZChjb25maWc6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKFxuICAgICAgYXdhaXQgdGhpcy52aWV3LmRhdGFDaGFuZ2VkKGNvbmZpZy51dWlkLCBjb25maWcuZGF0YUNoYW5nZSkudG9Qcm9taXNlKClcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZShcbiAgICB2aWV3Q29udGV4dENoYW5nZTogVmlld0NvbnRleHRDaGFuZ2UgfCB1bmRlZmluZWRcbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLnZpZXdDb250ZXh0ID0gdmlld0NvbnRleHRDaGFuZ2U/LnZpZXdDb250ZXh0O1xuICAgIGF3YWl0IHRoaXMuc3luY1ZpZXcoKTtcblxuICAgIGlmICh2aWV3Q29udGV4dENoYW5nZT8uY2hhbmdlcykge1xuICAgICAgdGhpcy5oYW5kbGVDaGFuZ2VzKHZpZXdDb250ZXh0Q2hhbmdlLmNoYW5nZXMpO1xuICAgIH1cbiAgICByZXR1cm4gdmlld0NvbnRleHRDaGFuZ2U/LnJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbmdlcyhjaGFuZ2VzOiBBcnJheTxDb21wb25lbnRNb2RlbENoYW5nZT4pOiB2b2lkIHtcbiAgICBjaGFuZ2VzLmZvckVhY2goKGNvbXBvbmVudE1vZGVsQ2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSkgPT4ge1xuICAgICAgbGV0IGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PENvbXBvbmVudE1vZGVsQ2hhbmdlPiB8IHVuZGVmaW5lZCA9IHRoaXMuc21hcnRBcGlDbGllbnRzLmdldChcbiAgICAgICAgY29tcG9uZW50TW9kZWxDaGFuZ2UudXVpZFxuICAgICAgKTtcbiAgICAgIGlmIChkZXRlY3RDaGFuZ2UpIHtcbiAgICAgICAgZGV0ZWN0Q2hhbmdlLm5leHQoY29tcG9uZW50TW9kZWxDaGFuZ2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWQodXVpZDogc3RyaW5nKTogUHJvbWlzZTxDb21wb25lbnRNb2RlbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLnZpZXcuZ2V0Q29tcG9uZW50TW9kZWwodXVpZCkudG9Qcm9taXNlKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbG9hZDIodXVpZDogc3RyaW5nKTogUHJvbWlzZTxWaWV3Q29udGV4dENoYW5nZSB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBjaGFuZ2UgPSBhd2FpdCB0aGlzLnZpZXcuZ2V0Q29tcG9uZW50TW9kZWwyKHV1aWQpLnRvUHJvbWlzZSgpO1xuICAgIHRoaXMuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKGNoYW5nZSk7XG4gICAgcmV0dXJuIGNoYW5nZTtcbiAgfVxuXG4gIGdldEN1cnJlbnRWaWV3Q29udGV4dCgpOiBWaWV3Q29udGV4dERhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnZpZXdDb250ZXh0O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBJU19BU1lOQ19QQVJBTV9OQU1FID0gJ2lzQXN5bmMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFwaVF1ZXVlQ2FsbCB7XG4gIGNhbGxiYWNrOiAoY29uZmlnOiBhbnkpID0+IFByb21pc2U8YW55PjtcbiAgY29uZmlnOiBhbnk7XG4gIGlzQ29tcGxldGVkOiBTdWJqZWN0PHZvaWQ+O1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQXBpUXVldWVTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBfZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgcXVldWU6IEFwaVF1ZXVlQ2FsbFtdID0gW107XG4gIHByaXZhdGUgaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgcXVldWVTdWJqZWN0OiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5xdWV1ZVN1YmplY3QucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5wcm9jZXNzUXVldWUoKSk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBhZGRUb1F1ZXVlKGNhbGw6IEFwaVF1ZXVlQ2FsbCwgcHJpb3JpdHk6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChwcmlvcml0eSkge1xuICAgICAgdGhpcy5xdWV1ZS51bnNoaWZ0KGNhbGwpOyAvLyBBZGQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcXVldWUgaWYgaXQgaGFzIGhpZ2hlciBwcmlvcml0eVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2goY2FsbCk7IC8vIEFkZCBhdCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSBpZiBpdCBoYXMgbG93ZXIgcHJpb3JpdHlcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzUHJvY2Vzc2luZykge1xuICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBwcm9jZXNzUXVldWUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaVF1ZXVlQ2FsbCA9IHRoaXMucXVldWUuc2hpZnQoKTtcbiAgICBpZiAoYXBpUXVldWVDYWxsKSB7XG4gICAgICBhd2FpdCBhcGlRdWV1ZUNhbGwuY2FsbGJhY2soYXBpUXVldWVDYWxsLmNvbmZpZyk7XG4gICAgICBhcGlRdWV1ZUNhbGwuaXNDb21wbGV0ZWQuY29tcGxldGUoKTtcbiAgICAgIHRoaXMucXVldWVTdWJqZWN0Lm5leHQoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==