@ecodev/natural 55.2.0 → 55.3.0
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,9 @@
|
|
|
1
1
|
import { DOCUMENT } from '@angular/common';
|
|
2
2
|
import { Inject, Injectable, InjectionToken, LOCALE_ID } from '@angular/core';
|
|
3
3
|
import { NavigationEnd, PRIMARY_OUTLET } from '@angular/router';
|
|
4
|
-
import { filter } from 'rxjs/operators';
|
|
4
|
+
import { filter, startWith } from 'rxjs/operators';
|
|
5
5
|
import { NaturalDialogTriggerComponent } from '../../dialog-trigger/dialog-trigger.component';
|
|
6
|
+
import { combineLatest, Observable, of } from 'rxjs';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
import * as i1 from "@angular/router";
|
|
8
9
|
import * as i2 from "@angular/platform-browser";
|
|
@@ -25,14 +26,20 @@ export function stripTags(str) {
|
|
|
25
26
|
* configured for it in the routing.
|
|
26
27
|
*/
|
|
27
28
|
export class NaturalSeoService {
|
|
28
|
-
constructor(
|
|
29
|
-
this.config = config;
|
|
29
|
+
constructor(configToken, router, titleService, metaTagService, document, locale) {
|
|
30
30
|
this.router = router;
|
|
31
31
|
this.titleService = titleService;
|
|
32
32
|
this.metaTagService = metaTagService;
|
|
33
33
|
this.document = document;
|
|
34
34
|
this.locale = locale;
|
|
35
|
-
this.
|
|
35
|
+
this.config = {
|
|
36
|
+
applicationName: '',
|
|
37
|
+
};
|
|
38
|
+
combineLatest({
|
|
39
|
+
config: configToken instanceof Observable ? configToken.pipe(startWith(this.config)) : of(configToken),
|
|
40
|
+
navigationEnd: this.router.events.pipe(filter(event => event instanceof NavigationEnd)),
|
|
41
|
+
}).subscribe(({ config }) => {
|
|
42
|
+
this.config = config;
|
|
36
43
|
const root = this.router.routerState.root.snapshot;
|
|
37
44
|
this.routeData = this.getRouteData(root);
|
|
38
45
|
const seo = this.routeData.seo ?? { title: '' };
|
|
@@ -52,11 +59,11 @@ export class NaturalSeoService {
|
|
|
52
59
|
/**
|
|
53
60
|
* Update the SEO with given info. The extra part and app name will be appended automatically.
|
|
54
61
|
*
|
|
55
|
-
* In most cases this should not be used
|
|
62
|
+
* In most cases, this should not be used. And instead, the SEO should be configured in the routing,
|
|
56
63
|
* possibly with the callback variant for some dynamism.
|
|
57
64
|
*
|
|
58
|
-
* But in rare cases only the Component is able to build a proper page title, after it
|
|
59
|
-
* needed. For those cases the Component can inject this service and update the SEO directly.
|
|
65
|
+
* But in rare cases, only the Component is able to build a proper page title, after it gathered everything it
|
|
66
|
+
* needed. For those cases, the Component can inject this service and update the SEO directly.
|
|
60
67
|
*/
|
|
61
68
|
update(seo) {
|
|
62
69
|
// Title
|
|
@@ -76,7 +83,7 @@ export class NaturalSeoService {
|
|
|
76
83
|
// Canonical
|
|
77
84
|
// Add language in url (after domain) if some languages are provided only
|
|
78
85
|
const language = this.config.languages?.length && this.locale ? this.locale.split('-')[0] : '';
|
|
79
|
-
const urlParts = this.getUrlParts(seo.canonicalQueryParamsWhitelist
|
|
86
|
+
const urlParts = this.getUrlParts(seo.canonicalQueryParamsWhitelist ?? []);
|
|
80
87
|
this.updateLinkTag({ rel: 'canonical', href: this.getUrl(urlParts, language) });
|
|
81
88
|
this.updateAlternates(urlParts);
|
|
82
89
|
}
|
|
@@ -97,10 +104,10 @@ export class NaturalSeoService {
|
|
|
97
104
|
}
|
|
98
105
|
// Query Params
|
|
99
106
|
let params = '';
|
|
100
|
-
for (const
|
|
101
|
-
if (
|
|
102
|
-
const key = encodeURIComponent(
|
|
103
|
-
const value = encodeURIComponent(urlTree.queryParams[
|
|
107
|
+
for (const whiteListedParam of whiteListedParams) {
|
|
108
|
+
if (whiteListedParam in urlTree.queryParams) {
|
|
109
|
+
const key = encodeURIComponent(whiteListedParam);
|
|
110
|
+
const value = encodeURIComponent(urlTree.queryParams[whiteListedParam]);
|
|
104
111
|
if (params.length) {
|
|
105
112
|
params += '&';
|
|
106
113
|
}
|
|
@@ -114,9 +121,6 @@ export class NaturalSeoService {
|
|
|
114
121
|
}
|
|
115
122
|
/**
|
|
116
123
|
* Add language between domain and uri https://example.com/fr/folder/page
|
|
117
|
-
* @param urlParts
|
|
118
|
-
* @param language
|
|
119
|
-
* @private
|
|
120
124
|
*/
|
|
121
125
|
getUrl(urlParts, language) {
|
|
122
126
|
let url = urlParts.url;
|
|
@@ -148,7 +152,7 @@ export class NaturalSeoService {
|
|
|
148
152
|
}
|
|
149
153
|
}
|
|
150
154
|
updateLinkTag(definition) {
|
|
151
|
-
const linkElement = this.document.head.querySelector(this.
|
|
155
|
+
const linkElement = this.document.head.querySelector(this.parseSelector(definition)) ??
|
|
152
156
|
this.document.head.appendChild(this.document.createElement('link'));
|
|
153
157
|
if (linkElement) {
|
|
154
158
|
Object.keys(definition).forEach((attribute) => {
|
|
@@ -157,13 +161,11 @@ export class NaturalSeoService {
|
|
|
157
161
|
}
|
|
158
162
|
}
|
|
159
163
|
/**
|
|
160
|
-
*
|
|
161
|
-
* @param definition
|
|
162
|
-
* @return {string} selector to use in querySelector
|
|
164
|
+
* Returns selector to use in querySelector to get the given link
|
|
163
165
|
*/
|
|
164
|
-
|
|
166
|
+
parseSelector(definition) {
|
|
165
167
|
let attributes = 'link';
|
|
166
|
-
Object.keys(definition).forEach(
|
|
168
|
+
Object.keys(definition).forEach(attr => {
|
|
167
169
|
if (attr !== 'href') {
|
|
168
170
|
attributes += `[${attr}="${definition[attr]}"]`;
|
|
169
171
|
}
|
|
@@ -231,4 +233,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImpor
|
|
|
231
233
|
type: Inject,
|
|
232
234
|
args: [LOCALE_ID]
|
|
233
235
|
}] }]; } });
|
|
234
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9jb21tb24vc2VydmljZXMvc2VvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUErQixhQUFhLEVBQUUsY0FBYyxFQUFTLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLCtDQUErQyxDQUFDOzs7O0FBOEc1RixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FBbUIsK0JBQStCLENBQUMsQ0FBQztBQUV4RyxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVc7SUFDakMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBVUQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUlILE1BQU0sT0FBTyxpQkFBaUI7SUFHMUIsWUFDaUQsTUFBd0IsRUFDcEQsTUFBYyxFQUNkLFlBQW1CLEVBQ25CLGNBQW9CLEVBQ0YsUUFBa0IsRUFDMUIsTUFBYztRQUxJLFdBQU0sR0FBTixNQUFNLENBQWtCO1FBQ3BELFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBTztRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBTTtRQUNGLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUV6QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1B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O1NBQ3pCO2FBQU0sSUFBSSxZQUFZLElBQUksR0FBRyxFQUFFO1lBQzVCLE1BQU0sSUFBSSxHQUE2QixTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQ1AsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDL0Y7WUFFRCxPQUFPO2dCQUNILEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxFQUFFO2dCQUNyRCxXQUFXLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXO2dCQUNwQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU07YUFDckIsQ0FBQztTQUNMO1FBRUQsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDOzhHQTdOUSxpQkFBaUIsa0JBSWQsa0JBQWtCLDRFQUlsQixRQUFRLGFBQ1IsU0FBUztrSEFUWixpQkFBaUIsY0FGZCxNQUFNOzsyRkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFLUSxNQUFNOzJCQUFDLGtCQUFrQjs7MEJBSXpCLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsTUFBTTsyQkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgTE9DQUxFX0lEfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7TWV0YSwgVGl0bGV9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBEYXRhLCBOYXZpZ2F0aW9uRW5kLCBQUklNQVJZX09VVExFVCwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtmaWx0ZXJ9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmF0dXJhbERpYWxvZ1RyaWdnZXJDb21wb25lbnR9IGZyb20gJy4uLy4uL2RpYWxvZy10cmlnZ2VyL2RpYWxvZy10cmlnZ2VyLmNvbXBvbmVudCc7XG5cbmV4cG9ydCB0eXBlIE5hdHVyYWxTZW8gPSBOYXR1cmFsU2VvQmFzaWMgfCBOYXR1cmFsU2VvQ2FsbGJhY2sgfCBOYXR1cmFsU2VvUmVzb2x2ZTtcblxuLyoqXG4gKiBUeXBpY2FsbHkgdXNlZCBmb3IgXCJzdGF0aWNcIiBwYWdlcyB3aGVyZSB0aGVyZSBpcyBub3QgYSBzaW5nbGUgcmVzb2x2ZWQgb2JqZWN0LiBTb1xuICogYWxsIHBhZ2VzIHN1Y2ggYXMgXCJBYm91dFwiLCBvciBsaXN0IG9mIG9iamVjdHMgKGxpc3Qgb2Ygcmlza3MsIGV0Yy4pLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIHRoZSBtb3N0IGNvbW1vbiB1c2VkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCB0eXBlIE5hdHVyYWxTZW9CYXNpYyA9IFJvYm90cyAmIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFnZSB0aXRsZSwgdGhhdCB3aWxsIGJlIGNvbmNhdGVuYXRlZCB3aXRoIGFwcGxpY2F0aW9uIG5hbWVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSWYgZ2l2ZW4gd2lsbCBiZSB1c2VkIGFzIHBhZ2UgZGVzY3JpcHRpb24sIG90aGVyd2lzZSBmYWxsYmFjayBvbiBkZWZhdWx0IHZhbHVlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHBhcmFtZXRlcnMgaW5jbHVkZWQgaW4gdGhlIGNhbm9uaWNhbCB0YWcncyB1cmxcbiAgICAgKi9cbiAgICBjYW5vbmljYWxRdWVyeVBhcmFtc1doaXRlbGlzdD86IHN0cmluZ1tdO1xufTtcblxuZXhwb3J0IGRlY2xhcmUgdHlwZSBOYXR1cmFsTGlua0RlZmluaXRpb24gPSB7XG4gICAgY2hhcnNldD86IHN0cmluZztcbiAgICBjcm9zc29yaWdpbj86IHN0cmluZztcbiAgICBocmVmPzogc3RyaW5nO1xuICAgIGhyZWZsYW5nPzogc3RyaW5nO1xuICAgIG1lZGlhPzogc3RyaW5nO1xuICAgIHJlbD86IHN0cmluZztcbiAgICByZXY/OiBzdHJpbmc7XG4gICAgc2l6ZXM/OiBzdHJpbmc7XG4gICAgdGFyZ2V0Pzogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG59ICYge1xuICAgIFtwcm9wOiBzdHJpbmddOiBzdHJpbmc7XG59O1xuLyoqXG4gKiBUeXBpY2FsbHkgdXNlZCBmb3IgYSBcImR5bmFtaWNcIiBwYWdlIHdoZXJlIGEgc2luZ2xlIG9iamVjdCBpcyByZXNvbHZlZC4gU28gYSBkZXRhaWwgcGFnZSwgc3VjaFxuICogYXMgdGhlIGRldGFpbCBvZiBhIHJpc2sgYW5kIHNvIG9uLlxuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvUmVzb2x2ZSA9IFJvYm90cyAmIHtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIGJlIHVzZWQgaW4gdGhlIHJlc29sdmVkIGRhdGEgdG8gZmluZCB0aGUgcmVzb2x2ZWQgb2JqZWN0LiBUaGUgZnVsbE5hbWVcbiAgICAgKiBvciBuYW1lIG9mIHRoZSBvYmplY3Qgd2lsbCBiZSB1c2VkIGZvciBwYWdlIHRpdGxlLCBhbmQgdGhlIG9iamVjdCBkZXNjcmlwdGlvbiwgaWYgYW55LFxuICAgICAqIHdpbGwgYmUgdXNlZCBmb3IgcGFnZSBkZXNjcmlwdGlvbi5cbiAgICAgKi9cbiAgICByZXNvbHZlS2V5OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFJhcmVseSB1c2VkIGZvciBhIHBhZ2UgdGhhdCBoYXMgdmVyeSBzcGVjaWZpYyBuZWVkcyBhbmQgbmVlZCB0byBidWlsZCB0aXRsZSBhbmQgZGVzY3JpcHRpb24gaW4gYSBjdXN0b20gd2F5LlxuICogVGhlIGNhbGxiYWNrIGJhY2sgd2lsbCBiZSBnaXZlbiB0aGUgcmVzb2x2ZWQgZGF0YSwgYW5kIGl0IGlzIHVwIHRvIHRoZSBjYWxsYmFjayB0byBmaW5kIHdoYXRldmVyIGl0IG5lZWRzLlxuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvQ2FsbGJhY2sgPSAocm91dGVEYXRhOiBEYXRhKSA9PiBOYXR1cmFsU2VvQmFzaWM7XG5cbi8qKlxuICogVHlwaWNhbGx5IHVzZWQgdG8gdHlwZSB0aGUgcm91dGluZyBkYXRhIHJlY2VpdmVkIGluIHRoZSBjb21wb25lbnQsIGVnOlxuICpcbiAqIGBgYHRzXG4gKiBjbGFzcyBNeUNvbXBvbmVudCBleHRlbmRzIE5hdHVyYWxBYnN0cmFjdERldGFpbDxNeVNlcnZpY2UsIE5hdHVyYWxTZW9SZXNvbHZlRGF0YT4ge31cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvUmVzb2x2ZURhdGEgPSB7XG4gICAgc2VvOiBOYXR1cmFsU2VvQmFzaWM7XG59O1xuXG5pbnRlcmZhY2UgUm9ib3RzIHtcbiAgICAvKipcbiAgICAgKiBJZiBnaXZlbiB3aWxsIGJlIHVzZWQgYXMgcm9ib3RzIG1ldGEgdGFnLCBvdGhlcndpc2UgZmFsbGJhY2sgb24gZGVmYXVsdCB2YWx1ZVxuICAgICAqL1xuICAgIHJvYm90cz86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOYXR1cmFsU2VvQ29uZmlnIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCB3aWxsIGFsd2F5cyBhcHBlYXIgaW4gdGhlIHBhZ2UgdGl0bGVcbiAgICAgKi9cbiAgICByZWFkb25seSBhcHBsaWNhdGlvbk5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIGRlc2NyaXB0aW9uIG1ldGEgdGhhdCBpcyB1c2VkIGZvciBwYWdlcyB3aXRob3V0IHZhbHVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdERlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZSBmb3Igcm9ib3RzIG1ldGEgdGhhdCBpcyB1c2VkIGZvciBwYWdlcyB3aXRob3V0IHZhbHVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgZGVmYXVsdFJvYm90cz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIElmIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcm91dGUgYW5kIG11c3QgcmV0dXJuIGEgc3RyaW5nIHRoYXQgd2lsbFxuICAgICAqIGJlIGluc2VydGVkIGJldHdlZW4gdGhlIHBhZ2UgdGl0bGUgYW5kIHRoZSBhcHBsaWNhdGlvbiBuYW1lLlxuICAgICAqXG4gICAgICogSXQgc2hvdWxkIGJlIHVzZWQgdG8gY29tcGxldGUgdGhlIHRpdGxlIHdpdGggaW5mbyB0aGF0IGFyZSBvZnRlbiwgYnV0IG5vdCBuZWNlc3NhcmlseSBhbHdheXMsXG4gICAgICogYXZhaWxhYmxlIHRocm91Z2hvdXQgdGhlIGVudGlyZSBhcHBsaWNhdGlvbi4gVHlwaWNhbGx5IHVzZWQgZm9yIHRoZSBzaXRlL3N0YXRlIGluIE9LcGlsb3QuXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXh0cmFQYXJ0PzogKHJvdXRlRGF0YTogRGF0YSkgPT4gc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBnZW5lcmF0ZSBhbHRlcm5hdGl2ZSB0YWdzXG4gICAgICogPGxpbmsgcmVsPVwiYWx0ZXJuYXRlXCIgaHJlZmxhbmc9XCJlblwiIGhyZWY9XCJodHRwczovL3d3dy5leGFtcGxlLmNvbS9lbi9wYWdlXCI+XG4gICAgICovXG4gICAgcmVhZG9ubHkgbGFuZ3VhZ2VzPzogUmVhZG9ubHk8c3RyaW5nW10+O1xufVxuXG5leHBvcnQgY29uc3QgTkFUVVJBTF9TRU9fQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPE5hdHVyYWxTZW9Db25maWc+KCdDb25maWd1cmF0aW9uIGZvciBTRU8gc2VydmljZScpO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXBUYWdzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLzxcXC8/W14+XSs+L2csICcnKTtcbn1cblxudHlwZSBSZXNvbHZlZERhdGEgPSB7XG4gICAgbW9kZWw/OiB7XG4gICAgICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgICAgIGZ1bGxOYW1lPzogc3RyaW5nO1xuICAgICAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICB9O1xufTtcblxuLyoqXG4gKiBUaGlzIHNlcnZpY2UgaXMgcmVzcG9uc2libGUgdG8ga2VlcCB1cCB0byBkYXRlIHRoZSBwYWdlIHRpdGxlIGFuZCBwYWdlIGRlc2NyaXB0aW9uIGFjY29yZGluZ1xuICogdG8gd2hhdCBpcyBjb25maWd1cmVkIGluIHJvdXRpbmcgb3IgZGVmYXVsdCB2YWx1ZXMuXG4gKlxuICogSXQgKiptdXN0KiogYmUgaW5qZWN0ZWQgaW4gdGhlIHJvb3QgbW9kdWxlIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBoYXZlIGVmZmVjdHMgaW4gYWxsIG1vZHVsZXMuIEFuZCBpdFxuICogbXVzdCBiZSBwcm92aWRlZCBhIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogVGhlIGZ1bGwgdGl0bGUgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOlxuICpcbiAqICAgICBkaWFsb2cgdGl0bGUgLSBwYWdlIHRpdGxlIC0gZXh0cmEgcGFydCAtIGFwcCBuYW1lXG4gKlxuICogYGRpYWxvZyB0aXRsZWAgb25seSBleGlzdHMgaWYgYSBgTmF0dXJhbERpYWxvZ1RyaWdnZXJDb21wb25lbnRgIGlzIGN1cnJlbnRseSBvcGVuLCBhbmQgdGhhdCBzb21lIFNFTyBpc1xuICogY29uZmlndXJlZCBmb3IgaXQgaW4gdGhlIHJvdXRpbmcuXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIE5hdHVyYWxTZW9TZXJ2aWNlIHtcbiAgICBwcml2YXRlIHJvdXRlRGF0YT86IERhdGE7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoTkFUVVJBTF9TRU9fQ09ORklHKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTmF0dXJhbFNlb0NvbmZpZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0aXRsZVNlcnZpY2U6IFRpdGxlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1ldGFUYWdTZXJ2aWNlOiBNZXRhLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgbG9jYWxlOiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihldmVudCA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnJvb3Quc25hcHNob3Q7XG4gICAgICAgICAgICB0aGlzLnJvdXRlRGF0YSA9IHRoaXMuZ2V0Um91dGVEYXRhKHJvb3QpO1xuXG4gICAgICAgICAgICBjb25zdCBzZW8gPSB0aGlzLnJvdXRlRGF0YS5zZW8gPz8ge3RpdGxlOiAnJ307XG4gICAgICAgICAgICBjb25zdCBkaWFsb2dSb3V0ZURhdGEgPSB0aGlzLmdldERpYWxvZ1JvdXRlRGF0YShyb290KTtcbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ1NlbzogTmF0dXJhbFNlbyA9IGRpYWxvZ1JvdXRlRGF0YT8uc2VvO1xuXG4gICAgICAgICAgICBsZXQgYmFzaWMgPSB0aGlzLnRvQmFzaWMoc2VvLCB0aGlzLnJvdXRlRGF0YSk7XG4gICAgICAgICAgICBpZiAoZGlhbG9nUm91dGVEYXRhICYmIGRpYWxvZ1Nlbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpYWxvZ0Jhc2ljID0gdGhpcy50b0Jhc2ljKGRpYWxvZ1NlbywgZGlhbG9nUm91dGVEYXRhKTtcbiAgICAgICAgICAgICAgICBiYXNpYyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uZGlhbG9nQmFzaWMsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmpvaW4oW2RpYWxvZ0Jhc2ljLnRpdGxlLCBiYXNpYy50aXRsZV0pLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlKGJhc2ljKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBTRU8gd2l0aCBnaXZlbiBpbmZvLiBUaGUgZXh0cmEgcGFydCBhbmQgYXBwIG5hbWUgd2lsbCBiZSBhcHBlbmRlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogSW4gbW9zdCBjYXNlcyB0aGlzIHNob3VsZCBub3QgYmUgdXNlZCwgYW5kIGluc3RlYWQgdGhlIFNFTyBzaG91bGQgYmUgY29uZmlndXJlZCBpbiB0aGUgcm91dGluZyxcbiAgICAgKiBwb3NzaWJseSB3aXRoIHRoZSBjYWxsYmFjayB2YXJpYW50IGZvciBzb21lIGR5bmFtaXNtLlxuICAgICAqXG4gICAgICogQnV0IGluIHJhcmUgY2FzZXMgb25seSB0aGUgQ29tcG9uZW50IGlzIGFibGUgdG8gYnVpbGQgYSBwcm9wZXIgcGFnZSB0aXRsZSwgYWZ0ZXIgaXQgZ2F0aGVyIGV2ZXJ5dGhpbmcgaXRcbiAgICAgKiBuZWVkZWQuIEZvciB0aG9zZSBjYXNlcyB0aGUgQ29tcG9uZW50IGNhbiBpbmplY3QgdGhpcyBzZXJ2aWNlIGFuZCB1cGRhdGUgdGhlIFNFTyBkaXJlY3RseS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlKHNlbzogTmF0dXJhbFNlb0Jhc2ljKTogdm9pZCB7XG4gICAgICAgIC8vIFRpdGxlXG4gICAgICAgIGNvbnN0IHBhcnRzID0gW1xuICAgICAgICAgICAgc2VvLnRpdGxlLFxuICAgICAgICAgICAgdGhpcy5jb25maWcuZXh0cmFQYXJ0ICYmIHRoaXMucm91dGVEYXRhID8gdGhpcy5jb25maWcuZXh0cmFQYXJ0KHRoaXMucm91dGVEYXRhKSA6ICcnLFxuICAgICAgICAgICAgdGhpcy5jb25maWcuYXBwbGljYXRpb25OYW1lLFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHRpdGxlID0gdGhpcy5qb2luKHBhcnRzKTtcbiAgICAgICAgdGhpcy50aXRsZVNlcnZpY2Uuc2V0VGl0bGUodGl0bGUpO1xuXG4gICAgICAgIC8vIERlc2NyaXB0aW9uXG4gICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gc2VvPy5kZXNjcmlwdGlvbiA/PyB0aGlzLmNvbmZpZy5kZWZhdWx0RGVzY3JpcHRpb247XG4gICAgICAgIHRoaXMudXBkYXRlVGFnKCdkZXNjcmlwdGlvbicsIGRlc2NyaXB0aW9uKTtcblxuICAgICAgICAvLyBSb2JvdHNcbiAgICAgICAgY29uc3Qgcm9ib3RzID0gc2VvPy5yb2JvdHMgPz8gdGhpcy5jb25maWcuZGVmYXVsdFJvYm90cztcbiAgICAgICAgdGhpcy51cGRhdGVUYWcoJ3JvYm90cycsIHJvYm90cyk7XG5cbiAgICAgICAgLy8gQ2Fub25pY2FsXG4gICAgICAgIC8vIEFkZCBsYW5ndWFnZSBpbiB1cmwgKGFmdGVyIGRvbWFpbikgaWYgc29tZSBsYW5ndWFnZXMgYXJlIHByb3ZpZGVkIG9ubHlcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmNvbmZpZy5sYW5ndWFnZXM/Lmxlbmd0aCAmJiB0aGlzLmxvY2FsZSA/IHRoaXMubG9jYWxlLnNwbGl0KCctJylbMF0gOiAnJztcbiAgICAgICAgY29uc3QgdXJsUGFydHMgPSB0aGlzLmdldFVybFBhcnRzKHNlby5jYW5vbmljYWxRdWVyeVBhcmFtc1doaXRlbGlzdCB8fCBbXSk7XG4gICAgICAgIHRoaXMudXBkYXRlTGlua1RhZyh7cmVsOiAnY2Fub25pY2FsJywgaHJlZjogdGhpcy5nZXRVcmwodXJsUGFydHMsIGxhbmd1YWdlKX0pO1xuICAgICAgICB0aGlzLnVwZGF0ZUFsdGVybmF0ZXModXJsUGFydHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVBbHRlcm5hdGVzKHVybFBhcnRzOiB7dXJsOiBzdHJpbmc7IHBhcmFtczogc3RyaW5nfSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbmZpZy5sYW5ndWFnZXM/LmZvckVhY2gobGFuZ3VhZ2UgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMaW5rVGFnKHtyZWw6ICdhbHRlcm5hdGUnLCBocmVmOiB0aGlzLmdldFVybCh1cmxQYXJ0cywgbGFuZ3VhZ2UpLCBocmVmbGFuZzogbGFuZ3VhZ2V9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVcmxQYXJ0cyh3aGl0ZUxpc3RlZFBhcmFtczogc3RyaW5nW10pOiB7dXJsOiBzdHJpbmc7IHBhcmFtczogc3RyaW5nfSB7XG4gICAgICAgIGxldCB1cmwgPSAnaHR0cHM6Ly8nICsgdGhpcy5kb2N1bWVudC5kZWZhdWx0Vmlldz8ud2luZG93LmxvY2F0aW9uLmhvc3RuYW1lO1xuICAgICAgICBjb25zdCB1cmxUcmVlID0gdGhpcy5yb3V0ZXIucGFyc2VVcmwodGhpcy5yb3V0ZXIudXJsKTtcblxuICAgICAgICAvLyBuZWVkIGJldHRlciBsaWtlIHNvbWV0aGluZyByZWN1cnNpdmUgP1xuICAgICAgICBpZiAodXJsVHJlZS5yb290Lmhhc0NoaWxkcmVuKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRzID0gdXJsVHJlZS5yb290LmNoaWxkcmVuWydwcmltYXJ5J10uc2VnbWVudHM7XG4gICAgICAgICAgICBpZiAoc2VnbWVudHMgJiYgc2VnbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHVybCArPSAnLycgKyBzZWdtZW50cy5tYXAoc2VnbWVudCA9PiBzZWdtZW50LnBhdGgpLmpvaW4oJy8nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFF1ZXJ5IFBhcmFtc1xuICAgICAgICBsZXQgcGFyYW1zID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYW0gaW4gdXJsVHJlZS5xdWVyeVBhcmFtcykge1xuICAgICAgICAgICAgaWYgKHdoaXRlTGlzdGVkUGFyYW1zLmluY2x1ZGVzKHBhcmFtKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGVuY29kZVVSSUNvbXBvbmVudChwYXJhbSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQodXJsVHJlZS5xdWVyeVBhcmFtc1twYXJhbV0pO1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSAnJic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcmFtcyArPSBgJHtrZXl9PSR7dmFsdWV9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSAnPycgKyBwYXJhbXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3VybCwgcGFyYW1zfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgbGFuZ3VhZ2UgYmV0d2VlbiBkb21haW4gYW5kIHVyaSBodHRwczovL2V4YW1wbGUuY29tL2ZyL2ZvbGRlci9wYWdlXG4gICAgICogQHBhcmFtIHVybFBhcnRzXG4gICAgICogQHBhcmFtIGxhbmd1YWdlXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFVybCh1cmxQYXJ0czoge3VybDogc3RyaW5nOyBwYXJhbXM6IHN0cmluZ30sIGxhbmd1YWdlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHVybCA9IHVybFBhcnRzLnVybDtcblxuICAgICAgICBpZiAobGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgIHVybCA9IHRoaXMuYWRkTGFuZ3VhZ2VTZWdtZW50KHVybCwgbGFuZ3VhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHVybFBhcnRzLnBhcmFtcykge1xuICAgICAgICAgICAgdXJsICs9IHVybFBhcnRzLnBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRMYW5ndWFnZVNlZ21lbnQodXJsOiBzdHJpbmcsIGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSB1cmxPYmoucGF0aG5hbWUgPT09ICcvJyA/IGAvJHtsYW5ndWFnZX1gIDogYC8ke2xhbmd1YWdlfSR7dXJsT2JqLnBhdGhuYW1lfWA7XG4gICAgICAgIHJldHVybiB1cmxPYmoub3JpZ2luICsgbmV3UGF0aCArIHVybE9iai5zZWFyY2ggKyB1cmxPYmouaGFzaDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGpvaW4ocGFydHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmZpbHRlcihzID0+ICEhcykuam9pbignIC0gJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVUYWcobmFtZTogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMubWV0YVRhZ1NlcnZpY2UudXBkYXRlVGFnKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBzdHJpcFRhZ3ModmFsdWUpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1ldGFUYWdTZXJ2aWNlLnJlbW92ZVRhZyhgbmFtZT1cIiR7bmFtZX1cImApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVMaW5rVGFnKGRlZmluaXRpb246IE5hdHVyYWxMaW5rRGVmaW5pdGlvbik6IHZvaWQge1xuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9XG4gICAgICAgICAgICA8SFRNTExpbmtFbGVtZW50PnRoaXMuZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKHRoaXMuX3BhcnNlU2VsZWN0b3IoZGVmaW5pdGlvbikpIHx8XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJykpO1xuXG4gICAgICAgIGlmIChsaW5rRWxlbWVudCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGVmaW5pdGlvbikuZm9yRWFjaCgoYXR0cmlidXRlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBkZWZpbml0aW9uW2F0dHJpYnV0ZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSB0YWcgdG8gY3JlYXRlIGEgc2VsZWN0b3JcbiAgICAgKiBAcGFyYW0gIGRlZmluaXRpb25cbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHNlbGVjdG9yIHRvIHVzZSBpbiBxdWVyeVNlbGVjdG9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcGFyc2VTZWxlY3RvcihkZWZpbml0aW9uOiBOYXR1cmFsTGlua0RlZmluaXRpb24pOiBzdHJpbmcge1xuICAgICAgICBsZXQgYXR0cmlidXRlcyA9ICdsaW5rJztcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmaW5pdGlvbikuZm9yRWFjaCgoYXR0cjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoYXR0ciAhPT0gJ2hyZWYnKSB7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlcyArPSBgWyR7YXR0cn09XCIke2RlZmluaXRpb25bYXR0cl19XCJdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSBmcm9tIHRoZSBtb3N0IGRlZXAvc3BlY2lmaWMgYWN0aXZhdGVkIHJvdXRlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRSb3V0ZURhdGEocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBEYXRhIHtcbiAgICAgICAgaWYgKHJvdXRlLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFJvdXRlRGF0YShyb3V0ZS5maXJzdENoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByb3V0ZS5kYXRhO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZGF0YSBmcm9tIHRoZSBgTmF0dXJhbERpYWxvZ1RyaWdnZXJDb21wb25lbnRgIGlmIG9uZSBpcyBvcGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXREaWFsb2dSb3V0ZURhdGEocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBEYXRhIHwgbnVsbCB7XG4gICAgICAgIGlmIChyb3V0ZS5jb21wb25lbnQgPT09IE5hdHVyYWxEaWFsb2dUcmlnZ2VyQ29tcG9uZW50ICYmIHJvdXRlLm91dGxldCAhPT0gUFJJTUFSWV9PVVRMRVQpIHtcbiAgICAgICAgICAgIHJldHVybiByb3V0ZS5kYXRhO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiByb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuZ2V0RGlhbG9nUm91dGVEYXRhKGNoaWxkKTtcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvQmFzaWMoc2VvOiBOYXR1cmFsU2VvLCByb3V0ZURhdGE6IERhdGEpOiBOYXR1cmFsU2VvQmFzaWMge1xuICAgICAgICBpZiAodHlwZW9mIHNlbyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHNlbyhyb3V0ZURhdGEpO1xuICAgICAgICB9IGVsc2UgaWYgKCdyZXNvbHZlS2V5JyBpbiBzZW8pIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGE6IFJlc29sdmVkRGF0YSB8IHVuZGVmaW5lZCA9IHJvdXRlRGF0YVtzZW8ucmVzb2x2ZUtleV07XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHJlc29sdmVkIGRhdGEgZm9yIFNFTyBzZXJ2aWNlIHdpdGgga2V5OiAnICsgc2VvLnJlc29sdmVLZXkpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhLm1vZGVsPy5mdWxsTmFtZSA/PyBkYXRhLm1vZGVsPy5uYW1lID8/ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLm1vZGVsPy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICByb2JvdHM6IHNlby5yb2JvdHMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNlbztcbiAgICB9XG59XG4iXX0=
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uYXR1cmFsL3NyYy9saWIvbW9kdWxlcy9jb21tb24vc2VydmljZXMvc2VvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFNUUsT0FBTyxFQUErQixhQUFhLEVBQUUsY0FBYyxFQUFTLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUM1RixPQUFPLEVBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7QUErR25ELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLElBQUksY0FBYyxDQUFtQiwrQkFBK0IsQ0FBQyxDQUFDO0FBRXhHLE1BQU0sVUFBVSxTQUFTLENBQUMsR0FBVztJQUNqQyxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFVRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQU0xQixZQUNnQyxXQUE2QixFQUN4QyxNQUFjLEVBQ2QsWUFBbUIsRUFDbkIsY0FBb0IsRUFDRixRQUFrQixFQUMxQixNQUFjO1FBSnhCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxpQkFBWSxHQUFaLFlBQVksQ0FBTztRQUNuQixtQkFBYyxHQUFkLGNBQWMsQ0FBTTtRQUNGLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDMUIsV0FB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QUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBMT0NBTEVfSUR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtNZXRhLCBUaXRsZX0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlU25hcHNob3QsIERhdGEsIE5hdmlnYXRpb25FbmQsIFBSSU1BUllfT1VUTEVULCBSb3V0ZXJ9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge2ZpbHRlciwgc3RhcnRXaXRofSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge05hdHVyYWxEaWFsb2dUcmlnZ2VyQ29tcG9uZW50fSBmcm9tICcuLi8uLi9kaWFsb2ctdHJpZ2dlci9kaWFsb2ctdHJpZ2dlci5jb21wb25lbnQnO1xuaW1wb3J0IHtjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZn0gZnJvbSAncnhqcyc7XG5cbmV4cG9ydCB0eXBlIE5hdHVyYWxTZW8gPSBOYXR1cmFsU2VvQmFzaWMgfCBOYXR1cmFsU2VvQ2FsbGJhY2sgfCBOYXR1cmFsU2VvUmVzb2x2ZTtcblxuLyoqXG4gKiBUeXBpY2FsbHkgdXNlZCBmb3IgXCJzdGF0aWNcIiBwYWdlcyB3aGVyZSB0aGVyZSBpcyBub3QgYSBzaW5nbGUgcmVzb2x2ZWQgb2JqZWN0LiBTb1xuICogYWxsIHBhZ2VzIHN1Y2ggYXMgXCJBYm91dFwiLCBvciBsaXN0IG9mIG9iamVjdHMgKGxpc3Qgb2Ygcmlza3MsIGV0Yy4pLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIHRoZSBtb3N0IGNvbW1vbiB1c2VkIHZhcmlhbnQuXG4gKi9cbmV4cG9ydCB0eXBlIE5hdHVyYWxTZW9CYXNpYyA9IFJvYm90cyAmIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFnZSB0aXRsZSwgdGhhdCB3aWxsIGJlIGNvbmNhdGVuYXRlZCB3aXRoIGFwcGxpY2F0aW9uIG5hbWVcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogSWYgZ2l2ZW4gd2lsbCBiZSB1c2VkIGFzIHBhZ2UgZGVzY3JpcHRpb24sIG90aGVyd2lzZSBmYWxsYmFjayBvbiBkZWZhdWx0IHZhbHVlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHBhcmFtZXRlcnMgaW5jbHVkZWQgaW4gdGhlIGNhbm9uaWNhbCB0YWcncyB1cmxcbiAgICAgKi9cbiAgICBjYW5vbmljYWxRdWVyeVBhcmFtc1doaXRlbGlzdD86IHN0cmluZ1tdO1xufTtcblxudHlwZSBOYXR1cmFsTGlua0RlZmluaXRpb24gPSB7XG4gICAgY2hhcnNldD86IHN0cmluZztcbiAgICBjcm9zc29yaWdpbj86IHN0cmluZztcbiAgICBocmVmPzogc3RyaW5nO1xuICAgIGhyZWZsYW5nPzogc3RyaW5nO1xuICAgIG1lZGlhPzogc3RyaW5nO1xuICAgIHJlbD86IHN0cmluZztcbiAgICByZXY/OiBzdHJpbmc7XG4gICAgc2l6ZXM/OiBzdHJpbmc7XG4gICAgdGFyZ2V0Pzogc3RyaW5nO1xuICAgIHR5cGU/OiBzdHJpbmc7XG59ICYge1xuICAgIFtwcm9wOiBzdHJpbmddOiBzdHJpbmc7XG59O1xuLyoqXG4gKiBUeXBpY2FsbHkgdXNlZCBmb3IgYSBcImR5bmFtaWNcIiBwYWdlIHdoZXJlIGEgc2luZ2xlIG9iamVjdCBpcyByZXNvbHZlZC4gU28gYSBkZXRhaWwgcGFnZSwgc3VjaFxuICogYXMgdGhlIGRldGFpbCBvZiBhIHJpc2sgYW5kIHNvIG9uLlxuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvUmVzb2x2ZSA9IFJvYm90cyAmIHtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIGJlIHVzZWQgaW4gdGhlIHJlc29sdmVkIGRhdGEgdG8gZmluZCB0aGUgcmVzb2x2ZWQgb2JqZWN0LiBUaGUgZnVsbE5hbWVcbiAgICAgKiBvciBuYW1lIG9mIHRoZSBvYmplY3Qgd2lsbCBiZSB1c2VkIGZvciBwYWdlIHRpdGxlLCBhbmQgdGhlIG9iamVjdCBkZXNjcmlwdGlvbiwgaWYgYW55LFxuICAgICAqIHdpbGwgYmUgdXNlZCBmb3IgcGFnZSBkZXNjcmlwdGlvbi5cbiAgICAgKi9cbiAgICByZXNvbHZlS2V5OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIFJhcmVseSB1c2VkIGZvciBhIHBhZ2UgdGhhdCBoYXMgdmVyeSBzcGVjaWZpYyBuZWVkcyBhbmQgbmVlZCB0byBidWlsZCB0aXRsZSBhbmQgZGVzY3JpcHRpb24gaW4gYSBjdXN0b20gd2F5LlxuICogVGhlIGNhbGxiYWNrIGJhY2sgd2lsbCBiZSBnaXZlbiB0aGUgcmVzb2x2ZWQgZGF0YSwgYW5kIGl0IGlzIHVwIHRvIHRoZSBjYWxsYmFjayB0byBmaW5kIHdoYXRldmVyIGl0IG5lZWRzLlxuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvQ2FsbGJhY2sgPSAocm91dGVEYXRhOiBEYXRhKSA9PiBOYXR1cmFsU2VvQmFzaWM7XG5cbi8qKlxuICogVHlwaWNhbGx5IHVzZWQgdG8gdHlwZSB0aGUgcm91dGluZyBkYXRhIHJlY2VpdmVkIGluIHRoZSBjb21wb25lbnQsIGVnOlxuICpcbiAqIGBgYHRzXG4gKiBjbGFzcyBNeUNvbXBvbmVudCBleHRlbmRzIE5hdHVyYWxBYnN0cmFjdERldGFpbDxNeVNlcnZpY2UsIE5hdHVyYWxTZW9SZXNvbHZlRGF0YT4ge31cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBOYXR1cmFsU2VvUmVzb2x2ZURhdGEgPSB7XG4gICAgc2VvOiBOYXR1cmFsU2VvQmFzaWM7XG59O1xuXG5pbnRlcmZhY2UgUm9ib3RzIHtcbiAgICAvKipcbiAgICAgKiBJZiBnaXZlbiB3aWxsIGJlIHVzZWQgYXMgcm9ib3RzIG1ldGEgdGFnLCBvdGhlcndpc2UgZmFsbGJhY2sgb24gZGVmYXVsdCB2YWx1ZVxuICAgICAqL1xuICAgIHJvYm90cz86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE5hdHVyYWxTZW9Db25maWdQbGFpbiB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIHRoYXQgd2lsbCBhbHdheXMgYXBwZWFyIGluIHRoZSBwYWdlIHRpdGxlXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwbGljYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciBkZXNjcmlwdGlvbiBtZXRhIHRoYXQgaXMgdXNlZCBmb3IgcGFnZXMgd2l0aG91dCB2YWx1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHREZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIHJvYm90cyBtZXRhIHRoYXQgaXMgdXNlZCBmb3IgcGFnZXMgd2l0aG91dCB2YWx1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHRSb2JvdHM/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJZiBnaXZlbiwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHJvdXRlIGFuZCBtdXN0IHJldHVybiBhIHN0cmluZyB0aGF0IHdpbGxcbiAgICAgKiBiZSBpbnNlcnRlZCBiZXR3ZWVuIHRoZSBwYWdlIHRpdGxlIGFuZCB0aGUgYXBwbGljYXRpb24gbmFtZS5cbiAgICAgKlxuICAgICAqIEl0IHNob3VsZCBiZSB1c2VkIHRvIGNvbXBsZXRlIHRoZSB0aXRsZSB3aXRoIGluZm8gdGhhdCBhcmUgb2Z0ZW4sIGJ1dCBub3QgbmVjZXNzYXJpbHkgYWx3YXlzLFxuICAgICAqIGF2YWlsYWJsZSB0aHJvdWdob3V0IHRoZSBlbnRpcmUgYXBwbGljYXRpb24uIFR5cGljYWxseSB1c2VkIGZvciB0aGUgc2l0ZS9zdGF0ZSBpbiBPS3BpbG90LlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4dHJhUGFydD86IChyb3V0ZURhdGE6IERhdGEpID0+IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFVzZWQgdG8gZ2VuZXJhdGUgYWx0ZXJuYXRpdmUgdGFnc1xuICAgICAqIDxsaW5rIHJlbD1cImFsdGVybmF0ZVwiIGhyZWZsYW5nPVwiZW5cIiBocmVmPVwiaHR0cHM6Ly93d3cuZXhhbXBsZS5jb20vZW4vcGFnZVwiPlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGxhbmd1YWdlcz86IFJlYWRvbmx5PHN0cmluZ1tdPjtcbn1cblxuZXhwb3J0IHR5cGUgTmF0dXJhbFNlb0NvbmZpZyA9IE5hdHVyYWxTZW9Db25maWdQbGFpbiB8IE9ic2VydmFibGU8TmF0dXJhbFNlb0NvbmZpZ1BsYWluPjtcbmV4cG9ydCBjb25zdCBOQVRVUkFMX1NFT19DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW48TmF0dXJhbFNlb0NvbmZpZz4oJ0NvbmZpZ3VyYXRpb24gZm9yIFNFTyBzZXJ2aWNlJyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpcFRhZ3Moc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvPFxcLz9bXj5dKz4vZywgJycpO1xufVxuXG50eXBlIFJlc29sdmVkRGF0YSA9IHtcbiAgICBtb2RlbD86IHtcbiAgICAgICAgbmFtZT86IHN0cmluZztcbiAgICAgICAgZnVsbE5hbWU/OiBzdHJpbmc7XG4gICAgICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIH07XG59O1xuXG4vKipcbiAqIFRoaXMgc2VydmljZSBpcyByZXNwb25zaWJsZSB0byBrZWVwIHVwIHRvIGRhdGUgdGhlIHBhZ2UgdGl0bGUgYW5kIHBhZ2UgZGVzY3JpcHRpb24gYWNjb3JkaW5nXG4gKiB0byB3aGF0IGlzIGNvbmZpZ3VyZWQgaW4gcm91dGluZyBvciBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBJdCAqKm11c3QqKiBiZSBpbmplY3RlZCBpbiB0aGUgcm9vdCBtb2R1bGUgb2YgdGhlIGFwcGxpY2F0aW9uIHRvIGhhdmUgZWZmZWN0cyBpbiBhbGwgbW9kdWxlcy4gQW5kIGl0XG4gKiBtdXN0IGJlIHByb3ZpZGVkIGEgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBUaGUgZnVsbCB0aXRsZSBoYXMgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKlxuICogICAgIGRpYWxvZyB0aXRsZSAtIHBhZ2UgdGl0bGUgLSBleHRyYSBwYXJ0IC0gYXBwIG5hbWVcbiAqXG4gKiBgZGlhbG9nIHRpdGxlYCBvbmx5IGV4aXN0cyBpZiBhIGBOYXR1cmFsRGlhbG9nVHJpZ2dlckNvbXBvbmVudGAgaXMgY3VycmVudGx5IG9wZW4sIGFuZCB0aGF0IHNvbWUgU0VPIGlzXG4gKiBjb25maWd1cmVkIGZvciBpdCBpbiB0aGUgcm91dGluZy5cbiAqL1xuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTmF0dXJhbFNlb1NlcnZpY2Uge1xuICAgIHByaXZhdGUgcm91dGVEYXRhPzogRGF0YTtcbiAgICBwcml2YXRlIGNvbmZpZzogTmF0dXJhbFNlb0NvbmZpZ1BsYWluID0ge1xuICAgICAgICBhcHBsaWNhdGlvbk5hbWU6ICcnLFxuICAgIH07XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoTkFUVVJBTF9TRU9fQ09ORklHKSBjb25maWdUb2tlbjogTmF0dXJhbFNlb0NvbmZpZyxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSB0aXRsZVNlcnZpY2U6IFRpdGxlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG1ldGFUYWdTZXJ2aWNlOiBNZXRhLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IGRvY3VtZW50OiBEb2N1bWVudCxcbiAgICAgICAgQEluamVjdChMT0NBTEVfSUQpIHByaXZhdGUgbG9jYWxlOiBzdHJpbmcsXG4gICAgKSB7XG4gICAgICAgIGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgY29uZmlnOiBjb25maWdUb2tlbiBpbnN0YW5jZW9mIE9ic2VydmFibGUgPyBjb25maWdUb2tlbi5waXBlKHN0YXJ0V2l0aCh0aGlzLmNvbmZpZykpIDogb2YoY29uZmlnVG9rZW4pLFxuICAgICAgICAgICAgbmF2aWdhdGlvbkVuZDogdGhpcy5yb3V0ZXIuZXZlbnRzLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkpLFxuICAgICAgICB9KS5zdWJzY3JpYmUoKHtjb25maWd9KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5yb290LnNuYXBzaG90O1xuICAgICAgICAgICAgdGhpcy5yb3V0ZURhdGEgPSB0aGlzLmdldFJvdXRlRGF0YShyb290KTtcblxuICAgICAgICAgICAgY29uc3Qgc2VvOiBOYXR1cmFsU2VvID0gdGhpcy5yb3V0ZURhdGEuc2VvID8/IHt0aXRsZTogJyd9O1xuICAgICAgICAgICAgY29uc3QgZGlhbG9nUm91dGVEYXRhID0gdGhpcy5nZXREaWFsb2dSb3V0ZURhdGEocm9vdCk7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2dTZW86IE5hdHVyYWxTZW8gPSBkaWFsb2dSb3V0ZURhdGE/LnNlbztcblxuICAgICAgICAgICAgbGV0IGJhc2ljID0gdGhpcy50b0Jhc2ljKHNlbywgdGhpcy5yb3V0ZURhdGEpO1xuICAgICAgICAgICAgaWYgKGRpYWxvZ1JvdXRlRGF0YSAmJiBkaWFsb2dTZW8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2dCYXNpYyA9IHRoaXMudG9CYXNpYyhkaWFsb2dTZW8sIGRpYWxvZ1JvdXRlRGF0YSk7XG4gICAgICAgICAgICAgICAgYmFzaWMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmRpYWxvZ0Jhc2ljLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5qb2luKFtkaWFsb2dCYXNpYy50aXRsZSwgYmFzaWMudGl0bGVdKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShiYXNpYyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgU0VPIHdpdGggZ2l2ZW4gaW5mby4gVGhlIGV4dHJhIHBhcnQgYW5kIGFwcCBuYW1lIHdpbGwgYmUgYXBwZW5kZWQgYXV0b21hdGljYWxseS5cbiAgICAgKlxuICAgICAqIEluIG1vc3QgY2FzZXMsIHRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkLiBBbmQgaW5zdGVhZCwgdGhlIFNFTyBzaG91bGQgYmUgY29uZmlndXJlZCBpbiB0aGUgcm91dGluZyxcbiAgICAgKiBwb3NzaWJseSB3aXRoIHRoZSBjYWxsYmFjayB2YXJpYW50IGZvciBzb21lIGR5bmFtaXNtLlxuICAgICAqXG4gICAgICogQnV0IGluIHJhcmUgY2FzZXMsIG9ubHkgdGhlIENvbXBvbmVudCBpcyBhYmxlIHRvIGJ1aWxkIGEgcHJvcGVyIHBhZ2UgdGl0bGUsIGFmdGVyIGl0IGdhdGhlcmVkIGV2ZXJ5dGhpbmcgaXRcbiAgICAgKiBuZWVkZWQuIEZvciB0aG9zZSBjYXNlcywgdGhlIENvbXBvbmVudCBjYW4gaW5qZWN0IHRoaXMgc2VydmljZSBhbmQgdXBkYXRlIHRoZSBTRU8gZGlyZWN0bHkuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZShzZW86IE5hdHVyYWxTZW9CYXNpYyk6IHZvaWQge1xuICAgICAgICAvLyBUaXRsZVxuICAgICAgICBjb25zdCBwYXJ0cyA9IFtcbiAgICAgICAgICAgIHNlby50aXRsZSxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmV4dHJhUGFydCAmJiB0aGlzLnJvdXRlRGF0YSA/IHRoaXMuY29uZmlnLmV4dHJhUGFydCh0aGlzLnJvdXRlRGF0YSkgOiAnJyxcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLmFwcGxpY2F0aW9uTmFtZSxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMuam9pbihwYXJ0cyk7XG4gICAgICAgIHRoaXMudGl0bGVTZXJ2aWNlLnNldFRpdGxlKHRpdGxlKTtcblxuICAgICAgICAvLyBEZXNjcmlwdGlvblxuICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHNlbz8uZGVzY3JpcHRpb24gPz8gdGhpcy5jb25maWcuZGVmYXVsdERlc2NyaXB0aW9uO1xuICAgICAgICB0aGlzLnVwZGF0ZVRhZygnZGVzY3JpcHRpb24nLCBkZXNjcmlwdGlvbik7XG5cbiAgICAgICAgLy8gUm9ib3RzXG4gICAgICAgIGNvbnN0IHJvYm90cyA9IHNlbz8ucm9ib3RzID8/IHRoaXMuY29uZmlnLmRlZmF1bHRSb2JvdHM7XG4gICAgICAgIHRoaXMudXBkYXRlVGFnKCdyb2JvdHMnLCByb2JvdHMpO1xuXG4gICAgICAgIC8vIENhbm9uaWNhbFxuICAgICAgICAvLyBBZGQgbGFuZ3VhZ2UgaW4gdXJsIChhZnRlciBkb21haW4pIGlmIHNvbWUgbGFuZ3VhZ2VzIGFyZSBwcm92aWRlZCBvbmx5XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5jb25maWcubGFuZ3VhZ2VzPy5sZW5ndGggJiYgdGhpcy5sb2NhbGUgPyB0aGlzLmxvY2FsZS5zcGxpdCgnLScpWzBdIDogJyc7XG4gICAgICAgIGNvbnN0IHVybFBhcnRzID0gdGhpcy5nZXRVcmxQYXJ0cyhzZW8uY2Fub25pY2FsUXVlcnlQYXJhbXNXaGl0ZWxpc3QgPz8gW10pO1xuICAgICAgICB0aGlzLnVwZGF0ZUxpbmtUYWcoe3JlbDogJ2Nhbm9uaWNhbCcsIGhyZWY6IHRoaXMuZ2V0VXJsKHVybFBhcnRzLCBsYW5ndWFnZSl9KTtcbiAgICAgICAgdGhpcy51cGRhdGVBbHRlcm5hdGVzKHVybFBhcnRzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUFsdGVybmF0ZXModXJsUGFydHM6IHt1cmw6IHN0cmluZzsgcGFyYW1zOiBzdHJpbmd9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29uZmlnLmxhbmd1YWdlcz8uZm9yRWFjaChsYW5ndWFnZSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUxpbmtUYWcoe3JlbDogJ2FsdGVybmF0ZScsIGhyZWY6IHRoaXMuZ2V0VXJsKHVybFBhcnRzLCBsYW5ndWFnZSksIGhyZWZsYW5nOiBsYW5ndWFnZX0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFVybFBhcnRzKHdoaXRlTGlzdGVkUGFyYW1zOiBzdHJpbmdbXSk6IHt1cmw6IHN0cmluZzsgcGFyYW1zOiBzdHJpbmd9IHtcbiAgICAgICAgbGV0IHVybCA9ICdodHRwczovLycgKyB0aGlzLmRvY3VtZW50LmRlZmF1bHRWaWV3Py53aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLnJvdXRlci5wYXJzZVVybCh0aGlzLnJvdXRlci51cmwpO1xuXG4gICAgICAgIC8vIG5lZWQgYmV0dGVyIGxpa2Ugc29tZXRoaW5nIHJlY3Vyc2l2ZSA/XG4gICAgICAgIGlmICh1cmxUcmVlLnJvb3QuaGFzQ2hpbGRyZW4oKSkge1xuICAgICAgICAgICAgY29uc3Qgc2VnbWVudHMgPSB1cmxUcmVlLnJvb3QuY2hpbGRyZW5bJ3ByaW1hcnknXS5zZWdtZW50cztcbiAgICAgICAgICAgIGlmIChzZWdtZW50cyAmJiBzZWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9ICcvJyArIHNlZ21lbnRzLm1hcChzZWdtZW50ID0+IHNlZ21lbnQucGF0aCkuam9pbignLycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVlcnkgUGFyYW1zXG4gICAgICAgIGxldCBwYXJhbXMgPSAnJztcbiAgICAgICAgZm9yIChjb25zdCB3aGl0ZUxpc3RlZFBhcmFtIG9mIHdoaXRlTGlzdGVkUGFyYW1zKSB7XG4gICAgICAgICAgICBpZiAod2hpdGVMaXN0ZWRQYXJhbSBpbiB1cmxUcmVlLnF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KHdoaXRlTGlzdGVkUGFyYW0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZW5jb2RlVVJJQ29tcG9uZW50KHVybFRyZWUucXVlcnlQYXJhbXNbd2hpdGVMaXN0ZWRQYXJhbV0pO1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtcyArPSAnJic7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHBhcmFtcyArPSBgJHtrZXl9PSR7dmFsdWV9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSAnPycgKyBwYXJhbXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge3VybCwgcGFyYW1zfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgbGFuZ3VhZ2UgYmV0d2VlbiBkb21haW4gYW5kIHVyaSBodHRwczovL2V4YW1wbGUuY29tL2ZyL2ZvbGRlci9wYWdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRVcmwodXJsUGFydHM6IHt1cmw6IHN0cmluZzsgcGFyYW1zOiBzdHJpbmd9LCBsYW5ndWFnZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCB1cmwgPSB1cmxQYXJ0cy51cmw7XG5cbiAgICAgICAgaWYgKGxhbmd1YWdlKSB7XG4gICAgICAgICAgICB1cmwgPSB0aGlzLmFkZExhbmd1YWdlU2VnbWVudCh1cmwsIGxhbmd1YWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cmxQYXJ0cy5wYXJhbXMpIHtcbiAgICAgICAgICAgIHVybCArPSB1cmxQYXJ0cy5wYXJhbXM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkTGFuZ3VhZ2VTZWdtZW50KHVybDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuICAgICAgICBjb25zdCBuZXdQYXRoID0gdXJsT2JqLnBhdGhuYW1lID09PSAnLycgPyBgLyR7bGFuZ3VhZ2V9YCA6IGAvJHtsYW5ndWFnZX0ke3VybE9iai5wYXRobmFtZX1gO1xuICAgICAgICByZXR1cm4gdXJsT2JqLm9yaWdpbiArIG5ld1BhdGggKyB1cmxPYmouc2VhcmNoICsgdXJsT2JqLmhhc2g7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBqb2luKHBhcnRzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBwYXJ0cy5maWx0ZXIocyA9PiAhIXMpLmpvaW4oJyAtICcpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVGFnKG5hbWU6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLm1ldGFUYWdTZXJ2aWNlLnVwZGF0ZVRhZyh7XG4gICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogc3RyaXBUYWdzKHZhbHVlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5tZXRhVGFnU2VydmljZS5yZW1vdmVUYWcoYG5hbWU9XCIke25hbWV9XCJgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTGlua1RhZyhkZWZpbml0aW9uOiBOYXR1cmFsTGlua0RlZmluaXRpb24pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPVxuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3I8SFRNTExpbmtFbGVtZW50Pih0aGlzLnBhcnNlU2VsZWN0b3IoZGVmaW5pdGlvbikpID8/XG4gICAgICAgICAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJykpO1xuXG4gICAgICAgIGlmIChsaW5rRWxlbWVudCkge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMoZGVmaW5pdGlvbikuZm9yRWFjaCgoYXR0cmlidXRlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBkZWZpbml0aW9uW2F0dHJpYnV0ZV0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHNlbGVjdG9yIHRvIHVzZSBpbiBxdWVyeVNlbGVjdG9yIHRvIGdldCB0aGUgZ2l2ZW4gbGlua1xuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VTZWxlY3RvcihkZWZpbml0aW9uOiBOYXR1cmFsTGlua0RlZmluaXRpb24pOiBzdHJpbmcge1xuICAgICAgICBsZXQgYXR0cmlidXRlcyA9ICdsaW5rJztcbiAgICAgICAgT2JqZWN0LmtleXMoZGVmaW5pdGlvbikuZm9yRWFjaChhdHRyID0+IHtcbiAgICAgICAgICAgIGlmIChhdHRyICE9PSAnaHJlZicpIHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICs9IGBbJHthdHRyfT1cIiR7ZGVmaW5pdGlvblthdHRyXX1cIl1gO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGZyb20gdGhlIG1vc3QgZGVlcC9zcGVjaWZpYyBhY3RpdmF0ZWQgcm91dGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGdldFJvdXRlRGF0YShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IERhdGEge1xuICAgICAgICBpZiAocm91dGUuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Um91dGVEYXRhKHJvdXRlLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmRhdGE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBkYXRhIGZyb20gdGhlIGBOYXR1cmFsRGlhbG9nVHJpZ2dlckNvbXBvbmVudGAgaWYgb25lIGlzIG9wZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGdldERpYWxvZ1JvdXRlRGF0YShyb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IERhdGEgfCBudWxsIHtcbiAgICAgICAgaWYgKHJvdXRlLmNvbXBvbmVudCA9PT0gTmF0dXJhbERpYWxvZ1RyaWdnZXJDb21wb25lbnQgJiYgcm91dGUub3V0bGV0ICE9PSBQUklNQVJZX09VVExFVCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXREaWFsb2dSb3V0ZURhdGEoY2hpbGQpO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9CYXNpYyhzZW86IE5hdHVyYWxTZW8sIHJvdXRlRGF0YTogRGF0YSk6IE5hdHVyYWxTZW9CYXNpYyB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VvID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VvKHJvdXRlRGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoJ3Jlc29sdmVLZXknIGluIHNlbykge1xuICAgICAgICAgICAgY29uc3QgZGF0YTogUmVzb2x2ZWREYXRhIHwgdW5kZWZpbmVkID0gcm91dGVEYXRhW3Nlby5yZXNvbHZlS2V5XTtcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgcmVzb2x2ZWQgZGF0YSBmb3IgU0VPIHNlcnZpY2Ugd2l0aCBrZXk6ICcgKyBzZW8ucmVzb2x2ZUtleSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGRhdGEubW9kZWw/LmZ1bGxOYW1lID8/IGRhdGEubW9kZWw/Lm5hbWUgPz8gJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGRhdGEubW9kZWw/LmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHJvYm90czogc2VvLnJvYm90cyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2VvO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -5792,14 +5792,20 @@ function stripTags(str) {
|
|
|
5792
5792
|
* configured for it in the routing.
|
|
5793
5793
|
*/
|
|
5794
5794
|
class NaturalSeoService {
|
|
5795
|
-
constructor(
|
|
5796
|
-
this.config = config;
|
|
5795
|
+
constructor(configToken, router, titleService, metaTagService, document, locale) {
|
|
5797
5796
|
this.router = router;
|
|
5798
5797
|
this.titleService = titleService;
|
|
5799
5798
|
this.metaTagService = metaTagService;
|
|
5800
5799
|
this.document = document;
|
|
5801
5800
|
this.locale = locale;
|
|
5802
|
-
this.
|
|
5801
|
+
this.config = {
|
|
5802
|
+
applicationName: '',
|
|
5803
|
+
};
|
|
5804
|
+
combineLatest({
|
|
5805
|
+
config: configToken instanceof Observable ? configToken.pipe(startWith(this.config)) : of(configToken),
|
|
5806
|
+
navigationEnd: this.router.events.pipe(filter(event => event instanceof NavigationEnd)),
|
|
5807
|
+
}).subscribe(({ config }) => {
|
|
5808
|
+
this.config = config;
|
|
5803
5809
|
const root = this.router.routerState.root.snapshot;
|
|
5804
5810
|
this.routeData = this.getRouteData(root);
|
|
5805
5811
|
const seo = this.routeData.seo ?? { title: '' };
|
|
@@ -5819,11 +5825,11 @@ class NaturalSeoService {
|
|
|
5819
5825
|
/**
|
|
5820
5826
|
* Update the SEO with given info. The extra part and app name will be appended automatically.
|
|
5821
5827
|
*
|
|
5822
|
-
* In most cases this should not be used
|
|
5828
|
+
* In most cases, this should not be used. And instead, the SEO should be configured in the routing,
|
|
5823
5829
|
* possibly with the callback variant for some dynamism.
|
|
5824
5830
|
*
|
|
5825
|
-
* But in rare cases only the Component is able to build a proper page title, after it
|
|
5826
|
-
* needed. For those cases the Component can inject this service and update the SEO directly.
|
|
5831
|
+
* But in rare cases, only the Component is able to build a proper page title, after it gathered everything it
|
|
5832
|
+
* needed. For those cases, the Component can inject this service and update the SEO directly.
|
|
5827
5833
|
*/
|
|
5828
5834
|
update(seo) {
|
|
5829
5835
|
// Title
|
|
@@ -5843,7 +5849,7 @@ class NaturalSeoService {
|
|
|
5843
5849
|
// Canonical
|
|
5844
5850
|
// Add language in url (after domain) if some languages are provided only
|
|
5845
5851
|
const language = this.config.languages?.length && this.locale ? this.locale.split('-')[0] : '';
|
|
5846
|
-
const urlParts = this.getUrlParts(seo.canonicalQueryParamsWhitelist
|
|
5852
|
+
const urlParts = this.getUrlParts(seo.canonicalQueryParamsWhitelist ?? []);
|
|
5847
5853
|
this.updateLinkTag({ rel: 'canonical', href: this.getUrl(urlParts, language) });
|
|
5848
5854
|
this.updateAlternates(urlParts);
|
|
5849
5855
|
}
|
|
@@ -5864,10 +5870,10 @@ class NaturalSeoService {
|
|
|
5864
5870
|
}
|
|
5865
5871
|
// Query Params
|
|
5866
5872
|
let params = '';
|
|
5867
|
-
for (const
|
|
5868
|
-
if (
|
|
5869
|
-
const key = encodeURIComponent(
|
|
5870
|
-
const value = encodeURIComponent(urlTree.queryParams[
|
|
5873
|
+
for (const whiteListedParam of whiteListedParams) {
|
|
5874
|
+
if (whiteListedParam in urlTree.queryParams) {
|
|
5875
|
+
const key = encodeURIComponent(whiteListedParam);
|
|
5876
|
+
const value = encodeURIComponent(urlTree.queryParams[whiteListedParam]);
|
|
5871
5877
|
if (params.length) {
|
|
5872
5878
|
params += '&';
|
|
5873
5879
|
}
|
|
@@ -5881,9 +5887,6 @@ class NaturalSeoService {
|
|
|
5881
5887
|
}
|
|
5882
5888
|
/**
|
|
5883
5889
|
* Add language between domain and uri https://example.com/fr/folder/page
|
|
5884
|
-
* @param urlParts
|
|
5885
|
-
* @param language
|
|
5886
|
-
* @private
|
|
5887
5890
|
*/
|
|
5888
5891
|
getUrl(urlParts, language) {
|
|
5889
5892
|
let url = urlParts.url;
|
|
@@ -5915,7 +5918,7 @@ class NaturalSeoService {
|
|
|
5915
5918
|
}
|
|
5916
5919
|
}
|
|
5917
5920
|
updateLinkTag(definition) {
|
|
5918
|
-
const linkElement = this.document.head.querySelector(this.
|
|
5921
|
+
const linkElement = this.document.head.querySelector(this.parseSelector(definition)) ??
|
|
5919
5922
|
this.document.head.appendChild(this.document.createElement('link'));
|
|
5920
5923
|
if (linkElement) {
|
|
5921
5924
|
Object.keys(definition).forEach((attribute) => {
|
|
@@ -5924,13 +5927,11 @@ class NaturalSeoService {
|
|
|
5924
5927
|
}
|
|
5925
5928
|
}
|
|
5926
5929
|
/**
|
|
5927
|
-
*
|
|
5928
|
-
* @param definition
|
|
5929
|
-
* @return {string} selector to use in querySelector
|
|
5930
|
+
* Returns selector to use in querySelector to get the given link
|
|
5930
5931
|
*/
|
|
5931
|
-
|
|
5932
|
+
parseSelector(definition) {
|
|
5932
5933
|
let attributes = 'link';
|
|
5933
|
-
Object.keys(definition).forEach(
|
|
5934
|
+
Object.keys(definition).forEach(attr => {
|
|
5934
5935
|
if (attr !== 'href') {
|
|
5935
5936
|
attributes += `[${attr}="${definition[attr]}"]`;
|
|
5936
5937
|
}
|