ctt-babylon 0.25.4 → 0.25.6
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/esm2022/lib/components/core/babylon-booking-widget/babylon-booking-widget.component.mjs +60 -75
- package/esm2022/lib/components/core/babylon-top-slider-video/babylon-top-slider-video.component.mjs +5 -4
- package/fesm2022/ctt-babylon.mjs +63 -77
- package/fesm2022/ctt-babylon.mjs.map +1 -1
- package/package.json +1 -1
package/esm2022/lib/components/core/babylon-booking-widget/babylon-booking-widget.component.mjs
CHANGED
|
@@ -78,13 +78,10 @@ export class BabylonBookingWidgetComponent {
|
|
|
78
78
|
this.injectMarketingParams(el);
|
|
79
79
|
}
|
|
80
80
|
injectMarketingParams(element) {
|
|
81
|
-
// PROTECCIÓN SSR
|
|
81
|
+
// PROTECCIÓN SSR
|
|
82
82
|
if (typeof window === 'undefined' ||
|
|
83
|
-
typeof sessionStorage === 'undefined')
|
|
83
|
+
typeof sessionStorage === 'undefined')
|
|
84
84
|
return;
|
|
85
|
-
}
|
|
86
|
-
// 1. DICCIONARIOS DE NOMENCLATURAS ESTÁNDAR
|
|
87
|
-
// Clic IDs automáticos de las principales plataformas publicitarias[cite: 16]
|
|
88
85
|
const CLICK_IDS = [
|
|
89
86
|
'gclid',
|
|
90
87
|
'gbraid',
|
|
@@ -108,9 +105,8 @@ export class BabylonBookingWidgetComponent {
|
|
|
108
105
|
'dicbo',
|
|
109
106
|
'ad_id',
|
|
110
107
|
'irclickid',
|
|
111
|
-
'cjevent',
|
|
108
|
+
'cjevent',
|
|
112
109
|
];
|
|
113
|
-
// Estándar manual UTM
|
|
114
110
|
const UTMS = [
|
|
115
111
|
'utm_source',
|
|
116
112
|
'utm_medium',
|
|
@@ -120,39 +116,33 @@ export class BabylonBookingWidgetComponent {
|
|
|
120
116
|
];
|
|
121
117
|
const marketingData = {};
|
|
122
118
|
const params = new URLSearchParams(window.location.search);
|
|
123
|
-
// --- CAPA 1:
|
|
119
|
+
// --- CAPA 1: URL ---
|
|
124
120
|
[...CLICK_IDS, ...UTMS, 'origin'].forEach((key) => {
|
|
125
121
|
const value = params.get(key);
|
|
126
122
|
if (value)
|
|
127
123
|
marketingData[key] = value;
|
|
128
124
|
});
|
|
129
|
-
// --- CAPA 2:
|
|
125
|
+
// --- CAPA 2: COOKIES ---
|
|
130
126
|
const getCookie = (name) => {
|
|
131
127
|
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
132
128
|
return match ? match[2] : null;
|
|
133
129
|
};
|
|
134
130
|
if (Object.keys(marketingData).length === 0) {
|
|
135
|
-
// Google Ads guarda su GCLID en la cookie _gcl_aw (formato: GCL.timestamp.id)
|
|
136
131
|
const gclAw = getCookie('_gcl_aw');
|
|
137
|
-
if (gclAw && gclAw.split('.').length >= 3)
|
|
132
|
+
if (gclAw && gclAw.split('.').length >= 3)
|
|
138
133
|
marketingData['gclid'] = gclAw.split('.')[2];
|
|
139
|
-
}
|
|
140
|
-
// Facebook guarda su FBCLID en la cookie _fbp
|
|
141
134
|
const fbp = getCookie('_fbp');
|
|
142
|
-
if (fbp)
|
|
135
|
+
if (fbp)
|
|
143
136
|
marketingData['fbclid'] = fbp;
|
|
144
|
-
}
|
|
145
137
|
}
|
|
146
|
-
// --- CAPA 3:
|
|
138
|
+
// --- CAPA 3: DATALAYER ---
|
|
147
139
|
if (Object.keys(marketingData).length === 0 &&
|
|
148
140
|
window.dataLayer) {
|
|
149
141
|
const dl = window.dataLayer;
|
|
150
|
-
// Recorremos de más reciente a más antiguo
|
|
151
142
|
for (let i = dl.length - 1; i >= 0; i--) {
|
|
152
143
|
const item = dl[i];
|
|
153
144
|
[...CLICK_IDS, ...UTMS, 'traffic_source', 'origin'].forEach((key) => {
|
|
154
145
|
if (item[key] && !marketingData[key]) {
|
|
155
|
-
// Mapear un nombre interno (ej. traffic_source) al estándar
|
|
156
146
|
const finalKey = key === 'traffic_source' ? 'origin' : key;
|
|
157
147
|
marketingData[finalKey] = item[key];
|
|
158
148
|
}
|
|
@@ -161,9 +151,9 @@ export class BabylonBookingWidgetComponent {
|
|
|
161
151
|
break;
|
|
162
152
|
}
|
|
163
153
|
}
|
|
164
|
-
// --- CAPA 4: RECUPERAR
|
|
154
|
+
// --- CAPA 4: RECUPERAR DE SESIÓN O DETERMINAR ORGÁNICO ---
|
|
165
155
|
if (Object.keys(marketingData).length === 0) {
|
|
166
|
-
//
|
|
156
|
+
// Intentar recuperar de navegaciones anteriores
|
|
167
157
|
const storedKeys = Object.keys(sessionStorage).filter((k) => k.startsWith('mkt_'));
|
|
168
158
|
storedKeys.forEach((k) => {
|
|
169
159
|
const originalKey = k.replace('mkt_', '');
|
|
@@ -171,21 +161,43 @@ export class BabylonBookingWidgetComponent {
|
|
|
171
161
|
if (val)
|
|
172
162
|
marketingData[originalKey] = val;
|
|
173
163
|
});
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
164
|
+
// Si después de buscar en sesión sigue vacío, es TRÁFICO NUEVO SIN CAMPAÑAS.
|
|
165
|
+
// Aquí averiguamos el origen orgánico para poder GUARDARLO en el siguiente paso.
|
|
166
|
+
if (Object.keys(marketingData).length === 0) {
|
|
167
|
+
const referrer = document.referrer
|
|
168
|
+
? document.referrer.toLowerCase()
|
|
169
|
+
: '';
|
|
170
|
+
if (referrer) {
|
|
171
|
+
if (referrer.includes('google.'))
|
|
172
|
+
marketingData['origin'] = 'google_organic';
|
|
173
|
+
else if (referrer.includes('bing.'))
|
|
174
|
+
marketingData['origin'] = 'bing_organic';
|
|
175
|
+
else if (referrer.includes('yahoo.'))
|
|
176
|
+
marketingData['origin'] = 'yahoo_organic';
|
|
177
|
+
else if (referrer.includes('duckduckgo.'))
|
|
178
|
+
marketingData['origin'] = 'duckduckgo_organic';
|
|
179
|
+
else if (referrer.includes('yandex.'))
|
|
180
|
+
marketingData['origin'] = 'yandex_organic';
|
|
181
|
+
else if (referrer.includes('baidu.'))
|
|
182
|
+
marketingData['origin'] = 'baidu_organic';
|
|
183
|
+
else if (referrer.includes('ecosia.'))
|
|
184
|
+
marketingData['origin'] = 'ecosia_organic';
|
|
185
|
+
else if (referrer.includes('qwant.'))
|
|
186
|
+
marketingData['origin'] = 'qwant_organic';
|
|
187
|
+
else if (referrer.includes('ask.'))
|
|
188
|
+
marketingData['origin'] = 'ask_organic';
|
|
189
|
+
else if (referrer.includes('naver.'))
|
|
190
|
+
marketingData['origin'] = 'naver_organic';
|
|
191
|
+
else
|
|
192
|
+
marketingData['origin'] = 'referral_other';
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
marketingData['origin'] = 'web'; // Tráfico directo
|
|
196
|
+
}
|
|
184
197
|
}
|
|
185
198
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
// Siempre evaluamos el origin, porque si viene vacío, lo rellenamos con el orgánico o 'web'
|
|
199
|
+
else {
|
|
200
|
+
// Si capturamos datos nuevos (URL, Cookies, GTM) pero no traen "origin", se lo asignamos
|
|
189
201
|
if (!marketingData['origin']) {
|
|
190
202
|
if (marketingData['utm_source']) {
|
|
191
203
|
marketingData['origin'] =
|
|
@@ -205,49 +217,22 @@ export class BabylonBookingWidgetComponent {
|
|
|
205
217
|
else if (marketingData['ttclid']) {
|
|
206
218
|
marketingData['origin'] = 'tiktok_ads';
|
|
207
219
|
}
|
|
208
|
-
else {
|
|
209
|
-
// 5. RED DE SEGURIDAD ORGÁNICA FRONTEND
|
|
210
|
-
const referrer = document.referrer
|
|
211
|
-
? document.referrer.toLowerCase()
|
|
212
|
-
: '';
|
|
213
|
-
if (referrer) {
|
|
214
|
-
if (referrer.includes('google.'))
|
|
215
|
-
marketingData['origin'] = 'google_organic';
|
|
216
|
-
else if (referrer.includes('bing.'))
|
|
217
|
-
marketingData['origin'] = 'bing_organic';
|
|
218
|
-
else if (referrer.includes('yahoo.'))
|
|
219
|
-
marketingData['origin'] = 'yahoo_organic';
|
|
220
|
-
else if (referrer.includes('duckduckgo.'))
|
|
221
|
-
marketingData['origin'] = 'duckduckgo_organic';
|
|
222
|
-
else if (referrer.includes('yandex.'))
|
|
223
|
-
marketingData['origin'] = 'yandex_organic';
|
|
224
|
-
else if (referrer.includes('baidu.'))
|
|
225
|
-
marketingData['origin'] = 'baidu_organic';
|
|
226
|
-
else if (referrer.includes('ecosia.'))
|
|
227
|
-
marketingData['origin'] = 'ecosia_organic';
|
|
228
|
-
else if (referrer.includes('qwant.'))
|
|
229
|
-
marketingData['origin'] = 'qwant_organic';
|
|
230
|
-
else if (referrer.includes('ask.'))
|
|
231
|
-
marketingData['origin'] = 'ask_organic';
|
|
232
|
-
else if (referrer.includes('naver.'))
|
|
233
|
-
marketingData['origin'] = 'naver_organic';
|
|
234
|
-
else
|
|
235
|
-
marketingData['origin'] = 'referral_other'; // Tráfico desde otra web
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
238
|
-
// Tráfico directo (URL tecleada a mano o referrer oculto)
|
|
239
|
-
marketingData['origin'] = 'web'; // Valor por defecto seguro para Witbooking
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
220
|
}
|
|
243
|
-
// El evento se dispara SIEMPRE, ya que como mínimo llevará { origin: 'web' }
|
|
244
|
-
setTimeout(() => {
|
|
245
|
-
const event = new CustomEvent('widgetUpdateParams', {
|
|
246
|
-
detail: marketingData,
|
|
247
|
-
});
|
|
248
|
-
element.dispatchEvent(event);
|
|
249
|
-
}, 500);
|
|
250
221
|
}
|
|
222
|
+
// --- CAPA 5: GUARDAR SIEMPRE EN SESSION STORAGE ---
|
|
223
|
+
try {
|
|
224
|
+
Object.entries(marketingData).forEach(([key, value]) => {
|
|
225
|
+
sessionStorage.setItem(`mkt_${key}`, value);
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch (error) { }
|
|
229
|
+
// --- ENVÍO AL WIDGET ---
|
|
230
|
+
setTimeout(() => {
|
|
231
|
+
const event = new CustomEvent('widgetUpdateParams', {
|
|
232
|
+
detail: marketingData,
|
|
233
|
+
});
|
|
234
|
+
element.dispatchEvent(event);
|
|
235
|
+
}, 500);
|
|
251
236
|
}
|
|
252
237
|
ngOnChanges(changes) {
|
|
253
238
|
if (changes['ticker']) {
|
|
@@ -448,4 +433,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
448
433
|
}], monthsToDisplay: [{
|
|
449
434
|
type: Input
|
|
450
435
|
}] } });
|
|
451
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi1ib29raW5nLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYWJ5bG9uL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2JhYnlsb24tYm9va2luZy13aWRnZXQvYmFieWxvbi1ib29raW5nLXdpZGdldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxXQUFXLEVBRVgsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDOzs7QUFXdkIsSUFBSSxtQkFBbUIsR0FBeUIsSUFBSSxDQUFDO0FBRXJELFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDekIsSUFBSSxtQkFBbUI7UUFBRSxPQUFPLG1CQUFtQixDQUFDO0lBRXBELG1CQUFtQixHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3hELDJCQUEyQjtRQUMzQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLHNCQUFzQixFQUFFO1lBQ3RELE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTztTQUNWO1FBRUQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUNiLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENB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LEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhYnlsb25XaWRnZXRTZWFyY2hMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFieWxvbi13aWRnZXQtc2VhcmNoLWxvYWRlci5zZXJ2aWNlJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBXaWRnZXRTZWFyY2g6IGFueTtcbiAgICAgICAgaW5pdGlhbGl6ZVdpZGdldFNlYXJjaD86ICgpID0+IHZvaWQ7XG4gICAgICAgIGdldFdpZGdldEluc3RhbmNlPzogKGlkOiBzdHJpbmcpID0+IGFueTtcbiAgICB9XG59XG5cbmxldCB3aWRnZXRTY3JpcHRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGxvYWRPbmNlKHNyYzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHdpZGdldFNjcmlwdFByb21pc2UpIHJldHVybiB3aWRnZXRTY3JpcHRQcm9taXNlO1xuXG4gICAgd2lkZ2V0U2NyaXB0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gU2kgeWEgZXhpc3RlLCByZXNvbHZlbW9zXG4gICAgICAgIGlmICh3aW5kb3cuV2lkZ2V0U2VhcmNoIHx8IHdpbmRvdy5pbml0aWFsaXplV2lkZ2V0U2VhcmNoKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHMuc3JjID0gc3JjO1xuICAgICAgICBzLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgcy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHMub25lcnJvciA9ICgpID0+XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdObyBzZSBwdWRvIGNhcmdhciBlbCBzY3JpcHQgZGVsIHdpZGdldCcpKTtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB3aWRnZXRTY3JpcHRQcm9taXNlO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1iYWJ5bG9uLWJvb2tpbmctd2lkZ2V0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICN3aWRnZXRDb250YWluZXJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWJvb2staWRdPVwiaG90ZWxJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWhvdGVsXT1cInRpY2tlclwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwidHlwZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWVuZ2luZV09XCJlbmdpbmVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10aGVtZV09XCJ0aGVtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWN1cnJlbmN5XT1cImN1cnJlbmN5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWxheW91dF09XCJsYXlvdXRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1sYXlvdXQtY29sdW1uXT1cImxheW91dENvbHVtblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWRlZmF1bHQtYWR1bHRzXT1cImRlZmF1bHRBZHVsdHNcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kZWZhdWx0LWp1bmlvcl09XCJkZWZhdWx0SnVuaW9yXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtZGVmYXVsdC1jaGlsZHJlbl09XCJkZWZhdWx0Q2hpbGRyZW5cIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zaG93LXByaWNlXT1cInNob3dQcmljZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctaG90ZWwtc2VsZWN0b3JdPVwic2hvd0hvdGVsU2VsZWN0b3JcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zaG93LXByb21vLWNvZGVdPVwic2hvd1Byb21vQ29kZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctY2hpbGQtYWdlc109XCJzaG93Q2hpbGRBZ2VzXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWF4LWNoaWxkcmVuXT1cIm1heENoaWxkcmVuXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWF4LWp1bmlvcl09XCJtYXhKdW5pb3JcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1iYXNlLXVybF09XCJiYXNlVXJsXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdXJsLWNoYWluXT1cInVybENoYWluXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdXJsLWhvdGVsXT1cInVybEhvdGVsXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtYnV0dG9uLXRleHRdPVwiYnV0dG9uVGV4dFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1heC1yb29tc109XCJtYXhSb29tc1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctYWxsLWhvdGVscy1vcHRpb25dPVwic2hvd0FsbEhvdGVsc09wdGlvblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRhcmdldC1ibGFua109XCJ0YXJnZXRCbGFua1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWhvdGVsLXRleHRdPVwiaG90ZWxUZXh0XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWluLWRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1heC1kYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kaXNwbGF5LW1vbnRoc109XCJtb250aHNUb0Rpc3BsYXlcIlxuICAgICAgICA+PC9kaXY+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQmFieWxvbkJvb2tpbmdXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3dpZGdldENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgd2lkZ2V0Q29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBASW5wdXQoKSB3aWRnZXRJZCA9ICd3aWRnZXQtc2VhcmNoJztcbiAgICBASW5wdXQoKSBob3RlbElkID0gJ2FsZWNhZCc7XG4gICAgQElucHV0KCkgdGlja2VyID0gJ2hvdGVsbWFyaXN0ZWwuY29tJztcbiAgICBASW5wdXQoKSB0eXBlOiAnY2hhaW4nIHwgJ2hvdGVsJyB8IHN0cmluZyA9ICdjaGFpbic7XG4gICAgQElucHV0KCkgZW5naW5lOiAnd2l0Ym9va2luZycgfCAncm9pYmFjaycgfCBzdHJpbmcgPSAnd2l0Ym9va2luZyc7XG4gICAgQElucHV0KCkgdGhlbWU6ICdsaWdodCcgfCAnZGFyaycgfCBzdHJpbmcgPSAnbGlnaHQnO1xuICAgIEBJbnB1dCgpIGN1cnJlbmN5ID0gJ0VVUic7XG4gICAgQElucHV0KCkgbG9jYWxlPzogc3RyaW5nID0gJ2VzLUVTJztcbiAgICBASW5wdXQoKSBsYXlvdXQ6ICdpbmxpbmUnIHwgJ2NvbHVtbicgfCBzdHJpbmcgPSAnaW5saW5lJztcbiAgICBASW5wdXQoKSBkZWZhdWx0QWR1bHRzID0gMjtcbiAgICBASW5wdXQoKSBkZWZhdWx0Q2hpbGRyZW4gPSAwO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRKdW5pb3IgPSAwO1xuICAgIEBJbnB1dCgpIHNob3dQcmljZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNob3dIb3RlbFNlbGVjdG9yID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93UHJvbW9Db2RlID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93Q2hpbGRBZ2VzID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBtYXhDaGlsZHJlbj86IG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhKdW5pb3I/OiBudW1iZXI7XG4gICAgQElucHV0KCkgYmFzZVVybD86IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmxDaGFpbj86IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmxIb3RlbCA9ICdob3RlbCc7XG4gICAgQElucHV0KCkgYnV0dG9uVGV4dD86IHN0cmluZztcbiAgICBASW5wdXQoKSBsYXlvdXRDb2x1bW4/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4Um9vbXM/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgc2hvd0FsbEhvdGVsc09wdGlvbj86IHN0cmluZztcbiAgICBASW5wdXQoKSB0YXJnZXRCbGFuaz86IGJvb2xlYW47XG4gICAgQElucHV0KCkgaG90ZWxUZXh0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heERhdGU/OiBzdHJpbmc7IC8qIDIwMjgtMDEtMDEgKi9cbiAgICBASW5wdXQoKSBtaW5EYXRlPzogc3RyaW5nOyAvKiAyMDI4LTAxLTAxICovXG5cbiAgICBASW5wdXQoKSBmbGFnVGltZT86IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIG1vbnRoc1RvRGlzcGxheT86IG51bWJlciA9IDE7XG5cbiAgICBwcml2YXRlIG1vdW50ZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcGVuZGluZ1RpY2tlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZXRyeVRpbWVvdXQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgbG9hZGVyOiBCYWJ5bG9uV2lkZ2V0U2VhcmNoTG9hZGVyU2VydmljZVxuICAgICkge1xuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1dhaXQgZm9yIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW91bnRlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDirIfvuI8gUE9OIEFRVcONIGxhIFVSTCByZWFsIGRlbCBzY3JpcHQgZGUgV2l0Ym9va2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkZXIubG9hZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5mbGFnVGltZSA/IDMwMCA6IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbCA9IHRoaXMud2lkZ2V0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gT3BjacOzbiBBIChzaSBleGlzdGUpOiBpbml0IGdsb2JhbCBtYW51YWxcbiAgICAgICAgaWYgKHdpbmRvdy5pbml0aWFsaXplV2lkZ2V0U2VhcmNoKSB7XG4gICAgICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZVdpZGdldFNlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9wY2nDs24gQjogY29uc3RydWN0b3IgKFNvbG8gZW50cmEgc2kgbm8gZXhpc3RlIGxhIEEpXG4gICAgICAgIGVsc2UgaWYgKHdpbmRvdy5XaWRnZXRTZWFyY2gpIHtcbiAgICAgICAgICAgIG5ldyB3aW5kb3cuV2lkZ2V0U2VhcmNoKGVsLCB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluamVjdE1hcmtldGluZ1BhcmFtcyhlbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmplY3RNYXJrZXRpbmdQYXJhbXMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gUFJPVEVDQ0nDk04gU1NSOiBTaSBlc3RhbW9zIGVuIGVsIHNlcnZpZG9yIGRlIE5vZGUsIGFib3J0YW1vcyBwYXJhIGV2aXRhciBjdWVsZ3Vlc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIHNlc3Npb25TdG9yYWdlID09PSAndW5kZWZpbmVkJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIERJQ0NJT05BUklPUyBERSBOT01FTkNMQVRVUkFTIEVTVMOBTkRBUlxuICAgICAgICAvLyBDbGljIElEcyBhdXRvbcOhdGljb3MgZGUgbGFzIHByaW5jaXBhbGVzIHBsYXRhZm9ybWFzIHB1YmxpY2l0YXJpYXNbY2l0ZTogMTZdXG4gICAgICAgIGNvbnN0IENMSUNLX0lEUyA9IFtcbiAgICAgICAgICAgICdnY2xpZCcsXG4gICAgICAgICAgICAnZ2JyYWlkJyxcbiAgICAgICAgICAgICd3YnJhaWQnLFxuICAgICAgICAgICAgJ2RjbGlkJywgLy8gR29vZ2xlW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ21zY2xraWQnLCAvLyBNaWNyb3NvZnQgLyBCaW5nW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ3ZtY2lkJywgLy8gWWFob29bY2l0ZTogMTZdXG4gICAgICAgICAgICAneWNsaWQnLFxuICAgICAgICAgICAgJ3ltY2xpZCcsIC8vIFlhbmRleFtjaXRlOiAxNl1cbiAgICAgICAgICAgICdmYmNsaWQnLCAvLyBNZXRhIChGYWNlYm9vaywgSW5zdGFncmFtLCBXaGF0c0FwcClbY2l0ZTogMTZdXG4gICAgICAgICAgICAndHRjbGlkJywgLy8gVGlrVG9rW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ2xpX2ZhdF9pZCcsIC8vIExpbmtlZEluW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ3R3Y2xpZCcsIC8vIFggKFR3aXR0ZXIpW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ2VwaWsnLCAvLyBQaW50ZXJlc3RbY2l0ZTogMTZdXG4gICAgICAgICAgICAncmR0X2NpZCcsIC8vIFJlZGRpdFtjaXRlOiAxNl1cbiAgICAgICAgICAgICdTY0NpZCcsIC8vIFNuYXBjaGF0W2NpdGU6IDE2XVxuICAgICAgICAgICAgJ3FjbGlkJywgLy8gUXVvcmFbY2l0ZTogMTZdXG4gICAgICAgICAgICAnc2knLCAvLyBZb3VUdWJlW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ2F3Y2xpZCcsIC8vIEFtYXpvbiBBZHNbY2l0ZTogMTZdXG4gICAgICAgICAgICAndGJsY2knLCAvLyBUYWJvb2xhW2NpdGU6IDE2XVxuICAgICAgICAgICAgJ2RpY2JvJywgLy8gT3V0YnJhaW5bY2l0ZTogMTZdXG4gICAgICAgICAgICAnYWRfaWQnLCAvLyBBZFJvbGxbY2l0ZTogMTZdXG4gICAgICAgICAgICAnaXJjbGlja2lkJyxcbiAgICAgICAgICAgICdjamV2ZW50JywgLy8gQWZpbGlhZG9zIChJbXBhY3QsIENKKVtjaXRlOiAxNl1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBFc3TDoW5kYXIgbWFudWFsIFVUTVxuICAgICAgICBjb25zdCBVVE1TID0gW1xuICAgICAgICAgICAgJ3V0bV9zb3VyY2UnLFxuICAgICAgICAgICAgJ3V0bV9tZWRpdW0nLFxuICAgICAgICAgICAgJ3V0bV9jYW1wYWlnbicsXG4gICAgICAgICAgICAndXRtX3Rlcm0nLFxuICAgICAgICAgICAgJ3V0bV9jb250ZW50JyxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBtYXJrZXRpbmdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICAgICAgLy8gLS0tIENBUEEgMTogRVNDQU5FTyBERSBMQSBVUkwgLS0tXG4gICAgICAgIFsuLi5DTElDS19JRFMsIC4uLlVUTVMsICdvcmlnaW4nXS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSBtYXJrZXRpbmdEYXRhW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gLS0tIENBUEEgMjogRVNDQU5FTyBERSBDT09LSUVTIChTaSBsYSBVUkwgZXN0w6EgbGltcGlhIHBlcm8gaGF5IHJhc3RybyBwdWJsaWNpdGFyaW8pIC0tLVxuICAgICAgICBjb25zdCBnZXRDb29raWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChcbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKCcoXnwgKScgKyBuYW1lICsgJz0oW147XSspJylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsyXSA6IG51bGw7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gR29vZ2xlIEFkcyBndWFyZGEgc3UgR0NMSUQgZW4gbGEgY29va2llIF9nY2xfYXcgKGZvcm1hdG86IEdDTC50aW1lc3RhbXAuaWQpXG4gICAgICAgICAgICBjb25zdCBnY2xBdyA9IGdldENvb2tpZSgnX2djbF9hdycpO1xuICAgICAgICAgICAgaWYgKGdjbEF3ICYmIGdjbEF3LnNwbGl0KCcuJykubGVuZ3RoID49IDMpIHtcbiAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydnY2xpZCddID0gZ2NsQXcuc3BsaXQoJy4nKVsyXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmFjZWJvb2sgZ3VhcmRhIHN1IEZCQ0xJRCBlbiBsYSBjb29raWUgX2ZicFxuICAgICAgICAgICAgY29uc3QgZmJwID0gZ2V0Q29va2llKCdfZmJwJyk7XG4gICAgICAgICAgICBpZiAoZmJwKSB7XG4gICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnZmJjbGlkJ10gPSBmYnA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLS0gQ0FQQSAzOiBFU0NBTkVPIERFTCBEQVRBTEFZRVIgKElueWVjY2lvbmVzIHNpbGVuY2lvc2FzIGRlIFRhZyBNYW5hZ2VyKSAtLS1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgT2JqZWN0LmtleXMobWFya2V0aW5nRGF0YSkubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAod2luZG93IGFzIGFueSkuZGF0YUxheWVyXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgZGwgPSAod2luZG93IGFzIGFueSkuZGF0YUxheWVyIGFzIGFueVtdO1xuICAgICAgICAgICAgLy8gUmVjb3JyZW1vcyBkZSBtw6FzIHJlY2llbnRlIGEgbcOhcyBhbnRpZ3VvXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gZGwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZGxbaV07XG4gICAgICAgICAgICAgICAgWy4uLkNMSUNLX0lEUywgLi4uVVRNUywgJ3RyYWZmaWNfc291cmNlJywgJ29yaWdpbiddLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgIChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtW2tleV0gJiYgIW1hcmtldGluZ0RhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcGVhciB1biBub21icmUgaW50ZXJubyAoZWouIHRyYWZmaWNfc291cmNlKSBhbCBlc3TDoW5kYXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbEtleSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3RyYWZmaWNfc291cmNlJyA/ICdvcmlnaW4nIDoga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbZmluYWxLZXldID0gaXRlbVtrZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFya2V0aW5nRGF0YSkubGVuZ3RoID4gMCkgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLS0gQ0FQQSA0OiBSRUNVUEVSQVIgLyBHVUFSREFSIFNFU0nDk04gKFByb3RlY2Npw7NuIFNQQSBlbiBBbmd1bGFyKSAtLS1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gTm8gaGF5IGRhdG9zIG51ZXZvcywgcmVjdXBlcmFtb3MgdG9kbyBsbyBxdWUgdGVuZ2EgcHJlZmlqbyAnbWt0XydcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZEtleXMgPSBPYmplY3Qua2V5cyhzZXNzaW9uU3RvcmFnZSkuZmlsdGVyKChrKSA9PlxuICAgICAgICAgICAgICAgIGsuc3RhcnRzV2l0aCgnbWt0XycpXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgc3RvcmVkS2V5cy5mb3JFYWNoKChrKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxLZXkgPSBrLnJlcGxhY2UoJ21rdF8nLCAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsKSBtYXJrZXRpbmdEYXRhW29yaWdpbmFsS2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSGF5IGRhdG9zIG51ZXZvcywgbG9zIGd1YXJkYW1vcyBwYXJhIGxhIHByw7N4aW1hIHZleiBxdWUgbmF2ZWd1ZSBwb3IgbGEgd2ViXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKG1hcmtldGluZ0RhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGBta3RfJHtrZXl9YCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdBY2Nlc28gYSBzZXNzaW9uU3RvcmFnZSBibG9xdWVhZG8gcG9yIGVsIG5hdmVnYWRvci4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBFTlbDjU8gQUwgV0lER0VUIC0tLVxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFya2V0aW5nRGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gU2llbXByZSBldmFsdWFtb3MgZWwgb3JpZ2luLCBwb3JxdWUgc2kgdmllbmUgdmFjw61vLCBsbyByZWxsZW5hbW9zIGNvbiBlbCBvcmfDoW5pY28gbyAnd2ViJ1xuICAgICAgICAgICAgaWYgKCFtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSkge1xuICAgICAgICAgICAgICAgIGlmIChtYXJrZXRpbmdEYXRhWyd1dG1fc291cmNlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsndXRtX3NvdXJjZSddICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChtYXJrZXRpbmdEYXRhWyd1dG1fbWVkaXVtJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBfJHttYXJrZXRpbmdEYXRhWyd1dG1fbWVkaXVtJ119YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ2djbGlkJ10gfHxcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnd2JyYWlkJ10gfHxcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnZ2JyYWlkJ11cbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnZ29vZ2xlX2NwYyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrZXRpbmdEYXRhWydmYmNsaWQnXSkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdtZXRhX2Fkcyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrZXRpbmdEYXRhWyd0dGNsaWQnXSkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICd0aWt0b2tfYWRzJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyA1LiBSRUQgREUgU0VHVVJJREFEIE9SR8OBTklDQSBGUk9OVEVORFxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZlcnJlciA9IGRvY3VtZW50LnJlZmVycmVyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGRvY3VtZW50LnJlZmVycmVyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVycmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2dvb2dsZS4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdnb29nbGVfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnYmluZy4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdiaW5nX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ3lhaG9vLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3lhaG9vX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2R1Y2tkdWNrZ28uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnZHVja2R1Y2tnb19vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCd5YW5kZXguJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAneWFuZGV4X29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2JhaWR1LicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2JhaWR1X29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2Vjb3NpYS4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdlY29zaWFfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygncXdhbnQuJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAncXdhbnRfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnYXNrLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2Fza19vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCduYXZlci4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICduYXZlcl9vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAncmVmZXJyYWxfb3RoZXInOyAvLyBUcsOhZmljbyBkZXNkZSBvdHJhIHdlYlxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHLDoWZpY28gZGlyZWN0byAoVVJMIHRlY2xlYWRhIGEgbWFubyBvIHJlZmVycmVyIG9jdWx0bylcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3dlYic7IC8vIFZhbG9yIHBvciBkZWZlY3RvIHNlZ3VybyBwYXJhIFdpdGJvb2tpbmdcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRWwgZXZlbnRvIHNlIGRpc3BhcmEgU0lFTVBSRSwgeWEgcXVlIGNvbW8gbcOtbmltbyBsbGV2YXLDoSB7IG9yaWdpbjogJ3dlYicgfVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ3dpZGdldFVwZGF0ZVBhcmFtcycsIHtcbiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBtYXJrZXRpbmdEYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoY2hhbmdlc1sndGlja2VyJ10pIHtcbiAgICAgICAgICAgIC8vIEd1YXJkYW1vcyBzaWVtcHJlIGVsIMOaTFRJTU8gdmFsb3IgcXVlIEFuZ3VsYXIgbm9zIG1hbmRlXG4gICAgICAgICAgICB0aGlzLnBlbmRpbmdUaWNrZXIgPSBjaGFuZ2VzWyd0aWNrZXInXS5jdXJyZW50VmFsdWUgfHwgJ2FsbC1ob3RlbHMnO1xuXG4gICAgICAgICAgICAvLyBEaXNwYXJhbW9zIGxhIGFjdHVhbGl6YWNpw7NuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJXaWRnZXRVcGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5yZXRyeVRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZW91dCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRyaWdnZXJXaWRnZXRVcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIGlmICghaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkgcmV0dXJuO1xuICAgICAgICBpZiAodGhpcy5yZXRyeVRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLndpZGdldENvbnRhaW5lclxuICAgICAgICAgICAgICAgID8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICghY29udGFpbmVyRWwpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gMS4gRXNwZXJhbW9zIGEgcXVlIGVsIHdpZGdldCBoYXlhIGRlc2NhcmdhZG8geSBkaWJ1amFkbyBsb3MgaG90ZWxlcyBlbiBlbCBET01cbiAgICAgICAgICAgIGNvbnN0IGhvdGVsT3B0aW9ucyA9IGNvbnRhaW5lckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5ob3RlbC1vcHRpb24nKTtcblxuICAgICAgICAgICAgaWYgKGhvdGVsT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0VGlja2VyID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nVGlja2VyICYmIHRoaXMucGVuZGluZ1RpY2tlcj8udHJpbSgpICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnBlbmRpbmdUaWNrZXIudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiAnYWxsLWhvdGVscyc7XG5cbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9uVG9DbGljazogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIC8vIDIuIEJ1c2NhbW9zIGxhIG9wY2nDs24gZGUgaG90ZWwgcmVhbCBxdWUgY29pbmNpZGEgY29uIGVsIHRpY2tlclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaG90ZWxPcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdCA9IGhvdGVsT3B0aW9uc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0SWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0LmdldEF0dHJpYnV0ZSgnZGF0YS1ob3RlbC1pZCcpPy50b0xvd2VyQ2FzZSgpIHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIENvaW5jaWRlbmNpYSBleGFjdGEgbyBwYXJjaWFsIChwb3Igc2kgZWwgd2lkZ2V0IGxlIGHDsWFkZSBzdWZpam9zIGFsIElEKVxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRJZCA9PT0gdGFyZ2V0VGlja2VyIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRJZC5pbmNsdWRlcyh0YXJnZXRUaWNrZXIpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uVG9DbGljayA9IG9wdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvblRvQ2xpY2spIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uVG9DbGljay5jbGljaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQcO6biBubyBzZSBoYW4gZGlidWphZG8gbGFzIG9wY2lvbmVzLCBlbCBtb3RvciBzaWd1ZSBjYXJnYW5kby4uLlxuICAgICAgICAgICAgICAgIHRoaXMucmV0cnlUaW1lb3V0ID0gc2V0VGltZW91dChcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy50cmlnZ2VyV2lkZ2V0VXBkYXRlKCksXG4gICAgICAgICAgICAgICAgICAgIDMwMFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
|
|
436
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFieWxvbi1ib29raW5nLXdpZGdldC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYWJ5bG9uL3NyYy9saWIvY29tcG9uZW50cy9jb3JlL2JhYnlsb24tYm9va2luZy13aWRnZXQvYmFieWxvbi1ib29raW5nLXdpZGdldC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUNILGVBQWUsRUFDZixTQUFTLEVBRVQsTUFBTSxFQUNOLEtBQUssRUFHTCxXQUFXLEVBRVgsU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDOzs7QUFXdkIsSUFBSSxtQkFBbUIsR0FBeUIsSUFBSSxDQUFDO0FBRXJELFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDekIsSUFBSSxtQkFBbUI7UUFBRSxPQUFPLG1CQUFtQixDQUFDO0lBRXBELG1CQUFtQixHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3hELDJCQUEyQjtRQUMzQixJQUFJLE1BQU0sQ0FBQyxZQUFZLElBQUksTUFBTSxDQUFDLHNCQUFzQixFQUFFO1lBQ3RELE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTztTQUNWO1FBRUQsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNaLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUNiLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENB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QkE0Q1EsTUFBTTsyQkFBQyxXQUFXOzZHQXpDdkIsZUFBZTtzQkFEZCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHckMsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYWZ0ZXJOZXh0UmVuZGVyLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIFBMQVRGT1JNX0lELFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhYnlsb25XaWRnZXRTZWFyY2hMb2FkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYmFieWxvbi13aWRnZXQtc2VhcmNoLWxvYWRlci5zZXJ2aWNlJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBXaWRnZXRTZWFyY2g6IGFueTtcbiAgICAgICAgaW5pdGlhbGl6ZVdpZGdldFNlYXJjaD86ICgpID0+IHZvaWQ7XG4gICAgICAgIGdldFdpZGdldEluc3RhbmNlPzogKGlkOiBzdHJpbmcpID0+IGFueTtcbiAgICB9XG59XG5cbmxldCB3aWRnZXRTY3JpcHRQcm9taXNlOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGxvYWRPbmNlKHNyYzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHdpZGdldFNjcmlwdFByb21pc2UpIHJldHVybiB3aWRnZXRTY3JpcHRQcm9taXNlO1xuXG4gICAgd2lkZ2V0U2NyaXB0UHJvbWlzZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgLy8gU2kgeWEgZXhpc3RlLCByZXNvbHZlbW9zXG4gICAgICAgIGlmICh3aW5kb3cuV2lkZ2V0U2VhcmNoIHx8IHdpbmRvdy5pbml0aWFsaXplV2lkZ2V0U2VhcmNoKSB7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIHMuc3JjID0gc3JjO1xuICAgICAgICBzLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgcy5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHMub25lcnJvciA9ICgpID0+XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdObyBzZSBwdWRvIGNhcmdhciBlbCBzY3JpcHQgZGVsIHdpZGdldCcpKTtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB3aWRnZXRTY3JpcHRQcm9taXNlO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1iYWJ5bG9uLWJvb2tpbmctd2lkZ2V0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICN3aWRnZXRDb250YWluZXJcbiAgICAgICAgICAgIFtpZF09XCJ3aWRnZXRJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWJvb2staWRdPVwiaG90ZWxJZFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWhvdGVsXT1cInRpY2tlclwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXR5cGVdPVwidHlwZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWVuZ2luZV09XCJlbmdpbmVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS10aGVtZV09XCJ0aGVtZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWN1cnJlbmN5XT1cImN1cnJlbmN5XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWxheW91dF09XCJsYXlvdXRcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1sYXlvdXQtY29sdW1uXT1cImxheW91dENvbHVtblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWRlZmF1bHQtYWR1bHRzXT1cImRlZmF1bHRBZHVsdHNcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kZWZhdWx0LWp1bmlvcl09XCJkZWZhdWx0SnVuaW9yXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtZGVmYXVsdC1jaGlsZHJlbl09XCJkZWZhdWx0Q2hpbGRyZW5cIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zaG93LXByaWNlXT1cInNob3dQcmljZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctaG90ZWwtc2VsZWN0b3JdPVwic2hvd0hvdGVsU2VsZWN0b3JcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1zaG93LXByb21vLWNvZGVdPVwic2hvd1Byb21vQ29kZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctY2hpbGQtYWdlc109XCJzaG93Q2hpbGRBZ2VzXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWF4LWNoaWxkcmVuXT1cIm1heENoaWxkcmVuXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWF4LWp1bmlvcl09XCJtYXhKdW5pb3JcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1iYXNlLXVybF09XCJiYXNlVXJsXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdXJsLWNoYWluXT1cInVybENoYWluXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtdXJsLWhvdGVsXT1cInVybEhvdGVsXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtYnV0dG9uLXRleHRdPVwiYnV0dG9uVGV4dFwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1heC1yb29tc109XCJtYXhSb29tc1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXNob3ctYWxsLWhvdGVscy1vcHRpb25dPVwic2hvd0FsbEhvdGVsc09wdGlvblwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXRhcmdldC1ibGFua109XCJ0YXJnZXRCbGFua1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWhvdGVsLXRleHRdPVwiaG90ZWxUZXh0XCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtbWluLWRhdGVdPVwibWluRGF0ZVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLW1heC1kYXRlXT1cIm1heERhdGVcIlxuICAgICAgICAgICAgW2F0dHIuZGF0YS1kaXNwbGF5LW1vbnRoc109XCJtb250aHNUb0Rpc3BsYXlcIlxuICAgICAgICA+PC9kaXY+XG4gICAgYCxcbn0pXG5leHBvcnQgY2xhc3MgQmFieWxvbkJvb2tpbmdXaWRnZXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIEBWaWV3Q2hpbGQoJ3dpZGdldENvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlIH0pXG4gICAgd2lkZ2V0Q29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgICBASW5wdXQoKSB3aWRnZXRJZCA9ICd3aWRnZXQtc2VhcmNoJztcbiAgICBASW5wdXQoKSBob3RlbElkID0gJ2FsZWNhZCc7XG4gICAgQElucHV0KCkgdGlja2VyID0gJ2hvdGVsbWFyaXN0ZWwuY29tJztcbiAgICBASW5wdXQoKSB0eXBlOiAnY2hhaW4nIHwgJ2hvdGVsJyB8IHN0cmluZyA9ICdjaGFpbic7XG4gICAgQElucHV0KCkgZW5naW5lOiAnd2l0Ym9va2luZycgfCAncm9pYmFjaycgfCBzdHJpbmcgPSAnd2l0Ym9va2luZyc7XG4gICAgQElucHV0KCkgdGhlbWU6ICdsaWdodCcgfCAnZGFyaycgfCBzdHJpbmcgPSAnbGlnaHQnO1xuICAgIEBJbnB1dCgpIGN1cnJlbmN5ID0gJ0VVUic7XG4gICAgQElucHV0KCkgbG9jYWxlPzogc3RyaW5nID0gJ2VzLUVTJztcbiAgICBASW5wdXQoKSBsYXlvdXQ6ICdpbmxpbmUnIHwgJ2NvbHVtbicgfCBzdHJpbmcgPSAnaW5saW5lJztcbiAgICBASW5wdXQoKSBkZWZhdWx0QWR1bHRzID0gMjtcbiAgICBASW5wdXQoKSBkZWZhdWx0Q2hpbGRyZW4gPSAwO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRKdW5pb3IgPSAwO1xuICAgIEBJbnB1dCgpIHNob3dQcmljZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNob3dIb3RlbFNlbGVjdG9yID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93UHJvbW9Db2RlID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBzaG93Q2hpbGRBZ2VzID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBtYXhDaGlsZHJlbj86IG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXhKdW5pb3I/OiBudW1iZXI7XG4gICAgQElucHV0KCkgYmFzZVVybD86IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmxDaGFpbj86IHN0cmluZztcbiAgICBASW5wdXQoKSB1cmxIb3RlbCA9ICdob3RlbCc7XG4gICAgQElucHV0KCkgYnV0dG9uVGV4dD86IHN0cmluZztcbiAgICBASW5wdXQoKSBsYXlvdXRDb2x1bW4/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4Um9vbXM/OiBzdHJpbmc7XG4gICAgQElucHV0KCkgc2hvd0FsbEhvdGVsc09wdGlvbj86IHN0cmluZztcbiAgICBASW5wdXQoKSB0YXJnZXRCbGFuaz86IGJvb2xlYW47XG4gICAgQElucHV0KCkgaG90ZWxUZXh0Pzogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1heERhdGU/OiBzdHJpbmc7IC8qIDIwMjgtMDEtMDEgKi9cbiAgICBASW5wdXQoKSBtaW5EYXRlPzogc3RyaW5nOyAvKiAyMDI4LTAxLTAxICovXG5cbiAgICBASW5wdXQoKSBmbGFnVGltZT86IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIG1vbnRoc1RvRGlzcGxheT86IG51bWJlciA9IDE7XG5cbiAgICBwcml2YXRlIG1vdW50ZWQgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcGVuZGluZ1RpY2tlcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgcHJpdmF0ZSByZXRyeVRpbWVvdXQ6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IG9iamVjdCxcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgICAgIHByaXZhdGUgbG9hZGVyOiBCYWJ5bG9uV2lkZ2V0U2VhcmNoTG9hZGVyU2VydmljZVxuICAgICkge1xuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpKSByZXR1cm47XG5cbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1dhaXQgZm9yIGlucHV0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubW91bnRlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyDirIfvuI8gUE9OIEFRVcONIGxhIFVSTCByZWFsIGRlbCBzY3JpcHQgZGUgV2l0Ym9va2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkZXIubG9hZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdW50KCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGhpcy5mbGFnVGltZSA/IDMwMCA6IDBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbW91bnQoKSB7XG4gICAgICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5tb3VudGVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbCA9IHRoaXMud2lkZ2V0Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gT3BjacOzbiBBIChzaSBleGlzdGUpOiBpbml0IGdsb2JhbCBtYW51YWxcbiAgICAgICAgaWYgKHdpbmRvdy5pbml0aWFsaXplV2lkZ2V0U2VhcmNoKSB7XG4gICAgICAgICAgICB3aW5kb3cuaW5pdGlhbGl6ZVdpZGdldFNlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIE9wY2nDs24gQjogY29uc3RydWN0b3IgKFNvbG8gZW50cmEgc2kgbm8gZXhpc3RlIGxhIEEpXG4gICAgICAgIGVsc2UgaWYgKHdpbmRvdy5XaWRnZXRTZWFyY2gpIHtcbiAgICAgICAgICAgIG5ldyB3aW5kb3cuV2lkZ2V0U2VhcmNoKGVsLCB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluamVjdE1hcmtldGluZ1BhcmFtcyhlbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmplY3RNYXJrZXRpbmdQYXJhbXMoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgLy8gUFJPVEVDQ0nDk04gU1NSXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2Ygc2Vzc2lvblN0b3JhZ2UgPT09ICd1bmRlZmluZWQnXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBDTElDS19JRFMgPSBbXG4gICAgICAgICAgICAnZ2NsaWQnLFxuICAgICAgICAgICAgJ2dicmFpZCcsXG4gICAgICAgICAgICAnd2JyYWlkJyxcbiAgICAgICAgICAgICdkY2xpZCcsXG4gICAgICAgICAgICAnbXNjbGtpZCcsXG4gICAgICAgICAgICAndm1jaWQnLFxuICAgICAgICAgICAgJ3ljbGlkJyxcbiAgICAgICAgICAgICd5bWNsaWQnLFxuICAgICAgICAgICAgJ2ZiY2xpZCcsXG4gICAgICAgICAgICAndHRjbGlkJyxcbiAgICAgICAgICAgICdsaV9mYXRfaWQnLFxuICAgICAgICAgICAgJ3R3Y2xpZCcsXG4gICAgICAgICAgICAnZXBpaycsXG4gICAgICAgICAgICAncmR0X2NpZCcsXG4gICAgICAgICAgICAnU2NDaWQnLFxuICAgICAgICAgICAgJ3FjbGlkJyxcbiAgICAgICAgICAgICdzaScsXG4gICAgICAgICAgICAnYXdjbGlkJyxcbiAgICAgICAgICAgICd0YmxjaScsXG4gICAgICAgICAgICAnZGljYm8nLFxuICAgICAgICAgICAgJ2FkX2lkJyxcbiAgICAgICAgICAgICdpcmNsaWNraWQnLFxuICAgICAgICAgICAgJ2NqZXZlbnQnLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBVVE1TID0gW1xuICAgICAgICAgICAgJ3V0bV9zb3VyY2UnLFxuICAgICAgICAgICAgJ3V0bV9tZWRpdW0nLFxuICAgICAgICAgICAgJ3V0bV9jYW1wYWlnbicsXG4gICAgICAgICAgICAndXRtX3Rlcm0nLFxuICAgICAgICAgICAgJ3V0bV9jb250ZW50JyxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCBtYXJrZXRpbmdEYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XG5cbiAgICAgICAgLy8gLS0tIENBUEEgMTogVVJMIC0tLVxuICAgICAgICBbLi4uQ0xJQ0tfSURTLCAuLi5VVE1TLCAnb3JpZ2luJ10uZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkgbWFya2V0aW5nRGF0YVtrZXldID0gdmFsdWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIC0tLSBDQVBBIDI6IENPT0tJRVMgLS0tXG4gICAgICAgIGNvbnN0IGdldENvb2tpZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gZG9jdW1lbnQuY29va2llLm1hdGNoKFxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoJyhefCApJyArIG5hbWUgKyAnPShbXjtdKyknKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiBtYXRjaCA/IG1hdGNoWzJdIDogbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMobWFya2V0aW5nRGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBnY2xBdyA9IGdldENvb2tpZSgnX2djbF9hdycpO1xuICAgICAgICAgICAgaWYgKGdjbEF3ICYmIGdjbEF3LnNwbGl0KCcuJykubGVuZ3RoID49IDMpXG4gICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnZ2NsaWQnXSA9IGdjbEF3LnNwbGl0KCcuJylbMl07XG5cbiAgICAgICAgICAgIGNvbnN0IGZicCA9IGdldENvb2tpZSgnX2ZicCcpO1xuICAgICAgICAgICAgaWYgKGZicCkgbWFya2V0aW5nRGF0YVsnZmJjbGlkJ10gPSBmYnA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAtLS0gQ0FQQSAzOiBEQVRBTEFZRVIgLS0tXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgKHdpbmRvdyBhcyBhbnkpLmRhdGFMYXllclxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IGRsID0gKHdpbmRvdyBhcyBhbnkpLmRhdGFMYXllciBhcyBhbnlbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBkbC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkbFtpXTtcbiAgICAgICAgICAgICAgICBbLi4uQ0xJQ0tfSURTLCAuLi5VVE1TLCAndHJhZmZpY19zb3VyY2UnLCAnb3JpZ2luJ10uZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1ba2V5XSAmJiAhbWFya2V0aW5nRGF0YVtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluYWxLZXkgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICd0cmFmZmljX3NvdXJjZScgPyAnb3JpZ2luJyA6IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhW2ZpbmFsS2V5XSA9IGl0ZW1ba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA+IDApIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gLS0tIENBUEEgNDogUkVDVVBFUkFSIERFIFNFU0nDk04gTyBERVRFUk1JTkFSIE9SR8OBTklDTyAtLS1cbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG1hcmtldGluZ0RhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgLy8gSW50ZW50YXIgcmVjdXBlcmFyIGRlIG5hdmVnYWNpb25lcyBhbnRlcmlvcmVzXG4gICAgICAgICAgICBjb25zdCBzdG9yZWRLZXlzID0gT2JqZWN0LmtleXMoc2Vzc2lvblN0b3JhZ2UpLmZpbHRlcigoaykgPT5cbiAgICAgICAgICAgICAgICBrLnN0YXJ0c1dpdGgoJ21rdF8nKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHN0b3JlZEtleXMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsS2V5ID0gay5yZXBsYWNlKCdta3RfJywgJycpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oayk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCkgbWFya2V0aW5nRGF0YVtvcmlnaW5hbEtleV0gPSB2YWw7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gU2kgZGVzcHXDqXMgZGUgYnVzY2FyIGVuIHNlc2nDs24gc2lndWUgdmFjw61vLCBlcyBUUsOBRklDTyBOVUVWTyBTSU4gQ0FNUEHDkUFTLlxuICAgICAgICAgICAgLy8gQXF1w60gYXZlcmlndWFtb3MgZWwgb3JpZ2VuIG9yZ8OhbmljbyBwYXJhIHBvZGVyIEdVQVJEQVJMTyBlbiBlbCBzaWd1aWVudGUgcGFzby5cbiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhtYXJrZXRpbmdEYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZlcnJlciA9IGRvY3VtZW50LnJlZmVycmVyXG4gICAgICAgICAgICAgICAgICAgID8gZG9jdW1lbnQucmVmZXJyZXIudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICA6ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZmVycmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWZlcnJlci5pbmNsdWRlcygnZ29vZ2xlLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnZ29vZ2xlX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnYmluZy4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2Jpbmdfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCd5YWhvby4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3lhaG9vX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnZHVja2R1Y2tnby4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2R1Y2tkdWNrZ29fb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCd5YW5kZXguJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICd5YW5kZXhfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlZmVycmVyLmluY2x1ZGVzKCdiYWlkdS4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2JhaWR1X29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygnZWNvc2lhLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnZWNvc2lhX29yZ2FuaWMnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZWZlcnJlci5pbmNsdWRlcygncXdhbnQuJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdxd2FudF9vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ2Fzay4nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ2Fza19vcmdhbmljJztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVmZXJyZXIuaW5jbHVkZXMoJ25hdmVyLicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAnbmF2ZXJfb3JnYW5pYyc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgbWFya2V0aW5nRGF0YVsnb3JpZ2luJ10gPSAncmVmZXJyYWxfb3RoZXInO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3dlYic7IC8vIFRyw6FmaWNvIGRpcmVjdG9cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTaSBjYXB0dXJhbW9zIGRhdG9zIG51ZXZvcyAoVVJMLCBDb29raWVzLCBHVE0pIHBlcm8gbm8gdHJhZW4gXCJvcmlnaW5cIiwgc2UgbG8gYXNpZ25hbW9zXG4gICAgICAgICAgICBpZiAoIW1hcmtldGluZ0RhdGFbJ29yaWdpbiddKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1hcmtldGluZ0RhdGFbJ3V0bV9zb3VyY2UnXSkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWyd1dG1fc291cmNlJ10gK1xuICAgICAgICAgICAgICAgICAgICAgICAgKG1hcmtldGluZ0RhdGFbJ3V0bV9tZWRpdW0nXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYF8ke21hcmtldGluZ0RhdGFbJ3V0bV9tZWRpdW0nXX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWFya2V0aW5nRGF0YVsnZ2NsaWQnXSB8fFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWyd3YnJhaWQnXSB8fFxuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydnYnJhaWQnXVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZXRpbmdEYXRhWydvcmlnaW4nXSA9ICdnb29nbGVfY3BjJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtldGluZ0RhdGFbJ2ZiY2xpZCddKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ21ldGFfYWRzJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtldGluZ0RhdGFbJ3R0Y2xpZCddKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmtldGluZ0RhdGFbJ29yaWdpbiddID0gJ3Rpa3Rva19hZHMnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC0tLSBDQVBBIDU6IEdVQVJEQVIgU0lFTVBSRSBFTiBTRVNTSU9OIFNUT1JBR0UgLS0tXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhtYXJrZXRpbmdEYXRhKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGBta3RfJHtrZXl9YCwgdmFsdWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7fVxuXG4gICAgICAgIC8vIC0tLSBFTlbDjU8gQUwgV0lER0VUIC0tLVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCd3aWRnZXRVcGRhdGVQYXJhbXMnLCB7XG4gICAgICAgICAgICAgICAgZGV0YWlsOiBtYXJrZXRpbmdEYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXNbJ3RpY2tlciddKSB7XG4gICAgICAgICAgICAvLyBHdWFyZGFtb3Mgc2llbXByZSBlbCDDmkxUSU1PIHZhbG9yIHF1ZSBBbmd1bGFyIG5vcyBtYW5kZVxuICAgICAgICAgICAgdGhpcy5wZW5kaW5nVGlja2VyID0gY2hhbmdlc1sndGlja2VyJ10uY3VycmVudFZhbHVlIHx8ICdhbGwtaG90ZWxzJztcblxuICAgICAgICAgICAgLy8gRGlzcGFyYW1vcyBsYSBhY3R1YWxpemFjacOzblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyV2lkZ2V0VXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMucmV0cnlUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmlnZ2VyV2lkZ2V0VXBkYXRlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucmV0cnlUaW1lb3V0KSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVvdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy53aWRnZXRDb250YWluZXJcbiAgICAgICAgICAgICAgICA/Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lckVsKSByZXR1cm47XG5cbiAgICAgICAgICAgIC8vIDEuIEVzcGVyYW1vcyBhIHF1ZSBlbCB3aWRnZXQgaGF5YSBkZXNjYXJnYWRvIHkgZGlidWphZG8gbG9zIGhvdGVsZXMgZW4gZWwgRE9NXG4gICAgICAgICAgICBjb25zdCBob3RlbE9wdGlvbnMgPSBjb250YWluZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCcuaG90ZWwtb3B0aW9uJyk7XG5cbiAgICAgICAgICAgIGlmIChob3RlbE9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldFRpY2tlciA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ1RpY2tlciAmJiB0aGlzLnBlbmRpbmdUaWNrZXI/LnRyaW0oKSAhPT0gJydcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5wZW5kaW5nVGlja2VyLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2FsbC1ob3RlbHMnO1xuXG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvblRvQ2xpY2s6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAvLyAyLiBCdXNjYW1vcyBsYSBvcGNpw7NuIGRlIGhvdGVsIHJlYWwgcXVlIGNvaW5jaWRhIGNvbiBlbCB0aWNrZXJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhvdGVsT3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHQgPSBob3RlbE9wdGlvbnNbaV0gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdElkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaG90ZWwtaWQnKT8udG9Mb3dlckNhc2UoKSB8fCAnJztcblxuICAgICAgICAgICAgICAgICAgICAvLyBDb2luY2lkZW5jaWEgZXhhY3RhIG8gcGFyY2lhbCAocG9yIHNpIGVsIHdpZGdldCBsZSBhw7FhZGUgc3VmaWpvcyBhbCBJRClcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0SWQgPT09IHRhcmdldFRpY2tlciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgb3B0SWQuaW5jbHVkZXModGFyZ2V0VGlja2VyKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvblRvQ2xpY2sgPSBvcHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25Ub0NsaWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvblRvQ2xpY2suY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEHDum4gbm8gc2UgaGFuIGRpYnVqYWRvIGxhcyBvcGNpb25lcywgZWwgbW90b3Igc2lndWUgY2FyZ2FuZG8uLi5cbiAgICAgICAgICAgICAgICB0aGlzLnJldHJ5VGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMudHJpZ2dlcldpZGdldFVwZGF0ZSgpLFxuICAgICAgICAgICAgICAgICAgICAzMDBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|