@posiwise/common-services 0.1.88 → 0.1.90
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/fesm2022/posiwise-common-services.mjs +164 -191
- package/fesm2022/posiwise-common-services.mjs.map +1 -1
- package/lib/user.service.d.ts +1 -0
- package/package.json +11 -10
- package/esm2022/index.mjs +0 -47
- package/esm2022/lib/ab-test.service.mjs +0 -55
- package/esm2022/lib/ahoy.service.mjs +0 -93
- package/esm2022/lib/auth.service.mjs +0 -322
- package/esm2022/lib/base-http.service.mjs +0 -98
- package/esm2022/lib/brain-api-http.service.mjs +0 -26
- package/esm2022/lib/brain.service.mjs +0 -21
- package/esm2022/lib/common-services.interface.mjs +0 -2
- package/esm2022/lib/common-services.module.mjs +0 -23
- package/esm2022/lib/common.service.mjs +0 -134
- package/esm2022/lib/custom-preloading.service.mjs +0 -38
- package/esm2022/lib/dashboard.service.mjs +0 -21
- package/esm2022/lib/data.service.mjs +0 -21
- package/esm2022/lib/date-formatter.service.mjs +0 -82
- package/esm2022/lib/effects/user.effects.mjs +0 -27
- package/esm2022/lib/form-helper.service.mjs +0 -27
- package/esm2022/lib/geo.service.mjs +0 -40
- package/esm2022/lib/google-analytics.service.mjs +0 -121
- package/esm2022/lib/group.service.mjs +0 -122
- package/esm2022/lib/hopscotch.service.mjs +0 -48
- package/esm2022/lib/integrations-api-http.service.mjs +0 -28
- package/esm2022/lib/link-loader.service.mjs +0 -50
- package/esm2022/lib/local-storage.service.mjs +0 -32
- package/esm2022/lib/logo-caching.service.mjs +0 -65
- package/esm2022/lib/mailbox.service.mjs +0 -66
- package/esm2022/lib/main-api-http.service.mjs +0 -26
- package/esm2022/lib/notification.service.mjs +0 -70
- package/esm2022/lib/number-picker.service.mjs +0 -43
- package/esm2022/lib/permission.service.mjs +0 -252
- package/esm2022/lib/primeNgHelper.mjs +0 -18
- package/esm2022/lib/product.service.mjs +0 -78
- package/esm2022/lib/profile.service.mjs +0 -64
- package/esm2022/lib/qualification.service.mjs +0 -29
- package/esm2022/lib/script-loader.service.mjs +0 -79
- package/esm2022/lib/secure-token-storage.service.mjs +0 -264
- package/esm2022/lib/sentry.service.mjs +0 -384
- package/esm2022/lib/seo.service.mjs +0 -43
- package/esm2022/lib/socket.service.mjs +0 -29
- package/esm2022/lib/subscription.service.mjs +0 -129
- package/esm2022/lib/tag.service.mjs +0 -101
- package/esm2022/lib/tips.service.mjs +0 -38
- package/esm2022/lib/toast.service.mjs +0 -85
- package/esm2022/lib/user.service.mjs +0 -202
- package/esm2022/lib/validation.service.mjs +0 -36
- package/esm2022/lib/window.service.mjs +0 -20
- package/esm2022/posiwise-common-services.mjs +0 -5
|
@@ -1,384 +0,0 @@
|
|
|
1
|
-
import { HttpErrorResponse } from '@angular/common/http';
|
|
2
|
-
import { Injectable } from '@angular/core';
|
|
3
|
-
import { AppConfigService } from '@posiwise/app-config-service';
|
|
4
|
-
import { StatusCodes } from 'http-status-codes';
|
|
5
|
-
import { fromError } from 'stacktrace-js';
|
|
6
|
-
import { BrowserTracing, captureException, createErrorHandler, init, routingInstrumentation, withScope } from '@sentry/angular-ivy';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@posiwise/app-config-service";
|
|
9
|
-
export class SentryErrorHandler {
|
|
10
|
-
static { this.sentryInitialized = false; }
|
|
11
|
-
constructor(appConfigService) {
|
|
12
|
-
this.appConfigService = appConfigService;
|
|
13
|
-
}
|
|
14
|
-
async initializeSentryAsync() {
|
|
15
|
-
if (SentryErrorHandler.sentryInitialized) {
|
|
16
|
-
// Sentry is already initialized, no need to do it again
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
createErrorHandler();
|
|
20
|
-
const config = await this.getSentryConfigAsync();
|
|
21
|
-
this.appConfigService.appConfig$.subscribe(env => {
|
|
22
|
-
if (env?.integrations?.sentry_config) {
|
|
23
|
-
init({ ...config, ...env.integrations.sentry_config });
|
|
24
|
-
SentryErrorHandler.sentryInitialized = true;
|
|
25
|
-
// Add a global listener for unhandled promise rejections
|
|
26
|
-
window.addEventListener('unhandledrejection', (event) => {
|
|
27
|
-
this.handlePromiseRejection(event);
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
// Add a global listener for unhandled promise rejections
|
|
32
|
-
window.addEventListener('unhandledrejection', (event) => {
|
|
33
|
-
this.handlePromiseRejection(event);
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
async getSentryConfigAsync() {
|
|
37
|
-
return new Promise(resolve => {
|
|
38
|
-
const environment = window.location.host?.includes('dev') || window.location.host?.includes('localhost')
|
|
39
|
-
? 'development'
|
|
40
|
-
: 'production';
|
|
41
|
-
const ignoredPaths = [''];
|
|
42
|
-
const healthCheckPaths = ['/ping'];
|
|
43
|
-
const onePercentIgnoredPaths = [''];
|
|
44
|
-
const fivePercentIgnoredPaths = [''];
|
|
45
|
-
const config = {
|
|
46
|
-
dsn: null,
|
|
47
|
-
tracesSampleRate: 0.1,
|
|
48
|
-
// Disable unused features to reduce bundle size
|
|
49
|
-
enableTracing: false,
|
|
50
|
-
beforeSend(event, hint) {
|
|
51
|
-
// Check if the event is of type CloseEvent and ignore it
|
|
52
|
-
if (event?.exception?.values) {
|
|
53
|
-
event.exception.values = event.exception.values.filter(value => {
|
|
54
|
-
// Update the condition based on the actual structure of the event
|
|
55
|
-
return !(value.type === 'CloseEvent' || value.value.includes('CloseEvent'));
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
if (event?.exception?.values) {
|
|
59
|
-
event.exception.values = event.exception.values.filter(value => {
|
|
60
|
-
// Check for the specific error message and ignore it
|
|
61
|
-
return !(value.type === 'Error' &&
|
|
62
|
-
value.value.includes('ResizeObserver loop completed'));
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
// originates from vendor.js file
|
|
66
|
-
if (event?.exception?.values) {
|
|
67
|
-
const isJsonParsingError = event.exception.values.some(value => {
|
|
68
|
-
return (value.type === 'SyntaxError' &&
|
|
69
|
-
value?.value?.includes("expected ':' after property name in"));
|
|
70
|
-
});
|
|
71
|
-
if (isJsonParsingError) {
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
// Check if the event is a ChunkLoadError and ignore it (it could be because of poor network)
|
|
76
|
-
if (event?.exception?.values) {
|
|
77
|
-
event.exception.values = event.exception.values.filter(value => {
|
|
78
|
-
return !(value.type === 'ChunkLoadError' ||
|
|
79
|
-
value.value.includes('ChunkLoadError: Loading chunk'));
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
// Check if the event is a script loading error and ignore it
|
|
83
|
-
if (event?.exception?.values) {
|
|
84
|
-
event.exception.values = event.exception.values.filter(value => {
|
|
85
|
-
return !(value.type === 'Error' &&
|
|
86
|
-
value.value.includes('Could not load "util"'));
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
// Check if the event is a timeout error and ignore it
|
|
90
|
-
if (event?.exception?.values) {
|
|
91
|
-
event.exception.values = event.exception.values.filter(value => {
|
|
92
|
-
return !(value.type === 'Error' &&
|
|
93
|
-
value.value.includes('Error loading plotly.js library from'));
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
// Check if the event is related to cross-origin frame access
|
|
97
|
-
if (event?.exception?.values) {
|
|
98
|
-
const isCrossOriginFrameError = event.exception.values.some(value => {
|
|
99
|
-
return (value.type === 'SecurityError' &&
|
|
100
|
-
value?.value?.includes("Failed to read a named property 'navigator' from 'Window': Blocked a frame with origin"));
|
|
101
|
-
});
|
|
102
|
-
if (isCrossOriginFrameError) {
|
|
103
|
-
// Exclude cross-origin frame errors from being reported to Sentry
|
|
104
|
-
return null;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// Check if the event has an exception and values array
|
|
108
|
-
if (event?.exception?.values) {
|
|
109
|
-
// Filter out events generated by TryCatch and GlobalHandlers
|
|
110
|
-
event.exception.values = event.exception.values.filter(value => {
|
|
111
|
-
const mechanism = value.mechanism;
|
|
112
|
-
return !(mechanism &&
|
|
113
|
-
(mechanism.type === 'TryCatch' ||
|
|
114
|
-
mechanism.type === 'GlobalHandlers'));
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
// Check if it's a non-error exception
|
|
118
|
-
const isNonErrorException = event?.exception?.values?.[0]?.value?.startsWith('Non-Error exception captured') ??
|
|
119
|
-
hint?.originalException?.message?.startsWith('Non-Error exception captured');
|
|
120
|
-
if (isNonErrorException) {
|
|
121
|
-
// We want to ignore those kinds of errors
|
|
122
|
-
return null;
|
|
123
|
-
}
|
|
124
|
-
return event;
|
|
125
|
-
},
|
|
126
|
-
denyUrls: [/drift.*\.js/i, /analytics.*\.js/i, /polyfills.*\.js/i, /vendor.*\.js/i],
|
|
127
|
-
integrations: [
|
|
128
|
-
// Registers and configures the Tracing integration,
|
|
129
|
-
// which automatically instruments your application to monitor its
|
|
130
|
-
// performance, including custom Angular routing instrumentation
|
|
131
|
-
new BrowserTracing({
|
|
132
|
-
routingInstrumentation: routingInstrumentation
|
|
133
|
-
})
|
|
134
|
-
],
|
|
135
|
-
tracesSampler: samplingContext => {
|
|
136
|
-
// Examine provided context data (including parent decision, if any) along
|
|
137
|
-
// with anything in the global namespace to compute the sample rate or
|
|
138
|
-
// sampling decision for this transaction
|
|
139
|
-
const pathname = samplingContext.location.pathname;
|
|
140
|
-
if (ignoredPaths.includes(pathname)) {
|
|
141
|
-
return 0;
|
|
142
|
-
}
|
|
143
|
-
else if (healthCheckPaths.includes(pathname)) {
|
|
144
|
-
// very low rate as these are extremely frequent and pretty useless
|
|
145
|
-
return 0.001;
|
|
146
|
-
}
|
|
147
|
-
else if (onePercentIgnoredPaths.includes(pathname)) {
|
|
148
|
-
return 0.01;
|
|
149
|
-
}
|
|
150
|
-
else if (fivePercentIgnoredPaths.includes(pathname)) {
|
|
151
|
-
return 0.05;
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
// Default sample rate
|
|
155
|
-
return 0.1;
|
|
156
|
-
}
|
|
157
|
-
},
|
|
158
|
-
environment,
|
|
159
|
-
// We ignore Server Errors. We have to define here since Angular
|
|
160
|
-
// http client uses setTimeout to detect http call progress.
|
|
161
|
-
// And when the call fails, it throws an exception inside that timeout
|
|
162
|
-
// that bubbles up higher to the main Angular's error handler.
|
|
163
|
-
ignoreErrors: [
|
|
164
|
-
'top.GLOBALS',
|
|
165
|
-
'ResizeObserver loop completed with undelivered notifications'
|
|
166
|
-
]
|
|
167
|
-
};
|
|
168
|
-
resolve(config);
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
initializeUser(user) {
|
|
172
|
-
SentryErrorHandler.user = {
|
|
173
|
-
id: user?.id,
|
|
174
|
-
name: user?.first_name,
|
|
175
|
-
email: user?.email
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
handlePromiseRejection(event) {
|
|
179
|
-
const error = event.reason;
|
|
180
|
-
this.logToSentry(error);
|
|
181
|
-
this.logToConsole(error);
|
|
182
|
-
}
|
|
183
|
-
handleError(incomingError) {
|
|
184
|
-
// in case of 401, return no exception
|
|
185
|
-
if (incomingError instanceof HttpErrorResponse) {
|
|
186
|
-
if (incomingError.status === StatusCodes.UNAUTHORIZED ||
|
|
187
|
-
incomingError.status === StatusCodes.FORBIDDEN) {
|
|
188
|
-
// Handle 401 error (e.g., redirect to login page)
|
|
189
|
-
console.error('Unauthorized request:', incomingError);
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
if (incomingError.status === StatusCodes.UNPROCESSABLE_ENTITY) {
|
|
193
|
-
// Handle 422 error
|
|
194
|
-
console.error('UNPROCESSABLE_ENTITY request:', incomingError);
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
if (incomingError.status === 433) {
|
|
198
|
-
// Handle 433 error
|
|
199
|
-
console.error('over message quota:', incomingError);
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
this.handleExceptionError(incomingError);
|
|
204
|
-
}
|
|
205
|
-
handleExceptionError(incomingError) {
|
|
206
|
-
if (incomingError) {
|
|
207
|
-
let error = incomingError; // The actual error to log
|
|
208
|
-
while ('originalError' in error && error.originalError instanceof Error) {
|
|
209
|
-
this.logToConsole(error);
|
|
210
|
-
error = error.originalError;
|
|
211
|
-
}
|
|
212
|
-
this.extractOriginalError(error, incomingError);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
extractOriginalError(error, incomingError) {
|
|
216
|
-
// Exclude specific errors
|
|
217
|
-
if (error instanceof HttpErrorResponse) {
|
|
218
|
-
if (error.status === StatusCodes.NOT_FOUND) {
|
|
219
|
-
console.warn('Excluded 404 error:', error);
|
|
220
|
-
return; // Skip logging to Sentry
|
|
221
|
-
}
|
|
222
|
-
if (error.status === 0 && error.statusText === 'Unknown Error') {
|
|
223
|
-
// Handle network-related errors differently or suppress them
|
|
224
|
-
console.warn('Network-related error:', error);
|
|
225
|
-
return; // Don't rethrow the error
|
|
226
|
-
}
|
|
227
|
-
const message = this.getErrorMessage(error);
|
|
228
|
-
error = new Error(`Got HttpErrorResponse on URL ${error.url} message: ${message}`);
|
|
229
|
-
}
|
|
230
|
-
this.handleNonHttpErrorResponse(error);
|
|
231
|
-
// Ensure all errors have a proper message
|
|
232
|
-
this.errorMessageFormatter(error);
|
|
233
|
-
// Existing Sentry initialization logic
|
|
234
|
-
this.sentryInitialization(error, incomingError);
|
|
235
|
-
}
|
|
236
|
-
getErrorMessage(error) {
|
|
237
|
-
let { message } = error;
|
|
238
|
-
if (!message) {
|
|
239
|
-
try {
|
|
240
|
-
message = JSON.stringify(error);
|
|
241
|
-
}
|
|
242
|
-
catch (e) {
|
|
243
|
-
message =
|
|
244
|
-
typeof error === 'object' && error !== null
|
|
245
|
-
? JSON.stringify(error)
|
|
246
|
-
: error.toString();
|
|
247
|
-
console.log(e);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
return message;
|
|
251
|
-
}
|
|
252
|
-
handleNonHttpErrorResponse(error) {
|
|
253
|
-
if (typeof error === 'object' && 'message' in error) {
|
|
254
|
-
if (error instanceof HttpErrorResponse) {
|
|
255
|
-
if (error.status !== StatusCodes.UNAUTHORIZED) {
|
|
256
|
-
error = new Error(`Object captured as exception: ${error}`); // NOSONAR
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
// Exclude reporting 401 errors
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
errorMessageFormatter(error) {
|
|
263
|
-
if (!(error instanceof Error) || !error.message) {
|
|
264
|
-
const defaultMessage = 'Captured an unlabeled event';
|
|
265
|
-
if (error && 'isTrusted' in error) {
|
|
266
|
-
console.warn('Ignored isTrusted browser event:', error);
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const errorDetails = error ? JSON.stringify(error) : 'No more additional error info';
|
|
270
|
-
const enhancedErrorMessage = `${defaultMessage} | Original error detail: ${errorDetails}`;
|
|
271
|
-
error = new Error(enhancedErrorMessage); // NOSONAR
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
sentryInitialization(error, incomingError) {
|
|
275
|
-
if (!SentryErrorHandler.sentryInitialized) {
|
|
276
|
-
this.initializeSentryAsync()
|
|
277
|
-
.then(() => {
|
|
278
|
-
this.logToSentry(error);
|
|
279
|
-
throw incomingError;
|
|
280
|
-
})
|
|
281
|
-
.catch(err => {
|
|
282
|
-
console.error('Error initializing Sentry:', err);
|
|
283
|
-
this.logToConsole(error);
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
this.logToSentry(error);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
logToSentry(error) {
|
|
291
|
-
try {
|
|
292
|
-
const user = SentryErrorHandler.user;
|
|
293
|
-
this.scopeWithSentry(error, user);
|
|
294
|
-
}
|
|
295
|
-
catch (e) {
|
|
296
|
-
console.error('Unable to log the error to Sentry. An exception occurred:');
|
|
297
|
-
console.error(e);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
scopeWithSentry(error, user) {
|
|
301
|
-
withScope(scope => {
|
|
302
|
-
// Appends user details for sentry log
|
|
303
|
-
scope.setUser({
|
|
304
|
-
...user
|
|
305
|
-
});
|
|
306
|
-
// Ensure error is properly formatted
|
|
307
|
-
if (error instanceof Error && error.message) {
|
|
308
|
-
captureException(error);
|
|
309
|
-
}
|
|
310
|
-
else if (typeof error === 'object' && error !== null) {
|
|
311
|
-
this.handleNonStandardError(error);
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
this.handleUnlabeledEvent(error);
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
}
|
|
318
|
-
handleNonStandardError(error) {
|
|
319
|
-
if ('isTrusted' in error) {
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
// If it's an object but not a standard Error, attempt to log its properties safely
|
|
323
|
-
let errorMessage = 'Captured non-standard error with no message'; // NOSONAR
|
|
324
|
-
// Try to extract any message-like property safely
|
|
325
|
-
if ('message' in error) {
|
|
326
|
-
let messageText = '';
|
|
327
|
-
if (typeof error.message === 'object' && error.message !== null) {
|
|
328
|
-
messageText = JSON.stringify(error.message);
|
|
329
|
-
}
|
|
330
|
-
else if (typeof error.message === 'string') {
|
|
331
|
-
messageText = error.message;
|
|
332
|
-
}
|
|
333
|
-
errorMessage = `Error message: ${messageText}`;
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
// Attempt to capture key properties safely
|
|
337
|
-
try {
|
|
338
|
-
errorMessage = `Captured non-standard error: ${JSON.stringify(error, Object.getOwnPropertyNames(error))}`;
|
|
339
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
340
|
-
}
|
|
341
|
-
catch (jsonError) {
|
|
342
|
-
errorMessage = `Captured non-standard error with serialization issue: ${jsonError.message}`;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
// Create a new Error object with the enhanced message
|
|
346
|
-
const errorObject = new Error(errorMessage);
|
|
347
|
-
captureException(errorObject);
|
|
348
|
-
}
|
|
349
|
-
handleUnlabeledEvent(error) {
|
|
350
|
-
const defaultMessage = 'Captured an unlabeled event';
|
|
351
|
-
if (error && 'isTrusted' in error) {
|
|
352
|
-
console.warn('Ignored isTrusted browser event:', error);
|
|
353
|
-
return;
|
|
354
|
-
}
|
|
355
|
-
const errorDetails = error ? JSON.stringify(error) : 'No additional error info';
|
|
356
|
-
const enhancedErrorMessage = `${defaultMessage} | Original error details: ${errorDetails}`;
|
|
357
|
-
const enhancedError = new Error(enhancedErrorMessage);
|
|
358
|
-
captureException(enhancedError);
|
|
359
|
-
}
|
|
360
|
-
logToConsole(error) {
|
|
361
|
-
// Attempt to print in the console
|
|
362
|
-
try {
|
|
363
|
-
// We use StackTrace to try getting a good stacktrace. If it fails, just print the error
|
|
364
|
-
const message = error.message ? error.message : error.toString();
|
|
365
|
-
const url = window.location.href;
|
|
366
|
-
fromError(error instanceof Error ? error : new Error('Non-Error Object')).then(stackFrames => {
|
|
367
|
-
const stackString = stackFrames.splice(0, 20).map(sf => sf.toString());
|
|
368
|
-
console.error({ message, url, stack: stackString, error });
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
catch (e) {
|
|
372
|
-
console.error(error, e);
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SentryErrorHandler, deps: [{ token: i1.AppConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
376
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SentryErrorHandler, providedIn: 'root' }); }
|
|
377
|
-
}
|
|
378
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SentryErrorHandler, decorators: [{
|
|
379
|
-
type: Injectable,
|
|
380
|
-
args: [{
|
|
381
|
-
providedIn: 'root'
|
|
382
|
-
}]
|
|
383
|
-
}], ctorParameters: () => [{ type: i1.AppConfigService }] });
|
|
384
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudHJ5LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi1zZXJ2aWNlcy9zcmMvbGliL3NlbnRyeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBZ0IsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXpELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBR2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE9BQU8sRUFFSCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixJQUFJLEVBQ0osc0JBQXNCLEVBQ3RCLFNBQVMsRUFDWixNQUFNLHFCQUFxQixDQUFDOzs7QUFLN0IsTUFBTSxPQUFPLGtCQUFrQjthQUVaLHNCQUFpQixHQUFHLEtBQUssQUFBUixDQUFTO0lBRXpDLFlBQTZCLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQUcsQ0FBQztJQUUzRCxLQUFLLENBQUMscUJBQXFCO1FBQy9CLElBQUksa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUN2Qyx3REFBd0Q7WUFDeEQsT0FBTztRQUNYLENBQUM7UUFDRCxrQkFBa0IsRUFBRSxDQUFDO1FBRXJCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDN0MsSUFBSSxHQUFHLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsRUFBRSxHQUFHLE1B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QUUsQ0FBQyxDQUFDO2dCQUV2RSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDL0QsQ0FBQyxDQUNKLENBQUM7UUFDTixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDTCxDQUFDOytHQTdhUSxrQkFBa0I7bUhBQWxCLGtCQUFrQixjQUZmLE1BQU07OzRGQUVULGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEVycm9ySGFuZGxlciwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBcHBDb25maWdTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1jb25maWctc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuXG5pbXBvcnQgeyBTdGF0dXNDb2RlcyB9IGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcbmltcG9ydCB7IGZyb21FcnJvciB9IGZyb20gJ3N0YWNrdHJhY2UtanMnO1xuXG5pbXBvcnQge1xuICAgIEJyb3dzZXJPcHRpb25zLFxuICAgIEJyb3dzZXJUcmFjaW5nLFxuICAgIGNhcHR1cmVFeGNlcHRpb24sXG4gICAgY3JlYXRlRXJyb3JIYW5kbGVyLFxuICAgIGluaXQsXG4gICAgcm91dGluZ0luc3RydW1lbnRhdGlvbixcbiAgICB3aXRoU2NvcGVcbn0gZnJvbSAnQHNlbnRyeS9hbmd1bGFyLWl2eSc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2VudHJ5RXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHtcbiAgICBwcml2YXRlIHN0YXRpYyB1c2VyOiBQYXJ0aWFsPFVzZXI+O1xuICAgIHByaXZhdGUgc3RhdGljIHNlbnRyeUluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGFwcENvbmZpZ1NlcnZpY2U6IEFwcENvbmZpZ1NlcnZpY2UpIHt9XG5cbiAgICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVTZW50cnlBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKFNlbnRyeUVycm9ySGFuZGxlci5zZW50cnlJbml0aWFsaXplZCkge1xuICAgICAgICAgICAgLy8gU2VudHJ5IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQsIG5vIG5lZWQgdG8gZG8gaXQgYWdhaW5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjcmVhdGVFcnJvckhhbmRsZXIoKTtcblxuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmdldFNlbnRyeUNvbmZpZ0FzeW5jKCk7XG5cbiAgICAgICAgdGhpcy5hcHBDb25maWdTZXJ2aWNlLmFwcENvbmZpZyQuc3Vic2NyaWJlKGVudiA9PiB7XG4gICAgICAgICAgICBpZiAoZW52Py5pbnRlZ3JhdGlvbnM/LnNlbnRyeV9jb25maWcpIHtcbiAgICAgICAgICAgICAgICBpbml0KHsgLi4uY29uZmlnLCAuLi5lbnYuaW50ZWdyYXRpb25zLnNlbnRyeV9jb25maWcgfSk7XG4gICAgICAgICAgICAgICAgU2VudHJ5RXJyb3JIYW5kbGVyLnNlbnRyeUluaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBhIGdsb2JhbCBsaXN0ZW5lciBmb3IgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uc1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmhhbmRsZWRyZWplY3Rpb24nLCAoZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVByb21pc2VSZWplY3Rpb24oZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQWRkIGEgZ2xvYmFsIGxpc3RlbmVyIGZvciB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb25zXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1bmhhbmRsZWRyZWplY3Rpb24nLCAoZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVQcm9taXNlUmVqZWN0aW9uKGV2ZW50KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRTZW50cnlDb25maWdBc3luYygpOiBQcm9taXNlPEJyb3dzZXJPcHRpb25zPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVudmlyb25tZW50ID1cbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaG9zdD8uaW5jbHVkZXMoJ2RldicpIHx8IHdpbmRvdy5sb2NhdGlvbi5ob3N0Py5pbmNsdWRlcygnbG9jYWxob3N0JylcbiAgICAgICAgICAgICAgICAgICAgPyAnZGV2ZWxvcG1lbnQnXG4gICAgICAgICAgICAgICAgICAgIDogJ3Byb2R1Y3Rpb24nO1xuXG4gICAgICAgICAgICBjb25zdCBpZ25vcmVkUGF0aHMgPSBbJyddO1xuICAgICAgICAgICAgY29uc3QgaGVhbHRoQ2hlY2tQYXRocyA9IFsnL3BpbmcnXTtcbiAgICAgICAgICAgIGNvbnN0IG9uZVBlcmNlbnRJZ25vcmVkUGF0aHMgPSBbJyddO1xuICAgICAgICAgICAgY29uc3QgZml2ZVBlcmNlbnRJZ25vcmVkUGF0aHMgPSBbJyddO1xuXG4gICAgICAgICAgICBjb25zdCBjb25maWc6IEJyb3dzZXJPcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIGRzbjogbnVsbCxcbiAgICAgICAgICAgICAgICB0cmFjZXNTYW1wbGVSYXRlOiAwLjEsXG4gICAgICAgICAgICAgICAgLy8gRGlzYWJsZSB1bnVzZWQgZmVhdHVyZXMgdG8gcmVkdWNlIGJ1bmRsZSBzaXplXG4gICAgICAgICAgICAgICAgZW5hYmxlVHJhY2luZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgYmVmb3JlU2VuZChldmVudCwgaGludCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgaXMgb2YgdHlwZSBDbG9zZUV2ZW50IGFuZCBpZ25vcmUgaXRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50Py5leGNlcHRpb24/LnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMuZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvbmRpdGlvbiBiYXNlZCBvbiB0aGUgYWN0dWFsIHN0cnVjdHVyZSBvZiB0aGUgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudHlwZSA9PT0gJ0Nsb3NlRXZlbnQnIHx8IHZhbHVlLnZhbHVlLmluY2x1ZGVzKCdDbG9zZUV2ZW50JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQ/LmV4Y2VwdGlvbj8udmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5leGNlcHRpb24udmFsdWVzID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcy5maWx0ZXIodmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciB0aGUgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSBhbmQgaWdub3JlIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnR5cGUgPT09ICdFcnJvcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWUuaW5jbHVkZXMoJ1Jlc2l6ZU9ic2VydmVyIGxvb3AgY29tcGxldGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBvcmlnaW5hdGVzIGZyb20gdmVuZG9yLmpzIGZpbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50Py5leGNlcHRpb24/LnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNKc29uUGFyc2luZ0Vycm9yID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcy5zb21lKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50eXBlID09PSAnU3ludGF4RXJyb3InICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPy52YWx1ZT8uaW5jbHVkZXMoXCJleHBlY3RlZCAnOicgYWZ0ZXIgcHJvcGVydHkgbmFtZSBpblwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSnNvblBhcnNpbmdFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50IGlzIGEgQ2h1bmtMb2FkRXJyb3IgYW5kIGlnbm9yZSBpdCAoaXQgY291bGQgYmUgYmVjYXVzZSBvZiBwb29yIG5ldHdvcmspXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudD8uZXhjZXB0aW9uPy52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBldmVudC5leGNlcHRpb24udmFsdWVzLmZpbHRlcih2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnR5cGUgPT09ICdDaHVua0xvYWRFcnJvcicgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWUuaW5jbHVkZXMoJ0NodW5rTG9hZEVycm9yOiBMb2FkaW5nIGNodW5rJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgaXMgYSBzY3JpcHQgbG9hZGluZyBlcnJvciBhbmQgaWdub3JlIGl0XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudD8uZXhjZXB0aW9uPy52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMgPSBldmVudC5leGNlcHRpb24udmFsdWVzLmZpbHRlcih2YWx1ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLnR5cGUgPT09ICdFcnJvcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudmFsdWUuaW5jbHVkZXMoJ0NvdWxkIG5vdCBsb2FkIFwidXRpbFwiJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgaXMgYSB0aW1lb3V0IGVycm9yIGFuZCBpZ25vcmUgaXRcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50Py5leGNlcHRpb24/LnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMuZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudHlwZSA9PT0gJ0Vycm9yJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS52YWx1ZS5pbmNsdWRlcygnRXJyb3IgbG9hZGluZyBwbG90bHkuanMgbGlicmFyeSBmcm9tJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgaXMgcmVsYXRlZCB0byBjcm9zcy1vcmlnaW4gZnJhbWUgYWNjZXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudD8uZXhjZXB0aW9uPy52YWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3Jvc3NPcmlnaW5GcmFtZUVycm9yID0gZXZlbnQuZXhjZXB0aW9uLnZhbHVlcy5zb21lKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50eXBlID09PSAnU2VjdXJpdHlFcnJvcicgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU/LnZhbHVlPy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRmFpbGVkIHRvIHJlYWQgYSBuYW1lZCBwcm9wZXJ0eSAnbmF2aWdhdG9yJyBmcm9tICdXaW5kb3cnOiBCbG9ja2VkIGEgZnJhbWUgd2l0aCBvcmlnaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDcm9zc09yaWdpbkZyYW1lRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIGNyb3NzLW9yaWdpbiBmcmFtZSBlcnJvcnMgZnJvbSBiZWluZyByZXBvcnRlZCB0byBTZW50cnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBldmVudCBoYXMgYW4gZXhjZXB0aW9uIGFuZCB2YWx1ZXMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50Py5leGNlcHRpb24/LnZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCBldmVudHMgZ2VuZXJhdGVkIGJ5IFRyeUNhdGNoIGFuZCBHbG9iYWxIYW5kbGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZXhjZXB0aW9uLnZhbHVlcyA9IGV2ZW50LmV4Y2VwdGlvbi52YWx1ZXMuZmlsdGVyKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWNoYW5pc20gPSB2YWx1ZS5tZWNoYW5pc207XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVjaGFuaXNtLnR5cGUgPT09ICdUcnlDYXRjaCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbS50eXBlID09PSAnR2xvYmFsSGFuZGxlcnMnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBub24tZXJyb3IgZXhjZXB0aW9uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzTm9uRXJyb3JFeGNlcHRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ/LmV4Y2VwdGlvbj8udmFsdWVzPy5bMF0/LnZhbHVlPy5zdGFydHNXaXRoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdOb24tRXJyb3IgZXhjZXB0aW9uIGNhcHR1cmVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSA/P1xuICAgICAgICAgICAgICAgICAgICAgICAgKGhpbnQ/Lm9yaWdpbmFsRXhjZXB0aW9uIGFzIEVycm9yKT8ubWVzc2FnZT8uc3RhcnRzV2l0aChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTm9uLUVycm9yIGV4Y2VwdGlvbiBjYXB0dXJlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm9uRXJyb3JFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gaWdub3JlIHRob3NlIGtpbmRzIG9mIGVycm9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZW55VXJsczogWy9kcmlmdC4qXFwuanMvaSwgL2FuYWx5dGljcy4qXFwuanMvaSwgL3BvbHlmaWxscy4qXFwuanMvaSwgL3ZlbmRvci4qXFwuanMvaV0sXG4gICAgICAgICAgICAgICAgaW50ZWdyYXRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVycyBhbmQgY29uZmlndXJlcyB0aGUgVHJhY2luZyBpbnRlZ3JhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYXV0b21hdGljYWxseSBpbnN0cnVtZW50cyB5b3VyIGFwcGxpY2F0aW9uIHRvIG1vbml0b3IgaXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm1hbmNlLCBpbmNsdWRpbmcgY3VzdG9tIEFuZ3VsYXIgcm91dGluZyBpbnN0cnVtZW50YXRpb25cbiAgICAgICAgICAgICAgICAgICAgbmV3IEJyb3dzZXJUcmFjaW5nKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdJbnN0cnVtZW50YXRpb246IHJvdXRpbmdJbnN0cnVtZW50YXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIHRyYWNlc1NhbXBsZXI6IHNhbXBsaW5nQ29udGV4dCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4YW1pbmUgcHJvdmlkZWQgY29udGV4dCBkYXRhIChpbmNsdWRpbmcgcGFyZW50IGRlY2lzaW9uLCBpZiBhbnkpIGFsb25nXG4gICAgICAgICAgICAgICAgICAgIC8vIHdpdGggYW55dGhpbmcgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gY29tcHV0ZSB0aGUgc2FtcGxlIHJhdGUgb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gc2FtcGxpbmcgZGVjaXNpb24gZm9yIHRoaXMgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aG5hbWUgPSBzYW1wbGluZ0NvbnRleHQubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVkUGF0aHMuaW5jbHVkZXMocGF0aG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoZWFsdGhDaGVja1BhdGhzLmluY2x1ZGVzKHBhdGhuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyeSBsb3cgcmF0ZSBhcyB0aGVzZSBhcmUgZXh0cmVtZWx5IGZyZXF1ZW50IGFuZCBwcmV0dHkgdXNlbGVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAuMDAxO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9uZVBlcmNlbnRJZ25vcmVkUGF0aHMuaW5jbHVkZXMocGF0aG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMC4wMTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaXZlUGVyY2VudElnbm9yZWRQYXRocy5pbmNsdWRlcyhwYXRobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwLjA1O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGVmYXVsdCBzYW1wbGUgcmF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAuMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW52aXJvbm1lbnQsXG5cbiAgICAgICAgICAgICAgICAvLyBXZSBpZ25vcmUgU2VydmVyIEVycm9ycy4gV2UgaGF2ZSB0byBkZWZpbmUgaGVyZSBzaW5jZSBBbmd1bGFyXG4gICAgICAgICAgICAgICAgLy8gaHR0cCBjbGllbnQgdXNlcyBzZXRUaW1lb3V0IHRvIGRldGVjdCBodHRwIGNhbGwgcHJvZ3Jlc3MuXG4gICAgICAgICAgICAgICAgLy8gQW5kIHdoZW4gdGhlIGNhbGwgZmFpbHMsIGl0IHRocm93cyBhbiBleGNlcHRpb24gaW5zaWRlIHRoYXQgdGltZW91dFxuICAgICAgICAgICAgICAgIC8vIHRoYXQgYnViYmxlcyB1cCBoaWdoZXIgdG8gdGhlIG1haW4gQW5ndWxhcidzIGVycm9yIGhhbmRsZXIuXG4gICAgICAgICAgICAgICAgaWdub3JlRXJyb3JzOiBbXG4gICAgICAgICAgICAgICAgICAgICd0b3AuR0xPQkFMUycsXG4gICAgICAgICAgICAgICAgICAgICdSZXNpemVPYnNlcnZlciBsb29wIGNvbXBsZXRlZCB3aXRoIHVuZGVsaXZlcmVkIG5vdGlmaWNhdGlvbnMnXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlc29sdmUoY29uZmlnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGluaXRpYWxpemVVc2VyKHVzZXI6IFBhcnRpYWw8VXNlcj4pIHtcbiAgICAgICAgU2VudHJ5RXJyb3JIYW5kbGVyLnVzZXIgPSB7XG4gICAgICAgICAgICBpZDogdXNlcj8uaWQsXG4gICAgICAgICAgICBuYW1lOiB1c2VyPy5maXJzdF9uYW1lLFxuICAgICAgICAgICAgZW1haWw6IHVzZXI/LmVtYWlsXG4gICAgICAgIH0gYXMgUGFydGlhbDxVc2VyPjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhbmRsZVByb21pc2VSZWplY3Rpb24oZXZlbnQ6IFByb21pc2VSZWplY3Rpb25FdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlcnJvciA9IGV2ZW50LnJlYXNvbjtcbiAgICAgICAgdGhpcy5sb2dUb1NlbnRyeShlcnJvcik7XG4gICAgICAgIHRoaXMubG9nVG9Db25zb2xlKGVycm9yKTtcbiAgICB9XG5cbiAgICBoYW5kbGVFcnJvcihpbmNvbWluZ0Vycm9yOiBIdHRwRXJyb3JSZXNwb25zZSB8IEVycm9yKSB7XG4gICAgICAgIC8vIGluIGNhc2Ugb2YgNDAxLCByZXR1cm4gbm8gZXhjZXB0aW9uXG4gICAgICAgIGlmIChpbmNvbWluZ0Vycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBpbmNvbWluZ0Vycm9yLnN0YXR1cyA9PT0gU3RhdHVzQ29kZXMuVU5BVVRIT1JJWkVEIHx8XG4gICAgICAgICAgICAgICAgaW5jb21pbmdFcnJvci5zdGF0dXMgPT09IFN0YXR1c0NvZGVzLkZPUkJJRERFTlxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIDQwMSBlcnJvciAoZS5nLiwgcmVkaXJlY3QgdG8gbG9naW4gcGFnZSlcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmF1dGhvcml6ZWQgcmVxdWVzdDonLCBpbmNvbWluZ0Vycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbmNvbWluZ0Vycm9yLnN0YXR1cyA9PT0gU3RhdHVzQ29kZXMuVU5QUk9DRVNTQUJMRV9FTlRJVFkpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgNDIyIGVycm9yXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVU5QUk9DRVNTQUJMRV9FTlRJVFkgcmVxdWVzdDonLCBpbmNvbWluZ0Vycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbmNvbWluZ0Vycm9yLnN0YXR1cyA9PT0gNDMzKSB7XG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIDQzMyBlcnJvclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ292ZXIgbWVzc2FnZSBxdW90YTonLCBpbmNvbWluZ0Vycm9yKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVFeGNlcHRpb25FcnJvcihpbmNvbWluZ0Vycm9yKTtcbiAgICB9XG5cbiAgICBoYW5kbGVFeGNlcHRpb25FcnJvcihpbmNvbWluZ0Vycm9yKSB7XG4gICAgICAgIGlmIChpbmNvbWluZ0Vycm9yKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3IgPSBpbmNvbWluZ0Vycm9yOyAvLyBUaGUgYWN0dWFsIGVycm9yIHRvIGxvZ1xuICAgICAgICAgICAgd2hpbGUgKCdvcmlnaW5hbEVycm9yJyBpbiBlcnJvciAmJiBlcnJvci5vcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ1RvQ29uc29sZShlcnJvcik7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvci5vcmlnaW5hbEVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5leHRyYWN0T3JpZ2luYWxFcnJvcihlcnJvciwgaW5jb21pbmdFcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleHRyYWN0T3JpZ2luYWxFcnJvcihlcnJvciwgaW5jb21pbmdFcnJvcikge1xuICAgICAgICAvLyBFeGNsdWRlIHNwZWNpZmljIGVycm9yc1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gU3RhdHVzQ29kZXMuTk9UX0ZPVU5EKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdFeGNsdWRlZCA0MDQgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU2tpcCBsb2dnaW5nIHRvIFNlbnRyeVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PT0gMCAmJiBlcnJvci5zdGF0dXNUZXh0ID09PSAnVW5rbm93biBFcnJvcicpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbmV0d29yay1yZWxhdGVkIGVycm9ycyBkaWZmZXJlbnRseSBvciBzdXBwcmVzcyB0aGVtXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdOZXR3b3JrLXJlbGF0ZWQgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gRG9uJ3QgcmV0aHJvdyB0aGUgZXJyb3JcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvcik7XG4gICAgICAgICAgICBlcnJvciA9IG5ldyBFcnJvcihgR290IEh0dHBFcnJvclJlc3BvbnNlIG9uIFVSTCAke2Vycm9yLnVybH0gbWVzc2FnZTogJHttZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYW5kbGVOb25IdHRwRXJyb3JSZXNwb25zZShlcnJvcik7XG5cbiAgICAgICAgLy8gRW5zdXJlIGFsbCBlcnJvcnMgaGF2ZSBhIHByb3BlciBtZXNzYWdlXG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlRm9ybWF0dGVyKGVycm9yKTtcblxuICAgICAgICAvLyBFeGlzdGluZyBTZW50cnkgaW5pdGlhbGl6YXRpb24gbG9naWNcbiAgICAgICAgdGhpcy5zZW50cnlJbml0aWFsaXphdGlvbihlcnJvciwgaW5jb21pbmdFcnJvcik7XG4gICAgfVxuXG4gICAgZ2V0RXJyb3JNZXNzYWdlKGVycm9yKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHsgbWVzc2FnZSB9ID0gZXJyb3I7XG4gICAgICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZXJyb3IpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPVxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmIGVycm9yICE9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBlcnJvci50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cblxuICAgIGhhbmRsZU5vbkh0dHBFcnJvclJlc3BvbnNlKGVycm9yKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnICYmICdtZXNzYWdlJyBpbiBlcnJvcikge1xuICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzICE9PSBTdGF0dXNDb2Rlcy5VTkFVVEhPUklaRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgRXJyb3IoYE9iamVjdCBjYXB0dXJlZCBhcyBleGNlcHRpb246ICR7ZXJyb3J9YCk7IC8vIE5PU09OQVJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBFeGNsdWRlIHJlcG9ydGluZyA0MDEgZXJyb3JzXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlcnJvck1lc3NhZ2VGb3JtYXR0ZXIoZXJyb3IpIHtcbiAgICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgfHwgIWVycm9yLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRNZXNzYWdlID0gJ0NhcHR1cmVkIGFuIHVubGFiZWxlZCBldmVudCc7XG5cbiAgICAgICAgICAgIGlmIChlcnJvciAmJiAnaXNUcnVzdGVkJyBpbiBlcnJvcikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignSWdub3JlZCBpc1RydXN0ZWQgYnJvd3NlciBldmVudDonLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlcnJvckRldGFpbHMgPSBlcnJvciA/IEpTT04uc3RyaW5naWZ5KGVycm9yKSA6ICdObyBtb3JlIGFkZGl0aW9uYWwgZXJyb3IgaW5mbyc7XG4gICAgICAgICAgICBjb25zdCBlbmhhbmNlZEVycm9yTWVzc2FnZSA9IGAke2RlZmF1bHRNZXNzYWdlfSB8IE9yaWdpbmFsIGVycm9yIGRldGFpbDogJHtlcnJvckRldGFpbHN9YDtcbiAgICAgICAgICAgIGVycm9yID0gbmV3IEVycm9yKGVuaGFuY2VkRXJyb3JNZXNzYWdlKTsgLy8gTk9TT05BUlxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VudHJ5SW5pdGlhbGl6YXRpb24oZXJyb3IsIGluY29taW5nRXJyb3IpIHtcbiAgICAgICAgaWYgKCFTZW50cnlFcnJvckhhbmRsZXIuc2VudHJ5SW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZVNlbnRyeUFzeW5jKClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9nVG9TZW50cnkoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBpbmNvbWluZ0Vycm9yO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluaXRpYWxpemluZyBTZW50cnk6JywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2dUb0NvbnNvbGUoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dUb1NlbnRyeShlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGxvZ1RvU2VudHJ5KGVycm9yOiBFcnJvcikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IFNlbnRyeUVycm9ySGFuZGxlci51c2VyIGFzIEVycm9yO1xuICAgICAgICAgICAgdGhpcy5zY29wZVdpdGhTZW50cnkoZXJyb3IsIHVzZXIpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gbG9nIHRoZSBlcnJvciB0byBTZW50cnkuIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZDonKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNjb3BlV2l0aFNlbnRyeShlcnJvciwgdXNlcikge1xuICAgICAgICB3aXRoU2NvcGUoc2NvcGUgPT4ge1xuICAgICAgICAgICAgLy8gQXBwZW5kcyB1c2VyIGRldGFpbHMgZm9yIHNlbnRyeSBsb2dcbiAgICAgICAgICAgIHNjb3BlLnNldFVzZXIoe1xuICAgICAgICAgICAgICAgIC4uLnVzZXJcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBFbnN1cmUgZXJyb3IgaXMgcHJvcGVybHkgZm9ybWF0dGVkXG4gICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY2FwdHVyZUV4Y2VwdGlvbihlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU5vblN0YW5kYXJkRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVVubGFiZWxlZEV2ZW50KGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVOb25TdGFuZGFyZEVycm9yKGVycm9yOiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCdpc1RydXN0ZWQnIGluIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgaXQncyBhbiBvYmplY3QgYnV0IG5vdCBhIHN0YW5kYXJkIEVycm9yLCBhdHRlbXB0IHRvIGxvZyBpdHMgcHJvcGVydGllcyBzYWZlbHlcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9ICdDYXB0dXJlZCBub24tc3RhbmRhcmQgZXJyb3Igd2l0aCBubyBtZXNzYWdlJzsgLy8gTk9TT05BUlxuXG4gICAgICAgIC8vIFRyeSB0byBleHRyYWN0IGFueSBtZXNzYWdlLWxpa2UgcHJvcGVydHkgc2FmZWx5XG4gICAgICAgIGlmICgnbWVzc2FnZScgaW4gZXJyb3IpIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlVGV4dCA9ICcnO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09ICdvYmplY3QnICYmIGVycm9yLm1lc3NhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVGV4dCA9IEpTT04uc3RyaW5naWZ5KGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVGV4dCA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBFcnJvciBtZXNzYWdlOiAke21lc3NhZ2VUZXh0fWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGNhcHR1cmUga2V5IHByb3BlcnRpZXMgc2FmZWx5XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGBDYXB0dXJlZCBub24tc3RhbmRhcmQgZXJyb3I6ICR7SlNPTi5zdHJpbmdpZnkoZXJyb3IsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKSl9YDtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgfSBjYXRjaCAoanNvbkVycm9yOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBgQ2FwdHVyZWQgbm9uLXN0YW5kYXJkIGVycm9yIHdpdGggc2VyaWFsaXphdGlvbiBpc3N1ZTogJHtqc29uRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IEVycm9yIG9iamVjdCB3aXRoIHRoZSBlbmhhbmNlZCBtZXNzYWdlXG4gICAgICAgIGNvbnN0IGVycm9yT2JqZWN0ID0gbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIGNhcHR1cmVFeGNlcHRpb24oZXJyb3JPYmplY3QpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlVW5sYWJlbGVkRXZlbnQoZXJyb3IpIHtcbiAgICAgICAgY29uc3QgZGVmYXVsdE1lc3NhZ2UgPSAnQ2FwdHVyZWQgYW4gdW5sYWJlbGVkIGV2ZW50JztcblxuICAgICAgICBpZiAoZXJyb3IgJiYgJ2lzVHJ1c3RlZCcgaW4gZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignSWdub3JlZCBpc1RydXN0ZWQgYnJvd3NlciBldmVudDonLCBlcnJvcik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlcnJvckRldGFpbHMgPSBlcnJvciA/IEpTT04uc3RyaW5naWZ5KGVycm9yKSA6ICdObyBhZGRpdGlvbmFsIGVycm9yIGluZm8nO1xuICAgICAgICBjb25zdCBlbmhhbmNlZEVycm9yTWVzc2FnZSA9IGAke2RlZmF1bHRNZXNzYWdlfSB8IE9yaWdpbmFsIGVycm9yIGRldGFpbHM6ICR7ZXJyb3JEZXRhaWxzfWA7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkRXJyb3IgPSBuZXcgRXJyb3IoZW5oYW5jZWRFcnJvck1lc3NhZ2UpO1xuXG4gICAgICAgIGNhcHR1cmVFeGNlcHRpb24oZW5oYW5jZWRFcnJvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2dUb0NvbnNvbGUoZXJyb3I6IEVycm9yKSB7XG4gICAgICAgIC8vIEF0dGVtcHQgdG8gcHJpbnQgaW4gdGhlIGNvbnNvbGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdlIHVzZSBTdGFja1RyYWNlIHRvIHRyeSBnZXR0aW5nIGEgZ29vZCBzdGFja3RyYWNlLiBJZiBpdCBmYWlscywganVzdCBwcmludCB0aGUgZXJyb3JcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6IGVycm9yLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICAgICAgICAgIGZyb21FcnJvcihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoJ05vbi1FcnJvciBPYmplY3QnKSkudGhlbihcbiAgICAgICAgICAgICAgICBzdGFja0ZyYW1lcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrU3RyaW5nID0gc3RhY2tGcmFtZXMuc3BsaWNlKDAsIDIwKS5tYXAoc2YgPT4gc2YudG9TdHJpbmcoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcih7IG1lc3NhZ2UsIHVybCwgc3RhY2s6IHN0YWNrU3RyaW5nLCBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLCBlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { Meta, Title } from '@angular/platform-browser';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/platform-browser";
|
|
5
|
-
export class SeoService {
|
|
6
|
-
constructor(meta, titleService) {
|
|
7
|
-
this.meta = meta;
|
|
8
|
-
this.titleService = titleService;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Set SEO metadata for a page
|
|
12
|
-
* @param title - Page title
|
|
13
|
-
* @param description - Meta description
|
|
14
|
-
* @param keywords - Meta keywords (optional)
|
|
15
|
-
*/
|
|
16
|
-
setSEO(title, description, keywords) {
|
|
17
|
-
// Set page title
|
|
18
|
-
this.titleService.setTitle(title);
|
|
19
|
-
// Set meta description
|
|
20
|
-
this.meta.updateTag({ name: 'description', content: description });
|
|
21
|
-
// Set keywords if provided
|
|
22
|
-
if (keywords) {
|
|
23
|
-
this.meta.updateTag({ name: 'keywords', content: keywords });
|
|
24
|
-
}
|
|
25
|
-
// Set Open Graph tags
|
|
26
|
-
this.meta.updateTag({ property: 'og:title', content: title });
|
|
27
|
-
this.meta.updateTag({ property: 'og:description', content: description });
|
|
28
|
-
this.meta.updateTag({ property: 'og:type', content: 'website' });
|
|
29
|
-
// Set Twitter Card tags
|
|
30
|
-
this.meta.updateTag({ name: 'twitter:title', content: title });
|
|
31
|
-
this.meta.updateTag({ name: 'twitter:description', content: description });
|
|
32
|
-
this.meta.updateTag({ name: 'twitter:card', content: 'summary' });
|
|
33
|
-
}
|
|
34
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SeoService, deps: [{ token: i1.Meta }, { token: i1.Title }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
35
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SeoService, providedIn: 'root' }); }
|
|
36
|
-
}
|
|
37
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SeoService, decorators: [{
|
|
38
|
-
type: Injectable,
|
|
39
|
-
args: [{
|
|
40
|
-
providedIn: 'root'
|
|
41
|
-
}]
|
|
42
|
-
}], ctorParameters: () => [{ type: i1.Meta }, { type: i1.Title }] });
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi1zZXJ2aWNlcy9zcmMvbGliL3Nlby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7O0FBS3hELE1BQU0sT0FBTyxVQUFVO0lBQ25CLFlBQ3FCLElBQVUsRUFDVixZQUFtQjtRQURuQixTQUFJLEdBQUosSUFBSSxDQUFNO1FBQ1YsaUJBQVksR0FBWixZQUFZLENBQU87SUFDckMsQ0FBQztJQUVKOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLEtBQWEsRUFBRSxXQUFtQixFQUFFLFFBQWlCO1FBQ3hELGlCQUFpQjtRQUNqQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVsQyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRW5FLDJCQUEyQjtRQUMzQixJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxzQkFBc0I7UUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUVqRSx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDOytHQWpDUSxVQUFVO21IQUFWLFVBQVUsY0FGUCxNQUFNOzs0RkFFVCxVQUFVO2tCQUh0QixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1ldGEsIFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2VvU2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YTogTWV0YSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0aXRsZVNlcnZpY2U6IFRpdGxlXG4gICAgKSB7fVxuXG4gICAgLyoqXG4gICAgICogU2V0IFNFTyBtZXRhZGF0YSBmb3IgYSBwYWdlXG4gICAgICogQHBhcmFtIHRpdGxlIC0gUGFnZSB0aXRsZVxuICAgICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtIE1ldGEgZGVzY3JpcHRpb25cbiAgICAgKiBAcGFyYW0ga2V5d29yZHMgLSBNZXRhIGtleXdvcmRzIChvcHRpb25hbClcbiAgICAgKi9cbiAgICBzZXRTRU8odGl0bGU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZywga2V5d29yZHM/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gU2V0IHBhZ2UgdGl0bGVcbiAgICAgICAgdGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUodGl0bGUpO1xuXG4gICAgICAgIC8vIFNldCBtZXRhIGRlc2NyaXB0aW9uXG4gICAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcoeyBuYW1lOiAnZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjcmlwdGlvbiB9KTtcblxuICAgICAgICAvLyBTZXQga2V5d29yZHMgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKGtleXdvcmRzKSB7XG4gICAgICAgICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHsgbmFtZTogJ2tleXdvcmRzJywgY29udGVudDoga2V5d29yZHMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgT3BlbiBHcmFwaCB0YWdzXG4gICAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogJ29nOnRpdGxlJywgY29udGVudDogdGl0bGUgfSk7XG4gICAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogJ29nOmRlc2NyaXB0aW9uJywgY29udGVudDogZGVzY3JpcHRpb24gfSk7XG4gICAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcoeyBwcm9wZXJ0eTogJ29nOnR5cGUnLCBjb250ZW50OiAnd2Vic2l0ZScgfSk7XG5cbiAgICAgICAgLy8gU2V0IFR3aXR0ZXIgQ2FyZCB0YWdzXG4gICAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcoeyBuYW1lOiAndHdpdHRlcjp0aXRsZScsIGNvbnRlbnQ6IHRpdGxlIH0pO1xuICAgICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHsgbmFtZTogJ3R3aXR0ZXI6ZGVzY3JpcHRpb24nLCBjb250ZW50OiBkZXNjcmlwdGlvbiB9KTtcbiAgICAgICAgdGhpcy5tZXRhLnVwZGF0ZVRhZyh7IG5hbWU6ICd0d2l0dGVyOmNhcmQnLCBjb250ZW50OiAnc3VtbWFyeScgfSk7XG4gICAgfVxufVxuIl19
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { AppConfigService } from '@posiwise/app-config-service';
|
|
3
|
-
import { distinctUntilChanged } from 'rxjs/operators';
|
|
4
|
-
import { webSocket } from 'rxjs/webSocket';
|
|
5
|
-
import { AuthService } from './auth.service';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@posiwise/app-config-service";
|
|
8
|
-
import * as i2 from "./auth.service";
|
|
9
|
-
export class WebsocketService {
|
|
10
|
-
constructor(appConfigService, authService) {
|
|
11
|
-
this.appConfigService = appConfigService;
|
|
12
|
-
this.authService = authService;
|
|
13
|
-
this.appConfigService.appConfig$.subscribe(config => {
|
|
14
|
-
const socketLink = config['links'].socket_link;
|
|
15
|
-
const url = `${socketLink}/websockets/websocket?session_token=${btoa(this.authService.getToken())}`;
|
|
16
|
-
this.webSocketSubject = webSocket(url);
|
|
17
|
-
this.webSocket$ = this.webSocketSubject.asObservable().pipe(distinctUntilChanged());
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: WebsocketService, deps: [{ token: i1.AppConfigService }, { token: i2.AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
21
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: WebsocketService, providedIn: 'root' }); }
|
|
22
|
-
}
|
|
23
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: WebsocketService, decorators: [{
|
|
24
|
-
type: Injectable,
|
|
25
|
-
args: [{
|
|
26
|
-
providedIn: 'root'
|
|
27
|
-
}]
|
|
28
|
-
}], ctorParameters: () => [{ type: i1.AppConfigService }, { type: i2.AuthService }] });
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi1zZXJ2aWNlcy9zcmMvbGliL3NvY2tldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFHaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFLN0MsTUFBTSxPQUFPLGdCQUFnQjtJQU96QixZQUNxQixnQkFBa0MsRUFDbEMsV0FBd0I7UUFEeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUV6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDO1lBQy9DLE1BQU0sR0FBRyxHQUFHLEdBQUcsVUFBVSx1Q0FBdUMsSUFBSSxDQUNoRSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUM5QixFQUFFLENBQUM7WUFDSixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQW5CUSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQUZiLE1BQU07OzRGQUVULGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2UvYXBwLWNvbmZpZy1zZXJ2aWNlJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyB3ZWJTb2NrZXQsIFdlYlNvY2tldFN1YmplY3QgfSBmcm9tICdyeGpzL3dlYlNvY2tldCc7XG5cbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi9hdXRoLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJpdmF0ZSB3ZWJTb2NrZXRTdWJqZWN0OiBXZWJTb2NrZXRTdWJqZWN0PGFueT47XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHdlYlNvY2tldCQ6IE9ic2VydmFibGU8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFwcENvbmZpZ1NlcnZpY2U6IEFwcENvbmZpZ1NlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHRoaXMuYXBwQ29uZmlnU2VydmljZS5hcHBDb25maWckLnN1YnNjcmliZShjb25maWcgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ja2V0TGluayA9IGNvbmZpZ1snbGlua3MnXS5zb2NrZXRfbGluaztcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IGAke3NvY2tldExpbmt9L3dlYnNvY2tldHMvd2Vic29ja2V0P3Nlc3Npb25fdG9rZW49JHtidG9hKFxuICAgICAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UuZ2V0VG9rZW4oKVxuICAgICAgICAgICAgKX1gO1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXRTdWJqZWN0ID0gd2ViU29ja2V0KHVybCk7XG4gICAgICAgICAgICB0aGlzLndlYlNvY2tldCQgPSB0aGlzLndlYlNvY2tldFN1YmplY3QuYXNPYnNlcnZhYmxlKCkucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIl19
|