socket-function 1.1.48 → 1.2.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.
Files changed (41) hide show
  1. package/dist/SetProcessVariables.ts.cache +9 -0
  2. package/dist/SocketFunction.ts.cache +467 -0
  3. package/hot/dist/HotReloadController.ts.cache +252 -0
  4. package/package.json +1 -1
  5. package/require/dist/RequireController.ts.cache +386 -0
  6. package/require/dist/compileFlags.ts.cache +41 -0
  7. package/require/dist/extMapper.ts.cache +368 -0
  8. package/require/dist/require.ts.cache +676 -0
  9. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
  10. package/src/dist/CallFactory.ts.cache +930 -0
  11. package/src/dist/Zip.ts.cache +156 -0
  12. package/src/dist/batching.ts.cache +377 -0
  13. package/src/dist/bits.ts.cache +121 -0
  14. package/src/dist/buffers.ts.cache +76 -0
  15. package/src/dist/caching.ts.cache +302 -0
  16. package/src/dist/callHTTPHandler.ts.cache +264 -0
  17. package/src/dist/callManager.ts.cache +159 -0
  18. package/src/dist/certStore.ts.cache +59 -0
  19. package/src/dist/createSingleton.ts.cache +62 -0
  20. package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
  21. package/src/dist/forwardPort.ts.cache +222 -0
  22. package/src/dist/https.ts.cache +141 -0
  23. package/src/dist/misc.ts.cache +499 -0
  24. package/src/dist/nodeCache.ts.cache +136 -0
  25. package/src/dist/nodeProxy.ts.cache +57 -0
  26. package/src/dist/protocolNegotiation.ts.cache +101 -0
  27. package/src/dist/tlsParsing.ts.cache +85 -0
  28. package/src/dist/types.ts.cache +9 -0
  29. package/src/dist/webSocketServer.ts.cache +365 -0
  30. package/src/dist/websocketFactory.ts.cache +53 -0
  31. package/src/formatting/dist/colors.ts.cache +98 -0
  32. package/src/formatting/dist/format.ts.cache +396 -0
  33. package/src/formatting/dist/logColors.ts.cache +28 -0
  34. package/src/lz4/dist/LZ4.ts.cache +53 -0
  35. package/src/profiling/dist/getOwnTime.ts.cache +100 -0
  36. package/src/profiling/dist/measure.ts.cache +338 -0
  37. package/src/profiling/dist/stats.ts.cache +202 -0
  38. package/src/profiling/dist/statsFormat.ts.cache +45 -0
  39. package/src/profiling/getOwnTime.ts +7 -1
  40. package/src/profiling/measure.ts +25 -16
  41. package/time/dist/trueTimeShim.ts.cache +656 -0
@@ -0,0 +1,121 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.getTimeUnique = exports.getBufferFraction = exports.getBufferInt = exports.getShortNumber = exports.xor64BitsSafe = exports.setLowHighUint32Safe = exports.setLowHighUint32 = exports.getLowUint32 = exports.getHighUint32 = exports.addEpsilons = exports.minusEpsilon = void 0;
4
+ /** Subtracts the smallest possible value from a number (a double). This makes it possible to convert an exclusive range end
5
+ * to an inclusive range end, which is sometimes required (as in, < x is the same as <= minusEpsilon(x)).
6
+ */
7
+ function minusEpsilon(value) {
8
+ let high = getHighUint32(value);
9
+ let low = getLowUint32(value);
10
+ if (low === 0) {
11
+ low = 2 ** 32 - 1;
12
+ high--;
13
+ }
14
+ else {
15
+ low--;
16
+ }
17
+ return setLowHighUint32(low, high);
18
+ }
19
+ exports.minusEpsilon = minusEpsilon;
20
+ const maxUint32 = 2 ** 32 - 1;
21
+ function addEpsilons(value, count) {
22
+ let high = getHighUint32(value);
23
+ let low = getLowUint32(value);
24
+ low += count;
25
+ if (low < 0) {
26
+ low += maxUint32;
27
+ high++;
28
+ }
29
+ else if (low > maxUint32) {
30
+ low -= maxUint32;
31
+ high--;
32
+ }
33
+ return setLowHighUint32(low, high);
34
+ }
35
+ exports.addEpsilons = addEpsilons;
36
+ let conversionBuffer = new Float64Array(1);
37
+ let conversionUint8Buffer = new Uint8Array(conversionBuffer.buffer);
38
+ let conversionUint32Buffer = new Uint32Array(conversionBuffer.buffer);
39
+ function getHighUint32(num) {
40
+ conversionBuffer[0] = num;
41
+ return conversionUint32Buffer[1];
42
+ }
43
+ exports.getHighUint32 = getHighUint32;
44
+ function getLowUint32(num) {
45
+ conversionBuffer[0] = num;
46
+ return conversionUint32Buffer[0];
47
+ }
48
+ exports.getLowUint32 = getLowUint32;
49
+ /** IMPORTANT! Beware of comparisons with 64 bit numbers. getFloat64_fromBytes(4294136438, 168) !== getFloat64_fromBytes(4294136438, 168).
50
+ * USE is64BitEqual instead, OR, ensure the 2 highest bits are always 0.
51
+ */
52
+ function setLowHighUint32(low, high) {
53
+ conversionUint32Buffer[0] = low;
54
+ conversionUint32Buffer[1] = high;
55
+ return conversionBuffer[0];
56
+ }
57
+ exports.setLowHighUint32 = setLowHighUint32;
58
+ /** Adds protection against NaN values, changing the result if it would be NaN. This is because NaN values will compare to be not equal even if they are equal in certain cases, and in other cases, they'll always be equal, even if their bits are not equal.
59
+ - This means this is not a reversible operation. However, in a lot of cases, that doesn't matter.
60
+ */
61
+ function setLowHighUint32Safe(low, high) {
62
+ conversionUint32Buffer[0] = low;
63
+ // Prevent NaN by not setting all the exponent bits to 1
64
+ conversionUint32Buffer[1] = high & 0xBFFFFFFF;
65
+ return conversionBuffer[0];
66
+ }
67
+ exports.setLowHighUint32Safe = setLowHighUint32Safe;
68
+ // NOTE: Not reversible, see setLowHighUint32Safe
69
+ function xor64BitsSafe(a, b) {
70
+ let high = getHighUint32(a);
71
+ let low = getLowUint32(a);
72
+ let high2 = getHighUint32(b);
73
+ let low2 = getLowUint32(b);
74
+ return setLowHighUint32Safe(low ^ low2, high ^ high2);
75
+ }
76
+ exports.xor64BitsSafe = xor64BitsSafe;
77
+ // Gets bits that can be stored in a number. Specifically, the first 62 bits,
78
+ // as 64 bits will not compare correctly when treated as a double.
79
+ function getShortNumber(buffer) {
80
+ let high = buffer.readUInt32BE(0) & 0x3FFFFFFF;
81
+ let low = buffer.readUInt32BE(4);
82
+ return setLowHighUint32(low, high);
83
+ }
84
+ exports.getShortNumber = getShortNumber;
85
+ /* Returns a number between 0 and 2**48 */
86
+ function getBufferInt(buffer) {
87
+ let num = 0;
88
+ for (let i = 0; i < Math.min(buffer.length, 6); i++) {
89
+ num = num * 256 + buffer[i];
90
+ }
91
+ return num;
92
+ }
93
+ exports.getBufferInt = getBufferInt;
94
+ const intMax = 2 ** 48;
95
+ /** Returns a number between 0 (inclusive) and 1 (exclusive) */
96
+ function getBufferFraction(buffer) {
97
+ let int = getBufferInt(buffer);
98
+ return int / intMax;
99
+ }
100
+ exports.getBufferFraction = getBufferFraction;
101
+ /*
102
+ export function numberToBase64(num: number): string {
103
+ conversionBuffer[0] = num;
104
+ return Buffer.from(conversionBuffer.buffer).toString("base64");
105
+ }
106
+ export function numberFromBase64(base64: string) {
107
+ return new Float64Array(Buffer.from(base64, "base64"))[0];
108
+ }
109
+ */
110
+ let prevTime = 0;
111
+ function getTimeUnique() {
112
+ let time = Date.now();
113
+ if (time <= prevTime) {
114
+ time = addEpsilons(prevTime, 1);
115
+ }
116
+ prevTime = time;
117
+ return time;
118
+ }
119
+ exports.getTimeUnique = getTimeUnique;
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYml0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJpdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0E7O0dBRUc7QUFDSCxTQUFnQixZQUFZLENBQUMsS0FBYTtJQUN0QyxJQUFJLElBQUksR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEMsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlCLElBQUksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ1osR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksRUFBRSxDQUFDO0lBQ1gsQ0FBQztTQUFNLENBQUM7UUFDSixHQUFHLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFRCxPQUFPLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBWkQsb0NBWUM7QUFDRCxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztBQUM5QixTQUFnQixXQUFXLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDcEQsSUFBSSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hDLElBQUksR0FBRyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU5QixHQUFHLElBQUksS0FBSyxDQUFDO0lBQ2IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDVixHQUFHLElBQUksU0FBUyxDQUFDO1FBQ2pCLElBQUksRUFBRSxDQUFDO0lBQ1gsQ0FBQztTQUFNLElBQUksR0FBRyxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLEdBQUcsSUFBSSxTQUFTLENBQUM7UUFDakIsSUFBSSxFQUFFLENBQUM7SUFDWCxDQUFDO0lBRUQsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQWRELGtDQWND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QyxNQUFjO0lBQzVDLElBQUksR0FBRyxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUM7QUFDeEIsQ0FBQztBQUhELDhDQUdDO0FBRUQ7Ozs7Ozs7O0VBUUU7QUFHRixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDakIsU0FBZ0IsYUFBYTtJQUN6QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdEIsSUFBSSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7UUFDbkIsSUFBSSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUNELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEIsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQztBQVBELHNDQU9DIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKiogU3VidHJhY3RzIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSB2YWx1ZSBmcm9tIGEgbnVtYmVyIChhIGRvdWJsZSkuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gY29udmVydCBhbiBleGNsdXNpdmUgcmFuZ2UgZW5kXG4gKiAgICAgIHRvIGFuIGluY2x1c2l2ZSByYW5nZSBlbmQsIHdoaWNoIGlzIHNvbWV0aW1lcyByZXF1aXJlZCAoYXMgaW4sIDwgeCBpcyB0aGUgc2FtZSBhcyA8PSBtaW51c0Vwc2lsb24oeCkpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWludXNFcHNpbG9uKHZhbHVlOiBudW1iZXIpIHtcbiAgICBsZXQgaGlnaCA9IGdldEhpZ2hVaW50MzIodmFsdWUpO1xuICAgIGxldCBsb3cgPSBnZXRMb3dVaW50MzIodmFsdWUpO1xuXG4gICAgaWYgKGxvdyA9PT0gMCkge1xuICAgICAgICBsb3cgPSAyICoqIDMyIC0gMTtcbiAgICAgICAgaGlnaC0tO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxvdy0tO1xuICAgIH1cblxuICAgIHJldHVybiBzZXRMb3dIaWdoVWludDMyKGxvdywgaGlnaCk7XG59XG5jb25zdCBtYXhVaW50MzIgPSAyICoqIDMyIC0gMTtcbmV4cG9ydCBmdW5jdGlvbiBhZGRFcHNpbG9ucyh2YWx1ZTogbnVtYmVyLCBjb3VudDogbnVtYmVyKSB7XG4gICAgbGV0IGhpZ2ggPSBnZXRIaWdoVWludDMyKHZhbHVlKTtcbiAgICBsZXQgbG93ID0gZ2V0TG93VWludDMyKHZhbHVlKTtcblxuICAgIGxvdyArPSBjb3VudDtcbiAgICBpZiAobG93IDwgMCkge1xuICAgICAgICBsb3cgKz0gbWF4VWludDMyO1xuICAgICAgICBoaWdoKys7XG4gICAgfSBlbHNlIGlmIChsb3cgPiBtYXhVaW50MzIpIHtcbiAgICAgICAgbG93IC09IG1heFVpbnQzMjtcbiAgICAgICAgaGlnaC0tO1xuICAgIH1cblxuICAgIHJldHVybiBzZXRMb3dIaWdoVWludDMyKGxvdywgaGlnaCk7XG59XG5cbmxldCBjb252ZXJzaW9uQnVmZmVyID0gbmV3IEZsb2F0NjRBcnJheSgxKTtcbmxldCBjb252ZXJzaW9uVWludDhCdWZmZXIgPSBuZXcgVWludDhBcnJheShjb252ZXJzaW9uQnVmZmVyLmJ1ZmZlcik7XG5sZXQgY29udmVyc2lvblVpbnQzMkJ1ZmZlciA9IG5ldyBVaW50MzJBcnJheShjb252ZXJzaW9uQnVmZmVyLmJ1ZmZlcik7XG5leHBvcnQgZnVuY3Rpb24gZ2V0SGlnaFVpbnQzMihudW06IG51bWJlcik6IG51bWJlciB7XG4gICAgY29udmVyc2lvbkJ1ZmZlclswXSA9IG51bTtcbiAgICByZXR1cm4gY29udmVyc2lvblVpbnQzMkJ1ZmZlclsxXTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb3dVaW50MzIobnVtOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnZlcnNpb25CdWZmZXJbMF0gPSBudW07XG4gICAgcmV0dXJuIGNvbnZlcnNpb25VaW50MzJCdWZmZXJbMF07XG59XG5cbi8qKiBJTVBPUlRBTlQhIEJld2FyZSBvZiBjb21wYXJpc29ucyB3aXRoIDY0IGJpdCBudW1iZXJzLiBnZXRGbG9hdDY0X2Zyb21CeXRlcyg0Mjk0MTM2NDM4LCAxNjgpICE9PSBnZXRGbG9hdDY0X2Zyb21CeXRlcyg0Mjk0MTM2NDM4LCAxNjgpLlxuICogICAgICBVU0UgaXM2NEJpdEVxdWFsIGluc3RlYWQsIE9SLCBlbnN1cmUgdGhlIDIgaGlnaGVzdCBiaXRzIGFyZSBhbHdheXMgMC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldExvd0hpZ2hVaW50MzIobG93OiBudW1iZXIsIGhpZ2g6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29udmVyc2lvblVpbnQzMkJ1ZmZlclswXSA9IGxvdztcbiAgICBjb252ZXJzaW9uVWludDMyQnVmZmVyWzFdID0gaGlnaDtcbiAgICByZXR1cm4gY29udmVyc2lvbkJ1ZmZlclswXTtcbn1cblxuLyoqIEFkZHMgcHJvdGVjdGlvbiBhZ2FpbnN0IE5hTiB2YWx1ZXMsIGNoYW5naW5nIHRoZSByZXN1bHQgaWYgaXQgd291bGQgYmUgTmFOLiBUaGlzIGlzIGJlY2F1c2UgTmFOIHZhbHVlcyB3aWxsIGNvbXBhcmUgdG8gYmUgbm90IGVxdWFsIGV2ZW4gaWYgdGhleSBhcmUgZXF1YWwgaW4gY2VydGFpbiBjYXNlcywgYW5kIGluIG90aGVyIGNhc2VzLCB0aGV5J2xsIGFsd2F5cyBiZSBlcXVhbCwgZXZlbiBpZiB0aGVpciBiaXRzIGFyZSBub3QgZXF1YWwuXG4gICAgLSBUaGlzIG1lYW5zIHRoaXMgaXMgbm90IGEgcmV2ZXJzaWJsZSBvcGVyYXRpb24uIEhvd2V2ZXIsIGluIGEgbG90IG9mIGNhc2VzLCB0aGF0IGRvZXNuJ3QgbWF0dGVyLiBcbiovXG5leHBvcnQgZnVuY3Rpb24gc2V0TG93SGlnaFVpbnQzMlNhZmUobG93OiBudW1iZXIsIGhpZ2g6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29udmVyc2lvblVpbnQzMkJ1ZmZlclswXSA9IGxvdztcbiAgICAvLyBQcmV2ZW50IE5hTiBieSBub3Qgc2V0dGluZyBhbGwgdGhlIGV4cG9uZW50IGJpdHMgdG8gMVxuICAgIGNvbnZlcnNpb25VaW50MzJCdWZmZXJbMV0gPSBoaWdoICYgMHhCRkZGRkZGRjtcbiAgICByZXR1cm4gY29udmVyc2lvbkJ1ZmZlclswXTtcbn1cblxuLy8gTk9URTogTm90IHJldmVyc2libGUsIHNlZSBzZXRMb3dIaWdoVWludDMyU2FmZVxuZXhwb3J0IGZ1bmN0aW9uIHhvcjY0Qml0c1NhZmUoYTogbnVtYmVyLCBiOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCBoaWdoID0gZ2V0SGlnaFVpbnQzMihhKTtcbiAgICBsZXQgbG93ID0gZ2V0TG93VWludDMyKGEpO1xuICAgIGxldCBoaWdoMiA9IGdldEhpZ2hVaW50MzIoYik7XG4gICAgbGV0IGxvdzIgPSBnZXRMb3dVaW50MzIoYik7XG4gICAgcmV0dXJuIHNldExvd0hpZ2hVaW50MzJTYWZlKGxvdyBeIGxvdzIsIGhpZ2ggXiBoaWdoMik7XG59XG5cbi8vIEdldHMgYml0cyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gYSBudW1iZXIuIFNwZWNpZmljYWxseSwgdGhlIGZpcnN0IDYyIGJpdHMsXG4vLyAgYXMgNjQgYml0cyB3aWxsIG5vdCBjb21wYXJlIGNvcnJlY3RseSB3aGVuIHRyZWF0ZWQgYXMgYSBkb3VibGUuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2hvcnROdW1iZXIoYnVmZmVyOiBCdWZmZXIpOiBudW1iZXIge1xuICAgIGxldCBoaWdoID0gYnVmZmVyLnJlYWRVSW50MzJCRSgwKSAmIDB4M0ZGRkZGRkY7XG4gICAgbGV0IGxvdyA9IGJ1ZmZlci5yZWFkVUludDMyQkUoNCk7XG4gICAgcmV0dXJuIHNldExvd0hpZ2hVaW50MzIobG93LCBoaWdoKTtcbn1cbi8qIFJldHVybnMgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAyKio0OCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1ZmZlckludChidWZmZXI6IEJ1ZmZlcik6IG51bWJlciB7XG4gICAgbGV0IG51bSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1pbihidWZmZXIubGVuZ3RoLCA2KTsgaSsrKSB7XG4gICAgICAgIG51bSA9IG51bSAqIDI1NiArIGJ1ZmZlcltpXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbn1cbmNvbnN0IGludE1heCA9IDIgKiogNDg7XG4vKiogUmV0dXJucyBhIG51bWJlciBiZXR3ZWVuIDAgKGluY2x1c2l2ZSkgYW5kIDEgKGV4Y2x1c2l2ZSkgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRCdWZmZXJGcmFjdGlvbihidWZmZXI6IEJ1ZmZlcik6IG51bWJlciB7XG4gICAgbGV0IGludCA9IGdldEJ1ZmZlckludChidWZmZXIpO1xuICAgIHJldHVybiBpbnQgLyBpbnRNYXg7XG59XG5cbi8qXG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9CYXNlNjQobnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGNvbnZlcnNpb25CdWZmZXJbMF0gPSBudW07XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGNvbnZlcnNpb25CdWZmZXIuYnVmZmVyKS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJGcm9tQmFzZTY0KGJhc2U2NDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBGbG9hdDY0QXJyYXkoQnVmZmVyLmZyb20oYmFzZTY0LCBcImJhc2U2NFwiKSlbMF07XG59XG4qL1xuXG5cbmxldCBwcmV2VGltZSA9IDA7XG5leHBvcnQgZnVuY3Rpb24gZ2V0VGltZVVuaXF1ZSgpIHtcbiAgICBsZXQgdGltZSA9IERhdGUubm93KCk7XG4gICAgaWYgKHRpbWUgPD0gcHJldlRpbWUpIHtcbiAgICAgICAgdGltZSA9IGFkZEVwc2lsb25zKHByZXZUaW1lLCAxKTtcbiAgICB9XG4gICAgcHJldlRpbWUgPSB0aW1lO1xuICAgIHJldHVybiB0aW1lO1xufSJdfQ==
121
+ /* _JS_SOURCE_HASH = "6fd551828fef1e8f457b997ea04889957872cb51682949d9912465695bb77ef6"; */
@@ -0,0 +1,76 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.asFloat64MaybeCopy = exports.asInt32 = exports.asUint32 = exports.asFloat32 = exports.asFloat64 = exports.asBuffer = exports.cloneBuffer = void 0;
4
+ const types_1 = require("./types");
5
+ function cloneBuffer(data) {
6
+ let newBuffer = Buffer.alloc(data.length);
7
+ data.copy(newBuffer);
8
+ return newBuffer;
9
+ }
10
+ exports.cloneBuffer = cloneBuffer;
11
+ function asBuffer(data) {
12
+ if (!data)
13
+ return data;
14
+ if (data instanceof Buffer)
15
+ return data;
16
+ if (!(0, types_1.canHaveChildren)(data))
17
+ return data;
18
+ if (!("buffer" in data) || !("byteOffset" in data) || !("byteLength" in data)) {
19
+ return Buffer.from(data);
20
+ }
21
+ let result = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
22
+ return result;
23
+ }
24
+ exports.asBuffer = asBuffer;
25
+ function asFloat64(data) {
26
+ if (data.length % 8 !== 0) {
27
+ throw new Error(`Data is not 8 count aligned, received length of ${data.length}`);
28
+ }
29
+ if (data.byteOffset % 8 !== 0) {
30
+ throw new Error(`Data is not 8 byte aligned, received offset of ${data.byteOffset}`);
31
+ }
32
+ return new Float64Array(data.buffer, data.byteOffset, Math.floor(data.length / 8));
33
+ }
34
+ exports.asFloat64 = asFloat64;
35
+ function asFloat32(data) {
36
+ if (data.length % 4 !== 0) {
37
+ throw new Error(`Data is not 4 byte aligned, received length of ${data.length}`);
38
+ }
39
+ if (data.byteOffset % 4 !== 0) {
40
+ throw new Error(`Data is not 4 byte aligned, received offset of ${data.byteOffset}`);
41
+ }
42
+ return new Float32Array(data.buffer, data.byteOffset, Math.floor(data.length / 4));
43
+ }
44
+ exports.asFloat32 = asFloat32;
45
+ function asUint32(data) {
46
+ if (data.length % 4 !== 0) {
47
+ throw new Error(`Data is not 4 byte aligned, received length of ${data.length}`);
48
+ }
49
+ if (data.byteOffset % 4 !== 0) {
50
+ throw new Error(`Data is not 4 byte aligned, received offset of ${data.byteOffset}`);
51
+ }
52
+ return new Uint32Array(data.buffer, data.byteOffset, Math.floor(data.length / 4));
53
+ }
54
+ exports.asUint32 = asUint32;
55
+ function asInt32(data) {
56
+ if (data.length % 4 !== 0) {
57
+ throw new Error(`Data is not 4 byte aligned, received length of ${data.length}`);
58
+ }
59
+ if (data.byteOffset % 4 !== 0) {
60
+ throw new Error(`Data is not 4 byte aligned, received offset of ${data.byteOffset}`);
61
+ }
62
+ return new Int32Array(data.buffer, data.byteOffset, Math.floor(data.length / 4));
63
+ }
64
+ exports.asInt32 = asInt32;
65
+ function asFloat64MaybeCopy(data) {
66
+ if (data.length % 8 !== 0) {
67
+ throw new Error(`Data is not 8 count aligned, received length of ${data.length}`);
68
+ }
69
+ if (data.byteOffset % 8 !== 0) {
70
+ return asFloat64(cloneBuffer(data));
71
+ }
72
+ return new Float64Array(data.buffer, data.byteOffset, Math.floor(data.length / 8));
73
+ }
74
+ exports.asFloat64MaybeCopy = asFloat64MaybeCopy;
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImJ1ZmZlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQTBDO0FBSzFDLFNBQWdCLFdBQVcsQ0FBQyxJQUFZO0lBQ3BDLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDckIsT0FBTyxTQUFTLENBQUM7QUFDckIsQ0FBQztBQUpELGtDQUlDO0FBR0QsU0FBZ0IsUUFBUSxDQUFDLElBQWdCO0lBQ3JDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDdkIsSUFBSSxJQUFJLFlBQVksTUFBTTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3hDLElBQUksQ0FBQyxJQUFBLHVCQUFlLEVBQUMsSUFBSSxDQUFDO1FBQUUsT0FBTyxJQUFXLENBQUM7SUFDL0MsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzVFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBRSxJQUFZLENBQUMsTUFBTSxFQUFHLElBQVksQ0FBQyxVQUFVLEVBQUcsSUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25HLE9BQU8sTUFBTSxDQUFDO0FBQ2xCLENBQUM7QUFURCw0QkFTQztBQUNELFNBQWdCLFNBQVMsQ0FBQyxJQUFZO0lBQ2xDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxt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VSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQVJELGdEQVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FuSGF2ZUNoaWxkcmVuIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgQXJyYXlCdWZmZXJWaWV3VHlwZXMgPSBVaW50OEFycmF5IHwgSW50OEFycmF5IHwgVWludDE2QXJyYXkgfCBJbnQxNkFycmF5IHwgVWludDMyQXJyYXkgfCBJbnQzMkFycmF5IHwgQmlnVWludDY0QXJyYXkgfCBCaWdJbnQ2NEFycmF5IHwgRmxvYXQ2NEFycmF5IHwgRmxvYXQzMkFycmF5IHwgVWludDhDbGFtcGVkQXJyYXk7XG5leHBvcnQgdHlwZSBCdWZmZXJUeXBlID0gQXJyYXlCdWZmZXIgfCBTaGFyZWRBcnJheUJ1ZmZlciB8IEFycmF5QnVmZmVyVmlld1R5cGVzO1xuXG5leHBvcnQgZnVuY3Rpb24gY2xvbmVCdWZmZXIoZGF0YTogQnVmZmVyKTogQnVmZmVyIHtcbiAgICBsZXQgbmV3QnVmZmVyID0gQnVmZmVyLmFsbG9jKGRhdGEubGVuZ3RoKTtcbiAgICBkYXRhLmNvcHkobmV3QnVmZmVyKTtcbiAgICByZXR1cm4gbmV3QnVmZmVyO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBhc0J1ZmZlcihkYXRhOiBCdWZmZXJUeXBlKTogQnVmZmVyIHtcbiAgICBpZiAoIWRhdGEpIHJldHVybiBkYXRhO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgQnVmZmVyKSByZXR1cm4gZGF0YTtcbiAgICBpZiAoIWNhbkhhdmVDaGlsZHJlbihkYXRhKSkgcmV0dXJuIGRhdGEgYXMgYW55O1xuICAgIGlmICghKFwiYnVmZmVyXCIgaW4gZGF0YSkgfHwgIShcImJ5dGVPZmZzZXRcIiBpbiBkYXRhKSB8fCAhKFwiYnl0ZUxlbmd0aFwiIGluIGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBCdWZmZXIuZnJvbShkYXRhKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IEJ1ZmZlci5mcm9tKChkYXRhIGFzIGFueSkuYnVmZmVyLCAoZGF0YSBhcyBhbnkpLmJ5dGVPZmZzZXQsIChkYXRhIGFzIGFueSkuYnl0ZUxlbmd0aCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc0Zsb2F0NjQoZGF0YTogQnVmZmVyKTogRmxvYXQ2NEFycmF5IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggJSA4ICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBpcyBub3QgOCBjb3VudCBhbGlnbmVkLCByZWNlaXZlZCBsZW5ndGggb2YgJHtkYXRhLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuYnl0ZU9mZnNldCAlIDggIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhIGlzIG5vdCA4IGJ5dGUgYWxpZ25lZCwgcmVjZWl2ZWQgb2Zmc2V0IG9mICR7ZGF0YS5ieXRlT2Zmc2V0fWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZsb2F0NjRBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBNYXRoLmZsb29yKGRhdGEubGVuZ3RoIC8gOCkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFzRmxvYXQzMihkYXRhOiBCdWZmZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIGlmIChkYXRhLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhIGlzIG5vdCA0IGJ5dGUgYWxpZ25lZCwgcmVjZWl2ZWQgbGVuZ3RoIG9mICR7ZGF0YS5sZW5ndGh9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmJ5dGVPZmZzZXQgJSA0ICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBpcyBub3QgNCBieXRlIGFsaWduZWQsIHJlY2VpdmVkIG9mZnNldCBvZiAke2RhdGEuYnl0ZU9mZnNldH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgTWF0aC5mbG9vcihkYXRhLmxlbmd0aCAvIDQpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhc1VpbnQzMihkYXRhOiBCdWZmZXIpOiBVaW50MzJBcnJheSB7XG4gICAgaWYgKGRhdGEubGVuZ3RoICUgNCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLCByZWNlaXZlZCBsZW5ndGggb2YgJHtkYXRhLmxlbmd0aH1gKTtcbiAgICB9XG4gICAgaWYgKGRhdGEuYnl0ZU9mZnNldCAlIDQgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhIGlzIG5vdCA0IGJ5dGUgYWxpZ25lZCwgcmVjZWl2ZWQgb2Zmc2V0IG9mICR7ZGF0YS5ieXRlT2Zmc2V0fWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KGRhdGEuYnVmZmVyLCBkYXRhLmJ5dGVPZmZzZXQsIE1hdGguZmxvb3IoZGF0YS5sZW5ndGggLyA0KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYXNJbnQzMihkYXRhOiBCdWZmZXIpOiBJbnQzMkFycmF5IHtcbiAgICBpZiAoZGF0YS5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBpcyBub3QgNCBieXRlIGFsaWduZWQsIHJlY2VpdmVkIGxlbmd0aCBvZiAke2RhdGEubGVuZ3RofWApO1xuICAgIH1cbiAgICBpZiAoZGF0YS5ieXRlT2Zmc2V0ICUgNCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgaXMgbm90IDQgYnl0ZSBhbGlnbmVkLCByZWNlaXZlZCBvZmZzZXQgb2YgJHtkYXRhLmJ5dGVPZmZzZXR9YCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW50MzJBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBNYXRoLmZsb29yKGRhdGEubGVuZ3RoIC8gNCkpO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBhc0Zsb2F0NjRNYXliZUNvcHkoZGF0YTogQnVmZmVyKSB7XG4gICAgaWYgKGRhdGEubGVuZ3RoICUgOCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERhdGEgaXMgbm90IDggY291bnQgYWxpZ25lZCwgcmVjZWl2ZWQgbGVuZ3RoIG9mICR7ZGF0YS5sZW5ndGh9YCk7XG4gICAgfVxuICAgIGlmIChkYXRhLmJ5dGVPZmZzZXQgJSA4ICE9PSAwKSB7XG4gICAgICAgIHJldHVybiBhc0Zsb2F0NjQoY2xvbmVCdWZmZXIoZGF0YSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZsb2F0NjRBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBNYXRoLmZsb29yKGRhdGEubGVuZ3RoIC8gOCkpO1xufVxuIl19
76
+ /* _JS_SOURCE_HASH = "5d67435fc79be050d69cf9b1ce1c39b5d7911a52ee00e73af54477e9fe10f566"; */
@@ -0,0 +1,302 @@
1
+ "use strict"; var console = (function shimConsole() { let baseConsole = globalThis.console; if (typeof window !== "undefined") return baseConsole; let name = __filename.replaceAll("\\", "/").split("/").pop(); let dirName = __dirname.replaceAll("\\", "/").split("/").pop(); let context = { __FILE__: __filename, __DIR__: __dirname, __NAME__: name, __DIRNAME__: dirName }; let newConsole = { ...baseConsole }; for (let shim of ["log", "info", "warn", "error"]) { newConsole[shim] = (...args) => { args.push(context); baseConsole[shim](...args); }; } newConsole.__context = context; return newConsole; })(); "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.externalCache = exports.cacheShallowConfigArgEqual = exports.cacheJSONArgsEqual = exports.cacheArgsEqual = exports.cacheArrayEqual = exports.cacheList = exports.cacheWeak = exports.cacheLimited = exports.cache = exports.cacheEmptyArray = exports.lazy = void 0;
4
+ const misc_1 = require("./misc");
5
+ const types_1 = require("./types");
6
+ function lazy(factory) {
7
+ let value = undefined;
8
+ function get() {
9
+ if (!value) {
10
+ value = { value: factory() };
11
+ }
12
+ return value.value;
13
+ }
14
+ ;
15
+ get.reset = () => {
16
+ value = undefined;
17
+ };
18
+ get.set = (newValue) => {
19
+ value = { value: newValue };
20
+ };
21
+ return get;
22
+ }
23
+ exports.lazy = lazy;
24
+ // NOTE: Empty arrays are so common, that it is useful to represent them as the same
25
+ // emtpy array, to increase cache hit rates.
26
+ const emptyArray = [];
27
+ function cacheEmptyArray(array) {
28
+ if (array.length === 0)
29
+ return emptyArray;
30
+ return array;
31
+ }
32
+ exports.cacheEmptyArray = cacheEmptyArray;
33
+ function cache(getValue) {
34
+ let startingCalculating = new Set();
35
+ let values = new Map();
36
+ function cache(input, ...untracked) {
37
+ let key = input;
38
+ if (values.has(key)) {
39
+ return values.get(key);
40
+ }
41
+ if (startingCalculating.has(key)) {
42
+ // TODO: Fix the types here, by throwing, and then for the cases
43
+ // that don't throw, make our output type include undefined
44
+ return undefined;
45
+ }
46
+ startingCalculating.add(key);
47
+ let value = getValue(input, ...untracked);
48
+ values.set(key, value);
49
+ return value;
50
+ }
51
+ cache.clear = (key) => {
52
+ values.delete(key);
53
+ startingCalculating.delete(key);
54
+ };
55
+ cache.forceSet = (key, value) => {
56
+ values.set(key, value);
57
+ startingCalculating.add(key);
58
+ };
59
+ cache.getAllKeys = () => {
60
+ return [...values.keys()];
61
+ };
62
+ cache.get = (key) => {
63
+ return values.get(key);
64
+ };
65
+ cache.clearAll = () => {
66
+ values.clear();
67
+ startingCalculating.clear();
68
+ };
69
+ return cache;
70
+ }
71
+ exports.cache = cache;
72
+ /** Makes a cache that limits the number of entries, allowing you to put arbitrary data in it
73
+ * without worrying about leaking memory
74
+ */
75
+ function cacheLimited(
76
+ // NOTE: We can't calculate what limit should be based on comparing the evaluation time
77
+ // and the time to compare against the values. Because, even if finding a match takes far longer than
78
+ // calculating, keeping a consistent output can save (a considerable amount of) time in downstream caches.
79
+ maxCount, getValue) {
80
+ let startingCalculating = new Set();
81
+ let values = new Map();
82
+ function get(input) {
83
+ let key = input;
84
+ if (values.has(key)) {
85
+ return values.get(key);
86
+ }
87
+ if (startingCalculating.has(key)) {
88
+ throw new Error(`Cyclic access in cache`);
89
+ }
90
+ startingCalculating.add(key);
91
+ // Clear when it gets too big. This is kind of like a worse
92
+ // least recently used cache, because entries that are accessed
93
+ // often will quickly get put back in. This is effective as long
94
+ // as accesses take similar amounts of time. If there is a very slow
95
+ // and very commonly accessed value, it could be evicted by many very
96
+ // fast accesses, which would be unfortunate.
97
+ if (values.size >= maxCount) {
98
+ values.clear();
99
+ startingCalculating.clear();
100
+ }
101
+ let value = getValue(input);
102
+ values.set(key, value);
103
+ return value;
104
+ }
105
+ get["forceSet"] = (key, value) => {
106
+ values.set(key, value);
107
+ startingCalculating.add(key);
108
+ };
109
+ get["clearKey"] = (key) => {
110
+ values.delete(key);
111
+ startingCalculating.delete(key);
112
+ };
113
+ get["clear"] = () => {
114
+ values.clear();
115
+ startingCalculating.clear();
116
+ };
117
+ return get;
118
+ }
119
+ exports.cacheLimited = cacheLimited;
120
+ function cacheWeak(getValue) {
121
+ let state = {
122
+ startingCalculating: new WeakSet(),
123
+ values: new WeakMap(),
124
+ };
125
+ return (input) => {
126
+ let key = input;
127
+ if (state.values.has(key)) {
128
+ return state.values.get(key);
129
+ }
130
+ if (state.startingCalculating.has(key)) {
131
+ throw new Error(`Cyclic access in cacheWeak`);
132
+ }
133
+ state.startingCalculating.add(key);
134
+ let value = getValue(input);
135
+ state.values.set(key, value);
136
+ return value;
137
+ };
138
+ }
139
+ exports.cacheWeak = cacheWeak;
140
+ // A list cache, which... maybe faster than a Map?
141
+ function cacheList(getLength, getValue) {
142
+ let state = {
143
+ cache: [],
144
+ length: undefined,
145
+ getLength,
146
+ };
147
+ function get(i) {
148
+ let cache = state.cache;
149
+ let length = state.length;
150
+ if (length === undefined) {
151
+ length = state.length = state.getLength();
152
+ }
153
+ if (i < 0 || i >= length) {
154
+ throw new Error(`Index out of bounds`);
155
+ }
156
+ if (!(i in cache)) {
157
+ cache[i] = getValue(i);
158
+ }
159
+ return cache[i];
160
+ }
161
+ ;
162
+ return get;
163
+ }
164
+ exports.cacheList = cacheList;
165
+ function cacheArrayEqualCleanup(state) {
166
+ state.cache = [];
167
+ }
168
+ /** A cache half way between caching based on === and caching based on hash. Caches
169
+ * based on arrayEqual, which does === on all values in an array. Requires localized
170
+ * caching (as the comparisons don't scale with many candidates, unlike hashing),
171
+ * however works with non trival transformations (ex, resolving many persisted overrides
172
+ * to get a value), unlike cache().
173
+ * Also, limits itself, more of a performance optimization than memory optimization, as it scales
174
+ * very poorly with the number of candidates.
175
+ *
176
+ * TIMING: About 6us with limit = 100, array size = 294, and the cache being full.
177
+ */
178
+ function cacheArrayEqual(map, limit = 10) {
179
+ let state = { cache: [] };
180
+ function isMatch(lhs, rhs) {
181
+ if (lhs === rhs) {
182
+ return true;
183
+ }
184
+ if (lhs === undefined || rhs === undefined) {
185
+ return false;
186
+ }
187
+ if ((0, misc_1.arrayEqual)(lhs, rhs)) {
188
+ return true;
189
+ }
190
+ return false;
191
+ }
192
+ return Object.assign((input) => {
193
+ let cache = state.cache;
194
+ for (let obj of cache) {
195
+ if (isMatch(obj.input, input)) {
196
+ return obj.output;
197
+ }
198
+ }
199
+ let output = map(input);
200
+ cache.unshift({ input, output });
201
+ while (cache.length > limit) {
202
+ cache.pop();
203
+ }
204
+ return output;
205
+ }, {
206
+ clear(array) {
207
+ for (let i = state.cache.length - 1; i >= 0; i--) {
208
+ if (isMatch(state.cache[i].input, array)) {
209
+ state.cache.splice(i, 1);
210
+ }
211
+ }
212
+ },
213
+ clearAll() {
214
+ state.cache = [];
215
+ },
216
+ });
217
+ }
218
+ exports.cacheArrayEqual = cacheArrayEqual;
219
+ /** Caches when arguments are ===. See cacheArrayEqual */
220
+ function cacheArgsEqual(fnc, limit = 10) {
221
+ let cache = cacheArrayEqual(function cacheArgsEqual(args) {
222
+ return fnc(...args);
223
+ }, limit);
224
+ return Object.assign(((...args) => {
225
+ return cache(args);
226
+ }), {
227
+ clear(...args) {
228
+ cache.clear(args);
229
+ },
230
+ });
231
+ }
232
+ exports.cacheArgsEqual = cacheArgsEqual;
233
+ function cacheJSONArgsEqual(fnc, limit = 10) {
234
+ let cache = cacheLimited(limit, (argsJSON) => {
235
+ return fnc(...JSON.parse(argsJSON));
236
+ });
237
+ return Object.assign(((...args) => {
238
+ return cache(JSON.stringify(args));
239
+ }), {
240
+ clear(...args) {
241
+ cache.clearKey(JSON.stringify(args));
242
+ },
243
+ clearAll() {
244
+ cache.clear();
245
+ }
246
+ });
247
+ }
248
+ exports.cacheJSONArgsEqual = cacheJSONArgsEqual;
249
+ function cacheShallowConfigArgEqual(fnc, limit = 10) {
250
+ let cache = cacheArrayEqual((kvpsFlat) => {
251
+ output.missCount++;
252
+ let arg;
253
+ if (kvpsFlat.length === 1) {
254
+ arg = kvpsFlat[0];
255
+ }
256
+ else {
257
+ let kvps = [];
258
+ for (let i = 0; i < kvpsFlat.length; i += 2) {
259
+ kvps.push([kvpsFlat[i], kvpsFlat[i + 1]]);
260
+ }
261
+ arg = Object.fromEntries(kvps);
262
+ }
263
+ return fnc(arg);
264
+ }, limit);
265
+ function getKVPs(configArg) {
266
+ if (!(0, types_1.canHaveChildren)(configArg) || Array.isArray(configArg)) {
267
+ return [configArg];
268
+ }
269
+ let keys = Object.keys(configArg);
270
+ keys.sort();
271
+ return keys.flatMap(key => [key, configArg[key]]);
272
+ }
273
+ let output = Object.assign(((configArg) => {
274
+ output.callCount++;
275
+ return cache(getKVPs(configArg));
276
+ }), {
277
+ clear(configArg) {
278
+ cache.clear(getKVPs(configArg));
279
+ },
280
+ clearAll() {
281
+ cache.clearAll();
282
+ },
283
+ callCount: 0,
284
+ missCount: 0,
285
+ });
286
+ return output;
287
+ }
288
+ exports.cacheShallowConfigArgEqual = cacheShallowConfigArgEqual;
289
+ function externalCache() {
290
+ let values = new Map();
291
+ return {
292
+ get: (key) => {
293
+ return values.get(key);
294
+ },
295
+ set: (key, value) => {
296
+ values.set(key, value);
297
+ },
298
+ };
299
+ }
300
+ exports.externalCache = externalCache;
301
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNhY2hpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsaUNBQW9DO0FBQ3BDLG1DQUE2RDtBQUU3RCxTQUFnQixJQUFJLENBQUksT0FBZ0I7SUFDcEMsSUFBSSxLQUFLLEdBQTZCLFNBQVMsQ0FBQztJQUNoRCxTQUFTLEdBQUc7UUFDUixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDVCxLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFBQSxDQUFDO0lBQ0YsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLEVBQUU7UUFDYixLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQ3RCLENBQUMsQ0FBQztJQUNGLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFXLEVBQUUsRUFBRTtRQUN0QixLQUFLLEdBQUcsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7SUFDaEMsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxHQUFHLENBQUM7QUFDZixDQUFDO0FBZkQsb0JBZUM7QUFhRCxvRkFBb0Y7QUFDcEYsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSxHQUFVLEVBQUUsQ0FBQztBQUM3QixTQUFnQixlQUFlLENBQUksS0FBVTtJQUN6QyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQzFDLE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUFIRCwwQ0FHQztBQUVELFNBQWdCLEtBQUssQ0FDakIsUUFBdUQ7SUFVdkQsSUFBSSxtQkFBbUIsR0FBRyxJQUFJLEdBQUcsRUFBTyxDQUFDO0lBQ3pDLElBQUksTUFBTSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7SUFDcEMsU0FBUyxLQUFLLENBQUMsS0FBVSxFQUFFLEdBQUcsU0FB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Q0ksS0FBSyxDQUFDLFNBQWlCO1lBQ25CLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELFFBQVE7WUFDSixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDckIsQ0FBQztRQUNELFNBQVMsRUFBRSxDQUFDO1FBQ1osU0FBUyxFQUFFLENBQUM7S0FDZixDQUNKLENBQUM7SUFDRixPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBOUNELGdFQThDQztBQUdELFNBQWdCLGFBQWE7SUFJekIsSUFBSSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUNuQyxPQUFPO1FBQ0gsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDVCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUNELEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNoQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMzQixDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUM7QUFiRCxzQ0FhQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGFycmF5RXF1YWwgfSBmcm9tIFwiLi9taXNjXCI7XG5pbXBvcnQgeyBBbnlGdW5jdGlvbiwgQXJncywgY2FuSGF2ZUNoaWxkcmVuIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGxhenk8VD4oZmFjdG9yeTogKCkgPT4gVCkge1xuICAgIGxldCB2YWx1ZTogeyB2YWx1ZTogVCB9IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdmFsdWUgPSB7IHZhbHVlOiBmYWN0b3J5KCkgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgfTtcbiAgICBnZXQucmVzZXQgPSAoKSA9PiB7XG4gICAgICAgIHZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH07XG4gICAgZ2V0LnNldCA9IChuZXdWYWx1ZTogVCkgPT4ge1xuICAgICAgICB2YWx1ZSA9IHsgdmFsdWU6IG5ld1ZhbHVlIH07XG4gICAgfTtcbiAgICByZXR1cm4gZ2V0O1xufVxuXG4vLyBOT1RFOiBUaGUgcmVhc29uIHdlIG5lZWQgdG8gcGVyaW9kaWNhbGx5IGNsZWFyLCBpcyBiZWNhdXNlIHNvbWV0aW1lcyBhIHZlcnkgc21hbGxcbi8vICAgICAgcGFydCBvZiBhIGxhcmdlIHBheWxvYWQgKGV4LCBwZXJzaXN0ZWQgb3ZlcnJpZGVzKSBpcyBjYWNoZWQsIHdoaWNoIHRoZW4gcmVzdWx0c1xuLy8gICAgICBpbiB0aGUgd2hvbGUgcGF5bG9hZCBiZWluZyBjYWNoZWQsIHdoaWNoIHJlc3VsdHMgaW4gYSBsb3Qgb2YgbWVtb3J5IGJlaW5nIHVzZWQuXG5cbi8vIElNUE9SVEFOVCEgVGhlIGNsZWFudXAgZnVuY3Rpb25zIENBTk5PVCBjbG9zZSB1cG9uIGFueXRoaW5nLCBvciBlbHNlIHRoZXkgd2lsbCBjYXVzZSBsZWFrcyFcbi8vICBBbGwgZGF0YSB0aGV5IHVzZSBzaG91bGQgYmUgaW4gZGF0YS5cbmludGVyZmFjZSBDbGVhbnVwRm5jPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgICAoZGF0YTogVCk6IHZvaWQ7XG59XG5cblxuLy8gTk9URTogRW1wdHkgYXJyYXlzIGFyZSBzbyBjb21tb24sIHRoYXQgaXQgaXMgdXNlZnVsIHRvIHJlcHJlc2VudCB0aGVtIGFzIHRoZSBzYW1lXG4vLyAgZW10cHkgYXJyYXksIHRvIGluY3JlYXNlIGNhY2hlIGhpdCByYXRlcy5cbmNvbnN0IGVtcHR5QXJyYXk6IGFueVtdID0gW107XG5leHBvcnQgZnVuY3Rpb24gY2FjaGVFbXB0eUFycmF5PFQ+KGFycmF5OiBUW10pOiBUW10ge1xuICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiBlbXB0eUFycmF5O1xuICAgIHJldHVybiBhcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlPE91dHB1dCwgS2V5LCBVbnRyYWNrZWQgZXh0ZW5kcyB1bmtub3duW10+KFxuICAgIGdldFZhbHVlOiAoa2V5OiBLZXksIC4uLnVudHJhY2tlZDogVW50cmFja2VkKSA9PiBPdXRwdXRcbik6IHtcbiAgICAoa2V5OiBLZXksIC4uLnVudHJhY2tlZDogVW50cmFja2VkKTogT3V0cHV0O1xuICAgIC8vIE5PVEU6IElmIHlvdSB3YW50IHRvIGNsZWFyIGFsbCwganVzdCBtYWtlIGEgbmV3IGNhY2hlIVxuICAgIGNsZWFyKGtleTogS2V5KTogdm9pZDtcbiAgICBjbGVhckFsbCgpOiB2b2lkO1xuICAgIGZvcmNlU2V0KGtleTogS2V5LCB2YWx1ZTogT3V0cHV0KTogdm9pZDtcbiAgICBnZXRBbGxLZXlzKCk6IEtleVtdO1xuICAgIGdldChrZXk6IEtleSk6IE91dHB1dCB8IHVuZGVmaW5lZDtcbn0ge1xuICAgIGxldCBzdGFydGluZ0NhbGN1bGF0aW5nID0gbmV3IFNldDxLZXk+KCk7XG4gICAgbGV0IHZhbHVlcyA9IG5ldyBNYXA8S2V5LCBPdXRwdXQ+KCk7XG4gICAgZnVuY3Rpb24gY2FjaGUoaW5wdXQ6IEtleSwgLi4udW50cmFja2VkOiBVbnRyYWNrZWQpIHtcbiAgICAgICAgbGV0IGtleSA9IGlucHV0O1xuICAgICAgICBpZiAodmFsdWVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzLmdldChrZXkpIGFzIGFueTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhcnRpbmdDYWxjdWxhdGluZy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgLy8gVE9ETzogRml4IHRoZSB0eXBlcyBoZXJlLCBieSB0aHJvd2luZywgYW5kIHRoZW4gZm9yIHRoZSBjYXNlc1xuICAgICAgICAgICAgLy8gIHRoYXQgZG9uJ3QgdGhyb3csIG1ha2Ugb3VyIG91dHB1dCB0eXBlIGluY2x1ZGUgdW5kZWZpbmVkXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0aW5nQ2FsY3VsYXRpbmcuYWRkKGtleSk7XG4gICAgICAgIGxldCB2YWx1ZSA9IGdldFZhbHVlKGlucHV0LCAuLi51bnRyYWNrZWQpO1xuICAgICAgICB2YWx1ZXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIGNhY2hlLmNsZWFyID0gKGtleTogS2V5KSA9PiB7XG4gICAgICAgIHZhbHVlcy5kZWxldGUoa2V5KTtcbiAgICAgICAgc3RhcnRpbmdDYWxjdWxhdGluZy5kZWxldGUoa2V5KTtcbiAgICB9O1xuICAgIGNhY2hlLmZvcmNlU2V0ID0gKGtleTogS2V5LCB2YWx1ZTogT3V0cHV0KSA9PiB7XG4gICAgICAgIHZhbHVlcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHN0YXJ0aW5nQ2FsY3VsYXRpbmcuYWRkKGtleSk7XG4gICAgfTtcbiAgICBjYWNoZS5nZXRBbGxLZXlzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gWy4uLnZhbHVlcy5rZXlzKCldO1xuICAgIH07XG4gICAgY2FjaGUuZ2V0ID0gKGtleTogS2V5KSA9PiB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMuZ2V0KGtleSk7XG4gICAgfTtcbiAgICBjYWNoZS5jbGVhckFsbCA9ICgpID0+IHtcbiAgICAgICAgdmFsdWVzLmNsZWFyKCk7XG4gICAgICAgIHN0YXJ0aW5nQ2FsY3VsYXRpbmcuY2xlYXIoKTtcbiAgICB9O1xuICAgIHJldHVybiBjYWNoZTtcbn1cblxuXG4vKiogTWFrZXMgYSBjYWNoZSB0aGF0IGxpbWl0cyB0aGUgbnVtYmVyIG9mIGVudHJpZXMsIGFsbG93aW5nIHlvdSB0byBwdXQgYXJiaXRyYXJ5IGRhdGEgaW4gaXRcbiAqICAgICAgd2l0aG91dCB3b3JyeWluZyBhYm91dCBsZWFraW5nIG1lbW9yeVxuICAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlTGltaXRlZDxPdXRwdXQsIEtleT4oXG4gICAgLy8gTk9URTogV2UgY2FuJ3QgY2FsY3VsYXRlIHdoYXQgbGltaXQgc2hvdWxkIGJlIGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgZXZhbHVhdGlvbiB0aW1lXG4gICAgLy8gIGFuZCB0aGUgdGltZSB0byBjb21wYXJlIGFnYWluc3QgdGhlIHZhbHVlcy4gQmVjYXVzZSwgZXZlbiBpZiBmaW5kaW5nIGEgbWF0Y2ggdGFrZXMgZmFyIGxvbmdlciB0aGFuXG4gICAgLy8gIGNhbGN1bGF0aW5nLCBrZWVwaW5nIGEgY29uc2lzdGVudCBvdXRwdXQgY2FuIHNhdmUgKGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZikgdGltZSBpbiBkb3duc3RyZWFtIGNhY2hlcy5cbiAgICBtYXhDb3VudDogbnVtYmVyLFxuICAgIGdldFZhbHVlOiAoa2V5OiBLZXkpID0+IE91dHB1dFxuKSB7XG4gICAgbGV0IHN0YXJ0aW5nQ2FsY3VsYXRpbmcgPSBuZXcgU2V0PEtleT4oKTtcbiAgICBsZXQgdmFsdWVzID0gbmV3IE1hcDxLZXksIE91dHB1dD4oKTtcbiAgICBmdW5jdGlvbiBnZXQoaW5wdXQ6IEtleSk6IE91dHB1dCB7XG4gICAgICAgIGxldCBrZXkgPSBpbnB1dDtcbiAgICAgICAgaWYgKHZhbHVlcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5nZXQoa2V5KSBhcyBhbnk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXJ0aW5nQ2FsY3VsYXRpbmcuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ3ljbGljIGFjY2VzcyBpbiBjYWNoZWApO1xuICAgICAgICB9XG4gICAgICAgIHN0YXJ0aW5nQ2FsY3VsYXRpbmcuYWRkKGtleSk7XG5cbiAgICAgICAgLy8gQ2xlYXIgd2hlbiBpdCBnZXRzIHRvbyBiaWcuIFRoaXMgaXMga2luZCBvZiBsaWtlIGEgd29yc2VcbiAgICAgICAgLy8gIGxlYXN0IHJlY2VudGx5IHVzZWQgY2FjaGUsIGJlY2F1c2UgZW50cmllcyB0aGF0IGFyZSBhY2Nlc3NlZFxuICAgICAgICAvLyAgb2Z0ZW4gd2lsbCBxdWlja2x5IGdldCBwdXQgYmFjayBpbi4gVGhpcyBpcyBlZmZlY3RpdmUgYXMgbG9uZ1xuICAgICAgICAvLyAgYXMgYWNjZXNzZXMgdGFrZSBzaW1pbGFyIGFtb3VudHMgb2YgdGltZS4gSWYgdGhlcmUgaXMgYSB2ZXJ5IHNsb3dcbiAgICAgICAgLy8gIGFuZCB2ZXJ5IGNvbW1vbmx5IGFjY2Vzc2VkIHZhbHVlLCBpdCBjb3VsZCBiZSBldmljdGVkIGJ5IG1hbnkgdmVyeVxuICAgICAgICAvLyAgZmFzdCBhY2Nlc3Nlcywgd2hpY2ggd291bGQgYmUgdW5mb3J0dW5hdGUuXG4gICAgICAgIGlmICh2YWx1ZXMuc2l6ZSA+PSBtYXhDb3VudCkge1xuICAgICAgICAgICAgdmFsdWVzLmNsZWFyKCk7XG4gICAgICAgICAgICBzdGFydGluZ0NhbGN1bGF0aW5nLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdmFsdWUgPSBnZXRWYWx1ZShpbnB1dCk7XG4gICAgICAgIHZhbHVlcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgZ2V0W1wiZm9yY2VTZXRcIl0gPSAoa2V5OiBLZXksIHZhbHVlOiBPdXRwdXQpID0+IHtcbiAgICAgICAgdmFsdWVzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgc3RhcnRpbmdDYWxjdWxhdGluZy5hZGQoa2V5KTtcbiAgICB9O1xuICAgIGdldFtcImNsZWFyS2V5XCJdID0gKGtleTogS2V5KSA9PiB7XG4gICAgICAgIHZhbHVlcy5kZWxldGUoa2V5KTtcbiAgICAgICAgc3RhcnRpbmdDYWxjdWxhdGluZy5kZWxldGUoa2V5KTtcbiAgICB9O1xuICAgIGdldFtcImNsZWFyXCJdID0gKCkgPT4ge1xuICAgICAgICB2YWx1ZXMuY2xlYXIoKTtcbiAgICAgICAgc3RhcnRpbmdDYWxjdWxhdGluZy5jbGVhcigpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVXZWFrPE91dHB1dCwgS2V5IGV4dGVuZHMgb2JqZWN0PihnZXRWYWx1ZTogKGtleTogS2V5KSA9PiBPdXRwdXQpOiAoa2V5OiBLZXkpID0+IE91dHB1dCB7XG4gICAgbGV0IHN0YXRlID0ge1xuICAgICAgICBzdGFydGluZ0NhbGN1bGF0aW5nOiBuZXcgV2Vha1NldDxLZXk+KCksXG4gICAgICAgIHZhbHVlczogbmV3IFdlYWtNYXA8S2V5LCBPdXRwdXQ+KCksXG4gICAgfTtcblxuICAgIHJldHVybiAoaW5wdXQpID0+IHtcbiAgICAgICAgbGV0IGtleSA9IGlucHV0O1xuICAgICAgICBpZiAoc3RhdGUudmFsdWVzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUudmFsdWVzLmdldChrZXkpIGFzIGFueTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuc3RhcnRpbmdDYWxjdWxhdGluZy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDeWNsaWMgYWNjZXNzIGluIGNhY2hlV2Vha2ApO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLnN0YXJ0aW5nQ2FsY3VsYXRpbmcuYWRkKGtleSk7XG4gICAgICAgIGxldCB2YWx1ZSA9IGdldFZhbHVlKGlucHV0KTtcbiAgICAgICAgc3RhdGUudmFsdWVzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG59XG5cbi8vIEEgbGlzdCBjYWNoZSwgd2hpY2guLi4gbWF5YmUgZmFzdGVyIHRoYW4gYSBNYXA/XG5leHBvcnQgZnVuY3Rpb24gY2FjaGVMaXN0PFZhbHVlPihcbiAgICBnZXRMZW5ndGg6ICgpID0+IG51bWJlcixcbiAgICBnZXRWYWx1ZTogKGluZGV4OiBudW1iZXIpID0+IFZhbHVlLFxuKTogeyAoaW5kZXg6IG51bWJlcik6IFZhbHVlOyB9IHtcbiAgICBsZXQgc3RhdGUgPSB7XG4gICAgICAgIGNhY2hlOiBbXSBhcyBWYWx1ZVtdLFxuICAgICAgICBsZW5ndGg6IHVuZGVmaW5lZCBhcyB1bmRlZmluZWQgfCBudW1iZXIsXG4gICAgICAgIGdldExlbmd0aCxcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGdldChpOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IGNhY2hlID0gc3RhdGUuY2FjaGU7XG4gICAgICAgIGxldCBsZW5ndGggPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGVuZ3RoID0gc3RhdGUubGVuZ3RoID0gc3RhdGUuZ2V0TGVuZ3RoKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gbGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGV4IG91dCBvZiBib3VuZHNgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShpIGluIGNhY2hlKSkge1xuICAgICAgICAgICAgY2FjaGVbaV0gPSBnZXRWYWx1ZShpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FjaGVbaV07XG4gICAgfTtcbiAgICByZXR1cm4gZ2V0O1xufVxuXG5mdW5jdGlvbiBjYWNoZUFycmF5RXF1YWxDbGVhbnVwKHN0YXRlOiBhbnkpIHtcbiAgICBzdGF0ZS5jYWNoZSA9IFtdO1xufVxuXG4vKiogQSBjYWNoZSBoYWxmIHdheSBiZXR3ZWVuIGNhY2hpbmcgYmFzZWQgb24gPT09IGFuZCBjYWNoaW5nIGJhc2VkIG9uIGhhc2guIENhY2hlc1xuICogICAgICBiYXNlZCBvbiBhcnJheUVxdWFsLCB3aGljaCBkb2VzID09PSBvbiBhbGwgdmFsdWVzIGluIGFuIGFycmF5LiBSZXF1aXJlcyBsb2NhbGl6ZWRcbiAqICAgICAgY2FjaGluZyAoYXMgdGhlIGNvbXBhcmlzb25zIGRvbid0IHNjYWxlIHdpdGggbWFueSBjYW5kaWRhdGVzLCB1bmxpa2UgaGFzaGluZyksXG4gKiAgICAgIGhvd2V2ZXIgd29ya3Mgd2l0aCBub24gdHJpdmFsIHRyYW5zZm9ybWF0aW9ucyAoZXgsIHJlc29sdmluZyBtYW55IHBlcnNpc3RlZCBvdmVycmlkZXNcbiAqICAgICAgdG8gZ2V0IGEgdmFsdWUpLCB1bmxpa2UgY2FjaGUoKS5cbiAqICBBbHNvLCBsaW1pdHMgaXRzZWxmLCBtb3JlIG9mIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYW4gbWVtb3J5IG9wdGltaXphdGlvbiwgYXMgaXQgc2NhbGVzXG4gKiAgICAgIHZlcnkgcG9vcmx5IHdpdGggdGhlIG51bWJlciBvZiBjYW5kaWRhdGVzLlxuICogIFxuICogIFRJTUlORzogQWJvdXQgNnVzIHdpdGggbGltaXQgPSAxMDAsIGFycmF5IHNpemUgPSAyOTQsIGFuZCB0aGUgY2FjaGUgYmVpbmcgZnVsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlQXJyYXlFcXVhbDxJbnB1dCBleHRlbmRzIHVua25vd25bXSB8IHVuZGVmaW5lZCwgT3V0cHV0PihcbiAgICBtYXA6IChhcnJheXM6IElucHV0KSA9PiBPdXRwdXQsXG4gICAgbGltaXQgPSAxMFxuKToge1xuICAgIChhcnJheTogSW5wdXQpOiBPdXRwdXQ7XG4gICAgY2xlYXIoYXJyYXk6IElucHV0KTogdm9pZDtcbiAgICBjbGVhckFsbCgpOiB2b2lkO1xufSB7XG4gICAgbGV0IHN0YXRlOiB7XG4gICAgICAgIGNhY2hlOiB7XG4gICAgICAgICAgICBpbnB1dDogSW5wdXQ7XG4gICAgICAgICAgICBvdXRwdXQ6IE91dHB1dDtcbiAgICAgICAgfVtdXG4gICAgfSA9IHsgY2FjaGU6IFtdIH07XG4gICAgZnVuY3Rpb24gaXNNYXRjaChsaHM6IElucHV0LCByaHM6IElucHV0KSB7XG4gICAgICAgIGlmIChsaHMgPT09IHJocykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxocyA9PT0gdW5kZWZpbmVkIHx8IHJocyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFycmF5RXF1YWwobGhzLCByaHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKFxuICAgICAgICAoaW5wdXQ6IElucHV0KSA9PiB7XG4gICAgICAgICAgICBsZXQgY2FjaGUgPSBzdGF0ZS5jYWNoZTtcbiAgICAgICAgICAgIGZvciAobGV0IG9iaiBvZiBjYWNoZSkge1xuICAgICAgICAgICAgICAgIGlmIChpc01hdGNoKG9iai5pbnB1dCwgaW5wdXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmoub3V0cHV0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBvdXRwdXQgPSBtYXAoaW5wdXQpO1xuICAgICAgICAgICAgY2FjaGUudW5zaGlmdCh7IGlucHV0LCBvdXRwdXQgfSk7XG4gICAgICAgICAgICB3aGlsZSAoY2FjaGUubGVuZ3RoID4gbGltaXQpIHtcbiAgICAgICAgICAgICAgICBjYWNoZS5wb3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGNsZWFyKGFycmF5OiBJbnB1dCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBzdGF0ZS5jYWNoZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNNYXRjaChzdGF0ZS5jYWNoZVtpXS5pbnB1dCwgYXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jYWNoZS5zcGxpY2UoaSwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2xlYXJBbGwoKSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuY2FjaGUgPSBbXTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICApO1xufVxuXG4vKiogQ2FjaGVzIHdoZW4gYXJndW1lbnRzIGFyZSA9PT0uIFNlZSBjYWNoZUFycmF5RXF1YWwgKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUFyZ3NFcXVhbDxGbmMgZXh0ZW5kcyBBbnlGdW5jdGlvbj4oXG4gICAgZm5jOiBGbmMsXG4gICAgbGltaXQgPSAxMFxuKTogRm5jICYgeyBjbGVhciguLi5hcmdzOiBBcmdzPEZuYz4pOiB2b2lkIH0ge1xuICAgIGxldCBjYWNoZSA9IGNhY2hlQXJyYXlFcXVhbChmdW5jdGlvbiBjYWNoZUFyZ3NFcXVhbChhcmdzOiB1bmtub3duW10pIHtcbiAgICAgICAgcmV0dXJuIGZuYyguLi5hcmdzKTtcbiAgICB9LCBsaW1pdCk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oXG4gICAgICAgICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGUoYXJncyk7XG4gICAgICAgIH0pIGFzIEZuYyxcbiAgICAgICAge1xuICAgICAgICAgICAgY2xlYXIoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgICAgICAgICAgY2FjaGUuY2xlYXIoYXJncyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlSlNPTkFyZ3NFcXVhbDxGbmMgZXh0ZW5kcyBBbnlGdW5jdGlvbj4oXG4gICAgZm5jOiBGbmMsXG4gICAgbGltaXQgPSAxMFxuKSB7XG4gICAgbGV0IGNhY2hlID0gY2FjaGVMaW1pdGVkKGxpbWl0LCAoYXJnc0pTT046IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gZm5jKC4uLkpTT04ucGFyc2UoYXJnc0pTT04pKTtcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKCguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZShKU09OLnN0cmluZ2lmeShhcmdzKSk7XG4gICAgICAgIH0pIGFzIEZuYyxcbiAgICAgICAge1xuICAgICAgICAgICAgY2xlYXIoLi4uYXJnczogdW5rbm93bltdKSB7XG4gICAgICAgICAgICAgICAgY2FjaGUuY2xlYXJLZXkoSlNPTi5zdHJpbmdpZnkoYXJncykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsZWFyQWxsKCkge1xuICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVTaGFsbG93Q29uZmlnQXJnRXF1YWw8Rm5jIGV4dGVuZHMgQW55RnVuY3Rpb24+KFxuICAgIGZuYzogRm5jLFxuICAgIGxpbWl0ID0gMTBcbik6IEZuYyAmIHtcbiAgICBjbGVhcihjb25maWdPYmo6IEFyZ3M8Rm5jPlswXSk6IHZvaWQ7XG4gICAgY2xlYXJBbGwoKTogdm9pZDtcbn0ge1xuICAgIGxldCBjYWNoZSA9IGNhY2hlQXJyYXlFcXVhbCgoa3Zwc0ZsYXQ6IHVua25vd25bXSkgPT4ge1xuICAgICAgICBvdXRwdXQubWlzc0NvdW50Kys7XG4gICAgICAgIGxldCBhcmc6IGFueTtcbiAgICAgICAgaWYgKGt2cHNGbGF0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgYXJnID0ga3Zwc0ZsYXRbMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQga3ZwczogW3Vua25vd24sIHVua25vd25dW10gPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga3Zwc0ZsYXQubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICBrdnBzLnB1c2goW2t2cHNGbGF0W2ldLCBrdnBzRmxhdFtpICsgMV1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFyZyA9IE9iamVjdC5mcm9tRW50cmllcyhrdnBzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm5jKGFyZyk7XG4gICAgfSwgbGltaXQpO1xuICAgIGZ1bmN0aW9uIGdldEtWUHMoY29uZmlnQXJnOiBvYmplY3QpIHtcbiAgICAgICAgaWYgKCFjYW5IYXZlQ2hpbGRyZW4oY29uZmlnQXJnKSB8fCBBcnJheS5pc0FycmF5KGNvbmZpZ0FyZykpIHtcbiAgICAgICAgICAgIHJldHVybiBbY29uZmlnQXJnXTtcbiAgICAgICAgfVxuICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGNvbmZpZ0FyZyk7XG4gICAgICAgIGtleXMuc29ydCgpO1xuICAgICAgICByZXR1cm4ga2V5cy5mbGF0TWFwKGtleSA9PiBba2V5LCBjb25maWdBcmdba2V5XV0pO1xuICAgIH1cbiAgICBsZXQgb3V0cHV0ID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgKChjb25maWdBcmc6IG9iamVjdCkgPT4ge1xuICAgICAgICAgICAgb3V0cHV0LmNhbGxDb3VudCsrO1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlKGdldEtWUHMoY29uZmlnQXJnKSk7XG4gICAgICAgIH0pIGFzIEZuYyxcbiAgICAgICAge1xuICAgICAgICAgICAgY2xlYXIoY29uZmlnQXJnOiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICBjYWNoZS5jbGVhcihnZXRLVlBzKGNvbmZpZ0FyZykpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNsZWFyQWxsKCkge1xuICAgICAgICAgICAgICAgIGNhY2hlLmNsZWFyQWxsKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FsbENvdW50OiAwLFxuICAgICAgICAgICAgbWlzc0NvdW50OiAwLFxuICAgICAgICB9XG4gICAgKTtcbiAgICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlcm5hbENhY2hlPEtleSwgVmFsdWU+KCk6IHtcbiAgICBnZXQ6IChrZXk6IEtleSkgPT4gVmFsdWUgfCB1bmRlZmluZWQ7XG4gICAgc2V0OiAoa2V5OiBLZXksIHZhbHVlOiBWYWx1ZSkgPT4gdm9pZDtcbn0ge1xuICAgIGxldCB2YWx1ZXMgPSBuZXcgTWFwPEtleSwgVmFsdWU+KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0OiAoa2V5KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWVzLmdldChrZXkpO1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICB2YWx1ZXMuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9LFxuICAgIH07XG59Il19
302
+ /* _JS_SOURCE_HASH = "cfc19e21a28cd6de3caf3ba9b26f13ac0c827759c8cb633634a3990212104ec4"; */