@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
157 lines • 21.3 kB
JavaScript
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
import { OptionsService } from '../../common/options.service';
import { gettext } from '../../i18n/gettext';
import * as i0 from "@angular/core";
import * as i1 from "../../common/options.service";
/**
* This service is handling the cookie banner and cookie preferences related logic.
*/
export class CookieBannerService {
constructor(options) {
this.options = options;
this.STORAGE_KEY = 'acceptCookieNotice';
this.COOKIE_BANNER = 'cookieBanner';
this.PREVIEW_COOKIE_BANNER = 'previewCookieBanner';
this.IS_PREVIEW = 'preview';
this.COOKIE_PREFERENCES_CONFIG = 'cookiePreferences';
this.isCookieBannerShowed$ = new Subject();
this.cookieDescriptions = {
required: gettext("These cookies are required to enable core site functionality. They perform a task or operation without which a site's functionality would not be possible."),
functional: gettext('These cookies are used to support you during your first steps with the product, to deliver content tailored to your needs, and to collect usage statistics.'),
marketing: gettext('These cookies are used to target advertising to a user.')
};
}
/**
* Returns Cookie preferences configuration.
* @returns {object} Return an object with cookie preferences configuration defined in application options.
*/
getCookiePreferencesConfig() {
return this.options.get(this.COOKIE_PREFERENCES_CONFIG);
}
/**
* Returns Cookie banner configuration.
* @returns {object} Return an object with cookie banner configuration defined in application options.
*/
getCookieBannerSettings() {
let cookieSettings;
if (this.isPreviewMode()) {
cookieSettings = this.options.get(this.PREVIEW_COOKIE_BANNER);
if (cookieSettings) {
return cookieSettings;
}
}
cookieSettings = this.options.get(this.COOKIE_BANNER) || {};
return cookieSettings;
}
/**
* Converts the cookie preferences to boolean. Sets the cookie preferences configuration in local storage.
* @param {object} cookiePreferences Object with cookie preferences configuration
*/
setCookies(cookiePreferences, policyVersion) {
const cookiesToSet = { ...cookiePreferences };
Object.entries(cookiesToSet).forEach(([cookieName, cookieValue]) => {
cookiesToSet[cookieName] = typeof cookieValue === 'string' ? true : cookieValue;
});
if (policyVersion) {
cookiesToSet.policyVersion = policyVersion;
}
localStorage.setItem(this.STORAGE_KEY, JSON.stringify(cookiesToSet));
}
/**
* Verifies that cookie banner should be shown.
* @returns {boolean} Returns if the cookie banner should be shown.
*/
shouldShowCookieBanner() {
const settings = this.getCookieBannerSettings();
// always show cookie banner in preview mode except when cookie banner is disabled
if (this.isPreviewMode()) {
return !(settings && settings.cookieBannerDisabled);
}
// no cookie banner text or cookie banner is disabled
if (settings.cookieBannerDisabled || !settings.cookieBannerText) {
return false;
}
const userCookiePreferences = this.getUserCookiePreferences();
// no cookies accepted
if (!userCookiePreferences) {
return true;
}
// policy version changed
if (settings.policyVersion && userCookiePreferences.policyVersion !== settings.policyVersion) {
return true;
}
// cookies have been accepted in the current policy version.
return false;
}
/**
* Gets the cookie preferences configuration from local storage.
* @returns {object} Object with cookie preferences configuration.
*/
getUserCookiePreferences() {
return JSON.parse(localStorage.getItem(this.STORAGE_KEY));
}
/**
* Verifies that cookie preferences configuration is defined in the application options.
* @returns {boolean} Returns if the cookie preferences configuration is defined.
*/
isConfigCookiePreferencesDefined() {
return !!this.getCookiePreferencesConfig();
}
/**
* Verifies that functional cookies are enabled.
* @returns {boolean} True when functional cookies are enabled.
*/
isFunctionalCookieEnabled() {
const { functional } = this.getUserCookiePreferences() || {};
return functional === true;
}
/**
* Description of cookies.
* @param {'required' | 'functional' | 'marketing'} cookieType Takes one of the following options: 'required', 'functional', 'marketing'.
* @returns {string} The default cookie description, if not explicitly defined in application options.
*/
getCookieDescription(cookieType) {
const cookieBannerConfigSettings = this.getCookiePreferencesConfig();
const cookieBannerSettingValue = cookieBannerConfigSettings[cookieType];
return typeof cookieBannerSettingValue === 'string'
? cookieBannerSettingValue
: this.cookieDescriptions[cookieType];
}
/**
* Transforms cookie preferences configuration object to an array of cookie preferences objects. Each object in returned array contains cookie 'name', 'value' and 'isReadonly' property.
* @param {object} cookiePreferences.
* @returns {Array} Array shows if the cookie is Readonly.
*/
transformCookiePreferencesToList(cookiePreferences) {
return Object.entries(cookiePreferences).map(([name, value]) => {
const isReadonly = name === 'required';
return { name, value, isReadonly };
});
}
/**
* Transforms an array of cookie preferences objects to cookie preferences configuration object.
* @param {Array} cookiePreferencesList Array of cookie preferences.
* @returns {object} An object with cookie preferences configuration.
*/
transformCookiePreferencesListToCookiePreferences(cookiePreferencesList) {
return cookiePreferencesList.reduce((cookiePref, cookie) => {
const key = cookie.name;
cookiePref[key] = cookie.value;
return cookiePref;
}, {});
}
isPreviewMode() {
// params from url are automatically resolved during bootstrap as string options, see: packages/cli/src/app-bootstrap/options.ts
return this.options.get(this.IS_PREVIEW, false, true);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CookieBannerService, deps: [{ token: i1.OptionsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CookieBannerService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CookieBannerService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: () => [{ type: i1.OptionsService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLWJhbm5lci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vY29yZS9ib290c3RyYXAvY29va2llLWJhbm5lci9jb29raWUtYmFubmVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQUc3Qzs7R0FFRztBQUlILE1BQU0sT0FBTyxtQkFBbUI7SUFrQjlCLFlBQW9CLE9BQXVCO1FBQXZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBakJsQyxnQkFBVyxHQUFXLG9CQUFvQixDQUFDO1FBQzNDLGtCQUFhLEdBQUcsY0FBYyxDQUFDO1FBQy9CLDBCQUFxQixHQUFHLHFCQUFxQixDQUFDO1FBQzlDLGVBQVUsR0FBRyxTQUFTLENBQUM7UUFDdkIsOEJBQXlCLEdBQUcsbUJBQW1CLENBQUM7UUFDekQsMEJBQXFCLEdBQXFCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFeEQsdUJBQWtCLEdBQUc7WUFDbkIsUUFBUSxFQUFFLE9BQU8sQ0FDZiw0SkFBNEosQ0FDN0o7WUFDRCxVQUFVLEVBQUUsT0FBTyxDQUNqQiw2SkFBNkosQ0FDOUo7WUFDRCxTQUFTLEVBQUUsT0FBTyxDQUFDLHlEQUF5RCxDQUFDO1NBQzlFLENBQUM7SUFFNEMsQ0FBQztJQUUvQzs7O09BR0c7SUFDSCwwQkFBMEI7UUFDeEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsdUJBQXVCO1FBQ3JCLElBQUksY0FBNkMs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dCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPcHRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uL2NvbW1vbi9vcHRpb25zLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0dGV4dCB9IGZyb20gJy4uLy4uL2kxOG4vZ2V0dGV4dCc7XG5pbXBvcnQgeyBDb29raWUsIENvb2tpZUJhbm5lclNldHRpbmdzLCBDb29raWVQcmVmZXJlbmNlcyB9IGZyb20gJy4vY29va2llLWJhbm5lci5tb2RlbCc7XG5cbi8qKlxuICogVGhpcyBzZXJ2aWNlIGlzIGhhbmRsaW5nIHRoZSBjb29raWUgYmFubmVyIGFuZCBjb29raWUgcHJlZmVyZW5jZXMgcmVsYXRlZCBsb2dpYy5cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29va2llQmFubmVyU2VydmljZSB7XG4gIHJlYWRvbmx5IFNUT1JBR0VfS0VZOiBzdHJpbmcgPSAnYWNjZXB0Q29va2llTm90aWNlJztcbiAgcmVhZG9ubHkgQ09PS0lFX0JBTk5FUiA9ICdjb29raWVCYW5uZXInO1xuICByZWFkb25seSBQUkVWSUVXX0NPT0tJRV9CQU5ORVIgPSAncHJldmlld0Nvb2tpZUJhbm5lcic7XG4gIHJlYWRvbmx5IElTX1BSRVZJRVcgPSAncHJldmlldyc7XG4gIHJlYWRvbmx5IENPT0tJRV9QUkVGRVJFTkNFU19DT05GSUcgPSAnY29va2llUHJlZmVyZW5jZXMnO1xuICBpc0Nvb2tpZUJhbm5lclNob3dlZCQ6IFN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIGNvb2tpZURlc2NyaXB0aW9ucyA9IHtcbiAgICByZXF1aXJlZDogZ2V0dGV4dChcbiAgICAgIFwiVGhlc2UgY29va2llcyBhcmUgcmVxdWlyZWQgdG8gZW5hYmxlIGNvcmUgc2l0ZSBmdW5jdGlvbmFsaXR5LiBUaGV5IHBlcmZvcm0gYSB0YXNrIG9yIG9wZXJhdGlvbiB3aXRob3V0IHdoaWNoIGEgc2l0ZSdzIGZ1bmN0aW9uYWxpdHkgd291bGQgbm90IGJlIHBvc3NpYmxlLlwiXG4gICAgKSxcbiAgICBmdW5jdGlvbmFsOiBnZXR0ZXh0KFxuICAgICAgJ1RoZXNlIGNvb2tpZXMgYXJlIHVzZWQgdG8gc3VwcG9ydCB5b3UgZHVyaW5nIHlvdXIgZmlyc3Qgc3RlcHMgd2l0aCB0aGUgcHJvZHVjdCwgdG8gZGVsaXZlciBjb250ZW50IHRhaWxvcmVkIHRvIHlvdXIgbmVlZHMsIGFuZCB0byBjb2xsZWN0IHVzYWdlIHN0YXRpc3RpY3MuJ1xuICAgICksXG4gICAgbWFya2V0aW5nOiBnZXR0ZXh0KCdUaGVzZSBjb29raWVzIGFyZSB1c2VkIHRvIHRhcmdldCBhZHZlcnRpc2luZyB0byBhIHVzZXIuJylcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9wdGlvbnM6IE9wdGlvbnNTZXJ2aWNlKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIENvb2tpZSBwcmVmZXJlbmNlcyBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBSZXR1cm4gYW4gb2JqZWN0IHdpdGggY29va2llIHByZWZlcmVuY2VzIGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBpbiBhcHBsaWNhdGlvbiBvcHRpb25zLlxuICAgKi9cbiAgZ2V0Q29va2llUHJlZmVyZW5jZXNDb25maWcoKTogQ29va2llUHJlZmVyZW5jZXMge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ2V0KHRoaXMuQ09PS0lFX1BSRUZFUkVOQ0VTX0NPTkZJRyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBDb29raWUgYmFubmVyIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHtvYmplY3R9IFJldHVybiBhbiBvYmplY3Qgd2l0aCBjb29raWUgYmFubmVyIGNvbmZpZ3VyYXRpb24gZGVmaW5lZCBpbiBhcHBsaWNhdGlvbiBvcHRpb25zLlxuICAgKi9cbiAgZ2V0Q29va2llQmFubmVyU2V0dGluZ3MoKTogUGFydGlhbDxDb29raWVCYW5uZXJTZXR0aW5ncz4ge1xuICAgIGxldCBjb29raWVTZXR0aW5nczogUGFydGlhbDxDb29raWVCYW5uZXJTZXR0aW5ncz47XG4gICAgaWYgKHRoaXMuaXNQcmV2aWV3TW9kZSgpKSB7XG4gICAgICBjb29raWVTZXR0aW5ncyA9IHRoaXMub3B0aW9ucy5nZXQodGhpcy5QUkVWSUVXX0NPT0tJRV9CQU5ORVIpO1xuICAgICAgaWYgKGNvb2tpZVNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBjb29raWVTZXR0aW5ncztcbiAgICAgIH1cbiAgICB9XG4gICAgY29va2llU2V0dGluZ3MgPSB0aGlzLm9wdGlvbnMuZ2V0KHRoaXMuQ09PS0lFX0JBTk5FUikgfHwge307XG4gICAgcmV0dXJuIGNvb2tpZVNldHRpbmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBjb29raWUgcHJlZmVyZW5jZXMgdG8gYm9vbGVhbi4gU2V0cyB0aGUgY29va2llIHByZWZlcmVuY2VzIGNvbmZpZ3VyYXRpb24gaW4gbG9jYWwgc3RvcmFnZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGNvb2tpZVByZWZlcmVuY2VzIE9iamVjdCB3aXRoIGNvb2tpZSBwcmVmZXJlbmNlcyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBzZXRDb29raWVzKGNvb2tpZVByZWZlcmVuY2VzOiBDb29raWVQcmVmZXJlbmNlcywgcG9saWN5VmVyc2lvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNvb2tpZXNUb1NldCA9IHsgLi4uY29va2llUHJlZmVyZW5jZXMgfTtcbiAgICBPYmplY3QuZW50cmllcyhjb29raWVzVG9TZXQpLmZvckVhY2goKFtjb29raWVOYW1lLCBjb29raWVWYWx1ZV0pID0+IHtcbiAgICAgIGNvb2tpZXNUb1NldFtjb29raWVOYW1lXSA9IHR5cGVvZiBjb29raWVWYWx1ZSA9PT0gJ3N0cmluZycgPyB0cnVlIDogY29va2llVmFsdWU7XG4gICAgfSk7XG4gICAgaWYgKHBvbGljeVZlcnNpb24pIHtcbiAgICAgIGNvb2tpZXNUb1NldC5wb2xpY3lWZXJzaW9uID0gcG9saWN5VmVyc2lvbjtcbiAgICB9XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoY29va2llc1RvU2V0KSk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCBjb29raWUgYmFubmVyIHNob3VsZCBiZSBzaG93bi5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgaWYgdGhlIGNvb2tpZSBiYW5uZXIgc2hvdWxkIGJlIHNob3duLlxuICAgKi9cbiAgc2hvdWxkU2hvd0Nvb2tpZUJhbm5lcigpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0Q29va2llQmFubmVyU2V0dGluZ3MoKTtcblxuICAgIC8vIGFsd2F5cyBzaG93IGNvb2tpZSBiYW5uZXIgaW4gcHJldmlldyBtb2RlIGV4Y2VwdCB3aGVuIGNvb2tpZSBiYW5uZXIgaXMgZGlzYWJsZWRcbiAgICBpZiAodGhpcy5pc1ByZXZpZXdNb2RlKCkpIHtcbiAgICAgIHJldHVybiAhKHNldHRpbmdzICYmIHNldHRpbmdzLmNvb2tpZUJhbm5lckRpc2FibGVkKTtcbiAgICB9XG5cbiAgICAvLyBubyBjb29raWUgYmFubmVyIHRleHQgb3IgY29va2llIGJhbm5lciBpcyBkaXNhYmxlZFxuICAgIGlmIChzZXR0aW5ncy5jb29raWVCYW5uZXJEaXNhYmxlZCB8fCAhc2V0dGluZ3MuY29va2llQmFubmVyVGV4dCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJDb29raWVQcmVmZXJlbmNlcyA9IHRoaXMuZ2V0VXNlckNvb2tpZVByZWZlcmVuY2VzKCk7XG5cbiAgICAvLyBubyBjb29raWVzIGFjY2VwdGVkXG4gICAgaWYgKCF1c2VyQ29va2llUHJlZmVyZW5jZXMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIHBvbGljeSB2ZXJzaW9uIGNoYW5nZWRcbiAgICBpZiAoc2V0dGluZ3MucG9saWN5VmVyc2lvbiAmJiB1c2VyQ29va2llUHJlZmVyZW5jZXMucG9saWN5VmVyc2lvbiAhPT0gc2V0dGluZ3MucG9saWN5VmVyc2lvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gY29va2llcyBoYXZlIGJlZW4gYWNjZXB0ZWQgaW4gdGhlIGN1cnJlbnQgcG9saWN5IHZlcnNpb24uXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGNvb2tpZSBwcmVmZXJlbmNlcyBjb25maWd1cmF0aW9uIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAgICogQHJldHVybnMge29iamVjdH0gT2JqZWN0IHdpdGggY29va2llIHByZWZlcmVuY2VzIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBnZXRVc2VyQ29va2llUHJlZmVyZW5jZXMoKTogQ29va2llUHJlZmVyZW5jZXMge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuU1RPUkFHRV9LRVkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IGNvb2tpZSBwcmVmZXJlbmNlcyBjb25maWd1cmF0aW9uIGlzIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIG9wdGlvbnMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGlmIHRoZSBjb29raWUgcHJlZmVyZW5jZXMgY29uZmlndXJhdGlvbiBpcyBkZWZpbmVkLlxuICAgKi9cbiAgaXNDb25maWdDb29raWVQcmVmZXJlbmNlc0RlZmluZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5nZXRDb29raWVQcmVmZXJlbmNlc0NvbmZpZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgZnVuY3Rpb25hbCBjb29raWVzIGFyZSBlbmFibGVkLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSB3aGVuIGZ1bmN0aW9uYWwgY29va2llcyBhcmUgZW5hYmxlZC5cbiAgICovXG4gIGlzRnVuY3Rpb25hbENvb2tpZUVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBmdW5jdGlvbmFsIH06IENvb2tpZVByZWZlcmVuY2VzID0gdGhpcy5nZXRVc2VyQ29va2llUHJlZmVyZW5jZXMoKSB8fCB7fTtcbiAgICByZXR1cm4gZnVuY3Rpb25hbCA9PT0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNjcmlwdGlvbiBvZiBjb29raWVzLlxuICAgKiBAcGFyYW0geydyZXF1aXJlZCcgfCAnZnVuY3Rpb25hbCcgfCAnbWFya2V0aW5nJ30gY29va2llVHlwZSBUYWtlcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOiAncmVxdWlyZWQnLCAnZnVuY3Rpb25hbCcsICdtYXJrZXRpbmcnLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZGVmYXVsdCBjb29raWUgZGVzY3JpcHRpb24sIGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgaW4gYXBwbGljYXRpb24gb3B0aW9ucy5cbiAgICovXG4gIGdldENvb2tpZURlc2NyaXB0aW9uKGNvb2tpZVR5cGU6ICdyZXF1aXJlZCcgfCAnZnVuY3Rpb25hbCcgfCAnbWFya2V0aW5nJyk6IHN0cmluZyB7XG4gICAgY29uc3QgY29va2llQmFubmVyQ29uZmlnU2V0dGluZ3MgPSB0aGlzLmdldENvb2tpZVByZWZlcmVuY2VzQ29uZmlnKCk7XG4gICAgY29uc3QgY29va2llQmFubmVyU2V0dGluZ1ZhbHVlID0gY29va2llQmFubmVyQ29uZmlnU2V0dGluZ3NbY29va2llVHlwZV07XG4gICAgcmV0dXJuIHR5cGVvZiBjb29raWVCYW5uZXJTZXR0aW5nVmFsdWUgPT09ICdzdHJpbmcnXG4gICAgICA/IGNvb2tpZUJhbm5lclNldHRpbmdWYWx1ZVxuICAgICAgOiB0aGlzLmNvb2tpZURlc2NyaXB0aW9uc1tjb29raWVUeXBlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm1zIGNvb2tpZSBwcmVmZXJlbmNlcyBjb25maWd1cmF0aW9uIG9iamVjdCB0byBhbiBhcnJheSBvZiBjb29raWUgcHJlZmVyZW5jZXMgb2JqZWN0cy4gRWFjaCBvYmplY3QgaW4gcmV0dXJuZWQgYXJyYXkgY29udGFpbnMgY29va2llICduYW1lJywgJ3ZhbHVlJyBhbmQgJ2lzUmVhZG9ubHknIHByb3BlcnR5LlxuICAgKiBAcGFyYW0ge29iamVjdH0gY29va2llUHJlZmVyZW5jZXMuXG4gICAqIEByZXR1cm5zIHtBcnJheX0gQXJyYXkgc2hvd3MgaWYgdGhlIGNvb2tpZSBpcyBSZWFkb25seS5cbiAgICovXG4gIHRyYW5zZm9ybUNvb2tpZVByZWZlcmVuY2VzVG9MaXN0KGNvb2tpZVByZWZlcmVuY2VzOiBDb29raWVQcmVmZXJlbmNlcyk6IENvb2tpZVtdIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoY29va2llUHJlZmVyZW5jZXMpLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgaXNSZWFkb25seSA9IG5hbWUgPT09ICdyZXF1aXJlZCc7XG4gICAgICByZXR1cm4geyBuYW1lLCB2YWx1ZSwgaXNSZWFkb25seSB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybXMgYW4gYXJyYXkgb2YgY29va2llIHByZWZlcmVuY2VzIG9iamVjdHMgdG8gY29va2llIHByZWZlcmVuY2VzIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICAgKiBAcGFyYW0ge0FycmF5fSBjb29raWVQcmVmZXJlbmNlc0xpc3QgQXJyYXkgb2YgY29va2llIHByZWZlcmVuY2VzLlxuICAgKiBAcmV0dXJucyB7b2JqZWN0fSBBbiBvYmplY3Qgd2l0aCBjb29raWUgcHJlZmVyZW5jZXMgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHRyYW5zZm9ybUNvb2tpZVByZWZlcmVuY2VzTGlzdFRvQ29va2llUHJlZmVyZW5jZXMoXG4gICAgY29va2llUHJlZmVyZW5jZXNMaXN0OiBDb29raWVbXVxuICApOiBDb29raWVQcmVmZXJlbmNlcyB7XG4gICAgcmV0dXJuIGNvb2tpZVByZWZlcmVuY2VzTGlzdC5yZWR1Y2UoKGNvb2tpZVByZWY6IENvb2tpZVByZWZlcmVuY2VzLCBjb29raWU6IENvb2tpZSkgPT4ge1xuICAgICAgY29uc3Qga2V5OiBzdHJpbmcgPSBjb29raWUubmFtZTtcbiAgICAgIGNvb2tpZVByZWZba2V5XSA9IGNvb2tpZS52YWx1ZTtcbiAgICAgIHJldHVybiBjb29raWVQcmVmO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNQcmV2aWV3TW9kZSgpOiBib29sZWFuIHtcbiAgICAvLyBwYXJhbXMgZnJvbSB1cmwgYXJlIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZWQgZHVyaW5nIGJvb3RzdHJhcCBhcyBzdHJpbmcgb3B0aW9ucywgc2VlOiBwYWNrYWdlcy9jbGkvc3JjL2FwcC1ib290c3RyYXAvb3B0aW9ucy50c1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZ2V0KHRoaXMuSVNfUFJFVklFVywgZmFsc2UsIHRydWUpO1xuICB9XG59XG4iXX0=