@leanix/components 0.2.237 → 0.2.240

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.
@@ -0,0 +1,125 @@
1
+ import { Pipe } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * This pipe transforms...
5
+ * - "raw" http(s) links
6
+ * - markdown link syntax
7
+ * ... into clickable anchor elements.
8
+ *
9
+ * You have an user interface where you don't want clickable links but also
10
+ * don't want users to see the "ugly" markdown link syntax?
11
+ * -> Use the 'lxUnlikify' pipe to replace markdown link syntax with just the link name
12
+ */
13
+ export class LxLinkifyPipe {
14
+ transform(text) {
15
+ if (text && typeof text === 'string') {
16
+ let textWithRawLinks = text;
17
+ /**
18
+ * Keeping track of this index prevents infinite loops
19
+ * where a previously processed link starts with the same characters
20
+ * as a second link.
21
+ * e.g. https://angular.io/docs followed by https://angular.io
22
+ */
23
+ let nextIndexToStartReplacingFrom = 0;
24
+ const rawLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.HTTP_LINK_REGEX, text);
25
+ rawLinkMatches.forEach((rawLinkMatch) => {
26
+ const [url] = rawLinkMatch;
27
+ const wrapUrlInAnchor = (sanitizedUrlMatch) => {
28
+ const firstPart = textWithRawLinks.substring(0, nextIndexToStartReplacingFrom);
29
+ const anchorTagHtml = `<a href="${sanitizedUrlMatch}" target="_blank" rel="noopener noreferrer">${sanitizedUrlMatch}</a>`;
30
+ const secondPart = textWithRawLinks.substring(nextIndexToStartReplacingFrom).replace(sanitizedUrlMatch, anchorTagHtml);
31
+ textWithRawLinks = firstPart + secondPart;
32
+ nextIndexToStartReplacingFrom = rawLinkMatch.index + anchorTagHtml.length;
33
+ };
34
+ if (url) {
35
+ /*
36
+ * TODO: get rid of all this code once Safari supports negative lookbehinds in regular expressions
37
+ * The following is RegExp that handles the same stuff as the JS code below:
38
+ *
39
+ * /(?:(?:(?<!\]\())(?:https|http):\/\/)(?:[^\s/$.?#][^\s]*(?<![\.)]))/gi;
40
+ *
41
+ * Demo on regex101: https://regex101.com/r/7Vl9bg/1
42
+ *
43
+ * Check lookbehind support here: https://caniuse.com/?search=lookbehind
44
+ */
45
+ const lastUrlCharacterIndex = rawLinkMatch.index + url.length - 1;
46
+ const textUsedToPerformMatching = rawLinkMatch.input;
47
+ const lastCharacterInUrl = textUsedToPerformMatching[lastUrlCharacterIndex];
48
+ if (lastCharacterInUrl === '.') {
49
+ const characterAfterUrl = textUsedToPerformMatching[lastUrlCharacterIndex + 1];
50
+ if (!characterAfterUrl || characterAfterUrl === ' ' || characterAfterUrl === '\n') {
51
+ const urlWithoutDotAtTheEnd = url.slice(0, -1);
52
+ wrapUrlInAnchor(urlWithoutDotAtTheEnd);
53
+ }
54
+ }
55
+ else if (rawLinkMatch.index > 3) {
56
+ const twoCharactersInFrontOfTheLink = `${textUsedToPerformMatching[rawLinkMatch.index - 2]}${textUsedToPerformMatching[rawLinkMatch.index - 1]}`;
57
+ if (twoCharactersInFrontOfTheLink && twoCharactersInFrontOfTheLink !== '](') {
58
+ // only wrap url in anchor when it is not a named markdown link
59
+ wrapUrlInAnchor(url);
60
+ }
61
+ }
62
+ else {
63
+ wrapUrlInAnchor(url);
64
+ }
65
+ }
66
+ });
67
+ let textWithRawAndNamedLinks = textWithRawLinks;
68
+ const namedLinkMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, textWithRawLinks);
69
+ namedLinkMatches.forEach((namedLinkMatch) => {
70
+ const [source, name, url] = namedLinkMatch;
71
+ const urlIsValid = url && !/javascript\:/i.test(url);
72
+ if (source && name && urlIsValid) {
73
+ textWithRawAndNamedLinks = textWithRawAndNamedLinks.replace(source, `<a href="${url}" target="_blank" rel="noopener noreferrer">${name}</a>`);
74
+ }
75
+ });
76
+ return textWithRawAndNamedLinks;
77
+ }
78
+ else {
79
+ return text;
80
+ }
81
+ }
82
+ getAllRegexMatches(regex, input) {
83
+ let match;
84
+ const matches = [];
85
+ while ((match = regex.exec(input)) !== null) {
86
+ matches.push(match);
87
+ }
88
+ return matches;
89
+ }
90
+ }
91
+ /**
92
+ * This is not the "one URL regex to rule them all", but a more realistic one which should work
93
+ * for any URLs that our customers include in text fields on a Fact Sheet.
94
+ *
95
+ * Regex rules explained in plain text:
96
+ *
97
+ * (?:(?:https?):\/\/) -> Links must start with "https://" or "http://"
98
+ *
99
+ * (?:[^\s/$.?#][^\s]*(?<![\.)])) LET'S SPLIT THIS ONE UP
100
+ *
101
+ * [^\s/$.?#][^\s]* -> Match any legal URL character until the next whitespace
102
+ * (?<![\.)] -> A negative lookahead to prevent matching a dot or parenthesis following a URL
103
+ *
104
+ * Link to regex101: https://regex101.com/r/d3KtfH/1 (NOTE: please update this link when changing the regex)
105
+ */
106
+ LxLinkifyPipe.HTTP_LINK_REGEX = /(?:(?:https?):\/\/)(?:[^\s/$.?#][^\s]*)/gi;
107
+ /**
108
+ * This will match the markdown link syntax: [link name](url)
109
+ * Regex rules explained in plain text:
110
+ *
111
+ * (?:\[([^\]]*)\]) -> Match any characters inside square brackets
112
+ * \(([^\s\/$.?#][^\s]*)\) -> Notice that this is the same regex as the HTTP_LINK_REGEX above,
113
+ * but without the requirement for the http protocol.
114
+ * This allows for links without including the protocol or also "mailto:hello@world.de" links
115
+ *
116
+ * Link to regex101: https://regex101.com/r/5UMUH8/1
117
+ */
118
+ LxLinkifyPipe.NAMED_LINK_REGEX = /(?:\[([^\]]*)\])\(([^\s\/$.?#][^\s]*)\)/gi;
119
+ LxLinkifyPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxLinkifyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
120
+ LxLinkifyPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxLinkifyPipe, name: "lxLinkify" });
121
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxLinkifyPipe, decorators: [{
122
+ type: Pipe,
123
+ args: [{ name: 'lxLinkify' }]
124
+ }] });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlua2lmeS5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL3NyYy9saWIvY29yZS11aS9waXBlcy9saW5raWZ5L2xpbmtpZnkucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQzs7QUFFcEQ7Ozs7Ozs7OztHQVNHO0FBRUgsTUFBTSxPQUFPLGFBQWE7SUErQnhCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsSUFBSSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7WUFDNUI7Ozs7O2VBS0c7WUFDSCxJQUFJLDZCQUE2QixHQUFHLENBQUMsQ0FBQztZQUN0QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxZQUFZLENBQUM7Z0JBQzNCLE1BQU0sZUFBZSxHQUFHLENBQUMsaUJBQXlCLEVBQUUsRUFBRTtvQkFDcEQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO29CQUMvRSxNQUFNLGFBQWEsR0FBRyxZQUFZLGlCQUFpQiwrQ0FBK0MsaUJBQWlCLE1BQU0sQ0FBQztvQkFDMUgsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLDZCQUE2QixDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFDO29CQUN4SCxnQkFBZ0IsR0FBRyxTQUFTLEdBQUcsVUFBVSxDQUFDO29CQUMxQyw2QkFBNkIsR0FB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RkFBYixhQUFhO2tCQUR6QixJQUFJO21CQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBpcGUsIFBpcGVUcmFuc2Zvcm0gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuLyoqXG4gKiBUaGlzIHBpcGUgdHJhbnNmb3Jtcy4uLlxuICogLSBcInJhd1wiIGh0dHAocykgbGlua3NcbiAqIC0gbWFya2Rvd24gbGluayBzeW50YXhcbiAqIC4uLiBpbnRvIGNsaWNrYWJsZSBhbmNob3IgZWxlbWVudHMuXG4gKlxuICogWW91IGhhdmUgYW4gdXNlciBpbnRlcmZhY2Ugd2hlcmUgeW91IGRvbid0IHdhbnQgY2xpY2thYmxlIGxpbmtzIGJ1dCBhbHNvXG4gKiBkb24ndCB3YW50IHVzZXJzIHRvIHNlZSB0aGUgXCJ1Z2x5XCIgbWFya2Rvd24gbGluayBzeW50YXg/XG4gKiAtPiBVc2UgdGhlICdseFVubGlraWZ5JyBwaXBlIHRvIHJlcGxhY2UgbWFya2Rvd24gbGluayBzeW50YXggd2l0aCBqdXN0IHRoZSBsaW5rIG5hbWVcbiAqL1xuQFBpcGUoeyBuYW1lOiAnbHhMaW5raWZ5JyB9KVxuZXhwb3J0IGNsYXNzIEx4TGlua2lmeVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgLyoqXG4gICAqIFRoaXMgaXMgbm90IHRoZSBcIm9uZSBVUkwgcmVnZXggdG8gcnVsZSB0aGVtIGFsbFwiLCBidXQgYSBtb3JlIHJlYWxpc3RpYyBvbmUgd2hpY2ggc2hvdWxkIHdvcmtcbiAgICogZm9yIGFueSBVUkxzIHRoYXQgb3VyIGN1c3RvbWVycyBpbmNsdWRlIGluIHRleHQgZmllbGRzIG9uIGEgRmFjdCBTaGVldC5cbiAgICpcbiAgICogUmVnZXggcnVsZXMgZXhwbGFpbmVkIGluIHBsYWluIHRleHQ6XG4gICAqXG4gICAqICg/Oig/Omh0dHBzPyk6XFwvXFwvKSAgICAgICAtPiAgICBMaW5rcyBtdXN0IHN0YXJ0IHdpdGggXCJodHRwczovL1wiIG9yIFwiaHR0cDovL1wiXG4gICAqXG4gICAqICg/OlteXFxzLyQuPyNdW15cXHNdKig/PCFbXFwuKV0pKSBMRVQnUyBTUExJVCBUSElTIE9ORSBVUFxuICAgKlxuICAgKiBbXlxccy8kLj8jXVteXFxzXSogICAtPiAgICBNYXRjaCBhbnkgbGVnYWwgVVJMIGNoYXJhY3RlciB1bnRpbCB0aGUgbmV4dCB3aGl0ZXNwYWNlXG4gICAqICg/PCFbXFwuKV0gICAgICAgICAgLT4gICAgQSBuZWdhdGl2ZSBsb29rYWhlYWQgdG8gcHJldmVudCBtYXRjaGluZyBhIGRvdCBvciBwYXJlbnRoZXNpcyBmb2xsb3dpbmcgYSBVUkxcbiAgICpcbiAgICogTGluayB0byByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci9kM0t0ZkgvMSAoTk9URTogcGxlYXNlIHVwZGF0ZSB0aGlzIGxpbmsgd2hlbiBjaGFuZ2luZyB0aGUgcmVnZXgpXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhUVFBfTElOS19SRUdFWCA9IC8oPzooPzpodHRwcz8pOlxcL1xcLykoPzpbXlxccy8kLj8jXVteXFxzXSopL2dpO1xuXG4gIC8qKlxuICAgKiBUaGlzIHdpbGwgbWF0Y2ggdGhlIG1hcmtkb3duIGxpbmsgc3ludGF4OiBbbGluayBuYW1lXSh1cmwpXG4gICAqIFJlZ2V4IHJ1bGVzIGV4cGxhaW5lZCBpbiBwbGFpbiB0ZXh0OlxuICAgKlxuICAgKiAoPzpcXFsoW15cXF1dKilcXF0pICAgICAgICAgICAgLT4gICAgIE1hdGNoIGFueSBjaGFyYWN0ZXJzIGluc2lkZSBzcXVhcmUgYnJhY2tldHNcbiAgICogXFwoKFteXFxzXFwvJC4/I11bXlxcc10qKVxcKSAgICAgLT4gICAgIE5vdGljZSB0aGF0IHRoaXMgaXMgdGhlIHNhbWUgcmVnZXggYXMgdGhlIEhUVFBfTElOS19SRUdFWCBhYm92ZSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXQgd2l0aG91dCB0aGUgcmVxdWlyZW1lbnQgZm9yIHRoZSBodHRwIHByb3RvY29sLlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIGZvciBsaW5rcyB3aXRob3V0IGluY2x1ZGluZyB0aGUgcHJvdG9jb2wgb3IgYWxzbyBcIm1haWx0bzpoZWxsb0B3b3JsZC5kZVwiIGxpbmtzXG4gICAqXG4gICAqIExpbmsgdG8gcmVnZXgxMDE6IGh0dHBzOi8vcmVnZXgxMDEuY29tL3IvNVVNVUg4LzFcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkFNRURfTElOS19SRUdFWCA9IC8oPzpcXFsoW15cXF1dKilcXF0pXFwoKFteXFxzXFwvJC4/I11bXlxcc10qKVxcKS9naTtcblxuICB0cmFuc2Zvcm0odGV4dD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCB1bmRlZmluZWQgfCBudWxsIHtcbiAgICBpZiAodGV4dCAmJiB0eXBlb2YgdGV4dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxldCB0ZXh0V2l0aFJhd0xpbmtzID0gdGV4dDtcbiAgICAgIC8qKlxuICAgICAgICogS2VlcGluZyB0cmFjayBvZiB0aGlzIGluZGV4IHByZXZlbnRzIGluZmluaXRlIGxvb3BzXG4gICAgICAgKiB3aGVyZSBhIHByZXZpb3VzbHkgcHJvY2Vzc2VkIGxpbmsgc3RhcnRzIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVyc1xuICAgICAgICogYXMgYSBzZWNvbmQgbGluay5cbiAgICAgICAqIGUuZy4gaHR0cHM6Ly9hbmd1bGFyLmlvL2RvY3MgZm9sbG93ZWQgYnkgaHR0cHM6Ly9hbmd1bGFyLmlvXG4gICAgICAgKi9cbiAgICAgIGxldCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IDA7XG4gICAgICBjb25zdCByYXdMaW5rTWF0Y2hlcyA9IHRoaXMuZ2V0QWxsUmVnZXhNYXRjaGVzKEx4TGlua2lmeVBpcGUuSFRUUF9MSU5LX1JFR0VYLCB0ZXh0KTtcbiAgICAgIHJhd0xpbmtNYXRjaGVzLmZvckVhY2goKHJhd0xpbmtNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBbdXJsXSA9IHJhd0xpbmtNYXRjaDtcbiAgICAgICAgY29uc3Qgd3JhcFVybEluQW5jaG9yID0gKHNhbml0aXplZFVybE1hdGNoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBmaXJzdFBhcnQgPSB0ZXh0V2l0aFJhd0xpbmtzLnN1YnN0cmluZygwLCBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSk7XG4gICAgICAgICAgY29uc3QgYW5jaG9yVGFnSHRtbCA9IGA8YSBocmVmPVwiJHtzYW5pdGl6ZWRVcmxNYXRjaH1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCI+JHtzYW5pdGl6ZWRVcmxNYXRjaH08L2E+YDtcbiAgICAgICAgICBjb25zdCBzZWNvbmRQYXJ0ID0gdGV4dFdpdGhSYXdMaW5rcy5zdWJzdHJpbmcobmV4dEluZGV4VG9TdGFydFJlcGxhY2luZ0Zyb20pLnJlcGxhY2Uoc2FuaXRpemVkVXJsTWF0Y2ghLCBhbmNob3JUYWdIdG1sKTtcbiAgICAgICAgICB0ZXh0V2l0aFJhd0xpbmtzID0gZmlyc3RQYXJ0ICsgc2Vjb25kUGFydDtcbiAgICAgICAgICBuZXh0SW5kZXhUb1N0YXJ0UmVwbGFjaW5nRnJvbSA9IHJhd0xpbmtNYXRjaC5pbmRleCArIGFuY2hvclRhZ0h0bWwubGVuZ3RoO1xuICAgICAgICB9O1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBUT0RPOiBnZXQgcmlkIG9mIGFsbCB0aGlzIGNvZGUgb25jZSBTYWZhcmkgc3VwcG9ydHMgbmVnYXRpdmUgbG9va2JlaGluZHMgaW4gcmVndWxhciBleHByZXNzaW9uc1xuICAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgaXMgUmVnRXhwIHRoYXQgaGFuZGxlcyB0aGUgc2FtZSBzdHVmZiBhcyB0aGUgSlMgY29kZSBiZWxvdzpcbiAgICAgICAgICAgKlxuICAgICAgICAgICAqIC8oPzooPzooPzwhXFxdXFwoKSkoPzpodHRwc3xodHRwKTpcXC9cXC8pKD86W15cXHMvJC4/I11bXlxcc10qKD88IVtcXC4pXSkpL2dpO1xuICAgICAgICAgICAqXG4gICAgICAgICAgICogRGVtbyBvbiByZWdleDEwMTogaHR0cHM6Ly9yZWdleDEwMS5jb20vci83Vmw5YmcvMVxuICAgICAgICAgICAqXG4gICAgICAgICAgICogQ2hlY2sgbG9va2JlaGluZCBzdXBwb3J0IGhlcmU6IGh0dHBzOi8vY2FuaXVzZS5jb20vP3NlYXJjaD1sb29rYmVoaW5kXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgbGFzdFVybENoYXJhY3RlckluZGV4ID0gcmF3TGlua01hdGNoLmluZGV4ICsgdXJsLmxlbmd0aCAtIDE7XG4gICAgICAgICAgY29uc3QgdGV4dFVzZWRUb1BlcmZvcm1NYXRjaGluZyA9IHJhd0xpbmtNYXRjaC5pbnB1dDtcbiAgICAgICAgICBjb25zdCBsYXN0Q2hhcmFjdGVySW5VcmwgPSB0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW2xhc3RVcmxDaGFyYWN0ZXJJbmRleF07XG4gICAgICAgICAgaWYgKGxhc3RDaGFyYWN0ZXJJblVybCA9PT0gJy4nKSB7XG4gICAgICAgICAgICBjb25zdCBjaGFyYWN0ZXJBZnRlclVybCA9IHRleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbbGFzdFVybENoYXJhY3RlckluZGV4ICsgMV07XG4gICAgICAgICAgICBpZiAoIWNoYXJhY3RlckFmdGVyVXJsIHx8IGNoYXJhY3RlckFmdGVyVXJsID09PSAnICcgfHwgY2hhcmFjdGVyQWZ0ZXJVcmwgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHVybFdpdGhvdXREb3RBdFRoZUVuZCA9IHVybC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgIHdyYXBVcmxJbkFuY2hvcih1cmxXaXRob3V0RG90QXRUaGVFbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocmF3TGlua01hdGNoLmluZGV4ID4gMykge1xuICAgICAgICAgICAgY29uc3QgdHdvQ2hhcmFjdGVyc0luRnJvbnRPZlRoZUxpbmsgPSBgJHt0ZXh0VXNlZFRvUGVyZm9ybU1hdGNoaW5nW3Jhd0xpbmtNYXRjaC5pbmRleCAtIDJdfSR7XG4gICAgICAgICAgICAgIHRleHRVc2VkVG9QZXJmb3JtTWF0Y2hpbmdbcmF3TGlua01hdGNoLmluZGV4IC0gMV1cbiAgICAgICAgICAgIH1gO1xuICAgICAgICAgICAgaWYgKHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rICYmIHR3b0NoYXJhY3RlcnNJbkZyb250T2ZUaGVMaW5rICE9PSAnXSgnKSB7XG4gICAgICAgICAgICAgIC8vIG9ubHkgd3JhcCB1cmwgaW4gYW5jaG9yIHdoZW4gaXQgaXMgbm90IGEgbmFtZWQgbWFya2Rvd24gbGlua1xuICAgICAgICAgICAgICB3cmFwVXJsSW5BbmNob3IodXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd3JhcFVybEluQW5jaG9yKHVybCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgbGV0IHRleHRXaXRoUmF3QW5kTmFtZWRMaW5rcyA9IHRleHRXaXRoUmF3TGlua3M7XG4gICAgICBjb25zdCBuYW1lZExpbmtNYXRjaGVzID0gdGhpcy5nZXRBbGxSZWdleE1hdGNoZXMoTHhMaW5raWZ5UGlwZS5OQU1FRF9MSU5LX1JFR0VYLCB0ZXh0V2l0aFJhd0xpbmtzKTtcbiAgICAgIG5hbWVkTGlua01hdGNoZXMuZm9yRWFjaCgobmFtZWRMaW5rTWF0Y2gpID0+IHtcbiAgICAgICAgY29uc3QgW3NvdXJjZSwgbmFtZSwgdXJsXSA9IG5hbWVkTGlua01hdGNoO1xuICAgICAgICBjb25zdCB1cmxJc1ZhbGlkID0gdXJsICYmICEvamF2YXNjcmlwdFxcOi9pLnRlc3QodXJsKTtcbiAgICAgICAgaWYgKHNvdXJjZSAmJiBuYW1lICYmIHVybElzVmFsaWQpIHtcbiAgICAgICAgICB0ZXh0V2l0aFJhd0FuZE5hbWVkTGlua3MgPSB0ZXh0V2l0aFJhd0FuZE5hbWVkTGlua3MucmVwbGFjZShcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIGA8YSBocmVmPVwiJHt1cmx9XCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPiR7bmFtZX08L2E+YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gdGV4dFdpdGhSYXdBbmROYW1lZExpbmtzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEFsbFJlZ2V4TWF0Y2hlcyhyZWdleDogUmVnRXhwLCBpbnB1dDogc3RyaW5nKSB7XG4gICAgbGV0IG1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgIGNvbnN0IG1hdGNoZXMgPSBbXTtcbiAgICB3aGlsZSAoKG1hdGNoID0gcmVnZXguZXhlYyhpbnB1dCkpICE9PSBudWxsKSB7XG4gICAgICBtYXRjaGVzLnB1c2gobWF0Y2gpO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlcztcbiAgfVxufVxuIl19
@@ -0,0 +1,48 @@
1
+ import { Pipe } from '@angular/core';
2
+ import { LxLinkifyPipe } from './linkify.pipe';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * This pipe replaces markdown link syntax with just the link name (omits the link altogether).
6
+ * Example: [Angular documentation](http://angular.io/docs) -> Angular documentation
7
+ *
8
+ * It can also be used for "bridging the gap" until your view is ready to use "lxLinkify"
9
+ * and you just want to get rid of the "useless" markdown syntax fast.
10
+ *
11
+ * While there are views where we want markdown style links to be clickable anchor tags,
12
+ * there are other views where this can degrade the UX.
13
+ * Example: in the Fact Sheet list on the inventory list view, having an arbitrary number
14
+ * of links on the page can slow down the keyboard navigation while navigating through the list.
15
+ */
16
+ export class LxUnlinkifyPipe {
17
+ transform(text) {
18
+ if (text && typeof text === 'string') {
19
+ let textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName = text;
20
+ const markdownLinkSyntaxMatches = this.getAllRegexMatches(LxLinkifyPipe.NAMED_LINK_REGEX, text);
21
+ markdownLinkSyntaxMatches.forEach((markdownLinkSyntaxMatch) => {
22
+ const [source, name] = markdownLinkSyntaxMatch;
23
+ if (source && name) {
24
+ textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName = textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName.replace(source, name);
25
+ }
26
+ });
27
+ return textWhereMarkdownLinkSyntaxIsReplacedWithJustTheLinkName;
28
+ }
29
+ else {
30
+ return text;
31
+ }
32
+ }
33
+ getAllRegexMatches(regex, input) {
34
+ let match;
35
+ const matches = [];
36
+ while ((match = regex.exec(input)) !== null) {
37
+ matches.push(match);
38
+ }
39
+ return matches;
40
+ }
41
+ }
42
+ LxUnlinkifyPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxUnlinkifyPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
43
+ LxUnlinkifyPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxUnlinkifyPipe, name: "lxUnlinkify" });
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: LxUnlinkifyPipe, decorators: [{
45
+ type: Pipe,
46
+ args: [{ name: 'lxUnlinkify' }]
47
+ }] });
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5saW5raWZ5LnBpcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlLXVpL3BpcGVzL2xpbmtpZnkvdW5saW5raWZ5LnBpcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUUvQzs7Ozs7Ozs7Ozs7R0FXRztBQUVILE1BQU0sT0FBTyxlQUFlO0lBQzFCLFNBQVMsQ0FBQyxJQUFvQjtRQUM1QixJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDcEMsSUFBSSx3REFBd0QsR0FBRyxJQUFJLENBQUM7WUFDcEUsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2hHLHlCQUF5QixDQUFDLE9BQU8sQ0FBQyxDQUFDLHVCQUF1QixFQUFFLEVBQUU7Z0JBQzVELE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsdUJBQXVCLENBQUM7Z0JBQy9DLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtvQkFDbEIsd0RBQXdELEdBQUcsd0RBQXdELENBQUMsT0FBTyxDQUN6SCxNQUFNLEVBQ04sSUFBSSxDQUNMLENBQUM7aUJBQ0g7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILE9BQU8sd0RBQXdELENBQUM7U0FDakU7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsS0FBYSxFQUFFLEtBQWE7UUFDckQsSUFBSSxLQUE2QixDQUFDO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUU7WUFDM0MsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNyQjtRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OzRHQTVCVSxlQUFlOzBHQUFmLGVBQWU7MkZBQWYsZUFBZTtrQkFEM0IsSUFBSTttQkFBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMeExpbmtpZnlQaXBlIH0gZnJvbSAnLi9saW5raWZ5LnBpcGUnO1xuXG4vKipcbiAqIFRoaXMgcGlwZSByZXBsYWNlcyBtYXJrZG93biBsaW5rIHN5bnRheCB3aXRoIGp1c3QgdGhlIGxpbmsgbmFtZSAob21pdHMgdGhlIGxpbmsgYWx0b2dldGhlcikuXG4gKiBFeGFtcGxlOiBbQW5ndWxhciBkb2N1bWVudGF0aW9uXShodHRwOi8vYW5ndWxhci5pby9kb2NzKSAtPiBBbmd1bGFyIGRvY3VtZW50YXRpb25cbiAqXG4gKiBJdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBcImJyaWRnaW5nIHRoZSBnYXBcIiB1bnRpbCB5b3VyIHZpZXcgaXMgcmVhZHkgdG8gdXNlIFwibHhMaW5raWZ5XCJcbiAqIGFuZCB5b3UganVzdCB3YW50IHRvIGdldCByaWQgb2YgdGhlIFwidXNlbGVzc1wiIG1hcmtkb3duIHN5bnRheCBmYXN0LlxuICpcbiAqIFdoaWxlIHRoZXJlIGFyZSB2aWV3cyB3aGVyZSB3ZSB3YW50IG1hcmtkb3duIHN0eWxlIGxpbmtzIHRvIGJlIGNsaWNrYWJsZSBhbmNob3IgdGFncyxcbiAqIHRoZXJlIGFyZSBvdGhlciB2aWV3cyB3aGVyZSB0aGlzIGNhbiBkZWdyYWRlIHRoZSBVWC5cbiAqIEV4YW1wbGU6IGluIHRoZSBGYWN0IFNoZWV0IGxpc3Qgb24gdGhlIGludmVudG9yeSBsaXN0IHZpZXcsIGhhdmluZyBhbiBhcmJpdHJhcnkgbnVtYmVyXG4gKiBvZiBsaW5rcyBvbiB0aGUgcGFnZSBjYW4gc2xvdyBkb3duIHRoZSBrZXlib2FyZCBuYXZpZ2F0aW9uIHdoaWxlIG5hdmlnYXRpbmcgdGhyb3VnaCB0aGUgbGlzdC5cbiAqL1xuQFBpcGUoeyBuYW1lOiAnbHhVbmxpbmtpZnknIH0pXG5leHBvcnQgY2xhc3MgTHhVbmxpbmtpZnlQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh0ZXh0Pzogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwge1xuICAgIGlmICh0ZXh0ICYmIHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJykge1xuICAgICAgbGV0IHRleHRXaGVyZU1hcmtkb3duTGlua1N5bnRheElzUmVwbGFjZWRXaXRoSnVzdFRoZUxpbmtOYW1lID0gdGV4dDtcbiAgICAgIGNvbnN0IG1hcmtkb3duTGlua1N5bnRheE1hdGNoZXMgPSB0aGlzLmdldEFsbFJlZ2V4TWF0Y2hlcyhMeExpbmtpZnlQaXBlLk5BTUVEX0xJTktfUkVHRVgsIHRleHQpO1xuICAgICAgbWFya2Rvd25MaW5rU3ludGF4TWF0Y2hlcy5mb3JFYWNoKChtYXJrZG93bkxpbmtTeW50YXhNYXRjaCkgPT4ge1xuICAgICAgICBjb25zdCBbc291cmNlLCBuYW1lXSA9IG1hcmtkb3duTGlua1N5bnRheE1hdGNoO1xuICAgICAgICBpZiAoc291cmNlICYmIG5hbWUpIHtcbiAgICAgICAgICB0ZXh0V2hlcmVNYXJrZG93bkxpbmtTeW50YXhJc1JlcGxhY2VkV2l0aEp1c3RUaGVMaW5rTmFtZSA9IHRleHRXaGVyZU1hcmtkb3duTGlua1N5bnRheElzUmVwbGFjZWRXaXRoSnVzdFRoZUxpbmtOYW1lLnJlcGxhY2UoXG4gICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICBuYW1lXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0ZXh0V2hlcmVNYXJrZG93bkxpbmtTeW50YXhJc1JlcGxhY2VkV2l0aEp1c3RUaGVMaW5rTmFtZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbGxSZWdleE1hdGNoZXMocmVnZXg6IFJlZ0V4cCwgaW5wdXQ6IHN0cmluZykge1xuICAgIGxldCBtYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICBjb25zdCBtYXRjaGVzID0gW107XG4gICAgd2hpbGUgKChtYXRjaCA9IHJlZ2V4LmV4ZWMoaW5wdXQpKSAhPT0gbnVsbCkge1xuICAgICAgbWF0Y2hlcy5wdXNoKG1hdGNoKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoZXM7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,47 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ function isResizeableElement(element) {
4
+ return element && !!element.handleResize;
5
+ }
6
+ /**
7
+ * Sharing one ResizeObserver object results in much better performance
8
+ * over individual components creating their own ResizeObserver.
9
+ * This is why this service exists.
10
+ * Source:
11
+ * - https://github.com/WICG/resize-observer/issues/59#issuecomment-408098151
12
+ * - https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ
13
+ *
14
+ * Learn more about the ResizeObserver API:
15
+ * - https://www.w3.org/TR/resize-observer/
16
+ * - https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver
17
+ * - https://www.digitalocean.com/community/tutorials/js-resize-observer
18
+ */
19
+ export class ResizeObserverService {
20
+ observe(element, callback, options) {
21
+ if (!this.resizeObserver) {
22
+ this.resizeObserver = new ResizeObserver(this.resizeObserverCallback.bind(this));
23
+ }
24
+ element.handleResize = callback;
25
+ this.resizeObserver.observe(element, options);
26
+ }
27
+ unobserve(element) {
28
+ if (!this.resizeObserver) {
29
+ return;
30
+ }
31
+ this.resizeObserver.unobserve(element);
32
+ }
33
+ resizeObserverCallback(entries, _observer) {
34
+ entries.forEach((entry) => {
35
+ if (isResizeableElement(entry.target)) {
36
+ entry.target.handleResize(entry);
37
+ }
38
+ });
39
+ }
40
+ }
41
+ ResizeObserverService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
42
+ ResizeObserverService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, providedIn: 'root' });
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: ResizeObserverService, decorators: [{
44
+ type: Injectable,
45
+ args: [{ providedIn: 'root' }]
46
+ }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplLW9ic2VydmVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvc3JjL2xpYi9jb3JlLXVpL3NlcnZpY2VzL3Jlc2l6ZS1vYnNlcnZlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBUTNDLFNBQVMsbUJBQW1CLENBQUMsT0FBWTtJQUN2QyxPQUFPLE9BQU8sSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBRUgsTUFBTSxPQUFPLHFCQUFxQjtJQUdoQyxPQUFPLENBQUMsT0FBMEIsRUFBRSxRQUFrQyxFQUFFLE9BQStCO1FBQ3JHLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ2xGO1FBQ0QsT0FBTyxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRCxTQUFTLENBQUMsT0FBb0I7UUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVPLHNCQUFzQixDQUFDLE9BQThCLEVBQUUsU0FBeUI7UUFDdEYsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7a0hBeEJVLHFCQUFxQjtzSEFBckIscUJBQXFCLGNBRFIsTUFBTTsyRkFDbkIscUJBQXFCO2tCQURqQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IHR5cGUgTHhSZXNpemVPYnNlcnZlckNhbGxiYWNrID0gKHJlc2l6ZWRFbGVtZW50OiBSZXNpemVPYnNlcnZlckVudHJ5KSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgUmVzaXplYWJsZUVsZW1lbnQgZXh0ZW5kcyBFbGVtZW50IHtcbiAgaGFuZGxlUmVzaXplOiBMeFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2s7XG59XG5cbmZ1bmN0aW9uIGlzUmVzaXplYWJsZUVsZW1lbnQoZWxlbWVudDogYW55KTogZWxlbWVudCBpcyBSZXNpemVhYmxlRWxlbWVudCB7XG4gIHJldHVybiBlbGVtZW50ICYmICEhZWxlbWVudC5oYW5kbGVSZXNpemU7XG59XG5cbi8qKlxuICogU2hhcmluZyBvbmUgUmVzaXplT2JzZXJ2ZXIgb2JqZWN0IHJlc3VsdHMgaW4gbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqIG92ZXIgaW5kaXZpZHVhbCBjb21wb25lbnRzIGNyZWF0aW5nIHRoZWlyIG93biBSZXNpemVPYnNlcnZlci5cbiAqIFRoaXMgaXMgd2h5IHRoaXMgc2VydmljZSBleGlzdHMuXG4gKiBTb3VyY2U6XG4gKiAtIGh0dHBzOi8vZ2l0aHViLmNvbS9XSUNHL3Jlc2l6ZS1vYnNlcnZlci9pc3N1ZXMvNTkjaXNzdWVjb21tZW50LTQwODA5ODE1MVxuICogLSBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2EvY2hyb21pdW0ub3JnL2cvYmxpbmstZGV2L2MvejZpZW5PTlViNUEvbS9GNS1WY1VadEJBQUpcbiAqXG4gKiBMZWFybiBtb3JlIGFib3V0IHRoZSBSZXNpemVPYnNlcnZlciBBUEk6XG4gKiAtIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9yZXNpemUtb2JzZXJ2ZXIvXG4gKiAtIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXNpemVPYnNlcnZlclxuICogLSBodHRwczovL3d3dy5kaWdpdGFsb2NlYW4uY29tL2NvbW11bml0eS90dXRvcmlhbHMvanMtcmVzaXplLW9ic2VydmVyXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIG9ic2VydmUoZWxlbWVudDogUmVzaXplYWJsZUVsZW1lbnQsIGNhbGxiYWNrOiBMeFJlc2l6ZU9ic2VydmVyQ2FsbGJhY2ssIG9wdGlvbnM/OiBSZXNpemVPYnNlcnZlck9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMucmVzaXplT2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIodGhpcy5yZXNpemVPYnNlcnZlckNhbGxiYWNrLmJpbmQodGhpcykpO1xuICAgIH1cbiAgICBlbGVtZW50LmhhbmRsZVJlc2l6ZSA9IGNhbGxiYWNrO1xuICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHVub2JzZXJ2ZShlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5yZXNpemVPYnNlcnZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZShlbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzOiBSZXNpemVPYnNlcnZlckVudHJ5W10sIF9vYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIpIHtcbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBpZiAoaXNSZXNpemVhYmxlRWxlbWVudChlbnRyeS50YXJnZXQpKSB7XG4gICAgICAgIGVudHJ5LnRhcmdldC5oYW5kbGVSZXNpemUoZW50cnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iXX0=