@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.
- package/CHANGELOG.md +6 -0
- package/package.json +1 -1
- package/refresh/.turbo/turbo-build.log +7 -3
- package/refresh/dist/index.js +223 -284
- package/refresh/package.json +3 -4
- package/refresh/rslib.config.ts +24 -0
- package/testing-library/dist/env/vitest.js +6 -3
- package/testing-library/dist/pure.js +3 -1
- package/testing-library/dist/vitest-global-setup.js +2 -2
- package/transform/dist/wasm.cjs +1 -1
- package/worklet-runtime/dist/dev.js +403 -506
- package/worklet-runtime/dist/main.js +1 -517
- package/worklet-runtime/lib/workletRuntime.js +5 -5
- package/worklet-runtime/lib/workletRuntime.js.map +1 -1
|
@@ -1,518 +1,415 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
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
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
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
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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 (
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
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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
|