socket-function 1.1.49 → 1.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.
Files changed (53) hide show
  1. package/SocketFunction.d.ts +1 -1
  2. package/SocketFunctionTypes.d.ts +1 -1
  3. package/dist/SetProcessVariables.ts.cache +9 -0
  4. package/dist/SocketFunction.ts.cache +467 -0
  5. package/hot/HotReloadController.d.ts +3 -3
  6. package/hot/dist/HotReloadController.ts.cache +252 -0
  7. package/index.d.ts +10 -25
  8. package/package.json +1 -1
  9. package/require/CSSShim.d.ts +1 -1
  10. package/require/RequireController.d.ts +2 -2
  11. package/require/compileFlags.d.ts +1 -1
  12. package/require/dist/RequireController.ts.cache +386 -0
  13. package/require/dist/compileFlags.ts.cache +41 -0
  14. package/require/dist/extMapper.ts.cache +368 -0
  15. package/require/dist/require.ts.cache +676 -0
  16. package/require/require.d.ts +1 -1
  17. package/src/JSONLACKS/dist/JSONLACKS.ts.cache +469 -0
  18. package/src/callManager.d.ts +1 -1
  19. package/src/dist/CallFactory.ts.cache +930 -0
  20. package/src/dist/Zip.ts.cache +156 -0
  21. package/src/dist/batching.ts.cache +377 -0
  22. package/src/dist/bits.ts.cache +121 -0
  23. package/src/dist/buffers.ts.cache +76 -0
  24. package/src/dist/caching.ts.cache +302 -0
  25. package/src/dist/callHTTPHandler.ts.cache +264 -0
  26. package/src/dist/callManager.ts.cache +159 -0
  27. package/src/dist/certStore.ts.cache +59 -0
  28. package/src/dist/createSingleton.ts.cache +62 -0
  29. package/src/dist/fixLargeNetworkCalls.ts.cache +17 -0
  30. package/src/dist/forwardPort.ts.cache +222 -0
  31. package/src/dist/https.ts.cache +141 -0
  32. package/src/dist/misc.ts.cache +499 -0
  33. package/src/dist/nodeCache.ts.cache +136 -0
  34. package/src/dist/nodeProxy.ts.cache +57 -0
  35. package/src/dist/protocolNegotiation.ts.cache +101 -0
  36. package/src/dist/tlsParsing.ts.cache +85 -0
  37. package/src/dist/types.ts.cache +9 -0
  38. package/src/dist/webSocketServer.ts.cache +365 -0
  39. package/src/dist/websocketFactory.ts.cache +53 -0
  40. package/src/formatting/dist/colors.ts.cache +98 -0
  41. package/src/formatting/dist/format.ts.cache +396 -0
  42. package/src/formatting/dist/logColors.ts.cache +28 -0
  43. package/src/lz4/dist/LZ4.ts.cache +53 -0
  44. package/src/profiling/dist/getOwnTime.ts.cache +100 -0
  45. package/src/profiling/dist/measure.ts.cache +338 -0
  46. package/src/profiling/dist/stats.ts.cache +202 -0
  47. package/src/profiling/dist/statsFormat.ts.cache +45 -0
  48. package/src/profiling/getOwnTime.ts +7 -1
  49. package/src/profiling/measure.ts +25 -16
  50. package/test.ts +11 -5
  51. package/time/dist/trueTimeShim.ts.cache +656 -0
  52. package/time/trueTimeShim.d.ts +1 -16
  53. package/time/trueTimeShim.ts +7 -43
@@ -0,0 +1,202 @@
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
+ // See statsFormat.ts:formatStats for a nice way to format a stats value
3
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
4
+ //exports.getStatsTop = exports.addToStats = exports.addToStatsValue = exports.createStatsValue = void 0;
5
+ function createStatsValue() {
6
+ return {
7
+ count: 0,
8
+ sum: 0,
9
+ sumSquares: 0,
10
+ logn7Value: 0, logn7Count: 0, logn6Value: 0, logn6Count: 0, logn5Value: 0, logn5Count: 0, logn4Value: 0, logn4Count: 0, logn3Value: 0, logn3Count: 0, logn2Value: 0, logn2Count: 0, logn1Value: 0, logn1Count: 0, log0Value: 0, log0VCount: 0, log1Value: 0, log1VCount: 0, log2Value: 0, log2VCount: 0, log3Value: 0, log3VCount: 0, log4Value: 0, log4VCount: 0, log5Value: 0, log5VCount: 0, log6Value: 0, log6VCount: 0, log7Value: 0, log7VCount: 0, log8Value: 0, log8VCount: 0, log9Value: 0, log9VCount: 0,
11
+ };
12
+ }
13
+ exports.createStatsValue = createStatsValue;
14
+ // TIMING: Between 5.6ns and 8ns, depending on the size of the value (smaller values are faster to add)
15
+ // - A C++ implementation takes about 3.5ns, so... this is pretty fast!
16
+ function addToStatsValue(stats, value) {
17
+ stats.count++;
18
+ stats.sum += value;
19
+ stats.sumSquares += value * value;
20
+ if (value < 0.000001) {
21
+ stats.logn7Value += value;
22
+ stats.logn7Count++;
23
+ }
24
+ else if (value < 0.00001) {
25
+ stats.logn6Value += value;
26
+ stats.logn6Count++;
27
+ }
28
+ else if (value < 0.0001) {
29
+ stats.logn5Value += value;
30
+ stats.logn5Count++;
31
+ }
32
+ else if (value < 0.001) {
33
+ stats.logn4Value += value;
34
+ stats.logn4Count++;
35
+ }
36
+ else if (value < 0.01) {
37
+ stats.logn3Value += value;
38
+ stats.logn3Count++;
39
+ }
40
+ else if (value < 0.1) {
41
+ stats.logn2Value += value;
42
+ stats.logn2Count++;
43
+ }
44
+ else if (value < 1) {
45
+ stats.logn1Value += value;
46
+ stats.logn1Count++;
47
+ }
48
+ else if (value < 10) {
49
+ stats.log0Value += value;
50
+ stats.log0VCount++;
51
+ }
52
+ else if (value < 100) {
53
+ stats.log1Value += value;
54
+ stats.log1VCount++;
55
+ }
56
+ else if (value < 1000) {
57
+ stats.log2Value += value;
58
+ stats.log2VCount++;
59
+ }
60
+ else if (value < 10000) {
61
+ stats.log3Value += value;
62
+ stats.log3VCount++;
63
+ }
64
+ else if (value < 100000) {
65
+ stats.log4Value += value;
66
+ stats.log4VCount++;
67
+ }
68
+ else if (value < 1000000) {
69
+ stats.log5Value += value;
70
+ stats.log5VCount++;
71
+ }
72
+ else if (value < 10000000) {
73
+ stats.log6Value += value;
74
+ stats.log6VCount++;
75
+ }
76
+ else if (value < 100000000) {
77
+ stats.log7Value += value;
78
+ stats.log7VCount++;
79
+ }
80
+ else if (value < 1000000000) {
81
+ stats.log8Value += value;
82
+ stats.log8VCount++;
83
+ }
84
+ else {
85
+ stats.log9Value += value;
86
+ stats.log9VCount++;
87
+ }
88
+ }
89
+ exports.addToStatsValue = addToStatsValue;
90
+ function addToStats(stats, other) {
91
+ stats.count += other.count;
92
+ stats.sum += other.sum;
93
+ stats.sumSquares += other.sumSquares;
94
+ stats.logn7Value += other.logn7Value;
95
+ stats.logn7Count += other.logn7Count;
96
+ stats.logn6Value += other.logn6Value;
97
+ stats.logn6Count += other.logn6Count;
98
+ stats.logn5Value += other.logn5Value;
99
+ stats.logn5Count += other.logn5Count;
100
+ stats.logn4Value += other.logn4Value;
101
+ stats.logn4Count += other.logn4Count;
102
+ stats.logn3Value += other.logn3Value;
103
+ stats.logn3Count += other.logn3Count;
104
+ stats.logn2Value += other.logn2Value;
105
+ stats.logn2Count += other.logn2Count;
106
+ stats.logn1Value += other.logn1Value;
107
+ stats.logn1Count += other.logn1Count;
108
+ stats.log0Value += other.log0Value;
109
+ stats.log0VCount += other.log0VCount;
110
+ stats.log1Value += other.log1Value;
111
+ stats.log1VCount += other.log1VCount;
112
+ stats.log2Value += other.log2Value;
113
+ stats.log2VCount += other.log2VCount;
114
+ stats.log3Value += other.log3Value;
115
+ stats.log3VCount += other.log3VCount;
116
+ stats.log4Value += other.log4Value;
117
+ stats.log4VCount += other.log4VCount;
118
+ stats.log5Value += other.log5Value;
119
+ stats.log5VCount += other.log5VCount;
120
+ stats.log6Value += other.log6Value;
121
+ stats.log6VCount += other.log6VCount;
122
+ stats.log7Value += other.log7Value;
123
+ stats.log7VCount += other.log7VCount;
124
+ stats.log8Value += other.log8Value;
125
+ stats.log8VCount += other.log8VCount;
126
+ stats.log9Value += other.log9Value;
127
+ stats.log9VCount += other.log9VCount;
128
+ }
129
+ exports.addToStats = addToStats;
130
+ // Ordered from lowest average to highest average
131
+ function getStatsBuckets(stats) {
132
+ return [
133
+ { sum: stats.logn7Value, count: stats.logn7Count },
134
+ { sum: stats.logn6Value, count: stats.logn6Count },
135
+ { sum: stats.logn5Value, count: stats.logn5Count },
136
+ { sum: stats.logn4Value, count: stats.logn4Count },
137
+ { sum: stats.logn3Value, count: stats.logn3Count },
138
+ { sum: stats.logn2Value, count: stats.logn2Count },
139
+ { sum: stats.logn1Value, count: stats.logn1Count },
140
+ { sum: stats.log0Value, count: stats.log0VCount },
141
+ { sum: stats.log1Value, count: stats.log1VCount },
142
+ { sum: stats.log2Value, count: stats.log2VCount },
143
+ { sum: stats.log3Value, count: stats.log3VCount },
144
+ { sum: stats.log4Value, count: stats.log4VCount },
145
+ { sum: stats.log5Value, count: stats.log5VCount },
146
+ { sum: stats.log6Value, count: stats.log6VCount },
147
+ { sum: stats.log7Value, count: stats.log7VCount },
148
+ { sum: stats.log8Value, count: stats.log8VCount },
149
+ { sum: stats.log9Value, count: stats.log9VCount },
150
+ ];
151
+ }
152
+ /** Identifies cases where the value is concentrated in few instances. This indicates most of the value (time)
153
+ * is not spent on the common case, but on an outlier. Which isn't a problem, it just means that the measurements
154
+ * should be more precise, to pull that heavy case out.
155
+ */
156
+ function getStatsTop(stats) {
157
+ if (stats.sum === 0) {
158
+ return { countFraction: 1, valueFraction: 1, count: 0, value: 0, topHeavy: false, };
159
+ }
160
+ const minFraction = 0.2;
161
+ let totalSum = stats.sum;
162
+ let totalCount = stats.count;
163
+ let totalMean = totalSum / totalCount;
164
+ // Find the sum above the average (with a minimum of minFraction, as sometimes there isn't really anything above the average)
165
+ let buckets = getStatsBuckets(stats);
166
+ buckets.reverse();
167
+ let curSum = 0;
168
+ let curCount = 0;
169
+ for (let entry of buckets) {
170
+ let mean = entry.sum / entry.count;
171
+ if (curSum > totalSum * minFraction && mean < totalMean)
172
+ break;
173
+ curSum += entry.sum;
174
+ curCount += entry.count;
175
+ }
176
+ let countFraction = curCount / totalCount;
177
+ let valueFraction = curSum / totalSum;
178
+ return {
179
+ countFraction,
180
+ valueFraction,
181
+ count: curCount,
182
+ value: curSum,
183
+ // If more than 50% is above the average, it's top heavy
184
+ topHeavy: valueFraction / countFraction > 2 && valueFraction > 0.4,
185
+ };
186
+ }
187
+ exports.getStatsTop = getStatsTop;
188
+ function benchmarkAddToStats() {
189
+ let stats = createStatsValue();
190
+ let start = Date.now();
191
+ const count = 1000000;
192
+ for (let i = 0; i < count; i++) {
193
+ addToStatsValue(stats, 10000000000);
194
+ }
195
+ let end = Date.now();
196
+ let time = end - start;
197
+ let timePer = (time) / count * 1000 * 1000;
198
+ console.log(`Time per: ${timePer}ns, in ${time}ms`);
199
+ }
200
+ //benchmarkAddToStats();
201
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGF0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsd0VBQXdFOzs7QUFZeEUsU0FBZ0IsZ0JBQWdCO0lBQzVCLE9BQU87UUFDSCxLQUFLLEVBQUUsQ0FBQztRQUNSLEdBQUcsRUFBRSxDQUFDO1FBQ04sVUFBVSxFQUFFLENBQUM7UUFDYixVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQztLQUNyZixDQUFDO0FBQ04sQ0FBQztBQVBELDRDQU9DO0FBRUQsdUdBQXVHO0FBQ3ZHLHdFQUF3RTtBQUN4RSxTQUFnQixlQUFlLENBQUMsS0FBaUIsRUFBRSxLQUFhO0lBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNkLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO0lBQ25CLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNsQyxJQUFJLEtBQUssR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUNuQixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMxQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLE9BQU8sRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDMUIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxLQUFLLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMxQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3RCLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDO1FBQzFCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDckIsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDMUIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNuQixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMxQixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDckIsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUN0QixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDeEIsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUN6QixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLElBQUksS0FBSyxHQUFHLFFBQVEsRUFBRSxDQUFDO1FBQzFCLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QixDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsU0FBUyxFQUFFLENBQUM7UUFDM0IsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUM7UUFDekIsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7U0FBTSxJQUFJLEtBQUssR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM1QixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztTQUFNLENBQUM7UUFDSixLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztRQUN6QixLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdkIsQ0FBQztBQUNMLENBQUM7QUF4REQsMENBd0RDO0FBRUQsU0FBZ0IsVUFBVSxDQUFDLEtBQWlCLEVBQUUsS0FBaUI7SUFDM0QsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQzNCLEtBQUssQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQztJQUN2QixLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbkMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNuQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ25DLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbkMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUNuQyxLQUFLLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDckMsS0FBSyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDO0lBQ25DLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQztJQUNyQyxLQUFLLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDbkMsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDO0lBQ3JDLEtBQUssQ0FBQyxTQUFTLElBQUksS0FBSyxD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QU8sQ0FBQztJQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDN0IsZUFBZSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLElBQUksSUFBSSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDdkIsSUFBSSxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztJQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsT0FBTyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUNELHdCQUF3QiIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNlZSBzdGF0c0Zvcm1hdC50czpmb3JtYXRTdGF0cyBmb3IgYSBuaWNlIHdheSB0byBmb3JtYXQgYSBzdGF0cyB2YWx1ZVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRzVmFsdWUge1xuICAgIGNvdW50OiBudW1iZXI7XG4gICAgc3VtOiBudW1iZXI7XG4gICAgc3VtU3F1YXJlczogbnVtYmVyO1xuXG4gICAgLy8gQWxsIGxvZ3MgdXNlIGJhc2UgMTBcbiAgICAvLyAgVGhpcyBzdXBwb3J0cyB2YWx1ZXMgZnJvbSAwLjFucyB0byAxIHdlZWtcbiAgICBsb2duN1ZhbHVlOiBudW1iZXI7IGxvZ243Q291bnQ6IG51bWJlcjsgbG9nbjZWYWx1ZTogbnVtYmVyOyBsb2duNkNvdW50OiBudW1iZXI7IGxvZ241VmFsdWU6IG51bWJlcjsgbG9nbjVDb3VudDogbnVtYmVyOyBsb2duNFZhbHVlOiBudW1iZXI7IGxvZ240Q291bnQ6IG51bWJlcjsgbG9nbjNWYWx1ZTogbnVtYmVyOyBsb2duM0NvdW50OiBudW1iZXI7IGxvZ24yVmFsdWU6IG51bWJlcjsgbG9nbjJDb3VudDogbnVtYmVyOyBsb2duMVZhbHVlOiBudW1iZXI7IGxvZ24xQ291bnQ6IG51bWJlcjsgbG9nMFZhbHVlOiBudW1iZXI7IGxvZzBWQ291bnQ6IG51bWJlcjsgbG9nMVZhbHVlOiBudW1iZXI7IGxvZzFWQ291bnQ6IG51bWJlcjsgbG9nMlZhbHVlOiBudW1iZXI7IGxvZzJWQ291bnQ6IG51bWJlcjsgbG9nM1ZhbHVlOiBudW1iZXI7IGxvZzNWQ291bnQ6IG51bWJlcjsgbG9nNFZhbHVlOiBudW1iZXI7IGxvZzRWQ291bnQ6IG51bWJlcjsgbG9nNVZhbHVlOiBudW1iZXI7IGxvZzVWQ291bnQ6IG51bWJlcjsgbG9nNlZhbHVlOiBudW1iZXI7IGxvZzZWQ291bnQ6IG51bWJlcjsgbG9nN1ZhbHVlOiBudW1iZXI7IGxvZzdWQ291bnQ6IG51bWJlcjsgbG9nOFZhbHVlOiBudW1iZXI7IGxvZzhWQ291bnQ6IG51bWJlcjsgbG9nOVZhbHVlOiBudW1iZXI7IGxvZzlWQ291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YXRzVmFsdWUoKTogU3RhdHNWYWx1ZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY291bnQ6IDAsXG4gICAgICAgIHN1bTogMCxcbiAgICAgICAgc3VtU3F1YXJlczogMCxcbiAgICAgICAgbG9nbjdWYWx1ZTogMCwgbG9nbjdDb3VudDogMCwgbG9nbjZWYWx1ZTogMCwgbG9nbjZDb3VudDogMCwgbG9nbjVWYWx1ZTogMCwgbG9nbjVDb3VudDogMCwgbG9nbjRWYWx1ZTogMCwgbG9nbjRDb3VudDogMCwgbG9nbjNWYWx1ZTogMCwgbG9nbjNDb3VudDogMCwgbG9nbjJWYWx1ZTogMCwgbG9nbjJDb3VudDogMCwgbG9nbjFWYWx1ZTogMCwgbG9nbjFDb3VudDogMCwgbG9nMFZhbHVlOiAwLCBsb2cwVkNvdW50OiAwLCBsb2cxVmFsdWU6IDAsIGxvZzFWQ291bnQ6IDAsIGxvZzJWYWx1ZTogMCwgbG9nMlZDb3VudDogMCwgbG9nM1ZhbHVlOiAwLCBsb2czVkNvdW50OiAwLCBsb2c0VmFsdWU6IDAsIGxvZzRWQ291bnQ6IDAsIGxvZzVWYWx1ZTogMCwgbG9nNVZDb3VudDogMCwgbG9nNlZhbHVlOiAwLCBsb2c2VkNvdW50OiAwLCBsb2c3VmFsdWU6IDAsIGxvZzdWQ291bnQ6IDAsIGxvZzhWYWx1ZTogMCwgbG9nOFZDb3VudDogMCwgbG9nOVZhbHVlOiAwLCBsb2c5VkNvdW50OiAwLFxuICAgIH07XG59XG5cbi8vIFRJTUlORzogQmV0d2VlbiA1LjZucyBhbmQgOG5zLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIHZhbHVlIChzbWFsbGVyIHZhbHVlcyBhcmUgZmFzdGVyIHRvIGFkZClcbi8vICAtIEEgQysrIGltcGxlbWVudGF0aW9uIHRha2VzIGFib3V0IDMuNW5zLCBzby4uLiB0aGlzIGlzIHByZXR0eSBmYXN0IVxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRvU3RhdHNWYWx1ZShzdGF0czogU3RhdHNWYWx1ZSwgdmFsdWU6IG51bWJlcikge1xuICAgIHN0YXRzLmNvdW50Kys7XG4gICAgc3RhdHMuc3VtICs9IHZhbHVlO1xuICAgIHN0YXRzLnN1bVNxdWFyZXMgKz0gdmFsdWUgKiB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPCAwLjAwMDAwMSkge1xuICAgICAgICBzdGF0cy5sb2duN1ZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2duN0NvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDAuMDAwMDEpIHtcbiAgICAgICAgc3RhdHMubG9nbjZWYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdHMubG9nbjZDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwLjAwMDEpIHtcbiAgICAgICAgc3RhdHMubG9nbjVWYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdHMubG9nbjVDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwLjAwMSkge1xuICAgICAgICBzdGF0cy5sb2duNFZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2duNENvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDAuMDEpIHtcbiAgICAgICAgc3RhdHMubG9nbjNWYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdHMubG9nbjNDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAwLjEpIHtcbiAgICAgICAgc3RhdHMubG9nbjJWYWx1ZSArPSB2YWx1ZTtcbiAgICAgICAgc3RhdHMubG9nbjJDb3VudCsrO1xuICAgIH0gZWxzZSBpZiAodmFsdWUgPCAxKSB7XG4gICAgICAgIHN0YXRzLmxvZ24xVmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZ24xQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTApIHtcbiAgICAgICAgc3RhdHMubG9nMFZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2cwVkNvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDEwMCkge1xuICAgICAgICBzdGF0cy5sb2cxVmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzFWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMCkge1xuICAgICAgICBzdGF0cy5sb2cyVmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzJWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMDApIHtcbiAgICAgICAgc3RhdHMubG9nM1ZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2czVkNvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDEwMDAwMCkge1xuICAgICAgICBzdGF0cy5sb2c0VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzRWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMDAwMCkge1xuICAgICAgICBzdGF0cy5sb2c1VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzVWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMDAwMDApIHtcbiAgICAgICAgc3RhdHMubG9nNlZhbHVlICs9IHZhbHVlO1xuICAgICAgICBzdGF0cy5sb2c2VkNvdW50Kys7XG4gICAgfSBlbHNlIGlmICh2YWx1ZSA8IDEwMDAwMDAwMCkge1xuICAgICAgICBzdGF0cy5sb2c3VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzdWQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHZhbHVlIDwgMTAwMDAwMDAwMCkge1xuICAgICAgICBzdGF0cy5sb2c4VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzhWQ291bnQrKztcbiAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0cy5sb2c5VmFsdWUgKz0gdmFsdWU7XG4gICAgICAgIHN0YXRzLmxvZzlWQ291bnQrKztcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRUb1N0YXRzKHN0YXRzOiBTdGF0c1ZhbHVlLCBvdGhlcjogU3RhdHNWYWx1ZSkge1xuICAgIHN0YXRzLmNvdW50ICs9IG90aGVyLmNvdW50O1xuICAgIHN0YXRzLnN1bSArPSBvdGhlci5zdW07XG4gICAgc3RhdHMuc3VtU3F1YXJlcyArPSBvdGhlci5zdW1TcXVhcmVzO1xuICAgIHN0YXRzLmxvZ243VmFsdWUgKz0gb3RoZXIubG9nbjdWYWx1ZTtcbiAgICBzdGF0cy5sb2duN0NvdW50ICs9IG90aGVyLmxvZ243Q291bnQ7XG4gICAgc3RhdHMubG9nbjZWYWx1ZSArPSBvdGhlci5sb2duNlZhbHVlO1xuICAgIHN0YXRzLmxvZ242Q291bnQgKz0gb3RoZXIubG9nbjZDb3VudDtcbiAgICBzdGF0cy5sb2duNVZhbHVlICs9IG90aGVyLmxvZ241VmFsdWU7XG4gICAgc3RhdHMubG9nbjVDb3VudCArPSBvdGhlci5sb2duNUNvdW50O1xuICAgIHN0YXRzLmxvZ240VmFsdWUgKz0gb3RoZXIubG9nbjRWYWx1ZTtcbiAgICBzdGF0cy5sb2duNENvdW50ICs9IG90aGVyLmxvZ240Q291bnQ7XG4gICAgc3RhdHMubG9nbjNWYWx1ZSArPSBvdGhlci5sb2duM1ZhbHVlO1xuICAgIHN0YXRzLmxvZ24zQ291bnQgKz0gb3RoZXIubG9nbjNDb3VudDtcbiAgICBzdGF0cy5sb2duMlZhbHVlICs9IG90aGVyLmxvZ24yVmFsdWU7XG4gICAgc3RhdHMubG9nbjJDb3VudCArPSBvdGhlci5sb2duMkNvdW50O1xuICAgIHN0YXRzLmxvZ24xVmFsdWUgKz0gb3RoZXIubG9nbjFWYWx1ZTtcbiAgICBzdGF0cy5sb2duMUNvdW50ICs9IG90aGVyLmxvZ24xQ291bnQ7XG4gICAgc3RhdHMubG9nMFZhbHVlICs9IG90aGVyLmxvZzBWYWx1ZTtcbiAgICBzdGF0cy5sb2cwVkNvdW50ICs9IG90aGVyLmxvZzBWQ291bnQ7XG4gICAgc3RhdHMubG9nMVZhbHVlICs9IG90aGVyLmxvZzFWYWx1ZTtcbiAgICBzdGF0cy5sb2cxVkNvdW50ICs9IG90aGVyLmxvZzFWQ291bnQ7XG4gICAgc3RhdHMubG9nMlZhbHVlICs9IG90aGVyLmxvZzJWYWx1ZTtcbiAgICBzdGF0cy5sb2cyVkNvdW50ICs9IG90aGVyLmxvZzJWQ291bnQ7XG4gICAgc3RhdHMubG9nM1ZhbHVlICs9IG90aGVyLmxvZzNWYWx1ZTtcbiAgICBzdGF0cy5sb2czVkNvdW50ICs9IG90aGVyLmxvZzNWQ291bnQ7XG4gICAgc3RhdHMubG9nNFZhbHVlICs9IG90aGVyLmxvZzRWYWx1ZTtcbiAgICBzdGF0cy5sb2c0VkNvdW50ICs9IG90aGVyLmxvZzRWQ291bnQ7XG4gICAgc3RhdHMubG9nNVZhbHVlICs9IG90aGVyLmxvZzVWYWx1ZTtcbiAgICBzdGF0cy5sb2c1VkNvdW50ICs9IG90aGVyLmxvZzVWQ291bnQ7XG4gICAgc3RhdHMubG9nNlZhbHVlICs9IG90aGVyLmxvZzZWYWx1ZTtcbiAgICBzdGF0cy5sb2c2VkNvdW50ICs9IG90aGVyLmxvZzZWQ291bnQ7XG4gICAgc3RhdHMubG9nN1ZhbHVlICs9IG90aGVyLmxvZzdWYWx1ZTtcbiAgICBzdGF0cy5sb2c3VkNvdW50ICs9IG90aGVyLmxvZzdWQ291bnQ7XG4gICAgc3RhdHMubG9nOFZhbHVlICs9IG90aGVyLmxvZzhWYWx1ZTtcbiAgICBzdGF0cy5sb2c4VkNvdW50ICs9IG90aGVyLmxvZzhWQ291bnQ7XG4gICAgc3RhdHMubG9nOVZhbHVlICs9IG90aGVyLmxvZzlWYWx1ZTtcbiAgICBzdGF0cy5sb2c5VkNvdW50ICs9IG90aGVyLmxvZzlWQ291bnQ7XG59XG5cbmludGVyZmFjZSBTdGF0c0J1Y2tldCB7XG4gICAgc3VtOiBudW1iZXI7XG4gICAgY291bnQ6IG51bWJlcjtcbn1cbi8vIE9yZGVyZWQgZnJvbSBsb3dlc3QgYXZlcmFnZSB0byBoaWdoZXN0IGF2ZXJhZ2VcbmZ1bmN0aW9uIGdldFN0YXRzQnVja2V0cyhzdGF0czogU3RhdHNWYWx1ZSk6IFN0YXRzQnVja2V0W10ge1xuICAgIHJldHVybiBbXG4gICAgICAgIHsgc3VtOiBzdGF0cy5sb2duN1ZhbHVlLCBjb3VudDogc3RhdHMubG9nbjdDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nbjZWYWx1ZSwgY291bnQ6IHN0YXRzLmxvZ242Q291bnQgfSxcbiAgICAgICAgeyBzdW06IHN0YXRzLmxvZ241VmFsdWUsIGNvdW50OiBzdGF0cy5sb2duNUNvdW50IH0sXG4gICAgICAgIHsgc3VtOiBzdGF0cy5sb2duNFZhbHVlLCBjb3VudDogc3RhdHMubG9nbjRDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nbjNWYWx1ZSwgY291bnQ6IHN0YXRzLmxvZ24zQ291bnQgfSxcbiAgICAgICAgeyBzdW06IHN0YXRzLmxvZ24yVmFsdWUsIGNvdW50OiBzdGF0cy5sb2duMkNvdW50IH0sXG4gICAgICAgIHsgc3VtOiBzdGF0cy5sb2duMVZhbHVlLCBjb3VudDogc3RhdHMubG9nbjFDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nMFZhbHVlLCBjb3VudDogc3RhdHMubG9nMFZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nMVZhbHVlLCBjb3VudDogc3RhdHMubG9nMVZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nMlZhbHVlLCBjb3VudDogc3RhdHMubG9nMlZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nM1ZhbHVlLCBjb3VudDogc3RhdHMubG9nM1ZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nNFZhbHVlLCBjb3VudDogc3RhdHMubG9nNFZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nNVZhbHVlLCBjb3VudDogc3RhdHMubG9nNVZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nNlZhbHVlLCBjb3VudDogc3RhdHMubG9nNlZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nN1ZhbHVlLCBjb3VudDogc3RhdHMubG9nN1ZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nOFZhbHVlLCBjb3VudDogc3RhdHMubG9nOFZDb3VudCB9LFxuICAgICAgICB7IHN1bTogc3RhdHMubG9nOVZhbHVlLCBjb3VudDogc3RhdHMubG9nOVZDb3VudCB9LFxuICAgIF07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdHNUb3Age1xuICAgIC8vIE5PVEU6IGNvdW50RnJhY3Rpb24gPD0gdmFsdWVGcmFjdGlvbiwgYmVjYXVzZSB3ZSB0YWtlIHRoZSBsYXJnZXN0IHZhbHVlc1xuICAgIGNvdW50RnJhY3Rpb246IG51bWJlcjtcbiAgICB2YWx1ZUZyYWN0aW9uOiBudW1iZXI7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIHRvcEhlYXZ5OiBib29sZWFuO1xufVxuLyoqIElkZW50aWZpZXMgY2FzZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGNvbmNlbnRyYXRlZCBpbiBmZXcgaW5zdGFuY2VzLiBUaGlzIGluZGljYXRlcyBtb3N0IG9mIHRoZSB2YWx1ZSAodGltZSlcbiAqICAgICAgaXMgbm90IHNwZW50IG9uIHRoZSBjb21tb24gY2FzZSwgYnV0IG9uIGFuIG91dGxpZXIuIFdoaWNoIGlzbid0IGEgcHJvYmxlbSwgaXQganVzdCBtZWFucyB0aGF0IHRoZSBtZWFzdXJlbWVudHNcbiAqICAgICAgc2hvdWxkIGJlIG1vcmUgcHJlY2lzZSwgdG8gcHVsbCB0aGF0IGhlYXZ5IGNhc2Ugb3V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RhdHNUb3Aoc3RhdHM6IFN0YXRzVmFsdWUpOiBTdGF0c1RvcCB7XG4gICAgaWYgKHN0YXRzLnN1bSA9PT0gMCkge1xuICAgICAgICByZXR1cm4geyBjb3VudEZyYWN0aW9uOiAxLCB2YWx1ZUZyYWN0aW9uOiAxLCBjb3VudDogMCwgdmFsdWU6IDAsIHRvcEhlYXZ5OiBmYWxzZSwgfTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW5GcmFjdGlvbiA9IDAuMjtcblxuICAgIGxldCB0b3RhbFN1bSA9IHN0YXRzLnN1bTtcbiAgICBsZXQgdG90YWxDb3VudCA9IHN0YXRzLmNvdW50O1xuICAgIGxldCB0b3RhbE1lYW4gPSB0b3RhbFN1bSAvIHRvdGFsQ291bnQ7XG5cbiAgICAvLyBGaW5kIHRoZSBzdW0gYWJvdmUgdGhlIGF2ZXJhZ2UgKHdpdGggYSBtaW5pbXVtIG9mIG1pbkZyYWN0aW9uLCBhcyBzb21ldGltZXMgdGhlcmUgaXNuJ3QgcmVhbGx5IGFueXRoaW5nIGFib3ZlIHRoZSBhdmVyYWdlKVxuICAgIGxldCBidWNrZXRzID0gZ2V0U3RhdHNCdWNrZXRzKHN0YXRzKTtcbiAgICBidWNrZXRzLnJldmVyc2UoKTtcblxuICAgIGxldCBjdXJTdW0gPSAwO1xuICAgIGxldCBjdXJDb3VudCA9IDA7XG4gICAgZm9yIChsZXQgZW50cnkgb2YgYnVja2V0cykge1xuICAgICAgICBsZXQgbWVhbiA9IGVudHJ5LnN1bSAvIGVudHJ5LmNvdW50O1xuICAgICAgICBpZiAoY3VyU3VtID4gdG90YWxTdW0gKiBtaW5GcmFjdGlvbiAmJiBtZWFuIDwgdG90YWxNZWFuKSBicmVhaztcblxuICAgICAgICBjdXJTdW0gKz0gZW50cnkuc3VtO1xuICAgICAgICBjdXJDb3VudCArPSBlbnRyeS5jb3VudDtcbiAgICB9XG5cbiAgICBsZXQgY291bnRGcmFjdGlvbiA9IGN1ckNvdW50IC8gdG90YWxDb3VudDtcbiAgICBsZXQgdmFsdWVGcmFjdGlvbiA9IGN1clN1bSAvIHRvdGFsU3VtO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgY291bnRGcmFjdGlvbixcbiAgICAgICAgdmFsdWVGcmFjdGlvbixcbiAgICAgICAgY291bnQ6IGN1ckNvdW50LFxuICAgICAgICB2YWx1ZTogY3VyU3VtLFxuICAgICAgICAvLyBJZiBtb3JlIHRoYW4gNTAlIGlzIGFib3ZlIHRoZSBhdmVyYWdlLCBpdCdzIHRvcCBoZWF2eVxuICAgICAgICB0b3BIZWF2eTogdmFsdWVGcmFjdGlvbiAvIGNvdW50RnJhY3Rpb24gPiAyICYmIHZhbHVlRnJhY3Rpb24gPiAwLjQsXG4gICAgfTtcbn1cblxuXG5cblxuXG5mdW5jdGlvbiBiZW5jaG1hcmtBZGRUb1N0YXRzKCkge1xuICAgIGxldCBzdGF0cyA9IGNyZWF0ZVN0YXRzVmFsdWUoKTtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGNvdW50ID0gMTAwMDAwMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgYWRkVG9TdGF0c1ZhbHVlKHN0YXRzLCAxMDAwMDAwMDAwMCk7XG4gICAgfVxuICAgIGxldCBlbmQgPSBEYXRlLm5vdygpO1xuICAgIGxldCB0aW1lID0gZW5kIC0gc3RhcnQ7XG4gICAgbGV0IHRpbWVQZXIgPSAodGltZSkgLyBjb3VudCAqIDEwMDAgKiAxMDAwO1xuICAgIGNvbnNvbGUubG9nKGBUaW1lIHBlcjogJHt0aW1lUGVyfW5zLCBpbiAke3RpbWV9bXNgKTtcbn1cbi8vYmVuY2htYXJrQWRkVG9TdGF0cygpOyJdfQ==
202
+ /* _JS_SOURCE_HASH = "34c3da06d9308a7411dda3bccbd852eb60775b064ebec51cc9c4b413d9ee8e47"; */
@@ -0,0 +1,45 @@
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.formatStats = exports.percent = void 0;
4
+ const format_1 = require("../formatting/format");
5
+ const logColors_1 = require("../formatting/logColors");
6
+ const misc_1 = require("../misc");
7
+ const stats_1 = require("./stats");
8
+ function percent(value) {
9
+ return `${(value * 100).toFixed(2)}%`;
10
+ }
11
+ exports.percent = percent;
12
+ function formatStats(stats, config) {
13
+ function p(count, text) {
14
+ return String(text).padStart(count, " ");
15
+ }
16
+ let perText = (0, format_1.formatTime)(stats.sum / stats.count);
17
+ let countText = (0, format_1.formatNumber)(stats.count);
18
+ let sumText = (0, format_1.formatTime)(stats.sum);
19
+ let equation = (!(config === null || config === void 0 ? void 0 : config.noSum) && `${p(6, sumText)} = ` || "") + `${p(6, countText)} * ${p(6, perText)}`;
20
+ let top = (0, stats_1.getStatsTop)(stats);
21
+ if (top.topHeavy) {
22
+ let topText = (0, format_1.formatTime)(top.value / top.count);
23
+ let topCountText = (0, format_1.formatNumber)(top.count);
24
+ let bottomText = (0, format_1.formatTime)((stats.sum - top.value) / (stats.count - top.count) || 0);
25
+ let bottomCountText = (0, format_1.formatNumber)(stats.count - top.count);
26
+ let topPart = `${topCountText} * ${p(6, topText)}`;
27
+ let bottomPart = `${bottomCountText} * ${bottomText}`;
28
+ if (!(config === null || config === void 0 ? void 0 : config.noColor)) {
29
+ if ((0, misc_1.isNode)()) {
30
+ topPart = (0, logColors_1.red)(topPart);
31
+ }
32
+ else {
33
+ bottomPart = (0, logColors_1.white)(bottomPart);
34
+ }
35
+ }
36
+ equation = (!(config === null || config === void 0 ? void 0 : config.noSum) && `${p(6, sumText)} = ` || "") + `${p(6, topPart)} + ${bottomPart}`;
37
+ }
38
+ if (config === null || config === void 0 ? void 0 : config.noSpaces) {
39
+ equation = equation.replace(/\s+/g, " ").trim();
40
+ }
41
+ return equation;
42
+ }
43
+ exports.formatStats = formatStats;
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHNGb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGF0c0Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxpREFBZ0U7QUFDaEUsdURBQXFEO0FBQ3JELGtDQUFpQztBQUNqQyxtQ0FBa0Q7QUFFbEQsU0FBZ0IsT0FBTyxDQUFDLEtBQWE7SUFDakMsT0FBTyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFDLENBQUM7QUFGRCwwQkFFQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxLQUFpQixFQUFFLE1BSTlDO0lBQ0csU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLElBQXFCO1FBQzNDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELElBQUksT0FBTyxHQUFHLElBQUEsbUJBQVUsRUFBQyxLQUFLLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxJQUFJLFNBQVMsR0FBRyxJQUFBLHFCQUFZLEVBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLElBQUksT0FBTyxHQUFHLElBQUEsbUJBQVUsRUFBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUEsTUFBTSxhQUFOLE1BQU0sdUJBQU4sTUFBTSxDQUFFLEtBQUssQ0FBQSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUM7SUFFMUcsSUFBSSxHQUFHLEdBQUcsSUFBQSxtQkFBVyxFQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdCLElBQUksR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2YsSUFBSSxPQUFPLEdBQUcsSUFBQSxtQkFBVSxFQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hELElBQUksWUFBWSxHQUFHLElBQUEscUJBQVksRUFBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxVQUFVLEdBQUcsSUFBQSxtQkFBVSxFQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RixJQUFJLGVBQWUsR0FBRyxJQUFBLHFCQUFZLEVBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUQsSUFBSSxPQUFPLEdBQUcsR0FBRyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ25ELElBQUksVUFBVSxHQUFHLEdBQUcsZUFBZSxNQUFNLFVBQVUsRUFBRSxDQUFDO1FBQ3RELElBQUksQ0FBQyxDQUFBLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxPQUFPLENBQUEsRUFBRSxDQUFDO1lBQ25CLElBQUksSUFBQSxhQUFNLEdBQUUsRUFBRSxDQUFDO2dCQUNYLE9BQU8sR0FBRyxJQUFBLGVBQUcsRUFBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osVUFBVSxHQUFHLElBQUEsaUJBQUssRUFBQyxVQUFVLENBQUMsQ0FBQztZQUNuQyxDQUFDO1FBQ0wsQ0FBQztRQUNELFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQSxNQUFNLGFBQU4sTUFBTSx1QkFBTixNQUFNLENBQUUsS0FBSyxDQUFBLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLFVBQVUsRUFBRSxDQUFDO0lBQ3ZHLENBQUM7SUFDRCxJQUFJLE1BQU0sYUFBTixNQUFNLHVCQUFOLE1BQU0sQ0FBRSxRQUFRLEVBQUUsQ0FBQztRQUNuQixRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUNELE9BQU8sUUFBUSxDQUFDO0FBQ3BCLENBQUM7QUFuQ0Qsa0NBbUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9ybWF0VGltZSwgZm9ybWF0TnVtYmVyIH0gZnJvbSBcIi4uL2Zvcm1hdHRpbmcvZm9ybWF0XCI7XG5pbXBvcnQgeyByZWQsIHdoaXRlIH0gZnJvbSBcIi4uL2Zvcm1hdHRpbmcvbG9nQ29sb3JzXCI7XG5pbXBvcnQgeyBpc05vZGUgfSBmcm9tIFwiLi4vbWlzY1wiO1xuaW1wb3J0IHsgU3RhdHNWYWx1ZSwgZ2V0U3RhdHNUb3AgfSBmcm9tIFwiLi9zdGF0c1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gcGVyY2VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgcmV0dXJuIGAkeyh2YWx1ZSAqIDEwMCkudG9GaXhlZCgyKX0lYDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFN0YXRzKHN0YXRzOiBTdGF0c1ZhbHVlLCBjb25maWc/OiB7XG4gICAgbm9Db2xvcj86IGJvb2xlYW47XG4gICAgbm9TdW0/OiBib29sZWFuO1xuICAgIG5vU3BhY2VzPzogYm9vbGVhbjtcbn0pIHtcbiAgICBmdW5jdGlvbiBwKGNvdW50OiBudW1iZXIsIHRleHQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICByZXR1cm4gU3RyaW5nKHRleHQpLnBhZFN0YXJ0KGNvdW50LCBcIiBcIik7XG4gICAgfVxuXG4gICAgbGV0IHBlclRleHQgPSBmb3JtYXRUaW1lKHN0YXRzLnN1bSAvIHN0YXRzLmNvdW50KTtcbiAgICBsZXQgY291bnRUZXh0ID0gZm9ybWF0TnVtYmVyKHN0YXRzLmNvdW50KTtcbiAgICBsZXQgc3VtVGV4dCA9IGZvcm1hdFRpbWUoc3RhdHMuc3VtKTtcbiAgICBsZXQgZXF1YXRpb24gPSAoIWNvbmZpZz8ubm9TdW0gJiYgYCR7cCg2LCBzdW1UZXh0KX0gPSAgYCB8fCBcIlwiKSArIGAke3AoNiwgY291bnRUZXh0KX0gKiAke3AoNiwgcGVyVGV4dCl9YDtcblxuICAgIGxldCB0b3AgPSBnZXRTdGF0c1RvcChzdGF0cyk7XG4gICAgaWYgKHRvcC50b3BIZWF2eSkge1xuICAgICAgICBsZXQgdG9wVGV4dCA9IGZvcm1hdFRpbWUodG9wLnZhbHVlIC8gdG9wLmNvdW50KTtcbiAgICAgICAgbGV0IHRvcENvdW50VGV4dCA9IGZvcm1hdE51bWJlcih0b3AuY291bnQpO1xuICAgICAgICBsZXQgYm90dG9tVGV4dCA9IGZvcm1hdFRpbWUoKHN0YXRzLnN1bSAtIHRvcC52YWx1ZSkgLyAoc3RhdHMuY291bnQgLSB0b3AuY291bnQpIHx8IDApO1xuICAgICAgICBsZXQgYm90dG9tQ291bnRUZXh0ID0gZm9ybWF0TnVtYmVyKHN0YXRzLmNvdW50IC0gdG9wLmNvdW50KTtcbiAgICAgICAgbGV0IHRvcFBhcnQgPSBgJHt0b3BDb3VudFRleHR9ICogJHtwKDYsIHRvcFRleHQpfWA7XG4gICAgICAgIGxldCBib3R0b21QYXJ0ID0gYCR7Ym90dG9tQ291bnRUZXh0fSAqICR7Ym90dG9tVGV4dH1gO1xuICAgICAgICBpZiAoIWNvbmZpZz8ubm9Db2xvcikge1xuICAgICAgICAgICAgaWYgKGlzTm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgdG9wUGFydCA9IHJlZCh0b3BQYXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYm90dG9tUGFydCA9IHdoaXRlKGJvdHRvbVBhcnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVxdWF0aW9uID0gKCFjb25maWc/Lm5vU3VtICYmIGAke3AoNiwgc3VtVGV4dCl9ID0gYCB8fCBcIlwiKSArIGAke3AoNiwgdG9wUGFydCl9ICAgKyAgJHtib3R0b21QYXJ0fWA7XG4gICAgfVxuICAgIGlmIChjb25maWc/Lm5vU3BhY2VzKSB7XG4gICAgICAgIGVxdWF0aW9uID0gZXF1YXRpb24ucmVwbGFjZSgvXFxzKy9nLCBcIiBcIikudHJpbSgpO1xuICAgIH1cbiAgICByZXR1cm4gZXF1YXRpb247XG59Il19
45
+ /* _JS_SOURCE_HASH = "c1203d6ed964b28ac79386911e4c6e74248215339c447df4344b77d4c29e14f2"; */
@@ -1,5 +1,6 @@
1
1
  import debugbreak from "debugbreak";
2
2
  import { isNode } from "../misc";
3
+ import { createSingleton } from "../createSingleton";
3
4
  // TODO: We could probably make this an optional / dev dependency, to allow
4
5
  // for use on machines without the ability to compile?
5
6
  //import { now } from "rdtsc-now";
@@ -15,7 +16,12 @@ export type OwnTimeObjInternal = OwnTimeObj & {
15
16
  firstStartTime: number;
16
17
  };
17
18
 
18
- let openTimes: OwnTimeObjInternal[] = [];
19
+ // Shared across every copy of this package loaded in the process, so a profile started via one
20
+ // copy's startMeasure nests correctly with getOwnTime calls made through another copy. The
21
+ // open-time stack MUST be a single instance, otherwise cross-copy nesting/own-time accounting
22
+ // breaks (a function wrapped by copy A calling one wrapped by copy B would push onto a different
23
+ // stack). See createSingleton.
24
+ const openTimes = createSingleton("measure.openTimes", 1, () => [] as OwnTimeObjInternal[]).get();
19
25
 
20
26
  export function getOpenTimesBase(): OwnTimeObjInternal[] {
21
27
  return openTimes;
@@ -7,25 +7,32 @@ import { addToStats, addToStatsValue, createStatsValue, getStatsTop, StatsValue
7
7
  import { white } from "../formatting/logColors";
8
8
  import { isNode } from "../misc";
9
9
  import { formatStats, percent } from "./statsFormat";
10
-
11
- let measurementsDisabled = false;
10
+ import { createSingleton } from "../createSingleton";
11
+
12
+ // Shared across every copy of this package loaded in the process, so enable/disableMeasurements
13
+ // on any copy is honored by every copy's measureWrap, and so the skipped-function warning counts
14
+ // across all copies. Held as a mutated-in-place object because the flags are reassigned. See
15
+ // createSingleton.
16
+ const measureState = createSingleton("measure.state", 1, () => ({
17
+ measurementsEnabled: true,
18
+ measurementsDisabled: false,
19
+ functionsSkipped: 0,
20
+ })).get();
12
21
  /** NOTE: Must be called BEFORE anything else is imported!
13
22
  * NOTE: Measurements on on by default now, so this doesn't really need to be called...
14
23
  */
15
24
  export function enableMeasurements() {
16
- if (functionsSkipped) {
17
- console.warn(red(`Skipped measure shimming ${functionsSkipped} functions. Fix this by calling enableMeasurements before any other imports.`));
25
+ if (measureState.functionsSkipped) {
26
+ console.warn(red(`Skipped measure shimming ${measureState.functionsSkipped} functions. Fix this by calling enableMeasurements before any other imports.`));
18
27
  }
19
- measurementsEnabled = true;
28
+ measureState.measurementsEnabled = true;
20
29
  }
21
30
  /** NOTE: Must be called BEFORE anything else is imported! */
22
31
  export function disableMeasurements() {
23
- measurementsEnabled = false;
24
- measurementsDisabled = true;
32
+ measureState.measurementsEnabled = false;
33
+ measureState.measurementsDisabled = true;
25
34
  }
26
35
 
27
- let functionsSkipped = 0;
28
-
29
36
  const measureOverhead = 5 / 1000;
30
37
 
31
38
  const AsyncFunction = (async () => { }).constructor;
@@ -60,8 +67,8 @@ export function nameFunction<T extends Function>(name: string, fnc: T) {
60
67
  }
61
68
  // NOTE: Handles promises correctly
62
69
  export function measureWrap<T extends (...args: any[]) => any>(fnc: T, name?: string): T {
63
- if (!measurementsEnabled) {
64
- functionsSkipped++;
70
+ if (!measureState.measurementsEnabled) {
71
+ measureState.functionsSkipped++;
65
72
  return fnc;
66
73
  }
67
74
  let usedName = name || fnc.name || fnc.toString().slice(0, 100).replaceAll(/\s/g, " ");
@@ -78,7 +85,8 @@ export function measureBlock<T extends (...args: any[]) => any>(fnc: T, name?: s
78
85
  return measureWrap(fnc, name)();
79
86
  }
80
87
 
81
- let extraInfoGetters: (() => string | undefined)[] = [];
88
+ // Shared across copies so registerMeasureInfo on any copy is seen by logMeasureTable. See createSingleton.
89
+ const extraInfoGetters = createSingleton("measure.extraInfoGetters", 1, () => [] as (() => string | undefined)[]).get();
82
90
  /** NOTE: You should often call registerNodeMetadata for this as well. registerMeasureInfo
83
91
  * is for logs, while registerNodeMetadata is for the overview page.
84
92
  */
@@ -92,7 +100,7 @@ export function registerMeasureInfo(getInfo: () => string | undefined) {
92
100
  export function startMeasure(): {
93
101
  finish: () => MeasureProfile;
94
102
  } {
95
- if (!measurementsEnabled && !measurementsDisabled) {
103
+ if (!measureState.measurementsEnabled && !measureState.measurementsDisabled) {
96
104
  console.warn(red(`To capture measurements enableMeasurements() must be called before any other imports in your entry point`));
97
105
  }
98
106
  let now = Date.now();
@@ -355,9 +363,10 @@ interface ProfileEntry {
355
363
  stillOpenCount: number;
356
364
  }
357
365
 
358
- let measurementsEnabled = true;
359
-
360
- let outstandingProfiles: MeasureProfile[] = [];
366
+ // Shared across copies so a profile started through one copy captures measureWrap'd functions from
367
+ // every other copy - otherwise a profile would only ever see functions wrapped by its own copy.
368
+ // See createSingleton.
369
+ const outstandingProfiles = createSingleton("measure.outstandingProfiles", 1, () => [] as MeasureProfile[]).get();
361
370
  (globalThis as any).outstandingProfiles = outstandingProfiles;
362
371
  function recordOwnTime(ownTimeObj: OwnTimeObj) {
363
372
  if (outstandingProfiles.length === 0) return;
package/test.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { computeTweenedOffset, getTimeComponentsDetailed, waitForFirstTimeSync } from "./time/trueTimeShim";
1
+ import { getTimeComponentsDetailed, waitForFirstTimeSync } from "./time/trueTimeShim";
2
2
  import * as fs from "fs";
3
3
  import * as path from "path";
4
4
 
@@ -19,6 +19,7 @@ async function sampleMode() {
19
19
  toOffset: number;
20
20
  fromTime: number;
21
21
  toTime: number;
22
+ fraction: number;
22
23
  };
23
24
 
24
25
  const samples: Sample[] = [];
@@ -27,8 +28,11 @@ async function sampleMode() {
27
28
  for (let i = 0; i < SAMPLE_COUNT; i++) {
28
29
  const detailed = getTimeComponentsDetailed();
29
30
 
30
- // Calculate the tween using the same systemTime
31
- const offset = computeTweenedOffset(detailed);
31
+ // Calculate smearing using the same systemTime
32
+ const elapsed = detailed.systemTime - detailed.fromTime;
33
+ const duration = detailed.toTime - detailed.fromTime;
34
+ const fraction = duration > 0 ? Math.min(1, elapsed / duration) : 0;
35
+ const offset = detailed.fromOffset + (detailed.toOffset - detailed.fromOffset) * fraction;
32
36
 
33
37
  samples.push({
34
38
  id: TEST_RUN_ID,
@@ -38,6 +42,7 @@ async function sampleMode() {
38
42
  toOffset: detailed.toOffset,
39
43
  fromTime: detailed.fromTime,
40
44
  toTime: detailed.toTime,
45
+ fraction,
41
46
  });
42
47
 
43
48
  if (SAMPLE_INTERVAL_MS > 0) {
@@ -83,6 +88,7 @@ async function verifyMode() {
83
88
  toOffset: number;
84
89
  fromTime: number;
85
90
  toTime: number;
91
+ fraction: number;
86
92
  file: string;
87
93
  };
88
94
 
@@ -120,13 +126,13 @@ async function verifyMode() {
120
126
  console.error(` systemTime: ${prev.systemTime}`);
121
127
  console.error(` offset: ${prev.offset}`);
122
128
  console.error(` trueTime: ${prevTrueTime}`);
123
- console.error(` tween: ${prev.fromOffset} -> ${prev.toOffset}`);
129
+ console.error(` smearing: ${prev.fromOffset} -> ${prev.toOffset} (${(prev.fraction * 100).toFixed(2)}%)`);
124
130
  console.error(` timeWindow: ${prev.fromTime} -> ${prev.toTime}`);
125
131
  console.error(` Current [ID: ${sample.id}, file: ${sample.file}]:`);
126
132
  console.error(` systemTime: ${sample.systemTime}`);
127
133
  console.error(` offset: ${sample.offset}`);
128
134
  console.error(` trueTime: ${trueTime}`);
129
- console.error(` tween: ${sample.fromOffset} -> ${sample.toOffset}`);
135
+ console.error(` smearing: ${sample.fromOffset} -> ${sample.toOffset} (${(sample.fraction * 100).toFixed(2)}%)`);
130
136
  console.error(` timeWindow: ${sample.fromTime} -> ${sample.toTime}`);
131
137
  console.error(` Difference: ${trueTime - lastTrueTime}ms`);
132
138
  }