@ngx-meta/core
Version:
Dynamic page title & meta tags utility for Angular (w/server-side rendering)
206 lines • 30.1 kB
JavaScript
import { Injectable } from '@angular/core';
import { Meta, Title } from '@angular/platform-browser';
import { from as observableFrom, of as observableOf } from 'rxjs';
import { MetaLoader } from './meta.loader';
import { PageTitlePositioning } from './models/page-title-positioning';
import { isObservable, isPromise } from './util';
import * as i0 from "@angular/core";
import * as i1 from "./meta.loader";
import * as i2 from "@angular/platform-browser";
export class MetaService {
constructor(loader, title, meta) {
this.loader = loader;
this.title = title;
this.meta = meta;
this.settings = loader.settings;
this.isMetaTagSet = {};
}
setTitle(title, override = false) {
const title$ = title ? this.callback(title) : observableOf('');
title$.subscribe((res) => {
let fullTitle = '';
if (!res) {
const defaultTitle$ = this.settings.defaults && this.settings.defaults.title ? this.callback(this.settings.defaults.title) : observableOf('');
defaultTitle$.subscribe((defaultTitle) => {
if (!override && this.settings.pageTitleSeparator && this.settings.applicationName) {
this.callback(this.settings.applicationName).subscribe((applicationName) => {
fullTitle = applicationName ? this.getTitleWithPositioning(defaultTitle, applicationName) : defaultTitle;
this.updateTitle(fullTitle);
});
}
else {
this.updateTitle(defaultTitle);
}
});
}
else if (!override && this.settings.pageTitleSeparator && this.settings.applicationName) {
this.callback(this.settings.applicationName).subscribe((applicationName) => {
fullTitle = applicationName ? this.getTitleWithPositioning(res, applicationName) : res;
this.updateTitle(fullTitle);
});
}
else {
this.updateTitle(res);
}
});
}
setTag(key, value) {
if (key === 'title') {
throw new Error(`Attempt to set ${key} through "setTag": "title" is a reserved tag name. ` + 'Please use `MetaService.setTitle` instead.');
}
const cur = value || (this.settings.defaults && this.settings.defaults[key] ? this.settings.defaults[key] : '');
const value$ = key !== 'og:locale' && key !== 'og:locale:alternate' ? this.callback(cur) : observableOf(cur);
value$.subscribe((res) => {
this.updateTag(key, res);
});
}
update(currentUrl, metaSettings) {
if (!metaSettings) {
const fallbackTitle = this.settings.defaults
? this.settings.defaults.title || this.settings.applicationName
: this.settings.applicationName;
this.setTitle(fallbackTitle, true);
}
else {
if (metaSettings.disabled) {
this.update(currentUrl);
return;
}
this.setTitle(metaSettings.title, metaSettings.override);
Object.keys(metaSettings).forEach(key => {
let value = metaSettings[key];
if (key === 'title' || key === 'override') {
return;
}
else if (key === 'og:locale') {
value = value.replace(/-/g, '_');
}
else if (key === 'og:locale:alternate') {
const currentLocale = metaSettings['og:locale'];
this.updateLocales(currentLocale, metaSettings[key]);
return;
}
this.setTag(key, value);
});
}
if (this.settings.defaults) {
Object.keys(this.settings.defaults).forEach(key => {
let value = this.settings.defaults[key];
if ((metaSettings && (key in this.isMetaTagSet || key in metaSettings)) || key === 'title' || key === 'override') {
return;
}
else if (key === 'og:locale') {
value = value.replace(/-/g, '_');
}
else if (key === 'og:locale:alternate') {
const currentLocale = metaSettings ? metaSettings['og:locale'] : undefined;
this.updateLocales(currentLocale, value);
return;
}
this.setTag(key, value);
});
}
const baseUrl = this.settings.applicationUrl ? this.settings.applicationUrl : '/';
const url = `${baseUrl}${currentUrl}`.replace(/(https?:\/\/)|(\/)+/g, '$1$2').replace(/\/$/g, '');
this.setTag('og:url', url ? url : '/');
}
removeTag(key) {
this.meta.removeTag(key);
}
callback(value) {
if (this.settings.callback) {
const value$ = this.settings.callback(value);
if (!isObservable(value$)) {
return isPromise(value$) ? observableFrom(value$) : observableOf(value$);
}
return value$;
}
return observableOf(value);
}
getTitleWithPositioning(title, applicationName) {
switch (this.settings.pageTitlePositioning) {
case PageTitlePositioning.AppendPageTitle:
return applicationName + String(this.settings.pageTitleSeparator) + title;
case PageTitlePositioning.PrependPageTitle:
return title + String(this.settings.pageTitleSeparator) + applicationName;
default:
throw new Error(`Invalid pageTitlePositioning specified [${this.settings.pageTitlePositioning}]!`);
}
}
updateTitle(title) {
this.title.setTitle(title);
this.meta.updateTag({
property: 'og:title',
content: title
});
}
updateLocales(currentLocale, availableLocales) {
const cur = currentLocale || (this.settings.defaults ? this.settings.defaults['og:locale'] : '');
if (cur && this.settings.defaults) {
this.settings.defaults['og:locale'] = cur.replace(/_/g, '-');
}
const elements = this.meta.getTags('property="og:locale:alternate"');
elements.forEach((element) => {
this.meta.removeTagElement(element);
});
if (cur && availableLocales) {
availableLocales.split(',').forEach((locale) => {
if (cur.replace(/-/g, '_') !== locale.replace(/-/g, '_')) {
this.meta.addTag({
property: 'og:locale:alternate',
content: locale.replace(/-/g, '_')
});
}
});
}
}
updateTag(key, value) {
if (key.lastIndexOf('og:', 0) === 0) {
this.meta.updateTag({
property: key,
content: key === 'og:locale' ? value.replace(/-/g, '_') : value
});
}
else {
this.meta.updateTag({
name: key,
content: value
});
}
this.isMetaTagSet[key] = true;
if (key === 'description') {
this.meta.updateTag({
property: 'og:description',
content: value
});
}
else if (key === 'author') {
this.meta.updateTag({
property: 'og:author',
content: value
});
}
else if (key === 'publisher') {
this.meta.updateTag({
property: 'og:publisher',
content: value
});
}
else if (key === 'og:locale') {
const availableLocales = this.settings.defaults ? this.settings.defaults['og:locale:alternate'] : '';
this.updateLocales(value, availableLocales);
this.isMetaTagSet['og:locale:alternate'] = true;
}
else if (key === 'og:locale:alternate') {
const currentLocale = this.meta.getTag('property="og:locale"').content;
this.updateLocales(currentLocale, value);
this.isMetaTagSet['og:locale'] = true;
}
}
}
MetaService.ɵfac = function MetaService_Factory(t) { return new (t || MetaService)(i0.ɵɵinject(i1.MetaLoader), i0.ɵɵinject(i2.Title), i0.ɵɵinject(i2.Meta)); };
MetaService.ɵprov = i0.ɵɵdefineInjectable({ token: MetaService, factory: MetaService.ɵfac });
(function () { i0.ɵsetClassMetadata(MetaService, [{
type: Injectable
}], function () { return [{ type: i1.MetaLoader }, { type: i2.Title }, { type: i2.Meta }]; }, null); })();
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQG5neC1tZXRhL2NvcmUvIiwic291cmNlcyI6WyJtZXRhLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxJQUFJLElBQUksY0FBYyxFQUFjLEVBQUUsSUFBSSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFOUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLFFBQVEsQ0FBQzs7OztBQUdqRCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFxQixNQUFrQixFQUFtQixLQUFZLEVBQW1CLElBQVU7UUFBOUUsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUFtQixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQW1CLFNBQUksR0FBSixJQUFJLENBQU07UUFDakcsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxRQUFRLENBQUMsS0FBYSxFQUFFLFFBQVEsR0FBRyxLQUFLO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTtZQUMvQixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFFbkIsSUFB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USxFQUFFLFdBQVc7Z0JBQ3JCLE9BQU8sRUFBRSxLQUFLO2FBQ2YsQ0FBQyxDQUFDO1NBQ0o7YUFBTSxJQUFJLEdBQUcsS0FBSyxXQUFXLEVBQUU7WUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2xCLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixPQUFPLEVBQUUsS0FBSzthQUNmLENBQUMsQ0FBQztTQUNKO2FBQU0sSUFBSSxHQUFHLEtBQUssV0FBVyxFQUFFO1lBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVyRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDakQ7YUFBTSxJQUFJLEdBQUcsS0FBSyxxQkFBcUIsRUFBRTtZQUN4QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQztZQUV2RSxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztTQUN2QztJQUNILENBQUM7O3NFQTlOVSxXQUFXO21EQUFYLFdBQVcsV0FBWCxXQUFXO29DQUFYLFdBQVc7Y0FEdkIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1ldGEsIFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBmcm9tIGFzIG9ic2VydmFibGVGcm9tLCBPYnNlcnZhYmxlLCBvZiBhcyBvYnNlcnZhYmxlT2YgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgTWV0YUxvYWRlciB9IGZyb20gJy4vbWV0YS5sb2FkZXInO1xuaW1wb3J0IHsgTWV0YVNldHRpbmdzIH0gZnJvbSAnLi9tb2RlbHMvbWV0YS1zZXR0aW5ncyc7XG5pbXBvcnQgeyBQYWdlVGl0bGVQb3NpdGlvbmluZyB9IGZyb20gJy4vbW9kZWxzL3BhZ2UtdGl0bGUtcG9zaXRpb25pbmcnO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBpc1Byb21pc2UgfSBmcm9tICcuL3V0aWwnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTWV0YVNlcnZpY2Uge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2V0dGluZ3M6IE1ldGFTZXR0aW5ncztcbiAgcHJpdmF0ZSByZWFkb25seSBpc01ldGFUYWdTZXQ6IGFueTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2FkZXI6IE1ldGFMb2FkZXIsIHByaXZhdGUgcmVhZG9ubHkgdGl0bGU6IFRpdGxlLCBwcml2YXRlIHJlYWRvbmx5IG1ldGE6IE1ldGEpIHtcbiAgICB0aGlzLnNldHRpbmdzID0gbG9hZGVyLnNldHRpbmdzO1xuICAgIHRoaXMuaXNNZXRhVGFnU2V0ID0ge307XG4gIH1cblxuICBzZXRUaXRsZSh0aXRsZTogc3RyaW5nLCBvdmVycmlkZSA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgdGl0bGUkID0gdGl0bGUgPyB0aGlzLmNhbGxiYWNrKHRpdGxlKSA6IG9ic2VydmFibGVPZignJyk7XG5cbiAgICB0aXRsZSQuc3Vic2NyaWJlKChyZXM6IHN0cmluZykgPT4ge1xuICAgICAgbGV0IGZ1bGxUaXRsZSA9ICcnO1xuXG4gICAgICBpZiAoIXJlcykge1xuICAgICAgICBjb25zdCBkZWZhdWx0VGl0bGUkID1cbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmRlZmF1bHRzICYmIHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMudGl0bGUgPyB0aGlzLmNhbGxiYWNrKHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMudGl0bGUpIDogb2JzZXJ2YWJsZU9mKCcnKTtcblxuICAgICAgICBkZWZhdWx0VGl0bGUkLnN1YnNjcmliZSgoZGVmYXVsdFRpdGxlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAoIW92ZXJyaWRlICYmIHRoaXMuc2V0dGluZ3MucGFnZVRpdGxlU2VwYXJhdG9yICYmIHRoaXMuc2V0dGluZ3MuYXBwbGljYXRpb25OYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuc2V0dGluZ3MuYXBwbGljYXRpb25OYW1lKS5zdWJzY3JpYmUoKGFwcGxpY2F0aW9uTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGZ1bGxUaXRsZSA9IGFwcGxpY2F0aW9uTmFtZSA/IHRoaXMuZ2V0VGl0bGVXaXRoUG9zaXRpb25pbmcoZGVmYXVsdFRpdGxlLCBhcHBsaWNhdGlvbk5hbWUpIDogZGVmYXVsdFRpdGxlO1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRpdGxlKGZ1bGxUaXRsZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaXRsZShkZWZhdWx0VGl0bGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKCFvdmVycmlkZSAmJiB0aGlzLnNldHRpbmdzLnBhZ2VUaXRsZVNlcGFyYXRvciAmJiB0aGlzLnNldHRpbmdzLmFwcGxpY2F0aW9uTmFtZSkge1xuICAgICAgICB0aGlzLmNhbGxiYWNrKHRoaXMuc2V0dGluZ3MuYXBwbGljYXRpb25OYW1lKS5zdWJzY3JpYmUoKGFwcGxpY2F0aW9uTmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgZnVsbFRpdGxlID0gYXBwbGljYXRpb25OYW1lID8gdGhpcy5nZXRUaXRsZVdpdGhQb3NpdGlvbmluZyhyZXMsIGFwcGxpY2F0aW9uTmFtZSkgOiByZXM7XG4gICAgICAgICAgdGhpcy51cGRhdGVUaXRsZShmdWxsVGl0bGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXBkYXRlVGl0bGUocmVzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFRhZyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChrZXkgPT09ICd0aXRsZScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEF0dGVtcHQgdG8gc2V0ICR7a2V5fSB0aHJvdWdoIFwic2V0VGFnXCI6IFwidGl0bGVcIiBpcyBhIHJlc2VydmVkIHRhZyBuYW1lLiBgICsgJ1BsZWFzZSB1c2UgYE1ldGFTZXJ2aWNlLnNldFRpdGxlYCBpbnN0ZWFkLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3VyID0gdmFsdWUgfHwgKHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMgJiYgdGhpcy5zZXR0aW5ncy5kZWZhdWx0c1trZXldID8gdGhpcy5zZXR0aW5ncy5kZWZhdWx0c1trZXldIDogJycpO1xuXG4gICAgY29uc3QgdmFsdWUkID0ga2V5ICE9PSAnb2c6bG9jYWxlJyAmJiBrZXkgIT09ICdvZzpsb2NhbGU6YWx0ZXJuYXRlJyA/IHRoaXMuY2FsbGJhY2soY3VyKSA6IG9ic2VydmFibGVPZihjdXIpO1xuXG4gICAgdmFsdWUkLnN1YnNjcmliZSgocmVzOiBzdHJpbmcpID0+IHtcbiAgICAgIHRoaXMudXBkYXRlVGFnKGtleSwgcmVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHVwZGF0ZShjdXJyZW50VXJsOiBzdHJpbmcsIG1ldGFTZXR0aW5ncz86IGFueSk6IHZvaWQge1xuICAgIGlmICghbWV0YVNldHRpbmdzKSB7XG4gICAgICBjb25zdCBmYWxsYmFja1RpdGxlID0gdGhpcy5zZXR0aW5ncy5kZWZhdWx0c1xuICAgICAgICA/IHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMudGl0bGUgfHwgdGhpcy5zZXR0aW5ncy5hcHBsaWNhdGlvbk5hbWVcbiAgICAgICAgOiB0aGlzLnNldHRpbmdzLmFwcGxpY2F0aW9uTmFtZTtcblxuICAgICAgdGhpcy5zZXRUaXRsZShmYWxsYmFja1RpdGxlLCB0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG1ldGFTZXR0aW5ncy5kaXNhYmxlZCkge1xuICAgICAgICB0aGlzLnVwZGF0ZShjdXJyZW50VXJsKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0VGl0bGUobWV0YVNldHRpbmdzLnRpdGxlLCBtZXRhU2V0dGluZ3Mub3ZlcnJpZGUpO1xuXG4gICAgICBPYmplY3Qua2V5cyhtZXRhU2V0dGluZ3MpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gbWV0YVNldHRpbmdzW2tleV07XG5cbiAgICAgICAgaWYgKGtleSA9PT0gJ3RpdGxlJyB8fCBrZXkgPT09ICdvdmVycmlkZScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnb2c6bG9jYWxlJykge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ29nOmxvY2FsZTphbHRlcm5hdGUnKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudExvY2FsZSA9IG1ldGFTZXR0aW5nc1snb2c6bG9jYWxlJ107XG4gICAgICAgICAgdGhpcy51cGRhdGVMb2NhbGVzKGN1cnJlbnRMb2NhbGUsIG1ldGFTZXR0aW5nc1trZXldKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VGFnKGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMpIHtcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5zZXR0aW5ncy5kZWZhdWx0c1trZXldO1xuXG4gICAgICAgIGlmICgobWV0YVNldHRpbmdzICYmIChrZXkgaW4gdGhpcy5pc01ldGFUYWdTZXQgfHwga2V5IGluIG1ldGFTZXR0aW5ncykpIHx8IGtleSA9PT0gJ3RpdGxlJyB8fCBrZXkgPT09ICdvdmVycmlkZScpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnb2c6bG9jYWxlJykge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvLS9nLCAnXycpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ29nOmxvY2FsZTphbHRlcm5hdGUnKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudExvY2FsZSA9IG1ldGFTZXR0aW5ncyA/IG1ldGFTZXR0aW5nc1snb2c6bG9jYWxlJ10gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy51cGRhdGVMb2NhbGVzKGN1cnJlbnRMb2NhbGUsIHZhbHVlKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2V0VGFnKGtleSwgdmFsdWUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuc2V0dGluZ3MuYXBwbGljYXRpb25VcmwgPyB0aGlzLnNldHRpbmdzLmFwcGxpY2F0aW9uVXJsIDogJy8nO1xuICAgIGNvbnN0IHVybCA9IGAke2Jhc2VVcmx9JHtjdXJyZW50VXJsfWAucmVwbGFjZSgvKGh0dHBzPzpcXC9cXC8pfChcXC8pKy9nLCAnJDEkMicpLnJlcGxhY2UoL1xcLyQvZywgJycpO1xuXG4gICAgdGhpcy5zZXRUYWcoJ29nOnVybCcsIHVybCA/IHVybCA6ICcvJyk7XG4gIH1cblxuICByZW1vdmVUYWcoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1ldGEucmVtb3ZlVGFnKGtleSk7XG4gIH1cblxuICBwcml2YXRlIGNhbGxiYWNrKHZhbHVlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLnNldHRpbmdzLmNhbGxiYWNrKSB7XG4gICAgICBjb25zdCB2YWx1ZSQgPSB0aGlzLnNldHRpbmdzLmNhbGxiYWNrKHZhbHVlKTtcblxuICAgICAgaWYgKCFpc09ic2VydmFibGUodmFsdWUkKSkge1xuICAgICAgICByZXR1cm4gaXNQcm9taXNlKHZhbHVlJCkgPyBvYnNlcnZhYmxlRnJvbSh2YWx1ZSQpIDogb2JzZXJ2YWJsZU9mKHZhbHVlJCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2YWx1ZSQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9ic2VydmFibGVPZih2YWx1ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFRpdGxlV2l0aFBvc2l0aW9uaW5nKHRpdGxlOiBzdHJpbmcsIGFwcGxpY2F0aW9uTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHRoaXMuc2V0dGluZ3MucGFnZVRpdGxlUG9zaXRpb25pbmcpIHtcbiAgICAgIGNhc2UgUGFnZVRpdGxlUG9zaXRpb25pbmcuQXBwZW5kUGFnZVRpdGxlOlxuICAgICAgICByZXR1cm4gYXBwbGljYXRpb25OYW1lICsgU3RyaW5nKHRoaXMuc2V0dGluZ3MucGFnZVRpdGxlU2VwYXJhdG9yKSArIHRpdGxlO1xuICAgICAgY2FzZSBQYWdlVGl0bGVQb3NpdGlvbmluZy5QcmVwZW5kUGFnZVRpdGxlOlxuICAgICAgICByZXR1cm4gdGl0bGUgKyBTdHJpbmcodGhpcy5zZXR0aW5ncy5wYWdlVGl0bGVTZXBhcmF0b3IpICsgYXBwbGljYXRpb25OYW1lO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhZ2VUaXRsZVBvc2l0aW9uaW5nIHNwZWNpZmllZCBbJHt0aGlzLnNldHRpbmdzLnBhZ2VUaXRsZVBvc2l0aW9uaW5nfV0hYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVUaXRsZSh0aXRsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy50aXRsZS5zZXRUaXRsZSh0aXRsZSk7XG4gICAgdGhpcy5tZXRhLnVwZGF0ZVRhZyh7XG4gICAgICBwcm9wZXJ0eTogJ29nOnRpdGxlJyxcbiAgICAgIGNvbnRlbnQ6IHRpdGxlXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUxvY2FsZXMoY3VycmVudExvY2FsZTogc3RyaW5nLCBhdmFpbGFibGVMb2NhbGVzOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXIgPSBjdXJyZW50TG9jYWxlIHx8ICh0aGlzLnNldHRpbmdzLmRlZmF1bHRzID8gdGhpcy5zZXR0aW5ncy5kZWZhdWx0c1snb2c6bG9jYWxlJ10gOiAnJyk7XG5cbiAgICBpZiAoY3VyICYmIHRoaXMuc2V0dGluZ3MuZGVmYXVsdHMpIHtcbiAgICAgIHRoaXMuc2V0dGluZ3MuZGVmYXVsdHNbJ29nOmxvY2FsZSddID0gY3VyLnJlcGxhY2UoL18vZywgJy0nKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBzZXQgSFRNTCBsYW5nIGF0dHJpYnV0ZSAtIGh0dHBzOi8vZ2l0aHViLmNvbS9uZ3gtbWV0YS9jb3JlL2lzc3Vlcy8zMlxuICAgIC8vIGNvbnN0IGh0bWwgPSB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2h0bWwnKTtcbiAgICAvLyBodG1sLnNldEF0dHJpYnV0ZSgnbGFuZycsIGN1cik7XG5cbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMubWV0YS5nZXRUYWdzKCdwcm9wZXJ0eT1cIm9nOmxvY2FsZTphbHRlcm5hdGVcIicpO1xuXG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XG4gICAgICB0aGlzLm1ldGEucmVtb3ZlVGFnRWxlbWVudChlbGVtZW50KTtcbiAgICB9KTtcblxuICAgIGlmIChjdXIgJiYgYXZhaWxhYmxlTG9jYWxlcykge1xuICAgICAgYXZhaWxhYmxlTG9jYWxlcy5zcGxpdCgnLCcpLmZvckVhY2goKGxvY2FsZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChjdXIucmVwbGFjZSgvLS9nLCAnXycpICE9PSBsb2NhbGUucmVwbGFjZSgvLS9nLCAnXycpKSB7XG4gICAgICAgICAgdGhpcy5tZXRhLmFkZFRhZyh7XG4gICAgICAgICAgICBwcm9wZXJ0eTogJ29nOmxvY2FsZTphbHRlcm5hdGUnLFxuICAgICAgICAgICAgY29udGVudDogbG9jYWxlLnJlcGxhY2UoLy0vZywgJ18nKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVRhZyhrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChrZXkubGFzdEluZGV4T2YoJ29nOicsIDApID09PSAwKSB7XG4gICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHtcbiAgICAgICAgcHJvcGVydHk6IGtleSxcbiAgICAgICAgY29udGVudDoga2V5ID09PSAnb2c6bG9jYWxlJyA/IHZhbHVlLnJlcGxhY2UoLy0vZywgJ18nKSA6IHZhbHVlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tZXRhLnVwZGF0ZVRhZyh7XG4gICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgY29udGVudDogdmFsdWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaXNNZXRhVGFnU2V0W2tleV0gPSB0cnVlO1xuXG4gICAgaWYgKGtleSA9PT0gJ2Rlc2NyaXB0aW9uJykge1xuICAgICAgdGhpcy5tZXRhLnVwZGF0ZVRhZyh7XG4gICAgICAgIHByb3BlcnR5OiAnb2c6ZGVzY3JpcHRpb24nLFxuICAgICAgICBjb250ZW50OiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdhdXRob3InKSB7XG4gICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHtcbiAgICAgICAgcHJvcGVydHk6ICdvZzphdXRob3InLFxuICAgICAgICBjb250ZW50OiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdwdWJsaXNoZXInKSB7XG4gICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHtcbiAgICAgICAgcHJvcGVydHk6ICdvZzpwdWJsaXNoZXInLFxuICAgICAgICBjb250ZW50OiB2YWx1ZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdvZzpsb2NhbGUnKSB7XG4gICAgICBjb25zdCBhdmFpbGFibGVMb2NhbGVzID0gdGhpcy5zZXR0aW5ncy5kZWZhdWx0cyA/IHRoaXMuc2V0dGluZ3MuZGVmYXVsdHNbJ29nOmxvY2FsZTphbHRlcm5hdGUnXSA6ICcnO1xuXG4gICAgICB0aGlzLnVwZGF0ZUxvY2FsZXModmFsdWUsIGF2YWlsYWJsZUxvY2FsZXMpO1xuICAgICAgdGhpcy5pc01ldGFUYWdTZXRbJ29nOmxvY2FsZTphbHRlcm5hdGUnXSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChrZXkgPT09ICdvZzpsb2NhbGU6YWx0ZXJuYXRlJykge1xuICAgICAgY29uc3QgY3VycmVudExvY2FsZSA9IHRoaXMubWV0YS5nZXRUYWcoJ3Byb3BlcnR5PVwib2c6bG9jYWxlXCInKS5jb250ZW50O1xuXG4gICAgICB0aGlzLnVwZGF0ZUxvY2FsZXMoY3VycmVudExvY2FsZSwgdmFsdWUpO1xuICAgICAgdGhpcy5pc01ldGFUYWdTZXRbJ29nOmxvY2FsZSddID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==