@worktile/planet 10.0.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 +120 -15
- 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/{component/planet-component-ref.d.ts → packages/planet/src/component/planet-component-ref.ts} +3 -2
- package/{component/plant-component.config.d.ts → packages/planet/src/component/plant-component.config.ts} +4 -3
- 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/packages/planet/src/planet.class.ts +59 -0
- 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 -0
- 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/packages/planet/src/sandbox/proxy/types.ts +20 -0
- 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 -68
- package/application/planet-application-ref.d.ts +0 -32
- package/application/planet-application.service.d.ts +0 -18
- package/application/portal-application.d.ts +0 -14
- package/assets-loader.d.ts +0 -23
- package/bundles/worktile-planet.umd.js +0 -1670
- package/bundles/worktile-planet.umd.js.map +0 -1
- package/bundles/worktile-planet.umd.min.js +0 -16
- package/bundles/worktile-planet.umd.min.js.map +0 -1
- package/component/planet-component-loader.d.ts +0 -27
- package/empty/empty.component.d.ts +0 -2
- package/esm2015/application/planet-application-loader.js +0 -417
- package/esm2015/application/planet-application-ref.js +0 -86
- package/esm2015/application/planet-application.service.js +0 -87
- package/esm2015/application/portal-application.js +0 -16
- package/esm2015/assets-loader.js +0 -165
- package/esm2015/component/planet-component-loader.js +0 -157
- package/esm2015/component/planet-component-ref.js +0 -3
- package/esm2015/component/plant-component.config.js +0 -7
- 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 -116
- package/esm2015/module.js +0 -27
- package/esm2015/planet.class.js +0 -9
- package/esm2015/planet.js +0 -86
- package/esm2015/public-api.js +0 -18
- package/esm2015/worktile-planet.js +0 -6
- package/fesm2015/worktile-planet.js +0 -1257
- package/fesm2015/worktile-planet.js.map +0 -1
- package/global-event-dispatcher.d.ts +0 -19
- package/global-planet.d.ts +0 -22
- package/helpers.d.ts +0 -37
- package/module.d.ts +0 -5
- package/planet.class.d.ts +0 -34
- package/planet.d.ts +0 -24
- package/worktile-planet.d.ts +0 -5
- package/worktile-planet.metadata.json +0 -1
|
@@ -1,417 +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 * as i0 from "@angular/core";
|
|
13
|
-
import * as i1 from "../assets-loader";
|
|
14
|
-
import * as i2 from "./planet-application.service";
|
|
15
|
-
import * as i3 from "@angular/router";
|
|
16
|
-
export var ApplicationStatus;
|
|
17
|
-
(function (ApplicationStatus) {
|
|
18
|
-
ApplicationStatus[ApplicationStatus["assetsLoading"] = 1] = "assetsLoading";
|
|
19
|
-
ApplicationStatus[ApplicationStatus["assetsLoaded"] = 2] = "assetsLoaded";
|
|
20
|
-
ApplicationStatus[ApplicationStatus["bootstrapping"] = 3] = "bootstrapping";
|
|
21
|
-
ApplicationStatus[ApplicationStatus["bootstrapped"] = 4] = "bootstrapped";
|
|
22
|
-
ApplicationStatus[ApplicationStatus["active"] = 5] = "active";
|
|
23
|
-
ApplicationStatus[ApplicationStatus["loadError"] = 10] = "loadError";
|
|
24
|
-
})(ApplicationStatus || (ApplicationStatus = {}));
|
|
25
|
-
export class PlanetApplicationLoader {
|
|
26
|
-
constructor(assetsLoader, planetApplicationService, ngZone, router, injector, applicationRef) {
|
|
27
|
-
this.assetsLoader = assetsLoader;
|
|
28
|
-
this.planetApplicationService = planetApplicationService;
|
|
29
|
-
this.ngZone = ngZone;
|
|
30
|
-
this.firstLoad = true;
|
|
31
|
-
this.inProgressAppAssetsLoads = new Map();
|
|
32
|
-
this.appsStatus = new Map();
|
|
33
|
-
this.portalApp = new PlanetPortalApplication();
|
|
34
|
-
this.routeChange$ = new Subject();
|
|
35
|
-
this.appStatusChange$ = new Subject();
|
|
36
|
-
this.appsLoadingStart$ = new Subject();
|
|
37
|
-
this.loadingDone = false;
|
|
38
|
-
if (getApplicationLoader()) {
|
|
39
|
-
throw new Error('PlanetApplicationLoader has been injected in the portal, repeated injection is not allowed');
|
|
40
|
-
}
|
|
41
|
-
this.options = {
|
|
42
|
-
switchMode: SwitchModes.default,
|
|
43
|
-
errorHandler: (error) => {
|
|
44
|
-
console.error(error);
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
this.portalApp.ngZone = ngZone;
|
|
48
|
-
this.portalApp.applicationRef = applicationRef;
|
|
49
|
-
this.portalApp.router = router;
|
|
50
|
-
this.portalApp.injector = injector;
|
|
51
|
-
this.portalApp.globalEventDispatcher = injector.get(GlobalEventDispatcher);
|
|
52
|
-
globalPlanet.portalApplication = this.portalApp;
|
|
53
|
-
this.setupRouteChange();
|
|
54
|
-
}
|
|
55
|
-
get appStatusChange() {
|
|
56
|
-
return this.appStatusChange$.asObservable();
|
|
57
|
-
}
|
|
58
|
-
get appsLoadingStart() {
|
|
59
|
-
return this.appsLoadingStart$.asObservable();
|
|
60
|
-
}
|
|
61
|
-
setAppStatus(app, status) {
|
|
62
|
-
this.ngZone.run(() => {
|
|
63
|
-
this.appStatusChange$.next({
|
|
64
|
-
app: app,
|
|
65
|
-
status: status
|
|
66
|
-
});
|
|
67
|
-
this.appsStatus.set(app, status);
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
switchModeIsCoexist(app) {
|
|
71
|
-
if (app && app.switchMode) {
|
|
72
|
-
return app.switchMode === SwitchModes.coexist;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
return this.options.switchMode === SwitchModes.coexist;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
errorHandler(error) {
|
|
79
|
-
this.ngZone.run(() => {
|
|
80
|
-
this.options.errorHandler(error);
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
takeOneStable() {
|
|
84
|
-
return this.ngZone.onStable.pipe(take(1));
|
|
85
|
-
}
|
|
86
|
-
setLoadingDone() {
|
|
87
|
-
this.ngZone.run(() => {
|
|
88
|
-
this.loadingDone = true;
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
setupRouteChange() {
|
|
92
|
-
this.routeChange$
|
|
93
|
-
.pipe(distinctUntilChanged((x, y) => {
|
|
94
|
-
return (x && x.url) === (y && y.url);
|
|
95
|
-
}),
|
|
96
|
-
// Using switchMap so we cancel executing loading when a new one comes in
|
|
97
|
-
switchMap(event => {
|
|
98
|
-
// Return new observable use of and catchError,
|
|
99
|
-
// in order to prevent routeChange$ completed which never trigger new route change
|
|
100
|
-
return of(event).pipe(
|
|
101
|
-
// unload apps and return should load apps
|
|
102
|
-
map(() => {
|
|
103
|
-
this.startRouteChangeEvent = event;
|
|
104
|
-
const shouldLoadApps = this.planetApplicationService.getAppsByMatchedUrl(event.url);
|
|
105
|
-
const shouldUnloadApps = this.getUnloadApps(shouldLoadApps);
|
|
106
|
-
this.appsLoadingStart$.next({
|
|
107
|
-
shouldLoadApps,
|
|
108
|
-
shouldUnloadApps
|
|
109
|
-
});
|
|
110
|
-
this.unloadApps(shouldUnloadApps, event);
|
|
111
|
-
return shouldLoadApps;
|
|
112
|
-
}),
|
|
113
|
-
// Load app assets (static resources)
|
|
114
|
-
switchMap(shouldLoadApps => {
|
|
115
|
-
let hasAppsNeedLoadingAssets = false;
|
|
116
|
-
const loadApps$ = shouldLoadApps.map(app => {
|
|
117
|
-
const appStatus = this.appsStatus.get(app);
|
|
118
|
-
if (!appStatus ||
|
|
119
|
-
appStatus === ApplicationStatus.assetsLoading ||
|
|
120
|
-
appStatus === ApplicationStatus.loadError) {
|
|
121
|
-
hasAppsNeedLoadingAssets = true;
|
|
122
|
-
return this.ngZone.runOutsideAngular(() => {
|
|
123
|
-
return this.startLoadAppAssets(app);
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
return of(app);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
if (hasAppsNeedLoadingAssets) {
|
|
131
|
-
this.loadingDone = false;
|
|
132
|
-
}
|
|
133
|
-
return loadApps$.length > 0 ? forkJoin(loadApps$) : of([]);
|
|
134
|
-
}),
|
|
135
|
-
// Bootstrap or show apps
|
|
136
|
-
map(apps => {
|
|
137
|
-
const apps$ = [];
|
|
138
|
-
apps.forEach(app => {
|
|
139
|
-
const appStatus = this.appsStatus.get(app);
|
|
140
|
-
if (appStatus === ApplicationStatus.bootstrapped) {
|
|
141
|
-
apps$.push(of(app).pipe(tap(() => {
|
|
142
|
-
this.showApp(app);
|
|
143
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
144
|
-
appRef.navigateByUrl(event.url);
|
|
145
|
-
this.setAppStatus(app, ApplicationStatus.active);
|
|
146
|
-
this.setLoadingDone();
|
|
147
|
-
})));
|
|
148
|
-
}
|
|
149
|
-
else if (appStatus === ApplicationStatus.assetsLoaded) {
|
|
150
|
-
apps$.push(of(app).pipe(switchMap(() => {
|
|
151
|
-
return this.bootstrapApp(app).pipe(map(() => {
|
|
152
|
-
this.setAppStatus(app, ApplicationStatus.active);
|
|
153
|
-
this.setLoadingDone();
|
|
154
|
-
return app;
|
|
155
|
-
}));
|
|
156
|
-
})));
|
|
157
|
-
}
|
|
158
|
-
else if (appStatus === ApplicationStatus.active) {
|
|
159
|
-
apps$.push(of(app).pipe(tap(() => {
|
|
160
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
161
|
-
// Backwards compatibility sub app use old version which has not getCurrentRouterStateUrl
|
|
162
|
-
const currentUrl = appRef.getCurrentRouterStateUrl
|
|
163
|
-
? appRef.getCurrentRouterStateUrl()
|
|
164
|
-
: '';
|
|
165
|
-
if (currentUrl !== event.url) {
|
|
166
|
-
appRef.navigateByUrl(event.url);
|
|
167
|
-
}
|
|
168
|
-
})));
|
|
169
|
-
}
|
|
170
|
-
else {
|
|
171
|
-
throw new Error(`app(${app.name})'s status is ${appStatus}, can't be show or bootstrap`);
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
if (apps$.length > 0) {
|
|
175
|
-
// 切换到应用后会有闪烁现象,所以使用 setTimeout 后启动应用
|
|
176
|
-
// example: redirect to app1's dashboard from portal's about page
|
|
177
|
-
// If app's route has redirect, it doesn't work, it ok just in setTimeout, I don't know why.
|
|
178
|
-
// TODO:: remove it, it is ok in version Angular 9.x
|
|
179
|
-
setTimeout(() => {
|
|
180
|
-
// 此处判断是因为如果静态资源加载完毕还未启动被取消,还是会启动之前的应用,虽然可能性比较小,但是无法排除这种可能性,所以只有当 Event 是最后一个才会启动
|
|
181
|
-
if (this.startRouteChangeEvent === event) {
|
|
182
|
-
// runOutsideAngular for fix error: `Expected to not be in Angular Zone, but it is!`
|
|
183
|
-
this.ngZone.runOutsideAngular(() => {
|
|
184
|
-
forkJoin(apps$).subscribe(() => {
|
|
185
|
-
this.setLoadingDone();
|
|
186
|
-
this.ensurePreloadApps(apps);
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
this.ensurePreloadApps(apps);
|
|
194
|
-
this.setLoadingDone();
|
|
195
|
-
}
|
|
196
|
-
}),
|
|
197
|
-
// Error handler
|
|
198
|
-
catchError(error => {
|
|
199
|
-
this.errorHandler(error);
|
|
200
|
-
return [];
|
|
201
|
-
}));
|
|
202
|
-
}))
|
|
203
|
-
.subscribe();
|
|
204
|
-
}
|
|
205
|
-
startLoadAppAssets(app) {
|
|
206
|
-
if (this.inProgressAppAssetsLoads.get(app.name)) {
|
|
207
|
-
return this.inProgressAppAssetsLoads.get(app.name);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
const loadApp$ = this.assetsLoader.loadAppAssets(app).pipe(tap(() => {
|
|
211
|
-
this.inProgressAppAssetsLoads.delete(app.name);
|
|
212
|
-
this.setAppStatus(app, ApplicationStatus.assetsLoaded);
|
|
213
|
-
}), map(() => {
|
|
214
|
-
return app;
|
|
215
|
-
}), catchError(error => {
|
|
216
|
-
this.inProgressAppAssetsLoads.delete(app.name);
|
|
217
|
-
this.setAppStatus(app, ApplicationStatus.loadError);
|
|
218
|
-
throw error;
|
|
219
|
-
}), share());
|
|
220
|
-
this.inProgressAppAssetsLoads.set(app.name, loadApp$);
|
|
221
|
-
this.setAppStatus(app, ApplicationStatus.assetsLoading);
|
|
222
|
-
return loadApp$;
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
hideApp(planetApp) {
|
|
226
|
-
const appRef = getPlanetApplicationRef(planetApp.name);
|
|
227
|
-
const appRootElement = document.querySelector(appRef.selector || planetApp.selector);
|
|
228
|
-
if (appRootElement) {
|
|
229
|
-
appRootElement.setAttribute('style', 'display:none;');
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
showApp(planetApp) {
|
|
233
|
-
const appRef = getPlanetApplicationRef(planetApp.name);
|
|
234
|
-
const appRootElement = document.querySelector(appRef.selector || planetApp.selector);
|
|
235
|
-
if (appRootElement) {
|
|
236
|
-
appRootElement.setAttribute('style', '');
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
destroyApp(planetApp) {
|
|
240
|
-
const appRef = getPlanetApplicationRef(planetApp.name);
|
|
241
|
-
if (appRef) {
|
|
242
|
-
appRef.destroy();
|
|
243
|
-
}
|
|
244
|
-
const container = getHTMLElement(planetApp.hostParent);
|
|
245
|
-
const appRootElement = container.querySelector((appRef && appRef.selector) || planetApp.selector);
|
|
246
|
-
if (appRootElement) {
|
|
247
|
-
container.removeChild(appRootElement);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
bootstrapApp(app, defaultStatus = 'display') {
|
|
251
|
-
this.setAppStatus(app, ApplicationStatus.bootstrapping);
|
|
252
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
253
|
-
if (appRef && appRef.bootstrap) {
|
|
254
|
-
const container = getHTMLElement(app.hostParent);
|
|
255
|
-
let appRootElement;
|
|
256
|
-
if (container) {
|
|
257
|
-
appRootElement = container.querySelector(appRef.selector || app.selector);
|
|
258
|
-
if (!appRootElement) {
|
|
259
|
-
if (appRef.template) {
|
|
260
|
-
appRootElement = createElementByTemplate(appRef.template);
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
appRootElement = document.createElement(app.selector);
|
|
264
|
-
}
|
|
265
|
-
appRootElement.setAttribute('style', 'display:none;');
|
|
266
|
-
if (app.hostClass) {
|
|
267
|
-
appRootElement.classList.add(...coerceArray(app.hostClass));
|
|
268
|
-
}
|
|
269
|
-
if (app.stylePrefix) {
|
|
270
|
-
appRootElement.classList.add(...coerceArray(app.stylePrefix));
|
|
271
|
-
}
|
|
272
|
-
container.appendChild(appRootElement);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
let result = appRef.bootstrap(this.portalApp);
|
|
276
|
-
// Backwards compatibility promise for bootstrap
|
|
277
|
-
if (result['then']) {
|
|
278
|
-
result = from(result);
|
|
279
|
-
}
|
|
280
|
-
return result.pipe(tap(() => {
|
|
281
|
-
this.setAppStatus(app, ApplicationStatus.bootstrapped);
|
|
282
|
-
if (defaultStatus === 'display' && appRootElement) {
|
|
283
|
-
appRootElement.removeAttribute('style');
|
|
284
|
-
}
|
|
285
|
-
}), map(() => {
|
|
286
|
-
return appRef;
|
|
287
|
-
}));
|
|
288
|
-
}
|
|
289
|
-
else {
|
|
290
|
-
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`);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
getUnloadApps(activeApps) {
|
|
294
|
-
const unloadApps = [];
|
|
295
|
-
this.appsStatus.forEach((value, app) => {
|
|
296
|
-
if (value === ApplicationStatus.active && !activeApps.find(item => item.name === app.name)) {
|
|
297
|
-
unloadApps.push(app);
|
|
298
|
-
}
|
|
299
|
-
});
|
|
300
|
-
return unloadApps;
|
|
301
|
-
}
|
|
302
|
-
unloadApps(shouldUnloadApps, event) {
|
|
303
|
-
const hideApps = [];
|
|
304
|
-
const destroyApps = [];
|
|
305
|
-
shouldUnloadApps.forEach(app => {
|
|
306
|
-
if (this.switchModeIsCoexist(app)) {
|
|
307
|
-
hideApps.push(app);
|
|
308
|
-
this.hideApp(app);
|
|
309
|
-
this.setAppStatus(app, ApplicationStatus.bootstrapped);
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
destroyApps.push(app);
|
|
313
|
-
// 销毁之前先隐藏,否则会出现闪烁,因为 destroy 是延迟执行的
|
|
314
|
-
// 如果销毁不延迟执行,会出现切换到主应用的时候会有视图卡顿现象
|
|
315
|
-
this.hideApp(app);
|
|
316
|
-
this.setAppStatus(app, ApplicationStatus.assetsLoaded);
|
|
317
|
-
}
|
|
318
|
-
});
|
|
319
|
-
if (hideApps.length > 0 || destroyApps.length > 0) {
|
|
320
|
-
// 从其他应用切换到主应用的时候会有视图卡顿现象,所以先等主应用渲染完毕后再加载其他应用
|
|
321
|
-
// 此处尝试使用 this.ngZone.onStable.pipe(take(1)) 应用之间的切换会出现闪烁
|
|
322
|
-
setTimeout(() => {
|
|
323
|
-
hideApps.forEach(app => {
|
|
324
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
325
|
-
if (appRef) {
|
|
326
|
-
appRef.navigateByUrl(event.url);
|
|
327
|
-
}
|
|
328
|
-
});
|
|
329
|
-
destroyApps.forEach(app => {
|
|
330
|
-
this.destroyApp(app);
|
|
331
|
-
});
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
preloadApps(activeApps) {
|
|
336
|
-
setTimeout(() => {
|
|
337
|
-
const toPreloadApps = this.planetApplicationService.getAppsToPreload(activeApps ? activeApps.map(item => item.name) : null);
|
|
338
|
-
const loadApps$ = toPreloadApps.map(preloadApp => {
|
|
339
|
-
return this.preloadInternal(preloadApp);
|
|
340
|
-
});
|
|
341
|
-
forkJoin(loadApps$).subscribe({
|
|
342
|
-
error: error => this.errorHandler(error)
|
|
343
|
-
});
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
ensurePreloadApps(activeApps) {
|
|
347
|
-
// Start preload apps
|
|
348
|
-
// Start preload when first time app loaded
|
|
349
|
-
if (this.firstLoad) {
|
|
350
|
-
this.preloadApps(activeApps);
|
|
351
|
-
this.firstLoad = false;
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
setOptions(options) {
|
|
355
|
-
this.options = Object.assign(Object.assign({}, this.options), options);
|
|
356
|
-
}
|
|
357
|
-
/**
|
|
358
|
-
* reset route by current router
|
|
359
|
-
*/
|
|
360
|
-
reroute(event) {
|
|
361
|
-
this.routeChange$.next(event);
|
|
362
|
-
}
|
|
363
|
-
preloadInternal(app, immediate) {
|
|
364
|
-
const status = this.appsStatus.get(app);
|
|
365
|
-
if (!status || status === ApplicationStatus.loadError) {
|
|
366
|
-
return this.startLoadAppAssets(app).pipe(switchMap(() => {
|
|
367
|
-
if (immediate) {
|
|
368
|
-
return this.bootstrapApp(app, 'hidden');
|
|
369
|
-
}
|
|
370
|
-
else {
|
|
371
|
-
return this.ngZone.runOutsideAngular(() => {
|
|
372
|
-
return this.bootstrapApp(app, 'hidden');
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
}), map(() => {
|
|
376
|
-
return getPlanetApplicationRef(app.name);
|
|
377
|
-
}));
|
|
378
|
-
}
|
|
379
|
-
else if ([ApplicationStatus.assetsLoading, ApplicationStatus.assetsLoaded, ApplicationStatus.bootstrapping].includes(status)) {
|
|
380
|
-
return this.appStatusChange.pipe(filter(event => {
|
|
381
|
-
return event.app === app && event.status === ApplicationStatus.bootstrapped;
|
|
382
|
-
}), take(1), map(() => {
|
|
383
|
-
return getPlanetApplicationRef(app.name);
|
|
384
|
-
}));
|
|
385
|
-
}
|
|
386
|
-
else {
|
|
387
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
388
|
-
if (!appRef) {
|
|
389
|
-
throw new Error(`${app.name}'s status is ${ApplicationStatus[status]}, planetApplicationRef is null.`);
|
|
390
|
-
}
|
|
391
|
-
return of(appRef);
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
/**
|
|
395
|
-
* Preload planet application
|
|
396
|
-
* @param app app
|
|
397
|
-
* @param immediate bootstrap on stable by default, setting immediate is true, it will bootstrap immediate
|
|
398
|
-
*/
|
|
399
|
-
preload(app, immediate) {
|
|
400
|
-
return this.preloadInternal(app, immediate);
|
|
401
|
-
}
|
|
402
|
-
}
|
|
403
|
-
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" });
|
|
404
|
-
PlanetApplicationLoader.decorators = [
|
|
405
|
-
{ type: Injectable, args: [{
|
|
406
|
-
providedIn: 'root'
|
|
407
|
-
},] }
|
|
408
|
-
];
|
|
409
|
-
PlanetApplicationLoader.ctorParameters = () => [
|
|
410
|
-
{ type: AssetsLoader },
|
|
411
|
-
{ type: PlanetApplicationService },
|
|
412
|
-
{ type: NgZone },
|
|
413
|
-
{ type: Router },
|
|
414
|
-
{ type: Injector },
|
|
415
|
-
{ type: ApplicationRef }
|
|
416
|
-
];
|
|
417
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbmV0LWFwcGxpY2F0aW9uLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvaGFpZmVuZy9JVC8xMF9ZQy9Xb3JrdGlsZS9uZ3gtcGxhbmV0L3BhY2thZ2VzL3BsYW5ldC9zcmMvIiwic291cmNlcyI6WyJhcHBsaWNhdGlvbi9wbGFuZXQtYXBwbGljYXRpb24tbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0UsT0FBTyxFQUFFLEVBQUUsRUFBYyxPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUF3QyxXQUFXLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFDbkcsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVHLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRWxGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLHVCQUF1QixFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7O0FBRS9GLE1BQU0sQ0FBTixJQUFZLGlCQU9YO0FBUEQsV0FB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ZUFBZSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDOzs7O1lBM2NKLFVBQVUsU0FBQztnQkFDUixVQUFVLEVBQUUsTUFBTTthQUNyQjs7O1lBaENRLFlBQVk7WUFNWix3QkFBd0I7WUFSWixNQUFNO1lBVWxCLE1BQU07WUFWOEIsUUFBUTtZQUF4QixjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBBcHBsaWNhdGlvblJlZiwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG9mLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmb3JrSm9pbiwgZnJvbSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXNzZXRzTG9hZGVyIH0gZnJvbSAnLi4vYXNzZXRzLWxvYWRlcic7XG5pbXBvcnQgeyBQbGFuZXRBcHBsaWNhdGlvbiwgUGxhbmV0Um91dGVyRXZlbnQsIFN3aXRjaE1vZGVzLCBQbGFuZXRPcHRpb25zIH0gZnJvbSAnLi4vcGxhbmV0LmNsYXNzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgc2hhcmUsIG1hcCwgdGFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZSwgZmlsdGVyLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0SFRNTEVsZW1lbnQsIGNvZXJjZUFycmF5LCBjcmVhdGVFbGVtZW50QnlUZW1wbGF0ZSB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgUGxhbmV0QXBwbGljYXRpb25SZWYgfSBmcm9tICcuL3BsYW5ldC1hcHBsaWNhdGlvbi1yZWYnO1xuaW1wb3J0IHsgUGxhbmV0UG9ydGFsQXBwbGljYXRpb24gfSBmcm9tICcuL3BvcnRhbC1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBQbGFuZXRBcHBsaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuL3BsYW5ldC1hcHBsaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2dsb2JhbC1ldmVudC1kaXNwYXRjaGVyJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBnbG9iYWxQbGFuZXQsIGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmLCBnZXRBcHBsaWNhdGlvbkxvYWRlciB9IGZyb20gJy4uL2dsb2JhbC1wbGFuZXQnO1xuXG5leHBvcnQgZW51bSBBcHBsaWNhdGlvblN0YXR1cyB7XG4gICAgYXNzZXRzTG9hZGluZyA9IDEsXG4gICAgYXNzZXRzTG9hZGVkID0gMixcbiAgICBib290c3RyYXBwaW5nID0gMyxcbiAgICBib290c3RyYXBwZWQgPSA0LFxuICAgIGFjdGl2ZSA9IDUsXG4gICAgbG9hZEVycm9yID0gMTBcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBzTG9hZGluZ1N0YXJ0RXZlbnQge1xuICAgIHNob3VsZExvYWRBcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdO1xuICAgIHNob3VsZFVubG9hZEFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBwU3RhdHVzQ2hhbmdlRXZlbnQge1xuICAgIGFwcDogUGxhbmV0QXBwbGljYXRpb247XG4gICAgc3RhdHVzOiBBcHBsaWNhdGlvblN0YXR1cztcbn1cblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFuZXRBcHBsaWNhdGlvbkxvYWRlciB7XG4gICAgcHJpdmF0ZSBmaXJzdExvYWQgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBzdGFydFJvdXRlQ2hhbmdlRXZlbnQ6IFBsYW5ldFJvdXRlckV2ZW50O1xuXG4gICAgcHJpdmF0ZSBvcHRpb25zOiBQbGFuZXRPcHRpb25zO1xuXG4gICAgcHJpdmF0ZSBpblByb2dyZXNzQXBwQXNzZXRzTG9hZHMgPSBuZXcgTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxQbGFuZXRBcHBsaWNhdGlvbj4+KCk7XG5cbiAgICBwcml2YXRlIGFwcHNTdGF0dXMgPSBuZXcgTWFwPFBsYW5ldEFwcGxpY2F0aW9uLCBBcHBsaWNhdGlvblN0YXR1cz4oKTtcblxuICAgIHByaXZhdGUgcG9ydGFsQXBwID0gbmV3IFBsYW5ldFBvcnRhbEFwcGxpY2F0aW9uKCk7XG5cbiAgICBwcml2YXRlIHJvdXRlQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PFBsYW5ldFJvdXRlckV2ZW50PigpO1xuXG4gICAgcHJpdmF0ZSBhcHBTdGF0dXNDaGFuZ2UkID0gbmV3IFN1YmplY3Q8QXBwU3RhdHVzQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgICBwcml2YXRlIGFwcHNMb2FkaW5nU3RhcnQkID0gbmV3IFN1YmplY3Q8QXBwc0xvYWRpbmdTdGFydEV2ZW50PigpO1xuXG4gICAgcHVibGljIGdldCBhcHBTdGF0dXNDaGFuZ2UoKTogT2JzZXJ2YWJsZTxBcHBTdGF0dXNDaGFuZ2VFdmVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBTdGF0dXNDaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXBwc0xvYWRpbmdTdGFydCgpOiBPYnNlcnZhYmxlPEFwcHNMb2FkaW5nU3RhcnRFdmVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBzTG9hZGluZ1N0YXJ0JC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGluZ0RvbmUgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGFzc2V0c0xvYWRlcjogQXNzZXRzTG9hZGVyLFxuICAgICAgICBwcml2YXRlIHBsYW5ldEFwcGxpY2F0aW9uU2VydmljZTogUGxhbmV0QXBwbGljYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBhcHBsaWNhdGlvblJlZjogQXBwbGljYXRpb25SZWZcbiAgICApIHtcbiAgICAgICAgaWYgKGdldEFwcGxpY2F0aW9uTG9hZGVyKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnUGxhbmV0QXBwbGljYXRpb25Mb2FkZXIgaGFzIGJlZW4gaW5qZWN0ZWQgaW4gdGhlIHBvcnRhbCwgcmVwZWF0ZWQgaW5qZWN0aW9uIGlzIG5vdCBhbGxvd2VkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHN3aXRjaE1vZGU6IFN3aXRjaE1vZGVzLmRlZmF1bHQsXG4gICAgICAgICAgICBlcnJvckhhbmRsZXI6IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wb3J0YWxBcHAubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLnBvcnRhbEFwcC5hcHBsaWNhdGlvblJlZiA9IGFwcGxpY2F0aW9uUmVmO1xuICAgICAgICB0aGlzLnBvcnRhbEFwcC5yb3V0ZXIgPSByb3V0ZXI7XG4gICAgICAgIHRoaXMucG9ydGFsQXBwLmluamVjdG9yID0gaW5qZWN0b3I7XG4gICAgICAgIHRoaXMucG9ydGFsQXBwLmdsb2JhbEV2ZW50RGlzcGF0Y2hlciA9IGluamVjdG9yLmdldChHbG9iYWxFdmVudERpc3BhdGNoZXIpO1xuICAgICAgICBnbG9iYWxQbGFuZXQucG9ydGFsQXBwbGljYXRpb24gPSB0aGlzLnBvcnRhbEFwcDtcbiAgICAgICAgdGhpcy5zZXR1cFJvdXRlQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRBcHBTdGF0dXMoYXBwOiBQbGFuZXRBcHBsaWNhdGlvbiwgc3RhdHVzOiBBcHBsaWNhdGlvblN0YXR1cykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hcHBTdGF0dXNDaGFuZ2UkLm5leHQoe1xuICAgICAgICAgICAgICAgIGFwcDogYXBwLFxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuYXBwc1N0YXR1cy5zZXQoYXBwLCBzdGF0dXMpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN3aXRjaE1vZGVJc0NvZXhpc3QoYXBwOiBQbGFuZXRBcHBsaWNhdGlvbikge1xuICAgICAgICBpZiAoYXBwICYmIGFwcC5zd2l0Y2hNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwLnN3aXRjaE1vZGUgPT09IFN3aXRjaE1vZGVzLmNvZXhpc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnN3aXRjaE1vZGUgPT09IFN3aXRjaE1vZGVzLmNvZXhpc3Q7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVycm9ySGFuZGxlcihlcnJvcjogRXJyb3IpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRha2VPbmVTdGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TG9hZGluZ0RvbmUoKSB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdEb25lID0gdHJ1ZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cFJvdXRlQ2hhbmdlKCkge1xuICAgICAgICB0aGlzLnJvdXRlQ2hhbmdlJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHgsIHkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh4ICYmIHgudXJsKSA9PT0gKHkgJiYgeS51cmwpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vIFVzaW5nIHN3aXRjaE1hcCBzbyB3ZSBjYW5jZWwgZXhlY3V0aW5nIGxvYWRpbmcgd2hlbiBhIG5ldyBvbmUgY29tZXMgaW5cbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbmV3IG9ic2VydmFibGUgdXNlIG9mIGFuZCBjYXRjaEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAvLyBpbiBvcmRlciB0byBwcmV2ZW50IHJvdXRlQ2hhbmdlJCBjb21wbGV0ZWQgd2hpY2ggbmV2ZXIgdHJpZ2dlciBuZXcgcm91dGUgY2hhbmdlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihldmVudCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVubG9hZCBhcHBzIGFuZCByZXR1cm4gc2hvdWxkIGxvYWQgYXBwc1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0Um91dGVDaGFuZ2VFdmVudCA9IGV2ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZExvYWRBcHBzID0gdGhpcy5wbGFuZXRBcHBsaWNhdGlvblNlcnZpY2UuZ2V0QXBwc0J5TWF0Y2hlZFVybChldmVudC51cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZFVubG9hZEFwcHMgPSB0aGlzLmdldFVubG9hZEFwcHMoc2hvdWxkTG9hZEFwcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwc0xvYWRpbmdTdGFydCQubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZExvYWRBcHBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRVbmxvYWRBcHBzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bmxvYWRBcHBzKHNob3VsZFVubG9hZEFwcHMsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hvdWxkTG9hZEFwcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvYWQgYXBwIGFzc2V0cyAoc3RhdGljIHJlc291cmNlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChzaG91bGRMb2FkQXBwcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhhc0FwcHNOZWVkTG9hZGluZ0Fzc2V0cyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRBcHBzJCA9IHNob3VsZExvYWRBcHBzLm1hcChhcHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBTdGF0dXMgPSB0aGlzLmFwcHNTdGF0dXMuZ2V0KGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFhcHBTdGF0dXMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcFN0YXR1cyA9PT0gQXBwbGljYXRpb25TdGF0dXMuYXNzZXRzTG9hZGluZyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwU3RhdHVzID09PSBBcHBsaWNhdGlvblN0YXR1cy5sb2FkRXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBcHBzTmVlZExvYWRpbmdBc3NldHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydExvYWRBcHBBc3NldHMoYXBwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXBwc05lZWRMb2FkaW5nQXNzZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0RvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRBcHBzJC5sZW5ndGggPiAwID8gZm9ya0pvaW4obG9hZEFwcHMkKSA6IG9mKFtdIGFzIFBsYW5ldEFwcGxpY2F0aW9uW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBCb290c3RyYXAgb3Igc2hvdyBhcHBzXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoYXBwcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwcyQ6IE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb24+W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBzLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwU3RhdHVzID0gdGhpcy5hcHBzU3RhdHVzLmdldChhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBwU3RhdHVzID09PSBBcHBsaWNhdGlvblN0YXR1cy5ib290c3RyYXBwZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHMkLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YoYXBwKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QXBwKGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBSZWYgPSBnZXRQbGFuZXRBcHBsaWNhdGlvblJlZihhcHAubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBSZWYubmF2aWdhdGVCeVVybChldmVudC51cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwU3RhdHVzID09PSBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcHMkLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YoYXBwKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9vdHN0cmFwQXBwKGFwcCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFwcFN0YXR1cyhhcHAsIEFwcGxpY2F0aW9uU3RhdHVzLmFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9hZGluZ0RvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcFN0YXR1cyA9PT0gQXBwbGljYXRpb25TdGF0dXMuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBzJC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mKGFwcCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1YiBhcHAgdXNlIG9sZCB2ZXJzaW9uIHdoaWNoIGhhcyBub3QgZ2V0Q3VycmVudFJvdXRlclN0YXRlVXJsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VXJsID0gYXBwUmVmLmdldEN1cnJlbnRSb3V0ZXJTdGF0ZVVybFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXBwUmVmLmdldEN1cnJlbnRSb3V0ZXJTdGF0ZVVybCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VXJsICE9PSBldmVudC51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBSZWYubmF2aWdhdGVCeVVybChldmVudC51cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFwcCgke2FwcC5uYW1lfSkncyBzdGF0dXMgaXMgJHthcHBTdGF0dXN9LCBjYW4ndCBiZSBzaG93IG9yIGJvb3RzdHJhcGBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcHBzJC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOWIh+aNouWIsOW6lOeUqOWQjuS8muaciemXqueDgeeOsOixoe+8jOaJgOS7peS9v+eUqCBzZXRUaW1lb3V0IOWQjuWQr+WKqOW6lOeUqFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFtcGxlOiByZWRpcmVjdCB0byBhcHAxJ3MgZGFzaGJvYXJkIGZyb20gcG9ydGFsJ3MgYWJvdXQgcGFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhcHAncyByb3V0ZSBoYXMgcmVkaXJlY3QsIGl0IGRvZXNuJ3Qgd29yaywgaXQgb2sganVzdCBpbiBzZXRUaW1lb3V0LCBJIGRvbid0IGtub3cgd2h5LlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOjogcmVtb3ZlIGl0LCBpdCBpcyBvayBpbiB2ZXJzaW9uIEFuZ3VsYXIgOS54XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5q2k5aSE5Yik5pat5piv5Zug5Li65aaC5p6c6Z2Z5oCB6LWE5rqQ5Yqg6L295a6M5q+V6L+Y5pyq5ZCv5Yqo6KKr5Y+W5raI77yM6L+Y5piv5Lya5ZCv5Yqo5LmL5YmN55qE5bqU55So77yM6Jm954S25Y+v6IO95oCn5q+U6L6D5bCP77yM5L2G5piv5peg5rOV5o6S6Zmk6L+Z56eN5Y+v6IO95oCn77yM5omA5Lul5Y+q5pyJ5b2TIEV2ZW50IOaYr+acgOWQjuS4gOS4quaJjeS8muWQr+WKqFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnRSb3V0ZUNoYW5nZUV2ZW50ID09PSBldmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bk91dHNpZGVBbmd1bGFyIGZvciBmaXggZXJyb3I6IGBFeHBlY3RlZCB0byBub3QgYmUgaW4gQW5ndWxhciBab25lLCBidXQgaXQgaXMhYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ya0pvaW4oYXBwcyQpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExvYWRpbmdEb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVuc3VyZVByZWxvYWRBcHBzKGFwcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnN1cmVQcmVsb2FkQXBwcyhhcHBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3IgaGFuZGxlclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXJ0TG9hZEFwcEFzc2V0cyhhcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLmluUHJvZ3Jlc3NBcHBBc3NldHNMb2Fkcy5nZXQoYXBwLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pblByb2dyZXNzQXBwQXNzZXRzTG9hZHMuZ2V0KGFwcC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRBcHAkID0gdGhpcy5hc3NldHNMb2FkZXIubG9hZEFwcEFzc2V0cyhhcHApLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pblByb2dyZXNzQXBwQXNzZXRzTG9hZHMuZGVsZXRlKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkZWQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHA7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzc0FwcEFzc2V0c0xvYWRzLmRlbGV0ZShhcHAubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXBwU3RhdHVzKGFwcCwgQXBwbGljYXRpb25TdGF0dXMubG9hZEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzc0FwcEFzc2V0c0xvYWRzLnNldChhcHAubmFtZSwgbG9hZEFwcCQpO1xuICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkaW5nKTtcbiAgICAgICAgICAgIHJldHVybiBsb2FkQXBwJDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZUFwcChwbGFuZXRBcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKHBsYW5ldEFwcC5uYW1lKTtcbiAgICAgICAgY29uc3QgYXBwUm9vdEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFwcFJlZi5zZWxlY3RvciB8fCBwbGFuZXRBcHAuc2VsZWN0b3IpO1xuICAgICAgICBpZiAoYXBwUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTpub25lOycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG93QXBwKHBsYW5ldEFwcDogUGxhbmV0QXBwbGljYXRpb24pIHtcbiAgICAgICAgY29uc3QgYXBwUmVmID0gZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYocGxhbmV0QXBwLm5hbWUpO1xuICAgICAgICBjb25zdCBhcHBSb290RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYXBwUmVmLnNlbGVjdG9yIHx8IHBsYW5ldEFwcC5zZWxlY3Rvcik7XG4gICAgICAgIGlmIChhcHBSb290RWxlbWVudCkge1xuICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICcnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveUFwcChwbGFuZXRBcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKHBsYW5ldEFwcC5uYW1lKTtcbiAgICAgICAgaWYgKGFwcFJlZikge1xuICAgICAgICAgICAgYXBwUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb250YWluZXIgPSBnZXRIVE1MRWxlbWVudChwbGFuZXRBcHAuaG9zdFBhcmVudCk7XG4gICAgICAgIGNvbnN0IGFwcFJvb3RFbGVtZW50ID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoKGFwcFJlZiAmJiBhcHBSZWYuc2VsZWN0b3IpIHx8IHBsYW5ldEFwcC5zZWxlY3Rvcik7XG4gICAgICAgIGlmIChhcHBSb290RWxlbWVudCkge1xuICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKGFwcFJvb3RFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYm9vdHN0cmFwQXBwKFxuICAgICAgICBhcHA6IFBsYW5ldEFwcGxpY2F0aW9uLFxuICAgICAgICBkZWZhdWx0U3RhdHVzOiAnaGlkZGVuJyB8ICdkaXNwbGF5JyA9ICdkaXNwbGF5J1xuICAgICk6IE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb25SZWY+IHtcbiAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5ib290c3RyYXBwaW5nKTtcbiAgICAgICAgY29uc3QgYXBwUmVmID0gZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYoYXBwLm5hbWUpO1xuICAgICAgICBpZiAoYXBwUmVmICYmIGFwcFJlZi5ib290c3RyYXApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldEhUTUxFbGVtZW50KGFwcC5ob3N0UGFyZW50KTtcbiAgICAgICAgICAgIGxldCBhcHBSb290RWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihhcHBSZWYuc2VsZWN0b3IgfHwgYXBwLnNlbGVjdG9yKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFwcFJvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHBSZWYudGVtcGxhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50ID0gY3JlYXRlRWxlbWVudEJ5VGVtcGxhdGUoYXBwUmVmLnRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChhcHAuc2VsZWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTpub25lOycpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwLmhvc3RDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5jb2VyY2VBcnJheShhcHAuaG9zdENsYXNzKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcC5zdHlsZVByZWZpeCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCguLi5jb2VyY2VBcnJheShhcHAuc3R5bGVQcmVmaXgpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYXBwUm9vdEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBhcHBSZWYuYm9vdHN0cmFwKHRoaXMucG9ydGFsQXBwKTtcbiAgICAgICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHByb21pc2UgZm9yIGJvb3RzdHJhcFxuICAgICAgICAgICAgaWYgKHJlc3VsdFsndGhlbiddKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gZnJvbShyZXN1bHQpIGFzIE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb25SZWY+O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXBwU3RhdHVzKGFwcCwgQXBwbGljYXRpb25TdGF0dXMuYm9vdHN0cmFwcGVkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRTdGF0dXMgPT09ICdkaXNwbGF5JyAmJiBhcHBSb290RWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcFJlZjtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgWyR7YXBwLm5hbWV9XSBub3QgZm91bmQsIG1ha2Ugc3VyZSB0aGF0IHRoZSBhcHAgaGFzIHRoZSBjb3JyZWN0IG5hbWUgZGVmaW5lZCB1c2UgZGVmaW5lQXBwbGljYXRpb24oJHthcHAubmFtZX0pIGFuZCBydW50aW1lQ2h1bmsgYW5kIHZlbmRvckNodW5rIGFyZSBzZXQgdG8gdHJ1ZSwgZGV0YWlscyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3dvcmt0aWxlL25neC1wbGFuZXQjdGhyb3ctZXJyb3ItY2Fubm90LXJlYWQtcHJvcGVydHktY2FsbC1vZi11bmRlZmluZWQtYXQtX193ZWJwYWNrX3JlcXVpcmVfXy1ib290c3RyYXA3OWBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFVubG9hZEFwcHMoYWN0aXZlQXBwczogUGxhbmV0QXBwbGljYXRpb25bXSkge1xuICAgICAgICBjb25zdCB1bmxvYWRBcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdID0gW107XG4gICAgICAgIHRoaXMuYXBwc1N0YXR1cy5mb3JFYWNoKCh2YWx1ZSwgYXBwKSA9PiB7XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IEFwcGxpY2F0aW9uU3RhdHVzLmFjdGl2ZSAmJiAhYWN0aXZlQXBwcy5maW5kKGl0ZW0gPT4gaXRlbS5uYW1lID09PSBhcHAubmFtZSkpIHtcbiAgICAgICAgICAgICAgICB1bmxvYWRBcHBzLnB1c2goYXBwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB1bmxvYWRBcHBzO1xuICAgIH1cblxuICAgIHByaXZhdGUgdW5sb2FkQXBwcyhzaG91bGRVbmxvYWRBcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdLCBldmVudDogUGxhbmV0Um91dGVyRXZlbnQpIHtcbiAgICAgICAgY29uc3QgaGlkZUFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgZGVzdHJveUFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uW10gPSBbXTtcbiAgICAgICAgc2hvdWxkVW5sb2FkQXBwcy5mb3JFYWNoKGFwcCA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5zd2l0Y2hNb2RlSXNDb2V4aXN0KGFwcCkpIHtcbiAgICAgICAgICAgICAgICBoaWRlQXBwcy5wdXNoKGFwcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlQXBwKGFwcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5ib290c3RyYXBwZWQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZXN0cm95QXBwcy5wdXNoKGFwcCk7XG4gICAgICAgICAgICAgICAgLy8g6ZSA5q+B5LmL5YmN5YWI6ZqQ6JeP77yM5ZCm5YiZ5Lya5Ye6546w6Zeq54OB77yM5Zug5Li6IGRlc3Ryb3kg5piv5bu26L+f5omn6KGM55qEXG4gICAgICAgICAgICAgICAgLy8g5aaC5p6c6ZSA5q+B5LiN5bu26L+f5omn6KGM77yM5Lya5Ye6546w5YiH5o2i5Yiw5Li75bqU55So55qE5pe25YCZ5Lya5pyJ6KeG5Zu+5Y2h6aG/546w6LGhXG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlQXBwKGFwcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaGlkZUFwcHMubGVuZ3RoID4gMCB8fCBkZXN0cm95QXBwcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyDku47lhbbku5blupTnlKjliIfmjaLliLDkuLvlupTnlKjnmoTml7blgJnkvJrmnInop4blm77ljaHpob/njrDosaHvvIzmiYDku6XlhYjnrYnkuLvlupTnlKjmuLLmn5Plrozmr5XlkI7lho3liqDovb3lhbbku5blupTnlKhcbiAgICAgICAgICAgIC8vIOatpOWkhOWwneivleS9v+eUqCB0aGlzLm5nWm9uZS5vblN0YWJsZS5waXBlKHRha2UoMSkpIOW6lOeUqOS5i+mXtOeahOWIh+aNouS8muWHuueOsOmXqueDgVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGlkZUFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBSZWYgPSBnZXRQbGFuZXRBcHBsaWNhdGlvblJlZihhcHAubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHBSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJlZi5uYXZpZ2F0ZUJ5VXJsKGV2ZW50LnVybCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZXN0cm95QXBwcy5mb3JFYWNoKGFwcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUFwcChhcHApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByZWxvYWRBcHBzKGFjdGl2ZUFwcHM/OiBQbGFuZXRBcHBsaWNhdGlvbltdKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG9QcmVsb2FkQXBwcyA9IHRoaXMucGxhbmV0QXBwbGljYXRpb25TZXJ2aWNlLmdldEFwcHNUb1ByZWxvYWQoXG4gICAgICAgICAgICAgICAgYWN0aXZlQXBwcyA/IGFjdGl2ZUFwcHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBsb2FkQXBwcyQgPSB0b1ByZWxvYWRBcHBzLm1hcChwcmVsb2FkQXBwID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVsb2FkSW50ZXJuYWwocHJlbG9hZEFwcCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZm9ya0pvaW4obG9hZEFwcHMkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvciA9PiB0aGlzLmVycm9ySGFuZGxlcihlcnJvcilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuc3VyZVByZWxvYWRBcHBzKGFjdGl2ZUFwcHM/OiBQbGFuZXRBcHBsaWNhdGlvbltdKSB7XG4gICAgICAgIC8vIFN0YXJ0IHByZWxvYWQgYXBwc1xuICAgICAgICAvLyBTdGFydCBwcmVsb2FkIHdoZW4gZmlyc3QgdGltZSBhcHAgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmZpcnN0TG9hZCkge1xuICAgICAgICAgICAgdGhpcy5wcmVsb2FkQXBwcyhhY3RpdmVBcHBzKTtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RMb2FkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBQYXJ0aWFsPFBsYW5ldE9wdGlvbnM+KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXNldCByb3V0ZSBieSBjdXJyZW50IHJvdXRlclxuICAgICAqL1xuICAgIHB1YmxpYyByZXJvdXRlKGV2ZW50OiBQbGFuZXRSb3V0ZXJFdmVudCkge1xuICAgICAgICB0aGlzLnJvdXRlQ2hhbmdlJC5uZXh0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZWxvYWRJbnRlcm5hbChhcHA6IFBsYW5ldEFwcGxpY2F0aW9uLCBpbW1lZGlhdGU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxQbGFuZXRBcHBsaWNhdGlvblJlZj4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSB0aGlzLmFwcHNTdGF0dXMuZ2V0KGFwcCk7XG4gICAgICAgIGlmICghc3RhdHVzIHx8IHN0YXR1cyA9PT0gQXBwbGljYXRpb25TdGF0dXMubG9hZEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydExvYWRBcHBBc3NldHMoYXBwKS5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJvb3RzdHJhcEFwcChhcHAsICdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9vdHN0cmFwQXBwKGFwcCwgJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYoYXBwLm5hbWUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgW0FwcGxpY2F0aW9uU3RhdHVzLmFzc2V0c0xvYWRpbmcsIEFwcGxpY2F0aW9uU3RhdHVzLmFzc2V0c0xvYWRlZCwgQXBwbGljYXRpb25TdGF0dXMuYm9vdHN0cmFwcGluZ10uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgc3RhdHVzXG4gICAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwU3RhdHVzQ2hhbmdlLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmFwcCA9PT0gYXBwICYmIGV2ZW50LnN0YXR1cyA9PT0gQXBwbGljYXRpb25TdGF0dXMuYm9vdHN0cmFwcGVkO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgIGlmICghYXBwUmVmKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2FwcC5uYW1lfSdzIHN0YXR1cyBpcyAke0FwcGxpY2F0aW9uU3RhdHVzW3N0YXR1c119LCBwbGFuZXRBcHBsaWNhdGlvblJlZiBpcyBudWxsLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG9mKGFwcFJlZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmVsb2FkIHBsYW5ldCBhcHBsaWNhdGlvblxuICAgICAqIEBwYXJhbSBhcHAgYXBwXG4gICAgICogQHBhcmFtIGltbWVkaWF0ZSBib290c3RyYXAgb24gc3RhYmxlIGJ5IGRlZmF1bHQsIHNldHRpbmcgaW1tZWRpYXRlIGlzIHRydWUsIGl0IHdpbGwgYm9vdHN0cmFwIGltbWVkaWF0ZVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmVsb2FkKGFwcDogUGxhbmV0QXBwbGljYXRpb24sIGltbWVkaWF0ZT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPFBsYW5ldEFwcGxpY2F0aW9uUmVmPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRJbnRlcm5hbChhcHAsIGltbWVkaWF0ZSk7XG4gICAgfVxufVxuIl19
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { NgZone } from '@angular/core';
|
|
2
|
-
import { Router, NavigationEnd } from '@angular/router';
|
|
3
|
-
import { take } from 'rxjs/operators';
|
|
4
|
-
import { from } from 'rxjs';
|
|
5
|
-
import { getTagNameByTemplate } from '../helpers';
|
|
6
|
-
export class PlanetApplicationRef {
|
|
7
|
-
constructor(name, options) {
|
|
8
|
-
this.name = name;
|
|
9
|
-
if (options) {
|
|
10
|
-
this.template = options.template;
|
|
11
|
-
this.innerSelector = this.template ? getTagNameByTemplate(this.template) : null;
|
|
12
|
-
this.appModuleBootstrap = options.bootstrap;
|
|
13
|
-
}
|
|
14
|
-
// This is a hack, since NgZone doesn't allow you to configure the property that identifies your zone.
|
|
15
|
-
// See https://github.com/PlaceMe-SAS/single-spa-angular-cli/issues/33,
|
|
16
|
-
// NgZone.isInAngularZone = () => {
|
|
17
|
-
// // @ts-ignore
|
|
18
|
-
// return window.Zone.current._properties[`ngx-planet-${name}`] === true;
|
|
19
|
-
// };
|
|
20
|
-
}
|
|
21
|
-
get selector() {
|
|
22
|
-
return this.innerSelector;
|
|
23
|
-
}
|
|
24
|
-
get bootstrapped() {
|
|
25
|
-
return !!this.appModuleRef;
|
|
26
|
-
}
|
|
27
|
-
// 子应用路由变化后同步修改 portal 的 Route
|
|
28
|
-
syncPortalRouteWhenNavigationEnd() {
|
|
29
|
-
const router = this.appModuleRef.injector.get(Router);
|
|
30
|
-
const ngZone = this.appModuleRef.injector.get(NgZone);
|
|
31
|
-
if (router) {
|
|
32
|
-
router.events.subscribe(event => {
|
|
33
|
-
if (event instanceof NavigationEnd) {
|
|
34
|
-
ngZone.onStable
|
|
35
|
-
.asObservable()
|
|
36
|
-
.pipe(take(1))
|
|
37
|
-
.subscribe(() => {
|
|
38
|
-
this.portalApp.router.navigateByUrl(event.url);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
bootstrap(app) {
|
|
45
|
-
if (!this.appModuleBootstrap) {
|
|
46
|
-
throw new Error(`app(${this.name}) is not defined`);
|
|
47
|
-
}
|
|
48
|
-
this.portalApp = app;
|
|
49
|
-
return from(this.appModuleBootstrap(app).then(appModuleRef => {
|
|
50
|
-
this.appModuleRef = appModuleRef;
|
|
51
|
-
this.appModuleRef.instance.appName = this.name;
|
|
52
|
-
this.syncPortalRouteWhenNavigationEnd();
|
|
53
|
-
return this;
|
|
54
|
-
}));
|
|
55
|
-
}
|
|
56
|
-
getRouter() {
|
|
57
|
-
return this.appModuleRef.injector.get(Router);
|
|
58
|
-
}
|
|
59
|
-
getCurrentRouterStateUrl() {
|
|
60
|
-
return this.getRouter().routerState.snapshot.url;
|
|
61
|
-
}
|
|
62
|
-
navigateByUrl(url) {
|
|
63
|
-
const ngZone = this.appModuleRef.injector.get(NgZone);
|
|
64
|
-
const router = this.getRouter();
|
|
65
|
-
ngZone.run(() => {
|
|
66
|
-
router.navigateByUrl(url);
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
getComponentFactory() {
|
|
70
|
-
return this.componentFactory;
|
|
71
|
-
}
|
|
72
|
-
registerComponentFactory(componentFactory) {
|
|
73
|
-
this.componentFactory = componentFactory;
|
|
74
|
-
}
|
|
75
|
-
destroy() {
|
|
76
|
-
if (this.appModuleRef) {
|
|
77
|
-
const router = this.appModuleRef.injector.get(Router);
|
|
78
|
-
if (router) {
|
|
79
|
-
router.dispose();
|
|
80
|
-
}
|
|
81
|
-
this.appModuleRef.destroy();
|
|
82
|
-
delete this.appModuleRef;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbmV0LWFwcGxpY2F0aW9uLXJlZi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvaGFpZmVuZy9JVC8xMF9ZQy9Xb3JrdGlsZS9uZ3gtcGxhbmV0L3BhY2thZ2VzL3BsYW5ldC9zcmMvIiwic291cmNlcyI6WyJhcHBsaWNhdGlvbi9wbGFuZXQtYXBwbGljYXRpb24tcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUt4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFjbEQsTUFBTSxPQUFPLG9CQUFvQjtJQWdCN0IsWUFBWSxJQUFZLEVBQUUsT0FBeUI7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxPQUFPLEVBQUU7WUFDVCxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNoRixJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUMvQztRQUNELHNHQUFzRztRQUN0Ryx1RUFBdUU7UUFDdkUsbUNBQW1DO1FBQ25DLG9CQUFvQjtRQUNwQiw2RUFBNkU7UUFDN0UsS0FBSztJQUNULENBQUM7SUF6QkQsSUFBVyxRQUFRO1FBQ2YsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFXLFlBQVk7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QUFZLENBQUM7U0FDNUI7SUFDTCxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZVJlZiwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFBsYW5ldEFwcGxpY2F0aW9uIH0gZnJvbSAnLi4vcGxhbmV0LmNsYXNzJztcbmltcG9ydCB7IFBsYW5ldFBvcnRhbEFwcGxpY2F0aW9uIH0gZnJvbSAnLi9wb3J0YWwtYXBwbGljYXRpb24nO1xuaW1wb3J0IHsgUGxhbnRDb21wb25lbnRDb25maWcgfSBmcm9tICcuLi9jb21wb25lbnQvcGxhbnQtY29tcG9uZW50LmNvbmZpZyc7XG5pbXBvcnQgeyBQbGFuZXRDb21wb25lbnRSZWYgfSBmcm9tICcuLi9jb21wb25lbnQvcGxhbmV0LWNvbXBvbmVudC1yZWYnO1xuaW1wb3J0IHsgZ2V0VGFnTmFtZUJ5VGVtcGxhdGUgfSBmcm9tICcuLi9oZWxwZXJzJztcblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBPcHRpb25zIHtcbiAgICB0ZW1wbGF0ZTogc3RyaW5nO1xuICAgIGJvb3RzdHJhcDogQm9vdHN0cmFwQXBwTW9kdWxlO1xufVxuXG5leHBvcnQgdHlwZSBCb290c3RyYXBBcHBNb2R1bGUgPSAocG9ydGFsQXBwPzogUGxhbmV0UG9ydGFsQXBwbGljYXRpb24pID0+IFByb21pc2U8TmdNb2R1bGVSZWY8YW55Pj47XG5cbmV4cG9ydCB0eXBlIFBsYW50Q29tcG9uZW50RmFjdG9yeSA9IDxURGF0YSwgVENvbXA+KFxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbiAgICBjb25maWc6IFBsYW50Q29tcG9uZW50Q29uZmlnPFREYXRhPlxuKSA9PiBQbGFuZXRDb21wb25lbnRSZWY8VENvbXA+O1xuXG5leHBvcnQgY2xhc3MgUGxhbmV0QXBwbGljYXRpb25SZWYge1xuICAgIHB1YmxpYyBhcHBNb2R1bGVSZWY6IE5nTW9kdWxlUmVmPGFueT47XG4gICAgcHVibGljIHRlbXBsYXRlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBpbm5lclNlbGVjdG9yOiBzdHJpbmc7XG4gICAgcHVibGljIGdldCBzZWxlY3RvcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJTZWxlY3RvcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGJvb3RzdHJhcHBlZCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5hcHBNb2R1bGVSZWY7XG4gICAgfVxuICAgIHByaXZhdGUgbmFtZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcG9ydGFsQXBwOiBQbGFuZXRQb3J0YWxBcHBsaWNhdGlvbjtcbiAgICBwcml2YXRlIGFwcE1vZHVsZUJvb3RzdHJhcDogKGFwcDogUGxhbmV0UG9ydGFsQXBwbGljYXRpb24pID0+IFByb21pc2U8TmdNb2R1bGVSZWY8YW55Pj47XG4gICAgcHJpdmF0ZSBjb21wb25lbnRGYWN0b3J5OiBQbGFudENvbXBvbmVudEZhY3Rvcnk7XG5cbiAgICBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IEJvb3RzdHJhcE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGUgPSBvcHRpb25zLnRlbXBsYXRlO1xuICAgICAgICAgICAgdGhpcy5pbm5lclNlbGVjdG9yID0gdGhpcy50ZW1wbGF0ZSA/IGdldFRhZ05hbWVCeVRlbXBsYXRlKHRoaXMudGVtcGxhdGUpIDogbnVsbDtcbiAgICAgICAgICAgIHRoaXMuYXBwTW9kdWxlQm9vdHN0cmFwID0gb3B0aW9ucy5ib290c3RyYXA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2ssIHNpbmNlIE5nWm9uZSBkb2Vzbid0IGFsbG93IHlvdSB0byBjb25maWd1cmUgdGhlIHByb3BlcnR5IHRoYXQgaWRlbnRpZmllcyB5b3VyIHpvbmUuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vUGxhY2VNZS1TQVMvc2luZ2xlLXNwYS1hbmd1bGFyLWNsaS9pc3N1ZXMvMzMsXG4gICAgICAgIC8vIE5nWm9uZS5pc0luQW5ndWxhclpvbmUgPSAoKSA9PiB7XG4gICAgICAgIC8vICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vICAgICByZXR1cm4gd2luZG93LlpvbmUuY3VycmVudC5fcHJvcGVydGllc1tgbmd4LXBsYW5ldC0ke25hbWV9YF0gPT09IHRydWU7XG4gICAgICAgIC8vIH07XG4gICAgfVxuXG4gICAgLy8g5a2Q5bqU55So6Lev55Sx5Y+Y5YyW5ZCO5ZCM5q2l5L+u5pS5IHBvcnRhbCDnmoQgUm91dGVcbiAgICBwcml2YXRlIHN5bmNQb3J0YWxSb3V0ZVdoZW5OYXZpZ2F0aW9uRW5kKCkge1xuICAgICAgICBjb25zdCByb3V0ZXIgPSB0aGlzLmFwcE1vZHVsZVJlZi5pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICAgICAgY29uc3Qgbmdab25lID0gdGhpcy5hcHBNb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KE5nWm9uZSk7XG4gICAgICAgIGlmIChyb3V0ZXIpIHtcbiAgICAgICAgICAgIHJvdXRlci5ldmVudHMuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5vblN0YWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3J0YWxBcHAucm91dGVyLm5hdmlnYXRlQnlVcmwoZXZlbnQudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYm9vdHN0cmFwKGFwcDogUGxhbmV0UG9ydGFsQXBwbGljYXRpb24pOiBPYnNlcnZhYmxlPHRoaXM+IHtcbiAgICAgICAgaWYgKCF0aGlzLmFwcE1vZHVsZUJvb3RzdHJhcCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBhcHAoJHt0aGlzLm5hbWV9KSBpcyBub3QgZGVmaW5lZGApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9ydGFsQXBwID0gYXBwO1xuICAgICAgICByZXR1cm4gZnJvbShcbiAgICAgICAgICAgIHRoaXMuYXBwTW9kdWxlQm9vdHN0cmFwKGFwcCkudGhlbihhcHBNb2R1bGVSZWYgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwTW9kdWxlUmVmID0gYXBwTW9kdWxlUmVmO1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwTW9kdWxlUmVmLmluc3RhbmNlLmFwcE5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jUG9ydGFsUm91dGVXaGVuTmF2aWdhdGlvbkVuZCgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRSb3V0ZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFwcE1vZHVsZVJlZi5pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50Um91dGVyU3RhdGVVcmwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFJvdXRlcigpLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybDtcbiAgICB9XG5cbiAgICBuYXZpZ2F0ZUJ5VXJsKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG5nWm9uZSA9IHRoaXMuYXBwTW9kdWxlUmVmLmluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgICAgICBjb25zdCByb3V0ZXIgPSB0aGlzLmdldFJvdXRlcigpO1xuICAgICAgICBuZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHVybCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldENvbXBvbmVudEZhY3RvcnkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudEZhY3Rvcnk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudEZhY3Rvcnk6IFBsYW50Q29tcG9uZW50RmFjdG9yeSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcnkgPSBjb21wb25lbnRGYWN0b3J5O1xuICAgIH1cblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFwcE1vZHVsZVJlZikge1xuICAgICAgICAgICAgY29uc3Qgcm91dGVyID0gdGhpcy5hcHBNb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgICAgICAgICBpZiAocm91dGVyKSB7XG4gICAgICAgICAgICAgICAgcm91dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuYXBwTW9kdWxlUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFwcE1vZHVsZVJlZjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|