@verified-network/verified-custody 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/babel.config.json +12 -0
  2. package/dist/index.d.mts +165 -0
  3. package/dist/index.d.ts +165 -0
  4. package/dist/index.js +3 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/index.mjs +3 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +31 -38
  9. package/src/components/overlays.tsx +61 -0
  10. package/src/components/search.tsx +381 -0
  11. package/src/components/slider.tsx +29 -0
  12. package/src/components/success.tsx +142 -0
  13. package/src/customTypes.d.ts +37 -0
  14. package/src/index.ts +17 -0
  15. package/src/pages/addCosigners.tsx +1014 -0
  16. package/src/pages/contact.tsx +280 -0
  17. package/src/pages/createPin.tsx +693 -0
  18. package/src/pages/enterPin.tsx +821 -0
  19. package/src/pages/ftu.tsx +244 -0
  20. package/src/pages/index.tsx +170 -0
  21. package/src/pages/otp.tsx +410 -0
  22. package/src/services/contracts.ts +817 -0
  23. package/src/services/store.tsx +65 -0
  24. package/src/style.css +2030 -0
  25. package/src/utils/config.ts +103 -0
  26. package/src/utils/constants.ts +1966 -0
  27. package/src/utils/helpers.tsx +334 -0
  28. package/src/utils/types.ts +85 -0
  29. package/tsconfig.json +16 -0
  30. package/tsup.config.ts +36 -0
  31. package/README.md +0 -93
  32. package/dist/assets/icon128.png +0 -0
  33. package/dist/assets/icon16.png +0 -0
  34. package/dist/assets/icon32.png +0 -0
  35. package/dist/assets/icon48.png +0 -0
  36. package/dist/autoreload-bg.1777342b.js +0 -392
  37. package/dist/autoreload.af9e0afa.js +0 -393
  38. package/dist/main.js +0 -2
  39. package/dist/main.js.LICENSE.txt +0 -190
  40. package/dist/manifest.json +0 -39
  41. package/dist/src/scripts/background.js +0 -866
  42. package/dist/src/scripts/content.js +0 -22029
  43. package/dist/src/static/options.b1269179.js +0 -22033
  44. package/dist/src/static/options.html +0 -9
  45. package/dist/src/static/popup.e3c8c7b7.js +0 -22043
  46. package/dist/src/static/popup.html +0 -9
  47. package/dist/webext-prod/assets/icon128.png +0 -0
  48. package/dist/webext-prod/assets/icon16.png +0 -0
  49. package/dist/webext-prod/assets/icon32.png +0 -0
  50. package/dist/webext-prod/assets/icon48.png +0 -0
  51. package/dist/webext-prod/manifest.json +0 -36
  52. package/dist/webext-prod/src/scripts/background.js +0 -2
  53. package/dist/webext-prod/src/scripts/background.js.map +0 -1
  54. package/dist/webext-prod/src/scripts/content.js +0 -35
  55. package/dist/webext-prod/src/scripts/content.js.map +0 -1
  56. package/dist/webext-prod/src/static/options.a111dcd9.js +0 -2
  57. package/dist/webext-prod/src/static/options.a111dcd9.js.map +0 -1
  58. package/dist/webext-prod/src/static/options.html +0 -1
  59. package/dist/webext-prod/src/static/popup.70071e3e.js +0 -35
  60. package/dist/webext-prod/src/static/popup.70071e3e.js.map +0 -1
  61. package/dist/webext-prod/src/static/popup.cc04f56e.js +0 -2
  62. package/dist/webext-prod/src/static/popup.cc04f56e.js.map +0 -1
  63. package/dist/webext-prod/src/static/popup.e8a65b8a.js +0 -35
  64. package/dist/webext-prod/src/static/popup.e8a65b8a.js.map +0 -1
  65. package/dist/webext-prod/src/static/popup.html +0 -1
@@ -1,393 +0,0 @@
1
- // modules are defined as an array
2
- // [ module function, map of requires ]
3
- //
4
- // map of requires is short require name -> numeric require
5
- //
6
- // anything defined in a previous bundle is accessed via the
7
- // orig method which is the require for previous bundles
8
-
9
- (function(modules, entry, mainEntry, parcelRequireName, globalName) {
10
- /* eslint-disable no-undef */
11
- var globalObject =
12
- typeof globalThis !== 'undefined'
13
- ? globalThis
14
- : typeof self !== 'undefined'
15
- ? self
16
- : typeof window !== 'undefined'
17
- ? window
18
- : typeof global !== 'undefined'
19
- ? global
20
- : {};
21
- /* eslint-enable no-undef */
22
-
23
- // Save the require from previous bundle to this closure if any
24
- var previousRequire =
25
- typeof globalObject[parcelRequireName] === 'function' &&
26
- globalObject[parcelRequireName];
27
-
28
- var cache = previousRequire.cache || {};
29
- // Do not use `require` to prevent Webpack from trying to bundle this call
30
- var nodeRequire =
31
- typeof module !== 'undefined' &&
32
- typeof module.require === 'function' &&
33
- module.require.bind(module);
34
-
35
- function newRequire(name, jumped) {
36
- if (!cache[name]) {
37
- if (!modules[name]) {
38
- // if we cannot find the module within our internal map or
39
- // cache jump to the current global require ie. the last bundle
40
- // that was added to the page.
41
- var currentRequire =
42
- typeof globalObject[parcelRequireName] === 'function' &&
43
- globalObject[parcelRequireName];
44
- if (!jumped && currentRequire) {
45
- return currentRequire(name, true);
46
- }
47
-
48
- // If there are other bundles on this page the require from the
49
- // previous one is saved to 'previousRequire'. Repeat this as
50
- // many times as there are bundles until the module is found or
51
- // we exhaust the require chain.
52
- if (previousRequire) {
53
- return previousRequire(name, true);
54
- }
55
-
56
- // Try the node require function if it exists.
57
- if (nodeRequire && typeof name === 'string') {
58
- return nodeRequire(name);
59
- }
60
-
61
- var err = new Error("Cannot find module '" + name + "'");
62
- err.code = 'MODULE_NOT_FOUND';
63
- throw err;
64
- }
65
-
66
- localRequire.resolve = resolve;
67
- localRequire.cache = {};
68
-
69
- var module = (cache[name] = new newRequire.Module(name));
70
-
71
- modules[name][0].call(
72
- module.exports,
73
- localRequire,
74
- module,
75
- module.exports,
76
- this,
77
- );
78
- }
79
-
80
- return cache[name].exports;
81
-
82
- function localRequire(x) {
83
- return newRequire(localRequire.resolve(x));
84
- }
85
-
86
- function resolve(x) {
87
- return modules[name][1][x] || x;
88
- }
89
- }
90
-
91
- function Module(moduleName) {
92
- this.id = moduleName;
93
- this.bundle = newRequire;
94
- this.exports = {};
95
- }
96
-
97
- newRequire.isParcelRequire = true;
98
- newRequire.Module = Module;
99
- newRequire.modules = modules;
100
- newRequire.cache = cache;
101
- newRequire.parent = previousRequire;
102
- newRequire.register = function(id, exports) {
103
- modules[id] = [
104
- function(require, module) {
105
- module.exports = exports;
106
- },
107
- {},
108
- ];
109
- };
110
-
111
- Object.defineProperty(newRequire, 'root', {
112
- get: function() {
113
- return globalObject[parcelRequireName];
114
- },
115
- });
116
-
117
- globalObject[parcelRequireName] = newRequire;
118
-
119
- for (var i = 0; i < entry.length; i++) {
120
- newRequire(entry[i]);
121
- }
122
-
123
- if (mainEntry) {
124
- // Expose entry point to Node, AMD or browser globals
125
- // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
126
- var mainExports = newRequire(mainEntry);
127
-
128
- // CommonJS
129
- if (typeof exports === 'object' && typeof module !== 'undefined') {
130
- module.exports = mainExports;
131
-
132
- // RequireJS
133
- } else if (typeof define === 'function' && define.amd) {
134
- define(function() {
135
- return mainExports;
136
- });
137
-
138
- // <script>
139
- } else if (globalName) {
140
- this[globalName] = mainExports;
141
- }
142
- }
143
- })({"55RhX":[function(require,module,exports) {
144
- var HMR_HOST = "localhost";
145
- var HMR_PORT = null;
146
- var HMR_SECURE = false;
147
- var HMR_ENV_HASH = "d751713988987e9331980363e24189ce";
148
- module.bundle.HMR_BUNDLE_ID = "f344c156756277e744aacd87af9e0afa"; // @flow
149
- /* global HMR_HOST, HMR_PORT, HMR_ENV_HASH, HMR_SECURE */ /*::
150
- import type {
151
- HMRAsset,
152
- HMRMessage,
153
- } from '@parcel/reporter-dev-server/src/HMRServer.js';
154
- interface ParcelRequire {
155
- (string): mixed;
156
- cache: {|[string]: ParcelModule|};
157
- hotData: mixed;
158
- Module: any;
159
- parent: ?ParcelRequire;
160
- isParcelRequire: true;
161
- modules: {|[string]: [Function, {|[string]: string|}]|};
162
- HMR_BUNDLE_ID: string;
163
- root: ParcelRequire;
164
- }
165
- interface ParcelModule {
166
- hot: {|
167
- data: mixed,
168
- accept(cb: (Function) => void): void,
169
- dispose(cb: (mixed) => void): void,
170
- // accept(deps: Array<string> | string, cb: (Function) => void): void,
171
- // decline(): void,
172
- _acceptCallbacks: Array<(Function) => void>,
173
- _disposeCallbacks: Array<(mixed) => void>,
174
- |};
175
- }
176
- declare var module: {bundle: ParcelRequire, ...};
177
- declare var HMR_HOST: string;
178
- declare var HMR_PORT: string;
179
- declare var HMR_ENV_HASH: string;
180
- declare var HMR_SECURE: boolean;
181
- */ var OVERLAY_ID = '__parcel__error__overlay__';
182
- var OldModule = module.bundle.Module;
183
- function Module(moduleName) {
184
- OldModule.call(this, moduleName);
185
- this.hot = {
186
- data: module.bundle.hotData,
187
- _acceptCallbacks: [],
188
- _disposeCallbacks: [],
189
- accept: function(fn) {
190
- this._acceptCallbacks.push(fn || function() {
191
- });
192
- },
193
- dispose: function(fn) {
194
- this._disposeCallbacks.push(fn);
195
- }
196
- };
197
- module.bundle.hotData = undefined;
198
- }
199
- module.bundle.Module = Module;
200
- var checkedAssets/*: {|[string]: boolean|} */ , acceptedAssets/*: {|[string]: boolean|} */ , assetsToAccept/*: Array<[ParcelRequire, string]> */ ;
201
- function getHostname() {
202
- return HMR_HOST || (location.protocol.indexOf('http') === 0 ? location.hostname : 'localhost');
203
- }
204
- function getPort() {
205
- return HMR_PORT || location.port;
206
- }
207
- // eslint-disable-next-line no-redeclare
208
- var parent = module.bundle.parent;
209
- if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') {
210
- var hostname = getHostname();
211
- var port = getPort();
212
- var protocol = HMR_SECURE || location.protocol == 'https:' && !/localhost|127.0.0.1|0.0.0.0/.test(hostname) ? 'wss' : 'ws';
213
- var ws = new WebSocket(protocol + '://' + hostname + (port ? ':' + port : '') + '/');
214
- // $FlowFixMe
215
- ws.onmessage = function(event/*: {data: string, ...} */ ) {
216
- checkedAssets = {
217
- };
218
- acceptedAssets = {
219
- };
220
- assetsToAccept = [];
221
- var data = JSON.parse(event.data);
222
- if (data.type === 'update') {
223
- // Remove error overlay if there is one
224
- removeErrorOverlay();
225
- let assets = data.assets.filter((asset)=>asset.envHash === HMR_ENV_HASH
226
- );
227
- // Handle HMR Update
228
- var handled = false;
229
- assets.forEach((asset)=>{
230
- var didAccept = asset.type === 'css' || asset.type === 'js' && hmrAcceptCheck(module.bundle.root, asset.id, asset.depsByBundle);
231
- if (didAccept) handled = true;
232
- });
233
- if (handled) {
234
- console.clear();
235
- assets.forEach(function(asset) {
236
- hmrApply(module.bundle.root, asset);
237
- });
238
- for(var i = 0; i < assetsToAccept.length; i++){
239
- var id = assetsToAccept[i][1];
240
- if (!acceptedAssets[id]) hmrAcceptRun(assetsToAccept[i][0], id);
241
- }
242
- } else window.location.reload();
243
- }
244
- if (data.type === 'error') {
245
- // Log parcel errors to console
246
- for (let ansiDiagnostic of data.diagnostics.ansi){
247
- let stack = ansiDiagnostic.codeframe ? ansiDiagnostic.codeframe : ansiDiagnostic.stack;
248
- console.error('🚨 [parcel]: ' + ansiDiagnostic.message + '\n' + stack + '\n\n' + ansiDiagnostic.hints.join('\n'));
249
- }
250
- // Render the fancy html overlay
251
- removeErrorOverlay();
252
- var overlay = createErrorOverlay(data.diagnostics.html);
253
- // $FlowFixMe
254
- document.body.appendChild(overlay);
255
- }
256
- };
257
- ws.onerror = function(e) {
258
- console.error(e.message);
259
- };
260
- ws.onclose = function(e) {
261
- console.warn('[parcel] 🚨 Connection to the HMR server was lost');
262
- };
263
- }
264
- function removeErrorOverlay() {
265
- var overlay = document.getElementById(OVERLAY_ID);
266
- if (overlay) {
267
- overlay.remove();
268
- console.log('[parcel] ✨ Error resolved');
269
- }
270
- }
271
- function createErrorOverlay(diagnostics) {
272
- var overlay = document.createElement('div');
273
- overlay.id = OVERLAY_ID;
274
- let errorHTML = '<div style="background: black; opacity: 0.85; font-size: 16px; color: white; position: fixed; height: 100%; width: 100%; top: 0px; left: 0px; padding: 30px; font-family: Menlo, Consolas, monospace; z-index: 9999;">';
275
- for (let diagnostic of diagnostics){
276
- let stack = diagnostic.codeframe ? diagnostic.codeframe : diagnostic.stack;
277
- errorHTML += `\n <div>\n <div style="font-size: 18px; font-weight: bold; margin-top: 20px;">\n 🚨 ${diagnostic.message}\n </div>\n <pre>\n ${stack}\n </pre>\n <div>\n ${diagnostic.hints.map((hint)=>'<div>' + hint + '</div>'
278
- ).join('')}\n </div>\n </div>\n `;
279
- }
280
- errorHTML += '</div>';
281
- overlay.innerHTML = errorHTML;
282
- return overlay;
283
- }
284
- function getParents(bundle, id) /*: Array<[ParcelRequire, string]> */ {
285
- var modules = bundle.modules;
286
- if (!modules) return [];
287
- var parents = [];
288
- var k, d, dep;
289
- for(k in modules)for(d in modules[k][1]){
290
- dep = modules[k][1][d];
291
- if (dep === id || Array.isArray(dep) && dep[dep.length - 1] === id) parents.push([
292
- bundle,
293
- k
294
- ]);
295
- }
296
- if (bundle.parent) parents = parents.concat(getParents(bundle.parent, id));
297
- return parents;
298
- }
299
- function updateLink(link) {
300
- var newLink = link.cloneNode();
301
- newLink.onload = function() {
302
- if (link.parentNode !== null) // $FlowFixMe
303
- link.parentNode.removeChild(link);
304
- };
305
- newLink.setAttribute('href', // $FlowFixMe
306
- link.getAttribute('href').split('?')[0] + '?' + Date.now());
307
- // $FlowFixMe
308
- link.parentNode.insertBefore(newLink, link.nextSibling);
309
- }
310
- var cssTimeout = null;
311
- function reloadCSS() {
312
- if (cssTimeout) return;
313
- cssTimeout = setTimeout(function() {
314
- var links = document.querySelectorAll('link[rel="stylesheet"]');
315
- for(var i = 0; i < links.length; i++){
316
- // $FlowFixMe[incompatible-type]
317
- var href = links[i].getAttribute('href');
318
- var hostname = getHostname();
319
- var servedFromHMRServer = hostname === 'localhost' ? new RegExp('^(https?:\\/\\/(0.0.0.0|127.0.0.1)|localhost):' + getPort()).test(href) : href.indexOf(hostname + ':' + getPort());
320
- var absolute = /^https?:\/\//i.test(href) && href.indexOf(window.location.origin) !== 0 && !servedFromHMRServer;
321
- if (!absolute) updateLink(links[i]);
322
- }
323
- cssTimeout = null;
324
- }, 50);
325
- }
326
- function hmrApply(bundle/*: ParcelRequire */ , asset/*: HMRAsset */ ) {
327
- var modules = bundle.modules;
328
- if (!modules) return;
329
- if (asset.type === 'css') {
330
- reloadCSS();
331
- return;
332
- }
333
- let deps = asset.depsByBundle[bundle.HMR_BUNDLE_ID];
334
- if (deps) {
335
- var fn = new Function('require', 'module', 'exports', asset.output);
336
- modules[asset.id] = [
337
- fn,
338
- deps
339
- ];
340
- } else if (bundle.parent) hmrApply(bundle.parent, asset);
341
- }
342
- function hmrAcceptCheck(bundle/*: ParcelRequire */ , id/*: string */ , depsByBundle/*: ?{ [string]: { [string]: string } }*/ ) {
343
- var modules = bundle.modules;
344
- if (!modules) return;
345
- if (depsByBundle && !depsByBundle[bundle.HMR_BUNDLE_ID]) {
346
- // If we reached the root bundle without finding where the asset should go,
347
- // there's nothing to do. Mark as "accepted" so we don't reload the page.
348
- if (!bundle.parent) return true;
349
- return hmrAcceptCheck(bundle.parent, id, depsByBundle);
350
- }
351
- if (checkedAssets[id]) return;
352
- checkedAssets[id] = true;
353
- var cached = bundle.cache[id];
354
- assetsToAccept.push([
355
- bundle,
356
- id
357
- ]);
358
- if (cached && cached.hot && cached.hot._acceptCallbacks.length) return true;
359
- return getParents(module.bundle.root, id).some(function(v) {
360
- return hmrAcceptCheck(v[0], v[1], null);
361
- });
362
- }
363
- function hmrAcceptRun(bundle/*: ParcelRequire */ , id/*: string */ ) {
364
- var cached = bundle.cache[id];
365
- bundle.hotData = {
366
- };
367
- if (cached && cached.hot) cached.hot.data = bundle.hotData;
368
- if (cached && cached.hot && cached.hot._disposeCallbacks.length) cached.hot._disposeCallbacks.forEach(function(cb) {
369
- cb(bundle.hotData);
370
- });
371
- delete bundle.cache[id];
372
- bundle(id);
373
- cached = bundle.cache[id];
374
- if (cached && cached.hot && cached.hot._acceptCallbacks.length) cached.hot._acceptCallbacks.forEach(function(cb) {
375
- var assetsToAlsoAccept = cb(function() {
376
- return getParents(module.bundle.root, id);
377
- });
378
- if (assetsToAlsoAccept && assetsToAccept.length) assetsToAccept.push.apply(assetsToAccept, assetsToAlsoAccept);
379
- });
380
- acceptedAssets[id] = true;
381
- }
382
-
383
- },{}],"48PW8":[function(require,module,exports) {
384
- "use strict";
385
- /* global window */ window.addEventListener('beforeunload', function() {
386
- (window.chrome || window.browser).runtime.sendMessage({
387
- __parcel_hmr_reload__: true
388
- });
389
- });
390
-
391
- },{}]},["55RhX","48PW8"], "48PW8", "parcelRequire5c9f")
392
-
393
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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R0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUM1RCxNQUFNLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sVUFBVSxFQUFFO1lBQ3pDLGtCQUFrQixHQUFHLEVBQUU7bUJBQ2xCLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFOztZQUV0QyxrQkFBa0IsSUFBSSxjQUFjLENBQUMsTUFBTSxFQUM3QyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsa0JBQWtCOztJQUlsRSxjQUFjLENBQUMsRUFBRSxJQUFJLElBQUk7Ozs7Q0M3VzNCLFVBQVk7QUFFWixFQUFBLGVBQUEsRUFBbUIsQ0FDbkIsTUFBTSxDQUFDLGdCQUFnQixFQUFDLFlBQWM7S0FDbkMsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxXQUFXO1FBQ25ELHFCQUFxQixFQUFFLElBQUkiLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9AcGFyY2VsL2NvbmZpZy13ZWJleHRlbnNpb24vbm9kZV9tb2R1bGVzL0BwYXJjZWwvcnVudGltZS1icm93c2VyLWhtci9saWIvcnVudGltZS0wYTYwNmY2M2Y0OGFmMjMyZDFjNjYyYmUxMzRkY2VhOS5qcyIsIm5vZGVfbW9kdWxlcy9AcGFyY2VsL3RyYW5zZm9ybWVyLXdlYmV4dGVuc2lvbi9saWIvcnVudGltZS9hdXRvcmVsb2FkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBITVJfSE9TVCA9IFwibG9jYWxob3N0XCI7dmFyIEhNUl9QT1JUID0gbnVsbDt2YXIgSE1SX1NFQ1VSRSA9IGZhbHNlO3ZhciBITVJfRU5WX0hBU0ggPSBcImQ3NTE3MTM5ODg5ODdlOTMzMTk4MDM2M2UyNDE4OWNlXCI7bW9kdWxlLmJ1bmRsZS5ITVJfQlVORExFX0lEID0gXCJmMzQ0YzE1Njc1NjI3N2U3NDRhYWNkODdhZjllMGFmYVwiOy8vIEBmbG93XG4vKiBnbG9iYWwgSE1SX0hPU1QsIEhNUl9QT1JULCBITVJfRU5WX0hBU0gsIEhNUl9TRUNVUkUgKi9cblxuLyo6OlxuaW1wb3J0IHR5cGUge1xuICBITVJBc3NldCxcbiAgSE1STWVzc2FnZSxcbn0gZnJvbSAnQHBhcmNlbC9yZXBvcnRlci1kZXYtc2VydmVyL3NyYy9ITVJTZXJ2ZXIuanMnO1xuaW50ZXJmYWNlIFBhcmNlbFJlcXVpcmUge1xuICAoc3RyaW5nKTogbWl4ZWQ7XG4gIGNhY2hlOiB7fFtzdHJpbmddOiBQYXJjZWxNb2R1bGV8fTtcbiAgaG90RGF0YTogbWl4ZWQ7XG4gIE1vZHVsZTogYW55O1xuICBwYXJlbnQ6ID9QYXJjZWxSZXF1aXJlO1xuICBpc1BhcmNlbFJlcXVpcmU6IHRydWU7XG4gIG1vZHVsZXM6IHt8W3N0cmluZ106IFtGdW5jdGlvbiwge3xbc3RyaW5nXTogc3RyaW5nfH1dfH07XG4gIEhNUl9CVU5ETEVfSUQ6IHN0cmluZztcbiAgcm9vdDogUGFyY2VsUmVxdWlyZTtcbn1cbmludGVyZmFjZSBQYXJjZWxNb2R1bGUge1xuICBob3Q6IHt8XG4gICAgZGF0YTogbWl4ZWQsXG4gICAgYWNjZXB0KGNiOiAoRnVuY3Rpb24pID0+IHZvaWQpOiB2b2lkLFxuICAgIGRpc3Bvc2UoY2I6IChtaXhlZCkgPT4gdm9pZCk6IHZvaWQsXG4gICAgLy8gYWNjZXB0KGRlcHM6IEFycmF5PHN0cmluZz4gfCBzdHJpbmcsIGNiOiAoRnVuY3Rpb24pID0+IHZvaWQpOiB2b2lkLFxuICAgIC8vIGRlY2xpbmUoKTogdm9pZCxcbiAgICBfYWNjZXB0Q2FsbGJhY2tzOiBBcnJheTwoRnVuY3Rpb24pID0+IHZvaWQ+LFxuICAgIF9kaXNwb3NlQ2FsbGJhY2tzOiBBcnJheTwobWl4ZWQpID0+IHZvaWQ+LFxuICB8fTtcbn1cbmRlY2xhcmUgdmFyIG1vZHVsZToge2J1bmRsZTogUGFyY2VsUmVxdWlyZSwgLi4ufTtcbmRlY2xhcmUgdmFyIEhNUl9IT1NUOiBzdHJpbmc7XG5kZWNsYXJlIHZhciBITVJfUE9SVDogc3RyaW5nO1xuZGVjbGFyZSB2YXIgSE1SX0VOVl9IQVNIOiBzdHJpbmc7XG5kZWNsYXJlIHZhciBITVJfU0VDVVJFOiBib29sZWFuO1xuKi9cblxudmFyIE9WRVJMQVlfSUQgPSAnX19wYXJjZWxfX2Vycm9yX19vdmVybGF5X18nO1xuXG52YXIgT2xkTW9kdWxlID0gbW9kdWxlLmJ1bmRsZS5Nb2R1bGU7XG5cbmZ1bmN0aW9uIE1vZHVsZShtb2R1bGVOYW1lKSB7XG4gIE9sZE1vZHVsZS5jYWxsKHRoaXMsIG1vZHVsZU5hbWUpO1xuICB0aGlzLmhvdCA9IHtcbiAgICBkYXRhOiBtb2R1bGUuYnVuZGxlLmhvdERhdGEsXG4gICAgX2FjY2VwdENhbGxiYWNrczogW10sXG4gICAgX2Rpc3Bvc2VDYWxsYmFja3M6IFtdLFxuICAgIGFjY2VwdDogZnVuY3Rpb24oZm4pIHtcbiAgICAgIHRoaXMuX2FjY2VwdENhbGxiYWNrcy5wdXNoKGZuIHx8IGZ1bmN0aW9uKCkge30pO1xuICAgIH0sXG4gICAgZGlzcG9zZTogZnVuY3Rpb24oZm4pIHtcbiAgICAgIHRoaXMuX2Rpc3Bvc2VDYWxsYmFja3MucHVzaChmbik7XG4gICAgfSxcbiAgfTtcbiAgbW9kdWxlLmJ1bmRsZS5ob3REYXRhID0gdW5kZWZpbmVkO1xufVxubW9kdWxlLmJ1bmRsZS5Nb2R1bGUgPSBNb2R1bGU7XG5cbnZhciBjaGVja2VkQXNzZXRzIC8qOiB7fFtzdHJpbmddOiBib29sZWFufH0gKi8sXG4gIGFjY2VwdGVkQXNzZXRzIC8qOiB7fFtzdHJpbmddOiBib29sZWFufH0gKi8sXG4gIGFzc2V0c1RvQWNjZXB0IC8qOiBBcnJheTxbUGFyY2VsUmVxdWlyZSwgc3RyaW5nXT4gKi87XG5cbmZ1bmN0aW9uIGdldEhvc3RuYW1lKCkge1xuICByZXR1cm4gKFxuICAgIEhNUl9IT1NUIHx8XG4gICAgKGxvY2F0aW9uLnByb3RvY29sLmluZGV4T2YoJ2h0dHAnKSA9PT0gMCA/IGxvY2F0aW9uLmhvc3RuYW1lIDogJ2xvY2FsaG9zdCcpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFBvcnQoKSB7XG4gIHJldHVybiBITVJfUE9SVCB8fCBsb2NhdGlvbi5wb3J0O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG52YXIgcGFyZW50ID0gbW9kdWxlLmJ1bmRsZS5wYXJlbnQ7XG5pZiAoKCFwYXJlbnQgfHwgIXBhcmVudC5pc1BhcmNlbFJlcXVpcmUpICYmIHR5cGVvZiBXZWJTb2NrZXQgIT09ICd1bmRlZmluZWQnKSB7XG4gIHZhciBob3N0bmFtZSA9IGdldEhvc3RuYW1lKCk7XG4gIHZhciBwb3J0ID0gZ2V0UG9ydCgpO1xuICB2YXIgcHJvdG9jb2wgPVxuICAgIEhNUl9TRUNVUkUgfHxcbiAgICAobG9jYXRpb24ucHJvdG9jb2wgPT0gJ2h0dHBzOicgJiZcbiAgICAgICEvbG9jYWxob3N0fDEyNy4wLjAuMXwwLjAuMC4wLy50ZXN0KGhvc3RuYW1lKSlcbiAgICAgID8gJ3dzcydcbiAgICAgIDogJ3dzJztcbiAgdmFyIHdzID0gbmV3IFdlYlNvY2tldChcbiAgICBwcm90b2NvbCArICc6Ly8nICsgaG9zdG5hbWUgKyAocG9ydCA/ICc6JyArIHBvcnQgOiAnJykgKyAnLycsXG4gICk7XG4gIC8vICRGbG93Rml4TWVcbiAgd3Mub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQgLyo6IHtkYXRhOiBzdHJpbmcsIC4uLn0gKi8pIHtcbiAgICBjaGVja2VkQXNzZXRzID0gKHt9IC8qOiB7fFtzdHJpbmddOiBib29sZWFufH0gKi8pO1xuICAgIGFjY2VwdGVkQXNzZXRzID0gKHt9IC8qOiB7fFtzdHJpbmddOiBib29sZWFufH0gKi8pO1xuICAgIGFzc2V0c1RvQWNjZXB0ID0gW107XG5cbiAgICB2YXIgZGF0YSAvKjogSE1STWVzc2FnZSAqLyA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG5cbiAgICBpZiAoZGF0YS50eXBlID09PSAndXBkYXRlJykge1xuICAgICAgLy8gUmVtb3ZlIGVycm9yIG92ZXJsYXkgaWYgdGhlcmUgaXMgb25lXG4gICAgICByZW1vdmVFcnJvck92ZXJsYXkoKTtcblxuICAgICAgbGV0IGFzc2V0cyA9IGRhdGEuYXNzZXRzLmZpbHRlcihhc3NldCA9PiBhc3NldC5lbnZIYXNoID09PSBITVJfRU5WX0hBU0gpO1xuXG4gICAgICAvLyBIYW5kbGUgSE1SIFVwZGF0ZVxuICAgICAgdmFyIGhhbmRsZWQgPSBmYWxzZTtcbiAgICAgIGFzc2V0cy5mb3JFYWNoKGFzc2V0ID0+IHtcbiAgICAgICAgdmFyIGRpZEFjY2VwdCA9XG4gICAgICAgICAgYXNzZXQudHlwZSA9PT0gJ2NzcycgfHxcbiAgICAgICAgICAoYXNzZXQudHlwZSA9PT0gJ2pzJyAmJlxuICAgICAgICAgICAgaG1yQWNjZXB0Q2hlY2sobW9kdWxlLmJ1bmRsZS5yb290LCBhc3NldC5pZCwgYXNzZXQuZGVwc0J5QnVuZGxlKSk7XG4gICAgICAgIGlmIChkaWRBY2NlcHQpIHtcbiAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgIGNvbnNvbGUuY2xlYXIoKTtcblxuICAgICAgICBhc3NldHMuZm9yRWFjaChmdW5jdGlvbihhc3NldCkge1xuICAgICAgICAgIGhtckFwcGx5KG1vZHVsZS5idW5kbGUucm9vdCwgYXNzZXQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzc2V0c1RvQWNjZXB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGlkID0gYXNzZXRzVG9BY2NlcHRbaV1bMV07XG4gICAgICAgICAgaWYgKCFhY2NlcHRlZEFzc2V0c1tpZF0pIHtcbiAgICAgICAgICAgIGhtckFjY2VwdFJ1bihhc3NldHNUb0FjY2VwdFtpXVswXSwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIExvZyBwYXJjZWwgZXJyb3JzIHRvIGNvbnNvbGVcbiAgICAgIGZvciAobGV0IGFuc2lEaWFnbm9zdGljIG9mIGRhdGEuZGlhZ25vc3RpY3MuYW5zaSkge1xuICAgICAgICBsZXQgc3RhY2sgPSBhbnNpRGlhZ25vc3RpYy5jb2RlZnJhbWVcbiAgICAgICAgICA/IGFuc2lEaWFnbm9zdGljLmNvZGVmcmFtZVxuICAgICAgICAgIDogYW5zaURpYWdub3N0aWMuc3RhY2s7XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAn8J+aqCBbcGFyY2VsXTogJyArXG4gICAgICAgICAgICBhbnNpRGlhZ25vc3RpYy5tZXNzYWdlICtcbiAgICAgICAgICAgICdcXG4nICtcbiAgICAgICAgICAgIHN0YWNrICtcbiAgICAgICAgICAgICdcXG5cXG4nICtcbiAgICAgICAgICAgIGFuc2lEaWFnbm9zdGljLmhpbnRzLmpvaW4oJ1xcbicpLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW5kZXIgdGhlIGZhbmN5IGh0bWwgb3ZlcmxheVxuICAgICAgcmVtb3ZlRXJyb3JPdmVybGF5KCk7XG4gICAgICB2YXIgb3ZlcmxheSA9IGNyZWF0ZUVycm9yT3ZlcmxheShkYXRhLmRpYWdub3N0aWNzLmh0bWwpO1xuICAgICAgLy8gJEZsb3dGaXhNZVxuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChvdmVybGF5KTtcbiAgICB9XG4gIH07XG4gIHdzLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7XG4gICAgY29uc29sZS5lcnJvcihlLm1lc3NhZ2UpO1xuICB9O1xuICB3cy5vbmNsb3NlID0gZnVuY3Rpb24oZSkge1xuICAgIGlmIChwcm9jZXNzLmVudi5QQVJDRUxfQlVJTERfRU5WICE9PSAndGVzdCcpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3BhcmNlbF0g8J+aqCBDb25uZWN0aW9uIHRvIHRoZSBITVIgc2VydmVyIHdhcyBsb3N0Jyk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiByZW1vdmVFcnJvck92ZXJsYXkoKSB7XG4gIHZhciBvdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoT1ZFUkxBWV9JRCk7XG4gIGlmIChvdmVybGF5KSB7XG4gICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICBjb25zb2xlLmxvZygnW3BhcmNlbF0g4pyoIEVycm9yIHJlc29sdmVkJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlRXJyb3JPdmVybGF5KGRpYWdub3N0aWNzKSB7XG4gIHZhciBvdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIG92ZXJsYXkuaWQgPSBPVkVSTEFZX0lEO1xuXG4gIGxldCBlcnJvckhUTUwgPVxuICAgICc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDogYmxhY2s7IG9wYWNpdHk6IDAuODU7IGZvbnQtc2l6ZTogMTZweDsgY29sb3I6IHdoaXRlOyBwb3NpdGlvbjogZml4ZWQ7IGhlaWdodDogMTAwJTsgd2lkdGg6IDEwMCU7IHRvcDogMHB4OyBsZWZ0OiAwcHg7IHBhZGRpbmc6IDMwcHg7IGZvbnQtZmFtaWx5OiBNZW5sbywgQ29uc29sYXMsIG1vbm9zcGFjZTsgei1pbmRleDogOTk5OTtcIj4nO1xuXG4gIGZvciAobGV0IGRpYWdub3N0aWMgb2YgZGlhZ25vc3RpY3MpIHtcbiAgICBsZXQgc3RhY2sgPSBkaWFnbm9zdGljLmNvZGVmcmFtZSA/IGRpYWdub3N0aWMuY29kZWZyYW1lIDogZGlhZ25vc3RpYy5zdGFjaztcblxuICAgIGVycm9ySFRNTCArPSBgXG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogYm9sZDsgbWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICAgICAgICDwn5qoICR7ZGlhZ25vc3RpYy5tZXNzYWdlfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHByZT5cbiAgICAgICAgICAke3N0YWNrfVxuICAgICAgICA8L3ByZT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICAke2RpYWdub3N0aWMuaGludHMubWFwKGhpbnQgPT4gJzxkaXY+JyArIGhpbnQgKyAnPC9kaXY+Jykuam9pbignJyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIGVycm9ySFRNTCArPSAnPC9kaXY+JztcblxuICBvdmVybGF5LmlubmVySFRNTCA9IGVycm9ySFRNTDtcblxuICByZXR1cm4gb3ZlcmxheTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFyZW50cyhidW5kbGUsIGlkKSAvKjogQXJyYXk8W1BhcmNlbFJlcXVpcmUsIHN0cmluZ10+ICovIHtcbiAgdmFyIG1vZHVsZXMgPSBidW5kbGUubW9kdWxlcztcbiAgaWYgKCFtb2R1bGVzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIHBhcmVudHMgPSBbXTtcbiAgdmFyIGssIGQsIGRlcDtcblxuICBmb3IgKGsgaW4gbW9kdWxlcykge1xuICAgIGZvciAoZCBpbiBtb2R1bGVzW2tdWzFdKSB7XG4gICAgICBkZXAgPSBtb2R1bGVzW2tdWzFdW2RdO1xuXG4gICAgICBpZiAoZGVwID09PSBpZCB8fCAoQXJyYXkuaXNBcnJheShkZXApICYmIGRlcFtkZXAubGVuZ3RoIC0gMV0gPT09IGlkKSkge1xuICAgICAgICBwYXJlbnRzLnB1c2goW2J1bmRsZSwga10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChidW5kbGUucGFyZW50KSB7XG4gICAgcGFyZW50cyA9IHBhcmVudHMuY29uY2F0KGdldFBhcmVudHMoYnVuZGxlLnBhcmVudCwgaWQpKTtcbiAgfVxuXG4gIHJldHVybiBwYXJlbnRzO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVMaW5rKGxpbmspIHtcbiAgdmFyIG5ld0xpbmsgPSBsaW5rLmNsb25lTm9kZSgpO1xuICBuZXdMaW5rLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChsaW5rLnBhcmVudE5vZGUgIT09IG51bGwpIHtcbiAgICAgIC8vICRGbG93Rml4TWVcbiAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTtcbiAgICB9XG4gIH07XG4gIG5ld0xpbmsuc2V0QXR0cmlidXRlKFxuICAgICdocmVmJyxcbiAgICAvLyAkRmxvd0ZpeE1lXG4gICAgbGluay5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zcGxpdCgnPycpWzBdICsgJz8nICsgRGF0ZS5ub3coKSxcbiAgKTtcbiAgLy8gJEZsb3dGaXhNZVxuICBsaW5rLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld0xpbmssIGxpbmsubmV4dFNpYmxpbmcpO1xufVxuXG52YXIgY3NzVGltZW91dCA9IG51bGw7XG5mdW5jdGlvbiByZWxvYWRDU1MoKSB7XG4gIGlmIChjc3NUaW1lb3V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY3NzVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9XCJzdHlsZXNoZWV0XCJdJyk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV1cbiAgICAgIHZhciBocmVmIC8qOiBzdHJpbmcgKi8gPSBsaW5rc1tpXS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgIHZhciBob3N0bmFtZSA9IGdldEhvc3RuYW1lKCk7XG4gICAgICB2YXIgc2VydmVkRnJvbUhNUlNlcnZlciA9XG4gICAgICAgIGhvc3RuYW1lID09PSAnbG9jYWxob3N0J1xuICAgICAgICAgID8gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgJ14oaHR0cHM/OlxcXFwvXFxcXC8oMC4wLjAuMHwxMjcuMC4wLjEpfGxvY2FsaG9zdCk6JyArIGdldFBvcnQoKSxcbiAgICAgICAgICAgICkudGVzdChocmVmKVxuICAgICAgICAgIDogaHJlZi5pbmRleE9mKGhvc3RuYW1lICsgJzonICsgZ2V0UG9ydCgpKTtcbiAgICAgIHZhciBhYnNvbHV0ZSA9XG4gICAgICAgIC9eaHR0cHM/OlxcL1xcLy9pLnRlc3QoaHJlZikgJiZcbiAgICAgICAgaHJlZi5pbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pICE9PSAwICYmXG4gICAgICAgICFzZXJ2ZWRGcm9tSE1SU2VydmVyO1xuICAgICAgaWYgKCFhYnNvbHV0ZSkge1xuICAgICAgICB1cGRhdGVMaW5rKGxpbmtzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjc3NUaW1lb3V0ID0gbnVsbDtcbiAgfSwgNTApO1xufVxuXG5mdW5jdGlvbiBobXJBcHBseShidW5kbGUgLyo6IFBhcmNlbFJlcXVpcmUgKi8sIGFzc2V0IC8qOiAgSE1SQXNzZXQgKi8pIHtcbiAgdmFyIG1vZHVsZXMgPSBidW5kbGUubW9kdWxlcztcbiAgaWYgKCFtb2R1bGVzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFzc2V0LnR5cGUgPT09ICdjc3MnKSB7XG4gICAgcmVsb2FkQ1NTKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IGRlcHMgPSBhc3NldC5kZXBzQnlCdW5kbGVbYnVuZGxlLkhNUl9CVU5ETEVfSURdO1xuICBpZiAoZGVwcykge1xuICAgIHZhciBmbiA9IG5ldyBGdW5jdGlvbigncmVxdWlyZScsICdtb2R1bGUnLCAnZXhwb3J0cycsIGFzc2V0Lm91dHB1dCk7XG4gICAgbW9kdWxlc1thc3NldC5pZF0gPSBbZm4sIGRlcHNdO1xuICB9IGVsc2UgaWYgKGJ1bmRsZS5wYXJlbnQpIHtcbiAgICBobXJBcHBseShidW5kbGUucGFyZW50LCBhc3NldCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaG1yQWNjZXB0Q2hlY2soXG4gIGJ1bmRsZSAvKjogUGFyY2VsUmVxdWlyZSAqLyxcbiAgaWQgLyo6IHN0cmluZyAqLyxcbiAgZGVwc0J5QnVuZGxlIC8qOiA/eyBbc3RyaW5nXTogeyBbc3RyaW5nXTogc3RyaW5nIH0gfSovLFxuKSB7XG4gIHZhciBtb2R1bGVzID0gYnVuZGxlLm1vZHVsZXM7XG4gIGlmICghbW9kdWxlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChkZXBzQnlCdW5kbGUgJiYgIWRlcHNCeUJ1bmRsZVtidW5kbGUuSE1SX0JVTkRMRV9JRF0pIHtcbiAgICAvLyBJZiB3ZSByZWFjaGVkIHRoZSByb290IGJ1bmRsZSB3aXRob3V0IGZpbmRpbmcgd2hlcmUgdGhlIGFzc2V0IHNob3VsZCBnbyxcbiAgICAvLyB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uIE1hcmsgYXMgXCJhY2NlcHRlZFwiIHNvIHdlIGRvbid0IHJlbG9hZCB0aGUgcGFnZS5cbiAgICBpZiAoIWJ1bmRsZS5wYXJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBobXJBY2NlcHRDaGVjayhidW5kbGUucGFyZW50LCBpZCwgZGVwc0J5QnVuZGxlKTtcbiAgfVxuXG4gIGlmIChjaGVja2VkQXNzZXRzW2lkXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNoZWNrZWRBc3NldHNbaWRdID0gdHJ1ZTtcblxuICB2YXIgY2FjaGVkID0gYnVuZGxlLmNhY2hlW2lkXTtcblxuICBhc3NldHNUb0FjY2VwdC5wdXNoKFtidW5kbGUsIGlkXSk7XG5cbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQuaG90ICYmIGNhY2hlZC5ob3QuX2FjY2VwdENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBnZXRQYXJlbnRzKG1vZHVsZS5idW5kbGUucm9vdCwgaWQpLnNvbWUoZnVuY3Rpb24odikge1xuICAgIHJldHVybiBobXJBY2NlcHRDaGVjayh2WzBdLCB2WzFdLCBudWxsKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhtckFjY2VwdFJ1bihidW5kbGUgLyo6IFBhcmNlbFJlcXVpcmUgKi8sIGlkIC8qOiBzdHJpbmcgKi8pIHtcbiAgdmFyIGNhY2hlZCA9IGJ1bmRsZS5jYWNoZVtpZF07XG4gIGJ1bmRsZS5ob3REYXRhID0ge307XG4gIGlmIChjYWNoZWQgJiYgY2FjaGVkLmhvdCkge1xuICAgIGNhY2hlZC5ob3QuZGF0YSA9IGJ1bmRsZS5ob3REYXRhO1xuICB9XG5cbiAgaWYgKGNhY2hlZCAmJiBjYWNoZWQuaG90ICYmIGNhY2hlZC5ob3QuX2Rpc3Bvc2VDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgY2FjaGVkLmhvdC5fZGlzcG9zZUNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNiKSB7XG4gICAgICBjYihidW5kbGUuaG90RGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBkZWxldGUgYnVuZGxlLmNhY2hlW2lkXTtcbiAgYnVuZGxlKGlkKTtcblxuICBjYWNoZWQgPSBidW5kbGUuY2FjaGVbaWRdO1xuICBpZiAoY2FjaGVkICYmIGNhY2hlZC5ob3QgJiYgY2FjaGVkLmhvdC5fYWNjZXB0Q2FsbGJhY2tzLmxlbmd0aCkge1xuICAgIGNhY2hlZC5ob3QuX2FjY2VwdENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKGNiKSB7XG4gICAgICB2YXIgYXNzZXRzVG9BbHNvQWNjZXB0ID0gY2IoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJlbnRzKG1vZHVsZS5idW5kbGUucm9vdCwgaWQpO1xuICAgICAgfSk7XG4gICAgICBpZiAoYXNzZXRzVG9BbHNvQWNjZXB0ICYmIGFzc2V0c1RvQWNjZXB0Lmxlbmd0aCkge1xuICAgICAgICBhc3NldHNUb0FjY2VwdC5wdXNoLmFwcGx5KGFzc2V0c1RvQWNjZXB0LCBhc3NldHNUb0Fsc29BY2NlcHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGFjY2VwdGVkQXNzZXRzW2lkXSA9IHRydWU7XG59XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLyogZ2xvYmFsIHdpbmRvdyAqL1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsIGZ1bmN0aW9uICgpIHtcbiAgKHdpbmRvdy5jaHJvbWUgfHwgd2luZG93LmJyb3dzZXIpLnJ1bnRpbWUuc2VuZE1lc3NhZ2Uoe1xuICAgIF9fcGFyY2VsX2htcl9yZWxvYWRfXzogdHJ1ZVxuICB9KTtcbn0pOyJdLCJuYW1lcyI6W10sInZlcnNpb24iOjMsImZpbGUiOiJhdXRvcmVsb2FkLkhBU0hfUkVGX2YzNDRjMTU2NzU2Mjc3ZTc0NGFhY2Q4N2FmOWUwYWZhLmpzLm1hcCJ9