@smartbit4all/ng-client 4.2.34 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +12 -12
  2. package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +1 -1
  3. package/fesm2022/smartbit4all-ng-client.mjs +521 -501
  4. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  5. package/lib/smart-client/smart-component-api-client.d.ts +2 -2
  6. package/lib/smart-component-layout/smart-component-layout.component.d.ts +1 -1
  7. package/lib/smart-dialog/smartdialog.module.d.ts +2 -1
  8. package/lib/smart-grid/smart-grid.component.d.ts +1 -1
  9. package/lib/smart-grid/smart-grid.module.d.ts +21 -19
  10. package/lib/smart-map/abstract-map.d.ts +1 -1
  11. package/lib/smart-ng-client.module.d.ts +4 -3
  12. package/lib/view-context/smart-view-context.module.d.ts +42 -43
  13. package/package.json +12 -14
  14. package/smartbit4all-ng-client-5.0.1.tgz +0 -0
  15. package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +0 -17
  16. package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +0 -35
  17. package/esm2022/lib/component-factory-service/projects.mjs +0 -6
  18. package/esm2022/lib/session/api/api/api.mjs +0 -4
  19. package/esm2022/lib/session/api/api/session.service.mjs +0 -306
  20. package/esm2022/lib/session/api/configuration.mjs +0 -91
  21. package/esm2022/lib/session/api/encoder.mjs +0 -19
  22. package/esm2022/lib/session/api/index.mjs +0 -3
  23. package/esm2022/lib/session/api/model/accountInfo.mjs +0 -13
  24. package/esm2022/lib/session/api/model/apiError.mjs +0 -13
  25. package/esm2022/lib/session/api/model/authenticationProviderData.mjs +0 -13
  26. package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +0 -2
  27. package/esm2022/lib/session/api/model/models.mjs +0 -9
  28. package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +0 -13
  29. package/esm2022/lib/session/api/model/session.mjs +0 -2
  30. package/esm2022/lib/session/api/model/sessionInfoData.mjs +0 -2
  31. package/esm2022/lib/session/api/model/userActivityLog.mjs +0 -13
  32. package/esm2022/lib/session/api/param.mjs +0 -2
  33. package/esm2022/lib/session/api/variables.mjs +0 -9
  34. package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +0 -225
  35. package/esm2022/lib/session/projects.mjs +0 -10
  36. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +0 -95
  37. package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +0 -46
  38. package/esm2022/lib/session/smart-session-handler.service.mjs +0 -6
  39. package/esm2022/lib/session/smart-session.module.mjs +0 -58
  40. package/esm2022/lib/session/smart-session.service.mjs +0 -230
  41. package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +0 -35
  42. package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +0 -58
  43. package/esm2022/lib/shared/projects.mjs +0 -4
  44. package/esm2022/lib/shared/shared.module.mjs +0 -19
  45. package/esm2022/lib/shared/smart-tooltip.directive.mjs +0 -58
  46. package/esm2022/lib/shared/smarttable.date-pipe.mjs +0 -43
  47. package/esm2022/lib/smart-client/projects.mjs +0 -5
  48. package/esm2022/lib/smart-client/smart-authentication.service.mjs +0 -21
  49. package/esm2022/lib/smart-client/smart-component-api-client.mjs +0 -786
  50. package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +0 -81
  51. package/esm2022/lib/smart-client/smart.component.mjs +0 -84
  52. package/esm2022/lib/smart-client/smart.service.mjs +0 -75
  53. package/esm2022/lib/smart-component-layout/api/api/api.mjs +0 -4
  54. package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +0 -133
  55. package/esm2022/lib/smart-component-layout/api/api.module.mjs +0 -40
  56. package/esm2022/lib/smart-component-layout/api/configuration.mjs +0 -91
  57. package/esm2022/lib/smart-component-layout/api/encoder.mjs +0 -19
  58. package/esm2022/lib/smart-component-layout/api/index.mjs +0 -7
  59. package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +0 -18
  60. package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +0 -20
  61. package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +0 -17
  62. package/esm2022/lib/smart-component-layout/api/model/models.mjs +0 -6
  63. package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +0 -2
  64. package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +0 -2
  65. package/esm2022/lib/smart-component-layout/api/param.mjs +0 -2
  66. package/esm2022/lib/smart-component-layout/api/variables.mjs +0 -9
  67. package/esm2022/lib/smart-component-layout/projects.mjs +0 -8
  68. package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +0 -111
  69. package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +0 -307
  70. package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +0 -45
  71. package/esm2022/lib/smart-dialog/projects.mjs +0 -8
  72. package/esm2022/lib/smart-dialog/smartdialog.component.mjs +0 -54
  73. package/esm2022/lib/smart-dialog/smartdialog.model.mjs +0 -16
  74. package/esm2022/lib/smart-dialog/smartdialog.module.mjs +0 -46
  75. package/esm2022/lib/smart-dialog/smartdialog.service.mjs +0 -90
  76. package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +0 -96
  77. package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +0 -12
  78. package/esm2022/lib/smart-expandable-section/projects.mjs +0 -8
  79. package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +0 -53
  80. package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +0 -14
  81. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +0 -17
  82. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +0 -2
  83. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +0 -8
  84. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +0 -2
  85. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +0 -2
  86. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +0 -20
  87. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +0 -2
  88. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +0 -2
  89. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +0 -28
  90. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +0 -2
  91. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +0 -2
  92. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +0 -32
  93. package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +0 -18
  94. package/esm2022/lib/smart-filter/api/filter/model/model.mjs +0 -16
  95. package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +0 -2
  96. package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +0 -13
  97. package/esm2022/lib/smart-filter/api/value/model/value.mjs +0 -13
  98. package/esm2022/lib/smart-filter/projects.mjs +0 -9
  99. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +0 -14
  100. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +0 -165
  101. package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +0 -45
  102. package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +0 -36
  103. package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +0 -31
  104. package/esm2022/lib/smart-filter/smart-filter.model.mjs +0 -13
  105. package/esm2022/lib/smart-filter/smart-filter.module.mjs +0 -33
  106. package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +0 -198
  107. package/esm2022/lib/smart-filter-editor/api/configuration.mjs +0 -91
  108. package/esm2022/lib/smart-filter-editor/api/encoder.mjs +0 -19
  109. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +0 -17
  110. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +0 -13
  111. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +0 -2
  112. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +0 -8
  113. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +0 -2
  114. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +0 -7
  115. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +0 -2
  116. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +0 -20
  117. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +0 -2
  118. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +0 -2
  119. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +0 -2
  120. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +0 -28
  121. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +0 -2
  122. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +0 -2
  123. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +0 -32
  124. package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +0 -19
  125. package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +0 -17
  126. package/esm2022/lib/smart-filter-editor/api/param.mjs +0 -2
  127. package/esm2022/lib/smart-filter-editor/api/variables.mjs +0 -9
  128. package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +0 -15
  129. package/esm2022/lib/smart-filter-editor/project.mjs +0 -8
  130. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +0 -73
  131. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +0 -40
  132. package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +0 -273
  133. package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +0 -2
  134. package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +0 -69
  135. package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +0 -47
  136. package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +0 -24
  137. package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +0 -57
  138. package/esm2022/lib/smart-form/api/api/api.mjs +0 -4
  139. package/esm2022/lib/smart-form/api/api/default.service.mjs +0 -133
  140. package/esm2022/lib/smart-form/api/api.module.mjs +0 -40
  141. package/esm2022/lib/smart-form/api/configuration.mjs +0 -91
  142. package/esm2022/lib/smart-form/api/encoder.mjs +0 -19
  143. package/esm2022/lib/smart-form/api/index.mjs +0 -7
  144. package/esm2022/lib/smart-form/api/model/models.mjs +0 -12
  145. package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +0 -13
  146. package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +0 -7
  147. package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +0 -22
  148. package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +0 -17
  149. package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +0 -46
  150. package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +0 -2
  151. package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +0 -2
  152. package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +0 -2
  153. package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +0 -18
  154. package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +0 -13
  155. package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +0 -20
  156. package/esm2022/lib/smart-form/api/param.mjs +0 -2
  157. package/esm2022/lib/smart-form/api/variables.mjs +0 -9
  158. package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +0 -20
  159. package/esm2022/lib/smart-form/projects.mjs +0 -15
  160. package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +0 -613
  161. package/esm2022/lib/smart-form/services/smartform.service.mjs +0 -673
  162. package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +0 -15
  163. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +0 -78
  164. package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +0 -2
  165. package/esm2022/lib/smart-form/smartform.component.mjs +0 -185
  166. package/esm2022/lib/smart-form/smartform.form-model.mjs +0 -2
  167. package/esm2022/lib/smart-form/smartform.model.mjs +0 -38
  168. package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +0 -84
  169. package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +0 -36
  170. package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +0 -79
  171. package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +0 -874
  172. package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +0 -78
  173. package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +0 -31
  174. package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +0 -4
  175. package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +0 -451
  176. package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +0 -40
  177. package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +0 -91
  178. package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +0 -19
  179. package/esm2022/lib/smart-grid/api/grid-api/index.mjs +0 -7
  180. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +0 -17
  181. package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +0 -2
  182. package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +0 -20
  183. package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +0 -2
  184. package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +0 -2
  185. package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +0 -2
  186. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +0 -13
  187. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +0 -18
  188. package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +0 -17
  189. package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +0 -2
  190. package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +0 -2
  191. package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +0 -2
  192. package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +0 -8
  193. package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +0 -14
  194. package/esm2022/lib/smart-grid/api/grid-api/param.mjs +0 -2
  195. package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +0 -9
  196. package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +0 -20
  197. package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +0 -66
  198. package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +0 -182
  199. package/esm2022/lib/smart-grid/models/model.mjs +0 -29
  200. package/esm2022/lib/smart-grid/projects.mjs +0 -9
  201. package/esm2022/lib/smart-grid/smart-grid.component.mjs +0 -934
  202. package/esm2022/lib/smart-grid/smart-grid.module.mjs +0 -100
  203. package/esm2022/lib/smart-grid/smart-grid.service.mjs +0 -80
  204. package/esm2022/lib/smart-icon/projects.mjs +0 -7
  205. package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +0 -53
  206. package/esm2022/lib/smart-icon/smart-icon.module.mjs +0 -22
  207. package/esm2022/lib/smart-icon/smart-icon.service.mjs +0 -74
  208. package/esm2022/lib/smart-map/abstract-map.mjs +0 -112
  209. package/esm2022/lib/smart-map/api/api/api.mjs +0 -4
  210. package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +0 -312
  211. package/esm2022/lib/smart-map/api/api.module.mjs +0 -40
  212. package/esm2022/lib/smart-map/api/configuration.mjs +0 -91
  213. package/esm2022/lib/smart-map/api/encoder.mjs +0 -19
  214. package/esm2022/lib/smart-map/api/index.mjs +0 -7
  215. package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +0 -13
  216. package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +0 -2
  217. package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +0 -2
  218. package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +0 -17
  219. package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +0 -2
  220. package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +0 -19
  221. package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +0 -2
  222. package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +0 -2
  223. package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +0 -2
  224. package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +0 -18
  225. package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +0 -2
  226. package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +0 -2
  227. package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +0 -2
  228. package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +0 -2
  229. package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +0 -17
  230. package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +0 -18
  231. package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +0 -2
  232. package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +0 -17
  233. package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +0 -2
  234. package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +0 -2
  235. package/esm2022/lib/smart-map/api/model/models.mjs +0 -21
  236. package/esm2022/lib/smart-map/api/param.mjs +0 -2
  237. package/esm2022/lib/smart-map/api/variables.mjs +0 -9
  238. package/esm2022/lib/smart-map/api-default/api-default.mjs +0 -2
  239. package/esm2022/lib/smart-map/impl/google-map.mjs +0 -221
  240. package/esm2022/lib/smart-map/impl/leaflet-map.mjs +0 -264
  241. package/esm2022/lib/smart-map/projects.mjs +0 -9
  242. package/esm2022/lib/smart-map/smart-map.component.mjs +0 -218
  243. package/esm2022/lib/smart-map/smart-map.module.mjs +0 -22
  244. package/esm2022/lib/smart-map/smart-map.types.mjs +0 -2
  245. package/esm2022/lib/smart-navbar/projects.mjs +0 -8
  246. package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +0 -61
  247. package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +0 -6
  248. package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +0 -63
  249. package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +0 -14
  250. package/esm2022/lib/smart-navigation/projects.mjs +0 -6
  251. package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +0 -2
  252. package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +0 -18
  253. package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +0 -56
  254. package/esm2022/lib/smart-ng-client.module.mjs +0 -130
  255. package/esm2022/lib/smart-ng-client.service.mjs +0 -19
  256. package/esm2022/lib/smart-subject/projects.mjs +0 -5
  257. package/esm2022/lib/smart-subject/smart-subject.mjs +0 -21
  258. package/esm2022/lib/smart-tab-group/projects.mjs +0 -9
  259. package/esm2022/lib/smart-tab-group/smart-tab-group.component.mjs +0 -43
  260. package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +0 -25
  261. package/esm2022/lib/smart-tab-group/smart-tab-group.service.mjs +0 -14
  262. package/esm2022/lib/smart-tab-group/tab-content/tab-content.component.mjs +0 -31
  263. package/esm2022/lib/smart-tab-group/tab-group-simplified/tab-group.component.mjs +0 -66
  264. package/esm2022/lib/smart-tab-group/tabTile.model.mjs +0 -2
  265. package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +0 -43
  266. package/esm2022/lib/smart-table/components/loading/loading.component.mjs +0 -15
  267. package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +0 -52
  268. package/esm2022/lib/smart-table/projects.mjs +0 -8
  269. package/esm2022/lib/smart-table/smarttable.component.mjs +0 -98
  270. package/esm2022/lib/smart-table/smarttable.model.mjs +0 -169
  271. package/esm2022/lib/smart-table/smarttable.module.mjs +0 -105
  272. package/esm2022/lib/smart-table/smarttable.service.mjs +0 -14
  273. package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +0 -39
  274. package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +0 -23
  275. package/esm2022/lib/smart-table/tables/table.mjs +0 -520
  276. package/esm2022/lib/smart-tree/projects.mjs +0 -9
  277. package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +0 -288
  278. package/esm2022/lib/smart-tree/smarttree.component.mjs +0 -181
  279. package/esm2022/lib/smart-tree/smarttree.model.mjs +0 -7
  280. package/esm2022/lib/smart-tree/smarttree.module.mjs +0 -60
  281. package/esm2022/lib/smart-tree/smarttree.node.model.mjs +0 -6
  282. package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +0 -2
  283. package/esm2022/lib/smart-tree/smarttree.service.mjs +0 -47
  284. package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +0 -1190
  285. package/esm2022/lib/smart-tree/tree-api/configuration.mjs +0 -91
  286. package/esm2022/lib/smart-tree/tree-api/encoder.mjs +0 -19
  287. package/esm2022/lib/smart-tree/tree-api/param.mjs +0 -2
  288. package/esm2022/lib/smart-tree/tree-api/variables.mjs +0 -9
  289. package/esm2022/lib/smart-validation/named-validator.service.mjs +0 -115
  290. package/esm2022/lib/smart-validation/projects.mjs +0 -4
  291. package/esm2022/lib/smart-validation/smart-validation.module.mjs +0 -24
  292. package/esm2022/lib/smart-validation/smart-validation.types.mjs +0 -4
  293. package/esm2022/lib/view-context/api/api/api.mjs +0 -4
  294. package/esm2022/lib/view-context/api/api/view.service.mjs +0 -903
  295. package/esm2022/lib/view-context/api/api.module.mjs +0 -40
  296. package/esm2022/lib/view-context/api/configuration.mjs +0 -91
  297. package/esm2022/lib/view-context/api/encoder.mjs +0 -19
  298. package/esm2022/lib/view-context/api/index.mjs +0 -7
  299. package/esm2022/lib/view-context/api/model/clipboardData.mjs +0 -13
  300. package/esm2022/lib/view-context/api/model/closeResult.mjs +0 -18
  301. package/esm2022/lib/view-context/api/model/componentConstraint.mjs +0 -2
  302. package/esm2022/lib/view-context/api/model/componentModel.mjs +0 -2
  303. package/esm2022/lib/view-context/api/model/componentModelChange.mjs +0 -13
  304. package/esm2022/lib/view-context/api/model/dataChange.mjs +0 -2
  305. package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +0 -2
  306. package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +0 -21
  307. package/esm2022/lib/view-context/api/model/deviceInfo.mjs +0 -13
  308. package/esm2022/lib/view-context/api/model/downloadedFile.mjs +0 -13
  309. package/esm2022/lib/view-context/api/model/iconPosition.mjs +0 -20
  310. package/esm2022/lib/view-context/api/model/imageResource.mjs +0 -8
  311. package/esm2022/lib/view-context/api/model/link.mjs +0 -20
  312. package/esm2022/lib/view-context/api/model/messageData.mjs +0 -2
  313. package/esm2022/lib/view-context/api/model/messageOption.mjs +0 -2
  314. package/esm2022/lib/view-context/api/model/messageOptionType.mjs +0 -18
  315. package/esm2022/lib/view-context/api/model/messageResult.mjs +0 -2
  316. package/esm2022/lib/view-context/api/model/messageTextType.mjs +0 -17
  317. package/esm2022/lib/view-context/api/model/messageType.mjs +0 -19
  318. package/esm2022/lib/view-context/api/model/models.mjs +0 -54
  319. package/esm2022/lib/view-context/api/model/namedValidator.mjs +0 -19
  320. package/esm2022/lib/view-context/api/model/openPendingData.mjs +0 -2
  321. package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +0 -2
  322. package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +0 -2
  323. package/esm2022/lib/view-context/api/model/serverRequestType.mjs +0 -24
  324. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +0 -2
  325. package/esm2022/lib/view-context/api/model/statisticRecord.mjs +0 -13
  326. package/esm2022/lib/view-context/api/model/style.mjs +0 -13
  327. package/esm2022/lib/view-context/api/model/uiAction.mjs +0 -2
  328. package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +0 -2
  329. package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +0 -27
  330. package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +0 -13
  331. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +0 -2
  332. package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +0 -2
  333. package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +0 -20
  334. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +0 -21
  335. package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +0 -13
  336. package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +0 -22
  337. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +0 -13
  338. package/esm2022/lib/view-context/api/model/uploadedFile.mjs +0 -13
  339. package/esm2022/lib/view-context/api/model/valueSet.mjs +0 -2
  340. package/esm2022/lib/view-context/api/model/view.mjs +0 -2
  341. package/esm2022/lib/view-context/api/model/viewApiError.mjs +0 -13
  342. package/esm2022/lib/view-context/api/model/viewConstraint.mjs +0 -2
  343. package/esm2022/lib/view-context/api/model/viewContext.mjs +0 -2
  344. package/esm2022/lib/view-context/api/model/viewContextChange.mjs +0 -2
  345. package/esm2022/lib/view-context/api/model/viewContextData.mjs +0 -2
  346. package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +0 -2
  347. package/esm2022/lib/view-context/api/model/viewData.mjs +0 -2
  348. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +0 -18
  349. package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +0 -13
  350. package/esm2022/lib/view-context/api/model/viewState.mjs +0 -22
  351. package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +0 -2
  352. package/esm2022/lib/view-context/api/model/viewType.mjs +0 -18
  353. package/esm2022/lib/view-context/api/param.mjs +0 -2
  354. package/esm2022/lib/view-context/api/variables.mjs +0 -9
  355. package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +0 -20
  356. package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +0 -74
  357. package/esm2022/lib/view-context/projects.mjs +0 -19
  358. package/esm2022/lib/view-context/property-definition-data.mjs +0 -2
  359. package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +0 -30
  360. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +0 -63
  361. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +0 -55
  362. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +0 -60
  363. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +0 -97
  364. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +0 -60
  365. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +0 -132
  366. package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +0 -59
  367. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +0 -192
  368. package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +0 -183
  369. package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +0 -7
  370. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +0 -211
  371. package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +0 -83
  372. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +0 -29
  373. package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +0 -75
  374. package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +0 -39
  375. package/esm2022/lib/view-context/smart-view-context.model.mjs +0 -2
  376. package/esm2022/lib/view-context/smart-view-context.module.mjs +0 -327
  377. package/esm2022/lib/view-context/smart-view-context.service.mjs +0 -696
  378. package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +0 -33
  379. package/esm2022/lib/view-context/utility/componentLibrary.mjs +0 -9
  380. package/esm2022/lib/view-context/utility/smart-object-utility.mjs +0 -44
  381. package/esm2022/lib/view-context/utility/smart-style-utility.mjs +0 -68
  382. package/esm2022/lib/view-context/value-api/api/api.mjs +0 -4
  383. package/esm2022/lib/view-context/value-api/api/value.service.mjs +0 -138
  384. package/esm2022/lib/view-context/value-api/api.module.mjs +0 -40
  385. package/esm2022/lib/view-context/value-api/configuration.mjs +0 -91
  386. package/esm2022/lib/view-context/value-api/encoder.mjs +0 -19
  387. package/esm2022/lib/view-context/value-api/index.mjs +0 -7
  388. package/esm2022/lib/view-context/value-api/model/genericValue.mjs +0 -13
  389. package/esm2022/lib/view-context/value-api/model/models.mjs +0 -11
  390. package/esm2022/lib/view-context/value-api/model/value.mjs +0 -13
  391. package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +0 -2
  392. package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +0 -2
  393. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +0 -2
  394. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +0 -13
  395. package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +0 -24
  396. package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +0 -2
  397. package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +0 -2
  398. package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +0 -19
  399. package/esm2022/lib/view-context/value-api/param.mjs +0 -2
  400. package/esm2022/lib/view-context/value-api/variables.mjs +0 -9
  401. package/esm2022/projects.mjs +0 -28
  402. package/esm2022/smartbit4all-ng-client.mjs +0 -5
  403. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartData.mjs +0 -2
  404. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.mjs +0 -2
  405. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartOrientation.mjs +0 -16
  406. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartType.mjs +0 -21
  407. package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartValue.mjs +0 -13
  408. package/esm2022/src/lib/smart-chart/smart-chart/api/model/models.mjs +0 -7
  409. package/esm2022/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.mjs +0 -16
  410. package/esm2022/src/lib/smart-chart/smart-chart/default-chart-options.provider.mjs +0 -233
  411. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.component.mjs +0 -285
  412. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.module.mjs +0 -39
  413. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.mjs +0 -2
  414. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api.module.mjs +0 -40
  415. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/configuration.mjs +0 -91
  416. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/index.mjs +0 -7
  417. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramColor.mjs +0 -13
  418. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataContainer.mjs +0 -2
  419. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataItem.mjs +0 -13
  420. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSet.mjs +0 -2
  421. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.mjs +0 -13
  422. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDescriptor.mjs +0 -2
  423. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramShape.mjs +0 -2
  424. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.mjs +0 -2
  425. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/drawTime.mjs +0 -18
  426. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/labelText.mjs +0 -2
  427. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/models.mjs +0 -11
  428. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/param.mjs +0 -2
  429. package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/variables.mjs +0 -9
  430. package/esm2022/src/lib/smart-chart/smart-chart-projects.mjs +0 -9
  431. package/esm2022/src/lib/smart-chart/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -5
  432. package/esm2022/src/lib/smart-chart/view-context/utility/componentLibrary.mjs +0 -9
  433. package/smartbit4all-ng-client-4.2.34.tgz +0 -0
@@ -1,934 +0,0 @@
1
- import { SelectionModel } from '@angular/cdk/collections';
2
- import { FlatTreeControl } from '@angular/cdk/tree';
3
- import { Component, Inject, Input, ViewChild, ViewContainerRef, } from '@angular/core';
4
- import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree';
5
- import { Subject, takeUntil } from 'rxjs';
6
- import { FilterExpressionOrderBy } from '../smart-filter-editor/api/model/filterExpressionOrderBy';
7
- import { SmartTable, SmartTableButtonType, SmartTableHeaderPropertyType, SmartTableInterfaceTypeEnum, SmartTableOrder, SmartTableType, SmarttableComponent, } from '../smart-table/projects';
8
- import { UiActionButtonType, } from '../view-context/api';
9
- import { COMPONENT_LIBRARY, ComponentLibrary, } from '../view-context/projects';
10
- import { GridSelectionMode, GridSelectionType, GridViewDescriptorKindEnum, } from './api/grid-api';
11
- import { TableLayoutDefinerComponent } from './components/table-layout-definer/table-layout-definer.component';
12
- import { GridUiActionType, SmartGridDataLayout, SmartGridType, SmartLayoutDef, } from './models/model';
13
- import { SmartGridService } from './smart-grid.service';
14
- import { FilterExpressionOrderByOrderEnum } from '../smart-filter/projects';
15
- import * as i0 from "@angular/core";
16
- import * as i1 from "./smart-grid.service";
17
- import * as i2 from "../component-factory-service/projects";
18
- import * as i3 from "@angular/material/dialog";
19
- import * as i4 from "../view-context/projects";
20
- import * as i5 from "@angular/common";
21
- import * as i6 from "../smart-icon/smart-icon/smart-icon.component";
22
- import * as i7 from "@angular/material/icon";
23
- import * as i8 from "@angular/material/button";
24
- import * as i9 from "@angular/material/paginator";
25
- import * as i10 from "@angular/material/tree";
26
- import * as i11 from "@angular/material/checkbox";
27
- import * as i12 from "../smart-expandable-section/expandable-section.component";
28
- import * as i13 from "../view-context/smart-ui-action/ui-action-toolbar.component";
29
- import * as i14 from "../smart-form/widgets/directives/comparable-multiselect.directive";
30
- import * as i15 from "primeng/table";
31
- import * as i16 from "primeng/api";
32
- import * as i17 from "primeng/button";
33
- import * as i18 from "primeng/menu";
34
- import * as i19 from "primeng/tooltip";
35
- import * as i20 from "primeng/paginator";
36
- import * as i21 from "@angular/forms";
37
- import * as i22 from "primeng/multiselect";
38
- import * as i23 from "./components/smart-grid-card/smart-grid-card.component";
39
- export class SmartGridComponent {
40
- constructor(service, cfService, dialog, injector, uiActionDescriptorService, compLib, gridMenuIcon) {
41
- this.service = service;
42
- this.cfService = cfService;
43
- this.dialog = dialog;
44
- this.injector = injector;
45
- this.uiActionDescriptorService = uiActionDescriptorService;
46
- this.compLib = compLib;
47
- this.gridMenuIcon = gridMenuIcon;
48
- // private readonly defaultPageSize: number = 10;
49
- this.defaultPageSizeOptions = [5, 10, 25, 50];
50
- this.componentLibrary = ComponentLibrary;
51
- this._destroy$ = new Subject();
52
- this.dev = false;
53
- this.selectedRows = [];
54
- this.pageSizeOptions = this.defaultPageSizeOptions;
55
- this.selectionChanges = new Subject();
56
- this.uiActionDescriptors = new Map();
57
- this.afterViewInitExecuted = false;
58
- this.isBlocked = true;
59
- this.getLevel = (node) => node.level ?? 0;
60
- this.isExpandable = (node) => (node.children && node.children.length > 0 ? true : false);
61
- this.getChildren = (node) => {
62
- if (node.children) {
63
- let rows = this.smartGrid?.gridModel.page.rows?.filter((row) => node.children?.some((child) => child === row.id));
64
- if (rows) {
65
- return rows;
66
- }
67
- }
68
- return [];
69
- };
70
- this.hasChild = (_, _nodeData) => this.isExpandable(_nodeData);
71
- this.transformer = (row, level) => {
72
- row.level = level;
73
- return row;
74
- };
75
- //PRIMENG
76
- this.columns = [];
77
- this.service.gridModelChanged.subscribe(() => {
78
- // called after every service call (load, save, refresh, etc.)
79
- this.smartGrid.gridModel = this.service.gridModel;
80
- this.render();
81
- });
82
- }
83
- ngOnChanges(changes) {
84
- if (changes['smartGrid']) {
85
- this.smartGrid = changes['smartGrid'].currentValue;
86
- this.service.paginator = this.smartGrid?.paginator;
87
- this.setupToolbar();
88
- }
89
- if (changes['uuid']) {
90
- this.uuid = changes['uuid'].currentValue;
91
- }
92
- if (this.afterViewInitExecuted && this.uuid && this.smartGrid) {
93
- this.refresh();
94
- }
95
- }
96
- ngOnDestroy() {
97
- this._destroy$.next();
98
- this._destroy$.complete();
99
- }
100
- ngAfterViewInit() {
101
- if (this.dev) {
102
- // for dev purposes
103
- if (this.smartGrid.gridModel) {
104
- this.service.gridModel = this.smartGrid.gridModel;
105
- this.render();
106
- }
107
- }
108
- if (this.uuid && this.smartGrid && !this.dev) {
109
- this.refresh();
110
- }
111
- this.afterViewInitExecuted = true;
112
- }
113
- /**
114
- *
115
- * @returns the selected rows of the table
116
- */
117
- getSelectedRows() {
118
- if (!this.smartTable.selection)
119
- throw new Error();
120
- return this.smartTable.selection;
121
- }
122
- /**
123
- * This method sends a GET request to the generic GridAPI and refreshes the presented
124
- * grid with the newest one.
125
- */
126
- async refresh() {
127
- this.setupToolbar();
128
- // will cause this.service.gridModelChanged to fire
129
- if (this.uuid) {
130
- await this.service.load(this.uuid, this.smartGrid.gridIdentifier);
131
- }
132
- }
133
- setupToolbar() {
134
- // check if toolbar is available _and_ need set up
135
- if (this.toolbar && this.smartGrid) {
136
- let toolbarId = this.smartGrid?.gridIdentifier + '_toolbar';
137
- if (toolbarId !== this.toolbar.id) {
138
- this.toolbar.id = toolbarId;
139
- }
140
- }
141
- }
142
- async render() {
143
- const gridModel = this.smartGrid?.gridModel;
144
- if (gridModel) {
145
- this.length = gridModel.totalRowCount;
146
- this.pageSize = gridModel.pageSize;
147
- this.pageIndex = gridModel.pageIndex ?? 0;
148
- if (gridModel.pageSizeOptions && gridModel.pageSizeOptions.length > 0) {
149
- this.pageSizeOptions = gridModel.pageSizeOptions;
150
- }
151
- else {
152
- this.pageSizeOptions = this.defaultPageSizeOptions;
153
- }
154
- if (gridModel?.view?.descriptor?.showEditColumns) {
155
- this.smartGrid.showEditColumns = gridModel?.view?.descriptor?.showEditColumns;
156
- }
157
- let kind = gridModel?.view?.descriptor?.kind;
158
- if (kind) {
159
- let layoutDef;
160
- if (kind === GridViewDescriptorKindEnum.TABLE) {
161
- layoutDef = SmartLayoutDef.TABLE;
162
- }
163
- else if (kind === GridViewDescriptorKindEnum.TREE) {
164
- layoutDef = SmartLayoutDef.TREE;
165
- }
166
- else if (kind === GridViewDescriptorKindEnum.CARDS) {
167
- layoutDef = SmartLayoutDef.CARD;
168
- }
169
- if (layoutDef) {
170
- this.smartGrid.layoutDef = layoutDef;
171
- }
172
- }
173
- if (gridModel?.paginator === true || gridModel?.paginator === false) {
174
- this.smartGrid.paginator = gridModel.paginator;
175
- this.service.paginator = this.smartGrid.paginator;
176
- }
177
- }
178
- else {
179
- console.error('GridModel is undefined in component!');
180
- }
181
- if (!this.smartGrid.layoutDef) {
182
- // fallback, default TABLE
183
- this.smartGrid.layoutDef = SmartLayoutDef.TABLE;
184
- }
185
- if (this.smartGrid.layoutDef === SmartLayoutDef.TABLE) {
186
- this.renderTable();
187
- }
188
- else if (this.smartGrid.layoutDef === SmartLayoutDef.EXPANDABLE) {
189
- this.renderExpandableSections();
190
- }
191
- else if (this.smartGrid.layoutDef === SmartLayoutDef.CARD) {
192
- this.renderCards();
193
- }
194
- else if (this.smartGrid.layoutDef === SmartLayoutDef.TREE) {
195
- this.renderTree();
196
- }
197
- this.isBlocked = false;
198
- }
199
- clearTable() {
200
- this.vcRefTable?.clear();
201
- this.componentRefTable = undefined;
202
- }
203
- async renderTable() {
204
- this.clearTree();
205
- if (this.compLib === this.componentLibrary.PRIMENG) {
206
- this.pageIndex = this.smartGrid?.gridModel.pageSize * this.smartGrid?.gridModel.pageIndex;
207
- this.columns = [];
208
- this.smartGrid?.gridModel.view?.orderedColumnNames.map((orderedCol) => {
209
- this.smartGrid?.gridModel.view?.descriptor?.columns.map((colum) => {
210
- if (orderedCol === colum.propertyName) {
211
- this.columns.push(colum);
212
- }
213
- });
214
- });
215
- }
216
- let tableRow = this.smartGrid.gridModel.page.rows.map((item) => {
217
- return item;
218
- });
219
- if (!tableRow.length) {
220
- let placeHolderRow = {};
221
- this.smartGrid.gridModel.view?.descriptor?.columns.map((meta) => {
222
- placeHolderRow[meta.propertyName] = undefined;
223
- });
224
- this.smartGrid.gridModel.page.rows = [placeHolderRow];
225
- }
226
- if (this.smartGrid.tableConfig?.tableType) {
227
- this.tableType = this.smartGrid.tableConfig.tableType;
228
- }
229
- else if (this.service.gridModel?.view?.descriptor?.selectionType) {
230
- this.tableType =
231
- this.service.gridModel.view.descriptor.selectionType === GridSelectionType.CHECKBOX
232
- ? SmartTableType.CHECK_BOX
233
- : SmartTableType.ROW_SELECT;
234
- }
235
- else {
236
- this.tableType = SmartTableType.INHERITED;
237
- }
238
- if (this.smartGrid.layoutDef === SmartLayoutDef.TABLE) {
239
- let tableConfig = {
240
- ...this.smartGrid.tableConfig,
241
- tableRows: tableRow,
242
- tableType: this.tableType,
243
- customSmartTableHeaders: await this.constructHeader(),
244
- expandable: this.smartGrid.expandable,
245
- expandedComponent: this.smartGrid.expandedComponent,
246
- type: SmartTableInterfaceTypeEnum.NORMAL,
247
- sortable: true,
248
- defaultActionCodes: this.smartGrid?.gridModel.defaultRowActions,
249
- defaultActions: this.smartGrid?.gridModel.defaultRowActions?.map((code) => {
250
- return {
251
- type: code === '_actionSeparator_'
252
- ? SmartTableButtonType.SEPARATOR
253
- : SmartTableButtonType.NORMAL,
254
- callback: this.execute.bind(this),
255
- code: code,
256
- // label: this.buttonTranslator({ code: code }),
257
- translator: this.buttonTranslator.bind(this),
258
- // args: [
259
- // {
260
- // code: code,
261
- // },
262
- // ],
263
- };
264
- }),
265
- };
266
- if (this.smartGrid?.gridModel.view?.descriptor?.highlightProperty &&
267
- this.smartGrid?.gridModel.view?.descriptor?.highlightClass) {
268
- tableConfig.highlightClass = this.smartGrid.gridModel.view.descriptor.highlightClass;
269
- tableConfig.highlightProperty = this.smartGrid.gridModel.view.descriptor.highlightProperty;
270
- }
271
- if (this.smartGrid.uiActionService &&
272
- this.smartGrid.uiActionDescriptorService &&
273
- this.smartGrid.serviceToUse &&
274
- this.smartGrid.viewContextService) {
275
- tableConfig.onSelection = this.onSelect.bind(this);
276
- tableConfig.onAllSelection = this.onSelectAll.bind(this);
277
- }
278
- // Prepared for simple clicks
279
- // if (!tableConfig.onRowClick) {
280
- // tableConfig.onRowClick = this.onClick.bind(this);
281
- // }
282
- if (!tableConfig.onRowDoubleClick) {
283
- tableConfig.onRowDoubleClick = this.onDoubleClick.bind(this);
284
- }
285
- if (!tableConfig.isRowDisabledPropertyName) {
286
- tableConfig.selectablePropertyName = 'selectable';
287
- }
288
- if (tableConfig.asyncOnExpand) {
289
- tableConfig.rowExpander = this;
290
- }
291
- const selectionMode = this.service.gridModel.view?.descriptor?.selectionMode;
292
- if (!tableConfig.selection &&
293
- !tableConfig.selectionProperty &&
294
- selectionMode !== GridSelectionMode.NONE) {
295
- this.isMultiple = selectionMode === GridSelectionMode.MULTIPLE;
296
- tableConfig.selectionProperty = 'id';
297
- let selectedIds;
298
- this.selectedRows = this.service.gridModel.page.rows.filter((gridRow) => gridRow.selected);
299
- selectedIds = this.selectedRows.map((gridRow) => gridRow.id);
300
- tableConfig.selection = new SelectionModel(this.isMultiple, selectedIds);
301
- tableConfig.showCheckboxInHeader =
302
- typeof tableConfig.showCheckboxInHeader !== 'undefined'
303
- ? tableConfig.showCheckboxInHeader // keep if set
304
- : this.isMultiple; //if unset, turn it on for multiple selection
305
- }
306
- this.smartTable = new SmartTable(tableConfig);
307
- if (this.componentRefTable) {
308
- this.componentRefTable.instance.updateSmartTable(this.smartTable);
309
- }
310
- else {
311
- this.vcRefTable?.clear();
312
- if (!this.vcRefTable) {
313
- return;
314
- }
315
- this.componentRefTable = this.cfService.createComponent(this.vcRefTable, SmarttableComponent, new Map([['smartTable', this.smartTable]]));
316
- let subscription = this.componentRefTable.instance.sortEvent
317
- .pipe(takeUntil(this.componentRefTable.instance._destroy$))
318
- .subscribe((header) => {
319
- header.propertyName = header.propertyName.substring(5);
320
- switch (header.order) {
321
- case undefined:
322
- header.order = SmartTableOrder.ASC;
323
- break;
324
- case SmartTableOrder.ASC:
325
- header.order = SmartTableOrder.DESC;
326
- break;
327
- case SmartTableOrder.DESC:
328
- header.order = undefined;
329
- break;
330
- }
331
- let filter = this.smartGrid.gridModel.view.orderByList.find((filterExpression) => filterExpression.propertyName === header.propertyName);
332
- if (filter && !header.order) {
333
- let index = this.smartGrid.gridModel.view?.orderByList.indexOf(filter);
334
- this.smartGrid.gridModel.view?.orderByList.splice(index, 1);
335
- }
336
- else if (filter) {
337
- filter.order = header.order;
338
- }
339
- else {
340
- this.smartGrid.gridModel.view.orderByList.push({
341
- order: header.order,
342
- propertyName: header.propertyName,
343
- });
344
- }
345
- let gridUpdateData = {
346
- orderByList: this.smartGrid.gridModel.view.orderByList,
347
- orderedColumnNames: this.smartGrid.gridModel.view.orderedColumnNames,
348
- };
349
- this.service.sort(this.smartGrid, gridUpdateData);
350
- });
351
- this.componentRefTable.instance.smartTable.selection?.changed
352
- .pipe(takeUntil(this.componentRefTable.instance._destroy$))
353
- .subscribe((row) => {
354
- this.selectionChanges.next(row);
355
- });
356
- }
357
- }
358
- }
359
- expand(rowId) { }
360
- async expandAsync(rowIndex) {
361
- if (this.smartGrid.gridModel.page.rows) {
362
- let row = this.smartGrid.gridModel.page.rows[rowIndex];
363
- if (row && row.id) {
364
- return await this.service.expand(this.smartGrid, row.id);
365
- }
366
- }
367
- return await this.service.expand(this.smartGrid, rowIndex.toString());
368
- }
369
- renderExpandableSections() {
370
- this.expandableSections = this.smartGrid.gridModel.page.rows.map((item) => {
371
- return {
372
- title: '',
373
- headerComponent: this.smartGrid.headerComponent,
374
- headerInputName: this.smartGrid.headerComponentInputName,
375
- headerData: item,
376
- customComponent: this.smartGrid.expandableComponent,
377
- inputName: this.smartGrid.expandableComponentInputName,
378
- data: item,
379
- };
380
- });
381
- }
382
- renderCards() {
383
- if (!this.smartGrid.customComponent) {
384
- let datalayoutDef = {
385
- dataLayout: SmartGridDataLayout.COLUMN,
386
- gridLayout: SmartGridDataLayout.COLUMN,
387
- type: SmartGridType.CUSTOM,
388
- };
389
- this.smartGrid.dataLayoutDef = datalayoutDef;
390
- this.smartGrid.customComponent = this.injector.get(this.smartGrid.gridIdentifier + 'Card');
391
- }
392
- }
393
- isMultipleSelection() {
394
- const selectionMode = this.service.gridModel.view?.descriptor?.selectionMode;
395
- return selectionMode === GridSelectionMode.MULTIPLE;
396
- }
397
- clearTree() {
398
- this.treeControl = undefined;
399
- this.treeDataSource = undefined;
400
- this.treeFlattener = undefined;
401
- this.treeChecklistSelection = undefined;
402
- }
403
- renderTree() {
404
- this.clearTable();
405
- if (!this.treeDataSource) {
406
- this.treeFlattener = new MatTreeFlattener(this.transformer, this.getLevel, this.isExpandable, this.getChildren);
407
- this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable);
408
- this.treeDataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
409
- this.treeChecklistSelection = new SelectionModel(this.isMultipleSelection());
410
- }
411
- let nodes = this.treeControl?.dataNodes;
412
- let expandedNodes;
413
- if (nodes) {
414
- expandedNodes = nodes
415
- .filter((node) => this.treeControl?.isExpandable(node))
416
- .filter((node) => this.treeControl?.isExpanded(node))
417
- .map((node) => node.id);
418
- }
419
- else {
420
- expandedNodes = [];
421
- }
422
- this.smartGrid.gridModel.page.rows.forEach((row) => (row.level = undefined));
423
- this.treeDataSource.data = this.smartGrid.gridModel.page.rows.filter((row) => !row.parent);
424
- this.treeChecklistSelection?.clear();
425
- this.treeControl?.dataNodes.forEach((node) => {
426
- if (node.selected) {
427
- this.treeChecklistSelection?.select(node);
428
- }
429
- });
430
- this.treeControl?.collapseAll();
431
- expandedNodes.forEach((rowId) => {
432
- let row = this.treeControl?.dataNodes.find((row) => rowId === row.id);
433
- if (row) {
434
- this.treeControl?.expand(row);
435
- }
436
- });
437
- }
438
- getTreeItem(row) {
439
- let columns = this.smartGrid?.gridModel.view?.orderedColumnNames;
440
- let data = row.data;
441
- if (columns && columns.length > 0) {
442
- return columns.map((col) => data[col]).join(' ');
443
- }
444
- return row.id;
445
- }
446
- /** Toggle the treeNode selection. Select/deselect all the descendants node */
447
- treeNodeSelectionToggle(node) {
448
- if (!this.treeChecklistSelection) {
449
- return;
450
- }
451
- let selectionBefore = this.treeChecklistSelection.selected.map((row) => row.id);
452
- this.treeChecklistSelection.toggle(node);
453
- if (this.isMultipleSelection()) {
454
- const descendants = this.treeControl.getDescendants(node);
455
- this.treeChecklistSelection.isSelected(node)
456
- ? this.treeChecklistSelection.select(...descendants)
457
- : this.treeChecklistSelection.deselect(...descendants);
458
- this.checkAllParentsSelection(node);
459
- }
460
- let selectionAfter = this.treeChecklistSelection.selected.map((row) => row.id);
461
- let selectedIds = selectionAfter.filter((s) => !selectionBefore.includes(s));
462
- let unselectedIds = selectionBefore.filter((s) => !selectionAfter.includes(s));
463
- if (this.dev) {
464
- // when service call is active (!dev), onSelect will toggle row.selected
465
- this.service.gridModel.page.rows
466
- ?.filter((row) => selectedIds.includes(row.id))
467
- .forEach((row) => (row.selected = true));
468
- this.service.gridModel.page.rows
469
- ?.filter((row) => unselectedIds.includes(row.id))
470
- .forEach((row) => (row.selected = false));
471
- }
472
- this.onSelectRows(selectedIds, unselectedIds);
473
- }
474
- checkAllParentsSelection(node) {
475
- let parent = this.getParentNode(node);
476
- while (parent) {
477
- this.checkParentNodeSelection(parent);
478
- parent = this.getParentNode(parent);
479
- }
480
- }
481
- checkParentNodeSelection(node) {
482
- if (!this.treeChecklistSelection) {
483
- return;
484
- }
485
- const nodeSelected = this.treeChecklistSelection.isSelected(node);
486
- const descAllSelected = this.descendantsAllSelected(node);
487
- if (nodeSelected && !descAllSelected) {
488
- this.treeChecklistSelection.deselect(node);
489
- }
490
- else if (!nodeSelected && descAllSelected) {
491
- this.treeChecklistSelection.select(node);
492
- }
493
- }
494
- /* Get the parent node of a node */
495
- getParentNode(node) {
496
- const currentLevel = this.getLevel(node);
497
- if (currentLevel < 1) {
498
- return null;
499
- }
500
- const startIndex = this.treeControl.dataNodes.indexOf(node) - 1;
501
- for (let i = startIndex; i >= 0; i--) {
502
- const currentNode = this.treeControl.dataNodes[i];
503
- if (this.getLevel(currentNode) < currentLevel) {
504
- return currentNode;
505
- }
506
- }
507
- return null;
508
- }
509
- /** Whether all the descendants of the node are selected. */
510
- descendantsAllSelected(node) {
511
- if (!this.treeControl || !this.treeChecklistSelection) {
512
- return false;
513
- }
514
- const descendants = this.treeControl.getDescendants(node);
515
- const descAllSelected = descendants.length > 0 &&
516
- descendants.every((child) => {
517
- return this.treeChecklistSelection.isSelected(child);
518
- });
519
- return descAllSelected;
520
- }
521
- /** Whether part of the descendants are selected */
522
- descendantsPartiallySelected(node) {
523
- if (!this.treeControl || !this.treeChecklistSelection) {
524
- return false;
525
- }
526
- const descendants = this.treeControl.getDescendants(node);
527
- let result = descendants.some((child) => this.treeChecklistSelection.isSelected(child));
528
- if (this.isMultipleSelection()) {
529
- result = result && !this.descendantsAllSelected(node);
530
- }
531
- return result;
532
- }
533
- async constructHeader() {
534
- if (this.smartGrid.gridModel.page.rows && this.smartGrid.gridModel.page.rows.length) {
535
- await Promise.all(this.smartGrid.gridModel.page.rows.map(async (gridRow) => {
536
- let newUiActions = gridRow.actions?.filter((uiAction) => !this.uiActionDescriptors.get(uiAction.code));
537
- if (newUiActions) {
538
- await Promise.all(newUiActions.map(async (uiAction) => {
539
- let descriptor = await this.smartGrid.uiActionDescriptorService?.getActionDescriptor(uiAction);
540
- if (!descriptor) {
541
- descriptor = {
542
- title: uiAction.code ?? 'CODE',
543
- color: 'primary',
544
- type: UiActionButtonType.NORMAL,
545
- };
546
- }
547
- this.uiActionDescriptors.set(uiAction.code, descriptor);
548
- }));
549
- }
550
- }));
551
- }
552
- let orederedDescColumns = this.smartGrid.gridModel.view.orderedColumnNames.map((propertyName) => this.smartGrid.gridModel.view.descriptor.columns.find((colDescriptor) => colDescriptor.propertyName === propertyName)).flatMap((f) => f ?? []);
553
- let header = await Promise.all(orederedDescColumns.map(async (descColumn) => {
554
- let customTableHeader = this.smartGrid.tableConfig?.customSmartTableHeaders?.find((header) => header.propertyName === descColumn.propertyName);
555
- let filterExpressionOrderByItem = this.smartGrid.gridModel.view?.orderByList?.find((filterExpression) => filterExpression.propertyName === descColumn.propertyName);
556
- let order;
557
- let orderNumber;
558
- if (filterExpressionOrderByItem) {
559
- order =
560
- filterExpressionOrderByItem.order === FilterExpressionOrderBy.OrderEnum.Asc
561
- ? SmartTableOrder.ASC
562
- : SmartTableOrder.DESC;
563
- if (this.service.gridModel.view.orderByList.length > 1) {
564
- orderNumber = this.service.gridModel.view.orderByList.findIndex((filter) => filter.propertyName === descColumn.propertyName);
565
- orderNumber++;
566
- }
567
- }
568
- const orignalLabel = customTableHeader?.label ?? descColumn.label;
569
- let label = '';
570
- if (!descColumn.hideLabel) {
571
- if (this.smartGrid.translateService) {
572
- label = await this.smartGrid.translateService?.get(orignalLabel).toPromise();
573
- }
574
- else {
575
- label = orignalLabel;
576
- }
577
- }
578
- let properties = customTableHeader?.properties;
579
- if (!properties) {
580
- if (descColumn.typeClass === 'java.time.OffsetDateTime' ||
581
- descColumn.typeClass === 'java.time.LocalDateTime') {
582
- let dateFormat = descColumn.typeFormat ?? 'yyyy.MM.dd H:mm';
583
- properties = {
584
- type: SmartTableHeaderPropertyType.DATETIME,
585
- dateFormat,
586
- };
587
- }
588
- else if (descColumn.typeClass === 'java.time.LocalDate') {
589
- let dateFormat = descColumn.typeFormat ?? 'yyyy.MM.dd';
590
- properties = {
591
- type: SmartTableHeaderPropertyType.DATE,
592
- dateFormat,
593
- };
594
- }
595
- else if (descColumn.typeClass === 'java.time.LocalTime') {
596
- let dateFormat = descColumn.typeFormat ?? 'H:mm';
597
- properties = {
598
- type: SmartTableHeaderPropertyType.TIME,
599
- dateFormat,
600
- };
601
- }
602
- else if (descColumn.typeClass === 'java.lang.Boolean') {
603
- properties = {
604
- type: SmartTableHeaderPropertyType.CHECKBOX,
605
- };
606
- }
607
- }
608
- return {
609
- ...customTableHeader,
610
- label: label,
611
- propertyName: 'data.' + descColumn.propertyName,
612
- order,
613
- orderNumber,
614
- properties,
615
- style: descColumn.style,
616
- };
617
- }));
618
- let complement = this.smartGrid.tableConfig?.customSmartTableHeaders?.filter((tableHeader) => !header.some((tH) => tH.propertyName.includes(tableHeader.propertyName)));
619
- if (complement) {
620
- header.push(...complement);
621
- }
622
- if (this.smartGrid.options?.simpleButtons) {
623
- this.smartGrid.options.simpleButtons.forEach((uiActionCode) => {
624
- header.push({
625
- label: '',
626
- propertyName: 'simple_buttons',
627
- buttons: [
628
- {
629
- type: SmartTableButtonType.RAISED,
630
- callback: this.execute.bind(this),
631
- // label: this.buttonTranslator({ code: uiActionCode }),
632
- args: [
633
- {
634
- code: uiActionCode,
635
- },
636
- ],
637
- color: 'primary',
638
- showButtonIf: (row) => row.actions.some((item) => {
639
- return item.code === uiActionCode;
640
- }),
641
- },
642
- ],
643
- });
644
- });
645
- }
646
- if (!header.some((header) => header.propertyName === 'my_menu')) {
647
- if (this.smartGrid.options?.rowUiActionType === GridUiActionType.POPUP_MENU) {
648
- let icon = this.gridMenuIcon ?? 'more_vert';
649
- header.push({
650
- label: '',
651
- propertyName: 'my_menu',
652
- buttons: [
653
- {
654
- type: SmartTableButtonType.MENU,
655
- callback: this.execute.bind(this),
656
- icon: icon,
657
- menuItemButtonsPropertyName: 'actions',
658
- translator: this.buttonTranslator.bind(this),
659
- args: [],
660
- },
661
- ],
662
- isSortable: false,
663
- });
664
- }
665
- }
666
- return header;
667
- }
668
- async onChangePage(event) {
669
- let offset = event.pageSize * event.pageIndex;
670
- let limit = event.pageSize;
671
- this.pageIndex = event.pageIndex;
672
- await this.service.setPage(this.smartGrid.gridModel.viewUuid, this.smartGrid.gridIdentifier, offset.toString(), limit.toString());
673
- }
674
- async onPrimeChangePage(event) {
675
- let offset = event.first;
676
- let limit = event.rows;
677
- this.pageIndex = event.first;
678
- await this.service.setPage(this.smartGrid.gridModel.viewUuid, this.smartGrid.gridIdentifier, offset.toString(), limit.toString());
679
- }
680
- async execute(args, row, uiAction) {
681
- let _uiAction;
682
- if (!uiAction) {
683
- uiAction = row.actions.filter((action) => action.code === args[0].code)[0];
684
- }
685
- _uiAction = { ...uiAction };
686
- if (_uiAction.disabled) {
687
- return;
688
- }
689
- _uiAction.params = {
690
- ...uiAction.params,
691
- model: row,
692
- };
693
- let uiActionModel = {
694
- serviceToUse: this.smartGrid.serviceToUse,
695
- uiAction: _uiAction,
696
- };
697
- if (this.smartGrid.options?.uiActionModelCallback) {
698
- uiActionModel = this.smartGrid.options.uiActionModelCallback(uiActionModel);
699
- }
700
- this.smartGrid.uiActionService.uiActionModel = uiActionModel;
701
- this.smartGrid.uiActionService.execute(_uiAction, {
702
- widgetId: this.smartGrid.gridIdentifier,
703
- nodeId: row.id,
704
- });
705
- }
706
- buttonTranslator(uiAction) {
707
- let desc = this.uiActionDescriptors.get(uiAction.code);
708
- if (!desc) {
709
- desc = {
710
- title: uiAction.code,
711
- type: UiActionButtonType.FLAT,
712
- color: 'primary',
713
- };
714
- }
715
- if (uiAction.descriptor) {
716
- this.uiActionDescriptorService.mergeActionDescriptorIntoClient(uiAction.descriptor, desc);
717
- }
718
- return desc;
719
- }
720
- layoutDef() {
721
- return SmartLayoutDef;
722
- }
723
- onClick(gridRow) {
724
- this.handleOnClick(gridRow);
725
- }
726
- onDoubleClick(gridRow) {
727
- this.handleOnClick(gridRow);
728
- }
729
- handleOnClick(gridRow) {
730
- let defaultRowAction;
731
- if (this.service.gridModel?.defaultRowActions) {
732
- for (let index = 0; index < this.service.gridModel.defaultRowActions.length; index++) {
733
- const defaultRowActionCode = this.service.gridModel.defaultRowActions[index];
734
- defaultRowAction = gridRow.actions.find((uiAction) => uiAction.code === defaultRowActionCode);
735
- if (defaultRowAction) {
736
- this.execute([], gridRow, defaultRowAction);
737
- return;
738
- }
739
- }
740
- }
741
- }
742
- async onSelect(rowId) {
743
- this.isBlocked = true;
744
- if (this.dev) {
745
- this.render();
746
- }
747
- else {
748
- const row = this.service.gridModel.page.rows?.find((gridRow) => gridRow.id === rowId);
749
- const viewContextChange = await this.service.select(this.smartGrid, row);
750
- this.smartGrid.viewContextService.handlePerformActionResponse(viewContextChange);
751
- this.refresh();
752
- }
753
- }
754
- async onSelectAll(selected) {
755
- this.isBlocked = true;
756
- const viewContextChange = await this.service.selectAll(this.smartGrid, selected);
757
- this.smartGrid.viewContextService.handlePerformActionResponse(viewContextChange);
758
- this.refresh();
759
- }
760
- async onSelectRows(selectedIds, unselectedIds) {
761
- this.isBlocked = true;
762
- if (this.dev) {
763
- this.render();
764
- }
765
- else {
766
- let selected = selectedIds.filter((item) => item !== undefined);
767
- let unselected = unselectedIds.filter((item) => item !== undefined);
768
- const viewContextChange = await this.service.selectRows(this.smartGrid, selected, unselected);
769
- this.smartGrid.viewContextService.handlePerformActionResponse(viewContextChange);
770
- this.refresh();
771
- }
772
- }
773
- async onRowSelect(event) {
774
- await this.onSelect(event.data.id);
775
- }
776
- async onRowUnselect(event) {
777
- await this.onSelect(event.data.id);
778
- }
779
- async onSelectAllRow(event) {
780
- await this.onSelectAll(event.checked);
781
- }
782
- editColumns() {
783
- let dialogData = {
784
- content: {
785
- title: 'Oszlopok testreszabása',
786
- },
787
- size: {},
788
- customComponent: TableLayoutDefinerComponent,
789
- customComponentInputs: {
790
- config: {
791
- uuid: this.uuid,
792
- identifier: this.smartGrid.gridIdentifier,
793
- view: this.service.gridModel.view,
794
- service: this.service,
795
- },
796
- },
797
- };
798
- this.dialog.open(TableLayoutDefinerComponent, { data: dialogData });
799
- }
800
- onOptionsClick(event, row) {
801
- this.menuButtons = [];
802
- row.actions?.map(async (uiAction) => {
803
- let desc = await this.uiActionDescriptorService.getActionDescriptor(uiAction);
804
- this.menuButtons.push({
805
- label: desc?.title ?? uiAction.code,
806
- icon: '',
807
- command: () => {
808
- this.execute([], row, uiAction);
809
- },
810
- });
811
- });
812
- this.menu.toggle(event);
813
- }
814
- async gridSort(event) {
815
- let orderByList = [];
816
- event.multisortmeta?.map((meta, index) => {
817
- if (this.previousmultiSortMeta && this.previousmultiSortMeta.length > 0) {
818
- this.previousmultiSortMeta.map((order) => {
819
- if (meta.field === order.field && order.order != meta.order) {
820
- switch (order.order) {
821
- case -1:
822
- event.multisortmeta.splice(index, 1);
823
- break;
824
- }
825
- }
826
- });
827
- }
828
- else {
829
- this.previousmultiSortMeta = event.multisortmeta;
830
- }
831
- });
832
- event.multisortmeta?.map((meta) => {
833
- orderByList.push({
834
- propertyName: meta.field,
835
- order: meta.order === 1
836
- ? FilterExpressionOrderByOrderEnum.ASC
837
- : meta.order === -1
838
- ? FilterExpressionOrderByOrderEnum.DESC
839
- : undefined,
840
- });
841
- });
842
- await this.service.sort(this.smartGrid, {
843
- orderByList: orderByList,
844
- orderedColumnNames: this.smartGrid?.gridModel.view?.orderedColumnNames,
845
- });
846
- }
847
- lazyLoad(event) {
848
- this.previousmultiSortMeta = [];
849
- this.smartGrid?.gridModel.view?.orderByList.map((order) => {
850
- this.previousmultiSortMeta?.push({
851
- field: order.propertyName,
852
- order: order.order === FilterExpressionOrderByOrderEnum.ASC ? 1 : -1,
853
- });
854
- });
855
- event.multiSortMeta = this.previousmultiSortMeta;
856
- }
857
- async headerChange(event) {
858
- let gridUpdateData = {
859
- orderByList: this.smartGrid.gridModel.view.orderByList,
860
- orderedColumnNames: this.getOrderColumNames(event.value),
861
- };
862
- await this.service.update(this.uuid, this.smartGrid?.gridIdentifier, gridUpdateData);
863
- }
864
- async onColOrder(event) {
865
- let gridUpdateData = {
866
- orderByList: this.smartGrid.gridModel.view.orderByList,
867
- orderedColumnNames: this.getOrderColumNames(event.columns),
868
- };
869
- await this.service.update(this.uuid, this.smartGrid.gridIdentifier, gridUpdateData);
870
- }
871
- getOrderColumNames(columns) {
872
- return columns.map((colum) => {
873
- return colum.propertyName;
874
- });
875
- }
876
- getColValue(col, row) {
877
- if (row.icons[col]) {
878
- return;
879
- }
880
- if (col.includes('.')) {
881
- let pathArray = col.split('.');
882
- let colValue = row.data;
883
- pathArray.map((path) => {
884
- if (colValue == undefined) {
885
- colValue = row.data[col];
886
- return;
887
- }
888
- else {
889
- colValue = colValue[path];
890
- }
891
- });
892
- return colValue;
893
- }
894
- return row.data[col];
895
- }
896
- getImageResourceIcons(row, header) {
897
- if (row?.icons) {
898
- let iconCodes = row?.icons[header];
899
- return iconCodes;
900
- }
901
- return [];
902
- }
903
- getImageResourceStyle(resource) {
904
- return resource.style ? resource.style : {};
905
- }
906
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartGridComponent, deps: [{ token: i1.SmartGridService }, { token: i2.ComponentFactoryService }, { token: i3.MatDialog }, { token: i0.Injector }, { token: i4.UiActionDescriptorService }, { token: COMPONENT_LIBRARY }, { token: 'gridMenuIcon' }], target: i0.ɵɵFactoryTarget.Component }); }
907
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SmartGridComponent, selector: "smart-grid", inputs: { smartGrid: "smartGrid", uuid: "uuid", dev: "dev" }, providers: [SmartGridService], viewQueries: [{ propertyName: "vcRefTable", first: true, predicate: ["table"], descendants: true, read: ViewContainerRef }, { propertyName: "toolbar", first: true, predicate: ["toolbar"], descendants: true }, { propertyName: "menu", first: true, predicate: ["menu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if(compLib === componentLibrary.PRIMENG) {\r\n<div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n </div>\r\n <p-table\r\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\r\n #pTable\r\n [value]=\"smartGrid.gridModel.page.rows!\"\r\n (onSort)=\"gridSort($event)\"\r\n [customSort]=\"true\"\r\n [sortMode]=\"'multiple'\"\r\n [lazy]=\"true\"\r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\r\n [columns]=\"columns\"\r\n (onColReorder)=\"onColOrder($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\"\r\n [selection]=\"selectedRows\"\r\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\r\n dataKey=\"id\"\r\n >\r\n <ng-container *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <ng-template pTemplate=\"caption\">\r\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <p-multiSelect\r\n display=\"chip\"\r\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\r\n optionLabel=\"label\"\r\n [(ngModel)]=\"columns\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ 'min-width': '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n (onChange)=\"headerChange($event)\"\r\n />\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template pTemplate=\"header\">\r\n <tr *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\" pReorderableColumn>\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n <th></th>\r\n </tr>\r\n <tr *ngIf=\"!smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\">\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n <th></th>\r\n </tr>\r\n <!-- <tr>\r\n <th *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <p-columnFilter\r\n type=\"text\"\r\n [field]=\"'data.' + col\"\r\n [placeholder]=\"'Search by ' + col\"\r\n [ariaLabel]=\"'Filter ' + col\"\r\n />\r\n </th>\r\n </tr> -->\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row>\r\n <tr (dblclick)=\"onDoubleClick(row)\" *ngIf=\"row && row.data\">\r\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\r\n </td>\r\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableRadioButton [value]=\"row\" />\r\n </td>\r\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <div *ngIf=\"row.icons[col]\">\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\r\n <div\r\n pTooltip=\"{{ ir.tooltip?.tooltip }}\"\r\n tooltipPosition=\"right\"\r\n placeholder=\"Right\"\r\n [ngStyle]=\"getImageResourceStyle(ir)\"\r\n ><smart-icon [icon]=\"ir.identifier!\" [color]=\"ir.color!\"> </smart-icon\r\n ></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\r\n </td>\r\n <td class=\"menu-button\">\r\n <p-button\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n *ngIf=\"row.actions && row.actions.length > 0\"\r\n (onClick)=\"onOptionsClick($event, row)\"\r\n >\r\n <smart-icon icon=\"ellipsis-v\"></smart-icon>\r\n </p-button>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : ''\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let task of smartGrid.gridModel.page.rows\"\r\n [item]=\"task\"\r\n [smartGrid]=\"smartGrid\"\r\n [onSelect]=\"onSelect.bind(this)\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <p-paginator\r\n *ngIf=\"smartGrid.paginator\"\r\n [first]=\"pageIndex!\"\r\n [totalRecords]=\"length!\"\r\n [rows]=\"pageSize\"\r\n [rowsPerPageOptions]=\"pageSizeOptions\"\r\n (onPageChange)=\"onPrimeChangePage($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n dropdownAppendTo=\"body\"\r\n />\r\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\r\n</div>\r\n}@else {\r\n<div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n <button\r\n (click)=\"editColumns()\"\r\n mat-mini-fab\r\n color=\"text-primary\"\r\n *ngIf=\"smartGrid.showEditColumns\"\r\n >\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\r\n >view_columns</mat-icon\r\n >\r\n </button>\r\n </div>\r\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\r\n <div class=\"smartGridContent\">\r\n <div>\r\n <div *ngIf=\"smartGrid.showResultCount\">\r\n <div class=\"smartGrid-data-number\">\r\n {{ smartGrid.gridModel.totalRowCount }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"smart-grid-table-container\">\r\n <ng-template #table></ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\r\n <smart-expandable-section\r\n #gridExpandableSection\r\n *ngFor=\"let expandableSection of expandableSections\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : ''\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let task of smartGrid.gridModel.page.rows\"\r\n [item]=\"task\"\r\n [smartGrid]=\"smartGrid\"\r\n [onSelect]=\"onSelect.bind(this)\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\r\n class=\"tree-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : ''\r\n }\"\r\n >\r\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button mat-icon-button disabled class=\"tree-button\"></button>\r\n <mat-checkbox\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n class=\"tree-button\"\r\n [attr.aria-label]=\"'Toggle ' + node.item\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n\r\n <mat-paginator\r\n *ngIf=\"smartGrid.paginator && !treeControl\"\r\n #paginator\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onChangePage($event)\"\r\n ></mat-paginator>\r\n</div>\r\n}\r\n", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.primeSmartGrid-container{display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-card-container{height:auto;border:1px solid black;border-radius:8px}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.menu-button{text-align:-webkit-right}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i6.SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i8.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "component", type: i9.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i10.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i10.MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "directive", type: i10.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i10.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i10.MatTreeNode, selector: "mat-tree-node", inputs: ["disabled", "tabIndex"], exportAs: ["matTreeNode"] }, { kind: "component", type: i11.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i12.ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { kind: "component", type: i13.UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id"] }, { kind: "directive", type: i14.ComparableMultiselectDirective, selector: "p-multiSelect", inputs: ["compareWith"] }, { kind: "component", type: i15.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i16.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i15.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i15.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i15.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i15.TableRadioButton, selector: "p-tableRadioButton", inputs: ["disabled", "value", "index", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i15.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i15.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "component", type: i17.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: i18.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i19.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i20.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }, { kind: "directive", type: i21.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i21.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i22.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i23.SmartGridCardComponent, selector: "app-smart-grid-card", inputs: ["item", "smartGrid", "onSelect"] }] }); }
908
- }
909
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartGridComponent, decorators: [{
910
- type: Component,
911
- args: [{ selector: 'smart-grid', providers: [SmartGridService], template: "@if(compLib === componentLibrary.PRIMENG) {\r\n<div *ngIf=\"smartGrid\" class=\"primeSmartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n </div>\r\n <p-table\r\n *ngIf=\"!smartGrid.layoutDef || smartGrid.layoutDef === layoutDef().TABLE\"\r\n #pTable\r\n [value]=\"smartGrid.gridModel.page.rows!\"\r\n (onSort)=\"gridSort($event)\"\r\n [customSort]=\"true\"\r\n [sortMode]=\"'multiple'\"\r\n [lazy]=\"true\"\r\n (onLazyLoad)=\"lazyLoad($event)\"\r\n [reorderableColumns]=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\"\r\n [columns]=\"columns\"\r\n (onColReorder)=\"onColOrder($event)\"\r\n (onRowSelect)=\"onRowSelect($event)\"\r\n (onRowUnselect)=\"onRowUnselect($event)\"\r\n [selection]=\"selectedRows\"\r\n (onHeaderCheckboxToggle)=\"onSelectAllRow($event)\"\r\n dataKey=\"id\"\r\n >\r\n <ng-container *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <ng-template pTemplate=\"caption\">\r\n <div *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <p-multiSelect\r\n display=\"chip\"\r\n [options]=\"smartGrid.gridModel.view?.descriptor?.columns\"\r\n optionLabel=\"label\"\r\n [(ngModel)]=\"columns\"\r\n selectedItemsLabel=\"{0} columns selected\"\r\n [style]=\"{ 'min-width': '200px' }\"\r\n placeholder=\"Choose Columns\"\r\n (onChange)=\"headerChange($event)\"\r\n />\r\n </div>\r\n </ng-template>\r\n </ng-container>\r\n <ng-template pTemplate=\"header\">\r\n <tr *ngIf=\"smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\" pReorderableColumn>\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n <th></th>\r\n </tr>\r\n <tr *ngIf=\"!smartGrid.gridModel.view?.descriptor?.showEditColumns\">\r\n <th\r\n *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n >\r\n <p-tableHeaderCheckbox />\r\n </th>\r\n <th\r\n *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\"\r\n style=\"width: 4rem\"\r\n ></th>\r\n <th [pSortableColumn]=\"col.propertyName\" *ngFor=\"let col of columns\">\r\n <p-sortIcon [field]=\"col.propertyName\" />\r\n {{ col.label }}\r\n </th>\r\n <th></th>\r\n </tr>\r\n <!-- <tr>\r\n <th *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <p-columnFilter\r\n type=\"text\"\r\n [field]=\"'data.' + col\"\r\n [placeholder]=\"'Search by ' + col\"\r\n [ariaLabel]=\"'Filter ' + col\"\r\n />\r\n </th>\r\n </tr> -->\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-row>\r\n <tr (dblclick)=\"onDoubleClick(row)\" *ngIf=\"row && row.data\">\r\n <td *ngIf=\"isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableCheckbox *ngIf=\"row.selectable != false\" [value]=\"row\" />\r\n </td>\r\n <td *ngIf=\"!isMultiple && (tableType === 'checkbox' || tableType === 'CheckBox')\">\r\n <p-tableRadioButton [value]=\"row\" />\r\n </td>\r\n <td *ngFor=\"let col of smartGrid?.gridModel?.view?.orderedColumnNames\">\r\n <div *ngIf=\"row.icons[col]\">\r\n <div class=\"smart-table-icon-container\">\r\n <div *ngFor=\"let ir of getImageResourceIcons(row, col)\">\r\n <div\r\n pTooltip=\"{{ ir.tooltip?.tooltip }}\"\r\n tooltipPosition=\"right\"\r\n placeholder=\"Right\"\r\n [ngStyle]=\"getImageResourceStyle(ir)\"\r\n ><smart-icon [icon]=\"ir.identifier!\" [color]=\"ir.color!\"> </smart-icon\r\n ></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"!row.icons[col]\" [innerHtml]=\"getColValue(col, row)\"> </div>\r\n </td>\r\n <td class=\"menu-button\">\r\n <p-button\r\n [rounded]=\"true\"\r\n [text]=\"true\"\r\n *ngIf=\"row.actions && row.actions.length > 0\"\r\n (onClick)=\"onOptionsClick($event, row)\"\r\n >\r\n <smart-icon icon=\"ellipsis-v\"></smart-icon>\r\n </p-button>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : ''\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let task of smartGrid.gridModel.page.rows\"\r\n [item]=\"task\"\r\n [smartGrid]=\"smartGrid\"\r\n [onSelect]=\"onSelect.bind(this)\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <p-paginator\r\n *ngIf=\"smartGrid.paginator\"\r\n [first]=\"pageIndex!\"\r\n [totalRecords]=\"length!\"\r\n [rows]=\"pageSize\"\r\n [rowsPerPageOptions]=\"pageSizeOptions\"\r\n (onPageChange)=\"onPrimeChangePage($event)\"\r\n [showCurrentPageReport]=\"true\"\r\n dropdownAppendTo=\"body\"\r\n />\r\n <p-menu #menu [model]=\"menuButtons\" [popup]=\"true\" appendTo=\"body\"> </p-menu>\r\n</div>\r\n}@else {\r\n<div *ngIf=\"smartGrid\" class=\"smartGrid-container\">\r\n <div class=\"smart-grid-toolbar\">\r\n <smart-ui-action-toolbar #toolbar [id]=\"'grid_not_initialized'\"></smart-ui-action-toolbar>\r\n <button\r\n (click)=\"editColumns()\"\r\n mat-mini-fab\r\n color=\"text-primary\"\r\n *ngIf=\"smartGrid.showEditColumns\"\r\n >\r\n <mat-icon aria-hidden=\"false\" aria-label=\"Columns\" class=\"smart-grid-edit-icon\"\r\n >view_columns</mat-icon\r\n >\r\n </button>\r\n </div>\r\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\r\n <div class=\"smartGridContent\">\r\n <div>\r\n <div *ngIf=\"smartGrid.showResultCount\">\r\n <div class=\"smartGrid-data-number\">\r\n {{ smartGrid.gridModel.totalRowCount }}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"smart-grid-table-container\">\r\n <ng-template #table></ng-template>\r\n </div>\r\n\r\n <div *ngIf=\"smartGrid.layoutDef === layoutDef().EXPANDABLE\">\r\n <smart-expandable-section\r\n #gridExpandableSection\r\n *ngFor=\"let expandableSection of expandableSections\"\r\n [data]=\"expandableSection\"\r\n ></smart-expandable-section>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef\"\r\n class=\"cards-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : ''\r\n }\"\r\n >\r\n <app-smart-grid-card\r\n class=\"smartGrid-card-container\"\r\n *ngFor=\"let task of smartGrid.gridModel.page.rows\"\r\n [item]=\"task\"\r\n [smartGrid]=\"smartGrid\"\r\n [onSelect]=\"onSelect.bind(this)\"\r\n ></app-smart-grid-card>\r\n </div>\r\n <div\r\n *ngIf=\"smartGrid.layoutDef === layoutDef().TREE && treeControl\"\r\n class=\"tree-container\"\r\n [ngStyle]=\"{\r\n 'grid-template-columns':\r\n smartGrid.numberOfColumn !== undefined\r\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\r\n : ''\r\n }\"\r\n >\r\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node\"\r\n matTreeNodeToggle\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button mat-icon-button disabled class=\"tree-button\"></button>\r\n <mat-checkbox\r\n class=\"checklist-leaf-node\"\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n\r\n <mat-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodePadding\r\n matTreeNodePaddingIndent=\"24\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n class=\"tree-button\"\r\n [attr.aria-label]=\"'Toggle ' + node.item\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </mat-icon>\r\n </button>\r\n <mat-checkbox\r\n [checked]=\"treeChecklistSelection?.isSelected(node)\"\r\n [indeterminate]=\"descendantsPartiallySelected(node)\"\r\n (change)=\"treeNodeSelectionToggle(node)\"\r\n >{{ getTreeItem(node) }}</mat-checkbox\r\n >\r\n </mat-tree-node>\r\n </mat-tree>\r\n </div>\r\n </div>\r\n\r\n <mat-paginator\r\n *ngIf=\"smartGrid.paginator && !treeControl\"\r\n #paginator\r\n [length]=\"length\"\r\n [pageIndex]=\"pageIndex\"\r\n [pageSize]=\"pageSize\"\r\n [pageSizeOptions]=\"pageSizeOptions\"\r\n (page)=\"onChangePage($event)\"\r\n ></mat-paginator>\r\n</div>\r\n}\r\n", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.primeSmartGrid-container{display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.smart-table-icon-container{display:flex;flex-direction:row;justify-content:space-between;white-space:initial}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-card-container{height:auto;border:1px solid black;border-radius:8px}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.menu-button{text-align:-webkit-right}\n"] }]
912
- }], ctorParameters: () => [{ type: i1.SmartGridService }, { type: i2.ComponentFactoryService }, { type: i3.MatDialog }, { type: i0.Injector }, { type: i4.UiActionDescriptorService }, { type: i4.ComponentLibrary, decorators: [{
913
- type: Inject,
914
- args: [COMPONENT_LIBRARY]
915
- }] }, { type: undefined, decorators: [{
916
- type: Inject,
917
- args: ['gridMenuIcon']
918
- }] }], propDecorators: { smartGrid: [{
919
- type: Input
920
- }], uuid: [{
921
- type: Input
922
- }], dev: [{
923
- type: Input
924
- }], vcRefTable: [{
925
- type: ViewChild,
926
- args: ['table', { read: ViewContainerRef }]
927
- }], toolbar: [{
928
- type: ViewChild,
929
- args: ['toolbar']
930
- }], menu: [{
931
- type: ViewChild,
932
- args: ['menu']
933
- }] } });
934
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1ncmlkL3NtYXJ0LWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc21hcnQtbmctY2xpZW50L3NyYy9saWIvc21hcnQtZ3JpZC9zbWFydC1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUVMLFNBQVMsRUFFVCxNQUFNLEVBRU4sS0FBSyxFQUlMLFNBQVMsRUFDVCxnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDakYsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDbkcsT0FBTyxFQUNMLFVBQVUsRUFDVixvQkFBb0IsRUFFcEIsNEJBQTRCLEVBRTVCLDJCQUEyQixFQUMzQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFHTCxrQkFBa0IsR0FFbkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGdCQUFnQixHQUdqQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFHTCxpQkFBaUIsRUFDakIsaUJBQWlCLEVBRWpCLDBCQUEwQixHQUMzQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSwy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QUVELHFCQUFxQixDQUFDLEdBQVEsRUFBRSxNQUFjO1FBQzVDLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxTQUFTLEdBQUcsR0FBRyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QscUJBQXFCLENBQUMsUUFBdUI7UUFDM0MsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUMsQ0FBQzsrR0E5aENVLGtCQUFrQixtTEFvRG5CLGlCQUFpQixhQUNqQixjQUFjO21HQXJEYixrQkFBa0IsbUdBRmxCLENBQUMsZ0JBQWdCLENBQUMsMEdBWUQsZ0JBQWdCLHNOQzdGOUMsOG1VQTZRQTs7NEZEMUxhLGtCQUFrQjtrQkFOOUIsU0FBUzsrQkFDRSxZQUFZLGFBR1gsQ0FBQyxnQkFBZ0IsQ0FBQzs7MEJBc0QxQixNQUFNOzJCQUFDLGlCQUFpQjs7MEJBQ3hCLE1BQU07MkJBQUMsY0FBYzt5Q0FoRGYsU0FBUztzQkFBakIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUcwQyxVQUFVO3NCQUF6RCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkFLeEIsT0FBTztzQkFBNUIsU0FBUzt1QkFBQyxTQUFTO2dCQTA1QkQsSUFBSTtzQkFBdEIsU0FBUzt1QkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xyXG5pbXBvcnQgeyBGbGF0VHJlZUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9jZGsvdHJlZSc7XHJcbmltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDb21wb25lbnQsXHJcbiAgQ29tcG9uZW50UmVmLFxyXG4gIEluamVjdCxcclxuICBJbmplY3RvcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDb250YWluZXJSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IFBhZ2VFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFRyZWVGbGF0RGF0YVNvdXJjZSwgTWF0VHJlZUZsYXR0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RyZWUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQ29tcG9uZW50RmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnQtZmFjdG9yeS1zZXJ2aWNlL3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnREaWFsb2dEYXRhIH0gZnJvbSAnLi4vc21hcnQtZGlhbG9nL3Byb2plY3RzJztcclxuaW1wb3J0IHsgRXhwYW5kYWJsZVNlY3Rpb24gfSBmcm9tICcuLi9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24vcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeSB9IGZyb20gJy4uL3NtYXJ0LWZpbHRlci1lZGl0b3IvYXBpL21vZGVsL2ZpbHRlckV4cHJlc3Npb25PcmRlckJ5JztcclxuaW1wb3J0IHtcclxuICBTbWFydFRhYmxlLFxyXG4gIFNtYXJ0VGFibGVCdXR0b25UeXBlLFxyXG4gIFNtYXJ0VGFibGVIZWFkZXIsXHJcbiAgU21hcnRUYWJsZUhlYWRlclByb3BlcnR5VHlwZSxcclxuICBTbWFydFRhYmxlSW50ZXJmYWNlLFxyXG4gIFNtYXJ0VGFibGVJbnRlcmZhY2VUeXBlRW51bSxcclxuICBTbWFydFRhYmxlT3JkZXIsXHJcbiAgU21hcnRUYWJsZVR5cGUsXHJcbiAgU21hcnR0YWJsZUNvbXBvbmVudCxcclxufSBmcm9tICcuLi9zbWFydC10YWJsZS9wcm9qZWN0cyc7XHJcbmltcG9ydCB7XHJcbiAgSW1hZ2VSZXNvdXJjZSxcclxuICBVaUFjdGlvbixcclxuICBVaUFjdGlvbkJ1dHRvblR5cGUsXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yLFxyXG59IGZyb20gJy4uL3ZpZXctY29udGV4dC9hcGknO1xyXG5pbXBvcnQge1xyXG4gIENPTVBPTkVOVF9MSUJSQVJZLFxyXG4gIENvbXBvbmVudExpYnJhcnksXHJcbiAgVWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSxcclxuICBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQsXHJcbn0gZnJvbSAnLi4vdmlldy1jb250ZXh0L3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBHcmlkQ29sdW1uTWV0YSxcclxuICBHcmlkUm93LFxyXG4gIEdyaWRTZWxlY3Rpb25Nb2RlLFxyXG4gIEdyaWRTZWxlY3Rpb25UeXBlLFxyXG4gIEdyaWRVcGRhdGVEYXRhLFxyXG4gIEdyaWRWaWV3RGVzY3JpcHRvcktpbmRFbnVtLFxyXG59IGZyb20gJy4vYXBpL2dyaWQtYXBpJztcclxuaW1wb3J0IHsgVGFibGVMYXlvdXREZWZpbmVyQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL3RhYmxlLWxheW91dC1kZWZpbmVyL3RhYmxlLWxheW91dC1kZWZpbmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgR3JpZFVpQWN0aW9uVHlwZSxcclxuICBTbWFydEdyaWQsXHJcbiAgU21hcnRHcmlkRGF0YUxheW91dCxcclxuICBTbWFydEdyaWRUeXBlLFxyXG4gIFNtYXJ0TGF5b3V0RGVmLFxyXG59IGZyb20gJy4vbW9kZWxzL21vZGVsJztcclxuaW1wb3J0IHsgU21hcnRHcmlkU2VydmljZSB9IGZyb20gJy4vc21hcnQtZ3JpZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWVudUl0ZW0sIFNvcnRFdmVudCwgU29ydE1ldGEgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IE1lbnUgfSBmcm9tICdwcmltZW5nL21lbnUnO1xyXG5pbXBvcnQge1xyXG4gIFRhYmxlQ29sdW1uUmVvcmRlckV2ZW50LFxyXG4gIFRhYmxlSGVhZGVyQ2hlY2tib3hUb2dnbGVFdmVudCxcclxuICBUYWJsZUxhenlMb2FkRXZlbnQsXHJcbiAgVGFibGVSb3dTZWxlY3RFdmVudCxcclxuICBUYWJsZVJvd1VuU2VsZWN0RXZlbnQsXHJcbiAgVGFibGVTZWxlY3RBbGxDaGFuZ2VFdmVudCxcclxufSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlPcmRlckVudW0gfSBmcm9tICcuLi9zbWFydC1maWx0ZXIvcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBNdWx0aVNlbGVjdENoYW5nZUV2ZW50IH0gZnJvbSAncHJpbWVuZy9tdWx0aXNlbGVjdCc7XHJcbmltcG9ydCB7IEUgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzbWFydC1ncmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc21hcnQtZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc21hcnQtZ3JpZC5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbU21hcnRHcmlkU2VydmljZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTbWFydEdyaWRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XHJcbiAgLy8gcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UGFnZVNpemU6IG51bWJlciA9IDEwO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSBbNSwgMTAsIDI1LCA1MF07XHJcbiAgY29tcG9uZW50TGlicmFyeSA9IENvbXBvbmVudExpYnJhcnk7XHJcbiAgcHJpdmF0ZSBfZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG4gIEBJbnB1dCgpIHNtYXJ0R3JpZD86IFNtYXJ0R3JpZDtcclxuICBASW5wdXQoKSB1dWlkPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRldjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyB0YWJsZVxyXG4gIEBWaWV3Q2hpbGQoJ3RhYmxlJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0pIHZjUmVmVGFibGU/OiBWaWV3Q29udGFpbmVyUmVmO1xyXG4gIGNvbXBvbmVudFJlZlRhYmxlPzogQ29tcG9uZW50UmVmPFNtYXJ0dGFibGVDb21wb25lbnQ+O1xyXG4gIHNtYXJ0VGFibGUhOiBTbWFydFRhYmxlPEdyaWRSb3c+O1xyXG5cclxuICAvLyB0b29sYmFyXHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhcicpIHRvb2xiYXI/OiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQ7XHJcblxyXG4gIC8vIGV4cGFuZGFibGVcclxuICAvLyBncmlkRGF0YVxyXG4gIGV4cGFuZGFibGVTZWN0aW9ucz86IEV4cGFuZGFibGVTZWN0aW9uPGFueT5bXTtcclxuXHJcbiAgcGFnZUV2ZW50PzogUGFnZUV2ZW50O1xyXG4gIGRhdGFzb3VyY2U/OiBudWxsO1xyXG4gIHBhZ2VTaXplPzogbnVtYmVyO1xyXG4gIGxlbmd0aD86IG51bWJlcjtcclxuICBwYWdlSW5kZXg/OiBudW1iZXI7XHJcbiAgdmFsdWVzOiBhbnk7XHJcbiAgZ3JpZFRhYmxlITogU21hcnRUYWJsZTxhbnk+O1xyXG4gIGlzTXVsdGlwbGU/OiBib29sZWFuO1xyXG4gIHNlbGVjdGVkUm93czogR3JpZFJvd1tdID0gW107XHJcbiAgdGFibGVUeXBlPzogYW55O1xyXG4gIHBhZ2VTaXplT3B0aW9uczogbnVtYmVyW10gPSB0aGlzLmRlZmF1bHRQYWdlU2l6ZU9wdGlvbnM7XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZXM6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHVpQWN0aW9uRGVzY3JpcHRvcnM6IE1hcDxzdHJpbmcsIFVpQWN0aW9uRGVzY3JpcHRvcj4gPSBuZXcgTWFwKCk7XHJcblxyXG4gIGFmdGVyVmlld0luaXRFeGVjdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQmxvY2tlZDogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIC8vIHRyZWVcclxuICB0cmVlQ29udHJvbD86IEZsYXRUcmVlQ29udHJvbDxHcmlkUm93PjtcclxuICB0cmVlRmxhdHRlbmVyPzogTWF0VHJlZUZsYXR0ZW5lcjxHcmlkUm93LCBHcmlkUm93PjtcclxuICB0cmVlRGF0YVNvdXJjZT86IE1hdFRyZWVGbGF0RGF0YVNvdXJjZTxHcmlkUm93LCBHcmlkUm93PjtcclxuICB0cmVlQ2hlY2tsaXN0U2VsZWN0aW9uPzogU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz47XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTbWFydEdyaWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZlNlcnZpY2U6IENvbXBvbmVudEZhY3RvcnlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxyXG4gICAgcHJpdmF0ZSB1aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlOiBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLFxyXG4gICAgQEluamVjdChDT01QT05FTlRfTElCUkFSWSkgcHVibGljIGNvbXBMaWI6IENvbXBvbmVudExpYnJhcnksXHJcbiAgICBASW5qZWN0KCdncmlkTWVudUljb24nKSBwcml2YXRlIGdyaWRNZW51SWNvbj86IHN0cmluZ1xyXG4gICkge1xyXG4gICAgdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgLy8gY2FsbGVkIGFmdGVyIGV2ZXJ5IHNlcnZpY2UgY2FsbCAobG9hZCwgc2F2ZSwgcmVmcmVzaCwgZXRjLilcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbCA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWw7XHJcbiAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzWydzbWFydEdyaWQnXSkge1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCA9IGNoYW5nZXNbJ3NtYXJ0R3JpZCddLmN1cnJlbnRWYWx1ZTtcclxuICAgICAgdGhpcy5zZXJ2aWNlLnBhZ2luYXRvciA9IHRoaXMuc21hcnRHcmlkPy5wYWdpbmF0b3I7XHJcbiAgICAgIHRoaXMuc2V0dXBUb29sYmFyKCk7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlc1sndXVpZCddKSB7XHJcbiAgICAgIHRoaXMudXVpZCA9IGNoYW5nZXNbJ3V1aWQnXS5jdXJyZW50VmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hZnRlclZpZXdJbml0RXhlY3V0ZWQgJiYgdGhpcy51dWlkICYmIHRoaXMuc21hcnRHcmlkKSB7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLl9kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZGV2KSB7XHJcbiAgICAgIC8vIGZvciBkZXYgcHVycG9zZXNcclxuICAgICAgaWYgKHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwpIHtcclxuICAgICAgICB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbDtcclxuICAgICAgICB0aGlzLnJlbmRlcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudXVpZCAmJiB0aGlzLnNtYXJ0R3JpZCAmJiAhdGhpcy5kZXYpIHtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFmdGVyVmlld0luaXRFeGVjdXRlZCA9IHRydWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEByZXR1cm5zIHRoZSBzZWxlY3RlZCByb3dzIG9mIHRoZSB0YWJsZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRTZWxlY3RlZFJvd3MoKTogU2VsZWN0aW9uTW9kZWw8R3JpZFJvdz4ge1xyXG4gICAgaWYgKCF0aGlzLnNtYXJ0VGFibGUuc2VsZWN0aW9uKSB0aHJvdyBuZXcgRXJyb3IoKTtcclxuICAgIHJldHVybiB0aGlzLnNtYXJ0VGFibGUhLnNlbGVjdGlvbiE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGlzIG1ldGhvZCBzZW5kcyBhIEdFVCByZXF1ZXN0IHRvIHRoZSBnZW5lcmljIEdyaWRBUEkgYW5kIHJlZnJlc2hlcyB0aGUgcHJlc2VudGVkXHJcbiAgICogZ3JpZCB3aXRoIHRoZSBuZXdlc3Qgb25lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zZXR1cFRvb2xiYXIoKTtcclxuICAgIC8vIHdpbGwgY2F1c2UgdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbENoYW5nZWQgdG8gZmlyZVxyXG4gICAgaWYgKHRoaXMudXVpZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLnNlcnZpY2UubG9hZCh0aGlzLnV1aWQsIHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0dXBUb29sYmFyKCkge1xyXG4gICAgLy8gY2hlY2sgaWYgdG9vbGJhciBpcyBhdmFpbGFibGUgX2FuZF8gbmVlZCBzZXQgdXBcclxuICAgIGlmICh0aGlzLnRvb2xiYXIgJiYgdGhpcy5zbWFydEdyaWQpIHtcclxuICAgICAgbGV0IHRvb2xiYXJJZCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciArICdfdG9vbGJhcic7XHJcbiAgICAgIGlmICh0b29sYmFySWQgIT09IHRoaXMudG9vbGJhci5pZCkge1xyXG4gICAgICAgIHRoaXMudG9vbGJhci5pZCA9IHRvb2xiYXJJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBwcml2YXRlIGFzeW5jIHJlbmRlcigpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGdyaWRNb2RlbCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWw7XHJcbiAgICBpZiAoZ3JpZE1vZGVsKSB7XHJcbiAgICAgIHRoaXMubGVuZ3RoID0gZ3JpZE1vZGVsLnRvdGFsUm93Q291bnQ7XHJcbiAgICAgIHRoaXMucGFnZVNpemUgPSBncmlkTW9kZWwucGFnZVNpemU7XHJcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gZ3JpZE1vZGVsLnBhZ2VJbmRleCA/PyAwO1xyXG4gICAgICBpZiAoZ3JpZE1vZGVsLnBhZ2VTaXplT3B0aW9ucyAmJiBncmlkTW9kZWwucGFnZVNpemVPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICB0aGlzLnBhZ2VTaXplT3B0aW9ucyA9IGdyaWRNb2RlbC5wYWdlU2l6ZU9wdGlvbnM7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnMgPSB0aGlzLmRlZmF1bHRQYWdlU2l6ZU9wdGlvbnM7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uc2hvd0VkaXRDb2x1bW5zKSB7XHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLnNob3dFZGl0Q29sdW1ucyA9IGdyaWRNb2RlbD8udmlldz8uZGVzY3JpcHRvcj8uc2hvd0VkaXRDb2x1bW5zO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBraW5kID0gZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5raW5kO1xyXG4gICAgICBpZiAoa2luZCkge1xyXG4gICAgICAgIGxldCBsYXlvdXREZWY7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IEdyaWRWaWV3RGVzY3JpcHRvcktpbmRFbnVtLlRBQkxFKSB7XHJcbiAgICAgICAgICBsYXlvdXREZWYgPSBTbWFydExheW91dERlZi5UQUJMRTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtpbmQgPT09IEdyaWRWaWV3RGVzY3JpcHRvcktpbmRFbnVtLlRSRUUpIHtcclxuICAgICAgICAgIGxheW91dERlZiA9IFNtYXJ0TGF5b3V0RGVmLlRSRUU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChraW5kID09PSBHcmlkVmlld0Rlc2NyaXB0b3JLaW5kRW51bS5DQVJEUykge1xyXG4gICAgICAgICAgbGF5b3V0RGVmID0gU21hcnRMYXlvdXREZWYuQ0FSRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGxheW91dERlZikge1xyXG4gICAgICAgICAgdGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9IGxheW91dERlZjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGdyaWRNb2RlbD8ucGFnaW5hdG9yID09PSB0cnVlIHx8IGdyaWRNb2RlbD8ucGFnaW5hdG9yID09PSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5wYWdpbmF0b3IgPSBncmlkTW9kZWwucGFnaW5hdG9yO1xyXG4gICAgICAgIHRoaXMuc2VydmljZS5wYWdpbmF0b3IgPSB0aGlzLnNtYXJ0R3JpZCEucGFnaW5hdG9yO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdHcmlkTW9kZWwgaXMgdW5kZWZpbmVkIGluIGNvbXBvbmVudCEnKTtcclxuICAgIH1cclxuICAgIGlmICghdGhpcy5zbWFydEdyaWQhLmxheW91dERlZikge1xyXG4gICAgICAvLyBmYWxsYmFjaywgZGVmYXVsdCBUQUJMRVxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID0gU21hcnRMYXlvdXREZWYuVEFCTEU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLmxheW91dERlZiA9PT0gU21hcnRMYXlvdXREZWYuVEFCTEUpIHtcclxuICAgICAgdGhpcy5yZW5kZXJUYWJsZSgpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5FWFBBTkRBQkxFKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyRXhwYW5kYWJsZVNlY3Rpb25zKCk7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPT09IFNtYXJ0TGF5b3V0RGVmLkNBUkQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJDYXJkcygpO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNtYXJ0R3JpZCEubGF5b3V0RGVmID09PSBTbWFydExheW91dERlZi5UUkVFKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyVHJlZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pc0Jsb2NrZWQgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJUYWJsZSgpIHtcclxuICAgIHRoaXMudmNSZWZUYWJsZT8uY2xlYXIoKTtcclxuICAgIHRoaXMuY29tcG9uZW50UmVmVGFibGUgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHJlbmRlclRhYmxlKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5jbGVhclRyZWUoKTtcclxuICAgIGlmICh0aGlzLmNvbXBMaWIgPT09IHRoaXMuY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbiAgICAgIHRoaXMucGFnZUluZGV4ID0gdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5wYWdlU2l6ZSEgKiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnBhZ2VJbmRleCE7XHJcbiAgICAgIHRoaXMuY29sdW1ucyA9IFtdO1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcy5tYXAoKG9yZGVyZWRDb2w6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uY29sdW1ucy5tYXAoKGNvbHVtOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9yZGVyZWRDb2wgPT09IGNvbHVtLnByb3BlcnR5TmFtZSkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCB0YWJsZVJvdyA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwhLnBhZ2Uucm93cyEubWFwKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXRhYmxlUm93Lmxlbmd0aCkge1xyXG4gICAgICBsZXQgcGxhY2VIb2xkZXJSb3c6IGFueSA9IHt9O1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LmNvbHVtbnMubWFwKChtZXRhOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xyXG4gICAgICAgIHBsYWNlSG9sZGVyUm93W21ldGEucHJvcGVydHlOYW1lXSA9IHVuZGVmaW5lZDtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzID0gW3BsYWNlSG9sZGVyUm93XTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnPy50YWJsZVR5cGUpIHtcclxuICAgICAgdGhpcy50YWJsZVR5cGUgPSB0aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWcudGFibGVUeXBlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsPy52aWV3Py5kZXNjcmlwdG9yPy5zZWxlY3Rpb25UeXBlKSB7XHJcbiAgICAgIHRoaXMudGFibGVUeXBlID1cclxuICAgICAgICB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLnZpZXcuZGVzY3JpcHRvci5zZWxlY3Rpb25UeXBlID09PSBHcmlkU2VsZWN0aW9uVHlwZS5DSEVDS0JPWFxyXG4gICAgICAgICAgPyBTbWFydFRhYmxlVHlwZS5DSEVDS19CT1hcclxuICAgICAgICAgIDogU21hcnRUYWJsZVR5cGUuUk9XX1NFTEVDVDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudGFibGVUeXBlID0gU21hcnRUYWJsZVR5cGUuSU5IRVJJVEVEO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc21hcnRHcmlkIS5sYXlvdXREZWYgPT09IFNtYXJ0TGF5b3V0RGVmLlRBQkxFKSB7XHJcbiAgICAgIGxldCB0YWJsZUNvbmZpZzogU21hcnRUYWJsZUludGVyZmFjZTxHcmlkUm93PiA9IHtcclxuICAgICAgICAuLi50aGlzLnNtYXJ0R3JpZCEudGFibGVDb25maWcsXHJcbiAgICAgICAgdGFibGVSb3dzOiB0YWJsZVJvdyxcclxuICAgICAgICB0YWJsZVR5cGU6IHRoaXMudGFibGVUeXBlLFxyXG4gICAgICAgIGN1c3RvbVNtYXJ0VGFibGVIZWFkZXJzOiBhd2FpdCB0aGlzLmNvbnN0cnVjdEhlYWRlcigpISxcclxuICAgICAgICBleHBhbmRhYmxlOiB0aGlzLnNtYXJ0R3JpZCEuZXhwYW5kYWJsZSxcclxuICAgICAgICBleHBhbmRlZENvbXBvbmVudDogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGVkQ29tcG9uZW50LFxyXG4gICAgICAgIHR5cGU6IFNtYXJ0VGFibGVJbnRlcmZhY2VUeXBlRW51bS5OT1JNQUwsXHJcbiAgICAgICAgc29ydGFibGU6IHRydWUsXHJcbiAgICAgICAgZGVmYXVsdEFjdGlvbkNvZGVzOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLmRlZmF1bHRSb3dBY3Rpb25zISxcclxuICAgICAgICBkZWZhdWx0QWN0aW9uczogdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9ucz8ubWFwKChjb2RlOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHR5cGU6XHJcbiAgICAgICAgICAgICAgY29kZSA9PT0gJ19hY3Rpb25TZXBhcmF0b3JfJ1xyXG4gICAgICAgICAgICAgICAgPyBTbWFydFRhYmxlQnV0dG9uVHlwZS5TRVBBUkFUT1JcclxuICAgICAgICAgICAgICAgIDogU21hcnRUYWJsZUJ1dHRvblR5cGUuTk9STUFMLFxyXG4gICAgICAgICAgICBjYWxsYmFjazogdGhpcy5leGVjdXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgICAgIC8vIGxhYmVsOiB0aGlzLmJ1dHRvblRyYW5zbGF0b3IoeyBjb2RlOiBjb2RlIH0pLFxyXG4gICAgICAgICAgICB0cmFuc2xhdG9yOiB0aGlzLmJ1dHRvblRyYW5zbGF0b3IuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgLy8gYXJnczogW1xyXG4gICAgICAgICAgICAvLyAgIHtcclxuICAgICAgICAgICAgLy8gICAgIGNvZGU6IGNvZGUsXHJcbiAgICAgICAgICAgIC8vICAgfSxcclxuICAgICAgICAgICAgLy8gXSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfSksXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQ/LmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5oaWdobGlnaHRQcm9wZXJ0eSAmJlxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uaGlnaGxpZ2h0Q2xhc3NcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcuaGlnaGxpZ2h0Q2xhc3MgPSB0aGlzLnNtYXJ0R3JpZC5ncmlkTW9kZWwudmlldy5kZXNjcmlwdG9yLmhpZ2hsaWdodENsYXNzO1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLmhpZ2hsaWdodFByb3BlcnR5ID0gdGhpcy5zbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXcuZGVzY3JpcHRvci5oaWdobGlnaHRQcm9wZXJ0eTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS51aUFjdGlvblNlcnZpY2UgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSAmJlxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkIS5zZXJ2aWNlVG9Vc2UgJiZcclxuICAgICAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLm9uU2VsZWN0aW9uID0gdGhpcy5vblNlbGVjdC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLm9uQWxsU2VsZWN0aW9uID0gdGhpcy5vblNlbGVjdEFsbC5iaW5kKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBQcmVwYXJlZCBmb3Igc2ltcGxlIGNsaWNrc1xyXG4gICAgICAvLyBpZiAoIXRhYmxlQ29uZmlnLm9uUm93Q2xpY2spIHtcclxuICAgICAgLy8gICB0YWJsZUNvbmZpZy5vblJvd0NsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIGlmICghdGFibGVDb25maWcub25Sb3dEb3VibGVDbGljaykge1xyXG4gICAgICAgIHRhYmxlQ29uZmlnLm9uUm93RG91YmxlQ2xpY2sgPSB0aGlzLm9uRG91YmxlQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0YWJsZUNvbmZpZy5pc1Jvd0Rpc2FibGVkUHJvcGVydHlOYW1lKSB7XHJcbiAgICAgICAgdGFibGVDb25maWcuc2VsZWN0YWJsZVByb3BlcnR5TmFtZSA9ICdzZWxlY3RhYmxlJztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRhYmxlQ29uZmlnLmFzeW5jT25FeHBhbmQpIHtcclxuICAgICAgICB0YWJsZUNvbmZpZy5yb3dFeHBhbmRlciA9IHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHNlbGVjdGlvbk1vZGUgPSB0aGlzLnNlcnZpY2UhLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zZWxlY3Rpb25Nb2RlO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgICF0YWJsZUNvbmZpZy5zZWxlY3Rpb24gJiZcclxuICAgICAgICAhdGFibGVDb25maWcuc2VsZWN0aW9uUHJvcGVydHkgJiZcclxuICAgICAgICBzZWxlY3Rpb25Nb2RlICE9PSBHcmlkU2VsZWN0aW9uTW9kZS5OT05FXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuaXNNdWx0aXBsZSA9IHNlbGVjdGlvbk1vZGUgPT09IEdyaWRTZWxlY3Rpb25Nb2RlLk1VTFRJUExFO1xyXG5cclxuICAgICAgICB0YWJsZUNvbmZpZy5zZWxlY3Rpb25Qcm9wZXJ0eSA9ICdpZCc7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSWRzO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSb3dzID0gdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC5wYWdlLnJvd3MhLmZpbHRlcihcclxuICAgICAgICAgIChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LnNlbGVjdGVkXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgc2VsZWN0ZWRJZHMgPSB0aGlzLnNlbGVjdGVkUm93cy5tYXAoKGdyaWRSb3c6IEdyaWRSb3cpID0+IGdyaWRSb3cuaWQhKTtcclxuICAgICAgICB0YWJsZUNvbmZpZy5zZWxlY3Rpb24gPSBuZXcgU2VsZWN0aW9uTW9kZWw8c3RyaW5nPih0aGlzLmlzTXVsdGlwbGUsIHNlbGVjdGVkSWRzKTtcclxuICAgICAgICB0YWJsZUNvbmZpZy5zaG93Q2hlY2tib3hJbkhlYWRlciA9XHJcbiAgICAgICAgICB0eXBlb2YgdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgIT09ICd1bmRlZmluZWQnXHJcbiAgICAgICAgICAgID8gdGFibGVDb25maWcuc2hvd0NoZWNrYm94SW5IZWFkZXIgLy8ga2VlcCBpZiBzZXRcclxuICAgICAgICAgICAgOiB0aGlzLmlzTXVsdGlwbGU7IC8vaWYgdW5zZXQsIHR1cm4gaXQgb24gZm9yIG11bHRpcGxlIHNlbGVjdGlvblxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNtYXJ0VGFibGUgPSBuZXcgU21hcnRUYWJsZTxhbnk+KHRhYmxlQ29uZmlnKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmNvbXBvbmVudFJlZlRhYmxlKSB7XHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS51cGRhdGVTbWFydFRhYmxlKHRoaXMuc21hcnRUYWJsZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy52Y1JlZlRhYmxlPy5jbGVhcigpO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMudmNSZWZUYWJsZSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNvbXBvbmVudFJlZlRhYmxlID0gdGhpcy5jZlNlcnZpY2UuY3JlYXRlQ29tcG9uZW50KFxyXG4gICAgICAgICAgdGhpcy52Y1JlZlRhYmxlISxcclxuICAgICAgICAgIFNtYXJ0dGFibGVDb21wb25lbnQsXHJcbiAgICAgICAgICBuZXcgTWFwPHN0cmluZywgYW55PihbWydzbWFydFRhYmxlJywgdGhpcy5zbWFydFRhYmxlXV0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IHRoaXMuY29tcG9uZW50UmVmVGFibGUuaW5zdGFuY2Uuc29ydEV2ZW50XHJcbiAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS5fZGVzdHJveSQpKVxyXG4gICAgICAgICAgLnN1YnNjcmliZSgoaGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PiB7XHJcbiAgICAgICAgICAgIGhlYWRlci5wcm9wZXJ0eU5hbWUgPSBoZWFkZXIucHJvcGVydHlOYW1lLnN1YnN0cmluZyg1KTtcclxuXHJcbiAgICAgICAgICAgIHN3aXRjaCAoaGVhZGVyLm9yZGVyKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSB1bmRlZmluZWQ6XHJcbiAgICAgICAgICAgICAgICBoZWFkZXIub3JkZXIgPSBTbWFydFRhYmxlT3JkZXIuQVNDO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgY2FzZSBTbWFydFRhYmxlT3JkZXIuQVNDOlxyXG4gICAgICAgICAgICAgICAgaGVhZGVyLm9yZGVyID0gU21hcnRUYWJsZU9yZGVyLkRFU0M7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICBjYXNlIFNtYXJ0VGFibGVPcmRlci5ERVNDOlxyXG4gICAgICAgICAgICAgICAgaGVhZGVyLm9yZGVyID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBmaWx0ZXIgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXchLm9yZGVyQnlMaXN0LmZpbmQoXHJcbiAgICAgICAgICAgICAgKGZpbHRlckV4cHJlc3Npb246IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5KSA9PlxyXG4gICAgICAgICAgICAgICAgZmlsdGVyRXhwcmVzc2lvbi5wcm9wZXJ0eU5hbWUgPT09IGhlYWRlci5wcm9wZXJ0eU5hbWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKGZpbHRlciAmJiAhaGVhZGVyLm9yZGVyKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3Py5vcmRlckJ5TGlzdC5pbmRleE9mKGZpbHRlcik7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3Py5vcmRlckJ5TGlzdC5zcGxpY2UoaW5kZXghLCAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIpIHtcclxuICAgICAgICAgICAgICBmaWx0ZXIub3JkZXIgPSBoZWFkZXIub3JkZXI7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlckJ5TGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgICAgIG9yZGVyOiBoZWFkZXIub3JkZXIsXHJcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWU6IGhlYWRlci5wcm9wZXJ0eU5hbWUsXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBncmlkVXBkYXRlRGF0YTogR3JpZFVwZGF0ZURhdGEgPSB7XHJcbiAgICAgICAgICAgICAgb3JkZXJCeUxpc3Q6IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QsXHJcbiAgICAgICAgICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXchLm9yZGVyZWRDb2x1bW5OYW1lcyxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnNvcnQodGhpcy5zbWFydEdyaWQhLCBncmlkVXBkYXRlRGF0YSk7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5jb21wb25lbnRSZWZUYWJsZS5pbnN0YW5jZS5zbWFydFRhYmxlLnNlbGVjdGlvbj8uY2hhbmdlZFxyXG4gICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuY29tcG9uZW50UmVmVGFibGUuaW5zdGFuY2UuX2Rlc3Ryb3kkKSlcclxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJvdzogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlcy5uZXh0KHJvdyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGV4cGFuZChyb3dJZDogbnVtYmVyKTogYW55IHt9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBleHBhbmRBc3luYyhyb3dJbmRleDogbnVtYmVyKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cykge1xyXG4gICAgICBsZXQgcm93ID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3Nbcm93SW5kZXhdO1xyXG4gICAgICBpZiAocm93ICYmIHJvdy5pZCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNlcnZpY2UuZXhwYW5kKHRoaXMuc21hcnRHcmlkISwgcm93LmlkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VydmljZS5leHBhbmQodGhpcy5zbWFydEdyaWQhLCByb3dJbmRleC50b1N0cmluZygpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVuZGVyRXhwYW5kYWJsZVNlY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgdGhpcy5leHBhbmRhYmxlU2VjdGlvbnMgPSB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsIS5wYWdlLnJvd3MhLm1hcCgoaXRlbTogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgdGl0bGU6ICcnLFxyXG4gICAgICAgIGhlYWRlckNvbXBvbmVudDogdGhpcy5zbWFydEdyaWQhLmhlYWRlckNvbXBvbmVudCxcclxuICAgICAgICBoZWFkZXJJbnB1dE5hbWU6IHRoaXMuc21hcnRHcmlkIS5oZWFkZXJDb21wb25lbnRJbnB1dE5hbWUsXHJcbiAgICAgICAgaGVhZGVyRGF0YTogaXRlbSxcclxuICAgICAgICBjdXN0b21Db21wb25lbnQ6IHRoaXMuc21hcnRHcmlkIS5leHBhbmRhYmxlQ29tcG9uZW50LFxyXG4gICAgICAgIGlucHV0TmFtZTogdGhpcy5zbWFydEdyaWQhLmV4cGFuZGFibGVDb21wb25lbnRJbnB1dE5hbWUsXHJcbiAgICAgICAgZGF0YTogaXRlbSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW5kZXJDYXJkcygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5zbWFydEdyaWQhLmN1c3RvbUNvbXBvbmVudCkge1xyXG4gICAgICBsZXQgZGF0YWxheW91dERlZiA9IHtcclxuICAgICAgICBkYXRhTGF5b3V0OiBTbWFydEdyaWREYXRhTGF5b3V0LkNPTFVNTixcclxuICAgICAgICBncmlkTGF5b3V0OiBTbWFydEdyaWREYXRhTGF5b3V0LkNPTFVNTixcclxuICAgICAgICB0eXBlOiBTbWFydEdyaWRUeXBlLkNVU1RPTSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS5kYXRhTGF5b3V0RGVmID0gZGF0YWxheW91dERlZjtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmN1c3RvbUNvbXBvbmVudCA9IHRoaXMuaW5qZWN0b3IuZ2V0KHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllciArICdDYXJkJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzTXVsdGlwbGVTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlID0gdGhpcy5zZXJ2aWNlIS5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uc2VsZWN0aW9uTW9kZTtcclxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlID09PSBHcmlkU2VsZWN0aW9uTW9kZS5NVUxUSVBMRTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xlYXJUcmVlKCkge1xyXG4gICAgdGhpcy50cmVlQ29udHJvbCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudHJlZURhdGFTb3VyY2UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRyZWVGbGF0dGVuZXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24gPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbmRlclRyZWUoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNsZWFyVGFibGUoKTtcclxuICAgIGlmICghdGhpcy50cmVlRGF0YVNvdXJjZSkge1xyXG4gICAgICB0aGlzLnRyZWVGbGF0dGVuZXIgPSBuZXcgTWF0VHJlZUZsYXR0ZW5lcihcclxuICAgICAgICB0aGlzLnRyYW5zZm9ybWVyLFxyXG4gICAgICAgIHRoaXMuZ2V0TGV2ZWwsXHJcbiAgICAgICAgdGhpcy5pc0V4cGFuZGFibGUsXHJcbiAgICAgICAgdGhpcy5nZXRDaGlsZHJlblxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnRyZWVDb250cm9sID0gbmV3IEZsYXRUcmVlQ29udHJvbDxHcmlkUm93Pih0aGlzLmdldExldmVsLCB0aGlzLmlzRXhwYW5kYWJsZSk7XHJcbiAgICAgIHRoaXMudHJlZURhdGFTb3VyY2UgPSBuZXcgTWF0VHJlZUZsYXREYXRhU291cmNlKHRoaXMudHJlZUNvbnRyb2wsIHRoaXMudHJlZUZsYXR0ZW5lcik7XHJcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbiA9IG5ldyBTZWxlY3Rpb25Nb2RlbDxHcmlkUm93Pih0aGlzLmlzTXVsdGlwbGVTZWxlY3Rpb24oKSk7XHJcbiAgICB9XHJcbiAgICBsZXQgbm9kZXMgPSB0aGlzLnRyZWVDb250cm9sPy5kYXRhTm9kZXM7XHJcbiAgICBsZXQgZXhwYW5kZWROb2RlczogKHN0cmluZyB8IHVuZGVmaW5lZClbXTtcclxuICAgIGlmIChub2Rlcykge1xyXG4gICAgICBleHBhbmRlZE5vZGVzID0gbm9kZXNcclxuICAgICAgICAuZmlsdGVyKChub2RlKSA9PiB0aGlzLnRyZWVDb250cm9sPy5pc0V4cGFuZGFibGUobm9kZSkpXHJcbiAgICAgICAgLmZpbHRlcigobm9kZSkgPT4gdGhpcy50cmVlQ29udHJvbD8uaXNFeHBhbmRlZChub2RlKSlcclxuICAgICAgICAubWFwKChub2RlKSA9PiBub2RlLmlkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGV4cGFuZGVkTm9kZXMgPSBbXTtcclxuICAgIH1cclxuICAgIHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwucGFnZS5yb3dzIS5mb3JFYWNoKChyb3c6IGFueSkgPT4gKHJvdy5sZXZlbCA9IHVuZGVmaW5lZCkpO1xyXG4gICAgdGhpcy50cmVlRGF0YVNvdXJjZS5kYXRhID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MhLmZpbHRlcigocm93KSA9PiAhcm93LnBhcmVudCk7XHJcbiAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmNsZWFyKCk7XHJcbiAgICB0aGlzLnRyZWVDb250cm9sPy5kYXRhTm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xyXG4gICAgICBpZiAobm9kZS5zZWxlY3RlZCkge1xyXG4gICAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbj8uc2VsZWN0KG5vZGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMudHJlZUNvbnRyb2w/LmNvbGxhcHNlQWxsKCk7XHJcbiAgICBleHBhbmRlZE5vZGVzLmZvckVhY2goKHJvd0lkKSA9PiB7XHJcbiAgICAgIGxldCByb3cgPSB0aGlzLnRyZWVDb250cm9sPy5kYXRhTm9kZXMuZmluZCgocm93KSA9PiByb3dJZCA9PT0gcm93LmlkKTtcclxuICAgICAgaWYgKHJvdykge1xyXG4gICAgICAgIHRoaXMudHJlZUNvbnRyb2w/LmV4cGFuZChyb3cpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldExldmVsID0gKG5vZGU6IGFueSkgPT4gbm9kZS5sZXZlbCA/PyAwO1xyXG5cclxuICBpc0V4cGFuZGFibGUgPSAobm9kZTogR3JpZFJvdykgPT4gKG5vZGUuY2hpbGRyZW4gJiYgbm9kZS5jaGlsZHJlbi5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlKTtcclxuXHJcbiAgZ2V0Q2hpbGRyZW4gPSAobm9kZTogR3JpZFJvdyk6IEdyaWRSb3dbXSA9PiB7XHJcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xyXG4gICAgICBsZXQgcm93cyA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwucGFnZS5yb3dzPy5maWx0ZXIoKHJvdykgPT5cclxuICAgICAgICBub2RlLmNoaWxkcmVuPy5zb21lKChjaGlsZCkgPT4gY2hpbGQgPT09IHJvdy5pZCEpXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyb3dzKSB7XHJcbiAgICAgICAgcmV0dXJuIHJvd3M7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBbXTtcclxuICB9O1xyXG5cclxuICBoYXNDaGlsZCA9IChfOiBudW1iZXIsIF9ub2RlRGF0YTogR3JpZFJvdykgPT4gdGhpcy5pc0V4cGFuZGFibGUoX25vZGVEYXRhKTtcclxuXHJcbiAgdHJhbnNmb3JtZXIgPSAocm93OiBHcmlkUm93LCBsZXZlbDogbnVtYmVyKSA9PiB7XHJcbiAgICAocm93IGFzIGFueSkubGV2ZWwgPSBsZXZlbDtcclxuICAgIHJldHVybiByb3c7XHJcbiAgfTtcclxuXHJcbiAgZ2V0VHJlZUl0ZW0ocm93OiBHcmlkUm93KTogc3RyaW5nIHtcclxuICAgIGxldCBjb2x1bW5zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IHRoaXMuc21hcnRHcmlkPy5ncmlkTW9kZWwudmlldz8ub3JkZXJlZENvbHVtbk5hbWVzO1xyXG4gICAgbGV0IGRhdGE6IGFueSA9IHJvdy5kYXRhITtcclxuICAgIGlmIChjb2x1bW5zICYmIGNvbHVtbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbCkgPT4gZGF0YVtjb2xdKS5qb2luKCcgJyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcm93LmlkITtcclxuICB9XHJcblxyXG4gIC8qKiBUb2dnbGUgdGhlIHRyZWVOb2RlIHNlbGVjdGlvbi4gU2VsZWN0L2Rlc2VsZWN0IGFsbCB0aGUgZGVzY2VuZGFudHMgbm9kZSAqL1xyXG4gIHRyZWVOb2RlU2VsZWN0aW9uVG9nZ2xlKG5vZGU6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGxldCBzZWxlY3Rpb25CZWZvcmUgPSB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQubWFwKChyb3cpID0+IHJvdy5pZCk7XHJcbiAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24udG9nZ2xlKG5vZGUpO1xyXG4gICAgaWYgKHRoaXMuaXNNdWx0aXBsZVNlbGVjdGlvbigpKSB7XHJcbiAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbCEuZ2V0RGVzY2VuZGFudHMobm9kZSk7XHJcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5pc1NlbGVjdGVkKG5vZGUpXHJcbiAgICAgICAgPyB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0KC4uLmRlc2NlbmRhbnRzKVxyXG4gICAgICAgIDogdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uLmRlc2VsZWN0KC4uLmRlc2NlbmRhbnRzKTtcclxuICAgICAgdGhpcy5jaGVja0FsbFBhcmVudHNTZWxlY3Rpb24obm9kZSk7XHJcbiAgICB9XHJcbiAgICBsZXQgc2VsZWN0aW9uQWZ0ZXIgPSB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uc2VsZWN0ZWQubWFwKChyb3cpID0+IHJvdy5pZCk7XHJcblxyXG4gICAgbGV0IHNlbGVjdGVkSWRzID0gc2VsZWN0aW9uQWZ0ZXIuZmlsdGVyKChzKSA9PiAhc2VsZWN0aW9uQmVmb3JlLmluY2x1ZGVzKHMpKTtcclxuICAgIGxldCB1bnNlbGVjdGVkSWRzID0gc2VsZWN0aW9uQmVmb3JlLmZpbHRlcigocykgPT4gIXNlbGVjdGlvbkFmdGVyLmluY2x1ZGVzKHMpKTtcclxuICAgIGlmICh0aGlzLmRldikge1xyXG4gICAgICAvLyB3aGVuIHNlcnZpY2UgY2FsbCBpcyBhY3RpdmUgKCFkZXYpLCBvblNlbGVjdCB3aWxsIHRvZ2dsZSByb3cuc2VsZWN0ZWRcclxuICAgICAgdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC5wYWdlLnJvd3NcclxuICAgICAgICA/LmZpbHRlcigocm93KSA9PiBzZWxlY3RlZElkcy5pbmNsdWRlcyhyb3cuaWQpKVxyXG4gICAgICAgIC5mb3JFYWNoKChyb3cpID0+IChyb3cuc2VsZWN0ZWQgPSB0cnVlKSk7XHJcbiAgICAgIHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzXHJcbiAgICAgICAgPy5maWx0ZXIoKHJvdykgPT4gdW5zZWxlY3RlZElkcy5pbmNsdWRlcyhyb3cuaWQpKVxyXG4gICAgICAgIC5mb3JFYWNoKChyb3cpID0+IChyb3cuc2VsZWN0ZWQgPSBmYWxzZSkpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5vblNlbGVjdFJvd3Moc2VsZWN0ZWRJZHMsIHVuc2VsZWN0ZWRJZHMpO1xyXG4gIH1cclxuXHJcbiAgY2hlY2tBbGxQYXJlbnRzU2VsZWN0aW9uKG5vZGU6IEdyaWRSb3cpOiB2b2lkIHtcclxuICAgIGxldCBwYXJlbnQ6IEdyaWRSb3cgfCBudWxsID0gdGhpcy5nZXRQYXJlbnROb2RlKG5vZGUpO1xyXG4gICAgd2hpbGUgKHBhcmVudCkge1xyXG4gICAgICB0aGlzLmNoZWNrUGFyZW50Tm9kZVNlbGVjdGlvbihwYXJlbnQpO1xyXG4gICAgICBwYXJlbnQgPSB0aGlzLmdldFBhcmVudE5vZGUocGFyZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNoZWNrUGFyZW50Tm9kZVNlbGVjdGlvbihub2RlOiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBub2RlU2VsZWN0ZWQgPSB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uaXNTZWxlY3RlZChub2RlKTtcclxuICAgIGNvbnN0IGRlc2NBbGxTZWxlY3RlZCA9IHRoaXMuZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlKTtcclxuICAgIGlmIChub2RlU2VsZWN0ZWQgJiYgIWRlc2NBbGxTZWxlY3RlZCkge1xyXG4gICAgICB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24uZGVzZWxlY3Qobm9kZSk7XHJcbiAgICB9IGVsc2UgaWYgKCFub2RlU2VsZWN0ZWQgJiYgZGVzY0FsbFNlbGVjdGVkKSB7XHJcbiAgICAgIHRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbi5zZWxlY3Qobm9kZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiBHZXQgdGhlIHBhcmVudCBub2RlIG9mIGEgbm9kZSAqL1xyXG4gIGdldFBhcmVudE5vZGUobm9kZTogR3JpZFJvdyk6IEdyaWRSb3cgfCBudWxsIHtcclxuICAgIGNvbnN0IGN1cnJlbnRMZXZlbCA9IHRoaXMuZ2V0TGV2ZWwobm9kZSk7XHJcblxyXG4gICAgaWYgKGN1cnJlbnRMZXZlbCA8IDEpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9IHRoaXMudHJlZUNvbnRyb2whLmRhdGFOb2Rlcy5pbmRleE9mKG5vZGUpIC0gMTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgY29uc3QgY3VycmVudE5vZGUgPSB0aGlzLnRyZWVDb250cm9sIS5kYXRhTm9kZXNbaV07XHJcblxyXG4gICAgICBpZiAodGhpcy5nZXRMZXZlbChjdXJyZW50Tm9kZSkgPCBjdXJyZW50TGV2ZWwpIHtcclxuICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgYWxsIHRoZSBkZXNjZW5kYW50cyBvZiB0aGUgbm9kZSBhcmUgc2VsZWN0ZWQuICovXHJcbiAgZGVzY2VuZGFudHNBbGxTZWxlY3RlZChub2RlOiBHcmlkUm93KTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMudHJlZUNvbnRyb2wgfHwgIXRoaXMudHJlZUNoZWNrbGlzdFNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IHRoaXMudHJlZUNvbnRyb2wuZ2V0RGVzY2VuZGFudHMobm9kZSk7XHJcbiAgICBjb25zdCBkZXNjQWxsU2VsZWN0ZWQgPVxyXG4gICAgICBkZXNjZW5kYW50cy5sZW5ndGggPiAwICYmXHJcbiAgICAgIGRlc2NlbmRhbnRzLmV2ZXJ5KChjaGlsZCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnRyZWVDaGVja2xpc3RTZWxlY3Rpb24hLmlzU2VsZWN0ZWQoY2hpbGQpO1xyXG4gICAgICB9KTtcclxuICAgIHJldHVybiBkZXNjQWxsU2VsZWN0ZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBwYXJ0IG9mIHRoZSBkZXNjZW5kYW50cyBhcmUgc2VsZWN0ZWQgKi9cclxuICBkZXNjZW5kYW50c1BhcnRpYWxseVNlbGVjdGVkKG5vZGU6IEdyaWRSb3cpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy50cmVlQ29udHJvbCB8fCAhdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gdGhpcy50cmVlQ29udHJvbC5nZXREZXNjZW5kYW50cyhub2RlKTtcclxuICAgIGxldCByZXN1bHQgPSBkZXNjZW5kYW50cy5zb21lKChjaGlsZCkgPT4gdGhpcy50cmVlQ2hlY2tsaXN0U2VsZWN0aW9uIS5pc1NlbGVjdGVkKGNoaWxkKSk7XHJcbiAgICBpZiAodGhpcy5pc011bHRpcGxlU2VsZWN0aW9uKCkpIHtcclxuICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmICF0aGlzLmRlc2NlbmRhbnRzQWxsU2VsZWN0ZWQobm9kZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBjb25zdHJ1Y3RIZWFkZXIoKTogUHJvbWlzZTxTbWFydFRhYmxlSGVhZGVyW10+IHtcclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cyAmJiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnBhZ2Uucm93cy5sZW5ndGgpIHtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC5wYWdlLnJvd3MubWFwKGFzeW5jIChncmlkUm93OiBHcmlkUm93KSA9PiB7XHJcbiAgICAgICAgICBsZXQgbmV3VWlBY3Rpb25zID0gZ3JpZFJvdy5hY3Rpb25zPy5maWx0ZXIoXHJcbiAgICAgICAgICAgICh1aUFjdGlvbjogYW55KSA9PiAhdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JzLmdldCh1aUFjdGlvbi5jb2RlISlcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgaWYgKG5ld1VpQWN0aW9ucykge1xyXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgICBuZXdVaUFjdGlvbnMubWFwKGFzeW5jICh1aUFjdGlvbjogVWlBY3Rpb24pID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBkZXNjcmlwdG9yOiBVaUFjdGlvbkRlc2NyaXB0b3IgPVxyXG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZT8uZ2V0QWN0aW9uRGVzY3JpcHRvcih1aUFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHtcclxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdWlBY3Rpb24uY29kZSA/PyAnQ09ERScsXHJcbiAgICAgICAgICAgICAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcclxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBVaUFjdGlvbkJ1dHRvblR5cGUuTk9STUFMLFxyXG4gICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JzLnNldCh1aUFjdGlvbi5jb2RlISwgZGVzY3JpcHRvcik7XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBvcmVkZXJlZERlc2NDb2x1bW5zID0gdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5vcmRlcmVkQ29sdW1uTmFtZXMubWFwKFxyXG4gICAgICAocHJvcGVydHlOYW1lOiBzdHJpbmcpID0+XHJcbiAgICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRNb2RlbC52aWV3IS5kZXNjcmlwdG9yIS5jb2x1bW5zIS5maW5kKFxyXG4gICAgICAgICAgKGNvbERlc2NyaXB0b3I6IEdyaWRDb2x1bW5NZXRhKSA9PiBjb2xEZXNjcmlwdG9yLnByb3BlcnR5TmFtZSA9PT0gcHJvcGVydHlOYW1lXHJcbiAgICAgICAgKVxyXG4gICAgKS5mbGF0TWFwKChmKSA9PiBmID8/IFtdKTtcclxuXHJcbiAgICBsZXQgaGVhZGVyID0gYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgIG9yZWRlcmVkRGVzY0NvbHVtbnMubWFwKGFzeW5jIChkZXNjQ29sdW1uOiBHcmlkQ29sdW1uTWV0YSk6IFByb21pc2U8U21hcnRUYWJsZUhlYWRlcj4gPT4ge1xyXG4gICAgICAgIGxldCBjdXN0b21UYWJsZUhlYWRlciA9IHRoaXMuc21hcnRHcmlkIS50YWJsZUNvbmZpZz8uY3VzdG9tU21hcnRUYWJsZUhlYWRlcnM/LmZpbmQoXHJcbiAgICAgICAgICAoaGVhZGVyOiBTbWFydFRhYmxlSGVhZGVyKSA9PiBoZWFkZXIucHJvcGVydHlOYW1lID09PSBkZXNjQ29sdW1uLnByb3BlcnR5TmFtZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IGZpbHRlckV4cHJlc3Npb25PcmRlckJ5SXRlbSA9IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldz8ub3JkZXJCeUxpc3Q/LmZpbmQoXHJcbiAgICAgICAgICAoZmlsdGVyRXhwcmVzc2lvbjogRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnkpID0+XHJcbiAgICAgICAgICAgIGZpbHRlckV4cHJlc3Npb24ucHJvcGVydHlOYW1lID09PSBkZXNjQ29sdW1uIS5wcm9wZXJ0eU5hbWVcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBvcmRlcjtcclxuICAgICAgICBsZXQgb3JkZXJOdW1iZXI7XHJcbiAgICAgICAgaWYgKGZpbHRlckV4cHJlc3Npb25PcmRlckJ5SXRlbSkge1xyXG4gICAgICAgICAgb3JkZXIgPVxyXG4gICAgICAgICAgICBmaWx0ZXJFeHByZXNzaW9uT3JkZXJCeUl0ZW0ub3JkZXIgPT09IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5Lk9yZGVyRW51bS5Bc2NcclxuICAgICAgICAgICAgICA/IFNtYXJ0VGFibGVPcmRlci5BU0NcclxuICAgICAgICAgICAgICA6IFNtYXJ0VGFibGVPcmRlci5ERVNDO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VydmljZS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICBvcmRlck51bWJlciA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QuZmluZEluZGV4KFxyXG4gICAgICAgICAgICAgIChmaWx0ZXI6IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5KSA9PiBmaWx0ZXIucHJvcGVydHlOYW1lID09PSBkZXNjQ29sdW1uIS5wcm9wZXJ0eU5hbWVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgb3JkZXJOdW1iZXIrKztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3JpZ25hbExhYmVsID0gY3VzdG9tVGFibGVIZWFkZXI/LmxhYmVsID8/IGRlc2NDb2x1bW4ubGFiZWw7XHJcbiAgICAgICAgbGV0IGxhYmVsID0gJyc7XHJcbiAgICAgICAgaWYgKCFkZXNjQ29sdW1uLmhpZGVMYWJlbCkge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc21hcnRHcmlkIS50cmFuc2xhdGVTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgIGxhYmVsID0gYXdhaXQgdGhpcy5zbWFydEdyaWQhLnRyYW5zbGF0ZVNlcnZpY2U/LmdldChvcmlnbmFsTGFiZWwpLnRvUHJvbWlzZSgpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGFiZWwgPSBvcmlnbmFsTGFiZWw7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcHJvcGVydGllcyA9IGN1c3RvbVRhYmxlSGVhZGVyPy5wcm9wZXJ0aWVzO1xyXG4gICAgICAgIGlmICghcHJvcGVydGllcykge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5PZmZzZXREYXRlVGltZScgfHxcclxuICAgICAgICAgICAgZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLnRpbWUuTG9jYWxEYXRlVGltZSdcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUZvcm1hdCA9IGRlc2NDb2x1bW4udHlwZUZvcm1hdCA/PyAneXl5eS5NTS5kZCBIOm1tJztcclxuICAgICAgICAgICAgcHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkRBVEVUSU1FLFxyXG4gICAgICAgICAgICAgIGRhdGVGb3JtYXQsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NDb2x1bW4udHlwZUNsYXNzID09PSAnamF2YS50aW1lLkxvY2FsRGF0ZScpIHtcclxuICAgICAgICAgICAgbGV0IGRhdGVGb3JtYXQgPSBkZXNjQ29sdW1uLnR5cGVGb3JtYXQgPz8gJ3l5eXkuTU0uZGQnO1xyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzID0ge1xyXG4gICAgICAgICAgICAgIHR5cGU6IFNtYXJ0VGFibGVIZWFkZXJQcm9wZXJ0eVR5cGUuREFURSxcclxuICAgICAgICAgICAgICBkYXRlRm9ybWF0LFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChkZXNjQ29sdW1uLnR5cGVDbGFzcyA9PT0gJ2phdmEudGltZS5Mb2NhbFRpbWUnKSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRlRm9ybWF0ID0gZGVzY0NvbHVtbi50eXBlRm9ybWF0ID8/ICdIOm1tJztcclxuICAgICAgICAgICAgcHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLlRJTUUsXHJcbiAgICAgICAgICAgICAgZGF0ZUZvcm1hdCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY0NvbHVtbi50eXBlQ2xhc3MgPT09ICdqYXZhLmxhbmcuQm9vbGVhbicpIHtcclxuICAgICAgICAgICAgcHJvcGVydGllcyA9IHtcclxuICAgICAgICAgICAgICB0eXBlOiBTbWFydFRhYmxlSGVhZGVyUHJvcGVydHlUeXBlLkNIRUNLQk9YLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLmN1c3RvbVRhYmxlSGVhZGVyLFxyXG4gICAgICAgICAgbGFiZWw6IGxhYmVsLFxyXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiAnZGF0YS4nICsgZGVzY0NvbHVtbi5wcm9wZXJ0eU5hbWUsXHJcbiAgICAgICAgICBvcmRlcixcclxuICAgICAgICAgIG9yZGVyTnVtYmVyLFxyXG4gICAgICAgICAgcHJvcGVydGllcyxcclxuICAgICAgICAgIHN0eWxlOiBkZXNjQ29sdW1uLnN0eWxlLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIGxldCBjb21wbGVtZW50ID0gdGhpcy5zbWFydEdyaWQhLnRhYmxlQ29uZmlnPy5jdXN0b21TbWFydFRhYmxlSGVhZGVycz8uZmlsdGVyKFxyXG4gICAgICAodGFibGVIZWFkZXI6IFNtYXJ0VGFibGVIZWFkZXIpID0+XHJcbiAgICAgICAgIWhlYWRlci5zb21lKCh0SDogU21hcnRUYWJsZUhlYWRlcikgPT4gdEgucHJvcGVydHlOYW1lLmluY2x1ZGVzKHRhYmxlSGVhZGVyLnByb3BlcnR5TmFtZSkpXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChjb21wbGVtZW50KSB7XHJcbiAgICAgIGhlYWRlci5wdXNoKC4uLmNvbXBsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8uc2ltcGxlQnV0dG9ucykge1xyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucy5zaW1wbGVCdXR0b25zLmZvckVhY2goKHVpQWN0aW9uQ29kZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaGVhZGVyLnB1c2goe1xyXG4gICAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiAnc2ltcGxlX2J1dHRvbnMnLFxyXG4gICAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgdHlwZTogU21hcnRUYWJsZUJ1dHRvblR5cGUuUkFJU0VELFxyXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmV4ZWN1dGUuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICAvLyBsYWJlbDogdGhpcy5idXR0b25UcmFuc2xhdG9yKHsgY29kZTogdWlBY3Rpb25Db2RlIH0pLFxyXG4gICAgICAgICAgICAgIGFyZ3M6IFtcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgY29kZTogdWlBY3Rpb25Db2RlLFxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXHJcbiAgICAgICAgICAgICAgc2hvd0J1dHRvbklmOiAocm93OiBhbnkpID0+XHJcbiAgICAgICAgICAgICAgICByb3cuYWN0aW9ucy5zb21lKChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uY29kZSA9PT0gdWlBY3Rpb25Db2RlO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWhlYWRlci5zb21lKChoZWFkZXI6IFNtYXJ0VGFibGVIZWFkZXIpID0+IGhlYWRlci5wcm9wZXJ0eU5hbWUgPT09ICdteV9tZW51JykpIHtcclxuICAgICAgaWYgKHRoaXMuc21hcnRHcmlkIS5vcHRpb25zPy5yb3dVaUFjdGlvblR5cGUgPT09IEdyaWRVaUFjdGlvblR5cGUuUE9QVVBfTUVOVSkge1xyXG4gICAgICAgIGxldCBpY29uID0gdGhpcy5ncmlkTWVudUljb24gPz8gJ21vcmVfdmVydCc7XHJcbiAgICAgICAgaGVhZGVyLnB1c2goe1xyXG4gICAgICAgICAgbGFiZWw6ICcnLFxyXG4gICAgICAgICAgcHJvcGVydHlOYW1lOiAnbXlfbWVudScsXHJcbiAgICAgICAgICBidXR0b25zOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICB0eXBlOiBTbWFydFRhYmxlQnV0dG9uVHlwZS5NRU5VLFxyXG4gICAgICAgICAgICAgIGNhbGxiYWNrOiB0aGlzLmV4ZWN1dGUuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICBpY29uOiBpY29uLFxyXG4gICAgICAgICAgICAgIG1lbnVJdGVtQnV0dG9uc1Byb3BlcnR5TmFtZTogJ2FjdGlvbnMnLFxyXG4gICAgICAgICAgICAgIHRyYW5zbGF0b3I6IHRoaXMuYnV0dG9uVHJhbnNsYXRvci5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAgIGFyZ3M6IFtdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIGlzU29ydGFibGU6IGZhbHNlLFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGhlYWRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvbkNoYW5nZVBhZ2UoZXZlbnQ6IFBhZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IG9mZnNldCA9IGV2ZW50LnBhZ2VTaXplICogZXZlbnQucGFnZUluZGV4O1xyXG4gICAgbGV0IGxpbWl0ID0gZXZlbnQucGFnZVNpemU7XHJcbiAgICB0aGlzLnBhZ2VJbmRleCA9IGV2ZW50LnBhZ2VJbmRleDtcclxuICAgIGF3YWl0IHRoaXMuc2VydmljZS5zZXRQYWdlKFxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXdVdWlkISxcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyLFxyXG4gICAgICBvZmZzZXQudG9TdHJpbmcoKSxcclxuICAgICAgbGltaXQudG9TdHJpbmcoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvblByaW1lQ2hhbmdlUGFnZShldmVudDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgb2Zmc2V0ID0gZXZlbnQuZmlyc3Q7XHJcbiAgICBsZXQgbGltaXQgPSBldmVudC5yb3dzO1xyXG4gICAgdGhpcy5wYWdlSW5kZXggPSBldmVudC5maXJzdDtcclxuICAgIGF3YWl0IHRoaXMuc2VydmljZS5zZXRQYWdlKFxyXG4gICAgICB0aGlzLnNtYXJ0R3JpZCEuZ3JpZE1vZGVsLnZpZXdVdWlkISxcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyLFxyXG4gICAgICBvZmZzZXQudG9TdHJpbmcoKSxcclxuICAgICAgbGltaXQudG9TdHJpbmcoKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZShhcmdzOiBhbnlbXSwgcm93OiBhbnksIHVpQWN0aW9uOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBfdWlBY3Rpb246IFVpQWN0aW9uO1xyXG5cclxuICAgIGlmICghdWlBY3Rpb24pIHtcclxuICAgICAgdWlBY3Rpb24gPSByb3cuYWN0aW9ucy5maWx0ZXIoKGFjdGlvbjogVWlBY3Rpb24pID0+IGFjdGlvbi5jb2RlID09PSBhcmdzWzBdLmNvZGUpWzBdO1xyXG4gICAgfVxyXG5cclxuICAgIF91aUFjdGlvbiA9IHsgLi4udWlBY3Rpb24gfTtcclxuICAgIGlmIChfdWlBY3Rpb24uZGlzYWJsZWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgX3VpQWN0aW9uLnBhcmFtcyA9IHtcclxuICAgICAgLi4udWlBY3Rpb24ucGFyYW1zLFxyXG4gICAgICBtb2RlbDogcm93LFxyXG4gICAgfTtcclxuXHJcbiAgICBsZXQgdWlBY3Rpb25Nb2RlbDogYW55ID0ge1xyXG4gICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMuc21hcnRHcmlkIS5zZXJ2aWNlVG9Vc2UsXHJcbiAgICAgIHVpQWN0aW9uOiBfdWlBY3Rpb24sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucz8udWlBY3Rpb25Nb2RlbENhbGxiYWNrKSB7XHJcbiAgICAgIHVpQWN0aW9uTW9kZWwgPSB0aGlzLnNtYXJ0R3JpZCEub3B0aW9ucyEudWlBY3Rpb25Nb2RlbENhbGxiYWNrKHVpQWN0aW9uTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc21hcnRHcmlkIS51aUFjdGlvblNlcnZpY2UudWlBY3Rpb25Nb2RlbCA9IHVpQWN0aW9uTW9kZWw7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEudWlBY3Rpb25TZXJ2aWNlLmV4ZWN1dGUoX3VpQWN0aW9uLCB7XHJcbiAgICAgIHdpZGdldElkOiB0aGlzLnNtYXJ0R3JpZCEuZ3JpZElkZW50aWZpZXIsXHJcbiAgICAgIG5vZGVJZDogcm93LmlkLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1dHRvblRyYW5zbGF0b3IodWlBY3Rpb246IFVpQWN0aW9uKTogVWlBY3Rpb25EZXNjcmlwdG9yIHtcclxuICAgIGxldCBkZXNjID0gdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JzLmdldCh1aUFjdGlvbi5jb2RlISk7XHJcbiAgICBpZiAoIWRlc2MpIHtcclxuICAgICAgZGVzYyA9IHtcclxuICAgICAgICB0aXRsZTogdWlBY3Rpb24uY29kZSEsXHJcbiAgICAgICAgdHlwZTogVWlBY3Rpb25CdXR0b25UeXBlLkZMQVQsXHJcbiAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIGlmICh1aUFjdGlvbi5kZXNjcmlwdG9yKSB7XHJcbiAgICAgIHRoaXMudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZS5tZXJnZUFjdGlvbkRlc2NyaXB0b3JJbnRvQ2xpZW50KHVpQWN0aW9uLmRlc2NyaXB0b3IhLCBkZXNjKTtcclxuICAgIH1cclxuICAgIHJldHVybiBkZXNjO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxheW91dERlZigpOiB0eXBlb2YgU21hcnRMYXlvdXREZWYge1xyXG4gICAgcmV0dXJuIFNtYXJ0TGF5b3V0RGVmO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ2xpY2soZ3JpZFJvdzogR3JpZFJvdyk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVPbkNsaWNrKGdyaWRSb3cpO1xyXG4gIH1cclxuICBwdWJsaWMgb25Eb3VibGVDbGljayhncmlkUm93OiBHcmlkUm93KTogdm9pZCB7XHJcbiAgICB0aGlzLmhhbmRsZU9uQ2xpY2soZ3JpZFJvdyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZU9uQ2xpY2soZ3JpZFJvdzogR3JpZFJvdyk6IHZvaWQge1xyXG4gICAgbGV0IGRlZmF1bHRSb3dBY3Rpb246IFVpQWN0aW9uIHwgdW5kZWZpbmVkO1xyXG4gICAgaWYgKHRoaXMuc2VydmljZS5ncmlkTW9kZWw/LmRlZmF1bHRSb3dBY3Rpb25zKSB7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnNlcnZpY2UuZ3JpZE1vZGVsLmRlZmF1bHRSb3dBY3Rpb25zLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRSb3dBY3Rpb25Db2RlID0gdGhpcy5zZXJ2aWNlLmdyaWRNb2RlbC5kZWZhdWx0Um93QWN0aW9uc1tpbmRleF07XHJcblxyXG4gICAgICAgIGRlZmF1bHRSb3dBY3Rpb24gPSBncmlkUm93LmFjdGlvbnMuZmluZChcclxuICAgICAgICAgICh1aUFjdGlvbjogVWlBY3Rpb24pID0+IHVpQWN0aW9uLmNvZGUgPT09IGRlZmF1bHRSb3dBY3Rpb25Db2RlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoZGVmYXVsdFJvd0FjdGlvbikge1xyXG4gICAgICAgICAgdGhpcy5leGVjdXRlKFtdLCBncmlkUm93LCBkZWZhdWx0Um93QWN0aW9uKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBvblNlbGVjdChyb3dJZDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmlzQmxvY2tlZCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5kZXYpIHtcclxuICAgICAgdGhpcy5yZW5kZXIoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMuc2VydmljZS5ncmlkTW9kZWwucGFnZS5yb3dzPy5maW5kKFxyXG4gICAgICAgIChncmlkUm93OiBHcmlkUm93KSA9PiBncmlkUm93LmlkID09PSByb3dJZFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3QodGhpcy5zbWFydEdyaWQhLCByb3chKTtcclxuICAgICAgdGhpcy5zbWFydEdyaWQhLnZpZXdDb250ZXh0U2VydmljZS5oYW5kbGVQZXJmb3JtQWN0aW9uUmVzcG9uc2Uodmlld0NvbnRleHRDaGFuZ2UpO1xyXG4gICAgICB0aGlzLnJlZnJlc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25TZWxlY3RBbGwoc2VsZWN0ZWQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuaXNCbG9ja2VkID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3RBbGwodGhpcy5zbWFydEdyaWQhLCBzZWxlY3RlZCk7XHJcbiAgICB0aGlzLnNtYXJ0R3JpZCEudmlld0NvbnRleHRTZXJ2aWNlLmhhbmRsZVBlcmZvcm1BY3Rpb25SZXNwb25zZSh2aWV3Q29udGV4dENoYW5nZSk7XHJcblxyXG4gICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uU2VsZWN0Um93cyhcclxuICAgIHNlbGVjdGVkSWRzOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdLFxyXG4gICAgdW5zZWxlY3RlZElkczogKHN0cmluZyB8IHVuZGVmaW5lZClbXVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5pc0Jsb2NrZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuZGV2KSB7XHJcbiAgICAgIHRoaXMucmVuZGVyKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgc2VsZWN0ZWQ6IHN0cmluZ1tdID0gc2VsZWN0ZWRJZHMuZmlsdGVyKChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcclxuICAgICAgbGV0IHVuc2VsZWN0ZWQ6IHN0cmluZ1tdID0gdW5zZWxlY3RlZElkcy5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiBpdGVtICE9PSB1bmRlZmluZWQpO1xyXG4gICAgICBjb25zdCB2aWV3Q29udGV4dENoYW5nZSA9IGF3YWl0IHRoaXMuc2VydmljZS5zZWxlY3RSb3dzKFxyXG4gICAgICAgIHRoaXMuc21hcnRHcmlkISxcclxuICAgICAgICBzZWxlY3RlZCxcclxuICAgICAgICB1bnNlbGVjdGVkXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkIS52aWV3Q29udGV4dFNlcnZpY2UuaGFuZGxlUGVyZm9ybUFjdGlvblJlc3BvbnNlKHZpZXdDb250ZXh0Q2hhbmdlKTtcclxuICAgICAgdGhpcy5yZWZyZXNoKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBvblJvd1NlbGVjdChldmVudDogVGFibGVSb3dTZWxlY3RFdmVudCkge1xyXG4gICAgYXdhaXQgdGhpcy5vblNlbGVjdChldmVudC5kYXRhLmlkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uUm93VW5zZWxlY3QoZXZlbnQ6IFRhYmxlUm93VW5TZWxlY3RFdmVudCkge1xyXG4gICAgYXdhaXQgdGhpcy5vblNlbGVjdChldmVudC5kYXRhLmlkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU2VsZWN0QWxsUm93KGV2ZW50OiBUYWJsZUhlYWRlckNoZWNrYm94VG9nZ2xlRXZlbnQpIHtcclxuICAgIGF3YWl0IHRoaXMub25TZWxlY3RBbGwoZXZlbnQuY2hlY2tlZCk7XHJcbiAgfVxyXG5cclxuICBlZGl0Q29sdW1ucygpOiB2b2lkIHtcclxuICAgIGxldCBkaWFsb2dEYXRhOiBTbWFydERpYWxvZ0RhdGEgPSB7XHJcbiAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICB0aXRsZTogJ09zemxvcG9rIHRlc3RyZXN6YWLDoXNhJyxcclxuICAgICAgfSxcclxuICAgICAgc2l6ZToge30sXHJcbiAgICAgIGN1c3RvbUNvbXBvbmVudDogVGFibGVMYXlvdXREZWZpbmVyQ29tcG9uZW50LFxyXG4gICAgICBjdXN0b21Db21wb25lbnRJbnB1dHM6IHtcclxuICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgIHV1aWQ6IHRoaXMudXVpZCxcclxuICAgICAgICAgIGlkZW50aWZpZXI6IHRoaXMuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllcixcclxuICAgICAgICAgIHZpZXc6IHRoaXMuc2VydmljZS5ncmlkTW9kZWwudmlldyxcclxuICAgICAgICAgIHNlcnZpY2U6IHRoaXMuc2VydmljZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGlhbG9nLm9wZW4oVGFibGVMYXlvdXREZWZpbmVyQ29tcG9uZW50LCB7IGRhdGE6IGRpYWxvZ0RhdGEgfSk7XHJcbiAgfVxyXG5cclxuICAvL1BSSU1FTkdcclxuICBjb2x1bW5zOiBHcmlkQ29sdW1uTWV0YVtdID0gW107XHJcbiAgbWVudUJ1dHRvbnMhOiBNZW51SXRlbVtdO1xyXG4gIEBWaWV3Q2hpbGQoJ21lbnUnKSBtZW51ITogTWVudTtcclxuICBvbk9wdGlvbnNDbGljayhldmVudDogRXZlbnQsIHJvdzogR3JpZFJvdykge1xyXG4gICAgdGhpcy5tZW51QnV0dG9ucyA9IFtdO1xyXG4gICAgcm93LmFjdGlvbnM/Lm1hcChhc3luYyAodWlBY3Rpb246IGFueSkgPT4ge1xyXG4gICAgICBsZXQgZGVzYyA9IGF3YWl0IHRoaXMudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZS5nZXRBY3Rpb25EZXNjcmlwdG9yKHVpQWN0aW9uKTtcclxuXHJcbiAgICAgIHRoaXMubWVudUJ1dHRvbnMucHVzaCh7XHJcbiAgICAgICAgbGFiZWw6IGRlc2M/LnRpdGxlID8/IHVpQWN0aW9uLmNvZGUsXHJcbiAgICAgICAgaWNvbjogJycsXHJcbiAgICAgICAgY29tbWFuZDogKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5leGVjdXRlKFtdLCByb3csIHVpQWN0aW9uKTtcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5tZW51LnRvZ2dsZShldmVudCk7XHJcbiAgfVxyXG5cclxuICBwcmV2aW91c211bHRpU29ydE1ldGE/OiBTb3J0TWV0YVtdO1xyXG4gIGFzeW5jIGdyaWRTb3J0KGV2ZW50OiBhbnkpIHtcclxuICAgIGxldCBvcmRlckJ5TGlzdDogQXJyYXk8RmlsdGVyRXhwcmVzc2lvbk9yZGVyQnk+ID0gW107XHJcblxyXG4gICAgZXZlbnQubXVsdGlzb3J0bWV0YT8ubWFwKChtZXRhOiBTb3J0TWV0YSwgaW5kZXg6IG51bWJlcikgPT4ge1xyXG4gICAgICBpZiAodGhpcy5wcmV2aW91c211bHRpU29ydE1ldGEgJiYgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhLm1hcCgob3JkZXIpID0+IHtcclxuICAgICAgICAgIGlmIChtZXRhLmZpZWxkID09PSBvcmRlci5maWVsZCAmJiBvcmRlci5vcmRlciAhPSBtZXRhLm9yZGVyKSB7XHJcbiAgICAgICAgICAgIHN3aXRjaCAob3JkZXIub3JkZXIpIHtcclxuICAgICAgICAgICAgICBjYXNlIC0xOlxyXG4gICAgICAgICAgICAgICAgZXZlbnQubXVsdGlzb3J0bWV0YSEuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGEgPSBldmVudC5tdWx0aXNvcnRtZXRhO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIGV2ZW50Lm11bHRpc29ydG1ldGE/Lm1hcCgobWV0YTogYW55KSA9PiB7XHJcbiAgICAgIG9yZGVyQnlMaXN0LnB1c2goe1xyXG4gICAgICAgIHByb3BlcnR5TmFtZTogbWV0YS5maWVsZCxcclxuICAgICAgICBvcmRlcjpcclxuICAgICAgICAgIG1ldGEub3JkZXIgPT09IDFcclxuICAgICAgICAgICAgPyBGaWx0ZXJFeHByZXNzaW9uT3JkZXJCeU9yZGVyRW51bS5BU0NcclxuICAgICAgICAgICAgOiBtZXRhLm9yZGVyID09PSAtMVxyXG4gICAgICAgICAgICA/IEZpbHRlckV4cHJlc3Npb25PcmRlckJ5T3JkZXJFbnVtLkRFU0NcclxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnNvcnQodGhpcy5zbWFydEdyaWQhLCB7XHJcbiAgICAgIG9yZGVyQnlMaXN0OiBvcmRlckJ5TGlzdCxcclxuICAgICAgb3JkZXJlZENvbHVtbk5hbWVzOiB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lcyEsXHJcbiAgICB9KTtcclxuICB9XHJcbiAgbGF6eUxvYWQoZXZlbnQ/OiBUYWJsZUxhenlMb2FkRXZlbnQpIHtcclxuICAgIHRoaXMucHJldmlvdXNtdWx0aVNvcnRNZXRhID0gW107XHJcbiAgICB0aGlzLnNtYXJ0R3JpZD8uZ3JpZE1vZGVsLnZpZXc/Lm9yZGVyQnlMaXN0Lm1hcCgob3JkZXIpID0+IHtcclxuICAgICAgdGhpcy5wcmV2aW91c211bHRpU29ydE1ldGE/LnB1c2goe1xyXG4gICAgICAgIGZpZWxkOiBvcmRlci5wcm9wZXJ0eU5hbWUhLFxyXG4gICAgICAgIG9yZGVyOiBvcmRlci5vcmRlciA9PT0gRmlsdGVyRXhwcmVzc2lvbk9yZGVyQnlPcmRlckVudW0uQVNDID8gMSA6IC0xLFxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgZXZlbnQhLm11bHRpU29ydE1ldGEgPSB0aGlzLnByZXZpb3VzbXVsdGlTb3J0TWV0YTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGhlYWRlckNoYW5nZShldmVudDogTXVsdGlTZWxlY3RDaGFuZ2VFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGdyaWRVcGRhdGVEYXRhOiBHcmlkVXBkYXRlRGF0YSA9IHtcclxuICAgICAgb3JkZXJCeUxpc3Q6IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QsXHJcbiAgICAgIG9yZGVyZWRDb2x1bW5OYW1lczogdGhpcy5nZXRPcmRlckNvbHVtTmFtZXMoZXZlbnQudmFsdWUhKSxcclxuICAgIH07XHJcblxyXG4gICAgYXdhaXQgdGhpcy5zZXJ2aWNlLnVwZGF0ZSh0aGlzLnV1aWQhLCB0aGlzLnNtYXJ0R3JpZD8uZ3JpZElkZW50aWZpZXIhLCBncmlkVXBkYXRlRGF0YSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkNvbE9yZGVyKGV2ZW50OiBUYWJsZUNvbHVtblJlb3JkZXJFdmVudCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGdyaWRVcGRhdGVEYXRhOiBHcmlkVXBkYXRlRGF0YSA9IHtcclxuICAgICAgb3JkZXJCeUxpc3Q6IHRoaXMuc21hcnRHcmlkIS5ncmlkTW9kZWwudmlldyEub3JkZXJCeUxpc3QsXHJcbiAgICAgIG9yZGVyZWRDb2x1bW5OYW1lczogdGhpcy5nZXRPcmRlckNvbHVtTmFtZXMoZXZlbnQuY29sdW1ucyEpLFxyXG4gICAgfTtcclxuICAgIGF3YWl0IHRoaXMuc2VydmljZS51cGRhdGUodGhpcy51dWlkISwgdGhpcy5zbWFydEdyaWQhLmdyaWRJZGVudGlmaWVyISwgZ3JpZFVwZGF0ZURhdGEpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T3JkZXJDb2x1bU5hbWVzKGNvbHVtbnM6IEdyaWRDb2x1bW5NZXRhW10pOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gY29sdW1ucy5tYXAoKGNvbHVtOiBHcmlkQ29sdW1uTWV0YSkgPT4ge1xyXG4gICAgICByZXR1cm4gY29sdW0ucHJvcGVydHlOYW1lO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRDb2xWYWx1ZShjb2w6IHN0cmluZywgcm93OiBhbnkpIHtcclxuICAgIGlmIChyb3cuaWNvbnNbY29sXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbC5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIGxldCBwYXRoQXJyYXkgPSBjb2wuc3BsaXQoJy4nKTtcclxuICAgICAgbGV0IGNvbFZhbHVlID0gcm93LmRhdGE7XHJcbiAgICAgIHBhdGhBcnJheS5tYXAoKHBhdGgpID0+IHtcclxuICAgICAgICBpZiAoY29sVmFsdWUgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBjb2xWYWx1ZSA9IHJvdy5kYXRhW2NvbF07XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbFZhbHVlID0gY29sVmFsdWVbcGF0aF07XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGNvbFZhbHVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJvdy5kYXRhW2NvbF07XHJcbiAgfVxyXG5cclxuICBnZXRJbWFnZVJlc291cmNlSWNvbnMocm93OiBhbnksIGhlYWRlcjogc3RyaW5nKTogSW1hZ2VSZXNvdXJjZVtdIHtcclxuICAgIGlmIChyb3c/Lmljb25zKSB7XHJcbiAgICAgIGxldCBpY29uQ29kZXMgPSByb3c/Lmljb25zW2hlYWRlcl07XHJcbiAgICAgIHJldHVybiBpY29uQ29kZXM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gW107XHJcbiAgfVxyXG4gIGdldEltYWdlUmVzb3VyY2VTdHlsZShyZXNvdXJjZTogSW1hZ2VSZXNvdXJjZSk6IGFueSB7XHJcbiAgICByZXR1cm4gcmVzb3VyY2Uuc3R5bGUgPyByZXNvdXJjZS5zdHlsZSA6IHt9O1xyXG4gIH1cclxufVxyXG4iLCJAaWYoY29tcExpYiA9PT0gY29tcG9uZW50TGlicmFyeS5QUklNRU5HKSB7XHJcbjxkaXYgKm5nSWY9XCJzbWFydEdyaWRcIiBjbGFzcz1cInByaW1lU21hcnRHcmlkLWNvbnRhaW5lclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJzbWFydC1ncmlkLXRvb2xiYXJcIj5cclxuICAgIDxzbWFydC11aS1hY3Rpb24tdG9vbGJhciAjdG9vbGJhciBbaWRdPVwiJ2dyaWRfbm90X2luaXRpYWxpemVkJ1wiPjwvc21hcnQtdWktYWN0aW9uLXRvb2xiYXI+XHJcbiAgPC9kaXY+XHJcbiAgPHAtdGFibGVcclxuICAgICpuZ0lmPVwiIXNtYXJ0R3JpZC5sYXlvdXREZWYgfHwgc21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuVEFCTEVcIlxyXG4gICAgI3BUYWJsZVxyXG4gICAgW3ZhbHVlXT1cInNtYXJ0R3JpZC5ncmlkTW9kZWwucGFnZS5yb3dzIVwiXHJcbiAgICAob25Tb3J0KT1cImdyaWRTb3J0KCRldmVudClcIlxyXG4gICAgW2N1c3RvbVNvcnRdPVwidHJ1ZVwiXHJcbiAgICBbc29ydE1vZGVdPVwiJ211bHRpcGxlJ1wiXHJcbiAgICBbbGF6eV09XCJ0cnVlXCJcclxuICAgIChvbkxhenlMb2FkKT1cImxhenlMb2FkKCRldmVudClcIlxyXG4gICAgW3Jlb3JkZXJhYmxlQ29sdW1uc109XCJzbWFydEdyaWQuZ3JpZE1vZGVsLnZpZXc/LmRlc2NyaXB0b3I/LnNob3dFZGl0Q29sdW1uc1wiXHJcbiAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgIChvbkNvbFJlb3JkZXIpPVwib25Db2xPcmRlcigkZXZlbnQpXCJcclxuICAgIChvblJvd1NlbGVjdCk9XCJvblJvd1NlbGVjdCgkZXZlbnQpXCJcclxuICAgIChvblJvd1Vuc2VsZWN0KT1cIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiXHJcbiAgICBbc2VsZWN0aW9uXT1cInNlbGVjdGVkUm93c1wiXHJcbiAgICAob25IZWFkZXJDaGVja2JveFRvZ2dsZSk9XCJvblNlbGVjdEFsbFJvdygkZXZlbnQpXCJcclxuICAgIGRhdGFLZXk9XCJpZFwiXHJcbiAgPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNtYXJ0R3JpZC5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uc2hvd0VkaXRDb2x1bW5zXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNtYXJ0R3JpZC5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uc2hvd0VkaXRDb2x1bW5zXCI+XHJcbiAgICAgICAgICA8cC1tdWx0aVNlbGVjdFxyXG4gICAgICAgICAgICBkaXNwbGF5PVwiY2hpcFwiXHJcbiAgICAgICAgICAgIFtvcHRpb25zXT1cInNtYXJ0R3JpZC5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uY29sdW1uc1wiXHJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxyXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNvbHVtbnNcIlxyXG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0gY29sdW1ucyBzZWxlY3RlZFwiXHJcbiAgICAgICAgICAgIFtzdHlsZV09XCJ7ICdtaW4td2lkdGgnOiAnMjAwcHgnIH1cIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkNob29zZSBDb2x1bW5zXCJcclxuICAgICAgICAgICAgKG9uQ2hhbmdlKT1cImhlYWRlckNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgPHRyICpuZ0lmPVwic21hcnRHcmlkLmdyaWRNb2RlbC52aWV3Py5kZXNjcmlwdG9yPy5zaG93RWRpdENvbHVtbnNcIj5cclxuICAgICAgICA8dGhcclxuICAgICAgICAgICpuZ0lmPVwiaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIlxyXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNHJlbVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAvPlxyXG4gICAgICAgIDwvdGg+XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICAqbmdJZj1cIiFpc011bHRpcGxlICYmICh0YWJsZVR5cGUgPT09ICdjaGVja2JveCcgfHwgdGFibGVUeXBlID09PSAnQ2hlY2tCb3gnKVwiXHJcbiAgICAgICAgICBzdHlsZT1cIndpZHRoOiA0cmVtXCJcclxuICAgICAgICA+PC90aD5cclxuICAgICAgICA8dGggW3BTb3J0YWJsZUNvbHVtbl09XCJjb2wucHJvcGVydHlOYW1lXCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCIgcFJlb3JkZXJhYmxlQ29sdW1uPlxyXG4gICAgICAgICAgPHAtc29ydEljb24gW2ZpZWxkXT1cImNvbC5wcm9wZXJ0eU5hbWVcIiAvPlxyXG4gICAgICAgICAge3sgY29sLmxhYmVsIH19XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGg+PC90aD5cclxuICAgICAgPC90cj5cclxuICAgICAgPHRyICpuZ0lmPVwiIXNtYXJ0R3JpZC5ncmlkTW9kZWwudmlldz8uZGVzY3JpcHRvcj8uc2hvd0VkaXRDb2x1bW5zXCI+XHJcbiAgICAgICAgPHRoXHJcbiAgICAgICAgICAqbmdJZj1cImlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCJcclxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDRyZW1cIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggLz5cclxuICAgICAgICA8L3RoPlxyXG4gICAgICAgIDx0aFxyXG4gICAgICAgICAgKm5nSWY9XCIhaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIlxyXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNHJlbVwiXHJcbiAgICAgICAgPjwvdGg+XHJcbiAgICAgICAgPHRoIFtwU29ydGFibGVDb2x1bW5dPVwiY29sLnByb3BlcnR5TmFtZVwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgPHAtc29ydEljb24gW2ZpZWxkXT1cImNvbC5wcm9wZXJ0eU5hbWVcIiAvPlxyXG4gICAgICAgICAge3sgY29sLmxhYmVsIH19XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGg+PC90aD5cclxuICAgICAgPC90cj5cclxuICAgICAgPCEtLSAgPHRyPlxyXG4gICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgY29sIG9mIHNtYXJ0R3JpZD8uZ3JpZE1vZGVsPy52aWV3Py5vcmRlcmVkQ29sdW1uTmFtZXNcIj5cclxuICAgICAgICAgIDxwLWNvbHVtbkZpbHRlclxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIFtmaWVsZF09XCInZGF0YS4nICsgY29sXCJcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWFyY2ggYnkgJyArIGNvbFwiXHJcbiAgICAgICAgICAgIFthcmlhTGFiZWxdPVwiJ0ZpbHRlciAnICsgY29sXCJcclxuICAgICAgICAgIC8+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgPC90cj4gLS0+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcm93PlxyXG4gICAgICA8dHIgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2socm93KVwiICpuZ0lmPVwicm93ICYmIHJvdy5kYXRhXCI+XHJcbiAgICAgICAgPHRkICpuZ0lmPVwiaXNNdWx0aXBsZSAmJiAodGFibGVUeXBlID09PSAnY2hlY2tib3gnIHx8IHRhYmxlVHlwZSA9PT0gJ0NoZWNrQm94JylcIj5cclxuICAgICAgICAgIDxwLXRhYmxlQ2hlY2tib3ggKm5nSWY9XCJyb3cuc2VsZWN0YWJsZSAhPSBmYWxzZVwiIFt2YWx1ZV09XCJyb3dcIiAvPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkICpuZ0lmPVwiIWlzTXVsdGlwbGUgJiYgKHRhYmxlVHlwZSA9PT0gJ2NoZWNrYm94JyB8fCB0YWJsZVR5cGUgPT09ICdDaGVja0JveCcpXCI+XHJcbiAgICAgICAgICA8cC10YWJsZVJhZGlvQnV0dG9uIFt2YWx1ZV09XCJyb3dcIiAvPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkICpuZ0Zvcj1cImxldCBjb2wgb2Ygc21hcnRHcmlkPy5ncmlkTW9kZWw/LnZpZXc/Lm9yZGVyZWRDb2x1bW5OYW1lc1wiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cInJvdy5pY29uc1tjb2xdXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFydC10YWJsZS1pY29uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGlyIG9mIGdldEltYWdlUmVzb3VyY2VJY29ucyhyb3csIGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgcFRvb2x0aXA9XCJ7eyBpci50b29sdGlwPy50b29sdGlwIH19XCJcclxuICAgICAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwicmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlJpZ2h0XCJcclxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiZ2V0SW1hZ2VSZXNvdXJjZVN0eWxlKGlyKVwiXHJcbiAgICAgICAgICAgICAgICAgID48c21hcnQtaWNvbiBbaWNvbl09XCJpci5pZGVudGlmaWVyIVwiIFtjb2xvcl09XCJpci5jb2xvciFcIj4gPC9zbWFydC1pY29uXHJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXJvdy5pY29uc1tjb2xdXCIgW2lubmVySHRtbF09XCJnZXRDb2xWYWx1ZShjb2wsIHJvdylcIj4gPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgY2xhc3M9XCJtZW51LWJ1dHRvblwiPlxyXG4gICAgICAgICAgPHAtYnV0dG9uXHJcbiAgICAgICAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbdGV4dF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgKm5nSWY9XCJyb3cuYWN0aW9ucyAmJiByb3cuYWN0aW9ucy5sZW5ndGggPiAwXCJcclxuICAgICAgICAgICAgKG9uQ2xpY2spPVwib25PcHRpb25zQ2xpY2soJGV2ZW50LCByb3cpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPHNtYXJ0LWljb24gaWNvbj1cImVsbGlwc2lzLXZcIj48L3NtYXJ0LWljb24+XHJcbiAgICAgICAgICA8L3AtYnV0dG9uPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvcC10YWJsZT5cclxuICA8ZGl2XHJcbiAgICAqbmdJZj1cInNtYXJ0R3JpZC5sYXlvdXREZWYgPT09IGxheW91dERlZigpLkNBUkQgJiYgc21hcnRHcmlkLmRhdGFMYXlvdXREZWZcIlxyXG4gICAgY2xhc3M9XCJjYXJkcy1jb250YWluZXJcIlxyXG4gICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAnZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zJzpcclxuICAgICAgICBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgPyAncmVwZWF0KCcgKyBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gKyAnLCAxZnIpJ1xyXG4gICAgICAgICAgOiAnJ1xyXG4gICAgfVwiXHJcbiAgPlxyXG4gICAgPGFwcC1zbWFydC1ncmlkLWNhcmRcclxuICAgICAgY2xhc3M9XCJzbWFydEdyaWQtY2FyZC1jb250YWluZXJcIlxyXG4gICAgICAqbmdGb3I9XCJsZXQgdGFzayBvZiBzbWFydEdyaWQuZ3JpZE1vZGVsLnBhZ2Uucm93c1wiXHJcbiAgICAgIFtpdGVtXT1cInRhc2tcIlxyXG4gICAgICBbc21hcnRHcmlkXT1cInNtYXJ0R3JpZFwiXHJcbiAgICAgIFtvblNlbGVjdF09XCJvblNlbGVjdC5iaW5kKHRoaXMpXCJcclxuICAgID48L2FwcC1zbWFydC1ncmlkLWNhcmQ+XHJcbiAgPC9kaXY+XHJcbiAgPHAtcGFnaW5hdG9yXHJcbiAgICAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3JcIlxyXG4gICAgW2ZpcnN0XT1cInBhZ2VJbmRleCFcIlxyXG4gICAgW3RvdGFsUmVjb3Jkc109XCJsZW5ndGghXCJcclxuICAgIFtyb3dzXT1cInBhZ2VTaXplXCJcclxuICAgIFtyb3dzUGVyUGFnZU9wdGlvbnNdPVwicGFnZVNpemVPcHRpb25zXCJcclxuICAgIChvblBhZ2VDaGFuZ2UpPVwib25QcmltZUNoYW5nZVBhZ2UoJGV2ZW50KVwiXHJcbiAgICBbc2hvd0N1cnJlbnRQYWdlUmVwb3J0XT1cInRydWVcIlxyXG4gICAgZHJvcGRvd25BcHBlbmRUbz1cImJvZHlcIlxyXG4gIC8+XHJcbiAgPHAtbWVudSAjbWVudSBbbW9kZWxdPVwibWVudUJ1dHRvbnNcIiBbcG9wdXBdPVwidHJ1ZVwiIGFwcGVuZFRvPVwiYm9keVwiPiA8L3AtbWVudT5cclxuPC9kaXY+XHJcbn1AZWxzZSB7XHJcbjxkaXYgKm5nSWY9XCJzbWFydEdyaWRcIiBjbGFzcz1cInNtYXJ0R3JpZC1jb250YWluZXJcIj5cclxuICA8ZGl2IGNsYXNzPVwic21hcnQtZ3JpZC10b29sYmFyXCI+XHJcbiAgICA8c21hcnQtdWktYWN0aW9uLXRvb2xiYXIgI3Rvb2xiYXIgW2lkXT1cIidncmlkX25vdF9pbml0aWFsaXplZCdcIj48L3NtYXJ0LXVpLWFjdGlvbi10b29sYmFyPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAoY2xpY2spPVwiZWRpdENvbHVtbnMoKVwiXHJcbiAgICAgIG1hdC1taW5pLWZhYlxyXG4gICAgICBjb2xvcj1cInRleHQtcHJpbWFyeVwiXHJcbiAgICAgICpuZ0lmPVwic21hcnRHcmlkLnNob3dFZGl0Q29sdW1uc1wiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgYXJpYS1sYWJlbD1cIkNvbHVtbnNcIiBjbGFzcz1cInNtYXJ0LWdyaWQtZWRpdC1pY29uXCJcclxuICAgICAgICA+dmlld19jb2x1bW5zPC9tYXQtaWNvblxyXG4gICAgICA+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuICA8IS0tIDxkaXYgW25nQ2xhc3NdPVwiaXNCbG9ja2VkID8gJ2Jsb2NrZWQnIDogJydcIj48L2Rpdj4gLS0+XHJcbiAgPGRpdiBjbGFzcz1cInNtYXJ0R3JpZENvbnRlbnRcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQuc2hvd1Jlc3VsdENvdW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNtYXJ0R3JpZC1kYXRhLW51bWJlclwiPlxyXG4gICAgICAgICAge3sgc21hcnRHcmlkLmdyaWRNb2RlbC50b3RhbFJvd0NvdW50IH19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cInNtYXJ0LWdyaWQtdGFibGUtY29udGFpbmVyXCI+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjdGFibGU+PC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5FWFBBTkRBQkxFXCI+XHJcbiAgICAgIDxzbWFydC1leHBhbmRhYmxlLXNlY3Rpb25cclxuICAgICAgICAjZ3JpZEV4cGFuZGFibGVTZWN0aW9uXHJcbiAgICAgICAgKm5nRm9yPVwibGV0IGV4cGFuZGFibGVTZWN0aW9uIG9mIGV4cGFuZGFibGVTZWN0aW9uc1wiXHJcbiAgICAgICAgW2RhdGFdPVwiZXhwYW5kYWJsZVNlY3Rpb25cIlxyXG4gICAgICA+PC9zbWFydC1leHBhbmRhYmxlLXNlY3Rpb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXZcclxuICAgICAgKm5nSWY9XCJzbWFydEdyaWQubGF5b3V0RGVmID09PSBsYXlvdXREZWYoKS5DQVJEICYmIHNtYXJ0R3JpZC5kYXRhTGF5b3V0RGVmXCJcclxuICAgICAgY2xhc3M9XCJjYXJkcy1jb250YWluZXJcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucyc6XHJcbiAgICAgICAgICBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICA/ICdyZXBlYXQoJyArIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiArICcsIDFmciknXHJcbiAgICAgICAgICAgIDogJydcclxuICAgICAgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxhcHAtc21hcnQtZ3JpZC1jYXJkXHJcbiAgICAgICAgY2xhc3M9XCJzbWFydEdyaWQtY2FyZC1jb250YWluZXJcIlxyXG4gICAgICAgICpuZ0Zvcj1cImxldCB0YXNrIG9mIHNtYXJ0R3JpZC5ncmlkTW9kZWwucGFnZS5yb3dzXCJcclxuICAgICAgICBbaXRlbV09XCJ0YXNrXCJcclxuICAgICAgICBbc21hcnRHcmlkXT1cInNtYXJ0R3JpZFwiXHJcbiAgICAgICAgW29uU2VsZWN0XT1cIm9uU2VsZWN0LmJpbmQodGhpcylcIlxyXG4gICAgICA+PC9hcHAtc21hcnQtZ3JpZC1jYXJkPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2XHJcbiAgICAgICpuZ0lmPVwic21hcnRHcmlkLmxheW91dERlZiA9PT0gbGF5b3V0RGVmKCkuVFJFRSAmJiB0cmVlQ29udHJvbFwiXHJcbiAgICAgIGNsYXNzPVwidHJlZS1jb250YWluZXJcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgJ2dyaWQtdGVtcGxhdGUtY29sdW1ucyc6XHJcbiAgICAgICAgICBzbWFydEdyaWQubnVtYmVyT2ZDb2x1bW4gIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICA/ICdyZXBlYXQoJyArIHNtYXJ0R3JpZC5udW1iZXJPZkNvbHVtbiArICcsIDFmciknXHJcbiAgICAgICAgICAgIDogJydcclxuICAgICAgfVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtdHJlZSBbZGF0YVNvdXJjZV09XCJ0cmVlRGF0YVNvdXJjZSFcIiBbdHJlZUNvbnRyb2xdPVwidHJlZUNvbnRyb2whXCI+XHJcbiAgICAgICAgPG1hdC10cmVlLW5vZGVcclxuICAgICAgICAgICptYXRUcmVlTm9kZURlZj1cImxldCBub2RlXCJcclxuICAgICAgICAgIG1hdFRyZWVOb2RlVG9nZ2xlXHJcbiAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdcclxuICAgICAgICAgIG1hdFRyZWVOb2RlUGFkZGluZ0luZGVudD1cIjI0XCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBkaXNhYmxlZCBjbGFzcz1cInRyZWUtYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgIGNsYXNzPVwiY2hlY2tsaXN0LWxlYWYtbm9kZVwiXHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmlzU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICAoY2hhbmdlKT1cInRyZWVOb2RlU2VsZWN0aW9uVG9nZ2xlKG5vZGUpXCJcclxuICAgICAgICAgICAgPnt7IGdldFRyZWVJdGVtKG5vZGUpIH19PC9tYXQtY2hlY2tib3hcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC10cmVlLW5vZGU+XHJcblxyXG4gICAgICAgIDxtYXQtdHJlZS1ub2RlXHJcbiAgICAgICAgICAqbWF0VHJlZU5vZGVEZWY9XCJsZXQgbm9kZTsgd2hlbjogaGFzQ2hpbGRcIlxyXG4gICAgICAgICAgbWF0VHJlZU5vZGVQYWRkaW5nXHJcbiAgICAgICAgICBtYXRUcmVlTm9kZVBhZGRpbmdJbmRlbnQ9XCIyNFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgbWF0VHJlZU5vZGVUb2dnbGVcclxuICAgICAgICAgICAgY2xhc3M9XCJ0cmVlLWJ1dHRvblwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1RvZ2dsZSAnICsgbm9kZS5pdGVtXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24tcnRsLW1pcnJvclwiPlxyXG4gICAgICAgICAgICAgIHt7IHRyZWVDb250cm9sIS5pc0V4cGFuZGVkKG5vZGUpID8gJ2V4cGFuZF9tb3JlJyA6ICdjaGV2cm9uX3JpZ2h0JyB9fVxyXG4gICAgICAgICAgICA8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8bWF0LWNoZWNrYm94XHJcbiAgICAgICAgICAgIFtjaGVja2VkXT1cInRyZWVDaGVja2xpc3RTZWxlY3Rpb24/LmlzU2VsZWN0ZWQobm9kZSlcIlxyXG4gICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJkZXNjZW5kYW50c1BhcnRpYWxseVNlbGVjdGVkKG5vZGUpXCJcclxuICAgICAgICAgICAgKGNoYW5nZSk9XCJ0cmVlTm9kZVNlbGVjdGlvblRvZ2dsZShub2RlKVwiXHJcbiAgICAgICAgICAgID57eyBnZXRUcmVlSXRlbShub2RlKSB9fTwvbWF0LWNoZWNrYm94XHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtdHJlZS1ub2RlPlxyXG4gICAgICA8L21hdC10cmVlPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxtYXQtcGFnaW5hdG9yXHJcbiAgICAqbmdJZj1cInNtYXJ0R3JpZC5wYWdpbmF0b3IgJiYgIXRyZWVDb250cm9sXCJcclxuICAgICNwYWdpbmF0b3JcclxuICAgIFtsZW5ndGhdPVwibGVuZ3RoXCJcclxuICAgIFtwYWdlSW5kZXhdPVwicGFnZUluZGV4XCJcclxuICAgIFtwYWdlU2l6ZV09XCJwYWdlU2l6ZVwiXHJcbiAgICBbcGFnZVNpemVPcHRpb25zXT1cInBhZ2VTaXplT3B0aW9uc1wiXHJcbiAgICAocGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiXHJcbiAgPjwvbWF0LXBhZ2luYXRvcj5cclxuPC9kaXY+XHJcbn1cclxuIl19