mobx-keystone-yjs 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -0
- package/LICENSE +21 -0
- package/README.md +52 -0
- package/dist/mobx-keystone-yjs.esm.js +272 -0
- package/dist/mobx-keystone-yjs.esm.mjs +272 -0
- package/dist/mobx-keystone-yjs.umd.js +291 -0
- package/dist/types/binding/applyMobxKeystonePatchToYjsObject.d.ts +2 -0
- package/dist/types/binding/bindYjsToMobxKeystone.d.ts +11 -0
- package/dist/types/binding/convertYjsEventToPatches.d.ts +3 -0
- package/dist/types/binding/toYDataType.d.ts +3 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/jsonTypes.d.ts +7 -0
- package/dist/types/utils/error.d.ts +6 -0
- package/package.json +87 -0
- package/src/binding/applyMobxKeystonePatchToYjsObject.ts +92 -0
- package/src/binding/bindYjsToMobxKeystone.ts +142 -0
- package/src/binding/convertYjsEventToPatches.ts +85 -0
- package/src/binding/toYDataType.ts +41 -0
- package/src/index.ts +2 -0
- package/src/jsonTypes.ts +4 -0
- package/src/utils/error.ts +18 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
import { onPatches, onSnapshot, getParentToChildPath, onGlobalPatches, fromSnapshot, applyPatches } from "mobx-keystone";
|
|
2
|
+
import * as Y from "yjs";
|
|
3
|
+
class MobxKeystoneYjsError extends Error {
|
|
4
|
+
constructor(msg) {
|
|
5
|
+
super(msg);
|
|
6
|
+
Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function failure(msg) {
|
|
10
|
+
return new MobxKeystoneYjsError(msg);
|
|
11
|
+
}
|
|
12
|
+
function isJSONPrimitive(v) {
|
|
13
|
+
const t = typeof v;
|
|
14
|
+
return t === "string" || t === "number" || t === "boolean" || v === null;
|
|
15
|
+
}
|
|
16
|
+
function isJSONArray(v) {
|
|
17
|
+
return Array.isArray(v);
|
|
18
|
+
}
|
|
19
|
+
function isJSONObject(v) {
|
|
20
|
+
return !isJSONArray(v) && typeof v === "object";
|
|
21
|
+
}
|
|
22
|
+
function toYDataType(v) {
|
|
23
|
+
if (isJSONPrimitive(v)) {
|
|
24
|
+
return v;
|
|
25
|
+
} else if (isJSONArray(v)) {
|
|
26
|
+
const arr = new Y.Array();
|
|
27
|
+
applyJsonArray(arr, v);
|
|
28
|
+
return arr;
|
|
29
|
+
} else if (isJSONObject(v)) {
|
|
30
|
+
const map = new Y.Map();
|
|
31
|
+
applyJsonObject(map, v);
|
|
32
|
+
return map;
|
|
33
|
+
} else {
|
|
34
|
+
return void 0;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function applyJsonArray(dest, source) {
|
|
38
|
+
dest.push(source.map(toYDataType));
|
|
39
|
+
}
|
|
40
|
+
function applyJsonObject(dest, source) {
|
|
41
|
+
Object.entries(source).forEach(([k, v]) => {
|
|
42
|
+
dest.set(k, toYDataType(v));
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
46
|
+
if (patch.path.length > 1) {
|
|
47
|
+
const [key, ...rest] = patch.path;
|
|
48
|
+
if (yjs instanceof Y.Map) {
|
|
49
|
+
const child = yjs.get(String(key));
|
|
50
|
+
if (child === void 0) {
|
|
51
|
+
throw failure(`invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`);
|
|
52
|
+
}
|
|
53
|
+
applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
|
|
54
|
+
} else if (yjs instanceof Y.Array) {
|
|
55
|
+
const child = yjs.get(Number(key));
|
|
56
|
+
if (child === void 0) {
|
|
57
|
+
throw failure(`invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(patch)}`);
|
|
58
|
+
}
|
|
59
|
+
applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
|
|
60
|
+
} else {
|
|
61
|
+
throw failure(`invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(patch)}`);
|
|
62
|
+
}
|
|
63
|
+
} else if (patch.path.length === 1) {
|
|
64
|
+
if (yjs instanceof Y.Map) {
|
|
65
|
+
const key = String(patch.path[0]);
|
|
66
|
+
switch (patch.op) {
|
|
67
|
+
case "add":
|
|
68
|
+
case "replace": {
|
|
69
|
+
yjs.set(key, toYDataType(patch.value));
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
case "remove": {
|
|
73
|
+
yjs.delete(key);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
default: {
|
|
77
|
+
throw failure(`invalid patch operation for map`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
} else if (yjs instanceof Y.Array) {
|
|
81
|
+
const key = patch.path[0];
|
|
82
|
+
switch (patch.op) {
|
|
83
|
+
case "replace": {
|
|
84
|
+
if (key === "length") {
|
|
85
|
+
if (yjs.length > patch.value) {
|
|
86
|
+
const toDelete = yjs.length - patch.value;
|
|
87
|
+
yjs.delete(patch.value, toDelete);
|
|
88
|
+
} else if (yjs.length < patch.value) {
|
|
89
|
+
const toInsert = patch.value - yjs.length;
|
|
90
|
+
yjs.insert(yjs.length, Array(toInsert).fill(void 0));
|
|
91
|
+
}
|
|
92
|
+
} else {
|
|
93
|
+
yjs.delete(Number(key));
|
|
94
|
+
yjs.insert(Number(key), [toYDataType(patch.value)]);
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
case "add": {
|
|
99
|
+
yjs.insert(Number(key), [toYDataType(patch.value)]);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "remove": {
|
|
103
|
+
yjs.delete(Number(key));
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
106
|
+
default: {
|
|
107
|
+
throw failure(`invalid patch operation for array`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
} else {
|
|
111
|
+
throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`);
|
|
112
|
+
}
|
|
113
|
+
} else {
|
|
114
|
+
throw failure(`invalid patch path, it cannot be empty`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function convertYjsEventToPatches(event) {
|
|
118
|
+
const patches = [];
|
|
119
|
+
if (event instanceof Y.YMapEvent) {
|
|
120
|
+
const source = event.target;
|
|
121
|
+
event.changes.keys.forEach((change, key) => {
|
|
122
|
+
const path = [...event.path, key];
|
|
123
|
+
switch (change.action) {
|
|
124
|
+
case "add":
|
|
125
|
+
patches.push({
|
|
126
|
+
op: "add",
|
|
127
|
+
path,
|
|
128
|
+
value: toPlainValue(source.get(key))
|
|
129
|
+
});
|
|
130
|
+
break;
|
|
131
|
+
case "update":
|
|
132
|
+
patches.push({
|
|
133
|
+
op: "replace",
|
|
134
|
+
path,
|
|
135
|
+
value: toPlainValue(source.get(key))
|
|
136
|
+
});
|
|
137
|
+
break;
|
|
138
|
+
case "delete":
|
|
139
|
+
patches.push({
|
|
140
|
+
op: "remove",
|
|
141
|
+
path
|
|
142
|
+
});
|
|
143
|
+
break;
|
|
144
|
+
default:
|
|
145
|
+
throw failure(`unsupported Yjs map event action: ${change.action}`);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
} else if (event instanceof Y.YArrayEvent) {
|
|
149
|
+
let retain = 0;
|
|
150
|
+
event.changes.delta.forEach((change) => {
|
|
151
|
+
if (change.retain) {
|
|
152
|
+
retain += change.retain;
|
|
153
|
+
}
|
|
154
|
+
if (change.delete) {
|
|
155
|
+
const path = [...event.path, retain];
|
|
156
|
+
for (let i = 0; i < change.delete; i++) {
|
|
157
|
+
patches.push({
|
|
158
|
+
op: "remove",
|
|
159
|
+
path
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (change.insert) {
|
|
164
|
+
const newValues = Array.isArray(change.insert) ? change.insert : [change.insert];
|
|
165
|
+
newValues.forEach((v) => {
|
|
166
|
+
const path = [...event.path, retain];
|
|
167
|
+
patches.push({
|
|
168
|
+
op: "add",
|
|
169
|
+
path,
|
|
170
|
+
value: toPlainValue(v)
|
|
171
|
+
});
|
|
172
|
+
retain++;
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return patches;
|
|
178
|
+
}
|
|
179
|
+
function toPlainValue(v) {
|
|
180
|
+
if (v instanceof Y.Map || v instanceof Y.Array) {
|
|
181
|
+
return v.toJSON();
|
|
182
|
+
} else {
|
|
183
|
+
return v;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
187
|
+
const yjsJson = yjsObject.toJSON();
|
|
188
|
+
const initializationGlobalPatches = [];
|
|
189
|
+
const createBoundObject = () => {
|
|
190
|
+
const disposeOnGlobalPatches = onGlobalPatches((target, patches) => {
|
|
191
|
+
initializationGlobalPatches.push({ target, patches });
|
|
192
|
+
});
|
|
193
|
+
try {
|
|
194
|
+
return fromSnapshot(mobxKeystoneType, yjsJson);
|
|
195
|
+
} finally {
|
|
196
|
+
disposeOnGlobalPatches();
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
const boundObject = createBoundObject();
|
|
200
|
+
let applyingMobxKeystoneChanges = 0;
|
|
201
|
+
const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
202
|
+
const observeDeepCb = (events) => {
|
|
203
|
+
const patches = [];
|
|
204
|
+
events.forEach((event) => {
|
|
205
|
+
if (event.transaction.origin !== yjsOrigin) {
|
|
206
|
+
patches.push(...convertYjsEventToPatches(event));
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
if (patches.length > 0) {
|
|
210
|
+
applyingMobxKeystoneChanges++;
|
|
211
|
+
try {
|
|
212
|
+
applyPatches(boundObject, patches);
|
|
213
|
+
} finally {
|
|
214
|
+
applyingMobxKeystoneChanges--;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
yjsObject.observeDeep(observeDeepCb);
|
|
219
|
+
let pendingPatches = [];
|
|
220
|
+
const disposeOnPatches = onPatches(boundObject, (patches) => {
|
|
221
|
+
if (applyingMobxKeystoneChanges > 0) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
pendingPatches.push(...patches);
|
|
225
|
+
});
|
|
226
|
+
const disposeOnSnapshot = onSnapshot(boundObject, () => {
|
|
227
|
+
if (pendingPatches.length === 0) {
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const patches = pendingPatches;
|
|
231
|
+
pendingPatches = [];
|
|
232
|
+
yjsDoc.transact(() => {
|
|
233
|
+
patches.forEach((patch) => {
|
|
234
|
+
applyMobxKeystonePatchToYjsObject(patch, yjsObject);
|
|
235
|
+
});
|
|
236
|
+
}, yjsOrigin);
|
|
237
|
+
});
|
|
238
|
+
yjsDoc.transact(() => {
|
|
239
|
+
let boundObjectFound = false;
|
|
240
|
+
initializationGlobalPatches.forEach(({ target, patches }) => {
|
|
241
|
+
if (!boundObjectFound) {
|
|
242
|
+
if (target !== boundObject) {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
boundObjectFound = true;
|
|
246
|
+
}
|
|
247
|
+
const parentToChildPath = getParentToChildPath(boundObject, target);
|
|
248
|
+
if (parentToChildPath !== void 0) {
|
|
249
|
+
patches.forEach((patch) => {
|
|
250
|
+
applyMobxKeystonePatchToYjsObject({
|
|
251
|
+
...patch,
|
|
252
|
+
path: [...parentToChildPath, ...patch.path]
|
|
253
|
+
}, yjsObject);
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}, yjsOrigin);
|
|
258
|
+
return {
|
|
259
|
+
boundObject,
|
|
260
|
+
dispose: () => {
|
|
261
|
+
disposeOnPatches();
|
|
262
|
+
disposeOnSnapshot();
|
|
263
|
+
yjsObject.unobserveDeep(observeDeepCb);
|
|
264
|
+
},
|
|
265
|
+
yjsOrigin
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
export {
|
|
269
|
+
MobxKeystoneYjsError,
|
|
270
|
+
bindYjsToMobxKeystone
|
|
271
|
+
};
|
|
272
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMuZXNtLm1qcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2Vycm9yLnRzIiwiLi4vc3JjL2JpbmRpbmcvdG9ZRGF0YVR5cGUudHMiLCIuLi9zcmMvYmluZGluZy9hcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QudHMiLCIuLi9zcmMvYmluZGluZy9jb252ZXJ0WWpzRXZlbnRUb1BhdGNoZXMudHMiLCIuLi9zcmMvYmluZGluZy9iaW5kWWpzVG9Nb2J4S2V5c3RvbmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEEgbW9ieC1rZXlzdG9uZS15anMgZXJyb3IuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgTW9ieEtleXN0b25lWWpzRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcpIHtcclxuICAgIHN1cGVyKG1zZylcclxuXHJcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxyXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIE1vYnhLZXlzdG9uZVlqc0Vycm9yLnByb3RvdHlwZSlcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmYWlsdXJlKG1zZzogc3RyaW5nKSB7XHJcbiAgcmV0dXJuIG5ldyBNb2J4S2V5c3RvbmVZanNFcnJvcihtc2cpXHJcbn1cclxuIiwiaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSlNPTlZhbHVlLCBKU09OQXJyYXksIEpTT05PYmplY3QsIEpTT05QcmltaXRpdmUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcclxuXHJcbmZ1bmN0aW9uIGlzSlNPTlByaW1pdGl2ZSh2OiBKU09OVmFsdWUpOiB2IGlzIEpTT05QcmltaXRpdmUge1xyXG4gIGNvbnN0IHQgPSB0eXBlb2YgdlxyXG4gIHJldHVybiB0ID09PSBcInN0cmluZ1wiIHx8IHQgPT09IFwibnVtYmVyXCIgfHwgdCA9PT0gXCJib29sZWFuXCIgfHwgdiA9PT0gbnVsbFxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pTT05BcnJheSh2OiBKU09OVmFsdWUpOiB2IGlzIEpTT05BcnJheSB7XHJcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodilcclxufVxyXG5cclxuZnVuY3Rpb24gaXNKU09OT2JqZWN0KHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTk9iamVjdCB7XHJcbiAgcmV0dXJuICFpc0pTT05BcnJheSh2KSAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdG9ZRGF0YVR5cGUodjogSlNPTlZhbHVlKSB7XHJcbiAgaWYgKGlzSlNPTlByaW1pdGl2ZSh2KSkge1xyXG4gICAgcmV0dXJuIHZcclxuICB9IGVsc2UgaWYgKGlzSlNPTkFycmF5KHYpKSB7XHJcbiAgICBjb25zdCBhcnIgPSBuZXcgWS5BcnJheSgpXHJcbiAgICBhcHBseUpzb25BcnJheShhcnIsIHYpXHJcbiAgICByZXR1cm4gYXJyXHJcbiAgfSBlbHNlIGlmIChpc0pTT05PYmplY3QodikpIHtcclxuICAgIGNvbnN0IG1hcCA9IG5ldyBZLk1hcCgpXHJcbiAgICBhcHBseUpzb25PYmplY3QobWFwLCB2KVxyXG4gICAgcmV0dXJuIG1hcFxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbiAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseUpzb25BcnJheShkZXN0OiBZLkFycmF5PHVua25vd24+LCBzb3VyY2U6IEpTT05BcnJheSkge1xyXG4gIGRlc3QucHVzaChzb3VyY2UubWFwKHRvWURhdGFUeXBlKSlcclxufVxyXG5cclxuZnVuY3Rpb24gYXBwbHlKc29uT2JqZWN0KGRlc3Q6IFkuTWFwPHVua25vd24+LCBzb3VyY2U6IEpTT05PYmplY3QpIHtcclxuICBPYmplY3QuZW50cmllcyhzb3VyY2UpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xyXG4gICAgZGVzdC5zZXQoaywgdG9ZRGF0YVR5cGUodikpXHJcbiAgfSlcclxufVxyXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IHRvWURhdGFUeXBlIH0gZnJvbSBcIi4vdG9ZRGF0YVR5cGVcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaDogUGF0Y2gsIHlqczogdW5rbm93bik6IHZvaWQge1xyXG4gIGlmIChwYXRjaC5wYXRoLmxlbmd0aCA+IDEpIHtcclxuICAgIGNvbnN0IFtrZXksIC4uLnJlc3RdID0gcGF0Y2gucGF0aFxyXG5cclxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoU3RyaW5nKGtleSkpXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgbWFwIC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkocGF0Y2gpfWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgY29uc3QgY2hpbGQgPSB5anMuZ2V0KE51bWJlcihrZXkpKVxyXG4gICAgICBpZiAoY2hpbGQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgICBgaW52YWxpZCBwYXRjaCBwYXRoLCBrZXkgXCIke2tleX1cIiBub3QgZm91bmQgaW4gWWpzIGFycmF5IC0gcGF0Y2g6ICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICAgIHBhdGNoXHJcbiAgICAgICAgICApfWBcclxuICAgICAgICApXHJcbiAgICAgIH1cclxuICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHsgLi4ucGF0Y2gsIHBhdGg6IHJlc3QgfSwgY2hpbGQpXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiB1bmtub3duIFlqcyBvYmplY3QgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgIHBhdGNoXHJcbiAgICAgICAgKX1gXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9IGVsc2UgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID09PSAxKSB7XHJcbiAgICBpZiAoeWpzIGluc3RhbmNlb2YgWS5NYXApIHtcclxuICAgICAgY29uc3Qga2V5ID0gU3RyaW5nKHBhdGNoLnBhdGhbMF0pXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOlxyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIHlqcy5zZXQoa2V5LCB0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwicmVtb3ZlXCI6IHtcclxuICAgICAgICAgIHlqcy5kZWxldGUoa2V5KVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIG1hcGApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHlqcyBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgICAgY29uc3Qga2V5ID0gcGF0Y2gucGF0aFswXVxyXG5cclxuICAgICAgc3dpdGNoIChwYXRjaC5vcCkge1xyXG4gICAgICAgIGNhc2UgXCJyZXBsYWNlXCI6IHtcclxuICAgICAgICAgIGlmIChrZXkgPT09IFwibGVuZ3RoXCIpIHtcclxuICAgICAgICAgICAgaWYgKHlqcy5sZW5ndGggPiBwYXRjaC52YWx1ZSkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlID0geWpzLmxlbmd0aCAtIHBhdGNoLnZhbHVlXHJcbiAgICAgICAgICAgICAgeWpzLmRlbGV0ZShwYXRjaC52YWx1ZSwgdG9EZWxldGUpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeWpzLmxlbmd0aCA8IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9JbnNlcnQgPSBwYXRjaC52YWx1ZSAtIHlqcy5sZW5ndGhcclxuICAgICAgICAgICAgICB5anMuaW5zZXJ0KHlqcy5sZW5ndGgsIEFycmF5KHRvSW5zZXJ0KS5maWxsKHVuZGVmaW5lZCkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHlqcy5kZWxldGUoTnVtYmVyKGtleSkpXHJcbiAgICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFt0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcImFkZFwiOiB7XHJcbiAgICAgICAgICB5anMuaW5zZXJ0KE51bWJlcihrZXkpLCBbdG9ZRGF0YVR5cGUocGF0Y2gudmFsdWUpXSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggb3BlcmF0aW9uIGZvciBhcnJheWApXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIHRoZSBZanMgb2JqZWN0IGlzIG9mIGFuIHVua293biB0eXBlLCBzbyBrZXkgXCIke3BhdGNoLnBhdGhbMF19XCIgY2Fubm90IGJlIGZvdW5kIGluIGl0YFxyXG4gICAgICApXHJcbiAgICB9XHJcbiAgfSBlbHNlIHtcclxuICAgIHRocm93IGZhaWx1cmUoYGludmFsaWQgcGF0Y2ggcGF0aCwgaXQgY2Fubm90IGJlIGVtcHR5YClcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHsgUGF0Y2ggfSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IEpTT05BcnJheSwgSlNPTk9iamVjdCwgSlNPTlZhbHVlIH0gZnJvbSBcIi4uL2pzb25UeXBlc1wiXHJcbmltcG9ydCB7IGZhaWx1cmUgfSBmcm9tIFwiLi4vdXRpbHMvZXJyb3JcIlxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudDogWS5ZRXZlbnQ8YW55Pik6IFBhdGNoW10ge1xyXG4gIGNvbnN0IHBhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG5cclxuICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBZLllNYXBFdmVudCkge1xyXG4gICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0IGFzIFkuTWFwPGFueT5cclxuXHJcbiAgICBldmVudC5jaGFuZ2VzLmtleXMuZm9yRWFjaCgoY2hhbmdlLCBrZXkpID0+IHtcclxuICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCBrZXldXHJcblxyXG4gICAgICBzd2l0Y2ggKGNoYW5nZS5hY3Rpb24pIHtcclxuICAgICAgICBjYXNlIFwiYWRkXCI6XHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlcGxhY2VcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZShzb3VyY2UuZ2V0KGtleSkpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGNhc2UgXCJkZWxldGVcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGJyZWFrXHJcblxyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGB1bnN1cHBvcnRlZCBZanMgbWFwIGV2ZW50IGFjdGlvbjogJHtjaGFuZ2UuYWN0aW9ufWApXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWUFycmF5RXZlbnQpIHtcclxuICAgIGxldCByZXRhaW4gPSAwXHJcbiAgICBldmVudC5jaGFuZ2VzLmRlbHRhLmZvckVhY2goKGNoYW5nZSkgPT4ge1xyXG4gICAgICBpZiAoY2hhbmdlLnJldGFpbikge1xyXG4gICAgICAgIHJldGFpbiArPSBjaGFuZ2UucmV0YWluXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaGFuZ2UuZGVsZXRlKSB7XHJcbiAgICAgICAgLy8gcmVtb3ZlIFggaXRlbXMgYXQgcmV0YWluIHBvc2l0aW9uXHJcbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2UuZGVsZXRlOyBpKyspIHtcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcInJlbW92ZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChjaGFuZ2UuaW5zZXJ0KSB7XHJcbiAgICAgICAgY29uc3QgbmV3VmFsdWVzID0gQXJyYXkuaXNBcnJheShjaGFuZ2UuaW5zZXJ0KSA/IGNoYW5nZS5pbnNlcnQgOiBbY2hhbmdlLmluc2VydF1cclxuICAgICAgICBuZXdWYWx1ZXMuZm9yRWFjaCgodikgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5ldmVudC5wYXRoLCByZXRhaW5dXHJcbiAgICAgICAgICBwYXRjaGVzLnB1c2goe1xyXG4gICAgICAgICAgICBvcDogXCJhZGRcIixcclxuICAgICAgICAgICAgcGF0aCxcclxuICAgICAgICAgICAgdmFsdWU6IHRvUGxhaW5WYWx1ZSh2KSxcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICByZXRhaW4rK1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICByZXR1cm4gcGF0Y2hlc1xyXG59XHJcblxyXG5mdW5jdGlvbiB0b1BsYWluVmFsdWUodjogWS5NYXA8YW55PiB8IFkuQXJyYXk8YW55PiB8IEpTT05WYWx1ZSkge1xyXG4gIGlmICh2IGluc3RhbmNlb2YgWS5NYXAgfHwgdiBpbnN0YW5jZW9mIFkuQXJyYXkpIHtcclxuICAgIHJldHVybiB2LnRvSlNPTigpIGFzIEpTT05PYmplY3QgfCBKU09OQXJyYXlcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHZcclxuICB9XHJcbn1cclxuIiwiaW1wb3J0IHtcclxuICBBbnlEYXRhTW9kZWwsXHJcbiAgQW55TW9kZWwsXHJcbiAgQW55U3RhbmRhcmRUeXBlLFxyXG4gIE1vZGVsQ2xhc3MsXHJcbiAgUGF0Y2gsXHJcbiAgVHlwZVRvRGF0YSxcclxuICBhcHBseVBhdGNoZXMsXHJcbiAgZnJvbVNuYXBzaG90LFxyXG4gIGdldFBhcmVudFRvQ2hpbGRQYXRoLFxyXG4gIG9uR2xvYmFsUGF0Y2hlcyxcclxuICBvblBhdGNoZXMsXHJcbiAgb25TbmFwc2hvdCxcclxufSBmcm9tIFwibW9ieC1rZXlzdG9uZVwiXHJcbmltcG9ydCAqIGFzIFkgZnJvbSBcInlqc1wiXHJcbmltcG9ydCB7IGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdCB9IGZyb20gXCIuL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdFwiXHJcbmltcG9ydCB7IGNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyB9IGZyb20gXCIuL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlc1wiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYmluZFlqc1RvTW9ieEtleXN0b25lPFxyXG4gIFRUeXBlIGV4dGVuZHMgQW55U3RhbmRhcmRUeXBlIHwgTW9kZWxDbGFzczxBbnlNb2RlbD4gfCBNb2RlbENsYXNzPEFueURhdGFNb2RlbD4sXHJcbj4oe1xyXG4gIHlqc0RvYyxcclxuICB5anNPYmplY3QsXHJcbiAgbW9ieEtleXN0b25lVHlwZSxcclxufToge1xyXG4gIHlqc0RvYzogWS5Eb2NcclxuICB5anNPYmplY3Q6IFkuTWFwPHVua25vd24+IHwgWS5BcnJheTx1bmtub3duPlxyXG4gIG1vYnhLZXlzdG9uZVR5cGU6IFRUeXBlXHJcbn0pOiB7XHJcbiAgYm91bmRPYmplY3Q6IFR5cGVUb0RhdGE8VFR5cGU+XHJcbiAgZGlzcG9zZSgpOiB2b2lkXHJcbiAgeWpzT3JpZ2luOiBzeW1ib2xcclxufSB7XHJcbiAgY29uc3QgeWpzSnNvbiA9IHlqc09iamVjdC50b0pTT04oKVxyXG5cclxuICBjb25zdCBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXM6IHsgdGFyZ2V0OiBvYmplY3Q7IHBhdGNoZXM6IFBhdGNoW10gfVtdID0gW11cclxuXHJcbiAgY29uc3QgY3JlYXRlQm91bmRPYmplY3QgPSAoKSA9PiB7XHJcbiAgICBjb25zdCBkaXNwb3NlT25HbG9iYWxQYXRjaGVzID0gb25HbG9iYWxQYXRjaGVzKCh0YXJnZXQsIHBhdGNoZXMpID0+IHtcclxuICAgICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLnB1c2goeyB0YXJnZXQsIHBhdGNoZXMgfSlcclxuICAgIH0pXHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGZyb21TbmFwc2hvdChtb2J4S2V5c3RvbmVUeXBlLCB5anNKc29uIGFzIGFueSlcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMoKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgYm91bmRPYmplY3QgPSBjcmVhdGVCb3VuZE9iamVjdCgpXHJcblxyXG4gIGxldCBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMgPSAwXHJcbiAgY29uc3QgeWpzT3JpZ2luID0gU3ltYm9sKFwiYmluZFlqc1RvTW9ieEtleXN0b25lVHJhbnNhY3Rpb25PcmlnaW5cIilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIHlqcyB0byBtb2J4LWtleXN0b25lXHJcbiAgY29uc3Qgb2JzZXJ2ZURlZXBDYiA9IChldmVudHM6IFkuWUV2ZW50PGFueT5bXSkgPT4ge1xyXG4gICAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcbiAgICBldmVudHMuZm9yRWFjaCgoZXZlbnQpID0+IHtcclxuICAgICAgaWYgKGV2ZW50LnRyYW5zYWN0aW9uLm9yaWdpbiAhPT0geWpzT3JpZ2luKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5wdXNoKC4uLmNvbnZlcnRZanNFdmVudFRvUGF0Y2hlcyhldmVudCkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcblxyXG4gICAgaWYgKHBhdGNoZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMrK1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFwcGx5UGF0Y2hlcyhib3VuZE9iamVjdCwgcGF0Y2hlcylcclxuICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICBhcHBseWluZ01vYnhLZXlzdG9uZUNoYW5nZXMtLVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB5anNPYmplY3Qub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuXHJcbiAgLy8gYmluZCBhbnkgY2hhbmdlcyBmcm9tIG1vYngta2V5c3RvbmUgdG8geWpzXHJcbiAgbGV0IHBlbmRpbmdQYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICBjb25zdCBkaXNwb3NlT25QYXRjaGVzID0gb25QYXRjaGVzKGJvdW5kT2JqZWN0LCAocGF0Y2hlcykgPT4ge1xyXG4gICAgaWYgKGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA+IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgcGVuZGluZ1BhdGNoZXMucHVzaCguLi5wYXRjaGVzKVxyXG4gIH0pXHJcblxyXG4gIC8vIHRoaXMgaXMgb25seSB1c2VkIHNvIHdlIGNhbiB0cmFuc2FjdCBhbGwgcGF0Y2hlcyB0byB0aGUgc25hcHNob3QgYm91bmRhcnlcclxuICBjb25zdCBkaXNwb3NlT25TbmFwc2hvdCA9IG9uU25hcHNob3QoYm91bmRPYmplY3QsICgpID0+IHtcclxuICAgIGlmIChwZW5kaW5nUGF0Y2hlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgcmV0dXJuXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcGF0Y2hlcyA9IHBlbmRpbmdQYXRjaGVzXHJcbiAgICBwZW5kaW5nUGF0Y2hlcyA9IFtdXHJcblxyXG4gICAgeWpzRG9jLnRyYW5zYWN0KCgpID0+IHtcclxuICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChwYXRjaCwgeWpzT2JqZWN0KVxyXG4gICAgICB9KVxyXG4gICAgfSwgeWpzT3JpZ2luKVxyXG4gIH0pXHJcblxyXG4gIC8vIHN5bmMgaW5pdGlhbCBwYXRjaGVzLCB0aGF0IG1pZ2h0IGluY2x1ZGUgc2V0dGluZyBkZWZhdWx0cywgSURzLCBldGNcclxuICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgLy8gd2UgbmVlZCB0byBza2lwIGluaXRpYWxpemF0aW9ucyB1bnRpbCB3ZSBoaXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBib3VuZCBvYmplY3RcclxuICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBkZWZhdWx0IG9iamVjdHMgbWlnaHQgYmUgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBtYWluIG9iamVjdFxyXG4gICAgLy8gYnV0IHdlIGp1c3QgbmVlZCB0byBjYXRjaCB3aGVuIHRob3NlIGFyZSBhY3R1YWxseSBhc3NpZ25lZCB0byB0aGUgYm91bmQgb2JqZWN0XHJcbiAgICBsZXQgYm91bmRPYmplY3RGb3VuZCA9IGZhbHNlXHJcblxyXG4gICAgaW5pdGlhbGl6YXRpb25HbG9iYWxQYXRjaGVzLmZvckVhY2goKHsgdGFyZ2V0LCBwYXRjaGVzIH0pID0+IHtcclxuICAgICAgaWYgKCFib3VuZE9iamVjdEZvdW5kKSB7XHJcbiAgICAgICAgaWYgKHRhcmdldCAhPT0gYm91bmRPYmplY3QpIHtcclxuICAgICAgICAgIHJldHVybiAvLyBza2lwXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJvdW5kT2JqZWN0Rm91bmQgPSB0cnVlXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IHBhcmVudFRvQ2hpbGRQYXRoID0gZ2V0UGFyZW50VG9DaGlsZFBhdGgoYm91bmRPYmplY3QsIHRhcmdldClcclxuICAgICAgLy8gdGhpcyBpcyB1bmRlZmluZWQgb25seSBpZiB0YXJnZXQgaXMgbm90IGEgY2hpbGQgb2YgYm91bmRNb2RlbFxyXG4gICAgICBpZiAocGFyZW50VG9DaGlsZFBhdGggIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHBhdGNoZXMuZm9yRWFjaCgocGF0Y2gpID0+IHtcclxuICAgICAgICAgIGFwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdChcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIC4uLnBhdGNoLFxyXG4gICAgICAgICAgICAgIHBhdGg6IFsuLi5wYXJlbnRUb0NoaWxkUGF0aCwgLi4ucGF0Y2gucGF0aF0sXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHlqc09iamVjdFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfSwgeWpzT3JpZ2luKVxyXG5cclxuICByZXR1cm4ge1xyXG4gICAgYm91bmRPYmplY3QsXHJcbiAgICBkaXNwb3NlOiAoKSA9PiB7XHJcbiAgICAgIGRpc3Bvc2VPblBhdGNoZXMoKVxyXG4gICAgICBkaXNwb3NlT25TbmFwc2hvdCgpXHJcbiAgICAgIHlqc09iamVjdC51bm9ic2VydmVEZWVwKG9ic2VydmVEZWVwQ2IpXHJcbiAgICB9LFxyXG4gICAgeWpzT3JpZ2luLFxyXG4gIH1cclxufVxyXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsRUFDN0MsWUFBWSxLQUFXO0FBQ3JCLFVBQU0sR0FBRztBQUdGLFdBQUEsZUFBZSxNQUFNLHFCQUFxQixTQUFTO0FBQUEsRUFDNUQ7QUFDRDtBQUtLLFNBQVUsUUFBUSxLQUFXO0FBQzFCLFNBQUEsSUFBSSxxQkFBcUIsR0FBRztB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
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
(function(global, factory) {
|
|
2
|
+
typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("mobx-keystone"), require("yjs")) : typeof define === "function" && define.amd ? define(["exports", "mobx-keystone", "yjs"], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self, factory(global["mobx-keystone-yjs"] = {}, global["mobx-keystone"], global.yjs));
|
|
3
|
+
})(this, function(exports2, mobxKeystone, Y) {
|
|
4
|
+
"use strict";
|
|
5
|
+
function _interopNamespaceDefault(e) {
|
|
6
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
7
|
+
if (e) {
|
|
8
|
+
for (const k in e) {
|
|
9
|
+
if (k !== "default") {
|
|
10
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
11
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
get: () => e[k]
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
n.default = e;
|
|
19
|
+
return Object.freeze(n);
|
|
20
|
+
}
|
|
21
|
+
const Y__namespace = /* @__PURE__ */ _interopNamespaceDefault(Y);
|
|
22
|
+
class MobxKeystoneYjsError extends Error {
|
|
23
|
+
constructor(msg) {
|
|
24
|
+
super(msg);
|
|
25
|
+
Object.setPrototypeOf(this, MobxKeystoneYjsError.prototype);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function failure(msg) {
|
|
29
|
+
return new MobxKeystoneYjsError(msg);
|
|
30
|
+
}
|
|
31
|
+
function isJSONPrimitive(v) {
|
|
32
|
+
const t = typeof v;
|
|
33
|
+
return t === "string" || t === "number" || t === "boolean" || v === null;
|
|
34
|
+
}
|
|
35
|
+
function isJSONArray(v) {
|
|
36
|
+
return Array.isArray(v);
|
|
37
|
+
}
|
|
38
|
+
function isJSONObject(v) {
|
|
39
|
+
return !isJSONArray(v) && typeof v === "object";
|
|
40
|
+
}
|
|
41
|
+
function toYDataType(v) {
|
|
42
|
+
if (isJSONPrimitive(v)) {
|
|
43
|
+
return v;
|
|
44
|
+
} else if (isJSONArray(v)) {
|
|
45
|
+
const arr = new Y__namespace.Array();
|
|
46
|
+
applyJsonArray(arr, v);
|
|
47
|
+
return arr;
|
|
48
|
+
} else if (isJSONObject(v)) {
|
|
49
|
+
const map = new Y__namespace.Map();
|
|
50
|
+
applyJsonObject(map, v);
|
|
51
|
+
return map;
|
|
52
|
+
} else {
|
|
53
|
+
return void 0;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function applyJsonArray(dest, source) {
|
|
57
|
+
dest.push(source.map(toYDataType));
|
|
58
|
+
}
|
|
59
|
+
function applyJsonObject(dest, source) {
|
|
60
|
+
Object.entries(source).forEach(([k, v]) => {
|
|
61
|
+
dest.set(k, toYDataType(v));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function applyMobxKeystonePatchToYjsObject(patch, yjs) {
|
|
65
|
+
if (patch.path.length > 1) {
|
|
66
|
+
const [key, ...rest] = patch.path;
|
|
67
|
+
if (yjs instanceof Y__namespace.Map) {
|
|
68
|
+
const child = yjs.get(String(key));
|
|
69
|
+
if (child === void 0) {
|
|
70
|
+
throw failure(`invalid patch path, key "${key}" not found in Yjs map - patch: ${JSON.stringify(patch)}`);
|
|
71
|
+
}
|
|
72
|
+
applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
|
|
73
|
+
} else if (yjs instanceof Y__namespace.Array) {
|
|
74
|
+
const child = yjs.get(Number(key));
|
|
75
|
+
if (child === void 0) {
|
|
76
|
+
throw failure(`invalid patch path, key "${key}" not found in Yjs array - patch: ${JSON.stringify(patch)}`);
|
|
77
|
+
}
|
|
78
|
+
applyMobxKeystonePatchToYjsObject({ ...patch, path: rest }, child);
|
|
79
|
+
} else {
|
|
80
|
+
throw failure(`invalid patch path, key "${key}" not found in unknown Yjs object - patch: ${JSON.stringify(patch)}`);
|
|
81
|
+
}
|
|
82
|
+
} else if (patch.path.length === 1) {
|
|
83
|
+
if (yjs instanceof Y__namespace.Map) {
|
|
84
|
+
const key = String(patch.path[0]);
|
|
85
|
+
switch (patch.op) {
|
|
86
|
+
case "add":
|
|
87
|
+
case "replace": {
|
|
88
|
+
yjs.set(key, toYDataType(patch.value));
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case "remove": {
|
|
92
|
+
yjs.delete(key);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
default: {
|
|
96
|
+
throw failure(`invalid patch operation for map`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
} else if (yjs instanceof Y__namespace.Array) {
|
|
100
|
+
const key = patch.path[0];
|
|
101
|
+
switch (patch.op) {
|
|
102
|
+
case "replace": {
|
|
103
|
+
if (key === "length") {
|
|
104
|
+
if (yjs.length > patch.value) {
|
|
105
|
+
const toDelete = yjs.length - patch.value;
|
|
106
|
+
yjs.delete(patch.value, toDelete);
|
|
107
|
+
} else if (yjs.length < patch.value) {
|
|
108
|
+
const toInsert = patch.value - yjs.length;
|
|
109
|
+
yjs.insert(yjs.length, Array(toInsert).fill(void 0));
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
yjs.delete(Number(key));
|
|
113
|
+
yjs.insert(Number(key), [toYDataType(patch.value)]);
|
|
114
|
+
}
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case "add": {
|
|
118
|
+
yjs.insert(Number(key), [toYDataType(patch.value)]);
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case "remove": {
|
|
122
|
+
yjs.delete(Number(key));
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
default: {
|
|
126
|
+
throw failure(`invalid patch operation for array`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
} else {
|
|
130
|
+
throw failure(`invalid patch path, the Yjs object is of an unkown type, so key "${patch.path[0]}" cannot be found in it`);
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
throw failure(`invalid patch path, it cannot be empty`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function convertYjsEventToPatches(event) {
|
|
137
|
+
const patches = [];
|
|
138
|
+
if (event instanceof Y__namespace.YMapEvent) {
|
|
139
|
+
const source = event.target;
|
|
140
|
+
event.changes.keys.forEach((change, key) => {
|
|
141
|
+
const path = [...event.path, key];
|
|
142
|
+
switch (change.action) {
|
|
143
|
+
case "add":
|
|
144
|
+
patches.push({
|
|
145
|
+
op: "add",
|
|
146
|
+
path,
|
|
147
|
+
value: toPlainValue(source.get(key))
|
|
148
|
+
});
|
|
149
|
+
break;
|
|
150
|
+
case "update":
|
|
151
|
+
patches.push({
|
|
152
|
+
op: "replace",
|
|
153
|
+
path,
|
|
154
|
+
value: toPlainValue(source.get(key))
|
|
155
|
+
});
|
|
156
|
+
break;
|
|
157
|
+
case "delete":
|
|
158
|
+
patches.push({
|
|
159
|
+
op: "remove",
|
|
160
|
+
path
|
|
161
|
+
});
|
|
162
|
+
break;
|
|
163
|
+
default:
|
|
164
|
+
throw failure(`unsupported Yjs map event action: ${change.action}`);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
} else if (event instanceof Y__namespace.YArrayEvent) {
|
|
168
|
+
let retain = 0;
|
|
169
|
+
event.changes.delta.forEach((change) => {
|
|
170
|
+
if (change.retain) {
|
|
171
|
+
retain += change.retain;
|
|
172
|
+
}
|
|
173
|
+
if (change.delete) {
|
|
174
|
+
const path = [...event.path, retain];
|
|
175
|
+
for (let i = 0; i < change.delete; i++) {
|
|
176
|
+
patches.push({
|
|
177
|
+
op: "remove",
|
|
178
|
+
path
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (change.insert) {
|
|
183
|
+
const newValues = Array.isArray(change.insert) ? change.insert : [change.insert];
|
|
184
|
+
newValues.forEach((v) => {
|
|
185
|
+
const path = [...event.path, retain];
|
|
186
|
+
patches.push({
|
|
187
|
+
op: "add",
|
|
188
|
+
path,
|
|
189
|
+
value: toPlainValue(v)
|
|
190
|
+
});
|
|
191
|
+
retain++;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
return patches;
|
|
197
|
+
}
|
|
198
|
+
function toPlainValue(v) {
|
|
199
|
+
if (v instanceof Y__namespace.Map || v instanceof Y__namespace.Array) {
|
|
200
|
+
return v.toJSON();
|
|
201
|
+
} else {
|
|
202
|
+
return v;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
function bindYjsToMobxKeystone({ yjsDoc, yjsObject, mobxKeystoneType }) {
|
|
206
|
+
const yjsJson = yjsObject.toJSON();
|
|
207
|
+
const initializationGlobalPatches = [];
|
|
208
|
+
const createBoundObject = () => {
|
|
209
|
+
const disposeOnGlobalPatches = mobxKeystone.onGlobalPatches((target, patches) => {
|
|
210
|
+
initializationGlobalPatches.push({ target, patches });
|
|
211
|
+
});
|
|
212
|
+
try {
|
|
213
|
+
return mobxKeystone.fromSnapshot(mobxKeystoneType, yjsJson);
|
|
214
|
+
} finally {
|
|
215
|
+
disposeOnGlobalPatches();
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
const boundObject = createBoundObject();
|
|
219
|
+
let applyingMobxKeystoneChanges = 0;
|
|
220
|
+
const yjsOrigin = Symbol("bindYjsToMobxKeystoneTransactionOrigin");
|
|
221
|
+
const observeDeepCb = (events) => {
|
|
222
|
+
const patches = [];
|
|
223
|
+
events.forEach((event) => {
|
|
224
|
+
if (event.transaction.origin !== yjsOrigin) {
|
|
225
|
+
patches.push(...convertYjsEventToPatches(event));
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
if (patches.length > 0) {
|
|
229
|
+
applyingMobxKeystoneChanges++;
|
|
230
|
+
try {
|
|
231
|
+
mobxKeystone.applyPatches(boundObject, patches);
|
|
232
|
+
} finally {
|
|
233
|
+
applyingMobxKeystoneChanges--;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
yjsObject.observeDeep(observeDeepCb);
|
|
238
|
+
let pendingPatches = [];
|
|
239
|
+
const disposeOnPatches = mobxKeystone.onPatches(boundObject, (patches) => {
|
|
240
|
+
if (applyingMobxKeystoneChanges > 0) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
pendingPatches.push(...patches);
|
|
244
|
+
});
|
|
245
|
+
const disposeOnSnapshot = mobxKeystone.onSnapshot(boundObject, () => {
|
|
246
|
+
if (pendingPatches.length === 0) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const patches = pendingPatches;
|
|
250
|
+
pendingPatches = [];
|
|
251
|
+
yjsDoc.transact(() => {
|
|
252
|
+
patches.forEach((patch) => {
|
|
253
|
+
applyMobxKeystonePatchToYjsObject(patch, yjsObject);
|
|
254
|
+
});
|
|
255
|
+
}, yjsOrigin);
|
|
256
|
+
});
|
|
257
|
+
yjsDoc.transact(() => {
|
|
258
|
+
let boundObjectFound = false;
|
|
259
|
+
initializationGlobalPatches.forEach(({ target, patches }) => {
|
|
260
|
+
if (!boundObjectFound) {
|
|
261
|
+
if (target !== boundObject) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
boundObjectFound = true;
|
|
265
|
+
}
|
|
266
|
+
const parentToChildPath = mobxKeystone.getParentToChildPath(boundObject, target);
|
|
267
|
+
if (parentToChildPath !== void 0) {
|
|
268
|
+
patches.forEach((patch) => {
|
|
269
|
+
applyMobxKeystonePatchToYjsObject({
|
|
270
|
+
...patch,
|
|
271
|
+
path: [...parentToChildPath, ...patch.path]
|
|
272
|
+
}, yjsObject);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
}, yjsOrigin);
|
|
277
|
+
return {
|
|
278
|
+
boundObject,
|
|
279
|
+
dispose: () => {
|
|
280
|
+
disposeOnPatches();
|
|
281
|
+
disposeOnSnapshot();
|
|
282
|
+
yjsObject.unobserveDeep(observeDeepCb);
|
|
283
|
+
},
|
|
284
|
+
yjsOrigin
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
exports2.MobxKeystoneYjsError = MobxKeystoneYjsError;
|
|
288
|
+
exports2.bindYjsToMobxKeystone = bindYjsToMobxKeystone;
|
|
289
|
+
Object.defineProperty(exports2, Symbol.toStringTag, { value: "Module" });
|
|
290
|
+
});
|
|
291
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9ieC1rZXlzdG9uZS15anMudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMvZXJyb3IudHMiLCIuLi9zcmMvYmluZGluZy90b1lEYXRhVHlwZS50cyIsIi4uL3NyYy9iaW5kaW5nL2FwcGx5TW9ieEtleXN0b25lUGF0Y2hUb1lqc09iamVjdC50cyIsIi4uL3NyYy9iaW5kaW5nL2NvbnZlcnRZanNFdmVudFRvUGF0Y2hlcy50cyIsIi4uL3NyYy9iaW5kaW5nL2JpbmRZanNUb01vYnhLZXlzdG9uZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogQSBtb2J4LWtleXN0b25lLXlqcyBlcnJvci5cclxuICovXHJcbmV4cG9ydCBjbGFzcyBNb2J4S2V5c3RvbmVZanNFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZykge1xyXG4gICAgc3VwZXIobXNnKVxyXG5cclxuICAgIC8vIFNldCB0aGUgcHJvdG90eXBlIGV4cGxpY2l0bHkuXHJcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTW9ieEtleXN0b25lWWpzRXJyb3IucHJvdG90eXBlKVxyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGZhaWx1cmUobXNnOiBzdHJpbmcpIHtcclxuICByZXR1cm4gbmV3IE1vYnhLZXlzdG9uZVlqc0Vycm9yKG1zZylcclxufVxyXG4iLCJpbXBvcnQgKiBhcyBZIGZyb20gXCJ5anNcIlxyXG5pbXBvcnQgeyBKU09OVmFsdWUsIEpTT05BcnJheSwgSlNPTk9iamVjdCwgSlNPTlByaW1pdGl2ZSB9IGZyb20gXCIuLi9qc29uVHlwZXNcIlxyXG5cclxuZnVuY3Rpb24gaXNKU09OUHJpbWl0aXZlKHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTlByaW1pdGl2ZSB7XHJcbiAgY29uc3QgdCA9IHR5cGVvZiB2XHJcbiAgcmV0dXJuIHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiB8fCB2ID09PSBudWxsXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzSlNPTkFycmF5KHY6IEpTT05WYWx1ZSk6IHYgaXMgSlNPTkFycmF5IHtcclxuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2KVxyXG59XHJcblxyXG5mdW5jdGlvbiBpc0pTT05PYmplY3QodjogSlNPTlZhbHVlKTogdiBpcyBKU09OT2JqZWN0IHtcclxuICByZXR1cm4gIWlzSlNPTkFycmF5KHYpICYmIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiXHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB0b1lEYXRhVHlwZSh2OiBKU09OVmFsdWUpIHtcclxuICBpZiAoaXNKU09OUHJpbWl0aXZlKHYpKSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH0gZWxzZSBpZiAoaXNKU09OQXJyYXkodikpIHtcclxuICAgIGNvbnN0IGFyciA9IG5ldyBZLkFycmF5KClcclxuICAgIGFwcGx5SnNvbkFycmF5KGFyciwgdilcclxuICAgIHJldHVybiBhcnJcclxuICB9IGVsc2UgaWYgKGlzSlNPTk9iamVjdCh2KSkge1xyXG4gICAgY29uc3QgbWFwID0gbmV3IFkuTWFwKClcclxuICAgIGFwcGx5SnNvbk9iamVjdChtYXAsIHYpXHJcbiAgICByZXR1cm4gbWFwXHJcbiAgfSBlbHNlIHtcclxuICAgIHJldHVybiB1bmRlZmluZWRcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGFwcGx5SnNvbkFycmF5KGRlc3Q6IFkuQXJyYXk8dW5rbm93bj4sIHNvdXJjZTogSlNPTkFycmF5KSB7XHJcbiAgZGVzdC5wdXNoKHNvdXJjZS5tYXAodG9ZRGF0YVR5cGUpKVxyXG59XHJcblxyXG5mdW5jdGlvbiBhcHBseUpzb25PYmplY3QoZGVzdDogWS5NYXA8dW5rbm93bj4sIHNvdXJjZTogSlNPTk9iamVjdCkge1xyXG4gIE9iamVjdC5lbnRyaWVzKHNvdXJjZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XHJcbiAgICBkZXN0LnNldChrLCB0b1lEYXRhVHlwZSh2KSlcclxuICB9KVxyXG59XHJcbiIsImltcG9ydCB7IFBhdGNoIH0gZnJvbSBcIm1vYngta2V5c3RvbmVcIlxyXG5pbXBvcnQgeyBmYWlsdXJlIH0gZnJvbSBcIi4uL3V0aWxzL2Vycm9yXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgdG9ZRGF0YVR5cGUgfSBmcm9tIFwiLi90b1lEYXRhVHlwZVwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoOiBQYXRjaCwgeWpzOiB1bmtub3duKTogdm9pZCB7XHJcbiAgaWYgKHBhdGNoLnBhdGgubGVuZ3RoID4gMSkge1xyXG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBwYXRjaC5wYXRoXHJcblxyXG4gICAgaWYgKHlqcyBpbnN0YW5jZW9mIFkuTWFwKSB7XHJcbiAgICAgIGNvbnN0IGNoaWxkID0geWpzLmdldChTdHJpbmcoa2V5KSlcclxuICAgICAgaWYgKGNoaWxkID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICB0aHJvdyBmYWlsdXJlKFxyXG4gICAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIFlqcyBtYXAgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShwYXRjaCl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBjaGlsZCA9IHlqcy5nZXQoTnVtYmVyKGtleSkpXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhyb3cgZmFpbHVyZShcclxuICAgICAgICAgIGBpbnZhbGlkIHBhdGNoIHBhdGgsIGtleSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBZanMgYXJyYXkgLSBwYXRjaDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICAgICAgcGF0Y2hcclxuICAgICAgICAgICl9YFxyXG4gICAgICAgIClcclxuICAgICAgfVxyXG4gICAgICBhcHBseU1vYnhLZXlzdG9uZVBhdGNoVG9ZanNPYmplY3QoeyAuLi5wYXRjaCwgcGF0aDogcmVzdCB9LCBjaGlsZClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwga2V5IFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIHVua25vd24gWWpzIG9iamVjdCAtIHBhdGNoOiAke0pTT04uc3RyaW5naWZ5KFxyXG4gICAgICAgICAgcGF0Y2hcclxuICAgICAgICApfWBcclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0gZWxzZSBpZiAocGF0Y2gucGF0aC5sZW5ndGggPT09IDEpIHtcclxuICAgIGlmICh5anMgaW5zdGFuY2VvZiBZLk1hcCkge1xyXG4gICAgICBjb25zdCBrZXkgPSBTdHJpbmcocGF0Y2gucGF0aFswXSlcclxuXHJcbiAgICAgIHN3aXRjaCAocGF0Y2gub3ApIHtcclxuICAgICAgICBjYXNlIFwiYWRkXCI6XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgeWpzLnNldChrZXksIHRvWURhdGFUeXBlKHBhdGNoLnZhbHVlKSlcclxuICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgXCJyZW1vdmVcIjoge1xyXG4gICAgICAgICAgeWpzLmRlbGV0ZShrZXkpXHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgICB0aHJvdyBmYWlsdXJlKGBpbnZhbGlkIHBhdGNoIG9wZXJhdGlvbiBmb3IgbWFwYClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoeWpzIGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgICBjb25zdCBrZXkgPSBwYXRjaC5wYXRoWzBdXHJcblxyXG4gICAgICBzd2l0Y2ggKHBhdGNoLm9wKSB7XHJcbiAgICAgICAgY2FzZSBcInJlcGxhY2VcIjoge1xyXG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJsZW5ndGhcIikge1xyXG4gICAgICAgICAgICBpZiAoeWpzLmxlbmd0aCA+IHBhdGNoLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdG9EZWxldGUgPSB5anMubGVuZ3RoIC0gcGF0Y2gudmFsdWVcclxuICAgICAgICAgICAgICB5anMuZGVsZXRlKHBhdGNoLnZhbHVlLCB0b0RlbGV0ZSlcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh5anMubGVuZ3RoIDwgcGF0Y2gudmFsdWUpIHtcclxuICAgICAgICAgICAgICBjb25zdCB0b0luc2VydCA9IHBhdGNoLnZhbHVlIC0geWpzLmxlbmd0aFxyXG4gICAgICAgICAgICAgIHlqcy5pbnNlcnQoeWpzLmxlbmd0aCwgQXJyYXkodG9JbnNlcnQpLmZpbGwodW5kZWZpbmVkKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgeWpzLmRlbGV0ZShOdW1iZXIoa2V5KSlcclxuICAgICAgICAgICAgeWpzLmluc2VydChOdW1iZXIoa2V5KSwgW3RvWURhdGFUeXBlKHBhdGNoLnZhbHVlKV0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVha1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXNlIFwiYWRkXCI6IHtcclxuICAgICAgICAgIHlqcy5pbnNlcnQoTnVtYmVyKGtleSksIFt0b1lEYXRhVHlwZShwYXRjaC52YWx1ZSldKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2FzZSBcInJlbW92ZVwiOiB7XHJcbiAgICAgICAgICB5anMuZGVsZXRlKE51bWJlcihrZXkpKVxyXG4gICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGVmYXVsdDoge1xyXG4gICAgICAgICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBvcGVyYXRpb24gZm9yIGFycmF5YClcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRocm93IGZhaWx1cmUoXHJcbiAgICAgICAgYGludmFsaWQgcGF0Y2ggcGF0aCwgdGhlIFlqcyBvYmplY3QgaXMgb2YgYW4gdW5rb3duIHR5cGUsIHNvIGtleSBcIiR7cGF0Y2gucGF0aFswXX1cIiBjYW5ub3QgYmUgZm91bmQgaW4gaXRgXHJcbiAgICAgIClcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgdGhyb3cgZmFpbHVyZShgaW52YWxpZCBwYXRjaCBwYXRoLCBpdCBjYW5ub3QgYmUgZW1wdHlgKVxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQgeyBQYXRjaCB9IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgSlNPTkFycmF5LCBKU09OT2JqZWN0LCBKU09OVmFsdWUgfSBmcm9tIFwiLi4vanNvblR5cGVzXCJcclxuaW1wb3J0IHsgZmFpbHVyZSB9IGZyb20gXCIuLi91dGlscy9lcnJvclwiXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50OiBZLllFdmVudDxhbnk+KTogUGF0Y2hbXSB7XHJcbiAgY29uc3QgcGF0Y2hlczogUGF0Y2hbXSA9IFtdXHJcblxyXG4gIGlmIChldmVudCBpbnN0YW5jZW9mIFkuWU1hcEV2ZW50KSB7XHJcbiAgICBjb25zdCBzb3VyY2UgPSBldmVudC50YXJnZXQgYXMgWS5NYXA8YW55PlxyXG5cclxuICAgIGV2ZW50LmNoYW5nZXMua2V5cy5mb3JFYWNoKChjaGFuZ2UsIGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIGtleV1cclxuXHJcbiAgICAgIHN3aXRjaCAoY2hhbmdlLmFjdGlvbikge1xyXG4gICAgICAgIGNhc2UgXCJhZGRcIjpcclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVwbGFjZVwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHNvdXJjZS5nZXQoa2V5KSksXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgY2FzZSBcImRlbGV0ZVwiOlxyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgYnJlYWtcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHRocm93IGZhaWx1cmUoYHVuc3VwcG9ydGVkIFlqcyBtYXAgZXZlbnQgYWN0aW9uOiAke2NoYW5nZS5hY3Rpb259YClcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9IGVsc2UgaWYgKGV2ZW50IGluc3RhbmNlb2YgWS5ZQXJyYXlFdmVudCkge1xyXG4gICAgbGV0IHJldGFpbiA9IDBcclxuICAgIGV2ZW50LmNoYW5nZXMuZGVsdGEuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XHJcbiAgICAgIGlmIChjaGFuZ2UucmV0YWluKSB7XHJcbiAgICAgICAgcmV0YWluICs9IGNoYW5nZS5yZXRhaW5cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5kZWxldGUpIHtcclxuICAgICAgICAvLyByZW1vdmUgWCBpdGVtcyBhdCByZXRhaW4gcG9zaXRpb25cclxuICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS5kZWxldGU7IGkrKykge1xyXG4gICAgICAgICAgcGF0Y2hlcy5wdXNoKHtcclxuICAgICAgICAgICAgb3A6IFwicmVtb3ZlXCIsXHJcbiAgICAgICAgICAgIHBhdGgsXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNoYW5nZS5pbnNlcnQpIHtcclxuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBBcnJheS5pc0FycmF5KGNoYW5nZS5pbnNlcnQpID8gY2hhbmdlLmluc2VydCA6IFtjaGFuZ2UuaW5zZXJ0XVxyXG4gICAgICAgIG5ld1ZhbHVlcy5mb3JFYWNoKCh2KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBwYXRoID0gWy4uLmV2ZW50LnBhdGgsIHJldGFpbl1cclxuICAgICAgICAgIHBhdGNoZXMucHVzaCh7XHJcbiAgICAgICAgICAgIG9wOiBcImFkZFwiLFxyXG4gICAgICAgICAgICBwYXRoLFxyXG4gICAgICAgICAgICB2YWx1ZTogdG9QbGFpblZhbHVlKHYpLFxyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHJldGFpbisrXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHJldHVybiBwYXRjaGVzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHRvUGxhaW5WYWx1ZSh2OiBZLk1hcDxhbnk+IHwgWS5BcnJheTxhbnk+IHwgSlNPTlZhbHVlKSB7XHJcbiAgaWYgKHYgaW5zdGFuY2VvZiBZLk1hcCB8fCB2IGluc3RhbmNlb2YgWS5BcnJheSkge1xyXG4gICAgcmV0dXJuIHYudG9KU09OKCkgYXMgSlNPTk9iamVjdCB8IEpTT05BcnJheVxyXG4gIH0gZWxzZSB7XHJcbiAgICByZXR1cm4gdlxyXG4gIH1cclxufVxyXG4iLCJpbXBvcnQge1xyXG4gIEFueURhdGFNb2RlbCxcclxuICBBbnlNb2RlbCxcclxuICBBbnlTdGFuZGFyZFR5cGUsXHJcbiAgTW9kZWxDbGFzcyxcclxuICBQYXRjaCxcclxuICBUeXBlVG9EYXRhLFxyXG4gIGFwcGx5UGF0Y2hlcyxcclxuICBmcm9tU25hcHNob3QsXHJcbiAgZ2V0UGFyZW50VG9DaGlsZFBhdGgsXHJcbiAgb25HbG9iYWxQYXRjaGVzLFxyXG4gIG9uUGF0Y2hlcyxcclxuICBvblNuYXBzaG90LFxyXG59IGZyb20gXCJtb2J4LWtleXN0b25lXCJcclxuaW1wb3J0ICogYXMgWSBmcm9tIFwieWpzXCJcclxuaW1wb3J0IHsgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0IH0gZnJvbSBcIi4vYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0XCJcclxuaW1wb3J0IHsgY29udmVydFlqc0V2ZW50VG9QYXRjaGVzIH0gZnJvbSBcIi4vY29udmVydFlqc0V2ZW50VG9QYXRjaGVzXCJcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBiaW5kWWpzVG9Nb2J4S2V5c3RvbmU8XHJcbiAgVFR5cGUgZXh0ZW5kcyBBbnlTdGFuZGFyZFR5cGUgfCBNb2RlbENsYXNzPEFueU1vZGVsPiB8IE1vZGVsQ2xhc3M8QW55RGF0YU1vZGVsPixcclxuPih7XHJcbiAgeWpzRG9jLFxyXG4gIHlqc09iamVjdCxcclxuICBtb2J4S2V5c3RvbmVUeXBlLFxyXG59OiB7XHJcbiAgeWpzRG9jOiBZLkRvY1xyXG4gIHlqc09iamVjdDogWS5NYXA8dW5rbm93bj4gfCBZLkFycmF5PHVua25vd24+XHJcbiAgbW9ieEtleXN0b25lVHlwZTogVFR5cGVcclxufSk6IHtcclxuICBib3VuZE9iamVjdDogVHlwZVRvRGF0YTxUVHlwZT5cclxuICBkaXNwb3NlKCk6IHZvaWRcclxuICB5anNPcmlnaW46IHN5bWJvbFxyXG59IHtcclxuICBjb25zdCB5anNKc29uID0geWpzT2JqZWN0LnRvSlNPTigpXHJcblxyXG4gIGNvbnN0IGluaXRpYWxpemF0aW9uR2xvYmFsUGF0Y2hlczogeyB0YXJnZXQ6IG9iamVjdDsgcGF0Y2hlczogUGF0Y2hbXSB9W10gPSBbXVxyXG5cclxuICBjb25zdCBjcmVhdGVCb3VuZE9iamVjdCA9ICgpID0+IHtcclxuICAgIGNvbnN0IGRpc3Bvc2VPbkdsb2JhbFBhdGNoZXMgPSBvbkdsb2JhbFBhdGNoZXMoKHRhcmdldCwgcGF0Y2hlcykgPT4ge1xyXG4gICAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMucHVzaCh7IHRhcmdldCwgcGF0Y2hlcyB9KVxyXG4gICAgfSlcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gZnJvbVNuYXBzaG90KG1vYnhLZXlzdG9uZVR5cGUsIHlqc0pzb24gYXMgYW55KVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgZGlzcG9zZU9uR2xvYmFsUGF0Y2hlcygpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdCBib3VuZE9iamVjdCA9IGNyZWF0ZUJvdW5kT2JqZWN0KClcclxuXHJcbiAgbGV0IGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcyA9IDBcclxuICBjb25zdCB5anNPcmlnaW4gPSBTeW1ib2woXCJiaW5kWWpzVG9Nb2J4S2V5c3RvbmVUcmFuc2FjdGlvbk9yaWdpblwiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20geWpzIHRvIG1vYngta2V5c3RvbmVcclxuICBjb25zdCBvYnNlcnZlRGVlcENiID0gKGV2ZW50czogWS5ZRXZlbnQ8YW55PltdKSA9PiB7XHJcbiAgICBjb25zdCBwYXRjaGVzOiBQYXRjaFtdID0gW11cclxuICAgIGV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xyXG4gICAgICBpZiAoZXZlbnQudHJhbnNhY3Rpb24ub3JpZ2luICE9PSB5anNPcmlnaW4pIHtcclxuICAgICAgICBwYXRjaGVzLnB1c2goLi4uY29udmVydFlqc0V2ZW50VG9QYXRjaGVzKGV2ZW50KSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBpZiAocGF0Y2hlcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcysrXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXBwbHlQYXRjaGVzKGJvdW5kT2JqZWN0LCBwYXRjaGVzKVxyXG4gICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgIGFwcGx5aW5nTW9ieEtleXN0b25lQ2hhbmdlcy0tXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHlqc09iamVjdC5vYnNlcnZlRGVlcChvYnNlcnZlRGVlcENiKVxyXG5cclxuICAvLyBiaW5kIGFueSBjaGFuZ2VzIGZyb20gbW9ieC1rZXlzdG9uZSB0byB5anNcclxuICBsZXQgcGVuZGluZ1BhdGNoZXM6IFBhdGNoW10gPSBbXVxyXG4gIGNvbnN0IGRpc3Bvc2VPblBhdGNoZXMgPSBvblBhdGNoZXMoYm91bmRPYmplY3QsIChwYXRjaGVzKSA9PiB7XHJcbiAgICBpZiAoYXBwbHlpbmdNb2J4S2V5c3RvbmVDaGFuZ2VzID4gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBwZW5kaW5nUGF0Y2hlcy5wdXNoKC4uLnBhdGNoZXMpXHJcbiAgfSlcclxuXHJcbiAgLy8gdGhpcyBpcyBvbmx5IHVzZWQgc28gd2UgY2FuIHRyYW5zYWN0IGFsbCBwYXRjaGVzIHRvIHRoZSBzbmFwc2hvdCBib3VuZGFyeVxyXG4gIGNvbnN0IGRpc3Bvc2VPblNuYXBzaG90ID0gb25TbmFwc2hvdChib3VuZE9iamVjdCwgKCkgPT4ge1xyXG4gICAgaWYgKHBlbmRpbmdQYXRjaGVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwYXRjaGVzID0gcGVuZGluZ1BhdGNoZXNcclxuICAgIHBlbmRpbmdQYXRjaGVzID0gW11cclxuXHJcbiAgICB5anNEb2MudHJhbnNhY3QoKCkgPT4ge1xyXG4gICAgICBwYXRjaGVzLmZvckVhY2goKHBhdGNoKSA9PiB7XHJcbiAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KHBhdGNoLCB5anNPYmplY3QpXHJcbiAgICAgIH0pXHJcbiAgICB9LCB5anNPcmlnaW4pXHJcbiAgfSlcclxuXHJcbiAgLy8gc3luYyBpbml0aWFsIHBhdGNoZXMsIHRoYXQgbWlnaHQgaW5jbHVkZSBzZXR0aW5nIGRlZmF1bHRzLCBJRHMsIGV0Y1xyXG4gIHlqc0RvYy50cmFuc2FjdCgoKSA9PiB7XHJcbiAgICAvLyB3ZSBuZWVkIHRvIHNraXAgaW5pdGlhbGl6YXRpb25zIHVudGlsIHdlIGhpdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGJvdW5kIG9iamVjdFxyXG4gICAgLy8gdGhpcyBpcyBiZWNhdXNlIGRlZmF1bHQgb2JqZWN0cyBtaWdodCBiZSBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCBiZWZvcmUgdGhlIG1haW4gb2JqZWN0XHJcbiAgICAvLyBidXQgd2UganVzdCBuZWVkIHRvIGNhdGNoIHdoZW4gdGhvc2UgYXJlIGFjdHVhbGx5IGFzc2lnbmVkIHRvIHRoZSBib3VuZCBvYmplY3RcclxuICAgIGxldCBib3VuZE9iamVjdEZvdW5kID0gZmFsc2VcclxuXHJcbiAgICBpbml0aWFsaXphdGlvbkdsb2JhbFBhdGNoZXMuZm9yRWFjaCgoeyB0YXJnZXQsIHBhdGNoZXMgfSkgPT4ge1xyXG4gICAgICBpZiAoIWJvdW5kT2JqZWN0Rm91bmQpIHtcclxuICAgICAgICBpZiAodGFyZ2V0ICE9PSBib3VuZE9iamVjdCkge1xyXG4gICAgICAgICAgcmV0dXJuIC8vIHNraXBcclxuICAgICAgICB9XHJcbiAgICAgICAgYm91bmRPYmplY3RGb3VuZCA9IHRydWVcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcGFyZW50VG9DaGlsZFBhdGggPSBnZXRQYXJlbnRUb0NoaWxkUGF0aChib3VuZE9iamVjdCwgdGFyZ2V0KVxyXG4gICAgICAvLyB0aGlzIGlzIHVuZGVmaW5lZCBvbmx5IGlmIHRhcmdldCBpcyBub3QgYSBjaGlsZCBvZiBib3VuZE1vZGVsXHJcbiAgICAgIGlmIChwYXJlbnRUb0NoaWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcGF0Y2hlcy5mb3JFYWNoKChwYXRjaCkgPT4ge1xyXG4gICAgICAgICAgYXBwbHlNb2J4S2V5c3RvbmVQYXRjaFRvWWpzT2JqZWN0KFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgLi4ucGF0Y2gsXHJcbiAgICAgICAgICAgICAgcGF0aDogWy4uLnBhcmVudFRvQ2hpbGRQYXRoLCAuLi5wYXRjaC5wYXRoXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgeWpzT2JqZWN0XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfSlcclxuICB9LCB5anNPcmlnaW4pXHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBib3VuZE9iamVjdCxcclxuICAgIGRpc3Bvc2U6ICgpID0+IHtcclxuICAgICAgZGlzcG9zZU9uUGF0Y2hlcygpXHJcbiAgICAgIGRpc3Bvc2VPblNuYXBzaG90KClcclxuICAgICAgeWpzT2JqZWN0LnVub2JzZXJ2ZURlZXAob2JzZXJ2ZURlZXBDYilcclxuICAgIH0sXHJcbiAgICB5anNPcmlnaW4sXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJZIiwib25HbG9iYWxQYXRjaGVzIiwiZnJvbVNuYXBzaG90IiwiYXBwbHlQYXRjaGVzIiwib25QYXRjaGVzIiwib25TbmFwc2hvdCIsImdldFBhcmVudFRvQ2hpbGRQYXRoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFHTSxNQUFPLDZCQUE2QixNQUFLO0FBQUEsSUFDN0MsWUFBWSxL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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AnyDataModel, AnyModel, AnyStandardType, ModelClass, TypeToData } from "mobx-keystone";
|
|
2
|
+
import * as Y from "yjs";
|
|
3
|
+
export declare function bindYjsToMobxKeystone<TType extends AnyStandardType | ModelClass<AnyModel> | ModelClass<AnyDataModel>>({ yjsDoc, yjsObject, mobxKeystoneType, }: {
|
|
4
|
+
yjsDoc: Y.Doc;
|
|
5
|
+
yjsObject: Y.Map<unknown> | Y.Array<unknown>;
|
|
6
|
+
mobxKeystoneType: TType;
|
|
7
|
+
}): {
|
|
8
|
+
boundObject: TypeToData<TType>;
|
|
9
|
+
dispose(): void;
|
|
10
|
+
yjsOrigin: symbol;
|
|
11
|
+
};
|