@senior-gestao-empresarial/angular-components 4.22.0 → 4.22.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/bundles/senior-gestao-empresarial-angular-components.umd.js +43 -31
- package/bundles/senior-gestao-empresarial-angular-components.umd.js.map +1 -1
- package/bundles/senior-gestao-empresarial-angular-components.umd.min.js +1 -1
- package/bundles/senior-gestao-empresarial-angular-components.umd.min.js.map +1 -1
- package/components/websocket/websocket.service.d.ts +7 -4
- package/esm2015/components/websocket/websocket.service.js +32 -30
- package/esm5/components/websocket/websocket.service.js +45 -33
- package/fesm2015/senior-gestao-empresarial-angular-components.js +31 -29
- package/fesm2015/senior-gestao-empresarial-angular-components.js.map +1 -1
- package/fesm5/senior-gestao-empresarial-angular-components.js +44 -32
- package/fesm5/senior-gestao-empresarial-angular-components.js.map +1 -1
- package/package.json +1 -1
- package/senior-gestao-empresarial-angular-components.metadata.json +1 -1
|
@@ -20,12 +20,12 @@ export declare class WebsocketService {
|
|
|
20
20
|
private connect$;
|
|
21
21
|
constructor(cookieService: CookieService);
|
|
22
22
|
/**
|
|
23
|
-
* Observable
|
|
23
|
+
* Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida.
|
|
24
24
|
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida ou já está em andamento.
|
|
25
25
|
*/
|
|
26
26
|
onConnect(): Observable<void>;
|
|
27
27
|
/**
|
|
28
|
-
* Observable
|
|
28
|
+
* Observable responsável por emitir uma notificação quando a conexão é finalizada.
|
|
29
29
|
* @return Um `Observable<void>` que emite uma notificação quando a conexão é finalizada.
|
|
30
30
|
*/
|
|
31
31
|
onDisconnect(): Observable<void>;
|
|
@@ -40,7 +40,7 @@ export declare class WebsocketService {
|
|
|
40
40
|
*/
|
|
41
41
|
onEvent<T>(domain: string, service: string, primitive: string, identifierPath: string): Observable<T>;
|
|
42
42
|
/**
|
|
43
|
-
* Retorna todos os eventos ouvidos
|
|
43
|
+
* Retorna todos os eventos ouvidos pela primitiva com os respectivos identificadores.
|
|
44
44
|
* @typeParam `<T>` Tipo do evento retornado pela primitiva.
|
|
45
45
|
* @param primitive Primitiva que será "observada" pelo client.
|
|
46
46
|
* @param identifiers Array com os indentificadores interessados.
|
|
@@ -48,6 +48,7 @@ export declare class WebsocketService {
|
|
|
48
48
|
*/
|
|
49
49
|
getPublishedEvents<T>(primitive: string, identifiers: string[]): T[];
|
|
50
50
|
private addPublishedEvent;
|
|
51
|
+
private createStompSubscriptions;
|
|
51
52
|
private getIdentifierFromEvent;
|
|
52
53
|
private connect;
|
|
53
54
|
private publishOnConnect;
|
|
@@ -56,7 +57,9 @@ export declare class WebsocketService {
|
|
|
56
57
|
disconnect(): void;
|
|
57
58
|
private isConnected;
|
|
58
59
|
private setConnected;
|
|
59
|
-
private
|
|
60
|
+
private getSubscriptionUrlWithToken;
|
|
61
|
+
private getSubscriptionUrlWithoutToken;
|
|
62
|
+
private createStompSubscription;
|
|
60
63
|
private createStompClient;
|
|
61
64
|
private getBaseUrl;
|
|
62
65
|
private getUserName;
|
|
@@ -5,7 +5,7 @@ import { Stomp } from "@stomp/stompjs";
|
|
|
5
5
|
import * as Cookies from "js-cookie";
|
|
6
6
|
import { CookieService } from "ngx-cookie-service";
|
|
7
7
|
import { Subject } from "rxjs";
|
|
8
|
-
import {
|
|
8
|
+
import { first } from "rxjs/operators";
|
|
9
9
|
import * as SockJS from "sockjs-client";
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
11
|
import * as i1 from "ngx-cookie-service";
|
|
@@ -18,7 +18,6 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
18
18
|
this.connected = false;
|
|
19
19
|
this.isConnecting = false;
|
|
20
20
|
this.stompSubscriptions = new Map();
|
|
21
|
-
// private primitiveSubjects: Map<string, Subject<any>> = new Map<string, Subject<any>>();
|
|
22
21
|
this.primitiveManagers = new Map();
|
|
23
22
|
this.disconnectSubject = new Subject();
|
|
24
23
|
this.connect$ = new Subject();
|
|
@@ -27,7 +26,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
27
26
|
this.connect();
|
|
28
27
|
}
|
|
29
28
|
/**
|
|
30
|
-
* Observable
|
|
29
|
+
* Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida.
|
|
31
30
|
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida ou já está em andamento.
|
|
32
31
|
*/
|
|
33
32
|
onConnect() {
|
|
@@ -39,7 +38,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
39
38
|
return this.connect$.asObservable();
|
|
40
39
|
}
|
|
41
40
|
/**
|
|
42
|
-
* Observable
|
|
41
|
+
* Observable responsável por emitir uma notificação quando a conexão é finalizada.
|
|
43
42
|
* @return Um `Observable<void>` que emite uma notificação quando a conexão é finalizada.
|
|
44
43
|
*/
|
|
45
44
|
onDisconnect() {
|
|
@@ -65,14 +64,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
65
64
|
publishedEvents: [],
|
|
66
65
|
};
|
|
67
66
|
if (this.isConnected()) {
|
|
68
|
-
|
|
69
|
-
this.primitiveManagers.set(primitive, primitiveManager);
|
|
70
|
-
const stompSubscription = this._stompClient.subscribe(url, (message) => {
|
|
71
|
-
const event = JSON.parse(message.body || "{}");
|
|
72
|
-
this.addPublishedEvent(primitiveManager, event);
|
|
73
|
-
primitiveManager.subject.next(event);
|
|
74
|
-
});
|
|
75
|
-
this.stompSubscriptions.set(primitive, stompSubscription);
|
|
67
|
+
this.createStompSubscriptions(domain, service, primitive, primitiveManager);
|
|
76
68
|
return primitiveManager.subject.asObservable();
|
|
77
69
|
}
|
|
78
70
|
else {
|
|
@@ -80,22 +72,15 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
80
72
|
this.connect();
|
|
81
73
|
}
|
|
82
74
|
this.onConnect()
|
|
83
|
-
.pipe(
|
|
75
|
+
.pipe(first())
|
|
84
76
|
.subscribe(() => {
|
|
85
|
-
|
|
86
|
-
this.primitiveManagers.set(primitive, primitiveManager);
|
|
87
|
-
const stompSubscription = this._stompClient.subscribe(url, (message) => {
|
|
88
|
-
const event = JSON.parse(message.body || "{}");
|
|
89
|
-
this.addPublishedEvent(primitiveManager, event);
|
|
90
|
-
primitiveManager.subject.next(event);
|
|
91
|
-
});
|
|
92
|
-
this.stompSubscriptions.set(primitive, stompSubscription);
|
|
77
|
+
this.createStompSubscriptions(domain, service, primitive, primitiveManager);
|
|
93
78
|
});
|
|
94
79
|
return primitiveManager.subject.asObservable();
|
|
95
80
|
}
|
|
96
81
|
}
|
|
97
82
|
/**
|
|
98
|
-
* Retorna todos os eventos ouvidos
|
|
83
|
+
* Retorna todos os eventos ouvidos pela primitiva com os respectivos identificadores.
|
|
99
84
|
* @typeParam `<T>` Tipo do evento retornado pela primitiva.
|
|
100
85
|
* @param primitive Primitiva que será "observada" pelo client.
|
|
101
86
|
* @param identifiers Array com os indentificadores interessados.
|
|
@@ -122,6 +107,14 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
122
107
|
primitiveManager.publishedEvents.push(event);
|
|
123
108
|
}
|
|
124
109
|
}
|
|
110
|
+
createStompSubscriptions(domain, service, primitive, primitiveManager) {
|
|
111
|
+
const withTokenUrl = this.getSubscriptionUrlWithToken(domain, service, primitive);
|
|
112
|
+
this.primitiveManagers.set(primitive, primitiveManager);
|
|
113
|
+
const stompSubscriptionWithToken = this.createStompSubscription(withTokenUrl, primitiveManager);
|
|
114
|
+
const withoutTokenUrl = this.getSubscriptionUrlWithoutToken(domain, service, primitive);
|
|
115
|
+
const stompSubscriptionWithoutToken = this.createStompSubscription(withoutTokenUrl, primitiveManager);
|
|
116
|
+
this.stompSubscriptions.set(primitive, [stompSubscriptionWithToken, stompSubscriptionWithoutToken]);
|
|
117
|
+
}
|
|
125
118
|
getIdentifierFromEvent(identifierPath, event) {
|
|
126
119
|
const properties = identifierPath.split(".");
|
|
127
120
|
let identifier = event;
|
|
@@ -135,9 +128,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
135
128
|
this.isConnecting = true;
|
|
136
129
|
this._stompClient.connect({}, () => {
|
|
137
130
|
this.setConnected(true);
|
|
138
|
-
// console.log('setou false isConnecting');
|
|
139
131
|
this.isConnecting = false;
|
|
140
|
-
// console.log('connectou dentro do connect cb');
|
|
141
132
|
this.publishOnConnect();
|
|
142
133
|
}, () => {
|
|
143
134
|
this.setConnected(false);
|
|
@@ -160,8 +151,10 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
160
151
|
observersCount += primitiveManager.subject.observers.length;
|
|
161
152
|
}
|
|
162
153
|
if (observersCount === 0) {
|
|
163
|
-
this.stompSubscriptions.forEach(
|
|
164
|
-
stompSubscription
|
|
154
|
+
this.stompSubscriptions.forEach(stompSubscriptions => {
|
|
155
|
+
for (const stompSubscription of stompSubscriptions) {
|
|
156
|
+
stompSubscription.unsubscribe();
|
|
157
|
+
}
|
|
165
158
|
});
|
|
166
159
|
for (const primitiveManager of this.primitiveManagers.values()) {
|
|
167
160
|
primitiveManager.subject.complete();
|
|
@@ -181,11 +174,22 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
181
174
|
setConnected(connected) {
|
|
182
175
|
this.connected = connected;
|
|
183
176
|
}
|
|
184
|
-
|
|
177
|
+
getSubscriptionUrlWithToken(domain, service, primitive) {
|
|
185
178
|
const tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
|
|
186
179
|
const token = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.access_token : null;
|
|
187
180
|
return `/topic/${tenant}/${token}/${domain}/${service}/${primitive}`;
|
|
188
181
|
}
|
|
182
|
+
getSubscriptionUrlWithoutToken(domain, service, primitive) {
|
|
183
|
+
const tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
|
|
184
|
+
return `/topic/${tenant}/${domain}/${service}/${primitive}`;
|
|
185
|
+
}
|
|
186
|
+
createStompSubscription(destination, primitiveManager) {
|
|
187
|
+
return this._stompClient.subscribe(destination, (message) => {
|
|
188
|
+
const event = JSON.parse(message.body || "{}");
|
|
189
|
+
this.addPublishedEvent(primitiveManager, event);
|
|
190
|
+
primitiveManager.subject.next(event);
|
|
191
|
+
});
|
|
192
|
+
}
|
|
189
193
|
createStompClient() {
|
|
190
194
|
const ws = new SockJS(`${WebsocketService_1.WEBSOCKET_URL}subscription`, null, { timeout: WebsocketService_1.CONNECTION_TIMEOUT });
|
|
191
195
|
this._stompClient = Stomp.over(ws);
|
|
@@ -202,12 +206,10 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
202
206
|
this._stompClient.disconnect();
|
|
203
207
|
const baseUrl = this.getBaseUrl();
|
|
204
208
|
if (this.baseUrl !== null && baseUrl != this.baseUrl) {
|
|
205
|
-
// //console.log('ws disconnected: base url changed', this.baseUrl, ' -> ', baseUrl || 'null');
|
|
206
209
|
return;
|
|
207
210
|
}
|
|
208
211
|
const username = this.getUserName();
|
|
209
212
|
if (this.username !== null && username != this.username) {
|
|
210
|
-
// //console.log('ws disconnected: username changed', this.username, ' -> ', username || 'null');
|
|
211
213
|
return;
|
|
212
214
|
}
|
|
213
215
|
setTimeout(() => {
|
|
@@ -236,4 +238,4 @@ WebsocketService = WebsocketService_1 = __decorate([
|
|
|
236
238
|
})
|
|
237
239
|
], WebsocketService);
|
|
238
240
|
export { WebsocketService };
|
|
239
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFnQixLQUFLLEVBQXFCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxLQUFLLE9BQU8sTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFDOzs7QUFXeEMsSUFBYSxnQkFBZ0Isd0JBQTdCLE1BQWEsZ0JBQWdCO0lBeUJ6QixZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQWpCeEMsWUFBTyxHQUFXLElBQUksQ0FBQztRQUN2QixhQUFRLEdBQVcsSUFBSSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFHZixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLHVCQUFrQixHQUFtQyxJQUFJLEdBQUcsRUFBNkIsQ0FBQztRQUVsRywwRkFBMEY7UUFDbEYsc0JBQWlCLEdBQWtDLElBQUksR0FBRyxFQUE0QixDQUFDO1FBRXZGLHNCQUFpQixHQUFrQixJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXZELGFBQVEsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUdsRCxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFP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QU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDOztZQW1CMUQsYUFBYTs7O0FBekJ2QyxnQkFBZ0I7SUFINUIsVUFBVSxDQUFDO1FBQ1IsVUFBVSxFQUFFLE1BQU07S0FDckIsQ0FBQztHQUNXLGdCQUFnQixDQWtTNUI7U0FsU1ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbXBhdENsaWVudCwgU3RvbXAsIFN0b21wU3Vic2NyaXB0aW9uIH0gZnJvbSBcIkBzdG9tcC9zdG9tcGpzXCI7XHJcbmltcG9ydCAqIGFzIENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWUtc2VydmljZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSBcInNvY2tqcy1jbGllbnRcIjtcclxuXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDMwMDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgZm9jdXNlZCA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3RvbXBTdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBTdG9tcFN1YnNjcmlwdGlvbj4gPSBuZXcgTWFwPHN0cmluZywgU3RvbXBTdWJzY3JpcHRpb24+KCk7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBwcmltaXRpdmVTdWJqZWN0czogTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBTdWJqZWN0PGFueT4+KCk7XHJcbiAgICBwcml2YXRlIHByaW1pdGl2ZU1hbmFnZXJzOiBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPiA9IG5ldyBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPigpO1xyXG5cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdFN1YmplY3Q6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29va2llU2VydmljZTogQ29va2llU2VydmljZSkge1xyXG4gICAgICAgIHdpbmRvdy5vbmZvY3VzID0gdGhpcy5vbkZvY3VzO1xyXG4gICAgICAgIHdpbmRvdy5vbmJsdXIgPSB0aGlzLm9uQmx1cjtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3Bvc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYS5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhIG91IGrDoSBlc3TDoSBlbSBhbmRhbWVudG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb3PDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGZpbmFsaXphZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZmluYWxpemFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIHVtIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gb2JqZXRvIHF1ZSBvIHJldG9ybm8gZG8gYG9ic2VydmFibGVgIHZhaSBkZXZvbHZlci5cclxuICAgICAqIEBwYXJhbSBkb21haW4gRG9taW5pbyBkYSBwcmltaXR2YS5cclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHByaW1pdGl2ZSBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIgcGVsbyBjbGllbnQuXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclBhdGggQ2FtaW5obyBhdMOpIGEgcHJvcHJpZWRhZGUgY29uc2lkZXJhZGEgbyBpbmRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBsZXQgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmIChwcmltaXRpdmVNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyID0ge1xyXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyUGF0aDogaWRlbnRpZmllclBhdGgsXHJcbiAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50czogW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uID0gdGhpcy5fc3RvbXBDbGllbnQuc3Vic2NyaWJlKHVybCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5uZXh0KGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdCgpXHJcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25Vc2VyVXJsKGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gPSB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUodXJsLCAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBUID0gSlNPTi5wYXJzZShtZXNzYWdlLmJvZHkgfHwgXCJ7fVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm5leHQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0b2RvcyBvcyBldmVudG9zIG91dmlkb3MgcGFyYSBhIHJlc3BlY3RpdmEgcHJpbWl0aXZhLlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIGV2ZW50byByZXRvcm5hZG8gcGVsYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0gcHJpbWl0aXZlIFByaW1pdGl2YSBxdWUgc2Vyw6EgXCJvYnNlcnZhZGFcIiBwZWxvIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVycyBBcnJheSBjb20gb3MgaW5kZW50aWZpY2Fkb3JlcyBpbnRlcmVzc2Fkb3MuXHJcbiAgICAgKiBAcmV0dXJuIEFycmF5IGNvbnRlbmRvIG8gw7psdGltbyBldmVudG8gcmVjZWJpZG8gZGUgY2FkYSBpZGVudGlmaWNhZG9yIGZvcm5lY2lkby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFB1Ymxpc2hlZEV2ZW50czxUPihwcmltaXRpdmU6IHN0cmluZywgaWRlbnRpZmllcnM6IHN0cmluZ1tdKTogVFtdIHtcclxuICAgICAgICBjb25zdCBwdWJsaXNoZWRFdmVudHM6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBwcmltaXRpdmVNYW5hZ2VyID0gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQocHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZChcclxuICAgICAgICAgICAgICAgIHggPT4gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlZEV2ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFB1Ymxpc2hlZEV2ZW50KHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIsIGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgeCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzW2V2ZW50SW5kZXhdID0geyAuLi5wcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSwgLi4uZXZlbnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJZGVudGlmaWVyRnJvbUV2ZW50KGlkZW50aWZpZXJQYXRoOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBpZGVudGlmaWVyUGF0aC5zcGxpdChcIi5cIik7XHJcblxyXG4gICAgICAgIGxldCBpZGVudGlmaWVyID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xyXG4gICAgICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllcltwcm9wZXJ0eV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9tcENsaWVudCgpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXRvdSBmYWxzZSBpc0Nvbm5lY3RpbmcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Nvbm5lY3RvdSBkZW50cm8gZG8gY29ubmVjdCBjYicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnJlY29ubmVjdFdlYlNvY2tldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHB1Ymxpc2hPbkNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5vYnNlcnZlcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmx1cigpIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvYnNlcnZlcnNDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN0b21wU3Vic2NyaXB0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdFN1YmplY3QubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENvbm5lY3RlZChjb25uZWN0ZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdChcIkBcIilbMV0gOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4uYWNjZXNzX3Rva2VuIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7dG9rZW59LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llU2VydmljZS5nZXQoXCJjb20uc2VuaW9yLmJhc2UudXJsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiY29tLnNlbmlvci50b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gdG9rZW4gJiYgSlNPTi5wYXJzZSh0b2tlbikudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RXZWJTb2NrZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPT0gbnVsbCAmJiBiYXNlVXJsICE9IHRoaXMuYmFzZVVybCkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IGJhc2UgdXJsIGNoYW5nZWQnLCB0aGlzLmJhc2VVcmwsICcgLT4gJywgYmFzZVVybCB8fCAnbnVsbCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlck5hbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgIT09IG51bGwgJiYgdXNlcm5hbWUgIT0gdGhpcy51c2VybmFtZSkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IHVzZXJuYW1lIGNoYW5nZWQnLCB0aGlzLnVzZXJuYW1lLCAnIC0+ICcsIHVzZXJuYW1lIHx8ICdudWxsJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0V2ViU29ja2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBXZWJzb2NrZXRTZXJ2aWNlLlJFQ09OTkVDVF9USU1FUik7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFnQixLQUFLLEVBQXFCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEUsT0FBTyxLQUFLLE9BQU8sTUFBTSxXQUFXLENBQUM7QUFDckMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ25ELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxNQUFNLE1BQU0sZUFBZSxDQUFDOzs7QUFXeEMsSUFBYSxnQkFBZ0Isd0JBQTdCLE1BQWEsZ0JBQWdCO0lBd0J6QixZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQWhCeEMsWUFBTyxHQUFXLElBQUksQ0FBQztRQUN2QixhQUFRLEdBQVcsSUFBSSxDQUFDO1FBQ3hCLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFHZixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUErQixDQUFDO1FBRTVELHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUV2RixzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXhDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBR25DLE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM5QixNQUFN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QUFHLElBQUksQ0FBQztBQUN2QixtQ0FBa0IsR0FBRyxLQUFLLENBQUM7QUFDM0IsZ0NBQWUsR0FBRyxxQkFBcUIsQ0FBQztBQUN4Qyw2QkFBWSxHQUFHLGtCQUFrQixDQUFDO0FBQ2xDLHNCQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO0FBQ3ZFLDhCQUFhLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBZ0IsQ0FBQyxlQUFlLENBQUMsR0FBRyxhQUFhLENBQUM7O1lBa0IxRCxhQUFhOzs7QUF4QnZDLGdCQUFnQjtJQUg1QixVQUFVLENBQUM7UUFDUixVQUFVLEVBQUUsTUFBTTtLQUNyQixDQUFDO0dBQ1csZ0JBQWdCLENBb1M1QjtTQXBTWSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29tcGF0Q2xpZW50LCBTdG9tcCwgU3RvbXBTdWJzY3JpcHRpb24gfSBmcm9tIFwiQHN0b21wL3N0b21wanNcIjtcclxuaW1wb3J0ICogYXMgQ29va2llcyBmcm9tIFwianMtY29va2llXCI7XHJcbmltcG9ydCB7IENvb2tpZVNlcnZpY2UgfSBmcm9tIFwibmd4LWNvb2tpZS1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSBcInNvY2tqcy1jbGllbnRcIjtcclxuXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDMwMDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgZm9jdXNlZCA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3RvbXBTdWJzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFN0b21wU3Vic2NyaXB0aW9uW10+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBwcmltaXRpdmVNYW5hZ2VyczogTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4gPSBuZXcgTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4oKTtcclxuXHJcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UpIHtcclxuICAgICAgICB3aW5kb3cub25mb2N1cyA9IHRoaXMub25Gb2N1cztcclxuICAgICAgICB3aW5kb3cub25ibHVyID0gdGhpcy5vbkJsdXI7XHJcblxyXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEgb3UgasOhIGVzdMOhIGVtIGFuZGFtZW50by5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoT25Db25uZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGZpbmFsaXphZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZmluYWxpemFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIHVtIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gb2JqZXRvIHF1ZSBvIHJldG9ybm8gZG8gYG9ic2VydmFibGVgIHZhaSBkZXZvbHZlci5cclxuICAgICAqIEBwYXJhbSBkb21haW4gRG9taW5pbyBkYSBwcmltaXR2YS5cclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHByaW1pdGl2ZSBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIgcGVsbyBjbGllbnQuXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclBhdGggQ2FtaW5obyBhdMOpIGEgcHJvcHJpZWRhZGUgY29uc2lkZXJhZGEgbyBpbmRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBsZXQgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmIChwcmltaXRpdmVNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyID0ge1xyXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyUGF0aDogaWRlbnRpZmllclBhdGgsXHJcbiAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50czogW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSwgcHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdCgpXHJcbiAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUsIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgdG9kb3Mgb3MgZXZlbnRvcyBvdXZpZG9zIHBlbGEgcHJpbWl0aXZhIGNvbSBvcyByZXNwZWN0aXZvcyBpZGVudGlmaWNhZG9yZXMuXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gZXZlbnRvIHJldG9ybmFkbyBwZWxhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSBwcmltaXRpdmUgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiIHBlbG8gY2xpZW50LlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXJzIEFycmF5IGNvbSBvcyBpbmRlbnRpZmljYWRvcmVzIGludGVyZXNzYWRvcy5cclxuICAgICAqIEByZXR1cm4gQXJyYXkgY29udGVuZG8gbyDDumx0aW1vIGV2ZW50byByZWNlYmlkbyBkZSBjYWRhIGlkZW50aWZpY2Fkb3IgZm9ybmVjaWRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UHVibGlzaGVkRXZlbnRzPFQ+KHByaW1pdGl2ZTogc3RyaW5nLCBpZGVudGlmaWVyczogc3RyaW5nW10pOiBUW10ge1xyXG4gICAgICAgIGNvbnN0IHB1Ymxpc2hlZEV2ZW50czogVFtdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgPSB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgaWRlbnRpZmllcnMpIHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5maW5kKFxyXG4gICAgICAgICAgICAgICAgeCA9PiB0aGlzLmdldElkZW50aWZpZXJGcm9tRXZlbnQocHJpbWl0aXZlTWFuYWdlci5pZGVudGlmaWVyUGF0aCwgeCkgPT09IGlkZW50aWZpZXJcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgcHVibGlzaGVkRXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHVibGlzaGVkRXZlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlciwgZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldElkZW50aWZpZXJGcm9tRXZlbnQocHJpbWl0aXZlTWFuYWdlci5pZGVudGlmaWVyUGF0aCwgZXZlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICB4ID0+IHRoaXMuZ2V0SWRlbnRpZmllckZyb21FdmVudChwcmltaXRpdmVNYW5hZ2VyLmlkZW50aWZpZXJQYXRoLCB4KSA9PT0gaWRlbnRpZmllclxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChldmVudEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSA9IHsgLi4ucHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHNbZXZlbnRJbmRleF0sIC4uLmV2ZW50IH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMucHVzaChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKGRvbWFpbjogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcsIHByaW1pdGl2ZTogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgd2l0aFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnNldChwcmltaXRpdmUsIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24od2l0aFRva2VuVXJsLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2l0aG91dFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24od2l0aG91dFRva2VuVXJsLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuc2V0KHByaW1pdGl2ZSwgW3N0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuLCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SWRlbnRpZmllckZyb21FdmVudChpZGVudGlmaWVyUGF0aDogc3RyaW5nLCBldmVudDogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gaWRlbnRpZmllclBhdGguc3BsaXQoXCIuXCIpO1xyXG5cclxuICAgICAgICBsZXQgaWRlbnRpZmllciA9IGV2ZW50O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXJbcHJvcGVydHldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0KCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvbXBDbGllbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5jb25uZWN0KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hPbkNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5yZWNvbm5lY3RXZWJTb2NrZXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwdWJsaXNoT25Db25uZWN0KCkge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCQubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCQub2JzZXJ2ZXJzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkJsdXIoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XHJcbiAgICAgICAgbGV0IG9ic2VydmVyc0NvdW50ID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXJzQ291bnQgKz0gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm9ic2VydmVycy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob2JzZXJ2ZXJzQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdG9tcFN1YnNjcmlwdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBzdG9tcFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5jbGVhcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWFjdGl2YXRlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RTdWJqZWN0Lm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0Nvbm5lY3RlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDb25uZWN0ZWQoY29ubmVjdGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBjb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4gPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLnVzZXJuYW1lLnNwbGl0KFwiQFwiKVsxXSA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi5hY2Nlc3NfdG9rZW4gOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHt0b2tlbn0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhvdXRUb2tlbihkb21haW46IHN0cmluZywgc2VydmljZTogc3RyaW5nLCBwcmltaXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoXCJAXCIpWzFdIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihkZXN0aW5hdGlvbjogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRQdWJsaXNoZWRFdmVudChwcmltaXRpdmVNYW5hZ2VyLCBldmVudCk7XHJcblxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QubmV4dChldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llU2VydmljZS5nZXQoXCJjb20uc2VuaW9yLmJhc2UudXJsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiY29tLnNlbmlvci50b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gdG9rZW4gJiYgSlNPTi5wYXJzZSh0b2tlbikudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RXZWJTb2NrZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPT0gbnVsbCAmJiBiYXNlVXJsICE9IHRoaXMuYmFzZVVybCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlck5hbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgIT09IG51bGwgJiYgdXNlcm5hbWUgIT0gdGhpcy51c2VybmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFdlYlNvY2tldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgV2Vic29ja2V0U2VydmljZS5SRUNPTk5FQ1RfVElNRVIpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -4,7 +4,7 @@ import { Stomp } from "@stomp/stompjs";
|
|
|
4
4
|
import * as Cookies from "js-cookie";
|
|
5
5
|
import { CookieService } from "ngx-cookie-service";
|
|
6
6
|
import { Subject } from "rxjs";
|
|
7
|
-
import {
|
|
7
|
+
import { first } from "rxjs/operators";
|
|
8
8
|
import * as SockJS from "sockjs-client";
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
import * as i1 from "ngx-cookie-service";
|
|
@@ -17,7 +17,6 @@ var WebsocketService = /** @class */ (function () {
|
|
|
17
17
|
this.connected = false;
|
|
18
18
|
this.isConnecting = false;
|
|
19
19
|
this.stompSubscriptions = new Map();
|
|
20
|
-
// private primitiveSubjects: Map<string, Subject<any>> = new Map<string, Subject<any>>();
|
|
21
20
|
this.primitiveManagers = new Map();
|
|
22
21
|
this.disconnectSubject = new Subject();
|
|
23
22
|
this.connect$ = new Subject();
|
|
@@ -27,7 +26,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
27
26
|
}
|
|
28
27
|
WebsocketService_1 = WebsocketService;
|
|
29
28
|
/**
|
|
30
|
-
* Observable
|
|
29
|
+
* Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida.
|
|
31
30
|
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida ou já está em andamento.
|
|
32
31
|
*/
|
|
33
32
|
WebsocketService.prototype.onConnect = function () {
|
|
@@ -40,7 +39,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
40
39
|
return this.connect$.asObservable();
|
|
41
40
|
};
|
|
42
41
|
/**
|
|
43
|
-
* Observable
|
|
42
|
+
* Observable responsável por emitir uma notificação quando a conexão é finalizada.
|
|
44
43
|
* @return Um `Observable<void>` que emite uma notificação quando a conexão é finalizada.
|
|
45
44
|
*/
|
|
46
45
|
WebsocketService.prototype.onDisconnect = function () {
|
|
@@ -67,14 +66,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
67
66
|
publishedEvents: [],
|
|
68
67
|
};
|
|
69
68
|
if (this.isConnected()) {
|
|
70
|
-
|
|
71
|
-
this.primitiveManagers.set(primitive, primitiveManager);
|
|
72
|
-
var stompSubscription = this._stompClient.subscribe(url, function (message) {
|
|
73
|
-
var event = JSON.parse(message.body || "{}");
|
|
74
|
-
_this.addPublishedEvent(primitiveManager, event);
|
|
75
|
-
primitiveManager.subject.next(event);
|
|
76
|
-
});
|
|
77
|
-
this.stompSubscriptions.set(primitive, stompSubscription);
|
|
69
|
+
this.createStompSubscriptions(domain, service, primitive, primitiveManager);
|
|
78
70
|
return primitiveManager.subject.asObservable();
|
|
79
71
|
}
|
|
80
72
|
else {
|
|
@@ -82,22 +74,15 @@ var WebsocketService = /** @class */ (function () {
|
|
|
82
74
|
this.connect();
|
|
83
75
|
}
|
|
84
76
|
this.onConnect()
|
|
85
|
-
.pipe(
|
|
77
|
+
.pipe(first())
|
|
86
78
|
.subscribe(function () {
|
|
87
|
-
|
|
88
|
-
_this.primitiveManagers.set(primitive, primitiveManager);
|
|
89
|
-
var stompSubscription = _this._stompClient.subscribe(url, function (message) {
|
|
90
|
-
var event = JSON.parse(message.body || "{}");
|
|
91
|
-
_this.addPublishedEvent(primitiveManager, event);
|
|
92
|
-
primitiveManager.subject.next(event);
|
|
93
|
-
});
|
|
94
|
-
_this.stompSubscriptions.set(primitive, stompSubscription);
|
|
79
|
+
_this.createStompSubscriptions(domain, service, primitive, primitiveManager);
|
|
95
80
|
});
|
|
96
81
|
return primitiveManager.subject.asObservable();
|
|
97
82
|
}
|
|
98
83
|
};
|
|
99
84
|
/**
|
|
100
|
-
* Retorna todos os eventos ouvidos
|
|
85
|
+
* Retorna todos os eventos ouvidos pela primitiva com os respectivos identificadores.
|
|
101
86
|
* @typeParam `<T>` Tipo do evento retornado pela primitiva.
|
|
102
87
|
* @param primitive Primitiva que será "observada" pelo client.
|
|
103
88
|
* @param identifiers Array com os indentificadores interessados.
|
|
@@ -132,9 +117,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
132
117
|
WebsocketService.prototype.addPublishedEvent = function (primitiveManager, event) {
|
|
133
118
|
var _this = this;
|
|
134
119
|
var identifier = this.getIdentifierFromEvent(primitiveManager.identifierPath, event);
|
|
135
|
-
var eventIndex = primitiveManager.publishedEvents.findIndex(function (x) {
|
|
136
|
-
return _this.getIdentifierFromEvent(primitiveManager.identifierPath, x) === identifier;
|
|
137
|
-
});
|
|
120
|
+
var eventIndex = primitiveManager.publishedEvents.findIndex(function (x) { return _this.getIdentifierFromEvent(primitiveManager.identifierPath, x) === identifier; });
|
|
138
121
|
if (eventIndex !== -1) {
|
|
139
122
|
primitiveManager.publishedEvents[eventIndex] = __assign(__assign({}, primitiveManager.publishedEvents[eventIndex]), event);
|
|
140
123
|
}
|
|
@@ -142,6 +125,14 @@ var WebsocketService = /** @class */ (function () {
|
|
|
142
125
|
primitiveManager.publishedEvents.push(event);
|
|
143
126
|
}
|
|
144
127
|
};
|
|
128
|
+
WebsocketService.prototype.createStompSubscriptions = function (domain, service, primitive, primitiveManager) {
|
|
129
|
+
var withTokenUrl = this.getSubscriptionUrlWithToken(domain, service, primitive);
|
|
130
|
+
this.primitiveManagers.set(primitive, primitiveManager);
|
|
131
|
+
var stompSubscriptionWithToken = this.createStompSubscription(withTokenUrl, primitiveManager);
|
|
132
|
+
var withoutTokenUrl = this.getSubscriptionUrlWithoutToken(domain, service, primitive);
|
|
133
|
+
var stompSubscriptionWithoutToken = this.createStompSubscription(withoutTokenUrl, primitiveManager);
|
|
134
|
+
this.stompSubscriptions.set(primitive, [stompSubscriptionWithToken, stompSubscriptionWithoutToken]);
|
|
135
|
+
};
|
|
145
136
|
WebsocketService.prototype.getIdentifierFromEvent = function (identifierPath, event) {
|
|
146
137
|
var e_2, _a;
|
|
147
138
|
var properties = identifierPath.split(".");
|
|
@@ -167,9 +158,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
167
158
|
this.isConnecting = true;
|
|
168
159
|
this._stompClient.connect({}, function () {
|
|
169
160
|
_this.setConnected(true);
|
|
170
|
-
// console.log('setou false isConnecting');
|
|
171
161
|
_this.isConnecting = false;
|
|
172
|
-
// console.log('connectou dentro do connect cb');
|
|
173
162
|
_this.publishOnConnect();
|
|
174
163
|
}, function () {
|
|
175
164
|
_this.setConnected(false);
|
|
@@ -203,8 +192,21 @@ var WebsocketService = /** @class */ (function () {
|
|
|
203
192
|
finally { if (e_3) throw e_3.error; }
|
|
204
193
|
}
|
|
205
194
|
if (observersCount === 0) {
|
|
206
|
-
this.stompSubscriptions.forEach(function (
|
|
207
|
-
|
|
195
|
+
this.stompSubscriptions.forEach(function (stompSubscriptions) {
|
|
196
|
+
var e_5, _a;
|
|
197
|
+
try {
|
|
198
|
+
for (var stompSubscriptions_1 = __values(stompSubscriptions), stompSubscriptions_1_1 = stompSubscriptions_1.next(); !stompSubscriptions_1_1.done; stompSubscriptions_1_1 = stompSubscriptions_1.next()) {
|
|
199
|
+
var stompSubscription = stompSubscriptions_1_1.value;
|
|
200
|
+
stompSubscription.unsubscribe();
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
204
|
+
finally {
|
|
205
|
+
try {
|
|
206
|
+
if (stompSubscriptions_1_1 && !stompSubscriptions_1_1.done && (_a = stompSubscriptions_1.return)) _a.call(stompSubscriptions_1);
|
|
207
|
+
}
|
|
208
|
+
finally { if (e_5) throw e_5.error; }
|
|
209
|
+
}
|
|
208
210
|
});
|
|
209
211
|
try {
|
|
210
212
|
for (var _e = __values(this.primitiveManagers.values()), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
@@ -234,11 +236,23 @@ var WebsocketService = /** @class */ (function () {
|
|
|
234
236
|
WebsocketService.prototype.setConnected = function (connected) {
|
|
235
237
|
this.connected = connected;
|
|
236
238
|
};
|
|
237
|
-
WebsocketService.prototype.
|
|
239
|
+
WebsocketService.prototype.getSubscriptionUrlWithToken = function (domain, service, primitive) {
|
|
238
240
|
var tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
|
|
239
241
|
var token = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.access_token : null;
|
|
240
242
|
return "/topic/" + tenant + "/" + token + "/" + domain + "/" + service + "/" + primitive;
|
|
241
243
|
};
|
|
244
|
+
WebsocketService.prototype.getSubscriptionUrlWithoutToken = function (domain, service, primitive) {
|
|
245
|
+
var tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
|
|
246
|
+
return "/topic/" + tenant + "/" + domain + "/" + service + "/" + primitive;
|
|
247
|
+
};
|
|
248
|
+
WebsocketService.prototype.createStompSubscription = function (destination, primitiveManager) {
|
|
249
|
+
var _this = this;
|
|
250
|
+
return this._stompClient.subscribe(destination, function (message) {
|
|
251
|
+
var event = JSON.parse(message.body || "{}");
|
|
252
|
+
_this.addPublishedEvent(primitiveManager, event);
|
|
253
|
+
primitiveManager.subject.next(event);
|
|
254
|
+
});
|
|
255
|
+
};
|
|
242
256
|
WebsocketService.prototype.createStompClient = function () {
|
|
243
257
|
var ws = new SockJS(WebsocketService_1.WEBSOCKET_URL + "subscription", null, { timeout: WebsocketService_1.CONNECTION_TIMEOUT });
|
|
244
258
|
this._stompClient = Stomp.over(ws);
|
|
@@ -256,12 +270,10 @@ var WebsocketService = /** @class */ (function () {
|
|
|
256
270
|
this._stompClient.disconnect();
|
|
257
271
|
var baseUrl = this.getBaseUrl();
|
|
258
272
|
if (this.baseUrl !== null && baseUrl != this.baseUrl) {
|
|
259
|
-
// //console.log('ws disconnected: base url changed', this.baseUrl, ' -> ', baseUrl || 'null');
|
|
260
273
|
return;
|
|
261
274
|
}
|
|
262
275
|
var username = this.getUserName();
|
|
263
276
|
if (this.username !== null && username != this.username) {
|
|
264
|
-
// //console.log('ws disconnected: username changed', this.username, ' -> ', username || 'null');
|
|
265
277
|
return;
|
|
266
278
|
}
|
|
267
279
|
setTimeout(function () {
|
|
@@ -292,4 +304,4 @@ var WebsocketService = /** @class */ (function () {
|
|
|
292
304
|
return WebsocketService;
|
|
293
305
|
}());
|
|
294
306
|
export { WebsocketService };
|
|
295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7OztBQVd4QztJQXlCSSwwQkFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqQnhDLFlBQU8sR0FBVyxJQUFJLENBQUM7UUFDdkIsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR2YsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQix1QkFBa0IsR0FBbUMsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFFbEcsMEZBQTBGO1FBQ2xGLHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUV2RixzQkFBaUIsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUV2RCxhQUFRLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFHbEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcs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RSxDQUFDO2FBQzdCO1FBQ0wsQ0FBQyxFQUFFLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0lBaFNjLGdDQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLG1DQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixnQ0FBZSxHQUFHLHFCQUFxQixDQUFDO0lBQ3hDLDZCQUFZLEdBQUcsa0JBQWtCLENBQUM7SUFDbEMsc0JBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDdkUsOEJBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs7Z0JBbUIxRCxhQUFhOzs7SUF6QnZDLGdCQUFnQjtRQUg1QixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csZ0JBQWdCLENBa1M1QjsyQkFuVEQ7Q0FtVEMsQUFsU0QsSUFrU0M7U0FsU1ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbXBhdENsaWVudCwgU3RvbXAsIFN0b21wU3Vic2NyaXB0aW9uIH0gZnJvbSBcIkBzdG9tcC9zdG9tcGpzXCI7XHJcbmltcG9ydCAqIGFzIENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWUtc2VydmljZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSBcInNvY2tqcy1jbGllbnRcIjtcclxuXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDMwMDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgZm9jdXNlZCA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3RvbXBTdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBTdG9tcFN1YnNjcmlwdGlvbj4gPSBuZXcgTWFwPHN0cmluZywgU3RvbXBTdWJzY3JpcHRpb24+KCk7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBwcmltaXRpdmVTdWJqZWN0czogTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBTdWJqZWN0PGFueT4+KCk7XHJcbiAgICBwcml2YXRlIHByaW1pdGl2ZU1hbmFnZXJzOiBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPiA9IG5ldyBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPigpO1xyXG5cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdFN1YmplY3Q6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29va2llU2VydmljZTogQ29va2llU2VydmljZSkge1xyXG4gICAgICAgIHdpbmRvdy5vbmZvY3VzID0gdGhpcy5vbkZvY3VzO1xyXG4gICAgICAgIHdpbmRvdy5vbmJsdXIgPSB0aGlzLm9uQmx1cjtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3Bvc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYS5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhIG91IGrDoSBlc3TDoSBlbSBhbmRhbWVudG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb3PDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGZpbmFsaXphZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZmluYWxpemFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIHVtIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gb2JqZXRvIHF1ZSBvIHJldG9ybm8gZG8gYG9ic2VydmFibGVgIHZhaSBkZXZvbHZlci5cclxuICAgICAqIEBwYXJhbSBkb21haW4gRG9taW5pbyBkYSBwcmltaXR2YS5cclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHByaW1pdGl2ZSBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIgcGVsbyBjbGllbnQuXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclBhdGggQ2FtaW5obyBhdMOpIGEgcHJvcHJpZWRhZGUgY29uc2lkZXJhZGEgbyBpbmRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBsZXQgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmIChwcmltaXRpdmVNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyID0ge1xyXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyUGF0aDogaWRlbnRpZmllclBhdGgsXHJcbiAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50czogW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uID0gdGhpcy5fc3RvbXBDbGllbnQuc3Vic2NyaWJlKHVybCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5uZXh0KGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdCgpXHJcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25Vc2VyVXJsKGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gPSB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUodXJsLCAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBUID0gSlNPTi5wYXJzZShtZXNzYWdlLmJvZHkgfHwgXCJ7fVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm5leHQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0b2RvcyBvcyBldmVudG9zIG91dmlkb3MgcGFyYSBhIHJlc3BlY3RpdmEgcHJpbWl0aXZhLlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIGV2ZW50byByZXRvcm5hZG8gcGVsYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0gcHJpbWl0aXZlIFByaW1pdGl2YSBxdWUgc2Vyw6EgXCJvYnNlcnZhZGFcIiBwZWxvIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVycyBBcnJheSBjb20gb3MgaW5kZW50aWZpY2Fkb3JlcyBpbnRlcmVzc2Fkb3MuXHJcbiAgICAgKiBAcmV0dXJuIEFycmF5IGNvbnRlbmRvIG8gw7psdGltbyBldmVudG8gcmVjZWJpZG8gZGUgY2FkYSBpZGVudGlmaWNhZG9yIGZvcm5lY2lkby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFB1Ymxpc2hlZEV2ZW50czxUPihwcmltaXRpdmU6IHN0cmluZywgaWRlbnRpZmllcnM6IHN0cmluZ1tdKTogVFtdIHtcclxuICAgICAgICBjb25zdCBwdWJsaXNoZWRFdmVudHM6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBwcmltaXRpdmVNYW5hZ2VyID0gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQocHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZChcclxuICAgICAgICAgICAgICAgIHggPT4gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlZEV2ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFB1Ymxpc2hlZEV2ZW50KHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIsIGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgeCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzW2V2ZW50SW5kZXhdID0geyAuLi5wcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSwgLi4uZXZlbnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJZGVudGlmaWVyRnJvbUV2ZW50KGlkZW50aWZpZXJQYXRoOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBpZGVudGlmaWVyUGF0aC5zcGxpdChcIi5cIik7XHJcblxyXG4gICAgICAgIGxldCBpZGVudGlmaWVyID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xyXG4gICAgICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllcltwcm9wZXJ0eV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9tcENsaWVudCgpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXRvdSBmYWxzZSBpc0Nvbm5lY3RpbmcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Nvbm5lY3RvdSBkZW50cm8gZG8gY29ubmVjdCBjYicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnJlY29ubmVjdFdlYlNvY2tldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHB1Ymxpc2hPbkNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5vYnNlcnZlcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmx1cigpIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvYnNlcnZlcnNDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN0b21wU3Vic2NyaXB0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdFN1YmplY3QubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENvbm5lY3RlZChjb25uZWN0ZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdChcIkBcIilbMV0gOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4uYWNjZXNzX3Rva2VuIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7dG9rZW59LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llU2VydmljZS5nZXQoXCJjb20uc2VuaW9yLmJhc2UudXJsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiY29tLnNlbmlvci50b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gdG9rZW4gJiYgSlNPTi5wYXJzZSh0b2tlbikudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RXZWJTb2NrZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPT0gbnVsbCAmJiBiYXNlVXJsICE9IHRoaXMuYmFzZVVybCkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IGJhc2UgdXJsIGNoYW5nZWQnLCB0aGlzLmJhc2VVcmwsICcgLT4gJywgYmFzZVVybCB8fCAnbnVsbCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlck5hbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgIT09IG51bGwgJiYgdXNlcm5hbWUgIT0gdGhpcy51c2VybmFtZSkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IHVzZXJuYW1lIGNoYW5nZWQnLCB0aGlzLnVzZXJuYW1lLCAnIC0+ICcsIHVzZXJuYW1lIHx8ICdudWxsJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0V2ViU29ja2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBXZWJzb2NrZXRTZXJ2aWNlLlJFQ09OTkVDVF9USU1FUik7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7OztBQVd4QztJQXdCSSwwQkFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFoQnhDLFlBQU8sR0FBVyxJQUFJLENBQUM7UUFDdkIsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR2YsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUU1RCxzQkFBaUIsR0FBa0MsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFdkYsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUV4QyxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUduQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxD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SUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2xELE9BQU87U0FDVjtRQUVELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JELE9BQU87U0FDVjtRQUVELFVBQVUsQ0FBQztZQUNQLElBQUksS0FBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZCxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDbEI7aUJBQU07Z0JBQ0gsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDN0I7UUFDTCxDQUFDLEVBQUUsa0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekMsQ0FBQzs7SUFsU2MsZ0NBQWUsR0FBRyxJQUFJLENBQUM7SUFDdkIsbUNBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQzNCLGdDQUFlLEdBQUcscUJBQXFCLENBQUM7SUFDeEMsNkJBQVksR0FBRyxrQkFBa0IsQ0FBQztJQUNsQyxzQkFBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUN2RSw4QkFBYSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDOztnQkFrQjFELGFBQWE7OztJQXhCdkMsZ0JBQWdCO1FBSDVCLFVBQVUsQ0FBQztZQUNSLFVBQVUsRUFBRSxNQUFNO1NBQ3JCLENBQUM7T0FDVyxnQkFBZ0IsQ0FvUzVCOzJCQXJURDtDQXFUQyxBQXBTRCxJQW9TQztTQXBTWSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29tcGF0Q2xpZW50LCBTdG9tcCwgU3RvbXBTdWJzY3JpcHRpb24gfSBmcm9tIFwiQHN0b21wL3N0b21wanNcIjtcclxuaW1wb3J0ICogYXMgQ29va2llcyBmcm9tIFwianMtY29va2llXCI7XHJcbmltcG9ydCB7IENvb2tpZVNlcnZpY2UgfSBmcm9tIFwibmd4LWNvb2tpZS1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSBcInNvY2tqcy1jbGllbnRcIjtcclxuXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDMwMDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgZm9jdXNlZCA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3RvbXBTdWJzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFN0b21wU3Vic2NyaXB0aW9uW10+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBwcmltaXRpdmVNYW5hZ2VyczogTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4gPSBuZXcgTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4oKTtcclxuXHJcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UpIHtcclxuICAgICAgICB3aW5kb3cub25mb2N1cyA9IHRoaXMub25Gb2N1cztcclxuICAgICAgICB3aW5kb3cub25ibHVyID0gdGhpcy5vbkJsdXI7XHJcblxyXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEgb3UgasOhIGVzdMOhIGVtIGFuZGFtZW50by5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wdWJsaXNoT25Db25uZWN0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAwKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGZpbmFsaXphZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZmluYWxpemFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIHVtIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gb2JqZXRvIHF1ZSBvIHJldG9ybm8gZG8gYG9ic2VydmFibGVgIHZhaSBkZXZvbHZlci5cclxuICAgICAqIEBwYXJhbSBkb21haW4gRG9taW5pbyBkYSBwcmltaXR2YS5cclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHByaW1pdGl2ZSBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIgcGVsbyBjbGllbnQuXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclBhdGggQ2FtaW5obyBhdMOpIGEgcHJvcHJpZWRhZGUgY29uc2lkZXJhZGEgbyBpbmRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBsZXQgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmIChwcmltaXRpdmVNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyID0ge1xyXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyUGF0aDogaWRlbnRpZmllclBhdGgsXHJcbiAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50czogW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSwgcHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdCgpXHJcbiAgICAgICAgICAgICAgICAucGlwZShmaXJzdCgpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUsIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldG9ybmEgdG9kb3Mgb3MgZXZlbnRvcyBvdXZpZG9zIHBlbGEgcHJpbWl0aXZhIGNvbSBvcyByZXNwZWN0aXZvcyBpZGVudGlmaWNhZG9yZXMuXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gZXZlbnRvIHJldG9ybmFkbyBwZWxhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSBwcmltaXRpdmUgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiIHBlbG8gY2xpZW50LlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXJzIEFycmF5IGNvbSBvcyBpbmRlbnRpZmljYWRvcmVzIGludGVyZXNzYWRvcy5cclxuICAgICAqIEByZXR1cm4gQXJyYXkgY29udGVuZG8gbyDDumx0aW1vIGV2ZW50byByZWNlYmlkbyBkZSBjYWRhIGlkZW50aWZpY2Fkb3IgZm9ybmVjaWRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UHVibGlzaGVkRXZlbnRzPFQ+KHByaW1pdGl2ZTogc3RyaW5nLCBpZGVudGlmaWVyczogc3RyaW5nW10pOiBUW10ge1xyXG4gICAgICAgIGNvbnN0IHB1Ymxpc2hlZEV2ZW50czogVFtdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgPSB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgaWRlbnRpZmllcnMpIHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5maW5kKFxyXG4gICAgICAgICAgICAgICAgeCA9PiB0aGlzLmdldElkZW50aWZpZXJGcm9tRXZlbnQocHJpbWl0aXZlTWFuYWdlci5pZGVudGlmaWVyUGF0aCwgeCkgPT09IGlkZW50aWZpZXJcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgcHVibGlzaGVkRXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHVibGlzaGVkRXZlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlciwgZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldElkZW50aWZpZXJGcm9tRXZlbnQocHJpbWl0aXZlTWFuYWdlci5pZGVudGlmaWVyUGF0aCwgZXZlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICB4ID0+IHRoaXMuZ2V0SWRlbnRpZmllckZyb21FdmVudChwcmltaXRpdmVNYW5hZ2VyLmlkZW50aWZpZXJQYXRoLCB4KSA9PT0gaWRlbnRpZmllclxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChldmVudEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSA9IHsgLi4ucHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHNbZXZlbnRJbmRleF0sIC4uLmV2ZW50IH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMucHVzaChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKGRvbWFpbjogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcsIHByaW1pdGl2ZTogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgd2l0aFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnNldChwcmltaXRpdmUsIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24od2l0aFRva2VuVXJsLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2l0aG91dFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24od2l0aG91dFRva2VuVXJsLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuc2V0KHByaW1pdGl2ZSwgW3N0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuLCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SWRlbnRpZmllckZyb21FdmVudChpZGVudGlmaWVyUGF0aDogc3RyaW5nLCBldmVudDogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gaWRlbnRpZmllclBhdGguc3BsaXQoXCIuXCIpO1xyXG5cclxuICAgICAgICBsZXQgaWRlbnRpZmllciA9IGV2ZW50O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXJbcHJvcGVydHldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0KCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvbXBDbGllbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5jb25uZWN0KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hPbkNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5yZWNvbm5lY3RXZWJTb2NrZXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwdWJsaXNoT25Db25uZWN0KCkge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCQubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCQub2JzZXJ2ZXJzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkJsdXIoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XHJcbiAgICAgICAgbGV0IG9ic2VydmVyc0NvdW50ID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXJzQ291bnQgKz0gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm9ic2VydmVycy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob2JzZXJ2ZXJzQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdG9tcFN1YnNjcmlwdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBzdG9tcFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5jbGVhcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWFjdGl2YXRlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RTdWJqZWN0Lm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0Nvbm5lY3RlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDb25uZWN0ZWQoY29ubmVjdGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBjb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4gPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLnVzZXJuYW1lLnNwbGl0KFwiQFwiKVsxXSA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi5hY2Nlc3NfdG9rZW4gOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHt0b2tlbn0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhvdXRUb2tlbihkb21haW46IHN0cmluZywgc2VydmljZTogc3RyaW5nLCBwcmltaXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoXCJAXCIpWzFdIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihkZXN0aW5hdGlvbjogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRQdWJsaXNoZWRFdmVudChwcmltaXRpdmVNYW5hZ2VyLCBldmVudCk7XHJcblxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QubmV4dChldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llU2VydmljZS5nZXQoXCJjb20uc2VuaW9yLmJhc2UudXJsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiY29tLnNlbmlvci50b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gdG9rZW4gJiYgSlNPTi5wYXJzZSh0b2tlbikudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RXZWJTb2NrZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPT0gbnVsbCAmJiBiYXNlVXJsICE9IHRoaXMuYmFzZVVybCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlck5hbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgIT09IG51bGwgJiYgdXNlcm5hbWUgIT0gdGhpcy51c2VybmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFdlYlNvY2tldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgV2Vic29ja2V0U2VydmljZS5SRUNPTk5FQ1RfVElNRVIpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|