@sapui5/sap.fe.core 1.97.0 → 1.99.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 (249) hide show
  1. package/package.json +5 -4
  2. package/src/sap/fe/core/.library +1 -1
  3. package/src/sap/fe/core/AnnotationHelper.js +377 -405
  4. package/src/sap/fe/core/AnnotationHelper.ts +385 -0
  5. package/src/sap/fe/core/AppComponent.js +6 -3
  6. package/src/sap/fe/core/AppStateHandler.js +229 -181
  7. package/src/sap/fe/core/AppStateHandler.ts +171 -0
  8. package/src/sap/fe/core/BaseController.js +3 -2
  9. package/src/sap/fe/core/BusyLocker.js +105 -121
  10. package/src/sap/fe/core/BusyLocker.ts +98 -0
  11. package/src/sap/fe/core/CommonUtils.js +2073 -2379
  12. package/src/sap/fe/core/CommonUtils.ts +2078 -0
  13. package/src/sap/fe/core/ExtensionAPI.js +16 -7
  14. package/src/sap/fe/core/PageController.js +84 -119
  15. package/src/sap/fe/core/PageController.ts +101 -0
  16. package/src/sap/fe/core/RouterProxy.js +986 -807
  17. package/src/sap/fe/core/RouterProxy.ts +838 -0
  18. package/src/sap/fe/core/Synchronization.js +51 -35
  19. package/src/sap/fe/core/Synchronization.ts +29 -0
  20. package/src/sap/fe/core/TemplateComponent.js +173 -155
  21. package/src/sap/fe/core/TemplateComponent.ts +166 -0
  22. package/src/sap/fe/core/TemplateModel.js +97 -54
  23. package/src/sap/fe/core/TemplateModel.ts +64 -0
  24. package/src/sap/fe/core/TransactionHelper.js +1576 -1579
  25. package/src/sap/fe/core/TransactionHelper.ts +1706 -0
  26. package/src/sap/fe/core/actions/draft.js +560 -581
  27. package/src/sap/fe/core/actions/draft.ts +594 -0
  28. package/src/sap/fe/core/actions/messageHandling.js +545 -511
  29. package/src/sap/fe/core/actions/messageHandling.ts +532 -0
  30. package/src/sap/fe/core/actions/nonDraft.js +17 -19
  31. package/src/sap/fe/core/actions/nonDraft.ts +12 -0
  32. package/src/sap/fe/core/actions/operations.js +1074 -1211
  33. package/src/sap/fe/core/actions/operations.ts +1162 -0
  34. package/src/sap/fe/core/actions/sticky.js +102 -105
  35. package/src/sap/fe/core/actions/sticky.ts +102 -0
  36. package/src/sap/fe/core/controllerextensions/ControllerExtensionMetadata.js +3 -2
  37. package/src/sap/fe/core/controllerextensions/EditFlow.js +229 -260
  38. package/src/sap/fe/core/controllerextensions/IntentBasedNavigation.js +3 -2
  39. package/src/sap/fe/core/controllerextensions/InternalEditFlow.js +288 -13
  40. package/src/sap/fe/core/controllerextensions/InternalIntentBasedNavigation.js +27 -23
  41. package/src/sap/fe/core/controllerextensions/InternalRouting.js +82 -46
  42. package/src/sap/fe/core/controllerextensions/KPIManagement.js +113 -25
  43. package/src/sap/fe/core/controllerextensions/KPIManagement.ts +135 -44
  44. package/src/sap/fe/core/controllerextensions/MassEdit.js +172 -0
  45. package/src/sap/fe/core/controllerextensions/MessageHandler.js +22 -9
  46. package/src/sap/fe/core/controllerextensions/PageReady.js +3 -3
  47. package/src/sap/fe/core/controllerextensions/PageReady.ts +12 -8
  48. package/src/sap/fe/core/controllerextensions/Paginator.js +37 -9
  49. package/src/sap/fe/core/controllerextensions/Placeholder.js +8 -4
  50. package/src/sap/fe/core/controllerextensions/Routing.js +25 -5
  51. package/src/sap/fe/core/controllerextensions/RoutingListener.js +3 -2
  52. package/src/sap/fe/core/controllerextensions/Share.js +22 -8
  53. package/src/sap/fe/core/controllerextensions/SideEffects.js +9 -9
  54. package/src/sap/fe/core/controllerextensions/SideEffects.ts +22 -21
  55. package/src/sap/fe/core/controllerextensions/ViewState.js +3 -2
  56. package/src/sap/fe/core/controls/ActionParameterDialog.fragment.xml +2 -1
  57. package/src/sap/fe/core/controls/CommandExecution.js +3 -2
  58. package/src/sap/fe/core/controls/ConditionalWrapper.js +3 -2
  59. package/src/sap/fe/core/controls/CustomQuickViewPage.js +3 -2
  60. package/src/sap/fe/core/controls/DataLossOrDraftDiscard/DataLossOrDraftDiscardHandler.js +9 -5
  61. package/src/sap/fe/core/controls/FieldWrapper.js +18 -23
  62. package/src/sap/fe/core/controls/FilterBar.js +3 -2
  63. package/src/sap/fe/core/controls/FormElementWrapper.js +3 -7
  64. package/src/sap/fe/core/controls/MultiValueParameterDelegate.js +3 -2
  65. package/src/sap/fe/core/controls/NonComputedVisibleKeyFieldsDialog.fragment.xml +2 -1
  66. package/src/sap/fe/core/controls/filterbar/FilterContainer.js +3 -2
  67. package/src/sap/fe/core/controls/filterbar/VisualFilter.js +5 -4
  68. package/src/sap/fe/core/controls/filterbar/VisualFilterContainer.js +3 -2
  69. package/src/sap/fe/core/controls/filterbar/utils/VisualFilterUtils.js +3 -2
  70. package/src/sap/fe/core/controls/massEdit/MassEditDialog.fragment.xml +106 -0
  71. package/src/sap/fe/core/controls/massEdit/MassEditHandlers.js +79 -0
  72. package/src/sap/fe/core/converters/ConverterContext.js +14 -2
  73. package/src/sap/fe/core/converters/ConverterContext.ts +14 -3
  74. package/src/sap/fe/core/converters/ManifestSettings.js +1 -1
  75. package/src/sap/fe/core/converters/ManifestSettings.ts +4 -0
  76. package/src/sap/fe/core/converters/ManifestWrapper.js +56 -32
  77. package/src/sap/fe/core/converters/ManifestWrapper.ts +24 -6
  78. package/src/sap/fe/core/converters/MetaModelConverter.js +67 -6
  79. package/src/sap/fe/core/converters/MetaModelConverter.ts +70 -14
  80. package/src/sap/fe/core/converters/TemplateConverter.js +1 -1
  81. package/src/sap/fe/core/converters/TemplateConverter.ts +2 -2
  82. package/src/sap/fe/core/converters/annotations/DataField.js +3 -3
  83. package/src/sap/fe/core/converters/annotations/DataField.ts +1 -1
  84. package/src/sap/fe/core/converters/common/AnnotationConverter.js +33 -21
  85. package/src/sap/fe/core/converters/controls/Common/Action.js +11 -2
  86. package/src/sap/fe/core/converters/controls/Common/Action.ts +8 -2
  87. package/src/sap/fe/core/converters/controls/Common/Chart.js +5 -3
  88. package/src/sap/fe/core/converters/controls/Common/Chart.ts +11 -3
  89. package/src/sap/fe/core/converters/controls/Common/DataVisualization.js +3 -3
  90. package/src/sap/fe/core/converters/controls/Common/DataVisualization.ts +2 -2
  91. package/src/sap/fe/core/converters/controls/Common/Form.js +20 -10
  92. package/src/sap/fe/core/converters/controls/Common/Form.ts +24 -4
  93. package/src/sap/fe/core/converters/controls/Common/KPI.js +69 -4
  94. package/src/sap/fe/core/converters/controls/Common/KPI.ts +72 -0
  95. package/src/sap/fe/core/converters/controls/Common/Table.js +390 -398
  96. package/src/sap/fe/core/converters/controls/Common/Table.ts +497 -484
  97. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.js +527 -0
  98. package/src/sap/fe/core/converters/controls/Common/table/StandardActions.ts +655 -0
  99. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.js +489 -37
  100. package/src/sap/fe/core/converters/controls/ListReport/FilterBar.ts +506 -58
  101. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.js +2 -2
  102. package/src/sap/fe/core/converters/controls/ListReport/VisualFilters.ts +1 -1
  103. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.js +17 -9
  104. package/src/sap/fe/core/converters/controls/ObjectPage/SubSection.ts +24 -9
  105. package/src/sap/fe/core/converters/helpers/Aggregation.js +18 -3
  106. package/src/sap/fe/core/converters/helpers/Aggregation.ts +28 -5
  107. package/src/sap/fe/core/converters/helpers/IssueManager.js +7 -1
  108. package/src/sap/fe/core/converters/helpers/IssueManager.ts +6 -0
  109. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.js +4 -4
  110. package/src/sap/fe/core/converters/objectPage/HeaderAndFooterAction.ts +3 -3
  111. package/src/sap/fe/core/converters/templates/ListReportConverter.js +13 -6
  112. package/src/sap/fe/core/converters/templates/ListReportConverter.ts +26 -15
  113. package/src/sap/fe/core/designtime/AppComponent.designtime.js +11 -2
  114. package/src/sap/fe/core/formatters/CriticalityFormatter.js +1 -1
  115. package/src/sap/fe/core/formatters/CriticalityFormatter.ts +1 -1
  116. package/src/sap/fe/core/formatters/FPMFormatter.js +1 -1
  117. package/src/sap/fe/core/formatters/FPMFormatter.ts +4 -10
  118. package/src/sap/fe/core/formatters/KPIFormatter.js +1 -1
  119. package/src/sap/fe/core/formatters/KPIFormatter.ts +3 -1
  120. package/src/sap/fe/core/formatters/TableFormatter.js +39 -28
  121. package/src/sap/fe/core/formatters/TableFormatter.ts +43 -28
  122. package/src/sap/fe/core/formatters/ValueFormatter.js +30 -5
  123. package/src/sap/fe/core/formatters/ValueFormatter.ts +30 -7
  124. package/src/sap/fe/core/fpm/Component.js +3 -2
  125. package/src/sap/fe/core/helpers/AppStartupHelper.js +359 -0
  126. package/src/sap/fe/core/helpers/AppStartupHelper.ts +391 -0
  127. package/src/sap/fe/core/helpers/BindingExpression.js +484 -437
  128. package/src/sap/fe/core/helpers/BindingExpression.ts +480 -463
  129. package/src/sap/fe/core/helpers/ClassSupport.js +27 -15
  130. package/src/sap/fe/core/helpers/ClassSupport.ts +31 -20
  131. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.js +63 -59
  132. package/src/sap/fe/core/helpers/DynamicAnnotationPathHelper.ts +56 -0
  133. package/src/sap/fe/core/helpers/EditState.js +81 -84
  134. package/src/sap/fe/core/helpers/EditState.ts +81 -0
  135. package/src/sap/fe/core/helpers/ExcelFormatHelper.js +62 -48
  136. package/src/sap/fe/core/helpers/ExcelFormatHelper.ts +49 -0
  137. package/src/sap/fe/core/helpers/FPMHelper.js +52 -56
  138. package/src/sap/fe/core/helpers/FPMHelper.ts +62 -0
  139. package/src/sap/fe/core/helpers/KeepAliveHelper.js +4 -5
  140. package/src/sap/fe/core/helpers/KeepAliveHelper.ts +10 -10
  141. package/src/sap/fe/core/helpers/MassEditHelper.js +687 -0
  142. package/src/sap/fe/core/helpers/ModelHelper.js +229 -225
  143. package/src/sap/fe/core/helpers/ModelHelper.ts +227 -0
  144. package/src/sap/fe/core/helpers/PasteHelper.js +210 -132
  145. package/src/sap/fe/core/helpers/PasteHelper.ts +196 -0
  146. package/src/sap/fe/core/helpers/SemanticDateOperators.js +332 -313
  147. package/src/sap/fe/core/helpers/SemanticDateOperators.ts +330 -0
  148. package/src/sap/fe/core/helpers/SemanticKeyHelper.js +66 -67
  149. package/src/sap/fe/core/helpers/SemanticKeyHelper.ts +73 -0
  150. package/src/sap/fe/core/helpers/StableIdHelper.js +4 -7
  151. package/src/sap/fe/core/helpers/StableIdHelper.ts +2 -6
  152. package/src/sap/fe/core/jsx-runtime/jsx.js +1 -1
  153. package/src/sap/fe/core/jsx-runtime/jsx.ts +1 -1
  154. package/src/sap/fe/core/library.js +30 -3
  155. package/src/sap/fe/core/library.support.js +12 -5
  156. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.js +62 -0
  157. package/src/sap/fe/core/manifestMerger/ChangePageConfiguration.ts +66 -0
  158. package/src/sap/fe/core/messagebundle.properties +61 -13
  159. package/src/sap/fe/core/messagebundle_ar.properties +33 -2
  160. package/src/sap/fe/core/messagebundle_bg.properties +33 -2
  161. package/src/sap/fe/core/messagebundle_ca.properties +33 -2
  162. package/src/sap/fe/core/messagebundle_cs.properties +34 -3
  163. package/src/sap/fe/core/messagebundle_cy.properties +33 -2
  164. package/src/sap/fe/core/messagebundle_da.properties +33 -2
  165. package/src/sap/fe/core/messagebundle_de.properties +33 -2
  166. package/src/sap/fe/core/messagebundle_el.properties +33 -2
  167. package/src/sap/fe/core/messagebundle_en.properties +32 -1
  168. package/src/sap/fe/core/messagebundle_en_GB.properties +32 -1
  169. package/src/sap/fe/core/messagebundle_en_US_sappsd.properties +36 -1
  170. package/src/sap/fe/core/messagebundle_en_US_saprigi.properties +33 -2
  171. package/src/sap/fe/core/messagebundle_en_US_saptrc.properties +33 -2
  172. package/src/sap/fe/core/messagebundle_es.properties +33 -2
  173. package/src/sap/fe/core/messagebundle_es_MX.properties +33 -2
  174. package/src/sap/fe/core/messagebundle_et.properties +33 -2
  175. package/src/sap/fe/core/messagebundle_fi.properties +34 -3
  176. package/src/sap/fe/core/messagebundle_fr.properties +38 -7
  177. package/src/sap/fe/core/messagebundle_fr_CA.properties +33 -2
  178. package/src/sap/fe/core/messagebundle_hi.properties +33 -2
  179. package/src/sap/fe/core/messagebundle_hr.properties +33 -2
  180. package/src/sap/fe/core/messagebundle_hu.properties +34 -3
  181. package/src/sap/fe/core/messagebundle_id.properties +36 -5
  182. package/src/sap/fe/core/messagebundle_it.properties +33 -2
  183. package/src/sap/fe/core/messagebundle_iw.properties +33 -2
  184. package/src/sap/fe/core/messagebundle_ja.properties +33 -2
  185. package/src/sap/fe/core/messagebundle_kk.properties +33 -2
  186. package/src/sap/fe/core/messagebundle_ko.properties +33 -2
  187. package/src/sap/fe/core/messagebundle_lt.properties +33 -2
  188. package/src/sap/fe/core/messagebundle_lv.properties +33 -2
  189. package/src/sap/fe/core/messagebundle_ms.properties +33 -2
  190. package/src/sap/fe/core/messagebundle_nl.properties +33 -2
  191. package/src/sap/fe/core/messagebundle_no.properties +33 -2
  192. package/src/sap/fe/core/messagebundle_pl.properties +33 -2
  193. package/src/sap/fe/core/messagebundle_pt.properties +34 -3
  194. package/src/sap/fe/core/messagebundle_pt_PT.properties +33 -2
  195. package/src/sap/fe/core/messagebundle_ro.properties +33 -2
  196. package/src/sap/fe/core/messagebundle_ru.properties +33 -2
  197. package/src/sap/fe/core/messagebundle_sh.properties +33 -2
  198. package/src/sap/fe/core/messagebundle_sk.properties +33 -2
  199. package/src/sap/fe/core/messagebundle_sl.properties +33 -2
  200. package/src/sap/fe/core/messagebundle_sv.properties +34 -3
  201. package/src/sap/fe/core/messagebundle_th.properties +33 -2
  202. package/src/sap/fe/core/messagebundle_tr.properties +33 -2
  203. package/src/sap/fe/core/messagebundle_uk.properties +33 -2
  204. package/src/sap/fe/core/messagebundle_vi.properties +33 -2
  205. package/src/sap/fe/core/messagebundle_zh_CN.properties +33 -2
  206. package/src/sap/fe/core/messagebundle_zh_TW.properties +33 -2
  207. package/src/sap/fe/core/services/AsyncComponentServiceFactory.js +2 -2
  208. package/src/sap/fe/core/services/AsyncComponentServiceFactory.ts +3 -1
  209. package/src/sap/fe/core/services/CacheHandlerServiceFactory.js +269 -202
  210. package/src/sap/fe/core/services/CacheHandlerServiceFactory.ts +212 -0
  211. package/src/sap/fe/core/services/EnvironmentServiceFactory.js +4 -3
  212. package/src/sap/fe/core/services/EnvironmentServiceFactory.ts +9 -5
  213. package/src/sap/fe/core/services/NavigationServiceFactory.js +406 -300
  214. package/src/sap/fe/core/services/NavigationServiceFactory.ts +316 -0
  215. package/src/sap/fe/core/services/ResourceModelServiceFactory.js +149 -81
  216. package/src/sap/fe/core/services/ResourceModelServiceFactory.ts +80 -0
  217. package/src/sap/fe/core/services/RoutingServiceFactory.js +987 -1152
  218. package/src/sap/fe/core/services/RoutingServiceFactory.ts +898 -0
  219. package/src/sap/fe/core/services/ShellServicesFactory.js +31 -2
  220. package/src/sap/fe/core/services/ShellServicesFactory.ts +45 -11
  221. package/src/sap/fe/core/services/SideEffectsServiceFactory.js +42 -85
  222. package/src/sap/fe/core/services/SideEffectsServiceFactory.ts +57 -100
  223. package/src/sap/fe/core/services/TemplatedViewServiceFactory.js +461 -478
  224. package/src/sap/fe/core/services/TemplatedViewServiceFactory.ts +453 -0
  225. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.js +10 -8
  226. package/src/sap/fe/core/services/view/TemplatingErrorPage.controller.ts +8 -0
  227. package/src/sap/fe/core/support/AnnotationIssue.support.js +15 -3
  228. package/src/sap/fe/core/support/AnnotationIssue.support.ts +16 -2
  229. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.js +2 -2
  230. package/src/sap/fe/core/support/CollectionFacetUnsupportedLevel.support.ts +1 -1
  231. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.js +38 -0
  232. package/src/sap/fe/core/support/InvalidAnnotationColumnKey.support.ts +18 -0
  233. package/src/sap/fe/core/templating/DataModelPathHelper.js +10 -48
  234. package/src/sap/fe/core/templating/DataModelPathHelper.ts +14 -46
  235. package/src/sap/fe/core/templating/DisplayModeFormatter.js +114 -0
  236. package/src/sap/fe/core/templating/DisplayModeFormatter.ts +86 -0
  237. package/src/sap/fe/core/templating/FieldControlHelper.js +8 -8
  238. package/src/sap/fe/core/templating/FieldControlHelper.ts +25 -7
  239. package/src/sap/fe/core/templating/FilterHelper.js +139 -70
  240. package/src/sap/fe/core/templating/FilterHelper.ts +140 -70
  241. package/src/sap/fe/core/templating/PropertyHelper.js +2 -2
  242. package/src/sap/fe/core/templating/PropertyHelper.ts +1 -1
  243. package/src/sap/fe/core/templating/UIFormatters.js +45 -110
  244. package/src/sap/fe/core/templating/UIFormatters.ts +39 -75
  245. package/src/sap/fe/core/type/Email.js +1 -1
  246. package/src/sap/fe/core/type/Email.ts +4 -6
  247. package/ui5.yaml +0 -3
  248. package/src/sap/fe/core/controls/filterbar.d.js +0 -8
  249. package/src/sap/fe/core/controls/filterbar.d.ts +0 -0
@@ -1,480 +1,463 @@
1
1
  /*!
2
- * SAPUI5
3
- * (c) Copyright 2009-2021 SAP SE. All rights reserved.
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2021 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(
6
- [
7
- "sap/ui/core/service/Service",
8
- "sap/ui/core/service/ServiceFactory",
9
- "sap/ui/core/service/ServiceFactoryRegistry",
10
- "sap/ui/model/base/ManagedObjectModel",
11
- "sap/ui/model/resource/ResourceModel",
12
- "sap/ui/core/mvc/View",
13
- "sap/ui/core/Component",
14
- "sap/ui/model/json/JSONModel",
15
- "sap/base/Log",
16
- "sap/fe/core/TemplateModel",
17
- "sap/fe/core/helpers/DynamicAnnotationPathHelper",
18
- "sap/ui/core/cache/CacheManager",
19
- "sap/ui/VersionInfo",
20
- "sap/ui/Device"
21
- ],
22
- function(
23
- Service,
24
- ServiceFactory,
25
- ServiceFactoryRegistry,
26
- ManagedObjectModel,
27
- ResourceModel,
28
- View,
29
- Component,
30
- JSONModel,
31
- Log,
32
- TemplateModel,
33
- DynamicAnnotationPathHelper,
34
- CacheManager,
35
- VersionInfo,
36
- Device
37
- ) {
38
- "use strict";
39
-
40
- var TemplatedViewService = Service.extend("sap.fe.core.services.TemplatedViewService", {
41
- initPromise: null,
42
- init: function() {
43
- var that = this;
44
- var aServiceDependencies = [];
45
- var oContext = this.getContext();
46
- var oComponent = oContext.scopeObject;
47
- var oAppComponent = Component.getOwnerComponentFor(oComponent);
48
- var oMetaModel = oAppComponent.getMetaModel();
49
- var sStableId = oAppComponent.getMetadata().getComponentName() + "::" + oAppComponent.getLocalId(oComponent.getId());
50
- var aEnhanceI18n = oComponent.getEnhanceI18n() || [];
51
- var sAppNamespace;
52
-
53
- if (aEnhanceI18n) {
54
- sAppNamespace = oAppComponent.getMetadata().getComponentName();
55
- for (var i = 0; i < aEnhanceI18n.length; i++) {
56
- // In order to support text-verticalization applications can also passs a resource model defined in the manifest
57
- // UI5 takes care of text-verticalization for resource models defined in the manifest
58
- // Hence check if the given key is a resource model defined in the manifest
59
- // if so this model should be used to enhance the sap.fe resource model so pass it as it is
60
- var oResourceModel = oAppComponent.getModel(aEnhanceI18n[i]);
61
- if (oResourceModel && oResourceModel.isA("sap.ui.model.resource.ResourceModel")) {
62
- aEnhanceI18n[i] = oResourceModel;
63
- } else {
64
- aEnhanceI18n[i] = sAppNamespace + "." + aEnhanceI18n[i].replace(".properties", "");
65
- }
66
- }
67
- }
68
-
69
- var sCacheIdentifier =
70
- oAppComponent.getMetadata().getName() +
71
- "_" +
72
- sStableId +
73
- "_" +
74
- sap.ui
75
- .getCore()
76
- .getConfiguration()
77
- .getLanguageTag();
78
- aServiceDependencies.push(
79
- ServiceFactoryRegistry.get("sap.fe.core.services.ResourceModelService")
80
- .createInstance({
81
- scopeType: "component",
82
- scopeObject: oComponent,
83
- settings: {
84
- bundles: ["sap.fe.core.messagebundle", "sap.fe.macros.messagebundle", "sap.fe.templates.messagebundle"],
85
- enhanceI18n: aEnhanceI18n,
86
- modelName: "sap.fe.i18n"
87
- }
88
- })
89
- .then(function(oResourceModelService) {
90
- that.oResourceModelService = oResourceModelService;
91
- return oResourceModelService.getResourceModel();
92
- })
93
- );
94
-
95
- aServiceDependencies.push(
96
- ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService")
97
- .createInstance({
98
- settings: {
99
- metaModel: oMetaModel,
100
- appComponent: oAppComponent,
101
- component: oComponent
102
- }
103
- })
104
- .then(function(oCacheHandlerService) {
105
- that.oCacheHandlerService = oCacheHandlerService;
106
- return oCacheHandlerService.validateCacheKey(sCacheIdentifier);
107
- })
108
- );
109
- aServiceDependencies.push(
110
- VersionInfo.load()
111
- .then(function(oInfo) {
112
- var sTimestamp = "";
113
- if (!oInfo.libraries) {
114
- sTimestamp = sap.ui.buildinfo.buildtime;
115
- } else {
116
- oInfo.libraries.forEach(function(oLibrary) {
117
- sTimestamp += oLibrary.buildTimestamp;
118
- });
119
- }
120
- return sTimestamp;
121
- })
122
- .catch(function() {
123
- return "<NOVALUE>";
124
- })
125
- );
126
-
127
- var sPageModelCacheKey = "";
128
- this.initPromise = Promise.all(aServiceDependencies)
129
- .then(function(aDependenciesResult) {
130
- var sCacheKey = aDependenciesResult[1];
131
- var sVersionInfo = aDependenciesResult[2];
132
- var oShellServices = oAppComponent.getShellServices();
133
- var oSideEffectsServices = oAppComponent.getSideEffectsService();
134
-
135
- oSideEffectsServices.initializeSideEffects(oAppComponent.getEnvironmentCapabilities().getCapabilities());
136
-
137
- sPageModelCacheKey =
138
- sCacheKey + "-" + sVersionInfo + "-" + sStableId + "-" + oShellServices.instanceType + "-pageModel";
139
- return Promise.all(aDependenciesResult.concat([that._getCachedModel(sPageModelCacheKey)]));
140
- })
141
- .then(function(aDependenciesResult) {
142
- var oResourceModel = aDependenciesResult[0];
143
- var sCacheKey = aDependenciesResult[1];
144
- var oPageModelCache = aDependenciesResult[3];
145
- return new Promise(function(resolve) {
146
- sap.ui.require(
147
- ["sap/fe/core/converters/TemplateConverter", "sap/fe/core/converters/MetaModelConverter"],
148
- function(TemplateConverter, MetaModelConverter) {
149
- resolve(
150
- that.createView(
151
- oResourceModel,
152
- sStableId,
153
- sCacheKey,
154
- sPageModelCacheKey,
155
- oPageModelCache,
156
- TemplateConverter,
157
- MetaModelConverter
158
- )
159
- );
160
- }
161
- );
162
- });
163
- })
164
- .then(function(sCacheKey) {
165
- var oCacheHandlerService = ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").getInstance(
166
- oMetaModel
167
- );
168
- oCacheHandlerService.invalidateIfNeeded(sCacheKey, sCacheIdentifier);
169
- });
170
- },
171
- _getCachedModel: function(sCacheKey) {
172
- if (
173
- sap.ui
174
- .getCore()
175
- .getConfiguration()
176
- .getViewCache()
177
- ) {
178
- return CacheManager.get(sCacheKey);
179
- }
180
- return undefined;
181
- },
182
- _setCachedModel: function(sCacheKey, oCacheModel) {
183
- if (
184
- sap.ui
185
- .getCore()
186
- .getConfiguration()
187
- .getViewCache()
188
- ) {
189
- CacheManager.set(sCacheKey, oCacheModel);
190
- }
191
- return undefined;
192
- },
193
- /**
194
- * Refresh the current view using the same configuration as before.
195
- * This is useful for our demokit !
196
- *
197
- * @param oComponent
198
- * @returns {Promise<void>}
199
- * @private
200
- */
201
- refreshView: function(oComponent) {
202
- var that = this;
203
- var oRootView = oComponent.getRootControl();
204
- if (oRootView) {
205
- oRootView.destroy();
206
- } else if (that.oView) {
207
- that.oView.destroy();
208
- }
209
- return that
210
- .createView(that.resourceModel, that.stableId, "", "", undefined, that.TemplateConverter, that.MetaModelConverter)
211
- .then(function() {
212
- oComponent.oContainer.invalidate();
213
- })
214
- .catch(function(oError) {
215
- oComponent.oContainer.invalidate();
216
- Log.error(oError);
217
- });
218
- },
219
- createView: function(
220
- oResourceModel,
221
- sStableId,
222
- sCacheKey,
223
- sPageModelCacheKey,
224
- oPageModelCache,
225
- TemplateConverter,
226
- MetaModelConverter
227
- ) {
228
- var that = this;
229
- that.resourceModel = oResourceModel;
230
- that.stableId = sStableId;
231
- that.TemplateConverter = TemplateConverter;
232
- that.MetaModelConverter = MetaModelConverter;
233
- var oContext = this.getContext(),
234
- mServiceSettings = oContext.settings,
235
- sConverterType = mServiceSettings.converterType,
236
- oComponent = oContext.scopeObject,
237
- oAppComponent = Component.getOwnerComponentFor(oComponent),
238
- sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent).options.settings
239
- .fullContextPath,
240
- oMetaModel = oAppComponent.getMetaModel(),
241
- oManifestContent = oAppComponent.getManifest(),
242
- oDeviceModel = new JSONModel(sap.ui.Device).setDefaultBindingMode("OneWay"),
243
- oManifestModel = new JSONModel(oManifestContent),
244
- bError = false,
245
- oPageModel,
246
- oViewDataModel,
247
- oViewSettings,
248
- mViewData;
249
-
250
- this.oFactory = oContext.factory;
251
-
252
- function getViewSettings() {
253
- var aSplitPath = sFullContextPath.split("/");
254
- var sEntitySetPath = aSplitPath.reduce(function(sPathSoFar, sNextPathPart) {
255
- if (sNextPathPart === "") {
256
- return sPathSoFar;
257
- }
258
- if (sPathSoFar === "") {
259
- sPathSoFar = "/" + sNextPathPart;
260
- } else {
261
- var oTarget = oMetaModel.getObject(sPathSoFar + "/$NavigationPropertyBinding/" + sNextPathPart);
262
- if (oTarget && Object.keys(oTarget).length > 0) {
263
- sPathSoFar += "/$NavigationPropertyBinding";
264
- }
265
- sPathSoFar += "/" + sNextPathPart;
266
- }
267
- return sPathSoFar;
268
- }, "");
269
- var oViewSettings = {
270
- type: "XML",
271
- preprocessors: {
272
- xml: {
273
- bindingContexts: {
274
- entitySet: sEntitySetPath ? oMetaModel.createBindingContext(sEntitySetPath) : null,
275
- fullContextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
276
- contextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
277
- converterContext: oPageModel.createBindingContext("/", null, { noResolve: true }),
278
- viewData: mViewData ? oViewDataModel.createBindingContext("/") : null
279
- },
280
- models: {
281
- entitySet: oMetaModel,
282
- fullContextPath: oMetaModel,
283
- contextPath: oMetaModel,
284
- "sap.fe.i18n": oResourceModel,
285
- metaModel: oMetaModel,
286
- "device": oDeviceModel, // TODO: discuss names here
287
- manifest: oManifestModel,
288
- converterContext: oPageModel,
289
- viewData: oViewDataModel
290
- },
291
- appComponent: oAppComponent
292
- }
293
- },
294
- id: sStableId,
295
- viewName: mServiceSettings.viewName || oComponent.getViewName(),
296
- viewData: mViewData,
297
- cache: { keys: [sCacheKey] },
298
- models: {
299
- "sap.fe.i18n": oResourceModel
300
- },
301
- height: "100%"
302
- };
303
- return oViewSettings;
304
- }
305
- function createErrorPage(reason) {
306
- // just replace the view name and add an additional model containing the reason, but
307
- // keep the other settings
308
- Log.error(reason.message, reason);
309
- oViewSettings.viewName = mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage";
310
- oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
311
-
312
- return oComponent.runAsOwner(function() {
313
- return View.create(oViewSettings).then(function(oView) {
314
- that.oView = oView;
315
- that.oView.setModel(new ManagedObjectModel(that.oView), "$view");
316
- oComponent.setAggregation("rootControl", that.oView);
317
- return sCacheKey;
318
- });
319
- });
320
- }
321
- return oAppComponent
322
- .getService("routingService")
323
- .then(function(oRoutingService) {
324
- // Retrieve the viewLevel for the component
325
- var oTargetInfo = oRoutingService.getTargetInformationFor(oComponent);
326
- var mOutbounds =
327
- oManifestContent["sap.app"] &&
328
- oManifestContent["sap.app"].crossNavigation &&
329
- oManifestContent["sap.app"].crossNavigation.outbounds;
330
- var mNavigation = oComponent.getNavigation() || {};
331
- Object.keys(mNavigation).forEach(function(navigationObjectKey) {
332
- var navigationObject = mNavigation[navigationObjectKey];
333
- var outboundConfig;
334
- if (
335
- navigationObject.detail &&
336
- navigationObject.detail.outbound &&
337
- mOutbounds[navigationObject.detail.outbound]
338
- ) {
339
- outboundConfig = mOutbounds[navigationObject.detail.outbound];
340
- navigationObject.detail.outboundDetail = {
341
- semanticObject: outboundConfig.semanticObject,
342
- action: outboundConfig.action,
343
- parameters: outboundConfig.parameters
344
- };
345
- }
346
- if (
347
- navigationObject.create &&
348
- navigationObject.create.outbound &&
349
- mOutbounds[navigationObject.create.outbound]
350
- ) {
351
- outboundConfig = mOutbounds[navigationObject.create.outbound];
352
- navigationObject.create.outboundDetail = {
353
- semanticObject: outboundConfig.semanticObject,
354
- action: outboundConfig.action,
355
- parameters: outboundConfig.parameters
356
- };
357
- }
358
- });
359
- mViewData = {
360
- navigation: mNavigation,
361
- viewLevel: oTargetInfo.viewLevel,
362
- stableId: sStableId,
363
- contentDensities: oManifestContent["sap.ui5"].contentDensities,
364
- resourceBundle: oResourceModel.__bundle,
365
- fullContextPath: sFullContextPath,
366
- isDesktop: Device.system.desktop
367
- };
368
-
369
- if (oComponent.getViewData) {
370
- Object.assign(mViewData, oComponent.getViewData());
371
- }
372
-
373
- var oShellServices = oAppComponent.getShellServices();
374
- mViewData.converterType = sConverterType;
375
- mViewData.shellContentDensity = oShellServices.getContentDensity();
376
- oViewDataModel = new JSONModel(mViewData);
377
- if (mViewData && mViewData.controlConfiguration) {
378
- Object.keys(mViewData.controlConfiguration).forEach(function(sAnnotationPath) {
379
- if (sAnnotationPath.indexOf("[") !== -1) {
380
- var sTargetAnnotationPath = DynamicAnnotationPathHelper.resolveDynamicExpression(
381
- sAnnotationPath,
382
- oMetaModel
383
- );
384
- mViewData.controlConfiguration[sTargetAnnotationPath] = mViewData.controlConfiguration[sAnnotationPath];
385
- }
386
- });
387
- }
388
- MetaModelConverter.convertTypes(oMetaModel, oAppComponent.getEnvironmentCapabilities().getCapabilities());
389
- oPageModel = new TemplateModel(function() {
390
- try {
391
- if (!!oPageModelCache) {
392
- return oPageModelCache;
393
- } else {
394
- var oDiagnostics = oAppComponent.getDiagnostics();
395
- var iIssueCount = oDiagnostics.getIssues().length;
396
- var oConverterPageModel = TemplateConverter.convertPage(
397
- sConverterType,
398
- oMetaModel,
399
- mViewData,
400
- oDiagnostics,
401
- sFullContextPath,
402
- oAppComponent.getEnvironmentCapabilities().getCapabilities()
403
- );
404
-
405
- var aIssues = oDiagnostics.getIssues();
406
- var aAddedIssues = aIssues.slice(iIssueCount);
407
- if (aAddedIssues.length > 0) {
408
- Log.warning(
409
- "Some issues have been detected in your project, please check the UI5 support assistant rule for sap.fe.core"
410
- );
411
- }
412
- // Fire and forget in the cache
413
- that._setCachedModel(sPageModelCacheKey, oConverterPageModel);
414
- return oConverterPageModel;
415
- }
416
- } catch (error) {
417
- Log.error(error, error);
418
- return {};
419
- }
420
- }, oMetaModel);
421
-
422
- if (!bError) {
423
- oViewSettings = getViewSettings();
424
- // Setting the pageModel on the component for potential reuse
425
- oComponent.setModel(oPageModel, "_pageModel");
426
- return oComponent.runAsOwner(function() {
427
- return View.create(oViewSettings)
428
- .catch(createErrorPage)
429
- .then(function(oView) {
430
- that.oView = oView;
431
- that.oView.setModel(new ManagedObjectModel(that.oView), "$view");
432
- that.oView.setModel(oViewDataModel, "viewData");
433
- oComponent.setAggregation("rootControl", that.oView);
434
- return sCacheKey;
435
- })
436
- .catch(Log.error);
437
- });
438
- }
439
- })
440
- .catch(function(error) {
441
- Log.error(error.message, error);
442
- throw new Error("Error while creating view : " + error);
443
- });
444
- },
445
- getView: function() {
446
- return this.oView;
447
- },
448
- exit: function() {
449
- // Deregister global instance
450
- this.oResourceModelService && this.oResourceModelService.destroy();
451
- this.oCacheHandlerService && this.oCacheHandlerService.destroy();
452
- this.oFactory.removeGlobalInstance();
453
- }
454
- });
455
-
456
- var oServiceFactory = ServiceFactory.extend("sap.fe.core.services.TemplatedViewServiceFactory", {
457
- _oInstanceRegistry: {},
458
- iCreatingViews: 0,
459
- createInstance: function(oServiceContext) {
460
- oServiceFactory.prototype.iCreatingViews++;
461
-
462
- var oTemplatedViewService = new TemplatedViewService(Object.assign({ factory: this }, oServiceContext));
463
- return oTemplatedViewService.initPromise.then(function() {
464
- oServiceFactory.prototype.iCreatingViews--;
465
- return oTemplatedViewService;
466
- });
467
- },
468
- removeGlobalInstance: function() {
469
- this._oInstanceRegistry = {};
470
- }
471
- });
472
-
473
- oServiceFactory.getNumberOfViewsInCreationState = function() {
474
- return oServiceFactory.prototype.iCreatingViews;
475
- };
476
-
477
- return oServiceFactory;
478
- },
479
- true
480
- );
5
+ sap.ui.define(["sap/ui/core/service/Service", "sap/ui/core/service/ServiceFactory", "sap/ui/core/service/ServiceFactoryRegistry", "sap/ui/model/base/ManagedObjectModel", "sap/ui/core/mvc/View", "sap/ui/core/Component", "sap/ui/model/json/JSONModel", "sap/base/Log", "sap/fe/core/TemplateModel", "sap/fe/core/helpers/DynamicAnnotationPathHelper", "sap/ui/core/cache/CacheManager", "sap/ui/VersionInfo", "sap/ui/Device", "sap/base/util/UriParameters"], function (Service, ServiceFactory, ServiceFactoryRegistry, ManagedObjectModel, View, Component, JSONModel, Log, TemplateModel, DynamicAnnotationPathHelper, CacheManager, VersionInfo, Device, UriParameters) {
6
+ "use strict";
7
+
8
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+
10
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
11
+
12
+ function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
13
+
14
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
15
+
16
+ function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
17
+
18
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
19
+
20
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
21
+
22
+ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); }
23
+
24
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
25
+
26
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
27
+
28
+ function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
29
+
30
+ var TemplatedViewService = /*#__PURE__*/function (_Service) {
31
+ _inherits(TemplatedViewService, _Service);
32
+
33
+ var _super = _createSuper(TemplatedViewService);
34
+
35
+ function TemplatedViewService() {
36
+ _classCallCheck(this, TemplatedViewService);
37
+
38
+ return _super.apply(this, arguments);
39
+ }
40
+
41
+ _createClass(TemplatedViewService, [{
42
+ key: "init",
43
+ value: function init() {
44
+ var _this = this;
45
+
46
+ var aServiceDependencies = [];
47
+ var oContext = this.getContext();
48
+ var oComponent = oContext.scopeObject;
49
+ var oAppComponent = Component.getOwnerComponentFor(oComponent);
50
+ var oMetaModel = oAppComponent.getMetaModel();
51
+ var sStableId = oAppComponent.getMetadata().getComponentName() + "::" + oAppComponent.getLocalId(oComponent.getId());
52
+ var aEnhanceI18n = oComponent.getEnhanceI18n() || [];
53
+ var sAppNamespace;
54
+ this.oFactory = oContext.factory;
55
+
56
+ if (aEnhanceI18n) {
57
+ sAppNamespace = oAppComponent.getMetadata().getComponentName();
58
+
59
+ for (var i = 0; i < aEnhanceI18n.length; i++) {
60
+ // In order to support text-verticalization applications can also passs a resource model defined in the manifest
61
+ // UI5 takes care of text-verticalization for resource models defined in the manifest
62
+ // Hence check if the given key is a resource model defined in the manifest
63
+ // if so this model should be used to enhance the sap.fe resource model so pass it as it is
64
+ var oResourceModel = oAppComponent.getModel(aEnhanceI18n[i]);
65
+
66
+ if (oResourceModel && oResourceModel.isA("sap.ui.model.resource.ResourceModel")) {
67
+ aEnhanceI18n[i] = oResourceModel;
68
+ } else {
69
+ aEnhanceI18n[i] = sAppNamespace + "." + aEnhanceI18n[i].replace(".properties", "");
70
+ }
71
+ }
72
+ }
73
+
74
+ var sCacheIdentifier = oAppComponent.getMetadata().getName() + "_" + sStableId + "_" + sap.ui.getCore().getConfiguration().getLanguageTag();
75
+ aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.ResourceModelService").createInstance({
76
+ scopeType: "component",
77
+ scopeObject: oComponent,
78
+ settings: {
79
+ bundles: ["sap.fe.core.messagebundle", "sap.fe.macros.messagebundle", "sap.fe.templates.messagebundle"],
80
+ enhanceI18n: aEnhanceI18n,
81
+ modelName: "sap.fe.i18n"
82
+ }
83
+ }).then(function (oResourceModelService) {
84
+ _this.oResourceModelService = oResourceModelService;
85
+ return oResourceModelService.getResourceModel();
86
+ }));
87
+ aServiceDependencies.push(ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").createInstance({
88
+ settings: {
89
+ metaModel: oMetaModel,
90
+ appComponent: oAppComponent,
91
+ component: oComponent
92
+ }
93
+ }).then(function (oCacheHandlerService) {
94
+ _this.oCacheHandlerService = oCacheHandlerService;
95
+ return oCacheHandlerService.validateCacheKey(sCacheIdentifier);
96
+ }));
97
+ aServiceDependencies.push(VersionInfo.load().then(function (oInfo) {
98
+ var sTimestamp = "";
99
+
100
+ if (!oInfo.libraries) {
101
+ sTimestamp = sap.ui.buildinfo.buildtime;
102
+ } else {
103
+ oInfo.libraries.forEach(function (oLibrary) {
104
+ sTimestamp += oLibrary.buildTimestamp;
105
+ });
106
+ }
107
+
108
+ return sTimestamp;
109
+ }).catch(function () {
110
+ return "<NOVALUE>";
111
+ }));
112
+ var sPageModelCacheKey = "";
113
+ this.initPromise = Promise.all(aServiceDependencies).then(function (aDependenciesResult) {
114
+ var sCacheKey = aDependenciesResult[1];
115
+ var sVersionInfo = aDependenciesResult[2];
116
+ var oShellServices = oAppComponent.getShellServices();
117
+ var oSideEffectsServices = oAppComponent.getSideEffectsService();
118
+ oSideEffectsServices.initializeSideEffects(oAppComponent.getEnvironmentCapabilities().getCapabilities());
119
+ sPageModelCacheKey = sCacheKey + "-" + sVersionInfo + "-" + sStableId + "-" + oShellServices.instanceType + "-pageModel";
120
+ return Promise.all(aDependenciesResult.concat([_this._getCachedModel(sPageModelCacheKey)]));
121
+ }).then(function (aDependenciesResult) {
122
+ var oResourceModel = aDependenciesResult[0];
123
+ var sCacheKey = aDependenciesResult[1];
124
+ var oPageModelCache = aDependenciesResult[3];
125
+ return new Promise(function (resolve) {
126
+ sap.ui.require(["sap/fe/core/converters/TemplateConverter", "sap/fe/core/converters/MetaModelConverter"], function (TemplateConverter, MetaModelConverter) {
127
+ resolve(_this.createView(oResourceModel, sStableId, sCacheKey, sPageModelCacheKey, oPageModelCache, TemplateConverter, MetaModelConverter));
128
+ });
129
+ });
130
+ }).then(function (sCacheKey) {
131
+ var oCacheHandlerService = ServiceFactoryRegistry.get("sap.fe.core.services.CacheHandlerService").getInstance(oMetaModel);
132
+ oCacheHandlerService.invalidateIfNeeded(sCacheKey, sCacheIdentifier);
133
+ });
134
+ }
135
+ }, {
136
+ key: "_getCachedModel",
137
+ value: function _getCachedModel(sCacheKey) {
138
+ if (sap.ui.getCore().getConfiguration().getViewCache()) {
139
+ return CacheManager.get(sCacheKey);
140
+ }
141
+
142
+ return undefined;
143
+ }
144
+ }, {
145
+ key: "_setCachedModel",
146
+ value: function _setCachedModel(sCacheKey, oCacheModel) {
147
+ if (sap.ui.getCore().getConfiguration().getViewCache()) {
148
+ CacheManager.set(sCacheKey, oCacheModel);
149
+ }
150
+
151
+ return undefined;
152
+ }
153
+ /**
154
+ * Refresh the current view using the same configuration as before.
155
+ * This is useful for our demokit !
156
+ *
157
+ * @param oComponent
158
+ * @returns {Promise<void>}
159
+ * @private
160
+ */
161
+
162
+ }, {
163
+ key: "refreshView",
164
+ value: function refreshView(oComponent) {
165
+ var oRootView = oComponent.getRootControl();
166
+
167
+ if (oRootView) {
168
+ oRootView.destroy();
169
+ } else if (this.oView) {
170
+ this.oView.destroy();
171
+ }
172
+
173
+ return this.createView(this.resourceModel, this.stableId, "", "", undefined, this.TemplateConverter, this.MetaModelConverter).then(function () {
174
+ oComponent.oContainer.invalidate();
175
+ }).catch(function (oError) {
176
+ oComponent.oContainer.invalidate();
177
+ Log.error(oError);
178
+ });
179
+ }
180
+ }, {
181
+ key: "createView",
182
+ value: function createView(oResourceModel, sStableId, sCacheKey, sPageModelCacheKey, oPageModelCache, TemplateConverter, MetaModelConverter) {
183
+ var _this2 = this;
184
+
185
+ this.resourceModel = oResourceModel;
186
+ this.stableId = sStableId;
187
+ this.TemplateConverter = TemplateConverter;
188
+ this.MetaModelConverter = MetaModelConverter;
189
+ var oContext = this.getContext();
190
+ var mServiceSettings = oContext.settings;
191
+ var sConverterType = mServiceSettings.converterType;
192
+ var oComponent = oContext.scopeObject;
193
+ var oAppComponent = Component.getOwnerComponentFor(oComponent);
194
+ var sFullContextPath = oAppComponent.getRoutingService().getTargetInformationFor(oComponent).options.settings.fullContextPath;
195
+ var oMetaModel = oAppComponent.getMetaModel();
196
+ var oManifestContent = oAppComponent.getManifest();
197
+ var oDeviceModel = new JSONModel(sap.ui.Device).setDefaultBindingMode("OneWay");
198
+ var oManifestModel = new JSONModel(oManifestContent);
199
+ var bError = false;
200
+ var oPageModel, oViewDataModel, oViewSettings, mViewData;
201
+
202
+ function getViewSettings() {
203
+ var aSplitPath = sFullContextPath.split("/");
204
+ var sEntitySetPath = aSplitPath.reduce(function (sPathSoFar, sNextPathPart) {
205
+ if (sNextPathPart === "") {
206
+ return sPathSoFar;
207
+ }
208
+
209
+ if (sPathSoFar === "") {
210
+ sPathSoFar = "/" + sNextPathPart;
211
+ } else {
212
+ var oTarget = oMetaModel.getObject(sPathSoFar + "/$NavigationPropertyBinding/" + sNextPathPart);
213
+
214
+ if (oTarget && Object.keys(oTarget).length > 0) {
215
+ sPathSoFar += "/$NavigationPropertyBinding";
216
+ }
217
+
218
+ sPathSoFar += "/" + sNextPathPart;
219
+ }
220
+
221
+ return sPathSoFar;
222
+ }, "");
223
+ var oViewSettings = {
224
+ type: "XML",
225
+ preprocessors: {
226
+ xml: {
227
+ bindingContexts: {
228
+ entitySet: sEntitySetPath ? oMetaModel.createBindingContext(sEntitySetPath) : null,
229
+ fullContextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
230
+ contextPath: sFullContextPath ? oMetaModel.createBindingContext(sFullContextPath) : null,
231
+ converterContext: oPageModel.createBindingContext("/", undefined, {
232
+ noResolve: true
233
+ }),
234
+ viewData: mViewData ? oViewDataModel.createBindingContext("/") : null
235
+ },
236
+ models: {
237
+ entitySet: oMetaModel,
238
+ fullContextPath: oMetaModel,
239
+ contextPath: oMetaModel,
240
+ "sap.fe.i18n": oResourceModel,
241
+ metaModel: oMetaModel,
242
+ "device": oDeviceModel,
243
+ // TODO: discuss names here
244
+ manifest: oManifestModel,
245
+ converterContext: oPageModel,
246
+ viewData: oViewDataModel
247
+ },
248
+ appComponent: oAppComponent
249
+ }
250
+ },
251
+ id: sStableId,
252
+ viewName: mServiceSettings.viewName || oComponent.getViewName(),
253
+ viewData: mViewData,
254
+ cache: {
255
+ keys: [sCacheKey]
256
+ },
257
+ models: {
258
+ "sap.fe.i18n": oResourceModel
259
+ },
260
+ height: "100%"
261
+ };
262
+ return oViewSettings;
263
+ }
264
+
265
+ var createErrorPage = function (reason) {
266
+ // just replace the view name and add an additional model containing the reason, but
267
+ // keep the other settings
268
+ Log.error(reason.message, reason);
269
+ oViewSettings.viewName = mServiceSettings.errorViewName || "sap.fe.core.services.view.TemplatingErrorPage";
270
+ oViewSettings.preprocessors.xml.models["error"] = new JSONModel(reason);
271
+ return oComponent.runAsOwner(function () {
272
+ return View.create(oViewSettings).then(function (oView) {
273
+ _this2.oView = oView;
274
+
275
+ _this2.oView.setModel(new ManagedObjectModel(_this2.oView), "$view");
276
+
277
+ oComponent.setAggregation("rootControl", _this2.oView);
278
+ return sCacheKey;
279
+ });
280
+ });
281
+ };
282
+
283
+ return oAppComponent.getService("routingService").then(function (oRoutingService) {
284
+ // Retrieve the viewLevel for the component
285
+ var oTargetInfo = oRoutingService.getTargetInformationFor(oComponent);
286
+ var mOutbounds = oManifestContent["sap.app"] && oManifestContent["sap.app"].crossNavigation && oManifestContent["sap.app"].crossNavigation.outbounds;
287
+ var mNavigation = oComponent.getNavigation() || {};
288
+ Object.keys(mNavigation).forEach(function (navigationObjectKey) {
289
+ var navigationObject = mNavigation[navigationObjectKey];
290
+ var outboundConfig;
291
+
292
+ if (navigationObject.detail && navigationObject.detail.outbound && mOutbounds[navigationObject.detail.outbound]) {
293
+ outboundConfig = mOutbounds[navigationObject.detail.outbound];
294
+ navigationObject.detail.outboundDetail = {
295
+ semanticObject: outboundConfig.semanticObject,
296
+ action: outboundConfig.action,
297
+ parameters: outboundConfig.parameters
298
+ };
299
+ }
300
+
301
+ if (navigationObject.create && navigationObject.create.outbound && mOutbounds[navigationObject.create.outbound]) {
302
+ outboundConfig = mOutbounds[navigationObject.create.outbound];
303
+ navigationObject.create.outboundDetail = {
304
+ semanticObject: outboundConfig.semanticObject,
305
+ action: outboundConfig.action,
306
+ parameters: outboundConfig.parameters
307
+ };
308
+ }
309
+ });
310
+ mViewData = {
311
+ navigation: mNavigation,
312
+ viewLevel: oTargetInfo.viewLevel,
313
+ stableId: sStableId,
314
+ contentDensities: oManifestContent["sap.ui5"].contentDensities,
315
+ resourceBundle: oResourceModel.__bundle,
316
+ fullContextPath: sFullContextPath,
317
+ isDesktop: Device.system.desktop,
318
+ isPhone: Device.system.phone
319
+ };
320
+
321
+ if (oComponent.getViewData) {
322
+ Object.assign(mViewData, oComponent.getViewData());
323
+ }
324
+
325
+ var oShellServices = oAppComponent.getShellServices();
326
+ mViewData.converterType = sConverterType;
327
+ mViewData.shellContentDensity = oShellServices.getContentDensity();
328
+ mViewData.useNewLazyLoading = UriParameters.fromQuery(window.location.search).get("sap-fe-xx-lazyloadingtest") === "true";
329
+ mViewData.retrieveTextFromValueList = oManifestContent["sap.fe"] && oManifestContent["sap.fe"].form ? oManifestContent["sap.fe"].form.retrieveTextFromValueList : undefined;
330
+ oViewDataModel = new JSONModel(mViewData);
331
+
332
+ if (mViewData && mViewData.controlConfiguration) {
333
+ Object.keys(mViewData.controlConfiguration).forEach(function (sAnnotationPath) {
334
+ if (sAnnotationPath.indexOf("[") !== -1) {
335
+ var sTargetAnnotationPath = DynamicAnnotationPathHelper.resolveDynamicExpression(sAnnotationPath, oMetaModel);
336
+ mViewData.controlConfiguration[sTargetAnnotationPath] = mViewData.controlConfiguration[sAnnotationPath];
337
+ }
338
+ });
339
+ }
340
+
341
+ MetaModelConverter.convertTypes(oMetaModel, oAppComponent.getEnvironmentCapabilities().getCapabilities());
342
+ oPageModel = new TemplateModel(function () {
343
+ try {
344
+ if (!!oPageModelCache) {
345
+ return oPageModelCache;
346
+ } else {
347
+ var oDiagnostics = oAppComponent.getDiagnostics();
348
+ var iIssueCount = oDiagnostics.getIssues().length;
349
+ var oConverterPageModel = TemplateConverter.convertPage(sConverterType, oMetaModel, mViewData, oDiagnostics, sFullContextPath, oAppComponent.getEnvironmentCapabilities().getCapabilities());
350
+ var aIssues = oDiagnostics.getIssues();
351
+ var aAddedIssues = aIssues.slice(iIssueCount);
352
+
353
+ if (aAddedIssues.length > 0) {
354
+ Log.warning("Some issues have been detected in your project, please check the UI5 support assistant rule for sap.fe.core");
355
+ } // Fire and forget in the cache
356
+
357
+
358
+ _this2._setCachedModel(sPageModelCacheKey, oConverterPageModel);
359
+
360
+ return oConverterPageModel;
361
+ }
362
+ } catch (error) {
363
+ Log.error(error, error);
364
+ return {};
365
+ }
366
+ }, oMetaModel);
367
+
368
+ if (!bError) {
369
+ oViewSettings = getViewSettings(); // Setting the pageModel on the component for potential reuse
370
+
371
+ oComponent.setModel(oPageModel, "_pageModel");
372
+ return oComponent.runAsOwner(function () {
373
+ return View.create(oViewSettings).catch(createErrorPage).then(function (oView) {
374
+ _this2.oView = oView;
375
+
376
+ _this2.oView.setModel(new ManagedObjectModel(_this2.oView), "$view");
377
+
378
+ _this2.oView.setModel(oViewDataModel, "viewData");
379
+
380
+ oComponent.setAggregation("rootControl", _this2.oView);
381
+ return sCacheKey;
382
+ }).catch(Log.error);
383
+ });
384
+ }
385
+ }).catch(function (error) {
386
+ Log.error(error.message, error);
387
+ throw new Error("Error while creating view : " + error);
388
+ });
389
+ }
390
+ }, {
391
+ key: "getView",
392
+ value: function getView() {
393
+ return this.oView;
394
+ }
395
+ }, {
396
+ key: "getInterface",
397
+ value: function getInterface() {
398
+ return this;
399
+ }
400
+ }, {
401
+ key: "exit",
402
+ value: function exit() {
403
+ // Deregister global instance
404
+ this.oResourceModelService && this.oResourceModelService.destroy();
405
+ this.oCacheHandlerService && this.oCacheHandlerService.destroy();
406
+ this.oFactory.removeGlobalInstance();
407
+ }
408
+ }]);
409
+
410
+ return TemplatedViewService;
411
+ }(Service);
412
+
413
+ var TemplatedViewServiceFactory = /*#__PURE__*/function (_ServiceFactory) {
414
+ _inherits(TemplatedViewServiceFactory, _ServiceFactory);
415
+
416
+ var _super2 = _createSuper(TemplatedViewServiceFactory);
417
+
418
+ function TemplatedViewServiceFactory() {
419
+ var _this3;
420
+
421
+ _classCallCheck(this, TemplatedViewServiceFactory);
422
+
423
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
424
+ args[_key] = arguments[_key];
425
+ }
426
+
427
+ _this3 = _super2.call.apply(_super2, [this].concat(args));
428
+
429
+ _defineProperty(_assertThisInitialized(_this3), "_oInstanceRegistry", {});
430
+
431
+ return _this3;
432
+ }
433
+
434
+ _createClass(TemplatedViewServiceFactory, [{
435
+ key: "createInstance",
436
+ value: function createInstance(oServiceContext) {
437
+ TemplatedViewServiceFactory.iCreatingViews++;
438
+ var oTemplatedViewService = new TemplatedViewService(Object.assign({
439
+ factory: this
440
+ }, oServiceContext));
441
+ return oTemplatedViewService.initPromise.then(function () {
442
+ TemplatedViewServiceFactory.iCreatingViews--;
443
+ return oTemplatedViewService;
444
+ });
445
+ }
446
+ }, {
447
+ key: "removeGlobalInstance",
448
+ value: function removeGlobalInstance() {
449
+ this._oInstanceRegistry = {};
450
+ }
451
+ }], [{
452
+ key: "getNumberOfViewsInCreationState",
453
+ value: function getNumberOfViewsInCreationState() {
454
+ return TemplatedViewServiceFactory.iCreatingViews;
455
+ }
456
+ }]);
457
+
458
+ return TemplatedViewServiceFactory;
459
+ }(ServiceFactory);
460
+
461
+ return TemplatedViewServiceFactory;
462
+ }, false);
463
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIlRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeS50cyJdLCJuYW1lcyI6WyJUZW1wbGF0ZWRWaWV3U2VydmljZSIsImFTZXJ2aWNlRGVwZW5kZW5jaWVzIiwib0NvbnRleHQiLCJnZXRDb250ZXh0Iiwib0NvbXBvbmVudCIsInNjb3BlT2JqZWN0Iiwib0FwcENvbXBvbmVudCIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwib01ldGFNb2RlbCIsImdldE1ldGFNb2RlbCIsInNTdGFibGVJZCIsImdldE1ldGFkYXRhIiwiZ2V0Q29tcG9uZW50TmFtZSIsImdldExvY2FsSWQiLCJnZXRJZCIsImFFbmhhbmNlSTE4biIsImdldEVuaGFuY2VJMThuIiwic0FwcE5hbWVzcGFjZSIsIm9GYWN0b3J5IiwiZmFjdG9yeSIsImkiLCJsZW5ndGgiLCJvUmVzb3VyY2VNb2RlbCIsImdldE1vZGVsIiwiaXNBIiwicmVwbGFjZSIsInNDYWNoZUlkZW50aWZpZXIiLCJnZXROYW1lIiwic2FwIiwidWkiLCJnZXRDb3JlIiwiZ2V0Q29uZmlndXJhdGlvbiIsImdldExhbmd1YWdlVGFnIiwicHVzaCIsIlNlcnZpY2VGYWN0b3J5UmVnaXN0cnkiLCJnZXQiLCJjcmVhdGVJbnN0YW5jZSIsInNjb3BlVHlwZSIsInNldHRpbmdzIiwiYnVuZGxlcyIsImVuaGFuY2VJMThuIiwibW9kZWxOYW1lIiwidGhlbiIsIm9SZXNvdXJjZU1vZGVsU2VydmljZSIsImdldFJlc291cmNlTW9kZWwiLCJtZXRhTW9kZWwiLCJhcHBDb21wb25lbnQiLCJjb21wb25lbnQiLCJvQ2FjaGVIYW5kbGVyU2VydmljZSIsInZhbGlkYXRlQ2FjaGVLZXkiLCJWZXJzaW9uSW5mbyIsImxvYWQiLCJvSW5mbyIsInNUaW1lc3RhbXAiLCJsaWJyYXJpZXMiLCJidWlsZGluZm8iLCJidWlsZHRpbWUiLCJmb3JFYWNoIiwib0xpYnJhcnkiLCJidWlsZFRpbWVzdGFtcCIsImNhdGNoIiwic1BhZ2VNb2RlbENhY2hlS2V5IiwiaW5pdFByb21pc2UiLCJQcm9taXNlIiwiYWxsIiwiYURlcGVuZGVuY2llc1Jlc3VsdCIsInNDYWNoZUtleSIsInNWZXJzaW9uSW5mbyIsIm9TaGVsbFNlcnZpY2VzIiwiZ2V0U2hlbGxTZXJ2aWNlcyIsIm9TaWRlRWZmZWN0c1NlcnZpY2VzIiwiZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlIiwiaW5pdGlhbGl6ZVNpZGVFZmZlY3RzIiwiZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJpbnN0YW5jZVR5cGUiLCJjb25jYXQiLCJfZ2V0Q2FjaGVkTW9kZWwiLCJvUGFnZU1vZGVsQ2FjaGUiLCJyZXNvbHZlIiwicmVxdWlyZSIsIlRlbXBsYXRlQ29udmVydGVyIiwiTWV0YU1vZGVsQ29udmVydGVyIiwiY3JlYXRlVmlldyIsImdldEluc3RhbmNlIiwiaW52YWxpZGF0ZUlmTmVlZGVkIiwiZ2V0Vmlld0NhY2hlIiwiQ2FjaGVNYW5hZ2VyIiwidW5kZWZpbmVkIiwib0NhY2hlTW9kZWwiLCJzZXQiLCJvUm9vdFZpZXciLCJnZXRSb290Q29udHJvbCIsImRlc3Ryb3kiLCJvVmlldyIsInJlc291cmNlTW9kZWwiLCJzdGFibGVJZCIsIm9Db250YWluZXIiLCJpbnZhbGlkYXRlIiwib0Vycm9yIiwiTG9nIiwiZXJyb3IiLCJtU2VydmljZVNldHRpbmdzIiwic0NvbnZlcnRlclR5cGUiLCJjb252ZXJ0ZXJUeXBlIiwic0Z1bGxDb250ZXh0UGF0aCIsImdldFJvdXRpbmdTZXJ2aWNlIiwiZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3IiLCJvcHRpb25zIiwiZnVsbENvbnRleHRQYXRoIiwib01hbmlmZXN0Q29udGVudCIsImdldE1hbmlmZXN0Iiwib0RldmljZU1vZGVsIiwiSlNPTk1vZGVsIiwiRGV2aWNlIiwic2V0RGVmYXVsdEJpbmRpbmdNb2RlIiwib01hbmlmZXN0TW9kZWwiLCJiRXJyb3IiLCJvUGFnZU1vZGVsIiwib1ZpZXdEYXRhTW9kZWwiLCJvVmlld1NldHRpbmdzIiwibVZpZXdEYXRhIiwiZ2V0Vmlld1NldHRpbmdzIiwiYVNwbGl0UGF0aCIsInNwbGl0Iiwic0VudGl0eVNldFBhdGgiLCJyZWR1Y2UiLCJzUGF0aFNvRmFyIiwic05leHRQYXRoUGFydCIsIm9UYXJnZXQiLCJnZXRPYmplY3QiLCJPYmplY3QiLCJrZXlzIiwidHlwZSIsInByZXByb2Nlc3NvcnMiLCJ4bWwiLCJiaW5kaW5nQ29udGV4dHMiLCJlbnRpdHlTZXQiLCJjcmVhdGVCaW5kaW5nQ29udGV4dCIsImNvbnRleHRQYXRoIiwiY29udmVydGVyQ29udGV4dCIsIm5vUmVzb2x2ZSIsInZpZXdEYXRhIiwibW9kZWxzIiwibWFuaWZlc3QiLCJpZCIsInZpZXdOYW1lIiwiZ2V0Vmlld05hbWUiLCJjYWNoZSIsImhlaWdodCIsImNyZWF0ZUVycm9yUGFnZSIsInJlYXNvbiIsIm1lc3NhZ2UiLCJlcnJvclZpZXdOYW1lIiwicnVuQXNPd25lciIsIlZpZXciLCJjcmVhdGUiLCJzZXRNb2RlbCIsIk1hbmFnZWRPYmplY3RNb2RlbCIsInNldEFnZ3JlZ2F0aW9uIiwiZ2V0U2VydmljZSIsIm9Sb3V0aW5nU2VydmljZSIsIm9UYXJnZXRJbmZvIiwibU91dGJvdW5kcyIsImNyb3NzTmF2aWdhdGlvbiIsIm91dGJvdW5kcyIsIm1OYXZpZ2F0aW9uIiwiZ2V0TmF2aWdhdGlvbiIsIm5hdmlnYXRpb25PYmplY3RLZXkiLCJuYXZpZ2F0aW9uT2JqZWN0Iiwib3V0Ym91bmRDb25maWciLCJkZXRhaWwiLCJvdXRib3VuZCIsIm91dGJvdW5kRGV0YWlsIiwic2VtYW50aWNPYmplY3QiLCJhY3Rpb24iLCJwYXJhbWV0ZXJzIiwibmF2aWdhdGlvbiIsInZpZXdMZXZlbCIsImNvbnRlbnREZW5zaXRpZXMiLCJyZXNvdXJjZUJ1bmRsZSIsIl9fYnVuZGxlIiwiaXNEZXNrdG9wIiwic3lzdGVtIiwiZGVza3RvcCIsImlzUGhvbmUiLCJwaG9uZSIsImdldFZpZXdEYXRhIiwiYXNzaWduIiwic2hlbGxDb250ZW50RGVuc2l0eSIsImdldENvbnRlbnREZW5zaXR5IiwidXNlTmV3TGF6eUxvYWRpbmciLCJVcmlQYXJhbWV0ZXJzIiwiZnJvbVF1ZXJ5Iiwid2luZG93IiwibG9jYXRpb24iLCJzZWFyY2giLCJyZXRyaWV2ZVRleHRGcm9tVmFsdWVMaXN0IiwiZm9ybSIsImNvbnRyb2xDb25maWd1cmF0aW9uIiwic0Fubm90YXRpb25QYXRoIiwiaW5kZXhPZiIsInNUYXJnZXRBbm5vdGF0aW9uUGF0aCIsIkR5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlciIsInJlc29sdmVEeW5hbWljRXhwcmVzc2lvbiIsImNvbnZlcnRUeXBlcyIsIlRlbXBsYXRlTW9kZWwiLCJvRGlhZ25vc3RpY3MiLCJnZXREaWFnbm9zdGljcyIsImlJc3N1ZUNvdW50IiwiZ2V0SXNzdWVzIiwib0NvbnZlcnRlclBhZ2VNb2RlbCIsImNvbnZlcnRQYWdlIiwiYUlzc3VlcyIsImFBZGRlZElzc3VlcyIsInNsaWNlIiwid2FybmluZyIsIl9zZXRDYWNoZWRNb2RlbCIsIkVycm9yIiwicmVtb3ZlR2xvYmFsSW5zdGFuY2UiLCJTZXJ2aWNlIiwiVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5Iiwib1NlcnZpY2VDb250ZXh0IiwiaUNyZWF0aW5nVmlld3MiLCJvVGVtcGxhdGVkVmlld1NlcnZpY2UiLCJfb0luc3RhbmNlUmVnaXN0cnkiLCJTZXJ2aWNlRmFjdG9yeSJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFxQk1BLG9COzs7Ozs7Ozs7Ozs7O2FBVUwsZ0JBQU87QUFBQTs7QUFDTixZQUFNQyxvQkFBb0IsR0FBRyxFQUE3QjtBQUNBLFlBQU1DLFFBQVEsR0FBRyxLQUFLQyxVQUFMLEVBQWpCO0FBQ0EsWUFBTUMsVUFBVSxHQUFHRixRQUFRLENBQUNHLFdBQTVCO0FBQ0EsWUFBTUMsYUFBYSxHQUFHQyxTQUFTLENBQUNDLG9CQUFWLENBQStCSixVQUEvQixDQUF0QjtBQUNBLFlBQU1LLFVBQVUsR0FBR0gsYUFBYSxDQUFDSSxZQUFkLEVBQW5CO0FBQ0EsWUFBTUMsU0FBUyxHQUFHTCxhQUFhLENBQUNNLFdBQWQsR0FBNEJDLGdCQUE1QixLQUFpRCxJQUFqRCxHQUF3RFAsYUFBYSxDQUFDUSxVQUFkLENBQXlCVixVQUFVLENBQUNXLEtBQVgsRUFBekIsQ0FBMUU7QUFDQSxZQUFNQyxZQUFZLEdBQUdaLFVBQVUsQ0FBQ2EsY0FBWCxNQUErQixFQUFwRDtBQUNBLFlBQUlDLGFBQUo7QUFDQSxhQUFLQyxRQUFMLEdBQWdCakIsUUFBUSxDQUFDa0IsT0FBekI7O0FBQ0EsWUFBSUosWUFBSixFQUFrQjtBQUNqQkUsVUFBQUEsYUFBYSxHQUFHWixhQUFhLENBQUNNLFdBQWQsR0FBNEJDLGdCQUE1QixFQUFoQjs7QUFDQSxlQUFLLElBQUlRLENBQUMsR0FBRyxDQUFiLEVBQWdCQSxDQUFDLEdBQUdMLFlBQVksQ0FBQ00sTUFBakMsRUFBeUNELENBQUMsRUFBMUMsRUFBOEM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBTUUsY0FBYyxHQUFHakIsYUFBYSxDQUFDa0IsUUFBZCxDQUF1QlIsWUFBWSxDQUFDSyxDQUFELENBQW5DLENBQXZCOztBQUNBLGdCQUFJRSxjQUFjLElBQUlBLGNBQWMsQ0FBQ0UsR0FBZixDQUFtQixxQ0FBbkIsQ0FBdEIsRUFBaUY7QUFDaEZULGNBQUFBLFlBQVksQ0FBQ0ssQ0FBRCxDQUFaLEdBQWtCRSxjQUFsQjtBQUNBLGFBRkQsTUFFTztBQUNOUCxjQUFBQSxZQUFZLENBQUNLLENBQUQsQ0FBWixHQUFrQkgsYUFBYSxHQUFHLEdBQWhCLEdBQXNCRixZQUFZLENBQUNLLENBQUQsQ0FBWixDQUFnQkssT0FBaEIsQ0FBd0IsYUFBeEIsRUFBdUMsRUFBdkMsQ0FBeEM7QUFDQTtBQUNEO0FBQ0Q7O0FBRUQsWUFBTUMsZ0JBQWdCLEdBQ3JCckIsYUFBYSxDQUFDTSxXQUFkLEdBQTRCZ0IsT0FBNUIsS0FDQSxHQURBLEdBRUFqQixTQUZBLEdBR0EsR0FIQSxHQUlBa0IsR0FBRyxDQUFDQyxFQUFKLENBQ0VDLE9BREYsR0FFRUMsZ0JBRkYsR0FHRUMsY0FIRixFQUxEO0FBU0FoQyxRQUFBQSxvQkFBb0IsQ0FBQ2lDLElBQXJCLENBQ0NDLHNCQUFzQixDQUFDQyxHQUF2QixDQUEyQiwyQ0FBM0IsRUFDRUMsY0FERixDQUNpQjtBQUNmQyxVQUFBQSxTQUFTLEVBQUUsV0FESTtBQUVmakMsVUFBQUEsV0FBVyxFQUFFRCxVQUZFO0FBR2ZtQyxVQUFBQSxRQUFRLEVBQUU7QUFDVEMsWUFBQUEsT0FBTyxFQUFFLENBQUMsMkJBQUQsRUFBOEIsNkJBQTlCLEVBQTZELGdDQUE3RCxDQURBO0FBRVRDLFlBQUFBLFdBQVcsRUFBRXpCLFlBRko7QUFHVDBCLFlBQUFBLFNBQVMsRUFBRTtBQUhGO0FBSEssU0FEakIsRUFVRUMsSUFWRixDQVVPLFVBQUNDLHFCQUFELEVBQWlEO0FBQ3RELFVBQUEsS0FBSSxDQUFDQSxxQkFBTCxHQUE2QkEscUJBQTdCO0FBQ0EsaUJBQU9BLHFCQUFxQixDQUFDQyxnQkFBdEIsRUFBUDtBQUNBLFNBYkYsQ0FERDtBQWlCQTVDLFFBQUFBLG9CQUFvQixDQUFDaUMsSUFBckIsQ0FDQ0Msc0JBQXNCLENBQUNDLEdBQXZCLENBQTJCLDBDQUEzQixFQUNFQyxjQURGLENBQ2lCO0FBQ2ZFLFVBQUFBLFFBQVEsRUFBRTtBQUNUTyxZQUFBQSxTQUFTLEVBQUVyQyxVQURGO0FBRVRzQyxZQUFBQSxZQUFZLEVBQUV6QyxhQUZMO0FBR1QwQyxZQUFBQSxTQUFTLEVBQUU1QztBQUhGO0FBREssU0FEakIsRUFRRXVDLElBUkYsQ0FRTyxVQUFDTSxvQkFBRCxFQUErQjtBQUNwQyxVQUFBLEtBQUksQ0FBQ0Esb0JBQUwsR0FBNEJBLG9CQUE1QjtBQUNBLGlCQUFPQSxvQkFBb0IsQ0FBQ0MsZ0JBQXJCLENBQXNDdkIsZ0JBQXRDLENBQVA7QUFDQSxTQVhGLENBREQ7QUFjQTFCLFFBQUFBLG9CQUFvQixDQUFDaUMsSUFBckIsQ0FDRWlCLFdBQUQsQ0FDRUMsSUFERixHQUVFVCxJQUZGLENBRU8sVUFBU1UsS0FBVCxFQUFxQjtBQUMxQixjQUFJQyxVQUFVLEdBQUcsRUFBakI7O0FBQ0EsY0FBSSxDQUFDRCxLQUFLLENBQUNFLFNBQVgsRUFBc0I7QUFDckJELFlBQUFBLFVBQVUsR0FBSXpCLEdBQUcsQ0FBQ0MsRUFBTCxDQUFnQjBCLFNBQWhCLENBQTBCQyxTQUF2QztBQUNBLFdBRkQsTUFFTztBQUNOSixZQUFBQSxLQUFLLENBQUNFLFNBQU4sQ0FBZ0JHLE9BQWhCLENBQXdCLFVBQVNDLFFBQVQsRUFBd0I7QUFDL0NMLGNBQUFBLFVBQVUsSUFBSUssUUFBUSxDQUFDQyxjQUF2QjtBQUNBLGFBRkQ7QUFHQTs7QUFDRCxpQkFBT04sVUFBUDtBQUNBLFNBWkYsRUFhRU8sS0FiRixDQWFRLFlBQVc7QUFDakIsaUJBQU8sV0FBUDtBQUNBLFNBZkYsQ0FERDtBQW1CQSxZQUFJQyxrQkFBa0IsR0FBRyxFQUF6QjtBQUNBLGFBQUtDLFdBQUwsR0FBbUJDLE9BQU8sQ0FBQ0MsR0FBUixDQUFZaEUsb0JBQVosRUFDakIwQyxJQURpQixDQUNaLFVBQUN1QixtQkFBRCxFQUFnQztBQUNyQyxjQUFNQyxTQUFTLEdBQUdELG1CQUFtQixDQUFDLENBQUQsQ0FBckM7QUFDQSxjQUFNRSxZQUFZLEdBQUdGLG1CQUFtQixDQUFDLENBQUQsQ0FBeEM7QUFDQSxjQUFNRyxjQUFjLEdBQUcvRCxhQUFhLENBQUNnRSxnQkFBZCxFQUF2QjtBQUNBLGNBQU1DLG9CQUFvQixHQUFHakUsYUFBYSxDQUFDa0UscUJBQWQsRUFBN0I7QUFFQUQsVUFBQUEsb0JBQW9CLENBQUNFLHFCQUFyQixDQUEyQ25FLGFBQWEsQ0FBQ29FLDBCQUFkLEdBQTJDQyxlQUEzQyxFQUEzQztBQUVBYixVQUFBQSxrQkFBa0IsR0FBR0ssU0FBUyxHQUFHLEdBQVosR0FBa0JDLFlBQWxCLEdBQWlDLEdBQWpDLEdBQXVDekQsU0FBdkMsR0FBbUQsR0FBbkQsR0FBeUQwRCxjQUFjLENBQUNPLFlBQXhFLEdBQXVGLFlBQTVHO0FBQ0EsaUJBQU9aLE9BQU8sQ0FBQ0MsR0FBUixDQUFZQyxtQkFBbUIsQ0FBQ1csTUFBcEIsQ0FBMkIsQ0FBQyxLQUFJLENBQUNDLGVBQUwsQ0FBcUJoQixrQkFBckIsQ0FBRCxDQUEzQixDQUFaLENBQVA7QUFDQSxTQVhpQixFQVlqQm5CLElBWmlCLENBWVosVUFBQ3VCLG1CQUFELEVBQWdDO0FBQ3JDLGNBQU0zQyxjQUFjLEdBQUcyQyxtQkFBbUIsQ0FBQyxDQUFELENBQTFDO0FBQ0EsY0FBTUMsU0FBUyxHQUFHRCxtQkFBbUIsQ0FBQyxDQUFELENBQXJDO0FBQ0EsY0FBTWEsZUFBZSxHQUFHYixtQkFBbUIsQ0FBQyxDQUFELENBQTNDO0FBQ0EsaUJBQU8sSUFBSUYsT0FBSixDQUFZLFVBQUFnQixPQUFPLEVBQUk7QUFDN0JuRCxZQUFBQSxHQUFHLENBQUNDLEVBQUosQ0FBT21ELE9BQVAsQ0FDQyxDQUFDLDBDQUFELEVBQTZDLDJDQUE3QyxDQURELEVBRUMsVUFBQ0MsaUJBQUQsRUFBeUJDLGtCQUF6QixFQUFxRDtBQUNwREgsY0FBQUEsT0FBTyxDQUNOLEtBQUksQ0FBQ0ksVUFBTCxDQUNDN0QsY0FERCxFQUVDWixTQUZELEVBR0N3RCxTQUhELEVBSUNMLGtCQUpELEVBS0NpQixlQUxELEVBTUNHLGlCQU5ELEVBT0NDLGtCQVBELENBRE0sQ0FBUDtBQVdBLGFBZEY7QUFnQkEsV0FqQk0sQ0FBUDtBQWtCQSxTQWxDaUIsRUFtQ2pCeEMsSUFuQ2lCLENBbUNaLFVBQVN3QixTQUFULEVBQXlCO0FBQzlCLGNBQU1sQixvQkFBb0IsR0FBR2Qsc0JBQXNCLENBQUNDLEdBQXZCLENBQTJCLDBDQUEzQixFQUF1RWlELFdBQXZFLENBQW1GNUUsVUFBbkYsQ0FBN0I7QUFDQXdDLFVBQUFBLG9CQUFvQixDQUFDcUMsa0JBQXJCLENBQXdDbkIsU0FBeEMsRUFBbUR4QyxnQkFBbkQ7QUFDQSxTQXRDaUIsQ0FBbkI7QUF1Q0E7OzthQUNELHlCQUFnQndDLFNBQWhCLEVBQWdDO0FBQy9CLFlBQ0N0QyxHQUFHLENBQUNDLEVBQUosQ0FDRUMsT0FERixHQUVFQyxnQkFGRixHQUdFdUQsWUFIRixFQURELEVBS0U7QUFDRCxpQkFBT0MsWUFBWSxDQUFDcEQsR0FBYixDQUFpQitCLFNBQWpCLENBQVA7QUFDQTs7QUFDRCxlQUFPc0IsU0FBUDtBQUNBOzs7YUFDRCx5QkFBZ0J0QixTQUFoQixFQUFtQ3VCLFdBQW5DLEVBQXFEO0FBQ3BELFlBQ0M3RCxHQUFHLENBQUNDLEVBQUosQ0FDRUMsT0FERixHQUVFQyxnQkFGRixHQUdFdUQsWUFIRixFQURELEVBS0U7QUFDREMsVUFBQUEsWUFBWSxDQUFDRyxHQUFiLENBQWlCeEIsU0FBakIsRUFBNEJ1QixXQUE1QjtBQUNBOztBQUNELGVBQU9ELFNBQVA7QUFDQTtBQUNEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7YUFDQyxxQkFBWXJGLFVBQVosRUFBNkI7QUFDNUIsWUFBTXdGLFNBQVMsR0FBR3hGLFVBQVUsQ0FBQ3lGLGNBQVgsRUFBbEI7O0FBQ0EsWUFBSUQsU0FBSixFQUFlO0FBQ2RBLFVBQUFBLFNBQVMsQ0FBQ0UsT0FBVjtBQUNBLFNBRkQsTUFFTyxJQUFJLEtBQUtDLEtBQVQsRUFBZ0I7QUFDdEIsZUFBS0EsS0FBTCxDQUFXRCxPQUFYO0FBQ0E7O0FBQ0QsZUFBTyxLQUFLVixVQUFMLENBQWdCLEtBQUtZLGFBQXJCLEVBQW9DLEtBQUtDLFFBQXpDLEVBQW1ELEVBQW5ELEVBQXVELEVBQXZELEVBQTJEUixTQUEzRCxFQUFzRSxLQUFLUCxpQkFBM0UsRUFBOEYsS0FBS0Msa0JBQW5HLEVBQ0x4QyxJQURLLENBQ0EsWUFBVztBQUNoQnZDLFVBQUFBLFVBQVUsQ0FBQzhGLFVBQVgsQ0FBc0JDLFVBQXRCO0FBQ0EsU0FISyxFQUlMdEMsS0FKSyxDQUlDLFVBQVN1QyxNQUFULEVBQXNCO0FBQzVCaEcsVUFBQUEsVUFBVSxDQUFDOEYsVUFBWCxDQUFzQkMsVUFBdEI7QUFDQUUsVUFBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVVGLE1BQVY7QUFDQSxTQVBLLENBQVA7QUFRQTs7O2FBQ0Qsb0JBQ0M3RSxjQURELEVBRUNaLFNBRkQsRUFHQ3dELFNBSEQsRUFJQ0wsa0JBSkQsRUFLQ2lCLGVBTEQsRUFNQ0csaUJBTkQsRUFPQ0Msa0JBUEQsRUFRRTtBQUFBOztBQUNELGFBQUthLGFBQUwsR0FBcUJ6RSxjQUFyQjtBQUNBLGFBQUswRSxRQUFMLEdBQWdCdEYsU0FBaEI7QUFDQSxhQUFLdUUsaUJBQUwsR0FBeUJBLGlCQUF6QjtBQUNBLGFBQUtDLGtCQUFMLEdBQTBCQSxrQkFBMUI7QUFDQSxZQUFNakYsUUFBUSxHQUFHLEtBQUtDLFVBQUwsRUFBakI7QUFDQSxZQUFNb0csZ0JBQWdCLEdBQUdyRyxRQUFRLENBQUNxQyxRQUFsQztBQUNBLFlBQU1pRSxjQUFjLEdBQUdELGdCQUFnQixDQUFDRSxhQUF4QztBQUNBLFlBQU1yRyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0csV0FBNUI7QUFDQSxZQUFNQyxhQUEyQixHQUFHQyxTQUFTLENBQUNDLG9CQUFWLENBQStCSixVQUEvQixDQUFwQztBQUNBLFlBQU1zRyxnQkFBZ0IsR0FBR3BHLGFBQWEsQ0FBQ3FHLGlCQUFkLEdBQWtDQyx1QkFBbEMsQ0FBMER4RyxVQUExRCxFQUFzRXlHLE9BQXRFLENBQThFdEUsUUFBOUUsQ0FBdUZ1RSxlQUFoSDtBQUNBLFlBQU1yRyxVQUFVLEdBQUdILGFBQWEsQ0FBQ0ksWUFBZCxFQUFuQjtBQUNBLFlBQU1xRyxnQkFBcUIsR0FBR3pHLGFBQWEsQ0FBQzBHLFdBQWQsRUFBOUI7QUFDQSxZQUFNQyxZQUFZLEdBQUcsSUFBSUMsU0FBSixDQUFjckYsR0FBRyxDQUFDQyxFQUFKLENBQU9xRixNQUFyQixFQUE2QkMscUJBQTdCLENBQW1ELFFBQW5ELENBQXJCO0FBQ0EsWUFBTUMsY0FBYyxHQUFHLElBQUlILFNBQUosQ0FBY0gsZ0JBQWQsQ0FBdkI7QUFDQSxZQUFNTyxNQUFNLEdBQUcsS0FBZjtBQUNBLFlBQUlDLFVBQUosRUFBK0JDLGNBQS9CLEVBQXNEQyxhQUF0RCxFQUEwRUMsU0FBMUU7O0FBRUEsaUJBQVNDLGVBQVQsR0FBMkI7QUFDMUIsY0FBTUMsVUFBVSxHQUFHbEIsZ0JBQWdCLENBQUNtQixLQUFqQixDQUF1QixHQUF2QixDQUFuQjtBQUNBLGNBQU1DLGNBQWMsR0FBR0YsVUFBVSxDQUFDRyxNQUFYLENBQWtCLFVBQVNDLFVBQVQsRUFBMEJDLGFBQTFCLEVBQThDO0FBQ3RGLGdCQUFJQSxhQUFhLEtBQUssRUFBdEIsRUFBMEI7QUFDekIscUJBQU9ELFVBQVA7QUFDQTs7QUFDRCxnQkFBSUEsVUFBVSxLQUFLLEVBQW5CLEVBQXVCO0FBQ3RCQSxjQUFBQSxVQUFVLEdBQUcsTUFBTUMsYUFBbkI7QUFDQSxhQUZELE1BRU87QUFDTixrQkFBTUMsT0FBTyxHQUFHekgsVUFBVSxDQUFDMEgsU0FBWCxDQUFxQkgsVUFBVSxHQUFHLDhCQUFiLEdBQThDQyxhQUFuRSxDQUFoQjs7QUFDQSxrQkFBSUMsT0FBTyxJQUFJRSxNQUFNLENBQUNDLElBQVAsQ0FBWUgsT0FBWixFQUFxQjVHLE1BQXJCLEdBQThCLENBQTdDLEVBQWdEO0FBQy9DMEcsZ0JBQUFBLFVBQVUsSUFBSSw2QkFBZDtBQUNBOztBQUNEQSxjQUFBQSxVQUFVLElBQUksTUFBTUMsYUFBcEI7QUFDQTs7QUFDRCxtQkFBT0QsVUFBUDtBQUNBLFdBZHNCLEVBY3BCLEVBZG9CLENBQXZCO0FBZUEsY0FBTVAsYUFBYSxHQUFHO0FBQ3JCYSxZQUFBQSxJQUFJLEVBQUUsS0FEZTtBQUVyQkMsWUFBQUEsYUFBYSxFQUFFO0FBQ2RDLGNBQUFBLEdBQUcsRUFBRTtBQUNKQyxnQkFBQUEsZUFBZSxFQUFFO0FBQ2hCQyxrQkFBQUEsU0FBUyxFQUFFWixjQUFjLEdBQUdySCxVQUFVLENBQUNrSSxvQkFBWCxDQUFnQ2IsY0FBaEMsQ0FBSCxHQUFxRCxJQUQ5RDtBQUVoQmhCLGtCQUFBQSxlQUFlLEVBQUVKLGdCQUFnQixHQUFHakcsVUFBVSxDQUFDa0ksb0JBQVgsQ0FBZ0NqQyxnQkFBaEMsQ0FBSCxHQUF1RCxJQUZ4RTtBQUdoQmtDLGtCQUFBQSxXQUFXLEVBQUVsQyxnQkFBZ0IsR0FBR2pHLFVBQVUsQ0FBQ2tJLG9CQUFYLENBQWdDakMsZ0JBQWhDLENBQUgsR0FBdUQsSUFIcEU7QUFJaEJtQyxrQkFBQUEsZ0JBQWdCLEVBQUV0QixVQUFVLENBQUNvQixvQkFBWCxDQUFnQyxHQUFoQyxFQUFxQ2xELFNBQXJDLEVBQWdEO0FBQUVxRCxvQkFBQUEsU0FBUyxFQUFFO0FBQWIsbUJBQWhELENBSkY7QUFLaEJDLGtCQUFBQSxRQUFRLEVBQUVyQixTQUFTLEdBQUdGLGNBQWMsQ0FBQ21CLG9CQUFmLENBQW9DLEdBQXBDLENBQUgsR0FBOEM7QUFMakQsaUJBRGI7QUFRSkssZ0JBQUFBLE1BQU0sRUFBRTtBQUNQTixrQkFBQUEsU0FBUyxFQUFFakksVUFESjtBQUVQcUcsa0JBQUFBLGVBQWUsRUFBRXJHLFVBRlY7QUFHUG1JLGtCQUFBQSxXQUFXLEVBQUVuSSxVQUhOO0FBSVAsaUNBQWVjLGNBSlI7QUFLUHVCLGtCQUFBQSxTQUFTLEVBQUVyQyxVQUxKO0FBTVAsNEJBQVV3RyxZQU5IO0FBTWlCO0FBQ3hCZ0Msa0JBQUFBLFFBQVEsRUFBRTVCLGNBUEg7QUFRUHdCLGtCQUFBQSxnQkFBZ0IsRUFBRXRCLFVBUlg7QUFTUHdCLGtCQUFBQSxRQUFRLEVBQUV2QjtBQVRILGlCQVJKO0FBbUJKekUsZ0JBQUFBLFlBQVksRUFBRXpDO0FBbkJWO0FBRFMsYUFGTTtBQXlCckI0SSxZQUFBQSxFQUFFLEVBQUV2SSxTQXpCaUI7QUEwQnJCd0ksWUFBQUEsUUFBUSxFQUFFNUMsZ0JBQWdCLENBQUM0QyxRQUFqQixJQUE2Qi9JLFVBQVUsQ0FBQ2dKLFdBQVgsRUExQmxCO0FBMkJyQkwsWUFBQUEsUUFBUSxFQUFFckIsU0EzQlc7QUE0QnJCMkIsWUFBQUEsS0FBSyxFQUFFO0FBQUVoQixjQUFBQSxJQUFJLEVBQUUsQ0FBQ2xFLFNBQUQ7QUFBUixhQTVCYztBQTZCckI2RSxZQUFBQSxNQUFNLEVBQUU7QUFDUCw2QkFBZXpIO0FBRFIsYUE3QmE7QUFnQ3JCK0gsWUFBQUEsTUFBTSxFQUFFO0FBaENhLFdBQXRCO0FBa0NBLGlCQUFPN0IsYUFBUDtBQUNBOztBQUNELFlBQU04QixlQUFlLEdBQUcsVUFBQ0MsTUFBRCxFQUFpQjtBQUN4QztBQUNBO0FBQ0FuRCxVQUFBQSxHQUFHLENBQUNDLEtBQUosQ0FBVWtELE1BQU0sQ0FBQ0MsT0FBakIsRUFBMEJELE1BQTFCO0FBQ0EvQixVQUFBQSxhQUFhLENBQUMwQixRQUFkLEdBQXlCNUMsZ0JBQWdCLENBQUNtRCxhQUFqQixJQUFrQywrQ0FBM0Q7QUFDQWpDLFVBQUFBLGFBQWEsQ0FBQ2MsYUFBZCxDQUE0QkMsR0FBNUIsQ0FBZ0NRLE1BQWhDLENBQXVDLE9BQXZDLElBQWtELElBQUk5QixTQUFKLENBQWNzQyxNQUFkLENBQWxEO0FBRUEsaUJBQU9wSixVQUFVLENBQUN1SixVQUFYLENBQXNCLFlBQU07QUFDbEMsbUJBQU9DLElBQUksQ0FBQ0MsTUFBTCxDQUFZcEMsYUFBWixFQUEyQjlFLElBQTNCLENBQWdDLFVBQUNvRCxLQUFELEVBQWdCO0FBQ3RELGNBQUEsTUFBSSxDQUFDQSxLQUFMLEdBQWFBLEtBQWI7O0FBQ0EsY0FBQSxNQUFJLENBQUNBLEtBQUwsQ0FBVytELFFBQVgsQ0FBb0IsSUFBSUMsa0JBQUosQ0FBdUIsTUFBSSxDQUFDaEUsS0FBNUIsQ0FBcEIsRUFBd0QsT0FBeEQ7O0FBQ0EzRixjQUFBQSxVQUFVLENBQUM0SixjQUFYLENBQTBCLGFBQTFCLEVBQXlDLE1BQUksQ0FBQ2pFLEtBQTlDO0FBQ0EscUJBQU81QixTQUFQO0FBQ0EsYUFMTSxDQUFQO0FBTUEsV0FQTSxDQUFQO0FBUUEsU0FmRDs7QUFnQkEsZUFBTzdELGFBQWEsQ0FDbEIySixVQURLLENBQ00sZ0JBRE4sRUFFTHRILElBRkssQ0FFQSxVQUFDdUgsZUFBRCxFQUEwQjtBQUMvQjtBQUNBLGNBQU1DLFdBQVcsR0FBR0QsZUFBZSxDQUFDdEQsdUJBQWhCLENBQXdDeEcsVUFBeEMsQ0FBcEI7QUFDQSxjQUFNZ0ssVUFBVSxHQUNmckQsZ0JBQWdCLENBQUMsU0FBRCxDQUFoQixJQUNBQSxnQkFBZ0IsQ0FBQyxTQUFELENBQWhCLENBQTRCc0QsZUFENUIsSUFFQXRELGdCQUFnQixDQUFDLFNBQUQsQ0FBaEIsQ0FBNEJzRCxlQUE1QixDQUE0Q0MsU0FIN0M7QUFJQSxjQUFNQyxXQUFXLEdBQUduSyxVQUFVLENBQUNvSyxhQUFYLE1BQThCLEVBQWxEO0FBQ0FwQyxVQUFBQSxNQUFNLENBQUNDLElBQVAsQ0FBWWtDLFdBQVosRUFBeUI3RyxPQUF6QixDQUFpQyxVQUFTK0csbUJBQVQsRUFBc0M7QUFDdEUsZ0JBQU1DLGdCQUFnQixHQUFHSCxXQUFXLENBQUNFLG1CQUFELENBQXBDO0FBQ0EsZ0JBQUlFLGNBQUo7O0FBQ0EsZ0JBQUlELGdCQUFnQixDQUFDRSxNQUFqQixJQUEyQkYsZ0JBQWdCLENBQUNFLE1BQWpCLENBQXdCQyxRQUFuRCxJQUErRFQsVUFBVSxDQUFDTSxnQkFBZ0IsQ0FBQ0UsTUFBakIsQ0FBd0JDLFFBQXpCLENBQTdFLEVBQWlIO0FBQ2hIRixjQUFBQSxjQUFjLEdBQUdQLFVBQVUsQ0FBQ00sZ0JBQWdCLENBQUNFLE1BQWpCLENBQXdCQyxRQUF6QixDQUEzQjtBQUNBSCxjQUFBQSxnQkFBZ0IsQ0FBQ0UsTUFBakIsQ0FBd0JFLGNBQXhCLEdBQXlDO0FBQ3hDQyxnQkFBQUEsY0FBYyxFQUFFSixjQUFjLENBQUNJLGNBRFM7QUFFeENDLGdCQUFBQSxNQUFNLEVBQUVMLGNBQWMsQ0FBQ0ssTUFGaUI7QUFHeENDLGdCQUFBQSxVQUFVLEVBQUVOLGNBQWMsQ0FBQ007QUFIYSxlQUF6QztBQUtBOztBQUNELGdCQUFJUCxnQkFBZ0IsQ0FBQ2IsTUFBakIsSUFBMkJhLGdCQUFnQixDQUFDYixNQUFqQixDQUF3QmdCLFFBQW5ELElBQStEVCxVQUFVLENBQUNNLGdCQUFnQixDQUFDYixNQUFqQixDQUF3QmdCLFFBQXpCLENBQTdFLEVBQWlIO0FBQ2hIRixjQUFBQSxjQUFjLEdBQUdQLFVBQVUsQ0FBQ00sZ0JBQWdCLENBQUNiLE1BQWpCLENBQXdCZ0IsUUFBekIsQ0FBM0I7QUFDQUgsY0FBQUEsZ0JBQWdCLENBQUNiLE1BQWpCLENBQXdCaUIsY0FBeEIsR0FBeUM7QUFDeENDLGdCQUFBQSxjQUFjLEVBQUVKLGNBQWMsQ0FBQ0ksY0FEUztBQUV4Q0MsZ0JBQUFBLE1BQU0sRUFBRUwsY0FBYyxDQUFDSyxNQUZpQjtBQUd4Q0MsZ0JBQUFBLFVBQVUsRUFBRU4sY0FBYyxDQUFDTTtBQUhhLGVBQXpDO0FBS0E7QUFDRCxXQW5CRDtBQW9CQXZELFVBQUFBLFNBQVMsR0FBRztBQUNYd0QsWUFBQUEsVUFBVSxFQUFFWCxXQUREO0FBRVhZLFlBQUFBLFNBQVMsRUFBRWhCLFdBQVcsQ0FBQ2dCLFNBRlo7QUFHWGxGLFlBQUFBLFFBQVEsRUFBRXRGLFNBSEM7QUFJWHlLLFlBQUFBLGdCQUFnQixFQUFFckUsZ0JBQWdCLENBQUMsU0FBRCxDQUFoQixDQUE0QnFFLGdCQUpuQztBQUtYQyxZQUFBQSxjQUFjLEVBQUU5SixjQUFjLENBQUMrSixRQUxwQjtBQU1YeEUsWUFBQUEsZUFBZSxFQUFFSixnQkFOTjtBQU9YNkUsWUFBQUEsU0FBUyxFQUFHcEUsTUFBRCxDQUFnQnFFLE1BQWhCLENBQXVCQyxPQVB2QjtBQVFYQyxZQUFBQSxPQUFPLEVBQUd2RSxNQUFELENBQWdCcUUsTUFBaEIsQ0FBdUJHO0FBUnJCLFdBQVo7O0FBV0EsY0FBSXZMLFVBQVUsQ0FBQ3dMLFdBQWYsRUFBNEI7QUFDM0J4RCxZQUFBQSxNQUFNLENBQUN5RCxNQUFQLENBQWNuRSxTQUFkLEVBQXlCdEgsVUFBVSxDQUFDd0wsV0FBWCxFQUF6QjtBQUNBOztBQUVELGNBQU12SCxjQUFjLEdBQUcvRCxhQUFhLENBQUNnRSxnQkFBZCxFQUF2QjtBQUNBb0QsVUFBQUEsU0FBUyxDQUFDakIsYUFBVixHQUEwQkQsY0FBMUI7QUFDQWtCLFVBQUFBLFNBQVMsQ0FBQ29FLG1CQUFWLEdBQWdDekgsY0FBYyxDQUFDMEgsaUJBQWYsRUFBaEM7QUFDQXJFLFVBQUFBLFNBQVMsQ0FBQ3NFLGlCQUFWLEdBQThCQyxhQUFhLENBQUNDLFNBQWQsQ0FBd0JDLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkMsTUFBeEMsRUFBZ0RqSyxHQUFoRCxDQUFvRCwyQkFBcEQsTUFBcUYsTUFBbkg7QUFDQXNGLFVBQUFBLFNBQVMsQ0FBQzRFLHlCQUFWLEdBQ0N2RixnQkFBZ0IsQ0FBQyxRQUFELENBQWhCLElBQThCQSxnQkFBZ0IsQ0FBQyxRQUFELENBQWhCLENBQTJCd0YsSUFBekQsR0FDR3hGLGdCQUFnQixDQUFDLFFBQUQsQ0FBaEIsQ0FBMkJ3RixJQUEzQixDQUFnQ0QseUJBRG5DLEdBRUc3RyxTQUhKO0FBSUErQixVQUFBQSxjQUFjLEdBQUcsSUFBSU4sU0FBSixDQUFjUSxTQUFkLENBQWpCOztBQUNBLGNBQUlBLFNBQVMsSUFBSUEsU0FBUyxDQUFDOEUsb0JBQTNCLEVBQWlEO0FBQ2hEcEUsWUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlYLFNBQVMsQ0FBQzhFLG9CQUF0QixFQUE0QzlJLE9BQTVDLENBQW9ELFVBQVMrSSxlQUFULEVBQWtDO0FBQ3JGLGtCQUFJQSxlQUFlLENBQUNDLE9BQWhCLENBQXdCLEdBQXhCLE1BQWlDLENBQUMsQ0FBdEMsRUFBeUM7QUFDeEMsb0JBQU1DLHFCQUFxQixHQUFHQywyQkFBMkIsQ0FBQ0Msd0JBQTVCLENBQXFESixlQUFyRCxFQUFzRWhNLFVBQXRFLENBQTlCO0FBQ0FpSCxnQkFBQUEsU0FBUyxDQUFDOEUsb0JBQVYsQ0FBK0JHLHFCQUEvQixJQUF3RGpGLFNBQVMsQ0FBQzhFLG9CQUFWLENBQStCQyxlQUEvQixDQUF4RDtBQUNBO0FBQ0QsYUFMRDtBQU1BOztBQUNEdEgsVUFBQUEsa0JBQWtCLENBQUMySCxZQUFuQixDQUFnQ3JNLFVBQWhDLEVBQTRDSCxhQUFhLENBQUNvRSwwQkFBZCxHQUEyQ0MsZUFBM0MsRUFBNUM7QUFDQTRDLFVBQUFBLFVBQVUsR0FBRyxJQUFJd0YsYUFBSixDQUFrQixZQUFNO0FBQ3BDLGdCQUFJO0FBQ0gsa0JBQUksQ0FBQyxDQUFDaEksZUFBTixFQUF1QjtBQUN0Qix1QkFBT0EsZUFBUDtBQUNBLGVBRkQsTUFFTztBQUNOLG9CQUFNaUksWUFBWSxHQUFHMU0sYUFBYSxDQUFDMk0sY0FBZCxFQUFyQjtBQUNBLG9CQUFNQyxXQUFXLEdBQUdGLFlBQVksQ0FBQ0csU0FBYixHQUF5QjdMLE1BQTdDO0FBQ0Esb0JBQU04TCxtQkFBbUIsR0FBR2xJLGlCQUFpQixDQUFDbUksV0FBbEIsQ0FDM0I3RyxjQUQyQixFQUUzQi9GLFVBRjJCLEVBRzNCaUgsU0FIMkIsRUFJM0JzRixZQUoyQixFQUszQnRHLGdCQUwyQixFQU0zQnBHLGFBQWEsQ0FBQ29FLDBCQUFkLEdBQTJDQyxlQUEzQyxFQU4yQixDQUE1QjtBQVNBLG9CQUFNMkksT0FBTyxHQUFHTixZQUFZLENBQUNHLFNBQWIsRUFBaEI7QUFDQSxvQkFBTUksWUFBWSxHQUFHRCxPQUFPLENBQUNFLEtBQVIsQ0FBY04sV0FBZCxDQUFyQjs7QUFDQSxvQkFBSUssWUFBWSxDQUFDak0sTUFBYixHQUFzQixDQUExQixFQUE2QjtBQUM1QitFLGtCQUFBQSxHQUFHLENBQUNvSCxPQUFKLENBQ0MsNkdBREQ7QUFHQSxpQkFsQkssQ0FtQk47OztBQUNBLGdCQUFBLE1BQUksQ0FBQ0MsZUFBTCxDQUFxQjVKLGtCQUFyQixFQUF5Q3NKLG1CQUF6Qzs7QUFDQSx1QkFBT0EsbUJBQVA7QUFDQTtBQUNELGFBMUJELENBMEJFLE9BQU85RyxLQUFQLEVBQWM7QUFDZkQsY0FBQUEsR0FBRyxDQUFDQyxLQUFKLENBQVVBLEtBQVYsRUFBaUJBLEtBQWpCO0FBQ0EscUJBQU8sRUFBUDtBQUNBO0FBQ0QsV0EvQlksRUErQlY3RixVQS9CVSxDQUFiOztBQWlDQSxjQUFJLENBQUM2RyxNQUFMLEVBQWE7QUFDWkcsWUFBQUEsYUFBYSxHQUFHRSxlQUFlLEVBQS9CLENBRFksQ0FFWjs7QUFDQXZILFlBQUFBLFVBQVUsQ0FBQzBKLFFBQVgsQ0FBb0J2QyxVQUFwQixFQUFnQyxZQUFoQztBQUNBLG1CQUFPbkgsVUFBVSxDQUFDdUosVUFBWCxDQUFzQixZQUFNO0FBQ2xDLHFCQUFPQyxJQUFJLENBQUNDLE1BQUwsQ0FBWXBDLGFBQVosRUFDTDVELEtBREssQ0FDQzBGLGVBREQsRUFFTDVHLElBRkssQ0FFQSxVQUFDb0QsS0FBRCxFQUFnQjtBQUNyQixnQkFBQSxNQUFJLENBQUNBLEtBQUwsR0FBYUEsS0FBYjs7QUFDQSxnQkFBQSxNQUFJLENBQUNBLEtBQUwsQ0FBVytELFFBQVgsQ0FBb0IsSUFBSUMsa0JBQUosQ0FBdUIsTUFBSSxDQUFDaEUsS0FBNUIsQ0FBcEIsRUFBd0QsT0FBeEQ7O0FBQ0EsZ0JBQUEsTUFBSSxDQUFDQSxLQUFMLENBQVcrRCxRQUFYLENBQW9CdEMsY0FBcEIsRUFBb0MsVUFBcEM7O0FBQ0FwSCxnQkFBQUEsVUFBVSxDQUFDNEosY0FBWCxDQUEwQixhQUExQixFQUF5QyxNQUFJLENBQUNqRSxLQUE5QztBQUNBLHVCQUFPNUIsU0FBUDtBQUNBLGVBUkssRUFTTE4sS0FUSyxDQVNDd0MsR0FBRyxDQUFDQyxLQVRMLENBQVA7QUFVQSxhQVhNLENBQVA7QUFZQTtBQUNELFNBakhLLEVBa0hMekMsS0FsSEssQ0FrSEMsVUFBU3lDLEtBQVQsRUFBcUI7QUFDM0JELFVBQUFBLEdBQUcsQ0FBQ0MsS0FBSixDQUFVQSxLQUFLLENBQUNtRCxPQUFoQixFQUF5Qm5ELEtBQXpCO0FBQ0EsZ0JBQU0sSUFBSXFILEtBQUosQ0FBVSxpQ0FBaUNySCxLQUEzQyxDQUFOO0FBQ0EsU0FySEssQ0FBUDtBQXNIQTs7O2FBQ0QsbUJBQVU7QUFDVCxlQUFPLEtBQUtQLEtBQVo7QUFDQTs7O2FBQ0Qsd0JBQW9CO0FBQ25CLGVBQU8sSUFBUDtBQUNBOzs7YUFDRCxnQkFBTztBQUNOO0FBQ0EsYUFBS25ELHFCQUFMLElBQThCLEtBQUtBLHFCQUFMLENBQTJCa0QsT0FBM0IsRUFBOUI7QUFDQSxhQUFLN0Msb0JBQUwsSUFBNkIsS0FBS0Esb0JBQUwsQ0FBMEI2QyxPQUExQixFQUE3QjtBQUNBLGFBQUszRSxRQUFMLENBQWN5TSxvQkFBZDtBQUNBOzs7O0lBdlppQ0MsTzs7TUF5WjdCQywyQjs7Ozs7Ozs7Ozs7Ozs7Ozs0RUFDc0QsRTs7Ozs7OzthQUUzRCx3QkFBZUMsZUFBZixFQUE4RTtBQUM3RUQsUUFBQUEsMkJBQTJCLENBQUNFLGNBQTVCO0FBRUEsWUFBTUMscUJBQXFCLEdBQUcsSUFBSWpPLG9CQUFKLENBQXlCb0ksTUFBTSxDQUFDeUQsTUFBUCxDQUFjO0FBQUV6SyxVQUFBQSxPQUFPLEVBQUU7QUFBWCxTQUFkLEVBQWlDMk0sZUFBakMsQ0FBekIsQ0FBOUI7QUFDQSxlQUFPRSxxQkFBcUIsQ0FBQ2xLLFdBQXRCLENBQWtDcEIsSUFBbEMsQ0FBdUMsWUFBVztBQUN4RG1MLFVBQUFBLDJCQUEyQixDQUFDRSxjQUE1QjtBQUNBLGlCQUFPQyxxQkFBUDtBQUNBLFNBSE0sQ0FBUDtBQUlBOzs7YUFDRCxnQ0FBdUI7QUFDdEIsYUFBS0Msa0JBQUwsR0FBMEIsRUFBMUI7QUFDQTs7O2FBQ0QsMkNBQXlDO0FBQ3hDLGVBQU9KLDJCQUEyQixDQUFDRSxjQUFuQztBQUNBOzs7O0lBakJ3Q0csYzs7U0FvQjNCTCwyQiIsInNvdXJjZVJvb3QiOiIuIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNlcnZpY2UgZnJvbSBcInNhcC91aS9jb3JlL3NlcnZpY2UvU2VydmljZVwiO1xuaW1wb3J0IFNlcnZpY2VGYWN0b3J5IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlL1NlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgU2VydmljZUZhY3RvcnlSZWdpc3RyeSBmcm9tIFwic2FwL3VpL2NvcmUvc2VydmljZS9TZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdE1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvYmFzZS9NYW5hZ2VkT2JqZWN0TW9kZWxcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcbmltcG9ydCBMb2cgZnJvbSBcInNhcC9iYXNlL0xvZ1wiO1xuaW1wb3J0IFRlbXBsYXRlTW9kZWwgZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlTW9kZWxcIjtcbmltcG9ydCBEeW5hbWljQW5ub3RhdGlvblBhdGhIZWxwZXIgZnJvbSBcInNhcC9mZS9jb3JlL2hlbHBlcnMvRHluYW1pY0Fubm90YXRpb25QYXRoSGVscGVyXCI7XG5pbXBvcnQgQ2FjaGVNYW5hZ2VyIGZyb20gXCJzYXAvdWkvY29yZS9jYWNoZS9DYWNoZU1hbmFnZXJcIjtcbmltcG9ydCBWZXJzaW9uSW5mbyBmcm9tIFwic2FwL3VpL1ZlcnNpb25JbmZvXCI7XG5pbXBvcnQgRGV2aWNlIGZyb20gXCJzYXAvdWkvRGV2aWNlXCI7XG5pbXBvcnQgVXJpUGFyYW1ldGVycyBmcm9tIFwic2FwL2Jhc2UvdXRpbC9VcmlQYXJhbWV0ZXJzXCI7XG5pbXBvcnQgeyBTZXJ2aWNlQ29udGV4dCB9IGZyb20gXCJzYXAvdWkvY29yZS9zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSZXNvdXJjZU1vZGVsU2VydmljZSB9IGZyb20gXCIuL1Jlc291cmNlTW9kZWxTZXJ2aWNlRmFjdG9yeVwiO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSBcInNhcC9mZS9jb3JlXCI7XG5pbXBvcnQgeyBDYWNoZUhhbmRsZXJTZXJ2aWNlIH0gZnJvbSBcInNhcC9mZS9jb3JlL3NlcnZpY2VzL0NhY2hlSGFuZGxlclNlcnZpY2VGYWN0b3J5XCI7XG5pbXBvcnQgeyBSZXNvdXJjZU1vZGVsIH0gZnJvbSBcInNhcC9mZS9tYWNyb3NcIjtcbmltcG9ydCBNb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5cbnR5cGUgVGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncyA9IHt9O1xuXG5jbGFzcyBUZW1wbGF0ZWRWaWV3U2VydmljZSBleHRlbmRzIFNlcnZpY2U8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRpbml0UHJvbWlzZSE6IFByb21pc2U8YW55Pjtcblx0b1ZpZXchOiBWaWV3O1xuXHRvUmVzb3VyY2VNb2RlbFNlcnZpY2UhOiBSZXNvdXJjZU1vZGVsU2VydmljZTtcblx0b0NhY2hlSGFuZGxlclNlcnZpY2UhOiBDYWNoZUhhbmRsZXJTZXJ2aWNlO1xuXHRvRmFjdG9yeSE6IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeTtcblx0cmVzb3VyY2VNb2RlbCE6IFJlc291cmNlTW9kZWw7XG5cdHN0YWJsZUlkITogc3RyaW5nO1xuXHRUZW1wbGF0ZUNvbnZlcnRlcjogYW55O1xuXHRNZXRhTW9kZWxDb252ZXJ0ZXI6IGFueTtcblx0aW5pdCgpIHtcblx0XHRjb25zdCBhU2VydmljZURlcGVuZGVuY2llcyA9IFtdO1xuXHRcdGNvbnN0IG9Db250ZXh0ID0gdGhpcy5nZXRDb250ZXh0KCk7XG5cdFx0Y29uc3Qgb0NvbXBvbmVudCA9IG9Db250ZXh0LnNjb3BlT2JqZWN0O1xuXHRcdGNvbnN0IG9BcHBDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0T3duZXJDb21wb25lbnRGb3Iob0NvbXBvbmVudCkgYXMgQXBwQ29tcG9uZW50O1xuXHRcdGNvbnN0IG9NZXRhTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1ldGFNb2RlbCgpO1xuXHRcdGNvbnN0IHNTdGFibGVJZCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCkgKyBcIjo6XCIgKyBvQXBwQ29tcG9uZW50LmdldExvY2FsSWQob0NvbXBvbmVudC5nZXRJZCgpKTtcblx0XHRjb25zdCBhRW5oYW5jZUkxOG4gPSBvQ29tcG9uZW50LmdldEVuaGFuY2VJMThuKCkgfHwgW107XG5cdFx0bGV0IHNBcHBOYW1lc3BhY2U7XG5cdFx0dGhpcy5vRmFjdG9yeSA9IG9Db250ZXh0LmZhY3Rvcnk7XG5cdFx0aWYgKGFFbmhhbmNlSTE4bikge1xuXHRcdFx0c0FwcE5hbWVzcGFjZSA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXRDb21wb25lbnROYW1lKCk7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGFFbmhhbmNlSTE4bi5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHQvLyBJbiBvcmRlciB0byBzdXBwb3J0IHRleHQtdmVydGljYWxpemF0aW9uIGFwcGxpY2F0aW9ucyBjYW4gYWxzbyBwYXNzcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIFVJNSB0YWtlcyBjYXJlIG9mIHRleHQtdmVydGljYWxpemF0aW9uIGZvciByZXNvdXJjZSBtb2RlbHMgZGVmaW5lZCBpbiB0aGUgbWFuaWZlc3Rcblx0XHRcdFx0Ly8gSGVuY2UgY2hlY2sgaWYgdGhlIGdpdmVuIGtleSBpcyBhIHJlc291cmNlIG1vZGVsIGRlZmluZWQgaW4gdGhlIG1hbmlmZXN0XG5cdFx0XHRcdC8vIGlmIHNvIHRoaXMgbW9kZWwgc2hvdWxkIGJlIHVzZWQgdG8gZW5oYW5jZSB0aGUgc2FwLmZlIHJlc291cmNlIG1vZGVsIHNvIHBhc3MgaXQgYXMgaXQgaXNcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlTW9kZWwgPSBvQXBwQ29tcG9uZW50LmdldE1vZGVsKGFFbmhhbmNlSTE4bltpXSk7XG5cdFx0XHRcdGlmIChvUmVzb3VyY2VNb2RlbCAmJiBvUmVzb3VyY2VNb2RlbC5pc0EoXCJzYXAudWkubW9kZWwucmVzb3VyY2UuUmVzb3VyY2VNb2RlbFwiKSkge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IG9SZXNvdXJjZU1vZGVsO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGFFbmhhbmNlSTE4bltpXSA9IHNBcHBOYW1lc3BhY2UgKyBcIi5cIiArIGFFbmhhbmNlSTE4bltpXS5yZXBsYWNlKFwiLnByb3BlcnRpZXNcIiwgXCJcIik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBzQ2FjaGVJZGVudGlmaWVyID1cblx0XHRcdG9BcHBDb21wb25lbnQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCkgK1xuXHRcdFx0XCJfXCIgK1xuXHRcdFx0c1N0YWJsZUlkICtcblx0XHRcdFwiX1wiICtcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldExhbmd1YWdlVGFnKCk7XG5cdFx0YVNlcnZpY2VEZXBlbmRlbmNpZXMucHVzaChcblx0XHRcdFNlcnZpY2VGYWN0b3J5UmVnaXN0cnkuZ2V0KFwic2FwLmZlLmNvcmUuc2VydmljZXMuUmVzb3VyY2VNb2RlbFNlcnZpY2VcIilcblx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRzY29wZVR5cGU6IFwiY29tcG9uZW50XCIsXG5cdFx0XHRcdFx0c2NvcGVPYmplY3Q6IG9Db21wb25lbnQsXG5cdFx0XHRcdFx0c2V0dGluZ3M6IHtcblx0XHRcdFx0XHRcdGJ1bmRsZXM6IFtcInNhcC5mZS5jb3JlLm1lc3NhZ2VidW5kbGVcIiwgXCJzYXAuZmUubWFjcm9zLm1lc3NhZ2VidW5kbGVcIiwgXCJzYXAuZmUudGVtcGxhdGVzLm1lc3NhZ2VidW5kbGVcIl0sXG5cdFx0XHRcdFx0XHRlbmhhbmNlSTE4bjogYUVuaGFuY2VJMThuLFxuXHRcdFx0XHRcdFx0bW9kZWxOYW1lOiBcInNhcC5mZS5pMThuXCJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC50aGVuKChvUmVzb3VyY2VNb2RlbFNlcnZpY2U6IFJlc291cmNlTW9kZWxTZXJ2aWNlKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vUmVzb3VyY2VNb2RlbFNlcnZpY2UgPSBvUmVzb3VyY2VNb2RlbFNlcnZpY2U7XG5cdFx0XHRcdFx0cmV0dXJuIG9SZXNvdXJjZU1vZGVsU2VydmljZS5nZXRSZXNvdXJjZU1vZGVsKCk7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHRTZXJ2aWNlRmFjdG9yeVJlZ2lzdHJ5LmdldChcInNhcC5mZS5jb3JlLnNlcnZpY2VzLkNhY2hlSGFuZGxlclNlcnZpY2VcIilcblx0XHRcdFx0LmNyZWF0ZUluc3RhbmNlKHtcblx0XHRcdFx0XHRzZXR0aW5nczoge1xuXHRcdFx0XHRcdFx0bWV0YU1vZGVsOiBvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0YXBwQ29tcG9uZW50OiBvQXBwQ29tcG9uZW50LFxuXHRcdFx0XHRcdFx0Y29tcG9uZW50OiBvQ29tcG9uZW50XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KVxuXHRcdFx0XHQudGhlbigob0NhY2hlSGFuZGxlclNlcnZpY2U6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UgPSBvQ2FjaGVIYW5kbGVyU2VydmljZTtcblx0XHRcdFx0XHRyZXR1cm4gb0NhY2hlSGFuZGxlclNlcnZpY2UudmFsaWRhdGVDYWNoZUtleShzQ2FjaGVJZGVudGlmaWVyKTtcblx0XHRcdFx0fSlcblx0XHQpO1xuXHRcdGFTZXJ2aWNlRGVwZW5kZW5jaWVzLnB1c2goXG5cdFx0XHQoVmVyc2lvbkluZm8gYXMgYW55KVxuXHRcdFx0XHQubG9hZCgpXG5cdFx0XHRcdC50aGVuKGZ1bmN0aW9uKG9JbmZvOiBhbnkpIHtcblx0XHRcdFx0XHRsZXQgc1RpbWVzdGFtcCA9IFwiXCI7XG5cdFx0XHRcdFx0aWYgKCFvSW5mby5saWJyYXJpZXMpIHtcblx0XHRcdFx0XHRcdHNUaW1lc3RhbXAgPSAoc2FwLnVpIGFzIGFueSkuYnVpbGRpbmZvLmJ1aWxkdGltZTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0b0luZm8ubGlicmFyaWVzLmZvckVhY2goZnVuY3Rpb24ob0xpYnJhcnk6IGFueSkge1xuXHRcdFx0XHRcdFx0XHRzVGltZXN0YW1wICs9IG9MaWJyYXJ5LmJ1aWxkVGltZXN0YW1wO1xuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBzVGltZXN0YW1wO1xuXHRcdFx0XHR9KVxuXHRcdFx0XHQuY2F0Y2goZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIFwiPE5PVkFMVUU+XCI7XG5cdFx0XHRcdH0pXG5cdFx0KTtcblxuXHRcdGxldCBzUGFnZU1vZGVsQ2FjaGVLZXkgPSBcIlwiO1xuXHRcdHRoaXMuaW5pdFByb21pc2UgPSBQcm9taXNlLmFsbChhU2VydmljZURlcGVuZGVuY2llcylcblx0XHRcdC50aGVuKChhRGVwZW5kZW5jaWVzUmVzdWx0OiBhbnlbXSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzQ2FjaGVLZXkgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzFdO1xuXHRcdFx0XHRjb25zdCBzVmVyc2lvbkluZm8gPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzJdO1xuXHRcdFx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdFx0XHRjb25zdCBvU2lkZUVmZmVjdHNTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2lkZUVmZmVjdHNTZXJ2aWNlKCk7XG5cblx0XHRcdFx0b1NpZGVFZmZlY3RzU2VydmljZXMuaW5pdGlhbGl6ZVNpZGVFZmZlY3RzKG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSk7XG5cblx0XHRcdFx0c1BhZ2VNb2RlbENhY2hlS2V5ID0gc0NhY2hlS2V5ICsgXCItXCIgKyBzVmVyc2lvbkluZm8gKyBcIi1cIiArIHNTdGFibGVJZCArIFwiLVwiICsgb1NoZWxsU2VydmljZXMuaW5zdGFuY2VUeXBlICsgXCItcGFnZU1vZGVsXCI7XG5cdFx0XHRcdHJldHVybiBQcm9taXNlLmFsbChhRGVwZW5kZW5jaWVzUmVzdWx0LmNvbmNhdChbdGhpcy5fZ2V0Q2FjaGVkTW9kZWwoc1BhZ2VNb2RlbENhY2hlS2V5KV0pKTtcblx0XHRcdH0pXG5cdFx0XHQudGhlbigoYURlcGVuZGVuY2llc1Jlc3VsdDogYW55W10pID0+IHtcblx0XHRcdFx0Y29uc3Qgb1Jlc291cmNlTW9kZWwgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzBdO1xuXHRcdFx0XHRjb25zdCBzQ2FjaGVLZXkgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzFdO1xuXHRcdFx0XHRjb25zdCBvUGFnZU1vZGVsQ2FjaGUgPSBhRGVwZW5kZW5jaWVzUmVzdWx0WzNdO1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG5cdFx0XHRcdFx0c2FwLnVpLnJlcXVpcmUoXG5cdFx0XHRcdFx0XHRbXCJzYXAvZmUvY29yZS9jb252ZXJ0ZXJzL1RlbXBsYXRlQ29udmVydGVyXCIsIFwic2FwL2ZlL2NvcmUvY29udmVydGVycy9NZXRhTW9kZWxDb252ZXJ0ZXJcIl0sXG5cdFx0XHRcdFx0XHQoVGVtcGxhdGVDb252ZXJ0ZXI6IGFueSwgTWV0YU1vZGVsQ29udmVydGVyOiBhbnkpID0+IHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNyZWF0ZVZpZXcoXG5cdFx0XHRcdFx0XHRcdFx0XHRvUmVzb3VyY2VNb2RlbCxcblx0XHRcdFx0XHRcdFx0XHRcdHNTdGFibGVJZCxcblx0XHRcdFx0XHRcdFx0XHRcdHNDYWNoZUtleSxcblx0XHRcdFx0XHRcdFx0XHRcdHNQYWdlTW9kZWxDYWNoZUtleSxcblx0XHRcdFx0XHRcdFx0XHRcdG9QYWdlTW9kZWxDYWNoZSxcblx0XHRcdFx0XHRcdFx0XHRcdFRlbXBsYXRlQ29udmVydGVyLFxuXHRcdFx0XHRcdFx0XHRcdFx0TWV0YU1vZGVsQ29udmVydGVyXG5cdFx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSlcblx0XHRcdC50aGVuKGZ1bmN0aW9uKHNDYWNoZUtleTogYW55KSB7XG5cdFx0XHRcdGNvbnN0IG9DYWNoZUhhbmRsZXJTZXJ2aWNlID0gU2VydmljZUZhY3RvcnlSZWdpc3RyeS5nZXQoXCJzYXAuZmUuY29yZS5zZXJ2aWNlcy5DYWNoZUhhbmRsZXJTZXJ2aWNlXCIpLmdldEluc3RhbmNlKG9NZXRhTW9kZWwpO1xuXHRcdFx0XHRvQ2FjaGVIYW5kbGVyU2VydmljZS5pbnZhbGlkYXRlSWZOZWVkZWQoc0NhY2hlS2V5LCBzQ2FjaGVJZGVudGlmaWVyKTtcblx0XHRcdH0pO1xuXHR9XG5cdF9nZXRDYWNoZWRNb2RlbChzQ2FjaGVLZXk6IGFueSkge1xuXHRcdGlmIChcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldFZpZXdDYWNoZSgpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gQ2FjaGVNYW5hZ2VyLmdldChzQ2FjaGVLZXkpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdF9zZXRDYWNoZWRNb2RlbChzQ2FjaGVLZXk6IHN0cmluZywgb0NhY2hlTW9kZWw6IGFueSkge1xuXHRcdGlmIChcblx0XHRcdHNhcC51aVxuXHRcdFx0XHQuZ2V0Q29yZSgpXG5cdFx0XHRcdC5nZXRDb25maWd1cmF0aW9uKClcblx0XHRcdFx0LmdldFZpZXdDYWNoZSgpXG5cdFx0KSB7XG5cdFx0XHRDYWNoZU1hbmFnZXIuc2V0KHNDYWNoZUtleSwgb0NhY2hlTW9kZWwpO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cdC8qKlxuXHQgKiBSZWZyZXNoIHRoZSBjdXJyZW50IHZpZXcgdXNpbmcgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcyBiZWZvcmUuXG5cdCAqIFRoaXMgaXMgdXNlZnVsIGZvciBvdXIgZGVtb2tpdCAhXG5cdCAqXG5cdCAqIEBwYXJhbSBvQ29tcG9uZW50XG5cdCAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cmVmcmVzaFZpZXcob0NvbXBvbmVudDogYW55KSB7XG5cdFx0Y29uc3Qgb1Jvb3RWaWV3ID0gb0NvbXBvbmVudC5nZXRSb290Q29udHJvbCgpO1xuXHRcdGlmIChvUm9vdFZpZXcpIHtcblx0XHRcdG9Sb290Vmlldy5kZXN0cm95KCk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLm9WaWV3KSB7XG5cdFx0XHR0aGlzLm9WaWV3LmRlc3Ryb3koKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlVmlldyh0aGlzLnJlc291cmNlTW9kZWwsIHRoaXMuc3RhYmxlSWQsIFwiXCIsIFwiXCIsIHVuZGVmaW5lZCwgdGhpcy5UZW1wbGF0ZUNvbnZlcnRlciwgdGhpcy5NZXRhTW9kZWxDb252ZXJ0ZXIpXG5cdFx0XHQudGhlbihmdW5jdGlvbigpIHtcblx0XHRcdFx0b0NvbXBvbmVudC5vQ29udGFpbmVyLmludmFsaWRhdGUoKTtcblx0XHRcdH0pXG5cdFx0XHQuY2F0Y2goZnVuY3Rpb24ob0Vycm9yOiBhbnkpIHtcblx0XHRcdFx0b0NvbXBvbmVudC5vQ29udGFpbmVyLmludmFsaWRhdGUoKTtcblx0XHRcdFx0TG9nLmVycm9yKG9FcnJvcik7XG5cdFx0XHR9KTtcblx0fVxuXHRjcmVhdGVWaWV3KFxuXHRcdG9SZXNvdXJjZU1vZGVsOiBhbnksXG5cdFx0c1N0YWJsZUlkOiBhbnksXG5cdFx0c0NhY2hlS2V5OiBhbnksXG5cdFx0c1BhZ2VNb2RlbENhY2hlS2V5OiBhbnksXG5cdFx0b1BhZ2VNb2RlbENhY2hlOiBhbnksXG5cdFx0VGVtcGxhdGVDb252ZXJ0ZXI6IGFueSxcblx0XHRNZXRhTW9kZWxDb252ZXJ0ZXI6IGFueVxuXHQpIHtcblx0XHR0aGlzLnJlc291cmNlTW9kZWwgPSBvUmVzb3VyY2VNb2RlbDtcblx0XHR0aGlzLnN0YWJsZUlkID0gc1N0YWJsZUlkO1xuXHRcdHRoaXMuVGVtcGxhdGVDb252ZXJ0ZXIgPSBUZW1wbGF0ZUNvbnZlcnRlcjtcblx0XHR0aGlzLk1ldGFNb2RlbENvbnZlcnRlciA9IE1ldGFNb2RlbENvbnZlcnRlcjtcblx0XHRjb25zdCBvQ29udGV4dCA9IHRoaXMuZ2V0Q29udGV4dCgpO1xuXHRcdGNvbnN0IG1TZXJ2aWNlU2V0dGluZ3MgPSBvQ29udGV4dC5zZXR0aW5ncztcblx0XHRjb25zdCBzQ29udmVydGVyVHlwZSA9IG1TZXJ2aWNlU2V0dGluZ3MuY29udmVydGVyVHlwZTtcblx0XHRjb25zdCBvQ29tcG9uZW50ID0gb0NvbnRleHQuc2NvcGVPYmplY3Q7XG5cdFx0Y29uc3Qgb0FwcENvbXBvbmVudDogQXBwQ29tcG9uZW50ID0gQ29tcG9uZW50LmdldE93bmVyQ29tcG9uZW50Rm9yKG9Db21wb25lbnQpO1xuXHRcdGNvbnN0IHNGdWxsQ29udGV4dFBhdGggPSBvQXBwQ29tcG9uZW50LmdldFJvdXRpbmdTZXJ2aWNlKCkuZ2V0VGFyZ2V0SW5mb3JtYXRpb25Gb3Iob0NvbXBvbmVudCkub3B0aW9ucy5zZXR0aW5ncy5mdWxsQ29udGV4dFBhdGg7XG5cdFx0Y29uc3Qgb01ldGFNb2RlbCA9IG9BcHBDb21wb25lbnQuZ2V0TWV0YU1vZGVsKCk7XG5cdFx0Y29uc3Qgb01hbmlmZXN0Q29udGVudDogYW55ID0gb0FwcENvbXBvbmVudC5nZXRNYW5pZmVzdCgpO1xuXHRcdGNvbnN0IG9EZXZpY2VNb2RlbCA9IG5ldyBKU09OTW9kZWwoc2FwLnVpLkRldmljZSkuc2V0RGVmYXVsdEJpbmRpbmdNb2RlKFwiT25lV2F5XCIpO1xuXHRcdGNvbnN0IG9NYW5pZmVzdE1vZGVsID0gbmV3IEpTT05Nb2RlbChvTWFuaWZlc3RDb250ZW50KTtcblx0XHRjb25zdCBiRXJyb3IgPSBmYWxzZTtcblx0XHRsZXQgb1BhZ2VNb2RlbDogVGVtcGxhdGVNb2RlbCwgb1ZpZXdEYXRhTW9kZWw6IE1vZGVsLCBvVmlld1NldHRpbmdzOiBhbnksIG1WaWV3RGF0YTogYW55O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0Vmlld1NldHRpbmdzKCkge1xuXHRcdFx0Y29uc3QgYVNwbGl0UGF0aCA9IHNGdWxsQ29udGV4dFBhdGguc3BsaXQoXCIvXCIpO1xuXHRcdFx0Y29uc3Qgc0VudGl0eVNldFBhdGggPSBhU3BsaXRQYXRoLnJlZHVjZShmdW5jdGlvbihzUGF0aFNvRmFyOiBhbnksIHNOZXh0UGF0aFBhcnQ6IGFueSkge1xuXHRcdFx0XHRpZiAoc05leHRQYXRoUGFydCA9PT0gXCJcIikge1xuXHRcdFx0XHRcdHJldHVybiBzUGF0aFNvRmFyO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmIChzUGF0aFNvRmFyID09PSBcIlwiKSB7XG5cdFx0XHRcdFx0c1BhdGhTb0ZhciA9IFwiL1wiICsgc05leHRQYXRoUGFydDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdCBvVGFyZ2V0ID0gb01ldGFNb2RlbC5nZXRPYmplY3Qoc1BhdGhTb0ZhciArIFwiLyROYXZpZ2F0aW9uUHJvcGVydHlCaW5kaW5nL1wiICsgc05leHRQYXRoUGFydCk7XG5cdFx0XHRcdFx0aWYgKG9UYXJnZXQgJiYgT2JqZWN0LmtleXMob1RhcmdldCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdFx0c1BhdGhTb0ZhciArPSBcIi8kTmF2aWdhdGlvblByb3BlcnR5QmluZGluZ1wiO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRzUGF0aFNvRmFyICs9IFwiL1wiICsgc05leHRQYXRoUGFydDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc1BhdGhTb0Zhcjtcblx0XHRcdH0sIFwiXCIpO1xuXHRcdFx0Y29uc3Qgb1ZpZXdTZXR0aW5ncyA9IHtcblx0XHRcdFx0dHlwZTogXCJYTUxcIixcblx0XHRcdFx0cHJlcHJvY2Vzc29yczoge1xuXHRcdFx0XHRcdHhtbDoge1xuXHRcdFx0XHRcdFx0YmluZGluZ0NvbnRleHRzOiB7XG5cdFx0XHRcdFx0XHRcdGVudGl0eVNldDogc0VudGl0eVNldFBhdGggPyBvTWV0YU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KHNFbnRpdHlTZXRQYXRoKSA6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRjb250ZXh0UGF0aDogc0Z1bGxDb250ZXh0UGF0aCA/IG9NZXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoc0Z1bGxDb250ZXh0UGF0aCkgOiBudWxsLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0OiBvUGFnZU1vZGVsLmNyZWF0ZUJpbmRpbmdDb250ZXh0KFwiL1wiLCB1bmRlZmluZWQsIHsgbm9SZXNvbHZlOiB0cnVlIH0pLFxuXHRcdFx0XHRcdFx0XHR2aWV3RGF0YTogbVZpZXdEYXRhID8gb1ZpZXdEYXRhTW9kZWwuY3JlYXRlQmluZGluZ0NvbnRleHQoXCIvXCIpIDogbnVsbFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdG1vZGVsczoge1xuXHRcdFx0XHRcdFx0XHRlbnRpdHlTZXQ6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdGZ1bGxDb250ZXh0UGF0aDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0Y29udGV4dFBhdGg6IG9NZXRhTW9kZWwsXG5cdFx0XHRcdFx0XHRcdFwic2FwLmZlLmkxOG5cIjogb1Jlc291cmNlTW9kZWwsXG5cdFx0XHRcdFx0XHRcdG1ldGFNb2RlbDogb01ldGFNb2RlbCxcblx0XHRcdFx0XHRcdFx0XCJkZXZpY2VcIjogb0RldmljZU1vZGVsLCAvLyBUT0RPOiBkaXNjdXNzIG5hbWVzIGhlcmVcblx0XHRcdFx0XHRcdFx0bWFuaWZlc3Q6IG9NYW5pZmVzdE1vZGVsLFxuXHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJDb250ZXh0OiBvUGFnZU1vZGVsLFxuXHRcdFx0XHRcdFx0XHR2aWV3RGF0YTogb1ZpZXdEYXRhTW9kZWxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRhcHBDb21wb25lbnQ6IG9BcHBDb21wb25lbnRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGlkOiBzU3RhYmxlSWQsXG5cdFx0XHRcdHZpZXdOYW1lOiBtU2VydmljZVNldHRpbmdzLnZpZXdOYW1lIHx8IG9Db21wb25lbnQuZ2V0Vmlld05hbWUoKSxcblx0XHRcdFx0dmlld0RhdGE6IG1WaWV3RGF0YSxcblx0XHRcdFx0Y2FjaGU6IHsga2V5czogW3NDYWNoZUtleV0gfSxcblx0XHRcdFx0bW9kZWxzOiB7XG5cdFx0XHRcdFx0XCJzYXAuZmUuaTE4blwiOiBvUmVzb3VyY2VNb2RlbFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRoZWlnaHQ6IFwiMTAwJVwiXG5cdFx0XHR9O1xuXHRcdFx0cmV0dXJuIG9WaWV3U2V0dGluZ3M7XG5cdFx0fVxuXHRcdGNvbnN0IGNyZWF0ZUVycm9yUGFnZSA9IChyZWFzb246IGFueSkgPT4ge1xuXHRcdFx0Ly8ganVzdCByZXBsYWNlIHRoZSB2aWV3IG5hbWUgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIG1vZGVsIGNvbnRhaW5pbmcgdGhlIHJlYXNvbiwgYnV0XG5cdFx0XHQvLyBrZWVwIHRoZSBvdGhlciBzZXR0aW5nc1xuXHRcdFx0TG9nLmVycm9yKHJlYXNvbi5tZXNzYWdlLCByZWFzb24pO1xuXHRcdFx0b1ZpZXdTZXR0aW5ncy52aWV3TmFtZSA9IG1TZXJ2aWNlU2V0dGluZ3MuZXJyb3JWaWV3TmFtZSB8fCBcInNhcC5mZS5jb3JlLnNlcnZpY2VzLnZpZXcuVGVtcGxhdGluZ0Vycm9yUGFnZVwiO1xuXHRcdFx0b1ZpZXdTZXR0aW5ncy5wcmVwcm9jZXNzb3JzLnhtbC5tb2RlbHNbXCJlcnJvclwiXSA9IG5ldyBKU09OTW9kZWwocmVhc29uKTtcblxuXHRcdFx0cmV0dXJuIG9Db21wb25lbnQucnVuQXNPd25lcigoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBWaWV3LmNyZWF0ZShvVmlld1NldHRpbmdzKS50aGVuKChvVmlldzogYW55KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5vVmlldyA9IG9WaWV3O1xuXHRcdFx0XHRcdHRoaXMub1ZpZXcuc2V0TW9kZWwobmV3IE1hbmFnZWRPYmplY3RNb2RlbCh0aGlzLm9WaWV3KSwgXCIkdmlld1wiKTtcblx0XHRcdFx0XHRvQ29tcG9uZW50LnNldEFnZ3JlZ2F0aW9uKFwicm9vdENvbnRyb2xcIiwgdGhpcy5vVmlldyk7XG5cdFx0XHRcdFx0cmV0dXJuIHNDYWNoZUtleTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9O1xuXHRcdHJldHVybiBvQXBwQ29tcG9uZW50XG5cdFx0XHQuZ2V0U2VydmljZShcInJvdXRpbmdTZXJ2aWNlXCIpXG5cdFx0XHQudGhlbigob1JvdXRpbmdTZXJ2aWNlOiBhbnkpID0+IHtcblx0XHRcdFx0Ly8gUmV0cmlldmUgdGhlIHZpZXdMZXZlbCBmb3IgdGhlIGNvbXBvbmVudFxuXHRcdFx0XHRjb25zdCBvVGFyZ2V0SW5mbyA9IG9Sb3V0aW5nU2VydmljZS5nZXRUYXJnZXRJbmZvcm1hdGlvbkZvcihvQ29tcG9uZW50KTtcblx0XHRcdFx0Y29uc3QgbU91dGJvdW5kcyA9XG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudFtcInNhcC5hcHBcIl0gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24gJiZcblx0XHRcdFx0XHRvTWFuaWZlc3RDb250ZW50W1wic2FwLmFwcFwiXS5jcm9zc05hdmlnYXRpb24ub3V0Ym91bmRzO1xuXHRcdFx0XHRjb25zdCBtTmF2aWdhdGlvbiA9IG9Db21wb25lbnQuZ2V0TmF2aWdhdGlvbigpIHx8IHt9O1xuXHRcdFx0XHRPYmplY3Qua2V5cyhtTmF2aWdhdGlvbikuZm9yRWFjaChmdW5jdGlvbihuYXZpZ2F0aW9uT2JqZWN0S2V5OiBzdHJpbmcpIHtcblx0XHRcdFx0XHRjb25zdCBuYXZpZ2F0aW9uT2JqZWN0ID0gbU5hdmlnYXRpb25bbmF2aWdhdGlvbk9iamVjdEtleV07XG5cdFx0XHRcdFx0bGV0IG91dGJvdW5kQ29uZmlnO1xuXHRcdFx0XHRcdGlmIChuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbCAmJiBuYXZpZ2F0aW9uT2JqZWN0LmRldGFpbC5vdXRib3VuZCAmJiBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kXSkge1xuXHRcdFx0XHRcdFx0b3V0Ym91bmRDb25maWcgPSBtT3V0Ym91bmRzW25hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kXTtcblx0XHRcdFx0XHRcdG5hdmlnYXRpb25PYmplY3QuZGV0YWlsLm91dGJvdW5kRGV0YWlsID0ge1xuXHRcdFx0XHRcdFx0XHRzZW1hbnRpY09iamVjdDogb3V0Ym91bmRDb25maWcuc2VtYW50aWNPYmplY3QsXG5cdFx0XHRcdFx0XHRcdGFjdGlvbjogb3V0Ym91bmRDb25maWcuYWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRwYXJhbWV0ZXJzOiBvdXRib3VuZENvbmZpZy5wYXJhbWV0ZXJzXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAobmF2aWdhdGlvbk9iamVjdC5jcmVhdGUgJiYgbmF2aWdhdGlvbk9iamVjdC5jcmVhdGUub3V0Ym91bmQgJiYgbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF0pIHtcblx0XHRcdFx0XHRcdG91dGJvdW5kQ29uZmlnID0gbU91dGJvdW5kc1tuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZF07XG5cdFx0XHRcdFx0XHRuYXZpZ2F0aW9uT2JqZWN0LmNyZWF0ZS5vdXRib3VuZERldGFpbCA9IHtcblx0XHRcdFx0XHRcdFx0c2VtYW50aWNPYmplY3Q6IG91dGJvdW5kQ29uZmlnLnNlbWFudGljT2JqZWN0LFxuXHRcdFx0XHRcdFx0XHRhY3Rpb246IG91dGJvdW5kQ29uZmlnLmFjdGlvbixcblx0XHRcdFx0XHRcdFx0cGFyYW1ldGVyczogb3V0Ym91bmRDb25maWcucGFyYW1ldGVyc1xuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRtVmlld0RhdGEgPSB7XG5cdFx0XHRcdFx0bmF2aWdhdGlvbjogbU5hdmlnYXRpb24sXG5cdFx0XHRcdFx0dmlld0xldmVsOiBvVGFyZ2V0SW5mby52aWV3TGV2ZWwsXG5cdFx0XHRcdFx0c3RhYmxlSWQ6IHNTdGFibGVJZCxcblx0XHRcdFx0XHRjb250ZW50RGVuc2l0aWVzOiBvTWFuaWZlc3RDb250ZW50W1wic2FwLnVpNVwiXS5jb250ZW50RGVuc2l0aWVzLFxuXHRcdFx0XHRcdHJlc291cmNlQnVuZGxlOiBvUmVzb3VyY2VNb2RlbC5fX2J1bmRsZSxcblx0XHRcdFx0XHRmdWxsQ29udGV4dFBhdGg6IHNGdWxsQ29udGV4dFBhdGgsXG5cdFx0XHRcdFx0aXNEZXNrdG9wOiAoRGV2aWNlIGFzIGFueSkuc3lzdGVtLmRlc2t0b3AsXG5cdFx0XHRcdFx0aXNQaG9uZTogKERldmljZSBhcyBhbnkpLnN5c3RlbS5waG9uZVxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdGlmIChvQ29tcG9uZW50LmdldFZpZXdEYXRhKSB7XG5cdFx0XHRcdFx0T2JqZWN0LmFzc2lnbihtVmlld0RhdGEsIG9Db21wb25lbnQuZ2V0Vmlld0RhdGEoKSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBvU2hlbGxTZXJ2aWNlcyA9IG9BcHBDb21wb25lbnQuZ2V0U2hlbGxTZXJ2aWNlcygpO1xuXHRcdFx0XHRtVmlld0RhdGEuY29udmVydGVyVHlwZSA9IHNDb252ZXJ0ZXJUeXBlO1xuXHRcdFx0XHRtVmlld0RhdGEuc2hlbGxDb250ZW50RGVuc2l0eSA9IG9TaGVsbFNlcnZpY2VzLmdldENvbnRlbnREZW5zaXR5KCk7XG5cdFx0XHRcdG1WaWV3RGF0YS51c2VOZXdMYXp5TG9hZGluZyA9IFVyaVBhcmFtZXRlcnMuZnJvbVF1ZXJ5KHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChcInNhcC1mZS14eC1sYXp5bG9hZGluZ3Rlc3RcIikgPT09IFwidHJ1ZVwiO1xuXHRcdFx0XHRtVmlld0RhdGEucmV0cmlldmVUZXh0RnJvbVZhbHVlTGlzdCA9XG5cdFx0XHRcdFx0b01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXSAmJiBvTWFuaWZlc3RDb250ZW50W1wic2FwLmZlXCJdLmZvcm1cblx0XHRcdFx0XHRcdD8gb01hbmlmZXN0Q29udGVudFtcInNhcC5mZVwiXS5mb3JtLnJldHJpZXZlVGV4dEZyb21WYWx1ZUxpc3Rcblx0XHRcdFx0XHRcdDogdW5kZWZpbmVkO1xuXHRcdFx0XHRvVmlld0RhdGFNb2RlbCA9IG5ldyBKU09OTW9kZWwobVZpZXdEYXRhKTtcblx0XHRcdFx0aWYgKG1WaWV3RGF0YSAmJiBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pIHtcblx0XHRcdFx0XHRPYmplY3Qua2V5cyhtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb24pLmZvckVhY2goZnVuY3Rpb24oc0Fubm90YXRpb25QYXRoOiBzdHJpbmcpIHtcblx0XHRcdFx0XHRcdGlmIChzQW5ub3RhdGlvblBhdGguaW5kZXhPZihcIltcIikgIT09IC0xKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHNUYXJnZXRBbm5vdGF0aW9uUGF0aCA9IER5bmFtaWNBbm5vdGF0aW9uUGF0aEhlbHBlci5yZXNvbHZlRHluYW1pY0V4cHJlc3Npb24oc0Fubm90YXRpb25QYXRoLCBvTWV0YU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0bVZpZXdEYXRhLmNvbnRyb2xDb25maWd1cmF0aW9uW3NUYXJnZXRBbm5vdGF0aW9uUGF0aF0gPSBtVmlld0RhdGEuY29udHJvbENvbmZpZ3VyYXRpb25bc0Fubm90YXRpb25QYXRoXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRNZXRhTW9kZWxDb252ZXJ0ZXIuY29udmVydFR5cGVzKG9NZXRhTW9kZWwsIG9BcHBDb21wb25lbnQuZ2V0RW52aXJvbm1lbnRDYXBhYmlsaXRpZXMoKS5nZXRDYXBhYmlsaXRpZXMoKSk7XG5cdFx0XHRcdG9QYWdlTW9kZWwgPSBuZXcgVGVtcGxhdGVNb2RlbCgoKSA9PiB7XG5cdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdGlmICghIW9QYWdlTW9kZWxDYWNoZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gb1BhZ2VNb2RlbENhY2hlO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb0RpYWdub3N0aWNzID0gb0FwcENvbXBvbmVudC5nZXREaWFnbm9zdGljcygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBpSXNzdWVDb3VudCA9IG9EaWFnbm9zdGljcy5nZXRJc3N1ZXMoKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9Db252ZXJ0ZXJQYWdlTW9kZWwgPSBUZW1wbGF0ZUNvbnZlcnRlci5jb252ZXJ0UGFnZShcblx0XHRcdFx0XHRcdFx0XHRzQ29udmVydGVyVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRvTWV0YU1vZGVsLFxuXHRcdFx0XHRcdFx0XHRcdG1WaWV3RGF0YSxcblx0XHRcdFx0XHRcdFx0XHRvRGlhZ25vc3RpY3MsXG5cdFx0XHRcdFx0XHRcdFx0c0Z1bGxDb250ZXh0UGF0aCxcblx0XHRcdFx0XHRcdFx0XHRvQXBwQ29tcG9uZW50LmdldEVudmlyb25tZW50Q2FwYWJpbGl0aWVzKCkuZ2V0Q2FwYWJpbGl0aWVzKClcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBhSXNzdWVzID0gb0RpYWdub3N0aWNzLmdldElzc3VlcygpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhQWRkZWRJc3N1ZXMgPSBhSXNzdWVzLnNsaWNlKGlJc3N1ZUNvdW50KTtcblx0XHRcdFx0XHRcdFx0aWYgKGFBZGRlZElzc3Vlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0TG9nLndhcm5pbmcoXG5cdFx0XHRcdFx0XHRcdFx0XHRcIlNvbWUgaXNzdWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBpbiB5b3VyIHByb2plY3QsIHBsZWFzZSBjaGVjayB0aGUgVUk1IHN1cHBvcnQgYXNzaXN0YW50IHJ1bGUgZm9yIHNhcC5mZS5jb3JlXCJcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdC8vIEZpcmUgYW5kIGZvcmdldCBpbiB0aGUgY2FjaGVcblx0XHRcdFx0XHRcdFx0dGhpcy5fc2V0Q2FjaGVkTW9kZWwoc1BhZ2VNb2RlbENhY2hlS2V5LCBvQ29udmVydGVyUGFnZU1vZGVsKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIG9Db252ZXJ0ZXJQYWdlTW9kZWw7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHRcdExvZy5lcnJvcihlcnJvciwgZXJyb3IpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHt9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSwgb01ldGFNb2RlbCk7XG5cblx0XHRcdFx0aWYgKCFiRXJyb3IpIHtcblx0XHRcdFx0XHRvVmlld1NldHRpbmdzID0gZ2V0Vmlld1NldHRpbmdzKCk7XG5cdFx0XHRcdFx0Ly8gU2V0dGluZyB0aGUgcGFnZU1vZGVsIG9uIHRoZSBjb21wb25lbnQgZm9yIHBvdGVudGlhbCByZXVzZVxuXHRcdFx0XHRcdG9Db21wb25lbnQuc2V0TW9kZWwob1BhZ2VNb2RlbCwgXCJfcGFnZU1vZGVsXCIpO1xuXHRcdFx0XHRcdHJldHVybiBvQ29tcG9uZW50LnJ1bkFzT3duZXIoKCkgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFZpZXcuY3JlYXRlKG9WaWV3U2V0dGluZ3MpXG5cdFx0XHRcdFx0XHRcdC5jYXRjaChjcmVhdGVFcnJvclBhZ2UpXG5cdFx0XHRcdFx0XHRcdC50aGVuKChvVmlldzogYW55KSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5vVmlldyA9IG9WaWV3O1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMub1ZpZXcuc2V0TW9kZWwobmV3IE1hbmFnZWRPYmplY3RNb2RlbCh0aGlzLm9WaWV3KSwgXCIkdmlld1wiKTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9WaWV3LnNldE1vZGVsKG9WaWV3RGF0YU1vZGVsLCBcInZpZXdEYXRhXCIpO1xuXHRcdFx0XHRcdFx0XHRcdG9Db21wb25lbnQuc2V0QWdncmVnYXRpb24oXCJyb290Q29udHJvbFwiLCB0aGlzLm9WaWV3KTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gc0NhY2hlS2V5O1xuXHRcdFx0XHRcdFx0XHR9KVxuXHRcdFx0XHRcdFx0XHQuY2F0Y2goTG9nLmVycm9yKTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5jYXRjaChmdW5jdGlvbihlcnJvcjogYW55KSB7XG5cdFx0XHRcdExvZy5lcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvcik7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVycm9yIHdoaWxlIGNyZWF0aW5nIHZpZXcgOiBcIiArIGVycm9yKTtcblx0XHRcdH0pO1xuXHR9XG5cdGdldFZpZXcoKSB7XG5cdFx0cmV0dXJuIHRoaXMub1ZpZXc7XG5cdH1cblx0Z2V0SW50ZXJmYWNlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblx0ZXhpdCgpIHtcblx0XHQvLyBEZXJlZ2lzdGVyIGdsb2JhbCBpbnN0YW5jZVxuXHRcdHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlICYmIHRoaXMub1Jlc291cmNlTW9kZWxTZXJ2aWNlLmRlc3Ryb3koKTtcblx0XHR0aGlzLm9DYWNoZUhhbmRsZXJTZXJ2aWNlICYmIHRoaXMub0NhY2hlSGFuZGxlclNlcnZpY2UuZGVzdHJveSgpO1xuXHRcdHRoaXMub0ZhY3RvcnkucmVtb3ZlR2xvYmFsSW5zdGFuY2UoKTtcblx0fVxufVxuY2xhc3MgVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5IGV4dGVuZHMgU2VydmljZUZhY3Rvcnk8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4ge1xuXHRfb0luc3RhbmNlUmVnaXN0cnk6IFJlY29yZDxzdHJpbmcsIFRlbXBsYXRlZFZpZXdTZXJ2aWNlPiA9IHt9O1xuXHRzdGF0aWMgaUNyZWF0aW5nVmlld3M6IDA7XG5cdGNyZWF0ZUluc3RhbmNlKG9TZXJ2aWNlQ29udGV4dDogU2VydmljZUNvbnRleHQ8VGVtcGxhdGVkVmlld1NlcnZpY2VTZXR0aW5ncz4pIHtcblx0XHRUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3MrKztcblxuXHRcdGNvbnN0IG9UZW1wbGF0ZWRWaWV3U2VydmljZSA9IG5ldyBUZW1wbGF0ZWRWaWV3U2VydmljZShPYmplY3QuYXNzaWduKHsgZmFjdG9yeTogdGhpcyB9LCBvU2VydmljZUNvbnRleHQpKTtcblx0XHRyZXR1cm4gb1RlbXBsYXRlZFZpZXdTZXJ2aWNlLmluaXRQcm9taXNlLnRoZW4oZnVuY3Rpb24oKSB7XG5cdFx0XHRUZW1wbGF0ZWRWaWV3U2VydmljZUZhY3RvcnkuaUNyZWF0aW5nVmlld3MtLTtcblx0XHRcdHJldHVybiBvVGVtcGxhdGVkVmlld1NlcnZpY2U7XG5cdFx0fSk7XG5cdH1cblx0cmVtb3ZlR2xvYmFsSW5zdGFuY2UoKSB7XG5cdFx0dGhpcy5fb0luc3RhbmNlUmVnaXN0cnkgPSB7fTtcblx0fVxuXHRzdGF0aWMgZ2V0TnVtYmVyT2ZWaWV3c0luQ3JlYXRpb25TdGF0ZSgpIHtcblx0XHRyZXR1cm4gVGVtcGxhdGVkVmlld1NlcnZpY2VGYWN0b3J5LmlDcmVhdGluZ1ZpZXdzO1xuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRlbXBsYXRlZFZpZXdTZXJ2aWNlRmFjdG9yeTtcbiJdfQ==