@c8y/ngx-components 1017.0.511 → 1017.0.514

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.
@@ -1,8 +1,7 @@
1
- import { DOCUMENT as Document } from '@angular/common';
2
- import { Inject, Injectable } from '@angular/core';
1
+ import { Injectable } from '@angular/core';
3
2
  import { TranslateService } from '@ngx-translate/core';
4
3
  import { camelCase, flatMap } from 'lodash-es';
5
- import { BehaviorSubject, combineLatest, fromEvent } from 'rxjs';
4
+ import { BehaviorSubject, Subject, combineLatest, fromEvent } from 'rxjs';
6
5
  import { delay, filter, map, take } from 'rxjs/operators';
7
6
  import { CookieBannerService } from '../bootstrap/cookie-banner/cookie-banner.service';
8
7
  import { OptionsService } from '../common/options.service';
@@ -19,8 +18,7 @@ import * as i5 from "@ngx-translate/core";
19
18
  * tag and
20
19
  */
21
20
  export class GainsightService {
22
- constructor(document, appState, options, cookieBannerService, userPreferencesService, translateService) {
23
- this.document = document;
21
+ constructor(appState, options, cookieBannerService, userPreferencesService, translateService) {
24
22
  this.appState = appState;
25
23
  this.options = options;
26
24
  this.cookieBannerService = cookieBannerService;
@@ -30,6 +28,11 @@ export class GainsightService {
30
28
  * A subject that emits the tag function as soon as a new tag is set.
31
29
  */
32
30
  this.tagFunction$ = new BehaviorSubject(null);
31
+ this.trackingLoaded$ = new Subject();
32
+ /**
33
+ * Gainsight is activated only when the cookie banner is present. If functional cookies are enabled, both personally identifiable information (PII) and required data are sent.
34
+ * Otherwise, only the required data is transmitted during the identity step execution.
35
+ */
33
36
  this.USER_PREFERENCES_GAINSIGHT_KEY = 'gainsightEnabled';
34
37
  /**
35
38
  * The name of the key remained unchanged, but applies to all engagements.
@@ -41,13 +44,21 @@ export class GainsightService {
41
44
  this.SCRIPT_EXECUTION_WAIT_TIME = 500;
42
45
  this.OPTIONS_KEY_CATEGORY = 'gainsight';
43
46
  this.OPTIONS_KEY_NAME = 'api.key';
44
- this.ENGAGEMENTS = 'engagements';
45
47
  this.isScriptLoaded = false;
46
48
  }
49
+ /**
50
+ * Checks if the specified Gainsight preference is disabled in user preferences.
51
+ * @param preferenceName - Name of the Gainsight preference.
52
+ * @returns A promise that resolves to `true` if the preference is disabled, otherwise `false`.
53
+ */
47
54
  async isGainsightPreferenceDisabledInUserPreferences(preferenceName) {
48
55
  const userGainsightPref = await this.userPreferencesService.get(preferenceName).toPromise();
49
56
  return userGainsightPref === false;
50
57
  }
58
+ /**
59
+ * Sets the state of the functional cookie.
60
+ * @param value - A boolean value to indicate whether the functional cookie should be enabled (`true`) or disabled (`false`).
61
+ */
51
62
  setFunctionalCookie(value) {
52
63
  const cookies = this.cookieBannerService.getUserCookiePreferences();
53
64
  if (cookies) {
@@ -76,56 +87,111 @@ export class GainsightService {
76
87
  /**
77
88
  * Load the script tag and calls the identify function to start the tracking.
78
89
  * @param currentTenant The current tenant.
79
- * @param identify If set to false, only the tag is loaded.
90
+ * @param sendPiiData Flag for sending personally identifiable information (PII) during identification in Gainsight.
80
91
  */
81
- async loadTag(currentTenant, identify = true) {
92
+ async loadTag(currentTenant, sendPiiData) {
82
93
  const scriptTag = document.createElement('script');
83
94
  const key = await this.getGainsightKey();
84
95
  if (key && !this.isScriptLoaded) {
85
96
  this.loadScriptTag(scriptTag, key);
86
- combineLatest(this.appState.currentUser, fromEvent(scriptTag, 'load'), this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1)))
97
+ const currentUserStream = this.appState.currentUser;
98
+ const scriptLoadStream = fromEvent(scriptTag, 'load');
99
+ const versionStream = this.appState.state$.pipe(filter(({ versions }) => versions.backend), map(({ versions }) => versions), take(1));
100
+ const sourceStreams = sendPiiData
101
+ ? [currentUserStream, scriptLoadStream, versionStream]
102
+ : [currentUserStream, scriptLoadStream];
103
+ combineLatest(sourceStreams)
87
104
  .pipe(delay(this.SCRIPT_EXECUTION_WAIT_TIME), filter(([user, scriptEvent]) => !!(scriptEvent && user)))
88
- .subscribe(([user, , versions]) => {
105
+ .subscribe(args => {
106
+ const [user, , versions] = args;
107
+ this.setGlobalContext();
89
108
  const instanceId = this.getInstanceIdFromUrl();
90
- if (identify) {
91
- this.setGlobalContext();
92
- this.identify(user, currentTenant, instanceId, versions.ui.ngx, versions.backend);
109
+ if (sendPiiData) {
110
+ const versionUI = versions.ui.ngx;
111
+ const versionBE = versions.backend;
112
+ const extendedIdentifyData = {
113
+ user,
114
+ currentTenant,
115
+ instanceId,
116
+ versionUI,
117
+ versionBE
118
+ };
119
+ this.identify(sendPiiData, extendedIdentifyData);
120
+ }
121
+ else {
122
+ const requiredIdentifyData = { user, currentTenant, instanceId };
123
+ this.identify(sendPiiData, requiredIdentifyData);
93
124
  }
94
125
  this.isScriptLoaded = true;
95
126
  this.tagFunction$.next(this.tagFunction);
127
+ this.trackingLoaded$.next(true);
96
128
  });
97
129
  }
98
130
  }
99
131
  /**
100
132
  * Identifies the user/account at Gainsight.
101
- * @param user The user which is given to Gainsight.
102
- * @param tenant The tenant which is given to Gainsight.
103
- * @param versionUI The UI version used.
104
- * @param versionBE The BE version used.
133
+ * @param sendPiiData Flag for sending personally identifiable information.
134
+ * @param identifyData Object containing identification data.
105
135
  */
106
- identify(user, tenant, instanceId, versionUI, versionBE) {
136
+ identify(sendPiiData, identifyData) {
107
137
  const windowRef = window;
108
- const { id: userId, email, userName, firstName, lastName, roles } = user;
109
- const { name, customProperties, domainName } = tenant;
110
- const { externalReference } = customProperties || {};
111
- windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', {
112
- id: `${userId}_${name}_${instanceId}`,
113
- email,
114
- userName,
115
- firstName,
116
- lastName,
138
+ const { id: userId, email, roles } = identifyData.user;
139
+ const { name: tenantID, customProperties, domainName } = identifyData.currentTenant;
140
+ const { instanceId, versionUI, versionBE } = identifyData;
141
+ /**
142
+ * Passing ID is a minimum required data to make an identify call to Gainsight.
143
+ * isUserCreatedAfterAnonymizationWasActivated parameter is passed to later distinguish between users created before and after data anonymization done by Gainsight.
144
+ * tenantID Used to distinguish between tenants when same email is used for different tenants.
145
+ *
146
+ * Due to GS limitations (GS does not allow clearing user attr/preferences via the GS tag!),
147
+ * we always need to initialize fields related to PII to prevent leaking this data to GS when the user has disabled functional cookies.
148
+ */
149
+ const requiredIdentify = {
150
+ /**
151
+ * Email was not mandatory form field until 10.14
152
+ */
153
+ id: email ? email : `${userId}_${tenantID}_${instanceId}`,
154
+ isUserCreatedAfterAnonymizationWasActivated: true,
155
+ tenantID: tenantID,
156
+ email: '--',
157
+ userName: '--',
158
+ firstName: '--',
159
+ lastName: '--',
117
160
  domainName,
118
161
  versionUI,
119
162
  versionBE,
120
163
  userLanguage: this.translateService.currentLang,
164
+ browserLanguage: this.translateService.getBrowserLang(),
121
165
  instanceId,
122
- externalReference,
123
- userRoles: this.transformUserRolesToStr(roles?.references)
124
- }, {
125
- id: `${name}_${instanceId}`,
126
- instanceId
127
- });
166
+ externalReference: customProperties?.externalReference,
167
+ userRoles: this.transformUserRolesToStr(roles?.references),
168
+ customBranding: this.isCustomBranding(),
169
+ fullTracking: sendPiiData
170
+ };
171
+ if (sendPiiData) {
172
+ const { userName, firstName, lastName } = identifyData.user;
173
+ const extendedIdentify = {
174
+ ...requiredIdentify,
175
+ email,
176
+ userName,
177
+ firstName,
178
+ lastName
179
+ };
180
+ windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', extendedIdentify, {
181
+ id: `${tenantID}_${instanceId}`,
182
+ instanceId
183
+ });
184
+ return;
185
+ }
186
+ windowRef[this.GAINSIGHT_GLOBAL_SCOPE]('identify', requiredIdentify);
128
187
  }
188
+ /**
189
+ * Triggers an event to be recorded by Gainsight PX.
190
+ * This method calls the Gainsight PX's tracking mechanism to log a specific event
191
+ * along with its associated properties.
192
+ * @param eventName - Name of the event to be triggered.
193
+ * @param props - Optional properties associated with the event.
194
+ */
129
195
  triggerEvent(eventName, props) {
130
196
  if (this.tagFunction && eventName) {
131
197
  eventName = this.prepareEventName(eventName);
@@ -147,38 +213,51 @@ export class GainsightService {
147
213
  return this.getEnTranslation(textToTranslate, this.cachedRevertedTranslations);
148
214
  }
149
215
  /**
150
- * Checks if the Gainsight's tag should be loaded.
151
- * The decision to load Gainsight will depend on custom properties and functional cookies.
152
- * @param customProperties Tenant's customProperties.
216
+ * Determines whether personally identifiable information (PII) should be sent while loading a tag.
217
+ * The decision to activate Gainsight and send PII relies on whether the cookiePreferences option is defined in the application settings,
218
+ * if the functional cookie is enabled, and if the user grants permission.
153
219
  */
154
- shouldLoadGainsightTag(customProperties) {
220
+ async shouldSendPiiData() {
155
221
  return (this.cookieBannerService.isConfigCookiePreferencesDefined() &&
156
222
  this.cookieBannerService.isFunctionalCookieEnabled() &&
157
- !this.isGainsightDisabled(customProperties) &&
158
- !this.isCustomBranding());
223
+ !(await this.isGainsightPreferenceDisabledInUserPreferences(this.USER_PREFERENCES_GAINSIGHT_KEY)));
159
224
  }
225
+ /**
226
+ * Updates a specific user attribute in the Gainsight global scope.
227
+ * This method interfaces with the Gainsight global object to set a user's specific attribute with a provided value.
228
+ * @param name - Name of the user attribute to be updated.
229
+ * @param value - Value to set for the specified user attribute.
230
+ */
160
231
  updateUserAttribute(name, value) {
161
232
  window[this.GAINSIGHT_GLOBAL_SCOPE]?.('set', 'user', { [name]: value });
162
233
  }
234
+ /**
235
+ * Determines if the current user has the capability to modify Gainsight PX settings.
236
+ *
237
+ * This method checks multiple conditions:
238
+ * 1. Whether tracking has been disabled globally via application options.
239
+ * 2. Whether Gainsight is disabled at the tenant level through custom properties.
240
+ * 3. Whether a Gainsight key is available, either currently loaded or fetched asynchronously.
241
+ * 4. Whether cookie preferences are defined and available for the user.
242
+ *
243
+ * @returns Promise that resolves to a boolean. True indicates the user can edit product experience settings, and false otherwise.
244
+ */
163
245
  async canEditProductExperienceSettings() {
164
246
  const currentTenant = this.appState.currentTenant.value;
165
247
  const { customProperties } = currentTenant;
248
+ if (this.isTrackingDisabled() ||
249
+ this.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
250
+ return false;
251
+ }
166
252
  const gainsightKey = !!this.gainsightKey || !!(await this.getGainsightKey());
167
253
  return (gainsightKey &&
168
254
  this.cookieBannerService.isConfigCookiePreferencesDefined() &&
169
- !this.isGainsightDisabled(customProperties) &&
170
- !!this.cookieBannerService.getUserCookiePreferences() &&
171
- !this.isCustomBranding());
172
- }
173
- switchGainsightEngagementsVisibility(showGainsightEngagements) {
174
- if (showGainsightEngagements) {
175
- this.removeHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID);
176
- this.updateUserAttribute(this.ENGAGEMENTS, true);
177
- return;
178
- }
179
- this.addHidingStyle(this.HIDE_GAINSIGHT_BOT_STYLE_ID, '#apt-widget { display:none }');
180
- this.updateUserAttribute(this.ENGAGEMENTS, false);
255
+ !!this.cookieBannerService.getUserCookiePreferences());
181
256
  }
257
+ /**
258
+ * Sets the global context for Gainsight with the current application name.
259
+ * The global context can be utilized by Gainsight for various purposes, such as segmenting users.
260
+ */
182
261
  setGlobalContext() {
183
262
  const currentAppState = this.appState.state$.value;
184
263
  const currentAppName = currentAppState.app.name;
@@ -190,18 +269,31 @@ export class GainsightService {
190
269
  }
191
270
  return flatMap(userRoles, (userRole) => userRole.role.name).join();
192
271
  }
193
- addHidingStyle(styleId, textContent) {
194
- if (this.document.getElementById(styleId)) {
195
- return;
196
- }
197
- const style = this.document.createElement('style');
198
- style.id = styleId;
199
- style.textContent = textContent;
200
- this.document.head.appendChild(style);
272
+ /**
273
+ * Checks if Gainsight is disabled based on tenant custom properties.
274
+ *
275
+ * @param customProperties - The custom properties of the tenant.
276
+ * @returns {boolean} - True if Gainsight is disabled, false otherwise.
277
+ */
278
+ isGainsightDisabledAtTenantCustomProperties(customProperties) {
279
+ const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
280
+ return gainsightEnabled === false;
201
281
  }
202
- removeHidingStyle(styleId) {
203
- const style = this.document.getElementById(styleId);
204
- style?.remove();
282
+ /**
283
+ * Determines if custom branding is enabled based on the presence of a brand logo.
284
+ *
285
+ * @returns {boolean} - True if custom branding is applied, false otherwise.
286
+ */
287
+ isCustomBranding() {
288
+ const brandingCssVars = this.options.get('brandingCssVars') || {};
289
+ return !!brandingCssVars['brand-logo-img'];
290
+ }
291
+ /**
292
+ * Determines if tracking is disabled based on the application options.
293
+ * @returns `true` if tracking is disabled, otherwise `false`.
294
+ */
295
+ isTrackingDisabled() {
296
+ return this.options.disableTracking === true;
205
297
  }
206
298
  prepareEventName(baseEventName) {
207
299
  return baseEventName
@@ -212,14 +304,6 @@ export class GainsightService {
212
304
  return eventNamePart.replace(/`[\w\W]*`/g, '');
213
305
  }
214
306
  }
215
- isGainsightDisabled(customProperties) {
216
- const gainsightEnabled = customProperties && customProperties.gainsightEnabled;
217
- return gainsightEnabled === false;
218
- }
219
- isCustomBranding() {
220
- const brandingCssVars = this.options.get('brandingCssVars') || {};
221
- return !!brandingCssVars['brand-logo-img'];
222
- }
223
307
  loadScriptTag(scriptTag, key) {
224
308
  try {
225
309
  const windowRef = window;
@@ -282,15 +366,12 @@ export class GainsightService {
282
366
  return enTranslation;
283
367
  }
284
368
  }
285
- GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token: Document }, { token: i1.AppStateService }, { token: i2.OptionsService }, { token: i3.CookieBannerService }, { token: i4.UserPreferencesService }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
369
+ GainsightService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, deps: [{ token: i1.AppStateService }, { token: i2.OptionsService }, { token: i3.CookieBannerService }, { token: i4.UserPreferencesService }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
286
370
  GainsightService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, providedIn: 'root' });
287
371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: GainsightService, decorators: [{
288
372
  type: Injectable,
289
373
  args: [{
290
374
  providedIn: 'root'
291
375
  }]
292
- }], ctorParameters: function () { return [{ type: Document, decorators: [{
293
- type: Inject,
294
- args: [Document]
295
- }] }, { type: i1.AppStateService }, { type: i2.OptionsService }, { type: i3.CookieBannerService }, { type: i4.UserPreferencesService }, { type: i5.TranslateService }]; } });
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FpbnNpZ2h0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxJQUFJLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxxREFBcUQsQ0FBQzs7Ozs7OztBQVk3Rjs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBdUIzQixZQUM0QixRQUFrQixFQUNwQyxRQUF5QixFQUN6QixPQUF1QixFQUN2QixtQkFBd0MsRUFDeEMsc0JBQThDLEVBQzlDLGdCQUFrQztRQUxoQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQ3pCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBQ3ZCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFD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dCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDdXN0b21Qcm9wZXJ0aWVzIH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgY2FtZWxDYXNlLCBmbGF0TWFwIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWxheSwgZmlsdGVyLCBtYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29raWVCYW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYm9vdHN0cmFwL2Nvb2tpZS1iYW5uZXIvY29va2llLWJhbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL29wdGlvbnMuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbW9uL3VzZXItcHJlZmVyZW5jZXMvdXNlci1wcmVmZXJlbmNlcy5zZXJ2aWNlJztcbmltcG9ydCB7IFB4RXZlbnREYXRhIH0gZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuXG5pbnRlcmZhY2UgVXNlclJvbGUge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBSb2xlIHtcbiAgcm9sZTogVXNlclJvbGU7XG59XG5cbi8qKlxuICogQSBzZXJ2aWNlIHRvIG1hbmFnZSB0aGUgR2FpbnNpZ2h0IGludGVncmF0aW9uLiBJdCBhbGxvd3MgdG8gbG9hZCB0aGVcbiAqIHRhZyBhbmRcbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgR2FpbnNpZ2h0U2VydmljZSB7XG4gIC8qKlxuICAgKiBBIHN1YmplY3QgdGhhdCBlbWl0cyB0aGUgdGFnIGZ1bmN0aW9uIGFzIHNvb24gYXMgYSBuZXcgdGFnIGlzIHNldC5cbiAgICovXG4gIHRhZ0Z1bmN0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgcmVhZG9ubHkgVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfS0VZID0gJ2dhaW5zaWdodEVuYWJsZWQnO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGtleSByZW1haW5lZCB1bmNoYW5nZWQsIGJ1dCBhcHBsaWVzIHRvIGFsbCBlbmdhZ2VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IFVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0VOR0FHRU1FTlRTX0tFWSA9ICdnYWluc2lnaHRCb3RFbmFibGVkJztcbiAgcmVhZG9ubHkgSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lEID0gJ2hpZGUtZ3MtYm90JztcbiAgcHJpdmF0ZSByZWFkb25seSBHQUlOU0lHSFRfVVJMID0gJ3dlYi1zZGsuYXB0cmluc2ljLmNvbS9hcGkvYXB0cmluc2ljLmpzP2E9JztcbiAgcHJpdmF0ZSByZWFkb25seSBHQUlOU0lHSFRfR0xPQkFMX1NDT1BFID0gJ2FwdHJpbnNpYyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0NSSVBUX0VYRUNVVElPTl9XQUlUX1RJTUUgPSA1MDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgT1BUSU9OU19LRVlfQ0FURUdPUlkgPSAnZ2FpbnNpZ2h0JztcbiAgcHJpdmF0ZSByZWFkb25seSBPUFRJT05TX0tFWV9OQU1FID0gJ2FwaS5rZXknO1xuICBwcml2YXRlIHJlYWRvbmx5IEVOR0FHRU1FTlRTID0gJ2VuZ2FnZW1lbnRzJztcbiAgcHJpdmF0ZSBpc1NjcmlwdExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGdhaW5zaWdodEtleTogc3RyaW5nO1xuICBwcml2YXRlIGNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIGNhY2hlZExhbmd1YWdlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChEb2N1bWVudCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uczogT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclByZWZlcmVuY2VzU2VydmljZTogVXNlclByZWZlcmVuY2VzU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIGlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMocHJlZmVyZW5jZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHVzZXJHYWluc2lnaHRQcmVmID0gYXdhaXQgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChwcmVmZXJlbmNlTmFtZSkudG9Qcm9taXNlKCk7XG4gICAgcmV0dXJuIHVzZXJHYWluc2lnaHRQcmVmID09PSBmYWxzZTtcbiAgfVxuXG4gIHNldEZ1bmN0aW9uYWxDb29raWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb29raWVzID0gdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmdldFVzZXJDb29raWVQcmVmZXJlbmNlcygpO1xuICAgIGlmIChjb29raWVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhjb29raWVzKS5mb3JFYWNoKGNvb2tpZU5hbWUgPT4ge1xuICAgICAgICBpZiAoY29va2llTmFtZSA9PT0gJ2Z1bmN0aW9uYWwnKSB7XG4gICAgICAgICAgY29va2llc1tjb29raWVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWNjZXB0Q29va2llTm90aWNlJywgSlNPTi5zdHJpbmdpZnkoY29va2llcykpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEdhaW5zaWdodEtleSgpIHtcbiAgICB0aGlzLmdhaW5zaWdodEtleSA9XG4gICAgICB0aGlzLm9wdGlvbnMuZ2FpbnNpZ2h0S2V5IHx8XG4gICAgICAoYXdhaXQgdGhpcy5vcHRpb25zLmdldFN5c3RlbU9wdGlvbih0aGlzLk9QVElPTlNfS0VZX0NBVEVHT1JZLCB0aGlzLk9QVElPTlNfS0VZX05BTUUpKTtcbiAgICByZXR1cm4gdGhpcy5nYWluc2lnaHRLZXk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFnIGdsb2JhbCBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB1c2VyXG4gICAqIG9yIGFkZCBzcGVjaWFsIGV2ZW50cy5cbiAgICovXG4gIGdldCB0YWdGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgc2NyaXB0IHRhZyBhbmQgY2FsbHMgdGhlIGlkZW50aWZ5IGZ1bmN0aW9uIHRvIHN0YXJ0IHRoZSB0cmFja2luZy5cbiAgICogQHBhcmFtIGN1cnJlbnRUZW5hbnQgVGhlIGN1cnJlbnQgdGVuYW50LlxuICAgKiBAcGFyYW0gaWRlbnRpZnkgSWYgc2V0IHRvIGZhbHNlLCBvbmx5IHRoZSB0YWcgaXMgbG9hZGVkLlxuICAgKi9cbiAgYXN5bmMgbG9hZFRhZyhjdXJyZW50VGVuYW50LCBpZGVudGlmeSA9IHRydWUpIHtcbiAgICBjb25zdCBzY3JpcHRUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmdldEdhaW5zaWdodEtleSgpO1xuXG4gICAgaWYgKGtleSAmJiAhdGhpcy5pc1NjcmlwdExvYWRlZCkge1xuICAgICAgdGhpcy5sb2FkU2NyaXB0VGFnKHNjcmlwdFRhZywga2V5KTtcbiAgICAgIGNvbWJpbmVMYXRlc3QoXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuY3VycmVudFVzZXIsXG4gICAgICAgIGZyb21FdmVudChzY3JpcHRUYWcsICdsb2FkJyksXG4gICAgICAgIHRoaXMuYXBwU3RhdGUuc3RhdGUkLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKCh7IHZlcnNpb25zIH0pID0+IHZlcnNpb25zLmJhY2tlbmQpLFxuICAgICAgICAgIG1hcCgoeyB2ZXJzaW9ucyB9KSA9PiB2ZXJzaW9ucyksXG4gICAgICAgICAgdGFrZSgxKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGRlbGF5KHRoaXMuU0NSSVBUX0VYRUNVVElPTl9XQUlUX1RJTUUpLFxuICAgICAgICAgIGZpbHRlcigoW3VzZXIsIHNjcmlwdEV2ZW50XSkgPT4gISEoc2NyaXB0RXZlbnQgJiYgdXNlcikpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoW3VzZXIsICwgdmVyc2lvbnNdKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5zdGFuY2VJZCA9IHRoaXMuZ2V0SW5zdGFuY2VJZEZyb21VcmwoKTtcbiAgICAgICAgICBpZiAoaWRlbnRpZnkpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0R2xvYmFsQ29udGV4dCgpO1xuICAgICAgICAgICAgdGhpcy5pZGVudGlmeSh1c2VyLCBjdXJyZW50VGVuYW50LCBpbnN0YW5jZUlkLCB2ZXJzaW9ucy51aS5uZ3gsIHZlcnNpb25zLmJhY2tlbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzU2NyaXB0TG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnRhZ0Z1bmN0aW9uJC5uZXh0KHRoaXMudGFnRnVuY3Rpb24pO1xuICAgICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpZmllcyB0aGUgdXNlci9hY2NvdW50IGF0IEdhaW5zaWdodC5cbiAgICogQHBhcmFtIHVzZXIgVGhlIHVzZXIgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICAgKiBAcGFyYW0gdGVuYW50IFRoZSB0ZW5hbnQgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICAgKiBAcGFyYW0gdmVyc2lvblVJIFRoZSBVSSB2ZXJzaW9uIHVzZWQuXG4gICAqIEBwYXJhbSB2ZXJzaW9uQkUgVGhlIEJFIHZlcnNpb24gdXNlZC5cbiAgICovXG4gIGlkZW50aWZ5KHVzZXIsIHRlbmFudCwgaW5zdGFuY2VJZCwgdmVyc2lvblVJPywgdmVyc2lvbkJFPykge1xuICAgIGNvbnN0IHdpbmRvd1JlZiA9IHdpbmRvdyBhcyBhbnk7XG4gICAgY29uc3QgeyBpZDogdXNlcklkLCBlbWFpbCwgdXNlck5hbWUsIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHJvbGVzIH0gPSB1c2VyO1xuICAgIGNvbnN0IHsgbmFtZSwgY3VzdG9tUHJvcGVydGllcywgZG9tYWluTmFtZSB9ID0gdGVuYW50O1xuICAgIGNvbnN0IHsgZXh0ZXJuYWxSZWZlcmVuY2UgfSA9IGN1c3RvbVByb3BlcnRpZXMgfHwge307XG4gICAgd2luZG93UmVmW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0oXG4gICAgICAnaWRlbnRpZnknLFxuICAgICAge1xuICAgICAgICBpZDogYCR7dXNlcklkfV8ke25hbWV9XyR7aW5zdGFuY2VJZH1gLFxuICAgICAgICBlbWFpbCxcbiAgICAgICAgdXNlck5hbWUsXG4gICAgICAgIGZpcnN0TmFtZSxcbiAgICAgICAgbGFzdE5hbWUsXG4gICAgICAgIGRvbWFpbk5hbWUsXG4gICAgICAgIHZlcnNpb25VSSxcbiAgICAgICAgdmVyc2lvbkJFLFxuICAgICAgICB1c2VyTGFuZ3VhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyxcbiAgICAgICAgaW5zdGFuY2VJZCxcbiAgICAgICAgZXh0ZXJuYWxSZWZlcmVuY2UsXG4gICAgICAgIHVzZXJSb2xlczogdGhpcy50cmFuc2Zvcm1Vc2VyUm9sZXNUb1N0cihyb2xlcz8ucmVmZXJlbmNlcylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBgJHtuYW1lfV8ke2luc3RhbmNlSWR9YCxcbiAgICAgICAgaW5zdGFuY2VJZFxuICAgICAgfVxuICAgICk7XG4gIH1cblxuICB0cmlnZ2VyRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIHByb3BzPzogUHhFdmVudERhdGEpIHtcbiAgICBpZiAodGhpcy50YWdGdW5jdGlvbiAmJiBldmVudE5hbWUpIHtcbiAgICAgIGV2ZW50TmFtZSA9IHRoaXMucHJlcGFyZUV2ZW50TmFtZShldmVudE5hbWUpO1xuICAgICAgdGhpcy50YWdGdW5jdGlvbigndHJhY2snLCBldmVudE5hbWUsIHByb3BzKTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2xhdGVUb0VuZ2xpc2godGV4dFRvVHJhbnNsYXRlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY3VycmVudExhbmcgfSA9IHRoaXMudHJhbnNsYXRlU2VydmljZTtcblxuICAgIGlmIChjdXJyZW50TGFuZyA9PT0gJ2VuJykge1xuICAgICAgcmV0dXJuIHRleHRUb1RyYW5zbGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudExhbmcgJiYgY3VycmVudExhbmcgIT09IHRoaXMuY2FjaGVkTGFuZ3VhZ2UpIHtcbiAgICAgIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zKSB7XG4gICAgICB0aGlzLmNhY2hlZExhbmd1YWdlID0gY3VycmVudExhbmc7XG4gICAgICB0aGlzLmNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zID0gdGhpcy5nZXRSZXZlcnRlZFRyYW5zbGF0aW9ucyhjdXJyZW50TGFuZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0RW5UcmFuc2xhdGlvbih0ZXh0VG9UcmFuc2xhdGUsIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgR2FpbnNpZ2h0J3MgdGFnIHNob3VsZCBiZSBsb2FkZWQuXG4gICAqIFRoZSBkZWNpc2lvbiB0byBsb2FkIEdhaW5zaWdodCB3aWxsIGRlcGVuZCBvbiBjdXN0b20gcHJvcGVydGllcyBhbmQgZnVuY3Rpb25hbCBjb29raWVzLlxuICAgKiBAcGFyYW0gY3VzdG9tUHJvcGVydGllcyBUZW5hbnQncyBjdXN0b21Qcm9wZXJ0aWVzLlxuICAgKi9cbiAgc2hvdWxkTG9hZEdhaW5zaWdodFRhZyhjdXN0b21Qcm9wZXJ0aWVzOiBJQ3VzdG9tUHJvcGVydGllcyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvb2tpZUJhbm5lclNlcnZpY2UuaXNDb25maWdDb29raWVQcmVmZXJlbmNlc0RlZmluZWQoKSAmJlxuICAgICAgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzRnVuY3Rpb25hbENvb2tpZUVuYWJsZWQoKSAmJlxuICAgICAgIXRoaXMuaXNHYWluc2lnaHREaXNhYmxlZChjdXN0b21Qcm9wZXJ0aWVzKSAmJlxuICAgICAgIXRoaXMuaXNDdXN0b21CcmFuZGluZygpXG4gICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVVzZXJBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgRGF0ZSB8IG51bWJlciB8IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB3aW5kb3dbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXT8uKCdzZXQnLCAndXNlcicsIHsgW25hbWVdOiB2YWx1ZSB9KTtcbiAgfVxuXG4gIGFzeW5jIGNhbkVkaXRQcm9kdWN0RXhwZXJpZW5jZVNldHRpbmdzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGN1cnJlbnRUZW5hbnQgPSB0aGlzLmFwcFN0YXRlLmN1cnJlbnRUZW5hbnQudmFsdWU7XG4gICAgY29uc3QgeyBjdXN0b21Qcm9wZXJ0aWVzIH0gPSBjdXJyZW50VGVuYW50O1xuXG4gICAgY29uc3QgZ2FpbnNpZ2h0S2V5ID0gISF0aGlzLmdhaW5zaWdodEtleSB8fCAhIShhd2FpdCB0aGlzLmdldEdhaW5zaWdodEtleSgpKTtcblxuICAgIHJldHVybiAoXG4gICAgICBnYWluc2lnaHRLZXkgJiZcbiAgICAgIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0NvbmZpZ0Nvb2tpZVByZWZlcmVuY2VzRGVmaW5lZCgpICYmXG4gICAgICAhdGhpcy5pc0dhaW5zaWdodERpc2FibGVkKGN1c3RvbVByb3BlcnRpZXMpICYmXG4gICAgICAhIXRoaXMuY29va2llQmFubmVyU2VydmljZS5nZXRVc2VyQ29va2llUHJlZmVyZW5jZXMoKSAmJlxuICAgICAgIXRoaXMuaXNDdXN0b21CcmFuZGluZygpXG4gICAgKTtcbiAgfVxuXG4gIHN3aXRjaEdhaW5zaWdodEVuZ2FnZW1lbnRzVmlzaWJpbGl0eShzaG93R2FpbnNpZ2h0RW5nYWdlbWVudHM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzKSB7XG4gICAgICB0aGlzLnJlbW92ZUhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lEKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckF0dHJpYnV0ZSh0aGlzLkVOR0FHRU1FTlRTLCB0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFkZEhpZGluZ1N0eWxlKHRoaXMuSElERV9HQUlOU0lHSFRfQk9UX1NUWUxFX0lELCAnI2FwdC13aWRnZXQgeyBkaXNwbGF5Om5vbmUgfScpO1xuICAgIHRoaXMudXBkYXRlVXNlckF0dHJpYnV0ZSh0aGlzLkVOR0FHRU1FTlRTLCBmYWxzZSk7XG4gIH1cblxuICBzZXRHbG9iYWxDb250ZXh0KCk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnRBcHBTdGF0ZSA9IHRoaXMuYXBwU3RhdGUuc3RhdGUkLnZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnRBcHBOYW1lID0gY3VycmVudEFwcFN0YXRlLmFwcC5uYW1lO1xuXG4gICAgd2luZG93W3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0/Lignc2V0JywgJ2dsb2JhbENvbnRleHQnLCB7IHByb2plY3ROYW1lOiBjdXJyZW50QXBwTmFtZSB9KTtcbiAgfVxuXG4gIHRyYW5zZm9ybVVzZXJSb2xlc1RvU3RyKHVzZXJSb2xlcz86IFJvbGVbXSk6IHN0cmluZyB7XG4gICAgaWYgKCF1c2VyUm9sZXMpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gZmxhdE1hcCh1c2VyUm9sZXMsICh1c2VyUm9sZTogeyByb2xlOiBVc2VyUm9sZSB9KSA9PiB1c2VyUm9sZS5yb2xlLm5hbWUpLmpvaW4oKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkSGlkaW5nU3R5bGUoc3R5bGVJZDogc3RyaW5nLCB0ZXh0Q29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS5pZCA9IHN0eWxlSWQ7XG4gICAgc3R5bGUudGV4dENvbnRlbnQgPSB0ZXh0Q29udGVudDtcbiAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVIaWRpbmdTdHlsZShzdHlsZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc3R5bGVJZCk7XG4gICAgc3R5bGU/LnJlbW92ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlRXZlbnROYW1lKGJhc2VFdmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJhc2VFdmVudE5hbWVcbiAgICAgIC5zcGxpdCgnOicpXG4gICAgICAubWFwKGV2ZW50TmFtZVBhcnQgPT4gY2FtZWxDYXNlKHJlbW92ZVRyYW5zbGF0aW9uQ29udGV4dChldmVudE5hbWVQYXJ0KSkpXG4gICAgICAuam9pbignOicpO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlVHJhbnNsYXRpb25Db250ZXh0KGV2ZW50TmFtZVBhcnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXZlbnROYW1lUGFydC5yZXBsYWNlKC9gW1xcd1xcV10qYC9nLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0dhaW5zaWdodERpc2FibGVkKGN1c3RvbVByb3BlcnRpZXM6IElDdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgZ2FpbnNpZ2h0RW5hYmxlZCA9IGN1c3RvbVByb3BlcnRpZXMgJiYgY3VzdG9tUHJvcGVydGllcy5nYWluc2lnaHRFbmFibGVkO1xuICAgIHJldHVybiBnYWluc2lnaHRFbmFibGVkID09PSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDdXN0b21CcmFuZGluZygpOiBib29sZWFuIHtcbiAgICBjb25zdCBicmFuZGluZ0Nzc1ZhcnMgPSB0aGlzLm9wdGlvbnMuZ2V0KCdicmFuZGluZ0Nzc1ZhcnMnKSB8fCB7fTtcbiAgICByZXR1cm4gISFicmFuZGluZ0Nzc1ZhcnNbJ2JyYW5kLWxvZ28taW1nJ107XG4gIH1cblxuICBwcml2YXRlIGxvYWRTY3JpcHRUYWcoc2NyaXB0VGFnOiBIVE1MU2NyaXB0RWxlbWVudCwga2V5OiBzdHJpbmcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2luZG93UmVmID0gd2luZG93IGFzIGFueTtcbiAgICAgIGNvbnN0IGZpcnN0VGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdO1xuICAgICAgY29uc3QgcHJvdG9jb2wgPSBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICAgIGNvbnN0IGdhaW5zaWdodEdsb2JhbFNjb3BlID0gdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFO1xuICAgICAgc2NyaXB0VGFnLnNyYyA9IGAke3Byb3RvY29sfS8vJHt0aGlzLkdBSU5TSUdIVF9VUkx9JHtrZXl9YDtcbiAgICAgICh3aW5kb3dSZWZbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXSA9XG4gICAgICAgIHdpbmRvd1JlZlt0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdIHx8XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpvbmx5LWFycm93LWZ1bmN0aW9uc1xuICAgICAgICBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgICAgICAgICh3aW5kb3dSZWZbZ2FpbnNpZ2h0R2xvYmFsU2NvcGVdLnEgPSB3aW5kb3dSZWZbZ2FpbnNpZ2h0R2xvYmFsU2NvcGVdLnEgfHwgW10pLnB1c2goYXJncyk7XG4gICAgICAgIH0pLFxuICAgICAgICAod2luZG93UmVmW2dhaW5zaWdodEdsb2JhbFNjb3BlXS5wID0ga2V5KTtcbiAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG4gICAgICBmaXJzdFRhZy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHRUYWcsIGZpcnN0VGFnKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBHYWluc2lnaHQgUFgnLCBleCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRJbnN0YW5jZUlkRnJvbVVybCgpIHtcbiAgICBjb25zdCBob3N0TmFtZSA9IGxvY2F0aW9uLmhvc3RuYW1lO1xuICAgIHJldHVybiBob3N0TmFtZS5zdWJzdHJpbmcoaG9zdE5hbWUuaW5kZXhPZignLicpICsgMSk7XG4gIH1cblxuICAvKipcbiAgICogUmV2ZXJzZXMgdGhlIHRyYW5zbGF0aW9uIG9iamVjdC5cbiAgICpcbiAgICogKipFeGFtcGxlKipcbiAgICogeyBBZGQgd2lkZ2V0OiBcIldpZGdldCBoaW56dWbDvGdlblwiIH1cbiAgICpcbiAgICogd2lsbCBiZSBjaGFuZ2VkIHRvOlxuICAgKlxuICAgKiB7IFdpZGdldCBoaW56dWbDvGdlbjogXCJBZGQgd2lkZ2V0XCIgfVxuICAgKlxuICAgKiBAcGFyYW0gY3VycmVudExhbmcgTGFuZ3VhZ2Ugd2hvc2UgdHJhbnNsYXRlZCB2YWx1ZXMgYXJlIHRvIGJlIHBsYWNlZCBpbiB0aGUgb2JqZWN0IGtleS5cbiAgICogQHJldHVybnMgUmV0dXJucyBhbiBpbnZlcnRlZCBvYmplY3Qgd2hlcmUgdGhlIGtleXMgaGF2ZSBiZWVuIHN3YXBwZWQgd2l0aCB0aGUgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRSZXZlcnRlZFRyYW5zbGF0aW9ucyhjdXJyZW50TGFuZzogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnN0b3JlLnRyYW5zbGF0aW9uc1tjdXJyZW50TGFuZ107XG5cbiAgICBjb25zdCBzd2FwcGVkS2V5c1dpdGhWYWx1ZXMgPSB7fTtcbiAgICBPYmplY3Qua2V5cyh0cmFuc2xhdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIHN3YXBwZWRLZXlzV2l0aFZhbHVlc1t0cmFuc2xhdGlvbnNba2V5XV0gPSBrZXk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN3YXBwZWRLZXlzV2l0aFZhbHVlcztcbiAgfVxuXG4gIC8qKlRyYW5zbGF0ZXMgc3RyaW5nIGJhY2sgaW50byBFbmdsaXNoLlxuICAgKiBJZiB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBsYW5ndWFnZSBpcyBzZXQgdG8gRW5nbGlzaCwgdGhlIHN0cmluZyBwYXNzZWQgYXMgYW4gYXJndW1lbnQgaXMgcmV0dXJuZWQuXG4gICAqIEBwYXJhbSB0ZXh0VG9UcmFuc2xhdGUgc3RyaW5nIHRvIHRyYW5zbGF0ZS5cbiAgICogQHJldHVybnMgUmV0dXJucyB0aGUgc3RyaW5nIHRyYW5zbGF0ZWQgaW50byBFbmdsaXNoLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRFblRyYW5zbGF0aW9uKFxuICAgIHRleHRUb1RyYW5zbGF0ZTogc3RyaW5nLFxuICAgIHRyYW5zbGF0aW9uczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxuICApOiBzdHJpbmcge1xuICAgIGxldCBlblRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25zW3RleHRUb1RyYW5zbGF0ZV07XG4gICAgaWYgKCFlblRyYW5zbGF0aW9uKSB7XG4gICAgICByZXR1cm4gdGV4dFRvVHJhbnNsYXRlO1xuICAgIH1cbiAgICAvKiogcmVtb3ZlIHRyYW5zbGF0aW9uIGNvbnRleHQgKi9cbiAgICBjb25zdCByZWdleCA9IC9cXGAoLio/KVxcYC87XG4gICAgZW5UcmFuc2xhdGlvbiA9IGVuVHJhbnNsYXRpb24ucmVwbGFjZShyZWdleCwgJycpO1xuXG4gICAgcmV0dXJuIGVuVHJhbnNsYXRpb247XG4gIH1cbn1cbiJdfQ==
376
+ }], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.OptionsService }, { type: i3.CookieBannerService }, { type: i4.UserPreferencesService }, { type: i5.TranslateService }]; } });
377
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FpbnNpZ2h0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9nYWluc2lnaHQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scURBQXFELENBQUM7Ozs7Ozs7QUF1QjdGOzs7R0FHRztBQUlILE1BQU0sT0FBTyxnQkFBZ0I7SUEyQjNCLFlBQ1UsUUFBeUIsRUFDekIsT0FBdUIsRUFDdkIsbUJBQXdDLEVBQ3hDLHNCQUE4QyxFQUM5QyxnQkFBa0M7UUFKbEMsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzlDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUEvQjVDOztXQUVHO1FBQ0gsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QyxvQkFBZSxHQUFxQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRWxEOzs7V0FHRztRQUNNLG1DQUE4QixHQUFHLGtCQUFrQixDQUFDO1FBQzdEOztXQUVHO1FBQ00sK0NBQTBDLEdBQUcscUJBQXFCLENBQUM7UUFDbkUsZ0NBQTJCLEdBQUcsYUFBYSxDQUFDO1FBQ3BDLGtCQUFhLEdBQUcsMkNBQTJDLENBQUM7UUFDNUQsMkJBQXNCLEdBQUcsV0FBVyxDQUFDO1FBQ3JDLCtCQUEwQixHQUFHLEdBQUcsQ0FBQztRQUNqQyx5QkFBb0IsR0FBRyxXQUFXLENBQUM7UUFDbkMscUJBQWdCLEdBQUcsU0FBUyxDQUFDO1FBQ3RDLG1CQUFjLEdBQUcsS0FBSyxDQUFDO0lBVzVCLENBQUM7SUFFSjs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLDhDQUE4QyxDQUFDLGNBQXNCO1FBQ3pFLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRTVGLE9BQU8saUJBQWlCLEtBQUssS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxtQkFBbUIsQ0FBQyxLQUFjO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3BFLElBQUksT0FBTyxFQUFFO1lBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ3hDLElBQUksVUFBVSxLQUFLLFlBQVksRUFBRTtvQkFDL0IsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDNUIsT0FBTztpQkFDUjtZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsWUFBWSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7U0FDckU7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGVBQWU7UUFDbkIsSUFBSSxDQUFDLFlBQVk7WUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVk7Z0JBQ3pCLENBQUMsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUN6RixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksV0FBVztRQUNiLE9BQVEsTUFBYyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUE2QixFQUFFLFdBQW9CO1FBQy9ELE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFekMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBRW5DLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDcEQsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDN0MsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUMxQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFDL0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUNSLENBQUM7WUFFRixNQUFNLGFBQWEsR0FBRyxXQUFXO2dCQUMvQixDQUFDLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFFMUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztpQkFDekIsSUFBSSxDQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsMEJBQTBCLENBQUMsRUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUN6RDtpQkFDQSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2hCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQUFBRCxFQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztnQkFDaEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBRXhCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUMvQyxJQUFJLFdBQVcsRUFBRTtvQkFDZixNQUFNLFNBQVMsR0FBVyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQztvQkFDMUMsTUFBTSxTQUFTLEdBQVcsUUFBUSxDQUFDLE9BQU8sQ0FBQztvQkFDM0MsTUFBTSxvQkFBb0IsR0FBaUI7d0JBQ3pDLElBQUk7d0JBQ0osYUFBYTt3QkFDYixVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsU0FBUztxQkFDVixDQUFDO29CQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLG9CQUFvQixDQUFDLENBQUM7aUJBQ2xEO3FCQUFNO29CQUNMLE1BQU0sb0JBQW9CLEdBQWlCLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsQ0FBQztvQkFDL0UsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztpQkFDbEQ7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsUUFBUSxDQUFDLFdBQW9CLEVBQUUsWUFBMEI7UUFDdkQsTUFBTSxTQUFTLEdBQUcsTUFBYSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1FBQ3ZELE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUM7UUFDcEYsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsWUFBWSxDQUFDO1FBRTFEOzs7Ozs7O1dBT0c7UUFDSCxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCOztlQUVHO1lBQ0gsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sSUFBSSxRQUFRLElBQUksVUFBVSxFQUFFO1lBQ3pELDJDQUEyQyxFQUFFLElBQUk7WUFDakQsUUFBUSxFQUFFLFFBQVE7WUFDbEIsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLElBQUk7WUFDZCxVQUFVO1lBQ1YsU0FBUztZQUNULFNBQVM7WUFDVCxZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVc7WUFDL0MsZUFBZSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUU7WUFDdkQsVUFBVTtZQUNWLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLGlCQUFpQjtZQUN0RCxTQUFTLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7WUFDMUQsY0FBYyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN2QyxZQUFZLEVBQUUsV0FBVztTQUMxQixDQUFDO1FBRUYsSUFBSSxXQUFXLEVBQUU7WUFDZixNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO1lBRTVELE1BQU0sZ0JBQWdCLEdBQUc7Z0JBQ3ZCLEdBQUcsZ0JBQWdCO2dCQUNuQixLQUFLO2dCQUNMLFFBQVE7Z0JBQ1IsU0FBUztnQkFDVCxRQUFRO2FBQ1QsQ0FBQztZQUVGLFNBQVMsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQ25FLEVBQUUsRUFBRSxHQUFHLFFBQVEsSUFBSSxVQUFVLEVBQUU7Z0JBQy9CLFVBQVU7YUFDWCxDQUFDLENBQUM7WUFFSCxPQUFPO1NBQ1I7UUFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDdkUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFlBQVksQ0FBQyxTQUFpQixFQUFFLEtBQW1CO1FBQ2pELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxTQUFTLEVBQUU7WUFDakMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDN0M7SUFDSCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsZUFBdUI7UUFDeEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztRQUU5QyxJQUFJLFdBQVcsS0FBSyxJQUFJLEVBQUU7WUFDeEIsT0FBTyxlQUFlLENBQUM7U0FDeEI7UUFFRCxJQUFJLFdBQVcsSUFBSSxXQUFXLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0RCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsU0FBUyxDQUFDO1NBQzdDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRTtZQUNwQyxJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQztZQUNsQyxJQUFJLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxDQUFDO1NBQzdFO1FBRUQsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGlCQUFpQjtRQUNyQixPQUFPLENBQ0wsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdDQUFnQyxFQUFFO1lBQzNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyx5QkFBeUIsRUFBRTtZQUNwRCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsOENBQThDLENBQ3pELElBQUksQ0FBQyw4QkFBOEIsQ0FDcEMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxtQkFBbUIsQ0FBQyxJQUFZLEVBQUUsS0FBdUM7UUFDdkUsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILEtBQUssQ0FBQyxnQ0FBZ0M7UUFDcEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ3hELE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLGFBQWEsQ0FBQztRQUMzQyxJQUNFLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtZQUN6QixJQUFJLENBQUMsMkNBQTJDLENBQUMsZ0JBQWdCLENBQUMsRUFDbEU7WUFDQSxPQUFPLEtBQUssQ0FBQztTQUNkO1FBQ0QsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztRQUM3RSxPQUFPLENBQ0wsWUFBWTtZQUNaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxnQ0FBZ0MsRUFBRTtZQUMzRCxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixFQUFFLENBQ3RELENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsZ0JBQWdCO1FBQ2QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQ25ELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBRWhELE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUNqRyxDQUFDO0lBRUQsdUJBQXVCLENBQUMsU0FBeUI7UUFDL0MsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFFRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUE0QixFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pGLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILDJDQUEyQyxDQUFDLGdCQUFtQztRQUM3RSxNQUFNLGdCQUFnQixHQUFHLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1FBQy9FLE9BQU8sZ0JBQWdCLEtBQUssS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZ0JBQWdCO1FBQ2QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEUsT0FBTyxDQUFDLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQztJQUMvQyxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsYUFBcUI7UUFDNUMsT0FBTyxhQUFhO2FBQ2pCLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsd0JBQXdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzthQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFYixTQUFTLHdCQUF3QixDQUFDLGFBQXFCO1lBQ3JELE9BQU8sYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7SUFFTyxhQUFhLENBQUMsU0FBNEIsRUFBRSxHQUFXO1FBQzdELElBQUk7WUFDRixNQUFNLFNBQVMsR0FBRyxNQUFhLENBQUM7WUFDaEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDbkMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUM7WUFDekQsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLFFBQVEsS0FBSyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQzNELENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztnQkFDckMsU0FBUyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztvQkFDdEMsZ0RBQWdEO29CQUNoRCxVQUFVLEdBQUcsSUFBSTt3QkFDZixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMzRixDQUFDLENBQUM7Z0JBQ0YsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDNUMsU0FBUyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDdkIsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3ZEO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO0lBQ0gsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ25DLE9BQU8sUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSyx1QkFBdUIsQ0FBQyxXQUFtQjtRQUNqRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUzRSxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QyxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLHFCQUFxQixDQUFDO0lBQy9CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQ3RCLGVBQXVCLEVBQ3ZCLFlBQXVDO1FBRXZDLElBQUksYUFBYSxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLE9BQU8sZUFBZSxDQUFDO1NBQ3hCO1FBQ0QsaUNBQWlDO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQztRQUMxQixhQUFhLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakQsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQzs7NkdBelpVLGdCQUFnQjtpSEFBaEIsZ0JBQWdCLGNBRmYsTUFBTTsyRkFFUCxnQkFBZ0I7a0JBSDVCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUN1cnJlbnRUZW5hbnQsIElDdXN0b21Qcm9wZXJ0aWVzLCBJSWRlbnRpZmllZCwgSVVzZXIgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBjYW1lbENhc2UsIGZsYXRNYXAgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBmcm9tRXZlbnQgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlbGF5LCBmaWx0ZXIsIG1hcCwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENvb2tpZUJhbm5lclNlcnZpY2UgfSBmcm9tICcuLi9ib290c3RyYXAvY29va2llLWJhbm5lci9jb29raWUtYmFubmVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vb3B0aW9ucy5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdXNlci1wcmVmZXJlbmNlcy91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUHhFdmVudERhdGEgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2RlbCc7XG5cbmludGVyZmFjZSBVc2VyUm9sZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBAcHJvcGVydHkgdXNlciBUaGUgdXNlciB3aGljaCBpcyBnaXZlbiB0byBHYWluc2lnaHQuXG4gKiBAcHJvcGVydHkgdGVuYW50IFRoZSB0ZW5hbnQgd2hpY2ggaXMgZ2l2ZW4gdG8gR2FpbnNpZ2h0LlxuICogQHByb3BlcnR5IGluc3RhbmNlSWQgRXh0cmFjdGVkIGRvbWFpbiBwYXJ0IG9mIGFuIFVSTC5cbiAqIEBwcm9wZXJ0eSB2ZXJzaW9uVUkgVGhlIFVJIHZlcnNpb24gdXNlZC5cbiAqIEBwcm9wZXJ0eSB2ZXJzaW9uQkUgVGhlIEJFIHZlcnNpb24gdXNlZC5cbiAqL1xuaW50ZXJmYWNlIElkZW50aWZ5RGF0YSB7XG4gIHVzZXI6IElVc2VyO1xuICBjdXJyZW50VGVuYW50OiBJQ3VycmVudFRlbmFudDtcbiAgaW5zdGFuY2VJZDogc3RyaW5nO1xuICB2ZXJzaW9uVUk/OiBzdHJpbmc7XG4gIHZlcnNpb25CRT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNlcnZpY2UgdG8gbWFuYWdlIHRoZSBHYWluc2lnaHQgaW50ZWdyYXRpb24uIEl0IGFsbG93cyB0byBsb2FkIHRoZVxuICogdGFnIGFuZFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBHYWluc2lnaHRTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEEgc3ViamVjdCB0aGF0IGVtaXRzIHRoZSB0YWcgZnVuY3Rpb24gYXMgc29vbiBhcyBhIG5ldyB0YWcgaXMgc2V0LlxuICAgKi9cbiAgdGFnRnVuY3Rpb24kID0gbmV3IEJlaGF2aW9yU3ViamVjdChudWxsKTtcbiAgdHJhY2tpbmdMb2FkZWQkOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcblxuICAvKipcbiAgICogR2FpbnNpZ2h0IGlzIGFjdGl2YXRlZCBvbmx5IHdoZW4gdGhlIGNvb2tpZSBiYW5uZXIgaXMgcHJlc2VudC4gSWYgZnVuY3Rpb25hbCBjb29raWVzIGFyZSBlbmFibGVkLCBib3RoIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIChQSUkpIGFuZCByZXF1aXJlZCBkYXRhIGFyZSBzZW50LlxuICAgKiBPdGhlcndpc2UsIG9ubHkgdGhlIHJlcXVpcmVkIGRhdGEgaXMgdHJhbnNtaXR0ZWQgZHVyaW5nIHRoZSBpZGVudGl0eSBzdGVwIGV4ZWN1dGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IFVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0tFWSA9ICdnYWluc2lnaHRFbmFibGVkJztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBrZXkgcmVtYWluZWQgdW5jaGFuZ2VkLCBidXQgYXBwbGllcyB0byBhbGwgZW5nYWdlbWVudHMuXG4gICAqL1xuICByZWFkb25seSBVU0VSX1BSRUZFUkVOQ0VTX0dBSU5TSUdIVF9FTkdBR0VNRU5UU19LRVkgPSAnZ2FpbnNpZ2h0Qm90RW5hYmxlZCc7XG4gIHJlYWRvbmx5IEhJREVfR0FJTlNJR0hUX0JPVF9TVFlMRV9JRCA9ICdoaWRlLWdzLWJvdCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgR0FJTlNJR0hUX1VSTCA9ICd3ZWItc2RrLmFwdHJpbnNpYy5jb20vYXBpL2FwdHJpbnNpYy5qcz9hPSc7XG4gIHByaXZhdGUgcmVhZG9ubHkgR0FJTlNJR0hUX0dMT0JBTF9TQ09QRSA9ICdhcHRyaW5zaWMnO1xuICBwcml2YXRlIHJlYWRvbmx5IFNDUklQVF9FWEVDVVRJT05fV0FJVF9USU1FID0gNTAwO1xuICBwcml2YXRlIHJlYWRvbmx5IE9QVElPTlNfS0VZX0NBVEVHT1JZID0gJ2dhaW5zaWdodCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgT1BUSU9OU19LRVlfTkFNRSA9ICdhcGkua2V5JztcbiAgcHJpdmF0ZSBpc1NjcmlwdExvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGdhaW5zaWdodEtleTogc3RyaW5nO1xuICBwcml2YXRlIGNhY2hlZFJldmVydGVkVHJhbnNsYXRpb25zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICBwcml2YXRlIGNhY2hlZExhbmd1YWdlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhcHBTdGF0ZTogQXBwU3RhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgb3B0aW9uczogT3B0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclByZWZlcmVuY2VzU2VydmljZTogVXNlclByZWZlcmVuY2VzU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBHYWluc2lnaHQgcHJlZmVyZW5jZSBpcyBkaXNhYmxlZCBpbiB1c2VyIHByZWZlcmVuY2VzLlxuICAgKiBAcGFyYW0gcHJlZmVyZW5jZU5hbWUgLSBOYW1lIG9mIHRoZSBHYWluc2lnaHQgcHJlZmVyZW5jZS5cbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYHRydWVgIGlmIHRoZSBwcmVmZXJlbmNlIGlzIGRpc2FibGVkLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIGFzeW5jIGlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMocHJlZmVyZW5jZU5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHVzZXJHYWluc2lnaHRQcmVmID0gYXdhaXQgdGhpcy51c2VyUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChwcmVmZXJlbmNlTmFtZSkudG9Qcm9taXNlKCk7XG5cbiAgICByZXR1cm4gdXNlckdhaW5zaWdodFByZWYgPT09IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBmdW5jdGlvbmFsIGNvb2tpZS5cbiAgICogQHBhcmFtIHZhbHVlIC0gQSBib29sZWFuIHZhbHVlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGZ1bmN0aW9uYWwgY29va2llIHNob3VsZCBiZSBlbmFibGVkIChgdHJ1ZWApIG9yIGRpc2FibGVkIChgZmFsc2VgKS5cbiAgICovXG4gIHNldEZ1bmN0aW9uYWxDb29raWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb29raWVzID0gdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmdldFVzZXJDb29raWVQcmVmZXJlbmNlcygpO1xuICAgIGlmIChjb29raWVzKSB7XG4gICAgICBPYmplY3Qua2V5cyhjb29raWVzKS5mb3JFYWNoKGNvb2tpZU5hbWUgPT4ge1xuICAgICAgICBpZiAoY29va2llTmFtZSA9PT0gJ2Z1bmN0aW9uYWwnKSB7XG4gICAgICAgICAgY29va2llc1tjb29raWVOYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWNjZXB0Q29va2llTm90aWNlJywgSlNPTi5zdHJpbmdpZnkoY29va2llcykpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEdhaW5zaWdodEtleSgpIHtcbiAgICB0aGlzLmdhaW5zaWdodEtleSA9XG4gICAgICB0aGlzLm9wdGlvbnMuZ2FpbnNpZ2h0S2V5IHx8XG4gICAgICAoYXdhaXQgdGhpcy5vcHRpb25zLmdldFN5c3RlbU9wdGlvbih0aGlzLk9QVElPTlNfS0VZX0NBVEVHT1JZLCB0aGlzLk9QVElPTlNfS0VZX05BTUUpKTtcbiAgICByZXR1cm4gdGhpcy5nYWluc2lnaHRLZXk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdGFnIGdsb2JhbCBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB1c2VyXG4gICAqIG9yIGFkZCBzcGVjaWFsIGV2ZW50cy5cbiAgICovXG4gIGdldCB0YWdGdW5jdGlvbigpIHtcbiAgICByZXR1cm4gKHdpbmRvdyBhcyBhbnkpW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV07XG4gIH1cblxuICAvKipcbiAgICogTG9hZCB0aGUgc2NyaXB0IHRhZyBhbmQgY2FsbHMgdGhlIGlkZW50aWZ5IGZ1bmN0aW9uIHRvIHN0YXJ0IHRoZSB0cmFja2luZy5cbiAgICogQHBhcmFtIGN1cnJlbnRUZW5hbnQgVGhlIGN1cnJlbnQgdGVuYW50LlxuICAgKiBAcGFyYW0gc2VuZFBpaURhdGEgRmxhZyBmb3Igc2VuZGluZyBwZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiAoUElJKSBkdXJpbmcgaWRlbnRpZmljYXRpb24gaW4gR2FpbnNpZ2h0LlxuICAgKi9cbiAgYXN5bmMgbG9hZFRhZyhjdXJyZW50VGVuYW50OiBJQ3VycmVudFRlbmFudCwgc2VuZFBpaURhdGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzY3JpcHRUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBjb25zdCBrZXkgPSBhd2FpdCB0aGlzLmdldEdhaW5zaWdodEtleSgpO1xuXG4gICAgaWYgKGtleSAmJiAhdGhpcy5pc1NjcmlwdExvYWRlZCkge1xuICAgICAgdGhpcy5sb2FkU2NyaXB0VGFnKHNjcmlwdFRhZywga2V5KTtcblxuICAgICAgY29uc3QgY3VycmVudFVzZXJTdHJlYW0gPSB0aGlzLmFwcFN0YXRlLmN1cnJlbnRVc2VyO1xuICAgICAgY29uc3Qgc2NyaXB0TG9hZFN0cmVhbSA9IGZyb21FdmVudChzY3JpcHRUYWcsICdsb2FkJyk7XG4gICAgICBjb25zdCB2ZXJzaW9uU3RyZWFtID0gdGhpcy5hcHBTdGF0ZS5zdGF0ZSQucGlwZShcbiAgICAgICAgZmlsdGVyKCh7IHZlcnNpb25zIH0pID0+IHZlcnNpb25zLmJhY2tlbmQpLFxuICAgICAgICBtYXAoKHsgdmVyc2lvbnMgfSkgPT4gdmVyc2lvbnMpLFxuICAgICAgICB0YWtlKDEpXG4gICAgICApO1xuXG4gICAgICBjb25zdCBzb3VyY2VTdHJlYW1zID0gc2VuZFBpaURhdGFcbiAgICAgICAgPyBbY3VycmVudFVzZXJTdHJlYW0sIHNjcmlwdExvYWRTdHJlYW0sIHZlcnNpb25TdHJlYW1dXG4gICAgICAgIDogW2N1cnJlbnRVc2VyU3RyZWFtLCBzY3JpcHRMb2FkU3RyZWFtXTtcblxuICAgICAgY29tYmluZUxhdGVzdChzb3VyY2VTdHJlYW1zKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBkZWxheSh0aGlzLlNDUklQVF9FWEVDVVRJT05fV0FJVF9USU1FKSxcbiAgICAgICAgICBmaWx0ZXIoKFt1c2VyLCBzY3JpcHRFdmVudF0pID0+ICEhKHNjcmlwdEV2ZW50ICYmIHVzZXIpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoYXJncyA9PiB7XG4gICAgICAgICAgY29uc3QgW3VzZXIsICwgdmVyc2lvbnNdID0gYXJncztcbiAgICAgICAgICB0aGlzLnNldEdsb2JhbENvbnRleHQoKTtcblxuICAgICAgICAgIGNvbnN0IGluc3RhbmNlSWQgPSB0aGlzLmdldEluc3RhbmNlSWRGcm9tVXJsKCk7XG4gICAgICAgICAgaWYgKHNlbmRQaWlEYXRhKSB7XG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9uVUk6IHN0cmluZyA9IHZlcnNpb25zLnVpLm5neDtcbiAgICAgICAgICAgIGNvbnN0IHZlcnNpb25CRTogc3RyaW5nID0gdmVyc2lvbnMuYmFja2VuZDtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVuZGVkSWRlbnRpZnlEYXRhOiBJZGVudGlmeURhdGEgPSB7XG4gICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgIGN1cnJlbnRUZW5hbnQsXG4gICAgICAgICAgICAgIGluc3RhbmNlSWQsXG4gICAgICAgICAgICAgIHZlcnNpb25VSSxcbiAgICAgICAgICAgICAgdmVyc2lvbkJFXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5pZGVudGlmeShzZW5kUGlpRGF0YSwgZXh0ZW5kZWRJZGVudGlmeURhdGEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByZXF1aXJlZElkZW50aWZ5RGF0YTogSWRlbnRpZnlEYXRhID0geyB1c2VyLCBjdXJyZW50VGVuYW50LCBpbnN0YW5jZUlkIH07XG4gICAgICAgICAgICB0aGlzLmlkZW50aWZ5KHNlbmRQaWlEYXRhLCByZXF1aXJlZElkZW50aWZ5RGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTY3JpcHRMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMudGFnRnVuY3Rpb24kLm5leHQodGhpcy50YWdGdW5jdGlvbik7XG4gICAgICAgICAgdGhpcy50cmFja2luZ0xvYWRlZCQubmV4dCh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXMgdGhlIHVzZXIvYWNjb3VudCBhdCBHYWluc2lnaHQuXG4gICAqIEBwYXJhbSBzZW5kUGlpRGF0YSBGbGFnIGZvciBzZW5kaW5nIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0gaWRlbnRpZnlEYXRhIE9iamVjdCBjb250YWluaW5nIGlkZW50aWZpY2F0aW9uIGRhdGEuXG4gICAqL1xuICBpZGVudGlmeShzZW5kUGlpRGF0YTogYm9vbGVhbiwgaWRlbnRpZnlEYXRhOiBJZGVudGlmeURhdGEpIHtcbiAgICBjb25zdCB3aW5kb3dSZWYgPSB3aW5kb3cgYXMgYW55O1xuICAgIGNvbnN0IHsgaWQ6IHVzZXJJZCwgZW1haWwsIHJvbGVzIH0gPSBpZGVudGlmeURhdGEudXNlcjtcbiAgICBjb25zdCB7IG5hbWU6IHRlbmFudElELCBjdXN0b21Qcm9wZXJ0aWVzLCBkb21haW5OYW1lIH0gPSBpZGVudGlmeURhdGEuY3VycmVudFRlbmFudDtcbiAgICBjb25zdCB7IGluc3RhbmNlSWQsIHZlcnNpb25VSSwgdmVyc2lvbkJFIH0gPSBpZGVudGlmeURhdGE7XG5cbiAgICAvKipcbiAgICAgKiBQYXNzaW5nIElEIGlzIGEgbWluaW11bSByZXF1aXJlZCBkYXRhIHRvIG1ha2UgYW4gaWRlbnRpZnkgY2FsbCB0byBHYWluc2lnaHQuXG4gICAgICogaXNVc2VyQ3JlYXRlZEFmdGVyQW5vbnltaXphdGlvbldhc0FjdGl2YXRlZCBwYXJhbWV0ZXIgaXMgcGFzc2VkIHRvIGxhdGVyIGRpc3Rpbmd1aXNoIGJldHdlZW4gdXNlcnMgY3JlYXRlZCBiZWZvcmUgYW5kIGFmdGVyIGRhdGEgYW5vbnltaXphdGlvbiBkb25lIGJ5IEdhaW5zaWdodC5cbiAgICAgKiB0ZW5hbnRJRCBVc2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGVuYW50cyB3aGVuIHNhbWUgZW1haWwgaXMgdXNlZCBmb3IgZGlmZmVyZW50IHRlbmFudHMuXG4gICAgICpcbiAgICAgKiBEdWUgdG8gR1MgbGltaXRhdGlvbnMgKEdTIGRvZXMgbm90IGFsbG93IGNsZWFyaW5nIHVzZXIgYXR0ci9wcmVmZXJlbmNlcyB2aWEgdGhlIEdTIHRhZyEpLFxuICAgICAqIHdlIGFsd2F5cyBuZWVkIHRvIGluaXRpYWxpemUgZmllbGRzIHJlbGF0ZWQgdG8gUElJIHRvIHByZXZlbnQgbGVha2luZyB0aGlzIGRhdGEgdG8gR1Mgd2hlbiB0aGUgdXNlciBoYXMgZGlzYWJsZWQgZnVuY3Rpb25hbCBjb29raWVzLlxuICAgICAqL1xuICAgIGNvbnN0IHJlcXVpcmVkSWRlbnRpZnkgPSB7XG4gICAgICAvKipcbiAgICAgICAqIEVtYWlsIHdhcyBub3QgbWFuZGF0b3J5IGZvcm0gZmllbGQgdW50aWwgMTAuMTRcbiAgICAgICAqL1xuICAgICAgaWQ6IGVtYWlsID8gZW1haWwgOiBgJHt1c2VySWR9XyR7dGVuYW50SUR9XyR7aW5zdGFuY2VJZH1gLFxuICAgICAgaXNVc2VyQ3JlYXRlZEFmdGVyQW5vbnltaXphdGlvbldhc0FjdGl2YXRlZDogdHJ1ZSxcbiAgICAgIHRlbmFudElEOiB0ZW5hbnRJRCxcbiAgICAgIGVtYWlsOiAnLS0nLFxuICAgICAgdXNlck5hbWU6ICctLScsXG4gICAgICBmaXJzdE5hbWU6ICctLScsXG4gICAgICBsYXN0TmFtZTogJy0tJyxcbiAgICAgIGRvbWFpbk5hbWUsXG4gICAgICB2ZXJzaW9uVUksXG4gICAgICB2ZXJzaW9uQkUsXG4gICAgICB1c2VyTGFuZ3VhZ2U6IHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZyxcbiAgICAgIGJyb3dzZXJMYW5ndWFnZTogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmdldEJyb3dzZXJMYW5nKCksXG4gICAgICBpbnN0YW5jZUlkLFxuICAgICAgZXh0ZXJuYWxSZWZlcmVuY2U6IGN1c3RvbVByb3BlcnRpZXM/LmV4dGVybmFsUmVmZXJlbmNlLFxuICAgICAgdXNlclJvbGVzOiB0aGlzLnRyYW5zZm9ybVVzZXJSb2xlc1RvU3RyKHJvbGVzPy5yZWZlcmVuY2VzKSxcbiAgICAgIGN1c3RvbUJyYW5kaW5nOiB0aGlzLmlzQ3VzdG9tQnJhbmRpbmcoKSxcbiAgICAgIGZ1bGxUcmFja2luZzogc2VuZFBpaURhdGFcbiAgICB9O1xuXG4gICAgaWYgKHNlbmRQaWlEYXRhKSB7XG4gICAgICBjb25zdCB7IHVzZXJOYW1lLCBmaXJzdE5hbWUsIGxhc3ROYW1lIH0gPSBpZGVudGlmeURhdGEudXNlcjtcblxuICAgICAgY29uc3QgZXh0ZW5kZWRJZGVudGlmeSA9IHtcbiAgICAgICAgLi4ucmVxdWlyZWRJZGVudGlmeSxcbiAgICAgICAgZW1haWwsXG4gICAgICAgIHVzZXJOYW1lLFxuICAgICAgICBmaXJzdE5hbWUsXG4gICAgICAgIGxhc3ROYW1lXG4gICAgICB9O1xuXG4gICAgICB3aW5kb3dSZWZbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXSgnaWRlbnRpZnknLCBleHRlbmRlZElkZW50aWZ5LCB7XG4gICAgICAgIGlkOiBgJHt0ZW5hbnRJRH1fJHtpbnN0YW5jZUlkfWAsXG4gICAgICAgIGluc3RhbmNlSWRcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvd1JlZlt0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdKCdpZGVudGlmeScsIHJlcXVpcmVkSWRlbnRpZnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGFuIGV2ZW50IHRvIGJlIHJlY29yZGVkIGJ5IEdhaW5zaWdodCBQWC5cbiAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIEdhaW5zaWdodCBQWCdzIHRyYWNraW5nIG1lY2hhbmlzbSB0byBsb2cgYSBzcGVjaWZpYyBldmVudFxuICAgKiBhbG9uZyB3aXRoIGl0cyBhc3NvY2lhdGVkIHByb3BlcnRpZXMuXG4gICAqIEBwYXJhbSBldmVudE5hbWUgLSBOYW1lIG9mIHRoZSBldmVudCB0byBiZSB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSBwcm9wcyAtIE9wdGlvbmFsIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC5cbiAgICovXG4gIHRyaWdnZXJFdmVudChldmVudE5hbWU6IHN0cmluZywgcHJvcHM/OiBQeEV2ZW50RGF0YSkge1xuICAgIGlmICh0aGlzLnRhZ0Z1bmN0aW9uICYmIGV2ZW50TmFtZSkge1xuICAgICAgZXZlbnROYW1lID0gdGhpcy5wcmVwYXJlRXZlbnROYW1lKGV2ZW50TmFtZSk7XG4gICAgICB0aGlzLnRhZ0Z1bmN0aW9uKCd0cmFjaycsIGV2ZW50TmFtZSwgcHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zbGF0ZVRvRW5nbGlzaCh0ZXh0VG9UcmFuc2xhdGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgeyBjdXJyZW50TGFuZyB9ID0gdGhpcy50cmFuc2xhdGVTZXJ2aWNlO1xuXG4gICAgaWYgKGN1cnJlbnRMYW5nID09PSAnZW4nKSB7XG4gICAgICByZXR1cm4gdGV4dFRvVHJhbnNsYXRlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50TGFuZyAmJiBjdXJyZW50TGFuZyAhPT0gdGhpcy5jYWNoZWRMYW5ndWFnZSkge1xuICAgICAgdGhpcy5jYWNoZWRSZXZlcnRlZFRyYW5zbGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMpIHtcbiAgICAgIHRoaXMuY2FjaGVkTGFuZ3VhZ2UgPSBjdXJyZW50TGFuZztcbiAgICAgIHRoaXMuY2FjaGVkUmV2ZXJ0ZWRUcmFuc2xhdGlvbnMgPSB0aGlzLmdldFJldmVydGVkVHJhbnNsYXRpb25zKGN1cnJlbnRMYW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRFblRyYW5zbGF0aW9uKHRleHRUb1RyYW5zbGF0ZSwgdGhpcy5jYWNoZWRSZXZlcnRlZFRyYW5zbGF0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIChQSUkpIHNob3VsZCBiZSBzZW50IHdoaWxlIGxvYWRpbmcgYSB0YWcuXG4gICAqIFRoZSBkZWNpc2lvbiB0byBhY3RpdmF0ZSBHYWluc2lnaHQgYW5kIHNlbmQgUElJIHJlbGllcyBvbiB3aGV0aGVyIHRoZSBjb29raWVQcmVmZXJlbmNlcyBvcHRpb24gaXMgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MsXG4gICAqIGlmIHRoZSBmdW5jdGlvbmFsIGNvb2tpZSBpcyBlbmFibGVkLCBhbmQgaWYgdGhlIHVzZXIgZ3JhbnRzIHBlcm1pc3Npb24uXG4gICAqL1xuICBhc3luYyBzaG91bGRTZW5kUGlpRGF0YSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzQ29uZmlnQ29va2llUHJlZmVyZW5jZXNEZWZpbmVkKCkgJiZcbiAgICAgIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0Z1bmN0aW9uYWxDb29raWVFbmFibGVkKCkgJiZcbiAgICAgICEoYXdhaXQgdGhpcy5pc0dhaW5zaWdodFByZWZlcmVuY2VEaXNhYmxlZEluVXNlclByZWZlcmVuY2VzKFxuICAgICAgICB0aGlzLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0tFWVxuICAgICAgKSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgYSBzcGVjaWZpYyB1c2VyIGF0dHJpYnV0ZSBpbiB0aGUgR2FpbnNpZ2h0IGdsb2JhbCBzY29wZS5cbiAgICogVGhpcyBtZXRob2QgaW50ZXJmYWNlcyB3aXRoIHRoZSBHYWluc2lnaHQgZ2xvYmFsIG9iamVjdCB0byBzZXQgYSB1c2VyJ3Mgc3BlY2lmaWMgYXR0cmlidXRlIHdpdGggYSBwcm92aWRlZCB2YWx1ZS5cbiAgICogQHBhcmFtIG5hbWUgLSBOYW1lIG9mIHRoZSB1c2VyIGF0dHJpYnV0ZSB0byBiZSB1cGRhdGVkLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBzZXQgZm9yIHRoZSBzcGVjaWZpZWQgdXNlciBhdHRyaWJ1dGUuXG4gICAqL1xuICB1cGRhdGVVc2VyQXR0cmlidXRlKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IERhdGUgfCBudW1iZXIgfCBib29sZWFuKTogdm9pZCB7XG4gICAgd2luZG93W3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0/Lignc2V0JywgJ3VzZXInLCB7IFtuYW1lXTogdmFsdWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBtb2RpZnkgR2FpbnNpZ2h0IFBYIHNldHRpbmdzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgbXVsdGlwbGUgY29uZGl0aW9uczpcbiAgICogMS4gV2hldGhlciB0cmFja2luZyBoYXMgYmVlbiBkaXNhYmxlZCBnbG9iYWxseSB2aWEgYXBwbGljYXRpb24gb3B0aW9ucy5cbiAgICogMi4gV2hldGhlciBHYWluc2lnaHQgaXMgZGlzYWJsZWQgYXQgdGhlIHRlbmFudCBsZXZlbCB0aHJvdWdoIGN1c3RvbSBwcm9wZXJ0aWVzLlxuICAgKiAzLiBXaGV0aGVyIGEgR2FpbnNpZ2h0IGtleSBpcyBhdmFpbGFibGUsIGVpdGhlciBjdXJyZW50bHkgbG9hZGVkIG9yIGZldGNoZWQgYXN5bmNocm9ub3VzbHkuXG4gICAqIDQuIFdoZXRoZXIgY29va2llIHByZWZlcmVuY2VzIGFyZSBkZWZpbmVkIGFuZCBhdmFpbGFibGUgZm9yIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuLiBUcnVlIGluZGljYXRlcyB0aGUgdXNlciBjYW4gZWRpdCBwcm9kdWN0IGV4cGVyaWVuY2Ugc2V0dGluZ3MsIGFuZCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBhc3luYyBjYW5FZGl0UHJvZHVjdEV4cGVyaWVuY2VTZXR0aW5ncygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjdXJyZW50VGVuYW50ID0gdGhpcy5hcHBTdGF0ZS5jdXJyZW50VGVuYW50LnZhbHVlO1xuICAgIGNvbnN0IHsgY3VzdG9tUHJvcGVydGllcyB9ID0gY3VycmVudFRlbmFudDtcbiAgICBpZiAoXG4gICAgICB0aGlzLmlzVHJhY2tpbmdEaXNhYmxlZCgpIHx8XG4gICAgICB0aGlzLmlzR2FpbnNpZ2h0RGlzYWJsZWRBdFRlbmFudEN1c3RvbVByb3BlcnRpZXMoY3VzdG9tUHJvcGVydGllcylcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZ2FpbnNpZ2h0S2V5ID0gISF0aGlzLmdhaW5zaWdodEtleSB8fCAhIShhd2FpdCB0aGlzLmdldEdhaW5zaWdodEtleSgpKTtcbiAgICByZXR1cm4gKFxuICAgICAgZ2FpbnNpZ2h0S2V5ICYmXG4gICAgICB0aGlzLmNvb2tpZUJhbm5lclNlcnZpY2UuaXNDb25maWdDb29raWVQcmVmZXJlbmNlc0RlZmluZWQoKSAmJlxuICAgICAgISF0aGlzLmNvb2tpZUJhbm5lclNlcnZpY2UuZ2V0VXNlckNvb2tpZVByZWZlcmVuY2VzKClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGdsb2JhbCBjb250ZXh0IGZvciBHYWluc2lnaHQgd2l0aCB0aGUgY3VycmVudCBhcHBsaWNhdGlvbiBuYW1lLlxuICAgKiBUaGUgZ2xvYmFsIGNvbnRleHQgY2FuIGJlIHV0aWxpemVkIGJ5IEdhaW5zaWdodCBmb3IgdmFyaW91cyBwdXJwb3Nlcywgc3VjaCBhcyBzZWdtZW50aW5nIHVzZXJzLlxuICAgKi9cbiAgc2V0R2xvYmFsQ29udGV4dCgpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50QXBwU3RhdGUgPSB0aGlzLmFwcFN0YXRlLnN0YXRlJC52YWx1ZTtcbiAgICBjb25zdCBjdXJyZW50QXBwTmFtZSA9IGN1cnJlbnRBcHBTdGF0ZS5hcHAubmFtZTtcblxuICAgIHdpbmRvd1t0aGlzLkdBSU5TSUdIVF9HTE9CQUxfU0NPUEVdPy4oJ3NldCcsICdnbG9iYWxDb250ZXh0JywgeyBwcm9qZWN0TmFtZTogY3VycmVudEFwcE5hbWUgfSk7XG4gIH1cblxuICB0cmFuc2Zvcm1Vc2VyUm9sZXNUb1N0cih1c2VyUm9sZXM/OiBJSWRlbnRpZmllZFtdKTogc3RyaW5nIHtcbiAgICBpZiAoIXVzZXJSb2xlcykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiBmbGF0TWFwKHVzZXJSb2xlcywgKHVzZXJSb2xlOiB7IHJvbGU6IFVzZXJSb2xlIH0pID0+IHVzZXJSb2xlLnJvbGUubmFtZSkuam9pbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBHYWluc2lnaHQgaXMgZGlzYWJsZWQgYmFzZWQgb24gdGVuYW50IGN1c3RvbSBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBAcGFyYW0gY3VzdG9tUHJvcGVydGllcyAtIFRoZSBjdXN0b20gcHJvcGVydGllcyBvZiB0aGUgdGVuYW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIEdhaW5zaWdodCBpcyBkaXNhYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgaXNHYWluc2lnaHREaXNhYmxlZEF0VGVuYW50Q3VzdG9tUHJvcGVydGllcyhjdXN0b21Qcm9wZXJ0aWVzOiBJQ3VzdG9tUHJvcGVydGllcykge1xuICAgIGNvbnN0IGdhaW5zaWdodEVuYWJsZWQgPSBjdXN0b21Qcm9wZXJ0aWVzICYmIGN1c3RvbVByb3BlcnRpZXMuZ2FpbnNpZ2h0RW5hYmxlZDtcbiAgICByZXR1cm4gZ2FpbnNpZ2h0RW5hYmxlZCA9PT0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBjdXN0b20gYnJhbmRpbmcgaXMgZW5hYmxlZCBiYXNlZCBvbiB0aGUgcHJlc2VuY2Ugb2YgYSBicmFuZCBsb2dvLlxuICAgKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIGN1c3RvbSBicmFuZGluZyBpcyBhcHBsaWVkLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBpc0N1c3RvbUJyYW5kaW5nKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGJyYW5kaW5nQ3NzVmFycyA9IHRoaXMub3B0aW9ucy5nZXQoJ2JyYW5kaW5nQ3NzVmFycycpIHx8IHt9O1xuICAgIHJldHVybiAhIWJyYW5kaW5nQ3NzVmFyc1snYnJhbmQtbG9nby1pbWcnXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRyYWNraW5nIGlzIGRpc2FibGVkIGJhc2VkIG9uIHRoZSBhcHBsaWNhdGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdHJhY2tpbmcgaXMgZGlzYWJsZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgaXNUcmFja2luZ0Rpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGlzYWJsZVRyYWNraW5nID09PSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBwcmVwYXJlRXZlbnROYW1lKGJhc2VFdmVudE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJhc2VFdmVudE5hbWVcbiAgICAgIC5zcGxpdCgnOicpXG4gICAgICAubWFwKGV2ZW50TmFtZVBhcnQgPT4gY2FtZWxDYXNlKHJlbW92ZVRyYW5zbGF0aW9uQ29udGV4dChldmVudE5hbWVQYXJ0KSkpXG4gICAgICAuam9pbignOicpO1xuXG4gICAgZnVuY3Rpb24gcmVtb3ZlVHJhbnNsYXRpb25Db250ZXh0KGV2ZW50TmFtZVBhcnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gZXZlbnROYW1lUGFydC5yZXBsYWNlKC9gW1xcd1xcV10qYC9nLCAnJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU2NyaXB0VGFnKHNjcmlwdFRhZzogSFRNTFNjcmlwdEVsZW1lbnQsIGtleTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHdpbmRvd1JlZiA9IHdpbmRvdyBhcyBhbnk7XG4gICAgICBjb25zdCBmaXJzdFRhZyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKVswXTtcbiAgICAgIGNvbnN0IHByb3RvY29sID0gbG9jYXRpb24ucHJvdG9jb2w7XG4gICAgICBjb25zdCBnYWluc2lnaHRHbG9iYWxTY29wZSA9IHRoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRTtcbiAgICAgIHNjcmlwdFRhZy5zcmMgPSBgJHtwcm90b2NvbH0vLyR7dGhpcy5HQUlOU0lHSFRfVVJMfSR7a2V5fWA7XG4gICAgICAod2luZG93UmVmW3RoaXMuR0FJTlNJR0hUX0dMT0JBTF9TQ09QRV0gPVxuICAgICAgICB3aW5kb3dSZWZbdGhpcy5HQUlOU0lHSFRfR0xPQkFMX1NDT1BFXSB8fFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6b25seS1hcnJvdy1mdW5jdGlvbnNcbiAgICAgICAgZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAod2luZG93UmVmW2dhaW5zaWdodEdsb2JhbFNjb3BlXS5xID0gd2luZG93UmVmW2dhaW5zaWdodEdsb2JhbFNjb3BlXS5xIHx8IFtdKS5wdXNoKGFyZ3MpO1xuICAgICAgICB9KSxcbiAgICAgICAgKHdpbmRvd1JlZltnYWluc2lnaHRHbG9iYWxTY29wZV0ucCA9IGtleSk7XG4gICAgICBzY3JpcHRUYWcuYXN5bmMgPSB0cnVlO1xuICAgICAgZmlyc3RUYWcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2NyaXB0VGFnLCBmaXJzdFRhZyk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgR2FpbnNpZ2h0IFBYJywgZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5zdGFuY2VJZEZyb21VcmwoKSB7XG4gICAgY29uc3QgaG9zdE5hbWUgPSBsb2NhdGlvbi5ob3N0bmFtZTtcbiAgICByZXR1cm4gaG9zdE5hbWUuc3Vic3RyaW5nKGhvc3ROYW1lLmluZGV4T2YoJy4nKSArIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVyc2VzIHRoZSB0cmFuc2xhdGlvbiBvYmplY3QuXG4gICAqXG4gICAqICoqRXhhbXBsZSoqXG4gICAqIHsgQWRkIHdpZGdldDogXCJXaWRnZXQgaGluenVmw7xnZW5cIiB9XG4gICAqXG4gICAqIHdpbGwgYmUgY2hhbmdlZCB0bzpcbiAgICpcbiAgICogeyBXaWRnZXQgaGluenVmw7xnZW46IFwiQWRkIHdpZGdldFwiIH1cbiAgICpcbiAgICogQHBhcmFtIGN1cnJlbnRMYW5nIExhbmd1YWdlIHdob3NlIHRyYW5zbGF0ZWQgdmFsdWVzIGFyZSB0byBiZSBwbGFjZWQgaW4gdGhlIG9iamVjdCBrZXkuXG4gICAqIEByZXR1cm5zIFJldHVybnMgYW4gaW52ZXJ0ZWQgb2JqZWN0IHdoZXJlIHRoZSBrZXlzIGhhdmUgYmVlbiBzd2FwcGVkIHdpdGggdGhlIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgZ2V0UmV2ZXJ0ZWRUcmFuc2xhdGlvbnMoY3VycmVudExhbmc6IHN0cmluZyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IHRoaXMudHJhbnNsYXRlU2VydmljZS5zdG9yZS50cmFuc2xhdGlvbnNbY3VycmVudExhbmddO1xuXG4gICAgY29uc3Qgc3dhcHBlZEtleXNXaXRoVmFsdWVzID0ge307XG4gICAgT2JqZWN0LmtleXModHJhbnNsYXRpb25zKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBzd2FwcGVkS2V5c1dpdGhWYWx1ZXNbdHJhbnNsYXRpb25zW2tleV1dID0ga2V5O1xuICAgIH0pO1xuICAgIHJldHVybiBzd2FwcGVkS2V5c1dpdGhWYWx1ZXM7XG4gIH1cblxuICAvKipUcmFuc2xhdGVzIHN0cmluZyBiYWNrIGludG8gRW5nbGlzaC5cbiAgICogSWYgdGhlIGN1cnJlbnQgYXBwbGljYXRpb24gbGFuZ3VhZ2UgaXMgc2V0IHRvIEVuZ2xpc2gsIHRoZSBzdHJpbmcgcGFzc2VkIGFzIGFuIGFyZ3VtZW50IGlzIHJldHVybmVkLlxuICAgKiBAcGFyYW0gdGV4dFRvVHJhbnNsYXRlIHN0cmluZyB0byB0cmFuc2xhdGUuXG4gICAqIEByZXR1cm5zIFJldHVybnMgdGhlIHN0cmluZyB0cmFuc2xhdGVkIGludG8gRW5nbGlzaC5cbiAgICovXG4gIHByaXZhdGUgZ2V0RW5UcmFuc2xhdGlvbihcbiAgICB0ZXh0VG9UcmFuc2xhdGU6IHN0cmluZyxcbiAgICB0cmFuc2xhdGlvbnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cbiAgKTogc3RyaW5nIHtcbiAgICBsZXQgZW5UcmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uc1t0ZXh0VG9UcmFuc2xhdGVdO1xuICAgIGlmICghZW5UcmFuc2xhdGlvbikge1xuICAgICAgcmV0dXJuIHRleHRUb1RyYW5zbGF0ZTtcbiAgICB9XG4gICAgLyoqIHJlbW92ZSB0cmFuc2xhdGlvbiBjb250ZXh0ICovXG4gICAgY29uc3QgcmVnZXggPSAvXFxgKC4qPylcXGAvO1xuICAgIGVuVHJhbnNsYXRpb24gPSBlblRyYW5zbGF0aW9uLnJlcGxhY2UocmVnZXgsICcnKTtcblxuICAgIHJldHVybiBlblRyYW5zbGF0aW9uO1xuICB9XG59XG4iXX0=
@@ -2,4 +2,5 @@ export * from './gainsight.service';
2
2
  export * from './product-experience.directive';
3
3
  export * from './product-experience.model';
4
4
  export * from './product-experience.module';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nYWluc2lnaHQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9wcm9kdWN0LWV4cGVyaWVuY2UubW9kdWxlJztcbiJdfQ==
5
+ export * from './user-engagements.service';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9jb3JlL3Byb2R1Y3QtZXhwZXJpZW5jZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsNEJBQTRCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2dhaW5zaWdodC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vcHJvZHVjdC1leHBlcmllbmNlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2RlbCc7XG5leHBvcnQgKiBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi91c2VyLWVuZ2FnZW1lbnRzLnNlcnZpY2UnO1xuIl19
@@ -3,59 +3,77 @@ import { combineLatest } from 'rxjs';
3
3
  import { filter } from 'rxjs/operators';
4
4
  import { CookieBannerService } from '../bootstrap/cookie-banner/cookie-banner.service';
5
5
  import { AppStateService } from '../common/ui-state.service';
6
- import { UserPreferencesService } from '../common/user-preferences/user-preferences.service';
7
6
  import { GainsightService } from './gainsight.service';
8
7
  import { ProductExperienceDirective } from './product-experience.directive';
8
+ import { UserEngagementsService } from './user-engagements.service';
9
9
  import * as i0 from "@angular/core";
10
10
  import * as i1 from "../common/ui-state.service";
11
11
  import * as i2 from "./gainsight.service";
12
12
  import * as i3 from "../bootstrap/cookie-banner/cookie-banner.service";
13
- import * as i4 from "../common/user-preferences/user-preferences.service";
13
+ import * as i4 from "./user-engagements.service";
14
14
  /**
15
15
  * This module enables an tenant to activate the product experience
16
16
  * software [Gainsight](https://www.gainsight.com/product-experience/) to help
17
- * and track user actions. Gainsight is only activated, if the tenant custom
18
- * property `gainsightEnabled` is set to true.
17
+ * and track user actions.
19
18
  */
20
19
  export class ProductExperienceModule {
21
- constructor(appState, gainsightService, cookieBannerService, userPreferencesService) {
20
+ constructor(appState, gainsightService, cookieBannerService,
21
+ // Don't remove it, otherwise UserEngagementsService won't be initialized.
22
+ userEngagementsService) {
22
23
  this.appState = appState;
23
24
  this.gainsightService = gainsightService;
24
25
  this.cookieBannerService = cookieBannerService;
25
- this.userPreferencesService = userPreferencesService;
26
+ this.userEngagementsService = userEngagementsService;
27
+ /**
28
+ * Check if the Gainsight tracking is disabled in the application apptions. If so, exit early without processing further.
29
+ */
30
+ if (this.gainsightService.isTrackingDisabled()) {
31
+ return;
32
+ }
33
+ this.toggleUserTrackingObservable();
34
+ }
35
+ /**
36
+ * Observes several factors to determine the state of user tracking and manages the visibility of Gainsight engagements.
37
+ * It watches for changes in the current tenant, the state of the cookie banner, and user's preferences for Gainsight engagements.
38
+ *
39
+ * 1. If the cookie banner is being displayed, it returns without making any changes.
40
+ * 2. If Gainsight is disabled at the tenant level via custom properties, it returns without making any changes.
41
+ * 3. If the conditions are met for loading the Gainsight tag, it loads the tag.
42
+ */
43
+ toggleUserTrackingObservable() {
26
44
  combineLatest([
27
45
  this.appState.currentTenant.pipe(filter(Boolean)),
28
- this.cookieBannerService.isCookieBannerShowed$,
29
- this.userPreferencesService.observe(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY)
30
- ]).subscribe(async ([currentTenant, isCookieBannerShowed, showGainsightEngagements]) => {
46
+ this.cookieBannerService.isCookieBannerShowed$
47
+ ]).subscribe(async ([currentTenant, isCookieBannerShowed]) => {
31
48
  if (isCookieBannerShowed) {
32
49
  return;
33
50
  }
34
51
  const { customProperties } = currentTenant;
35
- if (this.gainsightService.shouldLoadGainsightTag(customProperties) &&
36
- !(await this.gainsightService.isGainsightPreferenceDisabledInUserPreferences(this.gainsightService.USER_PREFERENCES_GAINSIGHT_KEY))) {
37
- this.gainsightService.loadTag(currentTenant);
52
+ if (this.gainsightService.isGainsightDisabledAtTenantCustomProperties(customProperties)) {
53
+ return;
38
54
  }
39
- /**
40
- * In case the user preference for Gainsight bot does not exist the default value is set to true and saved in user preferences
41
- */
42
- if (showGainsightEngagements === undefined) {
43
- showGainsightEngagements = true;
44
- userPreferencesService.set(this.gainsightService.USER_PREFERENCES_GAINSIGHT_ENGAGEMENTS_KEY, showGainsightEngagements);
55
+ if (this.shouldLoadTag()) {
56
+ await this.gainsightService.loadTag(currentTenant, await this.gainsightService.shouldSendPiiData());
45
57
  }
46
- this.gainsightService.switchGainsightEngagementsVisibility(showGainsightEngagements);
47
58
  });
48
59
  }
60
+ /**
61
+ * Determines if a tracking tag should be loaded based on cookie preferences.
62
+ * @returns `true` if user cookie preferences exist, otherwise `false`.
63
+ */
64
+ shouldLoadTag() {
65
+ return !!this.cookieBannerService.getUserCookiePreferences();
66
+ }
49
67
  }
50
- ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: i1.AppStateService }, { token: i2.GainsightService }, { token: i3.CookieBannerService }, { token: i4.UserPreferencesService }], target: i0.ɵɵFactoryTarget.NgModule });
68
+ ProductExperienceModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, deps: [{ token: i1.AppStateService }, { token: i2.GainsightService }, { token: i3.CookieBannerService }, { token: i4.UserEngagementsService }], target: i0.ɵɵFactoryTarget.NgModule });
51
69
  ProductExperienceModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, declarations: [ProductExperienceDirective], exports: [ProductExperienceDirective] });
52
- ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService] });
70
+ ProductExperienceModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, providers: [GainsightService, UserEngagementsService] });
53
71
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: ProductExperienceModule, decorators: [{
54
72
  type: NgModule,
55
73
  args: [{
56
74
  declarations: [ProductExperienceDirective],
57
75
  exports: [ProductExperienceDirective],
58
- providers: [GainsightService]
76
+ providers: [GainsightService, UserEngagementsService]
59
77
  }]
60
- }], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.GainsightService }, { type: i3.CookieBannerService }, { type: i4.UserPreferencesService }]; } });
61
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1leHBlcmllbmNlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvcHJvZHVjdC1leHBlcmllbmNlL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDN0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7OztBQUM1RTs7Ozs7R0FLRztBQU1ILE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsWUFDVSxRQUF5QixFQUN6QixnQkFBa0MsRUFDbEMsbUJBQXdDLEVBQ3hDLHNCQUE4QztRQUg5QyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUV0RCxhQUFhLENBQUM7WUFDWixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFpQixPQUFPLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsbUJBQW1CLENBQUMscUJBQXFCO1lBQzlDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywwQ0FBMEMsQ0FDakU7U0FDRixDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsQ0FBQyxFQUFFLEVBQUU7WUFDckYsSUFBSSxvQkFBb0IsRUFBRTtnQkFDeEIsT0FBTzthQUNSO1lBQ0QsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsYUFBYSxDQUFDO1lBQzNDLElBQ0UsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDO2dCQUM5RCxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsOENBQThDLENBQzFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw4QkFBOEIsQ0FDckQsQ0FBQyxFQUNGO2dCQUNBLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDOUM7WUFFRDs7ZUFFRztZQUNILElBQUksd0JBQXdCLEtBQUssU0FBUyxFQUFFO2dCQUMxQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7Z0JBQ2hDLHNCQUFzQixDQUFDLEdBQUcsQ0FDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDBDQUEwQyxFQUNoRSx3QkFBd0IsQ0FDekIsQ0FBQzthQUNIO1lBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG9DQUFvQyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDdkYsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztvSEF2Q1UsdUJBQXVCO3FIQUF2Qix1QkFBdUIsaUJBSm5CLDBCQUEwQixhQUMvQiwwQkFBMEI7cUhBR3pCLHVCQUF1QixhQUZ2QixDQUFDLGdCQUFnQixDQUFDOzJGQUVsQix1QkFBdUI7a0JBTG5DLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsMEJBQTBCLENBQUM7b0JBQzFDLE9BQU8sRUFBRSxDQUFDLDBCQUEwQixDQUFDO29CQUNyQyxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztpQkFDOUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUN1cnJlbnRUZW5hbnQgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29raWVCYW5uZXJTZXJ2aWNlIH0gZnJvbSAnLi4vYm9vdHN0cmFwL2Nvb2tpZS1iYW5uZXIvY29va2llLWJhbm5lci5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFN0YXRlU2VydmljZSB9IGZyb20gJy4uL2NvbW1vbi91aS1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFVzZXJQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdXNlci1wcmVmZXJlbmNlcy91c2VyLXByZWZlcmVuY2VzLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2FpbnNpZ2h0U2VydmljZSB9IGZyb20gJy4vZ2FpbnNpZ2h0LnNlcnZpY2UnO1xuaW1wb3J0IHsgUHJvZHVjdEV4cGVyaWVuY2VEaXJlY3RpdmUgfSBmcm9tICcuL3Byb2R1Y3QtZXhwZXJpZW5jZS5kaXJlY3RpdmUnO1xuLyoqXG4gKiBUaGlzIG1vZHVsZSBlbmFibGVzIGFuIHRlbmFudCB0byBhY3RpdmF0ZSB0aGUgcHJvZHVjdCBleHBlcmllbmNlXG4gKiBzb2Z0d2FyZSBbR2FpbnNpZ2h0XShodHRwczovL3d3dy5nYWluc2lnaHQuY29tL3Byb2R1Y3QtZXhwZXJpZW5jZS8pIHRvIGhlbHBcbiAqIGFuZCB0cmFjayB1c2VyIGFjdGlvbnMuIEdhaW5zaWdodCBpcyBvbmx5IGFjdGl2YXRlZCwgaWYgdGhlIHRlbmFudCBjdXN0b21cbiAqIHByb3BlcnR5IGBnYWluc2lnaHRFbmFibGVkYCBpcyBzZXQgdG8gdHJ1ZS5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbUHJvZHVjdEV4cGVyaWVuY2VEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbUHJvZHVjdEV4cGVyaWVuY2VEaXJlY3RpdmVdLFxuICBwcm92aWRlcnM6IFtHYWluc2lnaHRTZXJ2aWNlXVxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0RXhwZXJpZW5jZU1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwU3RhdGU6IEFwcFN0YXRlU2VydmljZSxcbiAgICBwcml2YXRlIGdhaW5zaWdodFNlcnZpY2U6IEdhaW5zaWdodFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb29raWVCYW5uZXJTZXJ2aWNlOiBDb29raWVCYW5uZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclByZWZlcmVuY2VzU2VydmljZTogVXNlclByZWZlcmVuY2VzU2VydmljZVxuICApIHtcbiAgICBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuYXBwU3RhdGUuY3VycmVudFRlbmFudC5waXBlKGZpbHRlcjxJQ3VycmVudFRlbmFudD4oQm9vbGVhbikpLFxuICAgICAgdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmlzQ29va2llQmFubmVyU2hvd2VkJCxcbiAgICAgIHRoaXMudXNlclByZWZlcmVuY2VzU2VydmljZS5vYnNlcnZlPGJvb2xlYW4+KFxuICAgICAgICB0aGlzLmdhaW5zaWdodFNlcnZpY2UuVVNFUl9QUkVGRVJFTkNFU19HQUlOU0lHSFRfRU5HQUdFTUVOVFNfS0VZXG4gICAgICApXG4gICAgXSkuc3Vic2NyaWJlKGFzeW5jIChbY3VycmVudFRlbmFudCwgaXNDb29raWVCYW5uZXJTaG93ZWQsIHNob3dHYWluc2lnaHRFbmdhZ2VtZW50c10pID0+IHtcbiAgICAgIGlmIChpc0Nvb2tpZUJhbm5lclNob3dlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IGN1c3RvbVByb3BlcnRpZXMgfSA9IGN1cnJlbnRUZW5hbnQ7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5zaG91bGRMb2FkR2FpbnNpZ2h0VGFnKGN1c3RvbVByb3BlcnRpZXMpICYmXG4gICAgICAgICEoYXdhaXQgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLmlzR2FpbnNpZ2h0UHJlZmVyZW5jZURpc2FibGVkSW5Vc2VyUHJlZmVyZW5jZXMoXG4gICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0tFWVxuICAgICAgICApKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5sb2FkVGFnKGN1cnJlbnRUZW5hbnQpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIEluIGNhc2UgdGhlIHVzZXIgcHJlZmVyZW5jZSBmb3IgR2FpbnNpZ2h0IGJvdCBkb2VzIG5vdCBleGlzdCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSBhbmQgc2F2ZWQgaW4gdXNlciBwcmVmZXJlbmNlc1xuICAgICAgICovXG4gICAgICBpZiAoc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzID0gdHJ1ZTtcbiAgICAgICAgdXNlclByZWZlcmVuY2VzU2VydmljZS5zZXQoXG4gICAgICAgICAgdGhpcy5nYWluc2lnaHRTZXJ2aWNlLlVTRVJfUFJFRkVSRU5DRVNfR0FJTlNJR0hUX0VOR0FHRU1FTlRTX0tFWSxcbiAgICAgICAgICBzaG93R2FpbnNpZ2h0RW5nYWdlbWVudHNcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5zd2l0Y2hHYWluc2lnaHRFbmdhZ2VtZW50c1Zpc2liaWxpdHkoc2hvd0dhaW5zaWdodEVuZ2FnZW1lbnRzKTtcbiAgICB9KTtcbiAgfVxufVxuIl19
78
+ }], ctorParameters: function () { return [{ type: i1.AppStateService }, { type: i2.GainsightService }, { type: i3.CookieBannerService }, { type: i4.UserEngagementsService }]; } });
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1leHBlcmllbmNlLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvcHJvZHVjdC1leHBlcmllbmNlL3Byb2R1Y3QtZXhwZXJpZW5jZS5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUN2RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7OztBQUNwRTs7OztHQUlHO0FBTUgsTUFBTSxPQUFPLHVCQUF1QjtJQUNsQyxZQUNVLFFBQXlCLEVBQ3pCLGdCQUFrQyxFQUNsQyxtQkFBd0M7SUFDaEQsMEVBQTBFO0lBQ2xFLHNCQUE4QztRQUo5QyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUN6QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFFeEMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUV0RDs7V0FFRztRQUNILElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLEVBQUU7WUFDOUMsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCw0QkFBNEI7UUFDMUIsYUFBYSxDQUFDO1lBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBaUIsT0FBTyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHFCQUFxQjtTQUMvQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLGFBQWEsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLEVBQUU7WUFDM0QsSUFBSSxvQkFBb0IsRUFBRTtnQkFDeEIsT0FBTzthQUNSO1lBQ0QsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsYUFBYSxDQUFDO1lBRTNDLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLDJDQUEyQyxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQ3ZGLE9BQU87YUFDUjtZQUVELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFO2dCQUN4QixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQ2pDLGFBQWEsRUFDYixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUNoRCxDQUFDO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxhQUFhO1FBQ1gsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDL0QsQ0FBQzs7b0hBdERVLHVCQUF1QjtxSEFBdkIsdUJBQXVCLGlCQUpuQiwwQkFBMEIsYUFDL0IsMEJBQTBCO3FIQUd6Qix1QkFBdUIsYUFGdkIsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBc0IsQ0FBQzsyRkFFMUMsdUJBQXVCO2tCQUxuQyxRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRSxDQUFDLDBCQUEwQixDQUFDO29CQUMxQyxPQUFPLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztvQkFDckMsU0FBUyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsc0JBQXNCLENBQUM7aUJBQ3REIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElDdXJyZW50VGVuYW50IH0gZnJvbSAnQGM4eS9jbGllbnQnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgQ29va2llQmFubmVyU2VydmljZSB9IGZyb20gJy4uL2Jvb3RzdHJhcC9jb29raWUtYmFubmVyL2Nvb2tpZS1iYW5uZXIuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24vdWktc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBHYWluc2lnaHRTZXJ2aWNlIH0gZnJvbSAnLi9nYWluc2lnaHQuc2VydmljZSc7XG5pbXBvcnQgeyBQcm9kdWN0RXhwZXJpZW5jZURpcmVjdGl2ZSB9IGZyb20gJy4vcHJvZHVjdC1leHBlcmllbmNlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBVc2VyRW5nYWdlbWVudHNTZXJ2aWNlIH0gZnJvbSAnLi91c2VyLWVuZ2FnZW1lbnRzLnNlcnZpY2UnO1xuLyoqXG4gKiBUaGlzIG1vZHVsZSBlbmFibGVzIGFuIHRlbmFudCB0byBhY3RpdmF0ZSB0aGUgcHJvZHVjdCBleHBlcmllbmNlXG4gKiBzb2Z0d2FyZSBbR2FpbnNpZ2h0XShodHRwczovL3d3dy5nYWluc2lnaHQuY29tL3Byb2R1Y3QtZXhwZXJpZW5jZS8pIHRvIGhlbHBcbiAqIGFuZCB0cmFjayB1c2VyIGFjdGlvbnMuXG4gKi9cbkBOZ01vZHVsZSh7XG4gIGRlY2xhcmF0aW9uczogW1Byb2R1Y3RFeHBlcmllbmNlRGlyZWN0aXZlXSxcbiAgZXhwb3J0czogW1Byb2R1Y3RFeHBlcmllbmNlRGlyZWN0aXZlXSxcbiAgcHJvdmlkZXJzOiBbR2FpbnNpZ2h0U2VydmljZSwgVXNlckVuZ2FnZW1lbnRzU2VydmljZV1cbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdEV4cGVyaWVuY2VNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFwcFN0YXRlOiBBcHBTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBnYWluc2lnaHRTZXJ2aWNlOiBHYWluc2lnaHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29va2llQmFubmVyU2VydmljZTogQ29va2llQmFubmVyU2VydmljZSxcbiAgICAvLyBEb24ndCByZW1vdmUgaXQsIG90aGVyd2lzZSBVc2VyRW5nYWdlbWVudHNTZXJ2aWNlIHdvbid0IGJlIGluaXRpYWxpemVkLlxuICAgIHByaXZhdGUgdXNlckVuZ2FnZW1lbnRzU2VydmljZTogVXNlckVuZ2FnZW1lbnRzU2VydmljZVxuICApIHtcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgR2FpbnNpZ2h0IHRyYWNraW5nIGlzIGRpc2FibGVkIGluIHRoZSBhcHBsaWNhdGlvbiBhcHB0aW9ucy4gSWYgc28sIGV4aXQgZWFybHkgd2l0aG91dCBwcm9jZXNzaW5nIGZ1cnRoZXIuXG4gICAgICovXG4gICAgaWYgKHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5pc1RyYWNraW5nRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRvZ2dsZVVzZXJUcmFja2luZ09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlcyBzZXZlcmFsIGZhY3RvcnMgdG8gZGV0ZXJtaW5lIHRoZSBzdGF0ZSBvZiB1c2VyIHRyYWNraW5nIGFuZCBtYW5hZ2VzIHRoZSB2aXNpYmlsaXR5IG9mIEdhaW5zaWdodCBlbmdhZ2VtZW50cy5cbiAgICogSXQgd2F0Y2hlcyBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB0ZW5hbnQsIHRoZSBzdGF0ZSBvZiB0aGUgY29va2llIGJhbm5lciwgYW5kIHVzZXIncyBwcmVmZXJlbmNlcyBmb3IgR2FpbnNpZ2h0IGVuZ2FnZW1lbnRzLlxuICAgKlxuICAgKiAxLiBJZiB0aGUgY29va2llIGJhbm5lciBpcyBiZWluZyBkaXNwbGF5ZWQsIGl0IHJldHVybnMgd2l0aG91dCBtYWtpbmcgYW55IGNoYW5nZXMuXG4gICAqIDIuIElmIEdhaW5zaWdodCBpcyBkaXNhYmxlZCBhdCB0aGUgdGVuYW50IGxldmVsIHZpYSBjdXN0b20gcHJvcGVydGllcywgaXQgcmV0dXJucyB3aXRob3V0IG1ha2luZyBhbnkgY2hhbmdlcy5cbiAgICogMy4gSWYgdGhlIGNvbmRpdGlvbnMgYXJlIG1ldCBmb3IgbG9hZGluZyB0aGUgR2FpbnNpZ2h0IHRhZywgaXQgbG9hZHMgdGhlIHRhZy5cbiAgICovXG4gIHRvZ2dsZVVzZXJUcmFja2luZ09ic2VydmFibGUoKSB7XG4gICAgY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmFwcFN0YXRlLmN1cnJlbnRUZW5hbnQucGlwZShmaWx0ZXI8SUN1cnJlbnRUZW5hbnQ+KEJvb2xlYW4pKSxcbiAgICAgIHRoaXMuY29va2llQmFubmVyU2VydmljZS5pc0Nvb2tpZUJhbm5lclNob3dlZCRcbiAgICBdKS5zdWJzY3JpYmUoYXN5bmMgKFtjdXJyZW50VGVuYW50LCBpc0Nvb2tpZUJhbm5lclNob3dlZF0pID0+IHtcbiAgICAgIGlmIChpc0Nvb2tpZUJhbm5lclNob3dlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB7IGN1c3RvbVByb3BlcnRpZXMgfSA9IGN1cnJlbnRUZW5hbnQ7XG5cbiAgICAgIGlmICh0aGlzLmdhaW5zaWdodFNlcnZpY2UuaXNHYWluc2lnaHREaXNhYmxlZEF0VGVuYW50Q3VzdG9tUHJvcGVydGllcyhjdXN0b21Qcm9wZXJ0aWVzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnNob3VsZExvYWRUYWcoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmdhaW5zaWdodFNlcnZpY2UubG9hZFRhZyhcbiAgICAgICAgICBjdXJyZW50VGVuYW50LFxuICAgICAgICAgIGF3YWl0IHRoaXMuZ2FpbnNpZ2h0U2VydmljZS5zaG91bGRTZW5kUGlpRGF0YSgpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIHRyYWNraW5nIHRhZyBzaG91bGQgYmUgbG9hZGVkIGJhc2VkIG9uIGNvb2tpZSBwcmVmZXJlbmNlcy5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIHVzZXIgY29va2llIHByZWZlcmVuY2VzIGV4aXN0LCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHNob3VsZExvYWRUYWcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5jb29raWVCYW5uZXJTZXJ2aWNlLmdldFVzZXJDb29raWVQcmVmZXJlbmNlcygpO1xuICB9XG59XG4iXX0=