@veloceapps/sdk 7.0.0-8 → 7.0.1-0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (436) hide show
  1. package/cms/README.md +45 -0
  2. package/cms/cms.actions.d.ts +10 -0
  3. package/cms/components/element-children/element-children.component.d.ts +1 -1
  4. package/cms/components/element-drop-handle/element-drop-handle.component.d.ts +1 -1
  5. package/cms/components/element-renderer/element-renderer.component.d.ts +1 -1
  6. package/cms/components/plugin.component.d.ts +2 -2
  7. package/cms/components/preview/preview.component.d.ts +4 -3
  8. package/cms/directives/custom-template.directive.d.ts +1 -1
  9. package/cms/modules/federated/federated-host.directive.d.ts +8 -0
  10. package/cms/modules/federated/federated.component.d.ts +5 -7
  11. package/cms/modules/federated/federated.module.d.ts +4 -3
  12. package/cms/modules/federated/federated.types.d.ts +1 -5
  13. package/cms/modules/migrations/types/migrations.types.d.ts +1 -1
  14. package/cms/plugins/configuration.plugin.d.ts +1 -1
  15. package/cms/plugins/io.plugin.d.ts +1 -1
  16. package/cms/plugins/region.plugin.d.ts +1 -1
  17. package/cms/plugins/script.plugin.d.ts +1 -1
  18. package/cms/services/templates.service.d.ts +1 -1
  19. package/cms/types/common.types.d.ts +2 -2
  20. package/cms/types/elements.types.d.ts +1 -1
  21. package/cms/types/integration.types.d.ts +1 -1
  22. package/cms/types/layouts.types.d.ts +1 -1
  23. package/cms/utils/element.utils.d.ts +2 -2
  24. package/cms/vendor-map.d.ts +2 -1
  25. package/core/README.md +5 -0
  26. package/core/modules/flow-configuration/types/update.types.d.ts +2 -2
  27. package/core/services/metric-calculation/metric-calculation.types.d.ts +1 -1
  28. package/core/types/ui-definition.types.d.ts +2 -2
  29. package/esm2020/cms/cms.actions.mjs +56 -0
  30. package/esm2020/cms/components/element-children/element-children.component.mjs +35 -0
  31. package/esm2020/cms/components/element-children/element-children.module.mjs +20 -0
  32. package/esm2020/cms/components/element-drop-handle/element-drop-handle.component.mjs +28 -0
  33. package/esm2020/cms/components/element-drop-handle/element-drop-handle.module.mjs +19 -0
  34. package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +160 -0
  35. package/{esm2015/cms/components/element-renderer/element-renderer.module.js → esm2020/cms/components/element-renderer/element-renderer.module.mjs} +5 -5
  36. package/esm2020/cms/components/element.component.mjs +45 -0
  37. package/esm2020/cms/components/plugin.component.mjs +17 -0
  38. package/esm2020/cms/components/preview/preview.component.mjs +103 -0
  39. package/esm2020/cms/components/preview/preview.module.mjs +24 -0
  40. package/esm2020/cms/directives/custom-template.directive.mjs +26 -0
  41. package/esm2020/cms/engine/models/entity.mjs +17 -0
  42. package/esm2020/cms/launcher.module.mjs +24 -0
  43. package/esm2020/cms/modules/federated/federated-host.directive.mjs +16 -0
  44. package/esm2020/cms/modules/federated/federated.component.mjs +64 -0
  45. package/esm2020/cms/modules/federated/federated.module.mjs +20 -0
  46. package/esm2020/cms/modules/federated/federated.types.mjs +2 -0
  47. package/esm2020/cms/modules/migrations/migrations.mjs +15 -0
  48. package/{esm2015/cms/modules/migrations/migrations.module.js → esm2020/cms/modules/migrations/migrations.module.mjs} +5 -5
  49. package/esm2020/cms/modules/migrations/services/migrations.service.mjs +43 -0
  50. package/{esm2015/cms/modules/runtime/runtime.module.js → esm2020/cms/modules/runtime/runtime.module.mjs} +6 -6
  51. package/esm2020/cms/modules/runtime/services/compilation.service.mjs +83 -0
  52. package/esm2020/cms/modules/runtime/services/runtime-editor.service.mjs +28 -0
  53. package/esm2020/cms/modules/runtime/services/runtime.service.mjs +74 -0
  54. package/esm2020/cms/plugins/configuration.plugin.mjs +105 -0
  55. package/esm2020/cms/plugins/io.plugin.mjs +36 -0
  56. package/esm2020/cms/plugins/region.plugin.mjs +58 -0
  57. package/esm2020/cms/plugins/script.plugin.mjs +65 -0
  58. package/{esm2015/cms/services/element-context.service.js → esm2020/cms/services/element-context.service.mjs} +4 -4
  59. package/esm2020/cms/services/integration.state.mjs +40 -0
  60. package/esm2020/cms/services/io-provider.service.mjs +50 -0
  61. package/esm2020/cms/services/resources.service.mjs +49 -0
  62. package/{esm2015/cms/services/templates.service.js → esm2020/cms/services/templates.service.mjs} +4 -4
  63. package/esm2020/cms/utils/element.utils.mjs +160 -0
  64. package/esm2020/cms/utils/elements-resolver.mjs +189 -0
  65. package/esm2020/cms/utils/path.utils.mjs +53 -0
  66. package/esm2020/cms/utils/ui-definition.utils.mjs +87 -0
  67. package/esm2020/cms/vendor-map.mjs +67 -0
  68. package/esm2020/core/core.module.mjs +18 -0
  69. package/{esm2015/core/modules/configuration/configuration.module.js → esm2020/core/modules/configuration/configuration.module.mjs} +6 -6
  70. package/esm2020/core/modules/configuration/helpers.mjs +18 -0
  71. package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +106 -0
  72. package/esm2020/core/modules/configuration/services/configuration.service.mjs +183 -0
  73. package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +50 -0
  74. package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +18 -0
  75. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +150 -0
  76. package/esm2020/core/modules/flow-configuration/services/flow-update.service.mjs +129 -0
  77. package/esm2020/core/services/context.service.mjs +64 -0
  78. package/esm2020/core/services/metric-calculation/metric-calculation.service.mjs +85 -0
  79. package/esm2020/core/services/product-images.service.mjs +31 -0
  80. package/esm2020/core/services/quote-draft.service.mjs +232 -0
  81. package/esm2020/core/utils/line-item.utils.mjs +161 -0
  82. package/esm2020/core/utils/line-item.worker.mjs +19 -0
  83. package/esm2020/runtime/components/component-preview/component-preview.component.mjs +125 -0
  84. package/esm2020/runtime/components/section-renderer/section-renderer.component.mjs +67 -0
  85. package/esm2020/runtime/components/ui-runtime/runtime.component.mjs +440 -0
  86. package/esm2020/runtime/components/ui-runtime-preview/runtime-preview.component.mjs +108 -0
  87. package/esm2020/runtime/execution/components/children-placeholder/children-placeholder.component.mjs +60 -0
  88. package/esm2020/runtime/execution/components/context-provider/context-provider.component.mjs +39 -0
  89. package/esm2020/runtime/execution/components/execution-section-renderer/execution-section-renderer.component.mjs +67 -0
  90. package/esm2020/runtime/execution/components/federated/federated.component.mjs +74 -0
  91. package/esm2020/runtime/execution/components/velo-attribute/velo-attribute.component.mjs +60 -0
  92. package/esm2020/runtime/execution/components/velo-multiselect/velo-multiselect.component.mjs +130 -0
  93. package/esm2020/runtime/execution/components/velo-port-checkbox/velo-port-checkbox.component.mjs +72 -0
  94. package/esm2020/runtime/execution/components/velo-port-dropdown/velo-port-dropdown.component.mjs +97 -0
  95. package/esm2020/runtime/execution/components/velo-port-radio/velo-port-radio.component.mjs +142 -0
  96. package/esm2020/runtime/execution/components/velo-type/velo-type.component.mjs +119 -0
  97. package/esm2020/runtime/execution/directives/section-script.directive.mjs +247 -0
  98. package/esm2020/runtime/execution/directives/sf-query.directive.mjs +35 -0
  99. package/esm2020/runtime/execution/directives/velo-attribute.directive.mjs +88 -0
  100. package/esm2020/runtime/execution/directives/velo-port.directive.mjs +376 -0
  101. package/esm2020/runtime/execution/directives/vl-approval.directive.mjs +23 -0
  102. package/esm2020/runtime/execution/directives/vl-document-attachments.directive.mjs +36 -0
  103. package/esm2020/runtime/execution/directives/vl-document-templates.directive.mjs +60 -0
  104. package/esm2020/runtime/execution/directives/vl-quote.directive.mjs +42 -0
  105. package/esm2020/runtime/execution/directives/vl-ramp.directive.mjs +55 -0
  106. package/esm2020/runtime/execution/runtime-execution.module.mjs +133 -0
  107. package/esm2020/runtime/execution/utils/federated.util.mjs +32 -0
  108. package/esm2020/runtime/runtime.module.mjs +74 -0
  109. package/esm2020/runtime/services/cart.service.mjs +29 -0
  110. package/{esm2015/runtime/services/collapsible-state.service.js → esm2020/runtime/services/collapsible-state.service.mjs} +4 -4
  111. package/esm2020/runtime/services/configuration.service.mjs +119 -0
  112. package/{esm2015/runtime/services/current-state.service.js → esm2020/runtime/services/current-state.service.mjs} +4 -4
  113. package/{esm2015/runtime/services/form-scope.service.js → esm2020/runtime/services/form-scope.service.mjs} +4 -4
  114. package/esm2020/runtime/services/product-model-cache.service.mjs +31 -0
  115. package/esm2020/runtime/services/runtime-context.service.mjs +57 -0
  116. package/esm2020/runtime/services/runtime-form.service.mjs +219 -0
  117. package/esm2020/runtime/services/runtime.service.mjs +115 -0
  118. package/{esm2015/runtime/services/section-helper.service.js → esm2020/runtime/services/section-helper.service.mjs} +4 -4
  119. package/{esm2015/runtime/services/section-scope.service.js → esm2020/runtime/services/section-scope.service.mjs} +4 -4
  120. package/{esm2015/runtime/services/section-store.service.js → esm2020/runtime/services/section-store.service.mjs} +4 -4
  121. package/esm2020/runtime/services/section.service.mjs +117 -0
  122. package/esm2020/runtime/types/script-registry.types.mjs +51 -0
  123. package/esm2020/runtime/utils/line-item.util.mjs +270 -0
  124. package/esm2020/src/components/dialog/dialog.component.mjs +36 -0
  125. package/esm2020/src/components/dialog/dialog.module.mjs +19 -0
  126. package/esm2020/src/components/doc-gen/doc-gen.component.mjs +107 -0
  127. package/esm2020/src/components/doc-gen/doc-gen.module.mjs +19 -0
  128. package/esm2020/src/components/header/cart-overlay/cart-preview.component.mjs +120 -0
  129. package/{esm2015/src/components/header/cart-overlay/cart-preview.module.js → esm2020/src/components/header/cart-overlay/cart-preview.module.mjs} +11 -13
  130. package/esm2020/src/components/header/header.component.mjs +333 -0
  131. package/{esm2015/src/components/header/header.module.js → esm2020/src/components/header/header.module.mjs} +12 -14
  132. package/esm2020/src/components/header/metrics/metrics.component.mjs +227 -0
  133. package/{esm2015/src/components/header/metrics/metrics.module.js → esm2020/src/components/header/metrics/metrics.module.mjs} +17 -19
  134. package/{esm2015/src/flow-routing.module.js → esm2020/src/flow-routing.module.mjs} +12 -14
  135. package/esm2020/src/flow.component.mjs +45 -0
  136. package/esm2020/src/flow.module.mjs +58 -0
  137. package/esm2020/src/guards/context.guard.mjs +93 -0
  138. package/esm2020/src/guards/product-unload.guard.mjs +46 -0
  139. package/esm2020/src/guards/root.guard.mjs +42 -0
  140. package/esm2020/src/pages/assets/assets.component.mjs +111 -0
  141. package/esm2020/src/pages/assets/assets.module.mjs +20 -0
  142. package/esm2020/src/pages/catalog/catalog.component.mjs +111 -0
  143. package/esm2020/src/pages/catalog/catalog.module.mjs +20 -0
  144. package/esm2020/src/pages/debug/debug.component.mjs +62 -0
  145. package/{esm2015/src/pages/debug/debug.module.js → esm2020/src/pages/debug/debug.module.mjs} +12 -14
  146. package/esm2020/src/pages/empty-account/empty-account.component.mjs +12 -0
  147. package/esm2020/src/pages/empty-account/empty-account.module.mjs +20 -0
  148. package/esm2020/src/pages/legacy-product/legacy-product.component.mjs +137 -0
  149. package/esm2020/src/pages/legacy-product/legacy-product.module.mjs +19 -0
  150. package/esm2020/src/pages/product/product.component.mjs +94 -0
  151. package/esm2020/src/pages/product/product.module.mjs +20 -0
  152. package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +25 -0
  153. package/esm2020/src/pages/record-not-found/record-not-found.module.mjs +20 -0
  154. package/esm2020/src/pages/remote/remote.component.mjs +342 -0
  155. package/esm2020/src/pages/remote/remote.module.mjs +20 -0
  156. package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +111 -0
  157. package/esm2020/src/pages/shopping-cart/shopping-cart.module.mjs +20 -0
  158. package/esm2020/src/resolvers/flow.resolver.mjs +70 -0
  159. package/esm2020/src/resolvers/quote.resolver.mjs +90 -0
  160. package/esm2020/src/services/doc-gen.service.mjs +33 -0
  161. package/esm2020/src/services/flow-dialog.service.mjs +126 -0
  162. package/esm2020/src/services/flow-router.service.mjs +144 -0
  163. package/esm2020/src/services/flow.service.mjs +86 -0
  164. package/esm2020/src/utils/flow.utils.mjs +21 -0
  165. package/fesm2015/{veloceapps-sdk-cms.js → veloceapps-sdk-cms.mjs} +178 -207
  166. package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -0
  167. package/fesm2015/{veloceapps-sdk-core.js → veloceapps-sdk-core.mjs} +76 -76
  168. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -0
  169. package/fesm2015/{veloceapps-sdk-runtime.js → veloceapps-sdk-runtime.mjs} +242 -370
  170. package/fesm2015/veloceapps-sdk-runtime.mjs.map +1 -0
  171. package/fesm2015/veloceapps-sdk.mjs +2877 -0
  172. package/fesm2015/veloceapps-sdk.mjs.map +1 -0
  173. package/fesm2020/veloceapps-sdk-cms.mjs +2036 -0
  174. package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -0
  175. package/fesm2020/veloceapps-sdk-core.mjs +1289 -0
  176. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -0
  177. package/fesm2020/veloceapps-sdk-runtime.mjs +3764 -0
  178. package/fesm2020/veloceapps-sdk-runtime.mjs.map +1 -0
  179. package/fesm2020/veloceapps-sdk.mjs +2857 -0
  180. package/fesm2020/veloceapps-sdk.mjs.map +1 -0
  181. package/package.json +59 -33
  182. package/runtime/README.md +5 -0
  183. package/runtime/components/component-preview/component-preview.component.d.ts +2 -2
  184. package/runtime/components/section-renderer/section-renderer.component.d.ts +1 -1
  185. package/runtime/components/ui-runtime/runtime.component.d.ts +1 -1
  186. package/runtime/components/ui-runtime-preview/runtime-preview.component.d.ts +1 -1
  187. package/runtime/execution/components/children-placeholder/children-placeholder.component.d.ts +2 -2
  188. package/runtime/execution/components/context-provider/context-provider.component.d.ts +1 -1
  189. package/runtime/execution/components/execution-section-renderer/execution-section-renderer.component.d.ts +1 -1
  190. package/runtime/execution/components/federated/federated.component.d.ts +1 -1
  191. package/runtime/execution/components/velo-attribute/velo-attribute.component.d.ts +1 -1
  192. package/runtime/execution/components/velo-multiselect/velo-multiselect.component.d.ts +1 -1
  193. package/runtime/execution/components/velo-port-checkbox/velo-port-checkbox.component.d.ts +1 -1
  194. package/runtime/execution/components/velo-port-dropdown/velo-port-dropdown.component.d.ts +1 -1
  195. package/runtime/execution/components/velo-port-radio/velo-port-radio.component.d.ts +1 -1
  196. package/runtime/execution/components/velo-type/velo-type.component.d.ts +1 -1
  197. package/runtime/execution/directives/section-script.directive.d.ts +1 -1
  198. package/runtime/execution/directives/sf-query.directive.d.ts +1 -1
  199. package/runtime/execution/directives/velo-attribute.directive.d.ts +1 -1
  200. package/runtime/execution/directives/velo-port.directive.d.ts +6 -6
  201. package/runtime/execution/directives/vl-approval.directive.d.ts +1 -1
  202. package/runtime/execution/directives/vl-document-attachments.directive.d.ts +1 -1
  203. package/runtime/execution/directives/vl-document-templates.directive.d.ts +1 -1
  204. package/runtime/execution/directives/vl-quote.directive.d.ts +1 -1
  205. package/runtime/execution/directives/vl-ramp.directive.d.ts +1 -1
  206. package/runtime/execution/runtime-execution.module.d.ts +3 -5
  207. package/runtime/execution/utils/federated.util.d.ts +1 -1
  208. package/runtime/runtime.module.d.ts +3 -5
  209. package/runtime/services/section.service.d.ts +1 -1
  210. package/src/components/dialog/dialog.component.d.ts +1 -1
  211. package/src/components/doc-gen/doc-gen.component.d.ts +1 -1
  212. package/src/components/header/cart-overlay/cart-preview.component.d.ts +2 -2
  213. package/src/components/header/header.component.d.ts +1 -1
  214. package/src/components/header/metrics/metrics.component.d.ts +1 -1
  215. package/src/flow.component.d.ts +1 -1
  216. package/src/pages/assets/assets.component.d.ts +1 -1
  217. package/src/pages/catalog/catalog.component.d.ts +1 -1
  218. package/src/pages/debug/debug.component.d.ts +5 -3
  219. package/src/pages/empty-account/empty-account.component.d.ts +1 -1
  220. package/src/pages/legacy-product/legacy-product.component.d.ts +1 -1
  221. package/src/pages/legacy-product/legacy-product.module.d.ts +1 -2
  222. package/src/pages/product/product.component.d.ts +1 -1
  223. package/src/pages/record-not-found/record-not-found.component.d.ts +1 -1
  224. package/src/pages/remote/remote.component.d.ts +1 -1
  225. package/src/pages/shopping-cart/shopping-cart.component.d.ts +1 -1
  226. package/bundles/veloceapps-sdk-cms.umd.js +0 -2531
  227. package/bundles/veloceapps-sdk-cms.umd.js.map +0 -1
  228. package/bundles/veloceapps-sdk-core.umd.js +0 -1916
  229. package/bundles/veloceapps-sdk-core.umd.js.map +0 -1
  230. package/bundles/veloceapps-sdk-runtime.umd.js +0 -4415
  231. package/bundles/veloceapps-sdk-runtime.umd.js.map +0 -1
  232. package/bundles/veloceapps-sdk.umd.js +0 -3583
  233. package/bundles/veloceapps-sdk.umd.js.map +0 -1
  234. package/cms/modules/federated/federated.utils.d.ts +0 -1
  235. package/cms/package.json +0 -10
  236. package/cms/veloceapps-sdk-cms.d.ts +0 -5
  237. package/core/package.json +0 -10
  238. package/core/veloceapps-sdk-core.d.ts +0 -5
  239. package/esm2015/cms/cms.actions.js +0 -42
  240. package/esm2015/cms/components/element-children/element-children.component.js +0 -39
  241. package/esm2015/cms/components/element-children/element-children.module.js +0 -20
  242. package/esm2015/cms/components/element-drop-handle/element-drop-handle.component.js +0 -32
  243. package/esm2015/cms/components/element-drop-handle/element-drop-handle.module.js +0 -19
  244. package/esm2015/cms/components/element-renderer/element-renderer.component.js +0 -169
  245. package/esm2015/cms/components/element.component.js +0 -44
  246. package/esm2015/cms/components/plugin.component.js +0 -16
  247. package/esm2015/cms/components/preview/preview.component.js +0 -93
  248. package/esm2015/cms/components/preview/preview.module.js +0 -24
  249. package/esm2015/cms/directives/custom-template.directive.js +0 -25
  250. package/esm2015/cms/engine/models/entity.js +0 -18
  251. package/esm2015/cms/launcher.module.js +0 -24
  252. package/esm2015/cms/modules/federated/federated.component.js +0 -82
  253. package/esm2015/cms/modules/federated/federated.module.js +0 -19
  254. package/esm2015/cms/modules/federated/federated.types.js +0 -2
  255. package/esm2015/cms/modules/federated/federated.utils.js +0 -37
  256. package/esm2015/cms/modules/migrations/migrations.js +0 -11
  257. package/esm2015/cms/modules/migrations/services/migrations.service.js +0 -43
  258. package/esm2015/cms/modules/runtime/services/compilation.service.js +0 -84
  259. package/esm2015/cms/modules/runtime/services/runtime-editor.service.js +0 -27
  260. package/esm2015/cms/modules/runtime/services/runtime.service.js +0 -74
  261. package/esm2015/cms/plugins/configuration.plugin.js +0 -106
  262. package/esm2015/cms/plugins/io.plugin.js +0 -37
  263. package/esm2015/cms/plugins/region.plugin.js +0 -58
  264. package/esm2015/cms/plugins/script.plugin.js +0 -66
  265. package/esm2015/cms/services/integration.state.js +0 -40
  266. package/esm2015/cms/services/io-provider.service.js +0 -51
  267. package/esm2015/cms/services/resources.service.js +0 -50
  268. package/esm2015/cms/utils/element.utils.js +0 -157
  269. package/esm2015/cms/utils/elements-resolver.js +0 -163
  270. package/esm2015/cms/utils/path.utils.js +0 -56
  271. package/esm2015/cms/utils/ui-definition.utils.js +0 -82
  272. package/esm2015/cms/vendor-map.js +0 -51
  273. package/esm2015/core/core.module.js +0 -18
  274. package/esm2015/core/modules/configuration/helpers.js +0 -10
  275. package/esm2015/core/modules/configuration/services/configuration-runtime.service.js +0 -87
  276. package/esm2015/core/modules/configuration/services/configuration.service.js +0 -177
  277. package/esm2015/core/modules/configuration/services/runtime-context.service.js +0 -51
  278. package/esm2015/core/modules/flow-configuration/flow-configuration.module.js +0 -18
  279. package/esm2015/core/modules/flow-configuration/services/flow-configuration.service.js +0 -150
  280. package/esm2015/core/modules/flow-configuration/services/flow-update.service.js +0 -129
  281. package/esm2015/core/services/context.service.js +0 -53
  282. package/esm2015/core/services/metric-calculation/metric-calculation.service.js +0 -83
  283. package/esm2015/core/services/product-images.service.js +0 -30
  284. package/esm2015/core/services/quote-draft.service.js +0 -217
  285. package/esm2015/core/utils/line-item.utils.js +0 -143
  286. package/esm2015/core/utils/line-item.worker.js +0 -19
  287. package/esm2015/runtime/components/component-preview/component-preview.component.js +0 -125
  288. package/esm2015/runtime/components/section-renderer/section-renderer.component.js +0 -71
  289. package/esm2015/runtime/components/ui-runtime/runtime.component.js +0 -429
  290. package/esm2015/runtime/components/ui-runtime-preview/runtime-preview.component.js +0 -109
  291. package/esm2015/runtime/execution/components/children-placeholder/children-placeholder.component.js +0 -68
  292. package/esm2015/runtime/execution/components/context-provider/context-provider.component.js +0 -36
  293. package/esm2015/runtime/execution/components/execution-section-renderer/execution-section-renderer.component.js +0 -72
  294. package/esm2015/runtime/execution/components/federated/federated.component.js +0 -81
  295. package/esm2015/runtime/execution/components/velo-attribute/velo-attribute.component.js +0 -65
  296. package/esm2015/runtime/execution/components/velo-multiselect/velo-multiselect.component.js +0 -136
  297. package/esm2015/runtime/execution/components/velo-port-checkbox/velo-port-checkbox.component.js +0 -80
  298. package/esm2015/runtime/execution/components/velo-port-dropdown/velo-port-dropdown.component.js +0 -101
  299. package/esm2015/runtime/execution/components/velo-port-radio/velo-port-radio.component.js +0 -150
  300. package/esm2015/runtime/execution/components/velo-type/velo-type.component.js +0 -121
  301. package/esm2015/runtime/execution/directives/section-script.directive.js +0 -242
  302. package/esm2015/runtime/execution/directives/sf-query.directive.js +0 -34
  303. package/esm2015/runtime/execution/directives/velo-attribute.directive.js +0 -86
  304. package/esm2015/runtime/execution/directives/velo-port.directive.js +0 -373
  305. package/esm2015/runtime/execution/directives/vl-approval.directive.js +0 -22
  306. package/esm2015/runtime/execution/directives/vl-document-attachments.directive.js +0 -35
  307. package/esm2015/runtime/execution/directives/vl-document-templates.directive.js +0 -59
  308. package/esm2015/runtime/execution/directives/vl-quote.directive.js +0 -41
  309. package/esm2015/runtime/execution/directives/vl-ramp.directive.js +0 -51
  310. package/esm2015/runtime/execution/runtime-execution.module.js +0 -163
  311. package/esm2015/runtime/execution/utils/federated.util.js +0 -37
  312. package/esm2015/runtime/runtime.module.js +0 -104
  313. package/esm2015/runtime/services/cart.service.js +0 -27
  314. package/esm2015/runtime/services/configuration.service.js +0 -101
  315. package/esm2015/runtime/services/product-model-cache.service.js +0 -30
  316. package/esm2015/runtime/services/runtime-context.service.js +0 -56
  317. package/esm2015/runtime/services/runtime-form.service.js +0 -224
  318. package/esm2015/runtime/services/runtime.service.js +0 -108
  319. package/esm2015/runtime/services/section.service.js +0 -124
  320. package/esm2015/runtime/types/script-registry.types.js +0 -51
  321. package/esm2015/runtime/utils/line-item.util.js +0 -273
  322. package/esm2015/src/components/dialog/dialog.component.js +0 -40
  323. package/esm2015/src/components/dialog/dialog.module.js +0 -19
  324. package/esm2015/src/components/doc-gen/doc-gen.component.js +0 -109
  325. package/esm2015/src/components/doc-gen/doc-gen.module.js +0 -19
  326. package/esm2015/src/components/header/cart-overlay/cart-preview.component.js +0 -122
  327. package/esm2015/src/components/header/header.component.js +0 -336
  328. package/esm2015/src/components/header/metrics/metrics.component.js +0 -232
  329. package/esm2015/src/flow.component.js +0 -45
  330. package/esm2015/src/flow.module.js +0 -60
  331. package/esm2015/src/guards/context.guard.js +0 -84
  332. package/esm2015/src/guards/product-unload.guard.js +0 -43
  333. package/esm2015/src/guards/root.guard.js +0 -41
  334. package/esm2015/src/pages/assets/assets.component.js +0 -117
  335. package/esm2015/src/pages/assets/assets.module.js +0 -20
  336. package/esm2015/src/pages/catalog/catalog.component.js +0 -117
  337. package/esm2015/src/pages/catalog/catalog.module.js +0 -20
  338. package/esm2015/src/pages/debug/debug.component.js +0 -61
  339. package/esm2015/src/pages/empty-account/empty-account.component.js +0 -17
  340. package/esm2015/src/pages/empty-account/empty-account.module.js +0 -20
  341. package/esm2015/src/pages/legacy-product/legacy-product.component.js +0 -132
  342. package/esm2015/src/pages/legacy-product/legacy-product.module.js +0 -21
  343. package/esm2015/src/pages/product/product.component.js +0 -101
  344. package/esm2015/src/pages/product/product.module.js +0 -20
  345. package/esm2015/src/pages/record-not-found/record-not-found.component.js +0 -29
  346. package/esm2015/src/pages/record-not-found/record-not-found.module.js +0 -20
  347. package/esm2015/src/pages/remote/remote.component.js +0 -350
  348. package/esm2015/src/pages/remote/remote.module.js +0 -20
  349. package/esm2015/src/pages/shopping-cart/shopping-cart.component.js +0 -117
  350. package/esm2015/src/pages/shopping-cart/shopping-cart.module.js +0 -20
  351. package/esm2015/src/resolvers/flow.resolver.js +0 -62
  352. package/esm2015/src/resolvers/quote.resolver.js +0 -88
  353. package/esm2015/src/services/doc-gen.service.js +0 -33
  354. package/esm2015/src/services/flow-dialog.service.js +0 -124
  355. package/esm2015/src/services/flow-router.service.js +0 -144
  356. package/esm2015/src/services/flow.service.js +0 -84
  357. package/esm2015/src/utils/flow.utils.js +0 -22
  358. package/fesm2015/veloceapps-sdk-cms.js.map +0 -1
  359. package/fesm2015/veloceapps-sdk-core.js.map +0 -1
  360. package/fesm2015/veloceapps-sdk-runtime.js.map +0 -1
  361. package/fesm2015/veloceapps-sdk.js +0 -2953
  362. package/fesm2015/veloceapps-sdk.js.map +0 -1
  363. package/runtime/package.json +0 -10
  364. package/runtime/veloceapps-sdk-runtime.d.ts +0 -5
  365. package/veloceapps-sdk.d.ts +0 -5
  366. /package/{esm2015/cms/cms.default.js → esm2020/cms/cms.default.mjs} +0 -0
  367. /package/{esm2015/cms/cms.elements.js → esm2020/cms/cms.elements.mjs} +0 -0
  368. /package/{esm2015/cms/cms.layouts.js → esm2020/cms/cms.layouts.mjs} +0 -0
  369. /package/{esm2015/cms/components/index.js → esm2020/cms/components/index.mjs} +0 -0
  370. /package/{esm2015/cms/components/preview/index.js → esm2020/cms/components/preview/index.mjs} +0 -0
  371. /package/{esm2015/cms/components/preview/preview.types.js → esm2020/cms/components/preview/preview.types.mjs} +0 -0
  372. /package/{esm2015/cms/decorators/element.decorator.js → esm2020/cms/decorators/element.decorator.mjs} +0 -0
  373. /package/{esm2015/cms/decorators/index.js → esm2020/cms/decorators/index.mjs} +0 -0
  374. /package/{esm2015/cms/engine/models/plugin.js → esm2020/cms/engine/models/plugin.mjs} +0 -0
  375. /package/{esm2015/cms/index.js → esm2020/cms/index.mjs} +0 -0
  376. /package/{esm2015/cms/injection-tokens.js → esm2020/cms/injection-tokens.mjs} +0 -0
  377. /package/{esm2015/cms/modules/federated/default-options.js → esm2020/cms/modules/federated/default-options.mjs} +0 -0
  378. /package/{esm2015/cms/modules/federated/export.js → esm2020/cms/modules/federated/export.mjs} +0 -0
  379. /package/{esm2015/cms/modules/migrations/index.js → esm2020/cms/modules/migrations/index.mjs} +0 -0
  380. /package/{esm2015/cms/modules/migrations/types/migrations.types.js → esm2020/cms/modules/migrations/types/migrations.types.mjs} +0 -0
  381. /package/{esm2015/cms/modules/runtime/index.js → esm2020/cms/modules/runtime/index.mjs} +0 -0
  382. /package/{esm2015/cms/modules/runtime/tokens.js → esm2020/cms/modules/runtime/tokens.mjs} +0 -0
  383. /package/{esm2015/cms/modules/runtime/types/compilation.types.js → esm2020/cms/modules/runtime/types/compilation.types.mjs} +0 -0
  384. /package/{esm2015/cms/modules/runtime/types/runtime.actions.js → esm2020/cms/modules/runtime/types/runtime.actions.mjs} +0 -0
  385. /package/{esm2015/cms/services/index.js → esm2020/cms/services/index.mjs} +0 -0
  386. /package/{esm2015/cms/types/common.types.js → esm2020/cms/types/common.types.mjs} +0 -0
  387. /package/{esm2015/cms/types/configuration.types.js → esm2020/cms/types/configuration.types.mjs} +0 -0
  388. /package/{esm2015/cms/types/elements.types.js → esm2020/cms/types/elements.types.mjs} +0 -0
  389. /package/{esm2015/cms/types/index.js → esm2020/cms/types/index.mjs} +0 -0
  390. /package/{esm2015/cms/types/integration.types.js → esm2020/cms/types/integration.types.mjs} +0 -0
  391. /package/{esm2015/cms/types/layouts.types.js → esm2020/cms/types/layouts.types.mjs} +0 -0
  392. /package/{esm2015/cms/types/path.types.js → esm2020/cms/types/path.types.mjs} +0 -0
  393. /package/{esm2015/cms/utils/index.js → esm2020/cms/utils/index.mjs} +0 -0
  394. /package/{esm2015/cms/veloceapps-sdk-cms.js → esm2020/cms/veloceapps-sdk-cms.mjs} +0 -0
  395. /package/{esm2015/core/index.js → esm2020/core/index.mjs} +0 -0
  396. /package/{esm2015/core/modules/configuration/index.js → esm2020/core/modules/configuration/index.mjs} +0 -0
  397. /package/{esm2015/core/modules/configuration/types/configuration-runtime.types.js → esm2020/core/modules/configuration/types/configuration-runtime.types.mjs} +0 -0
  398. /package/{esm2015/core/modules/flow-configuration/index.js → esm2020/core/modules/flow-configuration/index.mjs} +0 -0
  399. /package/{esm2015/core/modules/flow-configuration/types/update.types.js → esm2020/core/modules/flow-configuration/types/update.types.mjs} +0 -0
  400. /package/{esm2015/core/modules/index.js → esm2020/core/modules/index.mjs} +0 -0
  401. /package/{esm2015/core/services/index.js → esm2020/core/services/index.mjs} +0 -0
  402. /package/{esm2015/core/services/metric-calculation/metric-calculation.types.js → esm2020/core/services/metric-calculation/metric-calculation.types.mjs} +0 -0
  403. /package/{esm2015/core/services/metric-calculation/metric-calculation.utils.js → esm2020/core/services/metric-calculation/metric-calculation.utils.mjs} +0 -0
  404. /package/{esm2015/core/types/index.js → esm2020/core/types/index.mjs} +0 -0
  405. /package/{esm2015/core/types/runtime.types.js → esm2020/core/types/runtime.types.mjs} +0 -0
  406. /package/{esm2015/core/types/ui-definition.types.js → esm2020/core/types/ui-definition.types.mjs} +0 -0
  407. /package/{esm2015/core/utils/index.js → esm2020/core/utils/index.mjs} +0 -0
  408. /package/{esm2015/core/utils/ui-definition.utils.js → esm2020/core/utils/ui-definition.utils.mjs} +0 -0
  409. /package/{esm2015/core/veloceapps-sdk-core.js → esm2020/core/veloceapps-sdk-core.mjs} +0 -0
  410. /package/{esm2015/index.js → esm2020/index.mjs} +0 -0
  411. /package/{esm2015/runtime/components/index.js → esm2020/runtime/components/index.mjs} +0 -0
  412. /package/{esm2015/runtime/index.js → esm2020/runtime/index.mjs} +0 -0
  413. /package/{esm2015/runtime/services/index.js → esm2020/runtime/services/index.mjs} +0 -0
  414. /package/{esm2015/runtime/types/bound-data.types.js → esm2020/runtime/types/bound-data.types.mjs} +0 -0
  415. /package/{esm2015/runtime/types/index.js → esm2020/runtime/types/index.mjs} +0 -0
  416. /package/{esm2015/runtime/types/quote-states.types.js → esm2020/runtime/types/quote-states.types.mjs} +0 -0
  417. /package/{esm2015/runtime/types/runtime.types.js → esm2020/runtime/types/runtime.types.mjs} +0 -0
  418. /package/{esm2015/runtime/utils/section.utils.js → esm2020/runtime/utils/section.utils.mjs} +0 -0
  419. /package/{esm2015/runtime/utils/sections-binder.helper.js → esm2020/runtime/utils/sections-binder.helper.mjs} +0 -0
  420. /package/{esm2015/runtime/veloceapps-sdk-runtime.js → esm2020/runtime/veloceapps-sdk-runtime.mjs} +0 -0
  421. /package/{esm2015/src/components/dialog/dialog.types.js → esm2020/src/components/dialog/dialog.types.mjs} +0 -0
  422. /package/{esm2015/src/components/header/header.types.js → esm2020/src/components/header/header.types.mjs} +0 -0
  423. /package/{esm2015/src/components/header/metrics/index.js → esm2020/src/components/header/metrics/index.mjs} +0 -0
  424. /package/{esm2015/src/components/header/metrics/metrics.definitions.js → esm2020/src/components/header/metrics/metrics.definitions.mjs} +0 -0
  425. /package/{esm2015/src/constants.js → esm2020/src/constants.mjs} +0 -0
  426. /package/{esm2015/src/guards/index.js → esm2020/src/guards/index.mjs} +0 -0
  427. /package/{esm2015/src/index.js → esm2020/src/index.mjs} +0 -0
  428. /package/{esm2015/src/pages/remote/remote.types.js → esm2020/src/pages/remote/remote.types.mjs} +0 -0
  429. /package/{esm2015/src/services/index.js → esm2020/src/services/index.mjs} +0 -0
  430. /package/{esm2015/src/types/context-route.types.js → esm2020/src/types/context-route.types.mjs} +0 -0
  431. /package/{esm2015/src/types/flow-customization.types.js → esm2020/src/types/flow-customization.types.mjs} +0 -0
  432. /package/{esm2015/src/types/index.js → esm2020/src/types/index.mjs} +0 -0
  433. /package/{esm2015/src/types/metrics.types.js → esm2020/src/types/metrics.types.mjs} +0 -0
  434. /package/{esm2015/src/types/route.types.js → esm2020/src/types/route.types.mjs} +0 -0
  435. /package/{esm2015/src/utils/index.js → esm2020/src/utils/index.mjs} +0 -0
  436. /package/{esm2015/veloceapps-sdk.js → esm2020/veloceapps-sdk.mjs} +0 -0
@@ -1,336 +0,0 @@
1
- import { ChangeDetectionStrategy, Component } from '@angular/core';
2
- import { ConfigurationContextMode, getSupportedDateFormats, } from '@veloceapps/core';
3
- import { OpenDocGenAction } from '@veloceapps/sdk/cms';
4
- import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, finalize, first, map, noop, of, Subject, switchMap, take, takeUntil, tap, } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@veloceapps/sdk/core";
7
- import * as i2 from "@veloceapps/api";
8
- import * as i3 from "../../services/flow-router.service";
9
- import * as i4 from "../../services/flow-dialog.service";
10
- import * as i5 from "@veloceapps/sdk/cms";
11
- import * as i6 from "primeng/overlaypanel";
12
- import * as i7 from "./cart-overlay/cart-preview.component";
13
- import * as i8 from "./metrics/metrics.component";
14
- import * as i9 from "primeng/button";
15
- import * as i10 from "primeng/splitbutton";
16
- import * as i11 from "@angular/common";
17
- import * as i12 from "primeng/tooltip";
18
- import * as i13 from "primeng/api";
19
- import * as i14 from "@veloceapps/components";
20
- export class FlowHeaderComponent {
21
- constructor(contextService, quoteDraftService, quoteApiService, sfApiService, flowConfiguration, routerService, dialogService, integrationState, shoppingCartSettingsApiService) {
22
- this.contextService = contextService;
23
- this.quoteDraftService = quoteDraftService;
24
- this.quoteApiService = quoteApiService;
25
- this.sfApiService = sfApiService;
26
- this.flowConfiguration = flowConfiguration;
27
- this.routerService = routerService;
28
- this.dialogService = dialogService;
29
- this.integrationState = integrationState;
30
- this.shoppingCartSettingsApiService = shoppingCartSettingsApiService;
31
- this.isSaveInProgress$ = new BehaviorSubject(false);
32
- this.isSubmitInProgress$ = new BehaviorSubject(false);
33
- this.dateFormat = 'MM.dd.yyyy';
34
- this.assetPriceLists$ = new BehaviorSubject([]);
35
- this.mode$ = new BehaviorSubject(ConfigurationContextMode.TEST);
36
- this.destroyed$ = new Subject();
37
- this.contextProperties$ = this.contextService.resolve$().pipe(map(ctx => ctx.properties));
38
- this.objectName$ = this.mode$.pipe(map(mode => { var _a; return (_a = mode === null || mode === void 0 ? void 0 : mode.toLocaleLowerCase()) !== null && _a !== void 0 ? _a : ''; }));
39
- this.activePriceList$ = this.quoteDraftService.activePriceList$;
40
- this.isReadonlyMode$ = this.quoteDraftService.hasProducts$.pipe(map(() => this.isReadonlyMode()));
41
- this.status$ = this.contextService.resolve$().pipe(map(context => { var _a; return (_a = context.properties.Status) !== null && _a !== void 0 ? _a : ''; }));
42
- this.isEditMode$ = this.quoteDraftService.isEditMode$();
43
- this.assetsCount$ = this.getAssets$().pipe(map(lineItems => lineItems.length));
44
- this.products$ = this.getDraftItems$().pipe(map(lineItems => this.generateProducts(lineItems)));
45
- this.isConfigurationRoute$ = this.routerService.isConfigurationRoute$();
46
- this.isCartRoute$ = this.routerService.isCartRoute$();
47
- this.isCatalogRoute$ = this.routerService.isCatalogRoute$();
48
- this.isAssetsRoute$ = this.routerService.isAssetsRoute$();
49
- this.objectDetails$ = this.getObjectDetails$();
50
- this.shoppingCartSettingsApiService
51
- .getSettingsMap()
52
- .pipe(take(1))
53
- .subscribe(settings => {
54
- var _a;
55
- this.dateFormat = getSupportedDateFormats((_a = settings.DATE_FORMAT) !== null && _a !== void 0 ? _a : this.dateFormat).datePipeFormat;
56
- });
57
- }
58
- ngOnInit() {
59
- this.contextService
60
- .resolve$()
61
- .pipe(takeUntil(this.destroyed$))
62
- .subscribe(ctx => this.mode$.next(ctx.mode));
63
- // update assetPriceLists on quoteDraft change in ACCOUNT mode
64
- this.quoteDraftService.quoteDraft$
65
- .pipe(takeUntil(this.destroyed$), filter(() => this.isAccountMode))
66
- .subscribe(() => this.assetPriceLists$.next(this.quoteDraftService.assetPriceLists));
67
- }
68
- ngOnDestroy() {
69
- this.destroyed$.next();
70
- this.destroyed$.complete();
71
- }
72
- get isAccountMode() {
73
- return this.mode$.value === ConfigurationContextMode.ACCOUNT;
74
- }
75
- get isQuoteMode() {
76
- return this.mode$.value === ConfigurationContextMode.QUOTE;
77
- }
78
- get isAccountMode$() {
79
- return this.mode$.pipe(map(mode => mode === ConfigurationContextMode.ACCOUNT));
80
- }
81
- get isQuoteMode$() {
82
- return this.mode$.pipe(map(mode => mode === ConfigurationContextMode.QUOTE));
83
- }
84
- getSplitButtonActions(isCartRoute) {
85
- return [
86
- {
87
- label: 'Save to Quote',
88
- command: () => {
89
- this.saveButtonClickHandler(isCartRoute);
90
- },
91
- },
92
- {
93
- label: 'Submit For Approval',
94
- command: () => {
95
- this.submitButtonClickHandler(isCartRoute);
96
- },
97
- },
98
- ];
99
- }
100
- back(objectId) {
101
- const targetId = objectId !== null && objectId !== void 0 ? objectId : this.contextService.resolve().properties.Id;
102
- if (targetId) {
103
- window.VELO_BACK_FN.apply(null, [targetId]);
104
- }
105
- }
106
- getSalesforceObjectLink(objectId) {
107
- if (!objectId) {
108
- return '';
109
- }
110
- return `${window.location.origin}/${objectId}`;
111
- }
112
- navigateToShoppingCart() {
113
- if (!this.isReadonlyMode()) {
114
- this.routerService.navigateToShoppingCart();
115
- }
116
- }
117
- navigateToCatalog() {
118
- if (!this.isReadonlyMode()) {
119
- this.routerService.navigateToCatalog();
120
- }
121
- }
122
- navigateToAssets() {
123
- if (!this.isReadonlyMode()) {
124
- this.routerService.navigateToAssets();
125
- }
126
- }
127
- docGenButtonClickHandler(isCartRoute) {
128
- if (this.isAccountMode) {
129
- if (!this.quoteDraftService.hasUnsavedChanges) {
130
- this.dialogService.showAccountNoChangesDialog().subscribe();
131
- }
132
- else {
133
- this.dialogService.showDocgenAccountUnsavedChangesDialog().subscribe();
134
- }
135
- return;
136
- }
137
- if (!this.quoteDraftService.isEditMode()) {
138
- this.dialogService.showDocgenReadonlyDialog().subscribe();
139
- return;
140
- }
141
- if (!isCartRoute) {
142
- this.dialogService.showDocgenOutsideShoppingCartDialog().subscribe();
143
- return;
144
- }
145
- let shouldOpen$ = of(true);
146
- if (this.quoteDraftService.hasUnsavedChanges) {
147
- shouldOpen$ = this.dialogService.showDocgenUnsavedChangesDialog().pipe(switchMap(confirmed => {
148
- if (!confirmed) {
149
- return of(false);
150
- }
151
- return this.saveQuote$(true).pipe(map(() => true));
152
- }));
153
- }
154
- shouldOpen$
155
- .pipe(first(), tap(shouldOpen => shouldOpen && this.integrationState.dispatch(OpenDocGenAction())))
156
- .subscribe();
157
- }
158
- saveButtonClickHandler(isCartRoute) {
159
- if (!this.quoteDraftService.isEditMode()) {
160
- if (this.isQuoteMode) {
161
- this.dialogService.showQuoteReadonlyModeDialog().subscribe();
162
- }
163
- else {
164
- this.dialogService.showReadonlyModeDialog().subscribe();
165
- }
166
- return;
167
- }
168
- if (this.isUpsellQuoteWithoutChanges()) {
169
- this.dialogService.showAccountNoChangesDialog().subscribe();
170
- return;
171
- }
172
- if (this.isAccountMode && !this.quoteDraftService.hasUnsavedChanges) {
173
- this.dialogService.showAccountNoChangesDialog().subscribe();
174
- return;
175
- }
176
- if (!isCartRoute) {
177
- this.dialogService.showQuoteOutsideShoppingCartDialog().subscribe();
178
- return;
179
- }
180
- const lineItems = this.flowConfiguration.getSnapshot();
181
- if (!lineItems.length) {
182
- this.dialogService.showEmptyCartDialog().subscribe();
183
- return;
184
- }
185
- this.saveQuote$().subscribe();
186
- }
187
- submitButtonClickHandler(isCartRoute) {
188
- if (this.isQuoteMode && !this.quoteDraftService.isEditMode()) {
189
- this.dialogService.showReadonlyQuoteSubmitFailureDialog();
190
- return;
191
- }
192
- if (this.isUpsellQuoteWithoutChanges()) {
193
- this.dialogService.showAccountNoChangesDialog().subscribe();
194
- return;
195
- }
196
- if (this.isAccountMode) {
197
- this.dialogService.showAccountSubmitFailureDialog();
198
- return;
199
- }
200
- if (!isCartRoute) {
201
- this.dialogService.showOutsideShoppingCartQuoteSubmitFailureDialog().subscribe();
202
- return;
203
- }
204
- const quoteDraft = this.quoteDraftService.quoteDraft;
205
- if (!quoteDraft) {
206
- return;
207
- }
208
- this.isSubmitInProgress$.next(true);
209
- this.quoteApiService
210
- .submitQuote(quoteDraft)
211
- .pipe(tap(({ quoteId }) => {
212
- this.quoteDraftService.hasUnsavedChanges = false;
213
- this.back(quoteId);
214
- }), finalize(() => this.isSubmitInProgress$.next(false)), takeUntil(this.destroyed$))
215
- .subscribe();
216
- }
217
- selectPriceList(priceListId) {
218
- this.quoteDraftService.updateActivePriceList(priceListId);
219
- }
220
- toggleCartOverlay(cart, event) {
221
- if (!this.isReadonlyMode()) {
222
- cart === null || cart === void 0 ? void 0 : cart.overlayPanel.toggle(event);
223
- }
224
- }
225
- saveQuote$(stayOnPage = false) {
226
- const quoteDraft = this.quoteDraftService.quoteDraftForActivePriceList;
227
- if (!quoteDraft) {
228
- return of(undefined);
229
- }
230
- this.isSaveInProgress$.next(true);
231
- return this.quoteApiService.upsertQuote(quoteDraft).pipe(tap(({ quoteId }) => {
232
- this.quoteDraftService.hasUnsavedChanges = false;
233
- if (!stayOnPage) {
234
- this.back(quoteId);
235
- }
236
- }), finalize(() => this.isSaveInProgress$.next(false)), map(noop), takeUntil(this.destroyed$));
237
- }
238
- queryName$(objectName, id) {
239
- if (!id) {
240
- return of('');
241
- }
242
- const searchRequest = {
243
- count: 1,
244
- rawCondition: `Id = '${id}'`,
245
- fields: ['Name'],
246
- };
247
- return this.sfApiService.query(searchRequest, objectName).pipe(map(result => { var _a, _b; return (_b = (_a = result[0]) === null || _a === void 0 ? void 0 : _a.Name) !== null && _b !== void 0 ? _b : ''; }), takeUntil(this.destroyed$));
248
- }
249
- getObjectDetails$() {
250
- return this.contextService.resolve$().pipe(distinctUntilChanged((prevCtx, currCtx) => prevCtx.properties.Id === currCtx.properties.Id), map(ctx => {
251
- const isAccountMode = ctx.mode === ConfigurationContextMode.ACCOUNT;
252
- const isQuoteMode = ctx.mode === ConfigurationContextMode.QUOTE;
253
- return {
254
- accountId: isAccountMode ? ctx.properties.Id : ctx.properties.AccountId,
255
- opportunityId: ctx.properties.OpportunityId,
256
- quoteId: isQuoteMode ? ctx.properties.Id : undefined,
257
- quoteName: isQuoteMode ? ctx.properties.Name : undefined,
258
- quoteNumber: isQuoteMode ? ctx.properties.QuoteNumber : undefined,
259
- };
260
- }), switchMap(details => combineLatest([
261
- of(details),
262
- this.queryName$('Account', details.accountId),
263
- this.queryName$('Opportunity', details.opportunityId),
264
- ])), map(([details, accountName, opportunityName]) => (Object.assign(Object.assign({}, details), { accountName, opportunityName }))));
265
- }
266
- formatMetric(value) {
267
- return (value ? Number(value) : 0).toFixed(2);
268
- }
269
- getDraftItems$() {
270
- return combineLatest([
271
- this.flowConfiguration.get(),
272
- this.integrationState.state$.pipe(map(state => state.modifiedAssets), distinctUntilChanged()),
273
- ]).pipe(map(([lineItems, modifiedAssets]) => lineItems.filter(li => li.status !== 'EXIST' || (li.assetId && (modifiedAssets === null || modifiedAssets === void 0 ? void 0 : modifiedAssets[li.assetId])))));
274
- }
275
- getAssets$() {
276
- return this.flowConfiguration
277
- .get()
278
- .pipe(map(lineItems => lineItems.filter(li => (!!li.assetId || !!li.openOrderLineItemId) && !li.rampInstanceId)));
279
- }
280
- generateProducts(lineItems) {
281
- const date = new Date();
282
- date.setHours(0, 0, 0, 0);
283
- const now = date.getTime();
284
- const termParentIds = lineItems.map(li => li.rampInstanceId).filter(Boolean);
285
- return lineItems.reduce((result, li) => {
286
- // find main term line item
287
- if (li.rampInstanceId) {
288
- return result;
289
- }
290
- // find current term line item
291
- let target = li;
292
- while (target && target.endDate && new Date(target.endDate).getTime() <= now) {
293
- target = lineItems.find(sub => sub.rampInstanceId === li.id);
294
- }
295
- if (target && target.productId) {
296
- return [
297
- ...result,
298
- {
299
- id: target.id,
300
- productId: target.productId,
301
- name: target.name,
302
- configurable: target.properties['#configurable'] === 'true',
303
- deleted: target.actionCode === 'DELETE',
304
- hasTerm: termParentIds.includes(target.id),
305
- qty: target.qty,
306
- mrr: this.formatMetric(target.properties.VDM_Total_MRR),
307
- nrr: this.formatMetric(target.properties.VDM_Total_NRR),
308
- },
309
- ];
310
- }
311
- return result;
312
- }, []);
313
- }
314
- isReadonlyMode() {
315
- var _a;
316
- return (((_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.context.properties.mode) === ConfigurationContextMode.ACCOUNT &&
317
- !this.quoteDraftService.hasProducts);
318
- }
319
- isUpsellQuoteWithoutChanges() {
320
- const noUpdates = this.quoteDraftService.activeCurrentState.every(lineItem => lineItem.actionCode === 'EXIST');
321
- const sameNumberOfProducts = this.quoteDraftService.getInitialCurrentState().length === this.quoteDraftService.activeCurrentState.length;
322
- return noUpdates && sameNumberOfProducts;
323
- }
324
- }
325
- FlowHeaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FlowHeaderComponent, deps: [{ token: i1.ContextService }, { token: i1.QuoteDraftService }, { token: i2.QuoteApiService }, { token: i2.SalesforceApiService }, { token: i1.FlowConfigurationService }, { token: i3.FlowRouterService }, { token: i4.FlowDialogService }, { token: i5.IntegrationState }, { token: i2.ShoppingCartSettingsApiService }], target: i0.ɵɵFactoryTarget.Component });
326
- FlowHeaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: FlowHeaderComponent, selector: "vl-flow-header", ngImport: i0, template: "<ng-container *ngIf=\"contextProperties$ | async as contextProperties\">\n <ng-container *ngIf=\"objectDetails$ | async as details\">\n <div class=\"flow-info\">\n <nav class=\"nav-item nav-back\" (click)=\"back()\">\n <i class=\"nav-icon vl-icon vl-icon-arrow-left\"></i>\n\n <span> Back to {{ objectName$ | async | titlecase }}</span>\n </nav>\n\n <ng-container *ngIf=\"isAccountMode$ | async\">\n <span class=\"dot-separator\"></span>\n\n <nav class=\"account-name\" [pTooltip]=\"contextProperties.Name ?? ''\" tooltipPosition=\"bottom\" [showDelay]=\"1000\">\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(contextProperties.Id)\">{{ contextProperties.Name }}</a>\n </nav>\n </ng-container>\n\n <ng-container *ngIf=\"isQuoteMode$ | async\">\n <span class=\"dot-separator\"></span>\n\n <span>Quote #{{ details.quoteNumber }}</span>\n\n <span class=\"dot-separator\"></span>\n\n <nav class=\"nav-item\" (click)=\"quoteDetails.toggle($event)\">\n <span>{{ status$ | async }}</span>\n\n <i *ngIf=\"!quoteDetails.overlayVisible\" class=\"vl-icon vl-icon-chevron-down icon-with-margin\"></i>\n <i *ngIf=\"quoteDetails.overlayVisible\" class=\"vl-icon vl-icon-chevron-up icon-with-margin\"></i>\n </nav>\n\n <p-overlayPanel styleClass=\"navigation-settings-overlay flow-header-overlay center\" #quoteDetails>\n <ng-template pTemplate>\n <div class=\"flow-header-overlay__wrapper\">\n <h2 class=\"flow-header-overlay__title\">\n <span>Quote Information</span>\n <i class=\"vl-icon vl-icon-close close-icon\" (click)=\"quoteDetails.hide()\"></i>\n </h2>\n\n <ul class=\"info-list\">\n <li class=\"info-list__row\">\n <span>Account Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.accountId)\">\n <span>{{ details.accountName }}</span>\n </a>\n </li>\n <li class=\"info-list__row\">\n <span>Opportunity Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.opportunityId)\">\n <span>{{ details.opportunityName }}</span>\n </a>\n </li>\n <li class=\"info-list__row\">\n <span>Quote Name:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.quoteId)\">\n <span>{{ details.quoteName }}</span>\n </a>\n </li>\n <li class=\"info-list__row\">\n <span>Quote Number:</span>\n <a target=\"_blank\" [href]=\"getSalesforceObjectLink(details.quoteId)\">\n <span>{{ details.quoteNumber }}</span>\n </a>\n </li>\n </ul>\n </div>\n </ng-template>\n </p-overlayPanel>\n </ng-container>\n </div>\n\n <div class=\"flow-navigation\">\n <ng-container *vlLet=\"isReadonlyMode$ | async as isReadonlyMode\">\n <nav\n class=\"nav-item\"\n [ngClass]=\"{ active: (isAssetsRoute$ | async), disabled: isReadonlyMode }\"\n (click)=\"navigateToAssets()\"\n >\n Assets ({{ assetsCount$ | async }})\n </nav>\n <nav\n class=\"nav-item\"\n [ngClass]=\"{ active: (isCatalogRoute$ | async), disabled: isReadonlyMode }\"\n (click)=\"navigateToCatalog()\"\n >\n Catalog\n </nav>\n <nav class=\"nav-item disabled\" [ngClass]=\"{ active: isConfigurationRoute$ | async }\">Configurator</nav>\n <ng-container *vlLet=\"products$ | async as products\">\n <nav\n class=\"nav-item\"\n [ngClass]=\"{ active: (isCartRoute$ | async), disabled: isReadonlyMode }\"\n (click)=\"navigateToShoppingCart()\"\n >\n Shopping Cart ({{ products.length }})\n </nav>\n\n <nav\n class=\"nav-popover-toggle\"\n [ngClass]=\"{ active: (isCartRoute$ | async), disabled: isReadonlyMode }\"\n (click)=\"toggleCartOverlay(cart, $event)\"\n >\n <i *ngIf=\"!cart?.overlayPanel?.overlayVisible\" class=\"vl-icon vl-icon-chevron-down icon-with-margin\"></i>\n <i *ngIf=\"cart?.overlayPanel?.overlayVisible\" class=\"vl-icon vl-icon-chevron-up icon-with-margin\"></i>\n </nav>\n\n <vl-cart-preview #cart [products]=\"products\"></vl-cart-preview>\n </ng-container>\n </ng-container>\n </div>\n\n <div class=\"flow-controls\">\n <ng-container *ngIf=\"(isReadonlyMode$ | async) === false\">\n <ng-container *vlLet=\"activePriceList$ | async as priceList\">\n <div>\n <ng-container *vlLet=\"assetPriceLists$ | async as assetPriceLists\">\n <ng-container *ngIf=\"(isAccountMode$ | async) && assetPriceLists.length > 1; else singlePriceList\">\n <nav class=\"nav-item\" (click)=\"priceListsOverlay?.toggle($event)\">\n <span>{{ priceList?.name }}</span>\n <i\n *ngIf=\"!priceListsOverlay?.overlayVisible\"\n class=\"vl-icon vl-icon-chevron-down icon-with-margin\"\n ></i>\n <i *ngIf=\"priceListsOverlay?.overlayVisible\" class=\"vl-icon vl-icon-chevron-up icon-with-margin\"></i>\n </nav>\n\n <p-overlayPanel styleClass=\"price-list-overlay\" #priceListsOverlay>\n <ng-template pTemplate>\n <span\n *ngFor=\"let option of assetPriceLists\"\n class=\"price-list-option\"\n [class.active]=\"priceList?.id === option.id\"\n (click)=\"selectPriceList(option.id); priceListsOverlay.hide()\"\n >\n {{ option.name }}\n </span>\n </ng-template>\n </p-overlayPanel>\n </ng-container>\n </ng-container>\n\n <ng-template #singlePriceList>\n <div>{{ priceList?.name }}</div>\n </ng-template>\n\n <div *ngIf=\"contextProperties.StartDate\">{{ contextProperties.StartDate | date : dateFormat }}</div>\n </div>\n </ng-container>\n </ng-container>\n\n <vl-metrics></vl-metrics>\n\n <ng-container *vlLet=\"isCartRoute$ | async as isCartRoute\">\n <ng-container *vlLet=\"isReadonlyMode$ | async as isReadonlyMode\">\n <p-button\n class=\"doc-gen-button\"\n icon=\"vl-icon vl-icon-doc-gen\"\n [disabled]=\"isReadonlyMode\"\n (onClick)=\"docGenButtonClickHandler(isCartRoute)\"\n pTooltip=\"Generate Document\"\n tooltipPosition=\"bottom\"\n tooltipStyleClass=\"vl-info-tooltip\"\n ></p-button>\n\n <ng-container *vlLet=\"isSaveInProgress$ | async as isSaveInProgress\">\n <ng-container *vlLet=\"isSubmitInProgress$ | async as isSubmitInProgress\">\n <p-splitButton\n *ngIf=\"!isSaveInProgress && !isSubmitInProgress\"\n label=\"Save to Quote\"\n (onClick)=\"saveButtonClickHandler(isCartRoute)\"\n [model]=\"getSplitButtonActions(isCartRoute)\"\n [disabled]=\"isReadonlyMode\"\n styleClass=\"p-button-outlined\"\n >\n </p-splitButton>\n\n <p-button\n *ngIf=\"isSaveInProgress\"\n class=\"save-button\"\n styleClass=\"p-button\"\n label=\"Saving\"\n [loading]=\"true\"\n ></p-button>\n\n <p-button\n *ngIf=\"isSubmitInProgress\"\n class=\"submit-button\"\n styleClass=\"p-button\"\n label=\"Submitting\"\n [loading]=\"true\"\n ></p-button>\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n</ng-container>\n", styles: [":host{display:flex;align-items:center;height:48px;width:100%;background-color:var(--vl-primary-color);color:#fff;padding:0 32px;flex-shrink:0}::ng-deep .p-overlaypanel.flow-header-overlay .p-overlaypanel-content{background-color:#fff;padding:16px}::ng-deep .p-overlaypanel.flow-header-overlay.no-padding .p-overlaypanel-content{padding:0}::ng-deep .p-overlaypanel.flow-header-overlay.left:before{left:6px!important}::ng-deep .p-overlaypanel.flow-header-overlay.right:before{right:6px!important}::ng-deep .p-overlaypanel.flow-header-overlay.left .p-overlaypanel-content{margin-left:-16px}::ng-deep .p-overlaypanel.flow-header-overlay.right .p-overlaypanel-content{margin-right:-16px}::ng-deep .p-overlaypanel.flow-header-overlay:before{background-color:#fff}::ng-deep .p-overlaypanel.price-list-overlay .p-overlaypanel-content{border-radius:5px;border-color:var(--vl-border-color);padding:0;display:flex;flex-direction:column;max-height:140px;overflow:auto}:host ::ng-deep p-splitButton{height:32px;width:146px;display:flex}:host ::ng-deep p-splitButton .p-splitbutton{display:flex;font-size:12px;border-radius:2px;height:100%;width:100%;-webkit-backface-visibility:hidden}:host ::ng-deep p-splitButton .p-splitbutton .p-button:focus{box-shadow:none}:host ::ng-deep p-splitButton .p-splitbutton .p-splitbutton-defaultbutton{padding:7px 12px 7px 10px}:host ::ng-deep p-splitButton .p-splitbutton .p-splitbutton-defaultbutton:disabled{opacity:.2}:host ::ng-deep p-splitButton .p-splitbutton .p-splitbutton-menubutton:disabled{opacity:.3}:host ::ng-deep p-splitButton .p-splitbutton.p-button-outlined .p-button{background-color:#fff;color:var(--vl-primary-color);border:1px solid #fff}:host ::ng-deep p-splitButton .p-splitbutton.p-button-outlined .p-button:enabled:hover{background-color:var(--vl-secondary-nav-bg);color:var(--vl-primary-color);border:1px solid var(--vl-secondary-nav-bg);outline:none}:host ::ng-deep p-splitButton .p-splitbutton.p-button-outlined .p-button.p-splitbutton-menubutton{background-color:var(--vl-secondary-nav-bg);border-radius:0 2px 2px 0;border:1px solid var(--vl-secondary-nav-bg);border-left:none}:host ::ng-deep p-splitButton .p-splitbutton.p-button-outlined .p-button.p-splitbutton-menubutton:hover{background-color:var(--vl-secondary-nav-bg);border:1px solid var(--vl-secondary-nav-bg);border-left:none}:host ::ng-deep p-splitButton .p-splitbutton.p-button-outlined .p-button.p-splitbutton-defaultbutton{border-radius:2px 0 0 2px}:host ::ng-deep p-splitButton .p-splitbutton.p-button-outlined .p-button.p-splitbutton-defaultbutton .p-button-label{font-size:12px;line-height:16px;letter-spacing:.3px;white-space:nowrap}:host ::ng-deep p-splitButton .p-splitbutton .p-menu{display:flex;width:auto;margin-top:2px;border-radius:4px;border:1px solid var(--vl-border-color);box-shadow:0 4px 20px #2767c11a}:host ::ng-deep p-splitButton .p-splitbutton .p-menu .p-menu-list{display:flex;flex-direction:column}:host ::ng-deep p-splitButton .p-splitbutton .p-menu .p-menu-list .p-menuitem{display:flex;width:100%;height:32px}:host ::ng-deep p-splitButton .p-splitbutton .p-menu .p-menu-list .p-menuitem .p-menuitem-link{padding:8px;width:100%;height:100%}:host ::ng-deep p-splitButton .p-splitbutton .p-menu .p-menu-list .p-menuitem .p-menuitem-link:not(.p-disabled):hover{background-color:var(--vl-secondary-nav-bg)}:host ::ng-deep p-splitButton .p-splitbutton .p-menu .p-menu-list .p-menuitem .p-menuitem-link:not(.p-disabled):hover .p-menuitem-text{color:var(--vl-primary-color)}:host ::ng-deep p-splitButton .p-splitbutton .p-menu .p-menu-list .p-menuitem .p-menuitem-link .p-menuitem-text{line-height:16px;font-size:12px;letter-spacing:.3px;white-space:nowrap}:host ::ng-deep .doc-gen-button{height:32px;width:32px;display:inline-flex}:host ::ng-deep .doc-gen-button .p-button{border:1px solid #fff;border-radius:2px;width:100%;height:100%}:host ::ng-deep .doc-gen-button .p-button.p-component:disabled{opacity:.3}:host ::ng-deep .save-button,:host ::ng-deep .submit-button{height:32px;width:146px;display:flex}:host ::ng-deep .save-button .p-button,:host ::ng-deep .submit-button .p-button{border-radius:3px;width:100%;height:100%;background:rgba(255,255,255,.3);opacity:1;border:none}:host ::ng-deep .save-button .p-button .p-button-label,:host ::ng-deep .submit-button .p-button .p-button-label{font-size:12px;line-height:16px;letter-spacing:.3px;white-space:nowrap}.vl-icon{display:inline-block}.flow-info{flex-shrink:0;display:flex;grid-gap:8px;gap:8px;align-items:center}.flow-info .nav-popover-toggle{margin-left:-8px}.flow-info .nav-back{font-weight:bold}.flow-info .nav-item:not(.disabled):hover,.flow-info .nav-popover-toggle:not(.disabled):hover{opacity:.6}nav{display:flex;align-items:center;cursor:pointer;height:14px}nav.disabled{opacity:.6;cursor:default}nav .nav-icon{margin-right:10px}nav .icon-with-margin{margin:0 4px}nav a{color:#fff}nav.account-name{margin-left:4px;display:block;max-width:200px;overflow:hidden;text-overflow:ellipsis}nav.nav-popover-toggle{width:24px;display:flex;justify-content:center}nav.nav-popover-toggle i{pointer-events:none;margin:0}nav i{pointer-events:none}.metrics__row{display:flex;justify-content:space-between;grid-gap:2px;gap:2px}.dot-separator:after{content:\"\";display:block;width:4px;height:4px;border-radius:50%;background:#fff}.slash-separator:after{content:\"\";display:block;background:#fff;width:1px;height:16px}.flow-header-overlay__wrapper{width:360px}.flow-header-overlay__wrapper .close-icon{cursor:pointer}.flow-header-overlay__wrapper .info-list{list-style:none;padding:0;font-size:12px}.flow-header-overlay__wrapper .info-list__row{padding:8px 0;display:flex;justify-content:space-between}.flow-header-overlay__wrapper .info-list__row a{text-align:right}.flow-header-overlay__title{display:flex;justify-content:space-between;align-items:center;margin:0 0 24px}.flow-navigation{flex-grow:1;display:flex;grid-gap:16px;gap:16px;justify-content:center;font-weight:600}.flow-navigation .cart-nav-container{display:flex}.flow-navigation .nav-popover-toggle{margin-left:-14px}.flow-navigation .nav-item,.flow-navigation .nav-popover-toggle{opacity:.6}.flow-navigation .nav-item.active,.flow-navigation .nav-item:not(.disabled):hover,.flow-navigation .nav-popover-toggle.active,.flow-navigation .nav-popover-toggle:not(.disabled):hover{opacity:1}.price-list-option{padding:8px;color:var(--vl-primary-color);cursor:pointer}.price-list-option.active,.price-list-option:hover{background:var(--vl-secondary-nav-bg)}.flow-controls{flex-shrink:0;display:flex;align-items:center;grid-gap:16px;gap:16px;font-size:12px;line-height:16px}\n"], components: [{ type: i6.OverlayPanel, selector: "p-overlayPanel", inputs: ["dismissable", "showCloseIcon", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { type: i7.CartPreviewComponent, selector: "vl-cart-preview", inputs: ["products"] }, { type: i8.MetricsComponent, selector: "vl-metrics" }, { type: i9.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "style", "styleClass", "badgeClass"], outputs: ["onClick", "onFocus", "onBlur"] }, { type: i10.SplitButton, selector: "p-splitButton", inputs: ["model", "icon", "iconPos", "label", "style", "styleClass", "menuStyle", "menuStyleClass", "disabled", "tabindex", "appendTo", "dir", "expandAriaLabel", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onClick", "onDropdownClick"] }], directives: [{ type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i13.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i14.LetDirective, selector: "[vlLet]", inputs: ["vlLet"] }, { type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i11.AsyncPipe, "titlecase": i11.TitleCasePipe, "date": i11.DatePipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush });
327
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: FlowHeaderComponent, decorators: [{
328
- type: Component,
329
- args: [{
330
- selector: 'vl-flow-header',
331
- templateUrl: './header.component.html',
332
- styleUrls: ['./header.component.scss'],
333
- changeDetection: ChangeDetectionStrategy.OnPush,
334
- }]
335
- }], ctorParameters: function () { return [{ type: i1.ContextService }, { type: i1.QuoteDraftService }, { type: i2.QuoteApiService }, { type: i2.SalesforceApiService }, { type: i1.FlowConfigurationService }, { type: i3.FlowRouterService }, { type: i4.FlowDialogService }, { type: i5.IntegrationState }, { type: i2.ShoppingCartSettingsApiService }]; } });
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvc2RrL3NyYy9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvc3JjL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUV0RixPQUFPLEVBQ0wsd0JBQXdCLEVBRXhCLHVCQUF1QixHQUt4QixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBb0IsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd6RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBQ0wsR0FBRyxFQUNILElBQUksRUFFSixFQUFFLEVBQ0YsT0FBTyxFQUNQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQWNkLE1BQU0sT0FBTyxtQkFBbUI7SUF1QjlCLFlBQ1UsY0FBOEIsRUFDOUIsaUJBQW9DLEVBQ3BDLGVBQWdDLEVBQ2hDLFlBQWtDLEVBQ2xDLGlCQUEyQyxFQUMzQyxhQUFnQyxFQUNoQyxhQUFnQyxFQUNoQyxnQkFBa0MsRUFDbEMsOEJBQThEO1FBUjlELG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQyxpQkFBWSxHQUFaLFlBQVksQ0FBc0I7UUFDbEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUEwQjtRQUMzQyxrQkFBYSxHQUFiLGFBQWEs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QUM7SUFDM0MsQ0FBQzs7aUhBOVpVLG1CQUFtQjtxR0FBbkIsbUJBQW1CLHNEQzVDaEMsd3VRQXNNQTs0RkQxSmEsbUJBQW1CO2tCQU4vQixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFdBQVcsRUFBRSx5QkFBeUI7b0JBQ3RDLFNBQVMsRUFBRSxDQUFDLHlCQUF5QixDQUFDO29CQUN0QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUXVvdGVBcGlTZXJ2aWNlLCBTYWxlc2ZvcmNlQXBpU2VydmljZSwgU2hvcHBpbmdDYXJ0U2V0dGluZ3NBcGlTZXJ2aWNlIH0gZnJvbSAnQHZlbG9jZWFwcHMvYXBpJztcbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25Db250ZXh0TW9kZSxcbiAgQ29udGV4dFByb3BlcnRpZXMsXG4gIGdldFN1cHBvcnRlZERhdGVGb3JtYXRzLFxuICBMaW5lSXRlbSxcbiAgUHJpY2VMaXN0LFxuICBTZWFyY2hSZXF1ZXN0LFxuICBWbFdpbmRvdyxcbn0gZnJvbSAnQHZlbG9jZWFwcHMvY29yZSc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvblN0YXRlLCBPcGVuRG9jR2VuQWN0aW9uIH0gZnJvbSAnQHZlbG9jZWFwcHMvc2RrL2Ntcyc7XG5pbXBvcnQgeyBDb250ZXh0U2VydmljZSwgRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLCBRdW90ZURyYWZ0U2VydmljZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL3Nkay9jb3JlJztcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmaW5hbGl6ZSxcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbm9vcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIFN1YmplY3QsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRmxvd0RpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mbG93LWRpYWxvZy5zZXJ2aWNlJztcbmltcG9ydCB7IEZsb3dSb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZmxvdy1yb3V0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBDYXJ0UHJldmlld0NvbXBvbmVudCB9IGZyb20gJy4vY2FydC1vdmVybGF5L2NhcnQtcHJldmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgSGVhZGVyT2JqZWN0RGV0YWlscywgSGVhZGVyUHJvZHVjdCB9IGZyb20gJy4vaGVhZGVyLnR5cGVzJztcblxuZGVjbGFyZSBjb25zdCB3aW5kb3c6IFZsV2luZG93O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2bC1mbG93LWhlYWRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9oZWFkZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEZsb3dIZWFkZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHB1YmxpYyBvYmplY3ROYW1lJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBwdWJsaWMgY29udGV4dFByb3BlcnRpZXMkOiBPYnNlcnZhYmxlPENvbnRleHRQcm9wZXJ0aWVzPjtcbiAgcHVibGljIGFjdGl2ZVByaWNlTGlzdCQ6IE9ic2VydmFibGU8UHJpY2VMaXN0IHwgbnVsbD47XG4gIHB1YmxpYyBpc1JlYWRvbmx5TW9kZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHB1YmxpYyBzdGF0dXMkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIHB1YmxpYyBvYmplY3REZXRhaWxzJDogT2JzZXJ2YWJsZTxIZWFkZXJPYmplY3REZXRhaWxzPjtcbiAgcHVibGljIGFzc2V0c0NvdW50JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICBwdWJsaWMgcHJvZHVjdHMkOiBPYnNlcnZhYmxlPEhlYWRlclByb2R1Y3RbXT47XG4gIHB1YmxpYyBpc0NvbmZpZ3VyYXRpb25Sb3V0ZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHB1YmxpYyBpc0NhcnRSb3V0ZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHB1YmxpYyBpc0NhdGFsb2dSb3V0ZSQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIHB1YmxpYyBpc0Fzc2V0c1JvdXRlJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgcHVibGljIGlzRWRpdE1vZGUkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBwdWJsaWMgaXNTYXZlSW5Qcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHVibGljIGlzU3VibWl0SW5Qcm9ncmVzcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcHVibGljIGRhdGVGb3JtYXQgPSAnTU0uZGQueXl5eSc7XG5cbiAgcHVibGljIGFzc2V0UHJpY2VMaXN0cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFByaWNlTGlzdFtdPihbXSk7XG5cbiAgcHJpdmF0ZSBtb2RlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29uZmlndXJhdGlvbkNvbnRleHRNb2RlPihDb25maWd1cmF0aW9uQ29udGV4dE1vZGUuVEVTVCk7XG4gIHByaXZhdGUgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb250ZXh0U2VydmljZTogQ29udGV4dFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBxdW90ZURyYWZ0U2VydmljZTogUXVvdGVEcmFmdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBxdW90ZUFwaVNlcnZpY2U6IFF1b3RlQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHNmQXBpU2VydmljZTogU2FsZXNmb3JjZUFwaVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmbG93Q29uZmlndXJhdGlvbjogRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGVyU2VydmljZTogRmxvd1JvdXRlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2dTZXJ2aWNlOiBGbG93RGlhbG9nU2VydmljZSxcbiAgICBwcml2YXRlIGludGVncmF0aW9uU3RhdGU6IEludGVncmF0aW9uU3RhdGUsXG4gICAgcHJpdmF0ZSBzaG9wcGluZ0NhcnRTZXR0aW5nc0FwaVNlcnZpY2U6IFNob3BwaW5nQ2FydFNldHRpbmdzQXBpU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5jb250ZXh0UHJvcGVydGllcyQgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLnJlc29sdmUkKCkucGlwZShtYXAoY3R4ID0+IGN0eC5wcm9wZXJ0aWVzKSk7XG4gICAgdGhpcy5vYmplY3ROYW1lJCA9IHRoaXMubW9kZSQucGlwZShtYXAobW9kZSA9PiBtb2RlPy50b0xvY2FsZUxvd2VyQ2FzZSgpID8/ICcnKSk7XG5cbiAgICB0aGlzLmFjdGl2ZVByaWNlTGlzdCQgPSB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmFjdGl2ZVByaWNlTGlzdCQ7XG4gICAgdGhpcy5pc1JlYWRvbmx5TW9kZSQgPSB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc1Byb2R1Y3RzJC5waXBlKG1hcCgoKSA9PiB0aGlzLmlzUmVhZG9ubHlNb2RlKCkpKTtcbiAgICB0aGlzLnN0YXR1cyQgPSB0aGlzLmNvbnRleHRTZXJ2aWNlLnJlc29sdmUkKCkucGlwZShtYXAoY29udGV4dCA9PiBjb250ZXh0LnByb3BlcnRpZXMuU3RhdHVzID8/ICcnKSk7XG4gICAgdGhpcy5pc0VkaXRNb2RlJCA9IHRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNFZGl0TW9kZSQoKTtcblxuICAgIHRoaXMuYXNzZXRzQ291bnQkID0gdGhpcy5nZXRBc3NldHMkKCkucGlwZShtYXAobGluZUl0ZW1zID0+IGxpbmVJdGVtcy5sZW5ndGgpKTtcbiAgICB0aGlzLnByb2R1Y3RzJCA9IHRoaXMuZ2V0RHJhZnRJdGVtcyQoKS5waXBlKG1hcChsaW5lSXRlbXMgPT4gdGhpcy5nZW5lcmF0ZVByb2R1Y3RzKGxpbmVJdGVtcykpKTtcblxuICAgIHRoaXMuaXNDb25maWd1cmF0aW9uUm91dGUkID0gdGhpcy5yb3V0ZXJTZXJ2aWNlLmlzQ29uZmlndXJhdGlvblJvdXRlJCgpO1xuICAgIHRoaXMuaXNDYXJ0Um91dGUkID0gdGhpcy5yb3V0ZXJTZXJ2aWNlLmlzQ2FydFJvdXRlJCgpO1xuICAgIHRoaXMuaXNDYXRhbG9nUm91dGUkID0gdGhpcy5yb3V0ZXJTZXJ2aWNlLmlzQ2F0YWxvZ1JvdXRlJCgpO1xuICAgIHRoaXMuaXNBc3NldHNSb3V0ZSQgPSB0aGlzLnJvdXRlclNlcnZpY2UuaXNBc3NldHNSb3V0ZSQoKTtcbiAgICB0aGlzLm9iamVjdERldGFpbHMkID0gdGhpcy5nZXRPYmplY3REZXRhaWxzJCgpO1xuXG4gICAgdGhpcy5zaG9wcGluZ0NhcnRTZXR0aW5nc0FwaVNlcnZpY2VcbiAgICAgIC5nZXRTZXR0aW5nc01hcCgpXG4gICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZShzZXR0aW5ncyA9PiB7XG4gICAgICAgIHRoaXMuZGF0ZUZvcm1hdCA9IGdldFN1cHBvcnRlZERhdGVGb3JtYXRzKHNldHRpbmdzLkRBVEVfRk9STUFUID8/IHRoaXMuZGF0ZUZvcm1hdCkuZGF0ZVBpcGVGb3JtYXQ7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRleHRTZXJ2aWNlXG4gICAgICAucmVzb2x2ZSQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKGN0eCA9PiB0aGlzLm1vZGUkLm5leHQoY3R4Lm1vZGUpKTtcblxuICAgIC8vIHVwZGF0ZSBhc3NldFByaWNlTGlzdHMgb24gcXVvdGVEcmFmdCBjaGFuZ2UgaW4gQUNDT1VOVCBtb2RlXG4gICAgdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3llZCQpLFxuICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5pc0FjY291bnRNb2RlKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5hc3NldFByaWNlTGlzdHMkLm5leHQodGhpcy5xdW90ZURyYWZ0U2VydmljZS5hc3NldFByaWNlTGlzdHMpKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0FjY291bnRNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUkLnZhbHVlID09PSBDb25maWd1cmF0aW9uQ29udGV4dE1vZGUuQUNDT1VOVDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNRdW90ZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSQudmFsdWUgPT09IENvbmZpZ3VyYXRpb25Db250ZXh0TW9kZS5RVU9URTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY2NvdW50TW9kZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSQucGlwZShtYXAobW9kZSA9PiBtb2RlID09PSBDb25maWd1cmF0aW9uQ29udGV4dE1vZGUuQUNDT1VOVCkpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1F1b3RlTW9kZSQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSQucGlwZShtYXAobW9kZSA9PiBtb2RlID09PSBDb25maWd1cmF0aW9uQ29udGV4dE1vZGUuUVVPVEUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTcGxpdEJ1dHRvbkFjdGlvbnMoaXNDYXJ0Um91dGU6IGJvb2xlYW4pOiBNZW51SXRlbVtdIHtcbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBsYWJlbDogJ1NhdmUgdG8gUXVvdGUnLFxuICAgICAgICBjb21tYW5kOiAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgdGhpcy5zYXZlQnV0dG9uQ2xpY2tIYW5kbGVyKGlzQ2FydFJvdXRlKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGxhYmVsOiAnU3VibWl0IEZvciBBcHByb3ZhbCcsXG4gICAgICAgIGNvbW1hbmQ6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbkNsaWNrSGFuZGxlcihpc0NhcnRSb3V0ZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICBwdWJsaWMgYmFjayhvYmplY3RJZD86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldElkID0gb2JqZWN0SWQgPz8gdGhpcy5jb250ZXh0U2VydmljZS5yZXNvbHZlKCkucHJvcGVydGllcy5JZDtcblxuICAgIGlmICh0YXJnZXRJZCkge1xuICAgICAgd2luZG93LlZFTE9fQkFDS19GTi5hcHBseShudWxsLCBbdGFyZ2V0SWRdKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U2FsZXNmb3JjZU9iamVjdExpbmsob2JqZWN0SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghb2JqZWN0SWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vJHtvYmplY3RJZH1gO1xuICB9XG5cbiAgcHVibGljIG5hdmlnYXRlVG9TaG9wcGluZ0NhcnQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzUmVhZG9ubHlNb2RlKCkpIHtcbiAgICAgIHRoaXMucm91dGVyU2VydmljZS5uYXZpZ2F0ZVRvU2hvcHBpbmdDYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5hdmlnYXRlVG9DYXRhbG9nKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JlYWRvbmx5TW9kZSgpKSB7XG4gICAgICB0aGlzLnJvdXRlclNlcnZpY2UubmF2aWdhdGVUb0NhdGFsb2coKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmF2aWdhdGVUb0Fzc2V0cygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNSZWFkb25seU1vZGUoKSkge1xuICAgICAgdGhpcy5yb3V0ZXJTZXJ2aWNlLm5hdmlnYXRlVG9Bc3NldHMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZG9jR2VuQnV0dG9uQ2xpY2tIYW5kbGVyKGlzQ2FydFJvdXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNBY2NvdW50TW9kZSkge1xuICAgICAgaWYgKCF0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc1Vuc2F2ZWRDaGFuZ2VzKSB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93QWNjb3VudE5vQ2hhbmdlc0RpYWxvZygpLnN1YnNjcmliZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dEb2NnZW5BY2NvdW50VW5zYXZlZENoYW5nZXNEaWFsb2coKS5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNFZGl0TW9kZSgpKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0RvY2dlblJlYWRvbmx5RGlhbG9nKCkuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhcnRSb3V0ZSkge1xuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dEb2NnZW5PdXRzaWRlU2hvcHBpbmdDYXJ0RGlhbG9nKCkuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNob3VsZE9wZW4kID0gb2YodHJ1ZSk7XG5cbiAgICBpZiAodGhpcy5xdW90ZURyYWZ0U2VydmljZS5oYXNVbnNhdmVkQ2hhbmdlcykge1xuICAgICAgc2hvdWxkT3BlbiQgPSB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd0RvY2dlblVuc2F2ZWRDaGFuZ2VzRGlhbG9nKCkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKGNvbmZpcm1lZCA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLnNhdmVRdW90ZSQodHJ1ZSkucGlwZShtYXAoKCkgPT4gdHJ1ZSkpO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2hvdWxkT3BlbiRcbiAgICAgIC5waXBlKFxuICAgICAgICBmaXJzdCgpLFxuICAgICAgICB0YXAoc2hvdWxkT3BlbiA9PiBzaG91bGRPcGVuICYmIHRoaXMuaW50ZWdyYXRpb25TdGF0ZS5kaXNwYXRjaChPcGVuRG9jR2VuQWN0aW9uKCkpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQnV0dG9uQ2xpY2tIYW5kbGVyKGlzQ2FydFJvdXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmlzRWRpdE1vZGUoKSkge1xuICAgICAgaWYgKHRoaXMuaXNRdW90ZU1vZGUpIHtcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dRdW90ZVJlYWRvbmx5TW9kZURpYWxvZygpLnN1YnNjcmliZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dSZWFkb25seU1vZGVEaWFsb2coKS5zdWJzY3JpYmUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1Vwc2VsbFF1b3RlV2l0aG91dENoYW5nZXMoKSkge1xuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dBY2NvdW50Tm9DaGFuZ2VzRGlhbG9nKCkuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNBY2NvdW50TW9kZSAmJiAhdGhpcy5xdW90ZURyYWZ0U2VydmljZS5oYXNVbnNhdmVkQ2hhbmdlcykge1xuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dBY2NvdW50Tm9DaGFuZ2VzRGlhbG9nKCkuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0NhcnRSb3V0ZSkge1xuICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnNob3dRdW90ZU91dHNpZGVTaG9wcGluZ0NhcnREaWFsb2coKS5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaW5lSXRlbXMgPSB0aGlzLmZsb3dDb25maWd1cmF0aW9uLmdldFNuYXBzaG90KCk7XG5cbiAgICBpZiAoIWxpbmVJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93RW1wdHlDYXJ0RGlhbG9nKCkuc3Vic2NyaWJlKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zYXZlUXVvdGUkKCkuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0QnV0dG9uQ2xpY2tIYW5kbGVyKGlzQ2FydFJvdXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNRdW90ZU1vZGUgJiYgIXRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNFZGl0TW9kZSgpKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd1JlYWRvbmx5UXVvdGVTdWJtaXRGYWlsdXJlRGlhbG9nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNVcHNlbGxRdW90ZVdpdGhvdXRDaGFuZ2VzKCkpIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93QWNjb3VudE5vQ2hhbmdlc0RpYWxvZygpLnN1YnNjcmliZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzQWNjb3VudE1vZGUpIHtcbiAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5zaG93QWNjb3VudFN1Ym1pdEZhaWx1cmVEaWFsb2coKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ2FydFJvdXRlKSB7XG4gICAgICB0aGlzLmRpYWxvZ1NlcnZpY2Uuc2hvd091dHNpZGVTaG9wcGluZ0NhcnRRdW90ZVN1Ym1pdEZhaWx1cmVEaWFsb2coKS5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90ZURyYWZ0ID0gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0O1xuICAgIGlmICghcXVvdGVEcmFmdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaXNTdWJtaXRJblByb2dyZXNzJC5uZXh0KHRydWUpO1xuXG4gICAgdGhpcy5xdW90ZUFwaVNlcnZpY2VcbiAgICAgIC5zdWJtaXRRdW90ZShxdW90ZURyYWZ0KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoeyBxdW90ZUlkIH0pID0+IHtcbiAgICAgICAgICB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5iYWNrKHF1b3RlSWQpO1xuICAgICAgICB9KSxcbiAgICAgICAgZmluYWxpemUoKCkgPT4gdGhpcy5pc1N1Ym1pdEluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0UHJpY2VMaXN0KHByaWNlTGlzdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnVwZGF0ZUFjdGl2ZVByaWNlTGlzdChwcmljZUxpc3RJZCk7XG4gIH1cblxuICBwdWJsaWMgdG9nZ2xlQ2FydE92ZXJsYXkoY2FydDogQ2FydFByZXZpZXdDb21wb25lbnQsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JlYWRvbmx5TW9kZSgpKSB7XG4gICAgICBjYXJ0Py5vdmVybGF5UGFuZWwudG9nZ2xlKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNhdmVRdW90ZSQoc3RheU9uUGFnZSA9IGZhbHNlKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgcXVvdGVEcmFmdCA9IHRoaXMucXVvdGVEcmFmdFNlcnZpY2UucXVvdGVEcmFmdEZvckFjdGl2ZVByaWNlTGlzdDtcbiAgICBpZiAoIXF1b3RlRHJhZnQpIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHRoaXMuaXNTYXZlSW5Qcm9ncmVzcyQubmV4dCh0cnVlKTtcblxuICAgIHJldHVybiB0aGlzLnF1b3RlQXBpU2VydmljZS51cHNlcnRRdW90ZShxdW90ZURyYWZ0KS5waXBlKFxuICAgICAgdGFwKCh7IHF1b3RlSWQgfSkgPT4ge1xuICAgICAgICB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKCFzdGF5T25QYWdlKSB7XG4gICAgICAgICAgdGhpcy5iYWNrKHF1b3RlSWQpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNTYXZlSW5Qcm9ncmVzcyQubmV4dChmYWxzZSkpLFxuICAgICAgbWFwKG5vb3ApLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgcXVlcnlOYW1lJChvYmplY3ROYW1lOiBzdHJpbmcsIGlkPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm4gb2YoJycpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlYXJjaFJlcXVlc3Q6IFNlYXJjaFJlcXVlc3QgPSB7XG4gICAgICBjb3VudDogMSxcbiAgICAgIHJhd0NvbmRpdGlvbjogYElkID0gJyR7aWR9J2AsXG4gICAgICBmaWVsZHM6IFsnTmFtZSddLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5zZkFwaVNlcnZpY2UucXVlcnk8YW55PihzZWFyY2hSZXF1ZXN0LCBvYmplY3ROYW1lKS5waXBlKFxuICAgICAgbWFwKHJlc3VsdCA9PiByZXN1bHRbMF0/Lk5hbWUgPz8gJycpLFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T2JqZWN0RGV0YWlscyQoKTogT2JzZXJ2YWJsZTxIZWFkZXJPYmplY3REZXRhaWxzPiB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dFNlcnZpY2UucmVzb2x2ZSQoKS5waXBlKFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXZDdHgsIGN1cnJDdHgpID0+IHByZXZDdHgucHJvcGVydGllcy5JZCA9PT0gY3VyckN0eC5wcm9wZXJ0aWVzLklkKSxcbiAgICAgIG1hcChjdHggPT4ge1xuICAgICAgICBjb25zdCBpc0FjY291bnRNb2RlID0gY3R4Lm1vZGUgPT09IENvbmZpZ3VyYXRpb25Db250ZXh0TW9kZS5BQ0NPVU5UO1xuICAgICAgICBjb25zdCBpc1F1b3RlTW9kZSA9IGN0eC5tb2RlID09PSBDb25maWd1cmF0aW9uQ29udGV4dE1vZGUuUVVPVEU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhY2NvdW50SWQ6IGlzQWNjb3VudE1vZGUgPyBjdHgucHJvcGVydGllcy5JZCA6IGN0eC5wcm9wZXJ0aWVzLkFjY291bnRJZCxcbiAgICAgICAgICBvcHBvcnR1bml0eUlkOiBjdHgucHJvcGVydGllcy5PcHBvcnR1bml0eUlkLFxuICAgICAgICAgIHF1b3RlSWQ6IGlzUXVvdGVNb2RlID8gY3R4LnByb3BlcnRpZXMuSWQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcXVvdGVOYW1lOiBpc1F1b3RlTW9kZSA/IGN0eC5wcm9wZXJ0aWVzLk5hbWUgOiB1bmRlZmluZWQsXG4gICAgICAgICAgcXVvdGVOdW1iZXI6IGlzUXVvdGVNb2RlID8gY3R4LnByb3BlcnRpZXMuUXVvdGVOdW1iZXIgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcChkZXRhaWxzID0+XG4gICAgICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICAgIG9mKGRldGFpbHMpLFxuICAgICAgICAgIHRoaXMucXVlcnlOYW1lJCgnQWNjb3VudCcsIGRldGFpbHMuYWNjb3VudElkKSxcbiAgICAgICAgICB0aGlzLnF1ZXJ5TmFtZSQoJ09wcG9ydHVuaXR5JywgZGV0YWlscy5vcHBvcnR1bml0eUlkKSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICAgbWFwKChbZGV0YWlscywgYWNjb3VudE5hbWUsIG9wcG9ydHVuaXR5TmFtZV0pID0+ICh7IC4uLmRldGFpbHMsIGFjY291bnROYW1lLCBvcHBvcnR1bml0eU5hbWUgfSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdE1ldHJpYyh2YWx1ZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh2YWx1ZSA/IE51bWJlcih2YWx1ZSkgOiAwKS50b0ZpeGVkKDIpO1xuICB9XG5cbiAgcHVibGljIGdldERyYWZ0SXRlbXMkKCk6IE9ic2VydmFibGU8TGluZUl0ZW1bXT4ge1xuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuZmxvd0NvbmZpZ3VyYXRpb24uZ2V0KCksXG4gICAgICB0aGlzLmludGVncmF0aW9uU3RhdGUuc3RhdGUkLnBpcGUoXG4gICAgICAgIG1hcChzdGF0ZSA9PiBzdGF0ZS5tb2RpZmllZEFzc2V0cyksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICApLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoKFtsaW5lSXRlbXMsIG1vZGlmaWVkQXNzZXRzXSkgPT5cbiAgICAgICAgbGluZUl0ZW1zLmZpbHRlcihsaSA9PiBsaS5zdGF0dXMgIT09ICdFWElTVCcgfHwgKGxpLmFzc2V0SWQgJiYgbW9kaWZpZWRBc3NldHM/LltsaS5hc3NldElkXSkpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldEFzc2V0cyQoKTogT2JzZXJ2YWJsZTxMaW5lSXRlbVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuZmxvd0NvbmZpZ3VyYXRpb25cbiAgICAgIC5nZXQoKVxuICAgICAgLnBpcGUobWFwKGxpbmVJdGVtcyA9PiBsaW5lSXRlbXMuZmlsdGVyKGxpID0+ICghIWxpLmFzc2V0SWQgfHwgISFsaS5vcGVuT3JkZXJMaW5lSXRlbUlkKSAmJiAhbGkucmFtcEluc3RhbmNlSWQpKSk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJvZHVjdHMobGluZUl0ZW1zOiBMaW5lSXRlbVtdKTogSGVhZGVyUHJvZHVjdFtdIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIGNvbnN0IG5vdyA9IGRhdGUuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHRlcm1QYXJlbnRJZHMgPSBsaW5lSXRlbXMubWFwKGxpID0+IGxpLnJhbXBJbnN0YW5jZUlkKS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICByZXR1cm4gbGluZUl0ZW1zLnJlZHVjZSgocmVzdWx0OiBIZWFkZXJQcm9kdWN0W10sIGxpKSA9PiB7XG4gICAgICAvLyBmaW5kIG1haW4gdGVybSBsaW5lIGl0ZW1cbiAgICAgIGlmIChsaS5yYW1wSW5zdGFuY2VJZCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvLyBmaW5kIGN1cnJlbnQgdGVybSBsaW5lIGl0ZW1cbiAgICAgIGxldCB0YXJnZXQ6IExpbmVJdGVtIHwgdW5kZWZpbmVkID0gbGk7XG4gICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC5lbmREYXRlICYmIG5ldyBEYXRlKHRhcmdldC5lbmREYXRlKS5nZXRUaW1lKCkgPD0gbm93KSB7XG4gICAgICAgIHRhcmdldCA9IGxpbmVJdGVtcy5maW5kKHN1YiA9PiBzdWIucmFtcEluc3RhbmNlSWQgPT09IGxpLmlkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQucHJvZHVjdElkKSB7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiB0YXJnZXQuaWQsXG4gICAgICAgICAgICBwcm9kdWN0SWQ6IHRhcmdldC5wcm9kdWN0SWQsXG4gICAgICAgICAgICBuYW1lOiB0YXJnZXQubmFtZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdGFyZ2V0LnByb3BlcnRpZXNbJyNjb25maWd1cmFibGUnXSA9PT0gJ3RydWUnLFxuICAgICAgICAgICAgZGVsZXRlZDogdGFyZ2V0LmFjdGlvbkNvZGUgPT09ICdERUxFVEUnLFxuICAgICAgICAgICAgaGFzVGVybTogdGVybVBhcmVudElkcy5pbmNsdWRlcyh0YXJnZXQuaWQpLFxuICAgICAgICAgICAgcXR5OiB0YXJnZXQucXR5LFxuICAgICAgICAgICAgbXJyOiB0aGlzLmZvcm1hdE1ldHJpYyh0YXJnZXQucHJvcGVydGllcy5WRE1fVG90YWxfTVJSKSxcbiAgICAgICAgICAgIG5ycjogdGhpcy5mb3JtYXRNZXRyaWModGFyZ2V0LnByb3BlcnRpZXMuVkRNX1RvdGFsX05SUiksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LCBbXSk7XG4gIH1cblxuICBwcml2YXRlIGlzUmVhZG9ubHlNb2RlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQ/LmNvbnRleHQucHJvcGVydGllcy5tb2RlID09PSBDb25maWd1cmF0aW9uQ29udGV4dE1vZGUuQUNDT1VOVCAmJlxuICAgICAgIXRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaGFzUHJvZHVjdHNcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1Vwc2VsbFF1b3RlV2l0aG91dENoYW5nZXMoKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgbm9VcGRhdGVzID0gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5hY3RpdmVDdXJyZW50U3RhdGUuZXZlcnkobGluZUl0ZW0gPT4gbGluZUl0ZW0uYWN0aW9uQ29kZSA9PT0gJ0VYSVNUJyk7XG4gICAgY29uc3Qgc2FtZU51bWJlck9mUHJvZHVjdHMgPVxuICAgICAgdGhpcy5xdW90ZURyYWZ0U2VydmljZS5nZXRJbml0aWFsQ3VycmVudFN0YXRlKCkubGVuZ3RoID09PSB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmFjdGl2ZUN1cnJlbnRTdGF0ZS5sZW5ndGg7XG5cbiAgICByZXR1cm4gbm9VcGRhdGVzICYmIHNhbWVOdW1iZXJPZlByb2R1Y3RzO1xuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGV4dFByb3BlcnRpZXMkIHwgYXN5bmMgYXMgY29udGV4dFByb3BlcnRpZXNcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm9iamVjdERldGFpbHMkIHwgYXN5bmMgYXMgZGV0YWlsc1wiPlxuICAgIDxkaXYgY2xhc3M9XCJmbG93LWluZm9cIj5cbiAgICAgIDxuYXYgY2xhc3M9XCJuYXYtaXRlbSBuYXYtYmFja1wiIChjbGljayk9XCJiYWNrKClcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJuYXYtaWNvbiB2bC1pY29uIHZsLWljb24tYXJyb3ctbGVmdFwiPjwvaT5cblxuICAgICAgICA8c3Bhbj4gQmFjayB0byB7eyBvYmplY3ROYW1lJCB8IGFzeW5jIHwgdGl0bGVjYXNlIH19PC9zcGFuPlxuICAgICAgPC9uYXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0FjY291bnRNb2RlJCB8IGFzeW5jXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZG90LXNlcGFyYXRvclwiPjwvc3Bhbj5cblxuICAgICAgICA8bmF2IGNsYXNzPVwiYWNjb3VudC1uYW1lXCIgW3BUb29sdGlwXT1cImNvbnRleHRQcm9wZXJ0aWVzLk5hbWUgPz8gJydcIiB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIiBbc2hvd0RlbGF5XT1cIjEwMDBcIj5cbiAgICAgICAgICA8YSB0YXJnZXQ9XCJfYmxhbmtcIiBbaHJlZl09XCJnZXRTYWxlc2ZvcmNlT2JqZWN0TGluayhjb250ZXh0UHJvcGVydGllcy5JZClcIj57eyBjb250ZXh0UHJvcGVydGllcy5OYW1lIH19PC9hPlxuICAgICAgICA8L25hdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNRdW90ZU1vZGUkIHwgYXN5bmNcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3Qtc2VwYXJhdG9yXCI+PC9zcGFuPlxuXG4gICAgICAgIDxzcGFuPlF1b3RlICN7eyBkZXRhaWxzLnF1b3RlTnVtYmVyIH19PC9zcGFuPlxuXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZG90LXNlcGFyYXRvclwiPjwvc3Bhbj5cblxuICAgICAgICA8bmF2IGNsYXNzPVwibmF2LWl0ZW1cIiAoY2xpY2spPVwicXVvdGVEZXRhaWxzLnRvZ2dsZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPHNwYW4+e3sgc3RhdHVzJCB8IGFzeW5jIH19PC9zcGFuPlxuXG4gICAgICAgICAgPGkgKm5nSWY9XCIhcXVvdGVEZXRhaWxzLm92ZXJsYXlWaXNpYmxlXCIgY2xhc3M9XCJ2bC1pY29uIHZsLWljb24tY2hldnJvbi1kb3duIGljb24td2l0aC1tYXJnaW5cIj48L2k+XG4gICAgICAgICAgPGkgKm5nSWY9XCJxdW90ZURldGFpbHMub3ZlcmxheVZpc2libGVcIiBjbGFzcz1cInZsLWljb24gdmwtaWNvbi1jaGV2cm9uLXVwIGljb24td2l0aC1tYXJnaW5cIj48L2k+XG4gICAgICAgIDwvbmF2PlxuXG4gICAgICAgIDxwLW92ZXJsYXlQYW5lbCBzdHlsZUNsYXNzPVwibmF2aWdhdGlvbi1zZXR0aW5ncy1vdmVybGF5IGZsb3ctaGVhZGVyLW92ZXJsYXkgY2VudGVyXCIgI3F1b3RlRGV0YWlscz5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsb3ctaGVhZGVyLW92ZXJsYXlfX3dyYXBwZXJcIj5cbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwiZmxvdy1oZWFkZXItb3ZlcmxheV9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5RdW90ZSBJbmZvcm1hdGlvbjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8aSBjbGFzcz1cInZsLWljb24gdmwtaWNvbi1jbG9zZSBjbG9zZS1pY29uXCIgKGNsaWNrKT1cInF1b3RlRGV0YWlscy5oaWRlKClcIj48L2k+XG4gICAgICAgICAgICAgIDwvaDI+XG5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwiaW5mby1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiaW5mby1saXN0X19yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPkFjY291bnQgTmFtZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9XCJfYmxhbmtcIiBbaHJlZl09XCJnZXRTYWxlc2ZvcmNlT2JqZWN0TGluayhkZXRhaWxzLmFjY291bnRJZClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZGV0YWlscy5hY2NvdW50TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImluZm8tbGlzdF9fcm93XCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5PcHBvcnR1bml0eSBOYW1lOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxhIHRhcmdldD1cIl9ibGFua1wiIFtocmVmXT1cImdldFNhbGVzZm9yY2VPYmplY3RMaW5rKGRldGFpbHMub3Bwb3J0dW5pdHlJZClcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgZGV0YWlscy5vcHBvcnR1bml0eU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJpbmZvLWxpc3RfX3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+UXVvdGUgTmFtZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9XCJfYmxhbmtcIiBbaHJlZl09XCJnZXRTYWxlc2ZvcmNlT2JqZWN0TGluayhkZXRhaWxzLnF1b3RlSWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRldGFpbHMucXVvdGVOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiaW5mby1saXN0X19yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlF1b3RlIE51bWJlcjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8YSB0YXJnZXQ9XCJfYmxhbmtcIiBbaHJlZl09XCJnZXRTYWxlc2ZvcmNlT2JqZWN0TGluayhkZXRhaWxzLnF1b3RlSWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGRldGFpbHMucXVvdGVOdW1iZXIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvcC1vdmVybGF5UGFuZWw+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJmbG93LW5hdmlnYXRpb25cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKnZsTGV0PVwiaXNSZWFkb25seU1vZGUkIHwgYXN5bmMgYXMgaXNSZWFkb25seU1vZGVcIj5cbiAgICAgICAgPG5hdlxuICAgICAgICAgIGNsYXNzPVwibmF2LWl0ZW1cIlxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgYWN0aXZlOiAoaXNBc3NldHNSb3V0ZSQgfCBhc3luYyksIGRpc2FibGVkOiBpc1JlYWRvbmx5TW9kZSB9XCJcbiAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVUb0Fzc2V0cygpXCJcbiAgICAgICAgPlxuICAgICAgICAgIEFzc2V0cyAoe3sgYXNzZXRzQ291bnQkIHwgYXN5bmMgfX0pXG4gICAgICAgIDwvbmF2PlxuICAgICAgICA8bmF2XG4gICAgICAgICAgY2xhc3M9XCJuYXYtaXRlbVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IChpc0NhdGFsb2dSb3V0ZSQgfCBhc3luYyksIGRpc2FibGVkOiBpc1JlYWRvbmx5TW9kZSB9XCJcbiAgICAgICAgICAoY2xpY2spPVwibmF2aWdhdGVUb0NhdGFsb2coKVwiXG4gICAgICAgID5cbiAgICAgICAgICBDYXRhbG9nXG4gICAgICAgIDwvbmF2PlxuICAgICAgICA8bmF2IGNsYXNzPVwibmF2LWl0ZW0gZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7IGFjdGl2ZTogaXNDb25maWd1cmF0aW9uUm91dGUkIHwgYXN5bmMgfVwiPkNvbmZpZ3VyYXRvcjwvbmF2PlxuICAgICAgICA8bmctY29udGFpbmVyICp2bExldD1cInByb2R1Y3RzJCB8IGFzeW5jIGFzIHByb2R1Y3RzXCI+XG4gICAgICAgICAgPG5hdlxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtaXRlbVwiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7IGFjdGl2ZTogKGlzQ2FydFJvdXRlJCB8IGFzeW5jKSwgZGlzYWJsZWQ6IGlzUmVhZG9ubHlNb2RlIH1cIlxuICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlVG9TaG9wcGluZ0NhcnQoKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgU2hvcHBpbmcgQ2FydCAoe3sgcHJvZHVjdHMubGVuZ3RoIH19KVxuICAgICAgICAgIDwvbmF2PlxuXG4gICAgICAgICAgPG5hdlxuICAgICAgICAgICAgY2xhc3M9XCJuYXYtcG9wb3Zlci10b2dnbGVcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwieyBhY3RpdmU6IChpc0NhcnRSb3V0ZSQgfCBhc3luYyksIGRpc2FibGVkOiBpc1JlYWRvbmx5TW9kZSB9XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVDYXJ0T3ZlcmxheShjYXJ0LCAkZXZlbnQpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aSAqbmdJZj1cIiFjYXJ0Py5vdmVybGF5UGFuZWw/Lm92ZXJsYXlWaXNpYmxlXCIgY2xhc3M9XCJ2bC1pY29uIHZsLWljb24tY2hldnJvbi1kb3duIGljb24td2l0aC1tYXJnaW5cIj48L2k+XG4gICAgICAgICAgICA8aSAqbmdJZj1cImNhcnQ/Lm92ZXJsYXlQYW5lbD8ub3ZlcmxheVZpc2libGVcIiBjbGFzcz1cInZsLWljb24gdmwtaWNvbi1jaGV2cm9uLXVwIGljb24td2l0aC1tYXJnaW5cIj48L2k+XG4gICAgICAgICAgPC9uYXY+XG5cbiAgICAgICAgICA8dmwtY2FydC1wcmV2aWV3ICNjYXJ0IFtwcm9kdWN0c109XCJwcm9kdWN0c1wiPjwvdmwtY2FydC1wcmV2aWV3PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImZsb3ctY29udHJvbHNcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXNSZWFkb25seU1vZGUkIHwgYXN5bmMpID09PSBmYWxzZVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICp2bExldD1cImFjdGl2ZVByaWNlTGlzdCQgfCBhc3luYyBhcyBwcmljZUxpc3RcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqdmxMZXQ9XCJhc3NldFByaWNlTGlzdHMkIHwgYXN5bmMgYXMgYXNzZXRQcmljZUxpc3RzXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoaXNBY2NvdW50TW9kZSQgfCBhc3luYykgJiYgYXNzZXRQcmljZUxpc3RzLmxlbmd0aCA+IDE7IGVsc2Ugc2luZ2xlUHJpY2VMaXN0XCI+XG4gICAgICAgICAgICAgICAgPG5hdiBjbGFzcz1cIm5hdi1pdGVtXCIgKGNsaWNrKT1cInByaWNlTGlzdHNPdmVybGF5Py50b2dnbGUoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJpY2VMaXN0Py5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcHJpY2VMaXN0c092ZXJsYXk/Lm92ZXJsYXlWaXNpYmxlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ2bC1pY29uIHZsLWljb24tY2hldnJvbi1kb3duIGljb24td2l0aC1tYXJnaW5cIlxuICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwicHJpY2VMaXN0c092ZXJsYXk/Lm92ZXJsYXlWaXNpYmxlXCIgY2xhc3M9XCJ2bC1pY29uIHZsLWljb24tY2hldnJvbi11cCBpY29uLXdpdGgtbWFyZ2luXCI+PC9pPlxuICAgICAgICAgICAgICAgIDwvbmF2PlxuXG4gICAgICAgICAgICAgICAgPHAtb3ZlcmxheVBhbmVsIHN0eWxlQ2xhc3M9XCJwcmljZS1saXN0LW92ZXJsYXlcIiAjcHJpY2VMaXN0c092ZXJsYXk+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBvcHRpb24gb2YgYXNzZXRQcmljZUxpc3RzXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInByaWNlLWxpc3Qtb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInByaWNlTGlzdD8uaWQgPT09IG9wdGlvbi5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFByaWNlTGlzdChvcHRpb24uaWQpOyBwcmljZUxpc3RzT3ZlcmxheS5oaWRlKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L3Atb3ZlcmxheVBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3NpbmdsZVByaWNlTGlzdD5cbiAgICAgICAgICAgICAgPGRpdj57eyBwcmljZUxpc3Q/Lm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb250ZXh0UHJvcGVydGllcy5TdGFydERhdGVcIj57eyBjb250ZXh0UHJvcGVydGllcy5TdGFydERhdGUgfCBkYXRlIDogZGF0ZUZvcm1hdCB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8dmwtbWV0cmljcz48L3ZsLW1ldHJpY3M+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKnZsTGV0PVwiaXNDYXJ0Um91dGUkIHwgYXN5bmMgYXMgaXNDYXJ0Um91dGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqdmxMZXQ9XCJpc1JlYWRvbmx5TW9kZSQgfCBhc3luYyBhcyBpc1JlYWRvbmx5TW9kZVwiPlxuICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJkb2MtZ2VuLWJ1dHRvblwiXG4gICAgICAgICAgICBpY29uPVwidmwtaWNvbiB2bC1pY29uLWRvYy1nZW5cIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzUmVhZG9ubHlNb2RlXCJcbiAgICAgICAgICAgIChvbkNsaWNrKT1cImRvY0dlbkJ1dHRvbkNsaWNrSGFuZGxlcihpc0NhcnRSb3V0ZSlcIlxuICAgICAgICAgICAgcFRvb2x0aXA9XCJHZW5lcmF0ZSBEb2N1bWVudFwiXG4gICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJib3R0b21cIlxuICAgICAgICAgICAgdG9vbHRpcFN0eWxlQ2xhc3M9XCJ2bC1pbmZvLXRvb2x0aXBcIlxuICAgICAgICAgID48L3AtYnV0dG9uPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqdmxMZXQ9XCJpc1NhdmVJblByb2dyZXNzJCB8IGFzeW5jIGFzIGlzU2F2ZUluUHJvZ3Jlc3NcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKnZsTGV0PVwiaXNTdWJtaXRJblByb2dyZXNzJCB8IGFzeW5jIGFzIGlzU3VibWl0SW5Qcm9ncmVzc1wiPlxuICAgICAgICAgICAgICA8cC1zcGxpdEJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIWlzU2F2ZUluUHJvZ3Jlc3MgJiYgIWlzU3VibWl0SW5Qcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgbGFiZWw9XCJTYXZlIHRvIFF1b3RlXCJcbiAgICAgICAgICAgICAgICAob25DbGljayk9XCJzYXZlQnV0dG9uQ2xpY2tIYW5kbGVyKGlzQ2FydFJvdXRlKVwiXG4gICAgICAgICAgICAgICAgW21vZGVsXT1cImdldFNwbGl0QnV0dG9uQWN0aW9ucyhpc0NhcnRSb3V0ZSlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1JlYWRvbmx5TW9kZVwiXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLW91dGxpbmVkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8L3Atc3BsaXRCdXR0b24+XG5cbiAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1NhdmVJblByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNhdmUtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b25cIlxuICAgICAgICAgICAgICAgIGxhYmVsPVwiU2F2aW5nXCJcbiAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgPjwvcC1idXR0b24+XG5cbiAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc1N1Ym1pdEluUHJvZ3Jlc3NcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic3VibWl0LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBsYWJlbD1cIlN1Ym1pdHRpbmdcIlxuICAgICAgICAgICAgICAgIFtsb2FkaW5nXT1cInRydWVcIlxuICAgICAgICAgICAgICA+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19