@lynx-js/react 0.109.1 → 0.109.2
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 +12 -0
- package/package.json +2 -2
- package/refresh/.turbo/turbo-build.log +1 -1
- package/refresh/package.json +1 -1
- package/runtime/lib/lifecycle/patch/snapshotPatchApply.js +8 -1
- package/runtime/lib/lifecycle/patch/snapshotPatchApply.js.map +1 -1
- package/runtime/src/lifecycle/patch/snapshotPatchApply.ts +8 -1
- package/testing-library/dist/env/vitest.js +5 -5
- package/testing-library/dist/index.js +3 -3
- package/testing-library/dist/pure.js +89 -89
- package/testing-library/dist/vitest-global-setup.js +41 -41
- package/testing-library/dist/vitest.config.js +17 -14
- package/worklet-runtime/dist/dev.js +1 -1
- package/worklet-runtime/dist/main.js +0 -1
- package/worklet-runtime/lib/bindings/bindings.d.ts +1 -1
- package/worklet-runtime/lib/bindings/bindings.js +1 -26
- package/worklet-runtime/lib/bindings/bindings.js.map +1 -1
- package/worklet-runtime/lib/bindings/index.d.ts +2 -1
- package/worklet-runtime/lib/bindings/index.js +2 -1
- package/worklet-runtime/lib/bindings/index.js.map +1 -1
- package/worklet-runtime/lib/bindings/observers.d.ts +1 -0
- package/worklet-runtime/lib/bindings/observers.js +31 -0
- package/worklet-runtime/lib/bindings/observers.js.map +1 -0
- package/worklet-runtime/dist/dev.js.map +0 -8
- package/worklet-runtime/dist/main.js.map +0 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @lynx-js/react
|
|
2
2
|
|
|
3
|
+
## 0.109.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Support for locating errors in the source code directly on the device when exceptions occur when using MTS. ([#1019](https://github.com/lynx-family/lynx-stack/pull/1019))
|
|
8
|
+
|
|
9
|
+
This requires Lynx engine v3.4 or later.
|
|
10
|
+
|
|
11
|
+
- Fix the "main-thread.js exception: ReferenceError: `__webpack_require__` is not defined" error in HMR. ([#985](https://github.com/lynx-family/lynx-stack/pull/985))
|
|
12
|
+
|
|
13
|
+
This error occurred when setting `output.iife: true`, which is the default value in `@lynx-js/rspeedy` v0.9.8.
|
|
14
|
+
|
|
3
15
|
## 0.109.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lynx-js/react",
|
|
3
|
-
"version": "0.109.
|
|
3
|
+
"version": "0.109.2",
|
|
4
4
|
"description": "ReactLynx is a framework for developing Lynx applications with familiar React.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -163,7 +163,7 @@
|
|
|
163
163
|
"devDependencies": {
|
|
164
164
|
"@lynx-js/types": "3.3.0",
|
|
165
165
|
"@microsoft/api-extractor": "7.52.8",
|
|
166
|
-
"@types/react": "^18.3.
|
|
166
|
+
"@types/react": "^18.3.23"
|
|
167
167
|
},
|
|
168
168
|
"peerDependencies": {
|
|
169
169
|
"@lynx-js/types": "*",
|
package/refresh/package.json
CHANGED
|
@@ -113,11 +113,18 @@ export function snapshotPatchApply(snapshotPatch) {
|
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
|
+
/* v8 ignore start */
|
|
116
117
|
/**
|
|
117
118
|
* Evaluates a string as code with ReactLynx runtime injected.
|
|
118
119
|
* Used for HMR (Hot Module Replacement) to update snapshot definitions.
|
|
119
120
|
*/
|
|
120
121
|
function evaluate(code) {
|
|
121
|
-
|
|
122
|
+
if (__DEV__) {
|
|
123
|
+
// We are using `eval` here to make the updated snapshot to access variables like `__webpack_require__`.
|
|
124
|
+
// See: https://github.com/lynx-family/lynx-stack/issues/983.
|
|
125
|
+
return eval(`(() => ${code})()`);
|
|
126
|
+
}
|
|
127
|
+
throw new Error('unreachable: evaluate is not supported in production');
|
|
122
128
|
}
|
|
129
|
+
/* v8 ignore stop */
|
|
123
130
|
//# sourceMappingURL=snapshotPatchApply.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshotPatchApply.js","sourceRoot":"","sources":["../../../src/lifecycle/patch/snapshotPatchApply.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"snapshotPatchApply.js","sourceRoot":"","sources":["../../../src/lifecycle/patch/snapshotPatchApply.ts"],"names":[],"mappings":"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"}
|
|
@@ -129,10 +129,17 @@ export function snapshotPatchApply(snapshotPatch: SnapshotPatch): void {
|
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
+
/* v8 ignore start */
|
|
132
133
|
/**
|
|
133
134
|
* Evaluates a string as code with ReactLynx runtime injected.
|
|
134
135
|
* Used for HMR (Hot Module Replacement) to update snapshot definitions.
|
|
135
136
|
*/
|
|
136
137
|
function evaluate<T>(code: string): T {
|
|
137
|
-
|
|
138
|
+
if (__DEV__) {
|
|
139
|
+
// We are using `eval` here to make the updated snapshot to access variables like `__webpack_require__`.
|
|
140
|
+
// See: https://github.com/lynx-family/lynx-stack/issues/983.
|
|
141
|
+
return eval(`(() => ${code})()`);
|
|
142
|
+
}
|
|
143
|
+
throw new Error('unreachable: evaluate is not supported in production');
|
|
138
144
|
}
|
|
145
|
+
/* v8 ignore stop */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { builtinEnvironments } from "vitest/environments";
|
|
2
|
+
import external_events_default from "events";
|
|
3
3
|
function util_define(object, properties) {
|
|
4
4
|
for (const name of Object.getOwnPropertyNames(properties)){
|
|
5
5
|
const propDesc = Object.getOwnPropertyDescriptor(properties, name);
|
|
@@ -321,7 +321,7 @@ function createPolyfills() {
|
|
|
321
321
|
]);
|
|
322
322
|
}
|
|
323
323
|
};
|
|
324
|
-
const ee = new
|
|
324
|
+
const ee = new external_events_default();
|
|
325
325
|
ee.dispatchEvent = ({ type, data })=>{
|
|
326
326
|
const isMainThread = __MAIN_THREAD__;
|
|
327
327
|
lynxTestingEnv.switchToBackgroundThread();
|
|
@@ -427,7 +427,7 @@ function injectBackgroundThreadGlobals(target, polyfills) {
|
|
|
427
427
|
updateData: {}
|
|
428
428
|
}
|
|
429
429
|
};
|
|
430
|
-
const globalEventEmitter = new
|
|
430
|
+
const globalEventEmitter = new external_events_default();
|
|
431
431
|
globalEventEmitter.trigger = globalEventEmitter.emit;
|
|
432
432
|
globalEventEmitter.toggle = globalEventEmitter.emit;
|
|
433
433
|
target.lynx = {
|
|
@@ -531,7 +531,7 @@ const env = {
|
|
|
531
531
|
transformMode: 'web',
|
|
532
532
|
async setup (global1) {
|
|
533
533
|
const fakeGlobal = {};
|
|
534
|
-
await
|
|
534
|
+
await builtinEnvironments.jsdom.setup(fakeGlobal, {});
|
|
535
535
|
global1.jsdom = fakeGlobal.jsdom;
|
|
536
536
|
const lynxTestingEnv1 = new LynxTestingEnv();
|
|
537
537
|
global1.lynxTestingEnv = lynxTestingEnv1;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { cleanup } from "./pure.js";
|
|
2
2
|
export * from "./pure.js";
|
|
3
3
|
if ('undefined' == typeof process || 'true' !== process.env.PTL_SKIP_AUTO_CLEANUP) {
|
|
4
4
|
if ('function' == typeof afterEach) afterEach(()=>{
|
|
5
|
-
|
|
5
|
+
cleanup();
|
|
6
6
|
lynxTestingEnv.reset();
|
|
7
7
|
});
|
|
8
8
|
else if ('function' == typeof teardown) teardown(()=>{
|
|
9
|
-
|
|
9
|
+
cleanup();
|
|
10
10
|
lynxTestingEnv.reset();
|
|
11
11
|
});
|
|
12
12
|
}
|
|
@@ -1,92 +1,92 @@
|
|
|
1
1
|
/*! For license information please see pure.js.LICENSE.txt */
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
2
|
+
import { jsx } from "@lynx-js/react/jsx-runtime";
|
|
3
|
+
import { cloneElement, createRef, h, render } from "preact";
|
|
4
|
+
import { useEffect } from "preact/hooks";
|
|
5
|
+
import { act } from "preact/test-utils";
|
|
6
|
+
import { __root } from "@lynx-js/react/internal";
|
|
7
|
+
import { flushDelayedLifecycleEvents } from "../../runtime/lib/lynx/tt.js";
|
|
8
|
+
import { clearPage } from "../../runtime/lib/snapshot.js";
|
|
9
9
|
var __webpack_modules__ = {
|
|
10
10
|
"../../../node_modules/.pnpm/@testing-library+dom@10.4.0/node_modules/@testing-library/dom/dist/@testing-library/dom.esm.js": function(module, __webpack_exports__, __webpack_require__) {
|
|
11
11
|
__webpack_require__.d(__webpack_exports__, {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
SU: ()=>findAllByTitle,
|
|
15
|
-
UK: ()=>getAllByTestId,
|
|
16
|
-
iJ: ()=>getAllByDisplayValue,
|
|
17
|
-
xx: ()=>findByPlaceholderText,
|
|
18
|
-
dB: ()=>getAllByTitle,
|
|
19
|
-
nG: ()=>getElementError,
|
|
20
|
-
F3: ()=>getRoles,
|
|
21
|
-
VF: ()=>queryAllByRoleWithSuggestions,
|
|
22
|
-
Z2: ()=>queryAllByTextWithSuggestions,
|
|
23
|
-
sp: ()=>screen,
|
|
24
|
-
Gi: ()=>buildQueries,
|
|
12
|
+
qg: ()=>getNodeText,
|
|
13
|
+
j: ()=>findAllByPlaceholderText,
|
|
25
14
|
Qc: ()=>findByAltText,
|
|
26
|
-
|
|
15
|
+
FE: ()=>getAllByText,
|
|
16
|
+
Jh: ()=>queryAllByDisplayValueWithSuggestions,
|
|
17
|
+
zZ: ()=>queryByText,
|
|
18
|
+
Rr: ()=>findAllByRole,
|
|
27
19
|
Sd: ()=>queryAllByTestIdWithSuggestions,
|
|
28
|
-
si: ()=>getByTestId,
|
|
29
|
-
DP: ()=>queryAllByPlaceholderTextWithSuggestions,
|
|
30
|
-
fl: ()=>findAllByText,
|
|
31
|
-
pP: ()=>findByTitle,
|
|
32
|
-
gF: ()=>getByDisplayValue,
|
|
33
|
-
u7: ()=>getByPlaceholderText,
|
|
34
|
-
kt: ()=>makeGetAllQuery,
|
|
35
|
-
fV: ()=>makeSingleQuery,
|
|
36
20
|
m_: ()=>build,
|
|
37
|
-
j: ()=>findAllByPlaceholderText,
|
|
38
|
-
cp: ()=>queryAllByTitleWithSuggestions,
|
|
39
|
-
MS: ()=>getByText,
|
|
40
|
-
PD: ()=>queryAllByAltTextWithSuggestions,
|
|
41
|
-
jQ: ()=>configure,
|
|
42
|
-
QU: ()=>queryAllByLabelTextWithSuggestions,
|
|
43
|
-
hq: ()=>queryByDisplayValue,
|
|
44
|
-
$S: ()=>getAllByRole,
|
|
45
21
|
Lr: ()=>getAllByAltText,
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
KS: ()=>queryByPlaceholderText,
|
|
53
|
-
X_: ()=>waitForWrapper,
|
|
22
|
+
iE: ()=>getConfig,
|
|
23
|
+
Op: ()=>getAllByPlaceholderText,
|
|
24
|
+
dB: ()=>getAllByTitle,
|
|
25
|
+
DR: ()=>findByDisplayValue,
|
|
26
|
+
MY: ()=>findAllByTestId,
|
|
27
|
+
o$: ()=>queries,
|
|
54
28
|
mz: ()=>waitForElementToBeRemoved,
|
|
55
|
-
zZ: ()=>queryByText,
|
|
56
|
-
uh: ()=>getQueriesForElement,
|
|
57
29
|
Do: ()=>findAllByLabelText,
|
|
30
|
+
YA: ()=>getByRole,
|
|
31
|
+
bH: ()=>wrapAllByQueryWithSuggestion,
|
|
58
32
|
BX: ()=>fireEvent,
|
|
33
|
+
pP: ()=>findByTitle,
|
|
34
|
+
DP: ()=>queryAllByPlaceholderTextWithSuggestions,
|
|
35
|
+
SU: ()=>findAllByTitle,
|
|
36
|
+
aT: ()=>findAllByDisplayValue,
|
|
59
37
|
YS: ()=>getByLabelTextWithSuggestions,
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
38
|
+
Qz: ()=>getSuggestedQuery,
|
|
39
|
+
iJ: ()=>getAllByDisplayValue,
|
|
40
|
+
X_: ()=>waitForWrapper,
|
|
41
|
+
J$: ()=>logDOM,
|
|
42
|
+
UK: ()=>getAllByTestId,
|
|
43
|
+
$S: ()=>getAllByRole,
|
|
44
|
+
gm: ()=>findByLabelText,
|
|
45
|
+
Cn: ()=>getByTitle,
|
|
46
|
+
si: ()=>getByTestId,
|
|
47
|
+
Gi: ()=>buildQueries,
|
|
48
|
+
c6: ()=>getMultipleElementsFoundError,
|
|
49
|
+
MS: ()=>getByText,
|
|
50
|
+
CZ: ()=>dom_esm_isInaccessible,
|
|
51
|
+
VF: ()=>queryAllByRoleWithSuggestions,
|
|
70
52
|
JU: ()=>queryByAttribute,
|
|
71
|
-
fn: ()=>queryByLabelText,
|
|
72
53
|
zx: ()=>queryHelpers,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
54
|
+
cp: ()=>queryAllByTitleWithSuggestions,
|
|
55
|
+
hq: ()=>queryByDisplayValue,
|
|
56
|
+
fn: ()=>queryByLabelText,
|
|
57
|
+
nG: ()=>getElementError,
|
|
58
|
+
sp: ()=>screen,
|
|
59
|
+
nd: ()=>findByTestId,
|
|
60
|
+
u7: ()=>getByPlaceholderText,
|
|
61
|
+
kG: ()=>wrapSingleQueryWithSuggestion,
|
|
62
|
+
uh: ()=>getQueriesForElement,
|
|
63
|
+
QU: ()=>queryAllByLabelTextWithSuggestions,
|
|
76
64
|
kd: ()=>findAllByAltText,
|
|
77
|
-
|
|
78
|
-
o$: ()=>queries,
|
|
79
|
-
Xv: ()=>queryByTestId,
|
|
80
|
-
MY: ()=>findAllByTestId,
|
|
65
|
+
fl: ()=>findAllByText,
|
|
81
66
|
T6: ()=>getAllByLabelTextWithSuggestions,
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
67
|
+
nE: ()=>getByAltText,
|
|
68
|
+
vF: ()=>prettyDOM,
|
|
69
|
+
PD: ()=>queryAllByAltTextWithSuggestions,
|
|
70
|
+
M: ()=>findByText,
|
|
71
|
+
RG: ()=>queryByRole,
|
|
72
|
+
Xv: ()=>queryByTestId,
|
|
73
|
+
Ox: ()=>queryAllByAttribute,
|
|
74
|
+
Uv: ()=>makeFindQuery,
|
|
75
|
+
xG: ()=>getDefaultNormalizer,
|
|
76
|
+
yM: ()=>createEvent,
|
|
77
|
+
xx: ()=>findByPlaceholderText,
|
|
78
|
+
fV: ()=>makeSingleQuery,
|
|
79
|
+
jQ: ()=>configure,
|
|
80
|
+
Z2: ()=>queryAllByTextWithSuggestions,
|
|
81
|
+
hN: ()=>findByRole,
|
|
85
82
|
W2: ()=>getQueriesForElement,
|
|
86
83
|
m2: ()=>logRoles,
|
|
87
|
-
Jh: ()=>queryAllByDisplayValueWithSuggestions,
|
|
88
84
|
rf: ()=>queryByAltText,
|
|
89
|
-
|
|
85
|
+
KS: ()=>queryByPlaceholderText,
|
|
86
|
+
kt: ()=>makeGetAllQuery,
|
|
87
|
+
F3: ()=>getRoles,
|
|
88
|
+
MM: ()=>queryByTitle,
|
|
89
|
+
gF: ()=>getByDisplayValue
|
|
90
90
|
});
|
|
91
91
|
var build = __webpack_require__("../../../node_modules/.pnpm/pretty-format@27.5.1/node_modules/pretty-format/build/index.js");
|
|
92
92
|
var toStr = Object.prototype.toString;
|
|
@@ -14566,33 +14566,33 @@ function waitSchedule() {
|
|
|
14566
14566
|
(0, dom_esm.jQ)({
|
|
14567
14567
|
asyncWrapper: async (cb)=>{
|
|
14568
14568
|
let result;
|
|
14569
|
-
await
|
|
14569
|
+
await act(()=>{
|
|
14570
14570
|
result = cb();
|
|
14571
14571
|
});
|
|
14572
14572
|
return result;
|
|
14573
14573
|
},
|
|
14574
14574
|
eventWrapper: (cb)=>{
|
|
14575
14575
|
let result;
|
|
14576
|
-
|
|
14576
|
+
act(()=>{
|
|
14577
14577
|
result = cb();
|
|
14578
14578
|
});
|
|
14579
14579
|
return result;
|
|
14580
14580
|
}
|
|
14581
14581
|
});
|
|
14582
|
-
function
|
|
14582
|
+
function pure_render(ui, { queries, wrapper: WrapperComponent, enableMainThread = false, enableBackgroundThread = true } = {}) {
|
|
14583
14583
|
if (!enableMainThread && !enableBackgroundThread) throw new Error('You must enable at least one thread for rendering (enableMainThread or enableBackgroundThread)');
|
|
14584
|
-
const wrapUiIfNeeded = (innerElement)=>WrapperComponent ?
|
|
14584
|
+
const wrapUiIfNeeded = (innerElement)=>WrapperComponent ? h(WrapperComponent, null, innerElement) : innerElement;
|
|
14585
14585
|
const comp = wrapUiIfNeeded(ui);
|
|
14586
|
-
const compMainThread =
|
|
14587
|
-
const compBackgroundThread =
|
|
14586
|
+
const compMainThread = cloneElement(comp);
|
|
14587
|
+
const compBackgroundThread = cloneElement(comp);
|
|
14588
14588
|
globalThis.lynxTestingEnv.switchToMainThread();
|
|
14589
|
-
|
|
14589
|
+
__root.__jsx = enableMainThread ? compMainThread : null;
|
|
14590
14590
|
renderPage();
|
|
14591
14591
|
if (enableBackgroundThread) {
|
|
14592
14592
|
globalThis.lynxTestingEnv.switchToBackgroundThread();
|
|
14593
|
-
|
|
14594
|
-
|
|
14595
|
-
|
|
14593
|
+
act(()=>{
|
|
14594
|
+
render(compBackgroundThread, __root);
|
|
14595
|
+
flushDelayedLifecycleEvents();
|
|
14596
14596
|
});
|
|
14597
14597
|
}
|
|
14598
14598
|
return {
|
|
@@ -14600,7 +14600,7 @@ function render(ui, { queries, wrapper: WrapperComponent, enableMainThread = fal
|
|
|
14600
14600
|
unmount: cleanup,
|
|
14601
14601
|
rerender: (rerenderUi)=>{
|
|
14602
14602
|
lynxTestingEnv.reset();
|
|
14603
|
-
return
|
|
14603
|
+
return pure_render(wrapUiIfNeeded(rerenderUi), {
|
|
14604
14604
|
queries,
|
|
14605
14605
|
wrapper: WrapperComponent,
|
|
14606
14606
|
enableMainThread,
|
|
@@ -14613,31 +14613,31 @@ function render(ui, { queries, wrapper: WrapperComponent, enableMainThread = fal
|
|
|
14613
14613
|
function cleanup() {
|
|
14614
14614
|
const isMainThread = __MAIN_THREAD__;
|
|
14615
14615
|
globalThis.lynxTestingEnv.switchToBackgroundThread();
|
|
14616
|
-
|
|
14617
|
-
|
|
14616
|
+
act(()=>{
|
|
14617
|
+
render(null, __root);
|
|
14618
14618
|
});
|
|
14619
14619
|
lynxTestingEnv.mainThread.elementTree.root = void 0;
|
|
14620
|
-
|
|
14620
|
+
clearPage();
|
|
14621
14621
|
lynxTestingEnv.jsdom.window.document.body.innerHTML = '';
|
|
14622
14622
|
if (isMainThread) globalThis.lynxTestingEnv.switchToMainThread();
|
|
14623
14623
|
}
|
|
14624
14624
|
function renderHook(renderCallback, options) {
|
|
14625
14625
|
const { initialProps, wrapper } = options || {};
|
|
14626
|
-
const result =
|
|
14626
|
+
const result = createRef();
|
|
14627
14627
|
function TestComponent({ renderCallbackProps }) {
|
|
14628
14628
|
const pendingResult = renderCallback(renderCallbackProps);
|
|
14629
|
-
|
|
14629
|
+
useEffect(()=>{
|
|
14630
14630
|
result.current = pendingResult;
|
|
14631
14631
|
});
|
|
14632
14632
|
return null;
|
|
14633
14633
|
}
|
|
14634
|
-
const { rerender: baseRerender, unmount } =
|
|
14634
|
+
const { rerender: baseRerender, unmount } = pure_render(/*#__PURE__*/ jsx(TestComponent, {
|
|
14635
14635
|
renderCallbackProps: initialProps
|
|
14636
14636
|
}), {
|
|
14637
14637
|
wrapper
|
|
14638
14638
|
});
|
|
14639
14639
|
function rerender(rerenderCallbackProps) {
|
|
14640
|
-
return baseRerender(/*#__PURE__*/
|
|
14640
|
+
return baseRerender(/*#__PURE__*/ jsx(TestComponent, {
|
|
14641
14641
|
renderCallbackProps: rerenderCallbackProps
|
|
14642
14642
|
}));
|
|
14643
14643
|
}
|
|
@@ -14724,4 +14724,4 @@ var __webpack_exports__waitForElementToBeRemoved = dom_esm.mz;
|
|
|
14724
14724
|
var __webpack_exports__within = dom_esm.uh;
|
|
14725
14725
|
var __webpack_exports__wrapAllByQueryWithSuggestion = dom_esm.bH;
|
|
14726
14726
|
var __webpack_exports__wrapSingleQueryWithSuggestion = dom_esm.kG;
|
|
14727
|
-
export { cleanup, fireEvent, render, renderHook, waitSchedule, __webpack_exports__buildQueries as buildQueries, __webpack_exports__configure as configure, __webpack_exports__createEvent as createEvent, __webpack_exports__findAllByAltText as findAllByAltText, __webpack_exports__findAllByDisplayValue as findAllByDisplayValue, __webpack_exports__findAllByLabelText as findAllByLabelText, __webpack_exports__findAllByPlaceholderText as findAllByPlaceholderText, __webpack_exports__findAllByRole as findAllByRole, __webpack_exports__findAllByTestId as findAllByTestId, __webpack_exports__findAllByText as findAllByText, __webpack_exports__findAllByTitle as findAllByTitle, __webpack_exports__findByAltText as findByAltText, __webpack_exports__findByDisplayValue as findByDisplayValue, __webpack_exports__findByLabelText as findByLabelText, __webpack_exports__findByPlaceholderText as findByPlaceholderText, __webpack_exports__findByRole as findByRole, __webpack_exports__findByTestId as findByTestId, __webpack_exports__findByText as findByText, __webpack_exports__findByTitle as findByTitle, __webpack_exports__getAllByAltText as getAllByAltText, __webpack_exports__getAllByDisplayValue as getAllByDisplayValue, __webpack_exports__getAllByLabelText as getAllByLabelText, __webpack_exports__getAllByPlaceholderText as getAllByPlaceholderText, __webpack_exports__getAllByRole as getAllByRole, __webpack_exports__getAllByTestId as getAllByTestId, __webpack_exports__getAllByText as getAllByText, __webpack_exports__getAllByTitle as getAllByTitle, __webpack_exports__getByAltText as getByAltText, __webpack_exports__getByDisplayValue as getByDisplayValue, __webpack_exports__getByLabelText as getByLabelText, __webpack_exports__getByPlaceholderText as getByPlaceholderText, __webpack_exports__getByRole as getByRole, __webpack_exports__getByTestId as getByTestId, __webpack_exports__getByText as getByText, __webpack_exports__getByTitle as getByTitle, __webpack_exports__getConfig as getConfig, __webpack_exports__getDefaultNormalizer as getDefaultNormalizer, __webpack_exports__getElementError as getElementError, __webpack_exports__getMultipleElementsFoundError as getMultipleElementsFoundError, __webpack_exports__getNodeText as getNodeText, __webpack_exports__getQueriesForElement as getQueriesForElement, __webpack_exports__getRoles as getRoles, __webpack_exports__getSuggestedQuery as getSuggestedQuery, __webpack_exports__isInaccessible as isInaccessible, __webpack_exports__logDOM as logDOM, __webpack_exports__logRoles as logRoles, __webpack_exports__makeFindQuery as makeFindQuery, __webpack_exports__makeGetAllQuery as makeGetAllQuery, __webpack_exports__makeSingleQuery as makeSingleQuery, __webpack_exports__prettyDOM as prettyDOM, __webpack_exports__prettyFormat as prettyFormat, __webpack_exports__queries as queries, __webpack_exports__queryAllByAltText as queryAllByAltText, __webpack_exports__queryAllByAttribute as queryAllByAttribute, __webpack_exports__queryAllByDisplayValue as queryAllByDisplayValue, __webpack_exports__queryAllByLabelText as queryAllByLabelText, __webpack_exports__queryAllByPlaceholderText as queryAllByPlaceholderText, __webpack_exports__queryAllByRole as queryAllByRole, __webpack_exports__queryAllByTestId as queryAllByTestId, __webpack_exports__queryAllByText as queryAllByText, __webpack_exports__queryAllByTitle as queryAllByTitle, __webpack_exports__queryByAltText as queryByAltText, __webpack_exports__queryByAttribute as queryByAttribute, __webpack_exports__queryByDisplayValue as queryByDisplayValue, __webpack_exports__queryByLabelText as queryByLabelText, __webpack_exports__queryByPlaceholderText as queryByPlaceholderText, __webpack_exports__queryByRole as queryByRole, __webpack_exports__queryByTestId as queryByTestId, __webpack_exports__queryByText as queryByText, __webpack_exports__queryByTitle as queryByTitle, __webpack_exports__queryHelpers as queryHelpers, __webpack_exports__screen as screen, __webpack_exports__waitFor as waitFor, __webpack_exports__waitForElementToBeRemoved as waitForElementToBeRemoved, __webpack_exports__within as within, __webpack_exports__wrapAllByQueryWithSuggestion as wrapAllByQueryWithSuggestion, __webpack_exports__wrapSingleQueryWithSuggestion as wrapSingleQueryWithSuggestion };
|
|
14727
|
+
export { cleanup, fireEvent, pure_render as render, renderHook, waitSchedule, __webpack_exports__buildQueries as buildQueries, __webpack_exports__configure as configure, __webpack_exports__createEvent as createEvent, __webpack_exports__findAllByAltText as findAllByAltText, __webpack_exports__findAllByDisplayValue as findAllByDisplayValue, __webpack_exports__findAllByLabelText as findAllByLabelText, __webpack_exports__findAllByPlaceholderText as findAllByPlaceholderText, __webpack_exports__findAllByRole as findAllByRole, __webpack_exports__findAllByTestId as findAllByTestId, __webpack_exports__findAllByText as findAllByText, __webpack_exports__findAllByTitle as findAllByTitle, __webpack_exports__findByAltText as findByAltText, __webpack_exports__findByDisplayValue as findByDisplayValue, __webpack_exports__findByLabelText as findByLabelText, __webpack_exports__findByPlaceholderText as findByPlaceholderText, __webpack_exports__findByRole as findByRole, __webpack_exports__findByTestId as findByTestId, __webpack_exports__findByText as findByText, __webpack_exports__findByTitle as findByTitle, __webpack_exports__getAllByAltText as getAllByAltText, __webpack_exports__getAllByDisplayValue as getAllByDisplayValue, __webpack_exports__getAllByLabelText as getAllByLabelText, __webpack_exports__getAllByPlaceholderText as getAllByPlaceholderText, __webpack_exports__getAllByRole as getAllByRole, __webpack_exports__getAllByTestId as getAllByTestId, __webpack_exports__getAllByText as getAllByText, __webpack_exports__getAllByTitle as getAllByTitle, __webpack_exports__getByAltText as getByAltText, __webpack_exports__getByDisplayValue as getByDisplayValue, __webpack_exports__getByLabelText as getByLabelText, __webpack_exports__getByPlaceholderText as getByPlaceholderText, __webpack_exports__getByRole as getByRole, __webpack_exports__getByTestId as getByTestId, __webpack_exports__getByText as getByText, __webpack_exports__getByTitle as getByTitle, __webpack_exports__getConfig as getConfig, __webpack_exports__getDefaultNormalizer as getDefaultNormalizer, __webpack_exports__getElementError as getElementError, __webpack_exports__getMultipleElementsFoundError as getMultipleElementsFoundError, __webpack_exports__getNodeText as getNodeText, __webpack_exports__getQueriesForElement as getQueriesForElement, __webpack_exports__getRoles as getRoles, __webpack_exports__getSuggestedQuery as getSuggestedQuery, __webpack_exports__isInaccessible as isInaccessible, __webpack_exports__logDOM as logDOM, __webpack_exports__logRoles as logRoles, __webpack_exports__makeFindQuery as makeFindQuery, __webpack_exports__makeGetAllQuery as makeGetAllQuery, __webpack_exports__makeSingleQuery as makeSingleQuery, __webpack_exports__prettyDOM as prettyDOM, __webpack_exports__prettyFormat as prettyFormat, __webpack_exports__queries as queries, __webpack_exports__queryAllByAltText as queryAllByAltText, __webpack_exports__queryAllByAttribute as queryAllByAttribute, __webpack_exports__queryAllByDisplayValue as queryAllByDisplayValue, __webpack_exports__queryAllByLabelText as queryAllByLabelText, __webpack_exports__queryAllByPlaceholderText as queryAllByPlaceholderText, __webpack_exports__queryAllByRole as queryAllByRole, __webpack_exports__queryAllByTestId as queryAllByTestId, __webpack_exports__queryAllByText as queryAllByText, __webpack_exports__queryAllByTitle as queryAllByTitle, __webpack_exports__queryByAltText as queryByAltText, __webpack_exports__queryByAttribute as queryByAttribute, __webpack_exports__queryByDisplayValue as queryByDisplayValue, __webpack_exports__queryByLabelText as queryByLabelText, __webpack_exports__queryByPlaceholderText as queryByPlaceholderText, __webpack_exports__queryByRole as queryByRole, __webpack_exports__queryByTestId as queryByTestId, __webpack_exports__queryByText as queryByText, __webpack_exports__queryByTitle as queryByTitle, __webpack_exports__queryHelpers as queryHelpers, __webpack_exports__screen as screen, __webpack_exports__waitFor as waitFor, __webpack_exports__waitForElementToBeRemoved as waitForElementToBeRemoved, __webpack_exports__within as within, __webpack_exports__wrapAllByQueryWithSuggestion as wrapAllByQueryWithSuggestion, __webpack_exports__wrapSingleQueryWithSuggestion as wrapSingleQueryWithSuggestion };
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
1
|
+
import { options } from "preact";
|
|
2
|
+
import { BackgroundSnapshotInstance } from "../../runtime/lib/backgroundSnapshot.js";
|
|
3
|
+
import { clearCommitTaskId, replaceCommitHook } from "../../runtime/lib/lifecycle/patch/commit.js";
|
|
4
|
+
import { deinitGlobalSnapshotPatch } from "../../runtime/lib/lifecycle/patch/snapshotPatch.js";
|
|
5
|
+
import { injectUpdateMainThread } from "../../runtime/lib/lifecycle/patch/updateMainThread.js";
|
|
6
|
+
import { injectCalledByNative } from "../../runtime/lib/lynx/calledByNative.js";
|
|
7
|
+
import { flushDelayedLifecycleEvents, injectTt } from "../../runtime/lib/lynx/tt.js";
|
|
8
|
+
import { setRoot } from "../../runtime/lib/root.js";
|
|
9
|
+
import { SnapshotInstance, backgroundSnapshotInstanceManager, snapshotInstanceManager } from "../../runtime/lib/snapshot.js";
|
|
10
|
+
import { destroyWorklet } from "../../runtime/lib/worklet/destroy.js";
|
|
11
|
+
import { initApiEnv } from "../../worklet-runtime/lib/api/lynxApi.js";
|
|
12
|
+
import { initEventListeners } from "../../worklet-runtime/lib/listeners.js";
|
|
13
|
+
import { initWorklet } from "../../worklet-runtime/lib/workletRuntime.js";
|
|
14
14
|
const { onInjectMainThreadGlobals, onInjectBackgroundThreadGlobals, onResetLynxTestingEnv, onSwitchedToMainThread, onSwitchedToBackgroundThread, onInitWorkletRuntime } = globalThis;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
injectCalledByNative();
|
|
16
|
+
injectUpdateMainThread();
|
|
17
|
+
replaceCommitHook();
|
|
18
18
|
globalThis.onInitWorkletRuntime = ()=>{
|
|
19
19
|
if (onInitWorkletRuntime) onInitWorkletRuntime();
|
|
20
20
|
if (process.env.DEBUG) console.log('initWorkletRuntime');
|
|
@@ -22,26 +22,26 @@ globalThis.onInitWorkletRuntime = ()=>{
|
|
|
22
22
|
lynx.setInterval = setInterval;
|
|
23
23
|
lynx.clearTimeout = clearTimeout;
|
|
24
24
|
lynx.clearInterval = clearInterval;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
initWorklet();
|
|
26
|
+
initApiEnv();
|
|
27
|
+
initEventListeners();
|
|
28
28
|
return true;
|
|
29
29
|
};
|
|
30
30
|
globalThis.onInjectMainThreadGlobals = (target)=>{
|
|
31
31
|
if (onInjectMainThreadGlobals) onInjectMainThreadGlobals();
|
|
32
32
|
if (process.env.DEBUG) console.log('onInjectMainThreadGlobals');
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
target.__root = new
|
|
33
|
+
snapshotInstanceManager.clear();
|
|
34
|
+
snapshotInstanceManager.nextId = 0;
|
|
35
|
+
target.__root = new SnapshotInstance('root');
|
|
36
36
|
function setupDocument(document) {
|
|
37
37
|
document.createElement = function(type) {
|
|
38
|
-
return new
|
|
38
|
+
return new SnapshotInstance(type);
|
|
39
39
|
};
|
|
40
40
|
document.createElementNS = function(_ns, type) {
|
|
41
|
-
return new
|
|
41
|
+
return new SnapshotInstance(type);
|
|
42
42
|
};
|
|
43
43
|
document.createTextNode = function(text) {
|
|
44
|
-
const i = new
|
|
44
|
+
const i = new SnapshotInstance(null);
|
|
45
45
|
i.setAttribute(0, text);
|
|
46
46
|
Object.defineProperty(i, 'data', {
|
|
47
47
|
set (v) {
|
|
@@ -58,18 +58,18 @@ globalThis.onInjectMainThreadGlobals = (target)=>{
|
|
|
58
58
|
globalThis.onInjectBackgroundThreadGlobals = (target)=>{
|
|
59
59
|
if (onInjectBackgroundThreadGlobals) onInjectBackgroundThreadGlobals();
|
|
60
60
|
if (process.env.DEBUG) console.log('onInjectBackgroundThreadGlobals');
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
target.__root = new
|
|
61
|
+
backgroundSnapshotInstanceManager.clear();
|
|
62
|
+
backgroundSnapshotInstanceManager.nextId = 0;
|
|
63
|
+
target.__root = new BackgroundSnapshotInstance('root');
|
|
64
64
|
function setupBackgroundDocument(document) {
|
|
65
65
|
document.createElement = function(type) {
|
|
66
|
-
return new
|
|
66
|
+
return new BackgroundSnapshotInstance(type);
|
|
67
67
|
};
|
|
68
68
|
document.createElementNS = function(_ns, type) {
|
|
69
|
-
return new
|
|
69
|
+
return new BackgroundSnapshotInstance(type);
|
|
70
70
|
};
|
|
71
71
|
document.createTextNode = function(text) {
|
|
72
|
-
const i = new
|
|
72
|
+
const i = new BackgroundSnapshotInstance(null);
|
|
73
73
|
i.setAttribute(0, text);
|
|
74
74
|
Object.defineProperty(i, 'data', {
|
|
75
75
|
set (v) {
|
|
@@ -84,7 +84,7 @@ globalThis.onInjectBackgroundThreadGlobals = (target)=>{
|
|
|
84
84
|
target.globalPipelineOptions = void 0;
|
|
85
85
|
const oldLynxCoreInject = globalThis.lynxCoreInject;
|
|
86
86
|
globalThis.lynxCoreInject = target.lynxCoreInject;
|
|
87
|
-
|
|
87
|
+
injectTt();
|
|
88
88
|
globalThis.lynxCoreInject = oldLynxCoreInject;
|
|
89
89
|
target.lynx.requireModuleAsync = async (url, callback)=>{
|
|
90
90
|
try {
|
|
@@ -93,29 +93,29 @@ globalThis.onInjectBackgroundThreadGlobals = (target)=>{
|
|
|
93
93
|
callback(err, null);
|
|
94
94
|
}
|
|
95
95
|
};
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
deinitGlobalSnapshotPatch();
|
|
97
|
+
clearCommitTaskId();
|
|
98
98
|
};
|
|
99
99
|
globalThis.onResetLynxTestingEnv = ()=>{
|
|
100
100
|
if (onResetLynxTestingEnv) onResetLynxTestingEnv();
|
|
101
101
|
if (process.env.DEBUG) console.log('onResetLynxTestingEnv');
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
flushDelayedLifecycleEvents();
|
|
103
|
+
destroyWorklet();
|
|
104
104
|
lynxTestingEnv.switchToMainThread();
|
|
105
|
-
|
|
105
|
+
initEventListeners();
|
|
106
106
|
lynxTestingEnv.switchToBackgroundThread();
|
|
107
107
|
};
|
|
108
108
|
globalThis.onSwitchedToMainThread = ()=>{
|
|
109
109
|
if (onSwitchedToMainThread) onSwitchedToMainThread();
|
|
110
110
|
if (process.env.DEBUG) console.log('onSwitchedToMainThread');
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
setRoot(globalThis.__root);
|
|
112
|
+
options.document = globalThis._document;
|
|
113
113
|
};
|
|
114
114
|
globalThis.onSwitchedToBackgroundThread = ()=>{
|
|
115
115
|
if (onSwitchedToBackgroundThread) onSwitchedToBackgroundThread();
|
|
116
116
|
if (process.env.DEBUG) console.log('onSwitchedToBackgroundThread');
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
setRoot(globalThis.__root);
|
|
118
|
+
options.document = globalThis._document;
|
|
119
119
|
};
|
|
120
120
|
globalThis.onInjectMainThreadGlobals(globalThis.lynxTestingEnv.mainThread.globalThis);
|
|
121
121
|
globalThis.onInjectBackgroundThreadGlobals(globalThis.lynxTestingEnv.backgroundThread.globalThis);
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
const vitest_config_filename =
|
|
7
|
-
const vitest_config_dirname =
|
|
8
|
-
const vitest_config_require =
|
|
1
|
+
import { defineConfig } from "vitest/config";
|
|
2
|
+
import { VitestPackageInstaller } from "vitest/node";
|
|
3
|
+
import external_path_default from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import { createRequire } from "module";
|
|
6
|
+
const vitest_config_filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const vitest_config_dirname = external_path_default.dirname(vitest_config_filename);
|
|
8
|
+
const vitest_config_require = createRequire(import.meta.url);
|
|
9
9
|
async function ensurePackagesInstalled() {
|
|
10
|
-
const installer = new
|
|
10
|
+
const installer = new VitestPackageInstaller();
|
|
11
11
|
const installed = await installer.ensureInstalled('jsdom', process.cwd());
|
|
12
12
|
if (!installed) {
|
|
13
13
|
console.log('ReactLynx Testing Library requires jsdom to be installed.');
|
|
@@ -28,8 +28,8 @@ const createVitestConfig = async (options)=>{
|
|
|
28
28
|
return '';
|
|
29
29
|
}
|
|
30
30
|
const { transformReactLynxSync } = vitest_config_require('@lynx-js/react/transform');
|
|
31
|
-
const relativePath =
|
|
32
|
-
const basename =
|
|
31
|
+
const relativePath = normalizeSlashes(external_path_default.relative(vitest_config_dirname, sourcePath));
|
|
32
|
+
const basename = external_path_default.basename(sourcePath);
|
|
33
33
|
const result = transformReactLynxSync(sourceText, {
|
|
34
34
|
mode: 'test',
|
|
35
35
|
pluginName: '',
|
|
@@ -67,11 +67,11 @@ const createVitestConfig = async (options)=>{
|
|
|
67
67
|
}
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
|
-
return
|
|
70
|
+
return defineConfig({
|
|
71
71
|
server: {
|
|
72
72
|
fs: {
|
|
73
73
|
allow: [
|
|
74
|
-
|
|
74
|
+
external_path_default.join(vitest_config_dirname, '..')
|
|
75
75
|
]
|
|
76
76
|
}
|
|
77
77
|
},
|
|
@@ -82,9 +82,12 @@ const createVitestConfig = async (options)=>{
|
|
|
82
82
|
environment: vitest_config_require.resolve('./env/vitest'),
|
|
83
83
|
globals: true,
|
|
84
84
|
setupFiles: [
|
|
85
|
-
|
|
85
|
+
external_path_default.join(vitest_config_dirname, 'vitest-global-setup')
|
|
86
86
|
]
|
|
87
87
|
}
|
|
88
88
|
});
|
|
89
89
|
};
|
|
90
|
+
function normalizeSlashes(file) {
|
|
91
|
+
return file.replaceAll(external_path_default.win32.sep, '/');
|
|
92
|
+
}
|
|
90
93
|
export { createVitestConfig };
|
|
@@ -518,4 +518,4 @@
|
|
|
518
518
|
initEventListeners();
|
|
519
519
|
}
|
|
520
520
|
})();
|
|
521
|
-
//# sourceMappingURL=dev.js.map
|
|
521
|
+
//# 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+O1xuICBydW5EZWxheWVkV29ya2xldCh3b3JrbGV0OiBXb3JrbGV0LCBlbGVtZW50OiBFbGVtZW50Tm9kZSk6IHZvaWQ7XG4gIGNsZWFyRGVsYXllZFdvcmtsZXRzKCk6IHZvaWQ7XG59XG5cbmxldCBpbXBsOiBFdmVudERlbGF5SW1wbCB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaW5pdEV2ZW50RGVsYXkoKTogRXZlbnREZWxheUltcGwge1xuICByZXR1cm4gKGltcGwgPSB7XG4gICAgX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwOiBuZXcgTWFwKCksXG4gICAgcnVuRGVsYXllZFdvcmtsZXQsXG4gICAgY2xlYXJEZWxheWVkV29ya2xldHMsXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoXG4gIGhhc2g6IHN0cmluZyxcbiAgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10sXG4pOiB2b2lkIHtcbiAgcHJvZmlsZSgnZGVsYXlFeGVjVW50aWxKc1JlYWR5OiAnICsgaGFzaCwgKCkgPT4ge1xuICAgIGNvbnN0IG1hcCA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcDtcbiAgICBjb25zdCBwYXJhbVZlYyA9IG1hcC5nZXQoaGFzaCk7XG4gICAgaWYgKHBhcmFtVmVjKSB7XG4gICAgICBwYXJhbVZlYy5wdXNoKHBhcmFtcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcC5zZXQoaGFzaCwgW3BhcmFtc10pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJ1bkRlbGF5ZWRXb3JrbGV0KHdvcmtsZXQ6IFdvcmtsZXQsIGVsZW1lbnQ6IEVsZW1lbnROb2RlKTogdm9pZCB7XG4gIHByb2ZpbGUoJ2NvbW1pdERlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtc1ZlYyA9IGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5nZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgKTtcbiAgICBpZiAocGFyYW1zVmVjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVmdFBhcmFtc1ZlYzogQ2xvc3VyZVZhbHVlVHlwZVtdW10gPSBbXTtcbiAgICBwYXJhbXNWZWMuZm9yRWFjaCgocGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdFBhcmFtID0gcGFyYW1zWzBdIGFzIHsgY3VycmVudFRhcmdldD86IHsgZWxlbWVudFJlZnB0cj86IEVsZW1lbnROb2RlIH0gfSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChmaXJzdFBhcmFtPy5jdXJyZW50VGFyZ2V0Py5lbGVtZW50UmVmcHRyID09PSBlbGVtZW50KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHByb2ZpbGUoJ3J1bkRlbGF5ZWRXb3JrbGV0JywgKCkgPT4ge1xuICAgICAgICAgICAgcnVuV29ya2xldCh3b3JrbGV0LCBwYXJhbXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxlZnRQYXJhbXNWZWMucHVzaChwYXJhbXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGltcGwhLl9kZWxheWVkV29ya2xldFBhcmFtc01hcC5zZXQoXG4gICAgICB3b3JrbGV0Ll93a2x0SWQsXG4gICAgICBsZWZ0UGFyYW1zVmVjLFxuICAgICk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjbGVhckRlbGF5ZWRXb3JrbGV0cygpOiB2b2lkIHtcbiAgaW1wbCEuX2RlbGF5ZWRXb3JrbGV0UGFyYW1zTWFwLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7IHR5cGUgRXZlbnREZWxheUltcGwsIGluaXRFdmVudERlbGF5LCBkZWxheUV4ZWNVbnRpbEpzUmVhZHksIHJ1bkRlbGF5ZWRXb3JrbGV0LCBjbGVhckRlbGF5ZWRXb3JrbGV0cyB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2FwaS9lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgSnNGbkhhbmRsZSwgV29ya2xldCwgV29ya2xldFJlZklkLCBXb3JrbGV0UmVmSW1wbCB9IGZyb20gJy4vYmluZGluZ3MvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJvZmlsZSB9IGZyb20gJy4vdXRpbHMvcHJvZmlsZS5qcyc7XG5cbi8qKlxuICogSHlkcmF0ZXMgYSBXb3JrbGV0IGNvbnRleHQgd2l0aCBkYXRhIGZyb20gYSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0LlxuICogVGhpcyBwcm9jZXNzIGlzIHR5cGljYWxseSB1c2VkIHRvIHJ1biBhbGwgZGVsYXllZCBgcnVuT25CYWNrZ3JvdW5kYCBmdW5jdGlvbnNcbiAqIGFuZCBpbml0aWFsaXplIGBXb3JrbGV0UmVmYCB2YWx1ZXMgbW9kaWZpZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gY3R4IFRoZSB0YXJnZXQgV29ya2xldCBjb250ZXh0IHRvIGJlIGh5ZHJhdGVkLlxuICogQHBhcmFtIGZpcnN0U2NyZWVuQ3R4IFRoZSBXb3JrbGV0IGNvbnRleHQgZnJvbSB0aGUgZmlyc3Qgc2NyZWVuIHJlbmRlcmluZyxcbiAqICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBkYXRhIHRvIGh5ZHJhdGUgd2l0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVDdHgoY3R4OiBXb3JrbGV0LCBmaXJzdFNjcmVlbkN0eDogV29ya2xldCk6IHZvaWQge1xuICBwcm9maWxlKCdoeWRyYXRlQ3R4JywgKCkgPT4ge1xuICAgIGh5ZHJhdGVDdHhJbXBsKGN0eCwgZmlyc3RTY3JlZW5DdHgsIGN0eC5fZXhlY0lkISk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoeWRyYXRlQ3R4SW1wbChjdHg6IENsb3N1cmVWYWx1ZVR5cGUsIGZpcnN0U2NyZWVuQ3R4OiBDbG9zdXJlVmFsdWVUeXBlLCBleGVjSWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoIWN0eCB8fCB0eXBlb2YgY3R4ICE9PSAnb2JqZWN0JyB8fCAhZmlyc3RTY3JlZW5DdHggfHwgdHlwZW9mIGZpcnN0U2NyZWVuQ3R4ICE9PSAnb2JqZWN0JykgcmV0dXJuO1xuXG4gIGNvbnN0IGN0eE9iaiA9IGN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcbiAgY29uc3QgZmlyc3RTY3JlZW5DdHhPYmogPSBmaXJzdFNjcmVlbkN0eCBhcyBSZWNvcmQ8c3RyaW5nLCBDbG9zdXJlVmFsdWVUeXBlPjtcblxuICBpZiAoY3R4T2JqWydfd2tsdElkJ10gJiYgY3R4T2JqWydfd2tsdElkJ10gIT09IGZpcnN0U2NyZWVuQ3R4T2JqWydfd2tsdElkJ10pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZvci1pbi1hcnJheVxuICBmb3IgKGNvbnN0IGtleSBpbiBjdHgpIHtcbiAgICBpZiAoa2V5ID09PSAnX3d2aWQnKSB7XG4gICAgICBoeWRyYXRlTWFpblRocmVhZFJlZihjdHhPYmpba2V5XSBhcyBXb3JrbGV0UmVmSWQsIGZpcnN0U2NyZWVuQ3R4T2JqIGFzIHVua25vd24gYXMgV29ya2xldFJlZkltcGw8dW5rbm93bj4pO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnX2pzRm4nKSB7XG4gICAgICBoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyhcbiAgICAgICAgY3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGZpcnN0U2NyZWVuQ3R4T2JqW2tleV0gYXMgUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sXG4gICAgICAgIGV4ZWNJZCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZpcnN0U2NyZWVuVmFsdWUgPSB0eXBlb2YgZmlyc3RTY3JlZW5DdHhPYmpba2V5XSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IChmaXJzdFNjcmVlbkN0eE9ialtrZXldIGFzIHsgY3R4OiBDbG9zdXJlVmFsdWVUeXBlIH0pLmN0eFxuICAgICAgICA6IGZpcnN0U2NyZWVuQ3R4T2JqW2tleV07XG4gICAgICBoeWRyYXRlQ3R4SW1wbChjdHhPYmpba2V5XSwgZmlyc3RTY3JlZW5WYWx1ZSwgZXhlY0lkKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBIeWRyYXRlcyBhIFdvcmtsZXRSZWYgb24gdGhlIG1haW4gdGhyZWFkLlxuICogVGhpcyBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgV29ya2xldFJlZidzIGJhY2tncm91bmQgaW5pdGlhbCB2YWx1ZSBiYXNlZCBvbiBjaGFuZ2VzXG4gKiB0aGF0IG9jY3VycmVkIGluIHRoZSBmaXJzdC1zY3JlZW4gV29ya2xldCBjb250ZXh0IGJlZm9yZSBoeWRyYXRpb24uXG4gKlxuICogQHBhcmFtIHJlZklkIFRoZSBJRCBvZiB0aGUgV29ya2xldFJlZiB0byBoeWRyYXRlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBXb3JrbGV0UmVmLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlTWFpblRocmVhZFJlZihyZWZJZDogV29ya2xldFJlZklkLCB2YWx1ZTogV29ya2xldFJlZkltcGw8dW5rbm93bj4gfCB7IGN1cnJlbnQ6IHVua25vd24gfSkge1xuICBpZiAoJ19pbml0VmFsdWUnIGluIHZhbHVlKSB7XG4gICAgLy8gVGhlIHJlZiBoYXMgbm90IGJlZW4gYWNjZXNzZWQgeWV0LlxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZWYgPSBseW54V29ya2xldEltcGwhLl9yZWZJbXBsLl93b3JrbGV0UmVmTWFwW3JlZklkXSE7XG4gIGlmIChyZWYuY3VycmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAvLyBNb2RpZmllZCBieSBgbWFpbi10aHJlYWQ6cmVmYFxuICAgIHJldHVybjtcbiAgfVxuICByZWYuY3VycmVudCA9IHZhbHVlLmN1cnJlbnQ7XG59XG5cbi8qKlxuICogSHlkcmF0ZXMgZGVsYXllZCBgcnVuT25CYWNrZ3JvdW5kYCB0YXNrcy5cbiAqIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IGFueSBgcnVuT25CYWNrZ3JvdW5kYCBjYWxscyB0aGF0IHdlcmUgZGVsYXllZFxuICogZHVyaW5nIHRoZSBmaXJzdC1zY3JlZW4gcmVuZGVyaW5nIGFyZSBjb3JyZWN0bHkgYXNzb2NpYXRlZCB3aXRoIHRoZWlyXG4gKiByZXNwZWN0aXZlIEphdmFTY3JpcHQgZnVuY3Rpb24gaGFuZGxlcyBpbiB0aGUgaHlkcmF0ZWQgV29ya2xldCBjb250ZXh0LlxuICovXG5mdW5jdGlvbiBoeWRyYXRlRGVsYXlSdW5PbkJhY2tncm91bmRUYXNrcyhcbiAgZm5PYmpzOiBSZWNvcmQ8c3RyaW5nLCBKc0ZuSGFuZGxlPiwgLy8gZXhhbXBsZToge1wiX2pzRm4xXCI6e1wiX2pzRm5JZFwiOjF9fVxuICBmaXJzdFNjcmVlbkZuT2JqczogUmVjb3JkPHN0cmluZywgSnNGbkhhbmRsZT4sIC8vIGV4YW1wbGU6IHtcIl9qc0ZuMVwiOntcIl9pc0ZpcnN0U2NyZWVuXCI6dHJ1ZSxcIl9kZWxheUluZGljZXNcIjpbMF19fVxuICBleGVjSWQ6IG51bWJlcixcbikge1xuICBmb3IgKGNvbnN0IGZuTmFtZSBpbiBmbk9ianMpIHtcbiAgICBjb25zdCBmbk9iaiA9IGZuT2Jqc1tmbk5hbWVdITtcbiAgICBjb25zdCBmaXJzdFNjcmVlbkZuT2JqOiBKc0ZuSGFuZGxlIHwgdW5kZWZpbmVkID0gZmlyc3RTY3JlZW5Gbk9ianNbZm5OYW1lXTtcbiAgICBpZiAoIWZpcnN0U2NyZWVuRm5PYmo/Ll9kZWxheUluZGljZXMpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGZpcnN0U2NyZWVuRm5PYmouX2RlbGF5SW5kaWNlcykge1xuICAgICAgY29uc3QgZGV0YWlscyA9IGx5bnhXb3JrbGV0SW1wbCEuX3J1bk9uQmFja2dyb3VuZERlbGF5SW1wbC5kZWxheWVkQmFja2dyb3VuZEZ1bmN0aW9uQXJyYXlbaW5kZXhdITtcbiAgICAgIGZuT2JqLl9leGVjSWQgPSBleGVjSWQ7XG4gICAgICBkZXRhaWxzLmpzRm5IYW5kbGUgPSBmbk9iajtcbiAgICB9XG4gIH1cbn1cbiIsICIvLyBDb3B5cmlnaHQgMjAyNCBUaGUgTHlueCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZVxuLy8gTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuaW1wb3J0IHsgV29ya2xldEV2ZW50cyB9IGZyb20gJy4vYmluZGluZ3MvZXZlbnRzLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuaW1wb3J0IHsgaXNTZGtWZXJzaW9uR3QgfSBmcm9tICcuL3V0aWxzL3ZlcnNpb24uanMnO1xuXG4vKipcbiAqIGBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlcmAgbW9uaXRvcnMgcmVmZXJlbmNlcyB0byBKUyBmdW5jdGlvbiBoYW5kbGVzIHRvIGJlIGNhbGxlZCBieSBgcnVuT25CYWNrZ3JvdW5kKClgLlxuICogSW4gSlMgY29udGV4dCwgZnVuY3Rpb25zIHRvIGJlIGNhbGxlZCBieSBgcnVuT25CYWNrZ3JvdW5kKClgIGlzIHJlZmVyZW5jZWQgYnkgYEpzRm5IYW5kbGVgcyBhbmQgZmluYWxseSBieSBgZXhlY0lkYC5cbiAqIFdoZW4gYWxsIGBKc0ZuSGFuZGxlYHMgaW4gbGVwdXMgYXJlIHJlbGVhc2VkLCBhbiBldmVudCB3aWxsIGJlIHNlbnQgdG8gSlMgY29udGV4dCB0byBkZS1yZWYgdGhlIGBleGVjSWRgLFxuICogcmVzdWx0aW5nIGEgZGUtcmVmIHRvIHRoZSBqcyBmdW5jdGlvbiBpbiBKUyBjb250ZXh0LlxuICovXG5jbGFzcyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciB7XG4gIHByaXZhdGUgZXhlY0lkUmVmQ291bnQgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICBwcml2YXRlIGV4ZWNJZFNldFRvRmlyZSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBwcml2YXRlIHdpbGxGaXJlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVnaXN0cnk/OiBGaW5hbGl6YXRpb25SZWdpc3RyeTxudW1iZXI+ID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMucmVnaXN0cnkgPSBuZXcgRmluYWxpemF0aW9uUmVnaXN0cnk8bnVtYmVyPih0aGlzLnJlbW92ZVJlZi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIGFkZFJlZihleGVjSWQ6IG51bWJlciwgb2JqVG9SZWY6IG9iamVjdCk6IHZvaWQge1xuICAgIHRoaXMuZXhlY0lkUmVmQ291bnQuc2V0KFxuICAgICAgZXhlY0lkLFxuICAgICAgKHRoaXMuZXhlY0lkUmVmQ291bnQuZ2V0KGV4ZWNJZCkgPz8gMCkgKyAxLFxuICAgICk7XG4gICAgdGhpcy5yZWdpc3RyeSEucmVnaXN0ZXIob2JqVG9SZWYsIGV4ZWNJZCk7XG4gIH1cblxuICByZW1vdmVSZWYoZXhlY0lkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCByYyA9IHRoaXMuZXhlY0lkUmVmQ291bnQuZ2V0KGV4ZWNJZCkhO1xuICAgIGlmIChyYyA+IDEpIHtcbiAgICAgIHRoaXMuZXhlY0lkUmVmQ291bnQuc2V0KGV4ZWNJZCwgcmMgLSAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5leGVjSWRSZWZDb3VudC5kZWxldGUoZXhlY0lkKTtcbiAgICB0aGlzLmV4ZWNJZFNldFRvRmlyZS5hZGQoZXhlY0lkKTtcbiAgICBpZiAoIXRoaXMud2lsbEZpcmUpIHtcbiAgICAgIHRoaXMud2lsbEZpcmUgPSB0cnVlO1xuICAgICAgdm9pZCBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5maXJlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBmaXJlKCk6IHZvaWQge1xuICAgIHByb2ZpbGUoJ0pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyLmZpcmUnLCAoKSA9PiB7XG4gICAgICBseW54LmdldEpTQ29udGV4dCgpLmRpc3BhdGNoRXZlbnQoe1xuICAgICAgICB0eXBlOiBXb3JrbGV0RXZlbnRzLnJlbGVhc2VCYWNrZ3JvdW5kV29ya2xldEN0eCxcbiAgICAgICAgZGF0YTogQXJyYXkuZnJvbSh0aGlzLmV4ZWNJZFNldFRvRmlyZSksXG4gICAgICB9KTtcbiAgICAgIHRoaXMuZXhlY0lkU2V0VG9GaXJlLmNsZWFyKCk7XG4gICAgICB0aGlzLndpbGxGaXJlID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNSdW5PbkJhY2tncm91bmRFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNTZGtWZXJzaW9uR3QoMiwgMTUpO1xufVxuXG5leHBvcnQgeyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciwgaXNSdW5PbkJhY2tncm91bmRFbmFibGVkIH07XG4iLCAiLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEx5bnggQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGVcbi8vIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbmltcG9ydCB7IEVsZW1lbnQgfSBmcm9tICcuL2FwaS9lbGVtZW50LmpzJztcbmltcG9ydCB0eXBlIHsgQ2xvc3VyZVZhbHVlVHlwZSwgV29ya2xldCwgV29ya2xldFJlZkltcGwgfSBmcm9tICcuL2JpbmRpbmdzL3R5cGVzLmpzJztcbmltcG9ydCB7IGluaXRSdW5PbkJhY2tncm91bmREZWxheSB9IGZyb20gJy4vZGVsYXlSdW5PbkJhY2tncm91bmQuanMnO1xuaW1wb3J0IHsgZGVsYXlFeGVjVW50aWxKc1JlYWR5LCBpbml0RXZlbnREZWxheSB9IGZyb20gJy4vZGVsYXlXb3JrbGV0RXZlbnQuanMnO1xuaW1wb3J0IHsgaHlkcmF0ZUN0eCB9IGZyb20gJy4vaHlkcmF0ZS5qcyc7XG5pbXBvcnQgeyBKc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlciwgaXNSdW5PbkJhY2tncm91bmRFbmFibGVkIH0gZnJvbSAnLi9qc0Z1bmN0aW9uTGlmZWN5Y2xlLmpzJztcbmltcG9ydCB7IHByb2ZpbGUgfSBmcm9tICcuL3V0aWxzL3Byb2ZpbGUuanMnO1xuaW1wb3J0IHsgZ2V0RnJvbVdvcmtsZXRSZWZNYXAsIGluaXRXb3JrbGV0UmVmIH0gZnJvbSAnLi93b3JrbGV0UmVmLmpzJztcblxuZnVuY3Rpb24gaW5pdFdvcmtsZXQoKTogdm9pZCB7XG4gIGdsb2JhbFRoaXMubHlueFdvcmtsZXRJbXBsID0ge1xuICAgIF93b3JrbGV0TWFwOiB7fSxcbiAgICBfcmVmSW1wbDogaW5pdFdvcmtsZXRSZWYoKSxcbiAgICBfcnVuT25CYWNrZ3JvdW5kRGVsYXlJbXBsOiBpbml0UnVuT25CYWNrZ3JvdW5kRGVsYXkoKSxcbiAgICBfaHlkcmF0ZUN0eDogaHlkcmF0ZUN0eCxcbiAgICBfZXZlbnREZWxheUltcGw6IGluaXRFdmVudERlbGF5KCksXG4gIH07XG5cbiAgaWYgKGlzUnVuT25CYWNrZ3JvdW5kRW5hYmxlZCgpKSB7XG4gICAgZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwuX2pzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyID0gbmV3IEpzRnVuY3Rpb25MaWZlY3ljbGVNYW5hZ2VyKCk7XG4gIH1cblxuICBnbG9iYWxUaGlzLnJlZ2lzdGVyV29ya2xldCA9IHJlZ2lzdGVyV29ya2xldDtcbiAgZ2xvYmFsVGhpcy5yZWdpc3RlcldvcmtsZXRJbnRlcm5hbCA9IHJlZ2lzdGVyV29ya2xldDtcbiAgZ2xvYmFsVGhpcy5ydW5Xb3JrbGV0ID0gcnVuV29ya2xldDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBhIHdvcmtsZXQgZnVuY3Rpb24sIGFsbG93aW5nIGl0IHRvIGJlIGV4ZWN1dGVkIGJ5IGBydW5Xb3JrbGV0KClgLlxuICogVGhpcyBpcyBjYWxsZWQgaW4gbGVwdXMuanMuXG4gKiBAcGFyYW0gX3R5cGUgd29ya2xldCB0eXBlLCAnbWFpbi10aHJlYWQnIG9yICd1aSdcbiAqIEBwYXJhbSBpZCB3b3JrbGV0IGhhc2hcbiAqIEBwYXJhbSB3b3JrbGV0IHdvcmtsZXQgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJXb3JrbGV0KF90eXBlOiBzdHJpbmcsIGlkOiBzdHJpbmcsIHdvcmtsZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24pOiB2b2lkIHtcbiAgbHlueFdvcmtsZXRJbXBsLl93b3JrbGV0TWFwW2lkXSA9IHdvcmtsZXQ7XG59XG5cbi8qKlxuICogRW50cmFuY2Ugb2YgYWxsIHdvcmtsZXQgY2FsbHMuXG4gKiBOYXRpdmUgZXZlbnQgdG91Y2ggaGFuZGxlciB3aWxsIGNhbGwgdGhpcyBmdW5jdGlvbi5cbiAqIEBwYXJhbSBjdHggd29ya2xldCBvYmplY3QuXG4gKiBAcGFyYW0gcGFyYW1zIHdvcmtsZXQgcGFyYW1zLlxuICovXG5mdW5jdGlvbiBydW5Xb3JrbGV0KGN0eDogV29ya2xldCwgcGFyYW1zOiBDbG9zdXJlVmFsdWVUeXBlW10pOiB1bmtub3duIHtcbiAgaWYgKCF2YWxpZGF0ZVdvcmtsZXQoY3R4KSkge1xuICAgIGNvbnNvbGUud2FybignV29ya2xldDogSW52YWxpZCB3b3JrbGV0IG9iamVjdDogJyArIEpTT04uc3RyaW5naWZ5KGN0eCkpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoJ19sZXB1c1dvcmtsZXRIYXNoJyBpbiBjdHgpIHtcbiAgICBkZWxheUV4ZWNVbnRpbEpzUmVhZHkoY3R4Ll9sZXB1c1dvcmtsZXRIYXNoLCBwYXJhbXMpO1xuICAgIHJldHVybjtcbiAgfVxuICByZXR1cm4gcnVuV29ya2xldEltcGwoY3R4LCBwYXJhbXMpO1xufVxuXG5mdW5jdGlvbiBydW5Xb3JrbGV0SW1wbChjdHg6IFdvcmtsZXQsIHBhcmFtczogQ2xvc3VyZVZhbHVlVHlwZVtdKTogdW5rbm93biB7XG4gIGNvbnN0IHdvcmtsZXQ6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24gPSBwcm9maWxlKFxuICAgICd0cmFuc2Zvcm1Xb3JrbGV0Q3R4ICcgKyBjdHguX3drbHRJZCxcbiAgICAoKSA9PiB0cmFuc2Zvcm1Xb3JrbGV0KGN0eCwgdHJ1ZSksXG4gICk7XG4gIGNvbnN0IHBhcmFtc186IENsb3N1cmVWYWx1ZVR5cGVbXSA9IHByb2ZpbGUoXG4gICAgJ3RyYW5zZm9ybVdvcmtsZXRQYXJhbXMnLFxuICAgICgpID0+IHRyYW5zZm9ybVdvcmtsZXQocGFyYW1zIHx8IFtdLCBmYWxzZSksXG4gICk7XG4gIHJldHVybiBwcm9maWxlKCdydW5Xb3JrbGV0JywgKCkgPT4gd29ya2xldCguLi5wYXJhbXNfKSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlV29ya2xldChjdHg6IHVua25vd24pOiBjdHggaXMgV29ya2xldCB7XG4gIHJldHVybiB0eXBlb2YgY3R4ID09PSAnb2JqZWN0JyAmJiBjdHggIT09IG51bGwgJiYgKCdfd2tsdElkJyBpbiBjdHggfHwgJ19sZXB1c1dvcmtsZXRIYXNoJyBpbiBjdHgpO1xufVxuXG5jb25zdCB3b3JrbGV0Q2FjaGUgPSBuZXcgV2Vha01hcDxvYmplY3QsIENsb3N1cmVWYWx1ZVR5cGUgfCAoKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bik+KCk7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoY3R4OiBXb3JrbGV0LCBpc1dvcmtsZXQ6IHRydWUpOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuZnVuY3Rpb24gdHJhbnNmb3JtV29ya2xldChcbiAgY3R4OiBDbG9zdXJlVmFsdWVUeXBlW10sXG4gIGlzV29ya2xldDogZmFsc2UsXG4pOiBDbG9zdXJlVmFsdWVUeXBlW107XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVdvcmtsZXQoXG4gIGN0eDogQ2xvc3VyZVZhbHVlVHlwZSxcbiAgaXNXb3JrbGV0OiBib29sZWFuLFxuKTogQ2xvc3VyZVZhbHVlVHlwZSB8ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSB7XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKHR5cGVvZiBjdHggIT09ICdvYmplY3QnIHx8IGN0eCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBjdHg7XG4gIH1cblxuICBpZiAoaXNXb3JrbGV0KSB7XG4gICAgY29uc3QgcmVzID0gd29ya2xldENhY2hlLmdldChjdHgpO1xuICAgIGlmIChyZXMpIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgd29ya2xldCA9IHsgbWFpbjogY3R4IH07XG4gIHRyYW5zZm9ybVdvcmtsZXRJbm5lcih3b3JrbGV0LCAwLCBjdHgpO1xuXG4gIGlmIChpc1dvcmtsZXQpIHtcbiAgICB3b3JrbGV0Q2FjaGUuc2V0KGN0eCwgd29ya2xldC5tYWluKTtcbiAgfVxuICByZXR1cm4gd29ya2xldC5tYWluO1xufVxuXG5jb25zdCB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIgPSAoXG4gIHZhbHVlOiBDbG9zdXJlVmFsdWVUeXBlLFxuICBkZXB0aDogbnVtYmVyLFxuICBjdHg6IHVua25vd24sXG4pID0+IHtcbiAgY29uc3QgbGltaXQgPSAxMDAwO1xuICBpZiAoKytkZXB0aCA+PSBsaW1pdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignRGVwdGggb2YgdmFsdWUgZXhjZWVkcyBsaW1pdCBvZiAnICsgbGltaXQgKyAnLicpO1xuICB9XG4gIC8qIHY4IGlnbm9yZSBuZXh0IDMgKi9cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgQ2xvc3VyZVZhbHVlVHlwZT47XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgY29uc3Qgc3ViT2JqOiBDbG9zdXJlVmFsdWVUeXBlID0gb2JqW2tleV07XG4gICAgaWYgKHR5cGVvZiBzdWJPYmogIT09ICdvYmplY3QnIHx8IHN1Yk9iaiA9PT0gbnVsbCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgaXNFdmVudFRhcmdldCA9ICdlbGVtZW50UmVmcHRyJyBpbiBzdWJPYmo7XG4gICAgaWYgKCFpc0V2ZW50VGFyZ2V0KSB7XG4gICAgICB0cmFuc2Zvcm1Xb3JrbGV0SW5uZXIoc3ViT2JqLCBkZXB0aCwgY3R4KTtcbiAgICB9XG5cbiAgICBpZiAoaXNFdmVudFRhcmdldCkge1xuICAgICAgb2JqW2tleV0gPSBuZXcgRWxlbWVudChzdWJPYmpbJ2VsZW1lbnRSZWZwdHInXSBhcyBFbGVtZW50Tm9kZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaXNXb3JrbGV0UmVmID0gJ193dmlkJyBpbiAoc3ViT2JqIGFzIG9iamVjdCk7XG4gICAgaWYgKGlzV29ya2xldFJlZikge1xuICAgICAgb2JqW2tleV0gPSBnZXRGcm9tV29ya2xldFJlZk1hcChcbiAgICAgICAgc3ViT2JqIGFzIHVua25vd24gYXMgV29ya2xldFJlZkltcGw8dW5rbm93bj4sXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGlzV29ya2xldCA9ICdfd2tsdElkJyBpbiBzdWJPYmo7XG4gICAgaWYgKGlzV29ya2xldCkge1xuICAgICAgLy8gYHN1Yk9iamAgaXMgd29ya2xldCBjdHguIFNoYWxsb3cgY29weSBpdCB0byBwcmV2ZW50IHRoZSB0cmFuc2Zvcm1lZCB3b3JrbGV0IGZyb20gcmVmZXJlbmNpbmcgY3R4LlxuICAgICAgLy8gVGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIHZhbHVlIG9mIGB3b3JrbGV0Q2FjaGVgIHJlZmVyZW5jaW5nIGl0cyBrZXkuXG4gICAgICBvYmpba2V5XSA9IGx5bnhXb3JrbGV0SW1wbC5fd29ya2xldE1hcFsoc3ViT2JqIGFzIFdvcmtsZXQpLl93a2x0SWRdIVxuICAgICAgICAuYmluZCh7IC4uLnN1Yk9iaiB9KTtcbiAgICAgIG9ialtrZXldLmN0eCA9IHN1Yk9iajtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBpc0pzRm4gPSAnX2pzRm5JZCcgaW4gc3ViT2JqO1xuICAgIGlmIChpc0pzRm4pIHtcbiAgICAgIHN1Yk9ialsnX2V4ZWNJZCddID0gKGN0eCBhcyBXb3JrbGV0KS5fZXhlY0lkO1xuICAgICAgbHlueFdvcmtsZXRJbXBsLl9qc0Z1bmN0aW9uTGlmZWN5Y2xlTWFuYWdlcj8uYWRkUmVmKFxuICAgICAgICAoY3R4IGFzIFdvcmtsZXQpLl9leGVjSWQhLFxuICAgICAgICBzdWJPYmosXG4gICAgICApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgeyBpbml0V29ya2xldCB9O1xuIiwgIi8vIENvcHlyaWdodCAyMDI0IFRoZSBMeW54IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlXG4vLyBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG5pbXBvcnQgeyBpbml0QXBpRW52IH0gZnJvbSAnLi9hcGkvbHlueEFwaS5qcyc7XG5pbXBvcnQgeyBpbml0RXZlbnRMaXN0ZW5lcnMgfSBmcm9tICcuL2xpc3RlbmVycy5qcyc7XG5pbXBvcnQgeyBpbml0V29ya2xldCB9IGZyb20gJy4vd29ya2xldFJ1bnRpbWUuanMnO1xuXG5pZiAoZ2xvYmFsVGhpcy5seW54V29ya2xldEltcGwgPT09IHVuZGVmaW5lZCkge1xuICBpbml0V29ya2xldCgpO1xuICBpbml0QXBpRW52KCk7XG4gIGluaXRFdmVudExpc3RlbmVycygpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQUdPLE1BQU0sV0FBTixNQUFNLFNBQVE7QUFBQSxJQU1uQixZQUFZLFNBQXNCO0FBRmxDO0FBQUEsMEJBQWlCO0FBTWYsYUFBTyxlQUFlLE1BQU0sV0FBVztBQUFBLFFBQ3JDLE1BQU07QUFDSixpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFTyxhQUFhLE1BQWMsT0FBc0I7QUFDdEQscUJBQWUsS0FBSyxTQUFTLE1BQU0sS0FBSztBQUN4QyxXQUFLLGlCQUFpQjtBQUFBLElBQ3hCO0FBQUEsSUFFTyxpQkFBaUIsTUFBYyxPQUFxQjtBQUN6RCx1QkFBaUIsS0FBSyxTQUFTLE1BQU0sS0FBSztBQUMxQyxXQUFLLGlCQUFpQjtBQUFBLElBQ3hCO0FBQUEsSUFFTyxtQkFBbUIsUUFBc0M7QUFDOUQsaUJBQVcsT0FBTyxRQUFRO0FBQ3hCLHlCQUFpQixLQUFLLFNBQVMsS0FBSyxPQUFPLEdBQUcsQ0FBRTtBQUFBLE1BQ2xEO0FBQ0EsV0FBSyxpQkFBaUI7QUFBQSxJQUN4QjtBQUFBLElBRU8sYUFBYSxlQUFnQztBQUNsRCxhQUFPLHFCQUFxQixLQUFLLFNBQVMsYUFBYTtBQUFBLElBQ3pEO0FBQUEsSUFFTyxvQkFBOEI7QUFDbkMsYUFBTyxvQkFBb0IsS0FBSyxPQUFPO0FBQUEsSUFDekM7QUFBQSxJQUVPLGNBQWMsVUFBa0M7QUFDckQsWUFBTSxNQUFNLGdCQUFnQixLQUFLLFNBQVMsVUFBVSxDQUFDLENBQUM7QUFDdEQsYUFBTyxNQUFNLElBQUksU0FBUSxHQUFHLElBQUk7QUFBQSxJQUNsQztBQUFBLElBRU8saUJBQWlCLFVBQTZCO0FBQ25ELGFBQU8sbUJBQW1CLEtBQUssU0FBUyxVQUFVLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FB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
|
|
@@ -11,4 +11,4 @@ declare function runWorkletCtx(worklet: Worklet, params: ClosureValueType[]): un
|
|
|
11
11
|
* @param patch - An array containing the index and new value of the worklet value.
|
|
12
12
|
*/
|
|
13
13
|
declare function updateWorkletRefInitValueChanges(patch?: [number, unknown][]): void;
|
|
14
|
-
export {
|
|
14
|
+
export { runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges, registerWorklet, delayRunOnBackground };
|
|
@@ -1,22 +1,6 @@
|
|
|
1
1
|
// Copyright 2024 The Lynx Authors. All rights reserved.
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
|
-
/**
|
|
5
|
-
* This function must be called when a worklet context is updated.
|
|
6
|
-
*
|
|
7
|
-
* @param worklet - The worklet to be updated
|
|
8
|
-
* @param oldWorklet - The old worklet context
|
|
9
|
-
* @param isFirstScreen - Whether it is before the hydration is finished
|
|
10
|
-
* @param element - The element
|
|
11
|
-
* @internal
|
|
12
|
-
*/
|
|
13
|
-
function onWorkletCtxUpdate(worklet, oldWorklet, isFirstScreen, element) {
|
|
14
|
-
globalThis.lynxWorkletImpl?._jsFunctionLifecycleManager?.addRef(worklet._execId, worklet);
|
|
15
|
-
if (isFirstScreen && oldWorklet) {
|
|
16
|
-
globalThis.lynxWorkletImpl?._hydrateCtx(worklet, oldWorklet);
|
|
17
|
-
}
|
|
18
|
-
globalThis.lynxWorkletImpl?._eventDelayImpl.runDelayedWorklet(worklet, element);
|
|
19
|
-
}
|
|
20
4
|
/**
|
|
21
5
|
* Executes the worklet ctx.
|
|
22
6
|
* @param worklet - The Worklet ctx to run.
|
|
@@ -45,15 +29,6 @@ function updateWorkletRefInitValueChanges(patch) {
|
|
|
45
29
|
globalThis.lynxWorkletImpl?._refImpl.updateWorkletRefInitValueChanges(patch);
|
|
46
30
|
}
|
|
47
31
|
}
|
|
48
|
-
/**
|
|
49
|
-
* This must be called when the hydration is finished.
|
|
50
|
-
*
|
|
51
|
-
* @internal
|
|
52
|
-
*/
|
|
53
|
-
function onHydrationFinished() {
|
|
54
|
-
globalThis.lynxWorkletImpl?._runOnBackgroundDelayImpl.runDelayedBackgroundFunctions();
|
|
55
|
-
globalThis.lynxWorkletImpl?._refImpl.clearFirstScreenWorkletRefMap();
|
|
56
|
-
}
|
|
57
32
|
/**
|
|
58
33
|
* Register a worklet.
|
|
59
34
|
*
|
|
@@ -70,5 +45,5 @@ function registerWorklet(type, id, worklet) {
|
|
|
70
45
|
function delayRunOnBackground(fnObj, fn) {
|
|
71
46
|
globalThis.lynxWorkletImpl?._runOnBackgroundDelayImpl.delayRunOnBackground(fnObj, fn);
|
|
72
47
|
}
|
|
73
|
-
export {
|
|
48
|
+
export { runWorkletCtx, updateWorkletRef, updateWorkletRefInitValueChanges, registerWorklet, delayRunOnBackground };
|
|
74
49
|
//# sourceMappingURL=bindings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../src/bindings/bindings.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAK1D
|
|
1
|
+
{"version":3,"file":"bindings.js","sourceRoot":"","sources":["../../src/bindings/bindings.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAK1D;;;;GAIG;AACH,SAAS,aAAa,CAAC,OAAgB,EAAE,MAA0B;IACjE,OAAO,UAAU,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,UAAmC,EAAE,OAA2B;IACxF,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,SAAS,gCAAgC,CAAC,KAA2B;IACnE,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,gCAAgC,CAAC,KAAK,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,EAAU,EAAE,OAAwC;IACzF,UAAU,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,KAAiB,EAAE,EAA0C;IACzF,UAAU,CAAC,eAAe,EAAE,yBAAyB,CAAC,oBAAoB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gCAAgC,EAAE,eAAe,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { loadWorkletRuntime } from './loadRuntime.js';
|
|
2
|
-
export
|
|
2
|
+
export * from './bindings.js';
|
|
3
|
+
export * from './observers.js';
|
|
3
4
|
export type * from './types.js';
|
|
4
5
|
export { WorkletEvents, type RunWorkletCtxData, type RunWorkletCtxRetData } from './events.js';
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
3
|
// LICENSE file in the root directory of this source tree.
|
|
4
4
|
export { loadWorkletRuntime } from './loadRuntime.js';
|
|
5
|
-
export
|
|
5
|
+
export * from './bindings.js';
|
|
6
|
+
export * from './observers.js';
|
|
6
7
|
export { WorkletEvents } from './events.js';
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bindings/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD,cAAc,eAAe,CAAC;AAE9B,cAAc,gBAAgB,CAAC;AAI/B,OAAO,EAAE,aAAa,EAAqD,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { onWorkletCtxUpdate, onHydrationFinished };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// Copyright 2025 The Lynx Authors. All rights reserved.
|
|
2
|
+
// Licensed under the Apache License Version 2.0 that can be found in the
|
|
3
|
+
// LICENSE file in the root directory of this source tree.
|
|
4
|
+
/**
|
|
5
|
+
* This function must be called when a worklet context is updated.
|
|
6
|
+
*
|
|
7
|
+
* @param worklet - The worklet to be updated
|
|
8
|
+
* @param oldWorklet - The old worklet context
|
|
9
|
+
* @param isFirstScreen - Whether it is before the hydration is finished
|
|
10
|
+
* @param element - The element
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
function onWorkletCtxUpdate(worklet, oldWorklet, isFirstScreen, element) {
|
|
14
|
+
globalThis.lynxWorkletImpl?._jsFunctionLifecycleManager?.addRef(worklet._execId, worklet);
|
|
15
|
+
if (isFirstScreen && oldWorklet) {
|
|
16
|
+
globalThis.lynxWorkletImpl?._hydrateCtx(worklet, oldWorklet);
|
|
17
|
+
}
|
|
18
|
+
// For old version dynamic component compatibility.
|
|
19
|
+
globalThis.lynxWorkletImpl?._eventDelayImpl.runDelayedWorklet(worklet, element);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* This must be called when the hydration is finished.
|
|
23
|
+
*
|
|
24
|
+
* @internal
|
|
25
|
+
*/
|
|
26
|
+
function onHydrationFinished() {
|
|
27
|
+
globalThis.lynxWorkletImpl?._runOnBackgroundDelayImpl.runDelayedBackgroundFunctions();
|
|
28
|
+
globalThis.lynxWorkletImpl?._refImpl.clearFirstScreenWorkletRefMap();
|
|
29
|
+
}
|
|
30
|
+
export { onWorkletCtxUpdate, onHydrationFinished };
|
|
31
|
+
//# sourceMappingURL=observers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observers.js","sourceRoot":"","sources":["../../src/bindings/observers.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,yEAAyE;AACzE,0DAA0D;AAI1D;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CACzB,OAAgB,EAChB,UAAsC,EACtC,aAAsB,EACtB,OAAoB;IAEpB,UAAU,CAAC,eAAe,EAAE,2BAA2B,EAAE,MAAM,CAAC,OAAO,CAAC,OAAQ,EAAE,OAAO,CAAC,CAAC;IAC3F,IAAI,aAAa,IAAI,UAAU,EAAE,CAAC;QAChC,UAAU,CAAC,eAAe,EAAE,WAAW,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IACD,mDAAmD;IACnD,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAClF,CAAC;AAED;;;;GAIG;AACH,SAAS,mBAAmB;IAC1B,UAAU,CAAC,eAAe,EAAE,yBAAyB,CAAC,6BAA6B,EAAE,CAAC;IACtF,UAAU,CAAC,eAAe,EAAE,QAAQ,CAAC,6BAA6B,EAAE,CAAC;AACvE,CAAC;AAED,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/api/element.ts", "../src/api/lepusQuerySelector.ts", "../src/utils/version.ts", "../src/api/lynxApi.ts", "../src/utils/profile.ts", "../src/workletRef.ts", "../src/listeners.ts", "../src/delayRunOnBackground.ts", "../src/delayWorkletEvent.ts", "../src/hydrate.ts", "../src/jsFunctionLifecycle.ts", "../src/workletRuntime.ts", "../src/index.ts"],
|
|
4
|
-
"sourceRoot": "/home/runner/work/lynx-stack/lynx-stack/packages/react/worklet-runtime/src",
|
|
5
|
-
"sourcesContent": ["// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport class Element {\n private static willFlush = false;\n\n // @ts-expect-error set in constructor\n private readonly element: ElementNode;\n\n constructor(element: ElementNode) {\n // In Lynx versions prior to and including 2.15,\n // a crash occurs when printing or transferring refCounted across threads.\n // Bypass this problem by hiding the element object.\n Object.defineProperty(this, 'element', {\n get() {\n return element;\n },\n });\n }\n\n public setAttribute(name: string, value: unknown): void {\n __SetAttribute(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperty(name: string, value: string): void {\n __AddInlineStyle(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperties(styles: Record<string, string>): void {\n for (const key in styles) {\n __AddInlineStyle(this.element, key, styles[key]!);\n }\n this.flushElementTree();\n }\n\n public getAttribute(attributeName: string): unknown {\n return __GetAttributeByName(this.element, attributeName);\n }\n\n public getAttributeNames(): string[] {\n return __GetAttributeNames(this.element);\n }\n\n public querySelector(selector: string): Element | null {\n const ref = __QuerySelector(this.element, selector, {});\n return ref ? new Element(ref) : null;\n }\n\n public querySelectorAll(selector: string): Element[] {\n return __QuerySelectorAll(this.element, selector, {}).map((element) => {\n return new Element(element);\n });\n }\n\n public invoke(\n methodName: string,\n params?: Record<string, unknown>,\n ): Promise<unknown> {\n return new Promise((resolve, reject) => {\n __InvokeUIMethod(\n this.element,\n methodName,\n params ?? {},\n (res: { code: number; data: unknown }) => {\n if (res.code === 0) {\n resolve(res.data);\n } else {\n reject(new Error('UI method invoke: ' + JSON.stringify(res)));\n }\n },\n );\n this.flushElementTree();\n });\n }\n\n private flushElementTree() {\n if (Element.willFlush) {\n return;\n }\n Element.willFlush = true;\n void Promise.resolve().then(() => {\n Element.willFlush = false;\n __FlushElementTree();\n });\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './element.js';\n\nclass PageElement {\n private static pageElement: ElementNode | undefined;\n\n static get() {\n PageElement.pageElement ??= __GetPageElement();\n return PageElement.pageElement;\n }\n}\n\nexport function querySelector(cssSelector: string): Element | null {\n const element = __QuerySelector(PageElement.get(), cssSelector, {});\n return element ? new Element(element) : null;\n}\n\nexport function querySelectorAll(cssSelector: string): Element[] {\n return __QuerySelectorAll(PageElement.get(), cssSelector, {}).map(\n (element) => {\n return new Element(element);\n },\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function isSdkVersionGt(major: number, minor: number): boolean {\n const lynxSdkVersion: string = SystemInfo.lynxSdkVersion ?? '1.0';\n const version = lynxSdkVersion.split('.');\n return (\n Number(version[0]) > major\n || (Number(version[0]) == major && Number(version[1]) > minor)\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { querySelector, querySelectorAll } from './lepusQuerySelector.js';\nimport { isSdkVersionGt } from '../utils/version.js';\n\nfunction initApiEnv(): void {\n // @ts-expect-error type\n lynx.querySelector = querySelector;\n // @ts-expect-error type\n lynx.querySelectorAll = querySelectorAll;\n // @ts-expect-error type\n globalThis.setTimeout = lynx.setTimeout as (cb: () => void, timeout: number) => number;\n // @ts-expect-error type\n globalThis.setInterval = lynx.setInterval as (cb: () => void, timeout: number) => number;\n // @ts-expect-error type\n globalThis.clearTimeout = lynx.clearTimeout as (timeout: number) => void;\n // In lynx 2.14 `clearInterval` is mistakenly spelled as `clearTimeInterval`. This is fixed in lynx 2.15.\n // @ts-expect-error type\n globalThis.clearInterval = (lynx.clearInterval ?? lynx.clearTimeInterval) as (timeout: number) => void;\n\n {\n // @ts-expect-error type\n const requestAnimationFrame = lynx.requestAnimationFrame as (callback: () => void) => number;\n // @ts-expect-error type\n lynx.requestAnimationFrame = globalThis.requestAnimationFrame = (\n callback: () => void,\n ) => {\n if (!isSdkVersionGt(2, 15)) {\n throw new Error(\n 'requestAnimationFrame in main thread script requires Lynx sdk version 2.16',\n );\n }\n return requestAnimationFrame(callback);\n };\n }\n\n // @ts-expect-error type\n globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame as (requestId: number) => void;\n}\n\nexport { initApiEnv };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function profile<Ret, Fn extends (...args: unknown[]) => Ret>(\n sliceName: string,\n f: Fn,\n): Ret {\n /* v8 ignore next 9 */\n // TODO: change it to __PROFILE__\n if (__DEV__) {\n console.profile(sliceName);\n try {\n return f();\n } finally {\n console.profileEnd();\n }\n } else {\n return f();\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { WorkletRef, WorkletRefId, WorkletRefImpl } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface RefImpl {\n _workletRefMap: Record<WorkletRefId, WorkletRef<unknown>>;\n _firstScreenWorkletRefMap: Record<WorkletRefId, WorkletRef<unknown>>;\n updateWorkletRef(\n refImpl: WorkletRefImpl<Element | null>,\n element: ElementNode | null,\n ): void;\n updateWorkletRefInitValueChanges(patch: [number, unknown][]): void;\n clearFirstScreenWorkletRefMap(): void;\n}\n\nlet impl: RefImpl | undefined;\n\nfunction initWorkletRef(): RefImpl {\n return (impl = {\n _workletRefMap: {},\n /**\n * Map of worklet refs that are created during first screen rendering.\n * These refs are created with negative IDs and need to be hydrated\n * when the app starts. The map is cleared after hydration is complete\n * to free up memory.\n */\n _firstScreenWorkletRefMap: {},\n updateWorkletRef,\n updateWorkletRefInitValueChanges,\n clearFirstScreenWorkletRefMap,\n });\n}\n\nconst createWorkletRef = <T>(\n id: WorkletRefId,\n value: T,\n): WorkletRef<T> => {\n return {\n current: value,\n _wvid: id,\n };\n};\n\nconst getFromWorkletRefMap = <T>(\n refImpl: WorkletRefImpl<T>,\n): WorkletRef<T> => {\n const id = refImpl._wvid;\n let value;\n if (id < 0) {\n // At the first screen rendering, the worklet ref is created with a negative ID.\n // Might be called in two scenarios:\n // 1. In MTS events\n // 2. In `main-thread:ref`\n value = impl!._firstScreenWorkletRefMap[id] as WorkletRef<T>;\n if (!value) {\n value = impl!._firstScreenWorkletRefMap[id] = createWorkletRef(id, refImpl._initValue);\n }\n } else {\n value = impl!._workletRefMap[id] as WorkletRef<T>;\n }\n\n /* v8 ignore next 3 */\n if (__DEV__ && value === undefined) {\n throw new Error('Worklet: ref is not initialized: ' + id);\n }\n return value;\n};\n\nfunction removeValueFromWorkletRefMap(id: WorkletRefId): void {\n delete impl!._workletRefMap[id];\n}\n\n/**\n * Create an element instance of the given element node, then set the worklet value to it.\n * This is called in `snapshotContextUpdateWorkletRef`.\n * @param handle handle of the worklet value.\n * @param element the element node.\n */\nfunction updateWorkletRef(\n handle: WorkletRefImpl<Element | null>,\n element: ElementNode | null,\n): void {\n getFromWorkletRefMap(handle).current = element\n ? new Element(element)\n : null;\n}\n\nfunction updateWorkletRefInitValueChanges(\n patch: [WorkletRefId, unknown][],\n): void {\n profile('updateWorkletRefInitValueChanges', () => {\n patch.forEach(([id, value]) => {\n if (!impl!._workletRefMap[id]) {\n impl!._workletRefMap[id] = createWorkletRef(id, value);\n }\n });\n });\n}\n\nfunction clearFirstScreenWorkletRefMap(): void {\n impl!._firstScreenWorkletRefMap = {};\n}\n\nexport {\n type RefImpl,\n createWorkletRef,\n initWorkletRef,\n getFromWorkletRefMap,\n removeValueFromWorkletRefMap,\n updateWorkletRefInitValueChanges,\n};\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport type { ReleaseWorkletRefData, RunWorkletCtxData, RunWorkletCtxRetData } from './bindings/events.js';\nimport type { ClosureValueType } from './bindings/types.js';\nimport type { Event } from './types/runtimeProxy.js';\nimport { removeValueFromWorkletRefMap } from './workletRef.js';\n\nfunction initEventListeners(): void {\n const jsContext = lynx.getJSContext();\n jsContext.addEventListener(\n WorkletEvents.runWorkletCtx,\n (event: Event) => {\n const data = JSON.parse(event.data as string) as RunWorkletCtxData;\n const returnValue = runWorklet(data.worklet, data.params as ClosureValueType[]);\n jsContext.dispatchEvent({\n type: WorkletEvents.FunctionCallRet,\n data: JSON.stringify({\n resolveId: data.resolveId,\n returnValue,\n } as RunWorkletCtxRetData),\n });\n },\n );\n jsContext.addEventListener(\n WorkletEvents.releaseWorkletRef,\n (event: Event) => {\n removeValueFromWorkletRefMap((event.data as ReleaseWorkletRefData).id);\n },\n );\n}\n\nexport { initEventListeners };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport type { JsFnHandle } from './bindings/types.js';\n\ninterface Details {\n task: (fnId: number, execId: number) => void;\n\n // This comes from the background thread, inserted here during ctx hydration.\n jsFnHandle?: JsFnHandle;\n}\n\ninterface RunOnBackgroundDelayImpl {\n // Elements should keep the order being called by the user.\n delayedBackgroundFunctionArray: Details[];\n delayRunOnBackground(fnObj: JsFnHandle, fn: (fnId: number, execId: number) => void): void;\n runDelayedBackgroundFunctions(): void;\n}\n\nlet impl: RunOnBackgroundDelayImpl | undefined;\n\nfunction initRunOnBackgroundDelay(): RunOnBackgroundDelayImpl {\n return (impl = {\n delayedBackgroundFunctionArray: [],\n delayRunOnBackground,\n runDelayedBackgroundFunctions,\n });\n}\n\nfunction delayRunOnBackground(fnObj: JsFnHandle, task: (fnId: number, execId: number) => void) {\n impl!.delayedBackgroundFunctionArray.push({ task });\n const delayIndices = fnObj._delayIndices ??= [];\n delayIndices.push(impl!.delayedBackgroundFunctionArray.length - 1);\n}\n\nfunction runDelayedBackgroundFunctions(): void {\n for (const details of impl!.delayedBackgroundFunctionArray) {\n if (details.jsFnHandle) {\n details.task(details.jsFnHandle._jsFnId!, details.jsFnHandle._execId!);\n }\n }\n impl!.delayedBackgroundFunctionArray.length = 0;\n}\n\nexport { type RunOnBackgroundDelayImpl, initRunOnBackgroundDelay };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport type { ClosureValueType, Worklet } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface EventDelayImpl {\n _delayedWorkletParamsMap: Map<string, ClosureValueType[][]>;\n runDelayedWorklet(worklet: Worklet, element: ElementNode): void;\n clearDelayedWorklets(): void;\n}\n\nlet impl: EventDelayImpl | undefined;\n\nfunction initEventDelay(): EventDelayImpl {\n return (impl = {\n _delayedWorkletParamsMap: new Map(),\n runDelayedWorklet,\n clearDelayedWorklets,\n });\n}\n\nfunction delayExecUntilJsReady(\n hash: string,\n params: ClosureValueType[],\n): void {\n profile('delayExecUntilJsReady: ' + hash, () => {\n const map = impl!._delayedWorkletParamsMap;\n const paramVec = map.get(hash);\n if (paramVec) {\n paramVec.push(params);\n } else {\n map.set(hash, [params]);\n }\n });\n}\n\nfunction runDelayedWorklet(worklet: Worklet, element: ElementNode): void {\n profile('commitDelayedWorklet', () => {\n const paramsVec = impl!._delayedWorkletParamsMap.get(\n worklet._wkltId,\n );\n if (paramsVec === undefined) {\n return;\n }\n const leftParamsVec: ClosureValueType[][] = [];\n paramsVec.forEach((params) => {\n const firstParam = params[0] as { currentTarget?: { elementRefptr?: ElementNode } } | undefined;\n if (firstParam?.currentTarget?.elementRefptr === element) {\n setTimeout(() => {\n profile('runDelayedWorklet', () => {\n runWorklet(worklet, params);\n });\n }, 0);\n } else {\n leftParamsVec.push(params);\n }\n });\n impl!._delayedWorkletParamsMap.set(\n worklet._wkltId,\n leftParamsVec,\n );\n });\n}\n\nfunction clearDelayedWorklets(): void {\n impl!._delayedWorkletParamsMap.clear();\n}\n\nexport { type EventDelayImpl, initEventDelay, delayExecUntilJsReady, runDelayedWorklet, clearDelayedWorklets };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n\nimport { Element } from './api/element.js';\nimport type { ClosureValueType, JsFnHandle, Worklet, WorkletRefId, WorkletRefImpl } from './bindings/index.js';\nimport { profile } from './utils/profile.js';\n\n/**\n * Hydrates a Worklet context with data from a first-screen Worklet context.\n * This process is typically used to run all delayed `runOnBackground` functions\n * and initialize `WorkletRef` values modified before hydration.\n *\n * @param ctx The target Worklet context to be hydrated.\n * @param firstScreenCtx The Worklet context from the first screen rendering,\n * containing the data to hydrate with.\n */\nexport function hydrateCtx(ctx: Worklet, firstScreenCtx: Worklet): void {\n profile('hydrateCtx', () => {\n hydrateCtxImpl(ctx, firstScreenCtx, ctx._execId!);\n });\n}\n\nfunction hydrateCtxImpl(ctx: ClosureValueType, firstScreenCtx: ClosureValueType, execId: number): void {\n if (!ctx || typeof ctx !== 'object' || !firstScreenCtx || typeof firstScreenCtx !== 'object') return;\n\n const ctxObj = ctx as Record<string, ClosureValueType>;\n const firstScreenCtxObj = firstScreenCtx as Record<string, ClosureValueType>;\n\n if (ctxObj['_wkltId'] && ctxObj['_wkltId'] !== firstScreenCtxObj['_wkltId']) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array\n for (const key in ctx) {\n if (key === '_wvid') {\n hydrateMainThreadRef(ctxObj[key] as WorkletRefId, firstScreenCtxObj as unknown as WorkletRefImpl<unknown>);\n } else if (key === '_jsFn') {\n hydrateDelayRunOnBackgroundTasks(\n ctxObj[key] as Record<string, JsFnHandle>,\n firstScreenCtxObj[key] as Record<string, JsFnHandle>,\n execId,\n );\n } else {\n const firstScreenValue = typeof firstScreenCtxObj[key] === 'function'\n ? (firstScreenCtxObj[key] as { ctx: ClosureValueType }).ctx\n : firstScreenCtxObj[key];\n hydrateCtxImpl(ctxObj[key], firstScreenValue, execId);\n }\n }\n}\n\n/**\n * Hydrates a WorkletRef on the main thread.\n * This is used to update the WorkletRef's background initial value based on changes\n * that occurred in the first-screen Worklet context before hydration.\n *\n * @param refId The ID of the WorkletRef to hydrate.\n * @param value The new value for the WorkletRef.\n */\nfunction hydrateMainThreadRef(refId: WorkletRefId, value: WorkletRefImpl<unknown> | { current: unknown }) {\n if ('_initValue' in value) {\n // The ref has not been accessed yet.\n return;\n }\n const ref = lynxWorkletImpl!._refImpl._workletRefMap[refId]!;\n if (ref.current instanceof Element) {\n // Modified by `main-thread:ref`\n return;\n }\n ref.current = value.current;\n}\n\n/**\n * Hydrates delayed `runOnBackground` tasks.\n * This function ensures that any `runOnBackground` calls that were delayed\n * during the first-screen rendering are correctly associated with their\n * respective JavaScript function handles in the hydrated Worklet context.\n */\nfunction hydrateDelayRunOnBackgroundTasks(\n fnObjs: Record<string, JsFnHandle>, // example: {\"_jsFn1\":{\"_jsFnId\":1}}\n firstScreenFnObjs: Record<string, JsFnHandle>, // example: {\"_jsFn1\":{\"_isFirstScreen\":true,\"_delayIndices\":[0]}}\n execId: number,\n) {\n for (const fnName in fnObjs) {\n const fnObj = fnObjs[fnName]!;\n const firstScreenFnObj: JsFnHandle | undefined = firstScreenFnObjs[fnName];\n if (!firstScreenFnObj?._delayIndices) {\n continue;\n }\n for (const index of firstScreenFnObj._delayIndices) {\n const details = lynxWorkletImpl!._runOnBackgroundDelayImpl.delayedBackgroundFunctionArray[index]!;\n fnObj._execId = execId;\n details.jsFnHandle = fnObj;\n }\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport { profile } from './utils/profile.js';\nimport { isSdkVersionGt } from './utils/version.js';\n\n/**\n * `JsFunctionLifecycleManager` monitors references to JS function handles to be called by `runOnBackground()`.\n * In JS context, functions to be called by `runOnBackground()` is referenced by `JsFnHandle`s and finally by `execId`.\n * When all `JsFnHandle`s in lepus are released, an event will be sent to JS context to de-ref the `execId`,\n * resulting a de-ref to the js function in JS context.\n */\nclass JsFunctionLifecycleManager {\n private execIdRefCount = new Map<number, number>();\n private execIdSetToFire = new Set<number>();\n private willFire = false;\n private registry?: FinalizationRegistry<number> = undefined;\n\n constructor() {\n this.registry = new FinalizationRegistry<number>(this.removeRef.bind(this));\n }\n\n addRef(execId: number, objToRef: object): void {\n this.execIdRefCount.set(\n execId,\n (this.execIdRefCount.get(execId) ?? 0) + 1,\n );\n this.registry!.register(objToRef, execId);\n }\n\n removeRef(execId: number): void {\n const rc = this.execIdRefCount.get(execId)!;\n if (rc > 1) {\n this.execIdRefCount.set(execId, rc - 1);\n return;\n }\n this.execIdRefCount.delete(execId);\n this.execIdSetToFire.add(execId);\n if (!this.willFire) {\n this.willFire = true;\n void Promise.resolve().then(() => {\n this.fire();\n });\n }\n }\n\n fire(): void {\n profile('JsFunctionLifecycleManager.fire', () => {\n lynx.getJSContext().dispatchEvent({\n type: WorkletEvents.releaseBackgroundWorkletCtx,\n data: Array.from(this.execIdSetToFire),\n });\n this.execIdSetToFire.clear();\n this.willFire = false;\n });\n }\n}\n\nfunction isRunOnBackgroundEnabled(): boolean {\n return isSdkVersionGt(2, 15);\n}\n\nexport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { ClosureValueType, Worklet, WorkletRefImpl } from './bindings/types.js';\nimport { initRunOnBackgroundDelay } from './delayRunOnBackground.js';\nimport { delayExecUntilJsReady, initEventDelay } from './delayWorkletEvent.js';\nimport { hydrateCtx } from './hydrate.js';\nimport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled } from './jsFunctionLifecycle.js';\nimport { profile } from './utils/profile.js';\nimport { getFromWorkletRefMap, initWorkletRef } from './workletRef.js';\n\nfunction initWorklet(): void {\n globalThis.lynxWorkletImpl = {\n _workletMap: {},\n _refImpl: initWorkletRef(),\n _runOnBackgroundDelayImpl: initRunOnBackgroundDelay(),\n _hydrateCtx: hydrateCtx,\n _eventDelayImpl: initEventDelay(),\n };\n\n if (isRunOnBackgroundEnabled()) {\n globalThis.lynxWorkletImpl._jsFunctionLifecycleManager = new JsFunctionLifecycleManager();\n }\n\n globalThis.registerWorklet = registerWorklet;\n globalThis.registerWorkletInternal = registerWorklet;\n globalThis.runWorklet = runWorklet;\n}\n\n/**\n * Register a worklet function, allowing it to be executed by `runWorklet()`.\n * This is called in lepus.js.\n * @param _type worklet type, 'main-thread' or 'ui'\n * @param id worklet hash\n * @param worklet worklet function\n */\nfunction registerWorklet(_type: string, id: string, worklet: (...args: unknown[]) => unknown): void {\n lynxWorkletImpl._workletMap[id] = worklet;\n}\n\n/**\n * Entrance of all worklet calls.\n * Native event touch handler will call this function.\n * @param ctx worklet object.\n * @param params worklet params.\n */\nfunction runWorklet(ctx: Worklet, params: ClosureValueType[]): unknown {\n if (!validateWorklet(ctx)) {\n console.warn('Worklet: Invalid worklet object: ' + JSON.stringify(ctx));\n return;\n }\n if ('_lepusWorkletHash' in ctx) {\n delayExecUntilJsReady(ctx._lepusWorkletHash, params);\n return;\n }\n return runWorkletImpl(ctx, params);\n}\n\nfunction runWorkletImpl(ctx: Worklet, params: ClosureValueType[]): unknown {\n const worklet: (...args: unknown[]) => unknown = profile(\n 'transformWorkletCtx ' + ctx._wkltId,\n () => transformWorklet(ctx, true),\n );\n const params_: ClosureValueType[] = profile(\n 'transformWorkletParams',\n () => transformWorklet(params || [], false),\n );\n return profile('runWorklet', () => worklet(...params_));\n}\n\nfunction validateWorklet(ctx: unknown): ctx is Worklet {\n return typeof ctx === 'object' && ctx !== null && ('_wkltId' in ctx || '_lepusWorkletHash' in ctx);\n}\n\nconst workletCache = new WeakMap<object, ClosureValueType | ((...args: unknown[]) => unknown)>();\n\nfunction transformWorklet(ctx: Worklet, isWorklet: true): (...args: unknown[]) => unknown;\nfunction transformWorklet(\n ctx: ClosureValueType[],\n isWorklet: false,\n): ClosureValueType[];\n\nfunction transformWorklet(\n ctx: ClosureValueType,\n isWorklet: boolean,\n): ClosureValueType | ((...args: unknown[]) => unknown) {\n /* v8 ignore next 3 */\n if (typeof ctx !== 'object' || ctx === null) {\n return ctx;\n }\n\n if (isWorklet) {\n const res = workletCache.get(ctx);\n if (res) {\n return res;\n }\n }\n\n const worklet = { main: ctx };\n transformWorkletInner(worklet, 0, ctx);\n\n if (isWorklet) {\n workletCache.set(ctx, worklet.main);\n }\n return worklet.main;\n}\n\nconst transformWorkletInner = (\n value: ClosureValueType,\n depth: number,\n ctx: unknown,\n) => {\n const limit = 1000;\n if (++depth >= limit) {\n throw new Error('Depth of value exceeds limit of ' + limit + '.');\n }\n /* v8 ignore next 3 */\n if (typeof value !== 'object' || value === null) {\n return;\n }\n const obj = value as Record<string, ClosureValueType>;\n\n for (const key in obj) {\n const subObj: ClosureValueType = obj[key];\n if (typeof subObj !== 'object' || subObj === null) {\n continue;\n }\n\n const isEventTarget = 'elementRefptr' in subObj;\n if (!isEventTarget) {\n transformWorkletInner(subObj, depth, ctx);\n }\n\n if (isEventTarget) {\n obj[key] = new Element(subObj['elementRefptr'] as ElementNode);\n continue;\n }\n const isWorkletRef = '_wvid' in (subObj as object);\n if (isWorkletRef) {\n obj[key] = getFromWorkletRefMap(\n subObj as unknown as WorkletRefImpl<unknown>,\n );\n continue;\n }\n const isWorklet = '_wkltId' in subObj;\n if (isWorklet) {\n // `subObj` is worklet ctx. Shallow copy it to prevent the transformed worklet from referencing ctx.\n // This would result in the value of `workletCache` referencing its key.\n obj[key] = lynxWorkletImpl._workletMap[(subObj as Worklet)._wkltId]!\n .bind({ ...subObj });\n obj[key].ctx = subObj;\n continue;\n }\n const isJsFn = '_jsFnId' in subObj;\n if (isJsFn) {\n subObj['_execId'] = (ctx as Worklet)._execId;\n lynxWorkletImpl._jsFunctionLifecycleManager?.addRef(\n (ctx as Worklet)._execId!,\n subObj,\n );\n continue;\n }\n }\n};\n\nexport { initWorklet };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { initApiEnv } from './api/lynxApi.js';\nimport { initEventListeners } from './listeners.js';\nimport { initWorklet } from './workletRuntime.js';\n\nif (globalThis.lynxWorkletImpl === undefined) {\n initWorklet();\n initApiEnv();\n initEventListeners();\n}\n"],
|
|
6
|
-
"mappings": "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",
|
|
7
|
-
"names": ["impl", "impl", "runWorklet"]
|
|
8
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/api/element.ts", "../src/api/lepusQuerySelector.ts", "../src/utils/version.ts", "../src/api/lynxApi.ts", "../src/utils/profile.ts", "../src/workletRef.ts", "../src/listeners.ts", "../src/delayRunOnBackground.ts", "../src/delayWorkletEvent.ts", "../src/hydrate.ts", "../src/jsFunctionLifecycle.ts", "../src/workletRuntime.ts", "../src/index.ts"],
|
|
4
|
-
"sourceRoot": "/home/runner/work/lynx-stack/lynx-stack/packages/react/worklet-runtime/src",
|
|
5
|
-
"sourcesContent": ["// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport class Element {\n private static willFlush = false;\n\n // @ts-expect-error set in constructor\n private readonly element: ElementNode;\n\n constructor(element: ElementNode) {\n // In Lynx versions prior to and including 2.15,\n // a crash occurs when printing or transferring refCounted across threads.\n // Bypass this problem by hiding the element object.\n Object.defineProperty(this, 'element', {\n get() {\n return element;\n },\n });\n }\n\n public setAttribute(name: string, value: unknown): void {\n __SetAttribute(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperty(name: string, value: string): void {\n __AddInlineStyle(this.element, name, value);\n this.flushElementTree();\n }\n\n public setStyleProperties(styles: Record<string, string>): void {\n for (const key in styles) {\n __AddInlineStyle(this.element, key, styles[key]!);\n }\n this.flushElementTree();\n }\n\n public getAttribute(attributeName: string): unknown {\n return __GetAttributeByName(this.element, attributeName);\n }\n\n public getAttributeNames(): string[] {\n return __GetAttributeNames(this.element);\n }\n\n public querySelector(selector: string): Element | null {\n const ref = __QuerySelector(this.element, selector, {});\n return ref ? new Element(ref) : null;\n }\n\n public querySelectorAll(selector: string): Element[] {\n return __QuerySelectorAll(this.element, selector, {}).map((element) => {\n return new Element(element);\n });\n }\n\n public invoke(\n methodName: string,\n params?: Record<string, unknown>,\n ): Promise<unknown> {\n return new Promise((resolve, reject) => {\n __InvokeUIMethod(\n this.element,\n methodName,\n params ?? {},\n (res: { code: number; data: unknown }) => {\n if (res.code === 0) {\n resolve(res.data);\n } else {\n reject(new Error('UI method invoke: ' + JSON.stringify(res)));\n }\n },\n );\n this.flushElementTree();\n });\n }\n\n private flushElementTree() {\n if (Element.willFlush) {\n return;\n }\n Element.willFlush = true;\n void Promise.resolve().then(() => {\n Element.willFlush = false;\n __FlushElementTree();\n });\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './element.js';\n\nclass PageElement {\n private static pageElement: ElementNode | undefined;\n\n static get() {\n PageElement.pageElement ??= __GetPageElement();\n return PageElement.pageElement;\n }\n}\n\nexport function querySelector(cssSelector: string): Element | null {\n const element = __QuerySelector(PageElement.get(), cssSelector, {});\n return element ? new Element(element) : null;\n}\n\nexport function querySelectorAll(cssSelector: string): Element[] {\n return __QuerySelectorAll(PageElement.get(), cssSelector, {}).map(\n (element) => {\n return new Element(element);\n },\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function isSdkVersionGt(major: number, minor: number): boolean {\n const lynxSdkVersion: string = SystemInfo.lynxSdkVersion ?? '1.0';\n const version = lynxSdkVersion.split('.');\n return (\n Number(version[0]) > major\n || (Number(version[0]) == major && Number(version[1]) > minor)\n );\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { querySelector, querySelectorAll } from './lepusQuerySelector.js';\nimport { isSdkVersionGt } from '../utils/version.js';\n\nfunction initApiEnv(): void {\n // @ts-expect-error type\n lynx.querySelector = querySelector;\n // @ts-expect-error type\n lynx.querySelectorAll = querySelectorAll;\n // @ts-expect-error type\n globalThis.setTimeout = lynx.setTimeout as (cb: () => void, timeout: number) => number;\n // @ts-expect-error type\n globalThis.setInterval = lynx.setInterval as (cb: () => void, timeout: number) => number;\n // @ts-expect-error type\n globalThis.clearTimeout = lynx.clearTimeout as (timeout: number) => void;\n // In lynx 2.14 `clearInterval` is mistakenly spelled as `clearTimeInterval`. This is fixed in lynx 2.15.\n // @ts-expect-error type\n globalThis.clearInterval = (lynx.clearInterval ?? lynx.clearTimeInterval) as (timeout: number) => void;\n\n {\n // @ts-expect-error type\n const requestAnimationFrame = lynx.requestAnimationFrame as (callback: () => void) => number;\n // @ts-expect-error type\n lynx.requestAnimationFrame = globalThis.requestAnimationFrame = (\n callback: () => void,\n ) => {\n if (!isSdkVersionGt(2, 15)) {\n throw new Error(\n 'requestAnimationFrame in main thread script requires Lynx sdk version 2.16',\n );\n }\n return requestAnimationFrame(callback);\n };\n }\n\n // @ts-expect-error type\n globalThis.cancelAnimationFrame = lynx.cancelAnimationFrame as (requestId: number) => void;\n}\n\nexport { initApiEnv };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nexport function profile<Ret, Fn extends (...args: unknown[]) => Ret>(\n sliceName: string,\n f: Fn,\n): Ret {\n /* v8 ignore next 9 */\n // TODO: change it to __PROFILE__\n if (__DEV__) {\n console.profile(sliceName);\n try {\n return f();\n } finally {\n console.profileEnd();\n }\n } else {\n return f();\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { WorkletRef, WorkletRefId, WorkletRefImpl } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface RefImpl {\n _workletRefMap: Record<WorkletRefId, WorkletRef<unknown>>;\n _firstScreenWorkletRefMap: Record<WorkletRefId, WorkletRef<unknown>>;\n updateWorkletRef(\n refImpl: WorkletRefImpl<Element | null>,\n element: ElementNode | null,\n ): void;\n updateWorkletRefInitValueChanges(patch: [number, unknown][]): void;\n clearFirstScreenWorkletRefMap(): void;\n}\n\nlet impl: RefImpl | undefined;\n\nfunction initWorkletRef(): RefImpl {\n return (impl = {\n _workletRefMap: {},\n /**\n * Map of worklet refs that are created during first screen rendering.\n * These refs are created with negative IDs and need to be hydrated\n * when the app starts. The map is cleared after hydration is complete\n * to free up memory.\n */\n _firstScreenWorkletRefMap: {},\n updateWorkletRef,\n updateWorkletRefInitValueChanges,\n clearFirstScreenWorkletRefMap,\n });\n}\n\nconst createWorkletRef = <T>(\n id: WorkletRefId,\n value: T,\n): WorkletRef<T> => {\n return {\n current: value,\n _wvid: id,\n };\n};\n\nconst getFromWorkletRefMap = <T>(\n refImpl: WorkletRefImpl<T>,\n): WorkletRef<T> => {\n const id = refImpl._wvid;\n let value;\n if (id < 0) {\n // At the first screen rendering, the worklet ref is created with a negative ID.\n // Might be called in two scenarios:\n // 1. In MTS events\n // 2. In `main-thread:ref`\n value = impl!._firstScreenWorkletRefMap[id] as WorkletRef<T>;\n if (!value) {\n value = impl!._firstScreenWorkletRefMap[id] = createWorkletRef(id, refImpl._initValue);\n }\n } else {\n value = impl!._workletRefMap[id] as WorkletRef<T>;\n }\n\n /* v8 ignore next 3 */\n if (__DEV__ && value === undefined) {\n throw new Error('Worklet: ref is not initialized: ' + id);\n }\n return value;\n};\n\nfunction removeValueFromWorkletRefMap(id: WorkletRefId): void {\n delete impl!._workletRefMap[id];\n}\n\n/**\n * Create an element instance of the given element node, then set the worklet value to it.\n * This is called in `snapshotContextUpdateWorkletRef`.\n * @param handle handle of the worklet value.\n * @param element the element node.\n */\nfunction updateWorkletRef(\n handle: WorkletRefImpl<Element | null>,\n element: ElementNode | null,\n): void {\n getFromWorkletRefMap(handle).current = element\n ? new Element(element)\n : null;\n}\n\nfunction updateWorkletRefInitValueChanges(\n patch: [WorkletRefId, unknown][],\n): void {\n profile('updateWorkletRefInitValueChanges', () => {\n patch.forEach(([id, value]) => {\n if (!impl!._workletRefMap[id]) {\n impl!._workletRefMap[id] = createWorkletRef(id, value);\n }\n });\n });\n}\n\nfunction clearFirstScreenWorkletRefMap(): void {\n impl!._firstScreenWorkletRefMap = {};\n}\n\nexport {\n type RefImpl,\n createWorkletRef,\n initWorkletRef,\n getFromWorkletRefMap,\n removeValueFromWorkletRefMap,\n updateWorkletRefInitValueChanges,\n};\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport type { ReleaseWorkletRefData, RunWorkletCtxData, RunWorkletCtxRetData } from './bindings/events.js';\nimport type { ClosureValueType } from './bindings/types.js';\nimport type { Event } from './types/runtimeProxy.js';\nimport { removeValueFromWorkletRefMap } from './workletRef.js';\n\nfunction initEventListeners(): void {\n const jsContext = lynx.getJSContext();\n jsContext.addEventListener(\n WorkletEvents.runWorkletCtx,\n (event: Event) => {\n const data = JSON.parse(event.data as string) as RunWorkletCtxData;\n const returnValue = runWorklet(data.worklet, data.params as ClosureValueType[]);\n jsContext.dispatchEvent({\n type: WorkletEvents.FunctionCallRet,\n data: JSON.stringify({\n resolveId: data.resolveId,\n returnValue,\n } as RunWorkletCtxRetData),\n });\n },\n );\n jsContext.addEventListener(\n WorkletEvents.releaseWorkletRef,\n (event: Event) => {\n removeValueFromWorkletRefMap((event.data as ReleaseWorkletRefData).id);\n },\n );\n}\n\nexport { initEventListeners };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport type { JsFnHandle } from './bindings/types.js';\n\ninterface Details {\n task: (fnId: number, execId: number) => void;\n\n // This comes from the background thread, inserted here during ctx hydration.\n jsFnHandle?: JsFnHandle;\n}\n\ninterface RunOnBackgroundDelayImpl {\n // Elements should keep the order being called by the user.\n delayedBackgroundFunctionArray: Details[];\n delayRunOnBackground(fnObj: JsFnHandle, fn: (fnId: number, execId: number) => void): void;\n runDelayedBackgroundFunctions(): void;\n}\n\nlet impl: RunOnBackgroundDelayImpl | undefined;\n\nfunction initRunOnBackgroundDelay(): RunOnBackgroundDelayImpl {\n return (impl = {\n delayedBackgroundFunctionArray: [],\n delayRunOnBackground,\n runDelayedBackgroundFunctions,\n });\n}\n\nfunction delayRunOnBackground(fnObj: JsFnHandle, task: (fnId: number, execId: number) => void) {\n impl!.delayedBackgroundFunctionArray.push({ task });\n const delayIndices = fnObj._delayIndices ??= [];\n delayIndices.push(impl!.delayedBackgroundFunctionArray.length - 1);\n}\n\nfunction runDelayedBackgroundFunctions(): void {\n for (const details of impl!.delayedBackgroundFunctionArray) {\n if (details.jsFnHandle) {\n details.task(details.jsFnHandle._jsFnId!, details.jsFnHandle._execId!);\n }\n }\n impl!.delayedBackgroundFunctionArray.length = 0;\n}\n\nexport { type RunOnBackgroundDelayImpl, initRunOnBackgroundDelay };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport type { ClosureValueType, Worklet } from './bindings/types.js';\nimport { profile } from './utils/profile.js';\n\ninterface EventDelayImpl {\n _delayedWorkletParamsMap: Map<string, ClosureValueType[][]>;\n runDelayedWorklet(worklet: Worklet, element: ElementNode): void;\n clearDelayedWorklets(): void;\n}\n\nlet impl: EventDelayImpl | undefined;\n\nfunction initEventDelay(): EventDelayImpl {\n return (impl = {\n _delayedWorkletParamsMap: new Map(),\n runDelayedWorklet,\n clearDelayedWorklets,\n });\n}\n\nfunction delayExecUntilJsReady(\n hash: string,\n params: ClosureValueType[],\n): void {\n profile('delayExecUntilJsReady: ' + hash, () => {\n const map = impl!._delayedWorkletParamsMap;\n const paramVec = map.get(hash);\n if (paramVec) {\n paramVec.push(params);\n } else {\n map.set(hash, [params]);\n }\n });\n}\n\nfunction runDelayedWorklet(worklet: Worklet, element: ElementNode): void {\n profile('commitDelayedWorklet', () => {\n const paramsVec = impl!._delayedWorkletParamsMap.get(\n worklet._wkltId,\n );\n if (paramsVec === undefined) {\n return;\n }\n const leftParamsVec: ClosureValueType[][] = [];\n paramsVec.forEach((params) => {\n const firstParam = params[0] as { currentTarget?: { elementRefptr?: ElementNode } } | undefined;\n if (firstParam?.currentTarget?.elementRefptr === element) {\n setTimeout(() => {\n profile('runDelayedWorklet', () => {\n runWorklet(worklet, params);\n });\n }, 0);\n } else {\n leftParamsVec.push(params);\n }\n });\n impl!._delayedWorkletParamsMap.set(\n worklet._wkltId,\n leftParamsVec,\n );\n });\n}\n\nfunction clearDelayedWorklets(): void {\n impl!._delayedWorkletParamsMap.clear();\n}\n\nexport { type EventDelayImpl, initEventDelay, delayExecUntilJsReady, runDelayedWorklet, clearDelayedWorklets };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\n\nimport { Element } from './api/element.js';\nimport type { ClosureValueType, JsFnHandle, Worklet, WorkletRefId, WorkletRefImpl } from './bindings/index.js';\nimport { profile } from './utils/profile.js';\n\n/**\n * Hydrates a Worklet context with data from a first-screen Worklet context.\n * This process is typically used to run all delayed `runOnBackground` functions\n * and initialize `WorkletRef` values modified before hydration.\n *\n * @param ctx The target Worklet context to be hydrated.\n * @param firstScreenCtx The Worklet context from the first screen rendering,\n * containing the data to hydrate with.\n */\nexport function hydrateCtx(ctx: Worklet, firstScreenCtx: Worklet): void {\n profile('hydrateCtx', () => {\n hydrateCtxImpl(ctx, firstScreenCtx, ctx._execId!);\n });\n}\n\nfunction hydrateCtxImpl(ctx: ClosureValueType, firstScreenCtx: ClosureValueType, execId: number): void {\n if (!ctx || typeof ctx !== 'object' || !firstScreenCtx || typeof firstScreenCtx !== 'object') return;\n\n const ctxObj = ctx as Record<string, ClosureValueType>;\n const firstScreenCtxObj = firstScreenCtx as Record<string, ClosureValueType>;\n\n if (ctxObj['_wkltId'] && ctxObj['_wkltId'] !== firstScreenCtxObj['_wkltId']) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-for-in-array\n for (const key in ctx) {\n if (key === '_wvid') {\n hydrateMainThreadRef(ctxObj[key] as WorkletRefId, firstScreenCtxObj as unknown as WorkletRefImpl<unknown>);\n } else if (key === '_jsFn') {\n hydrateDelayRunOnBackgroundTasks(\n ctxObj[key] as Record<string, JsFnHandle>,\n firstScreenCtxObj[key] as Record<string, JsFnHandle>,\n execId,\n );\n } else {\n const firstScreenValue = typeof firstScreenCtxObj[key] === 'function'\n ? (firstScreenCtxObj[key] as { ctx: ClosureValueType }).ctx\n : firstScreenCtxObj[key];\n hydrateCtxImpl(ctxObj[key], firstScreenValue, execId);\n }\n }\n}\n\n/**\n * Hydrates a WorkletRef on the main thread.\n * This is used to update the WorkletRef's background initial value based on changes\n * that occurred in the first-screen Worklet context before hydration.\n *\n * @param refId The ID of the WorkletRef to hydrate.\n * @param value The new value for the WorkletRef.\n */\nfunction hydrateMainThreadRef(refId: WorkletRefId, value: WorkletRefImpl<unknown> | { current: unknown }) {\n if ('_initValue' in value) {\n // The ref has not been accessed yet.\n return;\n }\n const ref = lynxWorkletImpl!._refImpl._workletRefMap[refId]!;\n if (ref.current instanceof Element) {\n // Modified by `main-thread:ref`\n return;\n }\n ref.current = value.current;\n}\n\n/**\n * Hydrates delayed `runOnBackground` tasks.\n * This function ensures that any `runOnBackground` calls that were delayed\n * during the first-screen rendering are correctly associated with their\n * respective JavaScript function handles in the hydrated Worklet context.\n */\nfunction hydrateDelayRunOnBackgroundTasks(\n fnObjs: Record<string, JsFnHandle>, // example: {\"_jsFn1\":{\"_jsFnId\":1}}\n firstScreenFnObjs: Record<string, JsFnHandle>, // example: {\"_jsFn1\":{\"_isFirstScreen\":true,\"_delayIndices\":[0]}}\n execId: number,\n) {\n for (const fnName in fnObjs) {\n const fnObj = fnObjs[fnName]!;\n const firstScreenFnObj: JsFnHandle | undefined = firstScreenFnObjs[fnName];\n if (!firstScreenFnObj?._delayIndices) {\n continue;\n }\n for (const index of firstScreenFnObj._delayIndices) {\n const details = lynxWorkletImpl!._runOnBackgroundDelayImpl.delayedBackgroundFunctionArray[index]!;\n fnObj._execId = execId;\n details.jsFnHandle = fnObj;\n }\n }\n}\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { WorkletEvents } from './bindings/events.js';\nimport { profile } from './utils/profile.js';\nimport { isSdkVersionGt } from './utils/version.js';\n\n/**\n * `JsFunctionLifecycleManager` monitors references to JS function handles to be called by `runOnBackground()`.\n * In JS context, functions to be called by `runOnBackground()` is referenced by `JsFnHandle`s and finally by `execId`.\n * When all `JsFnHandle`s in lepus are released, an event will be sent to JS context to de-ref the `execId`,\n * resulting a de-ref to the js function in JS context.\n */\nclass JsFunctionLifecycleManager {\n private execIdRefCount = new Map<number, number>();\n private execIdSetToFire = new Set<number>();\n private willFire = false;\n private registry?: FinalizationRegistry<number> = undefined;\n\n constructor() {\n this.registry = new FinalizationRegistry<number>(this.removeRef.bind(this));\n }\n\n addRef(execId: number, objToRef: object): void {\n this.execIdRefCount.set(\n execId,\n (this.execIdRefCount.get(execId) ?? 0) + 1,\n );\n this.registry!.register(objToRef, execId);\n }\n\n removeRef(execId: number): void {\n const rc = this.execIdRefCount.get(execId)!;\n if (rc > 1) {\n this.execIdRefCount.set(execId, rc - 1);\n return;\n }\n this.execIdRefCount.delete(execId);\n this.execIdSetToFire.add(execId);\n if (!this.willFire) {\n this.willFire = true;\n void Promise.resolve().then(() => {\n this.fire();\n });\n }\n }\n\n fire(): void {\n profile('JsFunctionLifecycleManager.fire', () => {\n lynx.getJSContext().dispatchEvent({\n type: WorkletEvents.releaseBackgroundWorkletCtx,\n data: Array.from(this.execIdSetToFire),\n });\n this.execIdSetToFire.clear();\n this.willFire = false;\n });\n }\n}\n\nfunction isRunOnBackgroundEnabled(): boolean {\n return isSdkVersionGt(2, 15);\n}\n\nexport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { Element } from './api/element.js';\nimport type { ClosureValueType, Worklet, WorkletRefImpl } from './bindings/types.js';\nimport { initRunOnBackgroundDelay } from './delayRunOnBackground.js';\nimport { delayExecUntilJsReady, initEventDelay } from './delayWorkletEvent.js';\nimport { hydrateCtx } from './hydrate.js';\nimport { JsFunctionLifecycleManager, isRunOnBackgroundEnabled } from './jsFunctionLifecycle.js';\nimport { profile } from './utils/profile.js';\nimport { getFromWorkletRefMap, initWorkletRef } from './workletRef.js';\n\nfunction initWorklet(): void {\n globalThis.lynxWorkletImpl = {\n _workletMap: {},\n _refImpl: initWorkletRef(),\n _runOnBackgroundDelayImpl: initRunOnBackgroundDelay(),\n _hydrateCtx: hydrateCtx,\n _eventDelayImpl: initEventDelay(),\n };\n\n if (isRunOnBackgroundEnabled()) {\n globalThis.lynxWorkletImpl._jsFunctionLifecycleManager = new JsFunctionLifecycleManager();\n }\n\n globalThis.registerWorklet = registerWorklet;\n globalThis.registerWorkletInternal = registerWorklet;\n globalThis.runWorklet = runWorklet;\n}\n\n/**\n * Register a worklet function, allowing it to be executed by `runWorklet()`.\n * This is called in lepus.js.\n * @param _type worklet type, 'main-thread' or 'ui'\n * @param id worklet hash\n * @param worklet worklet function\n */\nfunction registerWorklet(_type: string, id: string, worklet: (...args: unknown[]) => unknown): void {\n lynxWorkletImpl._workletMap[id] = worklet;\n}\n\n/**\n * Entrance of all worklet calls.\n * Native event touch handler will call this function.\n * @param ctx worklet object.\n * @param params worklet params.\n */\nfunction runWorklet(ctx: Worklet, params: ClosureValueType[]): unknown {\n if (!validateWorklet(ctx)) {\n console.warn('Worklet: Invalid worklet object: ' + JSON.stringify(ctx));\n return;\n }\n if ('_lepusWorkletHash' in ctx) {\n delayExecUntilJsReady(ctx._lepusWorkletHash, params);\n return;\n }\n return runWorkletImpl(ctx, params);\n}\n\nfunction runWorkletImpl(ctx: Worklet, params: ClosureValueType[]): unknown {\n const worklet: (...args: unknown[]) => unknown = profile(\n 'transformWorkletCtx ' + ctx._wkltId,\n () => transformWorklet(ctx, true),\n );\n const params_: ClosureValueType[] = profile(\n 'transformWorkletParams',\n () => transformWorklet(params || [], false),\n );\n return profile('runWorklet', () => worklet(...params_));\n}\n\nfunction validateWorklet(ctx: unknown): ctx is Worklet {\n return typeof ctx === 'object' && ctx !== null && ('_wkltId' in ctx || '_lepusWorkletHash' in ctx);\n}\n\nconst workletCache = new WeakMap<object, ClosureValueType | ((...args: unknown[]) => unknown)>();\n\nfunction transformWorklet(ctx: Worklet, isWorklet: true): (...args: unknown[]) => unknown;\nfunction transformWorklet(\n ctx: ClosureValueType[],\n isWorklet: false,\n): ClosureValueType[];\n\nfunction transformWorklet(\n ctx: ClosureValueType,\n isWorklet: boolean,\n): ClosureValueType | ((...args: unknown[]) => unknown) {\n /* v8 ignore next 3 */\n if (typeof ctx !== 'object' || ctx === null) {\n return ctx;\n }\n\n if (isWorklet) {\n const res = workletCache.get(ctx);\n if (res) {\n return res;\n }\n }\n\n const worklet = { main: ctx };\n transformWorkletInner(worklet, 0, ctx);\n\n if (isWorklet) {\n workletCache.set(ctx, worklet.main);\n }\n return worklet.main;\n}\n\nconst transformWorkletInner = (\n value: ClosureValueType,\n depth: number,\n ctx: unknown,\n) => {\n const limit = 1000;\n if (++depth >= limit) {\n throw new Error('Depth of value exceeds limit of ' + limit + '.');\n }\n /* v8 ignore next 3 */\n if (typeof value !== 'object' || value === null) {\n return;\n }\n const obj = value as Record<string, ClosureValueType>;\n\n for (const key in obj) {\n const subObj: ClosureValueType = obj[key];\n if (typeof subObj !== 'object' || subObj === null) {\n continue;\n }\n\n const isEventTarget = 'elementRefptr' in subObj;\n if (!isEventTarget) {\n transformWorkletInner(subObj, depth, ctx);\n }\n\n if (isEventTarget) {\n obj[key] = new Element(subObj['elementRefptr'] as ElementNode);\n continue;\n }\n const isWorkletRef = '_wvid' in (subObj as object);\n if (isWorkletRef) {\n obj[key] = getFromWorkletRefMap(\n subObj as unknown as WorkletRefImpl<unknown>,\n );\n continue;\n }\n const isWorklet = '_wkltId' in subObj;\n if (isWorklet) {\n // `subObj` is worklet ctx. Shallow copy it to prevent the transformed worklet from referencing ctx.\n // This would result in the value of `workletCache` referencing its key.\n obj[key] = lynxWorkletImpl._workletMap[(subObj as Worklet)._wkltId]!\n .bind({ ...subObj });\n obj[key].ctx = subObj;\n continue;\n }\n const isJsFn = '_jsFnId' in subObj;\n if (isJsFn) {\n subObj['_execId'] = (ctx as Worklet)._execId;\n lynxWorkletImpl._jsFunctionLifecycleManager?.addRef(\n (ctx as Worklet)._execId!,\n subObj,\n );\n continue;\n }\n }\n};\n\nexport { initWorklet };\n", "// Copyright 2024 The Lynx Authors. All rights reserved.\n// Licensed under the Apache License Version 2.0 that can be found in the\n// LICENSE file in the root directory of this source tree.\nimport { initApiEnv } from './api/lynxApi.js';\nimport { initEventListeners } from './listeners.js';\nimport { initWorklet } from './workletRuntime.js';\n\nif (globalThis.lynxWorkletImpl === undefined) {\n initWorklet();\n initApiEnv();\n initEventListeners();\n}\n"],
|
|
6
|
-
"mappings": ";;;;;;;AAGO,MAAM,WAAN,MAAM,SAAQ;AAAA,IAMnB,YAAY,SAAsB;AAFlC;AAAA,0BAAiB;AAMf,aAAO,eAAe,MAAM,WAAW;AAAA,QACrC,MAAM;AACJ,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEO,aAAa,MAAc,OAAsB;AACtD,qBAAe,KAAK,SAAS,MAAM,KAAK;AACxC,WAAK,iBAAiB;AAAA,IACxB;AAAA,IAEO,iBAAiB,MAAc,OAAqB;AACzD,uBAAiB,KAAK,SAAS,MAAM,KAAK;AAC1C,WAAK,iBAAiB;AAAA,IACxB;AAAA,IAEO,mBAAmB,QAAsC;AAC9D,iBAAW,OAAO,QAAQ;AACxB,yBAAiB,KAAK,SAAS,KAAK,OAAO,GAAG,CAAE;AAAA,MAClD;AACA,WAAK,iBAAiB;AAAA,IACxB;AAAA,IAEO,aAAa,eAAgC;AAClD,aAAO,qBAAqB,KAAK,SAAS,aAAa;AAAA,IACzD;AAAA,IAEO,oBAA8B;AACnC,aAAO,oBAAoB,KAAK,OAAO;AAAA,IACzC;AAAA,IAEO,cAAc,UAAkC;AACrD,YAAM,MAAM,gBAAgB,KAAK,SAAS,UAAU,CAAC,CAAC;AACtD,aAAO,MAAM,IAAI,SAAQ,GAAG,IAAI;AAAA,IAClC;AAAA,IAEO,iBAAiB,UAA6B;AACnD,aAAO,mBAAmB,KAAK,SAAS,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY;AACrE,eAAO,IAAI,SAAQ,OAAO;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,IAEO,OACL,YACA,QACkB;AAClB,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC;AAAA,UACE,KAAK;AAAA,UACL;AAAA,UACA,0BAAU,CAAC;AAAA,UACX,CAAC,QAAyC;AACxC,gBAAI,IAAI,SAAS,GAAG;AAClB,sBAAQ,IAAI,IAAI;AAAA,YAClB,OAAO;AACL,qBAAO,IAAI,MAAM,uBAAuB,KAAK,UAAU,GAAG,CAAC,CAAC;AAAA,YAC9D;AAAA,UACF;AAAA,QACF;AACA,aAAK,iBAAiB;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,IAEQ,mBAAmB;AACzB,UAAI,SAAQ,WAAW;AACrB;AAAA,MACF;AACA,eAAQ,YAAY;AACpB,WAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChC,iBAAQ,YAAY;AACpB,2BAAmB;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAnFE,gBADW,UACI,aAAY;AADtB,MAAM,UAAN;;;ACEP,MAAM,eAAN,MAAM,aAAY;AAAA,IAGhB,OAAO,MAAM;AARf;AASI,yBAAY,gBAAZ,yBAAY,cAAgB,iBAAiB;AAC7C,aAAO,aAAY;AAAA,IACrB;AAAA,EACF;AANE,gBADI,cACW;AADjB,MAAM,cAAN;AASO,WAAS,cAAc,aAAqC;AACjE,UAAM,UAAU,gBAAgB,YAAY,IAAI,GAAG,aAAa,CAAC,CAAC;AAClE,WAAO,UAAU,IAAI,QAAQ,OAAO,IAAI;AAAA,EAC1C;AAEO,WAAS,iBAAiB,aAAgC;AAC/D,WAAO,mBAAmB,YAAY,IAAI,GAAG,aAAa,CAAC,CAAC,EAAE;AAAA,MAC5D,CAAC,YAAY;AACX,eAAO,IAAI,QAAQ,OAAO;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;;;ACtBO,WAAS,eAAe,OAAe,OAAwB;AAHtE;AAIE,UAAM,kBAAyB,gBAAW,mBAAX,YAA6B;AAC5D,UAAM,UAAU,eAAe,MAAM,GAAG;AACxC,WACE,OAAO,QAAQ,CAAC,CAAC,IAAI,SACjB,OAAO,QAAQ,CAAC,CAAC,KAAK,SAAS,OAAO,QAAQ,CAAC,CAAC,IAAI;AAAA,EAE5D;;;ACJA,WAAS,aAAmB;AAN5B;AAQE,SAAK,gBAAgB;AAErB,SAAK,mBAAmB;AAExB,eAAW,aAAa,KAAK;AAE7B,eAAW,cAAc,KAAK;AAE9B,eAAW,eAAe,KAAK;AAG/B,eAAW,iBAAiB,UAAK,kBAAL,YAAsB,KAAK;AAEvD;AAEE,YAAM,wBAAwB,KAAK;AAEnC,WAAK,wBAAwB,WAAW,wBAAwB,CAC9D,aACG;AACH,YAAI,CAAC,eAAe,GAAG,EAAE,GAAG;AAC1B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,eAAO,sBAAsB,QAAQ;AAAA,MACvC;AAAA,IACF;AAGA,eAAW,uBAAuB,KAAK;AAAA,EACzC;;;ACpCO,WAAS,QACd,WACA,GACK;AAGL,QAAI,OAAS;AACX,cAAQ,QAAQ,SAAS;AACzB,UAAI;AACF,eAAO,EAAE;AAAA,MACX,UAAE;AACA,gBAAQ,WAAW;AAAA,MACrB;AAAA,IACF,OAAO;AACL,aAAO,EAAE;AAAA,IACX;AAAA,EACF;;;ACDA,MAAI;AAEJ,WAAS,iBAA0B;AACjC,WAAQ,OAAO;AAAA,MACb,gBAAgB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOjB,2BAA2B,CAAC;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAM,mBAAmB,CACvB,IACA,UACkB;AAClB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAM,uBAAuB,CAC3B,YACkB;AAClB,UAAM,KAAK,QAAQ;AACnB,QAAI;AACJ,QAAI,KAAK,GAAG;AAKV,cAAQ,KAAM,0BAA0B,EAAE;AAC1C,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAM,0BAA0B,EAAE,IAAI,iBAAiB,IAAI,QAAQ,UAAU;AAAA,MACvF;AAAA,IACF,OAAO;AACL,cAAQ,KAAM,eAAe,EAAE;AAAA,IACjC;AAGA,QAAI,OAAgC;AAClC,YAAM,IAAI,MAAM,sCAAsC,EAAE;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AAEA,WAAS,6BAA6B,IAAwB;AAC5D,WAAO,KAAM,eAAe,EAAE;AAAA,EAChC;AAQA,WAAS,iBACP,QACA,SACM;AACN,yBAAqB,MAAM,EAAE,UAAU,UACnC,IAAI,QAAQ,OAAO,IACnB;AAAA,EACN;AAEA,WAAS,iCACP,OACM;AACN,YAAQ,oCAAoC,MAAM;AAChD,YAAM,QAAQ,CAAC,CAAC,IAAI,KAAK,MAAM;AAC7B,YAAI,CAAC,KAAM,eAAe,EAAE,GAAG;AAC7B,eAAM,eAAe,EAAE,IAAI,iBAAiB,IAAI,KAAK;AAAA,QACvD;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAEA,WAAS,gCAAsC;AAC7C,SAAM,4BAA4B,CAAC;AAAA,EACrC;;;AC/FA,WAAS,qBAA2B;AAClC,UAAM,YAAY,KAAK,aAAa;AACpC,cAAU;AAAA;AAAA,MAER,CAAC,UAAiB;AAChB,cAAM,OAAO,KAAK,MAAM,MAAM,IAAc;AAC5C,cAAM,cAAc,WAAW,KAAK,SAAS,KAAK,MAA4B;AAC9E,kBAAU,cAAc;AAAA,UACtB;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB,WAAW,KAAK;AAAA,YAChB;AAAA,UACF,CAAyB;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AACA,cAAU;AAAA;AAAA,MAER,CAAC,UAAiB;AAChB,qCAA8B,MAAM,KAA+B,EAAE;AAAA,MACvE;AAAA,IACF;AAAA,EACF;;;ACZA,MAAIA;AAEJ,WAAS,2BAAqD;AAC5D,WAAQA,QAAO;AAAA,MACb,gCAAgC,CAAC;AAAA,MACjC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,qBAAqB,OAAmB,MAA8C;AA7B/F;AA8BE,IAAAA,MAAM,+BAA+B,KAAK,EAAE,KAAK,CAAC;AAClD,UAAM,gBAAe,WAAM,kBAAN,kBAAM,gBAAkB,CAAC;AAC9C,iBAAa,KAAKA,MAAM,+BAA+B,SAAS,CAAC;AAAA,EACnE;AAEA,WAAS,gCAAsC;AAC7C,eAAW,WAAWA,MAAM,gCAAgC;AAC1D,UAAI,QAAQ,YAAY;AACtB,gBAAQ,KAAK,QAAQ,WAAW,SAAU,QAAQ,WAAW,OAAQ;AAAA,MACvE;AAAA,IACF;AACA,IAAAA,MAAM,+BAA+B,SAAS;AAAA,EAChD;;;AC9BA,MAAIC;AAEJ,WAAS,iBAAiC;AACxC,WAAQA,QAAO;AAAA,MACb,0BAA0B,oBAAI,IAAI;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,WAAS,sBACP,MACA,QACM;AACN,YAAQ,4BAA4B,MAAM,MAAM;AAC9C,YAAM,MAAMA,MAAM;AAClB,YAAM,WAAW,IAAI,IAAI,IAAI;AAC7B,UAAI,UAAU;AACZ,iBAAS,KAAK,MAAM;AAAA,MACtB,OAAO;AACL,YAAI,IAAI,MAAM,CAAC,MAAM,CAAC;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,kBAAkB,SAAkB,SAA4B;AACvE,YAAQ,wBAAwB,MAAM;AACpC,YAAM,YAAYA,MAAM,yBAAyB;AAAA,QAC/C,QAAQ;AAAA,MACV;AACA,UAAI,cAAc,QAAW;AAC3B;AAAA,MACF;AACA,YAAM,gBAAsC,CAAC;AAC7C,gBAAU,QAAQ,CAAC,WAAW;AA9ClC;AA+CM,cAAM,aAAa,OAAO,CAAC;AAC3B,cAAI,8CAAY,kBAAZ,mBAA2B,mBAAkB,SAAS;AACxD,qBAAW,MAAM;AACf,oBAAQ,qBAAqB,MAAM;AACjC,yBAAW,SAAS,MAAM;AAAA,YAC5B,CAAC;AAAA,UACH,GAAG,CAAC;AAAA,QACN,OAAO;AACL,wBAAc,KAAK,MAAM;AAAA,QAC3B;AAAA,MACF,CAAC;AACD,MAAAA,MAAM,yBAAyB;AAAA,QAC7B,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,uBAA6B;AACpC,IAAAA,MAAM,yBAAyB,MAAM;AAAA,EACvC;;;AClDO,WAAS,WAAW,KAAc,gBAA+B;AACtE,YAAQ,cAAc,MAAM;AAC1B,qBAAe,KAAK,gBAAgB,IAAI,OAAQ;AAAA,IAClD,CAAC;AAAA,EACH;AAEA,WAAS,eAAe,KAAuB,gBAAkC,QAAsB;AACrG,QAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,CAAC,kBAAkB,OAAO,mBAAmB,SAAU;AAE9F,UAAM,SAAS;AACf,UAAM,oBAAoB;AAE1B,QAAI,OAAO,SAAS,KAAK,OAAO,SAAS,MAAM,kBAAkB,SAAS,GAAG;AAC3E;AAAA,IACF;AAGA,eAAW,OAAO,KAAK;AACrB,UAAI,QAAQ,SAAS;AACnB,6BAAqB,OAAO,GAAG,GAAmB,iBAAuD;AAAA,MAC3G,WAAW,QAAQ,SAAS;AAC1B;AAAA,UACE,OAAO,GAAG;AAAA,UACV,kBAAkB,GAAG;AAAA,UACrB;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM,mBAAmB,OAAO,kBAAkB,GAAG,MAAM,aACtD,kBAAkB,GAAG,EAAgC,MACtD,kBAAkB,GAAG;AACzB,uBAAe,OAAO,GAAG,GAAG,kBAAkB,MAAM;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAUA,WAAS,qBAAqB,OAAqB,OAAuD;AACxG,QAAI,gBAAgB,OAAO;AAEzB;AAAA,IACF;AACA,UAAM,MAAM,gBAAiB,SAAS,eAAe,KAAK;AAC1D,QAAI,IAAI,mBAAmB,SAAS;AAElC;AAAA,IACF;AACA,QAAI,UAAU,MAAM;AAAA,EACtB;AAQA,WAAS,iCACP,QACA,mBACA,QACA;AACA,eAAW,UAAU,QAAQ;AAC3B,YAAM,QAAQ,OAAO,MAAM;AAC3B,YAAM,mBAA2C,kBAAkB,MAAM;AACzE,UAAI,EAAC,qDAAkB,gBAAe;AACpC;AAAA,MACF;AACA,iBAAW,SAAS,iBAAiB,eAAe;AAClD,cAAM,UAAU,gBAAiB,0BAA0B,+BAA+B,KAAK;AAC/F,cAAM,UAAU;AAChB,gBAAQ,aAAa;AAAA,MACvB;AAAA,IACF;AAAA,EACF;;;ACnFA,MAAM,6BAAN,MAAiC;AAAA,IAM/B,cAAc;AALd,0BAAQ,kBAAiB,oBAAI,IAAoB;AACjD,0BAAQ,mBAAkB,oBAAI,IAAY;AAC1C,0BAAQ,YAAW;AACnB,0BAAQ;AAGN,WAAK,WAAW,IAAI,qBAA6B,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,IAC5E;AAAA,IAEA,OAAO,QAAgB,UAAwB;AAvBjD;AAwBI,WAAK,eAAe;AAAA,QAClB;AAAA,UACC,UAAK,eAAe,IAAI,MAAM,MAA9B,YAAmC,KAAK;AAAA,MAC3C;AACA,WAAK,SAAU,SAAS,UAAU,MAAM;AAAA,IAC1C;AAAA,IAEA,UAAU,QAAsB;AAC9B,YAAM,KAAK,KAAK,eAAe,IAAI,MAAM;AACzC,UAAI,KAAK,GAAG;AACV,aAAK,eAAe,IAAI,QAAQ,KAAK,CAAC;AACtC;AAAA,MACF;AACA,WAAK,eAAe,OAAO,MAAM;AACjC,WAAK,gBAAgB,IAAI,MAAM;AAC/B,UAAI,CAAC,KAAK,UAAU;AAClB,aAAK,WAAW;AAChB,aAAK,QAAQ,QAAQ,EAAE,KAAK,MAAM;AAChC,eAAK,KAAK;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,OAAa;AACX,cAAQ,mCAAmC,MAAM;AAC/C,aAAK,aAAa,EAAE,cAAc;AAAA,UAChC;AAAA,UACA,MAAM,MAAM,KAAK,KAAK,eAAe;AAAA,QACvC,CAAC;AACD,aAAK,gBAAgB,MAAM;AAC3B,aAAK,WAAW;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,WAAS,2BAAoC;AAC3C,WAAO,eAAe,GAAG,EAAE;AAAA,EAC7B;;;ACjDA,WAAS,cAAoB;AAC3B,eAAW,kBAAkB;AAAA,MAC3B,aAAa,CAAC;AAAA,MACd,UAAU,eAAe;AAAA,MACzB,2BAA2B,yBAAyB;AAAA,MACpD,aAAa;AAAA,MACb,iBAAiB,eAAe;AAAA,IAClC;AAEA,QAAI,yBAAyB,GAAG;AAC9B,iBAAW,gBAAgB,8BAA8B,IAAI,2BAA2B;AAAA,IAC1F;AAEA,eAAW,kBAAkB;AAC7B,eAAW,0BAA0B;AACrC,eAAW,aAAaC;AAAA,EAC1B;AASA,WAAS,gBAAgB,OAAe,IAAY,SAAgD;AAClG,oBAAgB,YAAY,EAAE,IAAI;AAAA,EACpC;AAQA,WAASA,YAAW,KAAc,QAAqC;AACrE,QAAI,CAAC,gBAAgB,GAAG,GAAG;AACzB,cAAQ,KAAK,sCAAsC,KAAK,UAAU,GAAG,CAAC;AACtE;AAAA,IACF;AACA,QAAI,uBAAuB,KAAK;AAC9B,4BAAsB,IAAI,mBAAmB,MAAM;AACnD;AAAA,IACF;AACA,WAAO,eAAe,KAAK,MAAM;AAAA,EACnC;AAEA,WAAS,eAAe,KAAc,QAAqC;AACzE,UAAM,UAA2C;AAAA,MAC/C,yBAAyB,IAAI;AAAA,MAC7B,MAAM,iBAAiB,KAAK,IAAI;AAAA,IAClC;AACA,UAAM,UAA8B;AAAA,MAClC;AAAA,MACA,MAAM,iBAAiB,UAAU,CAAC,GAAG,KAAK;AAAA,IAC5C;AACA,WAAO,QAAQ,cAAc,MAAM,QAAQ,GAAG,OAAO,CAAC;AAAA,EACxD;AAEA,WAAS,gBAAgB,KAA8B;AACrD,WAAO,OAAO,QAAQ,YAAY,QAAQ,SAAS,aAAa,OAAO,uBAAuB;AAAA,EAChG;AAEA,MAAM,eAAe,oBAAI,QAAsE;AAQ/F,WAAS,iBACP,KACA,WACsD;AAEtD,QAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C,aAAO;AAAA,IACT;AAEA,QAAI,WAAW;AACb,YAAM,MAAM,aAAa,IAAI,GAAG;AAChC,UAAI,KAAK;AACP,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,UAAU,EAAE,MAAM,IAAI;AAC5B,0BAAsB,SAAS,GAAG,GAAG;AAErC,QAAI,WAAW;AACb,mBAAa,IAAI,KAAK,QAAQ,IAAI;AAAA,IACpC;AACA,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAM,wBAAwB,CAC5B,OACA,OACA,QACG;AAhHL;AAiHE,UAAM,QAAQ;AACd,QAAI,EAAE,SAAS,OAAO;AACpB,YAAM,IAAI,MAAM,qCAAqC,QAAQ,GAAG;AAAA,IAClE;AAEA,QAAI,OAAO,UAAU,YAAY,UAAU,MAAM;AAC/C;AAAA,IACF;AACA,UAAM,MAAM;AAEZ,eAAW,OAAO,KAAK;AACrB,YAAM,SAA2B,IAAI,GAAG;AACxC,UAAI,OAAO,WAAW,YAAY,WAAW,MAAM;AACjD;AAAA,MACF;AAEA,YAAM,gBAAgB,mBAAmB;AACzC,UAAI,CAAC,eAAe;AAClB,8BAAsB,QAAQ,OAAO,GAAG;AAAA,MAC1C;AAEA,UAAI,eAAe;AACjB,YAAI,GAAG,IAAI,IAAI,QAAQ,OAAO,eAAe,CAAgB;AAC7D;AAAA,MACF;AACA,YAAM,eAAe,WAAY;AACjC,UAAI,cAAc;AAChB,YAAI,GAAG,IAAI;AAAA,UACT;AAAA,QACF;AACA;AAAA,MACF;AACA,YAAM,YAAY,aAAa;AAC/B,UAAI,WAAW;AAGb,YAAI,GAAG,IAAI,gBAAgB,YAAa,OAAmB,OAAO,EAC/D,KAAK,EAAE,GAAG,OAAO,CAAC;AACrB,YAAI,GAAG,EAAE,MAAM;AACf;AAAA,MACF;AACA,YAAM,SAAS,aAAa;AAC5B,UAAI,QAAQ;AACV,eAAO,SAAS,IAAK,IAAgB;AACrC,8BAAgB,gCAAhB,mBAA6C;AAAA,UAC1C,IAAgB;AAAA,UACjB;AAAA;AAEF;AAAA,MACF;AAAA,IACF;AAAA,EACF;;;AC7JA,MAAI,WAAW,oBAAoB,QAAW;AAC5C,gBAAY;AACZ,eAAW;AACX,uBAAmB;AAAA,EACrB;",
|
|
7
|
-
"names": ["impl", "impl", "runWorklet"]
|
|
8
|
-
}
|