@hanzo/browser-extension 1.9.31 → 1.9.33
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/package.json +2 -1
- package/src/answer/AnswerEngine.tsx +553 -0
- package/src/manifest-firefox.json +10 -2
- package/src/manifest.json +17 -2
- package/src/newtab.css +277 -0
- package/src/newtab.html +13 -0
- package/src/popup.html +28 -0
- package/dist/browser-extension/README.md +0 -43
- package/dist/browser-extension/background-firefox.js +0 -4556
- package/dist/browser-extension/background.js +0 -7245
- package/dist/browser-extension/browser-control.js +0 -1317
- package/dist/browser-extension/chrome/ai-worker.js +0 -571
- package/dist/browser-extension/chrome/background.js +0 -7245
- package/dist/browser-extension/chrome/callback.html +0 -17
- package/dist/browser-extension/chrome/content-script.js +0 -2789
- package/dist/browser-extension/chrome/icon128.png +0 -0
- package/dist/browser-extension/chrome/icon16.png +0 -0
- package/dist/browser-extension/chrome/icon48.png +0 -0
- package/dist/browser-extension/chrome/manifest.json +0 -66
- package/dist/browser-extension/chrome/popup.css +0 -761
- package/dist/browser-extension/chrome/popup.html +0 -353
- package/dist/browser-extension/chrome/popup.js +0 -1650
- package/dist/browser-extension/chrome/sidebar.css +0 -1792
- package/dist/browser-extension/chrome/sidebar.html +0 -463
- package/dist/browser-extension/chrome/sidebar.js +0 -26541
- package/dist/browser-extension/cli.js +0 -233
- package/dist/browser-extension/firefox/ai-worker.js +0 -571
- package/dist/browser-extension/firefox/background.js +0 -4556
- package/dist/browser-extension/firefox/callback.html +0 -17
- package/dist/browser-extension/firefox/content-script.js +0 -2789
- package/dist/browser-extension/firefox/icon128.png +0 -0
- package/dist/browser-extension/firefox/icon16.png +0 -0
- package/dist/browser-extension/firefox/icon48.png +0 -0
- package/dist/browser-extension/firefox/manifest.json +0 -77
- package/dist/browser-extension/firefox/popup.css +0 -761
- package/dist/browser-extension/firefox/popup.html +0 -353
- package/dist/browser-extension/firefox/popup.js +0 -1650
- package/dist/browser-extension/firefox/sidebar.css +0 -1792
- package/dist/browser-extension/firefox/sidebar.html +0 -463
- package/dist/browser-extension/firefox/sidebar.js +0 -26541
- package/dist/browser-extension/icon128.png +0 -0
- package/dist/browser-extension/icon16.png +0 -0
- package/dist/browser-extension/icon48.png +0 -0
- package/dist/browser-extension/manifest.json +0 -66
- package/dist/browser-extension/package.json +0 -41
- package/dist/browser-extension/popup.js +0 -1650
- package/dist/browser-extension/safari/Info.plist +0 -21
- package/dist/browser-extension/safari/ai-worker.js +0 -571
- package/dist/browser-extension/safari/background.js +0 -7245
- package/dist/browser-extension/safari/callback.html +0 -17
- package/dist/browser-extension/safari/content-script.js +0 -2789
- package/dist/browser-extension/safari/icon128.png +0 -0
- package/dist/browser-extension/safari/icon16.png +0 -0
- package/dist/browser-extension/safari/icon48.png +0 -0
- package/dist/browser-extension/safari/popup.css +0 -761
- package/dist/browser-extension/safari/popup.html +0 -353
- package/dist/browser-extension/safari/popup.js +0 -1650
- package/dist/browser-extension/safari/sidebar.css +0 -1792
- package/dist/browser-extension/safari/sidebar.html +0 -463
- package/dist/browser-extension/safari/sidebar.js +0 -26541
- package/dist/browser-extension/sidebar.js +0 -26541
- package/dist/browser-extension/webgpu-ai.js +0 -568
|
@@ -1,2789 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
(() => {
|
|
3
|
-
var __create = Object.create;
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __commonJS = (cb, mod) => function __require() {
|
|
10
|
-
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
11
|
-
};
|
|
12
|
-
var __copyProps = (to, from, except, desc) => {
|
|
13
|
-
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
-
for (let key of __getOwnPropNames(from))
|
|
15
|
-
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
-
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
-
}
|
|
18
|
-
return to;
|
|
19
|
-
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
|
-
|
|
29
|
-
// ../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js
|
|
30
|
-
var require_browser_polyfill = __commonJS({
|
|
31
|
-
"../../node_modules/.pnpm/webextension-polyfill@0.12.0/node_modules/webextension-polyfill/dist/browser-polyfill.js"(exports, module) {
|
|
32
|
-
(function(global, factory) {
|
|
33
|
-
if (typeof define === "function" && define.amd) {
|
|
34
|
-
define("webextension-polyfill", ["module"], factory);
|
|
35
|
-
} else if (typeof exports !== "undefined") {
|
|
36
|
-
factory(module);
|
|
37
|
-
} else {
|
|
38
|
-
var mod = {
|
|
39
|
-
exports: {}
|
|
40
|
-
};
|
|
41
|
-
factory(mod);
|
|
42
|
-
global.browser = mod.exports;
|
|
43
|
-
}
|
|
44
|
-
})(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : exports, function(module2) {
|
|
45
|
-
"use strict";
|
|
46
|
-
if (!(globalThis.chrome && globalThis.chrome.runtime && globalThis.chrome.runtime.id)) {
|
|
47
|
-
throw new Error("This script should only be loaded in a browser extension.");
|
|
48
|
-
}
|
|
49
|
-
if (!(globalThis.browser && globalThis.browser.runtime && globalThis.browser.runtime.id)) {
|
|
50
|
-
const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received.";
|
|
51
|
-
const wrapAPIs = (extensionAPIs) => {
|
|
52
|
-
const apiMetadata = {
|
|
53
|
-
"alarms": {
|
|
54
|
-
"clear": {
|
|
55
|
-
"minArgs": 0,
|
|
56
|
-
"maxArgs": 1
|
|
57
|
-
},
|
|
58
|
-
"clearAll": {
|
|
59
|
-
"minArgs": 0,
|
|
60
|
-
"maxArgs": 0
|
|
61
|
-
},
|
|
62
|
-
"get": {
|
|
63
|
-
"minArgs": 0,
|
|
64
|
-
"maxArgs": 1
|
|
65
|
-
},
|
|
66
|
-
"getAll": {
|
|
67
|
-
"minArgs": 0,
|
|
68
|
-
"maxArgs": 0
|
|
69
|
-
}
|
|
70
|
-
},
|
|
71
|
-
"bookmarks": {
|
|
72
|
-
"create": {
|
|
73
|
-
"minArgs": 1,
|
|
74
|
-
"maxArgs": 1
|
|
75
|
-
},
|
|
76
|
-
"get": {
|
|
77
|
-
"minArgs": 1,
|
|
78
|
-
"maxArgs": 1
|
|
79
|
-
},
|
|
80
|
-
"getChildren": {
|
|
81
|
-
"minArgs": 1,
|
|
82
|
-
"maxArgs": 1
|
|
83
|
-
},
|
|
84
|
-
"getRecent": {
|
|
85
|
-
"minArgs": 1,
|
|
86
|
-
"maxArgs": 1
|
|
87
|
-
},
|
|
88
|
-
"getSubTree": {
|
|
89
|
-
"minArgs": 1,
|
|
90
|
-
"maxArgs": 1
|
|
91
|
-
},
|
|
92
|
-
"getTree": {
|
|
93
|
-
"minArgs": 0,
|
|
94
|
-
"maxArgs": 0
|
|
95
|
-
},
|
|
96
|
-
"move": {
|
|
97
|
-
"minArgs": 2,
|
|
98
|
-
"maxArgs": 2
|
|
99
|
-
},
|
|
100
|
-
"remove": {
|
|
101
|
-
"minArgs": 1,
|
|
102
|
-
"maxArgs": 1
|
|
103
|
-
},
|
|
104
|
-
"removeTree": {
|
|
105
|
-
"minArgs": 1,
|
|
106
|
-
"maxArgs": 1
|
|
107
|
-
},
|
|
108
|
-
"search": {
|
|
109
|
-
"minArgs": 1,
|
|
110
|
-
"maxArgs": 1
|
|
111
|
-
},
|
|
112
|
-
"update": {
|
|
113
|
-
"minArgs": 2,
|
|
114
|
-
"maxArgs": 2
|
|
115
|
-
}
|
|
116
|
-
},
|
|
117
|
-
"browserAction": {
|
|
118
|
-
"disable": {
|
|
119
|
-
"minArgs": 0,
|
|
120
|
-
"maxArgs": 1,
|
|
121
|
-
"fallbackToNoCallback": true
|
|
122
|
-
},
|
|
123
|
-
"enable": {
|
|
124
|
-
"minArgs": 0,
|
|
125
|
-
"maxArgs": 1,
|
|
126
|
-
"fallbackToNoCallback": true
|
|
127
|
-
},
|
|
128
|
-
"getBadgeBackgroundColor": {
|
|
129
|
-
"minArgs": 1,
|
|
130
|
-
"maxArgs": 1
|
|
131
|
-
},
|
|
132
|
-
"getBadgeText": {
|
|
133
|
-
"minArgs": 1,
|
|
134
|
-
"maxArgs": 1
|
|
135
|
-
},
|
|
136
|
-
"getPopup": {
|
|
137
|
-
"minArgs": 1,
|
|
138
|
-
"maxArgs": 1
|
|
139
|
-
},
|
|
140
|
-
"getTitle": {
|
|
141
|
-
"minArgs": 1,
|
|
142
|
-
"maxArgs": 1
|
|
143
|
-
},
|
|
144
|
-
"openPopup": {
|
|
145
|
-
"minArgs": 0,
|
|
146
|
-
"maxArgs": 0
|
|
147
|
-
},
|
|
148
|
-
"setBadgeBackgroundColor": {
|
|
149
|
-
"minArgs": 1,
|
|
150
|
-
"maxArgs": 1,
|
|
151
|
-
"fallbackToNoCallback": true
|
|
152
|
-
},
|
|
153
|
-
"setBadgeText": {
|
|
154
|
-
"minArgs": 1,
|
|
155
|
-
"maxArgs": 1,
|
|
156
|
-
"fallbackToNoCallback": true
|
|
157
|
-
},
|
|
158
|
-
"setIcon": {
|
|
159
|
-
"minArgs": 1,
|
|
160
|
-
"maxArgs": 1
|
|
161
|
-
},
|
|
162
|
-
"setPopup": {
|
|
163
|
-
"minArgs": 1,
|
|
164
|
-
"maxArgs": 1,
|
|
165
|
-
"fallbackToNoCallback": true
|
|
166
|
-
},
|
|
167
|
-
"setTitle": {
|
|
168
|
-
"minArgs": 1,
|
|
169
|
-
"maxArgs": 1,
|
|
170
|
-
"fallbackToNoCallback": true
|
|
171
|
-
}
|
|
172
|
-
},
|
|
173
|
-
"browsingData": {
|
|
174
|
-
"remove": {
|
|
175
|
-
"minArgs": 2,
|
|
176
|
-
"maxArgs": 2
|
|
177
|
-
},
|
|
178
|
-
"removeCache": {
|
|
179
|
-
"minArgs": 1,
|
|
180
|
-
"maxArgs": 1
|
|
181
|
-
},
|
|
182
|
-
"removeCookies": {
|
|
183
|
-
"minArgs": 1,
|
|
184
|
-
"maxArgs": 1
|
|
185
|
-
},
|
|
186
|
-
"removeDownloads": {
|
|
187
|
-
"minArgs": 1,
|
|
188
|
-
"maxArgs": 1
|
|
189
|
-
},
|
|
190
|
-
"removeFormData": {
|
|
191
|
-
"minArgs": 1,
|
|
192
|
-
"maxArgs": 1
|
|
193
|
-
},
|
|
194
|
-
"removeHistory": {
|
|
195
|
-
"minArgs": 1,
|
|
196
|
-
"maxArgs": 1
|
|
197
|
-
},
|
|
198
|
-
"removeLocalStorage": {
|
|
199
|
-
"minArgs": 1,
|
|
200
|
-
"maxArgs": 1
|
|
201
|
-
},
|
|
202
|
-
"removePasswords": {
|
|
203
|
-
"minArgs": 1,
|
|
204
|
-
"maxArgs": 1
|
|
205
|
-
},
|
|
206
|
-
"removePluginData": {
|
|
207
|
-
"minArgs": 1,
|
|
208
|
-
"maxArgs": 1
|
|
209
|
-
},
|
|
210
|
-
"settings": {
|
|
211
|
-
"minArgs": 0,
|
|
212
|
-
"maxArgs": 0
|
|
213
|
-
}
|
|
214
|
-
},
|
|
215
|
-
"commands": {
|
|
216
|
-
"getAll": {
|
|
217
|
-
"minArgs": 0,
|
|
218
|
-
"maxArgs": 0
|
|
219
|
-
}
|
|
220
|
-
},
|
|
221
|
-
"contextMenus": {
|
|
222
|
-
"remove": {
|
|
223
|
-
"minArgs": 1,
|
|
224
|
-
"maxArgs": 1
|
|
225
|
-
},
|
|
226
|
-
"removeAll": {
|
|
227
|
-
"minArgs": 0,
|
|
228
|
-
"maxArgs": 0
|
|
229
|
-
},
|
|
230
|
-
"update": {
|
|
231
|
-
"minArgs": 2,
|
|
232
|
-
"maxArgs": 2
|
|
233
|
-
}
|
|
234
|
-
},
|
|
235
|
-
"cookies": {
|
|
236
|
-
"get": {
|
|
237
|
-
"minArgs": 1,
|
|
238
|
-
"maxArgs": 1
|
|
239
|
-
},
|
|
240
|
-
"getAll": {
|
|
241
|
-
"minArgs": 1,
|
|
242
|
-
"maxArgs": 1
|
|
243
|
-
},
|
|
244
|
-
"getAllCookieStores": {
|
|
245
|
-
"minArgs": 0,
|
|
246
|
-
"maxArgs": 0
|
|
247
|
-
},
|
|
248
|
-
"remove": {
|
|
249
|
-
"minArgs": 1,
|
|
250
|
-
"maxArgs": 1
|
|
251
|
-
},
|
|
252
|
-
"set": {
|
|
253
|
-
"minArgs": 1,
|
|
254
|
-
"maxArgs": 1
|
|
255
|
-
}
|
|
256
|
-
},
|
|
257
|
-
"devtools": {
|
|
258
|
-
"inspectedWindow": {
|
|
259
|
-
"eval": {
|
|
260
|
-
"minArgs": 1,
|
|
261
|
-
"maxArgs": 2,
|
|
262
|
-
"singleCallbackArg": false
|
|
263
|
-
}
|
|
264
|
-
},
|
|
265
|
-
"panels": {
|
|
266
|
-
"create": {
|
|
267
|
-
"minArgs": 3,
|
|
268
|
-
"maxArgs": 3,
|
|
269
|
-
"singleCallbackArg": true
|
|
270
|
-
},
|
|
271
|
-
"elements": {
|
|
272
|
-
"createSidebarPane": {
|
|
273
|
-
"minArgs": 1,
|
|
274
|
-
"maxArgs": 1
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
},
|
|
279
|
-
"downloads": {
|
|
280
|
-
"cancel": {
|
|
281
|
-
"minArgs": 1,
|
|
282
|
-
"maxArgs": 1
|
|
283
|
-
},
|
|
284
|
-
"download": {
|
|
285
|
-
"minArgs": 1,
|
|
286
|
-
"maxArgs": 1
|
|
287
|
-
},
|
|
288
|
-
"erase": {
|
|
289
|
-
"minArgs": 1,
|
|
290
|
-
"maxArgs": 1
|
|
291
|
-
},
|
|
292
|
-
"getFileIcon": {
|
|
293
|
-
"minArgs": 1,
|
|
294
|
-
"maxArgs": 2
|
|
295
|
-
},
|
|
296
|
-
"open": {
|
|
297
|
-
"minArgs": 1,
|
|
298
|
-
"maxArgs": 1,
|
|
299
|
-
"fallbackToNoCallback": true
|
|
300
|
-
},
|
|
301
|
-
"pause": {
|
|
302
|
-
"minArgs": 1,
|
|
303
|
-
"maxArgs": 1
|
|
304
|
-
},
|
|
305
|
-
"removeFile": {
|
|
306
|
-
"minArgs": 1,
|
|
307
|
-
"maxArgs": 1
|
|
308
|
-
},
|
|
309
|
-
"resume": {
|
|
310
|
-
"minArgs": 1,
|
|
311
|
-
"maxArgs": 1
|
|
312
|
-
},
|
|
313
|
-
"search": {
|
|
314
|
-
"minArgs": 1,
|
|
315
|
-
"maxArgs": 1
|
|
316
|
-
},
|
|
317
|
-
"show": {
|
|
318
|
-
"minArgs": 1,
|
|
319
|
-
"maxArgs": 1,
|
|
320
|
-
"fallbackToNoCallback": true
|
|
321
|
-
}
|
|
322
|
-
},
|
|
323
|
-
"extension": {
|
|
324
|
-
"isAllowedFileSchemeAccess": {
|
|
325
|
-
"minArgs": 0,
|
|
326
|
-
"maxArgs": 0
|
|
327
|
-
},
|
|
328
|
-
"isAllowedIncognitoAccess": {
|
|
329
|
-
"minArgs": 0,
|
|
330
|
-
"maxArgs": 0
|
|
331
|
-
}
|
|
332
|
-
},
|
|
333
|
-
"history": {
|
|
334
|
-
"addUrl": {
|
|
335
|
-
"minArgs": 1,
|
|
336
|
-
"maxArgs": 1
|
|
337
|
-
},
|
|
338
|
-
"deleteAll": {
|
|
339
|
-
"minArgs": 0,
|
|
340
|
-
"maxArgs": 0
|
|
341
|
-
},
|
|
342
|
-
"deleteRange": {
|
|
343
|
-
"minArgs": 1,
|
|
344
|
-
"maxArgs": 1
|
|
345
|
-
},
|
|
346
|
-
"deleteUrl": {
|
|
347
|
-
"minArgs": 1,
|
|
348
|
-
"maxArgs": 1
|
|
349
|
-
},
|
|
350
|
-
"getVisits": {
|
|
351
|
-
"minArgs": 1,
|
|
352
|
-
"maxArgs": 1
|
|
353
|
-
},
|
|
354
|
-
"search": {
|
|
355
|
-
"minArgs": 1,
|
|
356
|
-
"maxArgs": 1
|
|
357
|
-
}
|
|
358
|
-
},
|
|
359
|
-
"i18n": {
|
|
360
|
-
"detectLanguage": {
|
|
361
|
-
"minArgs": 1,
|
|
362
|
-
"maxArgs": 1
|
|
363
|
-
},
|
|
364
|
-
"getAcceptLanguages": {
|
|
365
|
-
"minArgs": 0,
|
|
366
|
-
"maxArgs": 0
|
|
367
|
-
}
|
|
368
|
-
},
|
|
369
|
-
"identity": {
|
|
370
|
-
"launchWebAuthFlow": {
|
|
371
|
-
"minArgs": 1,
|
|
372
|
-
"maxArgs": 1
|
|
373
|
-
}
|
|
374
|
-
},
|
|
375
|
-
"idle": {
|
|
376
|
-
"queryState": {
|
|
377
|
-
"minArgs": 1,
|
|
378
|
-
"maxArgs": 1
|
|
379
|
-
}
|
|
380
|
-
},
|
|
381
|
-
"management": {
|
|
382
|
-
"get": {
|
|
383
|
-
"minArgs": 1,
|
|
384
|
-
"maxArgs": 1
|
|
385
|
-
},
|
|
386
|
-
"getAll": {
|
|
387
|
-
"minArgs": 0,
|
|
388
|
-
"maxArgs": 0
|
|
389
|
-
},
|
|
390
|
-
"getSelf": {
|
|
391
|
-
"minArgs": 0,
|
|
392
|
-
"maxArgs": 0
|
|
393
|
-
},
|
|
394
|
-
"setEnabled": {
|
|
395
|
-
"minArgs": 2,
|
|
396
|
-
"maxArgs": 2
|
|
397
|
-
},
|
|
398
|
-
"uninstallSelf": {
|
|
399
|
-
"minArgs": 0,
|
|
400
|
-
"maxArgs": 1
|
|
401
|
-
}
|
|
402
|
-
},
|
|
403
|
-
"notifications": {
|
|
404
|
-
"clear": {
|
|
405
|
-
"minArgs": 1,
|
|
406
|
-
"maxArgs": 1
|
|
407
|
-
},
|
|
408
|
-
"create": {
|
|
409
|
-
"minArgs": 1,
|
|
410
|
-
"maxArgs": 2
|
|
411
|
-
},
|
|
412
|
-
"getAll": {
|
|
413
|
-
"minArgs": 0,
|
|
414
|
-
"maxArgs": 0
|
|
415
|
-
},
|
|
416
|
-
"getPermissionLevel": {
|
|
417
|
-
"minArgs": 0,
|
|
418
|
-
"maxArgs": 0
|
|
419
|
-
},
|
|
420
|
-
"update": {
|
|
421
|
-
"minArgs": 2,
|
|
422
|
-
"maxArgs": 2
|
|
423
|
-
}
|
|
424
|
-
},
|
|
425
|
-
"pageAction": {
|
|
426
|
-
"getPopup": {
|
|
427
|
-
"minArgs": 1,
|
|
428
|
-
"maxArgs": 1
|
|
429
|
-
},
|
|
430
|
-
"getTitle": {
|
|
431
|
-
"minArgs": 1,
|
|
432
|
-
"maxArgs": 1
|
|
433
|
-
},
|
|
434
|
-
"hide": {
|
|
435
|
-
"minArgs": 1,
|
|
436
|
-
"maxArgs": 1,
|
|
437
|
-
"fallbackToNoCallback": true
|
|
438
|
-
},
|
|
439
|
-
"setIcon": {
|
|
440
|
-
"minArgs": 1,
|
|
441
|
-
"maxArgs": 1
|
|
442
|
-
},
|
|
443
|
-
"setPopup": {
|
|
444
|
-
"minArgs": 1,
|
|
445
|
-
"maxArgs": 1,
|
|
446
|
-
"fallbackToNoCallback": true
|
|
447
|
-
},
|
|
448
|
-
"setTitle": {
|
|
449
|
-
"minArgs": 1,
|
|
450
|
-
"maxArgs": 1,
|
|
451
|
-
"fallbackToNoCallback": true
|
|
452
|
-
},
|
|
453
|
-
"show": {
|
|
454
|
-
"minArgs": 1,
|
|
455
|
-
"maxArgs": 1,
|
|
456
|
-
"fallbackToNoCallback": true
|
|
457
|
-
}
|
|
458
|
-
},
|
|
459
|
-
"permissions": {
|
|
460
|
-
"contains": {
|
|
461
|
-
"minArgs": 1,
|
|
462
|
-
"maxArgs": 1
|
|
463
|
-
},
|
|
464
|
-
"getAll": {
|
|
465
|
-
"minArgs": 0,
|
|
466
|
-
"maxArgs": 0
|
|
467
|
-
},
|
|
468
|
-
"remove": {
|
|
469
|
-
"minArgs": 1,
|
|
470
|
-
"maxArgs": 1
|
|
471
|
-
},
|
|
472
|
-
"request": {
|
|
473
|
-
"minArgs": 1,
|
|
474
|
-
"maxArgs": 1
|
|
475
|
-
}
|
|
476
|
-
},
|
|
477
|
-
"runtime": {
|
|
478
|
-
"getBackgroundPage": {
|
|
479
|
-
"minArgs": 0,
|
|
480
|
-
"maxArgs": 0
|
|
481
|
-
},
|
|
482
|
-
"getPlatformInfo": {
|
|
483
|
-
"minArgs": 0,
|
|
484
|
-
"maxArgs": 0
|
|
485
|
-
},
|
|
486
|
-
"openOptionsPage": {
|
|
487
|
-
"minArgs": 0,
|
|
488
|
-
"maxArgs": 0
|
|
489
|
-
},
|
|
490
|
-
"requestUpdateCheck": {
|
|
491
|
-
"minArgs": 0,
|
|
492
|
-
"maxArgs": 0
|
|
493
|
-
},
|
|
494
|
-
"sendMessage": {
|
|
495
|
-
"minArgs": 1,
|
|
496
|
-
"maxArgs": 3
|
|
497
|
-
},
|
|
498
|
-
"sendNativeMessage": {
|
|
499
|
-
"minArgs": 2,
|
|
500
|
-
"maxArgs": 2
|
|
501
|
-
},
|
|
502
|
-
"setUninstallURL": {
|
|
503
|
-
"minArgs": 1,
|
|
504
|
-
"maxArgs": 1
|
|
505
|
-
}
|
|
506
|
-
},
|
|
507
|
-
"sessions": {
|
|
508
|
-
"getDevices": {
|
|
509
|
-
"minArgs": 0,
|
|
510
|
-
"maxArgs": 1
|
|
511
|
-
},
|
|
512
|
-
"getRecentlyClosed": {
|
|
513
|
-
"minArgs": 0,
|
|
514
|
-
"maxArgs": 1
|
|
515
|
-
},
|
|
516
|
-
"restore": {
|
|
517
|
-
"minArgs": 0,
|
|
518
|
-
"maxArgs": 1
|
|
519
|
-
}
|
|
520
|
-
},
|
|
521
|
-
"storage": {
|
|
522
|
-
"local": {
|
|
523
|
-
"clear": {
|
|
524
|
-
"minArgs": 0,
|
|
525
|
-
"maxArgs": 0
|
|
526
|
-
},
|
|
527
|
-
"get": {
|
|
528
|
-
"minArgs": 0,
|
|
529
|
-
"maxArgs": 1
|
|
530
|
-
},
|
|
531
|
-
"getBytesInUse": {
|
|
532
|
-
"minArgs": 0,
|
|
533
|
-
"maxArgs": 1
|
|
534
|
-
},
|
|
535
|
-
"remove": {
|
|
536
|
-
"minArgs": 1,
|
|
537
|
-
"maxArgs": 1
|
|
538
|
-
},
|
|
539
|
-
"set": {
|
|
540
|
-
"minArgs": 1,
|
|
541
|
-
"maxArgs": 1
|
|
542
|
-
}
|
|
543
|
-
},
|
|
544
|
-
"managed": {
|
|
545
|
-
"get": {
|
|
546
|
-
"minArgs": 0,
|
|
547
|
-
"maxArgs": 1
|
|
548
|
-
},
|
|
549
|
-
"getBytesInUse": {
|
|
550
|
-
"minArgs": 0,
|
|
551
|
-
"maxArgs": 1
|
|
552
|
-
}
|
|
553
|
-
},
|
|
554
|
-
"sync": {
|
|
555
|
-
"clear": {
|
|
556
|
-
"minArgs": 0,
|
|
557
|
-
"maxArgs": 0
|
|
558
|
-
},
|
|
559
|
-
"get": {
|
|
560
|
-
"minArgs": 0,
|
|
561
|
-
"maxArgs": 1
|
|
562
|
-
},
|
|
563
|
-
"getBytesInUse": {
|
|
564
|
-
"minArgs": 0,
|
|
565
|
-
"maxArgs": 1
|
|
566
|
-
},
|
|
567
|
-
"remove": {
|
|
568
|
-
"minArgs": 1,
|
|
569
|
-
"maxArgs": 1
|
|
570
|
-
},
|
|
571
|
-
"set": {
|
|
572
|
-
"minArgs": 1,
|
|
573
|
-
"maxArgs": 1
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
},
|
|
577
|
-
"tabs": {
|
|
578
|
-
"captureVisibleTab": {
|
|
579
|
-
"minArgs": 0,
|
|
580
|
-
"maxArgs": 2
|
|
581
|
-
},
|
|
582
|
-
"create": {
|
|
583
|
-
"minArgs": 1,
|
|
584
|
-
"maxArgs": 1
|
|
585
|
-
},
|
|
586
|
-
"detectLanguage": {
|
|
587
|
-
"minArgs": 0,
|
|
588
|
-
"maxArgs": 1
|
|
589
|
-
},
|
|
590
|
-
"discard": {
|
|
591
|
-
"minArgs": 0,
|
|
592
|
-
"maxArgs": 1
|
|
593
|
-
},
|
|
594
|
-
"duplicate": {
|
|
595
|
-
"minArgs": 1,
|
|
596
|
-
"maxArgs": 1
|
|
597
|
-
},
|
|
598
|
-
"executeScript": {
|
|
599
|
-
"minArgs": 1,
|
|
600
|
-
"maxArgs": 2
|
|
601
|
-
},
|
|
602
|
-
"get": {
|
|
603
|
-
"minArgs": 1,
|
|
604
|
-
"maxArgs": 1
|
|
605
|
-
},
|
|
606
|
-
"getCurrent": {
|
|
607
|
-
"minArgs": 0,
|
|
608
|
-
"maxArgs": 0
|
|
609
|
-
},
|
|
610
|
-
"getZoom": {
|
|
611
|
-
"minArgs": 0,
|
|
612
|
-
"maxArgs": 1
|
|
613
|
-
},
|
|
614
|
-
"getZoomSettings": {
|
|
615
|
-
"minArgs": 0,
|
|
616
|
-
"maxArgs": 1
|
|
617
|
-
},
|
|
618
|
-
"goBack": {
|
|
619
|
-
"minArgs": 0,
|
|
620
|
-
"maxArgs": 1
|
|
621
|
-
},
|
|
622
|
-
"goForward": {
|
|
623
|
-
"minArgs": 0,
|
|
624
|
-
"maxArgs": 1
|
|
625
|
-
},
|
|
626
|
-
"highlight": {
|
|
627
|
-
"minArgs": 1,
|
|
628
|
-
"maxArgs": 1
|
|
629
|
-
},
|
|
630
|
-
"insertCSS": {
|
|
631
|
-
"minArgs": 1,
|
|
632
|
-
"maxArgs": 2
|
|
633
|
-
},
|
|
634
|
-
"move": {
|
|
635
|
-
"minArgs": 2,
|
|
636
|
-
"maxArgs": 2
|
|
637
|
-
},
|
|
638
|
-
"query": {
|
|
639
|
-
"minArgs": 1,
|
|
640
|
-
"maxArgs": 1
|
|
641
|
-
},
|
|
642
|
-
"reload": {
|
|
643
|
-
"minArgs": 0,
|
|
644
|
-
"maxArgs": 2
|
|
645
|
-
},
|
|
646
|
-
"remove": {
|
|
647
|
-
"minArgs": 1,
|
|
648
|
-
"maxArgs": 1
|
|
649
|
-
},
|
|
650
|
-
"removeCSS": {
|
|
651
|
-
"minArgs": 1,
|
|
652
|
-
"maxArgs": 2
|
|
653
|
-
},
|
|
654
|
-
"sendMessage": {
|
|
655
|
-
"minArgs": 2,
|
|
656
|
-
"maxArgs": 3
|
|
657
|
-
},
|
|
658
|
-
"setZoom": {
|
|
659
|
-
"minArgs": 1,
|
|
660
|
-
"maxArgs": 2
|
|
661
|
-
},
|
|
662
|
-
"setZoomSettings": {
|
|
663
|
-
"minArgs": 1,
|
|
664
|
-
"maxArgs": 2
|
|
665
|
-
},
|
|
666
|
-
"update": {
|
|
667
|
-
"minArgs": 1,
|
|
668
|
-
"maxArgs": 2
|
|
669
|
-
}
|
|
670
|
-
},
|
|
671
|
-
"topSites": {
|
|
672
|
-
"get": {
|
|
673
|
-
"minArgs": 0,
|
|
674
|
-
"maxArgs": 0
|
|
675
|
-
}
|
|
676
|
-
},
|
|
677
|
-
"webNavigation": {
|
|
678
|
-
"getAllFrames": {
|
|
679
|
-
"minArgs": 1,
|
|
680
|
-
"maxArgs": 1
|
|
681
|
-
},
|
|
682
|
-
"getFrame": {
|
|
683
|
-
"minArgs": 1,
|
|
684
|
-
"maxArgs": 1
|
|
685
|
-
}
|
|
686
|
-
},
|
|
687
|
-
"webRequest": {
|
|
688
|
-
"handlerBehaviorChanged": {
|
|
689
|
-
"minArgs": 0,
|
|
690
|
-
"maxArgs": 0
|
|
691
|
-
}
|
|
692
|
-
},
|
|
693
|
-
"windows": {
|
|
694
|
-
"create": {
|
|
695
|
-
"minArgs": 0,
|
|
696
|
-
"maxArgs": 1
|
|
697
|
-
},
|
|
698
|
-
"get": {
|
|
699
|
-
"minArgs": 1,
|
|
700
|
-
"maxArgs": 2
|
|
701
|
-
},
|
|
702
|
-
"getAll": {
|
|
703
|
-
"minArgs": 0,
|
|
704
|
-
"maxArgs": 1
|
|
705
|
-
},
|
|
706
|
-
"getCurrent": {
|
|
707
|
-
"minArgs": 0,
|
|
708
|
-
"maxArgs": 1
|
|
709
|
-
},
|
|
710
|
-
"getLastFocused": {
|
|
711
|
-
"minArgs": 0,
|
|
712
|
-
"maxArgs": 1
|
|
713
|
-
},
|
|
714
|
-
"remove": {
|
|
715
|
-
"minArgs": 1,
|
|
716
|
-
"maxArgs": 1
|
|
717
|
-
},
|
|
718
|
-
"update": {
|
|
719
|
-
"minArgs": 2,
|
|
720
|
-
"maxArgs": 2
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
};
|
|
724
|
-
if (Object.keys(apiMetadata).length === 0) {
|
|
725
|
-
throw new Error("api-metadata.json has not been included in browser-polyfill");
|
|
726
|
-
}
|
|
727
|
-
class DefaultWeakMap extends WeakMap {
|
|
728
|
-
constructor(createItem, items = void 0) {
|
|
729
|
-
super(items);
|
|
730
|
-
this.createItem = createItem;
|
|
731
|
-
}
|
|
732
|
-
get(key) {
|
|
733
|
-
if (!this.has(key)) {
|
|
734
|
-
this.set(key, this.createItem(key));
|
|
735
|
-
}
|
|
736
|
-
return super.get(key);
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
const isThenable = (value) => {
|
|
740
|
-
return value && typeof value === "object" && typeof value.then === "function";
|
|
741
|
-
};
|
|
742
|
-
const makeCallback = (promise, metadata) => {
|
|
743
|
-
return (...callbackArgs) => {
|
|
744
|
-
if (extensionAPIs.runtime.lastError) {
|
|
745
|
-
promise.reject(new Error(extensionAPIs.runtime.lastError.message));
|
|
746
|
-
} else if (metadata.singleCallbackArg || callbackArgs.length <= 1 && metadata.singleCallbackArg !== false) {
|
|
747
|
-
promise.resolve(callbackArgs[0]);
|
|
748
|
-
} else {
|
|
749
|
-
promise.resolve(callbackArgs);
|
|
750
|
-
}
|
|
751
|
-
};
|
|
752
|
-
};
|
|
753
|
-
const pluralizeArguments = (numArgs) => numArgs == 1 ? "argument" : "arguments";
|
|
754
|
-
const wrapAsyncFunction = (name, metadata) => {
|
|
755
|
-
return function asyncFunctionWrapper(target, ...args) {
|
|
756
|
-
if (args.length < metadata.minArgs) {
|
|
757
|
-
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
|
758
|
-
}
|
|
759
|
-
if (args.length > metadata.maxArgs) {
|
|
760
|
-
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
|
761
|
-
}
|
|
762
|
-
return new Promise((resolve, reject) => {
|
|
763
|
-
if (metadata.fallbackToNoCallback) {
|
|
764
|
-
try {
|
|
765
|
-
target[name](...args, makeCallback({
|
|
766
|
-
resolve,
|
|
767
|
-
reject
|
|
768
|
-
}, metadata));
|
|
769
|
-
} catch (cbError) {
|
|
770
|
-
console.warn(`${name} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `, cbError);
|
|
771
|
-
target[name](...args);
|
|
772
|
-
metadata.fallbackToNoCallback = false;
|
|
773
|
-
metadata.noCallback = true;
|
|
774
|
-
resolve();
|
|
775
|
-
}
|
|
776
|
-
} else if (metadata.noCallback) {
|
|
777
|
-
target[name](...args);
|
|
778
|
-
resolve();
|
|
779
|
-
} else {
|
|
780
|
-
target[name](...args, makeCallback({
|
|
781
|
-
resolve,
|
|
782
|
-
reject
|
|
783
|
-
}, metadata));
|
|
784
|
-
}
|
|
785
|
-
});
|
|
786
|
-
};
|
|
787
|
-
};
|
|
788
|
-
const wrapMethod = (target, method, wrapper) => {
|
|
789
|
-
return new Proxy(method, {
|
|
790
|
-
apply(targetMethod, thisObj, args) {
|
|
791
|
-
return wrapper.call(thisObj, target, ...args);
|
|
792
|
-
}
|
|
793
|
-
});
|
|
794
|
-
};
|
|
795
|
-
let hasOwnProperty = Function.call.bind(Object.prototype.hasOwnProperty);
|
|
796
|
-
const wrapObject = (target, wrappers = {}, metadata = {}) => {
|
|
797
|
-
let cache = /* @__PURE__ */ Object.create(null);
|
|
798
|
-
let handlers = {
|
|
799
|
-
has(proxyTarget2, prop) {
|
|
800
|
-
return prop in target || prop in cache;
|
|
801
|
-
},
|
|
802
|
-
get(proxyTarget2, prop, receiver) {
|
|
803
|
-
if (prop in cache) {
|
|
804
|
-
return cache[prop];
|
|
805
|
-
}
|
|
806
|
-
if (!(prop in target)) {
|
|
807
|
-
return void 0;
|
|
808
|
-
}
|
|
809
|
-
let value = target[prop];
|
|
810
|
-
if (typeof value === "function") {
|
|
811
|
-
if (typeof wrappers[prop] === "function") {
|
|
812
|
-
value = wrapMethod(target, target[prop], wrappers[prop]);
|
|
813
|
-
} else if (hasOwnProperty(metadata, prop)) {
|
|
814
|
-
let wrapper = wrapAsyncFunction(prop, metadata[prop]);
|
|
815
|
-
value = wrapMethod(target, target[prop], wrapper);
|
|
816
|
-
} else {
|
|
817
|
-
value = value.bind(target);
|
|
818
|
-
}
|
|
819
|
-
} else if (typeof value === "object" && value !== null && (hasOwnProperty(wrappers, prop) || hasOwnProperty(metadata, prop))) {
|
|
820
|
-
value = wrapObject(value, wrappers[prop], metadata[prop]);
|
|
821
|
-
} else if (hasOwnProperty(metadata, "*")) {
|
|
822
|
-
value = wrapObject(value, wrappers[prop], metadata["*"]);
|
|
823
|
-
} else {
|
|
824
|
-
Object.defineProperty(cache, prop, {
|
|
825
|
-
configurable: true,
|
|
826
|
-
enumerable: true,
|
|
827
|
-
get() {
|
|
828
|
-
return target[prop];
|
|
829
|
-
},
|
|
830
|
-
set(value2) {
|
|
831
|
-
target[prop] = value2;
|
|
832
|
-
}
|
|
833
|
-
});
|
|
834
|
-
return value;
|
|
835
|
-
}
|
|
836
|
-
cache[prop] = value;
|
|
837
|
-
return value;
|
|
838
|
-
},
|
|
839
|
-
set(proxyTarget2, prop, value, receiver) {
|
|
840
|
-
if (prop in cache) {
|
|
841
|
-
cache[prop] = value;
|
|
842
|
-
} else {
|
|
843
|
-
target[prop] = value;
|
|
844
|
-
}
|
|
845
|
-
return true;
|
|
846
|
-
},
|
|
847
|
-
defineProperty(proxyTarget2, prop, desc) {
|
|
848
|
-
return Reflect.defineProperty(cache, prop, desc);
|
|
849
|
-
},
|
|
850
|
-
deleteProperty(proxyTarget2, prop) {
|
|
851
|
-
return Reflect.deleteProperty(cache, prop);
|
|
852
|
-
}
|
|
853
|
-
};
|
|
854
|
-
let proxyTarget = Object.create(target);
|
|
855
|
-
return new Proxy(proxyTarget, handlers);
|
|
856
|
-
};
|
|
857
|
-
const wrapEvent = (wrapperMap) => ({
|
|
858
|
-
addListener(target, listener, ...args) {
|
|
859
|
-
target.addListener(wrapperMap.get(listener), ...args);
|
|
860
|
-
},
|
|
861
|
-
hasListener(target, listener) {
|
|
862
|
-
return target.hasListener(wrapperMap.get(listener));
|
|
863
|
-
},
|
|
864
|
-
removeListener(target, listener) {
|
|
865
|
-
target.removeListener(wrapperMap.get(listener));
|
|
866
|
-
}
|
|
867
|
-
});
|
|
868
|
-
const onRequestFinishedWrappers = new DefaultWeakMap((listener) => {
|
|
869
|
-
if (typeof listener !== "function") {
|
|
870
|
-
return listener;
|
|
871
|
-
}
|
|
872
|
-
return function onRequestFinished(req) {
|
|
873
|
-
const wrappedReq = wrapObject(req, {}, {
|
|
874
|
-
getContent: {
|
|
875
|
-
minArgs: 0,
|
|
876
|
-
maxArgs: 0
|
|
877
|
-
}
|
|
878
|
-
});
|
|
879
|
-
listener(wrappedReq);
|
|
880
|
-
};
|
|
881
|
-
});
|
|
882
|
-
const onMessageWrappers = new DefaultWeakMap((listener) => {
|
|
883
|
-
if (typeof listener !== "function") {
|
|
884
|
-
return listener;
|
|
885
|
-
}
|
|
886
|
-
return function onMessage(message, sender, sendResponse) {
|
|
887
|
-
let didCallSendResponse = false;
|
|
888
|
-
let wrappedSendResponse;
|
|
889
|
-
let sendResponsePromise = new Promise((resolve) => {
|
|
890
|
-
wrappedSendResponse = function(response) {
|
|
891
|
-
didCallSendResponse = true;
|
|
892
|
-
resolve(response);
|
|
893
|
-
};
|
|
894
|
-
});
|
|
895
|
-
let result;
|
|
896
|
-
try {
|
|
897
|
-
result = listener(message, sender, wrappedSendResponse);
|
|
898
|
-
} catch (err) {
|
|
899
|
-
result = Promise.reject(err);
|
|
900
|
-
}
|
|
901
|
-
const isResultThenable = result !== true && isThenable(result);
|
|
902
|
-
if (result !== true && !isResultThenable && !didCallSendResponse) {
|
|
903
|
-
return false;
|
|
904
|
-
}
|
|
905
|
-
const sendPromisedResult = (promise) => {
|
|
906
|
-
promise.then((msg) => {
|
|
907
|
-
sendResponse(msg);
|
|
908
|
-
}, (error) => {
|
|
909
|
-
let message2;
|
|
910
|
-
if (error && (error instanceof Error || typeof error.message === "string")) {
|
|
911
|
-
message2 = error.message;
|
|
912
|
-
} else {
|
|
913
|
-
message2 = "An unexpected error occurred";
|
|
914
|
-
}
|
|
915
|
-
sendResponse({
|
|
916
|
-
__mozWebExtensionPolyfillReject__: true,
|
|
917
|
-
message: message2
|
|
918
|
-
});
|
|
919
|
-
}).catch((err) => {
|
|
920
|
-
console.error("Failed to send onMessage rejected reply", err);
|
|
921
|
-
});
|
|
922
|
-
};
|
|
923
|
-
if (isResultThenable) {
|
|
924
|
-
sendPromisedResult(result);
|
|
925
|
-
} else {
|
|
926
|
-
sendPromisedResult(sendResponsePromise);
|
|
927
|
-
}
|
|
928
|
-
return true;
|
|
929
|
-
};
|
|
930
|
-
});
|
|
931
|
-
const wrappedSendMessageCallback = ({
|
|
932
|
-
reject,
|
|
933
|
-
resolve
|
|
934
|
-
}, reply) => {
|
|
935
|
-
if (extensionAPIs.runtime.lastError) {
|
|
936
|
-
if (extensionAPIs.runtime.lastError.message === CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE) {
|
|
937
|
-
resolve();
|
|
938
|
-
} else {
|
|
939
|
-
reject(new Error(extensionAPIs.runtime.lastError.message));
|
|
940
|
-
}
|
|
941
|
-
} else if (reply && reply.__mozWebExtensionPolyfillReject__) {
|
|
942
|
-
reject(new Error(reply.message));
|
|
943
|
-
} else {
|
|
944
|
-
resolve(reply);
|
|
945
|
-
}
|
|
946
|
-
};
|
|
947
|
-
const wrappedSendMessage = (name, metadata, apiNamespaceObj, ...args) => {
|
|
948
|
-
if (args.length < metadata.minArgs) {
|
|
949
|
-
throw new Error(`Expected at least ${metadata.minArgs} ${pluralizeArguments(metadata.minArgs)} for ${name}(), got ${args.length}`);
|
|
950
|
-
}
|
|
951
|
-
if (args.length > metadata.maxArgs) {
|
|
952
|
-
throw new Error(`Expected at most ${metadata.maxArgs} ${pluralizeArguments(metadata.maxArgs)} for ${name}(), got ${args.length}`);
|
|
953
|
-
}
|
|
954
|
-
return new Promise((resolve, reject) => {
|
|
955
|
-
const wrappedCb = wrappedSendMessageCallback.bind(null, {
|
|
956
|
-
resolve,
|
|
957
|
-
reject
|
|
958
|
-
});
|
|
959
|
-
args.push(wrappedCb);
|
|
960
|
-
apiNamespaceObj.sendMessage(...args);
|
|
961
|
-
});
|
|
962
|
-
};
|
|
963
|
-
const staticWrappers = {
|
|
964
|
-
devtools: {
|
|
965
|
-
network: {
|
|
966
|
-
onRequestFinished: wrapEvent(onRequestFinishedWrappers)
|
|
967
|
-
}
|
|
968
|
-
},
|
|
969
|
-
runtime: {
|
|
970
|
-
onMessage: wrapEvent(onMessageWrappers),
|
|
971
|
-
onMessageExternal: wrapEvent(onMessageWrappers),
|
|
972
|
-
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
|
|
973
|
-
minArgs: 1,
|
|
974
|
-
maxArgs: 3
|
|
975
|
-
})
|
|
976
|
-
},
|
|
977
|
-
tabs: {
|
|
978
|
-
sendMessage: wrappedSendMessage.bind(null, "sendMessage", {
|
|
979
|
-
minArgs: 2,
|
|
980
|
-
maxArgs: 3
|
|
981
|
-
})
|
|
982
|
-
}
|
|
983
|
-
};
|
|
984
|
-
const settingMetadata = {
|
|
985
|
-
clear: {
|
|
986
|
-
minArgs: 1,
|
|
987
|
-
maxArgs: 1
|
|
988
|
-
},
|
|
989
|
-
get: {
|
|
990
|
-
minArgs: 1,
|
|
991
|
-
maxArgs: 1
|
|
992
|
-
},
|
|
993
|
-
set: {
|
|
994
|
-
minArgs: 1,
|
|
995
|
-
maxArgs: 1
|
|
996
|
-
}
|
|
997
|
-
};
|
|
998
|
-
apiMetadata.privacy = {
|
|
999
|
-
network: {
|
|
1000
|
-
"*": settingMetadata
|
|
1001
|
-
},
|
|
1002
|
-
services: {
|
|
1003
|
-
"*": settingMetadata
|
|
1004
|
-
},
|
|
1005
|
-
websites: {
|
|
1006
|
-
"*": settingMetadata
|
|
1007
|
-
}
|
|
1008
|
-
};
|
|
1009
|
-
return wrapObject(extensionAPIs, staticWrappers, apiMetadata);
|
|
1010
|
-
};
|
|
1011
|
-
module2.exports = wrapAPIs(chrome);
|
|
1012
|
-
} else {
|
|
1013
|
-
module2.exports = globalThis.browser;
|
|
1014
|
-
}
|
|
1015
|
-
});
|
|
1016
|
-
}
|
|
1017
|
-
});
|
|
1018
|
-
|
|
1019
|
-
// src/content-script.ts
|
|
1020
|
-
var import_webextension_polyfill = __toESM(require_browser_polyfill());
|
|
1021
|
-
|
|
1022
|
-
// src/shared/shortcut.ts
|
|
1023
|
-
var STORAGE_KEY_INSPECT = "hanzo_shortcut_inspect";
|
|
1024
|
-
var DEFAULT_INSPECT_SHORTCUT = {
|
|
1025
|
-
ctrl: true,
|
|
1026
|
-
meta: false,
|
|
1027
|
-
alt: false,
|
|
1028
|
-
shift: false,
|
|
1029
|
-
key: ""
|
|
1030
|
-
};
|
|
1031
|
-
function matchesShortcut(e, s) {
|
|
1032
|
-
if (s.ctrl && !e.ctrlKey) return false;
|
|
1033
|
-
if (s.meta && !e.metaKey) return false;
|
|
1034
|
-
if (s.alt && !e.altKey) return false;
|
|
1035
|
-
if (s.shift && !e.shiftKey) return false;
|
|
1036
|
-
if (!s.ctrl && e.ctrlKey) return false;
|
|
1037
|
-
if (!s.meta && e.metaKey) return false;
|
|
1038
|
-
if (!s.alt && e.altKey) return false;
|
|
1039
|
-
if (!s.shift && e.shiftKey) return false;
|
|
1040
|
-
if (s.key && (e.key || "").toLowerCase() !== s.key.toLowerCase()) return false;
|
|
1041
|
-
return true;
|
|
1042
|
-
}
|
|
1043
|
-
async function loadInspectShortcut(storage) {
|
|
1044
|
-
try {
|
|
1045
|
-
const raw = await storage.get([STORAGE_KEY_INSPECT]);
|
|
1046
|
-
const v = raw[STORAGE_KEY_INSPECT];
|
|
1047
|
-
if (v && typeof v === "object" && typeof v.ctrl === "boolean" && typeof v.alt === "boolean" && typeof v.shift === "boolean" && typeof v.meta === "boolean" && typeof v.key === "string") {
|
|
1048
|
-
return v;
|
|
1049
|
-
}
|
|
1050
|
-
} catch {
|
|
1051
|
-
}
|
|
1052
|
-
return { ...DEFAULT_INSPECT_SHORTCUT };
|
|
1053
|
-
}
|
|
1054
|
-
|
|
1055
|
-
// src/content-script.ts
|
|
1056
|
-
var HanzoContentScript = class {
|
|
1057
|
-
constructor() {
|
|
1058
|
-
// Cache the configured shortcut so every click/mousemove doesn't hit
|
|
1059
|
-
// chrome.storage. Reloaded eagerly on storage change so the popup's
|
|
1060
|
-
// recorder updates take effect immediately (no page reload required).
|
|
1061
|
-
this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
|
|
1062
|
-
this.loadShortcut();
|
|
1063
|
-
this.watchShortcut();
|
|
1064
|
-
this.setupClickHandler();
|
|
1065
|
-
this.injectHelpers();
|
|
1066
|
-
this.setupMessageHandlers();
|
|
1067
|
-
}
|
|
1068
|
-
async loadShortcut() {
|
|
1069
|
-
try {
|
|
1070
|
-
this.inspectShortcut = await loadInspectShortcut(chrome.storage.local);
|
|
1071
|
-
} catch {
|
|
1072
|
-
this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
|
|
1073
|
-
}
|
|
1074
|
-
}
|
|
1075
|
-
watchShortcut() {
|
|
1076
|
-
try {
|
|
1077
|
-
chrome.storage.onChanged.addListener((changes, area) => {
|
|
1078
|
-
if (area !== "local") return;
|
|
1079
|
-
const c = changes[STORAGE_KEY_INSPECT];
|
|
1080
|
-
if (!c) return;
|
|
1081
|
-
if (c.newValue && typeof c.newValue === "object") {
|
|
1082
|
-
this.inspectShortcut = c.newValue;
|
|
1083
|
-
} else {
|
|
1084
|
-
this.inspectShortcut = { ...DEFAULT_INSPECT_SHORTCUT };
|
|
1085
|
-
}
|
|
1086
|
-
});
|
|
1087
|
-
} catch {
|
|
1088
|
-
}
|
|
1089
|
-
}
|
|
1090
|
-
setupClickHandler() {
|
|
1091
|
-
document.addEventListener("click", (e) => {
|
|
1092
|
-
if (!matchesShortcut(e, this.inspectShortcut)) return;
|
|
1093
|
-
e.preventDefault();
|
|
1094
|
-
e.stopPropagation();
|
|
1095
|
-
const element = e.target;
|
|
1096
|
-
const source = this.extractSourceLocation(element);
|
|
1097
|
-
const domPath = this.getDOMPath(element);
|
|
1098
|
-
const event = {
|
|
1099
|
-
event: "elementSelected",
|
|
1100
|
-
framework: this.detectFramework(),
|
|
1101
|
-
domPath,
|
|
1102
|
-
source,
|
|
1103
|
-
fallbackId: element.getAttribute("data-hanzo-id") || void 0
|
|
1104
|
-
};
|
|
1105
|
-
chrome.runtime.sendMessage({ action: "elementSelected", data: event });
|
|
1106
|
-
});
|
|
1107
|
-
}
|
|
1108
|
-
setupMessageHandlers() {
|
|
1109
|
-
chrome.runtime.onMessage.addListener((request, _sender, sendResponse) => {
|
|
1110
|
-
var _a2;
|
|
1111
|
-
switch (request.action) {
|
|
1112
|
-
case "ai.control.start":
|
|
1113
|
-
aiOverlay.show(request.task || "AI is controlling this page");
|
|
1114
|
-
sendResponse({ success: true });
|
|
1115
|
-
return true;
|
|
1116
|
-
case "ai.control.stop":
|
|
1117
|
-
aiOverlay.hide();
|
|
1118
|
-
sendResponse({ success: true });
|
|
1119
|
-
return true;
|
|
1120
|
-
case "ai.control.cursor":
|
|
1121
|
-
aiOverlay.moveCursor(request.x, request.y);
|
|
1122
|
-
sendResponse({ success: true });
|
|
1123
|
-
return true;
|
|
1124
|
-
case "ai.control.highlight":
|
|
1125
|
-
aiOverlay.highlight(request.selector);
|
|
1126
|
-
sendResponse({ success: true });
|
|
1127
|
-
return true;
|
|
1128
|
-
case "ai.control.status":
|
|
1129
|
-
aiOverlay.updateStatus(request.text);
|
|
1130
|
-
sendResponse({ success: true });
|
|
1131
|
-
return true;
|
|
1132
|
-
case "page.overlay.toggle":
|
|
1133
|
-
if (request.side === "left" || request.side === "right") pageOverlay.setSide(request.side);
|
|
1134
|
-
if (request.mode === "push" || request.mode === "overlay") pageOverlay.setMode(request.mode);
|
|
1135
|
-
if (request.width === "compact" || request.width === "default" || request.width === "wide") {
|
|
1136
|
-
pageOverlay.setWidth(request.width);
|
|
1137
|
-
}
|
|
1138
|
-
sendResponse({
|
|
1139
|
-
success: true,
|
|
1140
|
-
open: pageOverlay.toggle()
|
|
1141
|
-
});
|
|
1142
|
-
return true;
|
|
1143
|
-
case "page.overlay.show":
|
|
1144
|
-
if (request.side === "left" || request.side === "right") pageOverlay.setSide(request.side);
|
|
1145
|
-
if (request.mode === "push" || request.mode === "overlay") pageOverlay.setMode(request.mode);
|
|
1146
|
-
if (request.width === "compact" || request.width === "default" || request.width === "wide") {
|
|
1147
|
-
pageOverlay.setWidth(request.width);
|
|
1148
|
-
}
|
|
1149
|
-
pageOverlay.show();
|
|
1150
|
-
sendResponse({ success: true, open: true });
|
|
1151
|
-
return true;
|
|
1152
|
-
case "page.overlay.hide":
|
|
1153
|
-
pageOverlay.hide();
|
|
1154
|
-
sendResponse({ success: true, open: false });
|
|
1155
|
-
return true;
|
|
1156
|
-
case "page.overlay.status":
|
|
1157
|
-
sendResponse({
|
|
1158
|
-
success: true,
|
|
1159
|
-
open: pageOverlay.isOpen(),
|
|
1160
|
-
side: pageOverlay.getSide(),
|
|
1161
|
-
mode: pageOverlay.getMode()
|
|
1162
|
-
});
|
|
1163
|
-
return true;
|
|
1164
|
-
case "page.overlay.setSide":
|
|
1165
|
-
if (request.side === "left" || request.side === "right") {
|
|
1166
|
-
pageOverlay.setSide(request.side);
|
|
1167
|
-
sendResponse({ success: true, side: request.side });
|
|
1168
|
-
} else {
|
|
1169
|
-
sendResponse({ success: false, error: 'side must be "left" or "right"' });
|
|
1170
|
-
}
|
|
1171
|
-
return true;
|
|
1172
|
-
case "page.overlay.setMode":
|
|
1173
|
-
if (request.mode === "push" || request.mode === "overlay") {
|
|
1174
|
-
pageOverlay.setMode(request.mode);
|
|
1175
|
-
sendResponse({ success: true, mode: request.mode });
|
|
1176
|
-
} else {
|
|
1177
|
-
sendResponse({ success: false, error: 'mode must be "push" or "overlay"' });
|
|
1178
|
-
}
|
|
1179
|
-
return true;
|
|
1180
|
-
case "page.overlay.setWidth":
|
|
1181
|
-
if (request.width === "compact" || request.width === "default" || request.width === "wide") {
|
|
1182
|
-
pageOverlay.setWidth(request.width);
|
|
1183
|
-
sendResponse({ success: true, width: request.width });
|
|
1184
|
-
} else {
|
|
1185
|
-
sendResponse({ success: false, error: "width must be compact|default|wide" });
|
|
1186
|
-
}
|
|
1187
|
-
return true;
|
|
1188
|
-
case "page.overlay.setEnabled":
|
|
1189
|
-
if (typeof request.enabled === "boolean") {
|
|
1190
|
-
pageOverlay.setEnabled(request.enabled);
|
|
1191
|
-
sendResponse({ success: true, enabled: request.enabled });
|
|
1192
|
-
} else {
|
|
1193
|
-
sendResponse({ success: false, error: "enabled must be boolean" });
|
|
1194
|
-
}
|
|
1195
|
-
return true;
|
|
1196
|
-
// --- Popup Tool Actions ---
|
|
1197
|
-
case "tool.picker.start":
|
|
1198
|
-
elementPicker.start();
|
|
1199
|
-
sendResponse({ success: true });
|
|
1200
|
-
return true;
|
|
1201
|
-
case "tool.picker.stop":
|
|
1202
|
-
elementPicker.stop();
|
|
1203
|
-
sendResponse({ success: true });
|
|
1204
|
-
return true;
|
|
1205
|
-
case "tool.pageinfo":
|
|
1206
|
-
sendResponse({ success: true, info: gatherPageInfo() });
|
|
1207
|
-
return true;
|
|
1208
|
-
case "tool.console.start":
|
|
1209
|
-
inlineConsole.show();
|
|
1210
|
-
sendResponse({ success: true });
|
|
1211
|
-
return true;
|
|
1212
|
-
case "tool.console.hide":
|
|
1213
|
-
inlineConsole.hide();
|
|
1214
|
-
sendResponse({ success: true });
|
|
1215
|
-
return true;
|
|
1216
|
-
}
|
|
1217
|
-
if (request.action === "getContent") {
|
|
1218
|
-
sendResponse({ content: ((_a2 = document.documentElement) == null ? void 0 : _a2.outerHTML) || "" });
|
|
1219
|
-
return true;
|
|
1220
|
-
}
|
|
1221
|
-
if (request.action === "setContent") {
|
|
1222
|
-
if (typeof request.content === "string") {
|
|
1223
|
-
document.open();
|
|
1224
|
-
document.write(request.content);
|
|
1225
|
-
document.close();
|
|
1226
|
-
}
|
|
1227
|
-
sendResponse({ success: true });
|
|
1228
|
-
return true;
|
|
1229
|
-
}
|
|
1230
|
-
return false;
|
|
1231
|
-
});
|
|
1232
|
-
}
|
|
1233
|
-
extractSourceLocation(element) {
|
|
1234
|
-
const framework = this.detectFramework();
|
|
1235
|
-
switch (framework) {
|
|
1236
|
-
case "react":
|
|
1237
|
-
return this.extractReactSource(element);
|
|
1238
|
-
case "vue":
|
|
1239
|
-
return this.extractVueSource(element);
|
|
1240
|
-
case "svelte":
|
|
1241
|
-
return this.extractSvelteSource(element);
|
|
1242
|
-
default:
|
|
1243
|
-
return void 0;
|
|
1244
|
-
}
|
|
1245
|
-
}
|
|
1246
|
-
extractReactSource(element) {
|
|
1247
|
-
var _a2, _b2;
|
|
1248
|
-
const hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;
|
|
1249
|
-
if (!hook) return void 0;
|
|
1250
|
-
const fiber = this.findReactFiber(element);
|
|
1251
|
-
if (!fiber) return void 0;
|
|
1252
|
-
const source = fiber._debugSource || ((_a2 = fiber.pendingProps) == null ? void 0 : _a2.__source) || ((_b2 = fiber.memoizedProps) == null ? void 0 : _b2.__source);
|
|
1253
|
-
if (source && source.fileName) {
|
|
1254
|
-
return {
|
|
1255
|
-
file: source.fileName,
|
|
1256
|
-
line: source.lineNumber,
|
|
1257
|
-
column: source.columnNumber
|
|
1258
|
-
};
|
|
1259
|
-
}
|
|
1260
|
-
return void 0;
|
|
1261
|
-
}
|
|
1262
|
-
findReactFiber(element) {
|
|
1263
|
-
const key = Object.keys(element).find(
|
|
1264
|
-
(candidate) => candidate.startsWith("__reactInternalInstance$") || candidate.startsWith("__reactFiber$")
|
|
1265
|
-
);
|
|
1266
|
-
return key ? element[key] : null;
|
|
1267
|
-
}
|
|
1268
|
-
extractVueSource(element) {
|
|
1269
|
-
var _a2, _b2;
|
|
1270
|
-
const hook = window.__VUE_DEVTOOLS_GLOBAL_HOOK__;
|
|
1271
|
-
if (!hook) return void 0;
|
|
1272
|
-
let instance = element.__vueParentComponent;
|
|
1273
|
-
if (!instance) {
|
|
1274
|
-
instance = element.__vue__;
|
|
1275
|
-
}
|
|
1276
|
-
if ((_a2 = instance == null ? void 0 : instance.type) == null ? void 0 : _a2.__file) {
|
|
1277
|
-
const location2 = {
|
|
1278
|
-
file: instance.type.__file,
|
|
1279
|
-
line: 1
|
|
1280
|
-
};
|
|
1281
|
-
if ((_b2 = instance.vnode) == null ? void 0 : _b2.loc) {
|
|
1282
|
-
location2.line = instance.vnode.loc.start.line;
|
|
1283
|
-
location2.column = instance.vnode.loc.start.column;
|
|
1284
|
-
}
|
|
1285
|
-
return location2;
|
|
1286
|
-
}
|
|
1287
|
-
return void 0;
|
|
1288
|
-
}
|
|
1289
|
-
extractSvelteSource(element) {
|
|
1290
|
-
var _a2, _b2;
|
|
1291
|
-
const component = element.__svelte_component;
|
|
1292
|
-
if ((_b2 = (_a2 = component == null ? void 0 : component.$$) == null ? void 0 : _a2.ctx) == null ? void 0 : _b2.$$_location) {
|
|
1293
|
-
return component.$$.ctx.$$_location;
|
|
1294
|
-
}
|
|
1295
|
-
return void 0;
|
|
1296
|
-
}
|
|
1297
|
-
detectFramework() {
|
|
1298
|
-
if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) return "react";
|
|
1299
|
-
if (window.__VUE_DEVTOOLS_GLOBAL_HOOK__) return "vue";
|
|
1300
|
-
if (window.__svelte) return "svelte";
|
|
1301
|
-
return null;
|
|
1302
|
-
}
|
|
1303
|
-
getDOMPath(element) {
|
|
1304
|
-
const path = [];
|
|
1305
|
-
let current = element;
|
|
1306
|
-
while (current && current !== document.body) {
|
|
1307
|
-
let selector = current.tagName.toLowerCase();
|
|
1308
|
-
if (current.id) {
|
|
1309
|
-
selector += `#${current.id}`;
|
|
1310
|
-
} else if (current.className) {
|
|
1311
|
-
selector += `.${current.className.split(" ").join(".")}`;
|
|
1312
|
-
}
|
|
1313
|
-
path.unshift(selector);
|
|
1314
|
-
current = current.parentElement;
|
|
1315
|
-
}
|
|
1316
|
-
return path.join(" > ");
|
|
1317
|
-
}
|
|
1318
|
-
injectHelpers() {
|
|
1319
|
-
const style = document.createElement("style");
|
|
1320
|
-
style.textContent = `
|
|
1321
|
-
[data-hanzo-hover] {
|
|
1322
|
-
outline: 2px dashed #ff6b6b !important;
|
|
1323
|
-
outline-offset: 2px !important;
|
|
1324
|
-
}
|
|
1325
|
-
`;
|
|
1326
|
-
document.head.appendChild(style);
|
|
1327
|
-
document.addEventListener("mousemove", (e) => {
|
|
1328
|
-
document.querySelectorAll("[data-hanzo-hover]").forEach((el) => {
|
|
1329
|
-
el.removeAttribute("data-hanzo-hover");
|
|
1330
|
-
});
|
|
1331
|
-
if (matchesShortcut(e, this.inspectShortcut) && e.target instanceof HTMLElement) {
|
|
1332
|
-
e.target.setAttribute("data-hanzo-hover", "true");
|
|
1333
|
-
}
|
|
1334
|
-
});
|
|
1335
|
-
}
|
|
1336
|
-
};
|
|
1337
|
-
var aiOverlay = /* @__PURE__ */ (() => {
|
|
1338
|
-
let overlay = null;
|
|
1339
|
-
let cursor = null;
|
|
1340
|
-
let statusEl = null;
|
|
1341
|
-
let cancelBtn = null;
|
|
1342
|
-
let highlightEl = null;
|
|
1343
|
-
let trailNodes = [];
|
|
1344
|
-
let interactionBlockActive = false;
|
|
1345
|
-
const OVERLAY_ID = "hanzo-ai-overlay";
|
|
1346
|
-
const STYLES_ID = "hanzo-ai-overlay-styles";
|
|
1347
|
-
const BLOCKED_EVENTS = [
|
|
1348
|
-
"click",
|
|
1349
|
-
"dblclick",
|
|
1350
|
-
"mousedown",
|
|
1351
|
-
"mouseup",
|
|
1352
|
-
"contextmenu",
|
|
1353
|
-
"pointerdown",
|
|
1354
|
-
"pointerup",
|
|
1355
|
-
"touchstart",
|
|
1356
|
-
"touchmove",
|
|
1357
|
-
"touchend",
|
|
1358
|
-
"wheel",
|
|
1359
|
-
"keydown",
|
|
1360
|
-
"keyup",
|
|
1361
|
-
"keypress"
|
|
1362
|
-
];
|
|
1363
|
-
function injectStyles() {
|
|
1364
|
-
if (document.getElementById(STYLES_ID)) return;
|
|
1365
|
-
const style = document.createElement("style");
|
|
1366
|
-
style.id = STYLES_ID;
|
|
1367
|
-
style.textContent = `
|
|
1368
|
-
/* ---- Overlay backdrop ---- */
|
|
1369
|
-
#${OVERLAY_ID} {
|
|
1370
|
-
position: fixed;
|
|
1371
|
-
inset: 0;
|
|
1372
|
-
z-index: 2147483646;
|
|
1373
|
-
pointer-events: all;
|
|
1374
|
-
background:
|
|
1375
|
-
radial-gradient(90vw 90vh at 15% 8%, rgba(56, 189, 248, 0.10), transparent 55%),
|
|
1376
|
-
radial-gradient(65vw 65vh at 84% 82%, rgba(99, 102, 241, 0.10), transparent 60%),
|
|
1377
|
-
rgba(2, 4, 10, 0.42);
|
|
1378
|
-
backdrop-filter: blur(1.5px);
|
|
1379
|
-
opacity: 0;
|
|
1380
|
-
transition: opacity 300ms ease;
|
|
1381
|
-
}
|
|
1382
|
-
#${OVERLAY_ID}.hanzo-visible {
|
|
1383
|
-
opacity: 1;
|
|
1384
|
-
}
|
|
1385
|
-
|
|
1386
|
-
/* ---- Pulsing cyan glow cursor ---- */
|
|
1387
|
-
.hanzo-ai-cursor {
|
|
1388
|
-
position: fixed;
|
|
1389
|
-
width: 24px;
|
|
1390
|
-
height: 24px;
|
|
1391
|
-
z-index: 2147483647;
|
|
1392
|
-
pointer-events: none;
|
|
1393
|
-
border-radius: 50%;
|
|
1394
|
-
border: 2px solid rgba(6, 182, 212, 0.95);
|
|
1395
|
-
box-shadow:
|
|
1396
|
-
0 0 8px 2px rgba(6, 182, 212, 0.45),
|
|
1397
|
-
0 0 24px 6px rgba(6, 182, 212, 0.18);
|
|
1398
|
-
transform: translate(-50%, -50%);
|
|
1399
|
-
transition: left 0.18s ease-out, top 0.18s ease-out;
|
|
1400
|
-
animation: hanzo-cursor-pulse 1.6s ease-in-out infinite;
|
|
1401
|
-
opacity: 0;
|
|
1402
|
-
}
|
|
1403
|
-
.hanzo-ai-cursor.hanzo-visible {
|
|
1404
|
-
opacity: 1;
|
|
1405
|
-
transition: left 0.18s ease-out, top 0.18s ease-out, opacity 300ms ease;
|
|
1406
|
-
}
|
|
1407
|
-
@keyframes hanzo-cursor-pulse {
|
|
1408
|
-
0%, 100% {
|
|
1409
|
-
box-shadow:
|
|
1410
|
-
0 0 8px 2px rgba(6, 182, 212, 0.45),
|
|
1411
|
-
0 0 24px 6px rgba(6, 182, 212, 0.18);
|
|
1412
|
-
}
|
|
1413
|
-
50% {
|
|
1414
|
-
box-shadow:
|
|
1415
|
-
0 0 14px 4px rgba(6, 182, 212, 0.65),
|
|
1416
|
-
0 0 36px 10px rgba(6, 182, 212, 0.28);
|
|
1417
|
-
}
|
|
1418
|
-
}
|
|
1419
|
-
|
|
1420
|
-
/* ---- Cursor trail ---- */
|
|
1421
|
-
.hanzo-cursor-trail {
|
|
1422
|
-
position: fixed;
|
|
1423
|
-
width: 6px;
|
|
1424
|
-
height: 6px;
|
|
1425
|
-
border-radius: 50%;
|
|
1426
|
-
background: rgba(6, 182, 212, 0.7);
|
|
1427
|
-
z-index: 2147483646;
|
|
1428
|
-
pointer-events: none;
|
|
1429
|
-
transform: translate(-50%, -50%);
|
|
1430
|
-
animation: hanzo-trail-fade 0.4s ease-out forwards;
|
|
1431
|
-
}
|
|
1432
|
-
@keyframes hanzo-trail-fade {
|
|
1433
|
-
from { opacity: 0.7; transform: translate(-50%, -50%) scale(1); }
|
|
1434
|
-
to { opacity: 0; transform: translate(-50%, -50%) scale(0.15); }
|
|
1435
|
-
}
|
|
1436
|
-
|
|
1437
|
-
/* ---- Status banner (top center pill) ---- */
|
|
1438
|
-
.hanzo-ai-status {
|
|
1439
|
-
position: fixed;
|
|
1440
|
-
top: 16px;
|
|
1441
|
-
left: 50%;
|
|
1442
|
-
transform: translateX(-50%);
|
|
1443
|
-
z-index: 2147483647;
|
|
1444
|
-
display: flex;
|
|
1445
|
-
align-items: center;
|
|
1446
|
-
gap: 10px;
|
|
1447
|
-
max-width: 90vw;
|
|
1448
|
-
padding: 10px 14px;
|
|
1449
|
-
border-radius: 16px;
|
|
1450
|
-
background: linear-gradient(135deg, rgba(8, 12, 20, 0.94), rgba(10, 16, 24, 0.96));
|
|
1451
|
-
border: 1px solid rgba(56, 189, 248, 0.26);
|
|
1452
|
-
color: #f3f4f6;
|
|
1453
|
-
font: 13px/1.4 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
1454
|
-
box-shadow:
|
|
1455
|
-
0 10px 36px rgba(0, 0, 0, 0.46),
|
|
1456
|
-
inset 0 1px 0 rgba(255, 255, 255, 0.08);
|
|
1457
|
-
opacity: 0;
|
|
1458
|
-
transition: opacity 300ms ease;
|
|
1459
|
-
overflow: hidden;
|
|
1460
|
-
}
|
|
1461
|
-
.hanzo-ai-status::before {
|
|
1462
|
-
content: '';
|
|
1463
|
-
position: absolute;
|
|
1464
|
-
inset: -2px auto -2px -20%;
|
|
1465
|
-
width: 40%;
|
|
1466
|
-
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.16), transparent);
|
|
1467
|
-
transform: skewX(-18deg);
|
|
1468
|
-
animation: hanzo-status-sheen 3.6s ease-in-out infinite;
|
|
1469
|
-
pointer-events: none;
|
|
1470
|
-
}
|
|
1471
|
-
@keyframes hanzo-status-sheen {
|
|
1472
|
-
0%, 68% { left: -30%; opacity: 0; }
|
|
1473
|
-
72% { opacity: 0.4; }
|
|
1474
|
-
100% { left: 130%; opacity: 0; }
|
|
1475
|
-
}
|
|
1476
|
-
.hanzo-ai-status > * {
|
|
1477
|
-
position: relative;
|
|
1478
|
-
}
|
|
1479
|
-
.hanzo-ai-status.hanzo-visible {
|
|
1480
|
-
opacity: 1;
|
|
1481
|
-
}
|
|
1482
|
-
|
|
1483
|
-
.hanzo-ai-status .hanzo-brand-bubble {
|
|
1484
|
-
display: inline-flex;
|
|
1485
|
-
align-items: center;
|
|
1486
|
-
justify-content: center;
|
|
1487
|
-
height: 20px;
|
|
1488
|
-
min-width: 30px;
|
|
1489
|
-
padding: 0 8px;
|
|
1490
|
-
border-radius: 9999px;
|
|
1491
|
-
font-size: 10px;
|
|
1492
|
-
letter-spacing: 0.25px;
|
|
1493
|
-
font-weight: 700;
|
|
1494
|
-
text-transform: uppercase;
|
|
1495
|
-
color: #e0f2fe;
|
|
1496
|
-
background: linear-gradient(180deg, rgba(14, 116, 144, 0.95), rgba(15, 23, 42, 0.95));
|
|
1497
|
-
border: 1px solid rgba(56, 189, 248, 0.35);
|
|
1498
|
-
}
|
|
1499
|
-
|
|
1500
|
-
.hanzo-ai-status .hanzo-pulse-dot {
|
|
1501
|
-
width: 8px;
|
|
1502
|
-
height: 8px;
|
|
1503
|
-
border-radius: 9999px;
|
|
1504
|
-
background: #06b6d4;
|
|
1505
|
-
animation: hanzo-dot-pulse 1.4s ease-in-out infinite;
|
|
1506
|
-
}
|
|
1507
|
-
@keyframes hanzo-dot-pulse {
|
|
1508
|
-
0%, 100% { opacity: 1; }
|
|
1509
|
-
50% { opacity: 0.4; }
|
|
1510
|
-
}
|
|
1511
|
-
|
|
1512
|
-
.hanzo-ai-status .hanzo-label {
|
|
1513
|
-
max-width: 46vw;
|
|
1514
|
-
overflow: hidden;
|
|
1515
|
-
text-overflow: ellipsis;
|
|
1516
|
-
white-space: nowrap;
|
|
1517
|
-
}
|
|
1518
|
-
|
|
1519
|
-
.hanzo-ai-status .hanzo-dots::after {
|
|
1520
|
-
content: '';
|
|
1521
|
-
animation: hanzo-animated-dots 1.5s steps(4) infinite;
|
|
1522
|
-
}
|
|
1523
|
-
@keyframes hanzo-animated-dots {
|
|
1524
|
-
0% { content: ''; }
|
|
1525
|
-
25% { content: '.'; }
|
|
1526
|
-
50% { content: '..'; }
|
|
1527
|
-
75% { content: '...'; }
|
|
1528
|
-
}
|
|
1529
|
-
|
|
1530
|
-
.hanzo-ai-status .hanzo-stop-btn {
|
|
1531
|
-
border: 1px solid rgba(255, 255, 255, 0.24);
|
|
1532
|
-
background: rgba(0, 0, 0, 0.18);
|
|
1533
|
-
color: #f8fafc;
|
|
1534
|
-
border-radius: 10px;
|
|
1535
|
-
padding: 4px 12px;
|
|
1536
|
-
font-size: 12px;
|
|
1537
|
-
cursor: pointer;
|
|
1538
|
-
transition: background 0.15s, border-color 0.15s;
|
|
1539
|
-
}
|
|
1540
|
-
.hanzo-ai-status .hanzo-stop-btn:hover {
|
|
1541
|
-
background: rgba(220, 38, 38, 0.28);
|
|
1542
|
-
border-color: rgba(248, 113, 113, 0.6);
|
|
1543
|
-
}
|
|
1544
|
-
|
|
1545
|
-
/* ---- "Take Back Control" button (bottom-right) ---- */
|
|
1546
|
-
.hanzo-ai-cancel {
|
|
1547
|
-
position: fixed;
|
|
1548
|
-
bottom: 24px;
|
|
1549
|
-
right: 24px;
|
|
1550
|
-
z-index: 2147483647;
|
|
1551
|
-
padding: 12px 24px;
|
|
1552
|
-
border-radius: 10px;
|
|
1553
|
-
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
1554
|
-
background: rgba(15, 18, 24, 0.95);
|
|
1555
|
-
color: #f3f4f6;
|
|
1556
|
-
font: 600 14px/1.4 -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
1557
|
-
cursor: pointer;
|
|
1558
|
-
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
1559
|
-
pointer-events: auto;
|
|
1560
|
-
opacity: 0;
|
|
1561
|
-
transition: opacity 300ms ease, background 0.15s;
|
|
1562
|
-
}
|
|
1563
|
-
.hanzo-ai-cancel.hanzo-visible {
|
|
1564
|
-
opacity: 1;
|
|
1565
|
-
}
|
|
1566
|
-
.hanzo-ai-cancel:hover {
|
|
1567
|
-
background: rgba(220, 38, 38, 0.35);
|
|
1568
|
-
border-color: rgba(220, 38, 38, 0.5);
|
|
1569
|
-
}
|
|
1570
|
-
|
|
1571
|
-
/* ---- Element highlight ---- */
|
|
1572
|
-
.hanzo-ai-highlight {
|
|
1573
|
-
position: fixed;
|
|
1574
|
-
z-index: 2147483647;
|
|
1575
|
-
pointer-events: none;
|
|
1576
|
-
border: 2px solid rgba(6, 182, 212, 0.85);
|
|
1577
|
-
border-radius: 6px;
|
|
1578
|
-
box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.15);
|
|
1579
|
-
transition: left 0.15s, top 0.15s, width 0.15s, height 0.15s;
|
|
1580
|
-
}
|
|
1581
|
-
`;
|
|
1582
|
-
document.head.appendChild(style);
|
|
1583
|
-
}
|
|
1584
|
-
function isOverlayElement(target) {
|
|
1585
|
-
if (!(target instanceof Node)) return false;
|
|
1586
|
-
return !!((overlay == null ? void 0 : overlay.contains(target)) || (statusEl == null ? void 0 : statusEl.contains(target)) || (cancelBtn == null ? void 0 : cancelBtn.contains(target)) || (cursor == null ? void 0 : cursor.contains(target)) || (highlightEl == null ? void 0 : highlightEl.contains(target)));
|
|
1587
|
-
}
|
|
1588
|
-
function blockInteraction(event) {
|
|
1589
|
-
if (!interactionBlockActive) return;
|
|
1590
|
-
if (event instanceof KeyboardEvent && event.key === "Escape") {
|
|
1591
|
-
chrome.runtime.sendMessage({ action: "ai.control.cancel" });
|
|
1592
|
-
hide();
|
|
1593
|
-
return;
|
|
1594
|
-
}
|
|
1595
|
-
if (isOverlayElement(event.target)) return;
|
|
1596
|
-
event.preventDefault();
|
|
1597
|
-
event.stopPropagation();
|
|
1598
|
-
event.stopImmediatePropagation();
|
|
1599
|
-
}
|
|
1600
|
-
function setInteractionBlock(active) {
|
|
1601
|
-
if (interactionBlockActive === active) return;
|
|
1602
|
-
interactionBlockActive = active;
|
|
1603
|
-
for (const eventName of BLOCKED_EVENTS) {
|
|
1604
|
-
if (active) {
|
|
1605
|
-
document.addEventListener(eventName, blockInteraction, true);
|
|
1606
|
-
} else {
|
|
1607
|
-
document.removeEventListener(eventName, blockInteraction, true);
|
|
1608
|
-
}
|
|
1609
|
-
}
|
|
1610
|
-
}
|
|
1611
|
-
function show(task) {
|
|
1612
|
-
var _a2;
|
|
1613
|
-
if (overlay) hide();
|
|
1614
|
-
injectStyles();
|
|
1615
|
-
setInteractionBlock(true);
|
|
1616
|
-
overlay = document.createElement("div");
|
|
1617
|
-
overlay.id = OVERLAY_ID;
|
|
1618
|
-
document.body.appendChild(overlay);
|
|
1619
|
-
cursor = document.createElement("div");
|
|
1620
|
-
cursor.className = "hanzo-ai-cursor";
|
|
1621
|
-
cursor.style.left = `${window.innerWidth / 2}px`;
|
|
1622
|
-
cursor.style.top = `${window.innerHeight / 2}px`;
|
|
1623
|
-
document.body.appendChild(cursor);
|
|
1624
|
-
statusEl = document.createElement("div");
|
|
1625
|
-
statusEl.className = "hanzo-ai-status";
|
|
1626
|
-
statusEl.innerHTML = `
|
|
1627
|
-
<span class="hanzo-brand-bubble">AI</span>
|
|
1628
|
-
<div class="hanzo-pulse-dot"></div>
|
|
1629
|
-
<span class="hanzo-label">${escapeHtml(task || "Hanzo AI is controlling this tab")}</span><span class="hanzo-dots"></span>
|
|
1630
|
-
<button class="hanzo-stop-btn">Stop</button>
|
|
1631
|
-
`;
|
|
1632
|
-
document.body.appendChild(statusEl);
|
|
1633
|
-
(_a2 = statusEl.querySelector(".hanzo-stop-btn")) == null ? void 0 : _a2.addEventListener("click", () => {
|
|
1634
|
-
chrome.runtime.sendMessage({ action: "ai.control.cancel" });
|
|
1635
|
-
hide();
|
|
1636
|
-
});
|
|
1637
|
-
cancelBtn = document.createElement("button");
|
|
1638
|
-
cancelBtn.className = "hanzo-ai-cancel";
|
|
1639
|
-
cancelBtn.textContent = "Take Back Control";
|
|
1640
|
-
cancelBtn.addEventListener("click", () => {
|
|
1641
|
-
chrome.runtime.sendMessage({ action: "ai.control.cancel" });
|
|
1642
|
-
hide();
|
|
1643
|
-
});
|
|
1644
|
-
document.body.appendChild(cancelBtn);
|
|
1645
|
-
requestAnimationFrame(() => {
|
|
1646
|
-
overlay == null ? void 0 : overlay.classList.add("hanzo-visible");
|
|
1647
|
-
cursor == null ? void 0 : cursor.classList.add("hanzo-visible");
|
|
1648
|
-
statusEl == null ? void 0 : statusEl.classList.add("hanzo-visible");
|
|
1649
|
-
cancelBtn == null ? void 0 : cancelBtn.classList.add("hanzo-visible");
|
|
1650
|
-
});
|
|
1651
|
-
}
|
|
1652
|
-
function hide() {
|
|
1653
|
-
overlay == null ? void 0 : overlay.classList.remove("hanzo-visible");
|
|
1654
|
-
cursor == null ? void 0 : cursor.classList.remove("hanzo-visible");
|
|
1655
|
-
statusEl == null ? void 0 : statusEl.classList.remove("hanzo-visible");
|
|
1656
|
-
cancelBtn == null ? void 0 : cancelBtn.classList.remove("hanzo-visible");
|
|
1657
|
-
const refs = { overlay, cursor, statusEl, cancelBtn, highlightEl };
|
|
1658
|
-
const trails = [...trailNodes];
|
|
1659
|
-
setTimeout(() => {
|
|
1660
|
-
var _a2, _b2, _c2, _d2, _e2;
|
|
1661
|
-
(_a2 = refs.overlay) == null ? void 0 : _a2.remove();
|
|
1662
|
-
(_b2 = refs.cursor) == null ? void 0 : _b2.remove();
|
|
1663
|
-
(_c2 = refs.statusEl) == null ? void 0 : _c2.remove();
|
|
1664
|
-
(_d2 = refs.cancelBtn) == null ? void 0 : _d2.remove();
|
|
1665
|
-
(_e2 = refs.highlightEl) == null ? void 0 : _e2.remove();
|
|
1666
|
-
for (const node of trails) {
|
|
1667
|
-
node.remove();
|
|
1668
|
-
}
|
|
1669
|
-
}, 320);
|
|
1670
|
-
setInteractionBlock(false);
|
|
1671
|
-
overlay = null;
|
|
1672
|
-
cursor = null;
|
|
1673
|
-
statusEl = null;
|
|
1674
|
-
cancelBtn = null;
|
|
1675
|
-
highlightEl = null;
|
|
1676
|
-
trailNodes = [];
|
|
1677
|
-
}
|
|
1678
|
-
function moveCursor(x, y) {
|
|
1679
|
-
var _a2;
|
|
1680
|
-
if (!cursor) return;
|
|
1681
|
-
const clampedX = Math.max(0, Math.min(window.innerWidth, Number.isFinite(x) ? x : 0));
|
|
1682
|
-
const clampedY = Math.max(0, Math.min(window.innerHeight, Number.isFinite(y) ? y : 0));
|
|
1683
|
-
const trail = document.createElement("div");
|
|
1684
|
-
trail.className = "hanzo-cursor-trail";
|
|
1685
|
-
trail.style.left = `${clampedX}px`;
|
|
1686
|
-
trail.style.top = `${clampedY}px`;
|
|
1687
|
-
document.body.appendChild(trail);
|
|
1688
|
-
trailNodes.push(trail);
|
|
1689
|
-
setTimeout(() => {
|
|
1690
|
-
trail.remove();
|
|
1691
|
-
trailNodes = trailNodes.filter((node) => node !== trail);
|
|
1692
|
-
}, 400);
|
|
1693
|
-
while (trailNodes.length > 10) {
|
|
1694
|
-
(_a2 = trailNodes.shift()) == null ? void 0 : _a2.remove();
|
|
1695
|
-
}
|
|
1696
|
-
cursor.style.left = `${clampedX}px`;
|
|
1697
|
-
cursor.style.top = `${clampedY}px`;
|
|
1698
|
-
}
|
|
1699
|
-
function highlight(selector) {
|
|
1700
|
-
highlightEl == null ? void 0 : highlightEl.remove();
|
|
1701
|
-
highlightEl = null;
|
|
1702
|
-
if (!selector || typeof selector !== "string") return;
|
|
1703
|
-
try {
|
|
1704
|
-
const target = document.querySelector(selector);
|
|
1705
|
-
if (!target) return;
|
|
1706
|
-
const rect = target.getBoundingClientRect();
|
|
1707
|
-
if (rect.width === 0 && rect.height === 0) return;
|
|
1708
|
-
highlightEl = document.createElement("div");
|
|
1709
|
-
highlightEl.className = "hanzo-ai-highlight";
|
|
1710
|
-
highlightEl.style.left = `${Math.max(0, rect.left - 4)}px`;
|
|
1711
|
-
highlightEl.style.top = `${Math.max(0, rect.top - 4)}px`;
|
|
1712
|
-
highlightEl.style.width = `${rect.width + 8}px`;
|
|
1713
|
-
highlightEl.style.height = `${rect.height + 8}px`;
|
|
1714
|
-
document.body.appendChild(highlightEl);
|
|
1715
|
-
} catch {
|
|
1716
|
-
}
|
|
1717
|
-
}
|
|
1718
|
-
function updateStatus(text) {
|
|
1719
|
-
if (!statusEl) return;
|
|
1720
|
-
const label = statusEl.querySelector(".hanzo-label");
|
|
1721
|
-
if (label) {
|
|
1722
|
-
label.textContent = text || "Hanzo AI is controlling this tab";
|
|
1723
|
-
}
|
|
1724
|
-
}
|
|
1725
|
-
function escapeHtml(text) {
|
|
1726
|
-
const div = document.createElement("div");
|
|
1727
|
-
div.textContent = text;
|
|
1728
|
-
return div.innerHTML;
|
|
1729
|
-
}
|
|
1730
|
-
return { show, hide, moveCursor, highlight, updateStatus };
|
|
1731
|
-
})();
|
|
1732
|
-
var OVERLAY_WIDTH_PX = {
|
|
1733
|
-
compact: 320,
|
|
1734
|
-
default: 420,
|
|
1735
|
-
wide: 560
|
|
1736
|
-
};
|
|
1737
|
-
var HanzoPageOverlay = class {
|
|
1738
|
-
constructor() {
|
|
1739
|
-
this.mounted = false;
|
|
1740
|
-
this.enabled = false;
|
|
1741
|
-
this.open = false;
|
|
1742
|
-
this.side = "right";
|
|
1743
|
-
this.mode = "overlay";
|
|
1744
|
-
this.width = "default";
|
|
1745
|
-
this.sending = false;
|
|
1746
|
-
this.watchMode = false;
|
|
1747
|
-
this.editMode = false;
|
|
1748
|
-
this.modelsLoaded = false;
|
|
1749
|
-
this.messages = [];
|
|
1750
|
-
this.selectedContext = null;
|
|
1751
|
-
this.hoveredElement = null;
|
|
1752
|
-
this.editingElement = null;
|
|
1753
|
-
this.root = null;
|
|
1754
|
-
this.launcher = null;
|
|
1755
|
-
this.panel = null;
|
|
1756
|
-
this.messagesEl = null;
|
|
1757
|
-
this.inputEl = null;
|
|
1758
|
-
this.sendBtn = null;
|
|
1759
|
-
this.modelEl = null;
|
|
1760
|
-
this.contextEl = null;
|
|
1761
|
-
this.watchBtn = null;
|
|
1762
|
-
this.editBtn = null;
|
|
1763
|
-
this.statusEl = null;
|
|
1764
|
-
this.highlightBox = null;
|
|
1765
|
-
this.injectStyles();
|
|
1766
|
-
this.mount();
|
|
1767
|
-
this.bindGlobalEvents();
|
|
1768
|
-
this.restorePrefs();
|
|
1769
|
-
}
|
|
1770
|
-
restorePrefs() {
|
|
1771
|
-
var _a2, _b2;
|
|
1772
|
-
try {
|
|
1773
|
-
const ss = (_b2 = (_a2 = typeof browser !== "undefined" ? browser : chrome) == null ? void 0 : _a2.storage) == null ? void 0 : _b2.sync;
|
|
1774
|
-
if (!(ss == null ? void 0 : ss.get)) return;
|
|
1775
|
-
const promised = ss.get(["overlaySide", "overlayMode", "overlayWidth"]);
|
|
1776
|
-
const apply = (v) => {
|
|
1777
|
-
var _a3, _b3;
|
|
1778
|
-
if ((v == null ? void 0 : v.overlaySide) === "left" || (v == null ? void 0 : v.overlaySide) === "right") {
|
|
1779
|
-
this.side = v.overlaySide;
|
|
1780
|
-
(_a3 = this.root) == null ? void 0 : _a3.setAttribute("data-side", this.side);
|
|
1781
|
-
}
|
|
1782
|
-
if ((v == null ? void 0 : v.overlayMode) === "push" || (v == null ? void 0 : v.overlayMode) === "overlay") {
|
|
1783
|
-
this.mode = v.overlayMode;
|
|
1784
|
-
(_b3 = this.root) == null ? void 0 : _b3.setAttribute("data-mode", this.mode);
|
|
1785
|
-
}
|
|
1786
|
-
if ((v == null ? void 0 : v.overlayWidth) === "compact" || (v == null ? void 0 : v.overlayWidth) === "default" || (v == null ? void 0 : v.overlayWidth) === "wide") {
|
|
1787
|
-
this.width = v.overlayWidth;
|
|
1788
|
-
this.applyWidth();
|
|
1789
|
-
}
|
|
1790
|
-
this.applyPushIfOpen();
|
|
1791
|
-
};
|
|
1792
|
-
if (promised && typeof promised.then === "function") {
|
|
1793
|
-
promised.then(apply).catch(() => {
|
|
1794
|
-
});
|
|
1795
|
-
} else {
|
|
1796
|
-
ss.get(["overlaySide", "overlayMode", "overlayWidth"], apply);
|
|
1797
|
-
}
|
|
1798
|
-
} catch {
|
|
1799
|
-
}
|
|
1800
|
-
}
|
|
1801
|
-
applyWidth() {
|
|
1802
|
-
const px = OVERLAY_WIDTH_PX[this.width] ?? OVERLAY_WIDTH_PX.default;
|
|
1803
|
-
if (this.root) {
|
|
1804
|
-
this.root.style.setProperty("--hanzo-overlay-width", `${px}px`);
|
|
1805
|
-
this.root.style.width = `min(${px}px, 100vw)`;
|
|
1806
|
-
}
|
|
1807
|
-
document.documentElement.style.setProperty("--hanzo-overlay-width", `${px}px`);
|
|
1808
|
-
}
|
|
1809
|
-
applyPushIfOpen() {
|
|
1810
|
-
const html = document.documentElement;
|
|
1811
|
-
html.classList.remove("hanzo-overlay-push", "hanzo-overlay-push-left", "hanzo-overlay-push-right");
|
|
1812
|
-
if (this.open && this.enabled && this.mode === "push") {
|
|
1813
|
-
html.classList.add("hanzo-overlay-push", `hanzo-overlay-push-${this.side}`);
|
|
1814
|
-
}
|
|
1815
|
-
}
|
|
1816
|
-
toggle() {
|
|
1817
|
-
if (!this.enabled || !this.open) {
|
|
1818
|
-
this.show();
|
|
1819
|
-
return true;
|
|
1820
|
-
}
|
|
1821
|
-
this.hide();
|
|
1822
|
-
return false;
|
|
1823
|
-
}
|
|
1824
|
-
isOpen() {
|
|
1825
|
-
return this.open;
|
|
1826
|
-
}
|
|
1827
|
-
getSide() {
|
|
1828
|
-
return this.side;
|
|
1829
|
-
}
|
|
1830
|
-
getMode() {
|
|
1831
|
-
return this.mode;
|
|
1832
|
-
}
|
|
1833
|
-
setSide(side) {
|
|
1834
|
-
var _a2;
|
|
1835
|
-
this.side = side;
|
|
1836
|
-
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-side", side);
|
|
1837
|
-
this.applyPushIfOpen();
|
|
1838
|
-
this.persist({ overlaySide: side });
|
|
1839
|
-
}
|
|
1840
|
-
setMode(mode) {
|
|
1841
|
-
var _a2;
|
|
1842
|
-
this.mode = mode;
|
|
1843
|
-
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-mode", mode);
|
|
1844
|
-
this.applyPushIfOpen();
|
|
1845
|
-
this.persist({ overlayMode: mode });
|
|
1846
|
-
}
|
|
1847
|
-
setWidth(width) {
|
|
1848
|
-
this.width = width;
|
|
1849
|
-
this.applyWidth();
|
|
1850
|
-
this.persist({ overlayWidth: width });
|
|
1851
|
-
}
|
|
1852
|
-
setEnabled(enabled) {
|
|
1853
|
-
var _a2;
|
|
1854
|
-
this.enabled = enabled;
|
|
1855
|
-
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-enabled", enabled ? "true" : "false");
|
|
1856
|
-
if (!enabled) this.hide();
|
|
1857
|
-
this.persist({ overlayEnabled: enabled });
|
|
1858
|
-
}
|
|
1859
|
-
persist(values) {
|
|
1860
|
-
var _a2, _b2, _c2;
|
|
1861
|
-
try {
|
|
1862
|
-
const ss = (_b2 = (_a2 = typeof browser !== "undefined" ? browser : chrome) == null ? void 0 : _a2.storage) == null ? void 0 : _b2.sync;
|
|
1863
|
-
(_c2 = ss == null ? void 0 : ss.set) == null ? void 0 : _c2.call(ss, values);
|
|
1864
|
-
} catch {
|
|
1865
|
-
}
|
|
1866
|
-
}
|
|
1867
|
-
show() {
|
|
1868
|
-
var _a2, _b2;
|
|
1869
|
-
this.ensureMounted();
|
|
1870
|
-
this.enabled = true;
|
|
1871
|
-
this.open = true;
|
|
1872
|
-
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-enabled", "true");
|
|
1873
|
-
(_b2 = this.root) == null ? void 0 : _b2.setAttribute("data-open", "true");
|
|
1874
|
-
this.applyPushIfOpen();
|
|
1875
|
-
this.loadModels();
|
|
1876
|
-
this.focusInput();
|
|
1877
|
-
}
|
|
1878
|
-
hide() {
|
|
1879
|
-
var _a2;
|
|
1880
|
-
this.open = false;
|
|
1881
|
-
(_a2 = this.root) == null ? void 0 : _a2.setAttribute("data-open", "false");
|
|
1882
|
-
this.applyPushIfOpen();
|
|
1883
|
-
this.updateStatus("");
|
|
1884
|
-
this.clearHighlight();
|
|
1885
|
-
this.setWatchMode(false);
|
|
1886
|
-
this.setEditMode(false);
|
|
1887
|
-
}
|
|
1888
|
-
ensureMounted() {
|
|
1889
|
-
if (this.mounted) return;
|
|
1890
|
-
this.mount();
|
|
1891
|
-
}
|
|
1892
|
-
injectStyles() {
|
|
1893
|
-
if (document.getElementById("hanzo-page-overlay-styles")) return;
|
|
1894
|
-
const style = document.createElement("style");
|
|
1895
|
-
style.id = "hanzo-page-overlay-styles";
|
|
1896
|
-
style.textContent = `
|
|
1897
|
-
/* Edge-pinned sidebar panel \u2014 no FAB, opened from extension popup.
|
|
1898
|
-
Hanzo brand: monochrome (white primary, neutral surfaces). No blue. */
|
|
1899
|
-
#hanzo-page-overlay-root {
|
|
1900
|
-
position: fixed;
|
|
1901
|
-
top: 0;
|
|
1902
|
-
bottom: 0;
|
|
1903
|
-
right: 0;
|
|
1904
|
-
width: min(var(--hanzo-overlay-width, 420px), 100vw);
|
|
1905
|
-
z-index: 2147483645;
|
|
1906
|
-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
1907
|
-
pointer-events: none;
|
|
1908
|
-
}
|
|
1909
|
-
|
|
1910
|
-
#hanzo-page-overlay-root[data-side="left"] {
|
|
1911
|
-
right: auto;
|
|
1912
|
-
left: 0;
|
|
1913
|
-
}
|
|
1914
|
-
|
|
1915
|
-
#hanzo-page-overlay-root * {
|
|
1916
|
-
box-sizing: border-box;
|
|
1917
|
-
}
|
|
1918
|
-
|
|
1919
|
-
/* Push mode: when the user pins the panel as a dock, html shifts so
|
|
1920
|
-
page content reflows beside it instead of being covered. Applied to
|
|
1921
|
-
<html> from setMode('push') + open. */
|
|
1922
|
-
html.hanzo-overlay-push.hanzo-overlay-push-right {
|
|
1923
|
-
margin-right: var(--hanzo-overlay-width, 420px) !important;
|
|
1924
|
-
transition: margin-right 0.18s ease;
|
|
1925
|
-
}
|
|
1926
|
-
html.hanzo-overlay-push.hanzo-overlay-push-left {
|
|
1927
|
-
margin-left: var(--hanzo-overlay-width, 420px) !important;
|
|
1928
|
-
transition: margin-left 0.18s ease;
|
|
1929
|
-
}
|
|
1930
|
-
|
|
1931
|
-
.hanzo-page-panel {
|
|
1932
|
-
width: 100%;
|
|
1933
|
-
height: 100%;
|
|
1934
|
-
border-left: 1px solid rgba(255, 255, 255, 0.16);
|
|
1935
|
-
background: linear-gradient(180deg, rgba(10, 10, 11, 0.97), rgba(7, 7, 8, 0.97));
|
|
1936
|
-
color: #f5f5f5;
|
|
1937
|
-
overflow: hidden;
|
|
1938
|
-
box-shadow: -22px 0 48px rgba(0, 0, 0, 0.45);
|
|
1939
|
-
transform: translateX(100%);
|
|
1940
|
-
opacity: 0;
|
|
1941
|
-
pointer-events: none;
|
|
1942
|
-
display: flex;
|
|
1943
|
-
flex-direction: column;
|
|
1944
|
-
min-height: 0;
|
|
1945
|
-
transition: transform 0.18s ease, opacity 0.18s ease;
|
|
1946
|
-
}
|
|
1947
|
-
|
|
1948
|
-
#hanzo-page-overlay-root[data-side="left"] .hanzo-page-panel {
|
|
1949
|
-
border-left: none;
|
|
1950
|
-
border-right: 1px solid rgba(255, 255, 255, 0.16);
|
|
1951
|
-
box-shadow: 22px 0 48px rgba(0, 0, 0, 0.45);
|
|
1952
|
-
transform: translateX(-100%);
|
|
1953
|
-
}
|
|
1954
|
-
|
|
1955
|
-
#hanzo-page-overlay-root[data-open="true"] .hanzo-page-panel {
|
|
1956
|
-
transform: translateX(0);
|
|
1957
|
-
opacity: 1;
|
|
1958
|
-
pointer-events: auto;
|
|
1959
|
-
}
|
|
1960
|
-
|
|
1961
|
-
.hanzo-page-header {
|
|
1962
|
-
display: flex;
|
|
1963
|
-
align-items: center;
|
|
1964
|
-
justify-content: space-between;
|
|
1965
|
-
padding: 12px 14px;
|
|
1966
|
-
border-bottom: 1px solid rgba(255, 255, 255, 0.10);
|
|
1967
|
-
background: linear-gradient(180deg, rgba(255, 255, 255, 0.03), transparent);
|
|
1968
|
-
flex-shrink: 0;
|
|
1969
|
-
}
|
|
1970
|
-
|
|
1971
|
-
.hanzo-page-brand {
|
|
1972
|
-
font-weight: 700;
|
|
1973
|
-
letter-spacing: 0.2px;
|
|
1974
|
-
font-size: 13px;
|
|
1975
|
-
color: #f5f5f5;
|
|
1976
|
-
}
|
|
1977
|
-
|
|
1978
|
-
.hanzo-page-header-actions {
|
|
1979
|
-
display: inline-flex;
|
|
1980
|
-
align-items: center;
|
|
1981
|
-
gap: 6px;
|
|
1982
|
-
}
|
|
1983
|
-
|
|
1984
|
-
.hanzo-chip-btn {
|
|
1985
|
-
border: 1px solid rgba(255, 255, 255, 0.2);
|
|
1986
|
-
border-radius: 9999px;
|
|
1987
|
-
padding: 4px 10px;
|
|
1988
|
-
background: transparent;
|
|
1989
|
-
color: rgba(245, 245, 245, 0.85);
|
|
1990
|
-
cursor: pointer;
|
|
1991
|
-
font-size: 11px;
|
|
1992
|
-
transition: background 0.15s, color 0.15s, border-color 0.15s;
|
|
1993
|
-
}
|
|
1994
|
-
|
|
1995
|
-
.hanzo-chip-btn:hover {
|
|
1996
|
-
background: rgba(255, 255, 255, 0.06);
|
|
1997
|
-
color: #fff;
|
|
1998
|
-
}
|
|
1999
|
-
|
|
2000
|
-
.hanzo-chip-btn[data-active="true"] {
|
|
2001
|
-
border-color: rgba(255, 255, 255, 0.7);
|
|
2002
|
-
background: rgba(255, 255, 255, 0.10);
|
|
2003
|
-
color: #fff;
|
|
2004
|
-
}
|
|
2005
|
-
|
|
2006
|
-
.hanzo-icon-btn {
|
|
2007
|
-
width: 28px;
|
|
2008
|
-
height: 28px;
|
|
2009
|
-
border-radius: 8px;
|
|
2010
|
-
border: 1px solid rgba(255, 255, 255, 0.18);
|
|
2011
|
-
background: transparent;
|
|
2012
|
-
color: #f5f5f5;
|
|
2013
|
-
cursor: pointer;
|
|
2014
|
-
font-size: 14px;
|
|
2015
|
-
display: inline-flex;
|
|
2016
|
-
align-items: center;
|
|
2017
|
-
justify-content: center;
|
|
2018
|
-
padding: 0;
|
|
2019
|
-
transition: background 0.15s, border-color 0.15s;
|
|
2020
|
-
}
|
|
2021
|
-
|
|
2022
|
-
.hanzo-icon-btn:hover {
|
|
2023
|
-
background: rgba(255, 255, 255, 0.06);
|
|
2024
|
-
}
|
|
2025
|
-
|
|
2026
|
-
.hanzo-icon-btn[data-active="true"] {
|
|
2027
|
-
background: rgba(255, 255, 255, 0.12);
|
|
2028
|
-
border-color: rgba(255, 255, 255, 0.5);
|
|
2029
|
-
}
|
|
2030
|
-
|
|
2031
|
-
.hanzo-icon-btn svg {
|
|
2032
|
-
width: 14px;
|
|
2033
|
-
height: 14px;
|
|
2034
|
-
}
|
|
2035
|
-
|
|
2036
|
-
.hanzo-page-meta {
|
|
2037
|
-
padding: 10px 14px 6px 14px;
|
|
2038
|
-
display: grid;
|
|
2039
|
-
grid-template-columns: 1fr auto;
|
|
2040
|
-
gap: 8px;
|
|
2041
|
-
align-items: center;
|
|
2042
|
-
flex-shrink: 0;
|
|
2043
|
-
}
|
|
2044
|
-
|
|
2045
|
-
.hanzo-page-context {
|
|
2046
|
-
font-size: 11px;
|
|
2047
|
-
color: rgba(245, 245, 245, 0.65);
|
|
2048
|
-
overflow: hidden;
|
|
2049
|
-
text-overflow: ellipsis;
|
|
2050
|
-
white-space: nowrap;
|
|
2051
|
-
}
|
|
2052
|
-
|
|
2053
|
-
.hanzo-page-status {
|
|
2054
|
-
font-size: 11px;
|
|
2055
|
-
color: rgba(245, 245, 245, 0.55);
|
|
2056
|
-
}
|
|
2057
|
-
|
|
2058
|
-
.hanzo-model-row {
|
|
2059
|
-
padding: 0 14px 8px 14px;
|
|
2060
|
-
flex-shrink: 0;
|
|
2061
|
-
}
|
|
2062
|
-
|
|
2063
|
-
.hanzo-model-row select {
|
|
2064
|
-
width: 100%;
|
|
2065
|
-
border-radius: 8px;
|
|
2066
|
-
border: 1px solid rgba(255, 255, 255, 0.16);
|
|
2067
|
-
background: rgba(255, 255, 255, 0.03);
|
|
2068
|
-
color: #f5f5f5;
|
|
2069
|
-
padding: 7px 9px;
|
|
2070
|
-
font-size: 12px;
|
|
2071
|
-
}
|
|
2072
|
-
|
|
2073
|
-
/* The chat scroller: takes ALL remaining vertical space so the
|
|
2074
|
-
composer below stays sticky against the bottom of the panel. */
|
|
2075
|
-
.hanzo-page-messages {
|
|
2076
|
-
flex: 1 1 auto;
|
|
2077
|
-
min-height: 0;
|
|
2078
|
-
overflow-y: auto;
|
|
2079
|
-
padding: 8px 14px 12px 14px;
|
|
2080
|
-
display: flex;
|
|
2081
|
-
flex-direction: column;
|
|
2082
|
-
gap: 8px;
|
|
2083
|
-
}
|
|
2084
|
-
|
|
2085
|
-
.hanzo-page-msg {
|
|
2086
|
-
padding: 9px 10px;
|
|
2087
|
-
border-radius: 10px;
|
|
2088
|
-
font-size: 12px;
|
|
2089
|
-
line-height: 1.45;
|
|
2090
|
-
word-break: break-word;
|
|
2091
|
-
}
|
|
2092
|
-
|
|
2093
|
-
.hanzo-page-msg.user {
|
|
2094
|
-
align-self: flex-end;
|
|
2095
|
-
max-width: 88%;
|
|
2096
|
-
background: rgba(255, 255, 255, 0.10);
|
|
2097
|
-
border: 1px solid rgba(255, 255, 255, 0.18);
|
|
2098
|
-
}
|
|
2099
|
-
|
|
2100
|
-
.hanzo-page-msg.assistant {
|
|
2101
|
-
align-self: flex-start;
|
|
2102
|
-
max-width: 92%;
|
|
2103
|
-
background: rgba(255, 255, 255, 0.04);
|
|
2104
|
-
border: 1px solid rgba(255, 255, 255, 0.10);
|
|
2105
|
-
}
|
|
2106
|
-
|
|
2107
|
-
/* Composer pinned to bottom of the panel. flex-shrink: 0 prevents
|
|
2108
|
-
it from collapsing when the messages scroller grows. */
|
|
2109
|
-
.hanzo-page-composer {
|
|
2110
|
-
border-top: 1px solid rgba(255, 255, 255, 0.10);
|
|
2111
|
-
padding: 10px 12px;
|
|
2112
|
-
display: flex;
|
|
2113
|
-
gap: 8px;
|
|
2114
|
-
align-items: flex-end;
|
|
2115
|
-
background: rgba(0, 0, 0, 0.35);
|
|
2116
|
-
flex-shrink: 0;
|
|
2117
|
-
}
|
|
2118
|
-
|
|
2119
|
-
.hanzo-page-composer textarea {
|
|
2120
|
-
flex: 1;
|
|
2121
|
-
min-height: 38px;
|
|
2122
|
-
max-height: 110px;
|
|
2123
|
-
resize: none;
|
|
2124
|
-
border-radius: 10px;
|
|
2125
|
-
border: 1px solid rgba(255, 255, 255, 0.17);
|
|
2126
|
-
background: rgba(255, 255, 255, 0.03);
|
|
2127
|
-
color: #f5f5f5;
|
|
2128
|
-
padding: 9px 11px;
|
|
2129
|
-
font-size: 12px;
|
|
2130
|
-
}
|
|
2131
|
-
|
|
2132
|
-
/* Primary action: WHITE per @hanzo/brand monochrome guidelines. */
|
|
2133
|
-
.hanzo-page-composer button {
|
|
2134
|
-
min-width: 68px;
|
|
2135
|
-
height: 38px;
|
|
2136
|
-
border-radius: 10px;
|
|
2137
|
-
border: 1px solid #ffffff;
|
|
2138
|
-
background: #ffffff;
|
|
2139
|
-
color: #0a0a0b;
|
|
2140
|
-
font-weight: 600;
|
|
2141
|
-
font-size: 12px;
|
|
2142
|
-
cursor: pointer;
|
|
2143
|
-
transition: background 0.12s, transform 0.08s;
|
|
2144
|
-
}
|
|
2145
|
-
|
|
2146
|
-
.hanzo-page-composer button:hover:not(:disabled) {
|
|
2147
|
-
background: #f5f5f5;
|
|
2148
|
-
}
|
|
2149
|
-
|
|
2150
|
-
.hanzo-page-composer button:active:not(:disabled) {
|
|
2151
|
-
transform: translateY(1px);
|
|
2152
|
-
}
|
|
2153
|
-
|
|
2154
|
-
.hanzo-page-composer button:disabled {
|
|
2155
|
-
opacity: 0.55;
|
|
2156
|
-
cursor: default;
|
|
2157
|
-
}
|
|
2158
|
-
|
|
2159
|
-
.hanzo-page-highlight {
|
|
2160
|
-
position: fixed;
|
|
2161
|
-
z-index: 2147483644;
|
|
2162
|
-
pointer-events: none;
|
|
2163
|
-
border: 2px solid rgba(255, 255, 255, 0.95);
|
|
2164
|
-
border-radius: 6px;
|
|
2165
|
-
box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.2);
|
|
2166
|
-
}
|
|
2167
|
-
|
|
2168
|
-
[data-hanzo-inline-editing="true"] {
|
|
2169
|
-
outline: 2px solid rgba(255, 255, 255, 0.92) !important;
|
|
2170
|
-
outline-offset: 2px !important;
|
|
2171
|
-
}
|
|
2172
|
-
`;
|
|
2173
|
-
document.head.appendChild(style);
|
|
2174
|
-
}
|
|
2175
|
-
mount() {
|
|
2176
|
-
var _a2, _b2, _c2, _d2, _e2, _f2;
|
|
2177
|
-
if (this.mounted) return;
|
|
2178
|
-
this.root = document.createElement("div");
|
|
2179
|
-
this.root.id = "hanzo-page-overlay-root";
|
|
2180
|
-
this.root.setAttribute("data-open", "false");
|
|
2181
|
-
this.root.setAttribute("data-enabled", "false");
|
|
2182
|
-
this.root.setAttribute("data-side", this.side);
|
|
2183
|
-
this.root.setAttribute("data-mode", this.mode);
|
|
2184
|
-
this.applyWidth();
|
|
2185
|
-
this.root.innerHTML = `
|
|
2186
|
-
<div class="hanzo-page-panel" role="dialog" aria-label="Hanzo Page Assistant">
|
|
2187
|
-
<div class="hanzo-page-header">
|
|
2188
|
-
<div class="hanzo-page-brand">Hanzo</div>
|
|
2189
|
-
<div class="hanzo-page-header-actions">
|
|
2190
|
-
<button class="hanzo-chip-btn" data-role="watch" data-active="false" title="Watch elements on hover">Watch</button>
|
|
2191
|
-
<button class="hanzo-chip-btn" data-role="edit" data-active="false" title="Click any element to edit text">Edit</button>
|
|
2192
|
-
<button class="hanzo-icon-btn" data-role="pin-mode" title="Toggle: pin (push content) vs overlay (float over page)">
|
|
2193
|
-
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true">
|
|
2194
|
-
<path d="M9 4v16M3 4h12a4 4 0 0 1 4 4v8a4 4 0 0 1-4 4H3z"/>
|
|
2195
|
-
</svg>
|
|
2196
|
-
</button>
|
|
2197
|
-
<button class="hanzo-icon-btn" data-role="close" title="Hide overlay">\xD7</button>
|
|
2198
|
-
</div>
|
|
2199
|
-
</div>
|
|
2200
|
-
<div class="hanzo-page-meta">
|
|
2201
|
-
<div class="hanzo-page-context">Use Watch to inspect page elements.</div>
|
|
2202
|
-
<span class="hanzo-page-status"></span>
|
|
2203
|
-
</div>
|
|
2204
|
-
<div class="hanzo-model-row">
|
|
2205
|
-
<select data-role="model">
|
|
2206
|
-
<option value="claude-sonnet-4-20250514">Claude Sonnet 4</option>
|
|
2207
|
-
<option value="claude-opus-4-20250514">Claude Opus 4</option>
|
|
2208
|
-
<option value="gpt-4o">GPT-4o</option>
|
|
2209
|
-
<option value="zen-coder-flash">Zen Coder Flash</option>
|
|
2210
|
-
<option value="zen-max">Zen Max</option>
|
|
2211
|
-
</select>
|
|
2212
|
-
</div>
|
|
2213
|
-
<div class="hanzo-page-messages" data-role="messages">
|
|
2214
|
-
<div class="hanzo-page-msg assistant">Ask about this page, inspect any element, or turn on Edit mode to change text in-place.</div>
|
|
2215
|
-
</div>
|
|
2216
|
-
<div class="hanzo-page-composer">
|
|
2217
|
-
<textarea data-role="input" rows="1" placeholder="Ask about this page..."></textarea>
|
|
2218
|
-
<button data-role="send" type="button">Ask</button>
|
|
2219
|
-
</div>
|
|
2220
|
-
</div>
|
|
2221
|
-
`;
|
|
2222
|
-
this.panel = this.root.querySelector(".hanzo-page-panel");
|
|
2223
|
-
this.launcher = null;
|
|
2224
|
-
this.messagesEl = this.root.querySelector('[data-role="messages"]');
|
|
2225
|
-
this.inputEl = this.root.querySelector('[data-role="input"]');
|
|
2226
|
-
this.sendBtn = this.root.querySelector('[data-role="send"]');
|
|
2227
|
-
this.modelEl = this.root.querySelector('[data-role="model"]');
|
|
2228
|
-
this.contextEl = this.root.querySelector(".hanzo-page-context");
|
|
2229
|
-
this.watchBtn = this.root.querySelector('[data-role="watch"]');
|
|
2230
|
-
this.editBtn = this.root.querySelector('[data-role="edit"]');
|
|
2231
|
-
this.statusEl = this.root.querySelector(".hanzo-page-status");
|
|
2232
|
-
(_a2 = this.root.querySelector('[data-role="close"]')) == null ? void 0 : _a2.addEventListener("click", () => this.hide());
|
|
2233
|
-
const pinModeBtn = this.root.querySelector('[data-role="pin-mode"]');
|
|
2234
|
-
pinModeBtn == null ? void 0 : pinModeBtn.setAttribute("data-active", this.mode === "push" ? "true" : "false");
|
|
2235
|
-
pinModeBtn == null ? void 0 : pinModeBtn.addEventListener("click", () => {
|
|
2236
|
-
const next = this.mode === "push" ? "overlay" : "push";
|
|
2237
|
-
this.setMode(next);
|
|
2238
|
-
pinModeBtn.setAttribute("data-active", next === "push" ? "true" : "false");
|
|
2239
|
-
});
|
|
2240
|
-
(_b2 = this.watchBtn) == null ? void 0 : _b2.addEventListener("click", () => this.setWatchMode(!this.watchMode));
|
|
2241
|
-
(_c2 = this.editBtn) == null ? void 0 : _c2.addEventListener("click", () => this.setEditMode(!this.editMode));
|
|
2242
|
-
(_d2 = this.sendBtn) == null ? void 0 : _d2.addEventListener("click", () => this.askPageQuestion());
|
|
2243
|
-
(_e2 = this.inputEl) == null ? void 0 : _e2.addEventListener("keydown", (event) => {
|
|
2244
|
-
if (event.key === "Enter" && !event.shiftKey) {
|
|
2245
|
-
event.preventDefault();
|
|
2246
|
-
this.askPageQuestion();
|
|
2247
|
-
}
|
|
2248
|
-
});
|
|
2249
|
-
(_f2 = this.inputEl) == null ? void 0 : _f2.addEventListener("input", () => {
|
|
2250
|
-
if (!this.inputEl) return;
|
|
2251
|
-
this.inputEl.style.height = "auto";
|
|
2252
|
-
this.inputEl.style.height = `${Math.min(this.inputEl.scrollHeight, 110)}px`;
|
|
2253
|
-
});
|
|
2254
|
-
document.documentElement.appendChild(this.root);
|
|
2255
|
-
this.mounted = true;
|
|
2256
|
-
}
|
|
2257
|
-
bindGlobalEvents() {
|
|
2258
|
-
document.addEventListener("mousemove", (event) => this.onMouseMove(event), true);
|
|
2259
|
-
document.addEventListener("click", (event) => this.onDocumentClick(event), true);
|
|
2260
|
-
document.addEventListener("keydown", (event) => this.onKeyDown(event), true);
|
|
2261
|
-
}
|
|
2262
|
-
onMouseMove(event) {
|
|
2263
|
-
if (!this.watchMode) return;
|
|
2264
|
-
const target = this.getPageTarget(event.target);
|
|
2265
|
-
if (!target) return;
|
|
2266
|
-
this.hoveredElement = target;
|
|
2267
|
-
this.showHighlight(target);
|
|
2268
|
-
if (!this.selectedContext) {
|
|
2269
|
-
this.contextEl && (this.contextEl.textContent = this.getElementSummary(target));
|
|
2270
|
-
}
|
|
2271
|
-
}
|
|
2272
|
-
onDocumentClick(event) {
|
|
2273
|
-
if (!this.watchMode && !this.editMode) return;
|
|
2274
|
-
const target = this.getPageTarget(event.target);
|
|
2275
|
-
if (!target) return;
|
|
2276
|
-
event.preventDefault();
|
|
2277
|
-
event.stopPropagation();
|
|
2278
|
-
event.stopImmediatePropagation();
|
|
2279
|
-
if (this.watchMode) {
|
|
2280
|
-
this.selectedContext = this.captureElementContext(target);
|
|
2281
|
-
this.contextEl && (this.contextEl.textContent = this.getElementSummary(target));
|
|
2282
|
-
this.updateStatus("Element selected");
|
|
2283
|
-
}
|
|
2284
|
-
if (this.editMode) {
|
|
2285
|
-
this.enableInlineEdit(target);
|
|
2286
|
-
this.updateStatus("Editing element");
|
|
2287
|
-
}
|
|
2288
|
-
}
|
|
2289
|
-
onKeyDown(event) {
|
|
2290
|
-
if (event.key === "Escape") {
|
|
2291
|
-
if (this.editingElement) {
|
|
2292
|
-
this.disableInlineEdit(this.editingElement, false);
|
|
2293
|
-
this.updateStatus("Edit canceled");
|
|
2294
|
-
event.preventDefault();
|
|
2295
|
-
return;
|
|
2296
|
-
}
|
|
2297
|
-
if (this.open) {
|
|
2298
|
-
this.hide();
|
|
2299
|
-
event.preventDefault();
|
|
2300
|
-
}
|
|
2301
|
-
}
|
|
2302
|
-
}
|
|
2303
|
-
getPageTarget(target) {
|
|
2304
|
-
var _a2;
|
|
2305
|
-
if (!(target instanceof HTMLElement)) return null;
|
|
2306
|
-
if ((_a2 = this.root) == null ? void 0 : _a2.contains(target)) return null;
|
|
2307
|
-
if (!target.isConnected) return null;
|
|
2308
|
-
if (target.tagName.toLowerCase() === "html" || target.tagName.toLowerCase() === "body") return null;
|
|
2309
|
-
return target;
|
|
2310
|
-
}
|
|
2311
|
-
setWatchMode(active) {
|
|
2312
|
-
var _a2;
|
|
2313
|
-
this.watchMode = active;
|
|
2314
|
-
if (active) this.setEditMode(false);
|
|
2315
|
-
(_a2 = this.watchBtn) == null ? void 0 : _a2.setAttribute("data-active", active ? "true" : "false");
|
|
2316
|
-
if (!active) {
|
|
2317
|
-
this.hoveredElement = null;
|
|
2318
|
-
this.clearHighlight();
|
|
2319
|
-
if (!this.selectedContext && this.contextEl) {
|
|
2320
|
-
this.contextEl.textContent = "Use Watch to inspect page elements.";
|
|
2321
|
-
}
|
|
2322
|
-
} else {
|
|
2323
|
-
this.updateStatus("Watch mode on");
|
|
2324
|
-
}
|
|
2325
|
-
}
|
|
2326
|
-
setEditMode(active) {
|
|
2327
|
-
var _a2;
|
|
2328
|
-
this.editMode = active;
|
|
2329
|
-
if (active) this.setWatchMode(false);
|
|
2330
|
-
(_a2 = this.editBtn) == null ? void 0 : _a2.setAttribute("data-active", active ? "true" : "false");
|
|
2331
|
-
if (!active && this.editingElement) {
|
|
2332
|
-
this.disableInlineEdit(this.editingElement, true);
|
|
2333
|
-
} else if (active) {
|
|
2334
|
-
this.updateStatus("Edit mode on");
|
|
2335
|
-
}
|
|
2336
|
-
}
|
|
2337
|
-
enableInlineEdit(element) {
|
|
2338
|
-
if (this.editingElement && this.editingElement !== element) {
|
|
2339
|
-
this.disableInlineEdit(this.editingElement, true);
|
|
2340
|
-
}
|
|
2341
|
-
if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {
|
|
2342
|
-
element.focus();
|
|
2343
|
-
this.editingElement = element;
|
|
2344
|
-
return;
|
|
2345
|
-
}
|
|
2346
|
-
if (!element.hasAttribute("data-hanzo-original-html")) {
|
|
2347
|
-
element.setAttribute("data-hanzo-original-html", element.innerHTML);
|
|
2348
|
-
}
|
|
2349
|
-
element.setAttribute("contenteditable", "true");
|
|
2350
|
-
element.setAttribute("spellcheck", "true");
|
|
2351
|
-
element.setAttribute("data-hanzo-inline-editing", "true");
|
|
2352
|
-
element.focus();
|
|
2353
|
-
this.editingElement = element;
|
|
2354
|
-
const keydownHandler = (event) => {
|
|
2355
|
-
if (event.key === "Escape") {
|
|
2356
|
-
this.disableInlineEdit(element, false);
|
|
2357
|
-
this.updateStatus("Edit reverted");
|
|
2358
|
-
}
|
|
2359
|
-
if (event.key === "Enter" && !event.shiftKey) {
|
|
2360
|
-
event.preventDefault();
|
|
2361
|
-
this.disableInlineEdit(element, true);
|
|
2362
|
-
this.updateStatus("Edit applied");
|
|
2363
|
-
}
|
|
2364
|
-
};
|
|
2365
|
-
const blurHandler = () => {
|
|
2366
|
-
this.disableInlineEdit(element, true);
|
|
2367
|
-
this.updateStatus("Edit applied");
|
|
2368
|
-
};
|
|
2369
|
-
element.addEventListener("keydown", keydownHandler, { once: true });
|
|
2370
|
-
element.addEventListener("blur", blurHandler, { once: true });
|
|
2371
|
-
}
|
|
2372
|
-
disableInlineEdit(element, keepChanges) {
|
|
2373
|
-
if (!keepChanges) {
|
|
2374
|
-
const original = element.getAttribute("data-hanzo-original-html");
|
|
2375
|
-
if (original !== null) {
|
|
2376
|
-
element.innerHTML = original;
|
|
2377
|
-
}
|
|
2378
|
-
}
|
|
2379
|
-
element.removeAttribute("contenteditable");
|
|
2380
|
-
element.removeAttribute("spellcheck");
|
|
2381
|
-
element.removeAttribute("data-hanzo-inline-editing");
|
|
2382
|
-
element.removeAttribute("data-hanzo-original-html");
|
|
2383
|
-
if (this.editingElement === element) {
|
|
2384
|
-
this.editingElement = null;
|
|
2385
|
-
}
|
|
2386
|
-
}
|
|
2387
|
-
showHighlight(element) {
|
|
2388
|
-
const rect = element.getBoundingClientRect();
|
|
2389
|
-
if (rect.width === 0 && rect.height === 0) {
|
|
2390
|
-
this.clearHighlight();
|
|
2391
|
-
return;
|
|
2392
|
-
}
|
|
2393
|
-
if (!this.highlightBox) {
|
|
2394
|
-
this.highlightBox = document.createElement("div");
|
|
2395
|
-
this.highlightBox.className = "hanzo-page-highlight";
|
|
2396
|
-
document.documentElement.appendChild(this.highlightBox);
|
|
2397
|
-
}
|
|
2398
|
-
this.highlightBox.style.left = `${Math.max(0, rect.left - 3)}px`;
|
|
2399
|
-
this.highlightBox.style.top = `${Math.max(0, rect.top - 3)}px`;
|
|
2400
|
-
this.highlightBox.style.width = `${rect.width + 6}px`;
|
|
2401
|
-
this.highlightBox.style.height = `${rect.height + 6}px`;
|
|
2402
|
-
}
|
|
2403
|
-
clearHighlight() {
|
|
2404
|
-
var _a2;
|
|
2405
|
-
(_a2 = this.highlightBox) == null ? void 0 : _a2.remove();
|
|
2406
|
-
this.highlightBox = null;
|
|
2407
|
-
}
|
|
2408
|
-
captureElementContext(element) {
|
|
2409
|
-
const text = this.normalizeText(element.innerText || element.textContent || "");
|
|
2410
|
-
return {
|
|
2411
|
-
selector: this.buildSelector(element),
|
|
2412
|
-
tag: element.tagName.toLowerCase(),
|
|
2413
|
-
text: text.slice(0, 800),
|
|
2414
|
-
html: element.outerHTML.slice(0, 1200)
|
|
2415
|
-
};
|
|
2416
|
-
}
|
|
2417
|
-
buildSelector(element) {
|
|
2418
|
-
if (element.id) return `#${element.id}`;
|
|
2419
|
-
const parts = [];
|
|
2420
|
-
let current = element;
|
|
2421
|
-
let depth = 0;
|
|
2422
|
-
while (current && depth < 6) {
|
|
2423
|
-
let part = current.tagName.toLowerCase();
|
|
2424
|
-
if (current.classList.length > 0) {
|
|
2425
|
-
const className = Array.from(current.classList).slice(0, 2).join(".");
|
|
2426
|
-
if (className) part += `.${className}`;
|
|
2427
|
-
}
|
|
2428
|
-
const parent = current.parentElement;
|
|
2429
|
-
if (parent) {
|
|
2430
|
-
const siblings = Array.from(parent.children).filter((node) => node.tagName === current.tagName);
|
|
2431
|
-
if (siblings.length > 1) {
|
|
2432
|
-
const index = siblings.indexOf(current) + 1;
|
|
2433
|
-
part += `:nth-of-type(${index})`;
|
|
2434
|
-
}
|
|
2435
|
-
}
|
|
2436
|
-
parts.unshift(part);
|
|
2437
|
-
current = parent;
|
|
2438
|
-
depth += 1;
|
|
2439
|
-
}
|
|
2440
|
-
return parts.join(" > ");
|
|
2441
|
-
}
|
|
2442
|
-
normalizeText(value) {
|
|
2443
|
-
return value.replace(/\s+/g, " ").trim();
|
|
2444
|
-
}
|
|
2445
|
-
getElementSummary(element) {
|
|
2446
|
-
const ctx = this.captureElementContext(element);
|
|
2447
|
-
return `${ctx.tag} \u2022 ${ctx.selector}`;
|
|
2448
|
-
}
|
|
2449
|
-
async loadModels() {
|
|
2450
|
-
if (this.modelsLoaded || !this.modelEl) return;
|
|
2451
|
-
try {
|
|
2452
|
-
const response = await chrome.runtime.sendMessage({ action: "chat.listModels" });
|
|
2453
|
-
if (!(response == null ? void 0 : response.success) || !Array.isArray(response.models) || !response.models.length) {
|
|
2454
|
-
return;
|
|
2455
|
-
}
|
|
2456
|
-
const previous = this.modelEl.value;
|
|
2457
|
-
this.modelEl.innerHTML = "";
|
|
2458
|
-
for (const model of response.models) {
|
|
2459
|
-
if (!(model == null ? void 0 : model.id)) continue;
|
|
2460
|
-
const option = document.createElement("option");
|
|
2461
|
-
option.value = model.id;
|
|
2462
|
-
option.textContent = model.name || model.id;
|
|
2463
|
-
this.modelEl.appendChild(option);
|
|
2464
|
-
}
|
|
2465
|
-
if (previous && Array.from(this.modelEl.options).some((opt) => opt.value === previous)) {
|
|
2466
|
-
this.modelEl.value = previous;
|
|
2467
|
-
}
|
|
2468
|
-
this.modelsLoaded = true;
|
|
2469
|
-
} catch {
|
|
2470
|
-
}
|
|
2471
|
-
}
|
|
2472
|
-
focusInput() {
|
|
2473
|
-
if (!this.inputEl) return;
|
|
2474
|
-
this.inputEl.focus();
|
|
2475
|
-
}
|
|
2476
|
-
appendMessage(role, content) {
|
|
2477
|
-
if (!this.messagesEl) return;
|
|
2478
|
-
const div = document.createElement("div");
|
|
2479
|
-
div.className = `hanzo-page-msg ${role}`;
|
|
2480
|
-
div.textContent = content;
|
|
2481
|
-
this.messagesEl.appendChild(div);
|
|
2482
|
-
this.messagesEl.scrollTop = this.messagesEl.scrollHeight;
|
|
2483
|
-
}
|
|
2484
|
-
updateStatus(text) {
|
|
2485
|
-
if (!this.statusEl) return;
|
|
2486
|
-
this.statusEl.textContent = text;
|
|
2487
|
-
}
|
|
2488
|
-
buildPageContext() {
|
|
2489
|
-
var _a2, _b2;
|
|
2490
|
-
const selection = this.normalizeText(((_b2 = (_a2 = window.getSelection) == null ? void 0 : _a2.call(window)) == null ? void 0 : _b2.toString()) || "");
|
|
2491
|
-
const contextLines = [
|
|
2492
|
-
`URL: ${location.href}`,
|
|
2493
|
-
`Title: ${document.title || "Untitled"}`
|
|
2494
|
-
];
|
|
2495
|
-
if (selection) {
|
|
2496
|
-
contextLines.push(`TextSelection: ${selection.slice(0, 600)}`);
|
|
2497
|
-
}
|
|
2498
|
-
const elementContext = this.selectedContext || (this.hoveredElement ? this.captureElementContext(this.hoveredElement) : null);
|
|
2499
|
-
if (elementContext) {
|
|
2500
|
-
contextLines.push(`ElementSelector: ${elementContext.selector}`);
|
|
2501
|
-
if (elementContext.text) contextLines.push(`ElementText: ${elementContext.text.slice(0, 600)}`);
|
|
2502
|
-
contextLines.push(`ElementHTML: ${elementContext.html.slice(0, 800)}`);
|
|
2503
|
-
}
|
|
2504
|
-
return contextLines.join("\n");
|
|
2505
|
-
}
|
|
2506
|
-
async askPageQuestion() {
|
|
2507
|
-
var _a2;
|
|
2508
|
-
if (this.sending || !this.inputEl) return;
|
|
2509
|
-
const prompt = this.normalizeText(this.inputEl.value);
|
|
2510
|
-
if (!prompt) return;
|
|
2511
|
-
const tokenResp = await chrome.runtime.sendMessage({ action: "auth.getToken" });
|
|
2512
|
-
if (!(tokenResp == null ? void 0 : tokenResp.success) || !tokenResp.token) {
|
|
2513
|
-
this.appendMessage("assistant", "Please sign in from the Hanzo sidebar/popup before using page chat.");
|
|
2514
|
-
return;
|
|
2515
|
-
}
|
|
2516
|
-
this.sending = true;
|
|
2517
|
-
this.updateStatus("Thinking...");
|
|
2518
|
-
this.sendBtn && (this.sendBtn.disabled = true);
|
|
2519
|
-
this.inputEl.value = "";
|
|
2520
|
-
this.inputEl.style.height = "auto";
|
|
2521
|
-
this.appendMessage("user", prompt);
|
|
2522
|
-
const systemContext = this.buildPageContext();
|
|
2523
|
-
const model = ((_a2 = this.modelEl) == null ? void 0 : _a2.value) || "gpt-4o";
|
|
2524
|
-
const requestMessages = [
|
|
2525
|
-
{
|
|
2526
|
-
role: "system",
|
|
2527
|
-
content: [
|
|
2528
|
-
"You are Hanzo page overlay assistant.",
|
|
2529
|
-
"Use provided page context and selected element context when relevant.",
|
|
2530
|
-
"Be concise and provide concrete UI or DOM edit suggestions when asked.",
|
|
2531
|
-
"",
|
|
2532
|
-
systemContext
|
|
2533
|
-
].join("\n")
|
|
2534
|
-
},
|
|
2535
|
-
...this.messages.slice(-8),
|
|
2536
|
-
{ role: "user", content: prompt }
|
|
2537
|
-
];
|
|
2538
|
-
try {
|
|
2539
|
-
const response = await chrome.runtime.sendMessage({
|
|
2540
|
-
action: "chat.complete",
|
|
2541
|
-
model,
|
|
2542
|
-
messages: requestMessages
|
|
2543
|
-
});
|
|
2544
|
-
if (!(response == null ? void 0 : response.success) || !response.content) {
|
|
2545
|
-
throw new Error((response == null ? void 0 : response.error) || "No response from chat service");
|
|
2546
|
-
}
|
|
2547
|
-
const answer = String(response.content).trim();
|
|
2548
|
-
this.appendMessage("assistant", answer || "No response content.");
|
|
2549
|
-
this.messages.push({ role: "user", content: prompt }, { role: "assistant", content: answer });
|
|
2550
|
-
this.messages = this.messages.slice(-20);
|
|
2551
|
-
this.updateStatus("Ready");
|
|
2552
|
-
} catch (error) {
|
|
2553
|
-
this.appendMessage("assistant", `Error: ${(error == null ? void 0 : error.message) || "Chat request failed"}`);
|
|
2554
|
-
this.updateStatus("Error");
|
|
2555
|
-
} finally {
|
|
2556
|
-
this.sending = false;
|
|
2557
|
-
this.sendBtn && (this.sendBtn.disabled = false);
|
|
2558
|
-
this.focusInput();
|
|
2559
|
-
}
|
|
2560
|
-
}
|
|
2561
|
-
};
|
|
2562
|
-
var pageOverlay = new HanzoPageOverlay();
|
|
2563
|
-
var elementPicker = /* @__PURE__ */ (() => {
|
|
2564
|
-
let active = false;
|
|
2565
|
-
let overlay = null;
|
|
2566
|
-
let label = null;
|
|
2567
|
-
let hoveredEl = null;
|
|
2568
|
-
function getSelector(el) {
|
|
2569
|
-
if (el.id) return `#${el.id}`;
|
|
2570
|
-
const tag = el.tagName.toLowerCase();
|
|
2571
|
-
const classes = Array.from(el.classList).filter((c) => !c.startsWith("hanzo-")).slice(0, 3);
|
|
2572
|
-
let selector = tag;
|
|
2573
|
-
if (classes.length) selector += `.${classes.join(".")}`;
|
|
2574
|
-
const matches = document.querySelectorAll(selector);
|
|
2575
|
-
if (matches.length > 1) {
|
|
2576
|
-
const parent = el.parentElement;
|
|
2577
|
-
if (parent) {
|
|
2578
|
-
const idx = Array.from(parent.children).indexOf(el) + 1;
|
|
2579
|
-
selector += `:nth-child(${idx})`;
|
|
2580
|
-
}
|
|
2581
|
-
}
|
|
2582
|
-
return selector;
|
|
2583
|
-
}
|
|
2584
|
-
function getFullPath(el) {
|
|
2585
|
-
const parts = [];
|
|
2586
|
-
let cur = el;
|
|
2587
|
-
while (cur && cur !== document.documentElement) {
|
|
2588
|
-
parts.unshift(getSelector(cur));
|
|
2589
|
-
cur = cur.parentElement;
|
|
2590
|
-
}
|
|
2591
|
-
return parts.join(" > ");
|
|
2592
|
-
}
|
|
2593
|
-
function ensureOverlay() {
|
|
2594
|
-
if (overlay) return;
|
|
2595
|
-
overlay = document.createElement("div");
|
|
2596
|
-
overlay.id = "hanzo-picker-overlay";
|
|
2597
|
-
overlay.style.cssText = "position:fixed;pointer-events:none;z-index:2147483646;border:2px solid #fff;border-radius:3px;background:rgba(255,255,255,0.06);transition:all 0.1s ease;display:none;";
|
|
2598
|
-
label = document.createElement("div");
|
|
2599
|
-
label.id = "hanzo-picker-label";
|
|
2600
|
-
label.style.cssText = "position:fixed;z-index:2147483647;pointer-events:none;background:#000;color:#fff;font:11px/1.4 Geist Mono,Menlo,monospace;padding:3px 8px;border-radius:4px;max-width:400px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:none;box-shadow:0 2px 8px rgba(0,0,0,0.4);";
|
|
2601
|
-
document.body.appendChild(overlay);
|
|
2602
|
-
document.body.appendChild(label);
|
|
2603
|
-
}
|
|
2604
|
-
function onMove(e) {
|
|
2605
|
-
var _a2;
|
|
2606
|
-
if (!active) return;
|
|
2607
|
-
const target = e.target;
|
|
2608
|
-
if (!target || target === overlay || target === label) return;
|
|
2609
|
-
if ((_a2 = target.id) == null ? void 0 : _a2.startsWith("hanzo-picker")) return;
|
|
2610
|
-
hoveredEl = target;
|
|
2611
|
-
const rect = target.getBoundingClientRect();
|
|
2612
|
-
if (overlay) {
|
|
2613
|
-
overlay.style.display = "block";
|
|
2614
|
-
overlay.style.top = rect.top + "px";
|
|
2615
|
-
overlay.style.left = rect.left + "px";
|
|
2616
|
-
overlay.style.width = rect.width + "px";
|
|
2617
|
-
overlay.style.height = rect.height + "px";
|
|
2618
|
-
}
|
|
2619
|
-
if (label) {
|
|
2620
|
-
label.style.display = "block";
|
|
2621
|
-
label.textContent = getSelector(target);
|
|
2622
|
-
const labelTop = rect.top - 28;
|
|
2623
|
-
label.style.top = (labelTop > 0 ? labelTop : rect.bottom + 4) + "px";
|
|
2624
|
-
label.style.left = rect.left + "px";
|
|
2625
|
-
}
|
|
2626
|
-
}
|
|
2627
|
-
function onClick(e) {
|
|
2628
|
-
if (!active) return;
|
|
2629
|
-
e.preventDefault();
|
|
2630
|
-
e.stopPropagation();
|
|
2631
|
-
e.stopImmediatePropagation();
|
|
2632
|
-
const el = hoveredEl || e.target;
|
|
2633
|
-
if (!el) return;
|
|
2634
|
-
const selector = getSelector(el);
|
|
2635
|
-
const fullPath = getFullPath(el);
|
|
2636
|
-
const tag = el.tagName.toLowerCase();
|
|
2637
|
-
const text = (el.textContent || "").trim().slice(0, 80);
|
|
2638
|
-
const rect = el.getBoundingClientRect();
|
|
2639
|
-
const info = [
|
|
2640
|
-
`Selector: ${selector}`,
|
|
2641
|
-
`Path: ${fullPath}`,
|
|
2642
|
-
`Tag: ${tag}`,
|
|
2643
|
-
`Size: ${Math.round(rect.width)}x${Math.round(rect.height)}`,
|
|
2644
|
-
el.id ? `ID: ${el.id}` : "",
|
|
2645
|
-
el.className ? `Classes: ${el.className}` : "",
|
|
2646
|
-
text ? `Text: "${text}"` : ""
|
|
2647
|
-
].filter(Boolean).join("\n");
|
|
2648
|
-
navigator.clipboard.writeText(info).catch(() => {
|
|
2649
|
-
});
|
|
2650
|
-
chrome.runtime.sendMessage({ action: "elementSelected", data: { selector, fullPath, tag, text, rect: { x: rect.x, y: rect.y, w: rect.width, h: rect.height } } });
|
|
2651
|
-
stop();
|
|
2652
|
-
}
|
|
2653
|
-
function onKey(e) {
|
|
2654
|
-
if (e.key === "Escape") {
|
|
2655
|
-
e.preventDefault();
|
|
2656
|
-
stop();
|
|
2657
|
-
}
|
|
2658
|
-
}
|
|
2659
|
-
function start() {
|
|
2660
|
-
if (active) return;
|
|
2661
|
-
active = true;
|
|
2662
|
-
ensureOverlay();
|
|
2663
|
-
document.addEventListener("mousemove", onMove, true);
|
|
2664
|
-
document.addEventListener("click", onClick, true);
|
|
2665
|
-
document.addEventListener("keydown", onKey, true);
|
|
2666
|
-
document.body.style.cursor = "crosshair";
|
|
2667
|
-
}
|
|
2668
|
-
function stop() {
|
|
2669
|
-
active = false;
|
|
2670
|
-
document.removeEventListener("mousemove", onMove, true);
|
|
2671
|
-
document.removeEventListener("click", onClick, true);
|
|
2672
|
-
document.removeEventListener("keydown", onKey, true);
|
|
2673
|
-
document.body.style.cursor = "";
|
|
2674
|
-
if (overlay) overlay.style.display = "none";
|
|
2675
|
-
if (label) label.style.display = "none";
|
|
2676
|
-
hoveredEl = null;
|
|
2677
|
-
}
|
|
2678
|
-
return { start, stop };
|
|
2679
|
-
})();
|
|
2680
|
-
function gatherPageInfo() {
|
|
2681
|
-
const meta = (name) => {
|
|
2682
|
-
var _a2;
|
|
2683
|
-
return ((_a2 = document.querySelector(`meta[name="${name}"], meta[property="${name}"]`)) == null ? void 0 : _a2.getAttribute("content")) || "";
|
|
2684
|
-
};
|
|
2685
|
-
const lines = [
|
|
2686
|
-
`Title: ${document.title}`,
|
|
2687
|
-
`URL: ${location.href}`,
|
|
2688
|
-
`Description: ${meta("description") || meta("og:description")}`,
|
|
2689
|
-
`Charset: ${document.characterSet}`,
|
|
2690
|
-
`Language: ${document.documentElement.lang || "unknown"}`,
|
|
2691
|
-
`Viewport: ${meta("viewport")}`
|
|
2692
|
-
];
|
|
2693
|
-
const frameworks = [];
|
|
2694
|
-
if (window.__REACT_DEVTOOLS_GLOBAL_HOOK__) frameworks.push("React");
|
|
2695
|
-
if (window.__VUE_DEVTOOLS_GLOBAL_HOOK__) frameworks.push("Vue");
|
|
2696
|
-
if (window.__svelte) frameworks.push("Svelte");
|
|
2697
|
-
if (window.__NEXT_DATA__) frameworks.push("Next.js");
|
|
2698
|
-
if (window.__NUXT__) frameworks.push("Nuxt");
|
|
2699
|
-
if (document.querySelector("[ng-version]")) frameworks.push("Angular");
|
|
2700
|
-
if (frameworks.length) lines.push(`Frameworks: ${frameworks.join(", ")}`);
|
|
2701
|
-
const scripts = document.querySelectorAll("script[src]").length;
|
|
2702
|
-
const styles = document.querySelectorAll('link[rel="stylesheet"]').length;
|
|
2703
|
-
const images = document.querySelectorAll("img").length;
|
|
2704
|
-
const links = document.querySelectorAll("a[href]").length;
|
|
2705
|
-
lines.push(`Resources: ${scripts} scripts, ${styles} stylesheets, ${images} images, ${links} links`);
|
|
2706
|
-
const perf = performance.getEntriesByType("navigation")[0];
|
|
2707
|
-
if (perf) {
|
|
2708
|
-
lines.push(`Load: ${Math.round(perf.loadEventEnd - perf.startTime)}ms (DOM: ${Math.round(perf.domContentLoadedEventEnd - perf.startTime)}ms)`);
|
|
2709
|
-
}
|
|
2710
|
-
return lines.filter((l) => !l.endsWith(": ")).join("\n");
|
|
2711
|
-
}
|
|
2712
|
-
var inlineConsole = /* @__PURE__ */ (() => {
|
|
2713
|
-
let root = null;
|
|
2714
|
-
let input = null;
|
|
2715
|
-
let output = null;
|
|
2716
|
-
let visible = false;
|
|
2717
|
-
function ensureMount() {
|
|
2718
|
-
if (root) return;
|
|
2719
|
-
root = document.createElement("div");
|
|
2720
|
-
root.id = "hanzo-console-root";
|
|
2721
|
-
root.style.cssText = "position:fixed;bottom:20px;left:20px;right:20px;z-index:2147483646;font-family:Geist Mono,Menlo,Consolas,monospace;font-size:12px;display:none;";
|
|
2722
|
-
root.innerHTML = `
|
|
2723
|
-
<div style="background:rgba(0,0,0,0.92);backdrop-filter:blur(12px);border:1px solid rgba(255,255,255,0.15);border-radius:10px;overflow:hidden;box-shadow:0 8px 32px rgba(0,0,0,0.5);">
|
|
2724
|
-
<div id="hanzo-console-output" style="max-height:200px;overflow-y:auto;padding:8px 12px;color:#ccc;white-space:pre-wrap;word-break:break-all;"></div>
|
|
2725
|
-
<div style="display:flex;align-items:center;border-top:1px solid rgba(255,255,255,0.1);padding:0 12px;">
|
|
2726
|
-
<span style="color:#666;margin-right:6px;">></span>
|
|
2727
|
-
<input id="hanzo-console-input" type="text" placeholder="eval(...)" style="flex:1;background:transparent;border:none;color:#fff;font:inherit;padding:10px 0;outline:none;">
|
|
2728
|
-
<span style="color:#444;font-size:10px;margin-left:8px;">Esc to close</span>
|
|
2729
|
-
</div>
|
|
2730
|
-
</div>
|
|
2731
|
-
`;
|
|
2732
|
-
document.body.appendChild(root);
|
|
2733
|
-
input = root.querySelector("#hanzo-console-input");
|
|
2734
|
-
output = root.querySelector("#hanzo-console-output");
|
|
2735
|
-
input == null ? void 0 : input.addEventListener("keydown", (e) => {
|
|
2736
|
-
if (e.key === "Escape") {
|
|
2737
|
-
hide();
|
|
2738
|
-
return;
|
|
2739
|
-
}
|
|
2740
|
-
if (e.key !== "Enter" || !(input == null ? void 0 : input.value.trim())) return;
|
|
2741
|
-
const expr = input.value.trim();
|
|
2742
|
-
input.value = "";
|
|
2743
|
-
appendLine(`> ${expr}`, "#888");
|
|
2744
|
-
try {
|
|
2745
|
-
const result = (0, eval)(expr);
|
|
2746
|
-
appendLine(String(result), "#4CAF50");
|
|
2747
|
-
} catch (err) {
|
|
2748
|
-
appendLine((err == null ? void 0 : err.message) || String(err), "#F44336");
|
|
2749
|
-
}
|
|
2750
|
-
});
|
|
2751
|
-
}
|
|
2752
|
-
function appendLine(text, color) {
|
|
2753
|
-
if (!output) return;
|
|
2754
|
-
const line = document.createElement("div");
|
|
2755
|
-
line.style.color = color;
|
|
2756
|
-
line.textContent = text;
|
|
2757
|
-
output.appendChild(line);
|
|
2758
|
-
output.scrollTop = output.scrollHeight;
|
|
2759
|
-
}
|
|
2760
|
-
function show() {
|
|
2761
|
-
ensureMount();
|
|
2762
|
-
if (root) root.style.display = "block";
|
|
2763
|
-
visible = true;
|
|
2764
|
-
setTimeout(() => input == null ? void 0 : input.focus(), 50);
|
|
2765
|
-
}
|
|
2766
|
-
function hide() {
|
|
2767
|
-
if (root) root.style.display = "none";
|
|
2768
|
-
visible = false;
|
|
2769
|
-
}
|
|
2770
|
-
return { show, hide, isVisible: () => visible };
|
|
2771
|
-
})();
|
|
2772
|
-
new HanzoContentScript();
|
|
2773
|
-
var _a, _b, _c, _d, _e, _f;
|
|
2774
|
-
try {
|
|
2775
|
-
const port = ((_b = (_a = browser == null ? void 0 : browser.runtime) == null ? void 0 : _a.connect) == null ? void 0 : _b.call(_a, { name: "zap-keepalive" })) || ((_d = (_c = chrome == null ? void 0 : chrome.runtime) == null ? void 0 : _c.connect) == null ? void 0 : _d.call(_c, { name: "zap-keepalive" }));
|
|
2776
|
-
if (port) {
|
|
2777
|
-
const tick = setInterval(() => {
|
|
2778
|
-
try {
|
|
2779
|
-
port.postMessage({ type: "ping", t: Date.now() });
|
|
2780
|
-
} catch {
|
|
2781
|
-
clearInterval(tick);
|
|
2782
|
-
}
|
|
2783
|
-
}, 1e4);
|
|
2784
|
-
(_f = (_e = port.onDisconnect) == null ? void 0 : _e.addListener) == null ? void 0 : _f.call(_e, () => clearInterval(tick));
|
|
2785
|
-
}
|
|
2786
|
-
} catch {
|
|
2787
|
-
}
|
|
2788
|
-
})();
|
|
2789
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbEAwLjEyLjAvbm9kZV9tb2R1bGVzL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbC9kaXN0L2Jyb3dzZXItcG9seWZpbGwuanMiLCAiLi4vLi4vc3JjL2NvbnRlbnQtc2NyaXB0LnRzIiwgIi4uLy4uL3NyYy9zaGFyZWQvc2hvcnRjdXQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIHdlYmV4dGVuc2lvbi1wb2x5ZmlsbCAtIHYwLjEyLjAgLSBUdWUgTWF5IDE0IDIwMjQgMTg6MDE6MjkgKi9cbi8qIC0qLSBNb2RlOiBpbmRlbnQtdGFicy1tb2RlOiBuaWw7IGpzLWluZGVudC1sZXZlbDogMiAtKi0gKi9cbi8qIHZpbTogc2V0IHN0cz0yIHN3PTIgZXQgdHc9ODA6ICovXG4vKiBUaGlzIFNvdXJjZSBDb2RlIEZvcm0gaXMgc3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhlIE1vemlsbGEgUHVibGljXG4gKiBMaWNlbnNlLCB2LiAyLjAuIElmIGEgY29weSBvZiB0aGUgTVBMIHdhcyBub3QgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzXG4gKiBmaWxlLCBZb3UgY2FuIG9idGFpbiBvbmUgYXQgaHR0cDovL21vemlsbGEub3JnL01QTC8yLjAvLiAqL1xuXCJ1c2Ugc3RyaWN0XCI7XG5cbmlmICghKGdsb2JhbFRoaXMuY2hyb21lICYmIGdsb2JhbFRoaXMuY2hyb21lLnJ1bnRpbWUgJiYgZ2xvYmFsVGhpcy5jaHJvbWUucnVudGltZS5pZCkpIHtcbiAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBzY3JpcHQgc2hvdWxkIG9ubHkgYmUgbG9hZGVkIGluIGEgYnJvd3NlciBleHRlbnNpb24uXCIpO1xufVxuXG5pZiAoIShnbG9iYWxUaGlzLmJyb3dzZXIgJiYgZ2xvYmFsVGhpcy5icm93c2VyLnJ1bnRpbWUgJiYgZ2xvYmFsVGhpcy5icm93c2VyLnJ1bnRpbWUuaWQpKSB7XG4gIGNvbnN0IENIUk9NRV9TRU5EX01FU1NBR0VfQ0FMTEJBQ0tfTk9fUkVTUE9OU0VfTUVTU0FHRSA9IFwiVGhlIG1lc3NhZ2UgcG9ydCBjbG9zZWQgYmVmb3JlIGEgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLlwiO1xuXG4gIC8vIFdyYXBwaW5nIHRoZSBidWxrIG9mIHRoaXMgcG9seWZpbGwgaW4gYSBvbmUtdGltZS11c2UgZnVuY3Rpb24gaXMgYSBtaW5vclxuICAvLyBvcHRpbWl6YXRpb24gZm9yIEZpcmVmb3guIFNpbmNlIFNwaWRlcm1vbmtleSBkb2VzIG5vdCBmdWxseSBwYXJzZSB0aGVcbiAgLy8gY29udGVudHMgb2YgYSBmdW5jdGlvbiB1bnRpbCB0aGUgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHNpbmNlIGl0IHdpbGxcbiAgLy8gbmV2ZXIgYWN0dWFsbHkgbmVlZCB0byBiZSBjYWxsZWQsIHRoaXMgYWxsb3dzIHRoZSBwb2x5ZmlsbCB0byBiZSBpbmNsdWRlZFxuICAvLyBpbiBGaXJlZm94IG5lYXJseSBmb3IgZnJlZS5cbiAgY29uc3Qgd3JhcEFQSXMgPSBleHRlbnNpb25BUElzID0+IHtcbiAgICAvLyBOT1RFOiBhcGlNZXRhZGF0YSBpcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250ZW50IG9mIHRoZSBhcGktbWV0YWRhdGEuanNvbiBmaWxlXG4gICAgLy8gYXQgYnVpbGQgdGltZSBieSByZXBsYWNpbmcgdGhlIGZvbGxvd2luZyBcImluY2x1ZGVcIiB3aXRoIHRoZSBjb250ZW50IG9mIHRoZVxuICAgIC8vIEpTT04gZmlsZS5cbiAgICBjb25zdCBhcGlNZXRhZGF0YSA9IHtcbiAgICAgIFwiYWxhcm1zXCI6IHtcbiAgICAgICAgXCJjbGVhclwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJjbGVhckFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJib29rbWFya3NcIjoge1xuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0Q2hpbGRyZW5cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0UmVjZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFN1YlRyZWVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VHJlZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVUcmVlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImJyb3dzZXJBY3Rpb25cIjoge1xuICAgICAgICBcImRpc2FibGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVuYWJsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QmFkZ2VCYWNrZ3JvdW5kQ29sb3JcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QmFkZ2VUZXh0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFBvcHVwXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFRpdGxlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW5Qb3B1cFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRCYWRnZUJhY2tncm91bmRDb2xvclwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0QmFkZ2VUZXh0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRJY29uXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNldFBvcHVwXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRUaXRsZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImJyb3dzaW5nRGF0YVwiOiB7XG4gICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUNhY2hlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUNvb2tpZXNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlRG93bmxvYWRzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUZvcm1EYXRhXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUhpc3RvcnlcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlTG9jYWxTdG9yYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVBhc3N3b3Jkc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVQbHVnaW5EYXRhXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb21tYW5kc1wiOiB7XG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb250ZXh0TWVudXNcIjoge1xuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwidXBkYXRlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJjb29raWVzXCI6IHtcbiAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEFsbENvb2tpZVN0b3Jlc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJkZXZ0b29sc1wiOiB7XG4gICAgICAgIFwiaW5zcGVjdGVkV2luZG93XCI6IHtcbiAgICAgICAgICBcImV2YWxcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMixcbiAgICAgICAgICAgIFwic2luZ2xlQ2FsbGJhY2tBcmdcIjogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwicGFuZWxzXCI6IHtcbiAgICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMyxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAzLFxuICAgICAgICAgICAgXCJzaW5nbGVDYWxsYmFja0FyZ1wiOiB0cnVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcImVsZW1lbnRzXCI6IHtcbiAgICAgICAgICAgIFwiY3JlYXRlU2lkZWJhclBhbmVcIjoge1xuICAgICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImRvd25sb2Fkc1wiOiB7XG4gICAgICAgIFwiY2FuY2VsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRvd25sb2FkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImVyYXNlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEZpbGVJY29uXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcIm9wZW5cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBhdXNlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZUZpbGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVzdW1lXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJzaG93XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMSxcbiAgICAgICAgICBcImZhbGxiYWNrVG9Ob0NhbGxiYWNrXCI6IHRydWVcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiZXh0ZW5zaW9uXCI6IHtcbiAgICAgICAgXCJpc0FsbG93ZWRGaWxlU2NoZW1lQWNjZXNzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImlzQWxsb3dlZEluY29nbml0b0FjY2Vzc1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiaGlzdG9yeVwiOiB7XG4gICAgICAgIFwiYWRkVXJsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImRlbGV0ZUFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxldGVSYW5nZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZWxldGVVcmxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VmlzaXRzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwiaTE4blwiOiB7XG4gICAgICAgIFwiZGV0ZWN0TGFuZ3VhZ2VcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWNjZXB0TGFuZ3VhZ2VzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJpZGVudGl0eVwiOiB7XG4gICAgICAgIFwibGF1bmNoV2ViQXV0aEZsb3dcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcImlkbGVcIjoge1xuICAgICAgICBcInF1ZXJ5U3RhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIm1hbmFnZW1lbnRcIjoge1xuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0U2VsZlwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRFbmFibGVkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInVuaW5zdGFsbFNlbGZcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcIm5vdGlmaWNhdGlvbnNcIjoge1xuICAgICAgICBcImNsZWFyXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRBbGxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0UGVybWlzc2lvbkxldmVsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwicGFnZUFjdGlvblwiOiB7XG4gICAgICAgIFwiZ2V0UG9wdXBcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0VGl0bGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlkZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0SWNvblwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRQb3B1cFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDEsXG4gICAgICAgICAgXCJmYWxsYmFja1RvTm9DYWxsYmFja1wiOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0VGl0bGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInNob3dcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxLFxuICAgICAgICAgIFwiZmFsbGJhY2tUb05vQ2FsbGJhY2tcIjogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJwZXJtaXNzaW9uc1wiOiB7XG4gICAgICAgIFwiY29udGFpbnNcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0QWxsXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJydW50aW1lXCI6IHtcbiAgICAgICAgXCJnZXRCYWNrZ3JvdW5kUGFnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRQbGF0Zm9ybUluZm9cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAwXG4gICAgICAgIH0sXG4gICAgICAgIFwib3Blbk9wdGlvbnNQYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcInJlcXVlc3RVcGRhdGVDaGVja1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZW5kTWVzc2FnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDNcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZW5kTmF0aXZlTWVzc2FnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDIsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXRVbmluc3RhbGxVUkxcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInNlc3Npb25zXCI6IHtcbiAgICAgICAgXCJnZXREZXZpY2VzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldFJlY2VudGx5Q2xvc2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlc3RvcmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInN0b3JhZ2VcIjoge1xuICAgICAgICBcImxvY2FsXCI6IHtcbiAgICAgICAgICBcImNsZWFyXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInNldFwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcIm1hbmFnZWRcIjoge1xuICAgICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwiZ2V0Qnl0ZXNJblVzZVwiOiB7XG4gICAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcInN5bmNcIjoge1xuICAgICAgICAgIFwiY2xlYXJcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRcIjoge1xuICAgICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICAgIH0sXG4gICAgICAgICAgXCJnZXRCeXRlc0luVXNlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwicmVtb3ZlXCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9LFxuICAgICAgICAgIFwic2V0XCI6IHtcbiAgICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBcInRhYnNcIjoge1xuICAgICAgICBcImNhcHR1cmVWaXNpYmxlVGFiXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImNyZWF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRlY3RMYW5ndWFnZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXNjYXJkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImR1cGxpY2F0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJleGVjdXRlU2NyaXB0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRDdXJyZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9LFxuICAgICAgICBcImdldFpvb21cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0Wm9vbVNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdvQmFja1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnb0ZvcndhcmRcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGlnaGxpZ2h0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImluc2VydENTU1wiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtb3ZlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInF1ZXJ5XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbG9hZFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfSxcbiAgICAgICAgXCJyZW1vdmVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwicmVtb3ZlQ1NTXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInNlbmRNZXNzYWdlXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMixcbiAgICAgICAgICBcIm1heEFyZ3NcIjogM1xuICAgICAgICB9LFxuICAgICAgICBcInNldFpvb21cIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAxLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH0sXG4gICAgICAgIFwic2V0Wm9vbVNldHRpbmdzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcInVwZGF0ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwidG9wU2l0ZXNcIjoge1xuICAgICAgICBcImdldFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDBcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIFwid2ViTmF2aWdhdGlvblwiOiB7XG4gICAgICAgIFwiZ2V0QWxsRnJhbWVzXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldEZyYW1lXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ3ZWJSZXF1ZXN0XCI6IHtcbiAgICAgICAgXCJoYW5kbGVyQmVoYXZpb3JDaGFuZ2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMFxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgXCJ3aW5kb3dzXCI6IHtcbiAgICAgICAgXCJjcmVhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAwLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAxXG4gICAgICAgIH0sXG4gICAgICAgIFwiZ2V0XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMSxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMlxuICAgICAgICB9LFxuICAgICAgICBcImdldEFsbFwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDAsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJnZXRDdXJyZW50XCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcImdldExhc3RGb2N1c2VkXCI6IHtcbiAgICAgICAgICBcIm1pbkFyZ3NcIjogMCxcbiAgICAgICAgICBcIm1heEFyZ3NcIjogMVxuICAgICAgICB9LFxuICAgICAgICBcInJlbW92ZVwiOiB7XG4gICAgICAgICAgXCJtaW5BcmdzXCI6IDEsXG4gICAgICAgICAgXCJtYXhBcmdzXCI6IDFcbiAgICAgICAgfSxcbiAgICAgICAgXCJ1cGRhdGVcIjoge1xuICAgICAgICAgIFwibWluQXJnc1wiOiAyLFxuICAgICAgICAgIFwibWF4QXJnc1wiOiAyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKE9iamVjdC5rZXlzKGFwaU1ldGFkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImFwaS1tZXRhZGF0YS5qc29uIGhhcyBub3QgYmVlbiBpbmNsdWRlZCBpbiBicm93c2VyLXBvbHlmaWxsXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgV2Vha01hcCBzdWJjbGFzcyB3aGljaCBjcmVhdGVzIGFuZCBzdG9yZXMgYSB2YWx1ZSBmb3IgYW55IGtleSB3aGljaCBkb2VzXG4gICAgICogbm90IGV4aXN0IHdoZW4gYWNjZXNzZWQsIGJ1dCBiZWhhdmVzIGV4YWN0bHkgYXMgYW4gb3JkaW5hcnkgV2Vha01hcFxuICAgICAqIG90aGVyd2lzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IGNyZWF0ZUl0ZW1cbiAgICAgKiAgICAgICAgQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCBpbiBvcmRlciB0byBjcmVhdGUgdGhlIHZhbHVlIGZvciBhbnlcbiAgICAgKiAgICAgICAga2V5IHdoaWNoIGRvZXMgbm90IGV4aXN0LCB0aGUgZmlyc3QgdGltZSBpdCBpcyBhY2Nlc3NlZC4gVGhlXG4gICAgICogICAgICAgIGZ1bmN0aW9uIHJlY2VpdmVzLCBhcyBpdHMgb25seSBhcmd1bWVudCwgdGhlIGtleSBiZWluZyBjcmVhdGVkLlxuICAgICAqL1xuICAgIGNsYXNzIERlZmF1bHRXZWFrTWFwIGV4dGVuZHMgV2Vha01hcCB7XG4gICAgICBjb25zdHJ1Y3RvcihjcmVhdGVJdGVtLCBpdGVtcyA9IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcihpdGVtcyk7XG4gICAgICAgIHRoaXMuY3JlYXRlSXRlbSA9IGNyZWF0ZUl0ZW07XG4gICAgICB9XG5cbiAgICAgIGdldChrZXkpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgdGhpcy5zZXQoa2V5LCB0aGlzLmNyZWF0ZUl0ZW0oa2V5KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgYW4gb2JqZWN0IHdpdGggYSBgdGhlbmAgbWV0aG9kLCBhbmQgY2FuXG4gICAgICogdGhlcmVmb3JlIGJlIGFzc3VtZWQgdG8gYmVoYXZlIGFzIGEgUHJvbWlzZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHRoZW5hYmxlLlxuICAgICAqL1xuICAgIGNvbnN0IGlzVGhlbmFibGUgPSB2YWx1ZSA9PiB7XG4gICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZS50aGVuID09PSBcImZ1bmN0aW9uXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBmdW5jdGlvbiB3aGljaCwgd2hlbiBjYWxsZWQsIHdpbGwgcmVzb2x2ZSBvciByZWplY3RcbiAgICAgKiB0aGUgZ2l2ZW4gcHJvbWlzZSBiYXNlZCBvbiBob3cgaXQgaXMgY2FsbGVkOlxuICAgICAqXG4gICAgICogLSBJZiwgd2hlbiBjYWxsZWQsIGBjaHJvbWUucnVudGltZS5sYXN0RXJyb3JgIGNvbnRhaW5zIGEgbm9uLW51bGwgb2JqZWN0LFxuICAgICAqICAgdGhlIHByb21pc2UgaXMgcmVqZWN0ZWQgd2l0aCB0aGF0IHZhbHVlLlxuICAgICAqIC0gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGV4YWN0bHkgb25lIGFyZ3VtZW50LCB0aGUgcHJvbWlzZSBpc1xuICAgICAqICAgcmVzb2x2ZWQgdG8gdGhhdCB2YWx1ZS5cbiAgICAgKiAtIE90aGVyd2lzZSwgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgdG8gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgb2YgdGhlXG4gICAgICogICBmdW5jdGlvbidzIGFyZ3VtZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBwcm9taXNlXG4gICAgICogICAgICAgIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSByZXNvbHV0aW9uIGFuZCByZWplY3Rpb24gZnVuY3Rpb25zIG9mIGFcbiAgICAgKiAgICAgICAgcHJvbWlzZS5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBwcm9taXNlLnJlc29sdmVcbiAgICAgKiAgICAgICAgVGhlIHByb21pc2UncyByZXNvbHV0aW9uIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7ZnVuY3Rpb259IHByb21pc2UucmVqZWN0XG4gICAgICogICAgICAgIFRoZSBwcm9taXNlJ3MgcmVqZWN0aW9uIGZ1bmN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBtZXRhZGF0YVxuICAgICAqICAgICAgICBNZXRhZGF0YSBhYm91dCB0aGUgd3JhcHBlZCBtZXRob2Qgd2hpY2ggaGFzIGNyZWF0ZWQgdGhlIGNhbGxiYWNrLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmdcbiAgICAgKiAgICAgICAgV2hldGhlciBvciBub3QgdGhlIHByb21pc2UgaXMgcmVzb2x2ZWQgd2l0aCBvbmx5IHRoZSBmaXJzdFxuICAgICAqICAgICAgICBhcmd1bWVudCBvZiB0aGUgY2FsbGJhY2ssIGFsdGVybmF0aXZlbHkgYW4gYXJyYXkgb2YgYWxsIHRoZVxuICAgICAqICAgICAgICBjYWxsYmFjayBhcmd1bWVudHMgaXMgcmVzb2x2ZWQuIEJ5IGRlZmF1bHQsIGlmIHRoZSBjYWxsYmFja1xuICAgICAqICAgICAgICBmdW5jdGlvbiBpcyBpbnZva2VkIHdpdGggb25seSBhIHNpbmdsZSBhcmd1bWVudCwgdGhhdCB3aWxsIGJlXG4gICAgICogICAgICAgIHJlc29sdmVkIHRvIHRoZSBwcm9taXNlLCB3aGlsZSBhbGwgYXJndW1lbnRzIHdpbGwgYmUgcmVzb2x2ZWQgYXNcbiAgICAgKiAgICAgICAgYW4gYXJyYXkgaWYgbXVsdGlwbGUgYXJlIGdpdmVuLlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Z1bmN0aW9ufVxuICAgICAqICAgICAgICBUaGUgZ2VuZXJhdGVkIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAqL1xuICAgIGNvbnN0IG1ha2VDYWxsYmFjayA9IChwcm9taXNlLCBtZXRhZGF0YSkgPT4ge1xuICAgICAgcmV0dXJuICguLi5jYWxsYmFja0FyZ3MpID0+IHtcbiAgICAgICAgaWYgKGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IpIHtcbiAgICAgICAgICBwcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvci5tZXNzYWdlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEuc2luZ2xlQ2FsbGJhY2tBcmcgfHxcbiAgICAgICAgICAgICAgICAgICAoY2FsbGJhY2tBcmdzLmxlbmd0aCA8PSAxICYmIG1ldGFkYXRhLnNpbmdsZUNhbGxiYWNrQXJnICE9PSBmYWxzZSkpIHtcbiAgICAgICAgICBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2tBcmdzWzBdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9taXNlLnJlc29sdmUoY2FsbGJhY2tBcmdzKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgcGx1cmFsaXplQXJndW1lbnRzID0gKG51bUFyZ3MpID0+IG51bUFyZ3MgPT0gMSA/IFwiYXJndW1lbnRcIiA6IFwiYXJndW1lbnRzXCI7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgd3JhcHBlciBmdW5jdGlvbiBmb3IgYSBtZXRob2Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdoaWNoIGlzIGJlaW5nIHdyYXBwZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IG1ldGFkYXRhXG4gICAgICogICAgICAgIE1ldGFkYXRhIGFib3V0IHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC5cbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1ldGFkYXRhLm1pbkFyZ3NcbiAgICAgKiAgICAgICAgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCBtdXN0IGJlIHBhc3NlZCB0byB0aGVcbiAgICAgKiAgICAgICAgZnVuY3Rpb24uIElmIGNhbGxlZCB3aXRoIGZld2VyIHRoYW4gdGhpcyBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGVcbiAgICAgKiAgICAgICAgd3JhcHBlciB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi5cbiAgICAgKiBAcGFyYW0ge2ludGVnZXJ9IG1ldGFkYXRhLm1heEFyZ3NcbiAgICAgKiAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGFyZ3VtZW50cyB3aGljaCBtYXkgYmUgcGFzc2VkIHRvIHRoZVxuICAgICAqICAgICAgICBmdW5jdGlvbi4gSWYgY2FsbGVkIHdpdGggbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlXG4gICAgICogICAgICAgIHdyYXBwZXIgd2lsbCByYWlzZSBhbiBleGNlcHRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBtZXRhZGF0YS5zaW5nbGVDYWxsYmFja0FyZ1xuICAgICAqICAgICAgICBXaGV0aGVyIG9yIG5vdCB0aGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aXRoIG9ubHkgdGhlIGZpcnN0XG4gICAgICogICAgICAgIGFyZ3VtZW50IG9mIHRoZSBjYWxsYmFjaywgYWx0ZXJuYXRpdmVseSBhbiBhcnJheSBvZiBhbGwgdGhlXG4gICAgICogICAgICAgIGNhbGxiYWNrIGFyZ3VtZW50cyBpcyByZXNvbHZlZC4gQnkgZGVmYXVsdCwgaWYgdGhlIGNhbGxiYWNrXG4gICAgICogICAgICAgIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCBvbmx5IGEgc2luZ2xlIGFyZ3VtZW50LCB0aGF0IHdpbGwgYmVcbiAgICAgKiAgICAgICAgcmVzb2x2ZWQgdG8gdGhlIHByb21pc2UsIHdoaWxlIGFsbCBhcmd1bWVudHMgd2lsbCBiZSByZXNvbHZlZCBhc1xuICAgICAqICAgICAgICBhbiBhcnJheSBpZiBtdWx0aXBsZSBhcmUgZ2l2ZW4uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7ZnVuY3Rpb24ob2JqZWN0LCAuLi4qKX1cbiAgICAgKiAgICAgICBUaGUgZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb24uXG4gICAgICovXG4gICAgY29uc3Qgd3JhcEFzeW5jRnVuY3Rpb24gPSAobmFtZSwgbWV0YWRhdGEpID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBhc3luY0Z1bmN0aW9uV3JhcHBlcih0YXJnZXQsIC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgbWV0YWRhdGEubWluQXJncykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttZXRhZGF0YS5taW5BcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5taW5BcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiBtZXRhZGF0YS5tYXhBcmdzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0ICR7bWV0YWRhdGEubWF4QXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWF4QXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBpZiAobWV0YWRhdGEuZmFsbGJhY2tUb05vQ2FsbGJhY2spIHtcbiAgICAgICAgICAgIC8vIFRoaXMgQVBJIG1ldGhvZCBoYXMgY3VycmVudGx5IG5vIGNhbGxiYWNrIG9uIENocm9tZSwgYnV0IGl0IHJldHVybiBhIHByb21pc2Ugb24gRmlyZWZveCxcbiAgICAgICAgICAgIC8vIGFuZCBzbyB0aGUgcG9seWZpbGwgd2lsbCB0cnkgdG8gY2FsbCBpdCB3aXRoIGEgY2FsbGJhY2sgZmlyc3QsIGFuZCBpdCB3aWxsIGZhbGxiYWNrXG4gICAgICAgICAgICAvLyB0byBub3QgcGFzc2luZyB0aGUgY2FsbGJhY2sgaWYgdGhlIGZpcnN0IGNhbGwgZmFpbHMuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncywgbWFrZUNhbGxiYWNrKHtyZXNvbHZlLCByZWplY3R9LCBtZXRhZGF0YSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoY2JFcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYCR7bmFtZX0gQVBJIG1ldGhvZCBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCB0aGUgY2FsbGJhY2sgcGFyYW1ldGVyLCBgICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZmFsbGluZyBiYWNrIHRvIGNhbGwgaXQgd2l0aG91dCBhIGNhbGxiYWNrOiBcIiwgY2JFcnJvcik7XG5cbiAgICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MpO1xuXG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgQVBJIG1ldGhvZCBtZXRhZGF0YSwgc28gdGhhdCB0aGUgbmV4dCBBUEkgY2FsbHMgd2lsbCBub3QgdHJ5IHRvXG4gICAgICAgICAgICAgIC8vIHVzZSB0aGUgdW5zdXBwb3J0ZWQgY2FsbGJhY2sgYW55bW9yZS5cbiAgICAgICAgICAgICAgbWV0YWRhdGEuZmFsbGJhY2tUb05vQ2FsbGJhY2sgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbWV0YWRhdGEubm9DYWxsYmFjayA9IHRydWU7XG5cbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGEubm9DYWxsYmFjaykge1xuICAgICAgICAgICAgdGFyZ2V0W25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbbmFtZV0oLi4uYXJncywgbWFrZUNhbGxiYWNrKHtyZXNvbHZlLCByZWplY3R9LCBtZXRhZGF0YSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBXcmFwcyBhbiBleGlzdGluZyBtZXRob2Qgb2YgdGhlIHRhcmdldCBvYmplY3QsIHNvIHRoYXQgY2FsbHMgdG8gaXQgYXJlXG4gICAgICogaW50ZXJjZXB0ZWQgYnkgdGhlIGdpdmVuIHdyYXBwZXIgZnVuY3Rpb24uIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHJlY2VpdmVzLFxuICAgICAqIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgdGhlIG9yaWdpbmFsIGB0YXJnZXRgIG9iamVjdCwgZm9sbG93ZWQgYnkgZWFjaCBvZlxuICAgICAqIHRoZSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBvcmlnaW5hbCBtZXRob2QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gICAgICogICAgICAgIFRoZSBvcmlnaW5hbCB0YXJnZXQgb2JqZWN0IHRoYXQgdGhlIHdyYXBwZWQgbWV0aG9kIGJlbG9uZ3MgdG8uXG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gbWV0aG9kXG4gICAgICogICAgICAgIFRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4gVGhpcyBpcyB1c2VkIGFzIHRoZSB0YXJnZXQgb2YgdGhlIFByb3h5XG4gICAgICogICAgICAgIG9iamVjdCB3aGljaCBpcyBjcmVhdGVkIHRvIHdyYXAgdGhlIG1ldGhvZC5cbiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSB3cmFwcGVyXG4gICAgICogICAgICAgIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBpbiBwbGFjZSBvZiBhIGRpcmVjdCBpbnZvY2F0aW9uXG4gICAgICogICAgICAgIG9mIHRoZSB3cmFwcGVkIG1ldGhvZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm94eTxmdW5jdGlvbj59XG4gICAgICogICAgICAgIEEgUHJveHkgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbWV0aG9kLCB3aGljaCBpbnZva2VzIHRoZSBnaXZlbiB3cmFwcGVyXG4gICAgICogICAgICAgIG1ldGhvZCBpbiBpdHMgcGxhY2UuXG4gICAgICovXG4gICAgY29uc3Qgd3JhcE1ldGhvZCA9ICh0YXJnZXQsIG1ldGhvZCwgd3JhcHBlcikgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm94eShtZXRob2QsIHtcbiAgICAgICAgYXBwbHkodGFyZ2V0TWV0aG9kLCB0aGlzT2JqLCBhcmdzKSB7XG4gICAgICAgICAgcmV0dXJuIHdyYXBwZXIuY2FsbCh0aGlzT2JqLCB0YXJnZXQsIC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGxldCBoYXNPd25Qcm9wZXJ0eSA9IEZ1bmN0aW9uLmNhbGwuYmluZChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcblxuICAgIC8qKlxuICAgICAqIFdyYXBzIGFuIG9iamVjdCBpbiBhIFByb3h5IHdoaWNoIGludGVyY2VwdHMgYW5kIHdyYXBzIGNlcnRhaW4gbWV0aG9kc1xuICAgICAqIGJhc2VkIG9uIHRoZSBnaXZlbiBgd3JhcHBlcnNgIGFuZCBgbWV0YWRhdGFgIG9iamVjdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdGFyZ2V0XG4gICAgICogICAgICAgIFRoZSB0YXJnZXQgb2JqZWN0IHRvIHdyYXAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW3dyYXBwZXJzID0ge31dXG4gICAgICogICAgICAgIEFuIG9iamVjdCB0cmVlIGNvbnRhaW5pbmcgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHNwZWNpYWwgY2FzZXMuIEFueVxuICAgICAqICAgICAgICBmdW5jdGlvbiBwcmVzZW50IGluIHRoaXMgb2JqZWN0IHRyZWUgaXMgY2FsbGVkIGluIHBsYWNlIG9mIHRoZVxuICAgICAqICAgICAgICBtZXRob2QgaW4gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGB0YXJnZXRgIG9iamVjdCB0cmVlLiBUaGVzZVxuICAgICAqICAgICAgICB3cmFwcGVyIG1ldGhvZHMgYXJlIGludm9rZWQgYXMgZGVzY3JpYmVkIGluIHtAc2VlIHdyYXBNZXRob2R9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IFttZXRhZGF0YSA9IHt9XVxuICAgICAqICAgICAgICBBbiBvYmplY3QgdHJlZSBjb250YWluaW5nIG1ldGFkYXRhIHVzZWQgdG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZVxuICAgICAqICAgICAgICBQcm9taXNlLWJhc2VkIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMuIEFueSBmdW5jdGlvbiBpblxuICAgICAqICAgICAgICB0aGUgYHRhcmdldGAgb2JqZWN0IHRyZWUgd2hpY2ggaGFzIGEgY29ycmVzcG9uZGluZyBtZXRhZGF0YSBvYmplY3RcbiAgICAgKiAgICAgICAgaW4gdGhlIHNhbWUgbG9jYXRpb24gaW4gdGhlIGBtZXRhZGF0YWAgdHJlZSBpcyByZXBsYWNlZCB3aXRoIGFuXG4gICAgICogICAgICAgIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb24sIGFzIGRlc2NyaWJlZCBpblxuICAgICAqICAgICAgICB7QHNlZSB3cmFwQXN5bmNGdW5jdGlvbn1cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm94eTxvYmplY3Q+fVxuICAgICAqL1xuICAgIGNvbnN0IHdyYXBPYmplY3QgPSAodGFyZ2V0LCB3cmFwcGVycyA9IHt9LCBtZXRhZGF0YSA9IHt9KSA9PiB7XG4gICAgICBsZXQgY2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgbGV0IGhhbmRsZXJzID0ge1xuICAgICAgICBoYXMocHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgICAgICByZXR1cm4gcHJvcCBpbiB0YXJnZXQgfHwgcHJvcCBpbiBjYWNoZTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXQocHJveHlUYXJnZXQsIHByb3AsIHJlY2VpdmVyKSB7XG4gICAgICAgICAgaWYgKHByb3AgaW4gY2FjaGUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZVtwcm9wXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIShwcm9wIGluIHRhcmdldCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHZhbHVlID0gdGFyZ2V0W3Byb3BdO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGlzIGEgbWV0aG9kIG9uIHRoZSB1bmRlcmx5aW5nIG9iamVjdC4gQ2hlY2sgaWYgd2UgbmVlZCB0byBkb1xuICAgICAgICAgICAgLy8gYW55IHdyYXBwaW5nLlxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHdyYXBwZXJzW3Byb3BdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHNwZWNpYWwtY2FzZSB3cmFwcGVyIGZvciB0aGlzIG1ldGhvZC5cbiAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwTWV0aG9kKHRhcmdldCwgdGFyZ2V0W3Byb3BdLCB3cmFwcGVyc1twcm9wXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc093blByb3BlcnR5KG1ldGFkYXRhLCBwcm9wKSkge1xuICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHdlIGhhdmUgbWV0YWRhdGEgZm9yLiBDcmVhdGUgYVxuICAgICAgICAgICAgICAvLyBQcm9taXNlIHdyYXBwZXIgZm9yIGl0LlxuICAgICAgICAgICAgICBsZXQgd3JhcHBlciA9IHdyYXBBc3luY0Z1bmN0aW9uKHByb3AsIG1ldGFkYXRhW3Byb3BdKTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB3cmFwTWV0aG9kKHRhcmdldCwgdGFyZ2V0W3Byb3BdLCB3cmFwcGVyKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBtZXRob2QgdGhhdCB3ZSBkb24ndCBrbm93IG9yIGNhcmUgYWJvdXQuIFJldHVybiB0aGVcbiAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbWV0aG9kLCBib3VuZCB0byB0aGUgdW5kZXJseWluZyBvYmplY3QuXG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuYmluZCh0YXJnZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgICAoaGFzT3duUHJvcGVydHkod3JhcHBlcnMsIHByb3ApIHx8XG4gICAgICAgICAgICAgICAgICAgICAgaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIHByb3ApKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBvYmplY3QgdGhhdCB3ZSBuZWVkIHRvIGRvIHNvbWUgd3JhcHBpbmcgZm9yIHRoZSBjaGlsZHJlblxuICAgICAgICAgICAgLy8gb2YuIENyZWF0ZSBhIHN1Yi1vYmplY3Qgd3JhcHBlciBmb3IgaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgY2hpbGRcbiAgICAgICAgICAgIC8vIG1ldGFkYXRhLlxuICAgICAgICAgICAgdmFsdWUgPSB3cmFwT2JqZWN0KHZhbHVlLCB3cmFwcGVyc1twcm9wXSwgbWV0YWRhdGFbcHJvcF0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzT3duUHJvcGVydHkobWV0YWRhdGEsIFwiKlwiKSkge1xuICAgICAgICAgICAgLy8gV3JhcCBhbGwgcHJvcGVydGllcyBpbiAqIG5hbWVzcGFjZS5cbiAgICAgICAgICAgIHZhbHVlID0gd3JhcE9iamVjdCh2YWx1ZSwgd3JhcHBlcnNbcHJvcF0sIG1ldGFkYXRhW1wiKlwiXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gZG8gYW55IHdyYXBwaW5nIGZvciB0aGlzIHByb3BlcnR5LFxuICAgICAgICAgICAgLy8gc28ganVzdCBmb3J3YXJkIGFsbCBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0LlxuICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNhY2hlLCBwcm9wLCB7XG4gICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRbcHJvcF07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNldCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjYWNoZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcblxuICAgICAgICBzZXQocHJveHlUYXJnZXQsIHByb3AsIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgICAgIGlmIChwcm9wIGluIGNhY2hlKSB7XG4gICAgICAgICAgICBjYWNoZVtwcm9wXSA9IHZhbHVlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVmaW5lUHJvcGVydHkocHJveHlUYXJnZXQsIHByb3AsIGRlc2MpIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShjYWNoZSwgcHJvcCwgZGVzYyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZGVsZXRlUHJvcGVydHkocHJveHlUYXJnZXQsIHByb3ApIHtcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShjYWNoZSwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBQZXIgY29udHJhY3Qgb2YgdGhlIFByb3h5IEFQSSwgdGhlIFwiZ2V0XCIgcHJveHkgaGFuZGxlciBtdXN0IHJldHVybiB0aGVcbiAgICAgIC8vIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSB0YXJnZXQgaWYgdGhhdCB2YWx1ZSBpcyBkZWNsYXJlZCByZWFkLW9ubHkgYW5kXG4gICAgICAvLyBub24tY29uZmlndXJhYmxlLiBGb3IgdGhpcyByZWFzb24sIHdlIGNyZWF0ZSBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICAgIC8vIHByb3RvdHlwZSBzZXQgdG8gYHRhcmdldGAgaW5zdGVhZCBvZiB1c2luZyBgdGFyZ2V0YCBkaXJlY3RseS5cbiAgICAgIC8vIE90aGVyd2lzZSB3ZSBjYW5ub3QgcmV0dXJuIGEgY3VzdG9tIG9iamVjdCBmb3IgQVBJcyB0aGF0XG4gICAgICAvLyBhcmUgZGVjbGFyZWQgcmVhZC1vbmx5IGFuZCBub24tY29uZmlndXJhYmxlLCBzdWNoIGFzIGBjaHJvbWUuZGV2dG9vbHNgLlxuICAgICAgLy9cbiAgICAgIC8vIFRoZSBwcm94eSBoYW5kbGVycyB0aGVtc2VsdmVzIHdpbGwgc3RpbGwgdXNlIHRoZSBvcmlnaW5hbCBgdGFyZ2V0YFxuICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgYHByb3h5VGFyZ2V0YCwgc28gdGhhdCB0aGUgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBhcmVcbiAgICAgIC8vIGRlcmVmZXJlbmNlZCB2aWEgdGhlIG9yaWdpbmFsIHRhcmdldHMuXG4gICAgICBsZXQgcHJveHlUYXJnZXQgPSBPYmplY3QuY3JlYXRlKHRhcmdldCk7XG4gICAgICByZXR1cm4gbmV3IFByb3h5KHByb3h5VGFyZ2V0LCBoYW5kbGVycyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBzZXQgb2Ygd3JhcHBlciBmdW5jdGlvbnMgZm9yIGFuIGV2ZW50IG9iamVjdCwgd2hpY2ggaGFuZGxlc1xuICAgICAqIHdyYXBwaW5nIG9mIGxpc3RlbmVyIGZ1bmN0aW9ucyB0aGF0IHRob3NlIG1lc3NhZ2VzIGFyZSBwYXNzZWQuXG4gICAgICpcbiAgICAgKiBBIHNpbmdsZSB3cmFwcGVyIGlzIGNyZWF0ZWQgZm9yIGVhY2ggbGlzdGVuZXIgZnVuY3Rpb24sIGFuZCBzdG9yZWQgaW4gYVxuICAgICAqIG1hcC4gU3Vic2VxdWVudCBjYWxscyB0byBgYWRkTGlzdGVuZXJgLCBgaGFzTGlzdGVuZXJgLCBvciBgcmVtb3ZlTGlzdGVuZXJgXG4gICAgICogcmV0cmlldmUgdGhlIG9yaWdpbmFsIHdyYXBwZXIsIHNvIHRoYXQgIGF0dGVtcHRzIHRvIHJlbW92ZSBhXG4gICAgICogcHJldmlvdXNseS1hZGRlZCBsaXN0ZW5lciB3b3JrIGFzIGV4cGVjdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtEZWZhdWx0V2Vha01hcDxmdW5jdGlvbiwgZnVuY3Rpb24+fSB3cmFwcGVyTWFwXG4gICAgICogICAgICAgIEEgRGVmYXVsdFdlYWtNYXAgb2JqZWN0IHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSB3cmFwcGVyXG4gICAgICogICAgICAgIGZvciBhIGdpdmVuIGxpc3RlbmVyIGZ1bmN0aW9uIHdoZW4gb25lIGRvZXMgbm90IGV4aXN0LCBhbmQgcmV0cmlldmVcbiAgICAgKiAgICAgICAgYW4gZXhpc3Rpbmcgb25lIHdoZW4gaXQgZG9lcy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtvYmplY3R9XG4gICAgICovXG4gICAgY29uc3Qgd3JhcEV2ZW50ID0gd3JhcHBlck1hcCA9PiAoe1xuICAgICAgYWRkTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lciwgLi4uYXJncykge1xuICAgICAgICB0YXJnZXQuYWRkTGlzdGVuZXIod3JhcHBlck1hcC5nZXQobGlzdGVuZXIpLCAuLi5hcmdzKTtcbiAgICAgIH0sXG5cbiAgICAgIGhhc0xpc3RlbmVyKHRhcmdldCwgbGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldC5oYXNMaXN0ZW5lcih3cmFwcGVyTWFwLmdldChsaXN0ZW5lcikpO1xuICAgICAgfSxcblxuICAgICAgcmVtb3ZlTGlzdGVuZXIodGFyZ2V0LCBsaXN0ZW5lcikge1xuICAgICAgICB0YXJnZXQucmVtb3ZlTGlzdGVuZXIod3JhcHBlck1hcC5nZXQobGlzdGVuZXIpKTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBvblJlcXVlc3RGaW5pc2hlZFdyYXBwZXJzID0gbmV3IERlZmF1bHRXZWFrTWFwKGxpc3RlbmVyID0+IHtcbiAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICByZXR1cm4gbGlzdGVuZXI7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogV3JhcHMgYW4gb25SZXF1ZXN0RmluaXNoZWQgbGlzdGVuZXIgZnVuY3Rpb24gc28gdGhhdCBpdCB3aWxsIHJldHVybiBhXG4gICAgICAgKiBgZ2V0Q29udGVudCgpYCBwcm9wZXJ0eSB3aGljaCByZXR1cm5zIGEgYFByb21pc2VgIHJhdGhlciB0aGFuIHVzaW5nIGFcbiAgICAgICAqIGNhbGxiYWNrIEFQSS5cbiAgICAgICAqXG4gICAgICAgKiBAcGFyYW0ge29iamVjdH0gcmVxXG4gICAgICAgKiAgICAgICAgVGhlIEhBUiBlbnRyeSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBuZXR3b3JrIHJlcXVlc3QuXG4gICAgICAgKi9cbiAgICAgIHJldHVybiBmdW5jdGlvbiBvblJlcXVlc3RGaW5pc2hlZChyZXEpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZFJlcSA9IHdyYXBPYmplY3QocmVxLCB7fSAvKiB3cmFwcGVycyAqLywge1xuICAgICAgICAgIGdldENvbnRlbnQ6IHtcbiAgICAgICAgICAgIG1pbkFyZ3M6IDAsXG4gICAgICAgICAgICBtYXhBcmdzOiAwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBsaXN0ZW5lcih3cmFwcGVkUmVxKTtcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBvbk1lc3NhZ2VXcmFwcGVycyA9IG5ldyBEZWZhdWx0V2Vha01hcChsaXN0ZW5lciA9PiB7XG4gICAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVyO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFdyYXBzIGEgbWVzc2FnZSBsaXN0ZW5lciBmdW5jdGlvbiBzbyB0aGF0IGl0IG1heSBzZW5kIHJlc3BvbnNlcyBiYXNlZCBvblxuICAgICAgICogaXRzIHJldHVybiB2YWx1ZSwgcmF0aGVyIHRoYW4gYnkgcmV0dXJuaW5nIGEgc2VudGluZWwgdmFsdWUgYW5kIGNhbGxpbmcgYVxuICAgICAgICogY2FsbGJhY2suIElmIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiByZXR1cm5zIGEgUHJvbWlzZSwgdGhlIHJlc3BvbnNlIGlzXG4gICAgICAgKiBzZW50IHdoZW4gdGhlIHByb21pc2UgZWl0aGVyIHJlc29sdmVzIG9yIHJlamVjdHMuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHsqfSBtZXNzYWdlXG4gICAgICAgKiAgICAgICAgVGhlIG1lc3NhZ2Ugc2VudCBieSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjaGFubmVsLlxuICAgICAgICogQHBhcmFtIHtvYmplY3R9IHNlbmRlclxuICAgICAgICogICAgICAgIERldGFpbHMgYWJvdXQgdGhlIHNlbmRlciBvZiB0aGUgbWVzc2FnZS5cbiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKil9IHNlbmRSZXNwb25zZVxuICAgICAgICogICAgICAgIEEgY2FsbGJhY2sgd2hpY2gsIHdoZW4gY2FsbGVkIHdpdGggYW4gYXJiaXRyYXJ5IGFyZ3VtZW50LCBzZW5kc1xuICAgICAgICogICAgICAgIHRoYXQgdmFsdWUgYXMgYSByZXNwb25zZS5cbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAgICogICAgICAgIFRydWUgaWYgdGhlIHdyYXBwZWQgbGlzdGVuZXIgcmV0dXJuZWQgYSBQcm9taXNlLCB3aGljaCB3aWxsIGxhdGVyXG4gICAgICAgKiAgICAgICAgeWllbGQgYSByZXNwb25zZS4gRmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAgICovXG4gICAgICByZXR1cm4gZnVuY3Rpb24gb25NZXNzYWdlKG1lc3NhZ2UsIHNlbmRlciwgc2VuZFJlc3BvbnNlKSB7XG4gICAgICAgIGxldCBkaWRDYWxsU2VuZFJlc3BvbnNlID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IHdyYXBwZWRTZW5kUmVzcG9uc2U7XG4gICAgICAgIGxldCBzZW5kUmVzcG9uc2VQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgd3JhcHBlZFNlbmRSZXNwb25zZSA9IGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBkaWRDYWxsU2VuZFJlc3BvbnNlID0gdHJ1ZTtcbiAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gbGlzdGVuZXIobWVzc2FnZSwgc2VuZGVyLCB3cmFwcGVkU2VuZFJlc3BvbnNlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzUmVzdWx0VGhlbmFibGUgPSByZXN1bHQgIT09IHRydWUgJiYgaXNUaGVuYWJsZShyZXN1bHQpO1xuXG4gICAgICAgIC8vIElmIHRoZSBsaXN0ZW5lciBkaWRuJ3QgcmV0dXJuZWQgdHJ1ZSBvciBhIFByb21pc2UsIG9yIGNhbGxlZFxuICAgICAgICAvLyB3cmFwcGVkU2VuZFJlc3BvbnNlIHN5bmNocm9ub3VzbHksIHdlIGNhbiBleGl0IGVhcmxpZXJcbiAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSB3aWxsIGJlIG5vIHJlc3BvbnNlIHNlbnQgZnJvbSB0aGlzIGxpc3RlbmVyLlxuICAgICAgICBpZiAocmVzdWx0ICE9PSB0cnVlICYmICFpc1Jlc3VsdFRoZW5hYmxlICYmICFkaWRDYWxsU2VuZFJlc3BvbnNlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQSBzbWFsbCBoZWxwZXIgdG8gc2VuZCB0aGUgbWVzc2FnZSBpZiB0aGUgcHJvbWlzZSByZXNvbHZlc1xuICAgICAgICAvLyBhbmQgYW4gZXJyb3IgaWYgdGhlIHByb21pc2UgcmVqZWN0cyAoYSB3cmFwcGVkIHNlbmRNZXNzYWdlIGhhc1xuICAgICAgICAvLyB0byB0cmFuc2xhdGUgdGhlIG1lc3NhZ2UgaW50byBhIHJlc29sdmVkIHByb21pc2Ugb3IgYSByZWplY3RlZFxuICAgICAgICAvLyBwcm9taXNlKS5cbiAgICAgICAgY29uc3Qgc2VuZFByb21pc2VkUmVzdWx0ID0gKHByb21pc2UpID0+IHtcbiAgICAgICAgICBwcm9taXNlLnRoZW4obXNnID0+IHtcbiAgICAgICAgICAgIC8vIHNlbmQgdGhlIG1lc3NhZ2UgdmFsdWUuXG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UobXNnKTtcbiAgICAgICAgICB9LCBlcnJvciA9PiB7XG4gICAgICAgICAgICAvLyBTZW5kIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgaWYgdGhlIHJlamVjdGVkIHZhbHVlXG4gICAgICAgICAgICAvLyBpcyBhbiBpbnN0YW5jZSBvZiBlcnJvciwgb3IgdGhlIG9iamVjdCBpdHNlbGYgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXJyb3IubWVzc2FnZSA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgICAgICAgICAgbWVzc2FnZSA9IGVycm9yLm1lc3NhZ2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBtZXNzYWdlID0gXCJBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7XG4gICAgICAgICAgICAgIF9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXzogdHJ1ZSxcbiAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAvLyBQcmludCBhbiBlcnJvciBvbiB0aGUgY29uc29sZSBpZiB1bmFibGUgdG8gc2VuZCB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIHNlbmQgb25NZXNzYWdlIHJlamVjdGVkIHJlcGx5XCIsIGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSWYgdGhlIGxpc3RlbmVyIHJldHVybmVkIGEgUHJvbWlzZSwgc2VuZCB0aGUgcmVzb2x2ZWQgdmFsdWUgYXMgYVxuICAgICAgICAvLyByZXN1bHQsIG90aGVyd2lzZSB3YWl0IHRoZSBwcm9taXNlIHJlbGF0ZWQgdG8gdGhlIHdyYXBwZWRTZW5kUmVzcG9uc2VcbiAgICAgICAgLy8gY2FsbGJhY2sgdG8gcmVzb2x2ZSBhbmQgc2VuZCBpdCBhcyBhIHJlc3BvbnNlLlxuICAgICAgICBpZiAoaXNSZXN1bHRUaGVuYWJsZSkge1xuICAgICAgICAgIHNlbmRQcm9taXNlZFJlc3VsdChyZXN1bHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbmRQcm9taXNlZFJlc3VsdChzZW5kUmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIExldCBDaHJvbWUga25vdyB0aGF0IHRoZSBsaXN0ZW5lciBpcyByZXBseWluZy5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3Qgd3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2sgPSAoe3JlamVjdCwgcmVzb2x2ZX0sIHJlcGx5KSA9PiB7XG4gICAgICBpZiAoZXh0ZW5zaW9uQVBJcy5ydW50aW1lLmxhc3RFcnJvcikge1xuICAgICAgICAvLyBEZXRlY3Qgd2hlbiBub25lIG9mIHRoZSBsaXN0ZW5lcnMgcmVwbGllZCB0byB0aGUgc2VuZE1lc3NhZ2UgY2FsbCBhbmQgcmVzb2x2ZVxuICAgICAgICAvLyB0aGUgcHJvbWlzZSB0byB1bmRlZmluZWQgYXMgaW4gRmlyZWZveC5cbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3dlYmV4dGVuc2lvbi1wb2x5ZmlsbC9pc3N1ZXMvMTMwXG4gICAgICAgIGlmIChleHRlbnNpb25BUElzLnJ1bnRpbWUubGFzdEVycm9yLm1lc3NhZ2UgPT09IENIUk9NRV9TRU5EX01FU1NBR0VfQ0FMTEJBQ0tfTk9fUkVTUE9OU0VfTUVTU0FHRSkge1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGV4dGVuc2lvbkFQSXMucnVudGltZS5sYXN0RXJyb3IubWVzc2FnZSkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlcGx5ICYmIHJlcGx5Ll9fbW96V2ViRXh0ZW5zaW9uUG9seWZpbGxSZWplY3RfXykge1xuICAgICAgICAvLyBDb252ZXJ0IGJhY2sgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGludG9cbiAgICAgICAgLy8gYW4gRXJyb3IgaW5zdGFuY2UuXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IocmVwbHkubWVzc2FnZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzb2x2ZShyZXBseSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHdyYXBwZWRTZW5kTWVzc2FnZSA9IChuYW1lLCBtZXRhZGF0YSwgYXBpTmFtZXNwYWNlT2JqLCAuLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPCBtZXRhZGF0YS5taW5BcmdzKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYXQgbGVhc3QgJHttZXRhZGF0YS5taW5BcmdzfSAke3BsdXJhbGl6ZUFyZ3VtZW50cyhtZXRhZGF0YS5taW5BcmdzKX0gZm9yICR7bmFtZX0oKSwgZ290ICR7YXJncy5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA+IG1ldGFkYXRhLm1heEFyZ3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhdCBtb3N0ICR7bWV0YWRhdGEubWF4QXJnc30gJHtwbHVyYWxpemVBcmd1bWVudHMobWV0YWRhdGEubWF4QXJncyl9IGZvciAke25hbWV9KCksIGdvdCAke2FyZ3MubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCB3cmFwcGVkQ2IgPSB3cmFwcGVkU2VuZE1lc3NhZ2VDYWxsYmFjay5iaW5kKG51bGwsIHtyZXNvbHZlLCByZWplY3R9KTtcbiAgICAgICAgYXJncy5wdXNoKHdyYXBwZWRDYik7XG4gICAgICAgIGFwaU5hbWVzcGFjZU9iai5zZW5kTWVzc2FnZSguLi5hcmdzKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBzdGF0aWNXcmFwcGVycyA9IHtcbiAgICAgIGRldnRvb2xzOiB7XG4gICAgICAgIG5ldHdvcms6IHtcbiAgICAgICAgICBvblJlcXVlc3RGaW5pc2hlZDogd3JhcEV2ZW50KG9uUmVxdWVzdEZpbmlzaGVkV3JhcHBlcnMpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHJ1bnRpbWU6IHtcbiAgICAgICAgb25NZXNzYWdlOiB3cmFwRXZlbnQob25NZXNzYWdlV3JhcHBlcnMpLFxuICAgICAgICBvbk1lc3NhZ2VFeHRlcm5hbDogd3JhcEV2ZW50KG9uTWVzc2FnZVdyYXBwZXJzKSxcbiAgICAgICAgc2VuZE1lc3NhZ2U6IHdyYXBwZWRTZW5kTWVzc2FnZS5iaW5kKG51bGwsIFwic2VuZE1lc3NhZ2VcIiwge21pbkFyZ3M6IDEsIG1heEFyZ3M6IDN9KSxcbiAgICAgIH0sXG4gICAgICB0YWJzOiB7XG4gICAgICAgIHNlbmRNZXNzYWdlOiB3cmFwcGVkU2VuZE1lc3NhZ2UuYmluZChudWxsLCBcInNlbmRNZXNzYWdlXCIsIHttaW5BcmdzOiAyLCBtYXhBcmdzOiAzfSksXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3Qgc2V0dGluZ01ldGFkYXRhID0ge1xuICAgICAgY2xlYXI6IHttaW5BcmdzOiAxLCBtYXhBcmdzOiAxfSxcbiAgICAgIGdldDoge21pbkFyZ3M6IDEsIG1heEFyZ3M6IDF9LFxuICAgICAgc2V0OiB7bWluQXJnczogMSwgbWF4QXJnczogMX0sXG4gICAgfTtcbiAgICBhcGlNZXRhZGF0YS5wcml2YWN5ID0ge1xuICAgICAgbmV0d29yazoge1wiKlwiOiBzZXR0aW5nTWV0YWRhdGF9LFxuICAgICAgc2VydmljZXM6IHtcIipcIjogc2V0dGluZ01ldGFkYXRhfSxcbiAgICAgIHdlYnNpdGVzOiB7XCIqXCI6IHNldHRpbmdNZXRhZGF0YX0sXG4gICAgfTtcblxuICAgIHJldHVybiB3cmFwT2JqZWN0KGV4dGVuc2lvbkFQSXMsIHN0YXRpY1dyYXBwZXJzLCBhcGlNZXRhZGF0YSk7XG4gIH07XG5cbiAgLy8gVGhlIGJ1aWxkIHByb2Nlc3MgYWRkcyBhIFVNRCB3cmFwcGVyIGFyb3VuZCB0aGlzIGZpbGUsIHdoaWNoIG1ha2VzIHRoZVxuICAvLyBgbW9kdWxlYCB2YXJpYWJsZSBhdmFpbGFibGUuXG4gIG1vZHVsZS5leHBvcnRzID0gd3JhcEFQSXMoY2hyb21lKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsVGhpcy5icm93c2VyO1xufVxuIiwgIi8vIEhhbnpvIEJyb3dzZXIgRXh0ZW5zaW9uIC0gQ29udGVudCBTY3JpcHRcbi8vIENvbm5lY3RzIGNsaWNrZWQgZWxlbWVudHMgdG8gc291cmNlIGNvZGUgdmlhIHNvdXJjZS1tYXBzXG4vL1xuLy8gUG9seWZpbGwgTVVTVCBiZSB0aGUgZmlyc3QgaW1wb3J0IHNvIGFueSBzdWJzZXF1ZW50IGNvZGUgdGhhdCB0b3VjaGVzXG4vLyBgYnJvd3Nlci4qYCAodGhlIGNyb3NzLWJyb3dzZXIgQVBJIHN1cmZhY2UpIHNlZXMgdGhlIHdyYXBwZWQgUHJvbWlzZVxuLy8gQVBJIG9uIENocm9tZSB0b28uIE9uIG5hdGl2ZSBydW50aW1lcyAoRmlyZWZveCAvIFNhZmFyaSkgdGhlIGltcG9ydCBpc1xuLy8gYSBuby1vcC5cbmltcG9ydCAnd2ViZXh0ZW5zaW9uLXBvbHlmaWxsJztcblxuaW1wb3J0IHtcbiAgREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VULFxuICBsb2FkSW5zcGVjdFNob3J0Y3V0LFxuICBtYXRjaGVzU2hvcnRjdXQsXG4gIFNUT1JBR0VfS0VZX0lOU1BFQ1QsXG4gIHR5cGUgU2hvcnRjdXQsXG59IGZyb20gJy4vc2hhcmVkL3Nob3J0Y3V0LmpzJztcblxuaW50ZXJmYWNlIFNvdXJjZUxvY2F0aW9uIHtcbiAgZmlsZTogc3RyaW5nO1xuICBsaW5lOiBudW1iZXI7XG4gIGNvbHVtbj86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEVsZW1lbnRTZWxlY3RlZEV2ZW50IHtcbiAgZXZlbnQ6ICdlbGVtZW50U2VsZWN0ZWQnO1xuICBmcmFtZXdvcms6IHN0cmluZyB8IG51bGw7XG4gIGRvbVBhdGg6IHN0cmluZztcbiAgc291cmNlPzogU291cmNlTG9jYXRpb247XG4gIGZhbGxiYWNrSWQ/OiBzdHJpbmc7XG59XG5cbmNsYXNzIEhhbnpvQ29udGVudFNjcmlwdCB7XG4gIC8vIENhY2hlIHRoZSBjb25maWd1cmVkIHNob3J0Y3V0IHNvIGV2ZXJ5IGNsaWNrL21vdXNlbW92ZSBkb2Vzbid0IGhpdFxuICAvLyBjaHJvbWUuc3RvcmFnZS4gUmVsb2FkZWQgZWFnZXJseSBvbiBzdG9yYWdlIGNoYW5nZSBzbyB0aGUgcG9wdXAnc1xuICAvLyByZWNvcmRlciB1cGRhdGVzIHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5IChubyBwYWdlIHJlbG9hZCByZXF1aXJlZCkuXG4gIHByaXZhdGUgaW5zcGVjdFNob3J0Y3V0OiBTaG9ydGN1dCA9IHsgLi4uREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VUIH07XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5sb2FkU2hvcnRjdXQoKTtcbiAgICB0aGlzLndhdGNoU2hvcnRjdXQoKTtcbiAgICB0aGlzLnNldHVwQ2xpY2tIYW5kbGVyKCk7XG4gICAgdGhpcy5pbmplY3RIZWxwZXJzKCk7XG4gICAgdGhpcy5zZXR1cE1lc3NhZ2VIYW5kbGVycygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkU2hvcnRjdXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGNocm9tZS5zdG9yYWdlLmxvY2FsIGluIE1WMyByZXR1cm5zIGEgUHJvbWlzZS5cbiAgICAgIHRoaXMuaW5zcGVjdFNob3J0Y3V0ID0gYXdhaXQgbG9hZEluc3BlY3RTaG9ydGN1dChjaHJvbWUuc3RvcmFnZS5sb2NhbCBhcyBhbnkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5pbnNwZWN0U2hvcnRjdXQgPSB7IC4uLkRFRkFVTFRfSU5TUEVDVF9TSE9SVENVVCB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgd2F0Y2hTaG9ydGN1dCgpIHtcbiAgICB0cnkge1xuICAgICAgY2hyb21lLnN0b3JhZ2Uub25DaGFuZ2VkLmFkZExpc3RlbmVyKChjaGFuZ2VzLCBhcmVhKSA9PiB7XG4gICAgICAgIGlmIChhcmVhICE9PSAnbG9jYWwnKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGMgPSBjaGFuZ2VzW1NUT1JBR0VfS0VZX0lOU1BFQ1RdO1xuICAgICAgICBpZiAoIWMpIHJldHVybjtcbiAgICAgICAgaWYgKGMubmV3VmFsdWUgJiYgdHlwZW9mIGMubmV3VmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgdGhpcy5pbnNwZWN0U2hvcnRjdXQgPSBjLm5ld1ZhbHVlIGFzIFNob3J0Y3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuaW5zcGVjdFNob3J0Y3V0ID0geyAuLi5ERUZBVUxUX0lOU1BFQ1RfU0hPUlRDVVQgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7IC8qIG5vdCBhbGwgc3RvcmFnZSBBUElzIGltcGxlbWVudCBvbkNoYW5nZWQgKi8gfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cENsaWNrSGFuZGxlcigpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBpZiAoIW1hdGNoZXNTaG9ydGN1dChlLCB0aGlzLmluc3BlY3RTaG9ydGN1dCkpIHJldHVybjtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgY29uc3QgZWxlbWVudCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5leHRyYWN0U291cmNlTG9jYXRpb24oZWxlbWVudCk7XG4gICAgICBjb25zdCBkb21QYXRoID0gdGhpcy5nZXRET01QYXRoKGVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBldmVudDogRWxlbWVudFNlbGVjdGVkRXZlbnQgPSB7XG4gICAgICAgIGV2ZW50OiAnZWxlbWVudFNlbGVjdGVkJyxcbiAgICAgICAgZnJhbWV3b3JrOiB0aGlzLmRldGVjdEZyYW1ld29yaygpLFxuICAgICAgICBkb21QYXRoLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGZhbGxiYWNrSWQ6IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLWlkJykgfHwgdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gUm91dGUgdGhyb3VnaCBiYWNrZ3JvdW5kIHNjcmlwdCAod29ya3Mgd2l0aCBib3RoIFpBUCBhbmQgbGVnYWN5IE1DUClcbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnZWxlbWVudFNlbGVjdGVkJywgZGF0YTogZXZlbnQgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwTWVzc2FnZUhhbmRsZXJzKCkge1xuICAgIGNocm9tZS5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcigocmVxdWVzdCwgX3NlbmRlciwgc2VuZFJlc3BvbnNlKSA9PiB7XG4gICAgICBzd2l0Y2ggKHJlcXVlc3QuYWN0aW9uKSB7XG4gICAgICAgIGNhc2UgJ2FpLmNvbnRyb2wuc3RhcnQnOlxuICAgICAgICAgIGFpT3ZlcmxheS5zaG93KHJlcXVlc3QudGFzayB8fCAnQUkgaXMgY29udHJvbGxpbmcgdGhpcyBwYWdlJyk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5zdG9wJzpcbiAgICAgICAgICBhaU92ZXJsYXkuaGlkZSgpO1xuICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNhc2UgJ2FpLmNvbnRyb2wuY3Vyc29yJzpcbiAgICAgICAgICBhaU92ZXJsYXkubW92ZUN1cnNvcihyZXF1ZXN0LngsIHJlcXVlc3QueSk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5oaWdobGlnaHQnOlxuICAgICAgICAgIGFpT3ZlcmxheS5oaWdobGlnaHQocmVxdWVzdC5zZWxlY3Rvcik7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAnYWkuY29udHJvbC5zdGF0dXMnOlxuICAgICAgICAgIGFpT3ZlcmxheS51cGRhdGVTdGF0dXMocmVxdWVzdC50ZXh0KTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkudG9nZ2xlJzpcbiAgICAgICAgICBpZiAocmVxdWVzdC5zaWRlID09PSAnbGVmdCcgfHwgcmVxdWVzdC5zaWRlID09PSAncmlnaHQnKSBwYWdlT3ZlcmxheS5zZXRTaWRlKHJlcXVlc3Quc2lkZSk7XG4gICAgICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3B1c2gnIHx8IHJlcXVlc3QubW9kZSA9PT0gJ292ZXJsYXknKSBwYWdlT3ZlcmxheS5zZXRNb2RlKHJlcXVlc3QubW9kZSk7XG4gICAgICAgICAgaWYgKHJlcXVlc3Qud2lkdGggPT09ICdjb21wYWN0JyB8fCByZXF1ZXN0LndpZHRoID09PSAnZGVmYXVsdCcgfHwgcmVxdWVzdC53aWR0aCA9PT0gJ3dpZGUnKSB7XG4gICAgICAgICAgICBwYWdlT3ZlcmxheS5zZXRXaWR0aChyZXF1ZXN0LndpZHRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBvcGVuOiBwYWdlT3ZlcmxheS50b2dnbGUoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnNob3cnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LnNpZGUgPT09ICdsZWZ0JyB8fCByZXF1ZXN0LnNpZGUgPT09ICdyaWdodCcpIHBhZ2VPdmVybGF5LnNldFNpZGUocmVxdWVzdC5zaWRlKTtcbiAgICAgICAgICBpZiAocmVxdWVzdC5tb2RlID09PSAncHVzaCcgfHwgcmVxdWVzdC5tb2RlID09PSAnb3ZlcmxheScpIHBhZ2VPdmVybGF5LnNldE1vZGUocmVxdWVzdC5tb2RlKTtcbiAgICAgICAgICBpZiAocmVxdWVzdC53aWR0aCA9PT0gJ2NvbXBhY3QnIHx8IHJlcXVlc3Qud2lkdGggPT09ICdkZWZhdWx0JyB8fCByZXF1ZXN0LndpZHRoID09PSAnd2lkZScpIHtcbiAgICAgICAgICAgIHBhZ2VPdmVybGF5LnNldFdpZHRoKHJlcXVlc3Qud2lkdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYWdlT3ZlcmxheS5zaG93KCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgb3BlbjogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LmhpZGUnOlxuICAgICAgICAgIHBhZ2VPdmVybGF5LmhpZGUoKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCBvcGVuOiBmYWxzZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnN0YXR1cyc6XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBvcGVuOiBwYWdlT3ZlcmxheS5pc09wZW4oKSxcbiAgICAgICAgICAgIHNpZGU6IHBhZ2VPdmVybGF5LmdldFNpZGUoKSxcbiAgICAgICAgICAgIG1vZGU6IHBhZ2VPdmVybGF5LmdldE1vZGUoKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAncGFnZS5vdmVybGF5LnNldFNpZGUnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LnNpZGUgPT09ICdsZWZ0JyB8fCByZXF1ZXN0LnNpZGUgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIHBhZ2VPdmVybGF5LnNldFNpZGUocmVxdWVzdC5zaWRlKTtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUsIHNpZGU6IHJlcXVlc3Quc2lkZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnc2lkZSBtdXN0IGJlIFwibGVmdFwiIG9yIFwicmlnaHRcIicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0TW9kZSc6XG4gICAgICAgICAgaWYgKHJlcXVlc3QubW9kZSA9PT0gJ3B1c2gnIHx8IHJlcXVlc3QubW9kZSA9PT0gJ292ZXJsYXknKSB7XG4gICAgICAgICAgICBwYWdlT3ZlcmxheS5zZXRNb2RlKHJlcXVlc3QubW9kZSk7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCBtb2RlOiByZXF1ZXN0Lm1vZGUgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ21vZGUgbXVzdCBiZSBcInB1c2hcIiBvciBcIm92ZXJsYXlcIicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0V2lkdGgnOlxuICAgICAgICAgIGlmIChyZXF1ZXN0LndpZHRoID09PSAnY29tcGFjdCcgfHwgcmVxdWVzdC53aWR0aCA9PT0gJ2RlZmF1bHQnIHx8IHJlcXVlc3Qud2lkdGggPT09ICd3aWRlJykge1xuICAgICAgICAgICAgcGFnZU92ZXJsYXkuc2V0V2lkdGgocmVxdWVzdC53aWR0aCk7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlLCB3aWR0aDogcmVxdWVzdC53aWR0aCB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiAnd2lkdGggbXVzdCBiZSBjb21wYWN0fGRlZmF1bHR8d2lkZScgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICdwYWdlLm92ZXJsYXkuc2V0RW5hYmxlZCc6XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0LmVuYWJsZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFnZU92ZXJsYXkuc2V0RW5hYmxlZChyZXF1ZXN0LmVuYWJsZWQpO1xuICAgICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgZW5hYmxlZDogcmVxdWVzdC5lbmFibGVkIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdlbmFibGVkIG11c3QgYmUgYm9vbGVhbicgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIC0tLSBQb3B1cCBUb29sIEFjdGlvbnMgLS0tXG4gICAgICAgIGNhc2UgJ3Rvb2wucGlja2VyLnN0YXJ0JzpcbiAgICAgICAgICBlbGVtZW50UGlja2VyLnN0YXJ0KCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5waWNrZXIuc3RvcCc6XG4gICAgICAgICAgZWxlbWVudFBpY2tlci5zdG9wKCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5wYWdlaW5mbyc6XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSwgaW5mbzogZ2F0aGVyUGFnZUluZm8oKSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY2FzZSAndG9vbC5jb25zb2xlLnN0YXJ0JzpcbiAgICAgICAgICBpbmxpbmVDb25zb2xlLnNob3coKTtcbiAgICAgICAgICBzZW5kUmVzcG9uc2UoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBjYXNlICd0b29sLmNvbnNvbGUuaGlkZSc6XG4gICAgICAgICAgaW5saW5lQ29uc29sZS5oaWRlKCk7XG4gICAgICAgICAgc2VuZFJlc3BvbnNlKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gVGFiIGZpbGVzeXN0ZW0gc3VwcG9ydFxuICAgICAgaWYgKHJlcXVlc3QuYWN0aW9uID09PSAnZ2V0Q29udGVudCcpIHtcbiAgICAgICAgc2VuZFJlc3BvbnNlKHsgY29udGVudDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Py5vdXRlckhUTUwgfHwgJycgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdC5hY3Rpb24gPT09ICdzZXRDb250ZW50Jykge1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3QuY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBkb2N1bWVudC5vcGVuKCk7XG4gICAgICAgICAgZG9jdW1lbnQud3JpdGUocmVxdWVzdC5jb250ZW50KTtcbiAgICAgICAgICBkb2N1bWVudC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHNlbmRSZXNwb25zZSh7IHN1Y2Nlc3M6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RTb3VyY2VMb2NhdGlvbihlbGVtZW50OiBIVE1MRWxlbWVudCk6IFNvdXJjZUxvY2F0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmcmFtZXdvcmsgPSB0aGlzLmRldGVjdEZyYW1ld29yaygpO1xuXG4gICAgc3dpdGNoIChmcmFtZXdvcmspIHtcbiAgICAgIGNhc2UgJ3JlYWN0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFJlYWN0U291cmNlKGVsZW1lbnQpO1xuICAgICAgY2FzZSAndnVlJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuZXh0cmFjdFZ1ZVNvdXJjZShlbGVtZW50KTtcbiAgICAgIGNhc2UgJ3N2ZWx0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmV4dHJhY3RTdmVsdGVTb3VyY2UoZWxlbWVudCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdFJlYWN0U291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGhvb2sgPSAod2luZG93IGFzIGFueSkuX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICAgIGlmICghaG9vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGZpYmVyID0gdGhpcy5maW5kUmVhY3RGaWJlcihlbGVtZW50KTtcbiAgICBpZiAoIWZpYmVyKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgY29uc3Qgc291cmNlID0gZmliZXIuX2RlYnVnU291cmNlIHx8IGZpYmVyLnBlbmRpbmdQcm9wcz8uX19zb3VyY2UgfHwgZmliZXIubWVtb2l6ZWRQcm9wcz8uX19zb3VyY2U7XG5cbiAgICBpZiAoc291cmNlICYmIHNvdXJjZS5maWxlTmFtZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZTogc291cmNlLmZpbGVOYW1lLFxuICAgICAgICBsaW5lOiBzb3VyY2UubGluZU51bWJlcixcbiAgICAgICAgY29sdW1uOiBzb3VyY2UuY29sdW1uTnVtYmVyLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUmVhY3RGaWJlcihlbGVtZW50OiBIVE1MRWxlbWVudCk6IGFueSB7XG4gICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMoZWxlbWVudCkuZmluZChcbiAgICAgIChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5zdGFydHNXaXRoKCdfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZSQnKSB8fCBjYW5kaWRhdGUuc3RhcnRzV2l0aCgnX19yZWFjdEZpYmVyJCcpLFxuICAgICk7XG4gICAgcmV0dXJuIGtleSA/IChlbGVtZW50IGFzIGFueSlba2V5XSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RWdWVTb3VyY2UoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBTb3VyY2VMb2NhdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgaG9vayA9ICh3aW5kb3cgYXMgYW55KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuICAgIGlmICghaG9vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGxldCBpbnN0YW5jZSA9IChlbGVtZW50IGFzIGFueSkuX192dWVQYXJlbnRDb21wb25lbnQ7XG4gICAgaWYgKCFpbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UgPSAoZWxlbWVudCBhcyBhbnkpLl9fdnVlX187XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlPy50eXBlPy5fX2ZpbGUpIHtcbiAgICAgIGNvbnN0IGxvY2F0aW9uOiBTb3VyY2VMb2NhdGlvbiA9IHtcbiAgICAgICAgZmlsZTogaW5zdGFuY2UudHlwZS5fX2ZpbGUsXG4gICAgICAgIGxpbmU6IDEsXG4gICAgICB9O1xuXG4gICAgICBpZiAoaW5zdGFuY2Uudm5vZGU/LmxvYykge1xuICAgICAgICBsb2NhdGlvbi5saW5lID0gaW5zdGFuY2Uudm5vZGUubG9jLnN0YXJ0LmxpbmU7XG4gICAgICAgIGxvY2F0aW9uLmNvbHVtbiA9IGluc3RhbmNlLnZub2RlLmxvYy5zdGFydC5jb2x1bW47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0U3ZlbHRlU291cmNlKGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogU291cmNlTG9jYXRpb24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IChlbGVtZW50IGFzIGFueSkuX19zdmVsdGVfY29tcG9uZW50O1xuICAgIGlmIChjb21wb25lbnQ/LiQkPy5jdHg/LiQkX2xvY2F0aW9uKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50LiQkLmN0eC4kJF9sb2NhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0RnJhbWV3b3JrKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICgod2luZG93IGFzIGFueSkuX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fKSByZXR1cm4gJ3JlYWN0JztcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIHJldHVybiAndnVlJztcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fc3ZlbHRlKSByZXR1cm4gJ3N2ZWx0ZSc7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIGdldERPTVBhdGgoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cnJlbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IGVsZW1lbnQ7XG5cbiAgICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICBsZXQgc2VsZWN0b3IgPSBjdXJyZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKGN1cnJlbnQuaWQpIHtcbiAgICAgICAgc2VsZWN0b3IgKz0gYCMke2N1cnJlbnQuaWR9YDtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudC5jbGFzc05hbWUpIHtcbiAgICAgICAgc2VsZWN0b3IgKz0gYC4ke2N1cnJlbnQuY2xhc3NOYW1lLnNwbGl0KCcgJykuam9pbignLicpfWA7XG4gICAgICB9XG5cbiAgICAgIHBhdGgudW5zaGlmdChzZWxlY3Rvcik7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBwYXRoLmpvaW4oJyA+ICcpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3RIZWxwZXJzKCkge1xuICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGBcbiAgICAgIFtkYXRhLWhhbnpvLWhvdmVyXSB7XG4gICAgICAgIG91dGxpbmU6IDJweCBkYXNoZWQgI2ZmNmI2YiAhaW1wb3J0YW50O1xuICAgICAgICBvdXRsaW5lLW9mZnNldDogMnB4ICFpbXBvcnRhbnQ7XG4gICAgICB9XG4gICAgYDtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIChlKSA9PiB7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1oYW56by1ob3Zlcl0nKS5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaGFuem8taG92ZXInKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBtb3VzZW1vdmUgZ2l2ZXMgdGhlIHNhbWUgbW9kaWZpZXIgZmxhZ3MgYXMgY2xpY2ssIHNvIHRoZVxuICAgICAgLy8gY29uZmlndXJlZCBpbnNwZWN0IHNob3J0Y3V0IGdvdmVybnMgdGhlIGhvdmVyIG91dGxpbmUgdG9vLlxuICAgICAgaWYgKG1hdGNoZXNTaG9ydGN1dChlLCB0aGlzLmluc3BlY3RTaG9ydGN1dCkgJiYgZS50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICBlLnRhcmdldC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuem8taG92ZXInLCAndHJ1ZScpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBBSSBDb250cm9sIE92ZXJsYXkgXHUyMDE0IHRha2VvdmVyIHZpc3VhbCBmZWVkYmFjayArIHVzZXIgaW50ZXJhY3Rpb24gbG9ja1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuY29uc3QgYWlPdmVybGF5ID0gKCgpID0+IHtcbiAgbGV0IG92ZXJsYXk6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBjdXJzb3I6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBzdGF0dXNFbDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGNhbmNlbEJ0bjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGhpZ2hsaWdodEVsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgdHJhaWxOb2RlczogSFRNTERpdkVsZW1lbnRbXSA9IFtdO1xuICBsZXQgaW50ZXJhY3Rpb25CbG9ja0FjdGl2ZSA9IGZhbHNlO1xuXG4gIGNvbnN0IE9WRVJMQVlfSUQgPSAnaGFuem8tYWktb3ZlcmxheSc7XG4gIGNvbnN0IFNUWUxFU19JRCA9ICdoYW56by1haS1vdmVybGF5LXN0eWxlcyc7XG4gIGNvbnN0IEJMT0NLRURfRVZFTlRTID0gW1xuICAgICdjbGljaycsICdkYmxjbGljaycsICdtb3VzZWRvd24nLCAnbW91c2V1cCcsICdjb250ZXh0bWVudScsXG4gICAgJ3BvaW50ZXJkb3duJywgJ3BvaW50ZXJ1cCcsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCcsICd3aGVlbCcsXG4gICAgJ2tleWRvd24nLCAna2V5dXAnLCAna2V5cHJlc3MnLFxuICBdO1xuXG4gIGZ1bmN0aW9uIGluamVjdFN0eWxlcygpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoU1RZTEVTX0lEKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLmlkID0gU1RZTEVTX0lEO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgICAgLyogLS0tLSBPdmVybGF5IGJhY2tkcm9wIC0tLS0gKi9cbiAgICAgICMke09WRVJMQVlfSUR9IHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDtcbiAgICAgICAgYmFja2dyb3VuZDpcbiAgICAgICAgICByYWRpYWwtZ3JhZGllbnQoOTB2dyA5MHZoIGF0IDE1JSA4JSwgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMTApLCB0cmFuc3BhcmVudCA1NSUpLFxuICAgICAgICAgIHJhZGlhbC1ncmFkaWVudCg2NXZ3IDY1dmggYXQgODQlIDgyJSwgcmdiYSg5OSwgMTAyLCAyNDEsIDAuMTApLCB0cmFuc3BhcmVudCA2MCUpLFxuICAgICAgICAgIHJnYmEoMiwgNCwgMTAsIDAuNDIpO1xuICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMS41cHgpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICB9XG4gICAgICAjJHtPVkVSTEFZX0lEfS5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgLyogLS0tLSBQdWxzaW5nIGN5YW4gZ2xvdyBjdXJzb3IgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLWN1cnNvciB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYm9yZGVyOiAycHggc29saWQgcmdiYSg2LCAxODIsIDIxMiwgMC45NSk7XG4gICAgICAgIGJveC1zaGFkb3c6XG4gICAgICAgICAgMCAwIDhweCAycHggcmdiYSg2LCAxODIsIDIxMiwgMC40NSksXG4gICAgICAgICAgMCAwIDI0cHggNnB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuMTgpO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlLW91dCwgdG9wIDAuMThzIGVhc2Utb3V0O1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLWN1cnNvci1wdWxzZSAxLjZzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLWN1cnNvci5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlLW91dCwgdG9wIDAuMThzIGVhc2Utb3V0LCBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIGhhbnpvLWN1cnNvci1wdWxzZSB7XG4gICAgICAgIDAlLCAxMDAlIHtcbiAgICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgICAgMCAwIDhweCAycHggcmdiYSg2LCAxODIsIDIxMiwgMC40NSksXG4gICAgICAgICAgICAwIDAgMjRweCA2cHggcmdiYSg2LCAxODIsIDIxMiwgMC4xOCk7XG4gICAgICAgIH1cbiAgICAgICAgNTAlIHtcbiAgICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgICAgMCAwIDE0cHggNHB4IHJnYmEoNiwgMTgyLCAyMTIsIDAuNjUpLFxuICAgICAgICAgICAgMCAwIDM2cHggMTBweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjI4KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIEN1cnNvciB0cmFpbCAtLS0tICovXG4gICAgICAuaGFuem8tY3Vyc29yLXRyYWlsIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICB3aWR0aDogNnB4O1xuICAgICAgICBoZWlnaHQ6IDZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDYsIDE4MiwgMjEyLCAwLjcpO1xuICAgICAgICB6LWluZGV4OiAyMTQ3NDgzNjQ2O1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XG4gICAgICAgIGFuaW1hdGlvbjogaGFuem8tdHJhaWwtZmFkZSAwLjRzIGVhc2Utb3V0IGZvcndhcmRzO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by10cmFpbC1mYWRlIHtcbiAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDAuNzsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgc2NhbGUoMSk7IH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSBzY2FsZSgwLjE1KTsgfVxuICAgICAgfVxuXG4gICAgICAvKiAtLS0tIFN0YXR1cyBiYW5uZXIgKHRvcCBjZW50ZXIgcGlsbCkgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLXN0YXR1cyB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgdG9wOiAxNnB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMHB4O1xuICAgICAgICBtYXgtd2lkdGg6IDkwdnc7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg4LCAxMiwgMjAsIDAuOTQpLCByZ2JhKDEwLCAxNiwgMjQsIDAuOTYpKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMjYpO1xuICAgICAgICBjb2xvcjogI2YzZjRmNjtcbiAgICAgICAgZm9udDogMTNweC8xLjQgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBzYW5zLXNlcmlmO1xuICAgICAgICBib3gtc2hhZG93OlxuICAgICAgICAgIDAgMTBweCAzNnB4IHJnYmEoMCwgMCwgMCwgMC40NiksXG4gICAgICAgICAgaW5zZXQgMCAxcHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2U7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG4gICAgICAuaGFuem8tYWktc3RhdHVzOjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBpbnNldDogLTJweCBhdXRvIC0ycHggLTIwJTtcbiAgICAgICAgd2lkdGg6IDQwJTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB0cmFuc3BhcmVudCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB0cmFuc2Zvcm06IHNrZXdYKC0xOGRlZyk7XG4gICAgICAgIGFuaW1hdGlvbjogaGFuem8tc3RhdHVzLXNoZWVuIDMuNnMgZWFzZS1pbi1vdXQgaW5maW5pdGU7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1zdGF0dXMtc2hlZW4ge1xuICAgICAgICAwJSwgNjglIHsgbGVmdDogLTMwJTsgb3BhY2l0eTogMDsgfVxuICAgICAgICA3MiUgeyBvcGFjaXR5OiAwLjQ7IH1cbiAgICAgICAgMTAwJSB7IGxlZnQ6IDEzMCU7IG9wYWNpdHk6IDA7IH1cbiAgICAgIH1cbiAgICAgIC5oYW56by1haS1zdGF0dXMgPiAqIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLXN0YXR1cy5oYW56by12aXNpYmxlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tYnJhbmQtYnViYmxlIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIG1pbi13aWR0aDogMzBweDtcbiAgICAgICAgcGFkZGluZzogMCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDk5OTlweDtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4yNXB4O1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgICBjb2xvcjogI2UwZjJmZTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxNCwgMTE2LCAxNDQsIDAuOTUpLCByZ2JhKDE1LCAyMywgNDIsIDAuOTUpKTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSg1NiwgMTg5LCAyNDgsIDAuMzUpO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tYWktc3RhdHVzIC5oYW56by1wdWxzZS1kb3Qge1xuICAgICAgICB3aWR0aDogOHB4O1xuICAgICAgICBoZWlnaHQ6IDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjMDZiNmQ0O1xuICAgICAgICBhbmltYXRpb246IGhhbnpvLWRvdC1wdWxzZSAxLjRzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgfVxuICAgICAgQGtleWZyYW1lcyBoYW56by1kb3QtcHVsc2Uge1xuICAgICAgICAwJSwgMTAwJSB7IG9wYWNpdHk6IDE7IH1cbiAgICAgICAgNTAlIHsgb3BhY2l0eTogMC40OyB9XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLWxhYmVsIHtcbiAgICAgICAgbWF4LXdpZHRoOiA0NnZ3O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tZG90czo6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgYW5pbWF0aW9uOiBoYW56by1hbmltYXRlZC1kb3RzIDEuNXMgc3RlcHMoNCkgaW5maW5pdGU7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIGhhbnpvLWFuaW1hdGVkLWRvdHMge1xuICAgICAgICAwJSB7IGNvbnRlbnQ6ICcnOyB9XG4gICAgICAgIDI1JSB7IGNvbnRlbnQ6ICcuJzsgfVxuICAgICAgICA1MCUgeyBjb250ZW50OiAnLi4nOyB9XG4gICAgICAgIDc1JSB7IGNvbnRlbnQ6ICcuLi4nOyB9XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1haS1zdGF0dXMgLmhhbnpvLXN0b3AtYnRuIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjI0KTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjE4KTtcbiAgICAgICAgY29sb3I6ICNmOGZhZmM7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIHBhZGRpbmc6IDRweCAxMnB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cywgYm9yZGVyLWNvbG9yIDAuMTVzO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLXN0YXR1cyAuaGFuem8tc3RvcC1idG46aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgMzgsIDM4LCAwLjI4KTtcbiAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDI0OCwgMTEzLCAxMTMsIDAuNik7XG4gICAgICB9XG5cbiAgICAgIC8qIC0tLS0gXCJUYWtlIEJhY2sgQ29udHJvbFwiIGJ1dHRvbiAoYm90dG9tLXJpZ2h0KSAtLS0tICovXG4gICAgICAuaGFuem8tYWktY2FuY2VsIHtcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBib3R0b206IDI0cHg7XG4gICAgICAgIHJpZ2h0OiAyNHB4O1xuICAgICAgICB6LWluZGV4OiAyMTQ3NDgzNjQ3O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDI0cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgxNSwgMTgsIDI0LCAwLjk1KTtcbiAgICAgICAgY29sb3I6ICNmM2Y0ZjY7XG4gICAgICAgIGZvbnQ6IDYwMCAxNHB4LzEuNCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIHNhbnMtc2VyaWY7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNCk7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDMwMG1zIGVhc2UsIGJhY2tncm91bmQgMC4xNXM7XG4gICAgICB9XG4gICAgICAuaGFuem8tYWktY2FuY2VsLmhhbnpvLXZpc2libGUge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgfVxuICAgICAgLmhhbnpvLWFpLWNhbmNlbDpob3ZlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjIwLCAzOCwgMzgsIDAuMzUpO1xuICAgICAgICBib3JkZXItY29sb3I6IHJnYmEoMjIwLCAzOCwgMzgsIDAuNSk7XG4gICAgICB9XG5cbiAgICAgIC8qIC0tLS0gRWxlbWVudCBoaWdobGlnaHQgLS0tLSAqL1xuICAgICAgLmhhbnpvLWFpLWhpZ2hsaWdodCB7XG4gICAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHJnYmEoNiwgMTgyLCAyMTIsIDAuODUpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDYsIDE4MiwgMjEyLCAwLjE1KTtcbiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE1cywgdG9wIDAuMTVzLCB3aWR0aCAwLjE1cywgaGVpZ2h0IDAuMTVzO1xuICAgICAgfVxuICAgIGA7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XG4gIH1cblxuICBmdW5jdGlvbiBpc092ZXJsYXlFbGVtZW50KHRhcmdldDogRXZlbnRUYXJnZXQgfCBudWxsKTogYm9vbGVhbiB7XG4gICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gISEoXG4gICAgICBvdmVybGF5Py5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICBzdGF0dXNFbD8uY29udGFpbnModGFyZ2V0KSB8fFxuICAgICAgY2FuY2VsQnRuPy5jb250YWlucyh0YXJnZXQpIHx8XG4gICAgICBjdXJzb3I/LmNvbnRhaW5zKHRhcmdldCkgfHxcbiAgICAgIGhpZ2hsaWdodEVsPy5jb250YWlucyh0YXJnZXQpXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJsb2NrSW50ZXJhY3Rpb24oZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCFpbnRlcmFjdGlvbkJsb2NrQWN0aXZlKSByZXR1cm47XG5cbiAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnYWkuY29udHJvbC5jYW5jZWwnIH0pO1xuICAgICAgaGlkZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc092ZXJsYXlFbGVtZW50KGV2ZW50LnRhcmdldCkpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRJbnRlcmFjdGlvbkJsb2NrKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpbnRlcmFjdGlvbkJsb2NrQWN0aXZlID09PSBhY3RpdmUpIHJldHVybjtcblxuICAgIGludGVyYWN0aW9uQmxvY2tBY3RpdmUgPSBhY3RpdmU7XG4gICAgZm9yIChjb25zdCBldmVudE5hbWUgb2YgQkxPQ0tFRF9FVkVOVFMpIHtcbiAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGJsb2NrSW50ZXJhY3Rpb24sIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGJsb2NrSW50ZXJhY3Rpb24sIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3codGFzazogc3RyaW5nKSB7XG4gICAgaWYgKG92ZXJsYXkpIGhpZGUoKTtcblxuICAgIGluamVjdFN0eWxlcygpO1xuICAgIHNldEludGVyYWN0aW9uQmxvY2sodHJ1ZSk7XG5cbiAgICAvLyBCYWNrZHJvcFxuICAgIG92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBvdmVybGF5LmlkID0gT1ZFUkxBWV9JRDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuXG4gICAgLy8gQ3Vyc29yXG4gICAgY3Vyc29yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY3Vyc29yLmNsYXNzTmFtZSA9ICdoYW56by1haS1jdXJzb3InO1xuICAgIGN1cnNvci5zdHlsZS5sZWZ0ID0gYCR7d2luZG93LmlubmVyV2lkdGggLyAyfXB4YDtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gYCR7d2luZG93LmlubmVySGVpZ2h0IC8gMn1weGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjdXJzb3IpO1xuXG4gICAgLy8gU3RhdHVzIGJhbm5lclxuICAgIHN0YXR1c0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgc3RhdHVzRWwuY2xhc3NOYW1lID0gJ2hhbnpvLWFpLXN0YXR1cyc7XG4gICAgc3RhdHVzRWwuaW5uZXJIVE1MID0gYFxuICAgICAgPHNwYW4gY2xhc3M9XCJoYW56by1icmFuZC1idWJibGVcIj5BSTwvc3Bhbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wdWxzZS1kb3RcIj48L2Rpdj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaGFuem8tbGFiZWxcIj4ke2VzY2FwZUh0bWwodGFzayB8fCAnSGFuem8gQUkgaXMgY29udHJvbGxpbmcgdGhpcyB0YWInKX08L3NwYW4+PHNwYW4gY2xhc3M9XCJoYW56by1kb3RzXCI+PC9zcGFuPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLXN0b3AtYnRuXCI+U3RvcDwvYnV0dG9uPlxuICAgIGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzdGF0dXNFbCk7XG5cbiAgICBzdGF0dXNFbC5xdWVyeVNlbGVjdG9yKCcuaGFuem8tc3RvcC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2FpLmNvbnRyb2wuY2FuY2VsJyB9KTtcbiAgICAgIGhpZGUoKTtcbiAgICB9KTtcblxuICAgIC8vIFwiVGFrZSBCYWNrIENvbnRyb2xcIiBidXR0b25cbiAgICBjYW5jZWxCdG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICBjYW5jZWxCdG4uY2xhc3NOYW1lID0gJ2hhbnpvLWFpLWNhbmNlbCc7XG4gICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ1Rha2UgQmFjayBDb250cm9sJztcbiAgICBjYW5jZWxCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2FpLmNvbnRyb2wuY2FuY2VsJyB9KTtcbiAgICAgIGhpZGUoKTtcbiAgICB9KTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbmNlbEJ0bik7XG5cbiAgICAvLyBGYWRlIGluIChuZXh0IGZyYW1lIHNvIHRoZSB0cmFuc2l0aW9uIHRyaWdnZXJzKVxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBvdmVybGF5Py5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgICBjdXJzb3I/LmNsYXNzTGlzdC5hZGQoJ2hhbnpvLXZpc2libGUnKTtcbiAgICAgIHN0YXR1c0VsPy5jbGFzc0xpc3QuYWRkKCdoYW56by12aXNpYmxlJyk7XG4gICAgICBjYW5jZWxCdG4/LmNsYXNzTGlzdC5hZGQoJ2hhbnpvLXZpc2libGUnKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhpZGUoKSB7XG4gICAgLy8gRmFkZSBvdXRcbiAgICBvdmVybGF5Py5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG4gICAgY3Vyc29yPy5jbGFzc0xpc3QucmVtb3ZlKCdoYW56by12aXNpYmxlJyk7XG4gICAgc3RhdHVzRWw/LmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLXZpc2libGUnKTtcbiAgICBjYW5jZWxCdG4/LmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLXZpc2libGUnKTtcblxuICAgIC8vIFJlbW92ZSBhZnRlciB0cmFuc2l0aW9uXG4gICAgY29uc3QgcmVmcyA9IHsgb3ZlcmxheSwgY3Vyc29yLCBzdGF0dXNFbCwgY2FuY2VsQnRuLCBoaWdobGlnaHRFbCB9O1xuICAgIGNvbnN0IHRyYWlscyA9IFsuLi50cmFpbE5vZGVzXTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVmcy5vdmVybGF5Py5yZW1vdmUoKTtcbiAgICAgIHJlZnMuY3Vyc29yPy5yZW1vdmUoKTtcbiAgICAgIHJlZnMuc3RhdHVzRWw/LnJlbW92ZSgpO1xuICAgICAgcmVmcy5jYW5jZWxCdG4/LnJlbW92ZSgpO1xuICAgICAgcmVmcy5oaWdobGlnaHRFbD8ucmVtb3ZlKCk7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdHJhaWxzKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICB9XG4gICAgfSwgMzIwKTtcblxuICAgIHNldEludGVyYWN0aW9uQmxvY2soZmFsc2UpO1xuXG4gICAgb3ZlcmxheSA9IG51bGw7XG4gICAgY3Vyc29yID0gbnVsbDtcbiAgICBzdGF0dXNFbCA9IG51bGw7XG4gICAgY2FuY2VsQnRuID0gbnVsbDtcbiAgICBoaWdobGlnaHRFbCA9IG51bGw7XG4gICAgdHJhaWxOb2RlcyA9IFtdO1xuICB9XG5cbiAgZnVuY3Rpb24gbW92ZUN1cnNvcih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICAgIGlmICghY3Vyc29yKSByZXR1cm47XG5cbiAgICBjb25zdCBjbGFtcGVkWCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHdpbmRvdy5pbm5lcldpZHRoLCBOdW1iZXIuaXNGaW5pdGUoeCkgPyB4IDogMCkpO1xuICAgIGNvbnN0IGNsYW1wZWRZID0gTWF0aC5tYXgoMCwgTWF0aC5taW4od2luZG93LmlubmVySGVpZ2h0LCBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogMCkpO1xuXG4gICAgLy8gVHJhaWwgZG90XG4gICAgY29uc3QgdHJhaWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0cmFpbC5jbGFzc05hbWUgPSAnaGFuem8tY3Vyc29yLXRyYWlsJztcbiAgICB0cmFpbC5zdHlsZS5sZWZ0ID0gYCR7Y2xhbXBlZFh9cHhgO1xuICAgIHRyYWlsLnN0eWxlLnRvcCA9IGAke2NsYW1wZWRZfXB4YDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRyYWlsKTtcbiAgICB0cmFpbE5vZGVzLnB1c2godHJhaWwpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0cmFpbC5yZW1vdmUoKTtcbiAgICAgIHRyYWlsTm9kZXMgPSB0cmFpbE5vZGVzLmZpbHRlcigobm9kZSkgPT4gbm9kZSAhPT0gdHJhaWwpO1xuICAgIH0sIDQwMCk7XG5cbiAgICB3aGlsZSAodHJhaWxOb2Rlcy5sZW5ndGggPiAxMCkge1xuICAgICAgdHJhaWxOb2Rlcy5zaGlmdCgpPy5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBjdXJzb3Iuc3R5bGUubGVmdCA9IGAke2NsYW1wZWRYfXB4YDtcbiAgICBjdXJzb3Iuc3R5bGUudG9wID0gYCR7Y2xhbXBlZFl9cHhgO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlnaGxpZ2h0KHNlbGVjdG9yOiBzdHJpbmcpIHtcbiAgICBoaWdobGlnaHRFbD8ucmVtb3ZlKCk7XG4gICAgaGlnaGxpZ2h0RWwgPSBudWxsO1xuXG4gICAgaWYgKCFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICdzdHJpbmcnKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCByZWN0ID0gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHJlY3Qud2lkdGggPT09IDAgJiYgcmVjdC5oZWlnaHQgPT09IDApIHJldHVybjtcblxuICAgICAgaGlnaGxpZ2h0RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhpZ2hsaWdodEVsLmNsYXNzTmFtZSA9ICdoYW56by1haS1oaWdobGlnaHQnO1xuICAgICAgaGlnaGxpZ2h0RWwuc3R5bGUubGVmdCA9IGAke01hdGgubWF4KDAsIHJlY3QubGVmdCAtIDQpfXB4YDtcbiAgICAgIGhpZ2hsaWdodEVsLnN0eWxlLnRvcCA9IGAke01hdGgubWF4KDAsIHJlY3QudG9wIC0gNCl9cHhgO1xuICAgICAgaGlnaGxpZ2h0RWwuc3R5bGUud2lkdGggPSBgJHtyZWN0LndpZHRoICsgOH1weGA7XG4gICAgICBoaWdobGlnaHRFbC5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodCArIDh9cHhgO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChoaWdobGlnaHRFbCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgaW52YWxpZCBzZWxlY3RvcnMuXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RhdHVzKHRleHQ6IHN0cmluZykge1xuICAgIGlmICghc3RhdHVzRWwpIHJldHVybjtcblxuICAgIGNvbnN0IGxhYmVsID0gc3RhdHVzRWwucXVlcnlTZWxlY3RvcignLmhhbnpvLWxhYmVsJyk7XG4gICAgaWYgKGxhYmVsKSB7XG4gICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHRleHQgfHwgJ0hhbnpvIEFJIGlzIGNvbnRyb2xsaW5nIHRoaXMgdGFiJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LnRleHRDb250ZW50ID0gdGV4dDtcbiAgICByZXR1cm4gZGl2LmlubmVySFRNTDtcbiAgfVxuXG4gIHJldHVybiB7IHNob3csIGhpZGUsIG1vdmVDdXJzb3IsIGhpZ2hsaWdodCwgdXBkYXRlU3RhdHVzIH07XG59KSgpO1xuXG50eXBlIE92ZXJsYXlDaGF0Um9sZSA9ICd1c2VyJyB8ICdhc3Npc3RhbnQnIHwgJ3N5c3RlbSc7XG5cbmludGVyZmFjZSBPdmVybGF5Q2hhdE1lc3NhZ2Uge1xuICByb2xlOiBPdmVybGF5Q2hhdFJvbGU7XG4gIGNvbnRlbnQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIE92ZXJsYXlFbGVtZW50Q29udGV4dCB7XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIHRhZzogc3RyaW5nO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGh0bWw6IHN0cmluZztcbn1cblxudHlwZSBPdmVybGF5TW9kZSA9ICdvdmVybGF5JyB8ICdwdXNoJztcbnR5cGUgT3ZlcmxheVdpZHRoID0gJ2NvbXBhY3QnIHwgJ2RlZmF1bHQnIHwgJ3dpZGUnO1xuXG5jb25zdCBPVkVSTEFZX1dJRFRIX1BYOiBSZWNvcmQ8T3ZlcmxheVdpZHRoLCBudW1iZXI+ID0ge1xuICBjb21wYWN0OiAzMjAsXG4gIGRlZmF1bHQ6IDQyMCxcbiAgd2lkZTogNTYwLFxufTtcblxuY2xhc3MgSGFuem9QYWdlT3ZlcmxheSB7XG4gIHByaXZhdGUgbW91bnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBvcGVuID0gZmFsc2U7XG4gIHByaXZhdGUgc2lkZTogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdyaWdodCc7XG4gIHByaXZhdGUgbW9kZTogT3ZlcmxheU1vZGUgPSAnb3ZlcmxheSc7XG4gIHByaXZhdGUgd2lkdGg6IE92ZXJsYXlXaWR0aCA9ICdkZWZhdWx0JztcbiAgcHJpdmF0ZSBzZW5kaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgd2F0Y2hNb2RlID0gZmFsc2U7XG4gIHByaXZhdGUgZWRpdE1vZGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtb2RlbHNMb2FkZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBtZXNzYWdlczogT3ZlcmxheUNoYXRNZXNzYWdlW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZENvbnRleHQ6IE92ZXJsYXlFbGVtZW50Q29udGV4dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhvdmVyZWRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVkaXRpbmdFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcm9vdDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXVuY2hlcjogSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwYW5lbDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBtZXNzYWdlc0VsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlucHV0RWw6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzZW5kQnRuOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1vZGVsRWw6IEhUTUxTZWxlY3RFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29udGV4dEVsOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdhdGNoQnRuOiBIVE1MQnV0dG9uRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGVkaXRCdG46IEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzRWw6IEhUTUxTcGFuRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGhpZ2hsaWdodEJveDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmluamVjdFN0eWxlcygpO1xuICAgIHRoaXMubW91bnQoKTtcbiAgICB0aGlzLmJpbmRHbG9iYWxFdmVudHMoKTtcbiAgICB0aGlzLnJlc3RvcmVQcmVmcygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlUHJlZnMoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNzID0gKHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyA/IGJyb3dzZXIgOiAoY2hyb21lIGFzIGFueSkpPy5zdG9yYWdlPy5zeW5jO1xuICAgICAgaWYgKCFzcz8uZ2V0KSByZXR1cm47XG4gICAgICBjb25zdCBwcm9taXNlZCA9IHNzLmdldChbJ292ZXJsYXlTaWRlJywgJ292ZXJsYXlNb2RlJywgJ292ZXJsYXlXaWR0aCddKTtcbiAgICAgIGNvbnN0IGFwcGx5ID0gKHY6IGFueSkgPT4ge1xuICAgICAgICBpZiAodj8ub3ZlcmxheVNpZGUgPT09ICdsZWZ0JyB8fCB2Py5vdmVybGF5U2lkZSA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgIHRoaXMuc2lkZSA9IHYub3ZlcmxheVNpZGU7XG4gICAgICAgICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2lkZScsIHRoaXMuc2lkZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHY/Lm92ZXJsYXlNb2RlID09PSAncHVzaCcgfHwgdj8ub3ZlcmxheU1vZGUgPT09ICdvdmVybGF5Jykge1xuICAgICAgICAgIHRoaXMubW9kZSA9IHYub3ZlcmxheU1vZGU7XG4gICAgICAgICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZScsIHRoaXMubW9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ2NvbXBhY3QnIHx8IHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ2RlZmF1bHQnIHx8IHY/Lm92ZXJsYXlXaWR0aCA9PT0gJ3dpZGUnKSB7XG4gICAgICAgICAgdGhpcy53aWR0aCA9IHYub3ZlcmxheVdpZHRoO1xuICAgICAgICAgIHRoaXMuYXBwbHlXaWR0aCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgICB9O1xuICAgICAgaWYgKHByb21pc2VkICYmIHR5cGVvZiBwcm9taXNlZC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHByb21pc2VkLnRoZW4oYXBwbHkpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNzLmdldChbJ292ZXJsYXlTaWRlJywgJ292ZXJsYXlNb2RlJywgJ292ZXJsYXlXaWR0aCddLCBhcHBseSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7IC8qIHN0b3JhZ2UgbWF5IGJlIHVuYXZhaWxhYmxlICovIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlXaWR0aCgpOiB2b2lkIHtcbiAgICBjb25zdCBweCA9IE9WRVJMQVlfV0lEVEhfUFhbdGhpcy53aWR0aF0gPz8gT1ZFUkxBWV9XSURUSF9QWC5kZWZhdWx0O1xuICAgIGlmICh0aGlzLnJvb3QpIHtcbiAgICAgIHRoaXMucm9vdC5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1oYW56by1vdmVybGF5LXdpZHRoJywgYCR7cHh9cHhgKTtcbiAgICAgIHRoaXMucm9vdC5zdHlsZS53aWR0aCA9IGBtaW4oJHtweH1weCwgMTAwdncpYDtcbiAgICB9XG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCctLWhhbnpvLW92ZXJsYXktd2lkdGgnLCBgJHtweH1weGApO1xuICB9XG5cbiAgcHJpdmF0ZSBhcHBseVB1c2hJZk9wZW4oKTogdm9pZCB7XG4gICAgY29uc3QgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAvLyBBbHdheXMgc3RyaXAgZmlyc3Qgc28gd2UgbmV2ZXIgc3RhY2sgbWFyZ2lucy5cbiAgICBodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ2hhbnpvLW92ZXJsYXktcHVzaCcsICdoYW56by1vdmVybGF5LXB1c2gtbGVmdCcsICdoYW56by1vdmVybGF5LXB1c2gtcmlnaHQnKTtcbiAgICBpZiAodGhpcy5vcGVuICYmIHRoaXMuZW5hYmxlZCAmJiB0aGlzLm1vZGUgPT09ICdwdXNoJykge1xuICAgICAgaHRtbC5jbGFzc0xpc3QuYWRkKCdoYW56by1vdmVybGF5LXB1c2gnLCBgaGFuem8tb3ZlcmxheS1wdXNoLSR7dGhpcy5zaWRlfWApO1xuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCAhdGhpcy5vcGVuKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmhpZGUoKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpc09wZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3BlbjtcbiAgfVxuXG4gIGdldFNpZGUoKTogJ2xlZnQnIHwgJ3JpZ2h0JyB7XG4gICAgcmV0dXJuIHRoaXMuc2lkZTtcbiAgfVxuXG4gIGdldE1vZGUoKTogT3ZlcmxheU1vZGUge1xuICAgIHJldHVybiB0aGlzLm1vZGU7XG4gIH1cblxuICBzZXRTaWRlKHNpZGU6ICdsZWZ0JyB8ICdyaWdodCcpOiB2b2lkIHtcbiAgICB0aGlzLnNpZGUgPSBzaWRlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLXNpZGUnLCBzaWRlKTtcbiAgICB0aGlzLmFwcGx5UHVzaElmT3BlbigpO1xuICAgIHRoaXMucGVyc2lzdCh7IG92ZXJsYXlTaWRlOiBzaWRlIH0pO1xuICB9XG5cbiAgc2V0TW9kZShtb2RlOiBPdmVybGF5TW9kZSk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IG1vZGU7XG4gICAgdGhpcy5yb290Py5zZXRBdHRyaWJ1dGUoJ2RhdGEtbW9kZScsIG1vZGUpO1xuICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgdGhpcy5wZXJzaXN0KHsgb3ZlcmxheU1vZGU6IG1vZGUgfSk7XG4gIH1cblxuICBzZXRXaWR0aCh3aWR0aDogT3ZlcmxheVdpZHRoKTogdm9pZCB7XG4gICAgdGhpcy53aWR0aCA9IHdpZHRoO1xuICAgIHRoaXMuYXBwbHlXaWR0aCgpO1xuICAgIHRoaXMucGVyc2lzdCh7IG92ZXJsYXlXaWR0aDogd2lkdGggfSk7XG4gIH1cblxuICBzZXRFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVuYWJsZWQgPSBlbmFibGVkO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLWVuYWJsZWQnLCBlbmFibGVkID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgaWYgKCFlbmFibGVkKSB0aGlzLmhpZGUoKTtcbiAgICB0aGlzLnBlcnNpc3QoeyBvdmVybGF5RW5hYmxlZDogZW5hYmxlZCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcGVyc2lzdCh2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNzID0gKHR5cGVvZiBicm93c2VyICE9PSAndW5kZWZpbmVkJyA/IGJyb3dzZXIgOiAoY2hyb21lIGFzIGFueSkpPy5zdG9yYWdlPy5zeW5jO1xuICAgICAgc3M/LnNldD8uKHZhbHVlcyk7XG4gICAgfSBjYXRjaCB7IC8qIHN0b3JhZ2UgbWF5IGJlIHVuYXZhaWxhYmxlICovIH1cbiAgfVxuXG4gIHNob3coKTogdm9pZCB7XG4gICAgdGhpcy5lbnN1cmVNb3VudGVkKCk7XG4gICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLWVuYWJsZWQnLCAndHJ1ZScpO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCAndHJ1ZScpO1xuICAgIHRoaXMuYXBwbHlQdXNoSWZPcGVuKCk7XG4gICAgdGhpcy5sb2FkTW9kZWxzKCk7XG4gICAgdGhpcy5mb2N1c0lucHV0KCk7XG4gIH1cblxuICBoaWRlKCk6IHZvaWQge1xuICAgIHRoaXMub3BlbiA9IGZhbHNlO1xuICAgIHRoaXMucm9vdD8uc2V0QXR0cmlidXRlKCdkYXRhLW9wZW4nLCAnZmFsc2UnKTtcbiAgICB0aGlzLmFwcGx5UHVzaElmT3BlbigpO1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKCcnKTtcbiAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgdGhpcy5zZXRXYXRjaE1vZGUoZmFsc2UpO1xuICAgIHRoaXMuc2V0RWRpdE1vZGUoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVNb3VudGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vdW50ZWQpIHJldHVybjtcbiAgICB0aGlzLm1vdW50KCk7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFN0eWxlcygpOiB2b2lkIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hhbnpvLXBhZ2Utb3ZlcmxheS1zdHlsZXMnKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIHN0eWxlLmlkID0gJ2hhbnpvLXBhZ2Utb3ZlcmxheS1zdHlsZXMnO1xuICAgIHN0eWxlLnRleHRDb250ZW50ID0gYFxuICAgICAgLyogRWRnZS1waW5uZWQgc2lkZWJhciBwYW5lbCBcdTIwMTQgbm8gRkFCLCBvcGVuZWQgZnJvbSBleHRlbnNpb24gcG9wdXAuXG4gICAgICAgICBIYW56byBicmFuZDogbW9ub2Nocm9tZSAod2hpdGUgcHJpbWFyeSwgbmV1dHJhbCBzdXJmYWNlcykuIE5vIGJsdWUuICovXG4gICAgICAjaGFuem8tcGFnZS1vdmVybGF5LXJvb3Qge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgd2lkdGg6IG1pbih2YXIoLS1oYW56by1vdmVybGF5LXdpZHRoLCA0MjBweCksIDEwMHZ3KTtcbiAgICAgICAgei1pbmRleDogMjE0NzQ4MzY0NTtcbiAgICAgICAgZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1NlZ29lIFVJJywgc2Fucy1zZXJpZjtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdFtkYXRhLXNpZGU9XCJsZWZ0XCJdIHtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICB9XG5cbiAgICAgICNoYW56by1wYWdlLW92ZXJsYXktcm9vdCAqIHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIH1cblxuICAgICAgLyogUHVzaCBtb2RlOiB3aGVuIHRoZSB1c2VyIHBpbnMgdGhlIHBhbmVsIGFzIGEgZG9jaywgaHRtbCBzaGlmdHMgc29cbiAgICAgICAgIHBhZ2UgY29udGVudCByZWZsb3dzIGJlc2lkZSBpdCBpbnN0ZWFkIG9mIGJlaW5nIGNvdmVyZWQuIEFwcGxpZWQgdG9cbiAgICAgICAgIDxodG1sPiBmcm9tIHNldE1vZGUoJ3B1c2gnKSArIG9wZW4uICovXG4gICAgICBodG1sLmhhbnpvLW92ZXJsYXktcHVzaC5oYW56by1vdmVybGF5LXB1c2gtcmlnaHQge1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLWhhbnpvLW92ZXJsYXktd2lkdGgsIDQyMHB4KSAhaW1wb3J0YW50O1xuICAgICAgICB0cmFuc2l0aW9uOiBtYXJnaW4tcmlnaHQgMC4xOHMgZWFzZTtcbiAgICAgIH1cbiAgICAgIGh0bWwuaGFuem8tb3ZlcmxheS1wdXNoLmhhbnpvLW92ZXJsYXktcHVzaC1sZWZ0IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IHZhcigtLWhhbnpvLW92ZXJsYXktd2lkdGgsIDQyMHB4KSAhaW1wb3J0YW50O1xuICAgICAgICB0cmFuc2l0aW9uOiBtYXJnaW4tbGVmdCAwLjE4cyBlYXNlO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1wYW5lbCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTtcbiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDE4MGRlZywgcmdiYSgxMCwgMTAsIDExLCAwLjk3KSwgcmdiYSg3LCA3LCA4LCAwLjk3KSk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBib3gtc2hhZG93OiAtMjJweCAwIDQ4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMThzIGVhc2UsIG9wYWNpdHkgMC4xOHMgZWFzZTtcbiAgICAgIH1cblxuICAgICAgI2hhbnpvLXBhZ2Utb3ZlcmxheS1yb290W2RhdGEtc2lkZT1cImxlZnRcIl0gLmhhbnpvLXBhZ2UtcGFuZWwge1xuICAgICAgICBib3JkZXItbGVmdDogbm9uZTtcbiAgICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE2KTtcbiAgICAgICAgYm94LXNoYWRvdzogMjJweCAwIDQ4cHggcmdiYSgwLCAwLCAwLCAwLjQ1KTtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTtcbiAgICAgIH1cblxuICAgICAgI2hhbnpvLXBhZ2Utb3ZlcmxheS1yb290W2RhdGEtb3Blbj1cInRydWVcIl0gLmhhbnpvLXBhZ2UtcGFuZWwge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oZWFkZXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgICAgIHBhZGRpbmc6IDEycHggMTRweDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxODBkZWcsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyksIHRyYW5zcGFyZW50KTtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWJyYW5kIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMnB4O1xuICAgICAgICBmb250LXNpemU6IDEzcHg7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oZWFkZXItYWN0aW9ucyB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDZweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWNoaXAtYnRuIHtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA5OTk5cHg7XG4gICAgICAgIHBhZGRpbmc6IDRweCAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgY29sb3I6IHJnYmEoMjQ1LCAyNDUsIDI0NSwgMC44NSk7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTVzLCBjb2xvciAwLjE1cywgYm9yZGVyLWNvbG9yIDAuMTVzO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tY2hpcC1idG46aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWNoaXAtYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApO1xuICAgICAgICBjb2xvcjogI2ZmZjtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuIHtcbiAgICAgICAgd2lkdGg6IDI4cHg7XG4gICAgICAgIGhlaWdodDogMjhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTgpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgICAgICAgY29sb3I6ICNmNWY1ZjU7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMsIGJvcmRlci1jb2xvciAwLjE1cztcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA2KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLWljb24tYnRuW2RhdGEtYWN0aXZlPVwidHJ1ZVwiXSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMik7XG4gICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8taWNvbi1idG4gc3ZnIHtcbiAgICAgICAgd2lkdGg6IDE0cHg7XG4gICAgICAgIGhlaWdodDogMTRweDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbWV0YSB7XG4gICAgICAgIHBhZGRpbmc6IDEwcHggMTRweCA2cHggMTRweDtcbiAgICAgICAgZGlzcGxheTogZ3JpZDtcbiAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgYXV0bztcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1jb250ZXh0IHtcbiAgICAgICAgZm9udC1zaXplOiAxMXB4O1xuICAgICAgICBjb2xvcjogcmdiYSgyNDUsIDI0NSwgMjQ1LCAwLjY1KTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLXN0YXR1cyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTFweDtcbiAgICAgICAgY29sb3I6IHJnYmEoMjQ1LCAyNDUsIDI0NSwgMC41NSk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1tb2RlbC1yb3cge1xuICAgICAgICBwYWRkaW5nOiAwIDE0cHggOHB4IDE0cHg7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tbW9kZWwtcm93IHNlbGVjdCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNik7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBwYWRkaW5nOiA3cHggOXB4O1xuICAgICAgICBmb250LXNpemU6IDEycHg7XG4gICAgICB9XG5cbiAgICAgIC8qIFRoZSBjaGF0IHNjcm9sbGVyOiB0YWtlcyBBTEwgcmVtYWluaW5nIHZlcnRpY2FsIHNwYWNlIHNvIHRoZVxuICAgICAgICAgY29tcG9zZXIgYmVsb3cgc3RheXMgc3RpY2t5IGFnYWluc3QgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZWwuICovXG4gICAgICAuaGFuem8tcGFnZS1tZXNzYWdlcyB7XG4gICAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgICAgICBwYWRkaW5nOiA4cHggMTRweCAxMnB4IDE0cHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1tc2cge1xuICAgICAgICBwYWRkaW5nOiA5cHggMTBweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMS40NTtcbiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtbXNnLnVzZXIge1xuICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDtcbiAgICAgICAgbWF4LXdpZHRoOiA4OCU7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xOCk7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLW1zZy5hc3Npc3RhbnQge1xuICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgICAgICBtYXgtd2lkdGg6IDkyJTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA0KTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEwKTtcbiAgICAgIH1cblxuICAgICAgLyogQ29tcG9zZXIgcGlubmVkIHRvIGJvdHRvbSBvZiB0aGUgcGFuZWwuIGZsZXgtc2hyaW5rOiAwIHByZXZlbnRzXG4gICAgICAgICBpdCBmcm9tIGNvbGxhcHNpbmcgd2hlbiB0aGUgbWVzc2FnZXMgc2Nyb2xsZXIgZ3Jvd3MuICovXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciB7XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApO1xuICAgICAgICBwYWRkaW5nOiAxMHB4IDEycHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zNSk7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciB0ZXh0YXJlYSB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDM4cHg7XG4gICAgICAgIG1heC1oZWlnaHQ6IDExMHB4O1xuICAgICAgICByZXNpemU6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNyk7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMyk7XG4gICAgICAgIGNvbG9yOiAjZjVmNWY1O1xuICAgICAgICBwYWRkaW5nOiA5cHggMTFweDtcbiAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgfVxuXG4gICAgICAvKiBQcmltYXJ5IGFjdGlvbjogV0hJVEUgcGVyIEBoYW56by9icmFuZCBtb25vY2hyb21lIGd1aWRlbGluZXMuICovXG4gICAgICAuaGFuem8tcGFnZS1jb21wb3NlciBidXR0b24ge1xuICAgICAgICBtaW4td2lkdGg6IDY4cHg7XG4gICAgICAgIGhlaWdodDogMzhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2ZmZmZmZjtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjtcbiAgICAgICAgY29sb3I6ICMwYTBhMGI7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kIDAuMTJzLCB0cmFuc2Zvcm0gMC4wOHM7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIGJ1dHRvbjpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7XG4gICAgICB9XG5cbiAgICAgIC5oYW56by1wYWdlLWNvbXBvc2VyIGJ1dHRvbjphY3RpdmU6bm90KDpkaXNhYmxlZCkge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMXB4KTtcbiAgICAgIH1cblxuICAgICAgLmhhbnpvLXBhZ2UtY29tcG9zZXIgYnV0dG9uOmRpc2FibGVkIHtcbiAgICAgICAgb3BhY2l0eTogMC41NTtcbiAgICAgICAgY3Vyc29yOiBkZWZhdWx0O1xuICAgICAgfVxuXG4gICAgICAuaGFuem8tcGFnZS1oaWdobGlnaHQge1xuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIHotaW5kZXg6IDIxNDc0ODM2NDQ7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTUpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDJweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XG4gICAgICB9XG5cbiAgICAgIFtkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nPVwidHJ1ZVwiXSB7XG4gICAgICAgIG91dGxpbmU6IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOTIpICFpbXBvcnRhbnQ7XG4gICAgICAgIG91dGxpbmUtb2Zmc2V0OiAycHggIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICBgO1xuICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBtb3VudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb3VudGVkKSByZXR1cm47XG5cbiAgICB0aGlzLnJvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB0aGlzLnJvb3QuaWQgPSAnaGFuem8tcGFnZS1vdmVybGF5LXJvb3QnO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3BlbicsICdmYWxzZScpO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZW5hYmxlZCcsICdmYWxzZScpO1xuICAgIHRoaXMucm9vdC5zZXRBdHRyaWJ1dGUoJ2RhdGEtc2lkZScsIHRoaXMuc2lkZSk7XG4gICAgdGhpcy5yb290LnNldEF0dHJpYnV0ZSgnZGF0YS1tb2RlJywgdGhpcy5tb2RlKTtcbiAgICB0aGlzLmFwcGx5V2lkdGgoKTtcbiAgICB0aGlzLnJvb3QuaW5uZXJIVE1MID0gYFxuICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtcGFuZWxcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbD1cIkhhbnpvIFBhZ2UgQXNzaXN0YW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWhlYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWJyYW5kXCI+SGFuem88L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1oZWFkZXItYWN0aW9uc1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWNoaXAtYnRuXCIgZGF0YS1yb2xlPVwid2F0Y2hcIiBkYXRhLWFjdGl2ZT1cImZhbHNlXCIgdGl0bGU9XCJXYXRjaCBlbGVtZW50cyBvbiBob3ZlclwiPldhdGNoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaGFuem8tY2hpcC1idG5cIiBkYXRhLXJvbGU9XCJlZGl0XCIgZGF0YS1hY3RpdmU9XCJmYWxzZVwiIHRpdGxlPVwiQ2xpY2sgYW55IGVsZW1lbnQgdG8gZWRpdCB0ZXh0XCI+RWRpdDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWljb24tYnRuXCIgZGF0YS1yb2xlPVwicGluLW1vZGVcIiB0aXRsZT1cIlRvZ2dsZTogcGluIChwdXNoIGNvbnRlbnQpIHZzIG92ZXJsYXkgKGZsb2F0IG92ZXIgcGFnZSlcIj5cbiAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk05IDR2MTZNMyA0aDEyYTQgNCAwIDAgMSA0IDR2OGE0IDQgMCAwIDEtNCA0SDN6XCIvPlxuICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImhhbnpvLWljb24tYnRuXCIgZGF0YS1yb2xlPVwiY2xvc2VcIiB0aXRsZT1cIkhpZGUgb3ZlcmxheVwiPlx1MDBENzwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhhbnpvLXBhZ2UtbWV0YVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLWNvbnRleHRcIj5Vc2UgV2F0Y2ggdG8gaW5zcGVjdCBwYWdlIGVsZW1lbnRzLjwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGFuem8tcGFnZS1zdGF0dXNcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tbW9kZWwtcm93XCI+XG4gICAgICAgICAgPHNlbGVjdCBkYXRhLXJvbGU9XCJtb2RlbFwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYXVkZS1zb25uZXQtNC0yMDI1MDUxNFwiPkNsYXVkZSBTb25uZXQgNDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNsYXVkZS1vcHVzLTQtMjAyNTA1MTRcIj5DbGF1ZGUgT3B1cyA0PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiZ3B0LTRvXCI+R1BULTRvPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiemVuLWNvZGVyLWZsYXNoXCI+WmVuIENvZGVyIEZsYXNoPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiemVuLW1heFwiPlplbiBNYXg8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoYW56by1wYWdlLW1lc3NhZ2VzXCIgZGF0YS1yb2xlPVwibWVzc2FnZXNcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1tc2cgYXNzaXN0YW50XCI+QXNrIGFib3V0IHRoaXMgcGFnZSwgaW5zcGVjdCBhbnkgZWxlbWVudCwgb3IgdHVybiBvbiBFZGl0IG1vZGUgdG8gY2hhbmdlIHRleHQgaW4tcGxhY2UuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGFuem8tcGFnZS1jb21wb3NlclwiPlxuICAgICAgICAgIDx0ZXh0YXJlYSBkYXRhLXJvbGU9XCJpbnB1dFwiIHJvd3M9XCIxXCIgcGxhY2Vob2xkZXI9XCJBc2sgYWJvdXQgdGhpcyBwYWdlLi4uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICA8YnV0dG9uIGRhdGEtcm9sZT1cInNlbmRcIiB0eXBlPVwiYnV0dG9uXCI+QXNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIHRoaXMucGFuZWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignLmhhbnpvLXBhZ2UtcGFuZWwnKTtcbiAgICB0aGlzLmxhdW5jaGVyID0gbnVsbDtcbiAgICB0aGlzLm1lc3NhZ2VzRWwgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cIm1lc3NhZ2VzXCJdJyk7XG4gICAgdGhpcy5pbnB1dEVsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJpbnB1dFwiXScpO1xuICAgIHRoaXMuc2VuZEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwic2VuZFwiXScpO1xuICAgIHRoaXMubW9kZWxFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwibW9kZWxcIl0nKTtcbiAgICB0aGlzLmNvbnRleHRFbCA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCcuaGFuem8tcGFnZS1jb250ZXh0Jyk7XG4gICAgdGhpcy53YXRjaEJ0biA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPVwid2F0Y2hcIl0nKTtcbiAgICB0aGlzLmVkaXRCdG4gPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcignW2RhdGEtcm9sZT1cImVkaXRcIl0nKTtcbiAgICB0aGlzLnN0YXR1c0VsID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJy5oYW56by1wYWdlLXN0YXR1cycpO1xuXG4gICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJjbG9zZVwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuaGlkZSgpKTtcbiAgICBjb25zdCBwaW5Nb2RlQnRuID0gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXJvbGU9XCJwaW4tbW9kZVwiXScpO1xuICAgIHBpbk1vZGVCdG4/LnNldEF0dHJpYnV0ZSgnZGF0YS1hY3RpdmUnLCB0aGlzLm1vZGUgPT09ICdwdXNoJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIHBpbk1vZGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY29uc3QgbmV4dDogT3ZlcmxheU1vZGUgPSB0aGlzLm1vZGUgPT09ICdwdXNoJyA/ICdvdmVybGF5JyA6ICdwdXNoJztcbiAgICAgIHRoaXMuc2V0TW9kZShuZXh0KTtcbiAgICAgIHBpbk1vZGVCdG4uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZScsIG5leHQgPT09ICdwdXNoJyA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIH0pO1xuICAgIHRoaXMud2F0Y2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zZXRXYXRjaE1vZGUoIXRoaXMud2F0Y2hNb2RlKSk7XG4gICAgdGhpcy5lZGl0QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRoaXMuc2V0RWRpdE1vZGUoIXRoaXMuZWRpdE1vZGUpKTtcbiAgICB0aGlzLnNlbmRCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5hc2tQYWdlUXVlc3Rpb24oKSk7XG4gICAgdGhpcy5pbnB1dEVsPy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmFza1BhZ2VRdWVzdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaW5wdXRFbD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaW5wdXRFbCkgcmV0dXJuO1xuICAgICAgdGhpcy5pbnB1dEVsLnN0eWxlLmhlaWdodCA9ICdhdXRvJztcbiAgICAgIHRoaXMuaW5wdXRFbC5zdHlsZS5oZWlnaHQgPSBgJHtNYXRoLm1pbih0aGlzLmlucHV0RWwuc2Nyb2xsSGVpZ2h0LCAxMTApfXB4YDtcbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnJvb3QpO1xuICAgIHRoaXMubW91bnRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGJpbmRHbG9iYWxFdmVudHMoKTogdm9pZCB7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKGV2ZW50KSA9PiB0aGlzLm9uTW91c2VNb3ZlKGV2ZW50KSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHRoaXMub25Eb2N1bWVudENsaWNrKGV2ZW50KSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4gdGhpcy5vbktleURvd24oZXZlbnQpLCB0cnVlKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2F0Y2hNb2RlKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRQYWdlVGFyZ2V0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcbiAgICB0aGlzLmhvdmVyZWRFbGVtZW50ID0gdGFyZ2V0O1xuICAgIHRoaXMuc2hvd0hpZ2hsaWdodCh0YXJnZXQpO1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbnRleHQpIHtcbiAgICAgIHRoaXMuY29udGV4dEVsICYmICh0aGlzLmNvbnRleHRFbC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0RWxlbWVudFN1bW1hcnkodGFyZ2V0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMud2F0Y2hNb2RlICYmICF0aGlzLmVkaXRNb2RlKSByZXR1cm47XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRQYWdlVGFyZ2V0KGV2ZW50LnRhcmdldCk7XG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAodGhpcy53YXRjaE1vZGUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRDb250ZXh0ID0gdGhpcy5jYXB0dXJlRWxlbWVudENvbnRleHQodGFyZ2V0KTtcbiAgICAgIHRoaXMuY29udGV4dEVsICYmICh0aGlzLmNvbnRleHRFbC50ZXh0Q29udGVudCA9IHRoaXMuZ2V0RWxlbWVudFN1bW1hcnkodGFyZ2V0KSk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWxlbWVudCBzZWxlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmVkaXRNb2RlKSB7XG4gICAgICB0aGlzLmVuYWJsZUlubGluZUVkaXQodGFyZ2V0KTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0aW5nIGVsZW1lbnQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICBpZiAodGhpcy5lZGl0aW5nRWxlbWVudCkge1xuICAgICAgICB0aGlzLmRpc2FibGVJbmxpbmVFZGl0KHRoaXMuZWRpdGluZ0VsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VkaXQgY2FuY2VsZWQnKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3Blbikge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFBhZ2VUYXJnZXQodGFyZ2V0OiBFdmVudFRhcmdldCB8IG51bGwpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMucm9vdD8uY29udGFpbnModGFyZ2V0KSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCF0YXJnZXQuaXNDb25uZWN0ZWQpIHJldHVybiBudWxsO1xuICAgIGlmICh0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaHRtbCcgfHwgdGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2JvZHknKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRXYXRjaE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy53YXRjaE1vZGUgPSBhY3RpdmU7XG4gICAgaWYgKGFjdGl2ZSkgdGhpcy5zZXRFZGl0TW9kZShmYWxzZSk7XG4gICAgdGhpcy53YXRjaEJ0bj8uc2V0QXR0cmlidXRlKCdkYXRhLWFjdGl2ZScsIGFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xuICAgIGlmICghYWN0aXZlKSB7XG4gICAgICB0aGlzLmhvdmVyZWRFbGVtZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuY2xlYXJIaWdobGlnaHQoKTtcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZENvbnRleHQgJiYgdGhpcy5jb250ZXh0RWwpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0RWwudGV4dENvbnRlbnQgPSAnVXNlIFdhdGNoIHRvIGluc3BlY3QgcGFnZSBlbGVtZW50cy4nO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnV2F0Y2ggbW9kZSBvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0RWRpdE1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0TW9kZSA9IGFjdGl2ZTtcbiAgICBpZiAoYWN0aXZlKSB0aGlzLnNldFdhdGNoTW9kZShmYWxzZSk7XG4gICAgdGhpcy5lZGl0QnRuPy5zZXRBdHRyaWJ1dGUoJ2RhdGEtYWN0aXZlJywgYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgaWYgKCFhY3RpdmUgJiYgdGhpcy5lZGl0aW5nRWxlbWVudCkge1xuICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdCh0aGlzLmVkaXRpbmdFbGVtZW50LCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKGFjdGl2ZSkge1xuICAgICAgdGhpcy51cGRhdGVTdGF0dXMoJ0VkaXQgbW9kZSBvbicpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZW5hYmxlSW5saW5lRWRpdChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVkaXRpbmdFbGVtZW50ICYmIHRoaXMuZWRpdGluZ0VsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZUlubGluZUVkaXQodGhpcy5lZGl0aW5nRWxlbWVudCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8IGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgICB0aGlzLmVkaXRpbmdFbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaGFuem8tb3JpZ2luYWwtaHRtbCcsIGVsZW1lbnQuaW5uZXJIVE1MKTtcbiAgICB9XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2NvbnRlbnRlZGl0YWJsZScsICd0cnVlJyk7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3NwZWxsY2hlY2snLCAndHJ1ZScpO1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nJywgJ3RydWUnKTtcbiAgICBlbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5lZGl0aW5nRWxlbWVudCA9IGVsZW1lbnQ7XG5cbiAgICBjb25zdCBrZXlkb3duSGFuZGxlciA9IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdChlbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IHJldmVydGVkJyk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnRW50ZXInICYmICFldmVudC5zaGlmdEtleSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmRpc2FibGVJbmxpbmVFZGl0KGVsZW1lbnQsIHRydWUpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRWRpdCBhcHBsaWVkJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGJsdXJIYW5kbGVyID0gKCkgPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlSW5saW5lRWRpdChlbGVtZW50LCB0cnVlKTtcbiAgICAgIHRoaXMudXBkYXRlU3RhdHVzKCdFZGl0IGFwcGxpZWQnKTtcbiAgICB9O1xuXG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywga2V5ZG93bkhhbmRsZXIsIHsgb25jZTogdHJ1ZSB9KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBibHVySGFuZGxlciwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlSW5saW5lRWRpdChlbGVtZW50OiBIVE1MRWxlbWVudCwga2VlcENoYW5nZXM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIWtlZXBDaGFuZ2VzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWhhbnpvLW9yaWdpbmFsLWh0bWwnKTtcbiAgICAgIGlmIChvcmlnaW5hbCAhPT0gbnVsbCkge1xuICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IG9yaWdpbmFsO1xuICAgICAgfVxuICAgIH1cblxuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjb250ZW50ZWRpdGFibGUnKTtcbiAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnc3BlbGxjaGVjaycpO1xuICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWhhbnpvLWlubGluZS1lZGl0aW5nJyk7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtaGFuem8tb3JpZ2luYWwtaHRtbCcpO1xuXG4gICAgaWYgKHRoaXMuZWRpdGluZ0VsZW1lbnQgPT09IGVsZW1lbnQpIHtcbiAgICAgIHRoaXMuZWRpdGluZ0VsZW1lbnQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2hvd0hpZ2hsaWdodChlbGVtZW50OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChyZWN0LndpZHRoID09PSAwICYmIHJlY3QuaGVpZ2h0ID09PSAwKSB7XG4gICAgICB0aGlzLmNsZWFySGlnaGxpZ2h0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmhpZ2hsaWdodEJveCkge1xuICAgICAgdGhpcy5oaWdobGlnaHRCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0Qm94LmNsYXNzTmFtZSA9ICdoYW56by1wYWdlLWhpZ2hsaWdodCc7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5oaWdobGlnaHRCb3gpO1xuICAgIH1cblxuICAgIHRoaXMuaGlnaGxpZ2h0Qm94LnN0eWxlLmxlZnQgPSBgJHtNYXRoLm1heCgwLCByZWN0LmxlZnQgLSAzKX1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUudG9wID0gYCR7TWF0aC5tYXgoMCwgcmVjdC50b3AgLSAzKX1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUud2lkdGggPSBgJHtyZWN0LndpZHRoICsgNn1weGA7XG4gICAgdGhpcy5oaWdobGlnaHRCb3guc3R5bGUuaGVpZ2h0ID0gYCR7cmVjdC5oZWlnaHQgKyA2fXB4YDtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJIaWdobGlnaHQoKTogdm9pZCB7XG4gICAgdGhpcy5oaWdobGlnaHRCb3g/LnJlbW92ZSgpO1xuICAgIHRoaXMuaGlnaGxpZ2h0Qm94ID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY2FwdHVyZUVsZW1lbnRDb250ZXh0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogT3ZlcmxheUVsZW1lbnRDb250ZXh0IHtcbiAgICBjb25zdCB0ZXh0ID0gdGhpcy5ub3JtYWxpemVUZXh0KGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQgfHwgJycpO1xuICAgIHJldHVybiB7XG4gICAgICBzZWxlY3RvcjogdGhpcy5idWlsZFNlbGVjdG9yKGVsZW1lbnQpLFxuICAgICAgdGFnOiBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSxcbiAgICAgIHRleHQ6IHRleHQuc2xpY2UoMCwgODAwKSxcbiAgICAgIGh0bWw6IGVsZW1lbnQub3V0ZXJIVE1MLnNsaWNlKDAsIDEyMDApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VsZWN0b3IoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGlmIChlbGVtZW50LmlkKSByZXR1cm4gYCMke2VsZW1lbnQuaWR9YDtcblxuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBlbGVtZW50O1xuICAgIGxldCBkZXB0aCA9IDA7XG5cbiAgICB3aGlsZSAoY3VycmVudCAmJiBkZXB0aCA8IDYpIHtcbiAgICAgIGxldCBwYXJ0ID0gY3VycmVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY3VycmVudC5jbGFzc0xpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBBcnJheS5mcm9tKGN1cnJlbnQuY2xhc3NMaXN0KS5zbGljZSgwLCAyKS5qb2luKCcuJyk7XG4gICAgICAgIGlmIChjbGFzc05hbWUpIHBhcnQgKz0gYC4ke2NsYXNzTmFtZX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgcGFyZW50ID0gY3VycmVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICBjb25zdCBzaWJsaW5ncyA9IEFycmF5LmZyb20ocGFyZW50LmNoaWxkcmVuKS5maWx0ZXIoKG5vZGUpID0+IG5vZGUudGFnTmFtZSA9PT0gY3VycmVudCEudGFnTmFtZSk7XG4gICAgICAgIGlmIChzaWJsaW5ncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBzaWJsaW5ncy5pbmRleE9mKGN1cnJlbnQpICsgMTtcbiAgICAgICAgICBwYXJ0ICs9IGA6bnRoLW9mLXR5cGUoJHtpbmRleH0pYDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcGFydHMudW5zaGlmdChwYXJ0KTtcbiAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gICAgICBkZXB0aCArPSAxO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgPiAnKTtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplVGV4dCh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvXFxzKy9nLCAnICcpLnRyaW0oKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWxlbWVudFN1bW1hcnkoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGN0eCA9IHRoaXMuY2FwdHVyZUVsZW1lbnRDb250ZXh0KGVsZW1lbnQpO1xuICAgIHJldHVybiBgJHtjdHgudGFnfSBcdTIwMjIgJHtjdHguc2VsZWN0b3J9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZE1vZGVscygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5tb2RlbHNMb2FkZWQgfHwgIXRoaXMubW9kZWxFbCkgcmV0dXJuO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdjaGF0Lmxpc3RNb2RlbHMnIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZT8uc3VjY2VzcyB8fCAhQXJyYXkuaXNBcnJheShyZXNwb25zZS5tb2RlbHMpIHx8ICFyZXNwb25zZS5tb2RlbHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLm1vZGVsRWwudmFsdWU7XG4gICAgICB0aGlzLm1vZGVsRWwuaW5uZXJIVE1MID0gJyc7XG4gICAgICBmb3IgKGNvbnN0IG1vZGVsIG9mIHJlc3BvbnNlLm1vZGVscykge1xuICAgICAgICBpZiAoIW1vZGVsPy5pZCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBtb2RlbC5pZDtcbiAgICAgICAgb3B0aW9uLnRleHRDb250ZW50ID0gbW9kZWwubmFtZSB8fCBtb2RlbC5pZDtcbiAgICAgICAgdGhpcy5tb2RlbEVsLmFwcGVuZENoaWxkKG9wdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAocHJldmlvdXMgJiYgQXJyYXkuZnJvbSh0aGlzLm1vZGVsRWwub3B0aW9ucykuc29tZSgob3B0KSA9PiBvcHQudmFsdWUgPT09IHByZXZpb3VzKSkge1xuICAgICAgICB0aGlzLm1vZGVsRWwudmFsdWUgPSBwcmV2aW91cztcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZWxzTG9hZGVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEtlZXAgbG9jYWwgZGVmYXVsdHMgaWYgbW9kZWwgZmV0Y2ggZmFpbHMuXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0lucHV0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbnB1dEVsKSByZXR1cm47XG4gICAgdGhpcy5pbnB1dEVsLmZvY3VzKCk7XG4gIH1cblxuICBwcml2YXRlIGFwcGVuZE1lc3NhZ2Uocm9sZTogJ3VzZXInIHwgJ2Fzc2lzdGFudCcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tZXNzYWdlc0VsKSByZXR1cm47XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmNsYXNzTmFtZSA9IGBoYW56by1wYWdlLW1zZyAke3JvbGV9YDtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICAgIHRoaXMubWVzc2FnZXNFbC5hcHBlbmRDaGlsZChkaXYpO1xuICAgIHRoaXMubWVzc2FnZXNFbC5zY3JvbGxUb3AgPSB0aGlzLm1lc3NhZ2VzRWwuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXModGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnN0YXR1c0VsKSByZXR1cm47XG4gICAgdGhpcy5zdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkUGFnZUNvbnRleHQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLm5vcm1hbGl6ZVRleHQod2luZG93LmdldFNlbGVjdGlvbj8uKCk/LnRvU3RyaW5nKCkgfHwgJycpO1xuICAgIGNvbnN0IGNvbnRleHRMaW5lcyA9IFtcbiAgICAgIGBVUkw6ICR7bG9jYXRpb24uaHJlZn1gLFxuICAgICAgYFRpdGxlOiAke2RvY3VtZW50LnRpdGxlIHx8ICdVbnRpdGxlZCd9YCxcbiAgICBdO1xuXG4gICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgY29udGV4dExpbmVzLnB1c2goYFRleHRTZWxlY3Rpb246ICR7c2VsZWN0aW9uLnNsaWNlKDAsIDYwMCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudENvbnRleHQgPSB0aGlzLnNlbGVjdGVkQ29udGV4dCB8fCAodGhpcy5ob3ZlcmVkRWxlbWVudCA/IHRoaXMuY2FwdHVyZUVsZW1lbnRDb250ZXh0KHRoaXMuaG92ZXJlZEVsZW1lbnQpIDogbnVsbCk7XG4gICAgaWYgKGVsZW1lbnRDb250ZXh0KSB7XG4gICAgICBjb250ZXh0TGluZXMucHVzaChgRWxlbWVudFNlbGVjdG9yOiAke2VsZW1lbnRDb250ZXh0LnNlbGVjdG9yfWApO1xuICAgICAgaWYgKGVsZW1lbnRDb250ZXh0LnRleHQpIGNvbnRleHRMaW5lcy5wdXNoKGBFbGVtZW50VGV4dDogJHtlbGVtZW50Q29udGV4dC50ZXh0LnNsaWNlKDAsIDYwMCl9YCk7XG4gICAgICBjb250ZXh0TGluZXMucHVzaChgRWxlbWVudEhUTUw6ICR7ZWxlbWVudENvbnRleHQuaHRtbC5zbGljZSgwLCA4MDApfWApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZXh0TGluZXMuam9pbignXFxuJyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFza1BhZ2VRdWVzdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zZW5kaW5nIHx8ICF0aGlzLmlucHV0RWwpIHJldHVybjtcblxuICAgIGNvbnN0IHByb21wdCA9IHRoaXMubm9ybWFsaXplVGV4dCh0aGlzLmlucHV0RWwudmFsdWUpO1xuICAgIGlmICghcHJvbXB0KSByZXR1cm47XG5cbiAgICBjb25zdCB0b2tlblJlc3AgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGguZ2V0VG9rZW4nIH0pO1xuICAgIGlmICghdG9rZW5SZXNwPy5zdWNjZXNzIHx8ICF0b2tlblJlc3AudG9rZW4pIHtcbiAgICAgIHRoaXMuYXBwZW5kTWVzc2FnZSgnYXNzaXN0YW50JywgJ1BsZWFzZSBzaWduIGluIGZyb20gdGhlIEhhbnpvIHNpZGViYXIvcG9wdXAgYmVmb3JlIHVzaW5nIHBhZ2UgY2hhdC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlbmRpbmcgPSB0cnVlO1xuICAgIHRoaXMudXBkYXRlU3RhdHVzKCdUaGlua2luZy4uLicpO1xuICAgIHRoaXMuc2VuZEJ0biAmJiAodGhpcy5zZW5kQnRuLmRpc2FibGVkID0gdHJ1ZSk7XG5cbiAgICB0aGlzLmlucHV0RWwudmFsdWUgPSAnJztcbiAgICB0aGlzLmlucHV0RWwuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgIHRoaXMuYXBwZW5kTWVzc2FnZSgndXNlcicsIHByb21wdCk7XG5cbiAgICBjb25zdCBzeXN0ZW1Db250ZXh0ID0gdGhpcy5idWlsZFBhZ2VDb250ZXh0KCk7XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsRWw/LnZhbHVlIHx8ICdncHQtNG8nO1xuICAgIGNvbnN0IHJlcXVlc3RNZXNzYWdlczogT3ZlcmxheUNoYXRNZXNzYWdlW10gPSBbXG4gICAgICB7XG4gICAgICAgIHJvbGU6ICdzeXN0ZW0nLFxuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgJ1lvdSBhcmUgSGFuem8gcGFnZSBvdmVybGF5IGFzc2lzdGFudC4nLFxuICAgICAgICAgICdVc2UgcHJvdmlkZWQgcGFnZSBjb250ZXh0IGFuZCBzZWxlY3RlZCBlbGVtZW50IGNvbnRleHQgd2hlbiByZWxldmFudC4nLFxuICAgICAgICAgICdCZSBjb25jaXNlIGFuZCBwcm92aWRlIGNvbmNyZXRlIFVJIG9yIERPTSBlZGl0IHN1Z2dlc3Rpb25zIHdoZW4gYXNrZWQuJyxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICBzeXN0ZW1Db250ZXh0LFxuICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMubWVzc2FnZXMuc2xpY2UoLTgpLFxuICAgICAgeyByb2xlOiAndXNlcicsIGNvbnRlbnQ6IHByb21wdCB9LFxuICAgIF07XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7XG4gICAgICAgIGFjdGlvbjogJ2NoYXQuY29tcGxldGUnLFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgbWVzc2FnZXM6IHJlcXVlc3RNZXNzYWdlcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlc3BvbnNlPy5zdWNjZXNzIHx8ICFyZXNwb25zZS5jb250ZW50KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZT8uZXJyb3IgfHwgJ05vIHJlc3BvbnNlIGZyb20gY2hhdCBzZXJ2aWNlJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFuc3dlciA9IFN0cmluZyhyZXNwb25zZS5jb250ZW50KS50cmltKCk7XG4gICAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGFuc3dlciB8fCAnTm8gcmVzcG9uc2UgY29udGVudC4nKTtcbiAgICAgIHRoaXMubWVzc2FnZXMucHVzaCh7IHJvbGU6ICd1c2VyJywgY29udGVudDogcHJvbXB0IH0sIHsgcm9sZTogJ2Fzc2lzdGFudCcsIGNvbnRlbnQ6IGFuc3dlciB9KTtcbiAgICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLm1lc3NhZ2VzLnNsaWNlKC0yMCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnUmVhZHknKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICB0aGlzLmFwcGVuZE1lc3NhZ2UoJ2Fzc2lzdGFudCcsIGBFcnJvcjogJHtlcnJvcj8ubWVzc2FnZSB8fCAnQ2hhdCByZXF1ZXN0IGZhaWxlZCd9YCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygnRXJyb3InKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5zZW5kaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnNlbmRCdG4gJiYgKHRoaXMuc2VuZEJ0bi5kaXNhYmxlZCA9IGZhbHNlKTtcbiAgICAgIHRoaXMuZm9jdXNJbnB1dCgpO1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBwYWdlT3ZlcmxheSA9IG5ldyBIYW56b1BhZ2VPdmVybGF5KCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFbGVtZW50IFBpY2tlciBUb29sIFx1MjAxNCBwaWNrIGFueSBlbGVtZW50LCBjb3B5IGl0cyBDU1Mgc2VsZWN0b3Jcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IGVsZW1lbnRQaWNrZXIgPSAoKCkgPT4ge1xuICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gIGxldCBvdmVybGF5OiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFiZWw6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBob3ZlcmVkRWw6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0b3IoZWw6IEhUTUxFbGVtZW50KTogc3RyaW5nIHtcbiAgICBpZiAoZWwuaWQpIHJldHVybiBgIyR7ZWwuaWR9YDtcbiAgICBjb25zdCB0YWcgPSBlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY2xhc3NlcyA9IEFycmF5LmZyb20oZWwuY2xhc3NMaXN0KS5maWx0ZXIoYyA9PiAhYy5zdGFydHNXaXRoKCdoYW56by0nKSkuc2xpY2UoMCwgMyk7XG4gICAgbGV0IHNlbGVjdG9yID0gdGFnO1xuICAgIGlmIChjbGFzc2VzLmxlbmd0aCkgc2VsZWN0b3IgKz0gYC4ke2NsYXNzZXMuam9pbignLicpfWA7XG4gICAgLy8gRW5zdXJlIHVuaXF1ZW5lc3NcbiAgICBjb25zdCBtYXRjaGVzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZWwucGFyZW50RWxlbWVudDtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gQXJyYXkuZnJvbShwYXJlbnQuY2hpbGRyZW4pLmluZGV4T2YoZWwpICsgMTtcbiAgICAgICAgc2VsZWN0b3IgKz0gYDpudGgtY2hpbGQoJHtpZHh9KWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3RvcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZ1bGxQYXRoKGVsOiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cjogSFRNTEVsZW1lbnQgfCBudWxsID0gZWw7XG4gICAgd2hpbGUgKGN1ciAmJiBjdXIgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgcGFydHMudW5zaGlmdChnZXRTZWxlY3RvcihjdXIpKTtcbiAgICAgIGN1ciA9IGN1ci5wYXJlbnRFbGVtZW50O1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignID4gJyk7XG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVPdmVybGF5KCkge1xuICAgIGlmIChvdmVybGF5KSByZXR1cm47XG4gICAgb3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIG92ZXJsYXkuaWQgPSAnaGFuem8tcGlja2VyLW92ZXJsYXknO1xuICAgIG92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtwb2ludGVyLWV2ZW50czpub25lO3otaW5kZXg6MjE0NzQ4MzY0Njtib3JkZXI6MnB4IHNvbGlkICNmZmY7Ym9yZGVyLXJhZGl1czozcHg7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LDAuMDYpO3RyYW5zaXRpb246YWxsIDAuMXMgZWFzZTtkaXNwbGF5Om5vbmU7JztcbiAgICBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGxhYmVsLmlkID0gJ2hhbnpvLXBpY2tlci1sYWJlbCc7XG4gICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjIxNDc0ODM2NDc7cG9pbnRlci1ldmVudHM6bm9uZTtiYWNrZ3JvdW5kOiMwMDA7Y29sb3I6I2ZmZjtmb250OjExcHgvMS40IEdlaXN0IE1vbm8sTWVubG8sbW9ub3NwYWNlO3BhZGRpbmc6M3B4IDhweDtib3JkZXItcmFkaXVzOjRweDttYXgtd2lkdGg6NDAwcHg7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO2Rpc3BsYXk6bm9uZTtib3gtc2hhZG93OjAgMnB4IDhweCByZ2JhKDAsMCwwLDAuNCk7JztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG92ZXJsYXkpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGFiZWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Nb3ZlKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGlmICghdGFyZ2V0IHx8IHRhcmdldCA9PT0gb3ZlcmxheSB8fCB0YXJnZXQgPT09IGxhYmVsKSByZXR1cm47XG4gICAgaWYgKHRhcmdldC5pZD8uc3RhcnRzV2l0aCgnaGFuem8tcGlja2VyJykpIHJldHVybjtcbiAgICBob3ZlcmVkRWwgPSB0YXJnZXQ7XG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBpZiAob3ZlcmxheSkge1xuICAgICAgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIG92ZXJsYXkuc3R5bGUudG9wID0gcmVjdC50b3AgKyAncHgnO1xuICAgICAgb3ZlcmxheS5zdHlsZS5sZWZ0ID0gcmVjdC5sZWZ0ICsgJ3B4JztcbiAgICAgIG92ZXJsYXkuc3R5bGUud2lkdGggPSByZWN0LndpZHRoICsgJ3B4JztcbiAgICAgIG92ZXJsYXkuc3R5bGUuaGVpZ2h0ID0gcmVjdC5oZWlnaHQgKyAncHgnO1xuICAgIH1cbiAgICBpZiAobGFiZWwpIHtcbiAgICAgIGxhYmVsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSBnZXRTZWxlY3Rvcih0YXJnZXQpO1xuICAgICAgY29uc3QgbGFiZWxUb3AgPSByZWN0LnRvcCAtIDI4O1xuICAgICAgbGFiZWwuc3R5bGUudG9wID0gKGxhYmVsVG9wID4gMCA/IGxhYmVsVG9wIDogcmVjdC5ib3R0b20gKyA0KSArICdweCc7XG4gICAgICBsYWJlbC5zdHlsZS5sZWZ0ID0gcmVjdC5sZWZ0ICsgJ3B4JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbkNsaWNrKGU6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgY29uc3QgZWwgPSBob3ZlcmVkRWwgfHwgZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBnZXRGdWxsUGF0aChlbCk7XG4gICAgY29uc3QgdGFnID0gZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHRleHQgPSAoZWwudGV4dENvbnRlbnQgfHwgJycpLnRyaW0oKS5zbGljZSgwLCA4MCk7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3QgaW5mbyA9IFtcbiAgICAgIGBTZWxlY3RvcjogJHtzZWxlY3Rvcn1gLFxuICAgICAgYFBhdGg6ICR7ZnVsbFBhdGh9YCxcbiAgICAgIGBUYWc6ICR7dGFnfWAsXG4gICAgICBgU2l6ZTogJHtNYXRoLnJvdW5kKHJlY3Qud2lkdGgpfXgke01hdGgucm91bmQocmVjdC5oZWlnaHQpfWAsXG4gICAgICBlbC5pZCA/IGBJRDogJHtlbC5pZH1gIDogJycsXG4gICAgICBlbC5jbGFzc05hbWUgPyBgQ2xhc3NlczogJHtlbC5jbGFzc05hbWV9YCA6ICcnLFxuICAgICAgdGV4dCA/IGBUZXh0OiBcIiR7dGV4dH1cImAgOiAnJyxcbiAgICBdLmZpbHRlcihCb29sZWFuKS5qb2luKCdcXG4nKTtcblxuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KGluZm8pLmNhdGNoKCgpID0+IHt9KTtcbiAgICAvLyBBbHNvIHNlbmQgdG8gYmFja2dyb3VuZCBmb3IgTUNQIHRvb2xzXG4gICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdlbGVtZW50U2VsZWN0ZWQnLCBkYXRhOiB7IHNlbGVjdG9yLCBmdWxsUGF0aCwgdGFnLCB0ZXh0LCByZWN0OiB7IHg6IHJlY3QueCwgeTogcmVjdC55LCB3OiByZWN0LndpZHRoLCBoOiByZWN0LmhlaWdodCB9IH0gfSk7XG4gICAgc3RvcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gb25LZXkoZTogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN0b3AoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICBpZiAoYWN0aXZlKSByZXR1cm47XG4gICAgYWN0aXZlID0gdHJ1ZTtcbiAgICBlbnN1cmVPdmVybGF5KCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlLCB0cnVlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgYWN0aXZlID0gZmFsc2U7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3ZlLCB0cnVlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2ssIHRydWUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleSwgdHJ1ZSk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnJztcbiAgICBpZiAob3ZlcmxheSkgb3ZlcmxheS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChsYWJlbCkgbGFiZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBob3ZlcmVkRWwgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQsIHN0b3AgfTtcbn0pKCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBQYWdlIEluZm8gR2F0aGVyZXJcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGdhdGhlclBhZ2VJbmZvKCk6IHN0cmluZyB7XG4gIGNvbnN0IG1ldGEgPSAobmFtZTogc3RyaW5nKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBtZXRhW25hbWU9XCIke25hbWV9XCJdLCBtZXRhW3Byb3BlcnR5PVwiJHtuYW1lfVwiXWApPy5nZXRBdHRyaWJ1dGUoJ2NvbnRlbnQnKSB8fCAnJztcbiAgY29uc3QgbGluZXMgPSBbXG4gICAgYFRpdGxlOiAke2RvY3VtZW50LnRpdGxlfWAsXG4gICAgYFVSTDogJHtsb2NhdGlvbi5ocmVmfWAsXG4gICAgYERlc2NyaXB0aW9uOiAke21ldGEoJ2Rlc2NyaXB0aW9uJykgfHwgbWV0YSgnb2c6ZGVzY3JpcHRpb24nKX1gLFxuICAgIGBDaGFyc2V0OiAke2RvY3VtZW50LmNoYXJhY3RlclNldH1gLFxuICAgIGBMYW5ndWFnZTogJHtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubGFuZyB8fCAndW5rbm93bid9YCxcbiAgICBgVmlld3BvcnQ6ICR7bWV0YSgndmlld3BvcnQnKX1gLFxuICBdO1xuXG4gIC8vIEZyYW1ld29yayBkZXRlY3Rpb25cbiAgY29uc3QgZnJhbWV3b3Jrczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pIGZyYW1ld29ya3MucHVzaCgnUmVhY3QnKTtcbiAgaWYgKCh3aW5kb3cgYXMgYW55KS5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fKSBmcmFtZXdvcmtzLnB1c2goJ1Z1ZScpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fc3ZlbHRlKSBmcmFtZXdvcmtzLnB1c2goJ1N2ZWx0ZScpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fTkVYVF9EQVRBX18pIGZyYW1ld29ya3MucHVzaCgnTmV4dC5qcycpO1xuICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fTlVYVF9fKSBmcmFtZXdvcmtzLnB1c2goJ051eHQnKTtcbiAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tuZy12ZXJzaW9uXScpKSBmcmFtZXdvcmtzLnB1c2goJ0FuZ3VsYXInKTtcbiAgaWYgKGZyYW1ld29ya3MubGVuZ3RoKSBsaW5lcy5wdXNoKGBGcmFtZXdvcmtzOiAke2ZyYW1ld29ya3Muam9pbignLCAnKX1gKTtcblxuICAvLyBQYWdlIG1ldHJpY3NcbiAgY29uc3Qgc2NyaXB0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdFtzcmNdJykubGVuZ3RoO1xuICBjb25zdCBzdHlsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdsaW5rW3JlbD1cInN0eWxlc2hlZXRcIl0nKS5sZW5ndGg7XG4gIGNvbnN0IGltYWdlcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2ltZycpLmxlbmd0aDtcbiAgY29uc3QgbGlua3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykubGVuZ3RoO1xuICBsaW5lcy5wdXNoKGBSZXNvdXJjZXM6ICR7c2NyaXB0c30gc2NyaXB0cywgJHtzdHlsZXN9IHN0eWxlc2hlZXRzLCAke2ltYWdlc30gaW1hZ2VzLCAke2xpbmtzfSBsaW5rc2ApO1xuXG4gIC8vIFBlcmZvcm1hbmNlIHRpbWluZ1xuICBjb25zdCBwZXJmID0gcGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgnbmF2aWdhdGlvbicpWzBdIGFzIFBlcmZvcm1hbmNlTmF2aWdhdGlvblRpbWluZztcbiAgaWYgKHBlcmYpIHtcbiAgICBsaW5lcy5wdXNoKGBMb2FkOiAke01hdGgucm91bmQocGVyZi5sb2FkRXZlbnRFbmQgLSBwZXJmLnN0YXJ0VGltZSl9bXMgKERPTTogJHtNYXRoLnJvdW5kKHBlcmYuZG9tQ29udGVudExvYWRlZEV2ZW50RW5kIC0gcGVyZi5zdGFydFRpbWUpfW1zKWApO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVzLmZpbHRlcihsID0+ICFsLmVuZHNXaXRoKCc6ICcpKS5qb2luKCdcXG4nKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIElubGluZSBDb25zb2xlIFRvb2wgXHUyMDE0IHF1aWNrIEpTIGV2YWwgb24gdGhlIHBhZ2Vcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmNvbnN0IGlubGluZUNvbnNvbGUgPSAoKCkgPT4ge1xuICBsZXQgcm9vdDogSFRNTERpdkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGlucHV0OiBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCBvdXRwdXQ6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIGxldCB2aXNpYmxlID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gZW5zdXJlTW91bnQoKSB7XG4gICAgaWYgKHJvb3QpIHJldHVybjtcbiAgICByb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgcm9vdC5pZCA9ICdoYW56by1jb25zb2xlLXJvb3QnO1xuICAgIHJvb3Quc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjpmaXhlZDtib3R0b206MjBweDtsZWZ0OjIwcHg7cmlnaHQ6MjBweDt6LWluZGV4OjIxNDc0ODM2NDY7Zm9udC1mYW1pbHk6R2Vpc3QgTW9ubyxNZW5sbyxDb25zb2xhcyxtb25vc3BhY2U7Zm9udC1zaXplOjEycHg7ZGlzcGxheTpub25lOyc7XG4gICAgcm9vdC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuOTIpO2JhY2tkcm9wLWZpbHRlcjpibHVyKDEycHgpO2JvcmRlcjoxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjE1KTtib3JkZXItcmFkaXVzOjEwcHg7b3ZlcmZsb3c6aGlkZGVuO2JveC1zaGFkb3c6MCA4cHggMzJweCByZ2JhKDAsMCwwLDAuNSk7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJoYW56by1jb25zb2xlLW91dHB1dFwiIHN0eWxlPVwibWF4LWhlaWdodDoyMDBweDtvdmVyZmxvdy15OmF1dG87cGFkZGluZzo4cHggMTJweDtjb2xvcjojY2NjO3doaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO1wiPjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7cGFkZGluZzowIDEycHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjojNjY2O21hcmdpbi1yaWdodDo2cHg7XCI+Jmd0Ozwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJoYW56by1jb25zb2xlLWlucHV0XCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cImV2YWwoLi4uKVwiIHN0eWxlPVwiZmxleDoxO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Y29sb3I6I2ZmZjtmb250OmluaGVyaXQ7cGFkZGluZzoxMHB4IDA7b3V0bGluZTpub25lO1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzQ0NDtmb250LXNpemU6MTBweDttYXJnaW4tbGVmdDo4cHg7XCI+RXNjIHRvIGNsb3NlPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChyb290KTtcbiAgICBpbnB1dCA9IHJvb3QucXVlcnlTZWxlY3RvcignI2hhbnpvLWNvbnNvbGUtaW5wdXQnKTtcbiAgICBvdXRwdXQgPSByb290LnF1ZXJ5U2VsZWN0b3IoJyNoYW56by1jb25zb2xlLW91dHB1dCcpO1xuXG4gICAgaW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBoaWRlKCk7IHJldHVybjsgfVxuICAgICAgaWYgKGUua2V5ICE9PSAnRW50ZXInIHx8ICFpbnB1dD8udmFsdWUudHJpbSgpKSByZXR1cm47XG4gICAgICBjb25zdCBleHByID0gaW5wdXQudmFsdWUudHJpbSgpO1xuICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgIGFwcGVuZExpbmUoYD4gJHtleHByfWAsICcjODg4Jyk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSAoMCwgZXZhbCkoZXhwcik7XG4gICAgICAgIGFwcGVuZExpbmUoU3RyaW5nKHJlc3VsdCksICcjNENBRjUwJyk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBhcHBlbmRMaW5lKGVycj8ubWVzc2FnZSB8fCBTdHJpbmcoZXJyKSwgJyNGNDQzMzYnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZExpbmUodGV4dDogc3RyaW5nLCBjb2xvcjogc3RyaW5nKSB7XG4gICAgaWYgKCFvdXRwdXQpIHJldHVybjtcbiAgICBjb25zdCBsaW5lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbGluZS5zdHlsZS5jb2xvciA9IGNvbG9yO1xuICAgIGxpbmUudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIG91dHB1dC5hcHBlbmRDaGlsZChsaW5lKTtcbiAgICBvdXRwdXQuc2Nyb2xsVG9wID0gb3V0cHV0LnNjcm9sbEhlaWdodDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3coKSB7XG4gICAgZW5zdXJlTW91bnQoKTtcbiAgICBpZiAocm9vdCkgcm9vdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB2aXNpYmxlID0gdHJ1ZTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IGlucHV0Py5mb2N1cygpLCA1MCk7XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlKCkge1xuICAgIGlmIChyb290KSByb290LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgdmlzaWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHsgc2hvdywgaGlkZSwgaXNWaXNpYmxlOiAoKSA9PiB2aXNpYmxlIH07XG59KSgpO1xuXG4vLyBJbml0aWFsaXplXG5uZXcgSGFuem9Db250ZW50U2NyaXB0KCk7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCYWNrZ3JvdW5kIGtlZXAtYWxpdmUgcG9ydC5cbi8vXG4vLyBGaXJlZm94IE1WMyB0cmVhdHMgYGJhY2tncm91bmQuc2NyaXB0c2AgYXMgZXZlbnQgcGFnZXM7IENocm9tZSBNVjMgc2VydmljZVxuLy8gd29ya2VycyBpZGxlIG91dCBhZnRlciB+MzBzLiBBbiBvcGVuIGBjaHJvbWUucnVudGltZWAgcG9ydCBmcm9tIGFueVxuLy8gY29udGVudCBzY3JpcHQga2VlcHMgdGhlIGJhY2tncm91bmQgcGFnZSBhbGl2ZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZVxuLy8gcG9ydCBcdTIwMTQgbm8gcG9sbGluZywgbm8gYWxhcm1zIHJlcXVpcmVkLiBFdmVyeSBsb2FkZWQgaHR0cChzKSB0YWIgaG9sZHNcbi8vIG9uZSBvZiB0aGVzZSwgc28gdGhlIGJhY2tncm91bmQgWkFQIHNvY2tldCBzdXJ2aXZlcyBpbmRlZmluaXRlbHkgYXNcbi8vIGxvbmcgYXMgdGhlIHVzZXIgaGFzIGFueSBub24tcHJpdmlsZWdlZCB0YWIgb3Blbi5cbi8vXG4vLyBIZWFydGJlYXRzIGV2ZXJ5IDEwcyBwcmV2ZW50IEZpcmVmb3gncyA0LW1pbnV0ZSBpZGxlLXBvcnQgZGlzY29ubmVjdC5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG50cnkge1xuICBjb25zdCBwb3J0ID0gKGJyb3dzZXIgYXMgYW55KT8ucnVudGltZT8uY29ubmVjdD8uKHsgbmFtZTogJ3phcC1rZWVwYWxpdmUnIH0pXG4gICAgfHwgKGNocm9tZSBhcyBhbnkpPy5ydW50aW1lPy5jb25uZWN0Py4oeyBuYW1lOiAnemFwLWtlZXBhbGl2ZScgfSk7XG4gIGlmIChwb3J0KSB7XG4gICAgY29uc3QgdGljayA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRyeSB7IHBvcnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAncGluZycsIHQ6IERhdGUubm93KCkgfSk7IH1cbiAgICAgIGNhdGNoIHsgY2xlYXJJbnRlcnZhbCh0aWNrKTsgfVxuICAgIH0sIDEwXzAwMCk7XG4gICAgcG9ydC5vbkRpc2Nvbm5lY3Q/LmFkZExpc3RlbmVyPy4oKCkgPT4gY2xlYXJJbnRlcnZhbCh0aWNrKSk7XG4gIH1cbn0gY2F0Y2ggeyAvKiBub3QgYWxsIHBhZ2VzIGxldCBjb250ZW50IHNjcmlwdHMgb3BlbiBwb3J0cyBcdTIwMTQgYmVzdCBlZmZvcnQgKi8gfVxuIiwgIi8qKlxuICogS2V5Ym9hcmQtc2hvcnRjdXQgY29uZmlndXJhdGlvbiBzaGFyZWQgYmV0d2VlbiBjb250ZW50IHNjcmlwdHMsIHRoZVxuICogcG9wdXAgcmVjb3JkZXIsIGFuZCB0aGUgYmFja2dyb3VuZC4gQSBcInNob3J0Y3V0XCIgaXMgYSBub3JtYWxpc2VkXG4gKiBkZXNjcmlwdGlvbiBvZiBhIGtleWJvYXJkIGNob3JkIChtb2RpZmllcnMgKyBrZXkpIHRoYXQgdGVsbHMgdGhlXG4gKiBjb250ZW50IHNjcmlwdCB3aGljaCBjb21iaW5hdGlvbiB0b2dnbGVzIGluc3BlY3QgLyBjbGljay10by1zb3VyY2VcbiAqIG5hdmlnYXRpb24uIFRoZSBkZWZhdWx0IGlzICoqQ3RybCoqIGFsb25lIChNYWMgdXNlcnMgd291bGQgb3RoZXJ3aXNlXG4gKiBuZWVkIHRvIGhvbGQgT3B0aW9uLCB3aGljaCBpbnRlcmZlcmVzIHdpdGggbmF0aXZlIG1hY09TIGNoYXJhY3RlclxuICogaW5wdXQpLiBBbnkgY29tYmluYXRpb24gaXMgY29uZmlndXJhYmxlIHRocm91Z2ggdGhlIHBvcHVwLlxuICpcbiAqIFN0b3JhZ2Ugc2hhcGU6IGBjaHJvbWUuc3RvcmFnZS5sb2NhbFtcImhhbnpvX3Nob3J0Y3V0X2luc3BlY3RcIl0gPSBTaG9ydGN1dGAuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBTaG9ydGN1dCB7XG4gIC8qKiBXaGV0aGVyIEN0cmwgKG9yIENtZCBvbiBtYWNPUykgaXMgcGFydCBvZiB0aGUgY2hvcmQuICovXG4gIGN0cmw6IGJvb2xlYW47XG4gIC8qKiBDbWQvTWV0YSBrZXkgKG1hY09TKSBcdTIwMTQgYm91bmQgc2VwYXJhdGVseSBmcm9tIEN0cmwuICovXG4gIG1ldGE6IGJvb2xlYW47XG4gIGFsdDogYm9vbGVhbjtcbiAgc2hpZnQ6IGJvb2xlYW47XG4gIC8qKiBPcHRpb25hbCBsZXR0ZXIgb3IgYEtleSpgIHZhbHVlLiBFbXB0eSBzdHJpbmcgbWVhbnMgbW9kaWZpZXItb25seS4gKi9cbiAga2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjb25zdCBTVE9SQUdFX0tFWV9JTlNQRUNUID0gJ2hhbnpvX3Nob3J0Y3V0X2luc3BlY3QnO1xuXG4vKipcbiAqIERlZmF1bHQgaW5zcGVjdC1tb2RpZmllcjogKipDdHJsKiogKG9yIENtZCBvbiBtYWNPUykgYWxvbmUuXG4gKlxuICogV2h5IG5vdCBBbHQvT3B0aW9uPyBPbiBtYWNPUywgT3B0aW9uIGlzIHRoZSBzeXN0ZW0tbGV2ZWwgY2hhcmFjdGVyLVxuICogY29tcG9zZSBtb2RpZmllciAoT3B0aW9uLWMgXHUyMTkyIFx1MDBFNywgT3B0aW9uLTMgXHUyMTkyIFx1MDBBMykuIFVzaW5nIE9wdGlvbiBmb3Igb3VyXG4gKiBpbnNwZWN0b3Igc2lsZW50bHkgc3dhbGxvd3MgcmVhbCB1c2VyIGtleXN0cm9rZXMgYW5kIGNvcnJ1cHRzIHRleHRcbiAqIGlucHV0IG9uIGV2ZXJ5IHBhZ2UgdGhhdCBoYXMgdXMgaW5qZWN0ZWQuIEN0cmwgaXMgdGhlIG5hdHVyYWwgY2hvaWNlXG4gKiBmb3IgYSBkZXZlbG9wZXItdG9vbHMgbW9kaWZpZXIgKGFuZCBtYXRjaGVzIERldlRvb2xzJyBJbnNwZWN0IEVsZW1lbnRcbiAqIGJlaGF2aW91ciBvbiBldmVyeSBicm93c2VyKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfSU5TUEVDVF9TSE9SVENVVDogU2hvcnRjdXQgPSB7XG4gIGN0cmw6IHRydWUsXG4gIG1ldGE6IGZhbHNlLFxuICBhbHQ6IGZhbHNlLFxuICBzaGlmdDogZmFsc2UsXG4gIGtleTogJycsXG59O1xuXG4vKipcbiAqIE1hdGNoIGEga2V5Ym9hcmQgLyBtb3VzZSBldmVudCBhZ2FpbnN0IGEgU2hvcnRjdXQuIFJldHVybnMgdHJ1ZSBpZmZcbiAqIGV2ZXJ5IHJlcXVpcmVkIG1vZGlmaWVyIGlzIGhlbGQgQU5EIGV2ZXJ5IG5vbi1yZXF1aXJlZCBtb2RpZmllciBpc1xuICogTk9UIGhlbGQgQU5EIHRoZSBrZXkgbWF0Y2hlcyAob3IgYGtleSA9PT0gJydgIGZvciBtb2RpZmllci1vbmx5KS5cbiAqXG4gKiBPbiBtYWNPUywgY3RybCBtYXRjaGVzIGBldmVudC5tZXRhS2V5YCBpZiB0aGUgc2F2ZWQgc2hvcnRjdXQgaGFzXG4gKiBtZXRhPXRydWUgT1IgY3RybD10cnVlICh3ZSB0cmVhdCBDdHJsLW9uLU1hYyBhbmQgQ21kIGFzIGVxdWl2YWxlbnRcbiAqIGZvciB0aGUgZGVmYXVsdCBcdTIwMTQgbWFueSBkZXZzIGFzc3VtZSBcIkN0cmxcIiByZWFsbHkgbWVhbnMgXCJ0aGUgcGxhdGZvcm1cbiAqIHByaW1hcnkgbW9kaWZpZXJcIikuIFRvIGFkZHJlc3MgZXhwbGljaXRseSwgc2V0IGN0cmw9ZmFsc2UgbWV0YT10cnVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1Nob3J0Y3V0KFxuICBlOiB7IGN0cmxLZXk/OiBib29sZWFuOyBtZXRhS2V5PzogYm9vbGVhbjsgYWx0S2V5PzogYm9vbGVhbjsgc2hpZnRLZXk/OiBib29sZWFuOyBrZXk/OiBzdHJpbmcgfSxcbiAgczogU2hvcnRjdXQsXG4pOiBib29sZWFuIHtcbiAgLy8gUmVxdWlyZWQgbW9kaWZpZXJzIFx1MjAxNCBldmVyeSB0cnV0aHkgZmllbGQgb2YgYHNgIG11c3QgYmUgc2V0IG9uIHRoZSBldmVudC5cbiAgaWYgKHMuY3RybCAmJiAhZS5jdHJsS2V5KSByZXR1cm4gZmFsc2U7XG4gIGlmIChzLm1ldGEgJiYgIWUubWV0YUtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAocy5hbHQgJiYgIWUuYWx0S2V5KSByZXR1cm4gZmFsc2U7XG4gIGlmIChzLnNoaWZ0ICYmICFlLnNoaWZ0S2V5KSByZXR1cm4gZmFsc2U7XG4gIC8vIEZvcmJpZGRlbiBtb2RpZmllcnMgXHUyMDE0IGV2ZXJ5IGZhbHNlIGZpZWxkIG9mIGBzYCBtdXN0IE5PVCBiZSBzZXQgb25cbiAgLy8gdGhlIGV2ZW50LiBPdGhlcndpc2UgQ3RybC1vbmx5IHdvdWxkIG1hdGNoIEN0cmwtU2hpZnQtWCB0b28sIHdoaWNoXG4gIC8vIHdvdWxkIHN1cnByaXNlIHVzZXJzIHdobyBjb25maWd1cmVkIEN0cmwgYWxvbmUuXG4gIGlmICghcy5jdHJsICYmIGUuY3RybEtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXMubWV0YSAmJiBlLm1ldGFLZXkpIHJldHVybiBmYWxzZTtcbiAgaWYgKCFzLmFsdCAmJiBlLmFsdEtleSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXMuc2hpZnQgJiYgZS5zaGlmdEtleSkgcmV0dXJuIGZhbHNlO1xuICAvLyBLZXkgbWF0Y2ggKGNhc2UtaW5zZW5zaXRpdmUpLiBFbXB0eSBrZXkgbWVhbnMgdGhlIGNob3JkIGlzXG4gIC8vIG1vZGlmaWVyLW9ubHkgXHUyMDE0IGFueSBzdWJzZXF1ZW50IGtleSBzdGlsbCBzYXRpc2ZpZXMgaXQuXG4gIGlmIChzLmtleSAmJiAoZS5rZXkgfHwgJycpLnRvTG93ZXJDYXNlKCkgIT09IHMua2V5LnRvTG93ZXJDYXNlKCkpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogUmVuZGVyIGEgU2hvcnRjdXQgYXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgbGlrZSBcIkN0cmwrU2hpZnQrS1wiIG9yXG4gKiBcIlx1MjMxOCtDbGlja1wiLiBVc2VkIGJ5IHRoZSBwb3B1cCBVSSBhbmQgYW55IHBsYWNlIHdlIHN1cmZhY2UgdGhlIGNob3JkXG4gKiB0byB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFNob3J0Y3V0KHM6IFNob3J0Y3V0LCBvcHRzPzogeyBtYWM/OiBib29sZWFuOyBjbGljaz86IGJvb2xlYW4gfSk6IHN0cmluZyB7XG4gIGNvbnN0IG1hYyA9IG9wdHM/Lm1hYyA/PyAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgL01hYy9pLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtIHx8ICcnKSk7XG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAocy5jdHJsKSBwYXJ0cy5wdXNoKG1hYyA/ICdcdTIzMDMnIDogJ0N0cmwnKTtcbiAgaWYgKHMubWV0YSkgcGFydHMucHVzaChtYWMgPyAnXHUyMzE4JyA6ICdNZXRhJyk7XG4gIGlmIChzLmFsdCkgcGFydHMucHVzaChtYWMgPyAnXHUyMzI1JyA6ICdBbHQnKTtcbiAgaWYgKHMuc2hpZnQpIHBhcnRzLnB1c2gobWFjID8gJ1x1MjFFNycgOiAnU2hpZnQnKTtcbiAgaWYgKHMua2V5KSBwYXJ0cy5wdXNoKHMua2V5Lmxlbmd0aCA9PT0gMSA/IHMua2V5LnRvVXBwZXJDYXNlKCkgOiBzLmtleSk7XG4gIGlmIChvcHRzPy5jbGljaykgcGFydHMucHVzaCgnQ2xpY2snKTtcbiAgcmV0dXJuIHBhcnRzLmpvaW4oJysnKSB8fCAnKHVuc2V0KSc7XG59XG5cbi8qKlxuICogTm9ybWFsaXNlIGEgZnJlc2gga2V5ZG93biBpbnRvIGEgU2hvcnRjdXQgcGF5bG9hZC4gRHJvcHMgVGFiL0VzYy9ldGMuXG4gKiAodGhlIHJlY29yZGVyIFVJIGludml0ZXMgdGhlIHVzZXIgdG8gcHJlc3MgYSBjaG9yZCwgbm90IHRvIG5hdmlnYXRlXG4gKiB0aGUgcGFnZSkgYW5kIHJlamVjdHMgcHVyZSBtb2RpZmllciBrZXlkb3ducyBzbyB0aGUgcmVjb3JkZXIgZG9lc24ndFxuICogZmlyZSBvbiBldmVyeSBTaGlmdCBwcmVzcyB3aGlsZSB0aGUgdXNlciBpcyByZWFjaGluZyBmb3IgYSBsZXR0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaG9ydGN1dEZyb21FdmVudChcbiAgZTogeyBjdHJsS2V5PzogYm9vbGVhbjsgbWV0YUtleT86IGJvb2xlYW47IGFsdEtleT86IGJvb2xlYW47IHNoaWZ0S2V5PzogYm9vbGVhbjsga2V5Pzogc3RyaW5nIH0sXG4pOiBTaG9ydGN1dCB8IG51bGwge1xuICBjb25zdCBrID0gZS5rZXkgfHwgJyc7XG4gIC8vIE1vZGlmaWVyLW9ubHkgaXMgYSB2YWxpZCBzaG9ydGN1dCwgYnV0IHRoZSBrZXlkb3duIGV2ZW50IGZvciBhIHB1cmVcbiAgLy8gbW9kaWZpZXIgKENvbnRyb2wgLyBTaGlmdCAvIEFsdCAvIE1ldGEpIHJlcG9ydHMgYGtleWAgYXMgdGhlXG4gIC8vIG1vZGlmaWVyIG5hbWUgXHUyMDE0IHJlY29yZCB0aG9zZSBhcyBtb2RpZmllci1vbmx5LlxuICBpZiAoWydDb250cm9sJywgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0J10uaW5jbHVkZXMoaykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY3RybDogISFlLmN0cmxLZXksXG4gICAgICBtZXRhOiAhIWUubWV0YUtleSxcbiAgICAgIGFsdDogISFlLmFsdEtleSxcbiAgICAgIHNoaWZ0OiAhIWUuc2hpZnRLZXksXG4gICAgICBrZXk6ICcnLFxuICAgIH07XG4gIH1cbiAgLy8gU3lzdGVtIGtleXMgd2UgbmV2ZXIgd2FudCB0byBiaW5kLlxuICBpZiAoWydUYWInLCAnRXNjYXBlJywgJ0VudGVyJywgJyddLmluY2x1ZGVzKGspKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHtcbiAgICBjdHJsOiAhIWUuY3RybEtleSxcbiAgICBtZXRhOiAhIWUubWV0YUtleSxcbiAgICBhbHQ6ICEhZS5hbHRLZXksXG4gICAgc2hpZnQ6ICEhZS5zaGlmdEtleSxcbiAgICBrZXk6IGssXG4gIH07XG59XG5cbi8qKlxuICogUmVhZCB0aGUgaW5zcGVjdCBzaG9ydGN1dCBmcm9tIGV4dGVuc2lvbiBzdG9yYWdlOyBmYWxsIGJhY2sgdG8gdGhlXG4gKiBkZWZhdWx0IGlmIGFic2VudCBvciBtYWxmb3JtZWQuIEFsd2F5cyByZXR1cm5zIGEgdmFsaWQgU2hvcnRjdXQgc29cbiAqIGNhbGxlcnMgZG9uJ3QgaGF2ZSB0byBkZWZlbnNpdmVseSByZS1kZWZhdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZEluc3BlY3RTaG9ydGN1dChcbiAgc3RvcmFnZTogeyBnZXQoa2V5czogc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IH0sXG4pOiBQcm9taXNlPFNob3J0Y3V0PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgc3RvcmFnZS5nZXQoW1NUT1JBR0VfS0VZX0lOU1BFQ1RdKTtcbiAgICBjb25zdCB2ID0gcmF3W1NUT1JBR0VfS0VZX0lOU1BFQ1RdO1xuICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSAnb2JqZWN0J1xuICAgICAgICAmJiB0eXBlb2Ygdi5jdHJsID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYuYWx0ID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYuc2hpZnQgPT09ICdib29sZWFuJ1xuICAgICAgICAmJiB0eXBlb2Ygdi5tZXRhID09PSAnYm9vbGVhbidcbiAgICAgICAgJiYgdHlwZW9mIHYua2V5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHYgYXMgU2hvcnRjdXQ7XG4gICAgfVxuICB9IGNhdGNoIHsgLyogZmFsbCB0aHJvdWdoICovIH1cbiAgcmV0dXJuIHsgLi4uREVGQVVMVF9JTlNQRUNUX1NIT1JUQ1VUIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlSW5zcGVjdFNob3J0Y3V0KFxuICBzdG9yYWdlOiB7IHNldChpdGVtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IH0sXG4gIHM6IFNob3J0Y3V0LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IHN0b3JhZ2Uuc2V0KHsgW1NUT1JBR0VfS0VZX0lOU1BFQ1RdOiBzIH0pO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQTtBQUVBLFlBQUksRUFBRUEsV0FBV0MsVUFBVUQsV0FBV0MsT0FBT0MsV0FBV0YsV0FBV0MsT0FBT0MsUUFBUUMsS0FBSztBQUNyRixnQkFBTSxJQUFJQyxNQUFNLDJEQUEyRDtRQUM3RTtBQUVBLFlBQUksRUFBRUosV0FBV0ssV0FBV0wsV0FBV0ssUUFBUUgsV0FBV0YsV0FBV0ssUUFBUUgsUUFBUUMsS0FBSztBQUN4RixnQkFBTUcsbURBQW1EO0FBT3pELGdCQUFNQyxXQUFXQyxtQkFBaUI7QUFJaEMsa0JBQU1DLGNBQWM7Y0FDbEIsVUFBVTtn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RXhDLFlBQU0sUUFBUSxTQUFTLGNBQWMsT0FBTztBQUM1QyxZQUFNLEtBQUs7QUFDWCxZQUFNLGNBQWM7QUFBQTtBQUFBLFNBRWYsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBYVYsVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFxUnBCLGVBQVMsS0FBSyxZQUFZLEtBQUs7QUFBQSxJQUNqQztBQUFBLElBRVEsUUFBYztBQTV1Q3hCLFVBQUFBLEtBQUFDLEtBQUFFLEtBQUFDLEtBQUFDLEtBQUFDO0FBNnVDSSxVQUFJLEtBQUssUUFBUztBQUVsQixXQUFLLE9B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TUFBTSxNQUFNLFdBQVcsTUFBTSxRQUFRO0FBQUEsRUFDaEQsR0FBRztBQUdILE1BQUksbUJBQW1CO0FBcjVEdkI7QUFtNkRBLE1BQUk7QUFDRixVQUFNLFNBQVEsOENBQWlCLFlBQWpCLG1CQUEwQixZQUExQiw0QkFBb0MsRUFBRSxNQUFNLGdCQUFnQixTQUNwRSw0Q0FBZ0IsWUFBaEIsbUJBQXlCLFlBQXpCLDRCQUFtQyxFQUFFLE1BQU0sZ0JBQWdCO0FBQ2pFLFFBQUksTUFBTTtBQUNSLFlBQU0sT0FBTyxZQUFZLE1BQU07QUFDN0IsWUFBSTtBQUFFLGVBQUssWUFBWSxFQUFFLE1BQU0sUUFBUSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7QUFBQSxRQUFHLFFBQ25EO0FBQUUsd0JBQWMsSUFBSTtBQUFBLFFBQUc7QUFBQSxNQUMvQixHQUFHLEdBQU07QUFDVCx1QkFBSyxpQkFBTCxtQkFBbUIsZ0JBQW5CLDRCQUFpQyxNQUFNLGNBQWMsSUFBSTtBQUFBLElBQzNEO0FBQUEsRUFDRixRQUFRO0FBQUEsRUFBbUU7IiwKICAibmFtZXMiOiBbImdsb2JhbFRoaXMiLCAiY2hyb21lIiwgInJ1bnRpbWUiLCAiaWQiLCAiRXJyb3IiLCAiYnJvd3NlciIsICJDSFJPTUVfU0VORF9NRVNTQUdFX0NBTExCQUNLX05PX1JFU1BPTlNFX01FU1NBR0UiLCAid3JhcEFQSXMiLCAiZXh0ZW5zaW9uQVBJcyIsICJhcGlNZXRhZGF0YSIsICJPYmplY3QiLCAia2V5cyIsICJsZW5ndGgiLCAiRGVmYXVsdFdlYWtNYXAiLCAiV2Vha01hcCIsICJjb25zdHJ1Y3RvciIsICJjcmVhdGVJdGVtIiwgIml0ZW1zIiwgInVuZGVmaW5lZCIsICJnZXQiLCAia2V5IiwgImhhcyIsICJzZXQiLCAiaXNUaGVuYWJsZSIsICJ2YWx1ZSIsICJ0aGVuIiwgIm1ha2VDYWxsYmFjayIsICJwcm9taXNlIiwgIm1ldGFkYXRhIiwgImNhbGxiYWNrQXJncyIsICJsYXN0RXJyb3IiLCAicmVqZWN0IiwgIm1lc3NhZ2UiLCAic2luZ2xlQ2FsbGJhY2tBcmciLCAicmVzb2x2ZSIsICJwbHVyYWxpemVBcmd1bWVudHMiLCAibnVtQXJncyIsICJ3cmFwQXN5bmNGdW5jdGlvbiIsICJuYW1lIiwgImFzeW5jRnVuY3Rpb25XcmFwcGVyIiwgInRhcmdldCIsICJhcmdzIiwgIm1pbkFyZ3MiLCAibWF4QXJncyIsICJQcm9taXNlIiwgImZhbGxiYWNrVG9Ob0NhbGxiYWNrIiwgImNiRXJyb3IiLCAiY29uc29sZSIsICJ3YXJuIiwgIm5vQ2FsbGJhY2siLCAid3JhcE1ldGhvZCIsICJtZXRob2QiLCAid3JhcHBlciIsICJQcm94eSIsICJhcHBseSIsICJ0YXJnZXRNZXRob2QiLCAidGhpc09iaiIsICJjYWxsIiwgImhhc093blByb3BlcnR5IiwgIkZ1bmN0aW9uIiwgImJpbmQiLCAicHJvdG90eXBlIiwgIndyYXBPYmplY3QiLCAid3JhcHBlcnMiLCAiY2FjaGUiLCAiY3JlYXRlIiwgImhhbmRsZXJzIiwgInByb3h5VGFyZ2V0IiwgInByb3AiLCAicmVjZWl2ZXIiLCAiZGVmaW5lUHJvcGVydHkiLCAiY29uZmlndXJhYmxlIiwgImVudW1lcmFibGUiLCAiZGVzYyIsICJSZWZsZWN0IiwgImRlbGV0ZVByb3BlcnR5IiwgIndyYXBFdmVudCIsICJ3cmFwcGVyTWFwIiwgImFkZExpc3RlbmVyIiwgImxpc3RlbmVyIiwgImhhc0xpc3RlbmVyIiwgInJlbW92ZUxpc3RlbmVyIiwgIm9uUmVxdWVzdEZpbmlzaGVkV3JhcHBlcnMiLCAib25SZXF1ZXN0RmluaXNoZWQiLCAicmVxIiwgIndyYXBwZWRSZXEiLCAiZ2V0Q29udGVudCIsICJvbk1lc3NhZ2VXcmFwcGVycyIsICJvbk1lc3NhZ2UiLCAic2VuZGVyIiwgInNlbmRSZXNwb25zZSIsICJkaWRDYWxsU2VuZFJlc3BvbnNlIiwgIndyYXBwZWRTZW5kUmVzcG9uc2UiLCAic2VuZFJlc3BvbnNlUHJvbWlzZSIsICJyZXNwb25zZSIsICJyZXN1bHQiLCAiZXJyIiwgImlzUmVzdWx0VGhlbmFibGUiLCAic2VuZFByb21pc2VkUmVzdWx0IiwgIm1zZyIsICJlcnJvciIsICJfX21veldlYkV4dGVuc2lvblBvbHlmaWxsUmVqZWN0X18iLCAiY2F0Y2giLCAid3JhcHBlZFNlbmRNZXNzYWdlQ2FsbGJhY2siLCAicmVwbHkiLCAid3JhcHBlZFNlbmRNZXNzYWdlIiwgImFwaU5hbWVzcGFjZU9iaiIsICJ3cmFwcGVkQ2IiLCAicHVzaCIsICJzZW5kTWVzc2FnZSIsICJzdGF0aWNXcmFwcGVycyIsICJkZXZ0b29scyIsICJuZXR3b3JrIiwgIm9uTWVzc2FnZUV4dGVybmFsIiwgInRhYnMiLCAic2V0dGluZ01ldGFkYXRhIiwgImNsZWFyIiwgInByaXZhY3kiLCAic2VydmljZXMiLCAid2Vic2l0ZXMiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAiX2EiLCAiX2IiLCAibG9jYXRpb24iLCAiX2MiLCAiX2QiLCAiX2UiLCAiX2YiXQp9Cg==
|