@eui/core 17.0.0-next.9 → 17.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/assets/i18n-eui/bg.json +1 -0
  2. package/assets/i18n-eui/cs.json +1 -0
  3. package/assets/i18n-eui/da.json +1 -0
  4. package/assets/i18n-eui/de.json +1 -0
  5. package/assets/i18n-eui/el.json +1 -0
  6. package/assets/i18n-eui/en.json +1 -0
  7. package/assets/i18n-eui/es.json +1 -0
  8. package/assets/i18n-eui/et.json +1 -0
  9. package/assets/i18n-eui/fi.json +1 -0
  10. package/assets/i18n-eui/fr.json +1 -0
  11. package/assets/i18n-eui/ga.json +1 -0
  12. package/assets/i18n-eui/hr.json +1 -0
  13. package/assets/i18n-eui/hu.json +1 -1
  14. package/assets/i18n-eui/it.json +1 -0
  15. package/assets/i18n-eui/lt.json +1 -1
  16. package/assets/i18n-eui/lv.json +1 -0
  17. package/assets/i18n-eui/mt.json +1 -0
  18. package/assets/i18n-eui/nl.json +1 -0
  19. package/assets/i18n-eui/pl.json +1 -0
  20. package/assets/i18n-eui/pt.json +1 -0
  21. package/assets/i18n-eui/ro.json +1 -1
  22. package/assets/i18n-eui/sk.json +1 -0
  23. package/assets/i18n-eui/sl.json +1 -0
  24. package/assets/i18n-eui/sv.json +1 -0
  25. package/docs/classes/ActivatedRouteAction.html +282 -0
  26. package/docs/classes/AddApiQueueItemAction.html +282 -0
  27. package/docs/classes/AddAppLoadedConfigModulesAction.html +282 -0
  28. package/docs/classes/ApiQueueServiceMock.html +545 -0
  29. package/docs/classes/AsyncStorageService.html +923 -0
  30. package/docs/classes/AsyncStorageServiceMock.html +427 -0
  31. package/docs/classes/EmptyApiQueueAction.html +282 -0
  32. package/docs/classes/ErrorSubClass.html +357 -0
  33. package/docs/classes/EuiCoreRootGuardClass.html +167 -0
  34. package/docs/classes/EuiError.html +363 -0
  35. package/docs/classes/I18nResourceImpl.html +506 -0
  36. package/docs/classes/InitStoreAction.html +282 -0
  37. package/docs/classes/LogServiceMock.html +223 -0
  38. package/docs/classes/OpenIdConnectServiceMock.html +223 -0
  39. package/docs/classes/RemoveApiQueueItemAction.html +282 -0
  40. package/docs/classes/RouterMock.html +482 -0
  41. package/docs/classes/StorageService.html +630 -0
  42. package/docs/classes/StorageServiceMock.html +316 -0
  43. package/docs/classes/StoreMock.html +391 -0
  44. package/docs/classes/TranslateServiceMock.html +907 -0
  45. package/docs/classes/UpdateAppConnectionAction.html +282 -0
  46. package/docs/classes/UpdateAppStatusAction.html +282 -0
  47. package/docs/classes/UpdateAppVersionAction.html +282 -0
  48. package/docs/classes/UpdateCurrentModuleAction.html +282 -0
  49. package/docs/classes/UpdateI18nStateAction.html +282 -0
  50. package/docs/classes/UpdateLocaleStateAction.html +282 -0
  51. package/docs/classes/UpdateNotificationsListAction.html +282 -0
  52. package/docs/classes/UpdateUserDashboardAction.html +282 -0
  53. package/docs/classes/UpdateUserDetailsAction.html +282 -0
  54. package/docs/classes/UpdateUserPreferencesAction.html +282 -0
  55. package/docs/classes/UpdateUserRightsAction.html +282 -0
  56. package/docs/classes/UpdateUserStateAction.html +282 -0
  57. package/docs/dependencies.html +337 -0
  58. package/docs/directives/TranslateMockDirective.html +266 -0
  59. package/docs/fonts/ionicons.eot +0 -0
  60. package/docs/fonts/ionicons.svg +2090 -0
  61. package/docs/fonts/ionicons.ttf +0 -0
  62. package/docs/fonts/ionicons.woff +0 -0
  63. package/docs/fonts/ionicons.woff2 +0 -0
  64. package/docs/fonts/roboto-v15-latin-300.eot +0 -0
  65. package/docs/fonts/roboto-v15-latin-300.svg +314 -0
  66. package/docs/fonts/roboto-v15-latin-300.ttf +0 -0
  67. package/docs/fonts/roboto-v15-latin-300.woff +0 -0
  68. package/docs/fonts/roboto-v15-latin-300.woff2 +0 -0
  69. package/docs/fonts/roboto-v15-latin-700.eot +0 -0
  70. package/docs/fonts/roboto-v15-latin-700.svg +310 -0
  71. package/docs/fonts/roboto-v15-latin-700.ttf +0 -0
  72. package/docs/fonts/roboto-v15-latin-700.woff +0 -0
  73. package/docs/fonts/roboto-v15-latin-700.woff2 +0 -0
  74. package/docs/fonts/roboto-v15-latin-italic.eot +0 -0
  75. package/docs/fonts/roboto-v15-latin-italic.svg +323 -0
  76. package/docs/fonts/roboto-v15-latin-italic.ttf +0 -0
  77. package/docs/fonts/roboto-v15-latin-italic.woff +0 -0
  78. package/docs/fonts/roboto-v15-latin-italic.woff2 +0 -0
  79. package/docs/fonts/roboto-v15-latin-regular.eot +0 -0
  80. package/docs/fonts/roboto-v15-latin-regular.svg +308 -0
  81. package/docs/fonts/roboto-v15-latin-regular.ttf +0 -0
  82. package/docs/fonts/roboto-v15-latin-regular.woff +0 -0
  83. package/docs/fonts/roboto-v15-latin-regular.woff2 +0 -0
  84. package/docs/images/compodoc-vectorise-inverted.png +0 -0
  85. package/docs/images/compodoc-vectorise-inverted.svg +201 -0
  86. package/docs/images/compodoc-vectorise.png +0 -0
  87. package/docs/images/compodoc-vectorise.svg +201 -0
  88. package/docs/images/favicon.ico +0 -0
  89. package/docs/index.html +171 -0
  90. package/docs/injectables/ApiQueueService.html +784 -0
  91. package/docs/injectables/CoreAppEffects.html +390 -0
  92. package/docs/injectables/EuiAppShellService.html +2822 -0
  93. package/docs/injectables/EuiDynamicComponentService.html +433 -0
  94. package/docs/injectables/EuiDynamicMenuService.html +377 -0
  95. package/docs/injectables/EuiGrowlService.html +821 -0
  96. package/docs/injectables/EuiPermissionService.html +642 -0
  97. package/docs/injectables/EuiTimezoneService.html +378 -0
  98. package/docs/injectables/GlobalErrorHandler.html +291 -0
  99. package/docs/injectables/I18nLoader.html +589 -0
  100. package/docs/injectables/I18nService.html +991 -0
  101. package/docs/injectables/I18nServiceMock.html +626 -0
  102. package/docs/injectables/LocalForageService.html +761 -0
  103. package/docs/injectables/LocalStorageService.html +548 -0
  104. package/docs/injectables/LocaleService.html +753 -0
  105. package/docs/injectables/LocaleServiceMock.html +453 -0
  106. package/docs/injectables/LogService.html +351 -0
  107. package/docs/injectables/OpenIdConnectService.html +225 -0
  108. package/docs/injectables/SessionStorageService.html +548 -0
  109. package/docs/injectables/StoreService.html +641 -0
  110. package/docs/injectables/StoreServiceMock.html +455 -0
  111. package/docs/injectables/UserService.html +738 -0
  112. package/docs/injectables/UserServiceMock.html +708 -0
  113. package/docs/interceptors/AddLangParamInterceptor.html +311 -0
  114. package/docs/interceptors/CachePreventionInterceptor.html +260 -0
  115. package/docs/interceptors/CorsSecurityInterceptor.html +260 -0
  116. package/docs/interceptors/CsrfPreventionInterceptor.html +260 -0
  117. package/docs/interceptors/EuLoginSessionTimeoutHandlingInterceptor.html +260 -0
  118. package/docs/interceptors/HttpErrorHandlerInterceptor.html +319 -0
  119. package/docs/interceptors/OpenIdConnectInterceptor.html +345 -0
  120. package/docs/interceptors/UxRequestErrorModelInterceptor.html +295 -0
  121. package/docs/interfaces/EuiTimeZone.html +247 -0
  122. package/docs/interfaces/LoadedResources.html +292 -0
  123. package/docs/interfaces/LoadedResourcesError.html +247 -0
  124. package/docs/interfaces/ModuleLoadEvent.html +292 -0
  125. package/docs/interfaces/OpenIdConnectUserDetails.html +439 -0
  126. package/docs/interfaces/ResourceError.html +298 -0
  127. package/docs/interfaces/UIState.html +1810 -0
  128. package/docs/js/compodoc.js +14 -0
  129. package/docs/js/lazy-load-graphs.js +44 -0
  130. package/docs/js/libs/EventDispatcher.js +5 -0
  131. package/docs/js/libs/bootstrap-native.js +1 -0
  132. package/docs/js/libs/clipboard.min.js +7 -0
  133. package/docs/js/libs/custom-elements-es5-adapter.js +15 -0
  134. package/docs/js/libs/custom-elements.min.js +38 -0
  135. package/docs/js/libs/d3.v3.min.js +2 -0
  136. package/docs/js/libs/deep-iterator.js +2 -0
  137. package/docs/js/libs/es6-shim.min.js +11 -0
  138. package/docs/js/libs/htmlparser.js +23 -0
  139. package/docs/js/libs/innersvg.js +9 -0
  140. package/docs/js/libs/lit-html.js +1 -0
  141. package/docs/js/libs/prism.js +46 -0
  142. package/docs/js/libs/promise.min.js +6 -0
  143. package/docs/js/libs/svg-pan-zoom.min.js +3 -0
  144. package/docs/js/libs/tablesort.min.js +6 -0
  145. package/docs/js/libs/tablesort.number.min.js +6 -0
  146. package/docs/js/libs/vis.min.js +47 -0
  147. package/docs/js/libs/zepto.min.js +2 -0
  148. package/docs/js/menu-wc.js +377 -0
  149. package/docs/js/menu-wc_es5.js +42 -0
  150. package/docs/js/menu.js +325 -0
  151. package/docs/js/routes.js +301 -0
  152. package/docs/js/search/lunr.min.js +6 -0
  153. package/docs/js/search/search-lunr.js +67 -0
  154. package/docs/js/search/search.js +268 -0
  155. package/docs/js/search/search_index.js +4 -0
  156. package/docs/js/sourceCode.js +58 -0
  157. package/docs/js/svg-pan-zoom.controls.js +53 -0
  158. package/docs/js/tabs.js +21 -0
  159. package/docs/js/tree.js +147 -0
  160. package/docs/license.html +379 -0
  161. package/docs/miscellaneous/enumerations.html +418 -0
  162. package/docs/miscellaneous/functions.html +1796 -0
  163. package/docs/miscellaneous/typealiases.html +258 -0
  164. package/docs/miscellaneous/variables.html +3967 -0
  165. package/docs/modules/CoreModule.html +254 -0
  166. package/docs/modules/I18nModule.html +198 -0
  167. package/docs/modules/LogModule.html +301 -0
  168. package/docs/modules/TranslateMockModule.html +176 -0
  169. package/docs/modules.html +168 -0
  170. package/docs/pipes/TranslateMockPipe.html +225 -0
  171. package/docs/properties.html +124 -0
  172. package/docs/styles/bootstrap-card.css +219 -0
  173. package/docs/styles/bootstrap.min.css +6 -0
  174. package/docs/styles/compodoc.css +1121 -0
  175. package/docs/styles/dark.css +121 -0
  176. package/docs/styles/ionicons.min.css +11 -0
  177. package/docs/styles/laravel.css +113 -0
  178. package/docs/styles/material.css +131 -0
  179. package/docs/styles/original.css +51 -0
  180. package/docs/styles/postmark.css +238 -0
  181. package/docs/styles/prism.css +301 -0
  182. package/docs/styles/readthedocs.css +117 -0
  183. package/docs/styles/reset.css +129 -0
  184. package/docs/styles/stripe.css +106 -0
  185. package/docs/styles/style.css +7 -0
  186. package/docs/styles/tablesort.css +33 -0
  187. package/docs/styles/vagrant.css +130 -0
  188. package/esm2022/lib/eui-core.module.mjs +7 -7
  189. package/esm2022/lib/helpers/date-helpers.mjs +1 -1
  190. package/esm2022/lib/helpers/dom-helpers.mjs +10 -8
  191. package/esm2022/lib/helpers/event-helpers.mjs +1 -1
  192. package/esm2022/lib/helpers/form-helpers.mjs +1 -1
  193. package/esm2022/lib/helpers/format-helpers.mjs +6 -5
  194. package/esm2022/lib/helpers/http-helpers.mjs +3 -5
  195. package/esm2022/lib/interceptors/add-lang-param.interceptor.mjs +4 -4
  196. package/esm2022/lib/interceptors/cache-prevention.interceptor.mjs +4 -4
  197. package/esm2022/lib/interceptors/cors-security.interceptor.mjs +4 -4
  198. package/esm2022/lib/interceptors/csrf-prevention.interceptor.mjs +4 -4
  199. package/esm2022/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +13 -6
  200. package/esm2022/lib/interceptors/openid/openid-connect.interceptor.mjs +37 -8
  201. package/esm2022/lib/interceptors/openid/openid-connect.service.mjs +6 -4
  202. package/esm2022/lib/interceptors/ux-request-error-model.interceptor.mjs +10 -5
  203. package/esm2022/lib/services/app/eui-init-app.mjs +2 -2
  204. package/esm2022/lib/services/app/eui-pre-init-app.mjs +1 -1
  205. package/esm2022/lib/services/app/factories/log.mjs +1 -1
  206. package/esm2022/lib/services/config/tokens.mjs +3 -1
  207. package/esm2022/lib/services/dynamic-component/dynamic-component.service.mjs +9 -4
  208. package/esm2022/lib/services/dynamic-menu/dynamic-menu.service.mjs +8 -5
  209. package/esm2022/lib/services/errors/eui.error.mjs +5 -1
  210. package/esm2022/lib/services/errors/global-error-handler.mjs +7 -5
  211. package/esm2022/lib/services/errors/http-error-handler-callback-functions.mjs +2 -2
  212. package/esm2022/lib/services/errors/http-error-handler.interceptor.mjs +24 -17
  213. package/esm2022/lib/services/eui-app-shell.service.mjs +123 -15
  214. package/esm2022/lib/services/eui-timezone.service.mjs +4 -4
  215. package/esm2022/lib/services/growl/eui-growl.service.mjs +4 -4
  216. package/esm2022/lib/services/i18n/i18n.loader.mjs +16 -5
  217. package/esm2022/lib/services/i18n/i18n.resource.mjs +8 -3
  218. package/esm2022/lib/services/i18n/i18n.service.mjs +17 -19
  219. package/esm2022/lib/services/i18n/index.mjs +2 -2
  220. package/esm2022/lib/services/locale/locale.service.mjs +7 -5
  221. package/esm2022/lib/services/locale/locale.service.mock.mjs +4 -4
  222. package/esm2022/lib/services/log/log.module.mjs +5 -5
  223. package/esm2022/lib/services/log/log.service.mjs +4 -4
  224. package/esm2022/lib/services/log/log.service.mock.mjs +1 -1
  225. package/esm2022/lib/services/permission/permission.service.mjs +5 -5
  226. package/esm2022/lib/services/queue/api-queue.service.mjs +20 -8
  227. package/esm2022/lib/services/queue/api-queue.service.mock.mjs +5 -1
  228. package/esm2022/lib/services/storage/async-storage.service.mjs +1 -1
  229. package/esm2022/lib/services/storage/async-storage.service.mock.mjs +9 -1
  230. package/esm2022/lib/services/storage/local-forage.service.mjs +43 -18
  231. package/esm2022/lib/services/storage/local-storage.service.mjs +8 -4
  232. package/esm2022/lib/services/storage/session-storage.service.mjs +8 -4
  233. package/esm2022/lib/services/storage/storage.service.mjs +1 -1
  234. package/esm2022/lib/services/storage/storage.service.mock.mjs +1 -1
  235. package/esm2022/lib/services/store/actions/app.actions.mjs +3 -1
  236. package/esm2022/lib/services/store/actions/notifications.actions.mjs +3 -1
  237. package/esm2022/lib/services/store/actions/user.actions.mjs +3 -1
  238. package/esm2022/lib/services/store/effects/app.effects.mjs +4 -4
  239. package/esm2022/lib/services/store/reducers/app.reducers.mjs +2 -3
  240. package/esm2022/lib/services/store/reducers/core.reducers.mjs +3 -1
  241. package/esm2022/lib/services/store/reducers/i18n.reducers.mjs +2 -2
  242. package/esm2022/lib/services/store/reducers/locale.reducers.mjs +1 -1
  243. package/esm2022/lib/services/store/reducers/meta.reducers.mjs +4 -2
  244. package/esm2022/lib/services/store/reducers/notifications.reducers.mjs +2 -2
  245. package/esm2022/lib/services/store/reducers/user.reducers.mjs +2 -2
  246. package/esm2022/lib/services/store/store.service.mjs +14 -6
  247. package/esm2022/lib/services/store/store.service.mock.mjs +4 -4
  248. package/esm2022/lib/services/user/user.service.mjs +13 -7
  249. package/esm2022/lib/services/user/user.service.mock.mjs +11 -17
  250. package/fesm2022/eui-core.mjs +825 -591
  251. package/fesm2022/eui-core.mjs.map +1 -1
  252. package/lib/eui-core.module.d.ts +1 -1
  253. package/lib/eui-core.module.d.ts.map +1 -1
  254. package/lib/helpers/date-helpers.d.ts.map +1 -1
  255. package/lib/helpers/dom-helpers.d.ts +9 -7
  256. package/lib/helpers/dom-helpers.d.ts.map +1 -1
  257. package/lib/helpers/event-helpers.d.ts.map +1 -1
  258. package/lib/helpers/form-helpers.d.ts.map +1 -1
  259. package/lib/helpers/format-helpers.d.ts.map +1 -1
  260. package/lib/helpers/http-helpers.d.ts +2 -1
  261. package/lib/helpers/http-helpers.d.ts.map +1 -1
  262. package/lib/interceptors/add-lang-param.interceptor.d.ts +1 -1
  263. package/lib/interceptors/add-lang-param.interceptor.d.ts.map +1 -1
  264. package/lib/interceptors/cache-prevention.interceptor.d.ts +1 -1
  265. package/lib/interceptors/cache-prevention.interceptor.d.ts.map +1 -1
  266. package/lib/interceptors/cors-security.interceptor.d.ts +1 -1
  267. package/lib/interceptors/cors-security.interceptor.d.ts.map +1 -1
  268. package/lib/interceptors/csrf-prevention.interceptor.d.ts +1 -1
  269. package/lib/interceptors/csrf-prevention.interceptor.d.ts.map +1 -1
  270. package/lib/interceptors/eu-login-session-timeout-handling.interceptor.d.ts +1 -1
  271. package/lib/interceptors/eu-login-session-timeout-handling.interceptor.d.ts.map +1 -1
  272. package/lib/interceptors/openid/openid-connect.interceptor.d.ts.map +1 -1
  273. package/lib/interceptors/openid/openid-connect.service.d.ts.map +1 -1
  274. package/lib/interceptors/ux-request-error-model.interceptor.d.ts.map +1 -1
  275. package/lib/services/app/eui-init-app.d.ts +1 -1
  276. package/lib/services/app/eui-init-app.d.ts.map +1 -1
  277. package/lib/services/config/tokens.d.ts +2 -2
  278. package/lib/services/config/tokens.d.ts.map +1 -1
  279. package/lib/services/dynamic-component/dynamic-component.service.d.ts +3 -7
  280. package/lib/services/dynamic-component/dynamic-component.service.d.ts.map +1 -1
  281. package/lib/services/dynamic-menu/dynamic-menu.service.d.ts +6 -6
  282. package/lib/services/dynamic-menu/dynamic-menu.service.d.ts.map +1 -1
  283. package/lib/services/errors/eui.error.d.ts.map +1 -1
  284. package/lib/services/errors/global-error-handler.d.ts +1 -1
  285. package/lib/services/errors/global-error-handler.d.ts.map +1 -1
  286. package/lib/services/errors/http-error-handler-callback-functions.d.ts.map +1 -1
  287. package/lib/services/errors/http-error-handler.interceptor.d.ts.map +1 -1
  288. package/lib/services/eui-app-shell.service.d.ts +39 -10
  289. package/lib/services/eui-app-shell.service.d.ts.map +1 -1
  290. package/lib/services/i18n/i18n.loader.d.ts.map +1 -1
  291. package/lib/services/i18n/i18n.resource.d.ts +1 -1
  292. package/lib/services/i18n/i18n.resource.d.ts.map +1 -1
  293. package/lib/services/i18n/i18n.service.d.ts +4 -4
  294. package/lib/services/i18n/i18n.service.d.ts.map +1 -1
  295. package/lib/services/i18n/index.d.ts +0 -1
  296. package/lib/services/i18n/index.d.ts.map +1 -1
  297. package/lib/services/locale/locale.service.d.ts.map +1 -1
  298. package/lib/services/log/log.service.d.ts.map +1 -1
  299. package/lib/services/log/log.service.mock.d.ts.map +1 -1
  300. package/lib/services/permission/permission.service.d.ts.map +1 -1
  301. package/lib/services/queue/api-queue.service.d.ts +2 -2
  302. package/lib/services/queue/api-queue.service.d.ts.map +1 -1
  303. package/lib/services/queue/api-queue.service.mock.d.ts.map +1 -1
  304. package/lib/services/storage/async-storage.service.d.ts.map +1 -1
  305. package/lib/services/storage/async-storage.service.mock.d.ts.map +1 -1
  306. package/lib/services/storage/local-forage.service.d.ts +1 -1
  307. package/lib/services/storage/local-forage.service.d.ts.map +1 -1
  308. package/lib/services/storage/local-storage.service.d.ts.map +1 -1
  309. package/lib/services/storage/session-storage.service.d.ts.map +1 -1
  310. package/lib/services/storage/storage.service.d.ts.map +1 -1
  311. package/lib/services/storage/storage.service.mock.d.ts +1 -1
  312. package/lib/services/storage/storage.service.mock.d.ts.map +1 -1
  313. package/lib/services/store/actions/app.actions.d.ts.map +1 -1
  314. package/lib/services/store/actions/notifications.actions.d.ts.map +1 -1
  315. package/lib/services/store/actions/user.actions.d.ts.map +1 -1
  316. package/lib/services/store/reducers/app.reducers.d.ts.map +1 -1
  317. package/lib/services/store/reducers/core.reducers.d.ts.map +1 -1
  318. package/lib/services/store/reducers/meta.reducers.d.ts +2 -2
  319. package/lib/services/store/reducers/meta.reducers.d.ts.map +1 -1
  320. package/lib/services/store/reducers/user.reducers.d.ts.map +1 -1
  321. package/lib/services/store/store.service.d.ts +8 -8
  322. package/lib/services/store/store.service.d.ts.map +1 -1
  323. package/lib/services/store/store.service.mock.d.ts +2 -1
  324. package/lib/services/store/store.service.mock.d.ts.map +1 -1
  325. package/lib/services/user/user.service.d.ts +3 -3
  326. package/lib/services/user/user.service.d.ts.map +1 -1
  327. package/lib/services/user/user.service.mock.d.ts +10 -12
  328. package/lib/services/user/user.service.mock.d.ts.map +1 -1
  329. package/package.json +2 -2
  330. package/esm2022/lib/services/i18n/i18n.service.mock.mjs +0 -38
  331. package/lib/services/i18n/i18n.service.mock.d.ts +0 -20
  332. package/lib/services/i18n/i18n.service.mock.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';
2
2
  import { isPlatformBrowser } from '@angular/common';
3
- import { BehaviorSubject, defer } from 'rxjs';
3
+ import { BehaviorSubject, defer, firstValueFrom } from 'rxjs';
4
4
  import { EuiEuLanguages, getActiveLang } from '@eui/base';
5
5
  import { GLOBAL_CONFIG_TOKEN } from './config/tokens';
6
6
  import { NavigationEnd } from '@angular/router';
@@ -10,16 +10,13 @@ import get from 'lodash-es/get';
10
10
  import * as i0 from "@angular/core";
11
11
  import * as i1 from "@angular/common/http";
12
12
  import * as i2 from "@angular/router";
13
- import * as i3 from "./store/store.service";
13
+ import * as i3 from "./store";
14
14
  import * as i4 from "./i18n";
15
15
  const initialState = {
16
16
  appName: '',
17
17
  appShortName: '',
18
18
  appSubTitle: '',
19
19
  appBaseFontSize: '',
20
- userInfos: null,
21
- userSubInfos: null,
22
- impersonatedUserInfos: null,
23
20
  isSidebarOpen: true,
24
21
  isSidebarHover: false,
25
22
  isSidebarActive: false,
@@ -74,6 +71,8 @@ export class EuiAppShellService {
74
71
  get breakpoint$() {
75
72
  return this._breakpoint$.asObservable();
76
73
  }
74
+ // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
77
76
  get breakpoints$() {
78
77
  return this._breakpoints$.asObservable();
79
78
  }
@@ -156,6 +155,14 @@ export class EuiAppShellService {
156
155
  this.router = router;
157
156
  this.storeService = storeService;
158
157
  this.i18nService = i18nService;
158
+ /**
159
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
160
+ */
161
+ this.openModalId = new BehaviorSubject('');
162
+ /**
163
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
164
+ */
165
+ this.activeModals = [];
159
166
  this.cssVars = [];
160
167
  let stateWithConfig = initialState;
161
168
  const languages = config?.i18n?.i18nService?.languages || initialState.languages;
@@ -180,7 +187,7 @@ export class EuiAppShellService {
180
187
  }
181
188
  }
182
189
  setState(nextState, updateI18 = true) {
183
- let breakpoint, breakpoints, wrapperClasses;
190
+ let breakpoint, breakpoints;
184
191
  let combinedLinks;
185
192
  const state = this.state;
186
193
  // check if window width has been updated from previous state
@@ -196,7 +203,7 @@ export class EuiAppShellService {
196
203
  breakpoints = state.breakpoints;
197
204
  }
198
205
  // finally get the wrapper classes when both the state and breakpoint are known
199
- wrapperClasses = this.getWrapperClasses(nextState, breakpoint);
206
+ const wrapperClasses = this.getWrapperClasses(nextState, breakpoint);
200
207
  // check if the menuLinks or sidebarLinks have changed from previous state
201
208
  if (this.state.menuLinks !== nextState.menuLinks || this.state.sidebarLinks !== nextState.sidebarLinks) {
202
209
  combinedLinks = [...nextState.menuLinks, ...nextState.sidebarLinks];
@@ -223,6 +230,8 @@ export class EuiAppShellService {
223
230
  *
224
231
  * @param key can be 'key' or 'key.sub.sub'
225
232
  */
233
+ // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html
234
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
226
235
  getState(key) {
227
236
  return defer(() =>
228
237
  // check if key exists
@@ -404,8 +413,8 @@ export class EuiAppShellService {
404
413
  * Example for 50% width: calc(var(--eui-app-vw, 1vw) * 50);
405
414
  */
406
415
  setAppViewportCssVars() {
407
- let vh = window.innerHeight * 0.01;
408
- let vw = window.innerWidth * 0.01;
416
+ const vh = window.innerHeight * 0.01;
417
+ const vw = window.innerWidth * 0.01;
409
418
  this._setCssVarValue('--eui-app-vh', `${vh}px`);
410
419
  this._setCssVarValue('--eui-app-vw', `${vw}px`);
411
420
  }
@@ -425,6 +434,103 @@ export class EuiAppShellService {
425
434
  }, false);
426
435
  this._setCssVarValue('--eui-base-font-size', newsize);
427
436
  }
437
+ /**
438
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
439
+ */
440
+ openModal(modalId) {
441
+ document.body.classList.add('modal-open');
442
+ if (!modalId) {
443
+ modalId = 'single_modal';
444
+ }
445
+ this.activeModals.push({
446
+ id: modalId,
447
+ isOpen: true,
448
+ });
449
+ setTimeout(() => {
450
+ const el = document.getElementById(modalId + '-close-button');
451
+ if (el) {
452
+ el.focus();
453
+ }
454
+ }, 100);
455
+ }
456
+ /**
457
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
458
+ */
459
+ openMessageBox(messageBoxId) {
460
+ if (!messageBoxId) {
461
+ messageBoxId = 'messagebox_modal';
462
+ }
463
+ this.openModal(messageBoxId);
464
+ }
465
+ /**
466
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
467
+ */
468
+ closeMessageBox(messageBoxId) {
469
+ if (!messageBoxId) {
470
+ messageBoxId = 'messagebox_modal';
471
+ }
472
+ this.closeModal(messageBoxId);
473
+ }
474
+ /**
475
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
476
+ */
477
+ isModalOpen(modalId) {
478
+ if (!modalId) {
479
+ modalId = 'single_modal';
480
+ }
481
+ if (this.activeModals.length) {
482
+ const modalIndex = this.findModalIndex(modalId);
483
+ if (modalIndex !== -1) {
484
+ return this.activeModals[modalIndex].isOpen;
485
+ }
486
+ }
487
+ return false;
488
+ }
489
+ /**
490
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
491
+ */
492
+ closeModal(modalId) {
493
+ if (!modalId) {
494
+ modalId = 'single_modal';
495
+ }
496
+ /**
497
+ * Make sure we find the modal before splicing the activeModals array
498
+ */
499
+ const index = this.findModalIndex(modalId);
500
+ if (index >= 0) {
501
+ this.activeModals.splice(index, 1);
502
+ }
503
+ if (this.activeModals && this.activeModals.length <= 0) {
504
+ document.body.classList.remove('modal-open');
505
+ }
506
+ else {
507
+ // If there is still another (parent) modal dialog open, ensure it is focused upon to be able to close is with the ESC key:
508
+ const lastModalId = this.activeModals[this.activeModals.length - 1].id;
509
+ if (lastModalId) {
510
+ setTimeout(() => {
511
+ const el = document.getElementById(lastModalId + '-close-button');
512
+ if (el) {
513
+ el.focus();
514
+ }
515
+ }, 100);
516
+ }
517
+ }
518
+ }
519
+ /**
520
+ * @deprecated don't remove as it's used for external legacy project under v17 (csdr-eui-legacy) to support MWP transition
521
+ */
522
+ findModalIndex(modalId) {
523
+ let index = -1;
524
+ if (this.activeModals.length) {
525
+ for (let i = 0; i < this.activeModals.length; i++) {
526
+ if (this.activeModals[i].id === modalId) {
527
+ index = i;
528
+ break;
529
+ }
530
+ }
531
+ }
532
+ return index;
533
+ }
428
534
  // ---------------
429
535
  // private getters
430
536
  // ---------------
@@ -440,7 +546,7 @@ export class EuiAppShellService {
440
546
  document.documentElement.style.setProperty(varName, varValue);
441
547
  }
442
548
  getWrapperClasses(state, breakpoint) {
443
- let classes = [];
549
+ const classes = [];
444
550
  classes.push(breakpoint);
445
551
  if (state.hasSidebar) {
446
552
  if (state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
@@ -533,12 +639,14 @@ export class EuiAppShellService {
533
639
  };
534
640
  }
535
641
  getJson(url) {
536
- return this.http.get(url).toPromise().then(this.extractData).catch(this.handleError);
642
+ return firstValueFrom(this.http.get(url)).then(this.extractData).catch(this.handleError);
537
643
  }
538
644
  extractData(res) {
539
645
  const body = res;
540
646
  return body || {};
541
647
  }
648
+ // TODO: find the correct type or turn into a generic, https://www.typescriptlang.org/docs/handbook/2/generics.html
649
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
542
650
  handleError(error) {
543
651
  console.error('An error occurred', error);
544
652
  return Promise.reject(error.message || error);
@@ -553,10 +661,10 @@ export class EuiAppShellService {
553
661
  }
554
662
  });
555
663
  }
556
- /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-next.7", ngImport: i0, type: EuiAppShellService, deps: [{ token: GLOBAL_CONFIG_TOKEN, optional: true }, { token: i1.HttpClient }, { token: PLATFORM_ID }, { token: i2.Router }, { token: i3.StoreService }, { token: i4.I18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
557
- /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0-next.7", ngImport: i0, type: EuiAppShellService, providedIn: 'root' }); }
664
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: EuiAppShellService, deps: [{ token: GLOBAL_CONFIG_TOKEN, optional: true }, { token: i1.HttpClient }, { token: PLATFORM_ID }, { token: i2.Router }, { token: i3.StoreService }, { token: i4.I18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
665
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: EuiAppShellService, providedIn: 'root' }); }
558
666
  }
559
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-next.7", ngImport: i0, type: EuiAppShellService, decorators: [{
667
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.1", ngImport: i0, type: EuiAppShellService, decorators: [{
560
668
  type: Injectable,
561
669
  args: [{
562
670
  providedIn: 'root',
@@ -572,4 +680,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-next.7",
572
680
  }] }, { type: i2.Router }, { type: i3.StoreService }, { type: i4.I18nService, decorators: [{
573
681
  type: Optional
574
682
  }] }] });
575
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpLWFwcC1zaGVsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9ldWktYXBwLXNoZWxsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUMxRCxPQUFPLEVBQUUsY0FBYyxFQUFnQixhQUFhLEVBQTRCLE1BQU0sV0FBVyxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXRELE9BQU8sRUFBVSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDeEMsT0FBTyxHQUFHLE1BQU0sZUFBZSxDQUFDOzs7Ozs7QUFnRWhDLE1BQU0sWUFBWSxHQUFZO0lBQzFCLE9BQU8sRUFBRSxFQUFFO0lBQ1gsWUFBWSxFQUFFLEVBQUU7SUFDaEIsV0FBVyxFQUFFLEVBQUU7SUFDZixlQUFlLEVBQUUsRUFBRTtJQUNuQixTQUFTLEVBQUUsSUFBSTtJQUNmLFlBQVksRUFBRSxJQUFJO0lBQ2xCLHFCQUFxQixFQUFFLElBQUk7SUFDM0IsYUFBYSxFQUFFLElBQUk7SUFDbkIsY0FBYyxFQUFFLEtBQUs7SUFDckIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsb0JBQW9CLEVBQUUsS0FBSztJQUMzQiw0QkFBNEIsRUFBRSxLQUFLO0lBQ25DLHNCQUFzQixFQUFFLElBQUk7SUFDNUIsVUFBVSxFQUFF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LENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDN0QsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLENBQ1Q7b0JBQ0ksR0FBRyxJQUFJLENBQUMsS0FBSztvQkFDYixjQUFjLEVBQUUsVUFBVTtpQkFDN0IsRUFDRCxLQUFLLENBQ1IsQ0FBQzthQUNMO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO3dJQTVqQlEsa0JBQWtCLGtCQStHSCxtQkFBbUIsdURBRS9CLFdBQVc7NElBakhkLGtCQUFrQixjQUZmLE1BQU07O2tHQUVULGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQWdIUSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1CQUFtQjs7MEJBRXRDLE1BQU07MkJBQUMsV0FBVzs7MEJBR2xCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsLCBQTEFURk9STV9JRCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGVmZXIsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEV1aUV1TGFuZ3VhZ2VzLCBHbG9iYWxDb25maWcsIGdldEFjdGl2ZUxhbmcsIEV1aUxhbmd1YWdlLCBFdWlNZW51SXRlbSB9IGZyb20gJ0BldWkvYmFzZSc7XG5pbXBvcnQgeyBHTE9CQUxfQ09ORklHX1RPS0VOIH0gZnJvbSAnLi9jb25maWcvdG9rZW5zJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkVuZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JlL3N0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC1lcy9pc0VxdWFsJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoLWVzL2dldCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVUlTdGF0ZSB7XG4gICAgLy8gYXBwIHN0YXRlXG4gICAgYXBwTmFtZT86IHN0cmluZztcbiAgICBhcHBTaG9ydE5hbWU/OiBzdHJpbmc7XG4gICAgYXBwU3ViVGl0bGU/OiBzdHJpbmc7XG4gICAgYXBwQmFzZUZvbnRTaXplPzogc3RyaW5nO1xuXG4gICAgLy8gdXNlciBzdGF0ZVxuICAgIHVzZXJJbmZvcz86IHN0cmluZztcbiAgICB1c2VyU3ViSW5mb3M/OiBzdHJpbmc7XG4gICAgaW1wZXJzb25hdGVkVXNlckluZm9zPzogc3RyaW5nO1xuXG4gICAgLy8gU2lkZWJhciBzdGF0ZVxuICAgIGlzU2lkZWJhck9wZW4/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhckhvdmVyPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJBY3RpdmU/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhcklubmVyQWN0aXZlPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJTdGF0ZUNsb3NlV2l0aEljb25zPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJFeHBhbmRPbkhvdmVyPzogYm9vbGVhbjtcbiAgICBoYXNTaWRlYmFyPzogYm9vbGVhbjtcbiAgICBoYXNCcmVhZGNydW1iPzogYm9vbGVhbjtcbiAgICBoYXNIZWFkZXI/OiBib29sZWFuO1xuICAgIGhhc0hlYWRlckxvZ28/OiBib29sZWFuO1xuICAgIGhhc0hlYWRlckVudmlyb25tZW50PzogYm9vbGVhbjtcbiAgICBoYXNUb29sYmFyPzogYm9vbGVhbjtcbiAgICBoYXNUb29sYmFyTWVudT86IGJvb2xlYW47XG4gICAgZW52aXJvbm1lbnRWYWx1ZT86IHN0cmluZztcbiAgICBpc1NpZGViYXJIaWRkZW4/OiBib29sZWFuO1xuICAgIGhhc1RvcE1lc3NhZ2U/OiBib29sZWFuO1xuXG4gICAgLy8gd2luZG93IHN0YXRlXG4gICAgd2luZG93V2lkdGg/OiBudW1iZXI7XG4gICAgd2luZG93SGVpZ2h0PzogbnVtYmVyO1xuICAgIG1haW5Db250ZW50SGVpZ2h0PzogbnVtYmVyO1xuICAgIHBhZ2VIZWFkZXJIZWlnaHQ/OiBudW1iZXI7XG4gICAgYnJlYWtwb2ludD86IHN0cmluZztcbiAgICB3cmFwcGVyQ2xhc3Nlcz86IHN0cmluZztcbiAgICBicmVha3BvaW50cz86IGFueTtcblxuICAgIC8vIG5hdmlnYXRpb24gc3RhdGVcbiAgICBtZW51TGlua3M/OiBFdWlNZW51SXRlbVtdO1xuICAgIHNpZGViYXJMaW5rcz86IEV1aU1lbnVJdGVtW107XG4gICAgY29tYmluZWRMaW5rcz86IEV1aU1lbnVJdGVtW107XG5cbiAgICAvLyBvdGhlciBzdGF0ZXNcbiAgICBpc0Jsb2NrRG9jdW1lbnRBY3RpdmU/OiBib29sZWFuO1xuXG4gICAgLy8gZGV2aWNlIGluZm9cbiAgICBkZXZpY2VJbmZvOiBhbnk7XG5cbiAgICAvLyBsYW5ndWFnZSBpbmZvc1xuICAgIGFjdGl2ZUxhbmd1YWdlOiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VzOiAoc3RyaW5nIHwgRXVpTGFuZ3VhZ2UpW107XG5cbiAgICAvLyBhcHAgbWV0YWRhdGFcbiAgICBhcHBNZXRhZGF0YTogYW55O1xuXG4gICAgLy8gdmFyaW91cyBkeW5hbWljIHN0YXRlXG4gICAgaGFzTW9kYWxBY3RpdmU/OiBib29sZWFuO1xuICAgIGlzRGltbWVyQWN0aXZlPzogYm9vbGVhbjsgLy8gVXNhZ2U6IG1hcCB0byBldWkgYmFzZSBkaXJlY3RpdmUgaW5wdXQgY29lcmNlIGV1aUhpZ2hsaWdodGVkXG59XG5cbmNvbnN0IGluaXRpYWxTdGF0ZTogVUlTdGF0ZSA9IHtcbiAgICBhcHBOYW1lOiAnJyxcbiAgICBhcHBTaG9ydE5hbWU6ICcnLFxuICAgIGFwcFN1YlRpdGxlOiAnJyxcbiAgICBhcHBCYXNlRm9udFNpemU6ICcnLFxuICAgIHVzZXJJbmZvczogbnVsbCxcbiAgICB1c2VyU3ViSW5mb3M6IG51bGwsXG4gICAgaW1wZXJzb25hdGVkVXNlckluZm9zOiBudWxsLFxuICAgIGlzU2lkZWJhck9wZW46IHRydWUsXG4gICAgaXNTaWRlYmFySG92ZXI6IGZhbHNlLFxuICAgIGlzU2lkZWJhckFjdGl2ZTogZmFsc2UsXG4gICAgaXNTaWRlYmFySW5uZXJBY3RpdmU6IGZhbHNlLFxuICAgIGlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnM6IGZhbHNlLFxuICAgIGlzU2lkZWJhckV4cGFuZE9uSG92ZXI6IHRydWUsXG4gICAgaGFzU2lkZWJhcjogZmFsc2UsXG4gICAgaGFzSGVhZGVyOiBmYWxzZSxcbiAgICBoYXNCcmVhZGNydW1iOiBmYWxzZSxcbiAgICBoYXNIZWFkZXJMb2dvOiBmYWxzZSxcbiAgICBoYXNIZWFkZXJFbnZpcm9ubWVudDogZmFsc2UsXG4gICAgaGFzVG9vbGJhcjogZmFsc2UsXG4gICAgaGFzVG9vbGJhck1lbnU6IGZhbHNlLFxuICAgIGVudmlyb25tZW50VmFsdWU6ICcnLFxuICAgIGlzU2lkZWJhckhpZGRlbjogZmFsc2UsXG4gICAgaGFzVG9wTWVzc2FnZTogZmFsc2UsXG4gICAgd2luZG93V2lkdGg6IDAsXG4gICAgd2luZG93SGVpZ2h0OiAwLFxuICAgIG1haW5Db250ZW50SGVpZ2h0OiAwLFxuICAgIHBhZ2VIZWFkZXJIZWlnaHQ6IDAsXG4gICAgd3JhcHBlckNsYXNzZXM6ICcnLFxuICAgIGJyZWFrcG9pbnQ6ICcnLFxuICAgIGJyZWFrcG9pbnRzOiB7XG4gICAgICAgIGlzTW9iaWxlOiBmYWxzZSxcbiAgICAgICAgaXNUYWJsZXQ6IGZhbHNlLFxuICAgICAgICBpc0x0RGVza3RvcDogZmFsc2UsXG4gICAgICAgIGlzRGVza3RvcDogZmFsc2UsXG4gICAgICAgIGlzWEw6IGZhbHNlLFxuICAgICAgICBpc1hYTDogZmFsc2UsXG4gICAgICAgIGlzRkhEOiBmYWxzZSxcbiAgICAgICAgaXMySzogZmFsc2UsXG4gICAgICAgIGlzNEs6IGZhbHNlLFxuICAgIH0sXG4gICAgbWVudUxpbmtzOiBbXSxcbiAgICBzaWRlYmFyTGlua3M6IFtdLFxuICAgIGNvbWJpbmVkTGlua3M6IFtdLFxuICAgIGlzQmxvY2tEb2N1bWVudEFjdGl2ZTogZmFsc2UsXG4gICAgZGV2aWNlSW5mbzogbnVsbCxcbiAgICBhY3RpdmVMYW5ndWFnZTogJ2VuJyxcbiAgICBsYW5ndWFnZXM6IEV1aUV1TGFuZ3VhZ2VzLmdldExhbmd1YWdlcygpLFxuICAgIGFwcE1ldGFkYXRhOiBudWxsLFxuICAgIGhhc01vZGFsQWN0aXZlOiBmYWxzZSxcbiAgICBpc0RpbW1lckFjdGl2ZTogZmFsc2UsXG59O1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBFdWlBcHBTaGVsbFNlcnZpY2Uge1xuICAgIG5hdmlnYXRpb25TdGFydEN1c3RvbUhhbmRsZXI6ICgpID0+IHZvaWQ7XG4gICAgbmF2aWdhdGlvbkVuZEN1c3RvbUhhbmRsZXI6ICgpID0+IHZvaWQ7XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgZ2V0IHN0YXRlJCgpOiBPYnNlcnZhYmxlPFVJU3RhdGU+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gZXhwb3NlZCBvYnNlcnZhYmxlc1xuXG4gICAgZ2V0IGJyZWFrcG9pbnQkKCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9icmVha3BvaW50JC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBnZXQgYnJlYWtwb2ludHMkKCk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9icmVha3BvaW50cyQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHN0YXRlIG9wZXJhdGlvbnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tXG4gICAgZ2V0IHN0YXRlKCk6IFVJU3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUkLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHB1YmxpYyBzZXR0ZXJzIGFuZCBmdW5jdGlvbnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgc2V0IGlzU2lkZWJhck9wZW4oaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhck9wZW46IGlzT3BlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGlzU2lkZWJhck9wZW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmlzU2lkZWJhck9wZW47XG4gICAgfVxuXG4gICAgc2V0IGlzU2lkZWJhckhvdmVyKGlzSG92ZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTaWRlYmFyRXhwYW5kT25Ib3Zlcikge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICBpc1NpZGViYXJIb3ZlcjogaXNIb3ZlcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGlzU2lkZWJhckhvdmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pc1NpZGViYXJIb3ZlcjtcbiAgICB9XG5cbiAgICBzZXQgaXNTaWRlYmFyQWN0aXZlKGlzQWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhckFjdGl2ZTogaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBpc1NpZGViYXJJbm5lckFjdGl2ZShpc09wZW46IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNTaWRlYmFySW5uZXJBY3RpdmU6IGlzT3BlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0IHNpZGViYXJMaW5rcyhsaW5rczogRXVpTWVudUl0ZW1bXSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBzaWRlYmFyTGlua3M6IGxpbmtzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgbWVudUxpbmtzKGxpbmtzOiBFdWlNZW51SXRlbVtdKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIG1lbnVMaW5rczogbGlua3MsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBpc0Jsb2NrRG9jdW1lbnRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc0hlYWRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaGFzSGVhZGVyO1xuICAgIH1cblxuICAgIC8vIEVkaXQgbW9kZVxuICAgIGdldCBpc0RpbW1lckFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNEaW1tZXJBY3RpdmU7XG4gICAgfVxuXG4gICAgc2V0IGlzRGltbWVyQWN0aXZlKGlzQWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzRGltbWVyQWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjc3NWYXJzID0gW107XG4gICAgcHJpdmF0ZSBfc3RhdGUkOiBCZWhhdmlvclN1YmplY3Q8VUlTdGF0ZT47XG4gICAgcHJpdmF0ZSBfYnJlYWtwb2ludCQ6IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+O1xuICAgIHByaXZhdGUgX2JyZWFrcG9pbnRzJDogQmVoYXZpb3JTdWJqZWN0PGFueT47XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChHTE9CQUxfQ09ORklHX1RPS0VOKSBwcm90ZWN0ZWQgY29uZmlnOiBHbG9iYWxDb25maWcsXG4gICAgICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBvYmplY3QsXG4gICAgICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIHByaXZhdGUgc3RvcmVTZXJ2aWNlOiBTdG9yZVNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIHByaXZhdGUgaTE4blNlcnZpY2U6IEkxOG5TZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIGxldCBzdGF0ZVdpdGhDb25maWcgPSBpbml0aWFsU3RhdGU7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlcyA9IGNvbmZpZz8uaTE4bj8uaTE4blNlcnZpY2U/Lmxhbmd1YWdlcyB8fCBpbml0aWFsU3RhdGUubGFuZ3VhZ2VzO1xuICAgICAgICBjb25zdCBkZWZhdWx0TGFuZ3VhZ2UgPSBjb25maWc/LmkxOG4/LmkxOG5TZXJ2aWNlPy5kZWZhdWx0TGFuZ3VhZ2UgfHwgaW5pdGlhbFN0YXRlLmFjdGl2ZUxhbmd1YWdlO1xuICAgICAgICBzdGF0ZVdpdGhDb25maWcgPSB7XG4gICAgICAgICAgICAuLi5zdGF0ZVdpdGhDb25maWcsXG4gICAgICAgICAgICAuLi57XG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2VzLFxuICAgICAgICAgICAgICAgIGFjdGl2ZUxhbmd1YWdlOiBkZWZhdWx0TGFuZ3VhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9zdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHN0YXRlV2l0aENvbmZpZyk7XG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnQkID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJyk7XG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Qoe30pO1xuICAgICAgICB0aGlzLmJpbmRBY3RpdmVMYW5ndWFnZVRvQXBwU2hlbGxTdGF0ZSgpO1xuXG4gICAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG4gICAgICAgICAgICByb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNldFN0YXRlKG5leHRTdGF0ZTogVUlTdGF0ZSwgdXBkYXRlSTE4ID0gdHJ1ZSkge1xuICAgICAgICBsZXQgYnJlYWtwb2ludCwgYnJlYWtwb2ludHMsIHdyYXBwZXJDbGFzc2VzO1xuICAgICAgICBsZXQgY29tYmluZWRMaW5rcztcblxuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgd2luZG93IHdpZHRoIGhhcyBiZWVuIHVwZGF0ZWQgZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS53aW5kb3dXaWR0aCAhPT0gbmV4dFN0YXRlLndpbmRvd1dpZHRoKSB7XG4gICAgICAgICAgICBicmVha3BvaW50ID0gdGhpcy5nZXRCcmVha3BvaW50KG5leHRTdGF0ZS53aW5kb3dXaWR0aCk7XG4gICAgICAgICAgICBicmVha3BvaW50cyA9IHRoaXMuZ2V0QnJlYWtwb2ludHMoYnJlYWtwb2ludCk7XG5cbiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnQkLm5leHQoYnJlYWtwb2ludCk7XG4gICAgICAgICAgICB0aGlzLl9icmVha3BvaW50cyQubmV4dChicmVha3BvaW50cyk7XG5cbiAgICAgICAgICAgIC8vIGlmIG5vdCBwcm9wYWdhdGUgdGhlIG9sZCBvbmVzIHdpdGhvdXQgZG9pbmcgYW55IGNhbGN1bGF0aW9uc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYnJlYWtwb2ludCA9IHN0YXRlLmJyZWFrcG9pbnQ7XG4gICAgICAgICAgICBicmVha3BvaW50cyA9IHN0YXRlLmJyZWFrcG9pbnRzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSBnZXQgdGhlIHdyYXBwZXIgY2xhc3NlcyB3aGVuIGJvdGggdGhlIHN0YXRlIGFuZCBicmVha3BvaW50IGFyZSBrbm93blxuICAgICAgICB3cmFwcGVyQ2xhc3NlcyA9IHRoaXMuZ2V0V3JhcHBlckNsYXNzZXMobmV4dFN0YXRlLCBicmVha3BvaW50KTtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgbWVudUxpbmtzIG9yIHNpZGViYXJMaW5rcyBoYXZlIGNoYW5nZWQgZnJvbSBwcmV2aW91cyBzdGF0ZVxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5tZW51TGlua3MgIT09IG5leHRTdGF0ZS5tZW51TGlua3MgfHwgdGhpcy5zdGF0ZS5zaWRlYmFyTGlua3MgIT09IG5leHRTdGF0ZS5zaWRlYmFyTGlua3MpIHtcbiAgICAgICAgICAgIGNvbWJpbmVkTGlua3MgPSBbLi4ubmV4dFN0YXRlLm1lbnVMaW5rcywgLi4ubmV4dFN0YXRlLnNpZGViYXJMaW5rc107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb21iaW5lZExpbmtzID0gdGhpcy5zdGF0ZS5jb21iaW5lZExpbmtzO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RhdGVCZWZvcmVVcGRhdGUgPSB7IC4uLnRoaXMuc3RhdGUgfTtcblxuICAgICAgICAvLyB3ZSBwdXQgaXQgYWxsIHRvZ2V0aGVyIHdpdGggdGhlIGNhbGN1bGF0ZWQgcHJvcGVydGllc1xuICAgICAgICB0aGlzLl9zdGF0ZSQubmV4dCh7XG4gICAgICAgICAgICAuLi5uZXh0U3RhdGUsXG4gICAgICAgICAgICB3cmFwcGVyQ2xhc3NlcyxcbiAgICAgICAgICAgIGJyZWFrcG9pbnQsXG4gICAgICAgICAgICBicmVha3BvaW50cyxcbiAgICAgICAgICAgIGNvbWJpbmVkTGlua3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgU3RvcmUgTGFuZ3VhZ2VcbiAgICAgICAgaWYgKHVwZGF0ZUkxOCAmJiBuZXh0U3RhdGUuYWN0aXZlTGFuZ3VhZ2UgIT09IHN0YXRlQmVmb3JlVXBkYXRlLmFjdGl2ZUxhbmd1YWdlKSB7XG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnVwZGF0ZVN0YXRlKHsgYWN0aXZlTGFuZzogbmV4dFN0YXRlLmFjdGl2ZUxhbmd1YWdlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBzbGljZSBmcm9tIHRoZSBzdGF0ZSB3aGV0aGVyIHRoYXQgY2hhbmdlc1xuICAgICAqXG4gICAgICogQHBhcmFtIGtleSBjYW4gYmUgJ2tleScgb3IgJ2tleS5zdWIuc3ViJ1xuICAgICAqL1xuICAgIGdldFN0YXRlKGtleT86IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIHJldHVybiBkZWZlcigoKSA9PlxuICAgICAgICAgICAgLy8gY2hlY2sgaWYga2V5IGV4aXN0c1xuICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0YXRlJC5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgIG1hcCgoc3RhdGUpID0+IGdldChzdGF0ZSwga2V5KSksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyKChzdGF0ZSkgPT4gc3RhdGUpLFxuICAgICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCh4LCB5KSA9PiBpc0VxdWFsKHgsIHkpKVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogdGhpcy5zdGF0ZSRcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2lkZWJhclRvZ2dsZSgpIHtcbiAgICAgICAgdGhpcy5pc1NpZGViYXJPcGVuID0gIXRoaXMuc3RhdGUuaXNTaWRlYmFyT3BlbjtcbiAgICB9XG5cbiAgICAvLyBFZGl0IG1vZGVcbiAgICBwdWJsaWMgZGltbWVyQWN0aXZlVG9nZ2xlKCkge1xuICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuaXNEaW1tZXJBY3RpdmU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzRGltbWVyQWN0aXZlOiAhaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRWRpdE1vZGVDc3NWYXJzKCFpc0FjdGl2ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpbW1lckFjdGl2ZVN0YXRlKGFjdGl2ZVN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzRGltbWVyQWN0aXZlOiBhY3RpdmVTdGF0ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVFZGl0TW9kZUNzc1ZhcnMoYWN0aXZlU3RhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUVkaXRNb2RlQ3NzVmFycyhpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS1kb2NwYWdlLW5hdmlnYXRpb24tei1pbmRleCcsICdpbmhlcml0Jyk7IC8vIFJlc2V0IGRvYy1wYWdlLW5hdmlnYXRpb24tY29sdW1uIHotaW5kZXhcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS16LWluZGV4LXNpZGViYXInLCAnaW5oZXJpdCcpOyAvLyBSZXNldCBldWktYXBwLXNpZGViYXIgei1pbmRleFxuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLXotaW5kZXgtcm9vdCcsICdpbmhlcml0Jyk7IC8vIFJlc2V0IGV1aS1hcHAtbWFpbi1jb250ZW50IHotaW5kZXhcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS1kb2NwYWdlLW5hdmlnYXRpb24tei1pbmRleCcsICcyJyk7IC8vIFJlc3RvcmUgZG9jLXBhZ2UtbmF2aWdhdGlvbi1jb2x1bW4gei1pbmRleFxuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLXotaW5kZXgtc2lkZWJhcicsICcxMDQ0Jyk7IC8vIFJlc3RvcmUgZXVpLWFwcC1zaWRlYmFyIHotaW5kZXhcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS16LWluZGV4LXJvb3QnLCAnMScpOyAvLyBSZXN0b3JlIGV1aS1hcHAtbWFpbi1jb250ZW50IHotaW5kZXhcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgLy8gcHVibGljIG1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyBmZXRjaEFwcE1ldGFkYXRhKG1ldGFkYXRhRmlsZVBhdGggPSAnYXNzZXRzL2FwcC1tZXRhZGF0YS5qc29uJykge1xuICAgICAgICB0aGlzLmdldEpzb24obWV0YWRhdGFGaWxlUGF0aCkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICBhcHBNZXRhZGF0YTogZGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyKCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNTaWRlYmFyOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuaXNTaWRlYmFySGlkZGVuKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlU2lkZWJhckNzc1ZhcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJIZWFkZXIoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVTaWRlYmFySGVhZGVyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJGb290ZXIoKSB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVTaWRlYmFyRm9vdGVyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUhlYWRlcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzSGVhZGVyOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUhlYWRlckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVCcmVhZGNydW1iKCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNCcmVhZGNydW1iOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUJyZWFkY3J1bWJDc3NWYXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9wTWVzc2FnZShoZWlnaHQ6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNUb3BNZXNzYWdlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVRvcE1lc3NhZ2VDc3NWYXJzKGhlaWdodCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9vbGJhcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzVG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVUb29sYmFyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVRvb2xiYXJNZW51KCkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNUb29sYmFyTWVudTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZldGNoQ3NzVmFycygpIHtcbiAgICAgICAgY29uc3QgY3NzVmFyTmFtZXMgPSBbXG4gICAgICAgICAgICAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1zaHJpbmsnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodC1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtYnJlYWRjcnVtYi1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9wLW1lc3NhZ2UtaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9wLW1lc3NhZ2UtaGVpZ2h0LXNocmluaycsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNzc1ZhcnMgPSBjc3NWYXJOYW1lcy5tYXAoKHYpID0+ICh7IGtleTogdiwgdmFsdWU6IHRoaXMuZ2V0Q3NzVmFyVmFsdWUodikgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0Q3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXRvcC1tZXNzYWdlLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci13aWR0aCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZScpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlSGVhZGVyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodCcpO1xuICAgIH1cbiAgICBwdWJsaWMgYWN0aXZhdGVCcmVhZGNydW1iQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWJyZWFkY3J1bWItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9wTWVzc2FnZUNzc1ZhcnMoaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVUb29sYmFyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlRm9vdGVyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1mb290ZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtZm9vdGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRIZWFkZXJTaHJpbmtDc3NWYXIoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1zaHJpbmsnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJDc3NWYXJzKCkge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoJyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1hY3RpdmUnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlU2lkZWJhckNzc1ZhcnMoKSB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodCcpO1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQnKTtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLWV1aS1hcHAtc2lkZWJhci13aWR0aCcpO1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhckhlYWRlckNzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhckZvb3RlckNzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmlld3BvcnQgaGVpZ2h0IGFuZCB3aWR0aCBhbmQgbXVsdGlwbGUgaXQgYnkgMSUgdG8gZ2V0IGEgdmFsdWUgZm9yIGEgdmgvdncgdW5pdFxuICAgICAqIFNldHMgdGhlIHZhbHVlIGluIHRoZSAtLWV1aS1hcHAtdmggY3VzdG9tIHByb3BlcnR5IHRvIHRoZSByb290IG9mIHRoZSBkb2N1bWVudFxuICAgICAqIFNldHMgdGhlIHZhbHVlIGluIHRoZSAtLWV1aS1hcHAtdncgY3VzdG9tIHByb3BlcnR5IHRvIHRoZSByb290IG9mIHRoZSBkb2N1bWVudFxuICAgICAqIEV4YW1wbGUgZm9yIDEwMCUgaGVpZ2h0OiBjYWxjKHZhcigtLWV1aS1hcHAtdmgsIDF2aCkgKiAxMDApO1xuICAgICAqIEV4YW1wbGUgZm9yIDUwJSBoZWlnaHQ6IGNhbGModmFyKC0tZXVpLWFwcC12aCwgMXZoKSAqIDUwKTtcbiAgICAgKiBFeGFtcGxlIGZvciA1MCUgd2lkdGg6IGNhbGModmFyKC0tZXVpLWFwcC12dywgMXZ3KSAqIDUwKTtcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0QXBwVmlld3BvcnRDc3NWYXJzKCkge1xuICAgICAgICBsZXQgdmggPSB3aW5kb3cuaW5uZXJIZWlnaHQgKiAwLjAxO1xuICAgICAgICBsZXQgdncgPSB3aW5kb3cuaW5uZXJXaWR0aCAqIDAuMDE7XG4gICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS1hcHAtdmgnLCBgJHt2aH1weGApO1xuICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktYXBwLXZ3JywgYCR7dnd9cHhgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIC0tZXVpLWJhc2UtZm9udC1zaXplIENTUyB2YXJpYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCYXNlRm9udFNpemUoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYXBwQmFzZUZvbnRTaXplIHx8IHRoaXMuZ2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWJhc2UtZm9udC1zaXplJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiAtLWV1aS1iYXNlLWZvbnQtc2l6ZSBDU1MgdmFyaWFibGUgYW5kIHRoZSBVSVN0YXRlIGFwcEJhc2VGb250U2l6ZVxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRCYXNlRm9udFNpemUobmV3c2l6ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICBhcHBCYXNlRm9udFNpemU6IG5ld3NpemUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWJhc2UtZm9udC1zaXplJywgbmV3c2l6ZSk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gcHJpdmF0ZSBnZXR0ZXJzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgcHJpdmF0ZSBnZXRDc3NWYXJWYWx1ZShpbnB1dFByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShpbnB1dFByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENzc1ZhcihpbnB1dFByb3BlcnR5LCBvdXRwdXRQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBjc3NWYXJWYWx1ZSA9IHRoaXMuY3NzVmFycy5maWx0ZXIoKHYpID0+IHYua2V5ID09PSBpbnB1dFByb3BlcnR5KVswXS52YWx1ZTtcbiAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUob3V0cHV0UHJvcGVydHksIGNzc1ZhclZhbHVlKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaW5wdXRQcm9wZXJ0eSwgb3V0cHV0UHJvcGVydHksIGNzc1ZhclZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDc3NWYXJWYWx1ZSh2YXJOYW1lLCB2YXJWYWx1ZSkge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkodmFyTmFtZSwgdmFyVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V3JhcHBlckNsYXNzZXMoc3RhdGU6IFVJU3RhdGUsIGJyZWFrcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGNsYXNzZXMucHVzaChicmVha3BvaW50KTtcblxuICAgICAgICBpZiAoc3RhdGUuaGFzU2lkZWJhcikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhck9wZW4gJiYgKHN0YXRlLmlzU2lkZWJhckFjdGl2ZSB8fCBzdGF0ZS5pc1NpZGViYXJJbm5lckFjdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtb3BlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdGF0ZS5pc1NpZGViYXJPcGVuICYmIChzdGF0ZS5pc1NpZGViYXJBY3RpdmUgfHwgc3RhdGUuaXNTaWRlYmFySW5uZXJBY3RpdmUpKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLXN0YXRlLWNsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFyQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhcklubmVyQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLWlubmVyLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnMpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtY2xvc2Utd2l0aC1pY29ucycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBORVcgQVBQLVNIRUxMIHByb3BzXG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFySGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1oaWRkZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJPcGVuKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1vcGVuJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0tY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJIb3Zlcikge1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0taG92ZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzRkYpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnZmYnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzSUUpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzSUUxMSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpZTExJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmRldmljZUluZm8gJiYgc3RhdGUuZGV2aWNlSW5mby5pc0Nocm9tZSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdjaHJvbWUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCcmVha3BvaW50KHdpbmRvd1dpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYmtwID0gJyc7XG5cbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDAgJiYgd2luZG93V2lkdGggPCA1NzY6XG4gICAgICAgICAgICAgICAgYmtwID0gJ3hzJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gNTc2ICYmIHdpbmRvd1dpZHRoIDwgNzY4OlxuICAgICAgICAgICAgICAgIGJrcCA9ICdzbSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDc2OCAmJiB3aW5kb3dXaWR0aCA8IDk5MjpcbiAgICAgICAgICAgICAgICBia3AgPSAnbWQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSA5OTIgJiYgd2luZG93V2lkdGggPCAxMjAwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICdsZyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDEyMDAgJiYgd2luZG93V2lkdGggPCAxNDAwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICd4bCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDE0MDAgJiYgd2luZG93V2lkdGggPCAxOTIwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICd4eGwnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSAxOTIwICYmIHdpbmRvd1dpZHRoIDwgMjU2MDpcbiAgICAgICAgICAgICAgICBia3AgPSAnZmhkJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMjU2MCAmJiB3aW5kb3dXaWR0aCA8IDM4NDA6XG4gICAgICAgICAgICAgICAgYmtwID0gJzJrJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMzg0MDpcbiAgICAgICAgICAgICAgICBia3AgPSAnNGsnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBia3A7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCcmVha3BvaW50cyhia3A6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc01vYmlsZTogYmtwID09PSAneHMnIHx8IGJrcCA9PT0gJ3NtJyxcbiAgICAgICAgICAgIGlzVGFibGV0OiBia3AgPT09ICdtZCcsXG4gICAgICAgICAgICBpc0x0RGVza3RvcDogYmtwID09PSAneHMnIHx8IGJrcCA9PT0gJ3NtJyB8fCBia3AgPT09ICdtZCcsXG4gICAgICAgICAgICBpc0Rlc2t0b3A6IGJrcCA9PT0gJ2xnJyxcbiAgICAgICAgICAgIGlzWEw6IGJrcCA9PT0gJ3hsJyxcbiAgICAgICAgICAgIGlzWFhMOiBia3AgPT09ICd4eGwnLFxuICAgICAgICAgICAgaXNGSEQ6IGJrcCA9PT0gJ2ZoZCcsXG4gICAgICAgICAgICBpczJLOiBia3AgPT09ICcyaycsXG4gICAgICAgICAgICBpczRLOiBia3AgPT09ICc0aycsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRKc29uKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKS50b1Byb21pc2UoKS50aGVuKHRoaXMuZXh0cmFjdERhdGEpLmNhdGNoKHRoaXMuaGFuZGxlRXJyb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXh0cmFjdERhdGEocmVzOiBSZXNwb25zZSkge1xuICAgICAgICBjb25zdCBib2R5ID0gcmVzO1xuICAgICAgICByZXR1cm4gYm9keSB8fCB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCcsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZEFjdGl2ZUxhbmd1YWdlVG9BcHBTaGVsbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0b3JlU2VydmljZS5zZWxlY3QoZ2V0QWN0aXZlTGFuZykuc3Vic2NyaWJlKChhY3RpdmVMYW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlTGFuZyAhPT0gdGhpcy5zdGF0ZS5hY3RpdmVMYW5ndWFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMYW5ndWFnZTogYWN0aXZlTGFuZyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
683
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVpLWFwcC1zaGVsbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zZXJ2aWNlcy9ldWktYXBwLXNoZWxsLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsYUFBYSxFQUEyQyxNQUFNLFdBQVcsQ0FBQztBQUNqSCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQVUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQ3hDLE9BQU8sR0FBRyxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBNkRoQyxNQUFNLFlBQVksR0FBWTtJQUMxQixPQUFPLEVBQUUsRUFBRTtJQUNYLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsZUFBZSxFQUFFLEVBQUU7SUFFbkIsYUFBYSxFQUFFLElBQUk7SUFDbkIsY0FBYyxFQUFFLEtBQUs7SUFDckIsZUFBZSxFQUFFLEtBQUs7SUFDdEIsb0JBQW9CLEVBQUUsS0FBSztJQUMzQiw0QkFBNEIsRUFBRSxLQUFLO0lBQ25DLHNCQUFzQixFQUFFLElBQUk7SUFDNUIsVUFBVSxFQUFFLEtBQUs7SUFDakIsU0FBUyxFQUFFLEtBQUs7SUFDaEIsYUFBYSxFQUFFLEtBQUs7SUFDcEIs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X0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkZWZlciwgZmlyc3RWYWx1ZUZyb20sIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEV1aUV1TGFuZ3VhZ2VzLCBHbG9iYWxDb25maWcsIGdldEFjdGl2ZUxhbmcsIEV1aUxhbmd1YWdlLCBFdWlNZW51SXRlbSwgVXhNb2RhbExlZ2FjeSB9IGZyb20gJ0BldWkvYmFzZSc7XG5pbXBvcnQgeyBHTE9CQUxfQ09ORklHX1RPS0VOIH0gZnJvbSAnLi9jb25maWcvdG9rZW5zJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkVuZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gtZXMvaXNFcXVhbCc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC1lcy9nZXQnO1xuXG4vLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGludGVyZmFjZSBVSVN0YXRlPEJQID0gYW55LCBESSA9IGFueSwgQU1EID1hbnk+IHtcbiAgICAvLyBhcHAgc3RhdGVcbiAgICBhcHBOYW1lPzogc3RyaW5nO1xuICAgIGFwcFNob3J0TmFtZT86IHN0cmluZztcbiAgICBhcHBTdWJUaXRsZT86IHN0cmluZztcbiAgICBhcHBCYXNlRm9udFNpemU/OiBzdHJpbmc7XG5cbiAgICAvLyBTaWRlYmFyIHN0YXRlXG4gICAgaXNTaWRlYmFyT3Blbj86IGJvb2xlYW47XG4gICAgaXNTaWRlYmFySG92ZXI/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhckFjdGl2ZT86IGJvb2xlYW47XG4gICAgaXNTaWRlYmFySW5uZXJBY3RpdmU/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnM/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhckV4cGFuZE9uSG92ZXI/OiBib29sZWFuO1xuICAgIGhhc1NpZGViYXI/OiBib29sZWFuO1xuICAgIGhhc0JyZWFkY3J1bWI/OiBib29sZWFuO1xuICAgIGhhc0hlYWRlcj86IGJvb2xlYW47XG4gICAgaGFzSGVhZGVyTG9nbz86IGJvb2xlYW47XG4gICAgaGFzSGVhZGVyRW52aXJvbm1lbnQ/OiBib29sZWFuO1xuICAgIGhhc1Rvb2xiYXI/OiBib29sZWFuO1xuICAgIGhhc1Rvb2xiYXJNZW51PzogYm9vbGVhbjtcbiAgICBlbnZpcm9ubWVudFZhbHVlPzogc3RyaW5nO1xuICAgIGlzU2lkZWJhckhpZGRlbj86IGJvb2xlYW47XG4gICAgaGFzVG9wTWVzc2FnZT86IGJvb2xlYW47XG5cbiAgICAvLyB3aW5kb3cgc3RhdGVcbiAgICB3aW5kb3dXaWR0aD86IG51bWJlcjtcbiAgICB3aW5kb3dIZWlnaHQ/OiBudW1iZXI7XG4gICAgbWFpbkNvbnRlbnRIZWlnaHQ/OiBudW1iZXI7XG4gICAgcGFnZUhlYWRlckhlaWdodD86IG51bWJlcjtcbiAgICBicmVha3BvaW50Pzogc3RyaW5nO1xuICAgIHdyYXBwZXJDbGFzc2VzPzogc3RyaW5nO1xuICAgIGJyZWFrcG9pbnRzPzogQlA7XG5cbiAgICAvLyBuYXZpZ2F0aW9uIHN0YXRlXG4gICAgbWVudUxpbmtzPzogRXVpTWVudUl0ZW1bXTtcbiAgICBzaWRlYmFyTGlua3M/OiBFdWlNZW51SXRlbVtdO1xuICAgIGNvbWJpbmVkTGlua3M/OiBFdWlNZW51SXRlbVtdO1xuXG4gICAgLy8gb3RoZXIgc3RhdGVzXG4gICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlPzogYm9vbGVhbjtcblxuICAgIC8vIGRldmljZSBpbmZvXG4gICAgZGV2aWNlSW5mbzogREk7XG5cbiAgICAvLyBsYW5ndWFnZSBpbmZvc1xuICAgIGFjdGl2ZUxhbmd1YWdlOiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VzOiAoc3RyaW5nIHwgRXVpTGFuZ3VhZ2UpW107XG5cbiAgICAvLyBhcHAgbWV0YWRhdGFcbiAgICBhcHBNZXRhZGF0YTogQU1EO1xuXG4gICAgLy8gdmFyaW91cyBkeW5hbWljIHN0YXRlXG4gICAgaGFzTW9kYWxBY3RpdmU/OiBib29sZWFuO1xuICAgIGlzRGltbWVyQWN0aXZlPzogYm9vbGVhbjsgLy8gVXNhZ2U6IG1hcCB0byBldWkgYmFzZSBkaXJlY3RpdmUgaW5wdXQgY29lcmNlIGV1aUhpZ2hsaWdodGVkXG59XG5cbmNvbnN0IGluaXRpYWxTdGF0ZTogVUlTdGF0ZSA9IHtcbiAgICBhcHBOYW1lOiAnJyxcbiAgICBhcHBTaG9ydE5hbWU6ICcnLFxuICAgIGFwcFN1YlRpdGxlOiAnJyxcbiAgICBhcHBCYXNlRm9udFNpemU6ICcnLFxuXG4gICAgaXNTaWRlYmFyT3BlbjogdHJ1ZSxcbiAgICBpc1NpZGViYXJIb3ZlcjogZmFsc2UsXG4gICAgaXNTaWRlYmFyQWN0aXZlOiBmYWxzZSxcbiAgICBpc1NpZGViYXJJbm5lckFjdGl2ZTogZmFsc2UsXG4gICAgaXNTaWRlYmFyU3RhdGVDbG9zZVdpdGhJY29uczogZmFsc2UsXG4gICAgaXNTaWRlYmFyRXhwYW5kT25Ib3ZlcjogdHJ1ZSxcbiAgICBoYXNTaWRlYmFyOiBmYWxzZSxcbiAgICBoYXNIZWFkZXI6IGZhbHNlLFxuICAgIGhhc0JyZWFkY3J1bWI6IGZhbHNlLFxuICAgIGhhc0hlYWRlckxvZ286IGZhbHNlLFxuICAgIGhhc0hlYWRlckVudmlyb25tZW50OiBmYWxzZSxcbiAgICBoYXNUb29sYmFyOiBmYWxzZSxcbiAgICBoYXNUb29sYmFyTWVudTogZmFsc2UsXG4gICAgZW52aXJvbm1lbnRWYWx1ZTogJycsXG4gICAgaXNTaWRlYmFySGlkZGVuOiBmYWxzZSxcbiAgICBoYXNUb3BNZXNzYWdlOiBmYWxzZSxcbiAgICB3aW5kb3dXaWR0aDogMCxcbiAgICB3aW5kb3dIZWlnaHQ6IDAsXG4gICAgbWFpbkNvbnRlbnRIZWlnaHQ6IDAsXG4gICAgcGFnZUhlYWRlckhlaWdodDogMCxcbiAgICB3cmFwcGVyQ2xhc3NlczogJycsXG4gICAgYnJlYWtwb2ludDogJycsXG4gICAgYnJlYWtwb2ludHM6IHtcbiAgICAgICAgaXNNb2JpbGU6IGZhbHNlLFxuICAgICAgICBpc1RhYmxldDogZmFsc2UsXG4gICAgICAgIGlzTHREZXNrdG9wOiBmYWxzZSxcbiAgICAgICAgaXNEZXNrdG9wOiBmYWxzZSxcbiAgICAgICAgaXNYTDogZmFsc2UsXG4gICAgICAgIGlzWFhMOiBmYWxzZSxcbiAgICAgICAgaXNGSEQ6IGZhbHNlLFxuICAgICAgICBpczJLOiBmYWxzZSxcbiAgICAgICAgaXM0SzogZmFsc2UsXG4gICAgfSxcbiAgICBtZW51TGlua3M6IFtdLFxuICAgIHNpZGViYXJMaW5rczogW10sXG4gICAgY29tYmluZWRMaW5rczogW10sXG4gICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlOiBmYWxzZSxcbiAgICBkZXZpY2VJbmZvOiBudWxsLFxuICAgIGFjdGl2ZUxhbmd1YWdlOiAnZW4nLFxuICAgIGxhbmd1YWdlczogRXVpRXVMYW5ndWFnZXMuZ2V0TGFuZ3VhZ2VzKCksXG4gICAgYXBwTWV0YWRhdGE6IG51bGwsXG4gICAgaGFzTW9kYWxBY3RpdmU6IGZhbHNlLFxuICAgIGlzRGltbWVyQWN0aXZlOiBmYWxzZSxcbn07XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEV1aUFwcFNoZWxsU2VydmljZSB7XG4gICAgbmF2aWdhdGlvblN0YXJ0Q3VzdG9tSGFuZGxlcjogKCkgPT4gdm9pZDtcbiAgICBuYXZpZ2F0aW9uRW5kQ3VzdG9tSGFuZGxlcjogKCkgPT4gdm9pZDtcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGRvbid0IHJlbW92ZSBhcyBpdCdzIHVzZWQgZm9yIGV4dGVybmFsIGxlZ2FjeSBwcm9qZWN0IHVuZGVyIHYxNyAoY3Nkci1ldWktbGVnYWN5KSB0byBzdXBwb3J0IE1XUCB0cmFuc2l0aW9uXG4gICAgICovXG4gICAgb3Blbk1vZGFsSWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgZG9uJ3QgcmVtb3ZlIGFzIGl0J3MgdXNlZCBmb3IgZXh0ZXJuYWwgbGVnYWN5IHByb2plY3QgdW5kZXIgdjE3IChjc2RyLWV1aS1sZWdhY3kpIHRvIHN1cHBvcnQgTVdQIHRyYW5zaXRpb25cbiAgICAgKi9cbiAgICBhY3RpdmVNb2RhbHM6IFV4TW9kYWxMZWdhY3lbXSA9IFtdO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGdldCBzdGF0ZSQoKTogT2JzZXJ2YWJsZTxVSVN0YXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGV4cG9zZWQgb2JzZXJ2YWJsZXNcblxuICAgIGdldCBicmVha3BvaW50JCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJlYWtwb2ludCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogZmluZCB0aGUgY29ycmVjdCB0eXBlIG9yIHR1cm4gaW50byBhIGdlbmVyaWMsIGh0dHBzOi8vd3d3LnR5cGVzY3JpcHRsYW5nLm9yZy9kb2NzL2hhbmRib29rLzIvZ2VuZXJpY3MuaHRtbFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgZ2V0IGJyZWFrcG9pbnRzJCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJlYWtwb2ludHMkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBzdGF0ZSBvcGVyYXRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLVxuICAgIGdldCBzdGF0ZSgpOiBVSVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBwdWJsaWMgc2V0dGVycyBhbmQgZnVuY3Rpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHNldCBpc1NpZGViYXJPcGVuKGlzT3BlbjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc1NpZGViYXJPcGVuOiBpc09wZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpc1NpZGViYXJPcGVuKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pc1NpZGViYXJPcGVuO1xuICAgIH1cblxuICAgIHNldCBpc1NpZGViYXJIb3Zlcihpc0hvdmVyOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmlzU2lkZWJhckV4cGFuZE9uSG92ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgaXNTaWRlYmFySG92ZXI6IGlzSG92ZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpc1NpZGViYXJIb3ZlcigpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNTaWRlYmFySG92ZXI7XG4gICAgfVxuXG4gICAgc2V0IGlzU2lkZWJhckFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc1NpZGViYXJBY3RpdmU6IGlzQWN0aXZlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgaXNTaWRlYmFySW5uZXJBY3RpdmUoaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhcklubmVyQWN0aXZlOiBpc09wZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBzaWRlYmFyTGlua3MobGlua3M6IEV1aU1lbnVJdGVtW10pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgc2lkZWJhckxpbmtzOiBsaW5rcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0IG1lbnVMaW5rcyhsaW5rczogRXVpTWVudUl0ZW1bXSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBtZW51TGlua3M6IGxpbmtzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgaXNCbG9ja0RvY3VtZW50QWN0aXZlKGlzQWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzQmxvY2tEb2N1bWVudEFjdGl2ZTogaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBoYXNIZWFkZXIoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmhhc0hlYWRlcjtcbiAgICB9XG5cbiAgICAvLyBFZGl0IG1vZGVcbiAgICBnZXQgaXNEaW1tZXJBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmlzRGltbWVyQWN0aXZlO1xuICAgIH1cblxuICAgIHNldCBpc0RpbW1lckFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc0RpbW1lckFjdGl2ZTogaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3NzVmFycyA9IFtdO1xuICAgIHByaXZhdGUgX3N0YXRlJDogQmVoYXZpb3JTdWJqZWN0PFVJU3RhdGU+O1xuICAgIHByaXZhdGUgX2JyZWFrcG9pbnQkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPjtcbiAgICAvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcml2YXRlIF9icmVha3BvaW50cyQ6IEJlaGF2aW9yU3ViamVjdDxhbnk+O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoR0xPQkFMX0NPTkZJR19UT0tFTikgcHJvdGVjdGVkIGNvbmZpZzogR2xvYmFsQ29uZmlnLFxuICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogb2JqZWN0LFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHN0b3JlU2VydmljZTogU3RvcmVTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgbGV0IHN0YXRlV2l0aENvbmZpZyA9IGluaXRpYWxTdGF0ZTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VzID0gY29uZmlnPy5pMThuPy5pMThuU2VydmljZT8ubGFuZ3VhZ2VzIHx8IGluaXRpYWxTdGF0ZS5sYW5ndWFnZXM7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRMYW5ndWFnZSA9IGNvbmZpZz8uaTE4bj8uaTE4blNlcnZpY2U/LmRlZmF1bHRMYW5ndWFnZSB8fCBpbml0aWFsU3RhdGUuYWN0aXZlTGFuZ3VhZ2U7XG4gICAgICAgIHN0YXRlV2l0aENvbmZpZyA9IHtcbiAgICAgICAgICAgIC4uLnN0YXRlV2l0aENvbmZpZyxcbiAgICAgICAgICAgIC4uLntcbiAgICAgICAgICAgICAgICBsYW5ndWFnZXMsXG4gICAgICAgICAgICAgICAgYWN0aXZlTGFuZ3VhZ2U6IGRlZmF1bHRMYW5ndWFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuX3N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Qoc3RhdGVXaXRoQ29uZmlnKTtcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KCcnKTtcbiAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7fSk7XG4gICAgICAgIHRoaXMuYmluZEFjdGl2ZUxhbmd1YWdlVG9BcHBTaGVsbFN0YXRlKCk7XG5cbiAgICAgICAgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHtcbiAgICAgICAgICAgIHJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3RhdGUobmV4dFN0YXRlOiBVSVN0YXRlLCB1cGRhdGVJMTggPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGxldCBicmVha3BvaW50LCBicmVha3BvaW50cztcbiAgICAgICAgbGV0IGNvbWJpbmVkTGlua3M7XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHdpbmRvdyB3aWR0aCBoYXMgYmVlbiB1cGRhdGVkIGZyb20gcHJldmlvdXMgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUud2luZG93V2lkdGggIT09IG5leHRTdGF0ZS53aW5kb3dXaWR0aCkge1xuICAgICAgICAgICAgYnJlYWtwb2ludCA9IHRoaXMuZ2V0QnJlYWtwb2ludChuZXh0U3RhdGUud2luZG93V2lkdGgpO1xuICAgICAgICAgICAgYnJlYWtwb2ludHMgPSB0aGlzLmdldEJyZWFrcG9pbnRzKGJyZWFrcG9pbnQpO1xuXG4gICAgICAgICAgICB0aGlzLl9icmVha3BvaW50JC5uZXh0KGJyZWFrcG9pbnQpO1xuICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMkLm5leHQoYnJlYWtwb2ludHMpO1xuXG4gICAgICAgICAgICAvLyBpZiBub3QgcHJvcGFnYXRlIHRoZSBvbGQgb25lcyB3aXRob3V0IGRvaW5nIGFueSBjYWxjdWxhdGlvbnNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrcG9pbnQgPSBzdGF0ZS5icmVha3BvaW50O1xuICAgICAgICAgICAgYnJlYWtwb2ludHMgPSBzdGF0ZS5icmVha3BvaW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmFsbHkgZ2V0IHRoZSB3cmFwcGVyIGNsYXNzZXMgd2hlbiBib3RoIHRoZSBzdGF0ZSBhbmQgYnJlYWtwb2ludCBhcmUga25vd25cbiAgICAgICAgY29uc3Qgd3JhcHBlckNsYXNzZXMgPSB0aGlzLmdldFdyYXBwZXJDbGFzc2VzKG5leHRTdGF0ZSwgYnJlYWtwb2ludCk7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIG1lbnVMaW5rcyBvciBzaWRlYmFyTGlua3MgaGF2ZSBjaGFuZ2VkIGZyb20gcHJldmlvdXMgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUubWVudUxpbmtzICE9PSBuZXh0U3RhdGUubWVudUxpbmtzIHx8IHRoaXMuc3RhdGUuc2lkZWJhckxpbmtzICE9PSBuZXh0U3RhdGUuc2lkZWJhckxpbmtzKSB7XG4gICAgICAgICAgICBjb21iaW5lZExpbmtzID0gWy4uLm5leHRTdGF0ZS5tZW51TGlua3MsIC4uLm5leHRTdGF0ZS5zaWRlYmFyTGlua3NdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tYmluZWRMaW5rcyA9IHRoaXMuc3RhdGUuY29tYmluZWRMaW5rcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXRlQmVmb3JlVXBkYXRlID0geyAuLi50aGlzLnN0YXRlIH07XG5cbiAgICAgICAgLy8gd2UgcHV0IGl0IGFsbCB0b2dldGhlciB3aXRoIHRoZSBjYWxjdWxhdGVkIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy5fc3RhdGUkLm5leHQoe1xuICAgICAgICAgICAgLi4ubmV4dFN0YXRlLFxuICAgICAgICAgICAgd3JhcHBlckNsYXNzZXMsXG4gICAgICAgICAgICBicmVha3BvaW50LFxuICAgICAgICAgICAgYnJlYWtwb2ludHMsXG4gICAgICAgICAgICBjb21iaW5lZExpbmtzLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyB1cGRhdGUgdGhlIFN0b3JlIExhbmd1YWdlXG4gICAgICAgIGlmICh1cGRhdGVJMTggJiYgbmV4dFN0YXRlLmFjdGl2ZUxhbmd1YWdlICE9PSBzdGF0ZUJlZm9yZVVwZGF0ZS5hY3RpdmVMYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS51cGRhdGVTdGF0ZSh7IGFjdGl2ZUxhbmc6IG5leHRTdGF0ZS5hY3RpdmVMYW5ndWFnZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGEgc2xpY2UgZnJvbSB0aGUgc3RhdGUgd2hldGhlciB0aGF0IGNoYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgY2FuIGJlICdrZXknIG9yICdrZXkuc3ViLnN1YidcbiAgICAgKi9cbiAgICAvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBnZXRTdGF0ZShrZXk/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGtleSBleGlzdHNcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgID8gdGhpcy5zdGF0ZSQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICBtYXAoKHN0YXRlKSA9PiBnZXQoc3RhdGUsIGtleSkpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlcigoc3RhdGUpID0+IHN0YXRlKSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoeCwgeSkgPT4gaXNFcXVhbCh4LCB5KSksXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiB0aGlzLnN0YXRlJCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2lkZWJhclRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1NpZGViYXJPcGVuID0gIXRoaXMuc3RhdGUuaXNTaWRlYmFyT3BlbjtcbiAgICB9XG5cbiAgICAvLyBFZGl0IG1vZGVcbiAgICBwdWJsaWMgZGltbWVyQWN0aXZlVG9nZ2xlKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuaXNEaW1tZXJBY3RpdmU7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzRGltbWVyQWN0aXZlOiAhaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRWRpdE1vZGVDc3NWYXJzKCFpc0FjdGl2ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpbW1lckFjdGl2ZVN0YXRlKGFjdGl2ZVN0YXRlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzRGltbWVyQWN0aXZlOiBhY3RpdmVTdGF0ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVFZGl0TW9kZUNzc1ZhcnMoYWN0aXZlU3RhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUVkaXRNb2RlQ3NzVmFycyhpc0FjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoaXNBY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS1kb2NwYWdlLW5hdmlnYXRpb24tei1pbmRleCcsICdpbmhlcml0Jyk7IC8vIFJlc2V0IGRvYy1wYWdlLW5hdmlnYXRpb24tY29sdW1uIHotaW5kZXhcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS16LWluZGV4LXNpZGViYXInLCAnaW5oZXJpdCcpOyAvLyBSZXNldCBldWktYXBwLXNpZGViYXIgei1pbmRleFxuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLXotaW5kZXgtcm9vdCcsICdpbmhlcml0Jyk7IC8vIFJlc2V0IGV1aS1hcHAtbWFpbi1jb250ZW50IHotaW5kZXhcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS1kb2NwYWdlLW5hdmlnYXRpb24tei1pbmRleCcsICcyJyk7IC8vIFJlc3RvcmUgZG9jLXBhZ2UtbmF2aWdhdGlvbi1jb2x1bW4gei1pbmRleFxuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLXotaW5kZXgtc2lkZWJhcicsICcxMDQ0Jyk7IC8vIFJlc3RvcmUgZXVpLWFwcC1zaWRlYmFyIHotaW5kZXhcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS16LWluZGV4LXJvb3QnLCAnMScpOyAvLyBSZXN0b3JlIGV1aS1hcHAtbWFpbi1jb250ZW50IHotaW5kZXhcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgLy8gcHVibGljIG1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyBmZXRjaEFwcE1ldGFkYXRhKG1ldGFkYXRhRmlsZVBhdGggPSAnYXNzZXRzL2FwcC1tZXRhZGF0YS5qc29uJyk6IHZvaWQge1xuICAgICAgICB0aGlzLmdldEpzb24obWV0YWRhdGFGaWxlUGF0aCkudGhlbigoZGF0YSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICBhcHBNZXRhZGF0YTogZGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNTaWRlYmFyOiB0cnVlLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuaXNTaWRlYmFySGlkZGVuKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2YXRlU2lkZWJhckNzc1ZhcnMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJIZWFkZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVTaWRlYmFySGVhZGVyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJGb290ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVTaWRlYmFyRm9vdGVyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUhlYWRlcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzSGVhZGVyOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUhlYWRlckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVCcmVhZGNydW1iKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNCcmVhZGNydW1iOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUJyZWFkY3J1bWJDc3NWYXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9wTWVzc2FnZShoZWlnaHQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNUb3BNZXNzYWdlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZVRvcE1lc3NhZ2VDc3NWYXJzKGhlaWdodCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9vbGJhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzVG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVUb29sYmFyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVRvb2xiYXJNZW51KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBoYXNUb29sYmFyTWVudTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGZldGNoQ3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3NzVmFyTmFtZXMgPSBbXG4gICAgICAgICAgICAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1zaHJpbmsnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodC1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtYnJlYWRjcnVtYi1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9wLW1lc3NhZ2UtaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9wLW1lc3NhZ2UtaGVpZ2h0LXNocmluaycsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNzc1ZhcnMgPSBjc3NWYXJOYW1lcy5tYXAoKHYpID0+ICh7IGtleTogdiwgdmFsdWU6IHRoaXMuZ2V0Q3NzVmFyVmFsdWUodikgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0Q3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXRvcC1tZXNzYWdlLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci13aWR0aCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZScpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlSGVhZGVyQ3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtaGVhZGVyLWhlaWdodCcpO1xuICAgIH1cbiAgICBwdWJsaWMgYWN0aXZhdGVCcmVhZGNydW1iQ3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWJyZWFkY3J1bWItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9wTWVzc2FnZUNzc1ZhcnMoaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQnLCBgJHtoZWlnaHR9cHhgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVUb29sYmFyQ3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlRm9vdGVyQ3NzVmFycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1mb290ZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtZm9vdGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRIZWFkZXJTaHJpbmtDc3NWYXIoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1zaHJpbmsnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJDc3NWYXJzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoJyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1hY3RpdmUnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVtb3ZlU2lkZWJhckNzc1ZhcnMoKTogdm9pZCB7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodCcpO1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQnKTtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLWV1aS1hcHAtc2lkZWJhci13aWR0aCcpO1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhckhlYWRlckNzc1ZhcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhckZvb3RlckNzc1ZhcnMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdmlld3BvcnQgaGVpZ2h0IGFuZCB3aWR0aCBhbmQgbXVsdGlwbGUgaXQgYnkgMSUgdG8gZ2V0IGEgdmFsdWUgZm9yIGEgdmgvdncgdW5pdFxuICAgICAqIFNldHMgdGhlIHZhbHVlIGluIHRoZSAtLWV1aS1hcHAtdmggY3VzdG9tIHByb3BlcnR5IHRvIHRoZSByb290IG9mIHRoZSBkb2N1bWVudFxuICAgICAqIFNldHMgdGhlIHZhbHVlIGluIHRoZSAtLWV1aS1hcHAtdncgY3VzdG9tIHByb3BlcnR5IHRvIHRoZSByb290IG9mIHRoZSBkb2N1bWVudFxuICAgICAqIEV4YW1wbGUgZm9yIDEwMCUgaGVpZ2h0OiBjYWxjKHZhcigtLWV1aS1hcHAtdmgsIDF2aCkgKiAxMDApO1xuICAgICAqIEV4YW1wbGUgZm9yIDUwJSBoZWlnaHQ6IGNhbGModmFyKC0tZXVpLWFwcC12aCwgMXZoKSAqIDUwKTtcbiAgICAgKiBFeGFtcGxlIGZvciA1MCUgd2lkdGg6IGNhbGModmFyKC0tZXVpLWFwcC12dywgMXZ3KSAqIDUwKTtcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0QXBwVmlld3BvcnRDc3NWYXJzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2aCA9IHdpbmRvdy5pbm5lckhlaWdodCAqIDAuMDE7XG4gICAgICAgIGNvbnN0IHZ3ID0gd2luZG93LmlubmVyV2lkdGggKiAwLjAxO1xuICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktYXBwLXZoJywgYCR7dmh9cHhgKTtcbiAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWFwcC12dycsIGAke3Z3fXB4YCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiAtLWV1aS1iYXNlLWZvbnQtc2l6ZSBDU1MgdmFyaWFibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QmFzZUZvbnRTaXplKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFwcEJhc2VGb250U2l6ZSB8fCB0aGlzLmdldENzc1ZhclZhbHVlKCctLWV1aS1iYXNlLWZvbnQtc2l6ZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgLS1ldWktYmFzZS1mb250LXNpemUgQ1NTIHZhcmlhYmxlIGFuZCB0aGUgVUlTdGF0ZSBhcHBCYXNlRm9udFNpemVcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0QmFzZUZvbnRTaXplKG5ld3NpemU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0YXRlKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgYXBwQmFzZUZvbnRTaXplOiBuZXdzaXplLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktYmFzZS1mb250LXNpemUnLCBuZXdzaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBkb24ndCByZW1vdmUgYXMgaXQncyB1c2VkIGZvciBleHRlcm5hbCBsZWdhY3kgcHJvamVjdCB1bmRlciB2MTcgKGNzZHItZXVpLWxlZ2FjeSkgdG8gc3VwcG9ydCBNV1AgdHJhbnNpdGlvblxuICAgICAqL1xuICAgIG9wZW5Nb2RhbChtb2RhbElkPzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnbW9kYWwtb3BlbicpO1xuICAgICAgICBpZiAoIW1vZGFsSWQpIHtcbiAgICAgICAgICAgIG1vZGFsSWQgPSAnc2luZ2xlX21vZGFsJztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlTW9kYWxzLnB1c2goe1xuICAgICAgICAgICAgaWQ6IG1vZGFsSWQsXG4gICAgICAgICAgICBpc09wZW46IHRydWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtb2RhbElkICsgJy1jbG9zZS1idXR0b24nKTtcbiAgICAgICAgICAgIGlmIChlbCkge1xuICAgICAgICAgICAgICAgIGVsLmZvY3VzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgZG9uJ3QgcmVtb3ZlIGFzIGl0J3MgdXNlZCBmb3IgZXh0ZXJuYWwgbGVnYWN5IHByb2plY3QgdW5kZXIgdjE3IChjc2RyLWV1aS1sZWdhY3kpIHRvIHN1cHBvcnQgTVdQIHRyYW5zaXRpb25cbiAgICAgKi9cbiAgICBvcGVuTWVzc2FnZUJveChtZXNzYWdlQm94SWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlQm94SWQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VCb3hJZCA9ICdtZXNzYWdlYm94X21vZGFsJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5Nb2RhbChtZXNzYWdlQm94SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGRvbid0IHJlbW92ZSBhcyBpdCdzIHVzZWQgZm9yIGV4dGVybmFsIGxlZ2FjeSBwcm9qZWN0IHVuZGVyIHYxNyAoY3Nkci1ldWktbGVnYWN5KSB0byBzdXBwb3J0IE1XUCB0cmFuc2l0aW9uXG4gICAgICovXG4gICAgY2xvc2VNZXNzYWdlQm94KG1lc3NhZ2VCb3hJZD86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIW1lc3NhZ2VCb3hJZCkge1xuICAgICAgICAgICAgbWVzc2FnZUJveElkID0gJ21lc3NhZ2Vib3hfbW9kYWwnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY2xvc2VNb2RhbChtZXNzYWdlQm94SWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGRvbid0IHJlbW92ZSBhcyBpdCdzIHVzZWQgZm9yIGV4dGVybmFsIGxlZ2FjeSBwcm9qZWN0IHVuZGVyIHYxNyAoY3Nkci1ldWktbGVnYWN5KSB0byBzdXBwb3J0IE1XUCB0cmFuc2l0aW9uXG4gICAgICovXG4gICAgaXNNb2RhbE9wZW4obW9kYWxJZD86IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW1vZGFsSWQpIHtcbiAgICAgICAgICAgIG1vZGFsSWQgPSAnc2luZ2xlX21vZGFsJztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY3RpdmVNb2RhbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBtb2RhbEluZGV4OiBudW1iZXIgPSB0aGlzLmZpbmRNb2RhbEluZGV4KG1vZGFsSWQpO1xuICAgICAgICAgICAgaWYgKG1vZGFsSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlTW9kYWxzW21vZGFsSW5kZXhdLmlzT3BlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgZG9uJ3QgcmVtb3ZlIGFzIGl0J3MgdXNlZCBmb3IgZXh0ZXJuYWwgbGVnYWN5IHByb2plY3QgdW5kZXIgdjE3IChjc2RyLWV1aS1sZWdhY3kpIHRvIHN1cHBvcnQgTVdQIHRyYW5zaXRpb25cbiAgICAgKi9cbiAgICBjbG9zZU1vZGFsKG1vZGFsSWQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFtb2RhbElkKSB7XG4gICAgICAgICAgICBtb2RhbElkID0gJ3NpbmdsZV9tb2RhbCc7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFrZSBzdXJlIHdlIGZpbmQgdGhlIG1vZGFsIGJlZm9yZSBzcGxpY2luZyB0aGUgYWN0aXZlTW9kYWxzIGFycmF5XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZmluZE1vZGFsSW5kZXgobW9kYWxJZCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGl2ZU1vZGFscy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlTW9kYWxzICYmIHRoaXMuYWN0aXZlTW9kYWxzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ21vZGFsLW9wZW4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIHN0aWxsIGFub3RoZXIgKHBhcmVudCkgbW9kYWwgZGlhbG9nIG9wZW4sIGVuc3VyZSBpdCBpcyBmb2N1c2VkIHVwb24gdG8gYmUgYWJsZSB0byBjbG9zZSBpcyB3aXRoIHRoZSBFU0Mga2V5OlxuICAgICAgICAgICAgY29uc3QgbGFzdE1vZGFsSWQgPSB0aGlzLmFjdGl2ZU1vZGFsc1t0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGggLSAxXS5pZDtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kYWxJZCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhc3RNb2RhbElkICsgJy1jbG9zZS1idXR0b24nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIGRvbid0IHJlbW92ZSBhcyBpdCdzIHVzZWQgZm9yIGV4dGVybmFsIGxlZ2FjeSBwcm9qZWN0IHVuZGVyIHYxNyAoY3Nkci1ldWktbGVnYWN5KSB0byBzdXBwb3J0IE1XUCB0cmFuc2l0aW9uXG4gICAgICovXG4gICAgZmluZE1vZGFsSW5kZXgobW9kYWxJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGluZGV4ID0gLTE7XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZlTW9kYWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZU1vZGFsc1tpXS5pZCA9PT0gbW9kYWxJZCkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBwcml2YXRlIGdldHRlcnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS1cbiAgICBwcml2YXRlIGdldENzc1ZhclZhbHVlKGlucHV0UHJvcGVydHkpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoaW5wdXRQcm9wZXJ0eSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRDc3NWYXIoaW5wdXRQcm9wZXJ0eSwgb3V0cHV0UHJvcGVydHkpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3NzVmFyVmFsdWUgPSB0aGlzLmNzc1ZhcnMuZmlsdGVyKCh2KSA9PiB2LmtleSA9PT0gaW5wdXRQcm9wZXJ0eSlbMF0udmFsdWU7XG4gICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKG91dHB1dFByb3BlcnR5LCBjc3NWYXJWYWx1ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGlucHV0UHJvcGVydHksIG91dHB1dFByb3BlcnR5LCBjc3NWYXJWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Q3NzVmFyVmFsdWUodmFyTmFtZSwgdmFyVmFsdWUpOiB2b2lkIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHZhck5hbWUsIHZhclZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdyYXBwZXJDbGFzc2VzKHN0YXRlOiBVSVN0YXRlLCBicmVha3BvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGNsYXNzZXMucHVzaChicmVha3BvaW50KTtcblxuICAgICAgICBpZiAoc3RhdGUuaGFzU2lkZWJhcikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhck9wZW4gJiYgKHN0YXRlLmlzU2lkZWJhckFjdGl2ZSB8fCBzdGF0ZS5pc1NpZGViYXJJbm5lckFjdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtb3BlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdGF0ZS5pc1NpZGViYXJPcGVuICYmIChzdGF0ZS5pc1NpZGViYXJBY3RpdmUgfHwgc3RhdGUuaXNTaWRlYmFySW5uZXJBY3RpdmUpKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLXN0YXRlLWNsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFyQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhcklubmVyQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLWlubmVyLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnMpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtY2xvc2Utd2l0aC1pY29ucycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBORVcgQVBQLVNIRUxMIHByb3BzXG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFySGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1oaWRkZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJPcGVuKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1vcGVuJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0tY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJIb3Zlcikge1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0taG92ZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzRkYpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnZmYnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzSUUpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzSUUxMSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpZTExJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmRldmljZUluZm8gJiYgc3RhdGUuZGV2aWNlSW5mby5pc0Nocm9tZSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdjaHJvbWUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCcmVha3BvaW50KHdpbmRvd1dpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYmtwID0gJyc7XG5cbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDAgJiYgd2luZG93V2lkdGggPCA1NzY6XG4gICAgICAgICAgICAgICAgYmtwID0gJ3hzJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gNTc2ICYmIHdpbmRvd1dpZHRoIDwgNzY4OlxuICAgICAgICAgICAgICAgIGJrcCA9ICdzbSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDc2OCAmJiB3aW5kb3dXaWR0aCA8IDk5MjpcbiAgICAgICAgICAgICAgICBia3AgPSAnbWQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSA5OTIgJiYgd2luZG93V2lkdGggPCAxMjAwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICdsZyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDEyMDAgJiYgd2luZG93V2lkdGggPCAxNDAwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICd4bCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDE0MDAgJiYgd2luZG93V2lkdGggPCAxOTIwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICd4eGwnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSAxOTIwICYmIHdpbmRvd1dpZHRoIDwgMjU2MDpcbiAgICAgICAgICAgICAgICBia3AgPSAnZmhkJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMjU2MCAmJiB3aW5kb3dXaWR0aCA8IDM4NDA6XG4gICAgICAgICAgICAgICAgYmtwID0gJzJrJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMzg0MDpcbiAgICAgICAgICAgICAgICBia3AgPSAnNGsnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBia3A7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCcmVha3BvaW50cyhia3A6IHN0cmluZyk6IG9iamVjdCB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc01vYmlsZTogYmtwID09PSAneHMnIHx8IGJrcCA9PT0gJ3NtJyxcbiAgICAgICAgICAgIGlzVGFibGV0OiBia3AgPT09ICdtZCcsXG4gICAgICAgICAgICBpc0x0RGVza3RvcDogYmtwID09PSAneHMnIHx8IGJrcCA9PT0gJ3NtJyB8fCBia3AgPT09ICdtZCcsXG4gICAgICAgICAgICBpc0Rlc2t0b3A6IGJrcCA9PT0gJ2xnJyxcbiAgICAgICAgICAgIGlzWEw6IGJrcCA9PT0gJ3hsJyxcbiAgICAgICAgICAgIGlzWFhMOiBia3AgPT09ICd4eGwnLFxuICAgICAgICAgICAgaXNGSEQ6IGJrcCA9PT0gJ2ZoZCcsXG4gICAgICAgICAgICBpczJLOiBia3AgPT09ICcyaycsXG4gICAgICAgICAgICBpczRLOiBia3AgPT09ICc0aycsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRKc29uKHVybDogc3RyaW5nKTogUHJvbWlzZTxvYmplY3Q+IHtcbiAgICAgICAgcmV0dXJuIGZpcnN0VmFsdWVGcm9tKHRoaXMuaHR0cC5nZXQodXJsKSkudGhlbih0aGlzLmV4dHJhY3REYXRhKS5jYXRjaCh0aGlzLmhhbmRsZUVycm9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3REYXRhKHJlczogUmVzcG9uc2UpOiBvYmplY3Qge1xuICAgICAgICBjb25zdCBib2R5ID0gcmVzO1xuICAgICAgICByZXR1cm4gYm9keSB8fCB7fTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBmaW5kIHRoZSBjb3JyZWN0IHR5cGUgb3IgdHVybiBpbnRvIGEgZ2VuZXJpYywgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svMi9nZW5lcmljcy5odG1sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCcsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZEFjdGl2ZUxhbmd1YWdlVG9BcHBTaGVsbFN0YXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0b3JlU2VydmljZS5zZWxlY3QoZ2V0QWN0aXZlTGFuZykuc3Vic2NyaWJlKChhY3RpdmVMYW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlTGFuZyAhPT0gdGhpcy5zdGF0ZS5hY3RpdmVMYW5ndWFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMYW5ndWFnZTogYWN0aXZlTGFuZyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19