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,396 @@
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.formatPercent = exports.formatDate = exports.formatVeryNiceDateTime = exports.formatNiceDateTime = exports.formatFileTimestampLocal = exports.formatDateTimeDetailed = exports.formatDateTime = exports.formatBinaryNumber = exports.formatNumber = exports.formatMaxDecimals = exports.getTargetDecimals = exports.formatTime = void 0;
4
+ function formatTime(milliseconds, maxAbsoluteValue) {
5
+ if (typeof milliseconds !== "number")
6
+ return "";
7
+ if (milliseconds === 0)
8
+ return "0ms";
9
+ if (milliseconds < 0) {
10
+ return "-" + formatTime(-milliseconds, maxAbsoluteValue);
11
+ }
12
+ let scale = milliseconds;
13
+ if (maxAbsoluteValue) {
14
+ scale = Math.max(scale, maxAbsoluteValue);
15
+ }
16
+ if (scale < 1 / 1000) {
17
+ return formatMaxDecimals(milliseconds * 1000 * 1000, 3) + "ns";
18
+ }
19
+ else if (scale < 1) {
20
+ return formatMaxDecimals(milliseconds * 1000, 3) + "us";
21
+ }
22
+ else if (scale < 1000) {
23
+ return formatMaxDecimals(milliseconds, 3) + "ms";
24
+ // Use seconds until we have 10 minutes, as decimal minutes are confusing
25
+ }
26
+ else if (scale < 1000 * 60 * 10) {
27
+ return formatMaxDecimals(milliseconds / 1000, 3) + "s";
28
+ }
29
+ else if (scale < 1000 * 60 * 60) {
30
+ return formatMaxDecimals(milliseconds / 1000 / 60, 3) + "m";
31
+ }
32
+ else if (scale < 1000 * 60 * 60 * 24) {
33
+ return formatMaxDecimals(milliseconds / 1000 / 60 / 60, 3) + "h";
34
+ // } else if (milliseconds < 1000 * 60 * 60 * 24 * 10) {
35
+ // let remaining = Math.round(milliseconds / 1000);
36
+ // let seconds = remaining % 60;
37
+ // remaining -= seconds;
38
+ // remaining /= 60;
39
+ // let minutes = remaining % 60;
40
+ // remaining -= minutes;
41
+ // remaining /= 60;
42
+ // let hours = remaining;
43
+ // remaining -= hours;
44
+ // remaining /= 24;
45
+ // let days = remaining;
46
+ // let time = `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
47
+ // if (days > 0) {
48
+ // if (days === 1) {
49
+ // time = `1 day ${time}`;
50
+ // } else {
51
+ // time = `${days} days ${time}`;
52
+ // }
53
+ // }
54
+ // return time;
55
+ }
56
+ else {
57
+ let days = Math.round(milliseconds / 1000 / 60 / 60 / 24);
58
+ return `${days} days`;
59
+ }
60
+ }
61
+ exports.formatTime = formatTime;
62
+ function getTargetDecimals(maxAbsoluteValue, targetDigits) {
63
+ let intDigits = Math.floor(Math.log10(maxAbsoluteValue) + 1);
64
+ if (intDigits < 0)
65
+ intDigits = 1;
66
+ let decimalDigits = targetDigits - intDigits;
67
+ // Happens if the number is so close to having too many digits that Math.log10 rounds it over.
68
+ if (decimalDigits < 0) {
69
+ decimalDigits = 0;
70
+ }
71
+ return decimalDigits;
72
+ }
73
+ exports.getTargetDecimals = getTargetDecimals;
74
+ /** Adds decimal digits to reach digits. If the number is simply too large, it won't remove
75
+ * digits, there will instead just be no decimal point.
76
+ */
77
+ function formatMaxDecimals(num, targetDigits, maxAbsoluteValue, exactDecimals) {
78
+ var _a;
79
+ if (typeof num !== "number")
80
+ return "0";
81
+ // toFixed has a max of 100 digits
82
+ if (targetDigits > 100)
83
+ targetDigits = 100;
84
+ if (!Number.isFinite(num))
85
+ return num.toFixed(targetDigits);
86
+ if (num < 0)
87
+ return formatMaxDecimals(-num, targetDigits, maxAbsoluteValue, exactDecimals);
88
+ // TIMING:
89
+ // ~50ns toString
90
+ // ~400ns toLocaleString
91
+ // ~500ns toLocaleString("en-us")
92
+ // ~20us toLocaleString("en-us", { maximumFractionDigits: 2 })
93
+ // So, we are avoiding using toLocaleString, for now.
94
+ maxAbsoluteValue = maxAbsoluteValue !== null && maxAbsoluteValue !== void 0 ? maxAbsoluteValue : Math.abs(num);
95
+ let targetDecimals = exactDecimals !== null && exactDecimals !== void 0 ? exactDecimals : getTargetDecimals(maxAbsoluteValue, targetDigits);
96
+ let text = num.toFixed(targetDecimals);
97
+ let parts = text.split(".");
98
+ let integer = parts[0];
99
+ let decimals = (_a = parts[1]) !== null && _a !== void 0 ? _a : "";
100
+ if (exactDecimals) {
101
+ while (decimals.length < exactDecimals) {
102
+ decimals += "0";
103
+ }
104
+ }
105
+ else {
106
+ while (decimals[decimals.length - 1] === "0") {
107
+ decimals = decimals.slice(0, -1);
108
+ }
109
+ }
110
+ let output = "";
111
+ // NOTE: ONLY add comma groups if it is > 4 digits. As 4234K is easily read, and commas
112
+ // only really matter for numbers such as 4234523K, which is hard to read.
113
+ if (integer.length > 4) {
114
+ for (let i = integer.length; i > 0; i -= 3) {
115
+ let start = i - 3;
116
+ if (start < 0)
117
+ start = 0;
118
+ let str = integer.slice(start, i);
119
+ if (output) {
120
+ output = "," + output;
121
+ }
122
+ output = str + output;
123
+ }
124
+ }
125
+ else {
126
+ output = integer;
127
+ }
128
+ if (decimals) {
129
+ output += "." + decimals;
130
+ }
131
+ return output;
132
+ }
133
+ exports.formatMaxDecimals = formatMaxDecimals;
134
+ /** Actually formats any number, including decimals, by using K, M and B suffixes to get smaller values
135
+ * TODO: Support uK, uM and uB suffixes for very small numbers?
136
+ * <= 6 characters (<= 5 if positive)
137
+ */
138
+ function formatNumber(count, maxAbsoluteValue, noDecimal, specialCurrency) {
139
+ if (typeof count !== "number")
140
+ return "0";
141
+ if (count < 0) {
142
+ return "-" + formatNumber(-count, maxAbsoluteValue, noDecimal, specialCurrency);
143
+ }
144
+ maxAbsoluteValue = maxAbsoluteValue !== null && maxAbsoluteValue !== void 0 ? maxAbsoluteValue : Math.abs(count);
145
+ let maxDecimals = 3;
146
+ // NOTE: We don't switch units as soon as we possible can, because...
147
+ // 3.594 vs 3.584 is harder to quickly distinguish compared to 3594 and 3584,
148
+ // the decimal simply makes it harder to read, and larger.
149
+ // NOTE: This number should prevent us from ever using 5 digits, so that we never need commas
150
+ // For example, if the factor is 10 then, 9999.5 is kept with a divisor of 1, and then rounds up to
151
+ // "10,000". So we want any value which rounds up at 5 digits to be put in the next group (and having
152
+ // extra values put in the next group is fine, as we won't show the decimal value anyways, so it only
153
+ // means 9999 wraps around to 10K a bit faster).
154
+ const extraFactor = 9.99949999;
155
+ let divisor = 1;
156
+ let suffix = "";
157
+ let currencyDecimalsNeeded = false;
158
+ if (maxAbsoluteValue < 0.00000001) {
159
+ maxDecimals = 12;
160
+ }
161
+ else if (maxAbsoluteValue < 0.0000001) {
162
+ maxDecimals = 11;
163
+ }
164
+ else if (maxAbsoluteValue < 0.000001) {
165
+ maxDecimals = 10;
166
+ }
167
+ else if (maxAbsoluteValue < 0.00001) {
168
+ maxDecimals = 9;
169
+ }
170
+ else if (maxAbsoluteValue < 0.0001) {
171
+ maxDecimals = 8;
172
+ }
173
+ else if (maxAbsoluteValue < 0.001) {
174
+ maxDecimals = 7;
175
+ }
176
+ else if (maxAbsoluteValue < 0.01) {
177
+ maxDecimals = 6;
178
+ }
179
+ else if (maxAbsoluteValue < 0.1) {
180
+ maxDecimals = 5;
181
+ }
182
+ else if (maxAbsoluteValue < 1000 * extraFactor) {
183
+ if (specialCurrency) {
184
+ currencyDecimalsNeeded = true;
185
+ }
186
+ }
187
+ else if (maxAbsoluteValue < 1000 * 1000 * extraFactor) {
188
+ suffix = "K";
189
+ divisor = 1000;
190
+ }
191
+ else if (maxAbsoluteValue < 1000 * 1000 * 1000 * extraFactor) {
192
+ suffix = "M";
193
+ divisor = 1000 * 1000;
194
+ }
195
+ else if (maxAbsoluteValue < 1000 * 1000 * 1000 * 1000 * extraFactor) {
196
+ suffix = "B";
197
+ divisor = 1000 * 1000 * 1000;
198
+ }
199
+ else if (maxAbsoluteValue < 1000 * 1000 * 1000 * 1000 * 1000 * extraFactor) {
200
+ suffix = "T";
201
+ divisor = 1000 * 1000 * 1000 * 1000;
202
+ }
203
+ else {
204
+ suffix = "Q";
205
+ divisor = 1000 * 1000 * 1000 * 1000 * 1000;
206
+ }
207
+ count /= divisor;
208
+ maxAbsoluteValue /= divisor;
209
+ if (noDecimal) {
210
+ maxDecimals = 0;
211
+ }
212
+ return formatMaxDecimals(count, maxDecimals, maxAbsoluteValue, currencyDecimalsNeeded ? 2 : undefined) + suffix;
213
+ }
214
+ exports.formatNumber = formatNumber;
215
+ function formatBinaryNumber(count, maxAbsoluteValue, noDecimal, specialCurrency) {
216
+ if (typeof count !== "number")
217
+ return "0";
218
+ if (count < 0) {
219
+ return "-" + formatNumber(-count, maxAbsoluteValue, noDecimal, specialCurrency);
220
+ }
221
+ maxAbsoluteValue = maxAbsoluteValue !== null && maxAbsoluteValue !== void 0 ? maxAbsoluteValue : Math.abs(count);
222
+ // NOTE: We don't switch units as soon as we possible can, because...
223
+ // 3.594 vs 3.584 is harder to quickly distinguish compared to 3594 and 3584,
224
+ // the decimal simply makes it harder to read, and larger.
225
+ // NOTE: This number should prevent us from ever using 5 digits, so that we never need commas
226
+ // For example, if the factor is 10 then, 9999.5 is kept with a divisor of 1, and then rounds up to
227
+ // "10,000". So we want any value which rounds up at 5 digits to be put in the next group (and having
228
+ // extra values put in the next group is fine, as we won't show the decimal value anyways, so it only
229
+ // means 9999 wraps around to 10K a bit faster).
230
+ const extraFactor = 9.99949999;
231
+ let divisor = 1;
232
+ let suffix = "";
233
+ let currencyDecimalsNeeded = false;
234
+ if (maxAbsoluteValue < 1024 * extraFactor) {
235
+ if (specialCurrency) {
236
+ currencyDecimalsNeeded = true;
237
+ }
238
+ }
239
+ else if (maxAbsoluteValue < 1024 * 1024 * extraFactor) {
240
+ suffix = "K";
241
+ divisor = 1024;
242
+ }
243
+ else if (maxAbsoluteValue < 1024 * 1024 * 1024 * extraFactor) {
244
+ suffix = "M";
245
+ divisor = 1024 * 1024;
246
+ }
247
+ else {
248
+ suffix = "G";
249
+ divisor = 1024 * 1024 * 1024;
250
+ }
251
+ count /= divisor;
252
+ maxAbsoluteValue /= divisor;
253
+ let maxDecimals = noDecimal ? 0 : 3;
254
+ return formatMaxDecimals(count, maxDecimals, maxAbsoluteValue, currencyDecimalsNeeded ? 2 : undefined) + suffix;
255
+ }
256
+ exports.formatBinaryNumber = formatBinaryNumber;
257
+ /** YYYY/MM/DD HH:MM:SS PM/AM */
258
+ function formatDateTime(time) {
259
+ function p(s) {
260
+ return s.toString().padStart(2, "0");
261
+ }
262
+ let date = new Date(time);
263
+ let hours = date.getHours();
264
+ let minutes = date.getMinutes();
265
+ let seconds = date.getSeconds();
266
+ let ampm = hours >= 12 ? "PM" : "AM";
267
+ hours = hours % 12;
268
+ hours = hours ? hours : 12; // the hour '0' should be '12'
269
+ let strTime = p(hours) + ":" + p(minutes) + ":" + p(seconds) + " " + ampm;
270
+ return date.getFullYear() + "/" + p(date.getMonth() + 1) + "/" + p(date.getDate()) + " " + strTime;
271
+ }
272
+ exports.formatDateTime = formatDateTime;
273
+ function formatDateTimeDetailed(time) {
274
+ function p(s) {
275
+ return s.toString().padStart(2, "0");
276
+ }
277
+ let date = new Date(time);
278
+ let hours = date.getHours();
279
+ let minutes = date.getMinutes();
280
+ let seconds = date.getSeconds();
281
+ let milliseconds = date.getMilliseconds();
282
+ let millisecondsString = milliseconds.toString().padStart(3, "0");
283
+ let timeString = time.toString();
284
+ let decimalIndex = timeString.indexOf(".");
285
+ if (decimalIndex !== -1) {
286
+ let fractionalPart = timeString.substring(decimalIndex + 1);
287
+ millisecondsString += fractionalPart;
288
+ }
289
+ let ampm = hours >= 12 ? "PM" : "AM";
290
+ hours = hours % 12;
291
+ hours = hours ? hours : 12; // the hour '0' should be '12'
292
+ let strTime = p(hours) + ":" + p(minutes) + ":" + p(seconds) + "." + millisecondsString + " " + ampm;
293
+ return date.getFullYear() + "/" + p(date.getMonth() + 1) + "/" + p(date.getDate()) + " " + strTime;
294
+ }
295
+ exports.formatDateTimeDetailed = formatDateTimeDetailed;
296
+ // Lookup table for common timezone abbreviations by UTC offset (in minutes)
297
+ const timezoneAbbreviations = {
298
+ // UTC and GMT
299
+ "0": "UTC",
300
+ // US/Canada timezones
301
+ "300": "EST", // UTC-5 (Eastern Standard Time)
302
+ "240": "EDT", // UTC-4 (Eastern Daylight Time)
303
+ "360": "CST", // UTC-6 (Central Standard Time)
304
+ "420": "MST", // UTC-7 (Mountain Standard Time)
305
+ "480": "PST", // UTC-8 (Pacific Standard Time)
306
+ // European timezones
307
+ "-60": "CET", // UTC+1 (Central European Time)
308
+ "-120": "CEST", // UTC+2 (Central European Summer Time)
309
+ // Other common timezones
310
+ "-480": "CST", // UTC+8 (China Standard Time)
311
+ "-540": "JST", // UTC+9 (Japan Standard Time)
312
+ "-330": "IST", // UTC+5:30 (India Standard Time)
313
+ "-570": "ACST", // UTC+9:30 (Australian Central Standard Time)
314
+ "-600": "AEST", // UTC+10 (Australian Eastern Standard Time)
315
+ };
316
+ // YYYY-MM-DD_HH-MM-SS.mmm TIMEZONE
317
+ function formatFileTimestampLocal(time) {
318
+ function p(s) {
319
+ return s.toString().padStart(2, "0");
320
+ }
321
+ let date = new Date(time);
322
+ let year = date.getFullYear();
323
+ let month = p(date.getMonth() + 1);
324
+ let day = p(date.getDate());
325
+ let hours = p(date.getHours());
326
+ let minutes = p(date.getMinutes());
327
+ let seconds = p(date.getSeconds());
328
+ let milliseconds = date.getMilliseconds();
329
+ let millisecondsString = milliseconds.toString().padStart(3, "0");
330
+ let timeString = time.toString();
331
+ let decimalIndex = timeString.indexOf(".");
332
+ if (decimalIndex !== -1) {
333
+ let fractionalPart = timeString.substring(decimalIndex + 1);
334
+ millisecondsString += fractionalPart;
335
+ }
336
+ // Get timezone offset in minutes (negative of getTimezoneOffset because it returns opposite sign)
337
+ let timezoneOffsetMinutes = date.getTimezoneOffset();
338
+ // Look up the abbreviation or fallback to numeric format
339
+ let timezoneString = timezoneAbbreviations[timezoneOffsetMinutes.toString()];
340
+ if (!timezoneString) {
341
+ // Fallback: format as ±HHMM
342
+ let offsetSign = timezoneOffsetMinutes >= 0 ? "+" : "-";
343
+ let offsetHours = p(Math.floor(Math.abs(timezoneOffsetMinutes) / 60));
344
+ let offsetMins = p(Math.abs(timezoneOffsetMinutes) % 60);
345
+ timezoneString = `${offsetSign}${offsetHours}${offsetMins}`;
346
+ }
347
+ return `${year}-${month}-${day}_${hours}-${minutes}-${seconds}.${millisecondsString}_${timezoneString}`;
348
+ }
349
+ exports.formatFileTimestampLocal = formatFileTimestampLocal;
350
+ /** 2024 January 1, Monday, 12:53:02pm */
351
+ function formatNiceDateTime(time) {
352
+ function p(s) {
353
+ return s.toString().padStart(2, "0");
354
+ }
355
+ let date = new Date(time);
356
+ let hours = date.getHours();
357
+ let minutes = date.getMinutes();
358
+ let seconds = date.getSeconds();
359
+ let ampm = hours >= 12 ? "pm" : "am";
360
+ hours = hours % 12;
361
+ hours = hours ? hours : 12; // the hour '0' should be '12'
362
+ let strTime = p(hours) + ":" + p(minutes) + ":" + p(seconds) + ampm;
363
+ let days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
364
+ return date.getFullYear() + " " + date.toLocaleString("default", { month: "long" }) + " " + date.getDate() + ", " + days[date.getDay()] + ", " + strTime;
365
+ }
366
+ exports.formatNiceDateTime = formatNiceDateTime;
367
+ /** 2024 January 1, Monday, 12:53:02pm (4 months ago) */
368
+ function formatVeryNiceDateTime(time) {
369
+ if (!time) {
370
+ return "";
371
+ }
372
+ if (typeof time !== "number") {
373
+ return String(time);
374
+ }
375
+ return `${formatNiceDateTime(time)} (${formatTime(Date.now() - time)})`;
376
+ }
377
+ exports.formatVeryNiceDateTime = formatVeryNiceDateTime;
378
+ /** YYYY/MM/DD */
379
+ function formatDate(time) {
380
+ function p(s) {
381
+ return s.toString().padStart(2, "0");
382
+ }
383
+ let date = new Date(time);
384
+ return date.getFullYear() + "/" + p(date.getMonth() + 1) + "/" + p(date.getDate());
385
+ }
386
+ exports.formatDate = formatDate;
387
+ /** <= 6 characters (<= 5 if positive) */
388
+ function formatPercent(value) {
389
+ if (Number.isNaN(value))
390
+ return "0%";
391
+ // 1 decimal point, so we have 5 characters (just like formatNumber returns 5 characters)
392
+ return Math.round(value * 1000) / 10 + "%";
393
+ }
394
+ exports.formatPercent = formatPercent;
395
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZm9ybWF0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLFNBQWdCLFVBQVUsQ0FBQyxZQUFnQyxFQUFFLGdCQUF5QjtJQUNsRixJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVE7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUNoRCxJQUFJLFlBQVksS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckMsSUFBSSxZQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLFlBQVksQ0FBQztJQUN6QixJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDbkIsS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUNuQixPQUFPLGlCQUFpQixDQUFDLFlBQVksR0FBRyxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNuRSxDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxpQkFBaUIsQ0FBQyxZQUFZLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUM1RCxDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7UUFDdEIsT0FBTyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ2pELHlFQUF5RTtJQUM3RSxDQUFDO1NBQU0sSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUNo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Q0FBQztBQUMvQyxDQUFDO0FBSkQsc0NBSUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gZm9ybWF0VGltZShtaWxsaXNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZCwgbWF4QWJzb2x1dGVWYWx1ZT86IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHR5cGVvZiBtaWxsaXNlY29uZHMgIT09IFwibnVtYmVyXCIpIHJldHVybiBcIlwiO1xuICAgIGlmIChtaWxsaXNlY29uZHMgPT09IDApIHJldHVybiBcIjBtc1wiO1xuICAgIGlmIChtaWxsaXNlY29uZHMgPCAwKSB7XG4gICAgICAgIHJldHVybiBcIi1cIiArIGZvcm1hdFRpbWUoLW1pbGxpc2Vjb25kcywgbWF4QWJzb2x1dGVWYWx1ZSk7XG4gICAgfVxuICAgIGxldCBzY2FsZSA9IG1pbGxpc2Vjb25kcztcbiAgICBpZiAobWF4QWJzb2x1dGVWYWx1ZSkge1xuICAgICAgICBzY2FsZSA9IE1hdGgubWF4KHNjYWxlLCBtYXhBYnNvbHV0ZVZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHNjYWxlIDwgMSAvIDEwMDApIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1heERlY2ltYWxzKG1pbGxpc2Vjb25kcyAqIDEwMDAgKiAxMDAwLCAzKSArIFwibnNcIjtcbiAgICB9IGVsc2UgaWYgKHNjYWxlIDwgMSkge1xuICAgICAgICByZXR1cm4gZm9ybWF0TWF4RGVjaW1hbHMobWlsbGlzZWNvbmRzICogMTAwMCwgMykgKyBcInVzXCI7XG4gICAgfSBlbHNlIGlmIChzY2FsZSA8IDEwMDApIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1heERlY2ltYWxzKG1pbGxpc2Vjb25kcywgMykgKyBcIm1zXCI7XG4gICAgICAgIC8vIFVzZSBzZWNvbmRzIHVudGlsIHdlIGhhdmUgMTAgbWludXRlcywgYXMgZGVjaW1hbCBtaW51dGVzIGFyZSBjb25mdXNpbmdcbiAgICB9IGVsc2UgaWYgKHNjYWxlIDwgMTAwMCAqIDYwICogMTApIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1heERlY2ltYWxzKG1pbGxpc2Vjb25kcyAvIDEwMDAsIDMpICsgXCJzXCI7XG4gICAgfSBlbHNlIGlmIChzY2FsZSA8IDEwMDAgKiA2MCAqIDYwKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRNYXhEZWNpbWFscyhtaWxsaXNlY29uZHMgLyAxMDAwIC8gNjAsIDMpICsgXCJtXCI7XG4gICAgfSBlbHNlIGlmIChzY2FsZSA8IDEwMDAgKiA2MCAqIDYwICogMjQpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdE1heERlY2ltYWxzKG1pbGxpc2Vjb25kcyAvIDEwMDAgLyA2MCAvIDYwLCAzKSArIFwiaFwiO1xuICAgICAgICAvLyB9IGVsc2UgaWYgKG1pbGxpc2Vjb25kcyA8IDEwMDAgKiA2MCAqIDYwICogMjQgKiAxMCkge1xuICAgICAgICAvLyAgICAgbGV0IHJlbWFpbmluZyA9IE1hdGgucm91bmQobWlsbGlzZWNvbmRzIC8gMTAwMCk7XG4gICAgICAgIC8vICAgICBsZXQgc2Vjb25kcyA9IHJlbWFpbmluZyAlIDYwO1xuICAgICAgICAvLyAgICAgcmVtYWluaW5nIC09IHNlY29uZHM7XG4gICAgICAgIC8vICAgICByZW1haW5pbmcgLz0gNjA7XG4gICAgICAgIC8vICAgICBsZXQgbWludXRlcyA9IHJlbWFpbmluZyAlIDYwO1xuICAgICAgICAvLyAgICAgcmVtYWluaW5nIC09IG1pbnV0ZXM7XG4gICAgICAgIC8vICAgICByZW1haW5pbmcgLz0gNjA7XG4gICAgICAgIC8vICAgICBsZXQgaG91cnMgPSByZW1haW5pbmc7XG4gICAgICAgIC8vICAgICByZW1haW5pbmcgLT0gaG91cnM7XG4gICAgICAgIC8vICAgICByZW1haW5pbmcgLz0gMjQ7XG4gICAgICAgIC8vICAgICBsZXQgZGF5cyA9IHJlbWFpbmluZztcbiAgICAgICAgLy8gICAgIGxldCB0aW1lID0gYCR7aG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9OiR7bWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX06JHtzZWNvbmRzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfWA7XG4gICAgICAgIC8vICAgICBpZiAoZGF5cyA+IDApIHtcbiAgICAgICAgLy8gICAgICAgICBpZiAoZGF5cyA9PT0gMSkge1xuICAgICAgICAvLyAgICAgICAgICAgICB0aW1lID0gYDEgZGF5ICR7dGltZX1gO1xuICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIHRpbWUgPSBgJHtkYXlzfSBkYXlzICR7dGltZX1gO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHJldHVybiB0aW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBkYXlzID0gTWF0aC5yb3VuZChtaWxsaXNlY29uZHMgLyAxMDAwIC8gNjAgLyA2MCAvIDI0KTtcbiAgICAgICAgcmV0dXJuIGAke2RheXN9IGRheXNgO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhcmdldERlY2ltYWxzKG1heEFic29sdXRlVmFsdWU6IG51bWJlciwgdGFyZ2V0RGlnaXRzOiBudW1iZXIpIHtcbiAgICBsZXQgaW50RGlnaXRzID0gTWF0aC5mbG9vcihNYXRoLmxvZzEwKG1heEFic29sdXRlVmFsdWUpICsgMSk7XG4gICAgaWYgKGludERpZ2l0cyA8IDApIGludERpZ2l0cyA9IDE7XG4gICAgbGV0IGRlY2ltYWxEaWdpdHMgPSB0YXJnZXREaWdpdHMgLSBpbnREaWdpdHM7XG4gICAgLy8gSGFwcGVucyBpZiB0aGUgbnVtYmVyIGlzIHNvIGNsb3NlIHRvIGhhdmluZyB0b28gbWFueSBkaWdpdHMgdGhhdCBNYXRoLmxvZzEwIHJvdW5kcyBpdCBvdmVyLlxuICAgIGlmIChkZWNpbWFsRGlnaXRzIDwgMCkge1xuICAgICAgICBkZWNpbWFsRGlnaXRzID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIGRlY2ltYWxEaWdpdHM7XG59XG5cbi8qKiBBZGRzIGRlY2ltYWwgZGlnaXRzIHRvIHJlYWNoIGRpZ2l0cy4gSWYgdGhlIG51bWJlciBpcyBzaW1wbHkgdG9vIGxhcmdlLCBpdCB3b24ndCByZW1vdmVcbiAqICAgICAgZGlnaXRzLCB0aGVyZSB3aWxsIGluc3RlYWQganVzdCBiZSBubyBkZWNpbWFsIHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0TWF4RGVjaW1hbHMobnVtOiBudW1iZXIsIHRhcmdldERpZ2l0czogbnVtYmVyLCBtYXhBYnNvbHV0ZVZhbHVlPzogbnVtYmVyLCBleGFjdERlY2ltYWxzPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIG51bSAhPT0gXCJudW1iZXJcIikgcmV0dXJuIFwiMFwiO1xuICAgIC8vIHRvRml4ZWQgaGFzIGEgbWF4IG9mIDEwMCBkaWdpdHNcbiAgICBpZiAodGFyZ2V0RGlnaXRzID4gMTAwKSB0YXJnZXREaWdpdHMgPSAxMDA7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobnVtKSkgcmV0dXJuIG51bS50b0ZpeGVkKHRhcmdldERpZ2l0cyk7XG5cbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIGZvcm1hdE1heERlY2ltYWxzKC1udW0sIHRhcmdldERpZ2l0cywgbWF4QWJzb2x1dGVWYWx1ZSwgZXhhY3REZWNpbWFscyk7XG5cbiAgICAvLyBUSU1JTkc6XG4gICAgLy8gIH41MG5zICAgdG9TdHJpbmdcbiAgICAvLyAgfjQwMG5zICB0b0xvY2FsZVN0cmluZ1xuICAgIC8vICB+NTAwbnMgIHRvTG9jYWxlU3RyaW5nKFwiZW4tdXNcIilcbiAgICAvLyAgfjIwdXMgICB0b0xvY2FsZVN0cmluZyhcImVuLXVzXCIsIHsgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyIH0pXG4gICAgLy8gU28sIHdlIGFyZSBhdm9pZGluZyB1c2luZyB0b0xvY2FsZVN0cmluZywgZm9yIG5vdy5cblxuICAgIG1heEFic29sdXRlVmFsdWUgPSBtYXhBYnNvbHV0ZVZhbHVlID8/IE1hdGguYWJzKG51bSk7XG5cbiAgICBsZXQgdGFyZ2V0RGVjaW1hbHMgPSBleGFjdERlY2ltYWxzID8/IGdldFRhcmdldERlY2ltYWxzKG1heEFic29sdXRlVmFsdWUsIHRhcmdldERpZ2l0cyk7XG4gICAgbGV0IHRleHQgPSBudW0udG9GaXhlZCh0YXJnZXREZWNpbWFscyk7XG4gICAgbGV0IHBhcnRzID0gdGV4dC5zcGxpdChcIi5cIik7XG4gICAgbGV0IGludGVnZXIgPSBwYXJ0c1swXTtcbiAgICBsZXQgZGVjaW1hbHMgPSBwYXJ0c1sxXSA/PyBcIlwiO1xuXG4gICAgaWYgKGV4YWN0RGVjaW1hbHMpIHtcbiAgICAgICAgd2hpbGUgKGRlY2ltYWxzLmxlbmd0aCA8IGV4YWN0RGVjaW1hbHMpIHtcbiAgICAgICAgICAgIGRlY2ltYWxzICs9IFwiMFwiO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgd2hpbGUgKGRlY2ltYWxzW2RlY2ltYWxzLmxlbmd0aCAtIDFdID09PSBcIjBcIikge1xuICAgICAgICAgICAgZGVjaW1hbHMgPSBkZWNpbWFscy5zbGljZSgwLCAtMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgb3V0cHV0ID0gXCJcIjtcblxuICAgIC8vIE5PVEU6IE9OTFkgYWRkIGNvbW1hIGdyb3VwcyBpZiBpdCBpcyA+IDQgZGlnaXRzLiBBcyA0MjM0SyBpcyBlYXNpbHkgcmVhZCwgYW5kIGNvbW1hc1xuICAgIC8vICBvbmx5IHJlYWxseSBtYXR0ZXIgZm9yIG51bWJlcnMgc3VjaCBhcyA0MjM0NTIzSywgd2hpY2ggaXMgaGFyZCB0byByZWFkLlxuICAgIGlmIChpbnRlZ2VyLmxlbmd0aCA+IDQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IGludGVnZXIubGVuZ3RoOyBpID4gMDsgaSAtPSAzKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSBpIC0gMztcbiAgICAgICAgICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMDtcbiAgICAgICAgICAgIGxldCBzdHIgPSBpbnRlZ2VyLnNsaWNlKHN0YXJ0LCBpKTtcbiAgICAgICAgICAgIGlmIChvdXRwdXQpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXQgPSBcIixcIiArIG91dHB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dCA9IHN0ciArIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dCA9IGludGVnZXI7XG4gICAgfVxuXG4gICAgaWYgKGRlY2ltYWxzKSB7XG4gICAgICAgIG91dHB1dCArPSBcIi5cIiArIGRlY2ltYWxzO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKiBBY3R1YWxseSBmb3JtYXRzIGFueSBudW1iZXIsIGluY2x1ZGluZyBkZWNpbWFscywgYnkgdXNpbmcgSywgTSBhbmQgQiBzdWZmaXhlcyB0byBnZXQgc21hbGxlciB2YWx1ZXNcbiAqICAgICAgVE9ETzogU3VwcG9ydCB1SywgdU0gYW5kIHVCIHN1ZmZpeGVzIGZvciB2ZXJ5IHNtYWxsIG51bWJlcnM/XG4gKiAgICAgIDw9IDYgY2hhcmFjdGVycyAoPD0gNSBpZiBwb3NpdGl2ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlcihjb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkLCBtYXhBYnNvbHV0ZVZhbHVlPzogbnVtYmVyLCBub0RlY2ltYWw/OiBib29sZWFuLCBzcGVjaWFsQ3VycmVuY3k/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBpZiAodHlwZW9mIGNvdW50ICE9PSBcIm51bWJlclwiKSByZXR1cm4gXCIwXCI7XG4gICAgaWYgKGNvdW50IDwgMCkge1xuICAgICAgICByZXR1cm4gXCItXCIgKyBmb3JtYXROdW1iZXIoLWNvdW50LCBtYXhBYnNvbHV0ZVZhbHVlLCBub0RlY2ltYWwsIHNwZWNpYWxDdXJyZW5jeSk7XG4gICAgfVxuXG4gICAgbWF4QWJzb2x1dGVWYWx1ZSA9IG1heEFic29sdXRlVmFsdWUgPz8gTWF0aC5hYnMoY291bnQpO1xuXG4gICAgbGV0IG1heERlY2ltYWxzID0gMztcblxuICAgIC8vIE5PVEU6IFdlIGRvbid0IHN3aXRjaCB1bml0cyBhcyBzb29uIGFzIHdlIHBvc3NpYmxlIGNhbiwgYmVjYXVzZS4uLlxuICAgIC8vICAzLjU5NCB2cyAzLjU4NCBpcyBoYXJkZXIgdG8gcXVpY2tseSBkaXN0aW5ndWlzaCBjb21wYXJlZCB0byAzNTk0IGFuZCAzNTg0LFxuICAgIC8vICB0aGUgZGVjaW1hbCBzaW1wbHkgbWFrZXMgaXQgaGFyZGVyIHRvIHJlYWQsIGFuZCBsYXJnZXIuXG4gICAgLy8gTk9URTogVGhpcyBudW1iZXIgc2hvdWxkIHByZXZlbnQgdXMgZnJvbSBldmVyIHVzaW5nIDUgZGlnaXRzLCBzbyB0aGF0IHdlIG5ldmVyIG5lZWQgY29tbWFzXG4gICAgLy8gIEZvciBleGFtcGxlLCBpZiB0aGUgZmFjdG9yIGlzIDEwIHRoZW4sIDk5OTkuNSBpcyBrZXB0IHdpdGggYSBkaXZpc29yIG9mIDEsIGFuZCB0aGVuIHJvdW5kcyB1cCB0b1xuICAgIC8vICBcIjEwLDAwMFwiLiBTbyB3ZSB3YW50IGFueSB2YWx1ZSB3aGljaCByb3VuZHMgdXAgYXQgNSBkaWdpdHMgdG8gYmUgcHV0IGluIHRoZSBuZXh0IGdyb3VwIChhbmQgaGF2aW5nXG4gICAgLy8gIGV4dHJhIHZhbHVlcyBwdXQgaW4gdGhlIG5leHQgZ3JvdXAgaXMgZmluZSwgYXMgd2Ugd29uJ3Qgc2hvdyB0aGUgZGVjaW1hbCB2YWx1ZSBhbnl3YXlzLCBzbyBpdCBvbmx5XG4gICAgLy8gIG1lYW5zIDk5OTkgd3JhcHMgYXJvdW5kIHRvIDEwSyBhIGJpdCBmYXN0ZXIpLlxuICAgIGNvbnN0IGV4dHJhRmFjdG9yID0gOS45OTk0OTk5OTtcbiAgICBsZXQgZGl2aXNvciA9IDE7XG4gICAgbGV0IHN1ZmZpeCA9IFwiXCI7XG4gICAgbGV0IGN1cnJlbmN5RGVjaW1hbHNOZWVkZWQgPSBmYWxzZTtcbiAgICBpZiAobWF4QWJzb2x1dGVWYWx1ZSA8IDAuMDAwMDAwMDEpIHtcbiAgICAgICAgbWF4RGVjaW1hbHMgPSAxMjtcbiAgICB9IGVsc2UgaWYgKG1heEFic29sdXRlVmFsdWUgPCAwLjAwMDAwMDEpIHtcbiAgICAgICAgbWF4RGVjaW1hbHMgPSAxMTtcbiAgICB9IGVsc2UgaWYgKG1heEFic29sdXRlVmFsdWUgPCAwLjAwMDAwMSkge1xuICAgICAgICBtYXhEZWNpbWFscyA9IDEwO1xuICAgIH0gZWxzZSBpZiAobWF4QWJzb2x1dGVWYWx1ZSA8IDAuMDAwMDEpIHtcbiAgICAgICAgbWF4RGVjaW1hbHMgPSA5O1xuICAgIH0gZWxzZSBpZiAobWF4QWJzb2x1dGVWYWx1ZSA8IDAuMDAwMSkge1xuICAgICAgICBtYXhEZWNpbWFscyA9IDg7XG4gICAgfSBlbHNlIGlmIChtYXhBYnNvbHV0ZVZhbHVlIDwgMC4wMDEpIHtcbiAgICAgICAgbWF4RGVjaW1hbHMgPSA3O1xuICAgIH0gZWxzZSBpZiAobWF4QWJzb2x1dGVWYWx1ZSA8IDAuMDEpIHtcbiAgICAgICAgbWF4RGVjaW1hbHMgPSA2O1xuICAgIH0gZWxzZSBpZiAobWF4QWJzb2x1dGVWYWx1ZSA8IDAuMSkge1xuICAgICAgICBtYXhEZWNpbWFscyA9IDU7XG4gICAgfSBlbHNlIGlmIChtYXhBYnNvbHV0ZVZhbHVlIDwgMTAwMCAqIGV4dHJhRmFjdG9yKSB7XG4gICAgICAgIGlmIChzcGVjaWFsQ3VycmVuY3kpIHtcbiAgICAgICAgICAgIGN1cnJlbmN5RGVjaW1hbHNOZWVkZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIGlmIChtYXhBYnNvbHV0ZVZhbHVlIDwgMTAwMCAqIDEwMDAgKiBleHRyYUZhY3Rvcikge1xuICAgICAgICBzdWZmaXggPSBcIktcIjtcbiAgICAgICAgZGl2aXNvciA9IDEwMDA7XG4gICAgfSBlbHNlIGlmIChtYXhBYnNvbHV0ZVZhbHVlIDwgMTAwMCAqIDEwMDAgKiAxMDAwICogZXh0cmFGYWN0b3IpIHtcbiAgICAgICAgc3VmZml4ID0gXCJNXCI7XG4gICAgICAgIGRpdmlzb3IgPSAxMDAwICogMTAwMDtcbiAgICB9IGVsc2UgaWYgKG1heEFic29sdXRlVmFsdWUgPCAxMDAwICogMTAwMCAqIDEwMDAgKiAxMDAwICogZXh0cmFGYWN0b3IpIHtcbiAgICAgICAgc3VmZml4ID0gXCJCXCI7XG4gICAgICAgIGRpdmlzb3IgPSAxMDAwICogMTAwMCAqIDEwMDA7XG4gICAgfSBlbHNlIGlmIChtYXhBYnNvbHV0ZVZhbHVlIDwgMTAwMCAqIDEwMDAgKiAxMDAwICogMTAwMCAqIDEwMDAgKiBleHRyYUZhY3Rvcikge1xuICAgICAgICBzdWZmaXggPSBcIlRcIjtcbiAgICAgICAgZGl2aXNvciA9IDEwMDAgKiAxMDAwICogMTAwMCAqIDEwMDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc3VmZml4ID0gXCJRXCI7XG4gICAgICAgIGRpdmlzb3IgPSAxMDAwICogMTAwMCAqIDEwMDAgKiAxMDAwICogMTAwMDtcbiAgICB9XG4gICAgY291bnQgLz0gZGl2aXNvcjtcbiAgICBtYXhBYnNvbHV0ZVZhbHVlIC89IGRpdmlzb3I7XG4gICAgaWYgKG5vRGVjaW1hbCkge1xuICAgICAgICBtYXhEZWNpbWFscyA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdE1heERlY2ltYWxzKGNvdW50LCBtYXhEZWNpbWFscywgbWF4QWJzb2x1dGVWYWx1ZSwgY3VycmVuY3lEZWNpbWFsc05lZWRlZCA/IDIgOiB1bmRlZmluZWQpICsgc3VmZml4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QmluYXJ5TnVtYmVyKGNvdW50OiBudW1iZXIgfCB1bmRlZmluZWQsIG1heEFic29sdXRlVmFsdWU/OiBudW1iZXIsIG5vRGVjaW1hbD86IGJvb2xlYW4sIHNwZWNpYWxDdXJyZW5jeT86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmICh0eXBlb2YgY291bnQgIT09IFwibnVtYmVyXCIpIHJldHVybiBcIjBcIjtcbiAgICBpZiAoY291bnQgPCAwKSB7XG4gICAgICAgIHJldHVybiBcIi1cIiArIGZvcm1hdE51bWJlcigtY291bnQsIG1heEFic29sdXRlVmFsdWUsIG5vRGVjaW1hbCwgc3BlY2lhbEN1cnJlbmN5KTtcbiAgICB9XG5cbiAgICBtYXhBYnNvbHV0ZVZhbHVlID0gbWF4QWJzb2x1dGVWYWx1ZSA/PyBNYXRoLmFicyhjb3VudCk7XG5cbiAgICAvLyBOT1RFOiBXZSBkb24ndCBzd2l0Y2ggdW5pdHMgYXMgc29vbiBhcyB3ZSBwb3NzaWJsZSBjYW4sIGJlY2F1c2UuLi5cbiAgICAvLyAgMy41OTQgdnMgMy41ODQgaXMgaGFyZGVyIHRvIHF1aWNrbHkgZGlzdGluZ3Vpc2ggY29tcGFyZWQgdG8gMzU5NCBhbmQgMzU4NCxcbiAgICAvLyAgdGhlIGRlY2ltYWwgc2ltcGx5IG1ha2VzIGl0IGhhcmRlciB0byByZWFkLCBhbmQgbGFyZ2VyLlxuICAgIC8vIE5PVEU6IFRoaXMgbnVtYmVyIHNob3VsZCBwcmV2ZW50IHVzIGZyb20gZXZlciB1c2luZyA1IGRpZ2l0cywgc28gdGhhdCB3ZSBuZXZlciBuZWVkIGNvbW1hc1xuICAgIC8vICBGb3IgZXhhbXBsZSwgaWYgdGhlIGZhY3RvciBpcyAxMCB0aGVuLCA5OTk5LjUgaXMga2VwdCB3aXRoIGEgZGl2aXNvciBvZiAxLCBhbmQgdGhlbiByb3VuZHMgdXAgdG9cbiAgICAvLyAgXCIxMCwwMDBcIi4gU28gd2Ugd2FudCBhbnkgdmFsdWUgd2hpY2ggcm91bmRzIHVwIGF0IDUgZGlnaXRzIHRvIGJlIHB1dCBpbiB0aGUgbmV4dCBncm91cCAoYW5kIGhhdmluZ1xuICAgIC8vICBleHRyYSB2YWx1ZXMgcHV0IGluIHRoZSBuZXh0IGdyb3VwIGlzIGZpbmUsIGFzIHdlIHdvbid0IHNob3cgdGhlIGRlY2ltYWwgdmFsdWUgYW55d2F5cywgc28gaXQgb25seVxuICAgIC8vICBtZWFucyA5OTk5IHdyYXBzIGFyb3VuZCB0byAxMEsgYSBiaXQgZmFzdGVyKS5cbiAgICBjb25zdCBleHRyYUZhY3RvciA9IDkuOTk5NDk5OTk7XG4gICAgbGV0IGRpdmlzb3IgPSAxO1xuICAgIGxldCBzdWZmaXggPSBcIlwiO1xuICAgIGxldCBjdXJyZW5jeURlY2ltYWxzTmVlZGVkID0gZmFsc2U7XG4gICAgaWYgKG1heEFic29sdXRlVmFsdWUgPCAxMDI0ICogZXh0cmFGYWN0b3IpIHtcbiAgICAgICAgaWYgKHNwZWNpYWxDdXJyZW5jeSkge1xuICAgICAgICAgICAgY3VycmVuY3lEZWNpbWFsc05lZWRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1heEFic29sdXRlVmFsdWUgPCAxMDI0ICogMTAyNCAqIGV4dHJhRmFjdG9yKSB7XG4gICAgICAgIHN1ZmZpeCA9IFwiS1wiO1xuICAgICAgICBkaXZpc29yID0gMTAyNDtcbiAgICB9IGVsc2UgaWYgKG1heEFic29sdXRlVmFsdWUgPCAxMDI0ICogMTAyNCAqIDEwMjQgKiBleHRyYUZhY3Rvcikge1xuICAgICAgICBzdWZmaXggPSBcIk1cIjtcbiAgICAgICAgZGl2aXNvciA9IDEwMjQgKiAxMDI0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHN1ZmZpeCA9IFwiR1wiO1xuICAgICAgICBkaXZpc29yID0gMTAyNCAqIDEwMjQgKiAxMDI0O1xuICAgIH1cbiAgICBjb3VudCAvPSBkaXZpc29yO1xuICAgIG1heEFic29sdXRlVmFsdWUgLz0gZGl2aXNvcjtcblxuICAgIGxldCBtYXhEZWNpbWFscyA9IG5vRGVjaW1hbCA/IDAgOiAzO1xuXG4gICAgcmV0dXJuIGZvcm1hdE1heERlY2ltYWxzKGNvdW50LCBtYXhEZWNpbWFscywgbWF4QWJzb2x1dGVWYWx1ZSwgY3VycmVuY3lEZWNpbWFsc05lZWRlZCA/IDIgOiB1bmRlZmluZWQpICsgc3VmZml4O1xufVxuXG4vKiogWVlZWS9NTS9ERCBISDpNTTpTUyBQTS9BTSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGVUaW1lKHRpbWU6IG51bWJlcikge1xuICAgIGZ1bmN0aW9uIHAoczogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpO1xuICAgIH1cbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBsZXQgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xuICAgIGxldCBzZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgbGV0IGFtcG0gPSBob3VycyA+PSAxMiA/IFwiUE1cIiA6IFwiQU1cIjtcbiAgICBob3VycyA9IGhvdXJzICUgMTI7XG4gICAgaG91cnMgPSBob3VycyA/IGhvdXJzIDogMTI7IC8vIHRoZSBob3VyICcwJyBzaG91bGQgYmUgJzEyJ1xuICAgIGxldCBzdHJUaW1lID0gcChob3VycykgKyBcIjpcIiArIHAobWludXRlcykgKyBcIjpcIiArIHAoc2Vjb25kcykgKyBcIiBcIiArIGFtcG07XG4gICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiL1wiICsgcChkYXRlLmdldE1vbnRoKCkgKyAxKSArIFwiL1wiICsgcChkYXRlLmdldERhdGUoKSkgKyBcIiBcIiArIHN0clRpbWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREYXRlVGltZURldGFpbGVkKHRpbWU6IG51bWJlcikge1xuICAgIGZ1bmN0aW9uIHAoczogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpO1xuICAgIH1cbiAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgIGxldCBob3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICBsZXQgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xuICAgIGxldCBzZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCk7XG4gICAgbGV0IG1pbGxpc2Vjb25kcyA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7XG4gICAgbGV0IG1pbGxpc2Vjb25kc1N0cmluZyA9IG1pbGxpc2Vjb25kcy50b1N0cmluZygpLnBhZFN0YXJ0KDMsIFwiMFwiKTtcblxuICAgIGxldCB0aW1lU3RyaW5nID0gdGltZS50b1N0cmluZygpO1xuICAgIGxldCBkZWNpbWFsSW5kZXggPSB0aW1lU3RyaW5nLmluZGV4T2YoXCIuXCIpO1xuICAgIGlmIChkZWNpbWFsSW5kZXggIT09IC0xKSB7XG4gICAgICAgIGxldCBmcmFjdGlvbmFsUGFydCA9IHRpbWVTdHJpbmcuc3Vic3RyaW5nKGRlY2ltYWxJbmRleCArIDEpO1xuICAgICAgICBtaWxsaXNlY29uZHNTdHJpbmcgKz0gZnJhY3Rpb25hbFBhcnQ7XG4gICAgfVxuXG4gICAgbGV0IGFtcG0gPSBob3VycyA+PSAxMiA/IFwiUE1cIiA6IFwiQU1cIjtcbiAgICBob3VycyA9IGhvdXJzICUgMTI7XG4gICAgaG91cnMgPSBob3VycyA/IGhvdXJzIDogMTI7IC8vIHRoZSBob3VyICcwJyBzaG91bGQgYmUgJzEyJ1xuICAgIGxldCBzdHJUaW1lID0gcChob3VycykgKyBcIjpcIiArIHAobWludXRlcykgKyBcIjpcIiArIHAoc2Vjb25kcykgKyBcIi5cIiArIG1pbGxpc2Vjb25kc1N0cmluZyArIFwiIFwiICsgYW1wbTtcbiAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpICsgXCIvXCIgKyBwKGRhdGUuZ2V0TW9udGgoKSArIDEpICsgXCIvXCIgKyBwKGRhdGUuZ2V0RGF0ZSgpKSArIFwiIFwiICsgc3RyVGltZTtcbn1cblxuXG4vLyBMb29rdXAgdGFibGUgZm9yIGNvbW1vbiB0aW1lem9uZSBhYmJyZXZpYXRpb25zIGJ5IFVUQyBvZmZzZXQgKGluIG1pbnV0ZXMpXG5jb25zdCB0aW1lem9uZUFiYnJldmlhdGlvbnM6IHsgW29mZnNldE1pbnV0ZXM6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIC8vIFVUQyBhbmQgR01UXG4gICAgXCIwXCI6IFwiVVRDXCIsXG5cbiAgICAvLyBVUy9DYW5hZGEgdGltZXpvbmVzXG4gICAgXCIzMDBcIjogXCJFU1RcIiwgICAgIC8vIFVUQy01IChFYXN0ZXJuIFN0YW5kYXJkIFRpbWUpXG4gICAgXCIyNDBcIjogXCJFRFRcIiwgICAgIC8vIFVUQy00IChFYXN0ZXJuIERheWxpZ2h0IFRpbWUpXG4gICAgXCIzNjBcIjogXCJDU1RcIiwgICAgIC8vIFVUQy02IChDZW50cmFsIFN0YW5kYXJkIFRpbWUpIFxuICAgIFwiNDIwXCI6IFwiTVNUXCIsICAgICAvLyBVVEMtNyAoTW91bnRhaW4gU3RhbmRhcmQgVGltZSlcbiAgICBcIjQ4MFwiOiBcIlBTVFwiLCAgICAgLy8gVVRDLTggKFBhY2lmaWMgU3RhbmRhcmQgVGltZSlcblxuICAgIC8vIEV1cm9wZWFuIHRpbWV6b25lc1xuICAgIFwiLTYwXCI6IFwiQ0VUXCIsICAgICAvLyBVVEMrMSAoQ2VudHJhbCBFdXJvcGVhbiBUaW1lKVxuICAgIFwiLTEyMFwiOiBcIkNFU1RcIiwgICAvLyBVVEMrMiAoQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgVGltZSlcblxuICAgIC8vIE90aGVyIGNvbW1vbiB0aW1lem9uZXNcbiAgICBcIi00ODBcIjogXCJDU1RcIiwgICAgLy8gVVRDKzggKENoaW5hIFN0YW5kYXJkIFRpbWUpXG4gICAgXCItNTQwXCI6IFwiSlNUXCIsICAgIC8vIFVUQys5IChKYXBhbiBTdGFuZGFyZCBUaW1lKVxuICAgIFwiLTMzMFwiOiBcIklTVFwiLCAgICAvLyBVVEMrNTozMCAoSW5kaWEgU3RhbmRhcmQgVGltZSlcbiAgICBcIi01NzBcIjogXCJBQ1NUXCIsICAgLy8gVVRDKzk6MzAgKEF1c3RyYWxpYW4gQ2VudHJhbCBTdGFuZGFyZCBUaW1lKVxuICAgIFwiLTYwMFwiOiBcIkFFU1RcIiwgICAvLyBVVEMrMTAgKEF1c3RyYWxpYW4gRWFzdGVybiBTdGFuZGFyZCBUaW1lKVxufTtcblxuXG4vLyBZWVlZLU1NLUREX0hILU1NLVNTLm1tbSBUSU1FWk9ORVxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEZpbGVUaW1lc3RhbXBMb2NhbCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGZ1bmN0aW9uIHAoczogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpO1xuICAgIH1cblxuICAgIGxldCBkYXRlID0gbmV3IERhdGUodGltZSk7XG4gICAgbGV0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgbGV0IG1vbnRoID0gcChkYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICBsZXQgZGF5ID0gcChkYXRlLmdldERhdGUoKSk7XG4gICAgbGV0IGhvdXJzID0gcChkYXRlLmdldEhvdXJzKCkpO1xuICAgIGxldCBtaW51dGVzID0gcChkYXRlLmdldE1pbnV0ZXMoKSk7XG4gICAgbGV0IHNlY29uZHMgPSBwKGRhdGUuZ2V0U2Vjb25kcygpKTtcbiAgICBsZXQgbWlsbGlzZWNvbmRzID0gZGF0ZS5nZXRNaWxsaXNlY29uZHMoKTtcbiAgICBsZXQgbWlsbGlzZWNvbmRzU3RyaW5nID0gbWlsbGlzZWNvbmRzLnRvU3RyaW5nKCkucGFkU3RhcnQoMywgXCIwXCIpO1xuXG4gICAgbGV0IHRpbWVTdHJpbmcgPSB0aW1lLnRvU3RyaW5nKCk7XG4gICAgbGV0IGRlY2ltYWxJbmRleCA9IHRpbWVTdHJpbmcuaW5kZXhPZihcIi5cIik7XG4gICAgaWYgKGRlY2ltYWxJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgbGV0IGZyYWN0aW9uYWxQYXJ0ID0gdGltZVN0cmluZy5zdWJzdHJpbmcoZGVjaW1hbEluZGV4ICsgMSk7XG4gICAgICAgIG1pbGxpc2Vjb25kc1N0cmluZyArPSBmcmFjdGlvbmFsUGFydDtcbiAgICB9XG4gICAgLy8gR2V0IHRpbWV6b25lIG9mZnNldCBpbiBtaW51dGVzIChuZWdhdGl2ZSBvZiBnZXRUaW1lem9uZU9mZnNldCBiZWNhdXNlIGl0IHJldHVybnMgb3Bwb3NpdGUgc2lnbilcbiAgICBsZXQgdGltZXpvbmVPZmZzZXRNaW51dGVzID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpO1xuXG4gICAgLy8gTG9vayB1cCB0aGUgYWJicmV2aWF0aW9uIG9yIGZhbGxiYWNrIHRvIG51bWVyaWMgZm9ybWF0XG4gICAgbGV0IHRpbWV6b25lU3RyaW5nID0gdGltZXpvbmVBYmJyZXZpYXRpb25zW3RpbWV6b25lT2Zmc2V0TWludXRlcy50b1N0cmluZygpXTtcbiAgICBpZiAoIXRpbWV6b25lU3RyaW5nKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrOiBmb3JtYXQgYXMgwrFISE1NXG4gICAgICAgIGxldCBvZmZzZXRTaWduID0gdGltZXpvbmVPZmZzZXRNaW51dGVzID49IDAgPyBcIitcIiA6IFwiLVwiO1xuICAgICAgICBsZXQgb2Zmc2V0SG91cnMgPSBwKE1hdGguZmxvb3IoTWF0aC5hYnModGltZXpvbmVPZmZzZXRNaW51dGVzKSAvIDYwKSk7XG4gICAgICAgIGxldCBvZmZzZXRNaW5zID0gcChNYXRoLmFicyh0aW1lem9uZU9mZnNldE1pbnV0ZXMpICUgNjApO1xuICAgICAgICB0aW1lem9uZVN0cmluZyA9IGAke29mZnNldFNpZ259JHtvZmZzZXRIb3Vyc30ke29mZnNldE1pbnN9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9XyR7aG91cnN9LSR7bWludXRlc30tJHtzZWNvbmRzfS4ke21pbGxpc2Vjb25kc1N0cmluZ31fJHt0aW1lem9uZVN0cmluZ31gO1xufVxuXG4vKiogMjAyNCBKYW51YXJ5IDEsIE1vbmRheSwgMTI6NTM6MDJwbSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE5pY2VEYXRlVGltZSh0aW1lOiBudW1iZXIpIHtcbiAgICBmdW5jdGlvbiBwKHM6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgICB9XG4gICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh0aW1lKTtcbiAgICBsZXQgaG91cnMgPSBkYXRlLmdldEhvdXJzKCk7XG4gICAgbGV0IG1pbnV0ZXMgPSBkYXRlLmdldE1pbnV0ZXMoKTtcbiAgICBsZXQgc2Vjb25kcyA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgIGxldCBhbXBtID0gaG91cnMgPj0gMTIgPyBcInBtXCIgOiBcImFtXCI7XG4gICAgaG91cnMgPSBob3VycyAlIDEyO1xuICAgIGhvdXJzID0gaG91cnMgPyBob3VycyA6IDEyOyAvLyB0aGUgaG91ciAnMCcgc2hvdWxkIGJlICcxMidcbiAgICBsZXQgc3RyVGltZSA9IHAoaG91cnMpICsgXCI6XCIgKyBwKG1pbnV0ZXMpICsgXCI6XCIgKyBwKHNlY29uZHMpICsgYW1wbTtcbiAgICBsZXQgZGF5cyA9IFtcIlN1bmRheVwiLCBcIk1vbmRheVwiLCBcIlR1ZXNkYXlcIiwgXCJXZWRuZXNkYXlcIiwgXCJUaHVyc2RheVwiLCBcIkZyaWRheVwiLCBcIlNhdHVyZGF5XCJdO1xuICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyBcIiBcIiArIGRhdGUudG9Mb2NhbGVTdHJpbmcoXCJkZWZhdWx0XCIsIHsgbW9udGg6IFwibG9uZ1wiIH0pICsgXCIgXCIgKyBkYXRlLmdldERhdGUoKSArIFwiLCBcIiArIGRheXNbZGF0ZS5nZXREYXkoKV0gKyBcIiwgXCIgKyBzdHJUaW1lO1xufVxuXG4vKiogMjAyNCBKYW51YXJ5IDEsIE1vbmRheSwgMTI6NTM6MDJwbSAoNCBtb250aHMgYWdvKSAgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWZXJ5TmljZURhdGVUaW1lKHRpbWU6IG51bWJlcikge1xuICAgIGlmICghdGltZSkge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aW1lICE9PSBcIm51bWJlclwiKSB7XG4gICAgICAgIHJldHVybiBTdHJpbmcodGltZSk7XG4gICAgfVxuICAgIHJldHVybiBgJHtmb3JtYXROaWNlRGF0ZVRpbWUodGltZSl9ICgke2Zvcm1hdFRpbWUoRGF0ZS5ub3coKSAtIHRpbWUpfSlgO1xufVxuXG4vKiogWVlZWS9NTS9ERCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUodGltZTogbnVtYmVyKSB7XG4gICAgZnVuY3Rpb24gcChzOiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIik7XG4gICAgfVxuICAgIGxldCBkYXRlID0gbmV3IERhdGUodGltZSk7XG4gICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKSArIFwiL1wiICsgcChkYXRlLmdldE1vbnRoKCkgKyAxKSArIFwiL1wiICsgcChkYXRlLmdldERhdGUoKSk7XG59XG5cbi8qKiA8PSA2IGNoYXJhY3RlcnMgKDw9IDUgaWYgcG9zaXRpdmUpICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGVyY2VudCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKE51bWJlci5pc05hTih2YWx1ZSkpIHJldHVybiBcIjAlXCI7XG4gICAgLy8gMSBkZWNpbWFsIHBvaW50LCBzbyB3ZSBoYXZlIDUgY2hhcmFjdGVycyAoanVzdCBsaWtlIGZvcm1hdE51bWJlciByZXR1cm5zIDUgY2hhcmFjdGVycylcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMDApIC8gMTAgKyBcIiVcIjtcbn0iXX0=
396
+ /* _JS_SOURCE_HASH = "1a242c2d04f98b2c5c8746dc03300531a8b55c3e768824c54557a7e20934086a"; */
@@ -0,0 +1,28 @@
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.magenta = exports.gray = exports.white = exports.yellow = exports.green = exports.red = exports.blue = void 0;
4
+ const misc_1 = require("../misc");
5
+ const colors_1 = require("./colors");
6
+ function ansiHSL(h, s, l, text) {
7
+ let { r, g, b } = (0, colors_1.hslToRGB)({ h, s, l });
8
+ return ansiRGB(r, g, b, text);
9
+ }
10
+ function ansiRGB(r, g, b, text) {
11
+ if ((0, misc_1.isNode)()) {
12
+ return `\x1b[38;5;${16 + (36 * Math.round(r / 255 * 5)) + (6 * Math.round(g / 255 * 5)) + Math.round(b / 255 * 5)}m${text}\x1b[0m`;
13
+ }
14
+ return `\x1b[38;2;${r};${g};${b}m${text}\x1b[0m`;
15
+ }
16
+ const lightness = 68;
17
+ exports.blue = ansiHSL.bind(null, 235, 100, lightness);
18
+ exports.red = ansiHSL.bind(null, 0, 100, lightness);
19
+ const green = (text) => `\x1b[32m${text}\x1b[0m`;
20
+ exports.green = green;
21
+ const yellow = (text) => `\x1b[33m${text}\x1b[0m`;
22
+ exports.yellow = yellow;
23
+ exports.white = ansiHSL.bind(null, 0, 0, 80);
24
+ exports.gray = ansiHSL.bind(null, 0, 0, 50);
25
+ const magenta = (text) => `\x1b[35m${text}\x1b[0m`;
26
+ exports.magenta = magenta;
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nQ29sb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibG9nQ29sb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLGtDQUFpQztBQUNqQyxxQ0FBOEM7QUFFOUMsU0FBUyxPQUFPLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxDQUFTLEVBQUUsSUFBWTtJQUMxRCxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFBLGlCQUFRLEVBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUNELFNBQVMsT0FBTyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsQ0FBUyxFQUFFLElBQVk7SUFDMUQsSUFBSSxJQUFBLGFBQU0sR0FBRSxFQUFFLENBQUM7UUFDWCxPQUFPLGFBQWEsRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQztJQUN2SSxDQUFDO0lBQ0QsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksU0FBUyxDQUFDO0FBQ3JELENBQUM7QUFFRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDUixRQUFBLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9DLFFBQUEsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDbEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUM7QUFBbkQsUUFBQSxLQUFLLFNBQThDO0FBQ3pELE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FBQyxXQUFXLElBQUksU0FBUyxDQUFDO0FBQXBELFFBQUEsTUFBTSxVQUE4QztBQUNwRCxRQUFBLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLFFBQUEsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFMUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLFdBQVcsSUFBSSxTQUFTLENBQUM7QUFBckQsUUFBQSxPQUFPLFdBQThDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNOb2RlIH0gZnJvbSBcIi4uL21pc2NcIjtcbmltcG9ydCB7IGhzbFRvSGV4LCBoc2xUb1JHQiB9IGZyb20gXCIuL2NvbG9yc1wiO1xuXG5mdW5jdGlvbiBhbnNpSFNMKGg6IG51bWJlciwgczogbnVtYmVyLCBsOiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHsgciwgZywgYiB9ID0gaHNsVG9SR0IoeyBoLCBzLCBsIH0pO1xuICAgIHJldHVybiBhbnNpUkdCKHIsIGcsIGIsIHRleHQpO1xufVxuZnVuY3Rpb24gYW5zaVJHQihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChpc05vZGUoKSkge1xuICAgICAgICByZXR1cm4gYFxceDFiWzM4OzU7JHsxNiArICgzNiAqIE1hdGgucm91bmQociAvIDI1NSAqIDUpKSArICg2ICogTWF0aC5yb3VuZChnIC8gMjU1ICogNSkpICsgTWF0aC5yb3VuZChiIC8gMjU1ICogNSl9bSR7dGV4dH1cXHgxYlswbWA7XG4gICAgfVxuICAgIHJldHVybiBgXFx4MWJbMzg7Mjske3J9OyR7Z307JHtifW0ke3RleHR9XFx4MWJbMG1gO1xufVxuXG5jb25zdCBsaWdodG5lc3MgPSA2ODtcbmV4cG9ydCBjb25zdCBibHVlID0gYW5zaUhTTC5iaW5kKG51bGwsIDIzNSwgMTAwLCBsaWdodG5lc3MpO1xuZXhwb3J0IGNvbnN0IHJlZCA9IGFuc2lIU0wuYmluZChudWxsLCAwLCAxMDAsIGxpZ2h0bmVzcyk7XG5leHBvcnQgY29uc3QgZ3JlZW4gPSAodGV4dDogc3RyaW5nKSA9PiBgXFx4MWJbMzJtJHt0ZXh0fVxceDFiWzBtYDtcbmV4cG9ydCBjb25zdCB5ZWxsb3cgPSAodGV4dDogc3RyaW5nKSA9PiBgXFx4MWJbMzNtJHt0ZXh0fVxceDFiWzBtYDtcbmV4cG9ydCBjb25zdCB3aGl0ZSA9IGFuc2lIU0wuYmluZChudWxsLCAwLCAwLCA4MCk7XG5leHBvcnQgY29uc3QgZ3JheSA9IGFuc2lIU0wuYmluZChudWxsLCAwLCAwLCA1MCk7XG5cbmV4cG9ydCBjb25zdCBtYWdlbnRhID0gKHRleHQ6IHN0cmluZykgPT4gYFxceDFiWzM1bSR7dGV4dH1cXHgxYlswbWA7Il19
28
+ /* _JS_SOURCE_HASH = "6a2e2841af8c356adef89cbab8659ff16801bdc6d2121166f6d08e7f6395d393"; */
@@ -0,0 +1,53 @@
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
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
12
+ //exports.LZ4 = void 0;
13
+ // NOTE: Even if we wanted to use the production version, we couldn't because it's not compatible with the client-side code, because they decided to do a file read to load in their WebAssembly.
14
+ const lz4_wasm_nodejs_1 = __importDefault(require("./lz4_wasm_nodejs"));
15
+ const measure_1 = require("../profiling/measure");
16
+ class LZ4 {
17
+ static compress(data) {
18
+ return this.compressUntracked(data);
19
+ }
20
+ static compressUntracked(data) {
21
+ try {
22
+ return Buffer.from(lz4_wasm_nodejs_1.default.compress(data));
23
+ }
24
+ catch (e) {
25
+ // Rethrow non errors as properly wrapped errors
26
+ if (!(e && e instanceof Error)) {
27
+ throw new Error(`Error compressing LZ4: ${e}`);
28
+ }
29
+ throw e;
30
+ }
31
+ }
32
+ static decompress(data) {
33
+ try {
34
+ return Buffer.from(lz4_wasm_nodejs_1.default.decompress(data));
35
+ }
36
+ catch (e) {
37
+ // Rethrow non errors as properly wrapped errors
38
+ if (!(e && e instanceof Error)) {
39
+ throw new Error(`Error decompressing LZ4: ${e}`);
40
+ }
41
+ throw e;
42
+ }
43
+ }
44
+ }
45
+ exports.LZ4 = LZ4;
46
+ __decorate([
47
+ measure_1.measureFnc
48
+ ], LZ4, "compress", null);
49
+ __decorate([
50
+ measure_1.measureFnc
51
+ ], LZ4, "decompress", null);
52
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFo0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiTFo0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLGtNQUFrTTtBQUNsTSx3RUFBMkM7QUFDM0Msa0RBQWtEO0FBQ2xELE1BQWEsR0FBRztJQUVMLEFBQVAsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFDRCxNQUFNLENBQUMsaUJBQWlCLENBQUMsSUFBWTtRQUNqQyxJQUFJLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULGdEQUFnRDtZQUNoRCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkQsQ0FBQztZQUNELE1BQU0sQ0FBQyxDQUFDO1FBQ1osQ0FBQztJQUNMLENBQUM7SUFFTSxBQUFQLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBWTtRQUMxQixJQUFJLENBQUM7WUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMseUJBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNULGdEQUFnRDtZQUNoRCxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckQsQ0FBQztZQUNELE1BQU0sQ0FBQyxDQUFDO1FBQ1osQ0FBQztJQUNMLENBQUM7Q0FDSjtBQTVCRCxrQkE0QkM7QUExQlU7SUFETixvQkFBVTt5QkFHVjtBQWFNO0lBRE4sb0JBQVU7MkJBV1YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBOT1RFOiBFdmVuIGlmIHdlIHdhbnRlZCB0byB1c2UgdGhlIHByb2R1Y3Rpb24gdmVyc2lvbiwgd2UgY291bGRuJ3QgYmVjYXVzZSBpdCdzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGNsaWVudC1zaWRlIGNvZGUsIGJlY2F1c2UgdGhleSBkZWNpZGVkIHRvIGRvIGEgZmlsZSByZWFkIHRvIGxvYWQgaW4gdGhlaXIgV2ViQXNzZW1ibHkuIFxuaW1wb3J0IGx6NF9zdHJlYW0gZnJvbSBcIi4vbHo0X3dhc21fbm9kZWpzXCI7XG5pbXBvcnQgeyBtZWFzdXJlRm5jIH0gZnJvbSBcIi4uL3Byb2ZpbGluZy9tZWFzdXJlXCI7XG5leHBvcnQgY2xhc3MgTFo0IHtcbiAgICBAbWVhc3VyZUZuY1xuICAgIHN0YXRpYyBjb21wcmVzcyhkYXRhOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21wcmVzc1VudHJhY2tlZChkYXRhKTtcbiAgICB9XG4gICAgc3RhdGljIGNvbXByZXNzVW50cmFja2VkKGRhdGE6IEJ1ZmZlcik6IEJ1ZmZlciB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gQnVmZmVyLmZyb20obHo0X3N0cmVhbS5jb21wcmVzcyhkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFJldGhyb3cgbm9uIGVycm9ycyBhcyBwcm9wZXJseSB3cmFwcGVkIGVycm9yc1xuICAgICAgICAgICAgaWYgKCEoZSAmJiBlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBjb21wcmVzc2luZyBMWjQ6ICR7ZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQG1lYXN1cmVGbmNcbiAgICBzdGF0aWMgZGVjb21wcmVzcyhkYXRhOiBCdWZmZXIpOiBCdWZmZXIge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGx6NF9zdHJlYW0uZGVjb21wcmVzcyhkYXRhKSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIFJldGhyb3cgbm9uIGVycm9ycyBhcyBwcm9wZXJseSB3cmFwcGVkIGVycm9yc1xuICAgICAgICAgICAgaWYgKCEoZSAmJiBlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBkZWNvbXByZXNzaW5nIExaNDogJHtlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
53
+ /* _JS_SOURCE_HASH = "d9a6623efbf85b9a38828fb6c3eee7d40e28387f215cb27e405eb1b47eb66e8d"; */