@eui/core 17.0.0-next.2 → 17.0.0-next.21
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.
- package/assets/i18n-eui/bg.json +3 -1
- package/assets/i18n-eui/cs.json +3 -1
- package/assets/i18n-eui/da.json +3 -1
- package/assets/i18n-eui/de.json +3 -1
- package/assets/i18n-eui/el.json +3 -1
- package/assets/i18n-eui/en.json +3 -1
- package/assets/i18n-eui/es.json +3 -1
- package/assets/i18n-eui/et.json +3 -1
- package/assets/i18n-eui/fi.json +3 -1
- package/assets/i18n-eui/fr.json +3 -1
- package/assets/i18n-eui/ga.json +3 -1
- package/assets/i18n-eui/hr.json +3 -1
- package/assets/i18n-eui/hu.json +3 -2
- package/assets/i18n-eui/it.json +3 -1
- package/assets/i18n-eui/lt.json +3 -2
- package/assets/i18n-eui/lv.json +3 -1
- package/assets/i18n-eui/mt.json +3 -1
- package/assets/i18n-eui/nl.json +3 -1
- package/assets/i18n-eui/pl.json +3 -1
- package/assets/i18n-eui/pt.json +3 -1
- package/assets/i18n-eui/readme.md +8 -0
- package/assets/i18n-eui/ro.json +3 -2
- package/assets/i18n-eui/sk.json +3 -1
- package/assets/i18n-eui/sl.json +3 -1
- package/assets/i18n-eui/sv.json +3 -1
- package/docs/classes/ActivatedRouteAction.html +282 -0
- package/docs/classes/AddApiQueueItemAction.html +282 -0
- package/docs/classes/AddAppLoadedConfigModulesAction.html +282 -0
- package/docs/classes/ApiQueueServiceMock.html +545 -0
- package/docs/classes/AsyncStorageService.html +923 -0
- package/docs/classes/AsyncStorageServiceMock.html +427 -0
- package/docs/classes/EmptyApiQueueAction.html +282 -0
- package/docs/classes/ErrorSubClass.html +357 -0
- package/docs/classes/EuiCoreRootGuardClass.html +167 -0
- package/docs/classes/EuiError.html +363 -0
- package/docs/classes/I18nResourceImpl.html +506 -0
- package/docs/classes/InitStoreAction.html +282 -0
- package/docs/classes/LogServiceMock.html +223 -0
- package/docs/classes/OpenIdConnectServiceMock.html +223 -0
- package/docs/classes/RemoveApiQueueItemAction.html +282 -0
- package/docs/classes/RouterMock.html +482 -0
- package/docs/classes/StorageService.html +630 -0
- package/docs/classes/StorageServiceMock.html +316 -0
- package/docs/classes/StoreMock.html +391 -0
- package/docs/classes/TranslateServiceMock.html +907 -0
- package/docs/classes/UpdateAppConnectionAction.html +282 -0
- package/docs/classes/UpdateAppStatusAction.html +282 -0
- package/docs/classes/UpdateAppVersionAction.html +282 -0
- package/docs/classes/UpdateCurrentModuleAction.html +282 -0
- package/docs/classes/UpdateI18nStateAction.html +282 -0
- package/docs/classes/UpdateLocaleStateAction.html +282 -0
- package/docs/classes/UpdateNotificationsListAction.html +282 -0
- package/docs/classes/UpdateUserDashboardAction.html +282 -0
- package/docs/classes/UpdateUserDetailsAction.html +282 -0
- package/docs/classes/UpdateUserPreferencesAction.html +282 -0
- package/docs/classes/UpdateUserRightsAction.html +282 -0
- package/docs/classes/UpdateUserStateAction.html +282 -0
- package/docs/dependencies.html +335 -0
- package/docs/directives/TranslateMockDirective.html +266 -0
- package/docs/fonts/ionicons.eot +0 -0
- package/docs/fonts/ionicons.svg +2090 -0
- package/docs/fonts/ionicons.ttf +0 -0
- package/docs/fonts/ionicons.woff +0 -0
- package/docs/fonts/ionicons.woff2 +0 -0
- package/docs/fonts/roboto-v15-latin-300.eot +0 -0
- package/docs/fonts/roboto-v15-latin-300.svg +314 -0
- package/docs/fonts/roboto-v15-latin-300.ttf +0 -0
- package/docs/fonts/roboto-v15-latin-300.woff +0 -0
- package/docs/fonts/roboto-v15-latin-300.woff2 +0 -0
- package/docs/fonts/roboto-v15-latin-700.eot +0 -0
- package/docs/fonts/roboto-v15-latin-700.svg +310 -0
- package/docs/fonts/roboto-v15-latin-700.ttf +0 -0
- package/docs/fonts/roboto-v15-latin-700.woff +0 -0
- package/docs/fonts/roboto-v15-latin-700.woff2 +0 -0
- package/docs/fonts/roboto-v15-latin-italic.eot +0 -0
- package/docs/fonts/roboto-v15-latin-italic.svg +323 -0
- package/docs/fonts/roboto-v15-latin-italic.ttf +0 -0
- package/docs/fonts/roboto-v15-latin-italic.woff +0 -0
- package/docs/fonts/roboto-v15-latin-italic.woff2 +0 -0
- package/docs/fonts/roboto-v15-latin-regular.eot +0 -0
- package/docs/fonts/roboto-v15-latin-regular.svg +308 -0
- package/docs/fonts/roboto-v15-latin-regular.ttf +0 -0
- package/docs/fonts/roboto-v15-latin-regular.woff +0 -0
- package/docs/fonts/roboto-v15-latin-regular.woff2 +0 -0
- package/docs/images/compodoc-vectorise-inverted.png +0 -0
- package/docs/images/compodoc-vectorise-inverted.svg +201 -0
- package/docs/images/compodoc-vectorise.png +0 -0
- package/docs/images/compodoc-vectorise.svg +201 -0
- package/docs/images/favicon.ico +0 -0
- package/docs/index.html +171 -0
- package/docs/injectables/ApiQueueService.html +784 -0
- package/docs/injectables/CoreAppEffects.html +390 -0
- package/docs/injectables/EuiAppShellService.html +2822 -0
- package/docs/injectables/EuiDynamicComponentService.html +433 -0
- package/docs/injectables/EuiDynamicMenuService.html +377 -0
- package/docs/injectables/EuiGrowlService.html +821 -0
- package/docs/injectables/EuiPermissionService.html +642 -0
- package/docs/injectables/EuiTimezoneService.html +378 -0
- package/docs/injectables/GlobalErrorHandler.html +291 -0
- package/docs/injectables/I18nLoader.html +589 -0
- package/docs/injectables/I18nService.html +991 -0
- package/docs/injectables/I18nServiceMock.html +626 -0
- package/docs/injectables/LocalForageService.html +761 -0
- package/docs/injectables/LocalStorageService.html +548 -0
- package/docs/injectables/LocaleService.html +753 -0
- package/docs/injectables/LocaleServiceMock.html +453 -0
- package/docs/injectables/LogService.html +351 -0
- package/docs/injectables/OpenIdConnectService.html +225 -0
- package/docs/injectables/SessionStorageService.html +548 -0
- package/docs/injectables/StoreService.html +641 -0
- package/docs/injectables/StoreServiceMock.html +455 -0
- package/docs/injectables/UserService.html +738 -0
- package/docs/injectables/UserServiceMock.html +708 -0
- package/docs/interceptors/AddLangParamInterceptor.html +311 -0
- package/docs/interceptors/CachePreventionInterceptor.html +260 -0
- package/docs/interceptors/CorsSecurityInterceptor.html +260 -0
- package/docs/interceptors/CsrfPreventionInterceptor.html +260 -0
- package/docs/interceptors/EuLoginSessionTimeoutHandlingInterceptor.html +260 -0
- package/docs/interceptors/HttpErrorHandlerInterceptor.html +319 -0
- package/docs/interceptors/OpenIdConnectInterceptor.html +345 -0
- package/docs/interceptors/UxRequestErrorModelInterceptor.html +295 -0
- package/docs/interfaces/EuiTimeZone.html +247 -0
- package/docs/interfaces/LoadedResources.html +292 -0
- package/docs/interfaces/LoadedResourcesError.html +247 -0
- package/docs/interfaces/ModuleLoadEvent.html +292 -0
- package/docs/interfaces/OpenIdConnectUserDetails.html +439 -0
- package/docs/interfaces/ResourceError.html +298 -0
- package/docs/interfaces/UIState.html +1945 -0
- package/docs/js/compodoc.js +14 -0
- package/docs/js/lazy-load-graphs.js +44 -0
- package/docs/js/libs/EventDispatcher.js +5 -0
- package/docs/js/libs/bootstrap-native.js +1 -0
- package/docs/js/libs/clipboard.min.js +7 -0
- package/docs/js/libs/custom-elements-es5-adapter.js +15 -0
- package/docs/js/libs/custom-elements.min.js +38 -0
- package/docs/js/libs/d3.v3.min.js +2 -0
- package/docs/js/libs/deep-iterator.js +2 -0
- package/docs/js/libs/es6-shim.min.js +11 -0
- package/docs/js/libs/htmlparser.js +23 -0
- package/docs/js/libs/innersvg.js +9 -0
- package/docs/js/libs/lit-html.js +1 -0
- package/docs/js/libs/prism.js +46 -0
- package/docs/js/libs/promise.min.js +6 -0
- package/docs/js/libs/svg-pan-zoom.min.js +3 -0
- package/docs/js/libs/tablesort.min.js +6 -0
- package/docs/js/libs/tablesort.number.min.js +6 -0
- package/docs/js/libs/vis.min.js +47 -0
- package/docs/js/libs/zepto.min.js +2 -0
- package/docs/js/menu-wc.js +377 -0
- package/docs/js/menu-wc_es5.js +42 -0
- package/docs/js/menu.js +325 -0
- package/docs/js/routes.js +301 -0
- package/docs/js/search/lunr.min.js +6 -0
- package/docs/js/search/search-lunr.js +67 -0
- package/docs/js/search/search.js +268 -0
- package/docs/js/search/search_index.js +4 -0
- package/docs/js/sourceCode.js +58 -0
- package/docs/js/svg-pan-zoom.controls.js +53 -0
- package/docs/js/tabs.js +21 -0
- package/docs/js/tree.js +147 -0
- package/docs/license.html +379 -0
- package/docs/miscellaneous/enumerations.html +418 -0
- package/docs/miscellaneous/functions.html +1796 -0
- package/docs/miscellaneous/typealiases.html +258 -0
- package/docs/miscellaneous/variables.html +3969 -0
- package/docs/modules/CoreModule.html +254 -0
- package/docs/modules/I18nModule.html +198 -0
- package/docs/modules/LogModule.html +301 -0
- package/docs/modules/TranslateMockModule.html +176 -0
- package/docs/modules.html +168 -0
- package/docs/pipes/TranslateMockPipe.html +225 -0
- package/docs/properties.html +124 -0
- package/docs/styles/bootstrap-card.css +219 -0
- package/docs/styles/bootstrap.min.css +6 -0
- package/docs/styles/compodoc.css +1121 -0
- package/docs/styles/dark.css +121 -0
- package/docs/styles/ionicons.min.css +11 -0
- package/docs/styles/laravel.css +113 -0
- package/docs/styles/material.css +131 -0
- package/docs/styles/original.css +51 -0
- package/docs/styles/postmark.css +238 -0
- package/docs/styles/prism.css +301 -0
- package/docs/styles/readthedocs.css +117 -0
- package/docs/styles/reset.css +129 -0
- package/docs/styles/stripe.css +106 -0
- package/docs/styles/style.css +7 -0
- package/docs/styles/tablesort.css +33 -0
- package/docs/styles/vagrant.css +130 -0
- package/esm2022/lib/eui-core.module.mjs +9 -9
- package/esm2022/lib/helpers/date-helpers.mjs +1 -1
- package/esm2022/lib/helpers/dom-helpers.mjs +10 -8
- package/esm2022/lib/helpers/event-helpers.mjs +1 -1
- package/esm2022/lib/helpers/form-helpers.mjs +1 -1
- package/esm2022/lib/helpers/format-helpers.mjs +6 -5
- package/esm2022/lib/helpers/http-helpers.mjs +3 -5
- package/esm2022/lib/interceptors/add-lang-param.interceptor.mjs +5 -5
- package/esm2022/lib/interceptors/cache-prevention.interceptor.mjs +4 -4
- package/esm2022/lib/interceptors/cors-security.interceptor.mjs +4 -4
- package/esm2022/lib/interceptors/csrf-prevention.interceptor.mjs +4 -4
- package/esm2022/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +13 -6
- package/esm2022/lib/interceptors/openid/openid-connect.interceptor.mjs +38 -9
- package/esm2022/lib/interceptors/openid/openid-connect.service.mjs +7 -5
- package/esm2022/lib/interceptors/ux-request-error-model.interceptor.mjs +12 -7
- package/esm2022/lib/services/app/eui-init-app.mjs +2 -2
- package/esm2022/lib/services/app/eui-pre-init-app.mjs +1 -1
- package/esm2022/lib/services/app/factories/log.mjs +1 -1
- package/esm2022/lib/services/config/tokens.mjs +3 -1
- package/esm2022/lib/services/dynamic-component/dynamic-component.service.mjs +68 -0
- package/esm2022/lib/services/dynamic-menu/dynamic-menu.service.mjs +15 -12
- package/esm2022/lib/services/errors/eui.error.mjs +7 -1
- package/esm2022/lib/services/errors/global-error-handler.mjs +8 -6
- package/esm2022/lib/services/errors/http-error-handler-callback-functions.mjs +5 -6
- package/esm2022/lib/services/errors/http-error-handler.interceptor.mjs +26 -19
- package/esm2022/lib/services/eui-app-shell.service.mjs +686 -0
- package/esm2022/lib/services/eui-timezone.service.mjs +4 -4
- package/esm2022/lib/services/growl/eui-growl.service.mjs +79 -0
- package/esm2022/lib/services/growl/index.mjs +2 -0
- package/esm2022/lib/services/i18n/i18n.loader.mjs +18 -7
- package/esm2022/lib/services/i18n/i18n.resource.mjs +8 -3
- package/esm2022/lib/services/i18n/i18n.service.mjs +19 -21
- package/esm2022/lib/services/i18n/index.mjs +2 -2
- package/esm2022/lib/services/index.mjs +4 -5
- package/esm2022/lib/services/locale/locale.service.mjs +9 -7
- package/esm2022/lib/services/locale/locale.service.mock.mjs +6 -6
- package/esm2022/lib/services/log/log.module.mjs +5 -5
- package/esm2022/lib/services/log/log.service.mjs +6 -6
- package/esm2022/lib/services/log/log.service.mock.mjs +1 -1
- package/esm2022/lib/services/permission/permission.service.mjs +7 -7
- package/esm2022/lib/services/queue/api-queue.service.mjs +21 -9
- package/esm2022/lib/services/queue/api-queue.service.mock.mjs +5 -1
- package/esm2022/lib/services/storage/async-storage.service.mjs +1 -1
- package/esm2022/lib/services/storage/async-storage.service.mock.mjs +9 -1
- package/esm2022/lib/services/storage/local-forage.service.mjs +45 -20
- package/esm2022/lib/services/storage/local-storage.service.mjs +10 -6
- package/esm2022/lib/services/storage/session-storage.service.mjs +10 -6
- package/esm2022/lib/services/storage/storage.service.mjs +1 -1
- package/esm2022/lib/services/storage/storage.service.mock.mjs +1 -1
- package/esm2022/lib/services/store/actions/app.actions.mjs +3 -1
- package/esm2022/lib/services/store/actions/notifications.actions.mjs +3 -1
- package/esm2022/lib/services/store/actions/user.actions.mjs +3 -1
- package/esm2022/lib/services/store/effects/app.effects.mjs +11 -21
- package/esm2022/lib/services/store/reducers/app.reducers.mjs +2 -3
- package/esm2022/lib/services/store/reducers/core.reducers.mjs +3 -1
- package/esm2022/lib/services/store/reducers/i18n.reducers.mjs +2 -2
- package/esm2022/lib/services/store/reducers/locale.reducers.mjs +1 -1
- package/esm2022/lib/services/store/reducers/meta.reducers.mjs +4 -2
- package/esm2022/lib/services/store/reducers/notifications.reducers.mjs +2 -2
- package/esm2022/lib/services/store/reducers/user.reducers.mjs +2 -2
- package/esm2022/lib/services/store/store.service.mjs +16 -8
- package/esm2022/lib/services/store/store.service.mock.mjs +5 -5
- package/esm2022/lib/services/user/user.service.mjs +14 -8
- package/esm2022/lib/services/user/user.service.mock.mjs +12 -18
- package/fesm2022/eui-core.mjs +2675 -2467
- package/fesm2022/eui-core.mjs.map +1 -1
- package/lib/eui-core.module.d.ts +1 -1
- package/lib/eui-core.module.d.ts.map +1 -1
- package/lib/helpers/date-helpers.d.ts.map +1 -1
- package/lib/helpers/dom-helpers.d.ts +9 -7
- package/lib/helpers/dom-helpers.d.ts.map +1 -1
- package/lib/helpers/event-helpers.d.ts.map +1 -1
- package/lib/helpers/form-helpers.d.ts.map +1 -1
- package/lib/helpers/format-helpers.d.ts.map +1 -1
- package/lib/helpers/http-helpers.d.ts +2 -1
- package/lib/helpers/http-helpers.d.ts.map +1 -1
- package/lib/interceptors/add-lang-param.interceptor.d.ts +1 -1
- package/lib/interceptors/add-lang-param.interceptor.d.ts.map +1 -1
- package/lib/interceptors/cache-prevention.interceptor.d.ts +1 -1
- package/lib/interceptors/cache-prevention.interceptor.d.ts.map +1 -1
- package/lib/interceptors/cors-security.interceptor.d.ts +1 -1
- package/lib/interceptors/cors-security.interceptor.d.ts.map +1 -1
- package/lib/interceptors/csrf-prevention.interceptor.d.ts +1 -1
- package/lib/interceptors/csrf-prevention.interceptor.d.ts.map +1 -1
- package/lib/interceptors/eu-login-session-timeout-handling.interceptor.d.ts +1 -1
- package/lib/interceptors/eu-login-session-timeout-handling.interceptor.d.ts.map +1 -1
- package/lib/interceptors/openid/openid-connect.interceptor.d.ts.map +1 -1
- package/lib/interceptors/openid/openid-connect.service.d.ts.map +1 -1
- package/lib/interceptors/ux-request-error-model.interceptor.d.ts.map +1 -1
- package/lib/services/app/eui-init-app.d.ts +1 -1
- package/lib/services/app/eui-init-app.d.ts.map +1 -1
- package/lib/services/config/tokens.d.ts +2 -2
- package/lib/services/config/tokens.d.ts.map +1 -1
- package/lib/services/{ux-dynamic-component/ux-dynamic-component.service.d.ts → dynamic-component/dynamic-component.service.d.ts} +7 -11
- package/lib/services/dynamic-component/dynamic-component.service.d.ts.map +1 -0
- package/lib/services/dynamic-menu/dynamic-menu.service.d.ts +8 -8
- package/lib/services/dynamic-menu/dynamic-menu.service.d.ts.map +1 -1
- package/lib/services/errors/eui.error.d.ts +0 -2
- package/lib/services/errors/eui.error.d.ts.map +1 -1
- package/lib/services/errors/global-error-handler.d.ts +1 -1
- package/lib/services/errors/global-error-handler.d.ts.map +1 -1
- package/lib/services/errors/http-error-handler-callback-functions.d.ts.map +1 -1
- package/lib/services/errors/http-error-handler.interceptor.d.ts.map +1 -1
- package/lib/services/{ux-app-shell.service.d.ts → eui-app-shell.service.d.ts} +52 -11
- package/lib/services/eui-app-shell.service.d.ts.map +1 -0
- package/lib/services/growl/eui-growl.service.d.ts +22 -0
- package/lib/services/growl/eui-growl.service.d.ts.map +1 -0
- package/lib/services/growl/index.d.ts +2 -0
- package/lib/services/growl/index.d.ts.map +1 -0
- package/lib/services/i18n/i18n.loader.d.ts.map +1 -1
- package/lib/services/i18n/i18n.resource.d.ts +1 -1
- package/lib/services/i18n/i18n.resource.d.ts.map +1 -1
- package/lib/services/i18n/i18n.service.d.ts +4 -4
- package/lib/services/i18n/i18n.service.d.ts.map +1 -1
- package/lib/services/i18n/index.d.ts +0 -1
- package/lib/services/i18n/index.d.ts.map +1 -1
- package/lib/services/index.d.ts +3 -4
- package/lib/services/index.d.ts.map +1 -1
- package/lib/services/locale/locale.service.d.ts.map +1 -1
- package/lib/services/log/log.service.d.ts.map +1 -1
- package/lib/services/log/log.service.mock.d.ts.map +1 -1
- package/lib/services/permission/permission.service.d.ts.map +1 -1
- package/lib/services/queue/api-queue.service.d.ts +2 -2
- package/lib/services/queue/api-queue.service.d.ts.map +1 -1
- package/lib/services/queue/api-queue.service.mock.d.ts.map +1 -1
- package/lib/services/storage/async-storage.service.d.ts.map +1 -1
- package/lib/services/storage/async-storage.service.mock.d.ts.map +1 -1
- package/lib/services/storage/local-forage.service.d.ts +1 -1
- package/lib/services/storage/local-forage.service.d.ts.map +1 -1
- package/lib/services/storage/local-storage.service.d.ts.map +1 -1
- package/lib/services/storage/session-storage.service.d.ts.map +1 -1
- package/lib/services/storage/storage.service.d.ts.map +1 -1
- package/lib/services/storage/storage.service.mock.d.ts +1 -1
- package/lib/services/storage/storage.service.mock.d.ts.map +1 -1
- package/lib/services/store/actions/app.actions.d.ts.map +1 -1
- package/lib/services/store/actions/notifications.actions.d.ts.map +1 -1
- package/lib/services/store/actions/user.actions.d.ts.map +1 -1
- package/lib/services/store/effects/app.effects.d.ts +3 -3
- package/lib/services/store/effects/app.effects.d.ts.map +1 -1
- package/lib/services/store/reducers/app.reducers.d.ts.map +1 -1
- package/lib/services/store/reducers/core.reducers.d.ts.map +1 -1
- package/lib/services/store/reducers/meta.reducers.d.ts +2 -2
- package/lib/services/store/reducers/meta.reducers.d.ts.map +1 -1
- package/lib/services/store/reducers/user.reducers.d.ts.map +1 -1
- package/lib/services/store/store.service.d.ts +8 -8
- package/lib/services/store/store.service.d.ts.map +1 -1
- package/lib/services/store/store.service.mock.d.ts +2 -1
- package/lib/services/store/store.service.mock.d.ts.map +1 -1
- package/lib/services/user/user.service.d.ts +3 -3
- package/lib/services/user/user.service.d.ts.map +1 -1
- package/lib/services/user/user.service.mock.d.ts +10 -12
- package/lib/services/user/user.service.mock.d.ts.map +1 -1
- package/package.json +2 -2
- package/esm2022/lib/services/i18n/i18n.service.mock.mjs +0 -38
- package/esm2022/lib/services/ux-app-shell.service.mjs +0 -556
- package/esm2022/lib/services/ux-dynamic-component/ux-dynamic-component.service.mjs +0 -63
- package/esm2022/lib/services/ux-error-feedback/ux-error-feedback.service.mjs +0 -108
- package/esm2022/lib/services/ux-error-feedback/ux-error-handler.operator.mjs +0 -16
- package/lib/services/i18n/i18n.service.mock.d.ts +0 -20
- package/lib/services/i18n/i18n.service.mock.d.ts.map +0 -1
- package/lib/services/ux-app-shell.service.d.ts.map +0 -1
- package/lib/services/ux-dynamic-component/ux-dynamic-component.service.d.ts.map +0 -1
- package/lib/services/ux-error-feedback/ux-error-feedback.service.d.ts +0 -36
- package/lib/services/ux-error-feedback/ux-error-feedback.service.d.ts.map +0 -1
- package/lib/services/ux-error-feedback/ux-error-handler.operator.d.ts +0 -4
- package/lib/services/ux-error-feedback/ux-error-handler.operator.d.ts.map +0 -1
|
@@ -1,556 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';
|
|
2
|
-
import { isPlatformBrowser } from '@angular/common';
|
|
3
|
-
import { BehaviorSubject, defer } from 'rxjs';
|
|
4
|
-
import { EuiEuLanguages, getActiveLang } from '@eui/base';
|
|
5
|
-
import { GLOBAL_CONFIG_TOKEN } from './config/tokens';
|
|
6
|
-
import { NavigationEnd } from '@angular/router';
|
|
7
|
-
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
8
|
-
import isEqual from 'lodash-es/isEqual';
|
|
9
|
-
import get from 'lodash-es/get';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@angular/common/http";
|
|
12
|
-
import * as i2 from "@angular/router";
|
|
13
|
-
import * as i3 from "./store/store.service";
|
|
14
|
-
import * as i4 from "./i18n";
|
|
15
|
-
const initialState = {
|
|
16
|
-
appName: '',
|
|
17
|
-
appShortName: '',
|
|
18
|
-
appSubTitle: '',
|
|
19
|
-
userInfos: null,
|
|
20
|
-
userSubInfos: null,
|
|
21
|
-
impersonatedUserInfos: null,
|
|
22
|
-
isSidebarOpen: true,
|
|
23
|
-
isSidebarHover: false,
|
|
24
|
-
isSidebarActive: false,
|
|
25
|
-
isSidebarInnerActive: false,
|
|
26
|
-
isSidebarStateCloseWithIcons: false,
|
|
27
|
-
isSidebarExpandOnHover: true,
|
|
28
|
-
hasSidebar: false,
|
|
29
|
-
hasHeader: false,
|
|
30
|
-
hasBreadcrumb: false,
|
|
31
|
-
hasHeaderLogo: false,
|
|
32
|
-
hasHeaderEnvironment: false,
|
|
33
|
-
hasToolbar: false,
|
|
34
|
-
hasToolbarMenu: false,
|
|
35
|
-
environmentValue: '',
|
|
36
|
-
isSidebarHidden: false,
|
|
37
|
-
hasTopMessage: false,
|
|
38
|
-
windowWidth: 0,
|
|
39
|
-
windowHeight: 0,
|
|
40
|
-
mainContentHeight: 0,
|
|
41
|
-
pageHeaderHeight: 0,
|
|
42
|
-
wrapperClasses: '',
|
|
43
|
-
breakpoint: '',
|
|
44
|
-
breakpoints: {
|
|
45
|
-
isMobile: false,
|
|
46
|
-
isTablet: false,
|
|
47
|
-
isLtDesktop: false,
|
|
48
|
-
isDesktop: false,
|
|
49
|
-
isXL: false,
|
|
50
|
-
isXXL: false,
|
|
51
|
-
},
|
|
52
|
-
menuLinks: [],
|
|
53
|
-
sidebarLinks: [],
|
|
54
|
-
combinedLinks: [],
|
|
55
|
-
isBlockDocumentActive: false,
|
|
56
|
-
deviceInfo: null,
|
|
57
|
-
activeLanguage: 'en',
|
|
58
|
-
languages: EuiEuLanguages.getLanguages(),
|
|
59
|
-
appMetadata: null,
|
|
60
|
-
hasModalActive: false,
|
|
61
|
-
isDimmerActive: false,
|
|
62
|
-
};
|
|
63
|
-
// TODO: this service needs to be transferred in the respective component
|
|
64
|
-
export class UxAppShellService {
|
|
65
|
-
// -------------------
|
|
66
|
-
get state$() {
|
|
67
|
-
return this._state$.asObservable();
|
|
68
|
-
}
|
|
69
|
-
// -------------------
|
|
70
|
-
// exposed observables
|
|
71
|
-
get breakpoint$() {
|
|
72
|
-
return this._breakpoint$.asObservable();
|
|
73
|
-
}
|
|
74
|
-
get breakpoints$() {
|
|
75
|
-
return this._breakpoints$.asObservable();
|
|
76
|
-
}
|
|
77
|
-
// ----------------
|
|
78
|
-
// state operations
|
|
79
|
-
// ----------------
|
|
80
|
-
get state() {
|
|
81
|
-
return this._state$.getValue();
|
|
82
|
-
}
|
|
83
|
-
// ----------------------------
|
|
84
|
-
// public setters and functions
|
|
85
|
-
// ----------------------------
|
|
86
|
-
set isSidebarOpen(isOpen) {
|
|
87
|
-
this.setState({
|
|
88
|
-
...this.state,
|
|
89
|
-
isSidebarOpen: isOpen,
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
get isSidebarOpen() {
|
|
93
|
-
return this.state.isSidebarOpen;
|
|
94
|
-
}
|
|
95
|
-
set isSidebarHover(isHover) {
|
|
96
|
-
if (this.state.isSidebarExpandOnHover) {
|
|
97
|
-
this.setState({
|
|
98
|
-
...this.state,
|
|
99
|
-
isSidebarHover: isHover,
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
get isSidebarHover() {
|
|
104
|
-
return this.state.isSidebarHover;
|
|
105
|
-
}
|
|
106
|
-
set isSidebarActive(isActive) {
|
|
107
|
-
this.setState({
|
|
108
|
-
...this.state,
|
|
109
|
-
isSidebarActive: isActive,
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
set isSidebarInnerActive(isOpen) {
|
|
113
|
-
this.setState({
|
|
114
|
-
...this.state,
|
|
115
|
-
isSidebarInnerActive: isOpen,
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
set sidebarLinks(links) {
|
|
119
|
-
this.setState({
|
|
120
|
-
...this.state,
|
|
121
|
-
sidebarLinks: links,
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
set menuLinks(links) {
|
|
125
|
-
this.setState({
|
|
126
|
-
...this.state,
|
|
127
|
-
menuLinks: links,
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
set isBlockDocumentActive(isActive) {
|
|
131
|
-
this.setState({
|
|
132
|
-
...this.state,
|
|
133
|
-
isBlockDocumentActive: isActive,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
get hasHeader() {
|
|
137
|
-
return this.state.hasHeader;
|
|
138
|
-
}
|
|
139
|
-
// Edit mode
|
|
140
|
-
get isDimmerActive() {
|
|
141
|
-
return this.state.isDimmerActive;
|
|
142
|
-
}
|
|
143
|
-
set isDimmerActive(isActive) {
|
|
144
|
-
this.setState({
|
|
145
|
-
...this.state,
|
|
146
|
-
isDimmerActive: isActive,
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
constructor(config, http, platformId, router, storeService, i18nService) {
|
|
150
|
-
this.config = config;
|
|
151
|
-
this.http = http;
|
|
152
|
-
this.platformId = platformId;
|
|
153
|
-
this.router = router;
|
|
154
|
-
this.storeService = storeService;
|
|
155
|
-
this.i18nService = i18nService;
|
|
156
|
-
this.cssVars = [];
|
|
157
|
-
let stateWithConfig = initialState;
|
|
158
|
-
const languages = config?.i18n?.i18nService?.languages || initialState.languages;
|
|
159
|
-
const defaultLanguage = config?.i18n?.i18nService?.defaultLanguage || initialState.activeLanguage;
|
|
160
|
-
stateWithConfig = {
|
|
161
|
-
...stateWithConfig,
|
|
162
|
-
...{
|
|
163
|
-
languages,
|
|
164
|
-
activeLanguage: defaultLanguage,
|
|
165
|
-
},
|
|
166
|
-
};
|
|
167
|
-
this._state$ = new BehaviorSubject(stateWithConfig);
|
|
168
|
-
this._breakpoint$ = new BehaviorSubject('');
|
|
169
|
-
this._breakpoints$ = new BehaviorSubject({});
|
|
170
|
-
this.bindActiveLanguageToAppShellState();
|
|
171
|
-
if (isPlatformBrowser(this.platformId)) {
|
|
172
|
-
router.events.subscribe((event) => {
|
|
173
|
-
if (event instanceof NavigationEnd) {
|
|
174
|
-
window.scrollTo(0, 0);
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
setState(nextState, updateI18 = true) {
|
|
180
|
-
let breakpoint, breakpoints, wrapperClasses;
|
|
181
|
-
let combinedLinks;
|
|
182
|
-
const state = this.state;
|
|
183
|
-
// check if window width has been updated from previous state
|
|
184
|
-
if (this.state.windowWidth !== nextState.windowWidth) {
|
|
185
|
-
breakpoint = this.getBreakpoint(nextState.windowWidth);
|
|
186
|
-
breakpoints = this.getBreakpoints(breakpoint);
|
|
187
|
-
this._breakpoint$.next(breakpoint);
|
|
188
|
-
this._breakpoints$.next(breakpoints);
|
|
189
|
-
// if not propagate the old ones without doing any calculations
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
breakpoint = state.breakpoint;
|
|
193
|
-
breakpoints = state.breakpoints;
|
|
194
|
-
}
|
|
195
|
-
// finally get the wrapper classes when both the state and breakpoint are known
|
|
196
|
-
wrapperClasses = this.getWrapperClasses(nextState, breakpoint);
|
|
197
|
-
// check if the menuLinks or sidebarLinks have changed from previous state
|
|
198
|
-
if (this.state.menuLinks !== nextState.menuLinks || this.state.sidebarLinks !== nextState.sidebarLinks) {
|
|
199
|
-
combinedLinks = [...nextState.menuLinks, ...nextState.sidebarLinks];
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
combinedLinks = this.state.combinedLinks;
|
|
203
|
-
}
|
|
204
|
-
const stateBeforeUpdate = { ...this.state };
|
|
205
|
-
// we put it all together with the calculated properties
|
|
206
|
-
this._state$.next({
|
|
207
|
-
...nextState,
|
|
208
|
-
wrapperClasses,
|
|
209
|
-
breakpoint,
|
|
210
|
-
breakpoints,
|
|
211
|
-
combinedLinks,
|
|
212
|
-
});
|
|
213
|
-
// update the Store Language
|
|
214
|
-
if (updateI18 && nextState.activeLanguage !== stateBeforeUpdate.activeLanguage) {
|
|
215
|
-
this.i18nService.updateState({ activeLang: nextState.activeLanguage });
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Emits a slice from the state whether that changes
|
|
220
|
-
*
|
|
221
|
-
* @param key can be 'key' or 'key.sub.sub'
|
|
222
|
-
*/
|
|
223
|
-
getState(key) {
|
|
224
|
-
return defer(() =>
|
|
225
|
-
// check if key exists
|
|
226
|
-
key
|
|
227
|
-
? this.state$.pipe(map((state) => get(state, key)),
|
|
228
|
-
// filter((state) => state),
|
|
229
|
-
distinctUntilChanged((x, y) => isEqual(x, y)))
|
|
230
|
-
: this.state$);
|
|
231
|
-
}
|
|
232
|
-
sidebarToggle() {
|
|
233
|
-
this.isSidebarOpen = !this.state.isSidebarOpen;
|
|
234
|
-
}
|
|
235
|
-
// Edit mode
|
|
236
|
-
dimmerActiveToggle() {
|
|
237
|
-
const isActive = this.isDimmerActive;
|
|
238
|
-
this.setState({
|
|
239
|
-
...this.state,
|
|
240
|
-
isDimmerActive: !isActive,
|
|
241
|
-
});
|
|
242
|
-
this.activateEditModeCssVars(!isActive);
|
|
243
|
-
}
|
|
244
|
-
setDimmerActiveState(activeState) {
|
|
245
|
-
this.setState({
|
|
246
|
-
...this.state,
|
|
247
|
-
isDimmerActive: activeState,
|
|
248
|
-
});
|
|
249
|
-
this.activateEditModeCssVars(activeState);
|
|
250
|
-
}
|
|
251
|
-
activateEditModeCssVars(isActive) {
|
|
252
|
-
if (isActive) {
|
|
253
|
-
this._setCssVarValue('--eui-docpage-navigation-z-index', 'inherit'); // Reset doc-page-navigation-column z-index
|
|
254
|
-
this._setCssVarValue('--eui-z-index-sidebar', 'inherit'); // Reset eui-app-sidebar z-index
|
|
255
|
-
this._setCssVarValue('--eui-z-index-root', 'inherit'); // Reset eui-app-main-content z-index
|
|
256
|
-
}
|
|
257
|
-
else {
|
|
258
|
-
this._setCssVarValue('--eui-docpage-navigation-z-index', '2'); // Restore doc-page-navigation-column z-index
|
|
259
|
-
this._setCssVarValue('--eui-z-index-sidebar', '1044'); // Restore eui-app-sidebar z-index
|
|
260
|
-
this._setCssVarValue('--eui-z-index-root', '1'); // Restore eui-app-main-content z-index
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
// --------------
|
|
264
|
-
// public methods
|
|
265
|
-
// --------------
|
|
266
|
-
fetchAppMetadata(metadataFilePath = 'assets/app-metadata.json') {
|
|
267
|
-
this.getJson(metadataFilePath).then((data) => {
|
|
268
|
-
this.setState({
|
|
269
|
-
...this.state,
|
|
270
|
-
appMetadata: data,
|
|
271
|
-
});
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
activateSidebar() {
|
|
275
|
-
this.setState({
|
|
276
|
-
...this.state,
|
|
277
|
-
hasSidebar: true,
|
|
278
|
-
});
|
|
279
|
-
if (!this.state.isSidebarHidden) {
|
|
280
|
-
this.activateSidebarCssVars();
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
activateSidebarHeader() {
|
|
284
|
-
this.activateSidebarHeaderCssVars();
|
|
285
|
-
}
|
|
286
|
-
activateSidebarFooter() {
|
|
287
|
-
this.activateSidebarFooterCssVars();
|
|
288
|
-
}
|
|
289
|
-
activateHeader() {
|
|
290
|
-
this.setState({
|
|
291
|
-
...this.state,
|
|
292
|
-
hasHeader: true,
|
|
293
|
-
});
|
|
294
|
-
this.activateHeaderCssVars();
|
|
295
|
-
}
|
|
296
|
-
activateBreadcrumb() {
|
|
297
|
-
this.setState({
|
|
298
|
-
...this.state,
|
|
299
|
-
hasBreadcrumb: true,
|
|
300
|
-
});
|
|
301
|
-
this.activateBreadcrumbCssVars();
|
|
302
|
-
}
|
|
303
|
-
activateTopMessage(height) {
|
|
304
|
-
this.setState({
|
|
305
|
-
...this.state,
|
|
306
|
-
hasTopMessage: true,
|
|
307
|
-
});
|
|
308
|
-
this.activateTopMessageCssVars(height);
|
|
309
|
-
}
|
|
310
|
-
activateToolbar() {
|
|
311
|
-
this.setState({
|
|
312
|
-
...this.state,
|
|
313
|
-
hasToolbar: true,
|
|
314
|
-
});
|
|
315
|
-
this.activateToolbarCssVars();
|
|
316
|
-
}
|
|
317
|
-
activateToolbarMenu() {
|
|
318
|
-
this.setState({
|
|
319
|
-
...this.state,
|
|
320
|
-
hasToolbarMenu: true,
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
fetchCssVars() {
|
|
324
|
-
const cssVarNames = [
|
|
325
|
-
'--eui-app-header-height-default',
|
|
326
|
-
'--eui-app-header-height-active',
|
|
327
|
-
'--eui-app-header-height-shrink',
|
|
328
|
-
'--eui-app-breadcrumb-height-default',
|
|
329
|
-
'--eui-app-breadcrumb-height-active',
|
|
330
|
-
'--eui-app-top-message-height-default',
|
|
331
|
-
'--eui-app-top-message-height-active',
|
|
332
|
-
'--eui-app-top-message-height-shrink',
|
|
333
|
-
'--eui-app-toolbar-height-default',
|
|
334
|
-
'--eui-app-toolbar-height-active',
|
|
335
|
-
'--eui-app-sidebar-width-default',
|
|
336
|
-
'--eui-app-sidebar-width-active',
|
|
337
|
-
'--eui-app-sidebar-width-close-default',
|
|
338
|
-
'--eui-app-sidebar-width-close-active',
|
|
339
|
-
'--eui-app-sidebar-header-height-default',
|
|
340
|
-
'--eui-app-sidebar-header-height-active',
|
|
341
|
-
'--eui-app-sidebar-footer-height-default',
|
|
342
|
-
'--eui-app-sidebar-footer-height-active',
|
|
343
|
-
];
|
|
344
|
-
this.cssVars = cssVarNames.map((v) => ({ key: v, value: this.getCssVarValue(v) }));
|
|
345
|
-
}
|
|
346
|
-
initCssVars() {
|
|
347
|
-
this.setCssVar('--eui-app-header-height-default', '--eui-app-header-height');
|
|
348
|
-
this.setCssVar('--eui-app-breadcrumb-height-default', '--eui-app-breadcrumb-height');
|
|
349
|
-
this.setCssVar('--eui-app-top-message-height-default', '--eui-app-top-message-height');
|
|
350
|
-
this.setCssVar('--eui-app-toolbar-height-default', '--eui-app-toolbar-height');
|
|
351
|
-
this.setCssVar('--eui-app-sidebar-width-default', '--eui-app-sidebar-width');
|
|
352
|
-
this.setCssVar('--eui-app-sidebar-width-close-default', '--eui-app-sidebar-width-close');
|
|
353
|
-
this.setCssVar('--eui-app-sidebar-header-height-default', '--eui-app-sidebar-header-height');
|
|
354
|
-
this.setCssVar('--eui-app-sidebar-footer-height-default', '--eui-app-sidebar-footer-height');
|
|
355
|
-
}
|
|
356
|
-
activateHeaderCssVars() {
|
|
357
|
-
this.setCssVar('--eui-app-header-height-active', '--eui-app-header-height');
|
|
358
|
-
}
|
|
359
|
-
activateBreadcrumbCssVars() {
|
|
360
|
-
this.setCssVar('--eui-app-breadcrumb-height-active', '--eui-app-breadcrumb-height');
|
|
361
|
-
}
|
|
362
|
-
activateTopMessageCssVars(height) {
|
|
363
|
-
this._setCssVarValue('--eui-app-top-message-height', `${height}px`);
|
|
364
|
-
}
|
|
365
|
-
activateToolbarCssVars() {
|
|
366
|
-
this.setCssVar('--eui-app-toolbar-height-active', '--eui-app-toolbar-height');
|
|
367
|
-
}
|
|
368
|
-
activateFooterCssVars() {
|
|
369
|
-
this.setCssVar('--eui-app-footer-height-active', '--eui-app-footer-height');
|
|
370
|
-
}
|
|
371
|
-
setHeaderShrinkCssVar(active) {
|
|
372
|
-
if (active) {
|
|
373
|
-
this.setCssVar('--eui-app-header-height-shrink', '--eui-app-header-height');
|
|
374
|
-
}
|
|
375
|
-
else {
|
|
376
|
-
this.setCssVar('--eui-app-header-height-active', '--eui-app-header-height');
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
activateSidebarCssVars() {
|
|
380
|
-
this.setCssVar('--eui-app-sidebar-width-active', '--eui-app-sidebar-width');
|
|
381
|
-
this.setCssVar('--eui-app-sidebar-width-close-active', '--eui-app-sidebar-width-close');
|
|
382
|
-
}
|
|
383
|
-
removeSidebarCssVars() {
|
|
384
|
-
document.documentElement.style.removeProperty('--eui-app-sidebar-header-height');
|
|
385
|
-
document.documentElement.style.removeProperty('--eui-app-sidebar-footer-height');
|
|
386
|
-
document.documentElement.style.removeProperty('--eui-app-sidebar-width');
|
|
387
|
-
document.documentElement.style.removeProperty('--eui-app-sidebar-width-close');
|
|
388
|
-
}
|
|
389
|
-
activateSidebarHeaderCssVars() {
|
|
390
|
-
this.setCssVar('--eui-app-sidebar-header-height-active', '--eui-app-sidebar-header-height');
|
|
391
|
-
}
|
|
392
|
-
activateSidebarFooterCssVars() {
|
|
393
|
-
this.setCssVar('--eui-app-sidebar-footer-height-active', '--eui-app-sidebar-footer-height');
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Gets the viewport height and width and multiple it by 1% to get a value for a vh/vw unit
|
|
397
|
-
* Sets the value in the --eui-app-vh custom property to the root of the document
|
|
398
|
-
* Sets the value in the --eui-app-vw custom property to the root of the document
|
|
399
|
-
* Example for 100% height: calc(var(--eui-app-vh, 1vh) * 100);
|
|
400
|
-
* Example for 50% height: calc(var(--eui-app-vh, 1vh) * 50);
|
|
401
|
-
* Example for 50% width: calc(var(--eui-app-vw, 1vw) * 50);
|
|
402
|
-
*/
|
|
403
|
-
setAppViewportCssVars() {
|
|
404
|
-
let vh = window.innerHeight * 0.01;
|
|
405
|
-
let vw = window.innerWidth * 0.01;
|
|
406
|
-
this._setCssVarValue('--eui-app-vh', `${vh}px`);
|
|
407
|
-
this._setCssVarValue('--eui-app-vw', `${vw}px`);
|
|
408
|
-
}
|
|
409
|
-
// ---------------
|
|
410
|
-
// private getters
|
|
411
|
-
// ---------------
|
|
412
|
-
getCssVarValue(inputProperty) {
|
|
413
|
-
return getComputedStyle(document.documentElement).getPropertyValue(inputProperty);
|
|
414
|
-
}
|
|
415
|
-
setCssVar(inputProperty, outputProperty) {
|
|
416
|
-
const cssVarValue = this.cssVars.filter((v) => v.key === inputProperty)[0].value;
|
|
417
|
-
this._setCssVarValue(outputProperty, cssVarValue);
|
|
418
|
-
// console.log(inputProperty, outputProperty, cssVarValue);
|
|
419
|
-
}
|
|
420
|
-
_setCssVarValue(varName, varValue) {
|
|
421
|
-
document.documentElement.style.setProperty(varName, varValue);
|
|
422
|
-
}
|
|
423
|
-
getWrapperClasses(state, breakpoint) {
|
|
424
|
-
let classes = [];
|
|
425
|
-
classes.push(breakpoint);
|
|
426
|
-
if (state.hasSidebar) {
|
|
427
|
-
if (state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
|
|
428
|
-
classes.push('sidebar-state-open');
|
|
429
|
-
}
|
|
430
|
-
if (!state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
|
|
431
|
-
classes.push('sidebar-state-close');
|
|
432
|
-
}
|
|
433
|
-
if (state.isSidebarActive) {
|
|
434
|
-
classes.push('sidebar-active');
|
|
435
|
-
}
|
|
436
|
-
if (state.isSidebarInnerActive) {
|
|
437
|
-
classes.push('sidebar-inner-active');
|
|
438
|
-
}
|
|
439
|
-
if (state.isSidebarStateCloseWithIcons) {
|
|
440
|
-
classes.push('sidebar-state-close-with-icons');
|
|
441
|
-
}
|
|
442
|
-
// NEW APP-SHELL props
|
|
443
|
-
if (state.isSidebarHidden) {
|
|
444
|
-
classes.push('sidebar--hidden');
|
|
445
|
-
}
|
|
446
|
-
if (state.isSidebarOpen) {
|
|
447
|
-
classes.push('sidebar--open');
|
|
448
|
-
}
|
|
449
|
-
else {
|
|
450
|
-
classes.push('sidebar--close');
|
|
451
|
-
}
|
|
452
|
-
if (state.isSidebarHover) {
|
|
453
|
-
classes.push('sidebar--hover');
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
if (state.deviceInfo && state.deviceInfo.isFF) {
|
|
457
|
-
classes.push('ff');
|
|
458
|
-
}
|
|
459
|
-
if (state.deviceInfo && state.deviceInfo.isIE) {
|
|
460
|
-
classes.push('ie');
|
|
461
|
-
}
|
|
462
|
-
if (state.deviceInfo && state.deviceInfo.isIE11) {
|
|
463
|
-
classes.push('ie11');
|
|
464
|
-
}
|
|
465
|
-
if (state.deviceInfo && state.deviceInfo.isChrome) {
|
|
466
|
-
classes.push('chrome');
|
|
467
|
-
}
|
|
468
|
-
return classes.join(' ');
|
|
469
|
-
}
|
|
470
|
-
getBreakpoint(windowWidth) {
|
|
471
|
-
let bkp = '';
|
|
472
|
-
switch (true) {
|
|
473
|
-
case windowWidth >= 0 && windowWidth < 576:
|
|
474
|
-
bkp = 'xs';
|
|
475
|
-
break;
|
|
476
|
-
case windowWidth >= 576 && windowWidth < 768:
|
|
477
|
-
bkp = 'sm';
|
|
478
|
-
break;
|
|
479
|
-
case windowWidth >= 768 && windowWidth < 992:
|
|
480
|
-
bkp = 'md';
|
|
481
|
-
break;
|
|
482
|
-
case windowWidth >= 992 && windowWidth < 1200:
|
|
483
|
-
bkp = 'lg';
|
|
484
|
-
break;
|
|
485
|
-
case windowWidth >= 1200 && windowWidth < 1400:
|
|
486
|
-
bkp = 'xl';
|
|
487
|
-
break;
|
|
488
|
-
case windowWidth >= 1400 && windowWidth < 1920:
|
|
489
|
-
bkp = 'xxl';
|
|
490
|
-
break;
|
|
491
|
-
case windowWidth >= 1920 && windowWidth < 2560:
|
|
492
|
-
bkp = 'fhd';
|
|
493
|
-
break;
|
|
494
|
-
case windowWidth >= 2560 && windowWidth < 3840:
|
|
495
|
-
bkp = '2k';
|
|
496
|
-
break;
|
|
497
|
-
case windowWidth >= 3840:
|
|
498
|
-
bkp = '4k';
|
|
499
|
-
break;
|
|
500
|
-
}
|
|
501
|
-
return bkp;
|
|
502
|
-
}
|
|
503
|
-
getBreakpoints(bkp) {
|
|
504
|
-
return {
|
|
505
|
-
isMobile: bkp === 'xs' || bkp === 'sm',
|
|
506
|
-
isTablet: bkp === 'md',
|
|
507
|
-
isLtDesktop: bkp === 'xs' || bkp === 'sm' || bkp === 'md',
|
|
508
|
-
isDesktop: bkp === 'lg',
|
|
509
|
-
isXL: bkp === 'xl',
|
|
510
|
-
isXXL: bkp === 'xxl',
|
|
511
|
-
isFHD: bkp === 'fhd',
|
|
512
|
-
is2K: bkp === '2k',
|
|
513
|
-
is4K: bkp === '4k',
|
|
514
|
-
};
|
|
515
|
-
}
|
|
516
|
-
getJson(url) {
|
|
517
|
-
return this.http.get(url).toPromise().then(this.extractData).catch(this.handleError);
|
|
518
|
-
}
|
|
519
|
-
extractData(res) {
|
|
520
|
-
const body = res;
|
|
521
|
-
return body || {};
|
|
522
|
-
}
|
|
523
|
-
handleError(error) {
|
|
524
|
-
console.error('An error occurred', error);
|
|
525
|
-
return Promise.reject(error.message || error);
|
|
526
|
-
}
|
|
527
|
-
bindActiveLanguageToAppShellState() {
|
|
528
|
-
this.storeService.select(getActiveLang).subscribe((activeLang) => {
|
|
529
|
-
if (activeLang !== this.state.activeLanguage) {
|
|
530
|
-
this.setState({
|
|
531
|
-
...this.state,
|
|
532
|
-
activeLanguage: activeLang,
|
|
533
|
-
}, false);
|
|
534
|
-
}
|
|
535
|
-
});
|
|
536
|
-
}
|
|
537
|
-
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.0-next.3", ngImport: i0, type: UxAppShellService, 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 }); }
|
|
538
|
-
/** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.0-next.3", ngImport: i0, type: UxAppShellService, providedIn: 'root' }); }
|
|
539
|
-
}
|
|
540
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.0-next.3", ngImport: i0, type: UxAppShellService, decorators: [{
|
|
541
|
-
type: Injectable,
|
|
542
|
-
args: [{
|
|
543
|
-
providedIn: 'root',
|
|
544
|
-
}]
|
|
545
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
546
|
-
type: Optional
|
|
547
|
-
}, {
|
|
548
|
-
type: Inject,
|
|
549
|
-
args: [GLOBAL_CONFIG_TOKEN]
|
|
550
|
-
}] }, { type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
551
|
-
type: Inject,
|
|
552
|
-
args: [PLATFORM_ID]
|
|
553
|
-
}] }, { type: i2.Router }, { type: i3.StoreService }, { type: i4.I18nService, decorators: [{
|
|
554
|
-
type: Optional
|
|
555
|
-
}] }]; } });
|
|
556
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXgtYXBwLXNoZWxsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3V4LWFwcC1zaGVsbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBZ0IsYUFBYSxFQUE0QixNQUFNLFdBQVcsQ0FBQztBQUNsRyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQVUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNELE9BQU8sT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQ3hDLE9BQU8sR0FBRyxNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBZ0VoQyxNQUFNLFlBQVksR0FBWTtJQUMxQixPQUFPLEVBQUUsRUFBRTtJQUNYLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixZQUFZLEVBQUUsSUFBSTtJQUNsQixxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLGNBQWMsRUFBRSxLQUFLO0lBQ3JCLGVBQWUsRUFBRSxLQUFLO0lBQ3RCLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IsNEJBQTRCLEVBQUUsS0FBSztJQUNuQyxzQkFBc0IsRUFBRSxJQUFJO0lBQzVCLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFNBQVMsRUFBRSxL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OzBCQUV0QyxNQUFNOzJCQUFDLFdBQVc7OzBCQUdsQixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGRlZmVyLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFdWlFdUxhbmd1YWdlcywgR2xvYmFsQ29uZmlnLCBnZXRBY3RpdmVMYW5nLCBFdWlMYW5ndWFnZSwgRXVpTWVudUl0ZW0gfSBmcm9tICdAZXVpL2Jhc2UnO1xuaW1wb3J0IHsgR0xPQkFMX0NPTkZJR19UT0tFTiB9IGZyb20gJy4vY29uZmlnL3Rva2Vucyc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4vaTE4bic7XG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3RvcmVTZXJ2aWNlIH0gZnJvbSAnLi9zdG9yZS9zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gtZXMvaXNFcXVhbCc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC1lcy9nZXQnO1xuLy8gaW1wb3J0IHsgVXhSb290SW5qZWN0b3JHdWFyZCB9IGZyb20gJy4vdXgtcm9vdC1pbmplY3Rvci5ndWFyZCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVUlTdGF0ZSB7XG4gICAgLy8gYXBwIHN0YXRlXG4gICAgYXBwTmFtZT86IHN0cmluZztcbiAgICBhcHBTaG9ydE5hbWU/OiBzdHJpbmc7XG4gICAgYXBwU3ViVGl0bGU/OiBzdHJpbmc7XG5cbiAgICAvLyB1c2VyIHN0YXRlXG4gICAgdXNlckluZm9zPzogc3RyaW5nO1xuICAgIHVzZXJTdWJJbmZvcz86IHN0cmluZztcbiAgICBpbXBlcnNvbmF0ZWRVc2VySW5mb3M/OiBzdHJpbmc7XG5cbiAgICAvLyBTaWRlYmFyIHN0YXRlXG4gICAgaXNTaWRlYmFyT3Blbj86IGJvb2xlYW47XG4gICAgaXNTaWRlYmFySG92ZXI/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhckFjdGl2ZT86IGJvb2xlYW47XG4gICAgaXNTaWRlYmFySW5uZXJBY3RpdmU/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnM/OiBib29sZWFuO1xuICAgIGlzU2lkZWJhckV4cGFuZE9uSG92ZXI/OiBib29sZWFuO1xuICAgIGhhc1NpZGViYXI/OiBib29sZWFuO1xuICAgIGhhc0JyZWFkY3J1bWI/OiBib29sZWFuO1xuICAgIGhhc0hlYWRlcj86IGJvb2xlYW47XG4gICAgaGFzSGVhZGVyTG9nbz86IGJvb2xlYW47XG4gICAgaGFzSGVhZGVyRW52aXJvbm1lbnQ/OiBib29sZWFuO1xuICAgIGhhc1Rvb2xiYXI/OiBib29sZWFuO1xuICAgIGhhc1Rvb2xiYXJNZW51PzogYm9vbGVhbjtcbiAgICBlbnZpcm9ubWVudFZhbHVlPzogc3RyaW5nO1xuICAgIGlzU2lkZWJhckhpZGRlbj86IGJvb2xlYW47XG4gICAgaGFzVG9wTWVzc2FnZT86IGJvb2xlYW47XG5cbiAgICAvLyB3aW5kb3cgc3RhdGVcbiAgICB3aW5kb3dXaWR0aD86IG51bWJlcjtcbiAgICB3aW5kb3dIZWlnaHQ/OiBudW1iZXI7XG4gICAgbWFpbkNvbnRlbnRIZWlnaHQ/OiBudW1iZXI7XG4gICAgcGFnZUhlYWRlckhlaWdodD86IG51bWJlcjtcbiAgICBicmVha3BvaW50Pzogc3RyaW5nO1xuICAgIHdyYXBwZXJDbGFzc2VzPzogc3RyaW5nO1xuICAgIGJyZWFrcG9pbnRzPzogYW55O1xuXG4gICAgLy8gbmF2aWdhdGlvbiBzdGF0ZVxuICAgIG1lbnVMaW5rcz86IEV1aU1lbnVJdGVtW107XG4gICAgc2lkZWJhckxpbmtzPzogRXVpTWVudUl0ZW1bXTtcbiAgICBjb21iaW5lZExpbmtzPzogRXVpTWVudUl0ZW1bXTtcblxuICAgIC8vIG90aGVyIHN0YXRlc1xuICAgIGlzQmxvY2tEb2N1bWVudEFjdGl2ZT86IGJvb2xlYW47XG5cbiAgICAvLyBkZXZpY2UgaW5mb1xuICAgIGRldmljZUluZm86IGFueTtcblxuICAgIC8vIGxhbmd1YWdlIGluZm9zXG4gICAgYWN0aXZlTGFuZ3VhZ2U6IHN0cmluZztcbiAgICBsYW5ndWFnZXM6IChzdHJpbmcgfCBFdWlMYW5ndWFnZSlbXTtcblxuICAgIC8vIGFwcCBtZXRhZGF0YVxuICAgIGFwcE1ldGFkYXRhOiBhbnk7XG5cbiAgICAvLyB2YXJpb3VzIGR5bmFtaWMgc3RhdGVcbiAgICBoYXNNb2RhbEFjdGl2ZT86IGJvb2xlYW47XG4gICAgaXNEaW1tZXJBY3RpdmU/OiBib29sZWFuOyAvLyBVc2FnZTogbWFwIHRvIGV1aSBiYXNlIGRpcmVjdGl2ZSBpbnB1dCBjb2VyY2UgZXVpSGlnaGxpZ2h0ZWRcbn1cblxuY29uc3QgaW5pdGlhbFN0YXRlOiBVSVN0YXRlID0ge1xuICAgIGFwcE5hbWU6ICcnLFxuICAgIGFwcFNob3J0TmFtZTogJycsXG4gICAgYXBwU3ViVGl0bGU6ICcnLFxuICAgIHVzZXJJbmZvczogbnVsbCxcbiAgICB1c2VyU3ViSW5mb3M6IG51bGwsXG4gICAgaW1wZXJzb25hdGVkVXNlckluZm9zOiBudWxsLFxuICAgIGlzU2lkZWJhck9wZW46IHRydWUsXG4gICAgaXNTaWRlYmFySG92ZXI6IGZhbHNlLFxuICAgIGlzU2lkZWJhckFjdGl2ZTogZmFsc2UsXG4gICAgaXNTaWRlYmFySW5uZXJBY3RpdmU6IGZhbHNlLFxuICAgIGlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnM6IGZhbHNlLFxuICAgIGlzU2lkZWJhckV4cGFuZE9uSG92ZXI6IHRydWUsXG4gICAgaGFzU2lkZWJhcjogZmFsc2UsXG4gICAgaGFzSGVhZGVyOiBmYWxzZSxcbiAgICBoYXNCcmVhZGNydW1iOiBmYWxzZSxcbiAgICBoYXNIZWFkZXJMb2dvOiBmYWxzZSxcbiAgICBoYXNIZWFkZXJFbnZpcm9ubWVudDogZmFsc2UsXG4gICAgaGFzVG9vbGJhcjogZmFsc2UsXG4gICAgaGFzVG9vbGJhck1lbnU6IGZhbHNlLFxuICAgIGVudmlyb25tZW50VmFsdWU6ICcnLFxuICAgIGlzU2lkZWJhckhpZGRlbjogZmFsc2UsXG4gICAgaGFzVG9wTWVzc2FnZTogZmFsc2UsXG4gICAgd2luZG93V2lkdGg6IDAsXG4gICAgd2luZG93SGVpZ2h0OiAwLFxuICAgIG1haW5Db250ZW50SGVpZ2h0OiAwLFxuICAgIHBhZ2VIZWFkZXJIZWlnaHQ6IDAsXG4gICAgd3JhcHBlckNsYXNzZXM6ICcnLFxuICAgIGJyZWFrcG9pbnQ6ICcnLFxuICAgIGJyZWFrcG9pbnRzOiB7XG4gICAgICAgIGlzTW9iaWxlOiBmYWxzZSxcbiAgICAgICAgaXNUYWJsZXQ6IGZhbHNlLFxuICAgICAgICBpc0x0RGVza3RvcDogZmFsc2UsXG4gICAgICAgIGlzRGVza3RvcDogZmFsc2UsXG4gICAgICAgIGlzWEw6IGZhbHNlLFxuICAgICAgICBpc1hYTDogZmFsc2UsXG4gICAgfSxcbiAgICBtZW51TGlua3M6IFtdLFxuICAgIHNpZGViYXJMaW5rczogW10sXG4gICAgY29tYmluZWRMaW5rczogW10sXG4gICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlOiBmYWxzZSxcbiAgICBkZXZpY2VJbmZvOiBudWxsLFxuICAgIGFjdGl2ZUxhbmd1YWdlOiAnZW4nLFxuICAgIGxhbmd1YWdlczogRXVpRXVMYW5ndWFnZXMuZ2V0TGFuZ3VhZ2VzKCksXG4gICAgYXBwTWV0YWRhdGE6IG51bGwsXG4gICAgaGFzTW9kYWxBY3RpdmU6IGZhbHNlLFxuICAgIGlzRGltbWVyQWN0aXZlOiBmYWxzZSxcbn07XG5cbi8vIFRPRE86IHRoaXMgc2VydmljZSBuZWVkcyB0byBiZSB0cmFuc2ZlcnJlZCBpbiB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnRcbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFV4QXBwU2hlbGxTZXJ2aWNlIHtcbiAgICBuYXZpZ2F0aW9uU3RhcnRDdXN0b21IYW5kbGVyOiAoKSA9PiB2b2lkO1xuICAgIG5hdmlnYXRpb25FbmRDdXN0b21IYW5kbGVyOiAoKSA9PiB2b2lkO1xuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIGdldCBzdGF0ZSQoKTogT2JzZXJ2YWJsZTxVSVN0YXRlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIGV4cG9zZWQgb2JzZXJ2YWJsZXNcblxuICAgIGdldCBicmVha3BvaW50JCgpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJlYWtwb2ludCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgZ2V0IGJyZWFrcG9pbnRzJCgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYnJlYWtwb2ludHMkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBzdGF0ZSBvcGVyYXRpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLVxuICAgIGdldCBzdGF0ZSgpOiBVSVN0YXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0YXRlJC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBwdWJsaWMgc2V0dGVycyBhbmQgZnVuY3Rpb25zXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIHNldCBpc1NpZGViYXJPcGVuKGlzT3BlbjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc1NpZGViYXJPcGVuOiBpc09wZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpc1NpZGViYXJPcGVuKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pc1NpZGViYXJPcGVuO1xuICAgIH1cblxuICAgIHNldCBpc1NpZGViYXJIb3Zlcihpc0hvdmVyOiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmlzU2lkZWJhckV4cGFuZE9uSG92ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgaXNTaWRlYmFySG92ZXI6IGlzSG92ZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBpc1NpZGViYXJIb3ZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNTaWRlYmFySG92ZXI7XG4gICAgfVxuXG4gICAgc2V0IGlzU2lkZWJhckFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc1NpZGViYXJBY3RpdmU6IGlzQWN0aXZlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgaXNTaWRlYmFySW5uZXJBY3RpdmUoaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhcklubmVyQWN0aXZlOiBpc09wZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBzaWRlYmFyTGlua3MobGlua3M6IEV1aU1lbnVJdGVtW10pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgc2lkZWJhckxpbmtzOiBsaW5rcyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0IG1lbnVMaW5rcyhsaW5rczogRXVpTWVudUl0ZW1bXSkge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBtZW51TGlua3M6IGxpbmtzLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgaXNCbG9ja0RvY3VtZW50QWN0aXZlKGlzQWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzQmxvY2tEb2N1bWVudEFjdGl2ZTogaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBoYXNIZWFkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmhhc0hlYWRlcjtcbiAgICB9XG5cbiAgICAvLyBFZGl0IG1vZGVcbiAgICBnZXQgaXNEaW1tZXJBY3RpdmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmlzRGltbWVyQWN0aXZlO1xuICAgIH1cblxuICAgIHNldCBpc0RpbW1lckFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc0RpbW1lckFjdGl2ZTogaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgY3NzVmFycyA9IFtdO1xuICAgIHByaXZhdGUgX3N0YXRlJDogQmVoYXZpb3JTdWJqZWN0PFVJU3RhdGU+O1xuICAgIHByaXZhdGUgX2JyZWFrcG9pbnQkOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPjtcbiAgICBwcml2YXRlIF9icmVha3BvaW50cyQ6IEJlaGF2aW9yU3ViamVjdDxhbnk+O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoR0xPQkFMX0NPTkZJR19UT0tFTikgcHJvdGVjdGVkIGNvbmZpZzogR2xvYmFsQ29uZmlnLFxuICAgICAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogb2JqZWN0LFxuICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgICAgICBwcml2YXRlIHN0b3JlU2VydmljZTogU3RvcmVTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZVxuICAgICkge1xuICAgICAgICBsZXQgc3RhdGVXaXRoQ29uZmlnID0gaW5pdGlhbFN0YXRlO1xuICAgICAgICBjb25zdCBsYW5ndWFnZXMgPSBjb25maWc/LmkxOG4/LmkxOG5TZXJ2aWNlPy5sYW5ndWFnZXMgfHwgaW5pdGlhbFN0YXRlLmxhbmd1YWdlcztcbiAgICAgICAgY29uc3QgZGVmYXVsdExhbmd1YWdlID0gY29uZmlnPy5pMThuPy5pMThuU2VydmljZT8uZGVmYXVsdExhbmd1YWdlIHx8IGluaXRpYWxTdGF0ZS5hY3RpdmVMYW5ndWFnZTtcbiAgICAgICAgc3RhdGVXaXRoQ29uZmlnID0ge1xuICAgICAgICAgICAgLi4uc3RhdGVXaXRoQ29uZmlnLFxuICAgICAgICAgICAgLi4ue1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlcyxcbiAgICAgICAgICAgICAgICBhY3RpdmVMYW5ndWFnZTogZGVmYXVsdExhbmd1YWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChzdGF0ZVdpdGhDb25maWcpO1xuICAgICAgICB0aGlzLl9icmVha3BvaW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgICAgICB0aGlzLl9icmVha3BvaW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgICAgICAgdGhpcy5iaW5kQWN0aXZlTGFuZ3VhZ2VUb0FwcFNoZWxsU3RhdGUoKTtcblxuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgcm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRTdGF0ZShuZXh0U3RhdGU6IFVJU3RhdGUsIHVwZGF0ZUkxOCA9IHRydWUpIHtcbiAgICAgICAgbGV0IGJyZWFrcG9pbnQsIGJyZWFrcG9pbnRzLCB3cmFwcGVyQ2xhc3NlcztcbiAgICAgICAgbGV0IGNvbWJpbmVkTGlua3M7XG5cbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHdpbmRvdyB3aWR0aCBoYXMgYmVlbiB1cGRhdGVkIGZyb20gcHJldmlvdXMgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUud2luZG93V2lkdGggIT09IG5leHRTdGF0ZS53aW5kb3dXaWR0aCkge1xuICAgICAgICAgICAgYnJlYWtwb2ludCA9IHRoaXMuZ2V0QnJlYWtwb2ludChuZXh0U3RhdGUud2luZG93V2lkdGgpO1xuICAgICAgICAgICAgYnJlYWtwb2ludHMgPSB0aGlzLmdldEJyZWFrcG9pbnRzKGJyZWFrcG9pbnQpO1xuXG4gICAgICAgICAgICB0aGlzLl9icmVha3BvaW50JC5uZXh0KGJyZWFrcG9pbnQpO1xuICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludHMkLm5leHQoYnJlYWtwb2ludHMpO1xuXG4gICAgICAgICAgICAvLyBpZiBub3QgcHJvcGFnYXRlIHRoZSBvbGQgb25lcyB3aXRob3V0IGRvaW5nIGFueSBjYWxjdWxhdGlvbnNcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGJyZWFrcG9pbnQgPSBzdGF0ZS5icmVha3BvaW50O1xuICAgICAgICAgICAgYnJlYWtwb2ludHMgPSBzdGF0ZS5icmVha3BvaW50cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGZpbmFsbHkgZ2V0IHRoZSB3cmFwcGVyIGNsYXNzZXMgd2hlbiBib3RoIHRoZSBzdGF0ZSBhbmQgYnJlYWtwb2ludCBhcmUga25vd25cbiAgICAgICAgd3JhcHBlckNsYXNzZXMgPSB0aGlzLmdldFdyYXBwZXJDbGFzc2VzKG5leHRTdGF0ZSwgYnJlYWtwb2ludCk7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIG1lbnVMaW5rcyBvciBzaWRlYmFyTGlua3MgaGF2ZSBjaGFuZ2VkIGZyb20gcHJldmlvdXMgc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUubWVudUxpbmtzICE9PSBuZXh0U3RhdGUubWVudUxpbmtzIHx8IHRoaXMuc3RhdGUuc2lkZWJhckxpbmtzICE9PSBuZXh0U3RhdGUuc2lkZWJhckxpbmtzKSB7XG4gICAgICAgICAgICBjb21iaW5lZExpbmtzID0gWy4uLm5leHRTdGF0ZS5tZW51TGlua3MsIC4uLm5leHRTdGF0ZS5zaWRlYmFyTGlua3NdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tYmluZWRMaW5rcyA9IHRoaXMuc3RhdGUuY29tYmluZWRMaW5rcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0YXRlQmVmb3JlVXBkYXRlID0geyAuLi50aGlzLnN0YXRlIH07XG5cbiAgICAgICAgLy8gd2UgcHV0IGl0IGFsbCB0b2dldGhlciB3aXRoIHRoZSBjYWxjdWxhdGVkIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy5fc3RhdGUkLm5leHQoe1xuICAgICAgICAgICAgLi4ubmV4dFN0YXRlLFxuICAgICAgICAgICAgd3JhcHBlckNsYXNzZXMsXG4gICAgICAgICAgICBicmVha3BvaW50LFxuICAgICAgICAgICAgYnJlYWtwb2ludHMsXG4gICAgICAgICAgICBjb21iaW5lZExpbmtzLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyB1cGRhdGUgdGhlIFN0b3JlIExhbmd1YWdlXG4gICAgICAgIGlmICh1cGRhdGVJMTggJiYgbmV4dFN0YXRlLmFjdGl2ZUxhbmd1YWdlICE9PSBzdGF0ZUJlZm9yZVVwZGF0ZS5hY3RpdmVMYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5pMThuU2VydmljZS51cGRhdGVTdGF0ZSh7IGFjdGl2ZUxhbmc6IG5leHRTdGF0ZS5hY3RpdmVMYW5ndWFnZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGEgc2xpY2UgZnJvbSB0aGUgc3RhdGUgd2hldGhlciB0aGF0IGNoYW5nZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSBrZXkgY2FuIGJlICdrZXknIG9yICdrZXkuc3ViLnN1YidcbiAgICAgKi9cbiAgICBnZXRTdGF0ZShrZXk/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGtleSBleGlzdHNcbiAgICAgICAgICAgIGtleVxuICAgICAgICAgICAgICAgID8gdGhpcy5zdGF0ZSQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICBtYXAoKHN0YXRlKSA9PiBnZXQoc3RhdGUsIGtleSkpLFxuICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlcigoc3RhdGUpID0+IHN0YXRlKSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoeCwgeSkgPT4gaXNFcXVhbCh4LCB5KSlcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IHRoaXMuc3RhdGUkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNpZGViYXJUb2dnbGUoKSB7XG4gICAgICAgIHRoaXMuaXNTaWRlYmFyT3BlbiA9ICF0aGlzLnN0YXRlLmlzU2lkZWJhck9wZW47XG4gICAgfVxuXG4gICAgLy8gRWRpdCBtb2RlXG4gICAgcHVibGljIGRpbW1lckFjdGl2ZVRvZ2dsZSgpIHtcbiAgICAgICAgY29uc3QgaXNBY3RpdmUgPSB0aGlzLmlzRGltbWVyQWN0aXZlO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc0RpbW1lckFjdGl2ZTogIWlzQWN0aXZlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hY3RpdmF0ZUVkaXRNb2RlQ3NzVmFycyghaXNBY3RpdmUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaW1tZXJBY3RpdmVTdGF0ZShhY3RpdmVTdGF0ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc0RpbW1lckFjdGl2ZTogYWN0aXZlU3RhdGUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRWRpdE1vZGVDc3NWYXJzKGFjdGl2ZVN0YXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVFZGl0TW9kZUNzc1ZhcnMoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktZG9jcGFnZS1uYXZpZ2F0aW9uLXotaW5kZXgnLCAnaW5oZXJpdCcpOyAvLyBSZXNldCBkb2MtcGFnZS1uYXZpZ2F0aW9uLWNvbHVtbiB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1zaWRlYmFyJywgJ2luaGVyaXQnKTsgLy8gUmVzZXQgZXVpLWFwcC1zaWRlYmFyIHotaW5kZXhcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS16LWluZGV4LXJvb3QnLCAnaW5oZXJpdCcpOyAvLyBSZXNldCBldWktYXBwLW1haW4tY29udGVudCB6LWluZGV4XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktZG9jcGFnZS1uYXZpZ2F0aW9uLXotaW5kZXgnLCAnMicpOyAvLyBSZXN0b3JlIGRvYy1wYWdlLW5hdmlnYXRpb24tY29sdW1uIHotaW5kZXhcbiAgICAgICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS16LWluZGV4LXNpZGViYXInLCAnMTA0NCcpOyAvLyBSZXN0b3JlIGV1aS1hcHAtc2lkZWJhciB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1yb290JywgJzEnKTsgLy8gUmVzdG9yZSBldWktYXBwLW1haW4tY29udGVudCB6LWluZGV4XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgIC8vIHB1YmxpYyBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS1cbiAgICBwdWJsaWMgZmV0Y2hBcHBNZXRhZGF0YShtZXRhZGF0YUZpbGVQYXRoID0gJ2Fzc2V0cy9hcHAtbWV0YWRhdGEuanNvbicpIHtcbiAgICAgICAgdGhpcy5nZXRKc29uKG1ldGFkYXRhRmlsZVBhdGgpLnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgYXBwTWV0YWRhdGE6IGRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzU2lkZWJhcjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmlzU2lkZWJhckhpZGRlbikge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVNpZGViYXJDc3NWYXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2YXRlU2lkZWJhckhlYWRlckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyRm9vdGVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2YXRlU2lkZWJhckZvb3RlckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVIZWFkZXIoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGhhc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVIZWFkZXJDc3NWYXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlQnJlYWRjcnVtYigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzQnJlYWRjcnVtYjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVCcmVhZGNydW1iQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVRvcE1lc3NhZ2UoaGVpZ2h0OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzVG9wTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVUb3BNZXNzYWdlQ3NzVmFycyhoZWlnaHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVRvb2xiYXIoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGhhc1Rvb2xiYXI6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlVG9vbGJhckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVUb29sYmFyTWVudSgpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzVG9vbGJhck1lbnU6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBmZXRjaENzc1ZhcnMoKSB7XG4gICAgICAgIGNvbnN0IGNzc1Zhck5hbWVzID0gW1xuICAgICAgICAgICAgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtc2hyaW5rJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtYnJlYWRjcnVtYi1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLWJyZWFkY3J1bWItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXRvcC1tZXNzYWdlLWhlaWdodC1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9wLW1lc3NhZ2UtaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXRvcC1tZXNzYWdlLWhlaWdodC1zaHJpbmsnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlLWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlLWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodC1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodC1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jc3NWYXJzID0gY3NzVmFyTmFtZXMubWFwKCh2KSA9PiAoeyBrZXk6IHYsIHZhbHVlOiB0aGlzLmdldENzc1ZhclZhbHVlKHYpIH0pKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdENzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtYnJlYWRjcnVtYi1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtYnJlYWRjcnVtYi1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC10b3AtbWVzc2FnZS1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtdG9wLW1lc3NhZ2UtaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlLWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUhlYWRlckNzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICB9XG4gICAgcHVibGljIGFjdGl2YXRlQnJlYWRjcnVtYkNzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtYnJlYWRjcnVtYi1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1icmVhZGNydW1iLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVRvcE1lc3NhZ2VDc3NWYXJzKGhlaWdodDogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKCctLWV1aS1hcHAtdG9wLW1lc3NhZ2UtaGVpZ2h0JywgYCR7aGVpZ2h0fXB4YCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9vbGJhckNzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUZvb3RlckNzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtZm9vdGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWZvb3Rlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0SGVhZGVyU2hyaW5rQ3NzVmFyKGFjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAoYWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtc2hyaW5rJywgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWFjdGl2ZScsICctLWV1aS1hcHAtc2lkZWJhci13aWR0aCcpO1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlJyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbW92ZVNpZGViYXJDc3NWYXJzKCkge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0Jyk7XG4gICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnLS1ldWktYXBwLXNpZGViYXItd2lkdGgnKTtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KCctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZScpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJIZWFkZXJDc3NWYXJzKCkge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJGb290ZXJDc3NWYXJzKCkge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHZpZXdwb3J0IGhlaWdodCBhbmQgd2lkdGggYW5kIG11bHRpcGxlIGl0IGJ5IDElIHRvIGdldCBhIHZhbHVlIGZvciBhIHZoL3Z3IHVuaXRcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBpbiB0aGUgLS1ldWktYXBwLXZoIGN1c3RvbSBwcm9wZXJ0eSB0byB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBpbiB0aGUgLS1ldWktYXBwLXZ3IGN1c3RvbSBwcm9wZXJ0eSB0byB0aGUgcm9vdCBvZiB0aGUgZG9jdW1lbnRcbiAgICAgKiBFeGFtcGxlIGZvciAxMDAlIGhlaWdodDogY2FsYyh2YXIoLS1ldWktYXBwLXZoLCAxdmgpICogMTAwKTtcbiAgICAgKiBFeGFtcGxlIGZvciA1MCUgaGVpZ2h0OiBjYWxjKHZhcigtLWV1aS1hcHAtdmgsIDF2aCkgKiA1MCk7XG4gICAgICogRXhhbXBsZSBmb3IgNTAlIHdpZHRoOiBjYWxjKHZhcigtLWV1aS1hcHAtdncsIDF2dykgKiA1MCk7XG4gICAgICovXG4gICAgcHVibGljIHNldEFwcFZpZXdwb3J0Q3NzVmFycygpIHtcbiAgICAgICAgbGV0IHZoID0gd2luZG93LmlubmVySGVpZ2h0ICogMC4wMTtcbiAgICAgICAgbGV0IHZ3ID0gd2luZG93LmlubmVyV2lkdGggKiAwLjAxO1xuICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktYXBwLXZoJywgYCR7dmh9cHhgKTtcbiAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWFwcC12dycsIGAke3Z3fXB4YCk7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gcHJpdmF0ZSBnZXR0ZXJzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgcHJpdmF0ZSBnZXRDc3NWYXJWYWx1ZShpbnB1dFByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShpbnB1dFByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENzc1ZhcihpbnB1dFByb3BlcnR5LCBvdXRwdXRQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBjc3NWYXJWYWx1ZSA9IHRoaXMuY3NzVmFycy5maWx0ZXIoKHYpID0+IHYua2V5ID09PSBpbnB1dFByb3BlcnR5KVswXS52YWx1ZTtcbiAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUob3V0cHV0UHJvcGVydHksIGNzc1ZhclZhbHVlKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coaW5wdXRQcm9wZXJ0eSwgb3V0cHV0UHJvcGVydHksIGNzc1ZhclZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRDc3NWYXJWYWx1ZSh2YXJOYW1lLCB2YXJWYWx1ZSkge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkodmFyTmFtZSwgdmFyVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0V3JhcHBlckNsYXNzZXMoc3RhdGU6IFVJU3RhdGUsIGJyZWFrcG9pbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGNsYXNzZXMucHVzaChicmVha3BvaW50KTtcblxuICAgICAgICBpZiAoc3RhdGUuaGFzU2lkZWJhcikge1xuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhck9wZW4gJiYgKHN0YXRlLmlzU2lkZWJhckFjdGl2ZSB8fCBzdGF0ZS5pc1NpZGViYXJJbm5lckFjdGl2ZSkpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtb3BlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzdGF0ZS5pc1NpZGViYXJPcGVuICYmIChzdGF0ZS5pc1NpZGViYXJBY3RpdmUgfHwgc3RhdGUuaXNTaWRlYmFySW5uZXJBY3RpdmUpKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLXN0YXRlLWNsb3NlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFyQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhcklubmVyQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLWlubmVyLWFjdGl2ZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnMpIHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtY2xvc2Utd2l0aC1pY29ucycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBORVcgQVBQLVNIRUxMIHByb3BzXG4gICAgICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFySGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1oaWRkZW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJPcGVuKSB7XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1vcGVuJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0tY2xvc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJIb3Zlcikge1xuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0taG92ZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzRkYpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnZmYnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzSUUpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaWUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzSUUxMSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpZTExJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmRldmljZUluZm8gJiYgc3RhdGUuZGV2aWNlSW5mby5pc0Nocm9tZSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdjaHJvbWUnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2xhc3Nlcy5qb2luKCcgJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCcmVha3BvaW50KHdpbmRvd1dpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYmtwID0gJyc7XG5cbiAgICAgICAgc3dpdGNoICh0cnVlKSB7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDAgJiYgd2luZG93V2lkdGggPCA1NzY6XG4gICAgICAgICAgICAgICAgYmtwID0gJ3hzJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gNTc2ICYmIHdpbmRvd1dpZHRoIDwgNzY4OlxuICAgICAgICAgICAgICAgIGJrcCA9ICdzbSc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDc2OCAmJiB3aW5kb3dXaWR0aCA8IDk5MjpcbiAgICAgICAgICAgICAgICBia3AgPSAnbWQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSA5OTIgJiYgd2luZG93V2lkdGggPCAxMjAwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICdsZyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDEyMDAgJiYgd2luZG93V2lkdGggPCAxNDAwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICd4bCc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIHdpbmRvd1dpZHRoID49IDE0MDAgJiYgd2luZG93V2lkdGggPCAxOTIwOlxuICAgICAgICAgICAgICAgIGJrcCA9ICd4eGwnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSB3aW5kb3dXaWR0aCA+PSAxOTIwICYmIHdpbmRvd1dpZHRoIDwgMjU2MDpcbiAgICAgICAgICAgICAgICBia3AgPSAnZmhkJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMjU2MCAmJiB3aW5kb3dXaWR0aCA8IDM4NDA6XG4gICAgICAgICAgICAgICAgYmtwID0gJzJrJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2Ugd2luZG93V2lkdGggPj0gMzg0MDpcbiAgICAgICAgICAgICAgICBia3AgPSAnNGsnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBia3A7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCcmVha3BvaW50cyhia3A6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc01vYmlsZTogYmtwID09PSAneHMnIHx8IGJrcCA9PT0gJ3NtJyxcbiAgICAgICAgICAgIGlzVGFibGV0OiBia3AgPT09ICdtZCcsXG4gICAgICAgICAgICBpc0x0RGVza3RvcDogYmtwID09PSAneHMnIHx8IGJrcCA9PT0gJ3NtJyB8fCBia3AgPT09ICdtZCcsXG4gICAgICAgICAgICBpc0Rlc2t0b3A6IGJrcCA9PT0gJ2xnJyxcbiAgICAgICAgICAgIGlzWEw6IGJrcCA9PT0gJ3hsJyxcbiAgICAgICAgICAgIGlzWFhMOiBia3AgPT09ICd4eGwnLFxuICAgICAgICAgICAgaXNGSEQ6IGJrcCA9PT0gJ2ZoZCcsXG4gICAgICAgICAgICBpczJLOiBia3AgPT09ICcyaycsXG4gICAgICAgICAgICBpczRLOiBia3AgPT09ICc0aycsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRKc29uKHVybDogc3RyaW5nKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsKS50b1Byb21pc2UoKS50aGVuKHRoaXMuZXh0cmFjdERhdGEpLmNhdGNoKHRoaXMuaGFuZGxlRXJyb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZXh0cmFjdERhdGEocmVzOiBSZXNwb25zZSkge1xuICAgICAgICBjb25zdCBib2R5ID0gcmVzO1xuICAgICAgICByZXR1cm4gYm9keSB8fCB7fTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZUVycm9yKGVycm9yOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBbiBlcnJvciBvY2N1cnJlZCcsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yLm1lc3NhZ2UgfHwgZXJyb3IpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZEFjdGl2ZUxhbmd1YWdlVG9BcHBTaGVsbFN0YXRlKCkge1xuICAgICAgICB0aGlzLnN0b3JlU2VydmljZS5zZWxlY3QoZ2V0QWN0aXZlTGFuZykuc3Vic2NyaWJlKChhY3RpdmVMYW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlTGFuZyAhPT0gdGhpcy5zdGF0ZS5hY3RpdmVMYW5ndWFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVMYW5ndWFnZTogYWN0aXZlTGFuZyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|