@worktile/planet 12.1.0 → 12.1.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.
- package/.all-contributorsrc +84 -0
- package/.circleci/config.yml +17 -0
- package/.coveralls.yml +1 -0
- package/.docgeni/public/assets/favicon.ico +0 -0
- package/.docgeni/public/index.html +13 -0
- package/.docgenirc.js +35 -0
- package/.dockerignore +1 -0
- package/.editorconfig +22 -0
- package/.github/FUNDING.yml +12 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.prettierignore +7 -0
- package/.prettierrc +28 -0
- package/.travis.yml +26 -0
- package/.wpmrc.js +11 -0
- package/CHANGELOG.md +391 -0
- package/CODE_OF_CONDUCT.md +76 -0
- package/Dockerfile +11 -0
- package/LICENSE +21 -0
- package/README.md +348 -0
- package/README.zh-CN.md +307 -0
- package/SECURITY.md +21 -0
- package/angular.json +373 -0
- package/commitlint.config.js +6 -0
- package/docs/api/defineApplication.md +46 -0
- package/docs/api/globalEventDispatcher.md +51 -0
- package/docs/api/index.md +5 -0
- package/docs/api/planet.md +117 -0
- package/docs/guides/getting-started.md +174 -0
- package/docs/guides/index.md +5 -0
- package/docs/guides/intro.md +216 -0
- package/examples/app1/browserslist +11 -0
- package/examples/app1/extra-webpack.config.js +33 -0
- package/examples/app1/karma.conf.js +31 -0
- package/examples/app1/postcss.config.js +1 -0
- package/examples/app1/src/app/app.module.ts +44 -0
- package/examples/app1/src/app/app.routing.ts +49 -0
- package/examples/app1/src/app/counter.service.ts +16 -0
- package/examples/app1/src/app/dashboard/dashboard.component.html +51 -0
- package/examples/app1/src/app/dashboard/dashboard.component.ts +70 -0
- package/examples/app1/src/app/detail/detail.component.html +8 -0
- package/examples/app1/src/app/detail/detail.component.ts +18 -0
- package/examples/app1/src/app/overlay.ts +26 -0
- package/examples/app1/src/app/projects/dialog/projects-dialog.component.html +10 -0
- package/examples/app1/src/app/projects/dialog/projects-dialog.component.ts +41 -0
- package/examples/app1/src/app/projects/projects.component.ts +33 -0
- package/examples/app1/src/app/root/root.component.css +3 -0
- package/examples/app1/src/app/root/root.component.html +16 -0
- package/examples/app1/src/app/root/root.component.ts +35 -0
- package/examples/app1/src/app/services/initialized-data.resolver.ts +15 -0
- package/examples/app1/src/app/shared.module.ts +57 -0
- package/examples/app1/src/app/user/detail/user-detail.component.html +5 -0
- package/examples/app1/src/app/user/detail/user-detail.component.ts +20 -0
- package/examples/app1/src/app/user/user-list.component.html +7 -0
- package/examples/app1/src/app/user/user-list.component.ts +20 -0
- package/examples/app1/src/app/user/user.module.ts +31 -0
- package/examples/app1/src/assets/.gitkeep +0 -0
- package/examples/app1/src/assets/github.png +0 -0
- package/examples/app1/src/assets/main.css +3 -0
- package/examples/app1/src/environments/environment.prod.ts +3 -0
- package/examples/app1/src/environments/environment.ts +16 -0
- package/examples/app1/src/favicon.ico +0 -0
- package/examples/app1/src/index.html +14 -0
- package/examples/app1/src/main.ts +35 -0
- package/examples/app1/src/polyfills.ts +84 -0
- package/examples/app1/src/styles.scss +35 -0
- package/examples/app1/src/test.ts +14 -0
- package/examples/app1/temp.js +221 -0
- package/examples/app1/tsconfig.app.json +10 -0
- package/examples/app1/tsconfig.spec.json +18 -0
- package/examples/app1/tslint.json +17 -0
- package/examples/app1/webpack.config.js +127 -0
- package/examples/app2/browserslist +11 -0
- package/examples/app2/extra-webpack.config.js +32 -0
- package/examples/app2/karma.conf.js +31 -0
- package/examples/app2/src/app/app.module.ts +90 -0
- package/examples/app2/src/app/dashboard/dashboard.component.html +21 -0
- package/examples/app2/src/app/dashboard/dashboard.component.ts +27 -0
- package/examples/app2/src/app/overlay.ts +26 -0
- package/examples/app2/src/app/projects/detail/detail.component.html +16 -0
- package/examples/app2/src/app/projects/detail/detail.component.ts +21 -0
- package/examples/app2/src/app/projects/project-list.component.html +29 -0
- package/examples/app2/src/app/projects/project-list.component.ts +58 -0
- package/examples/app2/src/app/projects/project.resolver.ts +15 -0
- package/examples/app2/src/app/projects/projects.service.ts +28 -0
- package/examples/app2/src/app/projects/tasks/tasks.component.html +10 -0
- package/examples/app2/src/app/projects/tasks/tasks.component.ts +16 -0
- package/examples/app2/src/app/projects/view/view.component.html +1 -0
- package/examples/app2/src/app/projects/view/view.component.ts +20 -0
- package/examples/app2/src/app/root/root.component.html +14 -0
- package/examples/app2/src/app/root/root.component.scss +12 -0
- package/examples/app2/src/app/root/root.component.ts +28 -0
- package/examples/app2/src/app/shared.module.ts +59 -0
- package/examples/app2/src/assets/.gitkeep +0 -0
- package/examples/app2/src/environments/environment.prod.ts +3 -0
- package/examples/app2/src/environments/environment.ts +16 -0
- package/examples/app2/src/favicon.ico +0 -0
- package/examples/app2/src/index.html +14 -0
- package/examples/app2/src/main.ts +36 -0
- package/examples/app2/src/polyfills.ts +84 -0
- package/examples/app2/src/styles.scss +28 -0
- package/examples/app2/src/test.ts +14 -0
- package/examples/app2/tsconfig.app.json +10 -0
- package/examples/app2/tsconfig.spec.json +18 -0
- package/examples/app2/tslint.json +7 -0
- package/examples/app2/webpack.config.js +92 -0
- package/examples/common/app-root-context.ts +10 -0
- package/examples/common/cache.ts +82 -0
- package/examples/common/index.ts +13 -0
- package/examples/common/module.ts +10 -0
- package/examples/common/overlay-container.service.ts +28 -0
- package/examples/common/section-card/section-card.component.html +5 -0
- package/examples/common/section-card/section-card.component.scss +15 -0
- package/examples/common/section-card/section-card.component.ts +11 -0
- package/examples/common/utils.ts +0 -0
- package/examples/portal/src/app/a-detail/a-detail.component.html +8 -0
- package/examples/portal/src/app/a-detail/a-detail.component.ts +18 -0
- package/examples/portal/src/app/about/about.component.html +27 -0
- package/examples/portal/src/app/about/about.component.scss +0 -0
- package/examples/portal/src/app/about/about.component.spec.ts +26 -0
- package/examples/portal/src/app/about/about.component.ts +26 -0
- package/examples/portal/src/app/app-routing.module.ts +57 -0
- package/examples/portal/src/app/app.component.html +73 -0
- package/examples/portal/src/app/app.component.scss +58 -0
- package/examples/portal/src/app/app.component.spec.ts +33 -0
- package/examples/portal/src/app/app.component.ts +111 -0
- package/examples/portal/src/app/app.module.ts +64 -0
- package/examples/portal/src/app/custom-settings.service.ts +44 -0
- package/examples/portal/src/app/overlay.ts +26 -0
- package/examples/portal/src/app/settings/settings.component.html +31 -0
- package/examples/portal/src/app/settings/settings.component.scss +3 -0
- package/examples/portal/src/app/settings/settings.component.ts +43 -0
- package/examples/portal/src/assets/.gitkeep +0 -0
- package/examples/portal/src/assets/apps.json +29 -0
- package/examples/portal/src/assets/icons/sprite.defs.svg +1 -0
- package/examples/portal/src/assets/images/logo.svg +16 -0
- package/examples/portal/src/assets/ngx-planet-micro-front-end.gif +0 -0
- package/examples/portal/src/browserslist +11 -0
- package/examples/portal/src/environments/environment.prod.ts +3 -0
- package/examples/portal/src/environments/environment.ts +16 -0
- package/examples/portal/src/extra-webpack.config.js +32 -0
- package/examples/portal/src/favicon.ico +0 -0
- package/examples/portal/src/index.html +14 -0
- package/examples/portal/src/karma.conf.js +31 -0
- package/examples/portal/src/main.ts +18 -0
- package/examples/portal/src/polyfills.ts +84 -0
- package/examples/portal/src/reboot.scss +14 -0
- package/examples/portal/src/styles.scss +14 -0
- package/examples/portal/src/test.ts +14 -0
- package/examples/portal/src/tsconfig.app.json +10 -0
- package/examples/portal/src/tsconfig.spec.json +9 -0
- package/examples/portal/src/tslint.json +7 -0
- package/extra-webpack.config.js +5 -0
- package/nginx.conf +17 -0
- package/package.json +121 -16
- package/packages/planet/karma.conf.js +37 -0
- package/packages/planet/ng-package.json +7 -0
- package/packages/planet/package.json +10 -0
- package/packages/planet/src/application/planet-application-loader.spec.ts +1102 -0
- package/packages/planet/src/application/planet-application-loader.ts +549 -0
- package/packages/planet/src/application/planet-application-ref.spec.ts +233 -0
- package/packages/planet/src/application/planet-application-ref.ts +131 -0
- package/packages/planet/src/application/planet-application.service.spec.ts +145 -0
- package/packages/planet/src/application/planet-application.service.ts +88 -0
- package/packages/planet/src/application/portal-application.spec.ts +53 -0
- package/packages/planet/src/application/portal-application.ts +28 -0
- package/packages/planet/src/assets-loader.spec.ts +689 -0
- package/packages/planet/src/assets-loader.ts +247 -0
- package/packages/planet/src/component/planet-component-loader.spec.ts +187 -0
- package/packages/planet/src/component/planet-component-loader.ts +173 -0
- package/packages/planet/src/component/planet-component-ref.ts +8 -0
- package/{component/plant-component.config.d.ts → packages/planet/src/component/plant-component.config.ts} +4 -4
- package/packages/planet/src/debug.spec.ts +58 -0
- package/packages/planet/src/debug.ts +66 -0
- package/packages/planet/src/empty/empty.component.spec.ts +34 -0
- package/packages/planet/src/empty/empty.component.ts +7 -0
- package/packages/planet/src/global-event-dispatcher.spec.ts +81 -0
- package/packages/planet/src/global-event-dispatcher.ts +82 -0
- package/packages/planet/src/global-planet.spec.ts +39 -0
- package/packages/planet/src/global-planet.ts +73 -0
- package/packages/planet/src/helpers.spec.ts +242 -0
- package/packages/planet/src/helpers.ts +125 -0
- package/packages/planet/src/module.spec.ts +79 -0
- package/packages/planet/src/module.ts +25 -0
- package/{planet.class.d.ts → packages/planet/src/planet.class.ts} +26 -5
- package/packages/planet/src/planet.spec.ts +226 -0
- package/packages/planet/src/planet.ts +113 -0
- package/{public-api.d.ts → packages/planet/src/public-api.ts} +4 -1
- package/packages/planet/src/sandbox/constants.ts +6 -0
- package/packages/planet/src/sandbox/exec.ts +22 -0
- package/packages/planet/src/sandbox/index.ts +24 -0
- package/packages/planet/src/sandbox/proxy/patches/document.ts +13 -0
- package/packages/planet/src/sandbox/proxy/patches/eventListener.ts +49 -0
- package/packages/planet/src/sandbox/proxy/patches/index.ts +13 -0
- package/packages/planet/src/sandbox/proxy/patches/storage.ts +53 -0
- package/packages/planet/src/sandbox/proxy/patches/timer.ts +50 -0
- package/packages/planet/src/sandbox/proxy/proxies/common.ts +137 -0
- package/packages/planet/src/sandbox/proxy/proxies/document.ts +140 -0
- package/packages/planet/src/sandbox/proxy/proxies/window.ts +176 -0
- package/packages/planet/src/sandbox/proxy/proxy-sandbox.ts +59 -0
- package/{sandbox/proxy/types.d.ts → packages/planet/src/sandbox/proxy/types.ts} +8 -2
- package/packages/planet/src/sandbox/sandbox.ts +20 -0
- package/packages/planet/src/sandbox/snapshot/snapshot-sandbox.ts +12 -0
- package/packages/planet/src/sandbox/types.ts +1 -0
- package/packages/planet/src/test.ts +16 -0
- package/packages/planet/src/testing/app1.module.ts +34 -0
- package/packages/planet/src/testing/app2.module.ts +24 -0
- package/packages/planet/src/testing/applications.ts +58 -0
- package/packages/planet/src/testing/index.ts +2 -0
- package/packages/planet/src/testing/utils.ts +31 -0
- package/packages/planet/tsconfig.lib.json +27 -0
- package/packages/planet/tsconfig.lib.prod.json +9 -0
- package/packages/planet/tsconfig.spec.json +17 -0
- package/packages/planet/tslint.json +7 -0
- package/postcss.config.js +3 -0
- package/proxy.conf.js +15 -0
- package/tsconfig.json +23 -0
- package/tslint.json +80 -0
- package/application/planet-application-loader.d.ts +0 -70
- package/application/planet-application-loader.d.ts.map +0 -1
- package/application/planet-application-loader.ngfactory.d.ts.map +0 -1
- package/application/planet-application-ref.d.ts +0 -36
- package/application/planet-application-ref.d.ts.map +0 -1
- package/application/planet-application.service.d.ts +0 -19
- package/application/planet-application.service.d.ts.map +0 -1
- package/application/planet-application.service.ngfactory.d.ts.map +0 -1
- package/application/portal-application.d.ts +0 -15
- package/application/portal-application.d.ts.map +0 -1
- package/assets-loader.d.ts +0 -33
- package/assets-loader.d.ts.map +0 -1
- package/assets-loader.ngfactory.d.ts.map +0 -1
- package/bundles/worktile-planet.umd.js +0 -2552
- package/bundles/worktile-planet.umd.js.map +0 -1
- package/component/planet-component-loader.d.ts +0 -28
- package/component/planet-component-loader.d.ts.map +0 -1
- package/component/planet-component-loader.ngfactory.d.ts.map +0 -1
- package/component/planet-component-ref.d.ts +0 -8
- package/component/planet-component-ref.d.ts.map +0 -1
- package/component/plant-component.config.d.ts.map +0 -1
- package/debug.d.ts +0 -22
- package/debug.d.ts.map +0 -1
- package/empty/empty.component.d.ts +0 -3
- package/empty/empty.component.d.ts.map +0 -1
- package/empty/empty.component.ngfactory.d.ts.map +0 -1
- package/esm2015/application/planet-application-loader.js +0 -452
- package/esm2015/application/planet-application-ref.js +0 -94
- package/esm2015/application/planet-application.service.js +0 -87
- package/esm2015/application/portal-application.js +0 -16
- package/esm2015/assets-loader.js +0 -217
- package/esm2015/component/planet-component-loader.js +0 -155
- package/esm2015/component/planet-component-ref.js +0 -3
- package/esm2015/component/plant-component.config.js +0 -7
- package/esm2015/debug.js +0 -33
- package/esm2015/empty/empty.component.js +0 -10
- package/esm2015/global-event-dispatcher.js +0 -71
- package/esm2015/global-planet.js +0 -51
- package/esm2015/helpers.js +0 -119
- package/esm2015/module.js +0 -27
- package/esm2015/planet.class.js +0 -9
- package/esm2015/planet.js +0 -90
- package/esm2015/public-api.js +0 -18
- package/esm2015/sandbox/constants.js +0 -7
- package/esm2015/sandbox/exec.js +0 -15
- package/esm2015/sandbox/index.js +0 -20
- package/esm2015/sandbox/proxy/patches/document.js +0 -12
- package/esm2015/sandbox/proxy/patches/eventListener.js +0 -41
- package/esm2015/sandbox/proxy/patches/index.js +0 -11
- package/esm2015/sandbox/proxy/patches/storage.js +0 -40
- package/esm2015/sandbox/proxy/patches/timer.js +0 -43
- package/esm2015/sandbox/proxy/proxies/common.js +0 -132
- package/esm2015/sandbox/proxy/proxies/document.js +0 -126
- package/esm2015/sandbox/proxy/proxies/window.js +0 -155
- package/esm2015/sandbox/proxy/proxy-sandbox.js +0 -49
- package/esm2015/sandbox/proxy/types.js +0 -2
- package/esm2015/sandbox/sandbox.js +0 -7
- package/esm2015/sandbox/snapshot/snapshot-sandbox.js +0 -12
- package/esm2015/sandbox/types.js +0 -2
- package/esm2015/worktile-planet.js +0 -6
- package/fesm2015/worktile-planet.js +0 -2036
- package/fesm2015/worktile-planet.js.map +0 -1
- package/global-event-dispatcher.d.ts +0 -20
- package/global-event-dispatcher.d.ts.map +0 -1
- package/global-event-dispatcher.ngfactory.d.ts.map +0 -1
- package/global-planet.d.ts +0 -23
- package/global-planet.d.ts.map +0 -1
- package/helpers.d.ts +0 -39
- package/helpers.d.ts.map +0 -1
- package/module.d.ts +0 -6
- package/module.d.ts.map +0 -1
- package/module.ngfactory.d.ts.map +0 -1
- package/planet.class.d.ts.map +0 -1
- package/planet.d.ts +0 -25
- package/planet.d.ts.map +0 -1
- package/planet.ngfactory.d.ts.map +0 -1
- package/public-api.d.ts.map +0 -1
- package/sandbox/constants.d.ts +0 -7
- package/sandbox/constants.d.ts.map +0 -1
- package/sandbox/exec.d.ts +0 -3
- package/sandbox/exec.d.ts.map +0 -1
- package/sandbox/index.d.ts +0 -7
- package/sandbox/index.d.ts.map +0 -1
- package/sandbox/proxy/patches/document.d.ts +0 -3
- package/sandbox/proxy/patches/document.d.ts.map +0 -1
- package/sandbox/proxy/patches/eventListener.d.ts +0 -3
- package/sandbox/proxy/patches/eventListener.d.ts.map +0 -1
- package/sandbox/proxy/patches/index.d.ts +0 -3
- package/sandbox/proxy/patches/index.d.ts.map +0 -1
- package/sandbox/proxy/patches/storage.d.ts +0 -15
- package/sandbox/proxy/patches/storage.d.ts.map +0 -1
- package/sandbox/proxy/patches/timer.d.ts +0 -3
- package/sandbox/proxy/patches/timer.d.ts.map +0 -1
- package/sandbox/proxy/proxies/common.d.ts +0 -13
- package/sandbox/proxy/proxies/common.d.ts.map +0 -1
- package/sandbox/proxy/proxies/document.d.ts +0 -14
- package/sandbox/proxy/proxies/document.d.ts.map +0 -1
- package/sandbox/proxy/proxies/window.d.ts +0 -13
- package/sandbox/proxy/proxies/window.d.ts.map +0 -1
- package/sandbox/proxy/proxy-sandbox.d.ts +0 -16
- package/sandbox/proxy/proxy-sandbox.d.ts.map +0 -1
- package/sandbox/proxy/types.d.ts.map +0 -1
- package/sandbox/sandbox.d.ts +0 -12
- package/sandbox/sandbox.d.ts.map +0 -1
- package/sandbox/snapshot/snapshot-sandbox.d.ts +0 -9
- package/sandbox/snapshot/snapshot-sandbox.d.ts.map +0 -1
- package/sandbox/types.d.ts +0 -2
- package/sandbox/types.d.ts.map +0 -1
- package/worktile-planet.d.ts +0 -6
- package/worktile-planet.d.ts.map +0 -1
- package/worktile-planet.metadata.json +0 -1
|
@@ -1,452 +0,0 @@
|
|
|
1
|
-
import { Injectable, NgZone, ApplicationRef, Injector } from '@angular/core';
|
|
2
|
-
import { of, Subject, forkJoin, from } from 'rxjs';
|
|
3
|
-
import { AssetsLoader } from '../assets-loader';
|
|
4
|
-
import { SwitchModes } from '../planet.class';
|
|
5
|
-
import { switchMap, share, map, tap, distinctUntilChanged, take, filter, catchError } from 'rxjs/operators';
|
|
6
|
-
import { getHTMLElement, coerceArray, createElementByTemplate } from '../helpers';
|
|
7
|
-
import { PlanetPortalApplication } from './portal-application';
|
|
8
|
-
import { PlanetApplicationService } from './planet-application.service';
|
|
9
|
-
import { GlobalEventDispatcher } from '../global-event-dispatcher';
|
|
10
|
-
import { Router } from '@angular/router';
|
|
11
|
-
import { globalPlanet, getPlanetApplicationRef, getApplicationLoader } from '../global-planet';
|
|
12
|
-
import { createDebug } from '../debug';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "../assets-loader";
|
|
15
|
-
import * as i2 from "./planet-application.service";
|
|
16
|
-
import * as i3 from "@angular/router";
|
|
17
|
-
const debug = createDebug('app-loader');
|
|
18
|
-
export var ApplicationStatus;
|
|
19
|
-
(function (ApplicationStatus) {
|
|
20
|
-
ApplicationStatus[ApplicationStatus["assetsLoading"] = 1] = "assetsLoading";
|
|
21
|
-
ApplicationStatus[ApplicationStatus["assetsLoaded"] = 2] = "assetsLoaded";
|
|
22
|
-
ApplicationStatus[ApplicationStatus["bootstrapping"] = 3] = "bootstrapping";
|
|
23
|
-
ApplicationStatus[ApplicationStatus["bootstrapped"] = 4] = "bootstrapped";
|
|
24
|
-
ApplicationStatus[ApplicationStatus["active"] = 5] = "active";
|
|
25
|
-
ApplicationStatus[ApplicationStatus["loadError"] = 10] = "loadError";
|
|
26
|
-
})(ApplicationStatus || (ApplicationStatus = {}));
|
|
27
|
-
export class PlanetApplicationLoader {
|
|
28
|
-
constructor(assetsLoader, planetApplicationService, ngZone, router, injector, applicationRef) {
|
|
29
|
-
this.assetsLoader = assetsLoader;
|
|
30
|
-
this.planetApplicationService = planetApplicationService;
|
|
31
|
-
this.ngZone = ngZone;
|
|
32
|
-
this.firstLoad = true;
|
|
33
|
-
this.inProgressAppAssetsLoads = new Map();
|
|
34
|
-
this.appsStatus = new Map();
|
|
35
|
-
this.portalApp = new PlanetPortalApplication();
|
|
36
|
-
this.routeChange$ = new Subject();
|
|
37
|
-
this.appStatusChange$ = new Subject();
|
|
38
|
-
this.appsLoadingStart$ = new Subject();
|
|
39
|
-
this.loadingDone = false;
|
|
40
|
-
if (getApplicationLoader()) {
|
|
41
|
-
throw new Error('PlanetApplicationLoader has been injected in the portal, repeated injection is not allowed');
|
|
42
|
-
}
|
|
43
|
-
this.options = {
|
|
44
|
-
switchMode: SwitchModes.default,
|
|
45
|
-
errorHandler: (error) => {
|
|
46
|
-
console.error(error);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
this.portalApp.ngZone = ngZone;
|
|
50
|
-
this.portalApp.applicationRef = applicationRef;
|
|
51
|
-
this.portalApp.router = router;
|
|
52
|
-
this.portalApp.injector = injector;
|
|
53
|
-
this.portalApp.globalEventDispatcher = injector.get(GlobalEventDispatcher);
|
|
54
|
-
globalPlanet.portalApplication = this.portalApp;
|
|
55
|
-
this.setupRouteChange();
|
|
56
|
-
}
|
|
57
|
-
get appStatusChange() {
|
|
58
|
-
return this.appStatusChange$.asObservable();
|
|
59
|
-
}
|
|
60
|
-
get appsLoadingStart() {
|
|
61
|
-
return this.appsLoadingStart$.asObservable();
|
|
62
|
-
}
|
|
63
|
-
setAppStatus(app, status) {
|
|
64
|
-
this.ngZone.run(() => {
|
|
65
|
-
const fromStatus = this.appsStatus.get(app);
|
|
66
|
-
debug(`app(${app.name}) status change: ${fromStatus ? ApplicationStatus[fromStatus] : 'empty'} => ${ApplicationStatus[status]}`);
|
|
67
|
-
this.appsStatus.set(app, status);
|
|
68
|
-
this.appStatusChange$.next({
|
|
69
|
-
app: app,
|
|
70
|
-
status: status
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
getAppStatusChange$(app, status = ApplicationStatus.bootstrapped) {
|
|
75
|
-
return this.appStatusChange.pipe(filter(event => {
|
|
76
|
-
return event.app === app && event.status === status;
|
|
77
|
-
}), map(() => {
|
|
78
|
-
return app;
|
|
79
|
-
}));
|
|
80
|
-
}
|
|
81
|
-
switchModeIsCoexist(app) {
|
|
82
|
-
if (app && app.switchMode) {
|
|
83
|
-
return app.switchMode === SwitchModes.coexist;
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
return this.options.switchMode === SwitchModes.coexist;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
errorHandler(error) {
|
|
90
|
-
this.ngZone.run(() => {
|
|
91
|
-
this.options.errorHandler(error);
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
setLoadingDone() {
|
|
95
|
-
this.ngZone.run(() => {
|
|
96
|
-
this.loadingDone = true;
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
getAppNames(apps) {
|
|
100
|
-
return apps.length === 0
|
|
101
|
-
? `[]`
|
|
102
|
-
: apps.map(item => {
|
|
103
|
-
return item.name;
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
setupRouteChange() {
|
|
107
|
-
this.routeChange$
|
|
108
|
-
.pipe(distinctUntilChanged((x, y) => {
|
|
109
|
-
return (x && x.url) === (y && y.url);
|
|
110
|
-
}),
|
|
111
|
-
// Using switchMap so we cancel executing loading when a new one comes in
|
|
112
|
-
switchMap(event => {
|
|
113
|
-
// Return new observable use of and catchError,
|
|
114
|
-
// in order to prevent routeChange$ completed which never trigger new route change
|
|
115
|
-
return of(event).pipe(
|
|
116
|
-
// unload apps and return should load apps
|
|
117
|
-
map(() => {
|
|
118
|
-
debug(`route change, url is: ${event.url}`);
|
|
119
|
-
this.startRouteChangeEvent = event;
|
|
120
|
-
const shouldLoadApps = this.planetApplicationService.getAppsByMatchedUrl(event.url);
|
|
121
|
-
debug(`should load apps: ${this.getAppNames(shouldLoadApps)}`);
|
|
122
|
-
const shouldUnloadApps = this.getUnloadApps(shouldLoadApps);
|
|
123
|
-
this.appsLoadingStart$.next({
|
|
124
|
-
shouldLoadApps,
|
|
125
|
-
shouldUnloadApps
|
|
126
|
-
});
|
|
127
|
-
this.unloadApps(shouldUnloadApps, event);
|
|
128
|
-
debug(`unload apps: ${this.getAppNames(shouldUnloadApps)}`);
|
|
129
|
-
return shouldLoadApps;
|
|
130
|
-
}),
|
|
131
|
-
// Load app assets (static resources)
|
|
132
|
-
switchMap(shouldLoadApps => {
|
|
133
|
-
let hasAppsNeedLoadingAssets = false;
|
|
134
|
-
const loadApps$ = shouldLoadApps.map(app => {
|
|
135
|
-
const appStatus = this.appsStatus.get(app);
|
|
136
|
-
if (!appStatus ||
|
|
137
|
-
appStatus === ApplicationStatus.assetsLoading ||
|
|
138
|
-
appStatus === ApplicationStatus.loadError) {
|
|
139
|
-
debug(`app(${app.name}) status is ${ApplicationStatus[appStatus]}, start load assets`);
|
|
140
|
-
hasAppsNeedLoadingAssets = true;
|
|
141
|
-
return this.ngZone.runOutsideAngular(() => {
|
|
142
|
-
return this.startLoadAppAssets(app);
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
return of(app);
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
if (hasAppsNeedLoadingAssets) {
|
|
150
|
-
this.loadingDone = false;
|
|
151
|
-
}
|
|
152
|
-
return loadApps$.length > 0 ? forkJoin(loadApps$) : of([]);
|
|
153
|
-
}),
|
|
154
|
-
// Bootstrap or show apps
|
|
155
|
-
map(apps => {
|
|
156
|
-
const apps$ = apps.map(app => {
|
|
157
|
-
return of(app).pipe(switchMap(app => {
|
|
158
|
-
const appStatus = this.appsStatus.get(app);
|
|
159
|
-
if (appStatus === ApplicationStatus.bootstrapped) {
|
|
160
|
-
debug(`[routeChange] app(${app.name}) status is bootstrapped, show app and active`);
|
|
161
|
-
this.showApp(app);
|
|
162
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
163
|
-
appRef.navigateByUrl(event.url);
|
|
164
|
-
this.setAppStatus(app, ApplicationStatus.active);
|
|
165
|
-
this.setLoadingDone();
|
|
166
|
-
return of(app);
|
|
167
|
-
}
|
|
168
|
-
else if (appStatus === ApplicationStatus.assetsLoaded) {
|
|
169
|
-
debug(`[routeChange] app(${app.name}) status is assetsLoaded, start bootstrapping`);
|
|
170
|
-
return this.bootstrapApp(app).pipe(map(() => {
|
|
171
|
-
debug(`app(${app.name}) bootstrapped success, active it`);
|
|
172
|
-
this.setAppStatus(app, ApplicationStatus.active);
|
|
173
|
-
this.setLoadingDone();
|
|
174
|
-
return app;
|
|
175
|
-
}));
|
|
176
|
-
}
|
|
177
|
-
else if (appStatus === ApplicationStatus.active) {
|
|
178
|
-
debug(`[routeChange] app(${app.name}) is active, do nothings`);
|
|
179
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
180
|
-
// Backwards compatibility sub app use old version which has not getCurrentRouterStateUrl
|
|
181
|
-
const currentUrl = appRef.getCurrentRouterStateUrl
|
|
182
|
-
? appRef.getCurrentRouterStateUrl()
|
|
183
|
-
: '';
|
|
184
|
-
if (currentUrl !== event.url) {
|
|
185
|
-
appRef.navigateByUrl(event.url);
|
|
186
|
-
}
|
|
187
|
-
return of(app);
|
|
188
|
-
}
|
|
189
|
-
else {
|
|
190
|
-
debug(`[routeChange] app(${app.name}) status is ${ApplicationStatus[appStatus]}`);
|
|
191
|
-
return this.getAppStatusChange$(app).pipe(take(1), map(() => {
|
|
192
|
-
debug(`app(${app.name}) status is bootstrapped by subscribe status change, active it`);
|
|
193
|
-
this.setAppStatus(app, ApplicationStatus.active);
|
|
194
|
-
this.showApp(app);
|
|
195
|
-
return app;
|
|
196
|
-
}));
|
|
197
|
-
}
|
|
198
|
-
}));
|
|
199
|
-
});
|
|
200
|
-
if (apps$.length > 0) {
|
|
201
|
-
debug(`start load and active apps: ${this.getAppNames(apps)}`);
|
|
202
|
-
// 切换到应用后会有闪烁现象,所以使用 setTimeout 后启动应用
|
|
203
|
-
// example: redirect to app1's dashboard from portal's about page
|
|
204
|
-
// If app's route has redirect, it doesn't work, it ok just in setTimeout, I don't know why.
|
|
205
|
-
// TODO:: remove it, it is ok in version Angular 9.x
|
|
206
|
-
setTimeout(() => {
|
|
207
|
-
// 此处判断是因为如果静态资源加载完毕还未启动被取消,还是会启动之前的应用,虽然可能性比较小,但是无法排除这种可能性,所以只有当 Event 是最后一个才会启动
|
|
208
|
-
if (this.startRouteChangeEvent === event) {
|
|
209
|
-
// runOutsideAngular for fix error: `Expected to not be in Angular Zone, but it is!`
|
|
210
|
-
this.ngZone.runOutsideAngular(() => {
|
|
211
|
-
forkJoin(apps$).subscribe(() => {
|
|
212
|
-
this.setLoadingDone();
|
|
213
|
-
this.ensurePreloadApps(apps);
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
debug(`no apps need to be loaded, ensure preload apps`);
|
|
221
|
-
this.ensurePreloadApps(apps);
|
|
222
|
-
this.setLoadingDone();
|
|
223
|
-
}
|
|
224
|
-
}),
|
|
225
|
-
// Error handler
|
|
226
|
-
catchError(error => {
|
|
227
|
-
debug(`apps loader error: ${error}`);
|
|
228
|
-
this.errorHandler(error);
|
|
229
|
-
return [];
|
|
230
|
-
}));
|
|
231
|
-
}))
|
|
232
|
-
.subscribe();
|
|
233
|
-
}
|
|
234
|
-
startLoadAppAssets(app) {
|
|
235
|
-
if (this.inProgressAppAssetsLoads.get(app.name)) {
|
|
236
|
-
return this.inProgressAppAssetsLoads.get(app.name);
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
const loadApp$ = this.assetsLoader.loadAppAssets(app).pipe(tap(() => {
|
|
240
|
-
this.inProgressAppAssetsLoads.delete(app.name);
|
|
241
|
-
this.setAppStatus(app, ApplicationStatus.assetsLoaded);
|
|
242
|
-
}), map(() => {
|
|
243
|
-
return app;
|
|
244
|
-
}), catchError(error => {
|
|
245
|
-
this.inProgressAppAssetsLoads.delete(app.name);
|
|
246
|
-
this.setAppStatus(app, ApplicationStatus.loadError);
|
|
247
|
-
throw error;
|
|
248
|
-
}), share());
|
|
249
|
-
this.inProgressAppAssetsLoads.set(app.name, loadApp$);
|
|
250
|
-
this.setAppStatus(app, ApplicationStatus.assetsLoading);
|
|
251
|
-
return loadApp$;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
hideApp(planetApp) {
|
|
255
|
-
const appRef = getPlanetApplicationRef(planetApp.name);
|
|
256
|
-
const appRootElement = document.querySelector(appRef.selector || planetApp.selector);
|
|
257
|
-
if (appRootElement) {
|
|
258
|
-
appRootElement.setAttribute('style', 'display:none;');
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
showApp(planetApp) {
|
|
262
|
-
const appRef = getPlanetApplicationRef(planetApp.name);
|
|
263
|
-
const appRootElement = document.querySelector(appRef.selector || planetApp.selector);
|
|
264
|
-
if (appRootElement) {
|
|
265
|
-
appRootElement.setAttribute('style', '');
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
destroyApp(planetApp) {
|
|
269
|
-
const appRef = getPlanetApplicationRef(planetApp.name);
|
|
270
|
-
if (appRef) {
|
|
271
|
-
appRef.destroy();
|
|
272
|
-
}
|
|
273
|
-
const container = getHTMLElement(planetApp.hostParent);
|
|
274
|
-
const appRootElement = container.querySelector((appRef && appRef.selector) || planetApp.selector);
|
|
275
|
-
if (appRootElement) {
|
|
276
|
-
container.removeChild(appRootElement);
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
bootstrapApp(app, defaultStatus = 'display') {
|
|
280
|
-
debug(`app(${app.name}) start bootstrapping`);
|
|
281
|
-
this.setAppStatus(app, ApplicationStatus.bootstrapping);
|
|
282
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
283
|
-
if (appRef && appRef.bootstrap) {
|
|
284
|
-
const container = getHTMLElement(app.hostParent);
|
|
285
|
-
let appRootElement;
|
|
286
|
-
if (container) {
|
|
287
|
-
appRootElement = container.querySelector(appRef.selector || app.selector);
|
|
288
|
-
if (!appRootElement) {
|
|
289
|
-
if (appRef.template) {
|
|
290
|
-
appRootElement = createElementByTemplate(appRef.template);
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
appRootElement = document.createElement(app.selector);
|
|
294
|
-
}
|
|
295
|
-
appRootElement.setAttribute('style', 'display:none;');
|
|
296
|
-
if (app.hostClass) {
|
|
297
|
-
appRootElement.classList.add(...coerceArray(app.hostClass));
|
|
298
|
-
}
|
|
299
|
-
if (app.stylePrefix) {
|
|
300
|
-
appRootElement.classList.add(...coerceArray(app.stylePrefix));
|
|
301
|
-
}
|
|
302
|
-
container.appendChild(appRootElement);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
let result = appRef.bootstrap(this.portalApp);
|
|
306
|
-
// Backwards compatibility promise for bootstrap
|
|
307
|
-
if (result['then']) {
|
|
308
|
-
result = from(result);
|
|
309
|
-
}
|
|
310
|
-
return result.pipe(tap(() => {
|
|
311
|
-
debug(`app(${app.name}) bootstrapped success for ${defaultStatus}`);
|
|
312
|
-
this.setAppStatus(app, ApplicationStatus.bootstrapped);
|
|
313
|
-
if (defaultStatus === 'display' && appRootElement) {
|
|
314
|
-
appRootElement.removeAttribute('style');
|
|
315
|
-
}
|
|
316
|
-
}), map(() => {
|
|
317
|
-
return appRef;
|
|
318
|
-
}));
|
|
319
|
-
}
|
|
320
|
-
else {
|
|
321
|
-
throw new Error(`[${app.name}] not found, make sure that the app has the correct name defined use defineApplication(${app.name}) and runtimeChunk and vendorChunk are set to true, details see https://github.com/worktile/ngx-planet#throw-error-cannot-read-property-call-of-undefined-at-__webpack_require__-bootstrap79`);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
getUnloadApps(activeApps) {
|
|
325
|
-
const unloadApps = [];
|
|
326
|
-
this.appsStatus.forEach((value, app) => {
|
|
327
|
-
if (value === ApplicationStatus.active && !activeApps.find(item => item.name === app.name)) {
|
|
328
|
-
unloadApps.push(app);
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
return unloadApps;
|
|
332
|
-
}
|
|
333
|
-
unloadApps(shouldUnloadApps, event) {
|
|
334
|
-
const hideApps = [];
|
|
335
|
-
const destroyApps = [];
|
|
336
|
-
shouldUnloadApps.forEach(app => {
|
|
337
|
-
if (this.switchModeIsCoexist(app)) {
|
|
338
|
-
debug(`hide app(${app.name}) for coexist mode`);
|
|
339
|
-
hideApps.push(app);
|
|
340
|
-
this.hideApp(app);
|
|
341
|
-
this.setAppStatus(app, ApplicationStatus.bootstrapped);
|
|
342
|
-
}
|
|
343
|
-
else {
|
|
344
|
-
destroyApps.push(app);
|
|
345
|
-
// 销毁之前先隐藏,否则会出现闪烁,因为 destroy 是延迟执行的
|
|
346
|
-
// 如果销毁不延迟执行,会出现切换到主应用的时候会有视图卡顿现象
|
|
347
|
-
this.hideApp(app);
|
|
348
|
-
this.setAppStatus(app, ApplicationStatus.assetsLoaded);
|
|
349
|
-
}
|
|
350
|
-
});
|
|
351
|
-
if (hideApps.length > 0 || destroyApps.length > 0) {
|
|
352
|
-
// 从其他应用切换到主应用的时候会有视图卡顿现象,所以先等主应用渲染完毕后再加载其他应用
|
|
353
|
-
// 此处尝试使用 this.ngZone.onStable.pipe(take(1)) 应用之间的切换会出现闪烁
|
|
354
|
-
setTimeout(() => {
|
|
355
|
-
hideApps.forEach(app => {
|
|
356
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
357
|
-
if (appRef) {
|
|
358
|
-
appRef.navigateByUrl(event.url);
|
|
359
|
-
}
|
|
360
|
-
});
|
|
361
|
-
destroyApps.forEach(app => {
|
|
362
|
-
debug(`destroy app(${app.name})`);
|
|
363
|
-
this.destroyApp(app);
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
preloadApps(activeApps) {
|
|
369
|
-
setTimeout(() => {
|
|
370
|
-
const toPreloadApps = this.planetApplicationService.getAppsToPreload(activeApps ? activeApps.map(item => item.name) : null);
|
|
371
|
-
debug(`start preload apps: ${this.getAppNames(toPreloadApps)}`);
|
|
372
|
-
const loadApps$ = toPreloadApps.map(preloadApp => {
|
|
373
|
-
return this.preloadInternal(preloadApp);
|
|
374
|
-
});
|
|
375
|
-
forkJoin(loadApps$).subscribe({
|
|
376
|
-
error: error => this.errorHandler(error)
|
|
377
|
-
});
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
ensurePreloadApps(activeApps) {
|
|
381
|
-
// Start preload apps
|
|
382
|
-
// Start preload when first time app loaded
|
|
383
|
-
if (this.firstLoad) {
|
|
384
|
-
this.preloadApps(activeApps);
|
|
385
|
-
this.firstLoad = false;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
setOptions(options) {
|
|
389
|
-
this.options = Object.assign(Object.assign({}, this.options), options);
|
|
390
|
-
}
|
|
391
|
-
/**
|
|
392
|
-
* reset route by current router
|
|
393
|
-
*/
|
|
394
|
-
reroute(event) {
|
|
395
|
-
this.routeChange$.next(event);
|
|
396
|
-
}
|
|
397
|
-
preloadInternal(app, immediate) {
|
|
398
|
-
const status = this.appsStatus.get(app);
|
|
399
|
-
if (!status || status === ApplicationStatus.loadError) {
|
|
400
|
-
debug(`preload app(${app.name}), status is empty, start to load assets`);
|
|
401
|
-
return this.startLoadAppAssets(app).pipe(switchMap(() => {
|
|
402
|
-
debug(`preload app(${app.name}), assets loaded, start bootstrap app, immediate: ${!!immediate}`);
|
|
403
|
-
if (immediate) {
|
|
404
|
-
return this.bootstrapApp(app, 'hidden');
|
|
405
|
-
}
|
|
406
|
-
else {
|
|
407
|
-
return this.ngZone.runOutsideAngular(() => {
|
|
408
|
-
return this.bootstrapApp(app, 'hidden');
|
|
409
|
-
});
|
|
410
|
-
}
|
|
411
|
-
}), map(() => {
|
|
412
|
-
return getPlanetApplicationRef(app.name);
|
|
413
|
-
}));
|
|
414
|
-
}
|
|
415
|
-
else if ([ApplicationStatus.assetsLoading, ApplicationStatus.assetsLoaded, ApplicationStatus.bootstrapping].includes(status)) {
|
|
416
|
-
debug(`preload app(${app.name}), status is ${ApplicationStatus[status]}, return until bootstrapped`);
|
|
417
|
-
return this.getAppStatusChange$(app).pipe(take(1), map(() => {
|
|
418
|
-
return getPlanetApplicationRef(app.name);
|
|
419
|
-
}));
|
|
420
|
-
}
|
|
421
|
-
else {
|
|
422
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
423
|
-
if (!appRef) {
|
|
424
|
-
throw new Error(`${app.name}'s status is ${ApplicationStatus[status]}, planetApplicationRef is null.`);
|
|
425
|
-
}
|
|
426
|
-
return of(appRef);
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Preload planet application
|
|
431
|
-
* @param app app
|
|
432
|
-
* @param immediate bootstrap on stable by default, setting immediate is true, it will bootstrap immediate
|
|
433
|
-
*/
|
|
434
|
-
preload(app, immediate) {
|
|
435
|
-
return this.preloadInternal(app, immediate);
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
PlanetApplicationLoader.ɵprov = i0.ɵɵdefineInjectable({ factory: function PlanetApplicationLoader_Factory() { return new PlanetApplicationLoader(i0.ɵɵinject(i1.AssetsLoader), i0.ɵɵinject(i2.PlanetApplicationService), i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i3.Router), i0.ɵɵinject(i0.INJECTOR), i0.ɵɵinject(i0.ApplicationRef)); }, token: PlanetApplicationLoader, providedIn: "root" });
|
|
439
|
-
PlanetApplicationLoader.decorators = [
|
|
440
|
-
{ type: Injectable, args: [{
|
|
441
|
-
providedIn: 'root'
|
|
442
|
-
},] }
|
|
443
|
-
];
|
|
444
|
-
PlanetApplicationLoader.ctorParameters = () => [
|
|
445
|
-
{ type: AssetsLoader },
|
|
446
|
-
{ type: PlanetApplicationService },
|
|
447
|
-
{ type: NgZone },
|
|
448
|
-
{ type: Router },
|
|
449
|
-
{ type: Injector },
|
|
450
|
-
{ type: ApplicationRef }
|
|
451
|
-
];
|
|
452
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbmV0LWFwcGxpY2F0aW9uLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3BsYW5ldC9zcmMvYXBwbGljYXRpb24vcGxhbmV0LWFwcGxpY2F0aW9uLWxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxFQUFFLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBd0MsV0FBVyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVsRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7O0FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFdBQVcs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QUFPLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7Ozs7WUF2ZkosVUFBVSxTQUFDO2dCQUNSLFVBQVUsRUFBRSxNQUFNO2FBQ3JCOzs7WUFsQ1EsWUFBWTtZQU1aLHdCQUF3QjtZQVJaLE1BQU07WUFVbEIsTUFBTTtZQVY4QixRQUFRO1lBQXhCLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIEFwcGxpY2F0aW9uUmVmLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgb2YsIE9ic2VydmFibGUsIFN1YmplY3QsIGZvcmtKb2luLCBmcm9tIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBc3NldHNMb2FkZXIgfSBmcm9tICcuLi9hc3NldHMtbG9hZGVyJztcbmltcG9ydCB7IFBsYW5ldEFwcGxpY2F0aW9uLCBQbGFuZXRSb3V0ZXJFdmVudCwgU3dpdGNoTW9kZXMsIFBsYW5ldE9wdGlvbnMgfSBmcm9tICcuLi9wbGFuZXQuY2xhc3MnO1xuaW1wb3J0IHsgc3dpdGNoTWFwLCBzaGFyZSwgbWFwLCB0YXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YWtlLCBmaWx0ZXIsIGNhdGNoRXJyb3IgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBnZXRIVE1MRWxlbWVudCwgY29lcmNlQXJyYXksIGNyZWF0ZUVsZW1lbnRCeVRlbXBsYXRlIH0gZnJvbSAnLi4vaGVscGVycyc7XG5pbXBvcnQgeyBQbGFuZXRBcHBsaWNhdGlvblJlZiB9IGZyb20gJy4vcGxhbmV0LWFwcGxpY2F0aW9uLXJlZic7XG5pbXBvcnQgeyBQbGFuZXRQb3J0YWxBcHBsaWNhdGlvbiB9IGZyb20gJy4vcG9ydGFsLWFwcGxpY2F0aW9uJztcbmltcG9ydCB7IFBsYW5ldEFwcGxpY2F0aW9uU2VydmljZSB9IGZyb20gJy4vcGxhbmV0LWFwcGxpY2F0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2xvYmFsRXZlbnREaXNwYXRjaGVyIH0gZnJvbSAnLi4vZ2xvYmFsLWV2ZW50LWRpc3BhdGNoZXInO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IGdsb2JhbFBsYW5ldCwgZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYsIGdldEFwcGxpY2F0aW9uTG9hZGVyIH0gZnJvbSAnLi4vZ2xvYmFsLXBsYW5ldCc7XG5pbXBvcnQgeyBjcmVhdGVEZWJ1ZyB9IGZyb20gJy4uL2RlYnVnJztcbmNvbnN0IGRlYnVnID0gY3JlYXRlRGVidWcoJ2FwcC1sb2FkZXInKTtcblxuZXhwb3J0IGVudW0gQXBwbGljYXRpb25TdGF0dXMge1xuICAgIGFzc2V0c0xvYWRpbmcgPSAxLFxuICAgIGFzc2V0c0xvYWRlZCA9IDIsXG4gICAgYm9vdHN0cmFwcGluZyA9IDMsXG4gICAgYm9vdHN0cmFwcGVkID0gNCxcbiAgICBhY3RpdmUgPSA1LFxuICAgIGxvYWRFcnJvciA9IDEwXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwc0xvYWRpbmdTdGFydEV2ZW50IHtcbiAgICBzaG91bGRMb2FkQXBwczogUGxhbmV0QXBwbGljYXRpb25bXTtcbiAgICBzaG91bGRVbmxvYWRBcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcFN0YXR1c0NoYW5nZUV2ZW50IHtcbiAgICBhcHA6IFBsYW5ldEFwcGxpY2F0aW9uO1xuICAgIHN0YXR1czogQXBwbGljYXRpb25TdGF0dXM7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGxhbmV0QXBwbGljYXRpb25Mb2FkZXIge1xuICAgIHByaXZhdGUgZmlyc3RMb2FkID0gdHJ1ZTtcblxuICAgIHByaXZhdGUgc3RhcnRSb3V0ZUNoYW5nZUV2ZW50OiBQbGFuZXRSb3V0ZXJFdmVudDtcblxuICAgIHByaXZhdGUgb3B0aW9uczogUGxhbmV0T3B0aW9ucztcblxuICAgIHByaXZhdGUgaW5Qcm9ncmVzc0FwcEFzc2V0c0xvYWRzID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb24+PigpO1xuXG4gICAgcHJpdmF0ZSBhcHBzU3RhdHVzID0gbmV3IE1hcDxQbGFuZXRBcHBsaWNhdGlvbiwgQXBwbGljYXRpb25TdGF0dXM+KCk7XG5cbiAgICBwcml2YXRlIHBvcnRhbEFwcCA9IG5ldyBQbGFuZXRQb3J0YWxBcHBsaWNhdGlvbigpO1xuXG4gICAgcHJpdmF0ZSByb3V0ZUNoYW5nZSQgPSBuZXcgU3ViamVjdDxQbGFuZXRSb3V0ZXJFdmVudD4oKTtcblxuICAgIHByaXZhdGUgYXBwU3RhdHVzQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PEFwcFN0YXR1c0NoYW5nZUV2ZW50PigpO1xuXG4gICAgcHJpdmF0ZSBhcHBzTG9hZGluZ1N0YXJ0JCA9IG5ldyBTdWJqZWN0PEFwcHNMb2FkaW5nU3RhcnRFdmVudD4oKTtcblxuICAgIHB1YmxpYyBnZXQgYXBwU3RhdHVzQ2hhbmdlKCk6IE9ic2VydmFibGU8QXBwU3RhdHVzQ2hhbmdlRXZlbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwU3RhdHVzQ2hhbmdlJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGFwcHNMb2FkaW5nU3RhcnQoKTogT2JzZXJ2YWJsZTxBcHBzTG9hZGluZ1N0YXJ0RXZlbnQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwc0xvYWRpbmdTdGFydCQuYXNPYnNlcnZhYmxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRpbmdEb25lID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBhc3NldHNMb2FkZXI6IEFzc2V0c0xvYWRlcixcbiAgICAgICAgcHJpdmF0ZSBwbGFuZXRBcHBsaWNhdGlvblNlcnZpY2U6IFBsYW5ldEFwcGxpY2F0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICAgICAgcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmXG4gICAgKSB7XG4gICAgICAgIGlmIChnZXRBcHBsaWNhdGlvbkxvYWRlcigpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgJ1BsYW5ldEFwcGxpY2F0aW9uTG9hZGVyIGhhcyBiZWVuIGluamVjdGVkIGluIHRoZSBwb3J0YWwsIHJlcGVhdGVkIGluamVjdGlvbiBpcyBub3QgYWxsb3dlZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBzd2l0Y2hNb2RlOiBTd2l0Y2hNb2Rlcy5kZWZhdWx0LFxuICAgICAgICAgICAgZXJyb3JIYW5kbGVyOiAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucG9ydGFsQXBwLm5nWm9uZSA9IG5nWm9uZTtcbiAgICAgICAgdGhpcy5wb3J0YWxBcHAuYXBwbGljYXRpb25SZWYgPSBhcHBsaWNhdGlvblJlZjtcbiAgICAgICAgdGhpcy5wb3J0YWxBcHAucm91dGVyID0gcm91dGVyO1xuICAgICAgICB0aGlzLnBvcnRhbEFwcC5pbmplY3RvciA9IGluamVjdG9yO1xuICAgICAgICB0aGlzLnBvcnRhbEFwcC5nbG9iYWxFdmVudERpc3BhdGNoZXIgPSBpbmplY3Rvci5nZXQoR2xvYmFsRXZlbnREaXNwYXRjaGVyKTtcbiAgICAgICAgZ2xvYmFsUGxhbmV0LnBvcnRhbEFwcGxpY2F0aW9uID0gdGhpcy5wb3J0YWxBcHA7XG4gICAgICAgIHRoaXMuc2V0dXBSb3V0ZUNoYW5nZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0QXBwU3RhdHVzKGFwcDogUGxhbmV0QXBwbGljYXRpb24sIHN0YXR1czogQXBwbGljYXRpb25TdGF0dXMpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21TdGF0dXMgPSB0aGlzLmFwcHNTdGF0dXMuZ2V0KGFwcCk7XG4gICAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgICAgICBgYXBwKCR7YXBwLm5hbWV9KSBzdGF0dXMgY2hhbmdlOiAke2Zyb21TdGF0dXMgPyBBcHBsaWNhdGlvblN0YXR1c1tmcm9tU3RhdHVzXSA6ICdlbXB0eSd9ID0+ICR7XG4gICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RhdHVzW3N0YXR1c11cbiAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuYXBwc1N0YXR1cy5zZXQoYXBwLCBzdGF0dXMpO1xuICAgICAgICAgICAgdGhpcy5hcHBTdGF0dXNDaGFuZ2UkLm5leHQoe1xuICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBcHBTdGF0dXNDaGFuZ2UkKFxuICAgICAgICBhcHA6IFBsYW5ldEFwcGxpY2F0aW9uLFxuICAgICAgICBzdGF0dXMgPSBBcHBsaWNhdGlvblN0YXR1cy5ib290c3RyYXBwZWRcbiAgICApOiBPYnNlcnZhYmxlPFBsYW5ldEFwcGxpY2F0aW9uPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcFN0YXR1c0NoYW5nZS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQuYXBwID09PSBhcHAgJiYgZXZlbnQuc3RhdHVzID09PSBzdGF0dXM7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzd2l0Y2hNb2RlSXNDb2V4aXN0KGFwcDogUGxhbmV0QXBwbGljYXRpb24pIHtcbiAgICAgICAgaWYgKGFwcCAmJiBhcHAuc3dpdGNoTW9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIGFwcC5zd2l0Y2hNb2RlID09PSBTd2l0Y2hNb2Rlcy5jb2V4aXN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5zd2l0Y2hNb2RlID09PSBTd2l0Y2hNb2Rlcy5jb2V4aXN0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlcnJvckhhbmRsZXIoZXJyb3I6IEVycm9yKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuZXJyb3JIYW5kbGVyKGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRMb2FkaW5nRG9uZSgpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ0RvbmUgPSB0cnVlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFwcE5hbWVzKGFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uW10pOiBzdHJpbmcgfCBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBhcHBzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyBgW11gXG4gICAgICAgICAgICA6IGFwcHMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cFJvdXRlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnJvdXRlQ2hhbmdlJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHgsIHkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh4ICYmIHgudXJsKSA9PT0gKHkgJiYgeS51cmwpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vIFVzaW5nIHN3aXRjaE1hcCBzbyB3ZSBjYW5jZWwgZXhlY3V0aW5nIGxvYWRpbmcgd2hlbiBhIG5ldyBvbmUgY29tZXMgaW5cbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbmV3IG9ic2VydmFibGUgdXNlIG9mIGFuZCBjYXRjaEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBwcmV2ZW50IHJvdXRlQ2hhbmdlJCBjb21wbGV0ZWQgd2hpY2ggbmV2ZXIgdHJpZ2dlciBuZXcgcm91dGUgY2hhbmdlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihldmVudCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubG9hZCBhcHBzIGFuZCByZXR1cm4gc2hvdWxkIGxvYWQgYXBwc1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zyhgcm91dGUgY2hhbmdlLCB1cmwgaXM6ICR7ZXZlbnQudXJsfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRSb3V0ZUNoYW5nZUV2ZW50ID0gZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkTG9hZEFwcHMgPSB0aGlzLnBsYW5ldEFwcGxpY2F0aW9uU2VydmljZS5nZXRBcHBzQnlNYXRjaGVkVXJsKGV2ZW50LnVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoYHNob3VsZCBsb2FkIGFwcHM6ICR7dGhpcy5nZXRBcHBOYW1lcyhzaG91bGRMb2FkQXBwcyl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkVW5sb2FkQXBwcyA9IHRoaXMuZ2V0VW5sb2FkQXBwcyhzaG91bGRMb2FkQXBwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBzTG9hZGluZ1N0YXJ0JC5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkTG9hZEFwcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFVubG9hZEFwcHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVubG9hZEFwcHMoc2hvdWxkVW5sb2FkQXBwcywgZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKGB1bmxvYWQgYXBwczogJHt0aGlzLmdldEFwcE5hbWVzKHNob3VsZFVubG9hZEFwcHMpfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzaG91bGRMb2FkQXBwcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZCBhcHAgYXNzZXRzIChzdGF0aWMgcmVzb3VyY2VzKVxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKHNob3VsZExvYWRBcHBzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGFzQXBwc05lZWRMb2FkaW5nQXNzZXRzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9hZEFwcHMkID0gc2hvdWxkTG9hZEFwcHMubWFwKGFwcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcFN0YXR1cyA9IHRoaXMuYXBwc1N0YXR1cy5nZXQoYXBwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWFwcFN0YXR1cyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwU3RhdHVzID09PSBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkaW5nIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBTdGF0dXMgPT09IEFwcGxpY2F0aW9uU3RhdHVzLmxvYWRFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBhcHAoJHthcHAubmFtZX0pIHN0YXR1cyBpcyAke0FwcGxpY2F0aW9uU3RhdHVzW2FwcFN0YXR1c119LCBzdGFydCBsb2FkIGFzc2V0c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBcHBzTmVlZExvYWRpbmdBc3NldHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydExvYWRBcHBBc3NldHMoYXBwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXBwc05lZWRMb2FkaW5nQXNzZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0RvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRBcHBzJC5sZW5ndGggPiAwID8gZm9ya0pvaW4obG9hZEFwcHMkKSA6IG9mKFtdIGFzIFBsYW5ldEFwcGxpY2F0aW9uW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBCb290c3RyYXAgb3Igc2hvdyBhcHBzXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoYXBwcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwcyQ6IE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb24+W10gPSBhcHBzLm1hcChhcHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoYXBwKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGFwcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwU3RhdHVzID0gdGhpcy5hcHBzU3RhdHVzLmdldChhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcHBTdGF0dXMgPT09IEFwcGxpY2F0aW9uU3RhdHVzLmJvb3RzdHJhcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBbcm91dGVDaGFuZ2VdIGFwcCgke2FwcC5uYW1lfSkgc3RhdHVzIGlzIGJvb3RzdHJhcHBlZCwgc2hvdyBhcHAgYW5kIGFjdGl2ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QXBwKGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwUmVmLm5hdmlnYXRlQnlVcmwoZXZlbnQudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExvYWRpbmdEb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwU3RhdHVzID09PSBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgW3JvdXRlQ2hhbmdlXSBhcHAoJHthcHAubmFtZX0pIHN0YXR1cyBpcyBhc3NldHNMb2FkZWQsIHN0YXJ0IGJvb3RzdHJhcHBpbmdgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJvb3RzdHJhcEFwcChhcHApLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKGBhcHAoJHthcHAubmFtZX0pIGJvb3RzdHJhcHBlZCBzdWNjZXNzLCBhY3RpdmUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFwcFN0YXR1cyhhcHAsIEFwcGxpY2F0aW9uU3RhdHVzLmFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwU3RhdHVzID09PSBBcHBsaWNhdGlvblN0YXR1cy5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoYFtyb3V0ZUNoYW5nZV0gYXBwKCR7YXBwLm5hbWV9KSBpcyBhY3RpdmUsIGRvIG5vdGhpbmdzYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3ViIGFwcCB1c2Ugb2xkIHZlcnNpb24gd2hpY2ggaGFzIG5vdCBnZXRDdXJyZW50Um91dGVyU3RhdGVVcmxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGFwcFJlZi5nZXRDdXJyZW50Um91dGVyU3RhdGVVcmxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXBwUmVmLmdldEN1cnJlbnRSb3V0ZXJTdGF0ZVVybCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFVybCAhPT0gZXZlbnQudXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBSZWYubmF2aWdhdGVCeVVybChldmVudC51cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFtyb3V0ZUNoYW5nZV0gYXBwKCR7YXBwLm5hbWV9KSBzdGF0dXMgaXMgJHtBcHBsaWNhdGlvblN0YXR1c1thcHBTdGF0dXNdfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QXBwU3RhdHVzQ2hhbmdlJChhcHApLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFwcCgke2FwcC5uYW1lfSkgc3RhdHVzIGlzIGJvb3RzdHJhcHBlZCBieSBzdWJzY3JpYmUgc3RhdHVzIGNoYW5nZSwgYWN0aXZlIGl0YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FwcChhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBwcyQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zyhgc3RhcnQgbG9hZCBhbmQgYWN0aXZlIGFwcHM6ICR7dGhpcy5nZXRBcHBOYW1lcyhhcHBzKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5YiH5o2i5Yiw5bqU55So5ZCO5Lya5pyJ6Zeq54OB546w6LGh77yM5omA5Lul5L2/55SoIHNldFRpbWVvdXQg5ZCO5ZCv5Yqo5bqU55SoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJlZGlyZWN0IHRvIGFwcDEncyBkYXNoYm9hcmQgZnJvbSBwb3J0YWwncyBhYm91dCBwYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFwcCdzIHJvdXRlIGhhcyByZWRpcmVjdCwgaXQgZG9lc24ndCB3b3JrLCBpdCBvayBqdXN0IGluIHNldFRpbWVvdXQsIEkgZG9uJ3Qga25vdyB3aHkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86OiByZW1vdmUgaXQsIGl0IGlzIG9rIGluIHZlcnNpb24gQW5ndWxhciA5LnhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDmraTlpITliKTmlq3mmK/lm6DkuLrlpoLmnpzpnZnmgIHotYTmupDliqDovb3lrozmr5Xov5jmnKrlkK/liqjooqvlj5bmtojvvIzov5jmmK/kvJrlkK/liqjkuYvliY3nmoTlupTnlKjvvIzomb3nhLblj6/og73mgKfmr5TovoPlsI/vvIzkvYbmmK/ml6Dms5XmjpLpmaTov5nnp43lj6/og73mgKfvvIzmiYDku6Xlj6rmnInlvZMgRXZlbnQg5piv5pyA5ZCO5LiA5Liq5omN5Lya5ZCv5YqoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGFydFJvdXRlQ2hhbmdlRXZlbnQgPT09IGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcnVuT3V0c2lkZUFuZ3VsYXIgZm9yIGZpeCBlcnJvcjogYEV4cGVjdGVkIHRvIG5vdCBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyFgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JrSm9pbihhcHBzJCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9hZGluZ0RvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5zdXJlUHJlbG9hZEFwcHMoYXBwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zyhgbm8gYXBwcyBuZWVkIHRvIGJlIGxvYWRlZCwgZW5zdXJlIHByZWxvYWQgYXBwc2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZVByZWxvYWRBcHBzKGFwcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExvYWRpbmdEb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFcnJvciBoYW5kbGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgYXBwcyBsb2FkZXIgZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0TG9hZEFwcEFzc2V0cyhhcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmluUHJvZ3Jlc3NBcHBBc3NldHNMb2Fkcy5nZXQoYXBwLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pblByb2dyZXNzQXBwQXNzZXRzTG9hZHMuZ2V0KGFwcC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRBcHAkID0gdGhpcy5hc3NldHNMb2FkZXIubG9hZEFwcEFzc2V0cyhhcHApLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pblByb2dyZXNzQXBwQXNzZXRzTG9hZHMuZGVsZXRlKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkZWQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHA7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzc0FwcEFzc2V0c0xvYWRzLmRlbGV0ZShhcHAubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXBwU3RhdHVzKGFwcCwgQXBwbGljYXRpb25TdGF0dXMubG9hZEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzc0FwcEFzc2V0c0xvYWRzLnNldChhcHAubmFtZSwgbG9hZEFwcCQpO1xuICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkaW5nKTtcbiAgICAgICAgICAgIHJldHVybiBsb2FkQXBwJDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZUFwcChwbGFuZXRBcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKHBsYW5ldEFwcC5uYW1lKTtcbiAgICAgICAgY29uc3QgYXBwUm9vdEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFwcFJlZi5zZWxlY3RvciB8fCBwbGFuZXRBcHAuc2VsZWN0b3IpO1xuICAgICAgICBpZiAoYXBwUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTpub25lOycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93QXBwKHBsYW5ldEFwcDogUGxhbmV0QXBwbGljYXRpb24pIHtcbiAgICAgICAgY29uc3QgYXBwUmVmID0gZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYocGxhbmV0QXBwLm5hbWUpO1xuICAgICAgICBjb25zdCBhcHBSb290RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYXBwUmVmLnNlbGVjdG9yIHx8IHBsYW5ldEFwcC5zZWxlY3Rvcik7XG4gICAgICAgIGlmIChhcHBSb290RWxlbWVudCkge1xuICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveUFwcChwbGFuZXRBcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKHBsYW5ldEFwcC5uYW1lKTtcbiAgICAgICAgaWYgKGFwcFJlZikge1xuICAgICAgICAgICAgYXBwUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBnZXRIVE1MRWxlbWVudChwbGFuZXRBcHAuaG9zdFBhcmVudCk7XG4gICAgICAgIGNvbnN0IGFwcFJvb3RFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoKGFwcFJlZiAmJiBhcHBSZWYuc2VsZWN0b3IpIHx8IHBsYW5ldEFwcC5zZWxlY3Rvcik7XG4gICAgICAgIGlmIChhcHBSb290RWxlbWVudCkge1xuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGFwcFJvb3RFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYm9vdHN0cmFwQXBwKFxuICAgICAgICBhcHA6IFBsYW5ldEFwcGxpY2F0aW9uLFxuICAgICAgICBkZWZhdWx0U3RhdHVzOiAnaGlkZGVuJyB8ICdkaXNwbGF5JyA9ICdkaXNwbGF5J1xuICAgICk6IE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb25SZWY+IHtcbiAgICAgICAgZGVidWcoYGFwcCgke2FwcC5uYW1lfSkgc3RhcnQgYm9vdHN0cmFwcGluZ2ApO1xuICAgICAgICB0aGlzLnNldEFwcFN0YXR1cyhhcHAsIEFwcGxpY2F0aW9uU3RhdHVzLmJvb3RzdHJhcHBpbmcpO1xuICAgICAgICBjb25zdCBhcHBSZWYgPSBnZXRQbGFuZXRBcHBsaWNhdGlvblJlZihhcHAubmFtZSk7XG4gICAgICAgIGlmIChhcHBSZWYgJiYgYXBwUmVmLmJvb3RzdHJhcCkge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0SFRNTEVsZW1lbnQoYXBwLmhvc3RQYXJlbnQpO1xuICAgICAgICAgICAgbGV0IGFwcFJvb3RFbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBhcHBSb290RWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGFwcFJlZi5zZWxlY3RvciB8fCBhcHAuc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgIGlmICghYXBwUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcFJlZi50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQgPSBjcmVhdGVFbGVtZW50QnlUZW1wbGF0ZShhcHBSZWYudGVtcGxhdGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGFwcC5zZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5Om5vbmU7Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHAuaG9zdENsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBSb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNvZXJjZUFycmF5KGFwcC5ob3N0Q2xhc3MpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwLnN0eWxlUHJlZml4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBSb290RWxlbWVudC5jbGFzc0xpc3QuYWRkKC4uLmNvZXJjZUFycmF5KGFwcC5zdHlsZVByZWZpeCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhcHBSb290RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFwcFJlZi5ib290c3RyYXAodGhpcy5wb3J0YWxBcHApO1xuICAgICAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcHJvbWlzZSBmb3IgYm9vdHN0cmFwXG4gICAgICAgICAgICBpZiAocmVzdWx0Wyd0aGVuJ10pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBmcm9tKHJlc3VsdCkgYXMgT2JzZXJ2YWJsZTxQbGFuZXRBcHBsaWNhdGlvblJlZj47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoYGFwcCgke2FwcC5uYW1lfSkgYm9vdHN0cmFwcGVkIHN1Y2Nlc3MgZm9yICR7ZGVmYXVsdFN0YXR1c31gKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5ib290c3RyYXBwZWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFN0YXR1cyA9PT0gJ2Rpc3BsYXknICYmIGFwcFJvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBSb290RWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwUmVmO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBbJHthcHAubmFtZX1dIG5vdCBmb3VuZCwgbWFrZSBzdXJlIHRoYXQgdGhlIGFwcCBoYXMgdGhlIGNvcnJlY3QgbmFtZSBkZWZpbmVkIHVzZSBkZWZpbmVBcHBsaWNhdGlvbigke2FwcC5uYW1lfSkgYW5kIHJ1bnRpbWVDaHVuayBhbmQgdmVuZG9yQ2h1bmsgYXJlIHNldCB0byB0cnVlLCBkZXRhaWxzIHNlZSBodHRwczovL2dpdGh1Yi5jb20vd29ya3RpbGUvbmd4LXBsYW5ldCN0aHJvdy1lcnJvci1jYW5ub3QtcmVhZC1wcm9wZXJ0eS1jYWxsLW9mLXVuZGVmaW5lZC1hdC1fX3dlYnBhY2tfcmVxdWlyZV9fLWJvb3RzdHJhcDc5YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VW5sb2FkQXBwcyhhY3RpdmVBcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdKSB7XG4gICAgICAgIGNvbnN0IHVubG9hZEFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uW10gPSBbXTtcbiAgICAgICAgdGhpcy5hcHBzU3RhdHVzLmZvckVhY2goKHZhbHVlLCBhcHApID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gQXBwbGljYXRpb25TdGF0dXMuYWN0aXZlICYmICFhY3RpdmVBcHBzLmZpbmQoaXRlbSA9PiBpdGVtLm5hbWUgPT09IGFwcC5uYW1lKSkge1xuICAgICAgICAgICAgICAgIHVubG9hZEFwcHMucHVzaChhcHApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVubG9hZEFwcHM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1bmxvYWRBcHBzKHNob3VsZFVubG9hZEFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uW10sIGV2ZW50OiBQbGFuZXRSb3V0ZXJFdmVudCkge1xuICAgICAgICBjb25zdCBoaWRlQXBwczogUGxhbmV0QXBwbGljYXRpb25bXSA9IFtdO1xuICAgICAgICBjb25zdCBkZXN0cm95QXBwczogUGxhbmV0QXBwbGljYXRpb25bXSA9IFtdO1xuICAgICAgICBzaG91bGRVbmxvYWRBcHBzLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnN3aXRjaE1vZGVJc0NvZXhpc3QoYXBwKSkge1xuICAgICAgICAgICAgICAgIGRlYnVnKGBoaWRlIGFwcCgke2FwcC5uYW1lfSkgZm9yIGNvZXhpc3QgbW9kZWApO1xuICAgICAgICAgICAgICAgIGhpZGVBcHBzLnB1c2goYXBwKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVBcHAoYXBwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFwcFN0YXR1cyhhcHAsIEFwcGxpY2F0aW9uU3RhdHVzLmJvb3RzdHJhcHBlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRlc3Ryb3lBcHBzLnB1c2goYXBwKTtcbiAgICAgICAgICAgICAgICAvLyDplIDmr4HkuYvliY3lhYjpmpDol4/vvIzlkKbliJnkvJrlh7rnjrDpl6rng4HvvIzlm6DkuLogZGVzdHJveSDmmK/lu7bov5/miafooYznmoRcbiAgICAgICAgICAgICAgICAvLyDlpoLmnpzplIDmr4HkuI3lu7bov5/miafooYzvvIzkvJrlh7rnjrDliIfmjaLliLDkuLvlupTnlKjnmoTml7blgJnkvJrmnInop4blm77ljaHpob/njrDosaFcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVBcHAoYXBwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFwcFN0YXR1cyhhcHAsIEFwcGxpY2F0aW9uU3RhdHVzLmFzc2V0c0xvYWRlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChoaWRlQXBwcy5sZW5ndGggPiAwIHx8IGRlc3Ryb3lBcHBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIOS7juWFtuS7luW6lOeUqOWIh+aNouWIsOS4u+W6lOeUqOeahOaXtuWAmeS8muacieinhuWbvuWNoemhv+eOsOixoe+8jOaJgOS7peWFiOetieS4u+W6lOeUqOa4suafk+WujOavleWQjuWGjeWKoOi9veWFtuS7luW6lOeUqFxuICAgICAgICAgICAgLy8g5q2k5aSE5bCd6K+V5L2/55SoIHRoaXMubmdab25lLm9uU3RhYmxlLnBpcGUodGFrZSgxKSkg5bqU55So5LmL6Ze055qE5YiH5o2i5Lya5Ye6546w6Zeq54OBXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBoaWRlQXBwcy5mb3JFYWNoKGFwcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcFJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUmVmLm5hdmlnYXRlQnlVcmwoZXZlbnQudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlc3Ryb3lBcHBzLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWcoYGRlc3Ryb3kgYXBwKCR7YXBwLm5hbWV9KWApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lBcHAoYXBwKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVsb2FkQXBwcyhhY3RpdmVBcHBzPzogUGxhbmV0QXBwbGljYXRpb25bXSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRvUHJlbG9hZEFwcHMgPSB0aGlzLnBsYW5ldEFwcGxpY2F0aW9uU2VydmljZS5nZXRBcHBzVG9QcmVsb2FkKFxuICAgICAgICAgICAgICAgIGFjdGl2ZUFwcHMgPyBhY3RpdmVBcHBzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOiBudWxsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgZGVidWcoYHN0YXJ0IHByZWxvYWQgYXBwczogJHt0aGlzLmdldEFwcE5hbWVzKHRvUHJlbG9hZEFwcHMpfWApO1xuICAgICAgICAgICAgY29uc3QgbG9hZEFwcHMkID0gdG9QcmVsb2FkQXBwcy5tYXAocHJlbG9hZEFwcCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlbG9hZEludGVybmFsKHByZWxvYWRBcHApO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGZvcmtKb2luKGxvYWRBcHBzJCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3IgPT4gdGhpcy5lcnJvckhhbmRsZXIoZXJyb3IpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbnN1cmVQcmVsb2FkQXBwcyhhY3RpdmVBcHBzPzogUGxhbmV0QXBwbGljYXRpb25bXSkge1xuICAgICAgICAvLyBTdGFydCBwcmVsb2FkIGFwcHNcbiAgICAgICAgLy8gU3RhcnQgcHJlbG9hZCB3aGVuIGZpcnN0IHRpbWUgYXBwIGxvYWRlZFxuICAgICAgICBpZiAodGhpcy5maXJzdExvYWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEFwcHMoYWN0aXZlQXBwcyk7XG4gICAgICAgICAgICB0aGlzLmZpcnN0TG9hZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHNldE9wdGlvbnMob3B0aW9uczogUGFydGlhbDxQbGFuZXRPcHRpb25zPikge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmVzZXQgcm91dGUgYnkgY3VycmVudCByb3V0ZXJcbiAgICAgKi9cbiAgICBwdWJsaWMgcmVyb3V0ZShldmVudDogUGxhbmV0Um91dGVyRXZlbnQpIHtcbiAgICAgICAgdGhpcy5yb3V0ZUNoYW5nZSQubmV4dChldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVsb2FkSW50ZXJuYWwoYXBwOiBQbGFuZXRBcHBsaWNhdGlvbiwgaW1tZWRpYXRlPzogYm9vbGVhbik6IE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb25SZWY+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5hcHBzU3RhdHVzLmdldChhcHApO1xuICAgICAgICBpZiAoIXN0YXR1cyB8fCBzdGF0dXMgPT09IEFwcGxpY2F0aW9uU3RhdHVzLmxvYWRFcnJvcikge1xuICAgICAgICAgICAgZGVidWcoYHByZWxvYWQgYXBwKCR7YXBwLm5hbWV9KSwgc3RhdHVzIGlzIGVtcHR5LCBzdGFydCB0byBsb2FkIGFzc2V0c2ApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRMb2FkQXBwQXNzZXRzKGFwcCkucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgcHJlbG9hZCBhcHAoJHthcHAubmFtZX0pLCBhc3NldHMgbG9hZGVkLCBzdGFydCBib290c3RyYXAgYXBwLCBpbW1lZGlhdGU6ICR7ISFpbW1lZGlhdGV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJvb3RzdHJhcEFwcChhcHAsICdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9vdHN0cmFwQXBwKGFwcCwgJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYoYXBwLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgW0FwcGxpY2F0aW9uU3RhdHVzLmFzc2V0c0xvYWRpbmcsIEFwcGxpY2F0aW9uU3RhdHVzLmFzc2V0c0xvYWRlZCwgQXBwbGljYXRpb25TdGF0dXMuYm9vdHN0cmFwcGluZ10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgc3RhdHVzXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgZGVidWcoYHByZWxvYWQgYXBwKCR7YXBwLm5hbWV9KSwgc3RhdHVzIGlzICR7QXBwbGljYXRpb25TdGF0dXNbc3RhdHVzXX0sIHJldHVybiB1bnRpbCBib290c3RyYXBwZWRgKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEFwcFN0YXR1c0NoYW5nZSQoYXBwKS5waXBlKFxuICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgIGlmICghYXBwUmVmKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2FwcC5uYW1lfSdzIHN0YXR1cyBpcyAke0FwcGxpY2F0aW9uU3RhdHVzW3N0YXR1c119LCBwbGFuZXRBcHBsaWNhdGlvblJlZiBpcyBudWxsLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKGFwcFJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVsb2FkIHBsYW5ldCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSBhcHAgYXBwXG4gICAgICogQHBhcmFtIGltbWVkaWF0ZSBib290c3RyYXAgb24gc3RhYmxlIGJ5IGRlZmF1bHQsIHNldHRpbmcgaW1tZWRpYXRlIGlzIHRydWUsIGl0IHdpbGwgYm9vdHN0cmFwIGltbWVkaWF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVsb2FkKGFwcDogUGxhbmV0QXBwbGljYXRpb24sIGltbWVkaWF0ZT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFBsYW5ldEFwcGxpY2F0aW9uUmVmPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRJbnRlcm5hbChhcHAsIGltbWVkaWF0ZSk7XG4gICAgfVxufVxuIl19
|