@worktile/planet 16.0.0-next.0 → 17.0.0-next.0
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/CHANGELOG.md +14 -0
- package/application/ng-planet-application-ref.d.ts +48 -0
- package/application/ng-planet-application-ref.d.ts.map +1 -0
- package/application/planet-application-ref.d.ts +3 -27
- package/application/planet-application-ref.d.ts.map +1 -1
- package/component/planet-component-loader.d.ts.map +1 -1
- package/component/planet-component-outlet.d.ts +1 -1
- package/esm2022/application/ng-planet-application-ref.mjs +106 -0
- package/esm2022/application/planet-application-loader.mjs +454 -0
- package/esm2022/application/planet-application-ref.mjs +2 -0
- package/esm2022/application/planet-application.service.mjs +85 -0
- package/esm2022/assets-loader.mjs +216 -0
- package/esm2022/component/planet-component-loader.mjs +171 -0
- package/esm2022/component/planet-component-outlet.mjs +69 -0
- package/esm2022/debug.mjs +33 -0
- package/{esm2020 → esm2022}/empty/empty.component.mjs +4 -4
- package/esm2022/global-event-dispatcher.mjs +70 -0
- package/esm2022/global-planet.mjs +63 -0
- package/esm2022/helpers.mjs +119 -0
- package/esm2022/module.mjs +33 -0
- package/esm2022/planet.mjs +91 -0
- package/esm2022/public-api.mjs +19 -0
- package/esm2022/router/route-redirect.mjs +63 -0
- package/{esm2020 → esm2022}/sandbox/index.mjs +1 -1
- package/esm2022/sandbox/proxy/patches/eventListener.mjs +41 -0
- package/esm2022/sandbox/proxy/proxies/common.mjs +132 -0
- package/esm2022/sandbox/proxy/proxies/document.mjs +126 -0
- package/esm2022/sandbox/proxy/proxies/window.mjs +158 -0
- package/esm2022/sandbox/proxy/proxy-sandbox.mjs +49 -0
- package/esm2022/sandbox/snapshot/snapshot-sandbox.mjs +12 -0
- package/{fesm2020 → fesm2022}/worktile-planet.mjs +96 -73
- package/fesm2022/worktile-planet.mjs.map +1 -0
- package/global-planet.d.ts +4 -2
- package/global-planet.d.ts.map +1 -1
- package/package.json +7 -13
- package/sandbox/proxy/patches/eventListener.d.ts.map +1 -1
- package/sandbox/proxy/proxy-sandbox.d.ts.map +1 -1
- package/sandbox/snapshot/snapshot-sandbox.d.ts.map +1 -1
- package/esm2020/application/planet-application-loader.mjs +0 -454
- package/esm2020/application/planet-application-ref.mjs +0 -94
- package/esm2020/application/planet-application.service.mjs +0 -85
- package/esm2020/assets-loader.mjs +0 -216
- package/esm2020/component/planet-component-loader.mjs +0 -170
- package/esm2020/component/planet-component-outlet.mjs +0 -69
- package/esm2020/debug.mjs +0 -33
- package/esm2020/global-event-dispatcher.mjs +0 -70
- package/esm2020/global-planet.mjs +0 -53
- package/esm2020/helpers.mjs +0 -119
- package/esm2020/module.mjs +0 -33
- package/esm2020/planet.mjs +0 -91
- package/esm2020/public-api.mjs +0 -20
- package/esm2020/router/route-redirect.mjs +0 -63
- package/esm2020/sandbox/proxy/patches/eventListener.mjs +0 -41
- package/esm2020/sandbox/proxy/proxies/common.mjs +0 -132
- package/esm2020/sandbox/proxy/proxies/document.mjs +0 -126
- package/esm2020/sandbox/proxy/proxies/window.mjs +0 -158
- package/esm2020/sandbox/proxy/proxy-sandbox.mjs +0 -49
- package/esm2020/sandbox/snapshot/snapshot-sandbox.mjs +0 -12
- package/fesm2015/worktile-planet.mjs +0 -2193
- package/fesm2015/worktile-planet.mjs.map +0 -1
- package/fesm2020/worktile-planet.mjs.map +0 -1
- /package/{esm2020 → esm2022}/application/portal-application.mjs +0 -0
- /package/{esm2020 → esm2022}/component/planet-component-ref.mjs +0 -0
- /package/{esm2020 → esm2022}/component/plant-component.config.mjs +0 -0
- /package/{esm2020 → esm2022}/planet.class.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/exec.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/proxy/patches/document.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/proxy/patches/index.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/proxy/patches/storage.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/proxy/patches/timer.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/proxy/types.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/sandbox.mjs +0 -0
- /package/{esm2020 → esm2022}/sandbox/types.mjs +0 -0
- /package/{esm2020 → esm2022}/worktile-planet.mjs +0 -0
|
@@ -1,454 +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
|
-
get appStatusChange() {
|
|
29
|
-
return this.appStatusChange$.asObservable();
|
|
30
|
-
}
|
|
31
|
-
get appsLoadingStart() {
|
|
32
|
-
return this.appsLoadingStart$.asObservable();
|
|
33
|
-
}
|
|
34
|
-
constructor(assetsLoader, planetApplicationService, ngZone, router, injector, applicationRef) {
|
|
35
|
-
this.assetsLoader = assetsLoader;
|
|
36
|
-
this.planetApplicationService = planetApplicationService;
|
|
37
|
-
this.ngZone = ngZone;
|
|
38
|
-
this.firstLoad = true;
|
|
39
|
-
this.inProgressAppAssetsLoads = new Map();
|
|
40
|
-
this.appsStatus = new Map();
|
|
41
|
-
this.portalApp = new PlanetPortalApplication();
|
|
42
|
-
this.routeChange$ = new Subject();
|
|
43
|
-
this.appStatusChange$ = new Subject();
|
|
44
|
-
this.appsLoadingStart$ = new Subject();
|
|
45
|
-
this.loadingDone = false;
|
|
46
|
-
if (getApplicationLoader()) {
|
|
47
|
-
throw new Error('PlanetApplicationLoader has been injected in the portal, repeated injection is not allowed');
|
|
48
|
-
}
|
|
49
|
-
this.options = {
|
|
50
|
-
switchMode: SwitchModes.default,
|
|
51
|
-
errorHandler: (error) => {
|
|
52
|
-
console.error(error);
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
this.portalApp.ngZone = ngZone;
|
|
56
|
-
this.portalApp.applicationRef = applicationRef;
|
|
57
|
-
this.portalApp.router = router;
|
|
58
|
-
this.portalApp.injector = injector;
|
|
59
|
-
this.portalApp.globalEventDispatcher = injector.get(GlobalEventDispatcher);
|
|
60
|
-
globalPlanet.portalApplication = this.portalApp;
|
|
61
|
-
this.setupRouteChange();
|
|
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) : undefined);
|
|
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 => {
|
|
377
|
-
this.errorHandler(error);
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
});
|
|
381
|
-
}
|
|
382
|
-
ensurePreloadApps(activeApps) {
|
|
383
|
-
// Start preload apps
|
|
384
|
-
// Start preload when first time app loaded
|
|
385
|
-
if (this.firstLoad) {
|
|
386
|
-
this.preloadApps(activeApps);
|
|
387
|
-
this.firstLoad = false;
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
setOptions(options) {
|
|
391
|
-
this.options = {
|
|
392
|
-
...this.options,
|
|
393
|
-
...options
|
|
394
|
-
};
|
|
395
|
-
}
|
|
396
|
-
/**
|
|
397
|
-
* reset route by current router
|
|
398
|
-
*/
|
|
399
|
-
reroute(event) {
|
|
400
|
-
this.routeChange$.next(event);
|
|
401
|
-
}
|
|
402
|
-
preloadInternal(app, immediate) {
|
|
403
|
-
const status = this.appsStatus.get(app);
|
|
404
|
-
if (!status || status === ApplicationStatus.loadError) {
|
|
405
|
-
debug(`preload app(${app.name}), status is empty, start to load assets`);
|
|
406
|
-
return this.startLoadAppAssets(app).pipe(switchMap(() => {
|
|
407
|
-
debug(`preload app(${app.name}), assets loaded, start bootstrap app, immediate: ${!!immediate}`);
|
|
408
|
-
if (immediate) {
|
|
409
|
-
return this.bootstrapApp(app, 'hidden');
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
return this.ngZone.runOutsideAngular(() => {
|
|
413
|
-
return this.bootstrapApp(app, 'hidden');
|
|
414
|
-
});
|
|
415
|
-
}
|
|
416
|
-
}), catchError(error => {
|
|
417
|
-
this.errorHandler(error);
|
|
418
|
-
return of(null);
|
|
419
|
-
}), map(() => {
|
|
420
|
-
return getPlanetApplicationRef(app.name);
|
|
421
|
-
}));
|
|
422
|
-
}
|
|
423
|
-
else if ([ApplicationStatus.assetsLoading, ApplicationStatus.assetsLoaded, ApplicationStatus.bootstrapping].includes(status)) {
|
|
424
|
-
debug(`preload app(${app.name}), status is ${ApplicationStatus[status]}, return until bootstrapped`);
|
|
425
|
-
return this.getAppStatusChange$(app).pipe(take(1), map(() => {
|
|
426
|
-
return getPlanetApplicationRef(app.name);
|
|
427
|
-
}));
|
|
428
|
-
}
|
|
429
|
-
else {
|
|
430
|
-
const appRef = getPlanetApplicationRef(app.name);
|
|
431
|
-
if (!appRef) {
|
|
432
|
-
throw new Error(`${app.name}'s status is ${ApplicationStatus[status]}, planetApplicationRef is null.`);
|
|
433
|
-
}
|
|
434
|
-
return of(appRef);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
/**
|
|
438
|
-
* Preload planet application
|
|
439
|
-
* @param app app
|
|
440
|
-
* @param immediate bootstrap on stable by default, setting immediate is true, it will bootstrap immediate
|
|
441
|
-
*/
|
|
442
|
-
preload(app, immediate) {
|
|
443
|
-
return this.preloadInternal(app, immediate);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
PlanetApplicationLoader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: PlanetApplicationLoader, deps: [{ token: i1.AssetsLoader }, { token: i2.PlanetApplicationService }, { token: i0.NgZone }, { token: i3.Router }, { token: i0.Injector }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
447
|
-
PlanetApplicationLoader.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: PlanetApplicationLoader, providedIn: 'root' });
|
|
448
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: PlanetApplicationLoader, decorators: [{
|
|
449
|
-
type: Injectable,
|
|
450
|
-
args: [{
|
|
451
|
-
providedIn: 'root'
|
|
452
|
-
}]
|
|
453
|
-
}], ctorParameters: function () { return [{ type: i1.AssetsLoader }, { type: i2.PlanetApplicationService }, { type: i0.NgZone }, { type: i3.Router }, { type: i0.Injector }, { type: i0.ApplicationRef }]; } });
|
|
454
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhbmV0LWFwcGxpY2F0aW9uLWxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL3BsYW5ldC9zcmMvYXBwbGljYXRpb24vcGxhbmV0LWFwcGxpY2F0aW9uLWxvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdFLE9BQU8sRUFBRSxFQUFFLEVBQWMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBd0MsV0FBVyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RyxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVsRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSx1QkFBdUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQy9GLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7Ozs7O0FBQ3ZDLE1BQU0sS0FBSyxHQUFHLFdBQVcs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SUFBSSxnQkFBZ0IsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7YUFDMUc7WUFDRCxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNyQjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksT0FBTyxDQUFDLEdBQXNCLEVBQUUsU0FBbUI7UUFDdEQsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDOztvSEE5ZlEsdUJBQXVCO3dIQUF2Qix1QkFBdUIsY0FGcEIsTUFBTTsyRkFFVCx1QkFBdUI7a0JBSG5DLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBBcHBsaWNhdGlvblJlZiwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG9mLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBmb3JrSm9pbiwgZnJvbSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQXNzZXRzTG9hZGVyIH0gZnJvbSAnLi4vYXNzZXRzLWxvYWRlcic7XG5pbXBvcnQgeyBQbGFuZXRBcHBsaWNhdGlvbiwgUGxhbmV0Um91dGVyRXZlbnQsIFN3aXRjaE1vZGVzLCBQbGFuZXRPcHRpb25zIH0gZnJvbSAnLi4vcGxhbmV0LmNsYXNzJztcbmltcG9ydCB7IHN3aXRjaE1hcCwgc2hhcmUsIG1hcCwgdGFwLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgdGFrZSwgZmlsdGVyLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgZ2V0SFRNTEVsZW1lbnQsIGNvZXJjZUFycmF5LCBjcmVhdGVFbGVtZW50QnlUZW1wbGF0ZSB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0IHsgUGxhbmV0QXBwbGljYXRpb25SZWYgfSBmcm9tICcuL3BsYW5ldC1hcHBsaWNhdGlvbi1yZWYnO1xuaW1wb3J0IHsgUGxhbmV0UG9ydGFsQXBwbGljYXRpb24gfSBmcm9tICcuL3BvcnRhbC1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBQbGFuZXRBcHBsaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuL3BsYW5ldC1hcHBsaWNhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbEV2ZW50RGlzcGF0Y2hlciB9IGZyb20gJy4uL2dsb2JhbC1ldmVudC1kaXNwYXRjaGVyJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBnbG9iYWxQbGFuZXQsIGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmLCBnZXRBcHBsaWNhdGlvbkxvYWRlciB9IGZyb20gJy4uL2dsb2JhbC1wbGFuZXQnO1xuaW1wb3J0IHsgY3JlYXRlRGVidWcgfSBmcm9tICcuLi9kZWJ1Zyc7XG5jb25zdCBkZWJ1ZyA9IGNyZWF0ZURlYnVnKCdhcHAtbG9hZGVyJyk7XG5cbmV4cG9ydCBlbnVtIEFwcGxpY2F0aW9uU3RhdHVzIHtcbiAgICBhc3NldHNMb2FkaW5nID0gMSxcbiAgICBhc3NldHNMb2FkZWQgPSAyLFxuICAgIGJvb3RzdHJhcHBpbmcgPSAzLFxuICAgIGJvb3RzdHJhcHBlZCA9IDQsXG4gICAgYWN0aXZlID0gNSxcbiAgICBsb2FkRXJyb3IgPSAxMFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwcHNMb2FkaW5nU3RhcnRFdmVudCB7XG4gICAgc2hvdWxkTG9hZEFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uW107XG4gICAgc2hvdWxkVW5sb2FkQXBwczogUGxhbmV0QXBwbGljYXRpb25bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBTdGF0dXNDaGFuZ2VFdmVudCB7XG4gICAgYXBwOiBQbGFuZXRBcHBsaWNhdGlvbjtcbiAgICBzdGF0dXM6IEFwcGxpY2F0aW9uU3RhdHVzO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBsYW5ldEFwcGxpY2F0aW9uTG9hZGVyIHtcbiAgICBwcml2YXRlIGZpcnN0TG9hZCA9IHRydWU7XG5cbiAgICBwcml2YXRlIHN0YXJ0Um91dGVDaGFuZ2VFdmVudCE6IFBsYW5ldFJvdXRlckV2ZW50O1xuXG4gICAgcHJpdmF0ZSBvcHRpb25zOiBQbGFuZXRPcHRpb25zO1xuXG4gICAgcHJpdmF0ZSBpblByb2dyZXNzQXBwQXNzZXRzTG9hZHMgPSBuZXcgTWFwPHN0cmluZywgT2JzZXJ2YWJsZTxQbGFuZXRBcHBsaWNhdGlvbj4+KCk7XG5cbiAgICBwcml2YXRlIGFwcHNTdGF0dXMgPSBuZXcgTWFwPFBsYW5ldEFwcGxpY2F0aW9uLCBBcHBsaWNhdGlvblN0YXR1cz4oKTtcblxuICAgIHByaXZhdGUgcG9ydGFsQXBwID0gbmV3IFBsYW5ldFBvcnRhbEFwcGxpY2F0aW9uKCk7XG5cbiAgICBwcml2YXRlIHJvdXRlQ2hhbmdlJCA9IG5ldyBTdWJqZWN0PFBsYW5ldFJvdXRlckV2ZW50PigpO1xuXG4gICAgcHJpdmF0ZSBhcHBTdGF0dXNDaGFuZ2UkID0gbmV3IFN1YmplY3Q8QXBwU3RhdHVzQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgICBwcml2YXRlIGFwcHNMb2FkaW5nU3RhcnQkID0gbmV3IFN1YmplY3Q8QXBwc0xvYWRpbmdTdGFydEV2ZW50PigpO1xuXG4gICAgcHVibGljIGdldCBhcHBTdGF0dXNDaGFuZ2UoKTogT2JzZXJ2YWJsZTxBcHBTdGF0dXNDaGFuZ2VFdmVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBTdGF0dXNDaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYXBwc0xvYWRpbmdTdGFydCgpOiBPYnNlcnZhYmxlPEFwcHNMb2FkaW5nU3RhcnRFdmVudD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHBzTG9hZGluZ1N0YXJ0JC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGluZ0RvbmUgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGFzc2V0c0xvYWRlcjogQXNzZXRzTG9hZGVyLFxuICAgICAgICBwcml2YXRlIHBsYW5ldEFwcGxpY2F0aW9uU2VydmljZTogUGxhbmV0QXBwbGljYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgICAgICByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICBhcHBsaWNhdGlvblJlZjogQXBwbGljYXRpb25SZWZcbiAgICApIHtcbiAgICAgICAgaWYgKGdldEFwcGxpY2F0aW9uTG9hZGVyKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAnUGxhbmV0QXBwbGljYXRpb25Mb2FkZXIgaGFzIGJlZW4gaW5qZWN0ZWQgaW4gdGhlIHBvcnRhbCwgcmVwZWF0ZWQgaW5qZWN0aW9uIGlzIG5vdCBhbGxvd2VkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHN3aXRjaE1vZGU6IFN3aXRjaE1vZGVzLmRlZmF1bHQsXG4gICAgICAgICAgICBlcnJvckhhbmRsZXI6IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wb3J0YWxBcHAubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLnBvcnRhbEFwcC5hcHBsaWNhdGlvblJlZiA9IGFwcGxpY2F0aW9uUmVmO1xuICAgICAgICB0aGlzLnBvcnRhbEFwcC5yb3V0ZXIgPSByb3V0ZXI7XG4gICAgICAgIHRoaXMucG9ydGFsQXBwLmluamVjdG9yID0gaW5qZWN0b3I7XG4gICAgICAgIHRoaXMucG9ydGFsQXBwLmdsb2JhbEV2ZW50RGlzcGF0Y2hlciA9IGluamVjdG9yLmdldChHbG9iYWxFdmVudERpc3BhdGNoZXIpO1xuICAgICAgICBnbG9iYWxQbGFuZXQucG9ydGFsQXBwbGljYXRpb24gPSB0aGlzLnBvcnRhbEFwcDtcbiAgICAgICAgdGhpcy5zZXR1cFJvdXRlQ2hhbmdlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRBcHBTdGF0dXMoYXBwOiBQbGFuZXRBcHBsaWNhdGlvbiwgc3RhdHVzOiBBcHBsaWNhdGlvblN0YXR1cykge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnJvbVN0YXR1cyA9IHRoaXMuYXBwc1N0YXR1cy5nZXQoYXBwKTtcbiAgICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgICAgIGBhcHAoJHthcHAubmFtZX0pIHN0YXR1cyBjaGFuZ2U6ICR7ZnJvbVN0YXR1cyA/IEFwcGxpY2F0aW9uU3RhdHVzW2Zyb21TdGF0dXNdIDogJ2VtcHR5J30gPT4gJHtcbiAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25TdGF0dXNbc3RhdHVzXVxuICAgICAgICAgICAgICAgIH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hcHBzU3RhdHVzLnNldChhcHAsIHN0YXR1cyk7XG4gICAgICAgICAgICB0aGlzLmFwcFN0YXR1c0NoYW5nZSQubmV4dCh7XG4gICAgICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFwcFN0YXR1c0NoYW5nZSQoXG4gICAgICAgIGFwcDogUGxhbmV0QXBwbGljYXRpb24sXG4gICAgICAgIHN0YXR1cyA9IEFwcGxpY2F0aW9uU3RhdHVzLmJvb3RzdHJhcHBlZFxuICAgICk6IE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwU3RhdHVzQ2hhbmdlLnBpcGUoXG4gICAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBldmVudC5hcHAgPT09IGFwcCAmJiBldmVudC5zdGF0dXMgPT09IHN0YXR1cztcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN3aXRjaE1vZGVJc0NvZXhpc3QoYXBwOiBQbGFuZXRBcHBsaWNhdGlvbikge1xuICAgICAgICBpZiAoYXBwICYmIGFwcC5zd2l0Y2hNb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gYXBwLnN3aXRjaE1vZGUgPT09IFN3aXRjaE1vZGVzLmNvZXhpc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnN3aXRjaE1vZGUgPT09IFN3aXRjaE1vZGVzLmNvZXhpc3Q7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVycm9ySGFuZGxlcihlcnJvcjogRXJyb3IpIHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5lcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExvYWRpbmdEb25lKCkge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nRG9uZSA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0QXBwTmFtZXMoYXBwczogUGxhbmV0QXBwbGljYXRpb25bXSk6IHN0cmluZyB8IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIGFwcHMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICA/IGBbXWBcbiAgICAgICAgICAgIDogYXBwcy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xuICAgICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwUm91dGVDaGFuZ2UoKSB7XG4gICAgICAgIHRoaXMucm91dGVDaGFuZ2UkXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgoeCwgeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHggJiYgeC51cmwpID09PSAoeSAmJiB5LnVybCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gVXNpbmcgc3dpdGNoTWFwIHNvIHdlIGNhbmNlbCBleGVjdXRpbmcgbG9hZGluZyB3aGVuIGEgbmV3IG9uZSBjb21lcyBpblxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBuZXcgb2JzZXJ2YWJsZSB1c2Ugb2YgYW5kIGNhdGNoRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIHByZXZlbnQgcm91dGVDaGFuZ2UkIGNvbXBsZXRlZCB3aGljaCBuZXZlciB0cmlnZ2VyIG5ldyByb3V0ZSBjaGFuZ2VcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGV2ZW50KS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sb2FkIGFwcHMgYW5kIHJldHVybiBzaG91bGQgbG9hZCBhcHBzXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKGByb3V0ZSBjaGFuZ2UsIHVybCBpczogJHtldmVudC51cmx9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFJvdXRlQ2hhbmdlRXZlbnQgPSBldmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRMb2FkQXBwcyA9IHRoaXMucGxhbmV0QXBwbGljYXRpb25TZXJ2aWNlLmdldEFwcHNCeU1hdGNoZWRVcmwoZXZlbnQudXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zyhgc2hvdWxkIGxvYWQgYXBwczogJHt0aGlzLmdldEFwcE5hbWVzKHNob3VsZExvYWRBcHBzKX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRVbmxvYWRBcHBzID0gdGhpcy5nZXRVbmxvYWRBcHBzKHNob3VsZExvYWRBcHBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcHNMb2FkaW5nU3RhcnQkLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRMb2FkQXBwcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkVW5sb2FkQXBwc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5sb2FkQXBwcyhzaG91bGRVbmxvYWRBcHBzLCBldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoYHVubG9hZCBhcHBzOiAke3RoaXMuZ2V0QXBwTmFtZXMoc2hvdWxkVW5sb2FkQXBwcyl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNob3VsZExvYWRBcHBzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2FkIGFwcCBhc3NldHMgKHN0YXRpYyByZXNvdXJjZXMpXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoc2hvdWxkTG9hZEFwcHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNBcHBzTmVlZExvYWRpbmdBc3NldHMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsb2FkQXBwcyQgPSBzaG91bGRMb2FkQXBwcy5tYXAoYXBwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwU3RhdHVzID0gdGhpcy5hcHBzU3RhdHVzLmdldChhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYXBwU3RhdHVzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBTdGF0dXMgPT09IEFwcGxpY2F0aW9uU3RhdHVzLmFzc2V0c0xvYWRpbmcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcFN0YXR1cyA9PT0gQXBwbGljYXRpb25TdGF0dXMubG9hZEVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGFwcCgke2FwcC5uYW1lfSkgc3RhdHVzIGlzICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uU3RhdHVzW2FwcFN0YXR1cyBhcyBBcHBsaWNhdGlvblN0YXR1c11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCBzdGFydCBsb2FkIGFzc2V0c2BcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBcHBzTmVlZExvYWRpbmdBc3NldHMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydExvYWRBcHBBc3NldHMoYXBwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXBwc05lZWRMb2FkaW5nQXNzZXRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ0RvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRBcHBzJC5sZW5ndGggPiAwID8gZm9ya0pvaW4obG9hZEFwcHMkKSA6IG9mKFtdIGFzIFBsYW5ldEFwcGxpY2F0aW9uW10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBCb290c3RyYXAgb3Igc2hvdyBhcHBzXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAoYXBwcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwcyQ6IE9ic2VydmFibGU8UGxhbmV0QXBwbGljYXRpb24+W10gPSBhcHBzLm1hcChhcHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoYXBwKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGFwcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwU3RhdHVzID0gdGhpcy5hcHBzU3RhdHVzLmdldChhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcHBTdGF0dXMgPT09IEFwcGxpY2F0aW9uU3RhdHVzLmJvb3RzdHJhcHBlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBbcm91dGVDaGFuZ2VdIGFwcCgke2FwcC5uYW1lfSkgc3RhdHVzIGlzIGJvb3RzdHJhcHBlZCwgc2hvdyBhcHAgYW5kIGFjdGl2ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QXBwKGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwUmVmPy5uYXZpZ2F0ZUJ5VXJsKGV2ZW50LnVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXBwU3RhdHVzKGFwcCwgQXBwbGljYXRpb25TdGF0dXMuYWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoYXBwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcFN0YXR1cyA9PT0gQXBwbGljYXRpb25TdGF0dXMuYXNzZXRzTG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFtyb3V0ZUNoYW5nZV0gYXBwKCR7YXBwLm5hbWV9KSBzdGF0dXMgaXMgYXNzZXRzTG9hZGVkLCBzdGFydCBib290c3RyYXBwaW5nYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ib290c3RyYXBBcHAoYXBwKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgYXBwKCR7YXBwLm5hbWV9KSBib290c3RyYXBwZWQgc3VjY2VzcywgYWN0aXZlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9hZGluZ0RvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFwcFN0YXR1cyA9PT0gQXBwbGljYXRpb25TdGF0dXMuYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKGBbcm91dGVDaGFuZ2VdIGFwcCgke2FwcC5uYW1lfSkgaXMgYWN0aXZlLCBkbyBub3RoaW5nc2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBSZWYgPSBnZXRQbGFuZXRBcHBsaWNhdGlvblJlZihhcHAubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1YiBhcHAgdXNlIG9sZCB2ZXJzaW9uIHdoaWNoIGhhcyBub3QgZ2V0Q3VycmVudFJvdXRlclN0YXRlVXJsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBhcHBSZWY/LmdldEN1cnJlbnRSb3V0ZXJTdGF0ZVVybFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhcHBSZWYuZ2V0Q3VycmVudFJvdXRlclN0YXRlVXJsKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VXJsICE9PSBldmVudC51cmwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJlZj8ubmF2aWdhdGVCeVVybChldmVudC51cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihhcHApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFtyb3V0ZUNoYW5nZV0gYXBwKCR7YXBwLm5hbWV9KSBzdGF0dXMgaXMgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblN0YXR1c1thcHBTdGF0dXMgYXMgQXBwbGljYXRpb25TdGF0dXNdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBTdGF0dXNDaGFuZ2UkKGFwcCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgYXBwKCR7YXBwLm5hbWV9KSBzdGF0dXMgaXMgYm9vdHN0cmFwcGVkIGJ5IHN1YnNjcmliZSBzdGF0dXMgY2hhbmdlLCBhY3RpdmUgaXRgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFwcFN0YXR1cyhhcHAsIEFwcGxpY2F0aW9uU3RhdHVzLmFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QXBwKGFwcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFwcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcHBzJC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKGBzdGFydCBsb2FkIGFuZCBhY3RpdmUgYXBwczogJHt0aGlzLmdldEFwcE5hbWVzKGFwcHMpfWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyDliIfmjaLliLDlupTnlKjlkI7kvJrmnInpl6rng4HnjrDosaHvvIzmiYDku6Xkvb/nlKggc2V0VGltZW91dCDlkI7lkK/liqjlupTnlKhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogcmVkaXJlY3QgdG8gYXBwMSdzIGRhc2hib2FyZCBmcm9tIHBvcnRhbCdzIGFib3V0IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXBwJ3Mgcm91dGUgaGFzIHJlZGlyZWN0LCBpdCBkb2Vzbid0IHdvcmssIGl0IG9rIGp1c3QgaW4gc2V0VGltZW91dCwgSSBkb24ndCBrbm93IHdoeS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzo6IHJlbW92ZSBpdCwgaXQgaXMgb2sgaW4gdmVyc2lvbiBBbmd1bGFyIDkueFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIOatpOWkhOWIpOaWreaYr+WboOS4uuWmguaenOmdmeaAgei1hOa6kOWKoOi9veWujOavlei/mOacquWQr+WKqOiiq+WPlua2iO+8jOi/mOaYr+S8muWQr+WKqOS5i+WJjeeahOW6lOeUqO+8jOiZveeEtuWPr+iDveaAp+avlOi+g+Wwj++8jOS9huaYr+aXoOazleaOkumZpOi/meenjeWPr+iDveaAp++8jOaJgOS7peWPquacieW9kyBFdmVudCDmmK/mnIDlkI7kuIDkuKrmiY3kvJrlkK/liqhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0Um91dGVDaGFuZ2VFdmVudCA9PT0gZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBydW5PdXRzaWRlQW5ndWxhciBmb3IgZml4IGVycm9yOiBgRXhwZWN0ZWQgdG8gbm90IGJlIGluIEFuZ3VsYXIgWm9uZSwgYnV0IGl0IGlzIWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmtKb2luKGFwcHMkKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRMb2FkaW5nRG9uZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbnN1cmVQcmVsb2FkQXBwcyhhcHBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKGBubyBhcHBzIG5lZWQgdG8gYmUgbG9hZGVkLCBlbnN1cmUgcHJlbG9hZCBhcHBzYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5zdXJlUHJlbG9hZEFwcHMoYXBwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TG9hZGluZ0RvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnKGBhcHBzIGxvYWRlciBlcnJvcjogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9ySGFuZGxlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhcnRMb2FkQXBwQXNzZXRzKGFwcDogUGxhbmV0QXBwbGljYXRpb24pOiBPYnNlcnZhYmxlPFBsYW5ldEFwcGxpY2F0aW9uPiB7XG4gICAgICAgIGlmICh0aGlzLmluUHJvZ3Jlc3NBcHBBc3NldHNMb2Fkcy5nZXQoYXBwLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pblByb2dyZXNzQXBwQXNzZXRzTG9hZHMuZ2V0KGFwcC5uYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRBcHAkID0gdGhpcy5hc3NldHNMb2FkZXIubG9hZEFwcEFzc2V0cyhhcHApLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pblByb2dyZXNzQXBwQXNzZXRzTG9hZHMuZGVsZXRlKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkZWQpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHA7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzc0FwcEFzc2V0c0xvYWRzLmRlbGV0ZShhcHAubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QXBwU3RhdHVzKGFwcCwgQXBwbGljYXRpb25TdGF0dXMubG9hZEVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRoaXMuaW5Qcm9ncmVzc0FwcEFzc2V0c0xvYWRzLnNldChhcHAubmFtZSwgbG9hZEFwcCQpO1xuICAgICAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkaW5nKTtcbiAgICAgICAgICAgIHJldHVybiBsb2FkQXBwJDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaGlkZUFwcChwbGFuZXRBcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKHBsYW5ldEFwcC5uYW1lKTtcbiAgICAgICAgY29uc3QgYXBwUm9vdEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFwcFJlZj8uc2VsZWN0b3IgfHwgKHBsYW5ldEFwcC5zZWxlY3RvciBhcyBzdHJpbmcpKTtcbiAgICAgICAgaWYgKGFwcFJvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICBhcHBSb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6bm9uZTsnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2hvd0FwcChwbGFuZXRBcHA6IFBsYW5ldEFwcGxpY2F0aW9uKSB7XG4gICAgICAgIGNvbnN0IGFwcFJlZiA9IGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKHBsYW5ldEFwcC5uYW1lKTtcbiAgICAgICAgY29uc3QgYXBwUm9vdEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGFwcFJlZj8uc2VsZWN0b3IgfHwgKHBsYW5ldEFwcC5zZWxlY3RvciBhcyBzdHJpbmcpKTtcbiAgICAgICAgaWYgKGFwcFJvb3RFbGVtZW50KSB7XG4gICAgICAgICAgICBhcHBSb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXN0cm95QXBwKHBsYW5ldEFwcDogUGxhbmV0QXBwbGljYXRpb24pIHtcbiAgICAgICAgY29uc3QgYXBwUmVmID0gZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYocGxhbmV0QXBwLm5hbWUpO1xuICAgICAgICBpZiAoYXBwUmVmKSB7XG4gICAgICAgICAgICBhcHBSZWYuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldEhUTUxFbGVtZW50KHBsYW5ldEFwcC5ob3N0UGFyZW50KTtcbiAgICAgICAgY29uc3QgYXBwUm9vdEVsZW1lbnQgPSBjb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoKGFwcFJlZiAmJiBhcHBSZWYuc2VsZWN0b3IpIHx8IChwbGFuZXRBcHAuc2VsZWN0b3IgYXMgc3RyaW5nKSk7XG4gICAgICAgIGlmIChhcHBSb290RWxlbWVudCkge1xuICAgICAgICAgICAgY29udGFpbmVyPy5yZW1vdmVDaGlsZChhcHBSb290RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGJvb3RzdHJhcEFwcChcbiAgICAgICAgYXBwOiBQbGFuZXRBcHBsaWNhdGlvbixcbiAgICAgICAgZGVmYXVsdFN0YXR1czogJ2hpZGRlbicgfCAnZGlzcGxheScgPSAnZGlzcGxheSdcbiAgICApOiBPYnNlcnZhYmxlPFBsYW5ldEFwcGxpY2F0aW9uUmVmPiB7XG4gICAgICAgIGRlYnVnKGBhcHAoJHthcHAubmFtZX0pIHN0YXJ0IGJvb3RzdHJhcHBpbmdgKTtcbiAgICAgICAgdGhpcy5zZXRBcHBTdGF0dXMoYXBwLCBBcHBsaWNhdGlvblN0YXR1cy5ib290c3RyYXBwaW5nKTtcbiAgICAgICAgY29uc3QgYXBwUmVmID0gZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYoYXBwLm5hbWUpO1xuICAgICAgICBpZiAoYXBwUmVmICYmIGFwcFJlZi5ib290c3RyYXApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldEhUTUxFbGVtZW50KGFwcC5ob3N0UGFyZW50KTtcbiAgICAgICAgICAgIGxldCBhcHBSb290RWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihhcHBSZWYuc2VsZWN0b3IgfHwgYXBwLnNlbGVjdG9yISkhO1xuICAgICAgICAgICAgICAgIGlmICghYXBwUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcFJlZi50ZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwUm9vdEVsZW1lbnQgPSBjcmVhdGVFbGVtZW50QnlUZW1wbGF0ZShhcHBSZWYudGVtcGxhdGUpITtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChhcHAuc2VsZWN0b3IhKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcHBSb290RWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6bm9uZTsnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFwcC5ob3N0Q2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY29lcmNlQXJyYXkoYXBwLmhvc3RDbGFzcykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHAuc3R5bGVQcmVmaXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY29lcmNlQXJyYXkoYXBwLnN0eWxlUHJlZml4KSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGFwcFJvb3RFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXBwUmVmLmJvb3RzdHJhcCh0aGlzLnBvcnRhbEFwcCk7XG4gICAgICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBwcm9taXNlIGZvciBib290c3RyYXBcbiAgICAgICAgICAgIGlmICgocmVzdWx0IGFzIGFueSlbJ3RoZW4nXSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZyb20ocmVzdWx0KSBhcyBPYnNlcnZhYmxlPFBsYW5ldEFwcGxpY2F0aW9uUmVmPjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgYXBwKCR7YXBwLm5hbWV9KSBib290c3RyYXBwZWQgc3VjY2VzcyBmb3IgJHtkZWZhdWx0U3RhdHVzfWApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFwcFN0YXR1cyhhcHAsIEFwcGxpY2F0aW9uU3RhdHVzLmJvb3RzdHJhcHBlZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0U3RhdHVzID09PSAnZGlzcGxheScgJiYgYXBwUm9vdEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcFJvb3RFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcHBSZWY7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYFske2FwcC5uYW1lfV0gbm90IGZvdW5kLCBtYWtlIHN1cmUgdGhhdCB0aGUgYXBwIGhhcyB0aGUgY29ycmVjdCBuYW1lIGRlZmluZWQgdXNlIGRlZmluZUFwcGxpY2F0aW9uKCR7YXBwLm5hbWV9KSBhbmQgcnVudGltZUNodW5rIGFuZCB2ZW5kb3JDaHVuayBhcmUgc2V0IHRvIHRydWUsIGRldGFpbHMgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93b3JrdGlsZS9uZ3gtcGxhbmV0I3Rocm93LWVycm9yLWNhbm5vdC1yZWFkLXByb3BlcnR5LWNhbGwtb2YtdW5kZWZpbmVkLWF0LV9fd2VicGFja19yZXF1aXJlX18tYm9vdHN0cmFwNzlgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVbmxvYWRBcHBzKGFjdGl2ZUFwcHM6IFBsYW5ldEFwcGxpY2F0aW9uW10pIHtcbiAgICAgICAgY29uc3QgdW5sb2FkQXBwczogUGxhbmV0QXBwbGljYXRpb25bXSA9IFtdO1xuICAgICAgICB0aGlzLmFwcHNTdGF0dXMuZm9yRWFjaCgodmFsdWUsIGFwcCkgPT4ge1xuICAgICAgICAgICAgaWYgKHZhbHVlID09PSBBcHBsaWNhdGlvblN0YXR1cy5hY3RpdmUgJiYgIWFjdGl2ZUFwcHMuZmluZChpdGVtID0+IGl0ZW0ubmFtZSA9PT0gYXBwLm5hbWUpKSB7XG4gICAgICAgICAgICAgICAgdW5sb2FkQXBwcy5wdXNoKGFwcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdW5sb2FkQXBwcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHVubG9hZEFwcHMoc2hvdWxkVW5sb2FkQXBwczogUGxhbmV0QXBwbGljYXRpb25bXSwgZXZlbnQ6IFBsYW5ldFJvdXRlckV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGhpZGVBcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdID0gW107XG4gICAgICAgIGNvbnN0IGRlc3Ryb3lBcHBzOiBQbGFuZXRBcHBsaWNhdGlvbltdID0gW107XG4gICAgICAgIHNob3VsZFVubG9hZEFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3dpdGNoTW9kZUlzQ29leGlzdChhcHApKSB7XG4gICAgICAgICAgICAgICAgZGVidWcoYGhpZGUgYXBwKCR7YXBwLm5hbWV9KSBmb3IgY29leGlzdCBtb2RlYCk7XG4gICAgICAgICAgICAgICAgaGlkZUFwcHMucHVzaChhcHApO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZUFwcChhcHApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXBwU3RhdHVzKGFwcCwgQXBwbGljYXRpb25TdGF0dXMuYm9vdHN0cmFwcGVkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVzdHJveUFwcHMucHVzaChhcHApO1xuICAgICAgICAgICAgICAgIC8vIOmUgOavgeS5i+WJjeWFiOmakOiXj++8jOWQpuWImeS8muWHuueOsOmXqueDge+8jOWboOS4uiBkZXN0cm95IOaYr+W7tui/n+aJp+ihjOeahFxuICAgICAgICAgICAgICAgIC8vIOWmguaenOmUgOavgeS4jeW7tui/n+aJp+ihjO+8jOS8muWHuueOsOWIh+aNouWIsOS4u+W6lOeUqOeahOaXtuWAmeS8muacieinhuWbvuWNoemhv+eOsOixoVxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZUFwcChhcHApO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0QXBwU3RhdHVzKGFwcCwgQXBwbGljYXRpb25TdGF0dXMuYXNzZXRzTG9hZGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGhpZGVBcHBzLmxlbmd0aCA+IDAgfHwgZGVzdHJveUFwcHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8g5LuO5YW25LuW5bqU55So5YiH5o2i5Yiw5Li75bqU55So55qE5pe25YCZ5Lya5pyJ6KeG5Zu+5Y2h6aG/546w6LGh77yM5omA5Lul5YWI562J5Li75bqU55So5riy5p+T5a6M5q+V5ZCO5YaN5Yqg6L295YW25LuW5bqU55SoXG4gICAgICAgICAgICAvLyDmraTlpITlsJ3or5Xkvb/nlKggdGhpcy5uZ1pvbmUub25TdGFibGUucGlwZSh0YWtlKDEpKSDlupTnlKjkuYvpl7TnmoTliIfmjaLkvJrlh7rnjrDpl6rng4FcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhpZGVBcHBzLmZvckVhY2goYXBwID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwUmVmID0gZ2V0UGxhbmV0QXBwbGljYXRpb25SZWYoYXBwLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXBwUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBSZWYubmF2aWdhdGVCeVVybChldmVudC51cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGVzdHJveUFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgZGVzdHJveSBhcHAoJHthcHAubmFtZX0pYCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUFwcChhcHApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByZWxvYWRBcHBzKGFjdGl2ZUFwcHM/OiBQbGFuZXRBcHBsaWNhdGlvbltdKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdG9QcmVsb2FkQXBwcyA9IHRoaXMucGxhbmV0QXBwbGljYXRpb25TZXJ2aWNlLmdldEFwcHNUb1ByZWxvYWQoXG4gICAgICAgICAgICAgICAgYWN0aXZlQXBwcyA/IGFjdGl2ZUFwcHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlYnVnKGBzdGFydCBwcmVsb2FkIGFwcHM6ICR7dGhpcy5nZXRBcHBOYW1lcyh0b1ByZWxvYWRBcHBzKX1gKTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRBcHBzJCA9IHRvUHJlbG9hZEFwcHMubWFwKHByZWxvYWRBcHAgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRJbnRlcm5hbChwcmVsb2FkQXBwKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3JrSm9pbihsb2FkQXBwcyQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgZXJyb3I6IGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuc3VyZVByZWxvYWRBcHBzKGFjdGl2ZUFwcHM/OiBQbGFuZXRBcHBsaWNhdGlvbltdKSB7XG4gICAgICAgIC8vIFN0YXJ0IHByZWxvYWQgYXBwc1xuICAgICAgICAvLyBTdGFydCBwcmVsb2FkIHdoZW4gZmlyc3QgdGltZSBhcHAgbG9hZGVkXG4gICAgICAgIGlmICh0aGlzLmZpcnN0TG9hZCkge1xuICAgICAgICAgICAgdGhpcy5wcmVsb2FkQXBwcyhhY3RpdmVBcHBzKTtcbiAgICAgICAgICAgIHRoaXMuZmlyc3RMb2FkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0T3B0aW9ucyhvcHRpb25zOiBQYXJ0aWFsPFBsYW5ldE9wdGlvbnM+KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXNldCByb3V0ZSBieSBjdXJyZW50IHJvdXRlclxuICAgICAqL1xuICAgIHB1YmxpYyByZXJvdXRlKGV2ZW50OiBQbGFuZXRSb3V0ZXJFdmVudCkge1xuICAgICAgICB0aGlzLnJvdXRlQ2hhbmdlJC5uZXh0KGV2ZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZWxvYWRJbnRlcm5hbChhcHA6IFBsYW5ldEFwcGxpY2F0aW9uLCBpbW1lZGlhdGU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxQbGFuZXRBcHBsaWNhdGlvblJlZiB8IG51bGw+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gdGhpcy5hcHBzU3RhdHVzLmdldChhcHApO1xuICAgICAgICBpZiAoIXN0YXR1cyB8fCBzdGF0dXMgPT09IEFwcGxpY2F0aW9uU3RhdHVzLmxvYWRFcnJvcikge1xuICAgICAgICAgICAgZGVidWcoYHByZWxvYWQgYXBwKCR7YXBwLm5hbWV9KSwgc3RhdHVzIGlzIGVtcHR5LCBzdGFydCB0byBsb2FkIGFzc2V0c2ApO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRMb2FkQXBwQXNzZXRzKGFwcCkucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgcHJlbG9hZCBhcHAoJHthcHAubmFtZX0pLCBhc3NldHMgbG9hZGVkLCBzdGFydCBib290c3RyYXAgYXBwLCBpbW1lZGlhdGU6ICR7ISFpbW1lZGlhdGV9YCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJvb3RzdHJhcEFwcChhcHAsICdoaWRkZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9vdHN0cmFwQXBwKGFwcCwgJ2hpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFBsYW5ldEFwcGxpY2F0aW9uUmVmKGFwcC5uYW1lKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIFtBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkaW5nLCBBcHBsaWNhdGlvblN0YXR1cy5hc3NldHNMb2FkZWQsIEFwcGxpY2F0aW9uU3RhdHVzLmJvb3RzdHJhcHBpbmddLmluY2x1ZGVzKFxuICAgICAgICAgICAgICAgIHN0YXR1c1xuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGRlYnVnKGBwcmVsb2FkIGFwcCgke2FwcC5uYW1lfSksIHN0YXR1cyBpcyAke0FwcGxpY2F0aW9uU3RhdHVzW3N0YXR1c119LCByZXR1cm4gdW50aWwgYm9vdHN0cmFwcGVkYCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRBcHBTdGF0dXNDaGFuZ2UkKGFwcCkucGlwZShcbiAgICAgICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRQbGFuZXRBcHBsaWNhdGlvblJlZihhcHAubmFtZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhcHBSZWYgPSBnZXRQbGFuZXRBcHBsaWNhdGlvblJlZihhcHAubmFtZSk7XG4gICAgICAgICAgICBpZiAoIWFwcFJlZikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHthcHAubmFtZX0ncyBzdGF0dXMgaXMgJHtBcHBsaWNhdGlvblN0YXR1c1tzdGF0dXNdfSwgcGxhbmV0QXBwbGljYXRpb25SZWYgaXMgbnVsbC5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvZihhcHBSZWYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJlbG9hZCBwbGFuZXQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0gYXBwIGFwcFxuICAgICAqIEBwYXJhbSBpbW1lZGlhdGUgYm9vdHN0cmFwIG9uIHN0YWJsZSBieSBkZWZhdWx0LCBzZXR0aW5nIGltbWVkaWF0ZSBpcyB0cnVlLCBpdCB3aWxsIGJvb3RzdHJhcCBpbW1lZGlhdGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlbG9hZChhcHA6IFBsYW5ldEFwcGxpY2F0aW9uLCBpbW1lZGlhdGU/OiBib29sZWFuKTogT2JzZXJ2YWJsZTxQbGFuZXRBcHBsaWNhdGlvblJlZj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVsb2FkSW50ZXJuYWwoYXBwLCBpbW1lZGlhdGUpO1xuICAgIH1cbn1cbiJdfQ==
|