@lynx-js/react 0.111.0 → 0.111.1

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.
@@ -1,518 +1,415 @@
1
- "use strict";
2
- (() => {
3
- var __defProp = Object.defineProperty;
4
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
-
7
- // src/api/element.ts
8
- var _Element = class _Element {
9
- constructor(element) {
10
- // @ts-expect-error set in constructor
11
- __publicField(this, "element");
12
- Object.defineProperty(this, "element", {
13
- get() {
14
- return element;
1
+ (()=>{
2
+ "use strict";
3
+ function _define_property(obj, key, value) {
4
+ if (key in obj) Object.defineProperty(obj, key, {
5
+ value: value,
6
+ enumerable: true,
7
+ configurable: true,
8
+ writable: true
9
+ });
10
+ else obj[key] = value;
11
+ return obj;
12
+ }
13
+ class Element {
14
+ setAttribute(name, value) {
15
+ __SetAttribute(this.element, name, value);
16
+ this.flushElementTree();
15
17
  }
16
- });
17
- }
18
- setAttribute(name, value) {
19
- __SetAttribute(this.element, name, value);
20
- this.flushElementTree();
21
- }
22
- setStyleProperty(name, value) {
23
- __AddInlineStyle(this.element, name, value);
24
- this.flushElementTree();
25
- }
26
- setStyleProperties(styles) {
27
- for (const key in styles) {
28
- __AddInlineStyle(this.element, key, styles[key]);
29
- }
30
- this.flushElementTree();
31
- }
32
- getAttribute(attributeName) {
33
- return __GetAttributeByName(this.element, attributeName);
34
- }
35
- getAttributeNames() {
36
- return __GetAttributeNames(this.element);
37
- }
38
- querySelector(selector) {
39
- const ref = __QuerySelector(this.element, selector, {});
40
- return ref ? new _Element(ref) : null;
41
- }
42
- querySelectorAll(selector) {
43
- return __QuerySelectorAll(this.element, selector, {}).map((element) => {
44
- return new _Element(element);
45
- });
46
- }
47
- invoke(methodName, params) {
48
- return new Promise((resolve, reject) => {
49
- __InvokeUIMethod(
50
- this.element,
51
- methodName,
52
- params != null ? params : {},
53
- (res) => {
54
- if (res.code === 0) {
55
- resolve(res.data);
56
- } else {
57
- reject(new Error("UI method invoke: " + JSON.stringify(res)));
58
- }
59
- }
60
- );
61
- this.flushElementTree();
62
- });
63
- }
64
- flushElementTree() {
65
- if (_Element.willFlush) {
66
- return;
67
- }
68
- _Element.willFlush = true;
69
- void Promise.resolve().then(() => {
70
- _Element.willFlush = false;
71
- __FlushElementTree();
72
- });
73
- }
74
- };
75
- __publicField(_Element, "willFlush", false);
76
- var Element = _Element;
77
-
78
- // src/api/lepusQuerySelector.ts
79
- var _PageElement = class _PageElement {
80
- static get() {
81
- var _a;
82
- (_a = _PageElement.pageElement) != null ? _a : _PageElement.pageElement = __GetPageElement();
83
- return _PageElement.pageElement;
84
- }
85
- };
86
- __publicField(_PageElement, "pageElement");
87
- var PageElement = _PageElement;
88
- function querySelector(cssSelector) {
89
- const element = __QuerySelector(PageElement.get(), cssSelector, {});
90
- return element ? new Element(element) : null;
91
- }
92
- function querySelectorAll(cssSelector) {
93
- return __QuerySelectorAll(PageElement.get(), cssSelector, {}).map(
94
- (element) => {
95
- return new Element(element);
96
- }
97
- );
98
- }
99
-
100
- // src/utils/version.ts
101
- function isSdkVersionGt(major, minor) {
102
- var _a;
103
- const lynxSdkVersion = (_a = SystemInfo.lynxSdkVersion) != null ? _a : "1.0";
104
- const version = lynxSdkVersion.split(".");
105
- return Number(version[0]) > major || Number(version[0]) == major && Number(version[1]) > minor;
106
- }
107
-
108
- // src/api/lynxApi.ts
109
- function initApiEnv() {
110
- var _a;
111
- lynx.querySelector = querySelector;
112
- lynx.querySelectorAll = querySelectorAll;
113
- globalThis.setTimeout = lynx.setTimeout;
114
- globalThis.setInterval = lynx.setInterval;
115
- globalThis.clearTimeout = lynx.clearTimeout;
116
- globalThis.clearInterval = (_a = lynx.clearInterval) != null ? _a : lynx.clearTimeInterval;
117
- {
118
- const requestAnimationFrame = lynx.requestAnimationFrame;
119
- lynx.requestAnimationFrame = globalThis.requestAnimationFrame = (callback) => {
120
- if (!isSdkVersionGt(2, 15)) {
121
- throw new Error(
122
- "requestAnimationFrame in main thread script requires Lynx sdk version 2.16"
123
- );
18
+ setStyleProperty(name, value) {
19
+ __AddInlineStyle(this.element, name, value);
20
+ this.flushElementTree();
21
+ }
22
+ setStyleProperties(styles) {
23
+ for(const key in styles)__AddInlineStyle(this.element, key, styles[key]);
24
+ this.flushElementTree();
25
+ }
26
+ getAttribute(attributeName) {
27
+ return __GetAttributeByName(this.element, attributeName);
28
+ }
29
+ getAttributeNames() {
30
+ return __GetAttributeNames(this.element);
31
+ }
32
+ querySelector(selector) {
33
+ const ref = __QuerySelector(this.element, selector, {});
34
+ return ref ? new Element(ref) : null;
35
+ }
36
+ querySelectorAll(selector) {
37
+ return __QuerySelectorAll(this.element, selector, {}).map((element)=>new Element(element));
38
+ }
39
+ invoke(methodName, params) {
40
+ return new Promise((resolve, reject)=>{
41
+ __InvokeUIMethod(this.element, methodName, null != params ? params : {}, (res)=>{
42
+ if (0 === res.code) resolve(res.data);
43
+ else reject(new Error('UI method invoke: ' + JSON.stringify(res)));
44
+ });
45
+ this.flushElementTree();
46
+ });
47
+ }
48
+ flushElementTree() {
49
+ if (Element.willFlush) return;
50
+ Element.willFlush = true;
51
+ Promise.resolve().then(()=>{
52
+ Element.willFlush = false;
53
+ __FlushElementTree();
54
+ });
55
+ }
56
+ constructor(element){
57
+ _define_property(this, "element", void 0);
58
+ Object.defineProperty(this, 'element', {
59
+ get () {
60
+ return element;
61
+ }
62
+ });
124
63
  }
125
- return requestAnimationFrame(callback);
126
- };
127
64
  }
128
- globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame;
129
- }
130
-
131
- // src/utils/profile.ts
132
- function profile(sliceName, f) {
133
- if (true) {
134
- console.profile(sliceName);
135
- try {
136
- return f();
137
- } finally {
138
- console.profileEnd();
139
- }
140
- } else {
141
- return f();
142
- }
143
- }
144
-
145
- // src/workletRef.ts
146
- var impl;
147
- function initWorkletRef() {
148
- return impl = {
149
- _workletRefMap: {},
150
- /**
151
- * Map of worklet refs that are created during first screen rendering.
152
- * These refs are created with negative IDs and need to be hydrated
153
- * when the app starts. The map is cleared after hydration is complete
154
- * to free up memory.
155
- */
156
- _firstScreenWorkletRefMap: {},
157
- updateWorkletRef,
158
- updateWorkletRefInitValueChanges,
159
- clearFirstScreenWorkletRefMap
160
- };
161
- }
162
- var createWorkletRef = (id, value) => {
163
- return {
164
- current: value,
165
- _wvid: id
166
- };
167
- };
168
- var getFromWorkletRefMap = (refImpl) => {
169
- const id = refImpl._wvid;
170
- let value;
171
- if (id < 0) {
172
- value = impl._firstScreenWorkletRefMap[id];
173
- if (!value) {
174
- value = impl._firstScreenWorkletRefMap[id] = createWorkletRef(id, refImpl._initValue);
175
- }
176
- } else {
177
- value = impl._workletRefMap[id];
178
- }
179
- if (value === void 0) {
180
- throw new Error("Worklet: ref is not initialized: " + id);
181
- }
182
- return value;
183
- };
184
- function removeValueFromWorkletRefMap(id) {
185
- delete impl._workletRefMap[id];
186
- }
187
- function updateWorkletRef(handle, element) {
188
- getFromWorkletRefMap(handle).current = element ? new Element(element) : null;
189
- }
190
- function updateWorkletRefInitValueChanges(patch) {
191
- profile("updateWorkletRefInitValueChanges", () => {
192
- patch.forEach(([id, value]) => {
193
- if (!impl._workletRefMap[id]) {
194
- impl._workletRefMap[id] = createWorkletRef(id, value);
65
+ _define_property(Element, "willFlush", false);
66
+ function lepusQuerySelector_define_property(obj, key, value) {
67
+ if (key in obj) Object.defineProperty(obj, key, {
68
+ value: value,
69
+ enumerable: true,
70
+ configurable: true,
71
+ writable: true
72
+ });
73
+ else obj[key] = value;
74
+ return obj;
75
+ }
76
+ class PageElement {
77
+ static get() {
78
+ var _PageElement;
79
+ null != (_PageElement = PageElement).pageElement || (_PageElement.pageElement = __GetPageElement());
80
+ return PageElement.pageElement;
195
81
  }
196
- });
197
- });
198
- }
199
- function clearFirstScreenWorkletRefMap() {
200
- impl._firstScreenWorkletRefMap = {};
201
- }
202
-
203
- // src/listeners.ts
204
- function initEventListeners() {
205
- const jsContext = lynx.getJSContext();
206
- jsContext.addEventListener(
207
- "Lynx.Worklet.runWorkletCtx" /* runWorkletCtx */,
208
- (event) => {
209
- const data = JSON.parse(event.data);
210
- const returnValue = runWorklet(data.worklet, data.params);
211
- jsContext.dispatchEvent({
212
- type: "Lynx.Worklet.FunctionCallRet" /* FunctionCallRet */,
213
- data: JSON.stringify({
214
- resolveId: data.resolveId,
215
- returnValue
216
- })
82
+ }
83
+ lepusQuerySelector_define_property(PageElement, "pageElement", void 0);
84
+ function querySelector(cssSelector) {
85
+ const element = __QuerySelector(PageElement.get(), cssSelector, {});
86
+ return element ? new Element(element) : null;
87
+ }
88
+ function querySelectorAll(cssSelector) {
89
+ return __QuerySelectorAll(PageElement.get(), cssSelector, {}).map((element)=>new Element(element));
90
+ }
91
+ function isSdkVersionGt(major, minor) {
92
+ var _SystemInfo_lynxSdkVersion;
93
+ const lynxSdkVersion = null != (_SystemInfo_lynxSdkVersion = SystemInfo.lynxSdkVersion) ? _SystemInfo_lynxSdkVersion : '1.0';
94
+ const version = lynxSdkVersion.split('.');
95
+ return Number(version[0]) > major || Number(version[0]) == major && Number(version[1]) > minor;
96
+ }
97
+ function initApiEnv() {
98
+ lynx.querySelector = querySelector;
99
+ lynx.querySelectorAll = querySelectorAll;
100
+ globalThis.setTimeout = lynx.setTimeout;
101
+ globalThis.setInterval = lynx.setInterval;
102
+ globalThis.clearTimeout = lynx.clearTimeout;
103
+ var _lynx_clearInterval;
104
+ globalThis.clearInterval = null != (_lynx_clearInterval = lynx.clearInterval) ? _lynx_clearInterval : lynx.clearTimeInterval;
105
+ {
106
+ const requestAnimationFrame = lynx.requestAnimationFrame;
107
+ lynx.requestAnimationFrame = globalThis.requestAnimationFrame = (callback)=>{
108
+ if (!isSdkVersionGt(2, 15)) throw new Error("requestAnimationFrame in main thread script requires Lynx sdk version 2.16");
109
+ return requestAnimationFrame(callback);
110
+ };
111
+ }
112
+ globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame;
113
+ }
114
+ var events_WorkletEvents = /*#__PURE__*/ function(WorkletEvents) {
115
+ WorkletEvents["runWorkletCtx"] = "Lynx.Worklet.runWorkletCtx";
116
+ WorkletEvents["runOnBackground"] = "Lynx.Worklet.runOnBackground";
117
+ WorkletEvents["FunctionCallRet"] = "Lynx.Worklet.FunctionCallRet";
118
+ WorkletEvents["releaseBackgroundWorkletCtx"] = "Lynx.Worklet.releaseBackgroundWorkletCtx";
119
+ WorkletEvents["releaseWorkletRef"] = "Lynx.Worklet.releaseWorkletRef";
120
+ return WorkletEvents;
121
+ }(events_WorkletEvents || {});
122
+ function profile(sliceName, f) {
123
+ console.profile(sliceName);
124
+ try {
125
+ return f();
126
+ } finally{
127
+ console.profileEnd();
128
+ }
129
+ }
130
+ let impl;
131
+ function initWorkletRef() {
132
+ return impl = {
133
+ _workletRefMap: {},
134
+ _firstScreenWorkletRefMap: {},
135
+ updateWorkletRef,
136
+ updateWorkletRefInitValueChanges,
137
+ clearFirstScreenWorkletRefMap
138
+ };
139
+ }
140
+ const createWorkletRef = (id, value)=>({
141
+ current: value,
142
+ _wvid: id
217
143
  });
218
- }
219
- );
220
- jsContext.addEventListener(
221
- "Lynx.Worklet.releaseWorkletRef" /* releaseWorkletRef */,
222
- (event) => {
223
- removeValueFromWorkletRefMap(event.data.id);
224
- }
225
- );
226
- }
227
-
228
- // src/delayRunOnBackground.ts
229
- var impl2;
230
- function initRunOnBackgroundDelay() {
231
- return impl2 = {
232
- delayedBackgroundFunctionArray: [],
233
- delayRunOnBackground,
234
- runDelayedBackgroundFunctions
144
+ const getFromWorkletRefMap = (refImpl)=>{
145
+ const id = refImpl._wvid;
146
+ let value;
147
+ if (id < 0) {
148
+ value = impl._firstScreenWorkletRefMap[id];
149
+ if (!value) value = impl._firstScreenWorkletRefMap[id] = createWorkletRef(id, refImpl._initValue);
150
+ } else value = impl._workletRefMap[id];
151
+ if (void 0 === value) throw new Error('Worklet: ref is not initialized: ' + id);
152
+ return value;
235
153
  };
236
- }
237
- function delayRunOnBackground(fnObj, task) {
238
- var _a;
239
- impl2.delayedBackgroundFunctionArray.push({ task });
240
- const delayIndices = (_a = fnObj._delayIndices) != null ? _a : fnObj._delayIndices = [];
241
- delayIndices.push(impl2.delayedBackgroundFunctionArray.length - 1);
242
- }
243
- function runDelayedBackgroundFunctions() {
244
- for (const details of impl2.delayedBackgroundFunctionArray) {
245
- if (details.jsFnHandle) {
246
- details.task(details.jsFnHandle._jsFnId, details.jsFnHandle._execId);
247
- }
248
- }
249
- impl2.delayedBackgroundFunctionArray.length = 0;
250
- }
251
-
252
- // src/delayWorkletEvent.ts
253
- var impl3;
254
- function initEventDelay() {
255
- return impl3 = {
256
- _delayedWorkletParamsMap: /* @__PURE__ */ new Map(),
257
- runDelayedWorklet,
258
- clearDelayedWorklets
259
- };
260
- }
261
- function delayExecUntilJsReady(hash, params) {
262
- profile("delayExecUntilJsReady: " + hash, () => {
263
- const map = impl3._delayedWorkletParamsMap;
264
- const paramVec = map.get(hash);
265
- if (paramVec) {
266
- paramVec.push(params);
267
- } else {
268
- map.set(hash, [params]);
269
- }
270
- });
271
- }
272
- function runDelayedWorklet(worklet, element) {
273
- profile("commitDelayedWorklet", () => {
274
- const paramsVec = impl3._delayedWorkletParamsMap.get(
275
- worklet._wkltId
276
- );
277
- if (paramsVec === void 0) {
278
- return;
279
- }
280
- const leftParamsVec = [];
281
- paramsVec.forEach((params) => {
282
- var _a;
283
- const firstParam = params[0];
284
- if (((_a = firstParam == null ? void 0 : firstParam.currentTarget) == null ? void 0 : _a.elementRefptr) === element) {
285
- setTimeout(() => {
286
- profile("runDelayedWorklet", () => {
287
- runWorklet(worklet, params);
154
+ function removeValueFromWorkletRefMap(id) {
155
+ delete impl._workletRefMap[id];
156
+ }
157
+ function updateWorkletRef(handle, element) {
158
+ getFromWorkletRefMap(handle).current = element ? new Element(element) : null;
159
+ }
160
+ function updateWorkletRefInitValueChanges(patch) {
161
+ profile('updateWorkletRefInitValueChanges', ()=>{
162
+ patch.forEach(([id, value])=>{
163
+ if (!impl._workletRefMap[id]) impl._workletRefMap[id] = createWorkletRef(id, value);
288
164
  });
289
- }, 0);
290
- } else {
291
- leftParamsVec.push(params);
292
- }
293
- });
294
- impl3._delayedWorkletParamsMap.set(
295
- worklet._wkltId,
296
- leftParamsVec
297
- );
298
- });
299
- }
300
- function clearDelayedWorklets() {
301
- impl3._delayedWorkletParamsMap.clear();
302
- }
303
-
304
- // src/hydrate.ts
305
- function hydrateCtx(ctx, firstScreenCtx) {
306
- profile("hydrateCtx", () => {
307
- hydrateCtxImpl(ctx, firstScreenCtx, ctx._execId);
308
- });
309
- }
310
- function hydrateCtxImpl(ctx, firstScreenCtx, execId) {
311
- if (!ctx || typeof ctx !== "object" || !firstScreenCtx || typeof firstScreenCtx !== "object") return;
312
- const ctxObj = ctx;
313
- const firstScreenCtxObj = firstScreenCtx;
314
- if (ctxObj["_wkltId"] && ctxObj["_wkltId"] !== firstScreenCtxObj["_wkltId"]) {
315
- return;
316
- }
317
- for (const key in ctx) {
318
- if (key === "_wvid") {
319
- hydrateMainThreadRef(ctxObj[key], firstScreenCtxObj);
320
- } else if (key === "_jsFn") {
321
- hydrateDelayRunOnBackgroundTasks(
322
- ctxObj[key],
323
- firstScreenCtxObj[key],
324
- execId
325
- );
326
- } else {
327
- const firstScreenValue = typeof firstScreenCtxObj[key] === "function" ? firstScreenCtxObj[key].ctx : firstScreenCtxObj[key];
328
- hydrateCtxImpl(ctxObj[key], firstScreenValue, execId);
329
- }
330
- }
331
- }
332
- function hydrateMainThreadRef(refId, value) {
333
- if ("_initValue" in value) {
334
- return;
335
- }
336
- const ref = lynxWorkletImpl._refImpl._workletRefMap[refId];
337
- ref.current = value.current;
338
- }
339
- function hydrateDelayRunOnBackgroundTasks(fnObjs, firstScreenFnObjs, execId) {
340
- for (const fnName in fnObjs) {
341
- const fnObj = fnObjs[fnName];
342
- const firstScreenFnObj = firstScreenFnObjs[fnName];
343
- if (!(firstScreenFnObj == null ? void 0 : firstScreenFnObj._delayIndices)) {
344
- continue;
345
- }
346
- for (const index of firstScreenFnObj._delayIndices) {
347
- const details = lynxWorkletImpl._runOnBackgroundDelayImpl.delayedBackgroundFunctionArray[index];
348
- fnObj._execId = execId;
349
- details.jsFnHandle = fnObj;
350
- }
351
- }
352
- }
353
-
354
- // src/jsFunctionLifecycle.ts
355
- var JsFunctionLifecycleManager = class {
356
- constructor() {
357
- __publicField(this, "execIdRefCount", /* @__PURE__ */ new Map());
358
- __publicField(this, "execIdSetToFire", /* @__PURE__ */ new Set());
359
- __publicField(this, "willFire", false);
360
- __publicField(this, "registry");
361
- this.registry = new FinalizationRegistry(this.removeRef.bind(this));
362
- }
363
- addRef(execId, objToRef) {
364
- var _a;
365
- this.execIdRefCount.set(
366
- execId,
367
- ((_a = this.execIdRefCount.get(execId)) != null ? _a : 0) + 1
368
- );
369
- this.registry.register(objToRef, execId);
370
- }
371
- removeRef(execId) {
372
- const rc = this.execIdRefCount.get(execId);
373
- if (rc > 1) {
374
- this.execIdRefCount.set(execId, rc - 1);
375
- return;
376
- }
377
- this.execIdRefCount.delete(execId);
378
- this.execIdSetToFire.add(execId);
379
- if (!this.willFire) {
380
- this.willFire = true;
381
- void Promise.resolve().then(() => {
382
- this.fire();
383
165
  });
384
- }
385
166
  }
386
- fire() {
387
- profile("JsFunctionLifecycleManager.fire", () => {
388
- lynx.getJSContext().dispatchEvent({
389
- type: "Lynx.Worklet.releaseBackgroundWorkletCtx" /* releaseBackgroundWorkletCtx */,
390
- data: Array.from(this.execIdSetToFire)
167
+ function clearFirstScreenWorkletRefMap() {
168
+ impl._firstScreenWorkletRefMap = {};
169
+ }
170
+ function initEventListeners() {
171
+ const jsContext = lynx.getJSContext();
172
+ jsContext.addEventListener(events_WorkletEvents.runWorkletCtx, (event)=>{
173
+ const data = JSON.parse(event.data);
174
+ const returnValue = runWorklet(data.worklet, data.params);
175
+ jsContext.dispatchEvent({
176
+ type: events_WorkletEvents.FunctionCallRet,
177
+ data: JSON.stringify({
178
+ resolveId: data.resolveId,
179
+ returnValue
180
+ })
181
+ });
391
182
  });
392
- this.execIdSetToFire.clear();
393
- this.willFire = false;
394
- });
395
- }
396
- };
397
- function isRunOnBackgroundEnabled() {
398
- return isSdkVersionGt(2, 15);
399
- }
400
-
401
- // src/workletRuntime.ts
402
- function initWorklet() {
403
- globalThis.lynxWorkletImpl = {
404
- _workletMap: {},
405
- _refImpl: initWorkletRef(),
406
- _runOnBackgroundDelayImpl: initRunOnBackgroundDelay(),
407
- _hydrateCtx: hydrateCtx,
408
- _eventDelayImpl: initEventDelay()
183
+ jsContext.addEventListener(events_WorkletEvents.releaseWorkletRef, (event)=>{
184
+ removeValueFromWorkletRefMap(event.data.id);
185
+ });
186
+ }
187
+ let delayRunOnBackground_impl;
188
+ function initRunOnBackgroundDelay() {
189
+ return delayRunOnBackground_impl = {
190
+ delayedBackgroundFunctionArray: [],
191
+ delayRunOnBackground,
192
+ runDelayedBackgroundFunctions
193
+ };
194
+ }
195
+ function delayRunOnBackground(fnObj, task) {
196
+ var _fnObj;
197
+ delayRunOnBackground_impl.delayedBackgroundFunctionArray.push({
198
+ task
199
+ });
200
+ var __delayIndices;
201
+ const delayIndices = null != (__delayIndices = (_fnObj = fnObj)._delayIndices) ? __delayIndices : _fnObj._delayIndices = [];
202
+ delayIndices.push(delayRunOnBackground_impl.delayedBackgroundFunctionArray.length - 1);
203
+ }
204
+ function runDelayedBackgroundFunctions() {
205
+ for (const details of delayRunOnBackground_impl.delayedBackgroundFunctionArray)if (details.jsFnHandle) details.task(details.jsFnHandle._jsFnId, details.jsFnHandle._execId);
206
+ delayRunOnBackground_impl.delayedBackgroundFunctionArray.length = 0;
207
+ }
208
+ let delayWorkletEvent_impl;
209
+ function initEventDelay() {
210
+ return delayWorkletEvent_impl = {
211
+ _delayedWorkletParamsMap: new Map(),
212
+ runDelayedWorklet,
213
+ clearDelayedWorklets
214
+ };
215
+ }
216
+ function delayExecUntilJsReady(hash, params) {
217
+ profile('delayExecUntilJsReady: ' + hash, ()=>{
218
+ const map = delayWorkletEvent_impl._delayedWorkletParamsMap;
219
+ const paramVec = map.get(hash);
220
+ if (paramVec) paramVec.push(params);
221
+ else map.set(hash, [
222
+ params
223
+ ]);
224
+ });
225
+ }
226
+ function runDelayedWorklet(worklet, element) {
227
+ profile('commitDelayedWorklet', ()=>{
228
+ const paramsVec = delayWorkletEvent_impl._delayedWorkletParamsMap.get(worklet._wkltId);
229
+ if (void 0 === paramsVec) return;
230
+ const leftParamsVec = [];
231
+ paramsVec.forEach((params)=>{
232
+ var _firstParam_currentTarget;
233
+ const firstParam = params[0];
234
+ if ((null == firstParam ? void 0 : null == (_firstParam_currentTarget = firstParam.currentTarget) ? void 0 : _firstParam_currentTarget.elementRefptr) === element) setTimeout(()=>{
235
+ profile('runDelayedWorklet', ()=>{
236
+ runWorklet(worklet, params);
237
+ });
238
+ }, 0);
239
+ else leftParamsVec.push(params);
240
+ });
241
+ delayWorkletEvent_impl._delayedWorkletParamsMap.set(worklet._wkltId, leftParamsVec);
242
+ });
243
+ }
244
+ function clearDelayedWorklets() {
245
+ delayWorkletEvent_impl._delayedWorkletParamsMap.clear();
246
+ }
247
+ function hydrateCtx(ctx, firstScreenCtx) {
248
+ profile('hydrateCtx', ()=>{
249
+ hydrateCtxImpl(ctx, firstScreenCtx, ctx._execId);
250
+ });
251
+ }
252
+ function hydrateCtxImpl(ctx, firstScreenCtx, execId) {
253
+ if (!ctx || 'object' != typeof ctx || !firstScreenCtx || 'object' != typeof firstScreenCtx) return;
254
+ const ctxObj = ctx;
255
+ const firstScreenCtxObj = firstScreenCtx;
256
+ if (ctxObj['_wkltId'] && ctxObj['_wkltId'] !== firstScreenCtxObj['_wkltId']) return;
257
+ for(const key in ctx)if ('_wvid' === key) hydrateMainThreadRef(ctxObj[key], firstScreenCtxObj);
258
+ else if ('_jsFn' === key) hydrateDelayRunOnBackgroundTasks(ctxObj[key], firstScreenCtxObj[key], execId);
259
+ else {
260
+ const firstScreenValue = 'function' == typeof firstScreenCtxObj[key] ? firstScreenCtxObj[key].ctx : firstScreenCtxObj[key];
261
+ hydrateCtxImpl(ctxObj[key], firstScreenValue, execId);
262
+ }
263
+ }
264
+ function hydrateMainThreadRef(refId, value) {
265
+ if ('_initValue' in value) return;
266
+ const ref = lynxWorkletImpl._refImpl._workletRefMap[refId];
267
+ ref.current = value.current;
268
+ }
269
+ function hydrateDelayRunOnBackgroundTasks(fnObjs, firstScreenFnObjs, execId) {
270
+ for(const fnName in fnObjs){
271
+ const fnObj = fnObjs[fnName];
272
+ const firstScreenFnObj = firstScreenFnObjs[fnName];
273
+ if (null == firstScreenFnObj ? void 0 : firstScreenFnObj._delayIndices) for (const index of firstScreenFnObj._delayIndices){
274
+ const details = lynxWorkletImpl._runOnBackgroundDelayImpl.delayedBackgroundFunctionArray[index];
275
+ fnObj._execId = execId;
276
+ details.jsFnHandle = fnObj;
277
+ }
278
+ }
279
+ }
280
+ function jsFunctionLifecycle_define_property(obj, key, value) {
281
+ if (key in obj) Object.defineProperty(obj, key, {
282
+ value: value,
283
+ enumerable: true,
284
+ configurable: true,
285
+ writable: true
286
+ });
287
+ else obj[key] = value;
288
+ return obj;
289
+ }
290
+ class JsFunctionLifecycleManager {
291
+ addRef(execId, objToRef) {
292
+ var _this_execIdRefCount_get;
293
+ this.execIdRefCount.set(execId, (null != (_this_execIdRefCount_get = this.execIdRefCount.get(execId)) ? _this_execIdRefCount_get : 0) + 1);
294
+ this.registry.register(objToRef, execId);
295
+ }
296
+ removeRef(execId) {
297
+ const rc = this.execIdRefCount.get(execId);
298
+ if (rc > 1) return void this.execIdRefCount.set(execId, rc - 1);
299
+ this.execIdRefCount.delete(execId);
300
+ this.execIdSetToFire.add(execId);
301
+ if (!this.willFire) {
302
+ this.willFire = true;
303
+ Promise.resolve().then(()=>{
304
+ this.fire();
305
+ });
306
+ }
307
+ }
308
+ fire() {
309
+ profile('JsFunctionLifecycleManager.fire', ()=>{
310
+ lynx.getJSContext().dispatchEvent({
311
+ type: events_WorkletEvents.releaseBackgroundWorkletCtx,
312
+ data: Array.from(this.execIdSetToFire)
313
+ });
314
+ this.execIdSetToFire.clear();
315
+ this.willFire = false;
316
+ });
317
+ }
318
+ constructor(){
319
+ jsFunctionLifecycle_define_property(this, "execIdRefCount", new Map());
320
+ jsFunctionLifecycle_define_property(this, "execIdSetToFire", new Set());
321
+ jsFunctionLifecycle_define_property(this, "willFire", false);
322
+ jsFunctionLifecycle_define_property(this, "registry", void 0);
323
+ this.registry = new FinalizationRegistry(this.removeRef.bind(this));
324
+ }
325
+ }
326
+ function isRunOnBackgroundEnabled() {
327
+ return isSdkVersionGt(2, 15);
328
+ }
329
+ function initWorklet() {
330
+ globalThis.lynxWorkletImpl = {
331
+ _workletMap: {},
332
+ _refImpl: initWorkletRef(),
333
+ _runOnBackgroundDelayImpl: initRunOnBackgroundDelay(),
334
+ _hydrateCtx: hydrateCtx,
335
+ _eventDelayImpl: initEventDelay()
336
+ };
337
+ if (isRunOnBackgroundEnabled()) globalThis.lynxWorkletImpl._jsFunctionLifecycleManager = new JsFunctionLifecycleManager();
338
+ globalThis.registerWorklet = registerWorklet;
339
+ globalThis.registerWorkletInternal = registerWorklet;
340
+ globalThis.runWorklet = workletRuntime_runWorklet;
341
+ }
342
+ function registerWorklet(_type, id, worklet) {
343
+ lynxWorkletImpl._workletMap[id] = worklet;
344
+ }
345
+ function workletRuntime_runWorklet(ctx, params) {
346
+ if (!validateWorklet(ctx)) return void console.warn('Worklet: Invalid worklet object: ' + JSON.stringify(ctx));
347
+ if ('_lepusWorkletHash' in ctx) return void delayExecUntilJsReady(ctx._lepusWorkletHash, params);
348
+ return runWorkletImpl(ctx, params);
349
+ }
350
+ function runWorkletImpl(ctx, params) {
351
+ const worklet = profile('transformWorkletCtx ' + ctx._wkltId, ()=>transformWorklet(ctx, true));
352
+ const params_ = profile('transformWorkletParams', ()=>transformWorklet(params || [], false));
353
+ return profile('runWorklet', ()=>worklet(...params_));
354
+ }
355
+ function validateWorklet(ctx) {
356
+ return 'object' == typeof ctx && null !== ctx && ('_wkltId' in ctx || '_lepusWorkletHash' in ctx);
357
+ }
358
+ const workletCache = new WeakMap();
359
+ function transformWorklet(ctx, isWorklet) {
360
+ if ('object' != typeof ctx || null === ctx) return ctx;
361
+ if (isWorklet) {
362
+ const res = workletCache.get(ctx);
363
+ if (res) return res;
364
+ }
365
+ const worklet = {
366
+ main: ctx
367
+ };
368
+ transformWorkletInner(worklet, 0, ctx);
369
+ if (isWorklet) workletCache.set(ctx, worklet.main);
370
+ return worklet.main;
371
+ }
372
+ const transformWorkletInner = (value, depth, ctx)=>{
373
+ const limit = 1000;
374
+ if (++depth >= limit) throw new Error('Depth of value exceeds limit of ' + limit + '.');
375
+ if ('object' != typeof value || null === value) return;
376
+ const obj = value;
377
+ for(const key in obj){
378
+ const subObj = obj[key];
379
+ if ('object' != typeof subObj || null === subObj) continue;
380
+ if ('elementRefptr' in subObj) {
381
+ obj[key] = new Element(subObj['elementRefptr']);
382
+ continue;
383
+ }
384
+ if (subObj instanceof Element) continue;
385
+ transformWorkletInner(subObj, depth, ctx);
386
+ const isWorkletRef = '_wvid' in subObj;
387
+ if (isWorkletRef) {
388
+ obj[key] = getFromWorkletRefMap(subObj);
389
+ continue;
390
+ }
391
+ const isWorklet = '_wkltId' in subObj;
392
+ if (isWorklet) {
393
+ obj[key] = lynxWorkletImpl._workletMap[subObj._wkltId].bind({
394
+ ...subObj
395
+ });
396
+ obj[key].ctx = subObj;
397
+ continue;
398
+ }
399
+ const isJsFn = '_jsFnId' in subObj;
400
+ if (isJsFn) {
401
+ var _lynxWorkletImpl__jsFunctionLifecycleManager;
402
+ subObj['_execId'] = ctx._execId;
403
+ null == (_lynxWorkletImpl__jsFunctionLifecycleManager = lynxWorkletImpl._jsFunctionLifecycleManager) || _lynxWorkletImpl__jsFunctionLifecycleManager.addRef(ctx._execId, subObj);
404
+ continue;
405
+ }
406
+ }
409
407
  };
410
- if (isRunOnBackgroundEnabled()) {
411
- globalThis.lynxWorkletImpl._jsFunctionLifecycleManager = new JsFunctionLifecycleManager();
412
- }
413
- globalThis.registerWorklet = registerWorklet;
414
- globalThis.registerWorkletInternal = registerWorklet;
415
- globalThis.runWorklet = runWorklet2;
416
- }
417
- function registerWorklet(_type, id, worklet) {
418
- lynxWorkletImpl._workletMap[id] = worklet;
419
- }
420
- function runWorklet2(ctx, params) {
421
- if (!validateWorklet(ctx)) {
422
- console.warn("Worklet: Invalid worklet object: " + JSON.stringify(ctx));
423
- return;
424
- }
425
- if ("_lepusWorkletHash" in ctx) {
426
- delayExecUntilJsReady(ctx._lepusWorkletHash, params);
427
- return;
428
- }
429
- return runWorkletImpl(ctx, params);
430
- }
431
- function runWorkletImpl(ctx, params) {
432
- const worklet = profile(
433
- "transformWorkletCtx " + ctx._wkltId,
434
- () => transformWorklet(ctx, true)
435
- );
436
- const params_ = profile(
437
- "transformWorkletParams",
438
- () => transformWorklet(params || [], false)
439
- );
440
- return profile("runWorklet", () => worklet(...params_));
441
- }
442
- function validateWorklet(ctx) {
443
- return typeof ctx === "object" && ctx !== null && ("_wkltId" in ctx || "_lepusWorkletHash" in ctx);
444
- }
445
- var workletCache = /* @__PURE__ */ new WeakMap();
446
- function transformWorklet(ctx, isWorklet) {
447
- if (typeof ctx !== "object" || ctx === null) {
448
- return ctx;
449
- }
450
- if (isWorklet) {
451
- const res = workletCache.get(ctx);
452
- if (res) {
453
- return res;
454
- }
455
- }
456
- const worklet = { main: ctx };
457
- transformWorkletInner(worklet, 0, ctx);
458
- if (isWorklet) {
459
- workletCache.set(ctx, worklet.main);
460
- }
461
- return worklet.main;
462
- }
463
- var transformWorkletInner = (value, depth, ctx) => {
464
- var _a;
465
- const limit = 1e3;
466
- if (++depth >= limit) {
467
- throw new Error("Depth of value exceeds limit of " + limit + ".");
468
- }
469
- if (typeof value !== "object" || value === null) {
470
- return;
471
- }
472
- const obj = value;
473
- for (const key in obj) {
474
- const subObj = obj[key];
475
- if (typeof subObj !== "object" || subObj === null) {
476
- continue;
477
- }
478
- const isEventTarget = "elementRefptr" in subObj;
479
- if (!isEventTarget) {
480
- transformWorkletInner(subObj, depth, ctx);
481
- }
482
- if (isEventTarget) {
483
- obj[key] = new Element(subObj["elementRefptr"]);
484
- continue;
485
- }
486
- const isWorkletRef = "_wvid" in subObj;
487
- if (isWorkletRef) {
488
- obj[key] = getFromWorkletRefMap(
489
- subObj
490
- );
491
- continue;
492
- }
493
- const isWorklet = "_wkltId" in subObj;
494
- if (isWorklet) {
495
- obj[key] = lynxWorkletImpl._workletMap[subObj._wkltId].bind({ ...subObj });
496
- obj[key].ctx = subObj;
497
- continue;
498
- }
499
- const isJsFn = "_jsFnId" in subObj;
500
- if (isJsFn) {
501
- subObj["_execId"] = ctx._execId;
502
- (_a = lynxWorkletImpl._jsFunctionLifecycleManager) == null ? void 0 : _a.addRef(
503
- ctx._execId,
504
- subObj
505
- );
506
- continue;
507
- }
508
- }
509
- };
510
-
511
- // src/index.ts
512
- if (globalThis.lynxWorkletImpl === void 0) {
513
- initWorklet();
514
- initApiEnv();
515
- initEventListeners();
516
- }
408
+ if (void 0 === globalThis.lynxWorkletImpl) {
409
+ initWorklet();
410
+ initApiEnv();
411
+ initEventListeners();
412
+ }
517
413
  })();
518
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2FwaS9lbGVtZW50LnRzIiwgIi4uL3NyYy9hcGkvbGVwdXNRdWVyeVNlbGVjdG9yLnRzIiwgIi4uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwgIi4uL3NyYy9hcGkvbHlueEFwaS50cyIsICIuLi9zcmMvdXRpbHMvcHJvZmlsZS50cyIsICIuLi9zcmMvd29ya2xldFJlZi50cyIsICIuLi9zcmMvbGlzdGVuZXJzLnRzIiwgIi4uL3NyYy9kZWxheVJ1bk9uQmFja2dyb3VuZC50cyIsICIuLi9zcmMvZGVsYXlXb3JrbGV0RXZlbnQudHMiLCAiLi4vc3JjL2h5ZHJhdGUudHMiLCAiLi4vc3JjL2pzRnVuY3Rpb25MaWZlY3ljbGUudHMiLCAiLi4vc3JjL3dvcmtsZXRSdW50aW1lLnRzIiwgIi4uL3NyYy9pbmRleC50cyJdLAogICJzb3VyY2VSb290IjogIi9ob21lL3J1bm5lci93b3JrL2x5bngtc3RhY2svbHlueC1zdGFjay9wYWNrYWdlcy9yZWFjdC93b3JrbGV0LXJ1bnRpbWUvc3JjIiwKICAic291cmNlc0NvbnRlbnQiOiBbIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgY2xhc3MgRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIHdpbGxGbHVzaCA9IGZhbHNlO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Igc2V0IGluIGNvbnN0cnVjdG9yXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudDogRWxlbWVudE5vZGU7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudE5vZGUpIHtcbiAgICAvLyBJbiBMeW54IHZlcnNpb25zIHByaW9yIHRvIGFuZCBpbmNsdWRpbmcgMi4xNSxcbiAgICAvLyBhIGNyYXNoIG9jY3VycyB3aGVuIHByaW50aW5nIG9yIHRyYW5zZmVycmluZyByZWZDb3VudGVkIGFjcm9zcyB0aHJlYWRzLlxuICAgIC8vIEJ5cGFzcyB0aGlzIHByb2JsZW0gYnkgaGlkaW5nIHRoZSBlbGVtZW50IG9iamVjdC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VsZW1lbnQnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIF9fU2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZmx1c2hFbGVtZW50VHJlZSgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0eWxlUHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgX19BZGRJbmxpbmVTdHlsZSh0aGlzLmVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdHlsZVByb3BlcnRpZXMoc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICBfX0FkZElubGluZVN0eWxlKHRoaXMuZWxlbWVudCwga2V5LCBzdHlsZXNba2V5XSEpO1xuICAgIH1cbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9fR2V0QXR0cmlidXRlQnlOYW1lKHRoaXMuZWxlbWVudCwgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0cmlidXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBfX0dldEF0dHJpYnV0ZU5hbWVzKHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICBwdWJsaWMgcXVlcnlTZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHJlZiA9IF9fUXVlcnlTZWxlY3Rvcih0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSk7XG4gICAgcmV0dXJuIHJlZiA/IG5ldyBFbGVtZW50KHJlZikgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbCh0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSkubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW52b2tlKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9fSW52b2tlVUlNZXRob2QoXG4gICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGFyYW1zID8/IHt9LFxuICAgICAgICAocmVzOiB7IGNvZGU6IG51bWJlcjsgZGF0YTogdW5rbm93biB9KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVUkgbWV0aG9kIGludm9rZTogJyArIEpTT04uc3RyaW5naWZ5KHJlcykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5mbHVzaEVsZW1lbnRUcmVlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoRWxlbWVudFRyZWUoKSB7XG4gICAgaWYgKEVsZW1lbnQud2lsbEZsdXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEVsZW1lbnQud2lsbEZsdXNoID0gdHJ1ZTtcbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgRWxlbWVudC53aWxsRmx1c2ggPSBmYWxzZTtcbiAgICAgIF9fRmx1c2hFbGVtZW50VHJlZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2VsZW1lbnQuanMnO1xuXG5jbGFzcyBQYWdlRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIHBhZ2VFbGVtZW50OiBFbGVtZW50Tm9kZSB8IHVuZGVmaW5lZDtcblxuICBzdGF0aWMgZ2V0KCkge1xuICAgIFBhZ2VFbGVtZW50LnBhZ2VFbGVtZW50ID8/PSBfX0dldFBhZ2VFbGVtZW50KCk7XG4gICAgcmV0dXJuIFBhZ2VFbGVtZW50LnBhZ2VFbGVtZW50O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yKGNzc1NlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50IHwgbnVsbCB7XG4gIGNvbnN0IGVsZW1lbnQgPSBfX1F1ZXJ5U2VsZWN0b3IoUGFnZUVsZW1lbnQuZ2V0KCksIGNzc1NlbGVjdG9yLCB7fSk7XG4gIHJldHVybiBlbGVtZW50ID8gbmV3IEVsZW1lbnQoZWxlbWVudCkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckFsbChjc3NTZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudFtdIHtcbiAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbChQYWdlRWxlbWVudC5nZXQoKSwgY3NzU2VsZWN0b3IsIHt9KS5tYXAoXG4gICAgKGVsZW1lbnQpID0+IHtcbiAgICAgIHJldHVybiBuZXcgRWxlbWVudChlbGVtZW50KTtcbiAgICB9LFxuICApO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgZnVuY3Rpb24gaXNTZGtWZXJzaW9uR3QobWFqb3I6IG51bWJlciwgbWlub3I6IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBseW54U2RrVmVyc2lvbjogc3RyaW5nID0gU3lzdGVtSW5mby5seW54U2RrVmVyc2lvbiA/PyAnMS4wJztcbiAgY29uc3QgdmVyc2lvbiA9IGx5bnhTZGtWZXJzaW9uLnNwbGl0KCcuJyk7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyKHZlcnNpb25bMF0pID4gbWFqb3JcbiAgICB8fCAoTnVtYmVyKHZlcnNpb25bMF0pID09IG1ham9yICYmIE51bWJlcih2ZXJzaW9uWzFdKSA+IG1pbm9yKVxuICApO1xufVxuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBxdWVyeVNlbGVjdG9yLCBxdWVyeVNlbGVjdG9yQWxsIH0gZnJvbSAnLi9sZXB1c1F1ZXJ5U2VsZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNTZGtWZXJzaW9uR3QgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuZnVuY3Rpb24gaW5pdEFwaUVudigpOiB2b2lkIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGx5bngucXVlcnlTZWxlY3RvciA9IHF1ZXJ5U2VsZWN0b3I7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBseW54LnF1ZXJ5U2VsZWN0b3JBbGwgPSBxdWVyeVNlbGVjdG9yQWxsO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0ID0gbHlueC5zZXRUaW1lb3V0IGFzIChjYjogKCkgPT4gdm9pZCwgdGltZW91dDogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBnbG9iYWxUaGlzLnNldEludGVydmFsID0gbHlueC5zZXRJbnRlcnZhbCBhcyAoY2I6ICgpID0+IHZvaWQsIHRpbWVvdXQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQgPSBseW54LmNsZWFyVGltZW91dCBhcyAodGltZW91dDogbnVtYmVyKSA9PiB2b2lkO1xuICAvLyBJbiBseW54IDIuMTQgYGNsZWFySW50ZXJ2YWxgIGlzIG1pc3Rha2VubHkgc3BlbGxlZCBhcyBgY2xlYXJUaW1lSW50ZXJ2YWxgLiBUaGlzIGlzIGZpeGVkIGluIGx5bnggMi4xNS5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2xlYXJJbnRlcnZhbCA9IChseW54LmNsZWFySW50ZXJ2YWwgPz8gbHlueC5jbGVhclRpbWVJbnRlcnZhbCkgYXMgKHRpbWVvdXQ6IG51bWJlcikgPT4gdm9pZDtcblxuICB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgYXMgKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiBudW1iZXI7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IChcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFpc1Nka1ZlcnNpb25HdCgyLCAxNSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaW4gbWFpbiB0aHJlYWQgc2NyaXB0IHJlcXVpcmVzIEx5bnggc2RrIHZlcnNpb24gMi4xNicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBseW54LmNhbmNlbEFuaW1hdGlvbkZyYW1lIGFzIChyZXF1ZXN0SWQ6IG51bWJlcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHsgaW5pdEFwaUVudiB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgZnVuY3Rpb24gcHJvZmlsZTxSZXQsIEZuIGV4dGVuZHMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gUmV0PihcbiAgc2xpY2VOYW1lOiBzdHJpbmcsXG4gIGY6IEZuLFxuKTogUmV0IHtcbiAgLyogdjggaWdub3JlIG5leHQgOSAqL1xuICAvLyBUT0RPOiBjaGFuZ2UgaXQgdG8gX19QUk9GSUxFX19cbiAgaWYgKF9fREVWX18pIHtcbiAgICBjb25zb2xlLnByb2ZpbGUoc2xpY2VOYW1lKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGYoKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY29uc29sZS5wcm9maWxlRW5kKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBmKCk7XG4gIH1cbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vYXBpL2VsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBXb3JrbGV0UmVmLCBXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWZJbXBsIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5pbXBvcnQgeyBwcm9maWxlIH0gZnJvbSAnLi91dGlscy9wcm9maWxlLmpzJztcblxuaW50ZXJmYWNlIFJlZkltcGwge1xuICBfd29ya2xldFJlZk1hcDogUmVjb3JkPFdvcmtsZXRSZWZJZCwgV29ya2xldFJlZjx1bmtub3duPj47XG4gIF9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXA6IFJlY29yZDxXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWY8dW5rbm93bj4+O1xuICB1cGRhdGVXb3JrbGV0UmVmKFxuICAgIHJlZkltcGw6IFdvcmtsZXRSZWZJbXBsPEVsZW1lbnQgfCBudWxsPixcbiAgICBlbGVtZW50OiBFbGVtZW50Tm9kZSB8IG51bGwsXG4gICk6IHZvaWQ7XG4gIHVwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzKHBhdGNoOiBbbnVtYmVyLCB1bmtub3duXVtdKTogdm9pZDtcbiAgY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAoKTogdm9pZDtcbn1cblxubGV0IGltcGw6IFJlZkltcGwgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluaXRXb3JrbGV0UmVmKCk6IFJlZkltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX3dvcmtsZXRSZWZNYXA6IHt9LFxuICAgIC8qKlxuICAgICAqIE1hcCBvZiB3b3JrbGV0IHJlZnMgdGhhdCBhcmUgY3JlYXRlZCBkdXJpbmcgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZy5cbiAgICAgKiBUaGVzZSByZWZzIGFyZSBjcmVhdGVkIHdpdGggbmVnYXRpdmUgSURzIGFuZCBuZWVkIHRvIGJlIGh5ZHJhdGVkXG4gICAgICogd2hlbiB0aGUgYXBwIHN0YXJ0cy4gVGhlIG1hcCBpcyBjbGVhcmVkIGFmdGVyIGh5ZHJhdGlvbiBpcyBjb21wbGV0ZVxuICAgICAqIHRvIGZyZWUgdXAgbWVtb3J5LlxuICAgICAqL1xuICAgIF9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXA6IHt9LFxuICAgIHVwZGF0ZVdvcmtsZXRSZWYsXG4gICAgdXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMsXG4gICAgY2xlYXJGaXJzdFNjcmVlbldvcmtsZXRSZWZNYXAsXG4gIH0pO1xufVxuXG5jb25zdCBjcmVhdGVXb3JrbGV0UmVmID0gPFQ+KFxuICBpZDogV29ya2xldFJlZklkLFxuICB2YWx1ZTogVCxcbik6IFdvcmtsZXRSZWY8VD4gPT4ge1xuICByZXR1cm4ge1xuICAgIGN1cnJlbnQ6IHZhbHVlLFxuICAgIF93dmlkOiBpZCxcbiAgfTtcbn07XG5cbmNvbnN0IGdldEZyb21Xb3JrbGV0UmVmTWFwID0gPFQ+KFxuICByZWZJbXBsOiBXb3JrbGV0UmVmSW1wbDxUPixcbik6IFdvcmtsZXRSZWY8VD4gPT4ge1xuICBjb25zdCBpZCA9IHJlZkltcGwuX3d2aWQ7XG4gIGxldCB2YWx1ZTtcbiAgaWYgKGlkIDwgMCkge1xuICAgIC8vIEF0IHRoZSBmaXJzdCBzY3JlZW4gcmVuZGVyaW5nLCB0aGUgd29ya2xldCByZWYgaXMgY3JlYXRlZCB3aXRoIGEgbmVnYXRpdmUgSUQuXG4gICAgLy8gTWlnaHQgYmUgY2FsbGVkIGluIHR3byBzY2VuYXJpb3M6XG4gICAgLy8gMS4gSW4gTVRTIGV2ZW50c1xuICAgIC8vIDIuIEluIGBtYWluLXRocmVhZDpyZWZgXG4gICAgdmFsdWUgPSBpbXBsIS5fZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwW2lkXSBhcyBXb3JrbGV0UmVmPFQ+O1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gaW1wbCEuX2ZpcnN0U2NyZWVuV29ya2xldFJlZk1hcFtpZF0gPSBjcmVhdGVXb3JrbGV0UmVmKGlkLCByZWZJbXBsLl9pbml0VmFsdWUpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSBhcyBXb3JrbGV0UmVmPFQ+O1xuICB9XG5cbiAgLyogdjggaWdub3JlIG5leHQgMyAqL1xuICBpZiAoX19ERVZfXyAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdXb3JrbGV0OiByZWYgaXMgbm90IGluaXRpYWxpemVkOiAnICsgaWQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbmZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoaWQ6IFdvcmtsZXRSZWZJZCk6IHZvaWQge1xuICBkZWxldGUgaW1wbCEuX3dvcmtsZXRSZWZNYXBbaWRdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlIG9mIHRoZSBnaXZlbiBlbGVtZW50IG5vZGUsIHRoZW4gc2V0IHRoZSB3b3JrbGV0IHZhbHVlIHRvIGl0LlxuICogVGhpcyBpcyBjYWxsZWQgaW4gYHNuYXBzaG90Q29udGV4dFVwZGF0ZVdvcmtsZXRSZWZgLlxuICogQHBhcmFtIGhhbmRsZSBoYW5kbGUgb2YgdGhlIHdvcmtsZXQgdmFsdWUuXG4gKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCBub2RlLlxuICovXG5mdW5jdGlvbiB1cGRhdGVXb3JrbGV0UmVmKFxuICBoYW5kbGU6IFdvcmtsZXRSZWZJbXBsPEVsZW1lbnQgfCBudWxsPixcbiAgZWxlbWVudDogRWxlbWVudE5vZGUgfCBudWxsLFxuKTogdm9pZCB7XG4gIGdldEZyb21Xb3JrbGV0UmVmTWFwKGhhbmRsZSkuY3VycmVudCA9IGVsZW1lbnRcbiAgICA/IG5ldyBFbGVtZW50KGVsZW1lbnQpXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyhcbiAgcGF0Y2g6IFtXb3JrbGV0UmVmSWQsIHVua25vd25dW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgndXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMnLCAoKSA9PiB7XG4gICAgcGF0Y2guZm9yRWFjaCgoW2lkLCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmICghaW1wbCEuX3dvcmtsZXRSZWZNYXBbaWRdKSB7XG4gICAgICAgIGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSA9IGNyZWF0ZVdvcmtsZXRSZWYoaWQsIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFyRmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwKCk6IHZvaWQge1xuICBpbXBsIS5fZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwID0ge307XG59XG5cbmV4cG9ydCB7XG4gIHR5cGUgUmVmSW1wbCxcbiAgY3JlYXRlV29ya2xldFJlZixcbiAgaW5pdFdvcmtsZXRSZWYsXG4gIGdldEZyb21Xb3JrbGV0UmVmTWFwLFxuICByZW1vdmVWYWx1ZUZyb21Xb3JrbGV0UmVmTWFwLFxuICB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyxcbn07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IFdvcmtsZXRFdmVudHMgfSBmcm9tICcuL2JpbmRpbmdzL2V2ZW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbGVhc2VXb3JrbGV0UmVmRGF0YSwgUnVuV29ya2xldEN0eERhdGEsIFJ1bldvcmtsZXRDdHhSZXREYXRhIH0gZnJvbSAnLi9iaW5kaW5ncy9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDbG9zdXJlVmFsdWVUeXBlIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnLi90eXBlcy9ydW50aW1lUHJveHkuanMnO1xuaW1wb3J0IHsgcmVtb3ZlVmFsdWVGcm9tV29ya2xldFJlZk1hcCB9IGZyb20gJy4vd29ya2xldFJlZi5qcyc7XG5cbmZ1bmN0aW9uIGluaXRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgY29uc3QganNDb250ZXh0ID0gbHlueC5nZXRKU0NvbnRleHQoKTtcbiAganNDb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgV29ya2xldEV2ZW50cy5ydW5Xb3JrbGV0Q3R4LFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEgYXMgc3RyaW5nKSBhcyBSdW5Xb3JrbGV0Q3R4RGF0YTtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gcnVuV29ya2xldChkYXRhLndvcmtsZXQsIGRhdGEucGFyYW1zIGFzIENsb3N1cmVWYWx1ZVR5cGVbXSk7XG4gICAgICBqc0NvbnRleHQuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHR5cGU6IFdvcmtsZXRFdmVudHMuRnVuY3Rpb25DYWxsUmV0LFxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcmVzb2x2ZUlkOiBkYXRhLnJlc29sdmVJZCxcbiAgICAgICAgICByZXR1cm5WYWx1ZSxcbiAgICAgICAgfSBhcyBSdW5Xb3JrbGV0Q3R4UmV0RGF0YSksXG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuICBqc0NvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBXb3JrbGV0RXZlbnRzLnJlbGVhc2VXb3JrbGV0UmVmLFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoKGV2ZW50LmRhdGEgYXMgUmVsZWFzZVdvcmtsZXRSZWZEYXRhKS5pZCk7XG4gICAgfSxcbiAgKTtcbn1cblxuZXhwb3J0IHsgaW5pdEV2ZW50TGlzdGVuZXJzIH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgSnNGbkhhbmRsZSB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuXG5pbnRlcmZhY2UgRGV0YWlscyB7XG4gIHRhc2s6IChmbklkOiBudW1iZXIsIGV4ZWNJZDogbnVtYmVyKSA9PiB2b2lkO1xuXG4gIC8vIFRoaXMgY29tZXMgZnJvbSB0aGUgYmFja2dyb3VuZCB0aHJlYWQsIGluc2VydGVkIGhlcmUgZHVyaW5nIGN0eCBoeWRyYXRpb24uXG4gIGpzRm5IYW5kbGU/OiBKc0ZuSGFuZGxlO1xufVxuXG5pbnRlcmZhY2UgUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHtcbiAgLy8gRWxlbWVudHMgc2hvdWxkIGtlZXAgdGhlIG9yZGVyIGJlaW5nIGNhbGxlZCBieSB0aGUgdXNlci5cbiAgZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5OiBEZXRhaWxzW107XG4gIGRlbGF5UnVuT25CYWNrZ3JvdW5kKGZuT2JqOiBKc0ZuSGFuZGxlLCBmbjogKGZuSWQ6IG51bWJlciwgZXhlY0lkOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkO1xuICBydW5EZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9ucygpOiB2b2lkO1xufVxuXG5sZXQgaW1wbDogUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkoKTogUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsIHtcbiAgcmV0dXJuIChpbXBsID0ge1xuICAgIGRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheTogW10sXG4gICAgZGVsYXlSdW5PbkJhY2tncm91bmQsXG4gICAgcnVuRGVsYXllZEJhY2tncm91bmRGdW5jdGlvbnMsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxheVJ1bk9uQmFja2dyb3VuZChmbk9iajogSnNGbkhhbmRsZSwgdGFzazogKGZuSWQ6IG51bWJlciwgZXhlY0lkOiBudW1iZXIpID0+IHZvaWQpIHtcbiAgaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5LnB1c2goeyB0YXNrIH0pO1xuICBjb25zdCBkZWxheUluZGljZXMgPSBmbk9iai5fZGVsYXlJbmRpY2VzID8/PSBbXTtcbiAgZGVsYXlJbmRpY2VzLnB1c2goaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5Lmxlbmd0aCAtIDEpO1xufVxuXG5mdW5jdGlvbiBydW5EZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9ucygpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBkZXRhaWxzIG9mIGltcGwhLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheSkge1xuICAgIGlmIChkZXRhaWxzLmpzRm5IYW5kbGUpIHtcbiAgICAgIGRldGFpbHMudGFzayhkZXRhaWxzLmpzRm5IYW5kbGUuX2pzRm5JZCEsIGRldGFpbHMuanNGbkhhbmRsZS5fZXhlY0lkISk7XG4gICAgfVxuICB9XG4gIGltcGwhLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheS5sZW5ndGggPSAwO1xufVxuXG5leHBvcnQgeyB0eXBlIFJ1bk9uQmFja2dyb3VuZERlbGF5SW1wbCwgaW5pdFJ1bk9uQmFja2dyb3VuZERlbGF5IH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgV29ya2xldCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbmludGVyZmFjZSBFdmVudERlbGF5SW1wbCB7XG4gIF9kZWxheWVkV29ya2xldFBhcmFtc01hcDogTWFwPHN0cmluZywgQ2xvc3VyZVZhbHVlVHlwZVtdW10+O1xuICBydW5EZWxheWVkV29ya2xldCh3b3JrbGV0OiBXb3JrbGV0LCBlbGVtZW50OiBFbGVtZW50Tm9kZSk6IHZvaWQ7XG4gIGNsZWFyRGVsYXllZFdvcmtsZXRzKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBFdmVudERlbGF5SW1wbCB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaW5pdEV2ZW50RGVsYXkoKTogRXZlbnREZWxheUltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwOiBuZXcgTWFwKCksXG4gICAgcnVuRGVsYXllZFdvcmtsZXQsXG4gICAgY2xlYXJEZWxheWVkV29ya2xldHMsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoXG4gIGhhc2g6IHN0cmluZyxcbiAgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgnZGVsYXlFeGVjVW50aWxKc1JlYWR5OiAnICsgaGFzaCwgKCkgPT4ge1xuICAgIGNvbnN0IG1hcCA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcDtcbiAgICBjb25zdCBwYXJhbVZlYyA9IG1hcC5nZXQoaGFzaCk7XG4gICAgaWYgKHBhcmFtVmVjKSB7XG4gICAgICBwYXJhbVZlYy5wdXNoKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcC5zZXQoaGFzaCwgW3BhcmFtc10pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRlbGF5ZWRXb3JrbGV0KHdvcmtsZXQ6IFdvcmtsZXQsIGVsZW1lbnQ6IEVsZW1lbnROb2RlKTogdm9pZCB7XG4gIHByb2ZpbGUoJ2NvbW1pdERlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtc1ZlYyA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5nZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgKTtcbiAgICBpZiAocGFyYW1zVmVjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVmdFBhcmFtc1ZlYzogQ2xvc3VyZVZhbHVlVHlwZVtdW10gPSBbXTtcbiAgICBwYXJhbXNWZWMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFBhcmFtID0gcGFyYW1zWzBdIGFzIHsgY3VycmVudFRhcmdldD86IHsgZWxlbWVudFJlZnB0cj86IEVsZW1lbnROb2RlIH0gfSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChmaXJzdFBhcmFtPy5jdXJyZW50VGFyZ2V0Py5lbGVtZW50UmVmcHRyID09PSBlbGVtZW50KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHByb2ZpbGUoJ3J1bkRlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgICAgICAgICAgcnVuV29ya2xldCh3b3JrbGV0LCBwYXJhbXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlZnRQYXJhbXNWZWMucHVzaChwYXJhbXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5zZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgICBsZWZ0UGFyYW1zVmVjLFxuICAgICk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckRlbGF5ZWRXb3JrbGV0cygpOiB2b2lkIHtcbiAgaW1wbCEuX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7IHR5cGUgRXZlbnREZWxheUltcGwsIGluaXRFdmVudERlbGF5LCBkZWxheUV4ZWNVbnRpbEpzUmVhZHksIHJ1bkRlbGF5ZWRXb3JrbGV0LCBjbGVhckRlbGF5ZWRXb3JrbGV0cyB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5cbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgSnNGbkhhbmRsZSwgV29ya2xldCwgV29ya2xldFJlZklkLCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbi8qKlxuICogSHlkcmF0ZXMgYSBXb3JrbGV0IGNvbnRleHQgd2l0aCBkYXRhIGZyb20gYSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0LlxuICogVGhpcyBwcm9jZXNzIGlzIHR5cGljYWxseSB1c2VkIHRvIHJ1biBhbGwgZGVsYXllZCBgcnVuT25CYWNrZ3JvdW5kYCBmdW5jdGlvbnNcbiAqIGFuZCBpbml0aWFsaXplIGBXb3JrbGV0UmVmYCB2YWx1ZXMgbW9kaWZpZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY3R4IFRoZSB0YXJnZXQgV29ya2xldCBjb250ZXh0IHRvIGJlIGh5ZHJhdGVkLlxuICogQHBhcmFtIGZpcnN0U2NyZWVuQ3R4IFRoZSBXb3JrbGV0IGNvbnRleHQgZnJvbSB0aGUgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZyxcbiAqICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBkYXRhIHRvIGh5ZHJhdGUgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVDdHgoY3R4OiBXb3JrbGV0LCBmaXJzdFNjcmVlbkN0eDogV29ya2xldCk6IHZvaWQge1xuICBwcm9maWxlKCdoeWRyYXRlQ3R4JywgKCkgPT4ge1xuICAgIGh5ZHJhdGVDdHhJbXBsKGN0eCwgZmlyc3RTY3JlZW5DdHgsIGN0eC5fZXhlY0lkISk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlQ3R4SW1wbChjdHg6IENsb3N1cmVWYWx1ZVR5cGUsIGZpcnN0U2NyZWVuQ3R4OiBDbG9zdXJlVmFsdWVUeXBlLCBleGVjSWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWN0eCB8fCB0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCAhZmlyc3RTY3JlZW5DdHggfHwgdHlwZW9mIGZpcnN0U2NyZWVuQ3R4ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGN0eE9iaiA9IGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcbiAgY29uc3QgZmlyc3RTY3JlZW5DdHhPYmogPSBmaXJzdFNjcmVlbkN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcblxuICBpZiAoY3R4T2JqWydfd2tsdElkJ10gJiYgY3R4T2JqWydfd2tsdElkJ10gIT09IGZpcnN0U2NyZWVuQ3R4T2JqWydfd2tsdElkJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZvci1pbi1hcnJheVxuICBmb3IgKGNvbnN0IGtleSBpbiBjdHgpIHtcbiAgICBpZiAoa2V5ID09PSAnX3d2aWQnKSB7XG4gICAgICBoeWRyYXRlTWFpblRocmVhZFJlZihjdHhPYmpba2V5XSBhcyBXb3JrbGV0UmVmSWQsIGZpcnN0U2NyZWVuQ3R4T2JqIGFzIHVua25vd24gYXMgV29ya2xldFJlZkltcGw8dW5rbm93bj4pO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX2pzRm4nKSB7XG4gICAgICBoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyhcbiAgICAgICAgY3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGZpcnN0U2NyZWVuQ3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGV4ZWNJZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpcnN0U2NyZWVuVmFsdWUgPSB0eXBlb2YgZmlyc3RTY3JlZW5DdHhPYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IChmaXJzdFNjcmVlbkN0eE9ialtrZXldIGFzIHsgY3R4OiBDbG9zdXJlVmFsdWVUeXBlIH0pLmN0eFxuICAgICAgICA6IGZpcnN0U2NyZWVuQ3R4T2JqW2tleV07XG4gICAgICBoeWRyYXRlQ3R4SW1wbChjdHhPYmpba2V5XSwgZmlyc3RTY3JlZW5WYWx1ZSwgZXhlY0lkKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBhIFdvcmtsZXRSZWYgb24gdGhlIG1haW4gdGhyZWFkLlxuICogVGhpcyBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgV29ya2xldFJlZidzIGJhY2tncm91bmQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBjaGFuZ2VzXG4gKiB0aGF0IG9jY3VycmVkIGluIHRoZSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0IGJlZm9yZSBoeWRyYXRpb24uXG4gKlxuICogQHBhcmFtIHJlZklkIFRoZSBJRCBvZiB0aGUgV29ya2xldFJlZiB0byBoeWRyYXRlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBXb3JrbGV0UmVmLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlTWFpblRocmVhZFJlZihyZWZJZDogV29ya2xldFJlZklkLCB2YWx1ZTogV29ya2xldFJlZkltcGw8dW5rbm93bj4gfCB7IGN1cnJlbnQ6IHVua25vd24gfSkge1xuICBpZiAoJ19pbml0VmFsdWUnIGluIHZhbHVlKSB7XG4gICAgLy8gVGhlIHJlZiBoYXMgbm90IGJlZW4gYWNjZXNzZWQgeWV0LlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWYgPSBseW54V29ya2xldEltcGwhLl9yZWZJbXBsLl93b3JrbGV0UmVmTWFwW3JlZklkXSE7XG4gIHJlZi5jdXJyZW50ID0gdmFsdWUuY3VycmVudDtcbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBkZWxheWVkIGBydW5PbkJhY2tncm91bmRgIHRhc2tzLlxuICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgYW55IGBydW5PbkJhY2tncm91bmRgIGNhbGxzIHRoYXQgd2VyZSBkZWxheWVkXG4gKiBkdXJpbmcgdGhlIGZpcnN0LXNjcmVlbiByZW5kZXJpbmcgYXJlIGNvcnJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlaXJcbiAqIHJlc3BlY3RpdmUgSmF2YVNjcmlwdCBmdW5jdGlvbiBoYW5kbGVzIGluIHRoZSBoeWRyYXRlZCBXb3JrbGV0IGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVEZWxheVJ1bk9uQmFja2dyb3VuZFRhc2tzKFxuICBmbk9ianM6IFJlY29yZDxzdHJpbmcsIEpzRm5IYW5kbGU+LCAvLyBleGFtcGxlOiB7XCJfanNGbjFcIjp7XCJfanNGbklkXCI6MX19XG4gIGZpcnN0U2NyZWVuRm5PYmpzOiBSZWNvcmQ8c3RyaW5nLCBKc0ZuSGFuZGxlPiwgLy8gZXhhbXBsZToge1wiX2pzRm4xXCI6e1wiX2lzRmlyc3RTY3JlZW5cIjp0cnVlLFwiX2RlbGF5SW5kaWNlc1wiOlswXX19XG4gIGV4ZWNJZDogbnVtYmVyLFxuKSB7XG4gIGZvciAoY29uc3QgZm5OYW1lIGluIGZuT2Jqcykge1xuICAgIGNvbnN0IGZuT2JqID0gZm5PYmpzW2ZuTmFtZV0hO1xuICAgIGNvbnN0IGZpcnN0U2NyZWVuRm5PYmo6IEpzRm5IYW5kbGUgfCB1bmRlZmluZWQgPSBmaXJzdFNjcmVlbkZuT2Jqc1tmbk5hbWVdO1xuICAgIGlmICghZmlyc3RTY3JlZW5Gbk9iaj8uX2RlbGF5SW5kaWNlcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgZmlyc3RTY3JlZW5Gbk9iai5fZGVsYXlJbmRpY2VzKSB7XG4gICAgICBjb25zdCBkZXRhaWxzID0gbHlueFdvcmtsZXRJbXBsIS5fcnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheVtpbmRleF0hO1xuICAgICAgZm5PYmouX2V4ZWNJZCA9IGV4ZWNJZDtcbiAgICAgIGRldGFpbHMuanNGbkhhbmRsZSA9IGZuT2JqO1xuICAgIH1cbiAgfVxufVxuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBXb3JrbGV0RXZlbnRzIH0gZnJvbSAnLi9iaW5kaW5ncy9ldmVudHMuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5pbXBvcnQgeyBpc1Nka1ZlcnNpb25HdCB9IGZyb20gJy4vdXRpbHMvdmVyc2lvbi5qcyc7XG5cbi8qKlxuICogYEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyYCBtb25pdG9ycyByZWZlcmVuY2VzIHRvIEpTIGZ1bmN0aW9uIGhhbmRsZXMgdG8gYmUgY2FsbGVkIGJ5IGBydW5PbkJhY2tncm91bmQoKWAuXG4gKiBJbiBKUyBjb250ZXh0LCBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIGJ5IGBydW5PbkJhY2tncm91bmQoKWAgaXMgcmVmZXJlbmNlZCBieSBgSnNGbkhhbmRsZWBzIGFuZCBmaW5hbGx5IGJ5IGBleGVjSWRgLlxuICogV2hlbiBhbGwgYEpzRm5IYW5kbGVgcyBpbiBsZXB1cyBhcmUgcmVsZWFzZWQsIGFuIGV2ZW50IHdpbGwgYmUgc2VudCB0byBKUyBjb250ZXh0IHRvIGRlLXJlZiB0aGUgYGV4ZWNJZGAsXG4gKiByZXN1bHRpbmcgYSBkZS1yZWYgdG8gdGhlIGpzIGZ1bmN0aW9uIGluIEpTIGNvbnRleHQuXG4gKi9cbmNsYXNzIEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBleGVjSWRSZWZDb3VudCA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIHByaXZhdGUgZXhlY0lkU2V0VG9GaXJlID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIHByaXZhdGUgd2lsbEZpcmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWdpc3RyeT86IEZpbmFsaXphdGlvblJlZ2lzdHJ5PG51bWJlcj4gPSB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5yZWdpc3RyeSA9IG5ldyBGaW5hbGl6YXRpb25SZWdpc3RyeTxudW1iZXI+KHRoaXMucmVtb3ZlUmVmLmJpbmQodGhpcykpO1xuICB9XG5cbiAgYWRkUmVmKGV4ZWNJZDogbnVtYmVyLCBvYmpUb1JlZjogb2JqZWN0KTogdm9pZCB7XG4gICAgdGhpcy5leGVjSWRSZWZDb3VudC5zZXQoXG4gICAgICBleGVjSWQsXG4gICAgICAodGhpcy5leGVjSWRSZWZDb3VudC5nZXQoZXhlY0lkKSA/PyAwKSArIDEsXG4gICAgKTtcbiAgICB0aGlzLnJlZ2lzdHJ5IS5yZWdpc3RlcihvYmpUb1JlZiwgZXhlY0lkKTtcbiAgfVxuXG4gIHJlbW92ZVJlZihleGVjSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHJjID0gdGhpcy5leGVjSWRSZWZDb3VudC5nZXQoZXhlY0lkKSE7XG4gICAgaWYgKHJjID4gMSkge1xuICAgICAgdGhpcy5leGVjSWRSZWZDb3VudC5zZXQoZXhlY0lkLCByYyAtIDEpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmV4ZWNJZFJlZkNvdW50LmRlbGV0ZShleGVjSWQpO1xuICAgIHRoaXMuZXhlY0lkU2V0VG9GaXJlLmFkZChleGVjSWQpO1xuICAgIGlmICghdGhpcy53aWxsRmlyZSkge1xuICAgICAgdGhpcy53aWxsRmlyZSA9IHRydWU7XG4gICAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmZpcmUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGZpcmUoKTogdm9pZCB7XG4gICAgcHJvZmlsZSgnSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIuZmlyZScsICgpID0+IHtcbiAgICAgIGx5bnguZ2V0SlNDb250ZXh0KCkuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHR5cGU6IFdvcmtsZXRFdmVudHMucmVsZWFzZUJhY2tncm91bmRXb3JrbGV0Q3R4LFxuICAgICAgICBkYXRhOiBBcnJheS5mcm9tKHRoaXMuZXhlY0lkU2V0VG9GaXJlKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5leGVjSWRTZXRUb0ZpcmUuY2xlYXIoKTtcbiAgICAgIHRoaXMud2lsbEZpcmUgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1Nka1ZlcnNpb25HdCgyLCAxNSk7XG59XG5cbmV4cG9ydCB7IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyLCBpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQgfTtcbiIsICIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vYXBpL2VsZW1lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBDbG9zdXJlVmFsdWVUeXBlLCBXb3JrbGV0LCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgaW5pdFJ1bk9uQmFja2dyb3VuZERlbGF5IH0gZnJvbSAnLi9kZWxheVJ1bk9uQmFja2dyb3VuZC5qcyc7XG5pbXBvcnQgeyBkZWxheUV4ZWNVbnRpbEpzUmVhZHksIGluaXRFdmVudERlbGF5IH0gZnJvbSAnLi9kZWxheVdvcmtsZXRFdmVudC5qcyc7XG5pbXBvcnQgeyBoeWRyYXRlQ3R4IH0gZnJvbSAnLi9oeWRyYXRlLmpzJztcbmltcG9ydCB7IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyLCBpc1J1bk9uQmFja2dyb3VuZEVuYWJsZWQgfSBmcm9tICcuL2pzRnVuY3Rpb25MaWZlY3ljbGUuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5pbXBvcnQgeyBnZXRGcm9tV29ya2xldFJlZk1hcCwgaW5pdFdvcmtsZXRSZWYgfSBmcm9tICcuL3dvcmtsZXRSZWYuanMnO1xuXG5mdW5jdGlvbiBpbml0V29ya2xldCgpOiB2b2lkIHtcbiAgZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwgPSB7XG4gICAgX3dvcmtsZXRNYXA6IHt9LFxuICAgIF9yZWZJbXBsOiBpbml0V29ya2xldFJlZigpLFxuICAgIF9ydW5PbkJhY2tncm91bmREZWxheUltcGw6IGluaXRSdW5PbkJhY2tncm91bmREZWxheSgpLFxuICAgIF9oeWRyYXRlQ3R4OiBoeWRyYXRlQ3R4LFxuICAgIF9ldmVudERlbGF5SW1wbDogaW5pdEV2ZW50RGVsYXkoKSxcbiAgfTtcblxuICBpZiAoaXNSdW5PbkJhY2tncm91bmRFbmFibGVkKCkpIHtcbiAgICBnbG9iYWxUaGlzLmx5bnhXb3JrbGV0SW1wbC5fanNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIgPSBuZXcgSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIoKTtcbiAgfVxuXG4gIGdsb2JhbFRoaXMucmVnaXN0ZXJXb3JrbGV0ID0gcmVnaXN0ZXJXb3JrbGV0O1xuICBnbG9iYWxUaGlzLnJlZ2lzdGVyV29ya2xldEludGVybmFsID0gcmVnaXN0ZXJXb3JrbGV0O1xuICBnbG9iYWxUaGlzLnJ1bldvcmtsZXQgPSBydW5Xb3JrbGV0O1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGEgd29ya2xldCBmdW5jdGlvbiwgYWxsb3dpbmcgaXQgdG8gYmUgZXhlY3V0ZWQgYnkgYHJ1bldvcmtsZXQoKWAuXG4gKiBUaGlzIGlzIGNhbGxlZCBpbiBsZXB1cy5qcy5cbiAqIEBwYXJhbSBfdHlwZSB3b3JrbGV0IHR5cGUsICdtYWluLXRocmVhZCcgb3IgJ3VpJ1xuICogQHBhcmFtIGlkIHdvcmtsZXQgaGFzaFxuICogQHBhcmFtIHdvcmtsZXQgd29ya2xldCBmdW5jdGlvblxuICovXG5mdW5jdGlvbiByZWdpc3RlcldvcmtsZXQoX3R5cGU6IHN0cmluZywgaWQ6IHN0cmluZywgd29ya2xldDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bik6IHZvaWQge1xuICBseW54V29ya2xldEltcGwuX3dvcmtsZXRNYXBbaWRdID0gd29ya2xldDtcbn1cblxuLyoqXG4gKiBFbnRyYW5jZSBvZiBhbGwgd29ya2xldCBjYWxscy5cbiAqIE5hdGl2ZSBldmVudCB0b3VjaCBoYW5kbGVyIHdpbGwgY2FsbCB0aGlzIGZ1bmN0aW9uLlxuICogQHBhcmFtIGN0eCB3b3JrbGV0IG9iamVjdC5cbiAqIEBwYXJhbSBwYXJhbXMgd29ya2xldCBwYXJhbXMuXG4gKi9cbmZ1bmN0aW9uIHJ1bldvcmtsZXQoY3R4OiBXb3JrbGV0LCBwYXJhbXM6IENsb3N1cmVWYWx1ZVR5cGVbXSk6IHVua25vd24ge1xuICBpZiAoIXZhbGlkYXRlV29ya2xldChjdHgpKSB7XG4gICAgY29uc29sZS53YXJuKCdXb3JrbGV0OiBJbnZhbGlkIHdvcmtsZXQgb2JqZWN0OiAnICsgSlNPTi5zdHJpbmdpZnkoY3R4KSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgnX2xlcHVzV29ya2xldEhhc2gnIGluIGN0eCkge1xuICAgIGRlbGF5RXhlY1VudGlsSnNSZWFkeShjdHguX2xlcHVzV29ya2xldEhhc2gsIHBhcmFtcyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHJldHVybiBydW5Xb3JrbGV0SW1wbChjdHgsIHBhcmFtcyk7XG59XG5cbmZ1bmN0aW9uIHJ1bldvcmtsZXRJbXBsKGN0eDogV29ya2xldCwgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10pOiB1bmtub3duIHtcbiAgY29uc3Qgd29ya2xldDogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93biA9IHByb2ZpbGUoXG4gICAgJ3RyYW5zZm9ybVdvcmtsZXRDdHggJyArIGN0eC5fd2tsdElkLFxuICAgICgpID0+IHRyYW5zZm9ybVdvcmtsZXQoY3R4LCB0cnVlKSxcbiAgKTtcbiAgY29uc3QgcGFyYW1zXzogQ2xvc3VyZVZhbHVlVHlwZVtdID0gcHJvZmlsZShcbiAgICAndHJhbnNmb3JtV29ya2xldFBhcmFtcycsXG4gICAgKCkgPT4gdHJhbnNmb3JtV29ya2xldChwYXJhbXMgfHwgW10sIGZhbHNlKSxcbiAgKTtcbiAgcmV0dXJuIHByb2ZpbGUoJ3J1bldvcmtsZXQnLCAoKSA9PiB3b3JrbGV0KC4uLnBhcmFtc18pKTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVXb3JrbGV0KGN0eDogdW5rbm93bik6IGN0eCBpcyBXb3JrbGV0IHtcbiAgcmV0dXJuIHR5cGVvZiBjdHggPT09ICdvYmplY3QnICYmIGN0eCAhPT0gbnVsbCAmJiAoJ193a2x0SWQnIGluIGN0eCB8fCAnX2xlcHVzV29ya2xldEhhc2gnIGluIGN0eCk7XG59XG5cbmNvbnN0IHdvcmtsZXRDYWNoZSA9IG5ldyBXZWFrTWFwPG9iamVjdCwgQ2xvc3VyZVZhbHVlVHlwZSB8ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKT4oKTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtV29ya2xldChjdHg6IFdvcmtsZXQsIGlzV29ya2xldDogdHJ1ZSk6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG5mdW5jdGlvbiB0cmFuc2Zvcm1Xb3JrbGV0KFxuICBjdHg6IENsb3N1cmVWYWx1ZVR5cGVbXSxcbiAgaXNXb3JrbGV0OiBmYWxzZSxcbik6IENsb3N1cmVWYWx1ZVR5cGVbXTtcblxuZnVuY3Rpb24gdHJhbnNmb3JtV29ya2xldChcbiAgY3R4OiBDbG9zdXJlVmFsdWVUeXBlLFxuICBpc1dvcmtsZXQ6IGJvb2xlYW4sXG4pOiBDbG9zdXJlVmFsdWVUeXBlIHwgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pIHtcbiAgLyogdjggaWdub3JlIG5leHQgMyAqL1xuICBpZiAodHlwZW9mIGN0eCAhPT0gJ29iamVjdCcgfHwgY3R4ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGN0eDtcbiAgfVxuXG4gIGlmIChpc1dvcmtsZXQpIHtcbiAgICBjb25zdCByZXMgPSB3b3JrbGV0Q2FjaGUuZ2V0KGN0eCk7XG4gICAgaWYgKHJlcykge1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gIH1cblxuICBjb25zdCB3b3JrbGV0ID0geyBtYWluOiBjdHggfTtcbiAgdHJhbnNmb3JtV29ya2xldElubmVyKHdvcmtsZXQsIDAsIGN0eCk7XG5cbiAgaWYgKGlzV29ya2xldCkge1xuICAgIHdvcmtsZXRDYWNoZS5zZXQoY3R4LCB3b3JrbGV0Lm1haW4pO1xuICB9XG4gIHJldHVybiB3b3JrbGV0Lm1haW47XG59XG5cbmNvbnN0IHRyYW5zZm9ybVdvcmtsZXRJbm5lciA9IChcbiAgdmFsdWU6IENsb3N1cmVWYWx1ZVR5cGUsXG4gIGRlcHRoOiBudW1iZXIsXG4gIGN0eDogdW5rbm93bixcbikgPT4ge1xuICBjb25zdCBsaW1pdCA9IDEwMDA7XG4gIGlmICgrK2RlcHRoID49IGxpbWl0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEZXB0aCBvZiB2YWx1ZSBleGNlZWRzIGxpbWl0IG9mICcgKyBsaW1pdCArICcuJyk7XG4gIH1cbiAgLyogdjggaWdub3JlIG5leHQgMyAqL1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICBjb25zdCBzdWJPYmo6IENsb3N1cmVWYWx1ZVR5cGUgPSBvYmpba2V5XTtcbiAgICBpZiAodHlwZW9mIHN1Yk9iaiAhPT0gJ29iamVjdCcgfHwgc3ViT2JqID09PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0V2ZW50VGFyZ2V0ID0gJ2VsZW1lbnRSZWZwdHInIGluIHN1Yk9iajtcbiAgICBpZiAoIWlzRXZlbnRUYXJnZXQpIHtcbiAgICAgIHRyYW5zZm9ybVdvcmtsZXRJbm5lcihzdWJPYmosIGRlcHRoLCBjdHgpO1xuICAgIH1cblxuICAgIGlmIChpc0V2ZW50VGFyZ2V0KSB7XG4gICAgICBvYmpba2V5XSA9IG5ldyBFbGVtZW50KHN1Yk9ialsnZWxlbWVudFJlZnB0ciddIGFzIEVsZW1lbnROb2RlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpc1dvcmtsZXRSZWYgPSAnX3d2aWQnIGluIChzdWJPYmogYXMgb2JqZWN0KTtcbiAgICBpZiAoaXNXb3JrbGV0UmVmKSB7XG4gICAgICBvYmpba2V5XSA9IGdldEZyb21Xb3JrbGV0UmVmTWFwKFxuICAgICAgICBzdWJPYmogYXMgdW5rbm93biBhcyBXb3JrbGV0UmVmSW1wbDx1bmtub3duPixcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXNXb3JrbGV0ID0gJ193a2x0SWQnIGluIHN1Yk9iajtcbiAgICBpZiAoaXNXb3JrbGV0KSB7XG4gICAgICAvLyBgc3ViT2JqYCBpcyB3b3JrbGV0IGN0eC4gU2hhbGxvdyBjb3B5IGl0IHRvIHByZXZlbnQgdGhlIHRyYW5zZm9ybWVkIHdvcmtsZXQgZnJvbSByZWZlcmVuY2luZyBjdHguXG4gICAgICAvLyBUaGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgdmFsdWUgb2YgYHdvcmtsZXRDYWNoZWAgcmVmZXJlbmNpbmcgaXRzIGtleS5cbiAgICAgIG9ialtrZXldID0gbHlueFdvcmtsZXRJbXBsLl93b3JrbGV0TWFwWyhzdWJPYmogYXMgV29ya2xldCkuX3drbHRJZF0hXG4gICAgICAgIC5iaW5kKHsgLi4uc3ViT2JqIH0pO1xuICAgICAgb2JqW2tleV0uY3R4ID0gc3ViT2JqO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGlzSnNGbiA9ICdfanNGbklkJyBpbiBzdWJPYmo7XG4gICAgaWYgKGlzSnNGbikge1xuICAgICAgc3ViT2JqWydfZXhlY0lkJ10gPSAoY3R4IGFzIFdvcmtsZXQpLl9leGVjSWQ7XG4gICAgICBseW54V29ya2xldEltcGwuX2pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyPy5hZGRSZWYoXG4gICAgICAgIChjdHggYXMgV29ya2xldCkuX2V4ZWNJZCEsXG4gICAgICAgIHN1Yk9iaixcbiAgICAgICk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCB7IGluaXRXb3JrbGV0IH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IGluaXRBcGlFbnYgfSBmcm9tICcuL2FwaS9seW54QXBpLmpzJztcbmltcG9ydCB7IGluaXRFdmVudExpc3RlbmVycyB9IGZyb20gJy4vbGlzdGVuZXJzLmpzJztcbmltcG9ydCB7IGluaXRXb3JrbGV0IH0gZnJvbSAnLi93b3JrbGV0UnVudGltZS5qcyc7XG5cbmlmIChnbG9iYWxUaGlzLmx5bnhXb3JrbGV0SW1wbCA9PT0gdW5kZWZpbmVkKSB7XG4gIGluaXRXb3JrbGV0KCk7XG4gIGluaXRBcGlFbnYoKTtcbiAgaW5pdEV2ZW50TGlzdGVuZXJzKCk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBR08sTUFBTSxXQUFO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
414
+
415
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2FwaS9lbGVtZW50LnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9hcGkvbGVwdXNRdWVyeVNlbGVjdG9yLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy91dGlscy92ZXJzaW9uLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9hcGkvbHlueEFwaS50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvYmluZGluZ3MvZXZlbnRzLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy91dGlscy9wcm9maWxlLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy93b3JrbGV0UmVmLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9saXN0ZW5lcnMudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2RlbGF5UnVuT25CYWNrZ3JvdW5kLnRzIiwid2VicGFjazovL0BseW54LWpzL3JlYWN0LXdvcmtsZXQtcnVudGltZS8uL3NyYy9kZWxheVdvcmtsZXRFdmVudC50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvaHlkcmF0ZS50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvanNGdW5jdGlvbkxpZmVjeWNsZS50cyIsIndlYnBhY2s6Ly9AbHlueC1qcy9yZWFjdC13b3JrbGV0LXJ1bnRpbWUvLi9zcmMvd29ya2xldFJ1bnRpbWUudHMiLCJ3ZWJwYWNrOi8vQGx5bngtanMvcmVhY3Qtd29ya2xldC1ydW50aW1lLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5leHBvcnQgY2xhc3MgRWxlbWVudCB7XG4gIHByaXZhdGUgc3RhdGljIHdpbGxGbHVzaCA9IGZhbHNlO1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3Igc2V0IGluIGNvbnN0cnVjdG9yXG4gIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudDogRWxlbWVudE5vZGU7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudE5vZGUpIHtcbiAgICAvLyBJbiBMeW54IHZlcnNpb25zIHByaW9yIHRvIGFuZCBpbmNsdWRpbmcgMi4xNSxcbiAgICAvLyBhIGNyYXNoIG9jY3VycyB3aGVuIHByaW50aW5nIG9yIHRyYW5zZmVycmluZyByZWZDb3VudGVkIGFjcm9zcyB0aHJlYWRzLlxuICAgIC8vIEJ5cGFzcyB0aGlzIHByb2JsZW0gYnkgaGlkaW5nIHRoZSBlbGVtZW50IG9iamVjdC5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VsZW1lbnQnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBdHRyaWJ1dGUobmFtZTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIF9fU2V0QXR0cmlidXRlKHRoaXMuZWxlbWVudCwgbmFtZSwgdmFsdWUpO1xuICAgIHRoaXMuZmx1c2hFbGVtZW50VHJlZSgpO1xuICB9XG5cbiAgcHVibGljIHNldFN0eWxlUHJvcGVydHkobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgX19BZGRJbmxpbmVTdHlsZSh0aGlzLmVsZW1lbnQsIG5hbWUsIHZhbHVlKTtcbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdHlsZVByb3BlcnRpZXMoc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICBfX0FkZElubGluZVN0eWxlKHRoaXMuZWxlbWVudCwga2V5LCBzdHlsZXNba2V5XSEpO1xuICAgIH1cbiAgICB0aGlzLmZsdXNoRWxlbWVudFRyZWUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgcmV0dXJuIF9fR2V0QXR0cmlidXRlQnlOYW1lKHRoaXMuZWxlbWVudCwgYXR0cmlidXRlTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXR0cmlidXRlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBfX0dldEF0dHJpYnV0ZU5hbWVzKHRoaXMuZWxlbWVudCk7XG4gIH1cblxuICBwdWJsaWMgcXVlcnlTZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nKTogRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHJlZiA9IF9fUXVlcnlTZWxlY3Rvcih0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSk7XG4gICAgcmV0dXJuIHJlZiA/IG5ldyBFbGVtZW50KHJlZikgOiBudWxsO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnRbXSB7XG4gICAgcmV0dXJuIF9fUXVlcnlTZWxlY3RvckFsbCh0aGlzLmVsZW1lbnQsIHNlbGVjdG9yLCB7fSkubWFwKChlbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgaW52b2tlKFxuICAgIG1ldGhvZE5hbWU6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIF9fSW52b2tlVUlNZXRob2QoXG4gICAgICAgIHRoaXMuZWxlbWVudCxcbiAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgcGFyYW1zID8/IHt9LFxuICAgICAgICAocmVzOiB7IGNvZGU6IG51bWJlcjsgZGF0YTogdW5rbm93biB9KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5jb2RlID09PSAwKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlcy5kYXRhKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVUkgbWV0aG9kIGludm9rZTogJyArIEpTT04uc3RyaW5naWZ5KHJlcykpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgdGhpcy5mbHVzaEVsZW1lbnRUcmVlKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZsdXNoRWxlbWVudFRyZWUoKSB7XG4gICAgaWYgKEVsZW1lbnQud2lsbEZsdXNoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIEVsZW1lbnQud2lsbEZsdXNoID0gdHJ1ZTtcbiAgICB2b2lkIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgRWxlbWVudC53aWxsRmx1c2ggPSBmYWxzZTtcbiAgICAgIF9fRmx1c2hFbGVtZW50VHJlZSgpO1xuICAgIH0pO1xuICB9XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgRWxlbWVudCB9IGZyb20gJy4vZWxlbWVudC5qcyc7XG5cbmNsYXNzIFBhZ2VFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcGFnZUVsZW1lbnQ6IEVsZW1lbnROb2RlIHwgdW5kZWZpbmVkO1xuXG4gIHN0YXRpYyBnZXQoKSB7XG4gICAgUGFnZUVsZW1lbnQucGFnZUVsZW1lbnQgPz89IF9fR2V0UGFnZUVsZW1lbnQoKTtcbiAgICByZXR1cm4gUGFnZUVsZW1lbnQucGFnZUVsZW1lbnQ7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHF1ZXJ5U2VsZWN0b3IoY3NzU2VsZWN0b3I6IHN0cmluZyk6IEVsZW1lbnQgfCBudWxsIHtcbiAgY29uc3QgZWxlbWVudCA9IF9fUXVlcnlTZWxlY3RvcihQYWdlRWxlbWVudC5nZXQoKSwgY3NzU2VsZWN0b3IsIHt9KTtcbiAgcmV0dXJuIGVsZW1lbnQgPyBuZXcgRWxlbWVudChlbGVtZW50KSA6IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKGNzc1NlbGVjdG9yOiBzdHJpbmcpOiBFbGVtZW50W10ge1xuICByZXR1cm4gX19RdWVyeVNlbGVjdG9yQWxsKFBhZ2VFbGVtZW50LmdldCgpLCBjc3NTZWxlY3Rvciwge30pLm1hcChcbiAgICAoZWxlbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0sXG4gICk7XG59XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzU2RrVmVyc2lvbkd0KG1ham9yOiBudW1iZXIsIG1pbm9yOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbHlueFNka1ZlcnNpb246IHN0cmluZyA9IFN5c3RlbUluZm8ubHlueFNka1ZlcnNpb24gPz8gJzEuMCc7XG4gIGNvbnN0IHZlcnNpb24gPSBseW54U2RrVmVyc2lvbi5zcGxpdCgnLicpO1xuICByZXR1cm4gKFxuICAgIE51bWJlcih2ZXJzaW9uWzBdKSA+IG1ham9yXG4gICAgfHwgKE51bWJlcih2ZXJzaW9uWzBdKSA9PSBtYWpvciAmJiBOdW1iZXIodmVyc2lvblsxXSkgPiBtaW5vcilcbiAgKTtcbn1cbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBxdWVyeVNlbGVjdG9yLCBxdWVyeVNlbGVjdG9yQWxsIH0gZnJvbSAnLi9sZXB1c1F1ZXJ5U2VsZWN0b3IuanMnO1xuaW1wb3J0IHsgaXNTZGtWZXJzaW9uR3QgfSBmcm9tICcuLi91dGlscy92ZXJzaW9uLmpzJztcblxuZnVuY3Rpb24gaW5pdEFwaUVudigpOiB2b2lkIHtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGx5bngucXVlcnlTZWxlY3RvciA9IHF1ZXJ5U2VsZWN0b3I7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBseW54LnF1ZXJ5U2VsZWN0b3JBbGwgPSBxdWVyeVNlbGVjdG9yQWxsO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0ID0gbHlueC5zZXRUaW1lb3V0IGFzIChjYjogKCkgPT4gdm9pZCwgdGltZW91dDogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgdHlwZVxuICBnbG9iYWxUaGlzLnNldEludGVydmFsID0gbHlueC5zZXRJbnRlcnZhbCBhcyAoY2I6ICgpID0+IHZvaWQsIHRpbWVvdXQ6IG51bWJlcikgPT4gbnVtYmVyO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIHR5cGVcbiAgZ2xvYmFsVGhpcy5jbGVhclRpbWVvdXQgPSBseW54LmNsZWFyVGltZW91dCBhcyAodGltZW91dDogbnVtYmVyKSA9PiB2b2lkO1xuICAvLyBJbiBseW54IDIuMTQgYGNsZWFySW50ZXJ2YWxgIGlzIG1pc3Rha2VubHkgc3BlbGxlZCBhcyBgY2xlYXJUaW1lSW50ZXJ2YWxgLiBUaGlzIGlzIGZpeGVkIGluIGx5bnggMi4xNS5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2xlYXJJbnRlcnZhbCA9IChseW54LmNsZWFySW50ZXJ2YWwgPz8gbHlueC5jbGVhclRpbWVJbnRlcnZhbCkgYXMgKHRpbWVvdXQ6IG51bWJlcikgPT4gdm9pZDtcblxuICB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgY29uc3QgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgYXMgKGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiBudW1iZXI7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gICAgbHlueC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBnbG9iYWxUaGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IChcbiAgICAgIGNhbGxiYWNrOiAoKSA9PiB2b2lkLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFpc1Nka1ZlcnNpb25HdCgyLCAxNSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdyZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaW4gbWFpbiB0aHJlYWQgc2NyaXB0IHJlcXVpcmVzIEx5bnggc2RrIHZlcnNpb24gMi4xNicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciB0eXBlXG4gIGdsb2JhbFRoaXMuY2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBseW54LmNhbmNlbEFuaW1hdGlvbkZyYW1lIGFzIChyZXF1ZXN0SWQ6IG51bWJlcikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IHsgaW5pdEFwaUVudiB9O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB0eXBlIHsgV29ya2xldCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5jb25zdCBlbnVtIFdvcmtsZXRFdmVudHMge1xuICBydW5Xb3JrbGV0Q3R4ID0gJ0x5bnguV29ya2xldC5ydW5Xb3JrbGV0Q3R4JyxcbiAgcnVuT25CYWNrZ3JvdW5kID0gJ0x5bnguV29ya2xldC5ydW5PbkJhY2tncm91bmQnLFxuICBGdW5jdGlvbkNhbGxSZXQgPSAnTHlueC5Xb3JrbGV0LkZ1bmN0aW9uQ2FsbFJldCcsXG4gIHJlbGVhc2VCYWNrZ3JvdW5kV29ya2xldEN0eCA9ICdMeW54LldvcmtsZXQucmVsZWFzZUJhY2tncm91bmRXb3JrbGV0Q3R4JyxcbiAgcmVsZWFzZVdvcmtsZXRSZWYgPSAnTHlueC5Xb3JrbGV0LnJlbGVhc2VXb3JrbGV0UmVmJyxcbn1cblxuaW50ZXJmYWNlIFJ1bldvcmtsZXRDdHhEYXRhIHtcbiAgcmVzb2x2ZUlkOiBudW1iZXI7XG4gIHdvcmtsZXQ6IFdvcmtsZXQ7XG4gIHBhcmFtczogdW5rbm93bltdO1xufVxuXG5pbnRlcmZhY2UgUnVuV29ya2xldEN0eFJldERhdGEge1xuICByZXNvbHZlSWQ6IG51bWJlcjtcbiAgcmV0dXJuVmFsdWU6IHVua25vd247XG59XG5cbmludGVyZmFjZSBSZWxlYXNlV29ya2xldFJlZkRhdGEge1xuICBpZDogbnVtYmVyO1xufVxuXG5leHBvcnQgeyBXb3JrbGV0RXZlbnRzLCB0eXBlIFJ1bldvcmtsZXRDdHhEYXRhLCB0eXBlIFJ1bldvcmtsZXRDdHhSZXREYXRhLCB0eXBlIFJlbGVhc2VXb3JrbGV0UmVmRGF0YSB9O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmV4cG9ydCBmdW5jdGlvbiBwcm9maWxlPFJldCwgRm4gZXh0ZW5kcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBSZXQ+KFxuICBzbGljZU5hbWU6IHN0cmluZyxcbiAgZjogRm4sXG4pOiBSZXQge1xuICAvKiB2OCBpZ25vcmUgbmV4dCA5ICovXG4gIC8vIFRPRE86IGNoYW5nZSBpdCB0byBfX1BST0ZJTEVfX1xuICBpZiAoX19ERVZfXykge1xuICAgIGNvbnNvbGUucHJvZmlsZShzbGljZU5hbWUpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjb25zb2xlLnByb2ZpbGVFbmQoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGYoKTtcbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2FwaS9lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2xldFJlZiwgV29ya2xldFJlZklkLCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbmludGVyZmFjZSBSZWZJbXBsIHtcbiAgX3dvcmtsZXRSZWZNYXA6IFJlY29yZDxXb3JrbGV0UmVmSWQsIFdvcmtsZXRSZWY8dW5rbm93bj4+O1xuICBfZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwOiBSZWNvcmQ8V29ya2xldFJlZklkLCBXb3JrbGV0UmVmPHVua25vd24+PjtcbiAgdXBkYXRlV29ya2xldFJlZihcbiAgICByZWZJbXBsOiBXb3JrbGV0UmVmSW1wbDxFbGVtZW50IHwgbnVsbD4sXG4gICAgZWxlbWVudDogRWxlbWVudE5vZGUgfCBudWxsLFxuICApOiB2b2lkO1xuICB1cGRhdGVXb3JrbGV0UmVmSW5pdFZhbHVlQ2hhbmdlcyhwYXRjaDogW251bWJlciwgdW5rbm93bl1bXSk6IHZvaWQ7XG4gIGNsZWFyRmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBSZWZJbXBsIHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpbml0V29ya2xldFJlZigpOiBSZWZJbXBsIHtcbiAgcmV0dXJuIChpbXBsID0ge1xuICAgIF93b3JrbGV0UmVmTWFwOiB7fSxcbiAgICAvKipcbiAgICAgKiBNYXAgb2Ygd29ya2xldCByZWZzIHRoYXQgYXJlIGNyZWF0ZWQgZHVyaW5nIGZpcnN0IHNjcmVlbiByZW5kZXJpbmcuXG4gICAgICogVGhlc2UgcmVmcyBhcmUgY3JlYXRlZCB3aXRoIG5lZ2F0aXZlIElEcyBhbmQgbmVlZCB0byBiZSBoeWRyYXRlZFxuICAgICAqIHdoZW4gdGhlIGFwcCBzdGFydHMuIFRoZSBtYXAgaXMgY2xlYXJlZCBhZnRlciBoeWRyYXRpb24gaXMgY29tcGxldGVcbiAgICAgKiB0byBmcmVlIHVwIG1lbW9yeS5cbiAgICAgKi9cbiAgICBfZmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwOiB7fSxcbiAgICB1cGRhdGVXb3JrbGV0UmVmLFxuICAgIHVwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzLFxuICAgIGNsZWFyRmlyc3RTY3JlZW5Xb3JrbGV0UmVmTWFwLFxuICB9KTtcbn1cblxuY29uc3QgY3JlYXRlV29ya2xldFJlZiA9IDxUPihcbiAgaWQ6IFdvcmtsZXRSZWZJZCxcbiAgdmFsdWU6IFQsXG4pOiBXb3JrbGV0UmVmPFQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50OiB2YWx1ZSxcbiAgICBfd3ZpZDogaWQsXG4gIH07XG59O1xuXG5jb25zdCBnZXRGcm9tV29ya2xldFJlZk1hcCA9IDxUPihcbiAgcmVmSW1wbDogV29ya2xldFJlZkltcGw8VD4sXG4pOiBXb3JrbGV0UmVmPFQ+ID0+IHtcbiAgY29uc3QgaWQgPSByZWZJbXBsLl93dmlkO1xuICBsZXQgdmFsdWU7XG4gIGlmIChpZCA8IDApIHtcbiAgICAvLyBBdCB0aGUgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZywgdGhlIHdvcmtsZXQgcmVmIGlzIGNyZWF0ZWQgd2l0aCBhIG5lZ2F0aXZlIElELlxuICAgIC8vIE1pZ2h0IGJlIGNhbGxlZCBpbiB0d28gc2NlbmFyaW9zOlxuICAgIC8vIDEuIEluIE1UUyBldmVudHNcbiAgICAvLyAyLiBJbiBgbWFpbi10aHJlYWQ6cmVmYFxuICAgIHZhbHVlID0gaW1wbCEuX2ZpcnN0U2NyZWVuV29ya2xldFJlZk1hcFtpZF0gYXMgV29ya2xldFJlZjxUPjtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB2YWx1ZSA9IGltcGwhLl9maXJzdFNjcmVlbldvcmtsZXRSZWZNYXBbaWRdID0gY3JlYXRlV29ya2xldFJlZihpZCwgcmVmSW1wbC5faW5pdFZhbHVlKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFsdWUgPSBpbXBsIS5fd29ya2xldFJlZk1hcFtpZF0gYXMgV29ya2xldFJlZjxUPjtcbiAgfVxuXG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKF9fREVWX18gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcignV29ya2xldDogcmVmIGlzIG5vdCBpbml0aWFsaXplZDogJyArIGlkKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59O1xuXG5mdW5jdGlvbiByZW1vdmVWYWx1ZUZyb21Xb3JrbGV0UmVmTWFwKGlkOiBXb3JrbGV0UmVmSWQpOiB2b2lkIHtcbiAgZGVsZXRlIGltcGwhLl93b3JrbGV0UmVmTWFwW2lkXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYW4gZWxlbWVudCBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gZWxlbWVudCBub2RlLCB0aGVuIHNldCB0aGUgd29ya2xldCB2YWx1ZSB0byBpdC5cbiAqIFRoaXMgaXMgY2FsbGVkIGluIGBzbmFwc2hvdENvbnRleHRVcGRhdGVXb3JrbGV0UmVmYC5cbiAqIEBwYXJhbSBoYW5kbGUgaGFuZGxlIG9mIHRoZSB3b3JrbGV0IHZhbHVlLlxuICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgbm9kZS5cbiAqL1xuZnVuY3Rpb24gdXBkYXRlV29ya2xldFJlZihcbiAgaGFuZGxlOiBXb3JrbGV0UmVmSW1wbDxFbGVtZW50IHwgbnVsbD4sXG4gIGVsZW1lbnQ6IEVsZW1lbnROb2RlIHwgbnVsbCxcbik6IHZvaWQge1xuICBnZXRGcm9tV29ya2xldFJlZk1hcChoYW5kbGUpLmN1cnJlbnQgPSBlbGVtZW50XG4gICAgPyBuZXcgRWxlbWVudChlbGVtZW50KVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMoXG4gIHBhdGNoOiBbV29ya2xldFJlZklkLCB1bmtub3duXVtdLFxuKTogdm9pZCB7XG4gIHByb2ZpbGUoJ3VwZGF0ZVdvcmtsZXRSZWZJbml0VmFsdWVDaGFuZ2VzJywgKCkgPT4ge1xuICAgIHBhdGNoLmZvckVhY2goKFtpZCwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoIWltcGwhLl93b3JrbGV0UmVmTWFwW2lkXSkge1xuICAgICAgICBpbXBsIS5fd29ya2xldFJlZk1hcFtpZF0gPSBjcmVhdGVXb3JrbGV0UmVmKGlkLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckZpcnN0U2NyZWVuV29ya2xldFJlZk1hcCgpOiB2b2lkIHtcbiAgaW1wbCEuX2ZpcnN0U2NyZWVuV29ya2xldFJlZk1hcCA9IHt9O1xufVxuXG5leHBvcnQge1xuICB0eXBlIFJlZkltcGwsXG4gIGNyZWF0ZVdvcmtsZXRSZWYsXG4gIGluaXRXb3JrbGV0UmVmLFxuICBnZXRGcm9tV29ya2xldFJlZk1hcCxcbiAgcmVtb3ZlVmFsdWVGcm9tV29ya2xldFJlZk1hcCxcbiAgdXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMsXG59O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IFdvcmtsZXRFdmVudHMgfSBmcm9tICcuL2JpbmRpbmdzL2V2ZW50cy5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbGVhc2VXb3JrbGV0UmVmRGF0YSwgUnVuV29ya2xldEN0eERhdGEsIFJ1bldvcmtsZXRDdHhSZXREYXRhIH0gZnJvbSAnLi9iaW5kaW5ncy9ldmVudHMuanMnO1xuaW1wb3J0IHR5cGUgeyBDbG9zdXJlVmFsdWVUeXBlIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEV2ZW50IH0gZnJvbSAnLi90eXBlcy9ydW50aW1lUHJveHkuanMnO1xuaW1wb3J0IHsgcmVtb3ZlVmFsdWVGcm9tV29ya2xldFJlZk1hcCB9IGZyb20gJy4vd29ya2xldFJlZi5qcyc7XG5cbmZ1bmN0aW9uIGluaXRFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgY29uc3QganNDb250ZXh0ID0gbHlueC5nZXRKU0NvbnRleHQoKTtcbiAganNDb250ZXh0LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgV29ya2xldEV2ZW50cy5ydW5Xb3JrbGV0Q3R4LFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEgYXMgc3RyaW5nKSBhcyBSdW5Xb3JrbGV0Q3R4RGF0YTtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gcnVuV29ya2xldChkYXRhLndvcmtsZXQsIGRhdGEucGFyYW1zIGFzIENsb3N1cmVWYWx1ZVR5cGVbXSk7XG4gICAgICBqc0NvbnRleHQuZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHR5cGU6IFdvcmtsZXRFdmVudHMuRnVuY3Rpb25DYWxsUmV0LFxuICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgcmVzb2x2ZUlkOiBkYXRhLnJlc29sdmVJZCxcbiAgICAgICAgICByZXR1cm5WYWx1ZSxcbiAgICAgICAgfSBhcyBSdW5Xb3JrbGV0Q3R4UmV0RGF0YSksXG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuICBqc0NvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICBXb3JrbGV0RXZlbnRzLnJlbGVhc2VXb3JrbGV0UmVmLFxuICAgIChldmVudDogRXZlbnQpID0+IHtcbiAgICAgIHJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAoKGV2ZW50LmRhdGEgYXMgUmVsZWFzZVdvcmtsZXRSZWZEYXRhKS5pZCk7XG4gICAgfSxcbiAgKTtcbn1cblxuZXhwb3J0IHsgaW5pdEV2ZW50TGlzdGVuZXJzIH07XG4iLCIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHR5cGUgeyBKc0ZuSGFuZGxlIH0gZnJvbSAnLi9iaW5kaW5ncy90eXBlcy5qcyc7XG5cbmludGVyZmFjZSBEZXRhaWxzIHtcbiAgdGFzazogKGZuSWQ6IG51bWJlciwgZXhlY0lkOiBudW1iZXIpID0+IHZvaWQ7XG5cbiAgLy8gVGhpcyBjb21lcyBmcm9tIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCwgaW5zZXJ0ZWQgaGVyZSBkdXJpbmcgY3R4IGh5ZHJhdGlvbi5cbiAganNGbkhhbmRsZT86IEpzRm5IYW5kbGU7XG59XG5cbmludGVyZmFjZSBSdW5PbkJhY2tncm91bmREZWxheUltcGwge1xuICAvLyBFbGVtZW50cyBzaG91bGQga2VlcCB0aGUgb3JkZXIgYmVpbmcgY2FsbGVkIGJ5IHRoZSB1c2VyLlxuICBkZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXk6IERldGFpbHNbXTtcbiAgZGVsYXlSdW5PbkJhY2tncm91bmQoZm5PYmo6IEpzRm5IYW5kbGUsIGZuOiAoZm5JZDogbnVtYmVyLCBleGVjSWQ6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQ7XG4gIHJ1bkRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25zKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBSdW5PbkJhY2tncm91bmREZWxheUltcGwgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluaXRSdW5PbkJhY2tncm91bmREZWxheSgpOiBSdW5PbkJhY2tncm91bmREZWxheUltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5OiBbXSxcbiAgICBkZWxheVJ1bk9uQmFja2dyb3VuZCxcbiAgICBydW5EZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9ucyxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGRlbGF5UnVuT25CYWNrZ3JvdW5kKGZuT2JqOiBKc0ZuSGFuZGxlLCB0YXNrOiAoZm5JZDogbnVtYmVyLCBleGVjSWQ6IG51bWJlcikgPT4gdm9pZCkge1xuICBpbXBsIS5kZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXkucHVzaCh7IHRhc2sgfSk7XG4gIGNvbnN0IGRlbGF5SW5kaWNlcyA9IGZuT2JqLl9kZWxheUluZGljZXMgPz89IFtdO1xuICBkZWxheUluZGljZXMucHVzaChpbXBsIS5kZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXkubGVuZ3RoIC0gMSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25zKCk6IHZvaWQge1xuICBmb3IgKGNvbnN0IGRldGFpbHMgb2YgaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5KSB7XG4gICAgaWYgKGRldGFpbHMuanNGbkhhbmRsZSkge1xuICAgICAgZGV0YWlscy50YXNrKGRldGFpbHMuanNGbkhhbmRsZS5fanNGbklkISwgZGV0YWlscy5qc0ZuSGFuZGxlLl9leGVjSWQhKTtcbiAgICB9XG4gIH1cbiAgaW1wbCEuZGVsYXllZEJhY2tncm91bmRGdW5jdGlvbkFycmF5Lmxlbmd0aCA9IDA7XG59XG5cbmV4cG9ydCB7IHR5cGUgUnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsLCBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkgfTtcbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgdHlwZSB7IENsb3N1cmVWYWx1ZVR5cGUsIFdvcmtsZXQgfSBmcm9tICcuL2JpbmRpbmdzL3R5cGVzLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuXG5pbnRlcmZhY2UgRXZlbnREZWxheUltcGwge1xuICBfZGVsYXllZFdvcmtsZXRQYXJhbXNNYXA6IE1hcDxzdHJpbmcsIENsb3N1cmVWYWx1ZVR5cGVbXVtdPjtcbiAgcnVuRGVsYXllZFdvcmtsZXQod29ya2xldDogV29ya2xldCwgZWxlbWVudDogRWxlbWVudE5vZGUpOiB2b2lkO1xuICBjbGVhckRlbGF5ZWRXb3JrbGV0cygpOiB2b2lkO1xufVxuXG5sZXQgaW1wbDogRXZlbnREZWxheUltcGwgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluaXRFdmVudERlbGF5KCk6IEV2ZW50RGVsYXlJbXBsIHtcbiAgcmV0dXJuIChpbXBsID0ge1xuICAgIF9kZWxheWVkV29ya2xldFBhcmFtc01hcDogbmV3IE1hcCgpLFxuICAgIHJ1bkRlbGF5ZWRXb3JrbGV0LFxuICAgIGNsZWFyRGVsYXllZFdvcmtsZXRzLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZGVsYXlFeGVjVW50aWxKc1JlYWR5KFxuICBoYXNoOiBzdHJpbmcsXG4gIHBhcmFtczogQ2xvc3VyZVZhbHVlVHlwZVtdLFxuKTogdm9pZCB7XG4gIHByb2ZpbGUoJ2RlbGF5RXhlY1VudGlsSnNSZWFkeTogJyArIGhhc2gsICgpID0+IHtcbiAgICBjb25zdCBtYXAgPSBpbXBsIS5fZGVsYXllZFdvcmtsZXRQYXJhbXNNYXA7XG4gICAgY29uc3QgcGFyYW1WZWMgPSBtYXAuZ2V0KGhhc2gpO1xuICAgIGlmIChwYXJhbVZlYykge1xuICAgICAgcGFyYW1WZWMucHVzaChwYXJhbXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuc2V0KGhhc2gsIFtwYXJhbXNdKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBydW5EZWxheWVkV29ya2xldCh3b3JrbGV0OiBXb3JrbGV0LCBlbGVtZW50OiBFbGVtZW50Tm9kZSk6IHZvaWQge1xuICBwcm9maWxlKCdjb21taXREZWxheWVkV29ya2xldCcsICgpID0+IHtcbiAgICBjb25zdCBwYXJhbXNWZWMgPSBpbXBsIS5fZGVsYXllZFdvcmtsZXRQYXJhbXNNYXAuZ2V0KFxuICAgICAgd29ya2xldC5fd2tsdElkLFxuICAgICk7XG4gICAgaWYgKHBhcmFtc1ZlYyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxlZnRQYXJhbXNWZWM6IENsb3N1cmVWYWx1ZVR5cGVbXVtdID0gW107XG4gICAgcGFyYW1zVmVjLmZvckVhY2goKHBhcmFtcykgPT4ge1xuICAgICAgY29uc3QgZmlyc3RQYXJhbSA9IHBhcmFtc1swXSBhcyB7IGN1cnJlbnRUYXJnZXQ/OiB7IGVsZW1lbnRSZWZwdHI/OiBFbGVtZW50Tm9kZSB9IH0gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZmlyc3RQYXJhbT8uY3VycmVudFRhcmdldD8uZWxlbWVudFJlZnB0ciA9PT0gZWxlbWVudCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBwcm9maWxlKCdydW5EZWxheWVkV29ya2xldCcsICgpID0+IHtcbiAgICAgICAgICAgIHJ1bldvcmtsZXQod29ya2xldCwgcGFyYW1zKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWZ0UGFyYW1zVmVjLnB1c2gocGFyYW1zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpbXBsIS5fZGVsYXllZFdvcmtsZXRQYXJhbXNNYXAuc2V0KFxuICAgICAgd29ya2xldC5fd2tsdElkLFxuICAgICAgbGVmdFBhcmFtc1ZlYyxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2xlYXJEZWxheWVkV29ya2xldHMoKTogdm9pZCB7XG4gIGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5jbGVhcigpO1xufVxuXG5leHBvcnQgeyB0eXBlIEV2ZW50RGVsYXlJbXBsLCBpbml0RXZlbnREZWxheSwgZGVsYXlFeGVjVW50aWxKc1JlYWR5LCBydW5EZWxheWVkV29ya2xldCwgY2xlYXJEZWxheWVkV29ya2xldHMgfTtcbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5cbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgSnNGbkhhbmRsZSwgV29ya2xldCwgV29ya2xldFJlZklkLCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbi8qKlxuICogSHlkcmF0ZXMgYSBXb3JrbGV0IGNvbnRleHQgd2l0aCBkYXRhIGZyb20gYSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0LlxuICogVGhpcyBwcm9jZXNzIGlzIHR5cGljYWxseSB1c2VkIHRvIHJ1biBhbGwgZGVsYXllZCBgcnVuT25CYWNrZ3JvdW5kYCBmdW5jdGlvbnNcbiAqIGFuZCBpbml0aWFsaXplIGBXb3JrbGV0UmVmYCB2YWx1ZXMgbW9kaWZpZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY3R4IFRoZSB0YXJnZXQgV29ya2xldCBjb250ZXh0IHRvIGJlIGh5ZHJhdGVkLlxuICogQHBhcmFtIGZpcnN0U2NyZWVuQ3R4IFRoZSBXb3JrbGV0IGNvbnRleHQgZnJvbSB0aGUgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZyxcbiAqICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBkYXRhIHRvIGh5ZHJhdGUgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVDdHgoY3R4OiBXb3JrbGV0LCBmaXJzdFNjcmVlbkN0eDogV29ya2xldCk6IHZvaWQge1xuICBwcm9maWxlKCdoeWRyYXRlQ3R4JywgKCkgPT4ge1xuICAgIGh5ZHJhdGVDdHhJbXBsKGN0eCwgZmlyc3RTY3JlZW5DdHgsIGN0eC5fZXhlY0lkISk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlQ3R4SW1wbChjdHg6IENsb3N1cmVWYWx1ZVR5cGUsIGZpcnN0U2NyZWVuQ3R4OiBDbG9zdXJlVmFsdWVUeXBlLCBleGVjSWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWN0eCB8fCB0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCAhZmlyc3RTY3JlZW5DdHggfHwgdHlwZW9mIGZpcnN0U2NyZWVuQ3R4ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGN0eE9iaiA9IGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcbiAgY29uc3QgZmlyc3RTY3JlZW5DdHhPYmogPSBmaXJzdFNjcmVlbkN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcblxuICBpZiAoY3R4T2JqWydfd2tsdElkJ10gJiYgY3R4T2JqWydfd2tsdElkJ10gIT09IGZpcnN0U2NyZWVuQ3R4T2JqWydfd2tsdElkJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZvci1pbi1hcnJheVxuICBmb3IgKGNvbnN0IGtleSBpbiBjdHgpIHtcbiAgICBpZiAoa2V5ID09PSAnX3d2aWQnKSB7XG4gICAgICBoeWRyYXRlTWFpblRocmVhZFJlZihjdHhPYmpba2V5XSBhcyBXb3JrbGV0UmVmSWQsIGZpcnN0U2NyZWVuQ3R4T2JqIGFzIHVua25vd24gYXMgV29ya2xldFJlZkltcGw8dW5rbm93bj4pO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX2pzRm4nKSB7XG4gICAgICBoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyhcbiAgICAgICAgY3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGZpcnN0U2NyZWVuQ3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGV4ZWNJZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpcnN0U2NyZWVuVmFsdWUgPSB0eXBlb2YgZmlyc3RTY3JlZW5DdHhPYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IChmaXJzdFNjcmVlbkN0eE9ialtrZXldIGFzIHsgY3R4OiBDbG9zdXJlVmFsdWVUeXBlIH0pLmN0eFxuICAgICAgICA6IGZpcnN0U2NyZWVuQ3R4T2JqW2tleV07XG4gICAgICBoeWRyYXRlQ3R4SW1wbChjdHhPYmpba2V5XSwgZmlyc3RTY3JlZW5WYWx1ZSwgZXhlY0lkKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBhIFdvcmtsZXRSZWYgb24gdGhlIG1haW4gdGhyZWFkLlxuICogVGhpcyBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgV29ya2xldFJlZidzIGJhY2tncm91bmQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBjaGFuZ2VzXG4gKiB0aGF0IG9jY3VycmVkIGluIHRoZSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0IGJlZm9yZSBoeWRyYXRpb24uXG4gKlxuICogQHBhcmFtIHJlZklkIFRoZSBJRCBvZiB0aGUgV29ya2xldFJlZiB0byBoeWRyYXRlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBXb3JrbGV0UmVmLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlTWFpblRocmVhZFJlZihyZWZJZDogV29ya2xldFJlZklkLCB2YWx1ZTogV29ya2xldFJlZkltcGw8dW5rbm93bj4gfCB7IGN1cnJlbnQ6IHVua25vd24gfSkge1xuICBpZiAoJ19pbml0VmFsdWUnIGluIHZhbHVlKSB7XG4gICAgLy8gVGhlIHJlZiBoYXMgbm90IGJlZW4gYWNjZXNzZWQgeWV0LlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWYgPSBseW54V29ya2xldEltcGwhLl9yZWZJbXBsLl93b3JrbGV0UmVmTWFwW3JlZklkXSE7XG4gIHJlZi5jdXJyZW50ID0gdmFsdWUuY3VycmVudDtcbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBkZWxheWVkIGBydW5PbkJhY2tncm91bmRgIHRhc2tzLlxuICogVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgYW55IGBydW5PbkJhY2tncm91bmRgIGNhbGxzIHRoYXQgd2VyZSBkZWxheWVkXG4gKiBkdXJpbmcgdGhlIGZpcnN0LXNjcmVlbiByZW5kZXJpbmcgYXJlIGNvcnJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlaXJcbiAqIHJlc3BlY3RpdmUgSmF2YVNjcmlwdCBmdW5jdGlvbiBoYW5kbGVzIGluIHRoZSBoeWRyYXRlZCBXb3JrbGV0IGNvbnRleHQuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVEZWxheVJ1bk9uQmFja2dyb3VuZFRhc2tzKFxuICBmbk9ianM6IFJlY29yZDxzdHJpbmcsIEpzRm5IYW5kbGU+LCAvLyBleGFtcGxlOiB7XCJfanNGbjFcIjp7XCJfanNGbklkXCI6MX19XG4gIGZpcnN0U2NyZWVuRm5PYmpzOiBSZWNvcmQ8c3RyaW5nLCBKc0ZuSGFuZGxlPiwgLy8gZXhhbXBsZToge1wiX2pzRm4xXCI6e1wiX2lzRmlyc3RTY3JlZW5cIjp0cnVlLFwiX2RlbGF5SW5kaWNlc1wiOlswXX19XG4gIGV4ZWNJZDogbnVtYmVyLFxuKSB7XG4gIGZvciAoY29uc3QgZm5OYW1lIGluIGZuT2Jqcykge1xuICAgIGNvbnN0IGZuT2JqID0gZm5PYmpzW2ZuTmFtZV0hO1xuICAgIGNvbnN0IGZpcnN0U2NyZWVuRm5PYmo6IEpzRm5IYW5kbGUgfCB1bmRlZmluZWQgPSBmaXJzdFNjcmVlbkZuT2Jqc1tmbk5hbWVdO1xuICAgIGlmICghZmlyc3RTY3JlZW5Gbk9iaj8uX2RlbGF5SW5kaWNlcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgZmlyc3RTY3JlZW5Gbk9iai5fZGVsYXlJbmRpY2VzKSB7XG4gICAgICBjb25zdCBkZXRhaWxzID0gbHlueFdvcmtsZXRJbXBsIS5fcnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsLmRlbGF5ZWRCYWNrZ3JvdW5kRnVuY3Rpb25BcnJheVtpbmRleF0hO1xuICAgICAgZm5PYmouX2V4ZWNJZCA9IGV4ZWNJZDtcbiAgICAgIGRldGFpbHMuanNGbkhhbmRsZSA9IGZuT2JqO1xuICAgIH1cbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IFdvcmtsZXRFdmVudHMgfSBmcm9tICcuL2JpbmRpbmdzL2V2ZW50cy5qcyc7XG5pbXBvcnQgeyBwcm9maWxlIH0gZnJvbSAnLi91dGlscy9wcm9maWxlLmpzJztcbmltcG9ydCB7IGlzU2RrVmVyc2lvbkd0IH0gZnJvbSAnLi91dGlscy92ZXJzaW9uLmpzJztcblxuLyoqXG4gKiBgSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXJgIG1vbml0b3JzIHJlZmVyZW5jZXMgdG8gSlMgZnVuY3Rpb24gaGFuZGxlcyB0byBiZSBjYWxsZWQgYnkgYHJ1bk9uQmFja2dyb3VuZCgpYC5cbiAqIEluIEpTIGNvbnRleHQsIGZ1bmN0aW9ucyB0byBiZSBjYWxsZWQgYnkgYHJ1bk9uQmFja2dyb3VuZCgpYCBpcyByZWZlcmVuY2VkIGJ5IGBKc0ZuSGFuZGxlYHMgYW5kIGZpbmFsbHkgYnkgYGV4ZWNJZGAuXG4gKiBXaGVuIGFsbCBgSnNGbkhhbmRsZWBzIGluIGxlcHVzIGFyZSByZWxlYXNlZCwgYW4gZXZlbnQgd2lsbCBiZSBzZW50IHRvIEpTIGNvbnRleHQgdG8gZGUtcmVmIHRoZSBgZXhlY0lkYCxcbiAqIHJlc3VsdGluZyBhIGRlLXJlZiB0byB0aGUganMgZnVuY3Rpb24gaW4gSlMgY29udGV4dC5cbiAqL1xuY2xhc3MgSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIge1xuICBwcml2YXRlIGV4ZWNJZFJlZkNvdW50ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBleGVjSWRTZXRUb0ZpcmUgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSB3aWxsRmlyZSA9IGZhbHNlO1xuICBwcml2YXRlIHJlZ2lzdHJ5PzogRmluYWxpemF0aW9uUmVnaXN0cnk8bnVtYmVyPiA9IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlZ2lzdHJ5ID0gbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5PG51bWJlcj4odGhpcy5yZW1vdmVSZWYuYmluZCh0aGlzKSk7XG4gIH1cblxuICBhZGRSZWYoZXhlY0lkOiBudW1iZXIsIG9ialRvUmVmOiBvYmplY3QpOiB2b2lkIHtcbiAgICB0aGlzLmV4ZWNJZFJlZkNvdW50LnNldChcbiAgICAgIGV4ZWNJZCxcbiAgICAgICh0aGlzLmV4ZWNJZFJlZkNvdW50LmdldChleGVjSWQpID8/IDApICsgMSxcbiAgICApO1xuICAgIHRoaXMucmVnaXN0cnkhLnJlZ2lzdGVyKG9ialRvUmVmLCBleGVjSWQpO1xuICB9XG5cbiAgcmVtb3ZlUmVmKGV4ZWNJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgcmMgPSB0aGlzLmV4ZWNJZFJlZkNvdW50LmdldChleGVjSWQpITtcbiAgICBpZiAocmMgPiAxKSB7XG4gICAgICB0aGlzLmV4ZWNJZFJlZkNvdW50LnNldChleGVjSWQsIHJjIC0gMSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZXhlY0lkUmVmQ291bnQuZGVsZXRlKGV4ZWNJZCk7XG4gICAgdGhpcy5leGVjSWRTZXRUb0ZpcmUuYWRkKGV4ZWNJZCk7XG4gICAgaWYgKCF0aGlzLndpbGxGaXJlKSB7XG4gICAgICB0aGlzLndpbGxGaXJlID0gdHJ1ZTtcbiAgICAgIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZmlyZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZmlyZSgpOiB2b2lkIHtcbiAgICBwcm9maWxlKCdKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlci5maXJlJywgKCkgPT4ge1xuICAgICAgbHlueC5nZXRKU0NvbnRleHQoKS5kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgdHlwZTogV29ya2xldEV2ZW50cy5yZWxlYXNlQmFja2dyb3VuZFdvcmtsZXRDdHgsXG4gICAgICAgIGRhdGE6IEFycmF5LmZyb20odGhpcy5leGVjSWRTZXRUb0ZpcmUpLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmV4ZWNJZFNldFRvRmlyZS5jbGVhcigpO1xuICAgICAgdGhpcy53aWxsRmlyZSA9IGZhbHNlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzU2RrVmVyc2lvbkd0KDIsIDE1KTtcbn1cblxuZXhwb3J0IHsgSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIsIGlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCB9O1xuIiwiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2FwaS9lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgV29ya2xldCwgV29ya2xldFJlZkltcGwgfSBmcm9tICcuL2JpbmRpbmdzL3R5cGVzLmpzJztcbmltcG9ydCB7IGluaXRSdW5PbkJhY2tncm91bmREZWxheSB9IGZyb20gJy4vZGVsYXlSdW5PbkJhY2tncm91bmQuanMnO1xuaW1wb3J0IHsgZGVsYXlFeGVjVW50aWxKc1JlYWR5LCBpbml0RXZlbnREZWxheSB9IGZyb20gJy4vZGVsYXlXb3JrbGV0RXZlbnQuanMnO1xuaW1wb3J0IHsgaHlkcmF0ZUN0eCB9IGZyb20gJy4vaHlkcmF0ZS5qcyc7XG5pbXBvcnQgeyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciwgaXNSdW5PbkJhY2tncm91bmRFbmFibGVkIH0gZnJvbSAnLi9qc0Z1bmN0aW9uTGlmZWN5Y2xlLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuaW1wb3J0IHsgZ2V0RnJvbVdvcmtsZXRSZWZNYXAsIGluaXRXb3JrbGV0UmVmIH0gZnJvbSAnLi93b3JrbGV0UmVmLmpzJztcblxuZnVuY3Rpb24gaW5pdFdvcmtsZXQoKTogdm9pZCB7XG4gIGdsb2JhbFRoaXMubHlueFdvcmtsZXRJbXBsID0ge1xuICAgIF93b3JrbGV0TWFwOiB7fSxcbiAgICBfcmVmSW1wbDogaW5pdFdvcmtsZXRSZWYoKSxcbiAgICBfcnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsOiBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkoKSxcbiAgICBfaHlkcmF0ZUN0eDogaHlkcmF0ZUN0eCxcbiAgICBfZXZlbnREZWxheUltcGw6IGluaXRFdmVudERlbGF5KCksXG4gIH07XG5cbiAgaWYgKGlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCgpKSB7XG4gICAgZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwuX2pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyID0gbmV3IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyKCk7XG4gIH1cblxuICBnbG9iYWxUaGlzLnJlZ2lzdGVyV29ya2xldCA9IHJlZ2lzdGVyV29ya2xldDtcbiAgZ2xvYmFsVGhpcy5yZWdpc3RlcldvcmtsZXRJbnRlcm5hbCA9IHJlZ2lzdGVyV29ya2xldDtcbiAgZ2xvYmFsVGhpcy5ydW5Xb3JrbGV0ID0gcnVuV29ya2xldDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIHdvcmtsZXQgZnVuY3Rpb24sIGFsbG93aW5nIGl0IHRvIGJlIGV4ZWN1dGVkIGJ5IGBydW5Xb3JrbGV0KClgLlxuICogVGhpcyBpcyBjYWxsZWQgaW4gbGVwdXMuanMuXG4gKiBAcGFyYW0gX3R5cGUgd29ya2xldCB0eXBlLCAnbWFpbi10aHJlYWQnIG9yICd1aSdcbiAqIEBwYXJhbSBpZCB3b3JrbGV0IGhhc2hcbiAqIEBwYXJhbSB3b3JrbGV0IHdvcmtsZXQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJXb3JrbGV0KF90eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHdvcmtsZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pOiB2b2lkIHtcbiAgbHlueFdvcmtsZXRJbXBsLl93b3JrbGV0TWFwW2lkXSA9IHdvcmtsZXQ7XG59XG5cbi8qKlxuICogRW50cmFuY2Ugb2YgYWxsIHdvcmtsZXQgY2FsbHMuXG4gKiBOYXRpdmUgZXZlbnQgdG91Y2ggaGFuZGxlciB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBjdHggd29ya2xldCBvYmplY3QuXG4gKiBAcGFyYW0gcGFyYW1zIHdvcmtsZXQgcGFyYW1zLlxuICovXG5mdW5jdGlvbiBydW5Xb3JrbGV0KGN0eDogV29ya2xldCwgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10pOiB1bmtub3duIHtcbiAgaWYgKCF2YWxpZGF0ZVdvcmtsZXQoY3R4KSkge1xuICAgIGNvbnNvbGUud2FybignV29ya2xldDogSW52YWxpZCB3b3JrbGV0IG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KGN0eCkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoJ19sZXB1c1dvcmtsZXRIYXNoJyBpbiBjdHgpIHtcbiAgICBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoY3R4Ll9sZXB1c1dvcmtsZXRIYXNoLCBwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gcnVuV29ya2xldEltcGwoY3R4LCBwYXJhbXMpO1xufVxuXG5mdW5jdGlvbiBydW5Xb3JrbGV0SW1wbChjdHg6IFdvcmtsZXQsIHBhcmFtczogQ2xvc3VyZVZhbHVlVHlwZVtdKTogdW5rbm93biB7XG4gIGNvbnN0IHdvcmtsZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24gPSBwcm9maWxlKFxuICAgICd0cmFuc2Zvcm1Xb3JrbGV0Q3R4ICcgKyBjdHguX3drbHRJZCxcbiAgICAoKSA9PiB0cmFuc2Zvcm1Xb3JrbGV0KGN0eCwgdHJ1ZSksXG4gICk7XG4gIGNvbnN0IHBhcmFtc186IENsb3N1cmVWYWx1ZVR5cGVbXSA9IHByb2ZpbGUoXG4gICAgJ3RyYW5zZm9ybVdvcmtsZXRQYXJhbXMnLFxuICAgICgpID0+IHRyYW5zZm9ybVdvcmtsZXQocGFyYW1zIHx8IFtdLCBmYWxzZSksXG4gICk7XG4gIHJldHVybiBwcm9maWxlKCdydW5Xb3JrbGV0JywgKCkgPT4gd29ya2xldCguLi5wYXJhbXNfKSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlV29ya2xldChjdHg6IHVua25vd24pOiBjdHggaXMgV29ya2xldCB7XG4gIHJldHVybiB0eXBlb2YgY3R4ID09PSAnb2JqZWN0JyAmJiBjdHggIT09IG51bGwgJiYgKCdfd2tsdElkJyBpbiBjdHggfHwgJ19sZXB1c1dvcmtsZXRIYXNoJyBpbiBjdHgpO1xufVxuXG5jb25zdCB3b3JrbGV0Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIENsb3N1cmVWYWx1ZVR5cGUgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bik+KCk7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoY3R4OiBXb3JrbGV0LCBpc1dvcmtsZXQ6IHRydWUpOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuZnVuY3Rpb24gdHJhbnNmb3JtV29ya2xldChcbiAgY3R4OiBDbG9zdXJlVmFsdWVUeXBlW10sXG4gIGlzV29ya2xldDogZmFsc2UsXG4pOiBDbG9zdXJlVmFsdWVUeXBlW107XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoXG4gIGN0eDogQ2xvc3VyZVZhbHVlVHlwZSxcbiAgaXNXb3JrbGV0OiBib29sZWFuLFxuKTogQ2xvc3VyZVZhbHVlVHlwZSB8ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSB7XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKHR5cGVvZiBjdHggIT09ICdvYmplY3QnIHx8IGN0eCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjdHg7XG4gIH1cblxuICBpZiAoaXNXb3JrbGV0KSB7XG4gICAgY29uc3QgcmVzID0gd29ya2xldENhY2hlLmdldChjdHgpO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd29ya2xldCA9IHsgbWFpbjogY3R4IH07XG4gIHRyYW5zZm9ybVdvcmtsZXRJbm5lcih3b3JrbGV0LCAwLCBjdHgpO1xuXG4gIGlmIChpc1dvcmtsZXQpIHtcbiAgICB3b3JrbGV0Q2FjaGUuc2V0KGN0eCwgd29ya2xldC5tYWluKTtcbiAgfVxuICByZXR1cm4gd29ya2xldC5tYWluO1xufVxuXG5jb25zdCB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIgPSAoXG4gIHZhbHVlOiBDbG9zdXJlVmFsdWVUeXBlLFxuICBkZXB0aDogbnVtYmVyLFxuICBjdHg6IHVua25vd24sXG4pID0+IHtcbiAgY29uc3QgbGltaXQgPSAxMDAwO1xuICBpZiAoKytkZXB0aCA+PSBsaW1pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGVwdGggb2YgdmFsdWUgZXhjZWVkcyBsaW1pdCBvZiAnICsgbGltaXQgKyAnLicpO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgQ2xvc3VyZVZhbHVlVHlwZT47XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgY29uc3Qgc3ViT2JqOiBDbG9zdXJlVmFsdWVUeXBlID0gb2JqW2tleV07XG4gICAgaWYgKHR5cGVvZiBzdWJPYmogIT09ICdvYmplY3QnIHx8IHN1Yk9iaiA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKC8qKiBpc0V2ZW50VGFyZ2V0ICovICdlbGVtZW50UmVmcHRyJyBpbiBzdWJPYmopIHtcbiAgICAgIG9ialtrZXldID0gbmV3IEVsZW1lbnQoc3ViT2JqWydlbGVtZW50UmVmcHRyJ10gYXMgRWxlbWVudE5vZGUpO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIGlmIChzdWJPYmogaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIoc3ViT2JqLCBkZXB0aCwgY3R4KTtcblxuICAgIGNvbnN0IGlzV29ya2xldFJlZiA9ICdfd3ZpZCcgaW4gKHN1Yk9iaiBhcyBvYmplY3QpO1xuICAgIGlmIChpc1dvcmtsZXRSZWYpIHtcbiAgICAgIG9ialtrZXldID0gZ2V0RnJvbVdvcmtsZXRSZWZNYXAoXG4gICAgICAgIHN1Yk9iaiBhcyB1bmtub3duIGFzIFdvcmtsZXRSZWZJbXBsPHVua25vd24+LFxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpc1dvcmtsZXQgPSAnX3drbHRJZCcgaW4gc3ViT2JqO1xuICAgIGlmIChpc1dvcmtsZXQpIHtcbiAgICAgIC8vIGBzdWJPYmpgIGlzIHdvcmtsZXQgY3R4LiBTaGFsbG93IGNvcHkgaXQgdG8gcHJldmVudCB0aGUgdHJhbnNmb3JtZWQgd29ya2xldCBmcm9tIHJlZmVyZW5jaW5nIGN0eC5cbiAgICAgIC8vIFRoaXMgd291bGQgcmVzdWx0IGluIHRoZSB2YWx1ZSBvZiBgd29ya2xldENhY2hlYCByZWZlcmVuY2luZyBpdHMga2V5LlxuICAgICAgb2JqW2tleV0gPSBseW54V29ya2xldEltcGwuX3dvcmtsZXRNYXBbKHN1Yk9iaiBhcyBXb3JrbGV0KS5fd2tsdElkXSFcbiAgICAgICAgLmJpbmQoeyAuLi5zdWJPYmogfSk7XG4gICAgICBvYmpba2V5XS5jdHggPSBzdWJPYmo7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXNKc0ZuID0gJ19qc0ZuSWQnIGluIHN1Yk9iajtcbiAgICBpZiAoaXNKc0ZuKSB7XG4gICAgICBzdWJPYmpbJ19leGVjSWQnXSA9IChjdHggYXMgV29ya2xldCkuX2V4ZWNJZDtcbiAgICAgIGx5bnhXb3JrbGV0SW1wbC5fanNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXI/LmFkZFJlZihcbiAgICAgICAgKGN0eCBhcyBXb3JrbGV0KS5fZXhlY0lkISxcbiAgICAgICAgc3ViT2JqLFxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IHsgaW5pdFdvcmtsZXQgfTtcbiIsIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBpbml0QXBpRW52IH0gZnJvbSAnLi9hcGkvbHlueEFwaS5qcyc7XG5pbXBvcnQgeyBpbml0RXZlbnRMaXN0ZW5lcnMgfSBmcm9tICcuL2xpc3RlbmVycy5qcyc7XG5pbXBvcnQgeyBpbml0V29ya2xldCB9IGZyb20gJy4vd29ya2xldFJ1bnRpbWUuanMnO1xuXG5pZiAoZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwgPT09IHVuZGVmaW5lZCkge1xuICBpbml0V29ya2xldCgpO1xuICBpbml0QXBpRW52KCk7XG4gIGluaXRFdmVudExpc3RlbmVycygpO1xufVxuIl0sIm5hbWVzIjpbIkVsZW1lbnQiLCJuYW1lIiwidmFsdWUiLCJfX1NldEF0dHJpYnV0ZSIsIl9fQWRkSW5saW5lU3R5bGUiLCJzdHlsZXMiLCJrZXkiLCJhdHRyaWJ1dGVOYW1lIiwiX19HZXRBdHRyaWJ1dGVCeU5hbWUiLCJfX0dldEF0dHJpYnV0ZU5hbWVzIiwic2VsZWN0b3IiLCJyZWYiLCJfX1F1ZXJ5U2VsZWN0b3IiLCJfX1F1ZXJ5U2VsZWN0b3JBbGwiLCJlbGVtZW50IiwibWV0aG9kTmFtZSIsInBhcmFtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiX19JbnZva2VVSU1ldGhvZCIsInJlcyIsIkVycm9yIiwiSlNPTiIsIl9fRmx1c2hFbGVtZW50VHJlZSIsIk9iamVjdCIsIlBhZ2VFbGVtZW50IiwiX1BhZ2VFbGVtZW50IiwiX19HZXRQYWdlRWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJjc3NTZWxlY3RvciIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJpc1Nka1ZlcnNpb25HdCIsIm1ham9yIiwibWlub3IiLCJfU3lzdGVtSW5mb19seW54U2RrVmVyc2lvbiIsImx5bnhTZGtWZXJzaW9uIiwidmVyc2lvbiIsIk51bWJlciIsImluaXRBcGlFbnYiLCJseW54IiwiZ2xvYmFsVGhpcyIsIl9seW54X2NsZWFySW50ZXJ2YWwiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJjYWxsYmFjayIsIldvcmtsZXRFdmVudHMiLCJwcm9maWxlIiwic2xpY2VOYW1lIiwiZiIsImNvbnNvbGUiLCJpbXBsIiwiaW5pdFdvcmtsZXRSZWYiLCJ1cGRhdGVXb3JrbGV0UmVmIiwidXBkYXRlV29ya2xldFJlZkluaXRWYWx1ZUNoYW5nZXMiLCJjbGVhckZpcnN0U2NyZWVuV29ya2xldFJlZk1hcCIsImNyZWF0ZVdvcmtsZXRSZWYiLCJpZCIsImdldEZyb21Xb3JrbGV0UmVmTWFwIiwicmVmSW1wbCIsInVuZGVmaW5lZCIsInJlbW92ZVZhbHVlRnJvbVdvcmtsZXRSZWZNYXAiLCJoYW5kbGUiLCJwYXRjaCIsImluaXRFdmVudExpc3RlbmVycyIsImpzQ29udGV4dCIsImV2ZW50IiwiZGF0YSIsInJldHVyblZhbHVlIiwicnVuV29ya2xldCIsImluaXRSdW5PbkJhY2tncm91bmREZWxheSIsImRlbGF5UnVuT25CYWNrZ3JvdW5kIiwicnVuRGVsYXllZEJhY2tncm91bmRGdW5jdGlvbnMiLCJmbk9iaiIsInRhc2siLCJfZm5PYmoiLCJkZWxheUluZGljZXMiLCJkZXRhaWxzIiwiaW5pdEV2ZW50RGVsYXkiLCJNYXAiLCJydW5EZWxheWVkV29ya2xldCIsImNsZWFyRGVsYXllZFdvcmtsZXRzIiwiZGVsYXlFeGVjVW50aWxKc1JlYWR5IiwiaGFzaCIsIm1hcCIsInBhcmFtVmVjIiwid29ya2xldCIsInBhcmFtc1ZlYyIsImxlZnRQYXJhbXNWZWMiLCJfZmlyc3RQYXJhbV9jdXJyZW50VGFyZ2V0IiwiZmlyc3RQYXJhbSIsInNldFRpbWVvdXQiLCJoeWRyYXRlQ3R4IiwiY3R4IiwiZmlyc3RTY3JlZW5DdHgiLCJoeWRyYXRlQ3R4SW1wbCIsImV4ZWNJZCIsImN0eE9iaiIsImZpcnN0U2NyZWVuQ3R4T2JqIiwiaHlkcmF0ZU1haW5UaHJlYWRSZWYiLCJoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyIsImZpcnN0U2NyZWVuVmFsdWUiLCJyZWZJZCIsImx5bnhXb3JrbGV0SW1wbCIsImZuT2JqcyIsImZpcnN0U2NyZWVuRm5PYmpzIiwiZm5OYW1lIiwiZmlyc3RTY3JlZW5Gbk9iaiIsImluZGV4IiwiSnNGdW5jdGlvbkxpZmVjeWNsZU1hbmFnZXIiLCJvYmpUb1JlZiIsIl90aGlzX2V4ZWNJZFJlZkNvdW50X2dldCIsInJjIiwiQXJyYXkiLCJTZXQiLCJGaW5hbGl6YXRpb25SZWdpc3RyeSIsImlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCIsImluaXRXb3JrbGV0IiwicmVnaXN0ZXJXb3JrbGV0IiwiX3R5cGUiLCJ2YWxpZGF0ZVdvcmtsZXQiLCJydW5Xb3JrbGV0SW1wbCIsInRyYW5zZm9ybVdvcmtsZXQiLCJwYXJhbXNfIiwid29ya2xldENhY2hlIiwiV2Vha01hcCIsImlzV29ya2xldCIsInRyYW5zZm9ybVdvcmtsZXRJbm5lciIsImRlcHRoIiwibGltaXQiLCJvYmoiLCJzdWJPYmoiLCJpc1dvcmtsZXRSZWYiLCJpc0pzRm4iLCJfbHlueFdvcmtsZXRJbXBsX19qc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0lBR08sTUFBTUE7UUFpQkosYUFBYUMsSUFBWSxFQUFFQyxLQUFjLEVBQVE7WUFDdERDLGVBQWUsSUFBSSxDQUFDLE9BQU8sRUFBRUYsTUFBTUM7WUFDbkMsSUFBSSxDQUFDLGdCQUFnQjtRQUN2QjtRQUVPLGlCQUFpQkQsSUFBWSxFQUFFQyxLQUFhLEVBQVE7WUFDekRFLGlCQUFpQixJQUFJLENBQUMsT0FBTyxFQUFFSCxNQUFNQztZQUNyQyxJQUFJLENBQUMsZ0JBQWdCO1FBQ3ZCO1FBRU8sbUJBQW1CRyxNQUE4QixFQUFRO1lBQzlELElB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