@enhanced-dom/virtualizer 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +24 -20
- package/package.json +11 -13
package/index.js
CHANGED
|
@@ -11,8 +11,8 @@ class StickyGroupNode {
|
|
|
11
11
|
this.parent = null;
|
|
12
12
|
this.children = [];
|
|
13
13
|
this.type = TreePartType.NODE;
|
|
14
|
-
this._size =
|
|
15
|
-
this._depth =
|
|
14
|
+
this._size = undefined;
|
|
15
|
+
this._depth = undefined;
|
|
16
16
|
this.id = id;
|
|
17
17
|
this.level = level;
|
|
18
18
|
}
|
|
@@ -49,13 +49,14 @@ class StickyGroupNode {
|
|
|
49
49
|
}
|
|
50
50
|
get size() {
|
|
51
51
|
if (this._size == null) {
|
|
52
|
-
this._size = this.hasChildren() ? Math.max(...this.children.map((c) => c.size)) + 1 : 0;
|
|
52
|
+
this._size = this.hasChildren() ? Math.max(...this.children.map((c) => c.size).filter((v) => v != null)) + 1 : 0;
|
|
53
53
|
}
|
|
54
54
|
return this._size;
|
|
55
55
|
}
|
|
56
56
|
get depth() {
|
|
57
|
+
var _a;
|
|
57
58
|
if (this._depth == null) {
|
|
58
|
-
this._depth = this.parent.depth + 1;
|
|
59
|
+
this._depth = ((_a = this.parent.depth) !== null && _a !== void 0 ? _a : 0) + 1;
|
|
59
60
|
}
|
|
60
61
|
return this._depth;
|
|
61
62
|
}
|
|
@@ -64,7 +65,7 @@ class StickyGroupForest {
|
|
|
64
65
|
constructor() {
|
|
65
66
|
this.children = [];
|
|
66
67
|
this.type = TreePartType.FOREST;
|
|
67
|
-
this._size =
|
|
68
|
+
this._size = undefined;
|
|
68
69
|
}
|
|
69
70
|
addChild(child) {
|
|
70
71
|
child.parent = this;
|
|
@@ -82,7 +83,7 @@ class StickyGroupForest {
|
|
|
82
83
|
return (_a = this.findNode(id)) === null || _a === void 0 ? void 0 : _a.size;
|
|
83
84
|
}
|
|
84
85
|
if (this._size == null) {
|
|
85
|
-
this._size = this.hasChildren() ? Math.max(...this.children.map((c) => c.size)) + 1 : 0;
|
|
86
|
+
this._size = this.hasChildren() ? Math.max(...this.children.map((c) => c.size).filter((v) => v != null)) + 1 : 0;
|
|
86
87
|
}
|
|
87
88
|
return this._size;
|
|
88
89
|
}
|
|
@@ -112,7 +113,7 @@ class StickyGroupForest {
|
|
|
112
113
|
}
|
|
113
114
|
}
|
|
114
115
|
export const virtualize = (config, entries) => {
|
|
115
|
-
var _a, _b, _c;
|
|
116
|
+
var _a, _b, _c, _d, _e;
|
|
116
117
|
const { offset, overscan, viewportSize } = {
|
|
117
118
|
offset: 0,
|
|
118
119
|
overscan: 5,
|
|
@@ -132,7 +133,7 @@ export const virtualize = (config, entries) => {
|
|
|
132
133
|
for (const e of entries) {
|
|
133
134
|
const entryMinSize = (_a = e.fixedSize) !== null && _a !== void 0 ? _a : e.minSize;
|
|
134
135
|
entriesOffsets.push({ id: e.id, offset: lowerBoundSize, size: entryMinSize });
|
|
135
|
-
lowerBoundSize += entryMinSize;
|
|
136
|
+
lowerBoundSize += entryMinSize !== null && entryMinSize !== void 0 ? entryMinSize : 0;
|
|
136
137
|
entryById[e.id] = e;
|
|
137
138
|
if (e.level != null) {
|
|
138
139
|
currentStickyGroupNode =
|
|
@@ -154,8 +155,8 @@ export const virtualize = (config, entries) => {
|
|
|
154
155
|
minimumExplicitWeight = e.weight;
|
|
155
156
|
}
|
|
156
157
|
// TODO: we assume that the input is 'sane', and maxSize > minSize if given
|
|
157
|
-
if (e.maxSize && e.maxSize - e.minSize < minimumDerivedWeight) {
|
|
158
|
-
minimumDerivedWeight = e.maxSize - e.minSize;
|
|
158
|
+
if (e.maxSize && e.maxSize - ((_c = e.minSize) !== null && _c !== void 0 ? _c : 0) < minimumDerivedWeight) {
|
|
159
|
+
minimumDerivedWeight = e.maxSize - ((_d = e.minSize) !== null && _d !== void 0 ? _d : 0);
|
|
159
160
|
}
|
|
160
161
|
}
|
|
161
162
|
}
|
|
@@ -177,17 +178,17 @@ export const virtualize = (config, entries) => {
|
|
|
177
178
|
const unitOfSpace = totalSpaceToDistribute / totalExplicitWeights;
|
|
178
179
|
let remainingSpaceToDistribute = totalSpaceToDistribute;
|
|
179
180
|
const transformedEntries = entries.map((e) => {
|
|
180
|
-
var _a;
|
|
181
|
+
var _a, _b, _c;
|
|
181
182
|
const transformedEntry = { id: e.id, floating: false, size: e.fixedSize };
|
|
182
183
|
if (transformedEntry.size == null) {
|
|
183
184
|
let computedSize = e.minSize;
|
|
184
185
|
if (remainingSpaceToDistribute > 0) {
|
|
185
186
|
const entryWeight = (_a = e.weight) !== null && _a !== void 0 ? _a : minimumExplicitWeight;
|
|
186
187
|
let entryExtraSpace = Math.min(remainingSpaceToDistribute, Math.max(Math.round(entryWeight * unitOfSpace), 1));
|
|
187
|
-
computedSize = e.minSize + entryExtraSpace;
|
|
188
|
+
computedSize = ((_b = e.minSize) !== null && _b !== void 0 ? _b : 0) + entryExtraSpace;
|
|
188
189
|
if (e.maxSize && computedSize > e.maxSize) {
|
|
189
190
|
computedSize = e.maxSize;
|
|
190
|
-
entryExtraSpace = e.maxSize - e.minSize;
|
|
191
|
+
entryExtraSpace = e.maxSize - ((_c = e.minSize) !== null && _c !== void 0 ? _c : 0);
|
|
191
192
|
}
|
|
192
193
|
remainingSpaceToDistribute -= entryExtraSpace;
|
|
193
194
|
}
|
|
@@ -209,22 +210,24 @@ export const virtualize = (config, entries) => {
|
|
|
209
210
|
}
|
|
210
211
|
// we attempt to distribute the remaining space based on the maxSize - minSize
|
|
211
212
|
const totalDerivedWeights = entriesWithDynamicSpace.reduce((acc, e) => {
|
|
212
|
-
|
|
213
|
+
var _a;
|
|
214
|
+
return acc + (e.maxSize ? e.maxSize - ((_a = e.minSize) !== null && _a !== void 0 ? _a : 0) : minimumDerivedWeight);
|
|
213
215
|
}, 0);
|
|
214
216
|
if (minimumDerivedWeight) {
|
|
215
217
|
const unitOfSpace = totalSpaceToDistribute / totalDerivedWeights;
|
|
216
218
|
let remainingSpaceToDistribute = totalSpaceToDistribute;
|
|
217
219
|
const transformedEntries = entries.map((e) => {
|
|
220
|
+
var _a, _b, _c;
|
|
218
221
|
const transformedEntry = { id: e.id, size: e.fixedSize };
|
|
219
222
|
if (transformedEntry.size == null) {
|
|
220
223
|
let computedSize = e.minSize;
|
|
221
224
|
if (remainingSpaceToDistribute > 0) {
|
|
222
|
-
const entryWeight = e.maxSize ? e.maxSize - e.minSize : minimumDerivedWeight;
|
|
225
|
+
const entryWeight = e.maxSize ? e.maxSize - ((_a = e.minSize) !== null && _a !== void 0 ? _a : 0) : minimumDerivedWeight;
|
|
223
226
|
let entryExtraSpace = Math.min(remainingSpaceToDistribute, Math.max(Math.round(entryWeight * unitOfSpace), 1));
|
|
224
|
-
computedSize = e.minSize + entryExtraSpace;
|
|
227
|
+
computedSize = ((_b = e.minSize) !== null && _b !== void 0 ? _b : 0) + entryExtraSpace;
|
|
225
228
|
if (e.maxSize && computedSize > e.maxSize) {
|
|
226
229
|
computedSize = e.maxSize;
|
|
227
|
-
entryExtraSpace = e.maxSize - e.minSize;
|
|
230
|
+
entryExtraSpace = e.maxSize - ((_c = e.minSize) !== null && _c !== void 0 ? _c : 0);
|
|
228
231
|
}
|
|
229
232
|
remainingSpaceToDistribute -= entryExtraSpace;
|
|
230
233
|
}
|
|
@@ -279,7 +282,7 @@ export const virtualize = (config, entries) => {
|
|
|
279
282
|
if (e.level) {
|
|
280
283
|
const entryGroupNode = stickyGroups.findNode(e.id);
|
|
281
284
|
const nextSiblingGroupNode = entryGroupNode.findNextSibling();
|
|
282
|
-
e.maxOffset = nextSiblingGroupNode ? entryOffsetById[nextSiblingGroupNode.id].start - e.size :
|
|
285
|
+
e.maxOffset = nextSiblingGroupNode ? entryOffsetById[nextSiblingGroupNode.id].start - e.size : undefined;
|
|
283
286
|
e.minOffset = e.offset;
|
|
284
287
|
}
|
|
285
288
|
});
|
|
@@ -305,7 +308,7 @@ export const virtualize = (config, entries) => {
|
|
|
305
308
|
...stickyTransformedEntries,
|
|
306
309
|
{
|
|
307
310
|
id: firstStickyEntryOutsideTheWindow.id,
|
|
308
|
-
size: (
|
|
311
|
+
size: (_e = firstStickyEntryOutsideTheWindow.fixedSize) !== null && _e !== void 0 ? _e : firstStickyEntryOutsideTheWindow.minSize,
|
|
309
312
|
offset: entryOffsetById[firstStickyEntryOutsideTheWindow.id].start,
|
|
310
313
|
level: firstStickyEntryOutsideTheWindow.level,
|
|
311
314
|
},
|
|
@@ -316,7 +319,7 @@ export const virtualize = (config, entries) => {
|
|
|
316
319
|
const relativeOffsets = {};
|
|
317
320
|
transformedEntries
|
|
318
321
|
.filter((te) => !!te.level)
|
|
319
|
-
.sort((e1, e2) => e2.level - e1.level)
|
|
322
|
+
.sort((e1, e2) => { var _a, _b; return ((_a = e2.level) !== null && _a !== void 0 ? _a : 0) - ((_b = e1.level) !== null && _b !== void 0 ? _b : 0); })
|
|
320
323
|
.forEach((te) => {
|
|
321
324
|
var _a;
|
|
322
325
|
const stickyGroupNode = stickyGroups.findNode(te.id);
|
|
@@ -331,3 +334,4 @@ export const virtualize = (config, entries) => {
|
|
|
331
334
|
}
|
|
332
335
|
return transformedEntries;
|
|
333
336
|
};
|
|
337
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBb0JBLElBQUssWUFHSjtBQUhELFdBQUssWUFBWTtJQUNmLDZCQUFhLENBQUE7SUFDYixpQ0FBaUIsQ0FBQTtBQUNuQixDQUFDLEVBSEksWUFBWSxLQUFaLFlBQVksUUFHaEI7QUFNRCxNQUFNLGVBQWU7SUFNbkIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFvQjtRQUNwQyxPQUFPLENBQUEsUUFBUSxhQUFSLFFBQVEsdUJBQVIsUUFBUSxDQUFFLElBQUksTUFBSyxZQUFZLENBQUMsSUFBSSxDQUFBO0lBQzdDLENBQUM7SUFDRCxZQUFZLEVBQW1CLEVBQUUsS0FBYTtRQU52QyxXQUFNLEdBQWdELElBQUksQ0FBQTtRQUMxRCxhQUFRLEdBQXNCLEVBQUUsQ0FBQTtRQUNoQyxTQUFJLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQTtRQTJDdkIsVUFBSyxHQUFZLFNBQVMsQ0FBQTtRQVMxQixXQUFNLEdBQXdCLFNBQVMsQ0FBQTtRQS9DN0MsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUE7UUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUNwQixDQUFDO0lBRU0sUUFBUSxDQUFDLEtBQXNCO1FBQ3BDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1FBQ25CLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3pCLE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUFhOztRQUM5QixJQUFJLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUE7UUFDYixDQUFDO1FBQ0QsT0FBTyxNQUFBLElBQUksQ0FBQyxNQUFNLDBDQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUN4QyxDQUFDO0lB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LENBQUE7WUFDeEIsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQTtZQUMxRyxNQUFNLFdBQVcsR0FBRyxNQUFBLGVBQWUsQ0FBQyxlQUFlLGFBQWYsZUFBZSx1QkFBZixlQUFlLENBQUUsRUFBRSxDQUFDLG1DQUFJLENBQUMsQ0FBQTtZQUM3RCxFQUFFLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQTtZQUMvQixlQUFlLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBO1FBQ2hELENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUNELE9BQU8sa0JBQWtCLENBQUE7QUFDM0IsQ0FBQyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgSVZpcnR1YWxpemVyRW50cnkgPSB7IGxldmVsPzogbnVtYmVyOyBpZDogc3RyaW5nIHwgbnVtYmVyOyBtYXhTaXplPzogbnVtYmVyOyB3ZWlnaHQ/OiBudW1iZXIgfSAmIChcbiAgfCB7IG1pblNpemU6IG51bWJlcjsgZml4ZWRTaXplPzogbnVtYmVyIH1cbiAgfCB7IG1pblNpemU/OiBudW1iZXI7IGZpeGVkU2l6ZTogbnVtYmVyIH1cbilcblxuZXhwb3J0IGludGVyZmFjZSBJVmlydHVhbGl6ZXJDb25maWcge1xuICB2aWV3cG9ydFNpemU6IG51bWJlclxuICBvZmZzZXQ/OiBudW1iZXJcbiAgb3ZlcnNjYW4/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVmlydHVhbGl6ZXJSZXN1bHQgZXh0ZW5kcyBQaWNrPElWaXJ0dWFsaXplckVudHJ5LCAnaWQnPiB7XG4gIHNpemU6IG51bWJlclxuICBvZmZzZXQ/OiBudW1iZXJcbiAgcmVsYXRpdmVPZmZzZXQ/OiBudW1iZXJcbiAgbWluT2Zmc2V0PzogbnVtYmVyXG4gIG1heE9mZnNldD86IG51bWJlclxuICBsZXZlbD86IG51bWJlclxufVxuXG5lbnVtIFRyZWVQYXJ0VHlwZSB7XG4gIE5PREUgPSAnbm9kZScsXG4gIEZPUkVTVCA9ICdmb3Jlc3QnLFxufVxuXG5pbnRlcmZhY2UgSVRyZWVQYXJ0IHtcbiAgdHlwZTogVHJlZVBhcnRUeXBlXG59XG5cbmNsYXNzIFN0aWNreUdyb3VwTm9kZSBpbXBsZW1lbnRzIElUcmVlUGFydCB7XG4gIHB1YmxpYyBpZDogc3RyaW5nIHwgbnVtYmVyXG4gIHB1YmxpYyBsZXZlbDogbnVtYmVyXG4gIHB1YmxpYyBwYXJlbnQ/OiBTdGlja3lHcm91cE5vZGUgfCBTdGlja3lHcm91cEZvcmVzdCB8IG51bGwgPSBudWxsXG4gIHB1YmxpYyBjaGlsZHJlbjogU3RpY2t5R3JvdXBOb2RlW10gPSBbXVxuICBwdWJsaWMgdHlwZSA9IFRyZWVQYXJ0VHlwZS5OT0RFXG4gIHN0YXRpYyBpc0luc3RhbmNlKHRyZWVQYXJ0PzogSVRyZWVQYXJ0KTogdHJlZVBhcnQgaXMgU3RpY2t5R3JvdXBOb2RlIHtcbiAgICByZXR1cm4gdHJlZVBhcnQ/LnR5cGUgPT09IFRyZWVQYXJ0VHlwZS5OT0RFXG4gIH1cbiAgY29uc3RydWN0b3IoaWQ6IHN0cmluZyB8IG51bWJlciwgbGV2ZWw6IG51bWJlcikge1xuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMubGV2ZWwgPSBsZXZlbFxuICB9XG5cbiAgcHVibGljIGFkZENoaWxkKGNoaWxkOiBTdGlja3lHcm91cE5vZGUpIHtcbiAgICBjaGlsZC5wYXJlbnQgPSB0aGlzXG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKVxuICAgIHJldHVybiBjaGlsZFxuICB9XG5cbiAgcHVibGljIGdldEFuY2VzdG9yKGxldmVsOiBudW1iZXIpOiBTdGlja3lHcm91cE5vZGUgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5sZXZlbCA+IGxldmVsKSB7XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wYXJlbnQ/LmdldEFuY2VzdG9yKGxldmVsKVxuICB9XG5cbiAgcHVibGljIGZpbmROb2RlKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBJVHJlZVBhcnQgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5pZCA9PSBpZCkge1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubWFwKChjKSA9PiBjLmZpbmROb2RlKGlkKSkuZmluZCgobikgPT4gISFuKVxuICB9XG5cbiAgcHVibGljIGZpbmROZXh0U2libGluZygpOiBTdGlja3lHcm91cE5vZGUgfCBudWxsIHtcbiAgICBjb25zdCBjdXJyZW50Tm9kZUluZGV4ID0gdGhpcy5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZih0aGlzKVxuICAgIHJldHVybiB0aGlzLnBhcmVudC5jaGlsZHJlbltjdXJyZW50Tm9kZUluZGV4ICsgMV0gPz8gdGhpcy5wYXJlbnQuZmluZE5leHRTaWJsaW5nKClcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUHJldmlvdXNTaWJsaW5nKCk6IFN0aWNreUdyb3VwTm9kZSB8IG51bGwge1xuICAgIGNvbnN0IGN1cnJlbnROb2RlSW5kZXggPSB0aGlzLnBhcmVudC5jaGlsZHJlbi5pbmRleE9mKHRoaXMpXG4gICAgcmV0dXJuIHRoaXMucGFyZW50LmNoaWxkcmVuW2N1cnJlbnROb2RlSW5kZXggLSAxXSA/PyAoU3RpY2t5R3JvdXBOb2RlLmlzSW5zdGFuY2UodGhpcy5wYXJlbnQpID8gdGhpcy5wYXJlbnQgOiBudWxsKVxuICB9XG5cbiAgcHVibGljIGhhc0NoaWxkcmVuKCkge1xuICAgIHJldHVybiAhIXRoaXMuY2hpbGRyZW4ubGVuZ3RoXG4gIH1cblxuICBwcml2YXRlIF9zaXplPzogbnVtYmVyID0gdW5kZWZpbmVkXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9zaXplID09IG51bGwpIHtcbiAgICAgIHRoaXMuX3NpemUgPSB0aGlzLmhhc0NoaWxkcmVuKCkgPyBNYXRoLm1heCguLi50aGlzLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5zaXplKS5maWx0ZXIoKHYpID0+IHYgIT0gbnVsbCkpICsgMSA6IDBcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2l6ZVxuICB9XG5cbiAgcHJpdmF0ZSBfZGVwdGg/OiBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgcHVibGljIGdldCBkZXB0aCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9kZXB0aCA9PSBudWxsKSB7XG4gICAgICB0aGlzLl9kZXB0aCA9ICh0aGlzLnBhcmVudC5kZXB0aCA/PyAwKSArIDFcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZGVwdGhcbiAgfVxufVxuXG5jbGFzcyBTdGlja3lHcm91cEZvcmVzdCBpbXBsZW1lbnRzIElUcmVlUGFydCB7XG4gIHB1YmxpYyBjaGlsZHJlbjogU3RpY2t5R3JvdXBOb2RlW10gPSBbXVxuICBwdWJsaWMgdHlwZSA9IFRyZWVQYXJ0VHlwZS5GT1JFU1RcbiAgcHVibGljIGFkZENoaWxkKGNoaWxkOiBTdGlja3lHcm91cE5vZGUpIHtcbiAgICBjaGlsZC5wYXJlbnQgPSB0aGlzXG4gICAgdGhpcy5jaGlsZHJlbi5wdXNoKGNoaWxkKVxuICB9XG5cbiAgcHVibGljIGhhc0NoaWxkcmVuKCkge1xuICAgIHJldHVybiAhIXRoaXMuY2hpbGRyZW4ubGVuZ3RoXG4gIH1cblxuICBwdWJsaWMgZ2V0QW5jZXN0b3IoKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHByaXZhdGUgX3NpemU/OiBudW1iZXIgPSB1bmRlZmluZWRcbiAgcHVibGljIHNpemUoaWQ/OiBzdHJpbmcgfCBudW1iZXIpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kTm9kZShpZCk/LnNpemVcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpemUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5fc2l6ZSA9IHRoaXMuaGFzQ2hpbGRyZW4oKSA/IE1hdGgubWF4KC4uLnRoaXMuY2hpbGRyZW4ubWFwKChjKSA9PiBjLnNpemUpLmZpbHRlcigodikgPT4gdiAhPSBudWxsKSkgKyAxIDogMFxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zaXplXG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlcHRoKCkge1xuICAgIHJldHVybiAwXG4gIH1cblxuICBwdWJsaWMgZmluZE5vZGUoaWQ6IHN0cmluZyB8IG51bWJlcik6IFN0aWNreUdyb3VwTm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2hpbGRyZW4ubWFwKChjKSA9PiBjLmZpbmROb2RlKGlkKSkuZmluZCgobikgPT4gISFuKSBhcyBTdGlja3lHcm91cE5vZGUgfCB1bmRlZmluZWRcbiAgfVxuXG4gIHB1YmxpYyBmaW5kQW5jZXN0b3JzKGlkOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuZmluZE5vZGUoaWQpXG4gICAgaWYgKCFub2RlKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gICAgY29uc3QgYW5jZXN0b3JzID0gW11cbiAgICB3aGlsZSAobm9kZS5wYXJlbnQgIT09IHRoaXMpIHtcbiAgICAgIG5vZGUgPSBub2RlLnBhcmVudCBhcyBTdGlja3lHcm91cE5vZGVcbiAgICAgIGFuY2VzdG9ycy51bnNoaWZ0KG5vZGUpXG4gICAgfVxuICAgIHJldHVybiBhbmNlc3RvcnNcbiAgfVxuXG4gIHB1YmxpYyBmaW5kTmV4dFNpYmxpbmcoKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUHJldmlvdXNTaWJsaW5nKCkge1xuICAgIHJldHVybiBudWxsXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZpcnR1YWxpemUgPSAoY29uZmlnOiBJVmlydHVhbGl6ZXJDb25maWcsIGVudHJpZXM6IElWaXJ0dWFsaXplckVudHJ5W10pOiBJVmlydHVhbGl6ZXJSZXN1bHRbXSA9PiB7XG4gIGNvbnN0IHsgb2Zmc2V0LCBvdmVyc2Nhbiwgdmlld3BvcnRTaXplIH0gPSB7XG4gICAgb2Zmc2V0OiAwLFxuICAgIG92ZXJzY2FuOiA1LFxuICAgIC4uLmNvbmZpZyxcbiAgfVxuICAvLyBmaXJzdCwgbGV0IHVzIGZpZ3VyZSBvdXQgaWYgdGhlIHNpemUgaXMgc21hbGxlciB0aGFuIHRoZSB2aWV3cG9ydFxuICAvLyB3aGlsZSB3ZSBpdGVyYXRlIG92ZXIgdGhlIGVudHJpZXMsIHdlIHNob3VsZCBhbHNvIGZpbmQgb3V0IHNvbWUgJ3N0YXRpc3RpY3RzJyBhYm91dCB3ZWlnaHRzXG4gIGxldCBsb3dlckJvdW5kU2l6ZSA9IDBcbiAgY29uc3QgZW50cmllc1dpdGhEeW5hbWljU3BhY2U6IElWaXJ0dWFsaXplckVudHJ5W10gPSBbXVxuICBjb25zdCB1bmJvdW5kZWRFbnRyaWVzOiBJVmlydHVhbGl6ZXJFbnRyeVsnaWQnXVtdID0gW11cbiAgY29uc3QgZW50cmllc09mZnNldHM6IHsgaWQ6IHN0cmluZyB8IG51bWJlcjsgb2Zmc2V0OiBudW1iZXI7IHNpemU6IG51bWJlciB9W10gPSBbXVxuICBjb25zdCBzdGlja3lHcm91cHMgPSBuZXcgU3RpY2t5R3JvdXBGb3Jlc3QoKVxuICBjb25zdCBlbnRyeUJ5SWQ6IFJlY29yZDxzdHJpbmcsIElWaXJ0dWFsaXplckVudHJ5PiA9IHt9XG4gIGxldCBjdXJyZW50U3RpY2t5R3JvdXBOb2RlOiBTdGlja3lHcm91cE5vZGUgfCBudWxsID0gbnVsbFxuICBsZXQgbWluaW11bUV4cGxpY2l0V2VpZ2h0ID0gSW5maW5pdHlcbiAgbGV0IG1pbmltdW1EZXJpdmVkV2VpZ2h0ID0gSW5maW5pdHlcbiAgZm9yIChjb25zdCBlIG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBlbnRyeU1pblNpemUgPSBlLmZpeGVkU2l6ZSA/PyBlLm1pblNpemVcbiAgICBlbnRyaWVzT2Zmc2V0cy5wdXNoKHsgaWQ6IGUuaWQsIG9mZnNldDogbG93ZXJCb3VuZFNpemUsIHNpemU6IGVudHJ5TWluU2l6ZSB9KVxuICAgIGxvd2VyQm91bmRTaXplICs9IGVudHJ5TWluU2l6ZSA/PyAwXG4gICAgZW50cnlCeUlkW2UuaWRdID0gZVxuICAgIGlmIChlLmxldmVsICE9IG51bGwpIHtcbiAgICAgIGN1cnJlbnRTdGlja3lHcm91cE5vZGUgPVxuICAgICAgICAoY3VycmVudFN0aWNreUdyb3VwTm9kZT8ubGV2ZWwgPz8gMCkgPiBlLmxldmVsID8gY3VycmVudFN0aWNreUdyb3VwTm9kZSA6IGN1cnJlbnRTdGlja3lHcm91cE5vZGU/LmdldEFuY2VzdG9yKGUubGV2ZWwpXG4gICAgICBpZiAoIWN1cnJlbnRTdGlja3lHcm91cE5vZGUpIHtcbiAgICAgICAgY3VycmVudFN0aWNreUdyb3VwTm9kZSA9IG5ldyBTdGlja3lHcm91cE5vZGUoZS5pZCwgZS5sZXZlbClcbiAgICAgICAgc3RpY2t5R3JvdXBzLmFkZENoaWxkKGN1cnJlbnRTdGlja3lHcm91cE5vZGUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50U3RpY2t5R3JvdXBOb2RlID0gY3VycmVudFN0aWNreUdyb3VwTm9kZS5hZGRDaGlsZChuZXcgU3RpY2t5R3JvdXBOb2RlKGUuaWQsIGUubGV2ZWwpKVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZS5maXhlZFNpemUgPT0gbnVsbCAmJiAoZS53ZWlnaHQgfHwgZS5tYXhTaXplID09IG51bGwgfHwgZS5tYXhTaXplID4gZS5taW5TaXplKSkge1xuICAgICAgZW50cmllc1dpdGhEeW5hbWljU3BhY2UucHVzaChlKVxuICAgICAgaWYgKGUubWF4U2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHVuYm91bmRlZEVudHJpZXMucHVzaChlLmlkKVxuICAgICAgfVxuICAgICAgaWYgKGUud2VpZ2h0ICYmIGUud2VpZ2h0IDwgbWluaW11bUV4cGxpY2l0V2VpZ2h0KSB7XG4gICAgICAgIG1pbmltdW1FeHBsaWNpdFdlaWdodCA9IGUud2VpZ2h0XG4gICAgICB9XG4gICAgICAvLyBUT0RPOiB3ZSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgaXMgJ3NhbmUnLCBhbmQgbWF4U2l6ZSA+IG1pblNpemUgaWYgZ2l2ZW5cbiAgICAgIGlmIChlLm1heFNpemUgJiYgZS5tYXhTaXplIC0gKGUubWluU2l6ZSA/PyAwKSA8IG1pbmltdW1EZXJpdmVkV2VpZ2h0KSB7XG4gICAgICAgIG1pbmltdW1EZXJpdmVkV2VpZ2h0ID0gZS5tYXhTaXplIC0gKGUubWluU2l6ZSA/PyAwKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoIWlzRmluaXRlKG1pbmltdW1FeHBsaWNpdFdlaWdodCkpIHtcbiAgICBtaW5pbXVtRXhwbGljaXRXZWlnaHQgPSAxXG4gIH1cbiAgaWYgKCFpc0Zpbml0ZShtaW5pbXVtRGVyaXZlZFdlaWdodCkpIHtcbiAgICBtaW5pbXVtRGVyaXZlZFdlaWdodCA9IDFcbiAgfVxuICBpZiAobG93ZXJCb3VuZFNpemUgPD0gdmlld3BvcnRTaXplKSB7XG4gICAgLy8gd2Ugd2lsbCBzaG93IEFMTCBlbnRyaWVzXG4gICAgY29uc3QgdG90YWxTcGFjZVRvRGlzdHJpYnV0ZSA9IHZpZXdwb3J0U2l6ZSAtIGxvd2VyQm91bmRTaXplXG4gICAgaWYgKGVudHJpZXNXaXRoRHluYW1pY1NwYWNlLnNvbWUoKGUpID0+IGUud2VpZ2h0KSkge1xuICAgICAgLy8gd2Ugd2lsbCBhdHRlbXB0IGRpc3RyaWJ1dGUgdGhlIHJlc3Qgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBhbW9uZyBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgbWF4U2l6ZSBiYXNlZCBvbiB0aGVpciB3ZWlnaHRzXG4gICAgICBjb25zdCB0b3RhbEV4cGxpY2l0V2VpZ2h0cyA9IGVudHJpZXNXaXRoRHluYW1pY1NwYWNlLnJlZHVjZSgoYWNjLCBlKSA9PiB7XG4gICAgICAgIHJldHVybiBhY2MgKyAoZS53ZWlnaHQgPz8gbWluaW11bUV4cGxpY2l0V2VpZ2h0KVxuICAgICAgfSwgMClcbiAgICAgIGNvbnN0IHVuaXRPZlNwYWNlID0gdG90YWxTcGFjZVRvRGlzdHJpYnV0ZSAvIHRvdGFsRXhwbGljaXRXZWlnaHRzXG4gICAgICBsZXQgcmVtYWluaW5nU3BhY2VUb0Rpc3RyaWJ1dGUgPSB0b3RhbFNwYWNlVG9EaXN0cmlidXRlXG4gICAgICBjb25zdCB0cmFuc2Zvcm1lZEVudHJpZXMgPSBlbnRyaWVzLm1hcCgoZSkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZEVudHJ5ID0geyBpZDogZS5pZCwgZmxvYXRpbmc6IGZhbHNlLCBzaXplOiBlLmZpeGVkU2l6ZSB9XG4gICAgICAgIGlmICh0cmFuc2Zvcm1lZEVudHJ5LnNpemUgPT0gbnVsbCkge1xuICAgICAgICAgIGxldCBjb21wdXRlZFNpemUgPSBlLm1pblNpemVcbiAgICAgICAgICBpZiAocmVtYWluaW5nU3BhY2VUb0Rpc3RyaWJ1dGUgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeVdlaWdodCA9IGUud2VpZ2h0ID8/IG1pbmltdW1FeHBsaWNpdFdlaWdodFxuICAgICAgICAgICAgbGV0IGVudHJ5RXh0cmFTcGFjZSA9IE1hdGgubWluKHJlbWFpbmluZ1NwYWNlVG9EaXN0cmlidXRlLCBNYXRoLm1heChNYXRoLnJvdW5kKGVudHJ5V2VpZ2h0ICogdW5pdE9mU3BhY2UpLCAxKSlcbiAgICAgICAgICAgIGNvbXB1dGVkU2l6ZSA9IChlLm1pblNpemUgPz8gMCkgKyBlbnRyeUV4dHJhU3BhY2VcbiAgICAgICAgICAgIGlmIChlLm1heFNpemUgJiYgY29tcHV0ZWRTaXplID4gZS5tYXhTaXplKSB7XG4gICAgICAgICAgICAgIGNvbXB1dGVkU2l6ZSA9IGUubWF4U2l6ZVxuICAgICAgICAgICAgICBlbnRyeUV4dHJhU3BhY2UgPSBlLm1heFNpemUgLSAoZS5taW5TaXplID8/IDApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZW1haW5pbmdTcGFjZVRvRGlzdHJpYnV0ZSAtPSBlbnRyeUV4dHJhU3BhY2VcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJhbnNmb3JtZWRFbnRyeS5zaXplID0gY29tcHV0ZWRTaXplXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkRW50cnlcbiAgICAgIH0pXG4gICAgICBpZiAocmVtYWluaW5nU3BhY2VUb0Rpc3RyaWJ1dGUgPiAwICYmIHVuYm91bmRlZEVudHJpZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG91dHN0YW5kaW5nVW5pdE9mU3BhY2UgPSByZW1haW5pbmdTcGFjZVRvRGlzdHJpYnV0ZSAvIHVuYm91bmRlZEVudHJpZXMubGVuZ3RoXG4gICAgICAgIHRyYW5zZm9ybWVkRW50cmllcy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICAgICAgaWYgKHVuYm91bmRlZEVudHJpZXMuaW5jbHVkZXMoZS5pZCkgJiYgcmVtYWluaW5nU3BhY2VUb0Rpc3RyaWJ1dGUgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBleHRyYUVudHJ5U3BhY2UgPVxuICAgICAgICAgICAgICBlLmlkID09PSB1bmJvdW5kZWRFbnRyaWVzW3VuYm91bmRlZEVudHJpZXMubGVuZ3RoIC0gMV0gPyByZW1haW5pbmdTcGFjZVRvRGlzdHJpYnV0ZSA6IE1hdGgucm91bmQob3V0c3RhbmRpbmdVbml0T2ZTcGFjZSlcbiAgICAgICAgICAgIGUuc2l6ZSA9IGUuc2l6ZSArIGV4dHJhRW50cnlTcGFjZVxuICAgICAgICAgICAgcmVtYWluaW5nU3BhY2VUb0Rpc3RyaWJ1dGUgLT0gZXh0cmFFbnRyeVNwYWNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkRW50cmllc1xuICAgIH1cblxuICAgIC8vIHdlIGF0dGVtcHQgdG8gZGlzdHJpYnV0ZSB0aGUgcmVtYWluaW5nIHNwYWNlIGJhc2VkIG9uIHRoZSBtYXhTaXplIC0gbWluU2l6ZVxuICAgIGNvbnN0IHRvdGFsRGVyaXZlZFdlaWdodHMgPSBlbnRyaWVzV2l0aER5bmFtaWNTcGFjZS5yZWR1Y2UoKGFjYywgZSkgPT4ge1xuICAgICAgcmV0dXJuIGFjYyArIChlLm1heFNpemUgPyBlLm1heFNpemUgLSAoZS5taW5TaXplID8/IDApIDogbWluaW11bURlcml2ZWRXZWlnaHQpXG4gICAgfSwgMClcbiAgICBpZiAobWluaW11bURlcml2ZWRXZWlnaHQpIHtcbiAgICAgIGNvbnN0IHVuaXRPZlNwYWNlID0gdG90YWxTcGFjZVRvRGlzdHJpYnV0ZSAvIHRvdGFsRGVyaXZlZFdlaWdodHNcbiAgICAgIGxldCByZW1haW5pbmdTcGFjZVRvRGlzdHJpYnV0ZSA9IHRvdGFsU3BhY2VUb0Rpc3RyaWJ1dGVcbiAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRW50cmllcyA9IGVudHJpZXMubWFwKChlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRW50cnk6IElWaXJ0dWFsaXplclJlc3VsdCA9IHsgaWQ6IGUuaWQsIHNpemU6IGUuZml4ZWRTaXplIH1cbiAgICAgICAgaWYgKHRyYW5zZm9ybWVkRW50cnkuc2l6ZSA9PSBudWxsKSB7XG4gICAgICAgICAgbGV0IGNvbXB1dGVkU2l6ZSA9IGUubWluU2l6ZVxuICAgICAgICAgIGlmIChyZW1haW5pbmdTcGFjZVRvRGlzdHJpYnV0ZSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5V2VpZ2h0ID0gZS5tYXhTaXplID8gZS5tYXhTaXplIC0gKGUubWluU2l6ZSA/PyAwKSA6IG1pbmltdW1EZXJpdmVkV2VpZ2h0XG4gICAgICAgICAgICBsZXQgZW50cnlFeHRyYVNwYWNlID0gTWF0aC5taW4ocmVtYWluaW5nU3BhY2VUb0Rpc3RyaWJ1dGUsIE1hdGgubWF4KE1hdGgucm91bmQoZW50cnlXZWlnaHQgKiB1bml0T2ZTcGFjZSksIDEpKVxuICAgICAgICAgICAgY29tcHV0ZWRTaXplID0gKGUubWluU2l6ZSA/PyAwKSArIGVudHJ5RXh0cmFTcGFjZVxuICAgICAgICAgICAgaWYgKGUubWF4U2l6ZSAmJiBjb21wdXRlZFNpemUgPiBlLm1heFNpemUpIHtcbiAgICAgICAgICAgICAgY29tcHV0ZWRTaXplID0gZS5tYXhTaXplXG4gICAgICAgICAgICAgIGVudHJ5RXh0cmFTcGFjZSA9IGUubWF4U2l6ZSAtIChlLm1pblNpemUgPz8gMClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlbWFpbmluZ1NwYWNlVG9EaXN0cmlidXRlIC09IGVudHJ5RXh0cmFTcGFjZVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmFuc2Zvcm1lZEVudHJ5LnNpemUgPSBjb21wdXRlZFNpemVcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWRFbnRyeVxuICAgICAgfSlcbiAgICAgIGlmIChyZW1haW5pbmdTcGFjZVRvRGlzdHJpYnV0ZSA+IDAgJiYgdW5ib3VuZGVkRW50cmllcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qgb3V0c3RhbmRpbmdVbml0T2ZTcGFjZSA9IHJlbWFpbmluZ1NwYWNlVG9EaXN0cmlidXRlIC8gdW5ib3VuZGVkRW50cmllcy5sZW5ndGhcbiAgICAgICAgdHJhbnNmb3JtZWRFbnRyaWVzLmZvckVhY2goKGUpID0+IHtcbiAgICAgICAgICBpZiAodW5ib3VuZGVkRW50cmllcy5pbmNsdWRlcyhlLmlkKSAmJiByZW1haW5pbmdTcGFjZVRvRGlzdHJpYnV0ZSA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGV4dHJhRW50cnlTcGFjZSA9XG4gICAgICAgICAgICAgIGUuaWQgPT09IHVuYm91bmRlZEVudHJpZXNbdW5ib3VuZGVkRW50cmllcy5sZW5ndGggLSAxXSA/IHJlbWFpbmluZ1NwYWNlVG9EaXN0cmlidXRlIDogTWF0aC5yb3VuZChvdXRzdGFuZGluZ1VuaXRPZlNwYWNlKVxuICAgICAgICAgICAgZS5zaXplID0gZS5zaXplICsgZXh0cmFFbnRyeVNwYWNlXG4gICAgICAgICAgICByZW1haW5pbmdTcGFjZVRvRGlzdHJpYnV0ZSAtPSBleHRyYUVudHJ5U3BhY2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICByZXR1cm4gdHJhbnNmb3JtZWRFbnRyaWVzXG4gICAgfVxuICAgIC8vIG5vIGx1Y2sgZGlzdHJpYnV0aW5nIHRoZSB3ZWlnaHRzIC0gd2Ugd2lsbCByZXR1cm4gdGhlIGVudHJpZXMgYXMgdGhleSBhcmUuLi5cbiAgICByZXR1cm4gZW50cmllcy5tYXAoKGUpID0+ICh7IGlkOiBlLmlkLCBmbG9hdGluZzogZmFsc2UsIHNpemU6IGUuZml4ZWRTaXplID8/IGUubWluU2l6ZSB9KSlcbiAgfVxuXG4gIC8vIHdlIHdpbGwgc2hvdyBvbmx5ICdzb21lJyBlbnRyaWVzLiBMZXQncyBmaWd1cmUgb3V0IHdoaWNoIG9uZXMgYXJlIGluIHRoZSB3aW5kb3dcbiAgY29uc3QgZmlyc3RPZmZzZXRJbldpbmRvdyA9IGVudHJpZXNPZmZzZXRzLmZpbmQoKG8pID0+IG8ub2Zmc2V0IDw9IG9mZnNldCAmJiBvLm9mZnNldCArIG8uc2l6ZSA+PSBvZmZzZXQpXG4gIGlmICghZmlyc3RPZmZzZXRJbldpbmRvdykge1xuICAgIHJldHVybiBbXVxuICB9XG4gIGNvbnN0IGZpcnN0RW50cnlJZHhJbldpbmRvdyA9IGVudHJpZXNPZmZzZXRzLmluZGV4T2YoZmlyc3RPZmZzZXRJbldpbmRvdylcbiAgY29uc3QgZmlyc3RFbnRyeUlkeCA9IE1hdGgubWF4KDAsIGZpcnN0RW50cnlJZHhJbldpbmRvdyAtIG92ZXJzY2FuKVxuICBjb25zdCBmaXJzdE9mZnNldE91dE9mV2luZG93ID0gZW50cmllc09mZnNldHMuZmluZCgobykgPT4gby5vZmZzZXQgPj0gb2Zmc2V0ICsgdmlld3BvcnRTaXplKVxuICBjb25zdCBsYXN0RW50cnlJZHhJbldpbmRvdyA9IGZpcnN0T2Zmc2V0T3V0T2ZXaW5kb3cgPyBlbnRyaWVzT2Zmc2V0cy5pbmRleE9mKGZpcnN0T2Zmc2V0T3V0T2ZXaW5kb3cpIC0gMSA6IGVudHJpZXMubGVuZ3RoIC0gMVxuICBjb25zdCBsYXN0RW50cnlJZHggPSBNYXRoLm1pbihlbnRyaWVzLmxlbmd0aCAtIDEsIGxhc3RFbnRyeUlkeEluV2luZG93ICsgb3ZlcnNjYW4pXG4gIC8vIHRha2UgdGhlIGVudHJpZXMgY29ycmVzcG9uZGluZyB0byB0aGUgdmlld3BvcnQgYW5kIGluY2x1ZGUgdGhlIG92ZXJzY2FuXG4gIGNvbnN0IHNlbGVjdGVkRW50cmllcyA9IGVudHJpZXMuc2xpY2UoZmlyc3RFbnRyeUlkeCwgbGFzdEVudHJ5SWR4ICsgMSlcbiAgY29uc3QgZW50cnlPZmZzZXRCeUlkID0gZW50cmllc09mZnNldHMucmVkdWNlKFxuICAgIChhY2MsIGVvKSA9PiB7XG4gICAgICBhY2NbZW8uaWRdID0geyBzdGFydDogZW8ub2Zmc2V0LCBlbmQ6IGVvLm9mZnNldCArIGVvLnNpemUgfVxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sXG4gICAge30gYXMgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9PixcbiAgKVxuICBsZXQgdHJhbnNmb3JtZWRFbnRyaWVzOiBJVmlydHVhbGl6ZXJSZXN1bHRbXSA9IHNlbGVjdGVkRW50cmllcy5tYXAoKGUpID0+ICh7XG4gICAgaWQ6IGUuaWQsXG4gICAgc2l6ZTogZS5maXhlZFNpemUgPz8gZS5taW5TaXplLFxuICAgIG9mZnNldDogZW50cnlPZmZzZXRCeUlkW2UuaWRdLnN0YXJ0LFxuICAgIGxldmVsOiBlLmxldmVsLFxuICB9KSlcblxuICAvLyBhZGp1c3Qgc2VsZWN0ZWQgZW50cmllcyBvZmYgdGhlIHdpbmRvdyB3aGljaCBoYXZlIGEgc3RpY2t5R3JvdXBcbiAgaWYgKHN0aWNreUdyb3Vwcy5oYXNDaGlsZHJlbigpKSB7XG4gICAgLy8gZmlyc3QsIHdlIHdpbGwgYWRqdXN0IHRoZSBtYXhPZmZzZXQgZm9yIHRoZSBzdGlja3kgZW50cmllcyB3aXRoaW4gdGhlIHZpZXc6XG4gICAgdHJhbnNmb3JtZWRFbnRyaWVzLmZvckVhY2goKGUpID0+IHtcbiAgICAgIGlmIChlLmxldmVsKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5R3JvdXBOb2RlID0gc3RpY2t5R3JvdXBzLmZpbmROb2RlKGUuaWQpXG4gICAgICAgIGNvbnN0IG5leHRTaWJsaW5nR3JvdXBOb2RlID0gZW50cnlHcm91cE5vZGUuZmluZE5leHRTaWJsaW5nKClcbiAgICAgICAgZS5tYXhPZmZzZXQgPSBuZXh0U2libGluZ0dyb3VwTm9kZSA/IGVudHJ5T2Zmc2V0QnlJZFtuZXh0U2libGluZ0dyb3VwTm9kZS5pZF0uc3RhcnQgLSBlLnNpemUgOiB1bmRlZmluZWRcbiAgICAgICAgZS5taW5PZmZzZXQgPSBlLm9mZnNldFxuICAgICAgfVxuICAgIH0pXG5cbiAgICBjb25zdCBmaXJzdFN0aWNreUVudHJ5T3V0c2lkZVRoZVdpbmRvdyA9IGVudHJpZXNcbiAgICAgIC5zbGljZSgwLCBmaXJzdEVudHJ5SWR4KVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLmZpbmQoKGUpID0+ICEhZS5sZXZlbClcbiAgICBpZiAoZmlyc3RTdGlja3lFbnRyeU91dHNpZGVUaGVXaW5kb3cpIHtcbiAgICAgIGNvbnN0IHN0aWNreUFuY2VzdG9ycyA9IHN0aWNreUdyb3Vwcy5maW5kQW5jZXN0b3JzKGZpcnN0U3RpY2t5RW50cnlPdXRzaWRlVGhlV2luZG93LmlkKVxuICAgICAgLy8gdGhlbiwgZmluZCBhbmQgdHJhbnNmb3JtIHByZWNlZGluZyBzdGlja3kgZW50cmllc1xuICAgICAgY29uc3Qgc3RpY2t5VHJhbnNmb3JtZWRFbnRyaWVzID0gc3RpY2t5QW5jZXN0b3JzLm1hcCgoc3RpY2t5R3JvdXBOb2RlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gZW50cnlCeUlkW3N0aWNreUdyb3VwTm9kZS5pZF1cbiAgICAgICAgY29uc3Qgc2l6ZSA9IGVudHJ5LmZpeGVkU2l6ZSA/PyBlbnRyeS5taW5TaXplXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGVudHJ5LmlkLFxuICAgICAgICAgIHNpemUsXG4gICAgICAgICAgb2Zmc2V0OiBlbnRyeU9mZnNldEJ5SWRbZW50cnkuaWRdLnN0YXJ0LFxuICAgICAgICAgIGxldmVsOiBlbnRyeS5sZXZlbCxcbiAgICAgICAgfSBhcyBJVmlydHVhbGl6ZXJSZXN1bHRcbiAgICAgIH0pXG4gICAgICB0cmFuc2Zvcm1lZEVudHJpZXMgPSBbXG4gICAgICAgIC4uLnN0aWNreVRyYW5zZm9ybWVkRW50cmllcyxcbiAgICAgICAge1xuICAgICAgICAgIGlkOiBmaXJzdFN0aWNreUVudHJ5T3V0c2lkZVRoZVdpbmRvdy5pZCxcbiAgICAgICAgICBzaXplOiBmaXJzdFN0aWNreUVudHJ5T3V0c2lkZVRoZVdpbmRvdy5maXhlZFNpemUgPz8gZmlyc3RTdGlja3lFbnRyeU91dHNpZGVUaGVXaW5kb3cubWluU2l6ZSxcbiAgICAgICAgICBvZmZzZXQ6IGVudHJ5T2Zmc2V0QnlJZFtmaXJzdFN0aWNreUVudHJ5T3V0c2lkZVRoZVdpbmRvdy5pZF0uc3RhcnQsXG4gICAgICAgICAgbGV2ZWw6IGZpcnN0U3RpY2t5RW50cnlPdXRzaWRlVGhlV2luZG93LmxldmVsLFxuICAgICAgICB9LFxuICAgICAgICAuLi50cmFuc2Zvcm1lZEVudHJpZXMsXG4gICAgICBdXG4gICAgfVxuXG4gICAgLy8gdGhlbiBmaWd1cmUgb3V0IHRoZSBsZXZlbCBvZiB0aGUgc3RpY2t5IGVudHJpZXMgYmFzZWQgb24gdGhlIGRlcHRoIG9mIHRoZSB0cmVlIG9mIGdyb3VwIG5vZGVzXG4gICAgY29uc3QgcmVsYXRpdmVPZmZzZXRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge31cbiAgICB0cmFuc2Zvcm1lZEVudHJpZXNcbiAgICAgIC5maWx0ZXIoKHRlKSA9PiAhIXRlLmxldmVsKVxuICAgICAgLnNvcnQoKGUxLCBlMikgPT4gKGUyLmxldmVsID8/IDApIC0gKGUxLmxldmVsID8/IDApKVxuICAgICAgLmZvckVhY2goKHRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0aWNreUdyb3VwTm9kZSA9IHN0aWNreUdyb3Vwcy5maW5kTm9kZSh0ZS5pZClcbiAgICAgICAgY29uc3QgbmV4dFNpYmxpbmdHcm91cE5vZGUgPSBzdGlja3lHcm91cE5vZGUuZmluZE5leHRTaWJsaW5nKClcbiAgICAgICAgdGUubWF4T2Zmc2V0ID0gbmV4dFNpYmxpbmdHcm91cE5vZGUgPyBlbnRyeU9mZnNldEJ5SWRbbmV4dFNpYmxpbmdHcm91cE5vZGUuaWRdLnN0YXJ0IC0gdGUuc2l6ZSA6IGxvd2VyQm91bmRTaXplIC0gdGUuc2l6ZVxuICAgICAgICB0ZS5taW5PZmZzZXQgPSB0ZS5vZmZzZXRcbiAgICAgICAgY29uc3QgcGFyZW50R3JvdXBOb2RlID0gU3RpY2t5R3JvdXBOb2RlLmlzSW5zdGFuY2Uoc3RpY2t5R3JvdXBOb2RlLnBhcmVudCkgPyBzdGlja3lHcm91cE5vZGUucGFyZW50IDogbnVsbFxuICAgICAgICBjb25zdCBsZXZlbE9mZnNldCA9IHJlbGF0aXZlT2Zmc2V0c1twYXJlbnRHcm91cE5vZGU/LmlkXSA/PyAwXG4gICAgICAgIHRlLnJlbGF0aXZlT2Zmc2V0ID0gbGV2ZWxPZmZzZXRcbiAgICAgICAgcmVsYXRpdmVPZmZzZXRzW3RlLmlkXSA9IGxldmVsT2Zmc2V0ICsgdGUuc2l6ZVxuICAgICAgfSlcbiAgfVxuICByZXR1cm4gdHJhbnNmb3JtZWRFbnRyaWVzXG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enhanced-dom/virtualizer",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Helpers for item list virtualization in 1d or 2d",
|
|
5
5
|
"repository": "https://github.com/enhanced-dom/virtualizer.git",
|
|
6
6
|
"main": "index.js",
|
|
@@ -9,20 +9,18 @@
|
|
|
9
9
|
"license": "MIT",
|
|
10
10
|
"dependencies": {},
|
|
11
11
|
"devDependencies": {
|
|
12
|
-
"@enhanced-dom/build": "^0.
|
|
13
|
-
"@enhanced-dom/jest": "^0.1
|
|
14
|
-
"@enhanced-dom/lint": "^0.
|
|
15
|
-
"@enhanced-dom/react": "^0.1
|
|
16
|
-
"@enhanced-dom/webpack": "^0.
|
|
17
|
-
"@types/jest": "^
|
|
18
|
-
"@types/react": "^
|
|
19
|
-
"@types/react-dom": "^
|
|
20
|
-
"typescript": "^5.
|
|
21
|
-
"lodash.debounce": "^4.0.8",
|
|
22
|
-
"use-lodash-debounce": "^1.3.0"
|
|
12
|
+
"@enhanced-dom/build": "^0.2.0",
|
|
13
|
+
"@enhanced-dom/jest": "^0.2.1",
|
|
14
|
+
"@enhanced-dom/lint": "^0.3.0",
|
|
15
|
+
"@enhanced-dom/react": "^0.3.1",
|
|
16
|
+
"@enhanced-dom/webpack": "^0.4.0",
|
|
17
|
+
"@types/jest": "^30.0.0",
|
|
18
|
+
"@types/react": "^18.3.31",
|
|
19
|
+
"@types/react-dom": "^18.3.7",
|
|
20
|
+
"typescript": "^5.9.3"
|
|
23
21
|
},
|
|
24
22
|
"engines": {
|
|
25
|
-
"node": ">=
|
|
23
|
+
"node": ">=20",
|
|
26
24
|
"npm": ">=10"
|
|
27
25
|
}
|
|
28
26
|
}
|