@esfaenza/extensions 15.2.45 → 16.2.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.
- package/{esm2020 → esm2022}/esfaenza-extensions.mjs +4 -4
- package/esm2022/lib/models/CallResult.mjs +24 -0
- package/esm2022/lib/models/CsvHeaders.mjs +26 -0
- package/{esm2020 → esm2022}/lib/models/ExportConsts.mjs +31 -31
- package/esm2022/lib/models/ExtensionsModuleConfig.mjs +10 -0
- package/esm2022/lib/models/GenericItem.mjs +10 -0
- package/{esm2020 → esm2022}/lib/models/InboundMessageTypes.mjs +6 -6
- package/esm2022/lib/models/InterComMessage.mjs +16 -0
- package/{esm2020 → esm2022}/lib/models/TypeCode.mjs +24 -24
- package/{esm2020 → esm2022}/lib/modules/extensions.module.mjs +32 -32
- package/esm2022/lib/pipes/loc_date.pipe.mjs +38 -0
- package/esm2022/lib/services/extensions.base.mjs +30 -0
- package/esm2022/lib/services/extensions.clipboard.service.mjs +221 -0
- package/esm2022/lib/services/extensions.dates.service.mjs +244 -0
- package/esm2022/lib/services/extensions.embedding.service.mjs +213 -0
- package/esm2022/lib/services/extensions.exports.service.mjs +617 -0
- package/esm2022/lib/services/extensions.hashing.service.mjs +308 -0
- package/esm2022/lib/services/extensions.intercom.service.mjs +52 -0
- package/esm2022/lib/services/extensions.messages.service.mjs +450 -0
- package/esm2022/lib/services/extensions.utilities.service.mjs +250 -0
- package/{esm2020 → esm2022}/lib/tokens.mjs +11 -11
- package/{esm2020 → esm2022}/public-api.mjs +21 -21
- package/{fesm2020 → fesm2022}/esfaenza-extensions.mjs +2509 -2441
- package/fesm2022/esfaenza-extensions.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/models/CallResult.d.ts +23 -23
- package/lib/models/CsvHeaders.d.ts +25 -25
- package/lib/models/ExportConsts.d.ts +31 -31
- package/lib/models/ExtensionsModuleConfig.d.ts +9 -9
- package/lib/models/GenericItem.d.ts +9 -9
- package/lib/models/InboundMessageTypes.d.ts +5 -5
- package/lib/models/InterComMessage.d.ts +12 -12
- package/lib/models/TypeCode.d.ts +23 -23
- package/lib/modules/extensions.module.d.ts +11 -11
- package/lib/pipes/loc_date.pipe.d.ts +24 -24
- package/lib/services/extensions.base.d.ts +22 -22
- package/lib/services/extensions.clipboard.service.d.ts +54 -54
- package/lib/services/extensions.dates.service.d.ts +99 -99
- package/lib/services/extensions.embedding.service.d.ts +28 -28
- package/lib/services/extensions.exports.service.d.ts +234 -234
- package/lib/services/extensions.hashing.service.d.ts +121 -121
- package/lib/services/extensions.intercom.service.d.ts +28 -28
- package/lib/services/extensions.messages.service.d.ts +195 -195
- package/lib/services/extensions.utilities.service.d.ts +107 -107
- package/lib/tokens.d.ts +11 -11
- package/package.json +13 -19
- package/public-api.d.ts +18 -18
- package/esm2020/lib/models/CallResult.mjs +0 -6
- package/esm2020/lib/models/CsvHeaders.mjs +0 -6
- package/esm2020/lib/models/ExtensionsModuleConfig.mjs +0 -4
- package/esm2020/lib/models/GenericItem.mjs +0 -6
- package/esm2020/lib/models/InterComMessage.mjs +0 -14
- package/esm2020/lib/pipes/loc_date.pipe.mjs +0 -37
- package/esm2020/lib/services/extensions.base.mjs +0 -29
- package/esm2020/lib/services/extensions.clipboard.service.mjs +0 -219
- package/esm2020/lib/services/extensions.dates.service.mjs +0 -242
- package/esm2020/lib/services/extensions.embedding.service.mjs +0 -208
- package/esm2020/lib/services/extensions.exports.service.mjs +0 -615
- package/esm2020/lib/services/extensions.hashing.service.mjs +0 -310
- package/esm2020/lib/services/extensions.intercom.service.mjs +0 -54
- package/esm2020/lib/services/extensions.messages.service.mjs +0 -433
- package/esm2020/lib/services/extensions.utilities.service.mjs +0 -252
- package/fesm2015/esfaenza-extensions.mjs +0 -2513
- package/fesm2015/esfaenza-extensions.mjs.map +0 -1
- package/fesm2020/esfaenza-extensions.mjs.map +0 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// Angular
|
|
2
|
+
import { Injectable } from "@angular/core";
|
|
3
|
+
// Libraries
|
|
4
|
+
import { Subject } from "rxjs";
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "./extensions.messages.service";
|
|
7
|
+
import * as i2 from "@angular/router";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
/* Classe che contiene tutte le informazioni sull'embedding in un unico contenitore per semplicità */
|
|
10
|
+
export class AppEmbeddingExtensions {
|
|
11
|
+
msgService;
|
|
12
|
+
router;
|
|
13
|
+
location;
|
|
14
|
+
sidebarWidth = 230;
|
|
15
|
+
Embedded = false;
|
|
16
|
+
EmbeddingLevel = 0;
|
|
17
|
+
MainWindow;
|
|
18
|
+
MessageObserver = new Subject();
|
|
19
|
+
_reloadAllowed = true;
|
|
20
|
+
EmbeddedModule;
|
|
21
|
+
constructor(msgService, router, location) {
|
|
22
|
+
this.msgService = msgService;
|
|
23
|
+
this.router = router;
|
|
24
|
+
this.location = location;
|
|
25
|
+
this.MainWindow = window;
|
|
26
|
+
while (this.MainWindow.parent != this.MainWindow) {
|
|
27
|
+
this.MainWindow = this.MainWindow.parent;
|
|
28
|
+
this.EmbeddingLevel++;
|
|
29
|
+
this.Embedded = true;
|
|
30
|
+
// Fallback per farlo funzionare forzatamente mentre lo testo
|
|
31
|
+
this.EmbeddedModule = this.location.path().match(/module=([a-zA-Z_]+)/)?.[1];
|
|
32
|
+
if (!this.EmbeddedModule)
|
|
33
|
+
this.waitForMyConfigAndForceEmbeddedModule();
|
|
34
|
+
}
|
|
35
|
+
this.configureEmbeddability();
|
|
36
|
+
if (this.Embedded)
|
|
37
|
+
this.msgService.configureEmbeddability(this.MainWindow, this.MessageObserver);
|
|
38
|
+
}
|
|
39
|
+
waitForMyConfigAndForceEmbeddedModule() {
|
|
40
|
+
// Aspetto di ricevere il myconfig e setto con lui l'embeddedmodule. Questo viene eseguito solo se this.location.path() per qualche motivo non contiene il module
|
|
41
|
+
let interval = setInterval(() => {
|
|
42
|
+
if (myconfig?.AppData?.ModuleId) {
|
|
43
|
+
this.EmbeddedModule = myconfig.AppData.ModuleId;
|
|
44
|
+
clearInterval(interval);
|
|
45
|
+
}
|
|
46
|
+
}, 250);
|
|
47
|
+
}
|
|
48
|
+
IsReloadAllowed() {
|
|
49
|
+
let ret = this._reloadAllowed;
|
|
50
|
+
this._reloadAllowed = true;
|
|
51
|
+
return ret;
|
|
52
|
+
}
|
|
53
|
+
configureEmbeddability() {
|
|
54
|
+
window.onmessage = (event) => {
|
|
55
|
+
// Ignoro i miei messaggi dato che mi interessano solo quelli degli altri iframe
|
|
56
|
+
if (event.source == window && event?.data?.type != "modal-open")
|
|
57
|
+
return;
|
|
58
|
+
this.MessageObserver.next({ event: "window-message", data: event?.data });
|
|
59
|
+
if (event?.data?.type == "alert") {
|
|
60
|
+
console.log(`Window message - alert -> Level: ${event?.data?.level}, Message: ${event?.data?.msg}`);
|
|
61
|
+
switch (event?.data?.level) {
|
|
62
|
+
case "success":
|
|
63
|
+
this.msgService.simpleSuccess(event?.data?.msg);
|
|
64
|
+
break;
|
|
65
|
+
case "warning":
|
|
66
|
+
this.msgService.simpleWarning(event?.data?.msg);
|
|
67
|
+
break;
|
|
68
|
+
case "error":
|
|
69
|
+
this.msgService.simpleError(event?.data?.msg);
|
|
70
|
+
break;
|
|
71
|
+
case "info":
|
|
72
|
+
this.msgService.simpleInfo(event?.data?.msg);
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else if (event?.data?.type == "replace-state") {
|
|
77
|
+
console.log(`Window message - replace-state -> Url: ${event?.data?.url}`);
|
|
78
|
+
this.location.replaceState(event?.data?.url);
|
|
79
|
+
}
|
|
80
|
+
else if (event?.data?.type == "confirm") {
|
|
81
|
+
console.log(`Window message - confirm -> Level: ${event?.data?.level}, Message: ${event?.data?.text}, Title: ${event?.data?.title}, ID: ${event?.data?.guid}`);
|
|
82
|
+
var sourceWindow = event.source;
|
|
83
|
+
var baseResponse = { type: "confirm-response", guid: event?.data?.guid };
|
|
84
|
+
switch (event?.data?.level) {
|
|
85
|
+
case "success":
|
|
86
|
+
this.msgService.simpleSuccessWithChoice(event?.data?.title, event?.data?.text, () => {
|
|
87
|
+
sourceWindow.postMessage({ result: true, ...baseResponse }, "*");
|
|
88
|
+
}, () => {
|
|
89
|
+
sourceWindow.postMessage({ result: false, ...baseResponse }, "*");
|
|
90
|
+
});
|
|
91
|
+
break;
|
|
92
|
+
case "warning":
|
|
93
|
+
this.msgService.simpleWarningWithChoice(event?.data?.title, event?.data?.text, () => {
|
|
94
|
+
sourceWindow.postMessage({ result: true, ...baseResponse }, "*");
|
|
95
|
+
}, () => {
|
|
96
|
+
sourceWindow.postMessage({ result: false, ...baseResponse }, "*");
|
|
97
|
+
});
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (event?.data?.type == "navigate") {
|
|
102
|
+
console.log(`Window message - navigate -> ${event?.data?.url}`);
|
|
103
|
+
var newTab = event?.data?.newTab;
|
|
104
|
+
var replaceState = event?.data?.replaceState;
|
|
105
|
+
// Controllo se il router sta seguendo la chiamata attuale. Escludo i query params che sono gli unici che possono essere seccati dai replaceState
|
|
106
|
+
// e che potrebbero fare del casino
|
|
107
|
+
if (!window.location.href.includes(this.router.url.split("?")[0])) {
|
|
108
|
+
console.warn("Doppia chiamata di navigazione, ignoro il secondo evento scoordinato dal router");
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
let newRelativeUrl = this.router.createUrlTree([event?.data?.url]);
|
|
112
|
+
let baseUrl = window.location.href.replace(this.router.url.replace("?ignoreStorage=true", ''), '');
|
|
113
|
+
let newUrl = baseUrl + decodeURIComponent(newRelativeUrl.toString());
|
|
114
|
+
if (replaceState)
|
|
115
|
+
history.pushState({ _pushed: true }, "", newUrl);
|
|
116
|
+
else if (newTab)
|
|
117
|
+
window.open(newUrl, '_blank');
|
|
118
|
+
}
|
|
119
|
+
else if (event?.data?.type == "navigate-back") {
|
|
120
|
+
console.log(`Window message - navigate-back -> ${event?.data?.url}`);
|
|
121
|
+
if (history.state._pushed) {
|
|
122
|
+
this._reloadAllowed = false;
|
|
123
|
+
history.back();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
else if (event?.data?.type == "redirect") {
|
|
127
|
+
console.log(`Window message - redirect -> ${event?.data?.url}`);
|
|
128
|
+
window.location.href = event?.data?.url;
|
|
129
|
+
}
|
|
130
|
+
else if (event?.data?.type == "navigation") {
|
|
131
|
+
console.log(`Window message - Navigation -> ${event?.data?.internalNavigation ? "[internal]" : ""} ${event?.data?.title}`);
|
|
132
|
+
this.MessageObserver.next({ event: "navigation", data: event?.data });
|
|
133
|
+
}
|
|
134
|
+
else if (event?.data?.type == "modal-open") {
|
|
135
|
+
const wrapper = document.body.getElementsByClassName("main-wrapper")[0];
|
|
136
|
+
let wrapperStyles = window.getComputedStyle(wrapper);
|
|
137
|
+
const wrapperPaddingLeft = parseInt(wrapperStyles.getPropertyValue("padding-left"));
|
|
138
|
+
const wrapperPaddingRight = parseInt(wrapperStyles.getPropertyValue("padding-right"));
|
|
139
|
+
console.log(`Window message - Modal Open -> Backdrop Height: ${event?.data?.backdropHeight}`);
|
|
140
|
+
var topHeight = 80; // valore fisso, distanza fra il top e l'inizio dell'iframe, non sarà mai diverso
|
|
141
|
+
var rightSpace = wrapperPaddingRight; // valore fisso, distanza fra la fine dell'iframe e il lato sinistro dello schermo, non sarà mai diverso
|
|
142
|
+
var leftSpace = this.sidebarWidth + wrapperPaddingLeft;
|
|
143
|
+
let commonStyles = "position: absolute; z-index: 9999; background-color: #000; opacity: 0.5; ";
|
|
144
|
+
wrapper.style.setProperty("overflow", "hidden", "important");
|
|
145
|
+
const top = document.createElement("div");
|
|
146
|
+
top.className = "embedded-modal-top";
|
|
147
|
+
top.style.cssText = commonStyles + `height: ${topHeight}px; top: 0; width: calc(100% - ${leftSpace}px); left: ${leftSpace}px`;
|
|
148
|
+
top.id = "top";
|
|
149
|
+
const left = document.createElement("div");
|
|
150
|
+
left.className = "embedded-modal-left";
|
|
151
|
+
left.style.cssText = commonStyles + `height: 100%; top: 0; width: ${leftSpace}px;`;
|
|
152
|
+
left.id = "left";
|
|
153
|
+
const right = document.createElement("div");
|
|
154
|
+
right.className = "embedded-modal-right";
|
|
155
|
+
right.style.cssText = commonStyles + `height: calc(100% - ${topHeight}px); top: ${topHeight}px; right: 0; width: ${rightSpace}px;`;
|
|
156
|
+
right.id = "right";
|
|
157
|
+
// const bottom = document.createElement("div");
|
|
158
|
+
// bottom.className = "embedded-modal-bottom";
|
|
159
|
+
// bottom.style.cssText = commonStyles + `height: ${topHeight}px; bottom: 0; width: calc(100% - ${leftSpace}px); left: ${leftSpace}px`;
|
|
160
|
+
// bottom.id = "bottom";
|
|
161
|
+
document.body.appendChild(top);
|
|
162
|
+
document.body.appendChild(left);
|
|
163
|
+
document.body.appendChild(right);
|
|
164
|
+
}
|
|
165
|
+
else if (event?.data?.type == "modal-close") {
|
|
166
|
+
console.log(`Window message - Modal Close`);
|
|
167
|
+
let wrapper = document.body.getElementsByClassName("main-wrapper")[0];
|
|
168
|
+
wrapper.style.removeProperty("overflow");
|
|
169
|
+
const top = document.getElementById("top");
|
|
170
|
+
const left = document.getElementById("left");
|
|
171
|
+
const right = document.getElementById("right");
|
|
172
|
+
if (top)
|
|
173
|
+
document.body.removeChild(top);
|
|
174
|
+
if (left)
|
|
175
|
+
document.body.removeChild(left);
|
|
176
|
+
if (right)
|
|
177
|
+
document.body.removeChild(right);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
if (this.Embedded)
|
|
181
|
+
document.body.style.setProperty("overflow-y", "auto", "important");
|
|
182
|
+
}
|
|
183
|
+
replaceState(basePath, url) {
|
|
184
|
+
// Esempio basePath: pages
|
|
185
|
+
// Esempio url: parties/leads_search
|
|
186
|
+
// Normalizzazione senza slash prima o dopo
|
|
187
|
+
basePath = basePath.endsWith("/") ? basePath.substring(0, basePath.length - 2) : basePath;
|
|
188
|
+
url = url.startsWith("/") ? url.substring(1) : url;
|
|
189
|
+
this.location.replaceState(`${basePath}/${url}`);
|
|
190
|
+
this.MainWindow.postMessage({ type: "replace-state", url: `pages/embed/${this.EmbeddedModule}/${url}` }, "*");
|
|
191
|
+
}
|
|
192
|
+
refreshBoundariesOnMenuCollapse() {
|
|
193
|
+
const wrapper = document.body.getElementsByClassName("main-wrapper")[0];
|
|
194
|
+
let wrapperStyles = window.getComputedStyle(wrapper);
|
|
195
|
+
const wrapperPaddingLeft = parseInt(wrapperStyles.getPropertyValue("padding-left"));
|
|
196
|
+
var leftSpace = 230 + wrapperPaddingLeft;
|
|
197
|
+
const left = document.getElementById("left");
|
|
198
|
+
const top = document.getElementById("top");
|
|
199
|
+
if (top) {
|
|
200
|
+
top.style.setProperty("left", (leftSpace) + "px");
|
|
201
|
+
top.style.setProperty("width", `calc(100% - ${leftSpace}px)`);
|
|
202
|
+
}
|
|
203
|
+
if (left)
|
|
204
|
+
left.style.setProperty("width", leftSpace + "px");
|
|
205
|
+
}
|
|
206
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppEmbeddingExtensions, deps: [{ token: i1.MessageService }, { token: i2.Router }, { token: i3.Location }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
207
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppEmbeddingExtensions, providedIn: "root" });
|
|
208
|
+
}
|
|
209
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppEmbeddingExtensions, decorators: [{
|
|
210
|
+
type: Injectable,
|
|
211
|
+
args: [{ providedIn: "root" }]
|
|
212
|
+
}], ctorParameters: function () { return [{ type: i1.MessageService }, { type: i2.Router }, { type: i3.Location }]; } });
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5lbWJlZGRpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2V4dGVuc2lvbnMvc3JjL2xpYi9zZXJ2aWNlcy9leHRlbnNpb25zLmVtYmVkZGluZy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTzNDLFlBQVk7QUFDWixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7OztBQUkvQixxR0FBcUc7QUFFckcsTUFBTSxPQUFPLHNCQUFzQjtJQWNYO0lBQW9DO0lBQXdCO0lBWnpFLFlBQVksR0FBVyxHQUFHLENBQUM7SUFFM0IsUUFBUSxHQUFZLEtBQUssQ0FBQztJQUMxQixjQUFjLEdBQVcsQ0FBQyxDQUFDO0lBQzNCLFVBQVUsQ0FBTTtJQUVoQixlQUFlLEdBQXVDLElBQUksT0FBTyxFQUE2QixDQUFDO0lBRTlGLGNBQWMsR0FBWSxJQUFJLENBQUM7SUFFaEMsY0FBYyxDQUFTO0lBRTlCLFlBQW9CLFVBQTBCLEVBQVUsTUFBYyxFQUFVLFFBQWtCO1FBQTlFLGVBQVUsR0FBVixVQUFVLENBQWdCO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDOUYsSUFBSSxDQUFDLFVBQVUsR0FBMkMsTUFBTSxDQUFDO1FBQ2pFLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM5QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUVyQiw2REFBNkQ7WUFDN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJ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VUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG4vLyBTZXJ2aWNlc1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gXCIuL2V4dGVuc2lvbnMubWVzc2FnZXMuc2VydmljZVwiO1xyXG5cclxuLy8gTGlicmFyaWVzXHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuZGVjbGFyZSB2YXIgbXljb25maWc6IHsgQXBwRGF0YTogeyBNb2R1bGVJZDogc3RyaW5nIH07IH07XHJcblxyXG4vKiBDbGFzc2UgY2hlIGNvbnRpZW5lIHR1dHRlIGxlIGluZm9ybWF6aW9uaSBzdWxsJ2VtYmVkZGluZyBpbiB1biB1bmljbyBjb250ZW5pdG9yZSBwZXIgc2VtcGxpY2l0w6AgKi9cclxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxyXG5leHBvcnQgY2xhc3MgQXBwRW1iZWRkaW5nRXh0ZW5zaW9ucyB7XHJcblxyXG4gICAgcHVibGljIHNpZGViYXJXaWR0aDogbnVtYmVyID0gMjMwO1xyXG5cclxuICAgIHB1YmxpYyBFbWJlZGRlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIEVtYmVkZGluZ0xldmVsOiBudW1iZXIgPSAwO1xyXG4gICAgcHVibGljIE1haW5XaW5kb3c6IGFueTtcclxuXHJcbiAgICBwdWJsaWMgTWVzc2FnZU9ic2VydmVyOiBTdWJqZWN0PHsgZXZlbnQ6IGFueSwgZGF0YTogYW55IH0+ID0gbmV3IFN1YmplY3Q8eyBldmVudDogYW55LCBkYXRhOiBhbnkgfT4oKTtcclxuXHJcbiAgICBwcml2YXRlIF9yZWxvYWRBbGxvd2VkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBwdWJsaWMgRW1iZWRkZWRNb2R1bGU6IHN0cmluZztcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1zZ1NlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLCBwcml2YXRlIHJvdXRlcjogUm91dGVyLCBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbikge1xyXG4gICAgICAgIHRoaXMuTWFpbldpbmRvdyA9IDx7IHBhcmVudDogYW55LCBwb3N0TWVzc2FnZTogRnVuY3Rpb24gfT53aW5kb3c7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuTWFpbldpbmRvdy5wYXJlbnQgIT0gdGhpcy5NYWluV2luZG93KSB7XHJcbiAgICAgICAgICAgIHRoaXMuTWFpbldpbmRvdyA9IHRoaXMuTWFpbldpbmRvdy5wYXJlbnQ7XHJcbiAgICAgICAgICAgIHRoaXMuRW1iZWRkaW5nTGV2ZWwrKztcclxuICAgICAgICAgICAgdGhpcy5FbWJlZGRlZCA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvLyBGYWxsYmFjayBwZXIgZmFybG8gZnVuemlvbmFyZSBmb3J6YXRhbWVudGUgbWVudHJlIGxvIHRlc3RvXHJcbiAgICAgICAgICAgIHRoaXMuRW1iZWRkZWRNb2R1bGUgPSB0aGlzLmxvY2F0aW9uLnBhdGgoKS5tYXRjaCgvbW9kdWxlPShbYS16QS1aX10rKS8pPy5bMV07XHJcblxyXG4gICAgICAgICAgICBpZighdGhpcy5FbWJlZGRlZE1vZHVsZSlcclxuICAgICAgICAgICAgICAgIHRoaXMud2FpdEZvck15Q29uZmlnQW5kRm9yY2VFbWJlZGRlZE1vZHVsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5jb25maWd1cmVFbWJlZGRhYmlsaXR5KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLkVtYmVkZGVkKVxyXG4gICAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2UuY29uZmlndXJlRW1iZWRkYWJpbGl0eSh0aGlzLk1haW5XaW5kb3csIHRoaXMuTWVzc2FnZU9ic2VydmVyKVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd2FpdEZvck15Q29uZmlnQW5kRm9yY2VFbWJlZGRlZE1vZHVsZSgpIHtcclxuXHJcbiAgICAgICAgLy8gQXNwZXR0byBkaSByaWNldmVyZSBpbCBteWNvbmZpZyBlIHNldHRvIGNvbiBsdWkgbCdlbWJlZGRlZG1vZHVsZS4gUXVlc3RvIHZpZW5lIGVzZWd1aXRvIHNvbG8gc2UgdGhpcy5sb2NhdGlvbi5wYXRoKCkgcGVyIHF1YWxjaGUgbW90aXZvIG5vbiBjb250aWVuZSBpbCBtb2R1bGVcclxuICAgICAgICBsZXQgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChteWNvbmZpZz8uQXBwRGF0YT8uTW9kdWxlSWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuRW1iZWRkZWRNb2R1bGUgPSBteWNvbmZpZy5BcHBEYXRhLk1vZHVsZUlkO1xyXG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCAyNTApO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBJc1JlbG9hZEFsbG93ZWQoKSB7XHJcbiAgICAgICAgbGV0IHJldCA9IHRoaXMuX3JlbG9hZEFsbG93ZWQ7XHJcbiAgICAgICAgdGhpcy5fcmVsb2FkQWxsb3dlZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcbiAgICBjb25maWd1cmVFbWJlZGRhYmlsaXR5KCkge1xyXG4gICAgICAgIHdpbmRvdy5vbm1lc3NhZ2UgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBJZ25vcm8gaSBtaWVpIG1lc3NhZ2dpIGRhdG8gY2hlIG1pIGludGVyZXNzYW5vIHNvbG8gcXVlbGxpIGRlZ2xpIGFsdHJpIGlmcmFtZVxyXG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09IHdpbmRvdyAmJiBldmVudD8uZGF0YT8udHlwZSAhPSBcIm1vZGFsLW9wZW5cIilcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuTWVzc2FnZU9ic2VydmVyLm5leHQoeyBldmVudDogXCJ3aW5kb3ctbWVzc2FnZVwiLCBkYXRhOiBldmVudD8uZGF0YSB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudD8uZGF0YT8udHlwZSA9PSBcImFsZXJ0XCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBXaW5kb3cgbWVzc2FnZSAtIGFsZXJ0IC0+IExldmVsOiAke2V2ZW50Py5kYXRhPy5sZXZlbH0sIE1lc3NhZ2U6ICR7ZXZlbnQ/LmRhdGE/Lm1zZ31gKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50Py5kYXRhPy5sZXZlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdWNjZXNzXCI6IHRoaXMubXNnU2VydmljZS5zaW1wbGVTdWNjZXNzKGV2ZW50Py5kYXRhPy5tc2cpOyBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwid2FybmluZ1wiOiB0aGlzLm1zZ1NlcnZpY2Uuc2ltcGxlV2FybmluZyhldmVudD8uZGF0YT8ubXNnKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVycm9yXCI6IHRoaXMubXNnU2VydmljZS5zaW1wbGVFcnJvcihldmVudD8uZGF0YT8ubXNnKTsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImluZm9cIjogdGhpcy5tc2dTZXJ2aWNlLnNpbXBsZUluZm8oZXZlbnQ/LmRhdGE/Lm1zZyk7IGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50Py5kYXRhPy50eXBlID09IFwicmVwbGFjZS1zdGF0ZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV2luZG93IG1lc3NhZ2UgLSByZXBsYWNlLXN0YXRlIC0+IFVybDogJHtldmVudD8uZGF0YT8udXJsfWApO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZVN0YXRlKGV2ZW50Py5kYXRhPy51cmwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50Py5kYXRhPy50eXBlID09IFwiY29uZmlybVwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV2luZG93IG1lc3NhZ2UgLSBjb25maXJtIC0+IExldmVsOiAke2V2ZW50Py5kYXRhPy5sZXZlbH0sIE1lc3NhZ2U6ICR7ZXZlbnQ/LmRhdGE/LnRleHR9LCBUaXRsZTogJHtldmVudD8uZGF0YT8udGl0bGV9LCBJRDogJHtldmVudD8uZGF0YT8uZ3VpZH1gKTtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgc291cmNlV2luZG93ID0gKGV2ZW50LnNvdXJjZSBhcyBXaW5kb3cpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGJhc2VSZXNwb25zZSA9IHsgdHlwZTogXCJjb25maXJtLXJlc3BvbnNlXCIsIGd1aWQ6IGV2ZW50Py5kYXRhPy5ndWlkIH07XHJcblxyXG4gICAgICAgICAgICAgICAgc3dpdGNoIChldmVudD8uZGF0YT8ubGV2ZWwpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3VjY2Vzc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1zZ1NlcnZpY2Uuc2ltcGxlU3VjY2Vzc1dpdGhDaG9pY2UoZXZlbnQ/LmRhdGE/LnRpdGxlLCBldmVudD8uZGF0YT8udGV4dCwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlV2luZG93LnBvc3RNZXNzYWdlKHsgcmVzdWx0OiB0cnVlLCAuLi5iYXNlUmVzcG9uc2UgfSwgXCIqXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVdpbmRvdy5wb3N0TWVzc2FnZSh7IHJlc3VsdDogZmFsc2UsIC4uLmJhc2VSZXNwb25zZSB9LCBcIipcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ3YXJuaW5nXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubXNnU2VydmljZS5zaW1wbGVXYXJuaW5nV2l0aENob2ljZShldmVudD8uZGF0YT8udGl0bGUsIGV2ZW50Py5kYXRhPy50ZXh0LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VXaW5kb3cucG9zdE1lc3NhZ2UoeyByZXN1bHQ6IHRydWUsIC4uLmJhc2VSZXNwb25zZSB9LCBcIipcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlV2luZG93LnBvc3RNZXNzYWdlKHsgcmVzdWx0OiBmYWxzZSwgLi4uYmFzZVJlc3BvbnNlIH0sIFwiKlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50Py5kYXRhPy50eXBlID09IFwibmF2aWdhdGVcIikge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFdpbmRvdyBtZXNzYWdlIC0gbmF2aWdhdGUgLT4gJHtldmVudD8uZGF0YT8udXJsfWApO1xyXG4gICAgICAgICAgICAgICAgdmFyIG5ld1RhYiA9IGV2ZW50Py5kYXRhPy5uZXdUYWI7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVwbGFjZVN0YXRlID0gZXZlbnQ/LmRhdGE/LnJlcGxhY2VTdGF0ZVxyXG5cclxuICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsbyBzZSBpbCByb3V0ZXIgc3RhIHNlZ3VlbmRvIGxhIGNoaWFtYXRhIGF0dHVhbGUuIEVzY2x1ZG8gaSBxdWVyeSBwYXJhbXMgY2hlIHNvbm8gZ2xpIHVuaWNpIGNoZSBwb3Nzb25vIGVzc2VyZSBzZWNjYXRpIGRhaSByZXBsYWNlU3RhdGVcclxuICAgICAgICAgICAgICAgIC8vIGUgY2hlIHBvdHJlYmJlcm8gZmFyZSBkZWwgY2FzaW5vXHJcbiAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKHRoaXMucm91dGVyLnVybC5zcGxpdChcIj9cIilbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiRG9wcGlhIGNoaWFtYXRhIGRpIG5hdmlnYXppb25lLCBpZ25vcm8gaWwgc2Vjb25kbyBldmVudG8gc2Nvb3JkaW5hdG8gZGFsIHJvdXRlclwiKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IG5ld1JlbGF0aXZlVXJsID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbZXZlbnQ/LmRhdGE/LnVybF0pO1xyXG4gICAgICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5yZXBsYWNlKHRoaXMucm91dGVyLnVybC5yZXBsYWNlKFwiP2lnbm9yZVN0b3JhZ2U9dHJ1ZVwiICwgJycpLCAnJyk7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV3VXJsID0gYmFzZVVybCArIGRlY29kZVVSSUNvbXBvbmVudChuZXdSZWxhdGl2ZVVybC50b1N0cmluZygpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZVN0YXRlKVxyXG4gICAgICAgICAgICAgICAgICAgIGhpc3RvcnkucHVzaFN0YXRlKHsgX3B1c2hlZDogdHJ1ZSB9LCBcIlwiLCBuZXdVcmwpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3VGFiKVxyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKG5ld1VybCwgJ19ibGFuaycpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50Py5kYXRhPy50eXBlID09IFwibmF2aWdhdGUtYmFja1wiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV2luZG93IG1lc3NhZ2UgLSBuYXZpZ2F0ZS1iYWNrIC0+ICR7ZXZlbnQ/LmRhdGE/LnVybH1gKTtcclxuICAgICAgICAgICAgICAgIGlmIChoaXN0b3J5LnN0YXRlLl9wdXNoZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRBbGxvd2VkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5iYWNrKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQ/LmRhdGE/LnR5cGUgPT0gXCJyZWRpcmVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV2luZG93IG1lc3NhZ2UgLSByZWRpcmVjdCAtPiAke2V2ZW50Py5kYXRhPy51cmx9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBldmVudD8uZGF0YT8udXJsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV2ZW50Py5kYXRhPy50eXBlID09IFwibmF2aWdhdGlvblwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV2luZG93IG1lc3NhZ2UgLSBOYXZpZ2F0aW9uIC0+ICR7ZXZlbnQ/LmRhdGE/LmludGVybmFsTmF2aWdhdGlvbiA/IFwiW2ludGVybmFsXVwiIDogXCJcIn0gJHtldmVudD8uZGF0YT8udGl0bGV9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5NZXNzYWdlT2JzZXJ2ZXIubmV4dCh7IGV2ZW50OiBcIm5hdmlnYXRpb25cIiwgZGF0YTogZXZlbnQ/LmRhdGEgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQ/LmRhdGE/LnR5cGUgPT0gXCJtb2RhbC1vcGVuXCIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJtYWluLXdyYXBwZXJcIilbMF0gYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgd3JhcHBlclN0eWxlcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHdyYXBwZXIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlclBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQod3JhcHBlclN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1sZWZ0XCIpKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZXJQYWRkaW5nUmlnaHQgPSBwYXJzZUludCh3cmFwcGVyU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXCJwYWRkaW5nLXJpZ2h0XCIpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV2luZG93IG1lc3NhZ2UgLSBNb2RhbCBPcGVuIC0+IEJhY2tkcm9wIEhlaWdodDogJHtldmVudD8uZGF0YT8uYmFja2Ryb3BIZWlnaHR9YCk7XHJcblxyXG4gICAgICAgICAgICAgICAgdmFyIHRvcEhlaWdodDogbnVtYmVyID0gODA7IC8vIHZhbG9yZSBmaXNzbywgZGlzdGFuemEgZnJhIGlsIHRvcCBlIGwnaW5pemlvIGRlbGwnaWZyYW1lLCBub24gc2Fyw6AgbWFpIGRpdmVyc29cclxuICAgICAgICAgICAgICAgIHZhciByaWdodFNwYWNlOiBudW1iZXIgPSB3cmFwcGVyUGFkZGluZ1JpZ2h0OyAvLyB2YWxvcmUgZmlzc28sIGRpc3RhbnphIGZyYSBsYSBmaW5lIGRlbGwnaWZyYW1lIGUgaWwgbGF0byBzaW5pc3RybyBkZWxsbyBzY2hlcm1vLCBub24gc2Fyw6AgbWFpIGRpdmVyc29cclxuICAgICAgICAgICAgICAgIHZhciBsZWZ0U3BhY2U6IG51bWJlciA9IHRoaXMuc2lkZWJhcldpZHRoICsgd3JhcHBlclBhZGRpbmdMZWZ0O1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjb21tb25TdHlsZXMgPSBcInBvc2l0aW9uOiBhYnNvbHV0ZTsgei1pbmRleDogOTk5OTsgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsgb3BhY2l0eTogMC41OyBcIjtcclxuXHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwib3ZlcmZsb3dcIiwgXCJoaWRkZW5cIiwgXCJpbXBvcnRhbnRcIik7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgdG9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgICAgIHRvcC5jbGFzc05hbWUgPSBcImVtYmVkZGVkLW1vZGFsLXRvcFwiO1xyXG4gICAgICAgICAgICAgICAgdG9wLnN0eWxlLmNzc1RleHQgPSBjb21tb25TdHlsZXMgKyBgaGVpZ2h0OiAke3RvcEhlaWdodH1weDsgdG9wOiAwOyB3aWR0aDogY2FsYygxMDAlIC0gJHtsZWZ0U3BhY2V9cHgpOyBsZWZ0OiAke2xlZnRTcGFjZX1weGA7XHJcbiAgICAgICAgICAgICAgICB0b3AuaWQgPSBcInRvcFwiO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICAgICAgbGVmdC5jbGFzc05hbWUgPSBcImVtYmVkZGVkLW1vZGFsLWxlZnRcIjtcclxuICAgICAgICAgICAgICAgIGxlZnQuc3R5bGUuY3NzVGV4dCA9IGNvbW1vblN0eWxlcyArIGBoZWlnaHQ6IDEwMCU7IHRvcDogMDsgd2lkdGg6ICR7bGVmdFNwYWNlfXB4O2A7XHJcbiAgICAgICAgICAgICAgICBsZWZ0LmlkID0gXCJsZWZ0XCI7XHJcblxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICAgICAgICAgICAgcmlnaHQuY2xhc3NOYW1lID0gXCJlbWJlZGRlZC1tb2RhbC1yaWdodFwiO1xyXG4gICAgICAgICAgICAgICAgcmlnaHQuc3R5bGUuY3NzVGV4dCA9IGNvbW1vblN0eWxlcyArIGBoZWlnaHQ6IGNhbGMoMTAwJSAtICR7dG9wSGVpZ2h0fXB4KTsgdG9wOiAke3RvcEhlaWdodH1weDsgcmlnaHQ6IDA7IHdpZHRoOiAke3JpZ2h0U3BhY2V9cHg7YDtcclxuICAgICAgICAgICAgICAgIHJpZ2h0LmlkID0gXCJyaWdodFwiO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGJvdHRvbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgICAgICAvLyBib3R0b20uY2xhc3NOYW1lID0gXCJlbWJlZGRlZC1tb2RhbC1ib3R0b21cIjtcclxuICAgICAgICAgICAgICAgIC8vIGJvdHRvbS5zdHlsZS5jc3NUZXh0ID0gY29tbW9uU3R5bGVzICsgYGhlaWdodDogJHt0b3BIZWlnaHR9cHg7IGJvdHRvbTogMDsgd2lkdGg6IGNhbGMoMTAwJSAtICR7bGVmdFNwYWNlfXB4KTsgbGVmdDogJHtsZWZ0U3BhY2V9cHhgO1xyXG4gICAgICAgICAgICAgICAgLy8gYm90dG9tLmlkID0gXCJib3R0b21cIjtcclxuXHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRvcCk7XHJcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxlZnQpO1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQ/LmRhdGE/LnR5cGUgPT0gXCJtb2RhbC1jbG9zZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgV2luZG93IG1lc3NhZ2UgLSBNb2RhbCBDbG9zZWApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB3cmFwcGVyID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibWFpbi13cmFwcGVyXCIpWzBdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgd3JhcHBlci5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcIm92ZXJmbG93XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHRvcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwidG9wXCIpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibGVmdFwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyaWdodFwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodG9wKVxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodG9wKTtcclxuICAgICAgICAgICAgICAgIGlmIChsZWZ0KVxyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobGVmdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmlnaHQpXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChyaWdodCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy5FbWJlZGRlZClcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5zZXRQcm9wZXJ0eShcIm92ZXJmbG93LXlcIiwgXCJhdXRvXCIsIFwiaW1wb3J0YW50XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZXBsYWNlU3RhdGUoYmFzZVBhdGg6IHN0cmluZywgdXJsOiBzdHJpbmcpIHtcclxuICAgICAgICAvLyBFc2VtcGlvIGJhc2VQYXRoOiBwYWdlc1xyXG4gICAgICAgIC8vIEVzZW1waW8gdXJsOiBwYXJ0aWVzL2xlYWRzX3NlYXJjaFxyXG5cclxuICAgICAgICAvLyBOb3JtYWxpenphemlvbmUgc2VuemEgc2xhc2ggcHJpbWEgbyBkb3BvXHJcbiAgICAgICAgYmFzZVBhdGggPSBiYXNlUGF0aC5lbmRzV2l0aChcIi9cIikgPyBiYXNlUGF0aC5zdWJzdHJpbmcoMCwgYmFzZVBhdGgubGVuZ3RoIC0yKSA6IGJhc2VQYXRoO1xyXG4gICAgICAgIHVybCA9IHVybC5zdGFydHNXaXRoKFwiL1wiKSA/IHVybC5zdWJzdHJpbmcoMSkgOiB1cmw7XHJcblxyXG4gICAgICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZVN0YXRlKGAke2Jhc2VQYXRofS8ke3VybH1gKTtcclxuICAgICAgICB0aGlzLk1haW5XaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlOiBcInJlcGxhY2Utc3RhdGVcIiwgdXJsOiBgcGFnZXMvZW1iZWQvJHt0aGlzLkVtYmVkZGVkTW9kdWxlfS8ke3VybH1gIH0sIFwiKlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgcmVmcmVzaEJvdW5kYXJpZXNPbk1lbnVDb2xsYXBzZSgpIHtcclxuICAgICAgICBjb25zdCB3cmFwcGVyID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwibWFpbi13cmFwcGVyXCIpWzBdIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGxldCB3cmFwcGVyU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUod3JhcHBlcik7XHJcbiAgICAgICAgY29uc3Qgd3JhcHBlclBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQod3JhcHBlclN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKFwicGFkZGluZy1sZWZ0XCIpKTtcclxuICAgICAgICB2YXIgbGVmdFNwYWNlOiBudW1iZXIgPSAyMzAgKyB3cmFwcGVyUGFkZGluZ0xlZnQ7XHJcblxyXG4gICAgICAgIGNvbnN0IGxlZnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxlZnRcIik7XHJcbiAgICAgICAgY29uc3QgdG9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0b3BcIik7XHJcblxyXG4gICAgICAgIGlmICh0b3ApIHtcclxuICAgICAgICAgICAgdG9wLnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCAobGVmdFNwYWNlKSArIFwicHhcIik7XHJcbiAgICAgICAgICAgIHRvcC5zdHlsZS5zZXRQcm9wZXJ0eShcIndpZHRoXCIsIGBjYWxjKDEwMCUgLSAke2xlZnRTcGFjZX1weClgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChsZWZ0KVxyXG4gICAgICAgICAgICBsZWZ0LnN0eWxlLnNldFByb3BlcnR5KFwid2lkdGhcIiwgbGVmdFNwYWNlICsgXCJweFwiKTtcclxuICAgIH1cclxufSJdfQ==
|