@posiwise/common-services 0.1.87 → 0.1.89

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.
Files changed (51) hide show
  1. package/fesm2022/posiwise-common-services.mjs +268 -226
  2. package/fesm2022/posiwise-common-services.mjs.map +1 -1
  3. package/lib/common-services.interface.d.ts +5 -0
  4. package/lib/user.service.d.ts +15 -1
  5. package/package.json +8 -10
  6. package/esm2022/index.mjs +0 -47
  7. package/esm2022/lib/ab-test.service.mjs +0 -55
  8. package/esm2022/lib/ahoy.service.mjs +0 -93
  9. package/esm2022/lib/auth.service.mjs +0 -322
  10. package/esm2022/lib/base-http.service.mjs +0 -98
  11. package/esm2022/lib/brain-api-http.service.mjs +0 -26
  12. package/esm2022/lib/brain.service.mjs +0 -21
  13. package/esm2022/lib/common-services.interface.mjs +0 -2
  14. package/esm2022/lib/common-services.module.mjs +0 -23
  15. package/esm2022/lib/common.service.mjs +0 -134
  16. package/esm2022/lib/custom-preloading.service.mjs +0 -38
  17. package/esm2022/lib/dashboard.service.mjs +0 -21
  18. package/esm2022/lib/data.service.mjs +0 -21
  19. package/esm2022/lib/date-formatter.service.mjs +0 -82
  20. package/esm2022/lib/effects/user.effects.mjs +0 -27
  21. package/esm2022/lib/form-helper.service.mjs +0 -27
  22. package/esm2022/lib/geo.service.mjs +0 -40
  23. package/esm2022/lib/google-analytics.service.mjs +0 -121
  24. package/esm2022/lib/group.service.mjs +0 -122
  25. package/esm2022/lib/hopscotch.service.mjs +0 -48
  26. package/esm2022/lib/integrations-api-http.service.mjs +0 -28
  27. package/esm2022/lib/link-loader.service.mjs +0 -50
  28. package/esm2022/lib/local-storage.service.mjs +0 -32
  29. package/esm2022/lib/logo-caching.service.mjs +0 -65
  30. package/esm2022/lib/mailbox.service.mjs +0 -66
  31. package/esm2022/lib/main-api-http.service.mjs +0 -26
  32. package/esm2022/lib/notification.service.mjs +0 -70
  33. package/esm2022/lib/number-picker.service.mjs +0 -43
  34. package/esm2022/lib/permission.service.mjs +0 -252
  35. package/esm2022/lib/primeNgHelper.mjs +0 -18
  36. package/esm2022/lib/product.service.mjs +0 -78
  37. package/esm2022/lib/profile.service.mjs +0 -64
  38. package/esm2022/lib/qualification.service.mjs +0 -29
  39. package/esm2022/lib/script-loader.service.mjs +0 -79
  40. package/esm2022/lib/secure-token-storage.service.mjs +0 -264
  41. package/esm2022/lib/sentry.service.mjs +0 -384
  42. package/esm2022/lib/seo.service.mjs +0 -43
  43. package/esm2022/lib/socket.service.mjs +0 -29
  44. package/esm2022/lib/subscription.service.mjs +0 -129
  45. package/esm2022/lib/tag.service.mjs +0 -101
  46. package/esm2022/lib/tips.service.mjs +0 -38
  47. package/esm2022/lib/toast.service.mjs +0 -85
  48. package/esm2022/lib/user.service.mjs +0 -115
  49. package/esm2022/lib/validation.service.mjs +0 -36
  50. package/esm2022/lib/window.service.mjs +0 -20
  51. 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