@uwrl/qc-utils 0.0.15 → 0.0.18

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 (52) hide show
  1. package/README.md +56 -0
  2. package/dist/index.d.ts +3 -2
  3. package/dist/index.js +2951 -340
  4. package/dist/index.umd.cjs +15 -3
  5. package/dist/models/dataSource.d.ts +173 -0
  6. package/dist/models/index.d.ts +2 -0
  7. package/dist/models/payload.d.ts +24 -0
  8. package/dist/models/settings.d.ts +65 -0
  9. package/dist/models/timestamp.d.ts +150 -0
  10. package/dist/services/api.d.ts +147 -0
  11. package/dist/services/apiMethods.d.ts +8 -0
  12. package/dist/services/createPatchObject.d.ts +17 -0
  13. package/dist/services/getCSRFToken.d.ts +1 -0
  14. package/dist/services/index.d.ts +6 -0
  15. package/dist/services/requestInterceptor.d.ts +12 -0
  16. package/dist/services/responseInterceptor.d.ts +2 -0
  17. package/dist/types/index.d.ts +372 -0
  18. package/dist/utils/__tests__/observations.spec.d.ts +1 -0
  19. package/dist/utils/ellapsed-time.d.ts +4 -0
  20. package/dist/utils/format.d.ts +4 -0
  21. package/dist/utils/index.d.ts +6 -0
  22. package/dist/utils/observations.d.ts +5 -0
  23. package/dist/utils/plotting/__tests__/calibration.spec.d.ts +16 -0
  24. package/dist/utils/plotting/__tests__/observation-record-paths.spec.d.ts +21 -0
  25. package/dist/utils/plotting/__tests__/observation-record.spec.d.ts +1 -0
  26. package/dist/utils/plotting/__tests__/operation-cores.spec.d.ts +12 -0
  27. package/dist/utils/plotting/__tests__/workerMocks.d.ts +119 -0
  28. package/dist/utils/plotting/__tests__/workers.spec.d.ts +18 -0
  29. package/dist/utils/plotting/add-data.worker.d.ts +1 -0
  30. package/dist/utils/plotting/calibration.d.ts +99 -0
  31. package/dist/utils/plotting/change-values.worker.d.ts +1 -0
  32. package/dist/utils/plotting/change.worker.d.ts +1 -0
  33. package/dist/utils/plotting/delete-data.worker.d.ts +1 -0
  34. package/dist/utils/plotting/drift-correction.worker.d.ts +1 -0
  35. package/dist/utils/plotting/fill-gaps.worker.d.ts +1 -0
  36. package/dist/utils/plotting/find-gaps.worker.d.ts +1 -0
  37. package/dist/utils/plotting/interpolate.worker.d.ts +1 -0
  38. package/dist/utils/plotting/observation-record.d.ts +281 -0
  39. package/dist/utils/plotting/operation-cores.d.ts +139 -0
  40. package/dist/utils/plotting/persistence.worker.d.ts +1 -0
  41. package/dist/utils/plotting/rate-of-change.worker.d.ts +1 -0
  42. package/dist/utils/plotting/shift-datetimes.worker.d.ts +1 -0
  43. package/dist/utils/plotting/value-threshold.worker.d.ts +1 -0
  44. package/package.json +61 -56
  45. package/dist/types.d.ts +0 -51
  46. package/dist/utils/ellapsedTime.d.ts +0 -0
  47. package/dist/utils/observationsUtils.d.ts +0 -0
  48. package/dist/utils/plotting/observationRecord.d.ts +0 -170
  49. /package/dist/{utils/__tests__/ellapsedTime.spec.d.ts → services/__tests__/createPatchObject.spec.d.ts} +0 -0
  50. /package/dist/{utils/__tests__/observationsUtils.spec.d.ts → services/__tests__/requestInterceptor.spec.d.ts} +0 -0
  51. /package/dist/{utils/plotting/__tests__/delete-data.worker.spec.d.ts → services/__tests__/responseInterceptor.spec.d.ts} +0 -0
  52. /package/dist/utils/{plotting/__tests__/observationRecord.spec.d.ts → __tests__/ellapsed-time.spec.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -1,122 +1,2073 @@
1
- var f = /* @__PURE__ */ ((s) => (s.ADD_POINTS = "ADD_POINTS", s.CHANGE_VALUES = "CHANGE_VALUES", s.DELETE_POINTS = "DELETE_POINTS", s.DRIFT_CORRECTION = "DRIFT_CORRECTION", s.INTERPOLATE = "INTERPOLATE", s.SHIFT_DATETIMES = "SHIFT_DATETIMES", s.FILL_GAPS = "FILL_GAPS", s))(f || {}), T = /* @__PURE__ */ ((s) => (s.FIND_GAPS = "FIND_GAPS", s.PERSISTENCE = "PERSISTENCE", s.RATE_OF_CHANGE = "RATE_OF_CHANGE", s.VALUE_THRESHOLD = "VALUE_THRESHOLD", s))(T || {}), X = /* @__PURE__ */ ((s) => (s.LT = "Less than", s.LTE = "Less than or equal to", s.GT = "Greater than", s.GTE = "Greater than or equal to", s.E = "Equal", s.START = "Start datetime", s.END = "End datetime", s))(X || {});
2
- const x = {
3
- "Less than": (s, t) => s < t,
4
- "Less than or equal to": (s, t) => s <= t,
5
- "Greater than": (s, t) => s > t,
6
- "Greater than or equal to": (s, t) => s >= t,
7
- Equal: (s, t) => s == t,
8
- "Start datetime": (s, t) => s == t,
9
- "End datetime": (s, t) => s == t
1
+ var D = /* @__PURE__ */ ((e) => (e.SECOND = "s", e.MINUTE = "m", e.HOUR = "h", e.DAY = "D", e.WEEK = "W", e.MONTH = "M", e.YEAR = "Y", e))(D || {}), E = /* @__PURE__ */ ((e) => (e.ADD_POINTS = "ADD_POINTS", e.CHANGE_VALUES = "CHANGE_VALUES", e.ASSIGN_VALUES_BULK = "ASSIGN_VALUES_BULK", e.DELETE_POINTS = "DELETE_POINTS", e.DRIFT_CORRECTION = "DRIFT_CORRECTION", e.INTERPOLATE = "INTERPOLATE", e.SHIFT_DATETIMES = "SHIFT_DATETIMES", e.ASSIGN_DATETIMES_BULK = "ASSIGN_DATETIMES_BULK", e.FILL_GAPS = "FILL_GAPS", e))(E || {}), v = /* @__PURE__ */ ((e) => (e.FIND_GAPS = "FIND_GAPS", e.PERSISTENCE = "PERSISTENCE", e.CHANGE = "CHANGE", e.RATE_OF_CHANGE = "RATE_OF_CHANGE", e.VALUE_THRESHOLD = "VALUE_THRESHOLD", e.DATETIME_RANGE = "DATETIME_RANGE", e.SELECTION = "SELECTION", e))(v || {}), q = /* @__PURE__ */ ((e) => (e.LT = "Less than", e.LTE = "Less than or equal to", e.GT = "Greater than", e.GTE = "Greater than or equal to", e.E = "Equal", e))(q || {}), Pt = /* @__PURE__ */ ((e) => (e.ADD = "ADD", e.SUB = "SUB", e.MULT = "MULT", e.DIV = "DIV", e.ASSIGN = "ASSIGN", e))(Pt || {}), Bt = /* @__PURE__ */ ((e) => (e.LT = "Less than", e.LTE = "Less than or equal to", e.GT = "Greater than", e.GTE = "Greater than or equal to", e.E = "Equal", e))(Bt || {});
2
+ class Nt {
3
+ id;
4
+ thingId;
5
+ link;
6
+ frequency;
7
+ path;
8
+ datastreamIds;
9
+ publicResource;
10
+ constructor() {
11
+ this.id = "", this.thingId = "", this.link = "", this.frequency = null, this.path = "HydroShare", this.datastreamIds = [], this.publicResource = !1;
12
+ }
13
+ }
14
+ class Hr extends Nt {
15
+ resourceTitle;
16
+ resourceAbstract;
17
+ resourceKeywords;
18
+ constructor() {
19
+ super(), this.resourceTitle = void 0, this.resourceAbstract = void 0, this.resourceKeywords = void 0;
20
+ }
21
+ }
22
+ class jt {
23
+ latitude;
24
+ longitude;
25
+ elevation_m;
26
+ elevationDatum;
27
+ state;
28
+ county;
29
+ country;
30
+ constructor() {
31
+ this.elevationDatum = "WGS84", this.state = "", this.county = "", this.country = "";
32
+ }
33
+ }
34
+ class zr {
35
+ id;
36
+ workspaceId;
37
+ name;
38
+ location = new jt();
39
+ tags;
40
+ hydroShareArchive;
41
+ siteType;
42
+ samplingFeatureCode;
43
+ isPrivate;
44
+ description;
45
+ samplingFeatureType;
46
+ dataDisclaimer;
47
+ constructor() {
48
+ this.id = "", this.workspaceId = "", this.name = "", this.tags = [], this.siteType = "", this.samplingFeatureCode = "", this.isPrivate = !1, this.description = "", this.samplingFeatureType = "Site", this.dataDisclaimer = "";
49
+ }
50
+ }
51
+ class Xr {
52
+ id;
53
+ workspaceId;
54
+ name;
55
+ description;
56
+ thingId;
57
+ observationType;
58
+ resultType;
59
+ status;
60
+ sampledMedium;
61
+ noDataValue;
62
+ aggregationStatistic;
63
+ unitId;
64
+ observedPropertyId;
65
+ sensorId;
66
+ processingLevelId;
67
+ isPrivate;
68
+ isVisible;
69
+ phenomenonBeginTime;
70
+ phenomenonEndTime;
71
+ intendedTimeSpacing;
72
+ intendedTimeSpacingUnit;
73
+ timeAggregationInterval;
74
+ timeAggregationIntervalUnit;
75
+ dataSourceId;
76
+ valueCount;
77
+ constructor(t) {
78
+ this.id = "", this.workspaceId = "", this.name = "", this.description = "", this.thingId = t || "", this.observationType = "OM_Measurement", this.resultType = "Time Series Coverage", this.sampledMedium = "", this.noDataValue = -9999, this.aggregationStatistic = "", this.unitId = "", this.observedPropertyId = "", this.sensorId = "", this.processingLevelId = "", this.timeAggregationInterval = null, this.timeAggregationIntervalUnit = "seconds", this.isPrivate = !0, this.isVisible = !0, this.valueCount = 0;
79
+ }
80
+ }
81
+ class Vr {
82
+ id;
83
+ workspaceId;
84
+ name;
85
+ symbol;
86
+ definition;
87
+ type;
88
+ constructor() {
89
+ this.id = "", this.workspaceId = "", this.name = "", this.symbol = "", this.definition = "", this.type = "";
90
+ }
91
+ }
92
+ class qr {
93
+ id;
94
+ workspaceId;
95
+ name;
96
+ description;
97
+ manufacturer;
98
+ model;
99
+ methodType;
100
+ methodCode;
101
+ methodLink;
102
+ encodingType;
103
+ modelLink;
104
+ constructor() {
105
+ this.id = "", this.workspaceId = "", this.name = "", this.description = "", this.manufacturer = "", this.model = "", this.methodType = "Instrument Deployment", this.methodCode = "", this.methodLink = "", this.encodingType = "application/json", this.modelLink = "";
106
+ }
107
+ }
108
+ class Jr {
109
+ id;
110
+ workspaceId;
111
+ name;
112
+ definition;
113
+ description;
114
+ type;
115
+ code;
116
+ constructor() {
117
+ this.id = "", this.workspaceId = "", this.name = "", this.definition = "", this.description = "", this.type = "Hydrology", this.code = "";
118
+ }
119
+ }
120
+ class Kr {
121
+ id;
122
+ workspaceId;
123
+ code;
124
+ definition;
125
+ explanation;
126
+ constructor() {
127
+ this.id = "", this.workspaceId = "", this.code = "", this.definition = "", this.explanation = "";
128
+ }
129
+ }
130
+ class Qr {
131
+ id;
132
+ workspaceId;
133
+ code;
134
+ description;
135
+ constructor() {
136
+ this.id = "", this.workspaceId = "", this.code = "", this.description = "";
137
+ }
138
+ }
139
+ class Zr {
140
+ name;
141
+ code;
142
+ type;
143
+ description;
144
+ link;
145
+ constructor() {
146
+ }
147
+ }
148
+ class en {
149
+ id;
150
+ email;
151
+ password;
152
+ firstName;
153
+ middleName;
154
+ lastName;
155
+ phone;
156
+ address;
157
+ organization;
158
+ type;
159
+ link;
160
+ accountType;
161
+ hydroShareConnected;
162
+ constructor() {
163
+ this.id = "", this.email = "", this.password = "", this.firstName = "", this.middleName = "", this.lastName = "", this.phone = "", this.address = "", this.type = "", this.link = "", this.accountType = "standard", this.hydroShareConnected = !1;
164
+ }
165
+ }
166
+ class tn {
167
+ id;
168
+ name;
169
+ iconLink;
170
+ signupEnabled;
171
+ connectEnabled;
172
+ constructor() {
173
+ this.id = "", this.name = "", this.iconLink = "", this.signupEnabled = !0, this.connectEnabled = !0;
174
+ }
175
+ }
176
+ var Wt = /* @__PURE__ */ ((e) => (e.Global = "*", e.View = "view", e.Create = "create", e.Edit = "edit", e.Delete = "delete", e))(Wt || {}), Gt = /* @__PURE__ */ ((e) => (e.Global = "*", e.Workspace = "Workspace", e.Collaborator = "Collaborator", e.Thing = "Thing", e.Datastream = "Datastream", e.Sensor = "Sensor", e.Unit = "Unit", e.ObservedProperty = "ObservedProperty", e.ProcessingLevel = "ProcessingLevel", e.Observation = "Observation", e))(Gt || {});
177
+ class rn {
178
+ id = "";
179
+ key = "";
180
+ name = "";
181
+ description = "";
182
+ isActive = !0;
183
+ expiresAt = "";
184
+ createdAt = "";
185
+ lastUsed = "";
186
+ workspaceId = "";
187
+ role = null;
188
+ constructor(t) {
189
+ Object.assign(this, t);
190
+ }
191
+ }
192
+ class nn {
193
+ id;
194
+ name;
195
+ isPrivate;
196
+ owner;
197
+ collaboratorRole;
198
+ pendingTransferTo;
199
+ constructor() {
200
+ this.id = "", this.name = "", this.isPrivate = !1, this.owner = null, this.collaboratorRole = null, this.pendingTransferTo = null;
201
+ }
202
+ }
203
+ class sn {
204
+ user;
205
+ role;
206
+ constructor() {
207
+ this.user = {
208
+ phone: "",
209
+ address: "",
210
+ link: "",
211
+ type: "",
212
+ name: "",
213
+ email: "",
214
+ organizationName: ""
215
+ }, this.role = {
216
+ name: "",
217
+ description: "",
218
+ id: "",
219
+ isApikeyRole: !1,
220
+ isUserRole: !1,
221
+ workspaceId: "",
222
+ permissions: []
223
+ };
224
+ }
225
+ }
226
+ function lt() {
227
+ const e = "csrftoken=", r = decodeURIComponent(document.cookie).split(";");
228
+ for (const n of r) {
229
+ const s = n.trim();
230
+ if (s.startsWith(e))
231
+ return s.substring(e.length);
232
+ }
233
+ return null;
234
+ }
235
+ function ut(e) {
236
+ let t = e.headers ? { ...e.headers } : {}, r;
237
+ return e.body !== void 0 && (r = typeof e.body == "string" || e.body instanceof FormData ? e.body : JSON.stringify(e.body)), t["X-CSRFToken"] = lt() || "", {
238
+ ...e,
239
+ headers: t,
240
+ body: r,
241
+ credentials: "omit"
242
+ };
243
+ }
244
+ function Yt(e) {
245
+ if (Array.isArray(e?.errors) && e.errors.length && (e = e.errors[0]), typeof e != "object" || e === null)
246
+ return "An unknown error occurred.";
247
+ const t = ["message", "detail", "error"];
248
+ for (const r of t)
249
+ if (e[r]) return e[r];
250
+ return "An unknown error occurred.";
251
+ }
252
+ async function ht(e) {
253
+ if (e.headers.get("Content-Length") === "0" || e.statusText === "No Content")
254
+ return null;
255
+ const t = e.headers.get("content-type") || "";
256
+ let r = null;
257
+ if (t.includes("application/json"))
258
+ try {
259
+ r = await e.json();
260
+ } catch (s) {
261
+ console.error("Failed to parse error JSON:", s);
262
+ }
263
+ else if (t.includes("text/csv"))
264
+ try {
265
+ r = await e.blob();
266
+ } catch (s) {
267
+ console.error("Failed to parse error JSON:", s);
268
+ }
269
+ if (e.ok || e.status === 401) return r;
270
+ const n = {
271
+ status: e.status,
272
+ message: Yt(r)
273
+ };
274
+ throw console.error("API response not OK:", n.message), n;
275
+ }
276
+ var ke = function(e, t) {
277
+ return ke = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(r, n) {
278
+ r.__proto__ = n;
279
+ } || function(r, n) {
280
+ for (var s in n) Object.prototype.hasOwnProperty.call(n, s) && (r[s] = n[s]);
281
+ }, ke(e, t);
282
+ };
283
+ function le(e, t) {
284
+ if (typeof t != "function" && t !== null)
285
+ throw new TypeError("Class extends value " + String(t) + " is not a constructor or null");
286
+ ke(e, t);
287
+ function r() {
288
+ this.constructor = e;
289
+ }
290
+ e.prototype = t === null ? Object.create(t) : (r.prototype = t.prototype, new r());
291
+ }
292
+ function ve(e) {
293
+ var t = typeof Symbol == "function" && Symbol.iterator, r = t && e[t], n = 0;
294
+ if (r) return r.call(e);
295
+ if (e && typeof e.length == "number") return {
296
+ next: function() {
297
+ return e && n >= e.length && (e = void 0), { value: e && e[n++], done: !e };
298
+ }
299
+ };
300
+ throw new TypeError(t ? "Object is not iterable." : "Symbol.iterator is not defined.");
301
+ }
302
+ function _e(e, t) {
303
+ var r = typeof Symbol == "function" && e[Symbol.iterator];
304
+ if (!r) return e;
305
+ var n = r.call(e), s, a = [], o;
306
+ try {
307
+ for (; (t === void 0 || t-- > 0) && !(s = n.next()).done; ) a.push(s.value);
308
+ } catch (i) {
309
+ o = { error: i };
310
+ } finally {
311
+ try {
312
+ s && !s.done && (r = n.return) && r.call(n);
313
+ } finally {
314
+ if (o) throw o.error;
315
+ }
316
+ }
317
+ return a;
318
+ }
319
+ function Ae(e, t, r) {
320
+ if (r || arguments.length === 2) for (var n = 0, s = t.length, a; n < s; n++)
321
+ (a || !(n in t)) && (a || (a = Array.prototype.slice.call(t, 0, n)), a[n] = t[n]);
322
+ return e.concat(a || Array.prototype.slice.call(t));
323
+ }
324
+ function P(e) {
325
+ return typeof e == "function";
326
+ }
327
+ function ft(e) {
328
+ var t = function(n) {
329
+ Error.call(n), n.stack = new Error().stack;
330
+ }, r = e(t);
331
+ return r.prototype = Object.create(Error.prototype), r.prototype.constructor = r, r;
332
+ }
333
+ var de = ft(function(e) {
334
+ return function(r) {
335
+ e(this), this.message = r ? r.length + ` errors occurred during unsubscription:
336
+ ` + r.map(function(n, s) {
337
+ return s + 1 + ") " + n.toString();
338
+ }).join(`
339
+ `) : "", this.name = "UnsubscriptionError", this.errors = r;
340
+ };
341
+ });
342
+ function Le(e, t) {
343
+ if (e) {
344
+ var r = e.indexOf(t);
345
+ 0 <= r && e.splice(r, 1);
346
+ }
347
+ }
348
+ var ue = (function() {
349
+ function e(t) {
350
+ this.initialTeardown = t, this.closed = !1, this._parentage = null, this._finalizers = null;
351
+ }
352
+ return e.prototype.unsubscribe = function() {
353
+ var t, r, n, s, a;
354
+ if (!this.closed) {
355
+ this.closed = !0;
356
+ var o = this._parentage;
357
+ if (o)
358
+ if (this._parentage = null, Array.isArray(o))
359
+ try {
360
+ for (var i = ve(o), l = i.next(); !l.done; l = i.next()) {
361
+ var f = l.value;
362
+ f.remove(this);
363
+ }
364
+ } catch (h) {
365
+ t = { error: h };
366
+ } finally {
367
+ try {
368
+ l && !l.done && (r = i.return) && r.call(i);
369
+ } finally {
370
+ if (t) throw t.error;
371
+ }
372
+ }
373
+ else
374
+ o.remove(this);
375
+ var u = this.initialTeardown;
376
+ if (P(u))
377
+ try {
378
+ u();
379
+ } catch (h) {
380
+ a = h instanceof de ? h.errors : [h];
381
+ }
382
+ var p = this._finalizers;
383
+ if (p) {
384
+ this._finalizers = null;
385
+ try {
386
+ for (var g = ve(p), y = g.next(); !y.done; y = g.next()) {
387
+ var d = y.value;
388
+ try {
389
+ Pe(d);
390
+ } catch (h) {
391
+ a = a ?? [], h instanceof de ? a = Ae(Ae([], _e(a)), _e(h.errors)) : a.push(h);
392
+ }
393
+ }
394
+ } catch (h) {
395
+ n = { error: h };
396
+ } finally {
397
+ try {
398
+ y && !y.done && (s = g.return) && s.call(g);
399
+ } finally {
400
+ if (n) throw n.error;
401
+ }
402
+ }
403
+ }
404
+ if (a)
405
+ throw new de(a);
406
+ }
407
+ }, e.prototype.add = function(t) {
408
+ var r;
409
+ if (t && t !== this)
410
+ if (this.closed)
411
+ Pe(t);
412
+ else {
413
+ if (t instanceof e) {
414
+ if (t.closed || t._hasParent(this))
415
+ return;
416
+ t._addParent(this);
417
+ }
418
+ (this._finalizers = (r = this._finalizers) !== null && r !== void 0 ? r : []).push(t);
419
+ }
420
+ }, e.prototype._hasParent = function(t) {
421
+ var r = this._parentage;
422
+ return r === t || Array.isArray(r) && r.includes(t);
423
+ }, e.prototype._addParent = function(t) {
424
+ var r = this._parentage;
425
+ this._parentage = Array.isArray(r) ? (r.push(t), r) : r ? [r, t] : t;
426
+ }, e.prototype._removeParent = function(t) {
427
+ var r = this._parentage;
428
+ r === t ? this._parentage = null : Array.isArray(r) && Le(r, t);
429
+ }, e.prototype.remove = function(t) {
430
+ var r = this._finalizers;
431
+ r && Le(r, t), t instanceof e && t._removeParent(this);
432
+ }, e.EMPTY = (function() {
433
+ var t = new e();
434
+ return t.closed = !0, t;
435
+ })(), e;
436
+ })(), dt = ue.EMPTY;
437
+ function pt(e) {
438
+ return e instanceof ue || e && "closed" in e && P(e.remove) && P(e.add) && P(e.unsubscribe);
439
+ }
440
+ function Pe(e) {
441
+ P(e) ? e() : e.unsubscribe();
442
+ }
443
+ var Ht = {
444
+ Promise: void 0
445
+ }, zt = {
446
+ setTimeout: function(e, t) {
447
+ for (var r = [], n = 2; n < arguments.length; n++)
448
+ r[n - 2] = arguments[n];
449
+ return setTimeout.apply(void 0, Ae([e, t], _e(r)));
450
+ },
451
+ clearTimeout: function(e) {
452
+ return clearTimeout(e);
453
+ },
454
+ delegate: void 0
455
+ };
456
+ function Xt(e) {
457
+ zt.setTimeout(function() {
458
+ throw e;
459
+ });
460
+ }
461
+ function Be() {
462
+ }
463
+ function oe(e) {
464
+ e();
465
+ }
466
+ var yt = (function(e) {
467
+ le(t, e);
468
+ function t(r) {
469
+ var n = e.call(this) || this;
470
+ return n.isStopped = !1, r ? (n.destination = r, pt(r) && r.add(n)) : n.destination = Jt, n;
471
+ }
472
+ return t.create = function(r, n, s) {
473
+ return new Te(r, n, s);
474
+ }, t.prototype.next = function(r) {
475
+ this.isStopped || this._next(r);
476
+ }, t.prototype.error = function(r) {
477
+ this.isStopped || (this.isStopped = !0, this._error(r));
478
+ }, t.prototype.complete = function() {
479
+ this.isStopped || (this.isStopped = !0, this._complete());
480
+ }, t.prototype.unsubscribe = function() {
481
+ this.closed || (this.isStopped = !0, e.prototype.unsubscribe.call(this), this.destination = null);
482
+ }, t.prototype._next = function(r) {
483
+ this.destination.next(r);
484
+ }, t.prototype._error = function(r) {
485
+ try {
486
+ this.destination.error(r);
487
+ } finally {
488
+ this.unsubscribe();
489
+ }
490
+ }, t.prototype._complete = function() {
491
+ try {
492
+ this.destination.complete();
493
+ } finally {
494
+ this.unsubscribe();
495
+ }
496
+ }, t;
497
+ })(ue), Vt = (function() {
498
+ function e(t) {
499
+ this.partialObserver = t;
500
+ }
501
+ return e.prototype.next = function(t) {
502
+ var r = this.partialObserver;
503
+ if (r.next)
504
+ try {
505
+ r.next(t);
506
+ } catch (n) {
507
+ ee(n);
508
+ }
509
+ }, e.prototype.error = function(t) {
510
+ var r = this.partialObserver;
511
+ if (r.error)
512
+ try {
513
+ r.error(t);
514
+ } catch (n) {
515
+ ee(n);
516
+ }
517
+ else
518
+ ee(t);
519
+ }, e.prototype.complete = function() {
520
+ var t = this.partialObserver;
521
+ if (t.complete)
522
+ try {
523
+ t.complete();
524
+ } catch (r) {
525
+ ee(r);
526
+ }
527
+ }, e;
528
+ })(), Te = (function(e) {
529
+ le(t, e);
530
+ function t(r, n, s) {
531
+ var a = e.call(this) || this, o;
532
+ return P(r) || !r ? o = {
533
+ next: r ?? void 0,
534
+ error: n ?? void 0,
535
+ complete: s ?? void 0
536
+ } : o = r, a.destination = new Vt(o), a;
537
+ }
538
+ return t;
539
+ })(yt);
540
+ function ee(e) {
541
+ Xt(e);
542
+ }
543
+ function qt(e) {
544
+ throw e;
545
+ }
546
+ var Jt = {
547
+ closed: !0,
548
+ next: Be,
549
+ error: qt,
550
+ complete: Be
551
+ }, Kt = (function() {
552
+ return typeof Symbol == "function" && Symbol.observable || "@@observable";
553
+ })();
554
+ function Qt(e) {
555
+ return e;
556
+ }
557
+ function Zt(e) {
558
+ return e.length === 0 ? Qt : e.length === 1 ? e[0] : function(r) {
559
+ return e.reduce(function(n, s) {
560
+ return s(n);
561
+ }, r);
562
+ };
563
+ }
564
+ var Ne = (function() {
565
+ function e(t) {
566
+ t && (this._subscribe = t);
567
+ }
568
+ return e.prototype.lift = function(t) {
569
+ var r = new e();
570
+ return r.source = this, r.operator = t, r;
571
+ }, e.prototype.subscribe = function(t, r, n) {
572
+ var s = this, a = tr(t) ? t : new Te(t, r, n);
573
+ return oe(function() {
574
+ var o = s, i = o.operator, l = o.source;
575
+ a.add(i ? i.call(a, l) : l ? s._subscribe(a) : s._trySubscribe(a));
576
+ }), a;
577
+ }, e.prototype._trySubscribe = function(t) {
578
+ try {
579
+ return this._subscribe(t);
580
+ } catch (r) {
581
+ t.error(r);
582
+ }
583
+ }, e.prototype.forEach = function(t, r) {
584
+ var n = this;
585
+ return r = je(r), new r(function(s, a) {
586
+ var o = new Te({
587
+ next: function(i) {
588
+ try {
589
+ t(i);
590
+ } catch (l) {
591
+ a(l), o.unsubscribe();
592
+ }
593
+ },
594
+ error: a,
595
+ complete: s
596
+ });
597
+ n.subscribe(o);
598
+ });
599
+ }, e.prototype._subscribe = function(t) {
600
+ var r;
601
+ return (r = this.source) === null || r === void 0 ? void 0 : r.subscribe(t);
602
+ }, e.prototype[Kt] = function() {
603
+ return this;
604
+ }, e.prototype.pipe = function() {
605
+ for (var t = [], r = 0; r < arguments.length; r++)
606
+ t[r] = arguments[r];
607
+ return Zt(t)(this);
608
+ }, e.prototype.toPromise = function(t) {
609
+ var r = this;
610
+ return t = je(t), new t(function(n, s) {
611
+ var a;
612
+ r.subscribe(function(o) {
613
+ return a = o;
614
+ }, function(o) {
615
+ return s(o);
616
+ }, function() {
617
+ return n(a);
618
+ });
619
+ });
620
+ }, e.create = function(t) {
621
+ return new e(t);
622
+ }, e;
623
+ })();
624
+ function je(e) {
625
+ var t;
626
+ return (t = e ?? Ht.Promise) !== null && t !== void 0 ? t : Promise;
627
+ }
628
+ function er(e) {
629
+ return e && P(e.next) && P(e.error) && P(e.complete);
630
+ }
631
+ function tr(e) {
632
+ return e && e instanceof yt || er(e) && pt(e);
633
+ }
634
+ var rr = ft(function(e) {
635
+ return function() {
636
+ e(this), this.name = "ObjectUnsubscribedError", this.message = "object unsubscribed";
637
+ };
638
+ }), gt = (function(e) {
639
+ le(t, e);
640
+ function t() {
641
+ var r = e.call(this) || this;
642
+ return r.closed = !1, r.currentObservers = null, r.observers = [], r.isStopped = !1, r.hasError = !1, r.thrownError = null, r;
643
+ }
644
+ return t.prototype.lift = function(r) {
645
+ var n = new We(this, this);
646
+ return n.operator = r, n;
647
+ }, t.prototype._throwIfClosed = function() {
648
+ if (this.closed)
649
+ throw new rr();
650
+ }, t.prototype.next = function(r) {
651
+ var n = this;
652
+ oe(function() {
653
+ var s, a;
654
+ if (n._throwIfClosed(), !n.isStopped) {
655
+ n.currentObservers || (n.currentObservers = Array.from(n.observers));
656
+ try {
657
+ for (var o = ve(n.currentObservers), i = o.next(); !i.done; i = o.next()) {
658
+ var l = i.value;
659
+ l.next(r);
660
+ }
661
+ } catch (f) {
662
+ s = { error: f };
663
+ } finally {
664
+ try {
665
+ i && !i.done && (a = o.return) && a.call(o);
666
+ } finally {
667
+ if (s) throw s.error;
668
+ }
669
+ }
670
+ }
671
+ });
672
+ }, t.prototype.error = function(r) {
673
+ var n = this;
674
+ oe(function() {
675
+ if (n._throwIfClosed(), !n.isStopped) {
676
+ n.hasError = n.isStopped = !0, n.thrownError = r;
677
+ for (var s = n.observers; s.length; )
678
+ s.shift().error(r);
679
+ }
680
+ });
681
+ }, t.prototype.complete = function() {
682
+ var r = this;
683
+ oe(function() {
684
+ if (r._throwIfClosed(), !r.isStopped) {
685
+ r.isStopped = !0;
686
+ for (var n = r.observers; n.length; )
687
+ n.shift().complete();
688
+ }
689
+ });
690
+ }, t.prototype.unsubscribe = function() {
691
+ this.isStopped = this.closed = !0, this.observers = this.currentObservers = null;
692
+ }, Object.defineProperty(t.prototype, "observed", {
693
+ get: function() {
694
+ var r;
695
+ return ((r = this.observers) === null || r === void 0 ? void 0 : r.length) > 0;
696
+ },
697
+ enumerable: !1,
698
+ configurable: !0
699
+ }), t.prototype._trySubscribe = function(r) {
700
+ return this._throwIfClosed(), e.prototype._trySubscribe.call(this, r);
701
+ }, t.prototype._subscribe = function(r) {
702
+ return this._throwIfClosed(), this._checkFinalizedStatuses(r), this._innerSubscribe(r);
703
+ }, t.prototype._innerSubscribe = function(r) {
704
+ var n = this, s = this, a = s.hasError, o = s.isStopped, i = s.observers;
705
+ return a || o ? dt : (this.currentObservers = null, i.push(r), new ue(function() {
706
+ n.currentObservers = null, Le(i, r);
707
+ }));
708
+ }, t.prototype._checkFinalizedStatuses = function(r) {
709
+ var n = this, s = n.hasError, a = n.thrownError, o = n.isStopped;
710
+ s ? r.error(a) : o && r.complete();
711
+ }, t.prototype.asObservable = function() {
712
+ var r = new Ne();
713
+ return r.source = this, r;
714
+ }, t.create = function(r, n) {
715
+ return new We(r, n);
716
+ }, t;
717
+ })(Ne), We = (function(e) {
718
+ le(t, e);
719
+ function t(r, n) {
720
+ var s = e.call(this) || this;
721
+ return s.destination = r, s.source = n, s;
722
+ }
723
+ return t.prototype.next = function(r) {
724
+ var n, s;
725
+ (s = (n = this.destination) === null || n === void 0 ? void 0 : n.next) === null || s === void 0 || s.call(n, r);
726
+ }, t.prototype.error = function(r) {
727
+ var n, s;
728
+ (s = (n = this.destination) === null || n === void 0 ? void 0 : n.error) === null || s === void 0 || s.call(n, r);
729
+ }, t.prototype.complete = function() {
730
+ var r, n;
731
+ (n = (r = this.destination) === null || r === void 0 ? void 0 : r.complete) === null || n === void 0 || n.call(r);
732
+ }, t.prototype._subscribe = function(r) {
733
+ var n, s;
734
+ return (s = (n = this.source) === null || n === void 0 ? void 0 : n.subscribe(r)) !== null && s !== void 0 ? s : dt;
735
+ }, t;
736
+ })(gt);
737
+ const mt = 3e3;
738
+ var wt = /* @__PURE__ */ ((e) => (e.Warning = "warning", e.Success = "success", e.Error = "error", e.Info = "info", e))(wt || {}), bt = /* @__PURE__ */ ((e) => (e.Success = "mdi-checkbox-marked-circle", e.Warning = "mdi-alert", e.Error = "mdi-alert-circle", e.Info = "mdi-information", e.None = "none", e))(bt || {}), St = /* @__PURE__ */ ((e) => (e.Warning = "Warning", e.Success = "Success", e.Error = "Error", e.Info = "Info", e))(St || {}), nr = /* @__PURE__ */ ((e) => (e.Center = "center", e.Left = "left", e.Right = "right", e.Bottom = "bottom", e.Top = "top", e))(nr || {});
739
+ class sr {
740
+ constructor(t = "", r = "info", n = "none", s = "Info", a = mt, o = "center", i = !1) {
741
+ this.message = t, this.color = r, this.icon = n, this.title = s, this.timeout = a, this.position = o, this.visible = i;
742
+ }
743
+ }
744
+ class or {
745
+ static subject = new gt();
746
+ static get snack$() {
747
+ return this.subject.asObservable();
748
+ }
749
+ static createSnackbar(t, r) {
750
+ this.subject.next(
751
+ new sr(
752
+ t,
753
+ wt[r],
754
+ bt[r],
755
+ St[r],
756
+ mt,
757
+ "bottom",
758
+ !0
759
+ )
760
+ );
761
+ }
762
+ static success(t) {
763
+ this.createSnackbar(
764
+ t,
765
+ "Success"
766
+ /* Success */
767
+ );
768
+ }
769
+ static warn(t) {
770
+ this.createSnackbar(
771
+ t,
772
+ "Warning"
773
+ /* Warning */
774
+ );
775
+ }
776
+ static error(t) {
777
+ this.createSnackbar(
778
+ t,
779
+ "Error"
780
+ /* Error */
781
+ );
782
+ }
783
+ static info(t) {
784
+ this.createSnackbar(
785
+ t,
786
+ "Info"
787
+ /* Info */
788
+ );
789
+ }
790
+ }
791
+ function Et(e, t) {
792
+ const r = {};
793
+ for (let n in t)
794
+ if (Array.isArray(t[n]))
795
+ JSON.stringify(e[n]) !== JSON.stringify(t[n]) && (r[n] = t[n]);
796
+ else if (e[n] && typeof e[n] == "object" && t[n] && typeof t[n] == "object") {
797
+ const s = Et(e[n], t[n]);
798
+ Object.keys(s).length > 0 && (r[n] = s);
799
+ } else JSON.stringify(e[n]) !== JSON.stringify(t[n]) && (r[n] = t[n]);
800
+ return r;
801
+ }
802
+ function ar(e) {
803
+ return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
804
+ }
805
+ var pe, Ge;
806
+ function ir() {
807
+ if (Ge) return pe;
808
+ Ge = 1;
809
+ class e {
810
+ /// value;
811
+ /// next;
812
+ constructor(n) {
813
+ this.value = n, this.next = void 0;
814
+ }
815
+ }
816
+ class t {
817
+ // TODO: Use private class fields when targeting Node.js 12.
818
+ // #_head;
819
+ // #_tail;
820
+ // #_size;
821
+ constructor() {
822
+ this.clear();
823
+ }
824
+ enqueue(n) {
825
+ const s = new e(n);
826
+ this._head ? (this._tail.next = s, this._tail = s) : (this._head = s, this._tail = s), this._size++;
827
+ }
828
+ dequeue() {
829
+ const n = this._head;
830
+ if (n)
831
+ return this._head = this._head.next, this._size--, n.value;
832
+ }
833
+ clear() {
834
+ this._head = void 0, this._tail = void 0, this._size = 0;
835
+ }
836
+ get size() {
837
+ return this._size;
838
+ }
839
+ *[Symbol.iterator]() {
840
+ let n = this._head;
841
+ for (; n; )
842
+ yield n.value, n = n.next;
843
+ }
844
+ }
845
+ return pe = t, pe;
846
+ }
847
+ var ye, Ye;
848
+ function cr() {
849
+ if (Ye) return ye;
850
+ Ye = 1;
851
+ const e = ir();
852
+ return ye = (r) => {
853
+ if (!((Number.isInteger(r) || r === 1 / 0) && r > 0))
854
+ throw new TypeError("Expected `concurrency` to be a number from 1 and up");
855
+ const n = new e();
856
+ let s = 0;
857
+ const a = () => {
858
+ s--, n.size > 0 && n.dequeue()();
859
+ }, o = async (f, u, ...p) => {
860
+ s++;
861
+ const g = (async () => f(...p))();
862
+ u(g);
863
+ try {
864
+ await g;
865
+ } catch {
866
+ }
867
+ a();
868
+ }, i = (f, u, ...p) => {
869
+ n.enqueue(o.bind(null, f, u, ...p)), (async () => (await Promise.resolve(), s < r && n.size > 0 && n.dequeue()()))();
870
+ }, l = (f, ...u) => new Promise((p) => {
871
+ i(f, p, ...u);
872
+ });
873
+ return Object.defineProperties(l, {
874
+ activeCount: {
875
+ get: () => s
876
+ },
877
+ pendingCount: {
878
+ get: () => n.size
879
+ },
880
+ clearQueue: {
881
+ value: () => {
882
+ n.clear();
883
+ }
884
+ }
885
+ }), l;
886
+ }, ye;
887
+ }
888
+ var lr = cr();
889
+ const ur = /* @__PURE__ */ ar(lr), G = ur(10), hr = 1e3;
890
+ async function z(e, t) {
891
+ const r = ut(t);
892
+ try {
893
+ const n = await fetch(e, r);
894
+ return await ht(n);
895
+ } catch (n) {
896
+ throw n instanceof TypeError && or.error("Network error. Please check your connection."), n;
897
+ }
898
+ }
899
+ const c = {
900
+ async fetch(e, t = {}) {
901
+ return t.method = "GET", await G(() => z(e, t));
902
+ },
903
+ async patch(e, t, r = null, n = {}) {
904
+ if (n.method = "PATCH", n.body = r ? Et(r, t) : t, Object.keys(n.body).length !== 0)
905
+ return await G(() => z(e, n));
906
+ },
907
+ async post(e, t = void 0, r = {}) {
908
+ return r.method = "POST", r.body = t, await G(() => z(e, r));
909
+ },
910
+ async put(e, t = void 0, r = {}) {
911
+ return r.method = "PUT", r.body = t, await G(() => z(e, r));
912
+ },
913
+ async delete(e, t = void 0, r = {}) {
914
+ return r.method = "DELETE", r.body = t, await G(() => z(e, r));
915
+ },
916
+ async paginatedFetch(e, t) {
917
+ const r = t ?? hr, n = e.includes("?") ? "&" : "?", s = `${e}${n}page_size=${r}&page=1`, a = ut({ method: "GET" }), o = await G(() => fetch(s, a)), i = Number(o.headers.get("x-total-pages")) || 1, f = [...await ht(o)];
918
+ for (let u = 2; u <= i; u++) {
919
+ const p = `${e}${n}page_size=${r}&page=${u}`, g = await G(() => z(p, { method: "GET" }));
920
+ f.push(...g);
921
+ }
922
+ return f;
923
+ }
924
+ }, He = {
925
+ HTTP: {
926
+ type: "HTTP",
927
+ sourceUri: "",
928
+ placeholderVariables: []
929
+ },
930
+ local: {
931
+ type: "local",
932
+ sourceUri: "",
933
+ placeholderVariables: []
934
+ }
935
+ }, ze = {
936
+ JSON: {
937
+ type: "JSON",
938
+ timestamp: {
939
+ key: "",
940
+ format: "ISO8601",
941
+ timezoneMode: "embeddedOffset"
942
+ },
943
+ JMESPath: ""
944
+ },
945
+ CSV: {
946
+ type: "CSV",
947
+ timestamp: {
948
+ key: "",
949
+ format: "ISO8601",
950
+ timezoneMode: "embeddedOffset"
951
+ },
952
+ headerRow: 1,
953
+ dataStartRow: 2,
954
+ delimiter: ",",
955
+ identifierType: "name"
956
+ /* Name */
957
+ }
958
+ }, Xe = {
959
+ HydroServer: {
960
+ type: "HydroServer"
961
+ }
962
+ };
963
+ class on {
964
+ name = "";
965
+ settings = {
966
+ type: "SDL",
967
+ extractor: JSON.parse(JSON.stringify(He.local)),
968
+ transformer: JSON.parse(JSON.stringify(ze.CSV)),
969
+ loader: JSON.parse(JSON.stringify(Xe.HydroServer)),
970
+ payloads: []
971
+ };
972
+ id = "";
973
+ workspaceId = "";
974
+ orchestrationSystem = {
975
+ id: "",
976
+ name: "",
977
+ workspaceId: "",
978
+ type: ""
979
+ };
980
+ schedule = {
981
+ interval: 15,
982
+ intervalUnits: "minutes"
983
+ };
984
+ status = { paused: !0 };
985
+ datastreams = [];
986
+ constructor(t) {
987
+ Object.assign(this, t);
988
+ }
989
+ switchExtractor(t) {
990
+ this.settings.extractor = JSON.parse(
991
+ JSON.stringify(He[t])
992
+ );
993
+ }
994
+ switchTransformer(t) {
995
+ this.settings.transformer = JSON.parse(
996
+ JSON.stringify(ze[t])
997
+ );
998
+ }
999
+ switchLoader(t) {
1000
+ this.settings.loader = JSON.parse(JSON.stringify(Xe[t]));
1001
+ }
1002
+ }
1003
+ function Ve(e) {
1004
+ return {
1005
+ name: e.name,
1006
+ settings: e.settings,
1007
+ workspaceId: e.workspaceId,
1008
+ orchestrationSystemId: e.orchestrationSystem.id,
1009
+ schedule: e.schedule,
1010
+ status: e.status
1011
+ };
1012
+ }
1013
+ const O = "https://lro.hydroserver.org/api", Me = `${O}/auth`, x = `${Me}/browser/account`, ge = `${Me}/browser/session`, ae = `${Me}/browser/provider`, $ = `${O}/data/workspaces`, me = `${O}/data/roles`, R = `${O}/data/datastreams`, N = `${O}/data/sensors`, _ = `${O}/data/things`, qe = `${_}/tags`, X = `${O}/data/orchestration-systems`, F = `${O}/data/data-sources`, Y = `${O}/data/observed-properties`, V = `${O}/data/processing-levels`, J = `${O}/data/result-qualifiers`, H = `${O}/data/units`, an = (e, t, r, n, s) => {
1014
+ let a = `${R}/${e}/observations?format=column`;
1015
+ return a += `&order_by=phenomenonTime&page_size=${t}`, a += `&phenomenon_time_min=${encodeURIComponent(r)}`, n && (a += `&phenomenon_time_max=${encodeURIComponent(n)}`), s && (a += `&page=${s}`), a;
1016
+ }, fr = (e, t, r) => {
1017
+ const n = {
1018
+ provider: e,
1019
+ callback_url: t,
1020
+ process: r
1021
+ }, s = lt(), a = document.createElement("form");
1022
+ if (a.method = "POST", a.action = `${ae}/redirect`, s) {
1023
+ const o = document.createElement("input");
1024
+ o.type = "hidden", o.name = "csrfmiddlewaretoken", o.value = s, a.appendChild(o);
1025
+ }
1026
+ for (const o in n) {
1027
+ const i = document.createElement("input");
1028
+ i.type = "hidden", i.name = o, i.value = n[o] || "", a.appendChild(i);
1029
+ }
1030
+ document.body.appendChild(a), a.submit();
1031
+ }, cn = {
1032
+ fetchSession: async () => c.fetch(`${ge}`),
1033
+ login: async (e, t) => c.post(`${ge}`, { email: e, password: t }),
1034
+ logout: async () => c.delete(`${ge}`),
1035
+ fetchUser: async () => c.fetch(`${x}`),
1036
+ signup: async (e) => c.post(`${x}`, e),
1037
+ updateUser: async (e, t) => c.patch(`${x}`, e, t),
1038
+ deleteUser: async () => c.delete(`${x}`),
1039
+ sendVerificationEmail: async (e) => c.put(`${x}/email/verify`, {
1040
+ email: e
1041
+ }),
1042
+ verifyEmailWithCode: async (e) => c.post(`${x}/email/verify`, { key: e }),
1043
+ requestPasswordReset: async (e) => c.post(`${x}/password/request`, {
1044
+ email: e
1045
+ }),
1046
+ resetPassword: async (e, t) => c.post(`${x}/password/reset`, {
1047
+ key: e,
1048
+ password: t
1049
+ }),
1050
+ fetchWorkspaces: async () => c.paginatedFetch(`${$}`),
1051
+ fetchAssociatedWorkspaces: async () => c.paginatedFetch(`${$}?is_associated=true`),
1052
+ fetchWorkspace: async (e) => c.fetch(`${$}/${e}`),
1053
+ createWorkspace: async (e) => c.post($, e),
1054
+ updateWorkspace: async (e, t = null) => c.patch(
1055
+ `${$}/${e.id}`,
1056
+ e,
1057
+ t
1058
+ ),
1059
+ deleteWorkspace: async (e) => c.delete(`${$}/${e}`),
1060
+ transferWorkspace: async (e, t) => c.post(`${$}/${e}/transfer`, { newOwner: t }),
1061
+ acceptWorkspaceTransfer: async (e) => c.put(`${$}/${e}/transfer`),
1062
+ rejectWorkspaceTransfer: async (e) => c.delete(`${$}/${e}/transfer`),
1063
+ getCollaboratorRoles: async (e) => c.paginatedFetch(`${me}?is_user_role=true`),
1064
+ getAPIKeyRoles: async (e) => c.paginatedFetch(`${me}?is_apikey_role=true`),
1065
+ getRole: async (e) => c.fetch(`${me}/${e}`),
1066
+ getCollaborators: async (e) => c.paginatedFetch(`${$}/${e}/collaborators`),
1067
+ addCollaborator: async (e, t, r) => c.post(`${$}/${e}/collaborators`, {
1068
+ email: t,
1069
+ roleId: r
1070
+ }),
1071
+ updateCollaboratorRole: async (e, t, r) => c.put(`${$}/${e}/collaborators`, {
1072
+ email: t,
1073
+ roleId: r
1074
+ }),
1075
+ removeCollaborator: async (e, t) => c.delete(`${$}/${e}/collaborators`, { email: t }),
1076
+ fetchApiKeys: async (e) => c.paginatedFetch(
1077
+ `${$}/${e}/api-keys?expand_related=true`
1078
+ ),
1079
+ fetchApiKey: async (e, t) => c.fetch(
1080
+ `${$}/${e}/api-keys/${t}?expand_related=true`
1081
+ ),
1082
+ createApiKey: async (e) => c.post(
1083
+ `${$}/${e.workspaceId}/api-keys?expand_related=true`,
1084
+ {
1085
+ name: e.name,
1086
+ description: e.description,
1087
+ isActive: !0,
1088
+ roleId: e.role.id
1089
+ }
1090
+ ),
1091
+ updateApiKey: async (e, t) => c.patch(
1092
+ `${$}/${e.workspaceId}/api-keys/${e.id}?expand_related=true`,
1093
+ {
1094
+ name: e.name,
1095
+ description: e.description,
1096
+ isActive: !0,
1097
+ roleId: e.role.id
1098
+ },
1099
+ t && {
1100
+ name: t.name,
1101
+ description: t.description,
1102
+ isActive: !0,
1103
+ roleId: t.role.id
1104
+ }
1105
+ ),
1106
+ regenerateApiKey: async (e, t) => c.put(
1107
+ `${$}/${e}/api-keys/${t}/regenerate?expand_related=true`
1108
+ ),
1109
+ deleteApiKey: async (e, t) => c.delete(`${$}/${e}/api-keys/${t}`),
1110
+ fetchConnectedProviders: async () => c.fetch(`${ae}/connections`),
1111
+ providerRedirect: fr,
1112
+ providerSignup: async (e) => c.post(`${ae}/signup`, e),
1113
+ deleteProvider: async (e, t) => c.delete(`${ae}/connections`, {
1114
+ provider: e,
1115
+ account: t
1116
+ }),
1117
+ createUnit: async (e) => c.post(H, e),
1118
+ fetchUnits: async () => c.paginatedFetch(`${H}`),
1119
+ fetchWorkspaceUnits: async (e) => c.paginatedFetch(`${H}?workspace_id=${e}`),
1120
+ updateUnit: async (e, t = null) => c.patch(`${H}/${e.id}`, e, t),
1121
+ deleteUnit: async (e) => c.delete(`${H}/${e}`),
1122
+ getUnit: async (e) => c.fetch(`${H}/${e}`),
1123
+ removeThingOwner: async (e, t) => c.patch(`${_}/${e}/ownership`, {
1124
+ email: t,
1125
+ removeOwner: !0
1126
+ }),
1127
+ addSecondaryOwner: async (e, t) => c.patch(`${_}/${e}/ownership`, {
1128
+ email: t,
1129
+ makeOwner: !0
1130
+ }),
1131
+ transferPrimaryOwnership: async (e, t) => c.patch(`${_}/${e}/ownership`, {
1132
+ email: t,
1133
+ transferPrimary: !0
1134
+ }),
1135
+ createThing: async (e) => c.post(_, e),
1136
+ fetchThings: async () => c.paginatedFetch(`${_}`),
1137
+ fetchThingsForWorkspace: async (e) => c.paginatedFetch(`${_}?workspace_id=${e}`),
1138
+ fetchOwnedThings: async () => c.paginatedFetch(`${_}?owned_only=true`),
1139
+ fetchThing: async (e) => c.fetch(`${_}/${e}`),
1140
+ updateThing: async (e) => c.patch(`${_}/${e.id}`, e),
1141
+ updateThingPrivacy: async (e, t) => c.patch(`${_}/${e}`, { isPrivate: t }),
1142
+ deleteThing: async (e) => c.delete(`${_}/${e}`),
1143
+ fetchMetadataForThingOwner: async (e) => c.paginatedFetch(
1144
+ `${_}/${e}/metadata?include_assignable_metadata=true`
1145
+ ),
1146
+ fetchMetadataForThing: async (e) => c.fetch(`${_}/${e}/metadata`),
1147
+ uploadSitePhotos: async (e, t) => c.post(`${_}/${e}/photos`, t),
1148
+ fetchSitePhotos: async (e) => c.paginatedFetch(`${_}/${e}/photos`),
1149
+ deleteSitePhoto: async (e, t) => c.delete(`${_}/${e}/photos`, { name: t }),
1150
+ createSiteTag: async (e, t) => c.post(`${_}/${e}/tags`, t),
1151
+ editSiteTag: async (e, t) => c.put(`${_}/${e}/tags`, t),
1152
+ fetchSiteTags: async (e) => c.fetch(`${_}/${e}/tags`),
1153
+ fetchUsersSiteTags: async () => c.fetch(`${qe}`),
1154
+ deleteSiteTag: async (e, t) => c.delete(`${_}/${e}/tags`, t),
1155
+ fetchWorkspaceTags: async (e) => c.fetch(`${qe}/keys?workspace_id=${e}`),
1156
+ createHydroShareArchive: async (e) => c.post(`${_}/${e.thingId}/archive`, e),
1157
+ updateHydroShareArchive: async (e, t) => c.patch(
1158
+ `${_}/${e.thingId}/archive`,
1159
+ e,
1160
+ t
1161
+ ),
1162
+ fetchHydroShareArchive: async (e) => c.fetch(`${_}/${e}/archive`),
1163
+ deleteHydroShareArchive: async (e) => c.delete(`${_}/${e}/archive`),
1164
+ archiveToHydroShare: async (e) => c.post(`${_}/${e}/archive/trigger`),
1165
+ createDatastream: async (e) => c.post(R, e),
1166
+ fetchDatastreams: async (e) => {
1167
+ const t = [];
1168
+ if (e)
1169
+ for (const [n, s] of Object.entries(e))
1170
+ t.push(`${encodeURIComponent(n)}=${encodeURIComponent(s)}`);
1171
+ const r = t.length ? `?${t.join("&")}` : "";
1172
+ return c.paginatedFetch(`${R}${r}`);
1173
+ },
1174
+ fetchDatastreamsForThing: async (e) => c.paginatedFetch(`${R}?thing_id=${e}`),
1175
+ fetchExpandedDatastreamsForThing: async (e) => c.paginatedFetch(
1176
+ `${R}?thing_id=${e}&expand_related=true`
1177
+ ),
1178
+ fetchDatastreamsForDataSource: async (e) => c.paginatedFetch(`${R}?data_source_id=${e}`),
1179
+ fetchDatastream: async (e) => c.fetch(`${R}/${e}`),
1180
+ fetchDatastreamExpanded: async (e) => c.fetch(`${R}/${e}?expand_related=true`),
1181
+ fetchUsersDatastreams: async () => c.paginatedFetch(`${R}?exclude_unowned=true`),
1182
+ updateDatastream: async (e, t = null) => c.patch(`${R}/${e.id}`, e, t),
1183
+ deleteDatastream: async (e) => c.delete(`${R}/${e}`),
1184
+ downloadDatastreamCSV: async (e) => c.fetch(`${R}/${e}/csv`),
1185
+ createObservedProperty: async (e) => c.post(Y, e),
1186
+ fetchObservedProperty: async (e) => c.fetch(`${Y}/${e}`),
1187
+ fetchObservedProperties: async () => c.paginatedFetch(`${Y}`),
1188
+ fetchWorkspaceObservedProperties: async (e) => c.paginatedFetch(`${Y}?workspace_id=${e}`),
1189
+ updateObservedProperty: async (e, t = null) => c.patch(`${Y}/${e.id}`, e, t),
1190
+ deleteObservedProperty: async (e) => c.delete(`${Y}/${e}`),
1191
+ createProcessingLevel: async (e) => c.post(V, e),
1192
+ fetchProcessingLevels: async () => c.paginatedFetch(`${V}`),
1193
+ fetchProcessingLevel: async (e) => c.fetch(`${V}/${e}`),
1194
+ fetchWorkspaceProcessingLevels: async (e) => c.paginatedFetch(`${V}?workspace_id=${e}`),
1195
+ updateProcessingLevel: async (e, t = null) => c.patch(`${V}/${e.id}`, e, t),
1196
+ deleteProcessingLevel: async (e) => c.delete(`${V}/${e}`),
1197
+ createSensor: async (e) => c.post(N, e),
1198
+ fetchSensors: async () => c.paginatedFetch(`${N}`),
1199
+ fetchSensor: async (e) => c.fetch(`${N}/${e}`),
1200
+ fetchWorkspaceSensors: async (e) => c.paginatedFetch(`${N}?workspace_id=${e}`),
1201
+ updateSensor: async (e, t = null) => c.patch(`${N}/${e.id}`, e, t),
1202
+ deleteSensor: async (e) => c.delete(`${N}/${e}`),
1203
+ createResultQualifier: async (e) => c.post(J, e),
1204
+ fetchResultQualifiers: async () => c.paginatedFetch(`${J}`),
1205
+ fetchWorkspaceResultQualifiers: async (e) => c.paginatedFetch(`${J}?workspace_id=${e}`),
1206
+ updateResultQualifier: async (e, t = null) => c.patch(
1207
+ `${J}/${e.id}`,
1208
+ e,
1209
+ t
1210
+ ),
1211
+ deleteResultQualifier: async (e) => c.delete(`${J}/${e}`),
1212
+ createOrchestrationSystem: async (e) => c.post(X, e),
1213
+ fetchOrchestrationSystems: async () => c.paginatedFetch(X),
1214
+ fetchWorkspaceOrchestrationSystems: async (e) => c.paginatedFetch(`${X}?workspace_id=${e}`),
1215
+ fetchOrchestrationSystem: async (e) => c.fetch(`${X}/${e}`),
1216
+ updateOrchestrationSystem: async (e, t) => c.patch(`${X}/${e}`, t),
1217
+ deleteOrchestrationSystem: async (e) => c.delete(`${X}/${e}`),
1218
+ createDataSource: async (e) => c.post(
1219
+ `${F}?expand_related=true`,
1220
+ Ve(e)
1221
+ ),
1222
+ fetchDataSources: async () => c.paginatedFetch(`${F}?expand_related=true`),
1223
+ fetchWorkspaceDataSources: async (e) => c.paginatedFetch(
1224
+ `${F}?workspace_id=${e}&expand_related=true`
1225
+ ),
1226
+ fetchDataSource: async (e) => c.fetch(`${F}/${e}?expand_related=true`),
1227
+ updateDataSource: async (e) => c.patch(
1228
+ `${F}/${e.id}?expand_related=true`,
1229
+ Ve(e)
1230
+ ),
1231
+ updateDataSourcePartial: async (e) => c.patch(
1232
+ `${F}/${e.id}?expand_related=true`,
1233
+ e
1234
+ ),
1235
+ deleteDataSource: async (e) => c.delete(`${F}/${e}`),
1236
+ linkDatastreamToDataSource: async (e, t) => c.post(
1237
+ `${F}/${e}/datastreams/${t}`
1238
+ ),
1239
+ unlinkDatastreamFromDataSource: async (e, t) => c.delete(
1240
+ `${F}/${e}/datastreams/${t}`
1241
+ ),
1242
+ fetchObservations: async (e) => c.fetch(e),
1243
+ deleteObservationsForDatastream: async (e) => c.post(`${R}/${e}/observations/bulk-delete`, {
1244
+ phenomenonTimeStart: null,
1245
+ phenomenonTimeEnd: null
1246
+ }),
1247
+ fetchUserTypes: async () => c.fetch(`${x}/user-types`),
1248
+ fetchOrganizationTypes: async () => c.fetch(`${x}/organization-types`),
1249
+ fetchSiteTypes: async () => c.fetch(`${_}/site-types`),
1250
+ fetchSamplingFeatureTypes: async () => c.paginatedFetch(`${_}/sampling-feature-types`),
1251
+ fetchSensorEncodingTypes: async () => c.paginatedFetch(`${N}/encoding-types`),
1252
+ fetchMethodTypes: async () => c.paginatedFetch(`${N}/method-types`),
1253
+ fetchVariableTypes: async () => c.paginatedFetch(`${Y}/variable-types`),
1254
+ fetchUnitTypes: async () => c.paginatedFetch(`${H}/types`),
1255
+ fetchDatastreamStatuses: async () => c.paginatedFetch(`${R}/statuses`),
1256
+ fetchDatastreamAggregations: async () => c.paginatedFetch(`${R}/aggregation-statistics`),
1257
+ fetchSampledMediums: async () => c.paginatedFetch(`${R}/sampled-mediums`)
10
1258
  };
11
- var y = /* @__PURE__ */ ((s) => (s.ADD = "ADD", s.SUB = "SUB", s.MULT = "MULT", s.DIV = "DIV", s.ASSIGN = "ASSIGN", s))(y || {}), G = /* @__PURE__ */ ((s) => (s.LT = "Less than", s.LTE = "Less than or equal to", s.GT = "Greater than", s.GTE = "Greater than or equal to", s.E = "Equal", s))(G || {});
12
- const U = {
13
- "Less than": (s, t) => s < t,
14
- "Less than or equal to": (s, t) => s <= t,
15
- "Greater than": (s, t) => s > t,
16
- "Greater than or equal to": (s, t) => s >= t,
17
- Equal: (s, t) => s == t
18
- }, I = `(function(){"use strict";self.onmessage=o=>{const{bufferX:s,bufferY:n,outputBufferX:u,outputBufferY:f,start:l,end:y,deleteSegment:a,startTarget:c}=o.data,A=new Float64Array(s),d=new Float32Array(n),g=new Float64Array(u),p=new Float32Array(f);let e=0,r=c;for(let t=l;t<=y;t++)e<a.length&&t===a[e]?e++:(g[r]=A[t],p[r]=d[t],r++);self.postMessage("Done")}})();
19
- `, b = typeof self < "u" && self.Blob && new Blob([I], { type: "text/javascript;charset=utf-8" });
20
- function M(s) {
1259
+ class ln {
1260
+ name = "";
1261
+ mappings = [];
1262
+ extractorVariables = {};
1263
+ constructor(t) {
1264
+ Object.assign(this, t);
1265
+ }
1266
+ }
1267
+ const kt = 1, ie = kt * 60, Ue = ie * 60, Oe = Ue * 24, dr = Oe * 7, pr = Ue * 30, yr = Oe * 365, te = {
1268
+ [D.SECOND]: kt,
1269
+ [D.MINUTE]: ie,
1270
+ [D.HOUR]: Ue,
1271
+ [D.DAY]: Oe,
1272
+ [D.WEEK]: dr,
1273
+ [D.MONTH]: pr,
1274
+ [D.YEAR]: yr
1275
+ }, un = (e) => e.toLocaleString(void 0, {
1276
+ year: "numeric",
1277
+ month: "short",
1278
+ day: "2-digit",
1279
+ hour: "2-digit",
1280
+ hour12: !1,
1281
+ minute: "2-digit",
1282
+ second: "2-digit"
1283
+ }), hn = (e) => {
1284
+ let t, r;
1285
+ e >= ie * 1e3 ? (t = e / (ie * 1e3), r = "m") : e >= 1e3 ? (t = e / 1e3, r = "s") : (t = e, r = "ms");
1286
+ let n;
1287
+ return r === "ms" ? n = Math.round(t).toString() : n = t.toFixed(2), `${n} ${r}`;
1288
+ }, we = async (e, t) => {
1289
+ t && console.info(t);
1290
+ const r = performance.now(), n = await e(), s = performance.now();
1291
+ console.info(` Done in ${(s - r).toFixed(2)} ms`);
1292
+ const a = +(s - r);
1293
+ return { response: n, duration: a };
1294
+ };
1295
+ function fn(e, t) {
1296
+ const r = new Date(e);
1297
+ return r.setHours(r.getHours() - t), r.toISOString();
1298
+ }
1299
+ const re = (e, t) => {
1300
+ let r = 0, n = e.length;
1301
+ for (; r < n; ) {
1302
+ const s = r + n >> 1;
1303
+ e[s] < t ? r = s + 1 : n = s;
1304
+ }
1305
+ return r;
1306
+ }, be = (e, t) => {
1307
+ let r = 0, n = e.length;
1308
+ for (; r < n; ) {
1309
+ const s = r + n >> 1;
1310
+ e[s] > t ? n = s : r = s + 1;
1311
+ }
1312
+ return r - 1;
1313
+ }, vt = `(function(){"use strict";function c(n,s,a,u,f,l,y,o){let r=0,e=o;for(let t=l;t<=y;t++)r<a.length&&t===a[r]?r++:(u[e]=n[t],f[e]=s[t],e++);return e-o}self.onmessage=n=>{const{bufferX:s,bufferY:a,outputBufferX:u,outputBufferY:f,start:l,end:y,deleteSegment:o,startTarget:r}=n.data,e=new Float64Array(s),t=new Float32Array(a),A=new Float64Array(u),g=new Float32Array(f);c(e,t,o,A,g,l,y,r),self.postMessage("Done")}})();
1314
+ `, Je = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", vt], { type: "text/javascript;charset=utf-8" });
1315
+ function gr(e) {
1316
+ let t;
1317
+ try {
1318
+ if (t = Je && (self.URL || self.webkitURL).createObjectURL(Je), !t) throw "";
1319
+ const r = new Worker(t, {
1320
+ name: e?.name
1321
+ });
1322
+ return r.addEventListener("error", () => {
1323
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1324
+ }), r;
1325
+ } catch {
1326
+ return new Worker(
1327
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(vt),
1328
+ {
1329
+ name: e?.name
1330
+ }
1331
+ );
1332
+ }
1333
+ }
1334
+ const _t = `(function(){"use strict";function F(n,l,a,o,s,y,g,f,i,w,A){let e=0,t=f;for(let r=y;r<=g;r++)if(o[t]=n[r],s[t]=l[r],t++,e<a.length&&r===a[e][0]){const u=a[e][0],c=a[e][1],d=n[u],h=n[c],m=l[u],D=l[c],x=h-d,P=D-m;let p=d+i;for(;p<h;)o[t]=p,s[t]=w?m+(p-d)*P/x:A,t++,p+=i;e++}return t-f}self.onmessage=n=>{const{bufferX:l,bufferY:a,outputBufferX:o,outputBufferY:s,start:y,end:g,gapsSegment:f,startTarget:i,fillDelta:w,interpolate:A,fillValue:e}=n.data,t=new Float64Array(l),r=new Float32Array(a),u=new Float64Array(o),c=new Float32Array(s);F(t,r,f,u,c,y,g,i,w,A,e),self.postMessage("Done")}})();
1335
+ `, Ke = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", _t], { type: "text/javascript;charset=utf-8" });
1336
+ function mr(e) {
1337
+ let t;
1338
+ try {
1339
+ if (t = Ke && (self.URL || self.webkitURL).createObjectURL(Ke), !t) throw "";
1340
+ const r = new Worker(t, {
1341
+ name: e?.name
1342
+ });
1343
+ return r.addEventListener("error", () => {
1344
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1345
+ }), r;
1346
+ } catch {
1347
+ return new Worker(
1348
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(_t),
1349
+ {
1350
+ name: e?.name
1351
+ }
1352
+ );
1353
+ }
1354
+ }
1355
+ const At = `(function(){"use strict";function g(o,n,c){for(let s=0;s<c.length;s++){const{indexes:t,lowerIdx:l,upperIdx:r}=c[s],i=o[l],f=n[l],a=o[r],d=n[r],p=a-i,w=d-f;if(p===0){for(let e=0;e<t.length;e++)n[t[e]]=f;continue}for(let e=0;e<t.length;e++){const u=t[e];n[u]=f+(o[u]-i)*w/p}}}self.onmessage=o=>{const{bufferX:n,bufferY:c,groups:s}=o.data,t=new Float64Array(n),l=new Float32Array(c);g(t,l,s),self.postMessage("Done")}})();
1356
+ `, Qe = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", At], { type: "text/javascript;charset=utf-8" });
1357
+ function wr(e) {
1358
+ let t;
1359
+ try {
1360
+ if (t = Qe && (self.URL || self.webkitURL).createObjectURL(Qe), !t) throw "";
1361
+ const r = new Worker(t, {
1362
+ name: e?.name
1363
+ });
1364
+ return r.addEventListener("error", () => {
1365
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1366
+ }), r;
1367
+ } catch {
1368
+ return new Worker(
1369
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(At),
1370
+ {
1371
+ name: e?.name
1372
+ }
1373
+ );
1374
+ }
1375
+ }
1376
+ const Lt = `(function(){"use strict";self.onmessage=r=>{const{bufferX:s,bufferY:o,jobs:a}=r.data,f=new Float64Array(s),n=new Float32Array(o);for(let e=0;e<a.length;e++){const{chunkStart:c,chunkEnd:l,startDatetime:u,value:i,extent:y}=a[e];for(let t=c;t<l;t++)n[t]=n[t]+i*((f[t]-u)/y)}self.postMessage("Done")}})();
1377
+ `, Ze = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Lt], { type: "text/javascript;charset=utf-8" });
1378
+ function br(e) {
1379
+ let t;
1380
+ try {
1381
+ if (t = Ze && (self.URL || self.webkitURL).createObjectURL(Ze), !t) throw "";
1382
+ const r = new Worker(t, {
1383
+ name: e?.name
1384
+ });
1385
+ return r.addEventListener("error", () => {
1386
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1387
+ }), r;
1388
+ } catch {
1389
+ return new Worker(
1390
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(Lt),
1391
+ {
1392
+ name: e?.name
1393
+ }
1394
+ );
1395
+ }
1396
+ }
1397
+ const Tt = `(function(){"use strict";function u(f,o,a,n,l,c,s,i){let r=c,e=0,t=i;const w=a.length;for(;r<s&&e<w;){const y=a[e][0];f[r]<=y?(n[t]=f[r],l[t]=o[r],r++):(n[t]=y,l[t]=a[e][1],e++),t++}for(;r<s;)n[t]=f[r],l[t]=o[r],r++,t++;for(;e<w;)n[t]=a[e][0],l[t]=a[e][1],e++,t++;return t-i}self.onmessage=f=>{const{bufferX:o,bufferY:a,outputBufferX:n,outputBufferY:l,origStart:c,origEnd:s,insertions:i,outStart:r}=f.data,e=new Float64Array(o),t=new Float32Array(a),w=new Float64Array(n),y=new Float32Array(l);u(e,t,i,w,y,c,s,r),self.postMessage("Done")}})();
1398
+ `, et = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Tt], { type: "text/javascript;charset=utf-8" });
1399
+ function Sr(e) {
1400
+ let t;
1401
+ try {
1402
+ if (t = et && (self.URL || self.webkitURL).createObjectURL(et), !t) throw "";
1403
+ const r = new Worker(t, {
1404
+ name: e?.name
1405
+ });
1406
+ return r.addEventListener("error", () => {
1407
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1408
+ }), r;
1409
+ } catch {
1410
+ return new Worker(
1411
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(Tt),
1412
+ {
1413
+ name: e?.name
1414
+ }
1415
+ );
1416
+ }
1417
+ }
1418
+ const $t = `(function(){"use strict";self.onmessage=i=>{const{bufferX:c,bufferY:g,outputBufferX:d,outputBufferY:y,indexes:n,outStart:r,amount:f,isMonth:Y,isYear:h,deltaMs:w}=i.data,s=new Float64Array(c),a=new Float32Array(g),l=new Float64Array(d),u=new Float32Array(y);if(Y)for(let t=0;t<n.length;t++){const e=n[t],o=new Date(s[e]);o.setMonth(o.getMonth()+f),l[r+t]=o.getTime(),u[r+t]=a[e]}else if(h)for(let t=0;t<n.length;t++){const e=n[t],o=new Date(s[e]);o.setFullYear(o.getFullYear()+f),l[r+t]=o.getTime(),u[r+t]=a[e]}else for(let t=0;t<n.length;t++){const e=n[t];l[r+t]=s[e]+w,u[r+t]=a[e]}self.postMessage("Done")}})();
1419
+ `, tt = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", $t], { type: "text/javascript;charset=utf-8" });
1420
+ function Er(e) {
1421
+ let t;
1422
+ try {
1423
+ if (t = tt && (self.URL || self.webkitURL).createObjectURL(tt), !t) throw "";
1424
+ const r = new Worker(t, {
1425
+ name: e?.name
1426
+ });
1427
+ return r.addEventListener("error", () => {
1428
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1429
+ }), r;
1430
+ } catch {
1431
+ return new Worker(
1432
+ "data:text/javascript;charset=utf-8," + encodeURIComponent($t),
1433
+ {
1434
+ name: e?.name
1435
+ }
1436
+ );
1437
+ }
1438
+ }
1439
+ const Rt = `(function(){"use strict";function a(e,t,o,c){const n=[];let r=e[t];for(let s=t+1;s<=o;s++){const f=e[s];f-r>c&&n.push(s-1,s),r=f}return n}self.onmessage=e=>{const{bufferX:t,start:o,endInclusive:c,threshold:n}=e.data,r=new Float64Array(t);self.postMessage(a(r,o,c,n))}})();
1440
+ `, rt = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Rt], { type: "text/javascript;charset=utf-8" });
1441
+ function kr(e) {
1442
+ let t;
1443
+ try {
1444
+ if (t = rt && (self.URL || self.webkitURL).createObjectURL(rt), !t) throw "";
1445
+ const r = new Worker(t, {
1446
+ name: e?.name
1447
+ });
1448
+ return r.addEventListener("error", () => {
1449
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1450
+ }), r;
1451
+ } catch {
1452
+ return new Worker(
1453
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(Rt),
1454
+ {
1455
+ name: e?.name
1456
+ }
1457
+ );
1458
+ }
1459
+ }
1460
+ const It = `(function(){"use strict";function c(u,s,t){const n=[];if(s>=t)return n;let e=s,o=u[s];for(let r=s+1;r<t;r++){const f=u[r];f!==o&&(n.push(e,r-e,o),e=r,o=f)}return n.push(e,t-e,o),n}self.onmessage=u=>{const{bufferY:s,start:t,end:n}=u.data,e=new Float32Array(s);self.postMessage(c(e,t,n))}})();
1461
+ `, nt = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", It], { type: "text/javascript;charset=utf-8" });
1462
+ function vr(e) {
1463
+ let t;
1464
+ try {
1465
+ if (t = nt && (self.URL || self.webkitURL).createObjectURL(nt), !t) throw "";
1466
+ const r = new Worker(t, {
1467
+ name: e?.name
1468
+ });
1469
+ return r.addEventListener("error", () => {
1470
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1471
+ }), r;
1472
+ } catch {
1473
+ return new Worker(
1474
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(It),
1475
+ {
1476
+ name: e?.name
1477
+ }
1478
+ );
1479
+ }
1480
+ }
1481
+ const Mt = `(function(){"use strict";function o(s,i,t,n,l){const f=[];if(n==="Less than")for(let e=i;e<t;e++)s[e]-s[e-1]<l&&f.push(e);else if(n==="Less than or equal to")for(let e=i;e<t;e++)s[e]-s[e-1]<=l&&f.push(e);else if(n==="Greater than")for(let e=i;e<t;e++)s[e]-s[e-1]>l&&f.push(e);else if(n==="Greater than or equal to")for(let e=i;e<t;e++)s[e]-s[e-1]>=l&&f.push(e);else if(n==="Equal")for(let e=i;e<t;e++)s[e]-s[e-1]==l&&f.push(e);return f}self.onmessage=s=>{const{bufferY:i,start:t,end:n,comparator:l,value:f}=s.data,e=new Float32Array(i);self.postMessage(o(e,t,n,l,f))}})();
1482
+ `, st = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Mt], { type: "text/javascript;charset=utf-8" });
1483
+ function _r(e) {
1484
+ let t;
1485
+ try {
1486
+ if (t = st && (self.URL || self.webkitURL).createObjectURL(st), !t) throw "";
1487
+ const r = new Worker(t, {
1488
+ name: e?.name
1489
+ });
1490
+ return r.addEventListener("error", () => {
1491
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1492
+ }), r;
1493
+ } catch {
1494
+ return new Worker(
1495
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(Mt),
1496
+ {
1497
+ name: e?.name
1498
+ }
1499
+ );
1500
+ }
1501
+ }
1502
+ const Ut = `(function(){"use strict";function l(t,i,n,o,h){const f=[];if(o==="Less than")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)<h&&f.push(e)}else if(o==="Less than or equal to")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)<=h&&f.push(e)}else if(o==="Greater than")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)>h&&f.push(e)}else if(o==="Greater than or equal to")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)>=h&&f.push(e)}else if(o==="Equal")for(let e=i;e<n;e++){const s=t[e-1];(t[e]-s)/Math.abs(s)==h&&f.push(e)}return f}self.onmessage=t=>{const{bufferY:i,start:n,end:o,comparator:h,value:f}=t.data,e=new Float32Array(i);self.postMessage(l(e,n,o,h,f))}})();
1503
+ `, ot = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Ut], { type: "text/javascript;charset=utf-8" });
1504
+ function Ar(e) {
21
1505
  let t;
22
1506
  try {
23
- if (t = b && (self.URL || self.webkitURL).createObjectURL(b), !t) throw "";
24
- const a = new Worker(t, {
25
- name: s?.name
1507
+ if (t = ot && (self.URL || self.webkitURL).createObjectURL(ot), !t) throw "";
1508
+ const r = new Worker(t, {
1509
+ name: e?.name
26
1510
  });
27
- return a.addEventListener("error", () => {
1511
+ return r.addEventListener("error", () => {
28
1512
  (self.URL || self.webkitURL).revokeObjectURL(t);
29
- }), a;
1513
+ }), r;
30
1514
  } catch {
31
1515
  return new Worker(
32
- "data:text/javascript;charset=utf-8," + encodeURIComponent(I),
1516
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(Ut),
33
1517
  {
34
- name: s?.name
1518
+ name: e?.name
35
1519
  }
36
1520
  );
37
- } finally {
38
- t && (self.URL || self.webkitURL).revokeObjectURL(t);
39
1521
  }
40
1522
  }
41
- const N = `(function(){"use strict";self.onmessage=function(e){const{bufferX:f,bufferY:t,outputBufferX:u,outputBufferY:s}=e.data;self.postMessage("Done")}})();
42
- `, R = typeof self < "u" && self.Blob && new Blob([N], { type: "text/javascript;charset=utf-8" });
43
- function C(s) {
1523
+ const Ot = `(function(){"use strict";function k(i,l,u,r,c){const f=[],b=r.length;for(let a=l;a<u;a++){const t=i[a];let e=!1;for(let n=0;n<b;n++){const o=r[n],s=c[n];if(o===0){if(t<s){e=!0;break}}else if(o===1){if(t<=s){e=!0;break}}else if(o===2){if(t>s){e=!0;break}}else if(o===3){if(t>=s){e=!0;break}}else if(t==s){e=!0;break}}e&&f.push(a)}return f}self.onmessage=i=>{const{bufferY:l,start:u,end:r,ops:c,values:f}=i.data,b=new Float32Array(l);self.postMessage(k(b,u,r,c,f))}})();
1524
+ `, at = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", Ot], { type: "text/javascript;charset=utf-8" });
1525
+ function $e(e) {
44
1526
  let t;
45
1527
  try {
46
- if (t = R && (self.URL || self.webkitURL).createObjectURL(R), !t) throw "";
47
- const a = new Worker(t, {
48
- name: s?.name
1528
+ if (t = at && (self.URL || self.webkitURL).createObjectURL(at), !t) throw "";
1529
+ const r = new Worker(t, {
1530
+ name: e?.name
49
1531
  });
50
- return a.addEventListener("error", () => {
1532
+ return r.addEventListener("error", () => {
51
1533
  (self.URL || self.webkitURL).revokeObjectURL(t);
52
- }), a;
1534
+ }), r;
53
1535
  } catch {
54
1536
  return new Worker(
55
- "data:text/javascript;charset=utf-8," + encodeURIComponent(N),
1537
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(Ot),
56
1538
  {
57
- name: s?.name
1539
+ name: e?.name
58
1540
  }
59
1541
  );
60
- } finally {
61
- t && (self.URL || self.webkitURL).revokeObjectURL(t);
62
1542
  }
63
1543
  }
64
- const k = (s, t) => {
65
- let a = 0, e = s.length;
66
- for (; a < e; ) {
67
- const n = a + e >> 1;
68
- s[n] < t ? a = n + 1 : e = n;
1544
+ const xt = `(function(){"use strict";function e(l,t,o,s){const c=t.length;if(o==="ADD")for(let f=0;f<c;f++)l[t[f]]=l[t[f]]+s;else if(o==="SUB")for(let f=0;f<c;f++)l[t[f]]=l[t[f]]-s;else if(o==="MULT")for(let f=0;f<c;f++)l[t[f]]=l[t[f]]*s;else if(o==="DIV")for(let f=0;f<c;f++)l[t[f]]=l[t[f]]/s;else if(o==="ASSIGN")for(let f=0;f<c;f++)l[t[f]]=s}self.onmessage=l=>{const{bufferY:t,indexes:o,operator:s,value:c}=l.data,f=new Float32Array(t);e(f,o,s,c),self.postMessage("Done")}})();
1545
+ `, it = typeof self < "u" && self.Blob && new Blob(["(self.URL || self.webkitURL).revokeObjectURL(self.location.href);", xt], { type: "text/javascript;charset=utf-8" });
1546
+ function Lr(e) {
1547
+ let t;
1548
+ try {
1549
+ if (t = it && (self.URL || self.webkitURL).createObjectURL(it), !t) throw "";
1550
+ const r = new Worker(t, {
1551
+ name: e?.name
1552
+ });
1553
+ return r.addEventListener("error", () => {
1554
+ (self.URL || self.webkitURL).revokeObjectURL(t);
1555
+ }), r;
1556
+ } catch {
1557
+ return new Worker(
1558
+ "data:text/javascript;charset=utf-8," + encodeURIComponent(xt),
1559
+ {
1560
+ name: e?.name
1561
+ }
1562
+ );
1563
+ }
1564
+ }
1565
+ function Dt(e, t, r, n, s) {
1566
+ const a = [], o = n.length;
1567
+ for (let i = t; i < r; i++) {
1568
+ const l = e[i];
1569
+ let f = !1;
1570
+ for (let u = 0; u < o; u++) {
1571
+ const p = n[u], g = s[u];
1572
+ if (p === 0) {
1573
+ if (l < g) {
1574
+ f = !0;
1575
+ break;
1576
+ }
1577
+ } else if (p === 1) {
1578
+ if (l <= g) {
1579
+ f = !0;
1580
+ break;
1581
+ }
1582
+ } else if (p === 2) {
1583
+ if (l > g) {
1584
+ f = !0;
1585
+ break;
1586
+ }
1587
+ } else if (p === 3) {
1588
+ if (l >= g) {
1589
+ f = !0;
1590
+ break;
1591
+ }
1592
+ } else if (l == g) {
1593
+ f = !0;
1594
+ break;
1595
+ }
1596
+ }
1597
+ f && a.push(i);
1598
+ }
1599
+ return a;
1600
+ }
1601
+ function Tr(e, t, r, n, s) {
1602
+ const a = [];
1603
+ if (n === "Less than")
1604
+ for (let o = t; o < r; o++)
1605
+ e[o] - e[o - 1] < s && a.push(o);
1606
+ else if (n === "Less than or equal to")
1607
+ for (let o = t; o < r; o++)
1608
+ e[o] - e[o - 1] <= s && a.push(o);
1609
+ else if (n === "Greater than")
1610
+ for (let o = t; o < r; o++)
1611
+ e[o] - e[o - 1] > s && a.push(o);
1612
+ else if (n === "Greater than or equal to")
1613
+ for (let o = t; o < r; o++)
1614
+ e[o] - e[o - 1] >= s && a.push(o);
1615
+ else if (n === "Equal")
1616
+ for (let o = t; o < r; o++)
1617
+ e[o] - e[o - 1] == s && a.push(o);
1618
+ return a;
1619
+ }
1620
+ function $r(e, t, r, n, s) {
1621
+ const a = [];
1622
+ if (n === "Less than")
1623
+ for (let o = t; o < r; o++) {
1624
+ const i = e[o - 1];
1625
+ (e[o] - i) / Math.abs(i) < s && a.push(o);
1626
+ }
1627
+ else if (n === "Less than or equal to")
1628
+ for (let o = t; o < r; o++) {
1629
+ const i = e[o - 1];
1630
+ (e[o] - i) / Math.abs(i) <= s && a.push(o);
1631
+ }
1632
+ else if (n === "Greater than")
1633
+ for (let o = t; o < r; o++) {
1634
+ const i = e[o - 1];
1635
+ (e[o] - i) / Math.abs(i) > s && a.push(o);
1636
+ }
1637
+ else if (n === "Greater than or equal to")
1638
+ for (let o = t; o < r; o++) {
1639
+ const i = e[o - 1];
1640
+ (e[o] - i) / Math.abs(i) >= s && a.push(o);
1641
+ }
1642
+ else if (n === "Equal")
1643
+ for (let o = t; o < r; o++) {
1644
+ const i = e[o - 1];
1645
+ (e[o] - i) / Math.abs(i) == s && a.push(o);
1646
+ }
1647
+ return a;
1648
+ }
1649
+ function Rr(e, t, r, n) {
1650
+ const s = [];
1651
+ let a = e[t];
1652
+ for (let o = t + 1; o <= r; o++) {
1653
+ const i = e[o];
1654
+ i - a > n && s.push(o - 1, o), a = i;
1655
+ }
1656
+ return s;
1657
+ }
1658
+ function Ir(e, t, r) {
1659
+ const n = [];
1660
+ if (t >= r) return n;
1661
+ let s = t, a = e[t];
1662
+ for (let o = t + 1; o < r; o++) {
1663
+ const i = e[o];
1664
+ i !== a && (n.push(s, o - s, a), s = o, a = i);
1665
+ }
1666
+ return n.push(s, r - s, a), n;
1667
+ }
1668
+ function Mr(e, t, r, n, s, a, o, i, l, f, u) {
1669
+ let p = 0, g = i;
1670
+ for (let y = a; y <= o; y++)
1671
+ if (n[g] = e[y], s[g] = t[y], g++, p < r.length && y === r[p][0]) {
1672
+ const d = r[p][0], h = r[p][1], b = e[d], w = e[h], m = t[d], S = t[h], A = w - b, L = S - m;
1673
+ let T = b + l;
1674
+ for (; T < w; )
1675
+ n[g] = T, s[g] = f ? m + (T - b) * L / A : u, g++, T += l;
1676
+ p++;
1677
+ }
1678
+ return g - i;
1679
+ }
1680
+ function Ur(e, t, r, n, s, a, o, i) {
1681
+ let l = a, f = 0, u = i;
1682
+ const p = r.length;
1683
+ for (; l < o && f < p; ) {
1684
+ const g = r[f][0];
1685
+ e[l] <= g ? (n[u] = e[l], s[u] = t[l], l++) : (n[u] = g, s[u] = r[f][1], f++), u++;
69
1686
  }
1687
+ for (; l < o; )
1688
+ n[u] = e[l], s[u] = t[l], l++, u++;
1689
+ for (; f < p; )
1690
+ n[u] = r[f][0], s[u] = r[f][1], f++, u++;
1691
+ return u - i;
1692
+ }
1693
+ function Or(e, t, r, n, s, a, o, i) {
1694
+ let l = 0, f = i;
1695
+ for (let u = a; u <= o; u++)
1696
+ l < r.length && u === r[l] ? l++ : (n[f] = e[u], s[f] = t[u], f++);
1697
+ return f - i;
1698
+ }
1699
+ function xr(e, t, r, n) {
1700
+ const s = r.length, a = new Array(s);
1701
+ if (n.isMonth)
1702
+ for (let o = 0; o < s; o++) {
1703
+ const i = r[o], l = new Date(e[i]);
1704
+ l.setMonth(l.getMonth() + n.amount), a[o] = [l.getTime(), t[i]];
1705
+ }
1706
+ else if (n.isYear)
1707
+ for (let o = 0; o < s; o++) {
1708
+ const i = r[o], l = new Date(e[i]);
1709
+ l.setFullYear(l.getFullYear() + n.amount), a[o] = [l.getTime(), t[i]];
1710
+ }
1711
+ else
1712
+ for (let o = 0; o < s; o++) {
1713
+ const i = r[o];
1714
+ a[o] = [e[i] + n.deltaMs, t[i]];
1715
+ }
70
1716
  return a;
71
- }, B = (s, t) => {
72
- let a = 0, e = s.length;
73
- for (; a < e; ) {
74
- const n = a + e >> 1;
75
- s[n] > t ? e = n : a = n + 1;
76
- }
77
- return a - 1;
78
- }, p = async (s, t) => {
79
- const a = performance.now(), e = await s(), n = performance.now();
80
- console.log(` Done in ${(n - a).toFixed(2)} ms`);
81
- const r = +(n - a);
82
- return { response: e, duration: r };
83
- }, Y = 1, F = Y * 60, S = F * 60, D = S * 24, v = D * 7, H = S * 30, O = D * 365, A = {
84
- s: Y,
85
- m: F,
86
- h: S,
87
- D,
88
- W: v,
89
- M: H,
90
- Y: O
91
- }, V = (s, t, a) => {
92
- if (a === "M") {
93
- const e = new Date(s);
94
- return e.setMonth(e.getMonth() + t), e.getTime();
95
- } else if (a === "Y") {
96
- const e = new Date(s);
97
- return e.setFullYear(e.getFullYear() + t), e.getTime();
98
- } else
99
- return s + t * A[a] * 1e3;
100
- }, L = 20 * 1e3, j = ["date", "value", "qualifier"];
101
- class q {
1717
+ }
1718
+ function Dr(e, t, r) {
1719
+ for (let n = 0; n < r.length; n++) {
1720
+ const { indexes: s, lowerIdx: a, upperIdx: o } = r[n], i = e[a], l = t[a], f = e[o], u = t[o], p = f - i, g = u - l;
1721
+ if (p === 0) {
1722
+ for (let y = 0; y < s.length; y++) t[s[y]] = l;
1723
+ continue;
1724
+ }
1725
+ for (let y = 0; y < s.length; y++) {
1726
+ const d = s[y];
1727
+ t[d] = l + (e[d] - i) * g / p;
1728
+ }
1729
+ }
1730
+ }
1731
+ function Cr(e, t, r) {
1732
+ for (let n = 0; n < r.length; n++) {
1733
+ const s = r[n][0], a = r[n][1], o = r[n][2];
1734
+ if (a <= s) continue;
1735
+ const i = e[s], l = e[a] - i;
1736
+ if (l !== 0)
1737
+ for (let f = s; f < a; f++)
1738
+ t[f] = t[f] + o * ((e[f] - i) / l);
1739
+ }
1740
+ }
1741
+ function ct(e, t, r, n) {
1742
+ const s = t.length;
1743
+ if (r === "ADD")
1744
+ for (let a = 0; a < s; a++) e[t[a]] = e[t[a]] + n;
1745
+ else if (r === "SUB")
1746
+ for (let a = 0; a < s; a++) e[t[a]] = e[t[a]] - n;
1747
+ else if (r === "MULT")
1748
+ for (let a = 0; a < s; a++) e[t[a]] = e[t[a]] * n;
1749
+ else if (r === "DIV")
1750
+ for (let a = 0; a < s; a++) e[t[a]] = e[t[a]] / n;
1751
+ else if (r === "ASSIGN")
1752
+ for (let a = 0; a < s; a++) e[t[a]] = n;
1753
+ }
1754
+ const Fr = 1, xe = `qc-utils:calibration:v${Fr}`, Pr = 720 * 60 * 60 * 1e3, ne = 5e4, se = 2e5, ce = {
1755
+ spawnOverheadMs: 50,
1756
+ // worst-case Windows
1757
+ inlineThroughput: 5e4,
1758
+ // 50M elements/sec, conservative
1759
+ workerThroughput: 8e4,
1760
+ // workers slightly faster in-loop once spawned
1761
+ hwConcurrency: 4,
1762
+ measuredAt: 0,
1763
+ userAgent: "default"
1764
+ };
1765
+ let M = jr() ?? ce, De = null, K = null;
1766
+ const Re = /* @__PURE__ */ new Set(), Ie = {
1767
+ // Filter ops — read-only scans, cheap kernels
1768
+ [v.VALUE_THRESHOLD]: {
1769
+ mode: "calibrated",
1770
+ weight: 1,
1771
+ rationale: "O(n) single-pass scan; baseline reference"
1772
+ },
1773
+ [v.CHANGE]: {
1774
+ mode: "calibrated",
1775
+ weight: 1.1,
1776
+ rationale: "O(n) with one subtraction per step"
1777
+ },
1778
+ [v.RATE_OF_CHANGE]: {
1779
+ mode: "calibrated",
1780
+ weight: 1.4,
1781
+ rationale: "O(n) with division + abs per step"
1782
+ },
1783
+ [v.FIND_GAPS]: {
1784
+ mode: "calibrated",
1785
+ weight: 0.9,
1786
+ rationale: "O(n) on X only, mostly empty output"
1787
+ },
1788
+ [v.PERSISTENCE]: {
1789
+ mode: "calibrated",
1790
+ weight: 1.3,
1791
+ rationale: "O(n) + chunk-boundary stitch"
1792
+ },
1793
+ [v.DATETIME_RANGE]: {
1794
+ mode: "always-inline",
1795
+ weight: 0,
1796
+ rationale: "O(log n) binary search; never worth the worker hop"
1797
+ },
1798
+ [v.SELECTION]: {
1799
+ mode: "always-inline",
1800
+ weight: 0,
1801
+ rationale: "Pure history bookkeeping"
1802
+ },
1803
+ // Edit ops — mutate Y in place or rebuild arrays
1804
+ [E.CHANGE_VALUES]: {
1805
+ mode: "calibrated",
1806
+ weight: 0.7,
1807
+ rationale: "O(k) in-place arithmetic on selection"
1808
+ },
1809
+ [E.ASSIGN_VALUES_BULK]: {
1810
+ mode: "always-inline",
1811
+ weight: 0,
1812
+ rationale: "Single tight loop, already inline"
1813
+ },
1814
+ [E.ASSIGN_DATETIMES_BULK]: {
1815
+ mode: "always-inline",
1816
+ weight: 0,
1817
+ rationale: "Composes delete+add which handle their own dispatch"
1818
+ },
1819
+ [E.INTERPOLATE]: {
1820
+ mode: "calibrated",
1821
+ weight: 1.5,
1822
+ rationale: "Linear interp per consecutive group; in-place writes"
1823
+ },
1824
+ [E.DRIFT_CORRECTION]: {
1825
+ mode: "calibrated",
1826
+ weight: 1.2,
1827
+ rationale: "O(range total) in-place math; one pass per range"
1828
+ },
1829
+ [E.SHIFT_DATETIMES]: {
1830
+ mode: "calibrated",
1831
+ weight: 1.1,
1832
+ rationale: "O(k) per-point shift math; inline skips SAB allocation"
1833
+ },
1834
+ [E.ADD_POINTS]: {
1835
+ mode: "calibrated",
1836
+ weight: 1.8,
1837
+ rationale: "Single merge pass over Y/X + insertions; fresh SAB per call"
1838
+ },
1839
+ [E.DELETE_POINTS]: {
1840
+ mode: "calibrated",
1841
+ weight: 1.4,
1842
+ rationale: "Single skip-on-delete pass over Y/X; fresh SAB per call"
1843
+ },
1844
+ [E.FILL_GAPS]: {
1845
+ mode: "calibrated",
1846
+ weight: 1.3,
1847
+ rationale: "Single copy-with-fills pass; fresh SAB sized to newLength"
1848
+ }
1849
+ };
1850
+ function U(e, t) {
1851
+ const r = Ie[e];
1852
+ if (!r)
1853
+ return {
1854
+ useWorker: !0,
1855
+ predictedInlineMs: 1 / 0,
1856
+ predictedWorkerMs: 0,
1857
+ reason: "unknown op; keeping default worker path"
1858
+ };
1859
+ if (r.mode === "always-inline")
1860
+ return {
1861
+ useWorker: !1,
1862
+ predictedInlineMs: 0,
1863
+ predictedWorkerMs: 0,
1864
+ reason: r.rationale
1865
+ };
1866
+ if (typeof SharedArrayBuffer > "u")
1867
+ return {
1868
+ useWorker: !1,
1869
+ predictedInlineMs: 0,
1870
+ predictedWorkerMs: 1 / 0,
1871
+ reason: "SharedArrayBuffer unavailable; forced inline"
1872
+ };
1873
+ if (r.mode === "always-worker")
1874
+ return {
1875
+ useWorker: !0,
1876
+ predictedInlineMs: 1 / 0,
1877
+ predictedWorkerMs: 0,
1878
+ reason: r.rationale
1879
+ };
1880
+ const n = Br(e, t);
1881
+ if (n <= 0)
1882
+ return {
1883
+ useWorker: !1,
1884
+ predictedInlineMs: 0,
1885
+ predictedWorkerMs: M.spawnOverheadMs,
1886
+ reason: "zero work units"
1887
+ };
1888
+ const s = Math.max(
1889
+ 1,
1890
+ Math.min(
1891
+ t.parallelism ?? M.hwConcurrency,
1892
+ M.hwConcurrency
1893
+ )
1894
+ ), a = r.weight * n / M.inlineThroughput, o = M.spawnOverheadMs + r.weight * n / (M.workerThroughput * s), i = a > o;
1895
+ return {
1896
+ useWorker: i,
1897
+ predictedInlineMs: a,
1898
+ predictedWorkerMs: o,
1899
+ reason: i ? `worker faster (${o.toFixed(1)} vs ${a.toFixed(1)} ms)` : `inline faster (${a.toFixed(1)} vs ${o.toFixed(1)} ms)`
1900
+ };
1901
+ }
1902
+ function Br(e, t) {
1903
+ switch (e) {
1904
+ case E.CHANGE_VALUES:
1905
+ case E.INTERPOLATE:
1906
+ case E.SHIFT_DATETIMES:
1907
+ case E.DRIFT_CORRECTION:
1908
+ return t.selectionSize ?? 0;
1909
+ case E.DELETE_POINTS:
1910
+ return (t.selectionSize ?? 0) + t.datasetSize * 0.25;
1911
+ case E.ADD_POINTS: {
1912
+ const r = Math.max(1, Math.log2(Math.max(t.datasetSize, 2)));
1913
+ return t.datasetSize + (t.selectionSize ?? 0) * r;
1914
+ }
1915
+ default:
1916
+ return t.datasetSize;
1917
+ }
1918
+ }
1919
+ function dn(e) {
1920
+ return Re.add(e), () => Re.delete(e);
1921
+ }
1922
+ function pn() {
1923
+ return M;
1924
+ }
1925
+ function yn() {
1926
+ return De;
1927
+ }
1928
+ function gn() {
1929
+ return Object.keys(Ie).map((e) => ({ op: e, ...Ie[e] }));
1930
+ }
1931
+ function mn() {
1932
+ M = ce, De = null;
1933
+ try {
1934
+ localStorage.removeItem(xe);
1935
+ } catch {
1936
+ }
1937
+ }
1938
+ async function wn(e = {}) {
1939
+ if (typeof window > "u" || !(e.force || M.measuredAt === 0 || Date.now() - M.measuredAt > Pr)) return M;
1940
+ if (K) await K;
1941
+ else {
1942
+ K = Nr().finally(() => {
1943
+ K = null;
1944
+ });
1945
+ const r = await K;
1946
+ M = r, Wr(r), De = r;
1947
+ for (const n of Re) n(M);
1948
+ }
1949
+ return M;
1950
+ }
1951
+ async function Nr() {
1952
+ if (!(typeof SharedArrayBuffer < "u"))
1953
+ return {
1954
+ ...ce,
1955
+ measuredAt: Date.now(),
1956
+ userAgent: navigator.userAgent,
1957
+ hwConcurrency: navigator.hardwareConcurrency || ce.hwConcurrency,
1958
+ sharedArrayBufferAvailable: !1,
1959
+ samples: { spawnRoundtripMs: [], inlineScanMs: [], workerScanMs: [] }
1960
+ };
1961
+ const t = navigator.hardwareConcurrency || 4, r = new Float32Array(ne);
1962
+ for (let h = 0; h < ne; h++) r[h] = Math.sin(h);
1963
+ const n = await Se(3, () => {
1964
+ const h = performance.now();
1965
+ return Dt(r, 0, ne, [2], [0.5]), performance.now() - h;
1966
+ }), s = Ee(n), a = ne / Math.max(s, 1e-3), o = new SharedArrayBuffer(256 * Float32Array.BYTES_PER_ELEMENT), i = await Se(3, async () => {
1967
+ const h = performance.now();
1968
+ return await new Promise((b) => {
1969
+ const w = new $e();
1970
+ w.onmessage = () => {
1971
+ w.terminate(), b();
1972
+ }, w.postMessage({
1973
+ bufferY: o,
1974
+ start: 0,
1975
+ end: 256,
1976
+ ops: [2],
1977
+ values: [0.5]
1978
+ });
1979
+ }), performance.now() - h;
1980
+ }), l = Ee(i), f = new SharedArrayBuffer(
1981
+ se * Float32Array.BYTES_PER_ELEMENT
1982
+ ), u = new Float32Array(f);
1983
+ for (let h = 0; h < se; h++) u[h] = Math.sin(h);
1984
+ const p = await Se(3, async () => {
1985
+ const h = performance.now();
1986
+ return await new Promise((b) => {
1987
+ const w = new $e();
1988
+ w.onmessage = () => {
1989
+ w.terminate(), b();
1990
+ }, w.postMessage({
1991
+ bufferY: f,
1992
+ start: 0,
1993
+ end: se,
1994
+ ops: [2],
1995
+ values: [0.5]
1996
+ });
1997
+ }), performance.now() - h;
1998
+ }), g = Math.max(Ee(p) - l, 0.1), y = se / g;
1999
+ return {
2000
+ spawnOverheadMs: l,
2001
+ inlineThroughput: a,
2002
+ workerThroughput: y,
2003
+ hwConcurrency: t,
2004
+ measuredAt: Date.now(),
2005
+ userAgent: navigator.userAgent,
2006
+ sharedArrayBufferAvailable: !0,
2007
+ samples: {
2008
+ spawnRoundtripMs: i,
2009
+ inlineScanMs: n,
2010
+ workerScanMs: p
2011
+ }
2012
+ };
2013
+ }
2014
+ async function Se(e, t) {
2015
+ const r = [];
2016
+ for (let n = 0; n < e; n++)
2017
+ await new Promise((s) => setTimeout(s, 0)), r.push(await t());
2018
+ return r;
2019
+ }
2020
+ function Ee(e) {
2021
+ if (!e.length) return 0;
2022
+ const t = [...e].sort((n, s) => n - s), r = Math.floor(t.length / 2);
2023
+ return t.length % 2 ? t[r] : (t[r - 1] + t[r]) / 2;
2024
+ }
2025
+ function jr() {
2026
+ if (typeof localStorage > "u") return null;
2027
+ try {
2028
+ const e = localStorage.getItem(xe);
2029
+ if (!e) return null;
2030
+ const t = JSON.parse(e);
2031
+ return !t || typeof t.spawnOverheadMs != "number" ? null : t;
2032
+ } catch {
2033
+ return null;
2034
+ }
2035
+ }
2036
+ function Wr(e) {
2037
+ if (!(typeof localStorage > "u"))
2038
+ try {
2039
+ const t = {
2040
+ spawnOverheadMs: e.spawnOverheadMs,
2041
+ inlineThroughput: e.inlineThroughput,
2042
+ workerThroughput: e.workerThroughput,
2043
+ hwConcurrency: e.hwConcurrency,
2044
+ measuredAt: e.measuredAt,
2045
+ userAgent: e.userAgent
2046
+ };
2047
+ localStorage.setItem(xe, JSON.stringify(t));
2048
+ } catch {
2049
+ }
2050
+ }
2051
+ const Q = 20 * 1e3, Gr = 1024, Yr = ["date", "value", "qualifier"];
2052
+ class bn {
102
2053
  /** The generated dataset to be used for plotting */
103
2054
  dataset = {
104
- dimensions: j,
2055
+ dimensions: Yr,
105
2056
  source: {
106
2057
  x: new Float64Array(
107
2058
  new SharedArrayBuffer(
108
- L * Float64Array.BYTES_PER_ELEMENT,
2059
+ Q * Float64Array.BYTES_PER_ELEMENT,
109
2060
  {
110
- maxByteLength: L * Float64Array.BYTES_PER_ELEMENT
2061
+ maxByteLength: Q * Float64Array.BYTES_PER_ELEMENT
111
2062
  // Max size the array can reach
112
2063
  }
113
2064
  )
114
2065
  ),
115
2066
  y: new Float32Array(
116
2067
  new SharedArrayBuffer(
117
- L * Float32Array.BYTES_PER_ELEMENT,
2068
+ Q * Float32Array.BYTES_PER_ELEMENT,
118
2069
  {
119
- maxByteLength: L * Float32Array.BYTES_PER_ELEMENT
2070
+ maxByteLength: Q * Float32Array.BYTES_PER_ELEMENT
120
2071
  // Max size the array can reach
121
2072
  }
122
2073
  )
@@ -124,6 +2075,30 @@ class q {
124
2075
  }
125
2076
  };
126
2077
  history = [];
2078
+ /**
2079
+ * Items popped off `history` by `undo()`, in undo order (top of stack
2080
+ * at the end). `redo()` re-dispatches the top. A fresh `dispatchAction`
2081
+ * / `dispatchFilter` call clears the stack — Word-style behavior where
2082
+ * a new edit invalidates the redo chain.
2083
+ */
2084
+ redoStack = [];
2085
+ /**
2086
+ * True while `undo()` / `redo()` is replaying a captured history entry.
2087
+ * Suppresses the redo-stack clearing that otherwise fires on every new
2088
+ * dispatch, so the stack survives the internal replay.
2089
+ */
2090
+ _isReplaying = !1;
2091
+ /**
2092
+ * Set by each operation handler (or any of its subroutines) to record
2093
+ * whether a worker was actually spawned during this dispatch. Sticky-
2094
+ * upgrade semantics: the wrapper resets it to `"inline"` before the
2095
+ * handler runs, and any code that spawns a worker flips it to
2096
+ * `"worker"`. Once flipped it stays flipped for the rest of the
2097
+ * dispatch — so an op whose top-level decision is "inline" but whose
2098
+ * sub-op (e.g. `_shift` → `_deleteDataPoints`) still spawns workers
2099
+ * will honestly show `"worker"` on its history entry.
2100
+ */
2101
+ _pendingExecutionMode = "inline";
127
2102
  loadingTime = null;
128
2103
  isLoading = !0;
129
2104
  rawData;
@@ -134,10 +2109,10 @@ class q {
134
2109
  if (!t)
135
2110
  return;
136
2111
  this.isLoading = !0;
137
- const a = await p(() => {
2112
+ const r = await we(() => {
138
2113
  this._growBuffer(t.datetimes.length), this._resizeTo(t.datetimes.length), this.dataX.set(t.datetimes), this.dataY.set(t.dataValues);
139
2114
  });
140
- this.loadingTime = a.duration, this.history.length = 0, this.isLoading = !1;
2115
+ this.loadingTime = r.duration, this.history.length = 0, this.isLoading = !1;
141
2116
  }
142
2117
  get dataX() {
143
2118
  return this.dataset.source.x;
@@ -162,22 +2137,22 @@ class q {
162
2137
  * @param newLength The total number of elements that the view will contain
163
2138
  */
164
2139
  _growBuffer(t) {
165
- const a = t * Float64Array.BYTES_PER_ELEMENT;
166
- let e = this.dataX.buffer.byteLength;
167
- for (; a > e; )
168
- e += L * Float64Array.BYTES_PER_ELEMENT;
169
- if (e * Float64Array.BYTES_PER_ELEMENT > this.dataX.buffer.maxByteLength) {
170
- const n = new SharedArrayBuffer(
2140
+ const r = t * Float64Array.BYTES_PER_ELEMENT;
2141
+ let n = this.dataX.buffer.byteLength;
2142
+ for (; r > n; )
2143
+ n += Q * Float64Array.BYTES_PER_ELEMENT;
2144
+ if (n * Float64Array.BYTES_PER_ELEMENT > this.dataX.buffer.maxByteLength) {
2145
+ const s = new SharedArrayBuffer(
171
2146
  this.dataX.buffer.byteLength,
172
2147
  {
173
- maxByteLength: e * Float64Array.BYTES_PER_ELEMENT
2148
+ maxByteLength: n * Float64Array.BYTES_PER_ELEMENT
174
2149
  }
175
- ), r = new SharedArrayBuffer(
2150
+ ), a = new SharedArrayBuffer(
176
2151
  this.dataY.buffer.byteLength,
177
2152
  {
178
- maxByteLength: e * Float32Array.BYTES_PER_ELEMENT
2153
+ maxByteLength: n * Float32Array.BYTES_PER_ELEMENT
179
2154
  }
180
- ), o = new Float64Array(n), i = new Float32Array(r);
2155
+ ), o = new Float64Array(s), i = new Float32Array(a);
181
2156
  o.set(this.dataX), i.set(this.dataY), this.dataset.source.x = o, this.dataset.source.y = i;
182
2157
  }
183
2158
  this.dataX.buffer.byteLength < t * Float64Array.BYTES_PER_ELEMENT && (this.dataX.buffer.grow(t * Float64Array.BYTES_PER_ELEMENT), this.dataY.buffer.grow(t * Float32Array.BYTES_PER_ELEMENT));
@@ -193,16 +2168,47 @@ class q {
193
2168
  * @returns
194
2169
  */
195
2170
  async reloadHistory(t) {
196
- const a = this.history.slice(0, t + 1);
197
- await this.reload(), await this.dispatch(a.map((e) => [e.method, ...e.args || []]));
2171
+ const r = this.history.slice(0, t + 1);
2172
+ return this.redoStack.length = 0, await this.reload(), await this.dispatch(r.map((n) => [n.method, ...n.args || []]));
198
2173
  }
199
2174
  /**
200
2175
  * Remove a history item
201
2176
  * @param index
202
2177
  */
203
2178
  async removeHistoryItem(t) {
204
- const a = [...this.history];
205
- a.splice(t, 1), await this.reload(), await this.dispatch(a.map((e) => [e.method, ...e.args || []]));
2179
+ const r = [...this.history];
2180
+ return r.splice(t, 1), this.redoStack.length = 0, await this.reload(), await this.dispatch(r.map((n) => [n.method, ...n.args || []]));
2181
+ }
2182
+ /**
2183
+ * Undo the most recent history entry. Pushes it onto `redoStack` so a
2184
+ * subsequent `redo()` can re-apply it, then reloads from the raw
2185
+ * dataset and replays the remaining history in order.
2186
+ */
2187
+ async undo() {
2188
+ if (!this.history.length) return [];
2189
+ const t = this.history[this.history.length - 1], r = this.history.slice(0, -1);
2190
+ await this.reload(), this.redoStack.push(t), this._isReplaying = !0;
2191
+ try {
2192
+ return await this.dispatch(r.map((n) => [n.method, ...n.args || []]));
2193
+ } finally {
2194
+ this._isReplaying = !1;
2195
+ }
2196
+ }
2197
+ /**
2198
+ * Re-apply the most recently undone entry from `redoStack`. The replay
2199
+ * runs through `dispatch`, which pushes a fresh history entry for it;
2200
+ * `_isReplaying` guards the redo stack from being wiped during the
2201
+ * dispatch.
2202
+ */
2203
+ async redo() {
2204
+ if (!this.redoStack.length) return [];
2205
+ const t = this.redoStack.pop();
2206
+ this._isReplaying = !0;
2207
+ try {
2208
+ return await this.dispatch([[t.method, ...t.args || []]]);
2209
+ } finally {
2210
+ this._isReplaying = !1;
2211
+ }
206
2212
  }
207
2213
  get beginTime() {
208
2214
  return this.dataset.source.x.length ? new Date(this.dataset.source.x[0]) : null;
@@ -211,135 +2217,255 @@ class q {
211
2217
  return this.dataset.source.x.length ? new Date(this.dataset.source.x[this.dataset.source.x.length - 1]) : null;
212
2218
  }
213
2219
  /** Dispatch an operation and log its signature in hisotry */
214
- async dispatch(t, ...a) {
215
- const e = {
216
- [f.ADD_POINTS]: this._addDataPoints,
217
- [f.CHANGE_VALUES]: this._changeValues,
218
- [f.DELETE_POINTS]: this._deleteDataPoints,
219
- [f.DRIFT_CORRECTION]: this._driftCorrection,
220
- [f.INTERPOLATE]: this._interpolate,
221
- [f.SHIFT_DATETIMES]: this._shift,
222
- [f.FILL_GAPS]: this._fillGaps
223
- }, n = {
224
- [f.ADD_POINTS]: "mdi-plus",
225
- [f.CHANGE_VALUES]: "mdi-pencil",
226
- [f.DELETE_POINTS]: "mdi-trash-can",
227
- [f.DRIFT_CORRECTION]: "mdi-chart-sankey",
228
- [f.INTERPOLATE]: "mdi-transit-connection-horizontal",
229
- [f.SHIFT_DATETIMES]: "mdi-calendar",
230
- [f.FILL_GAPS]: "mdi-keyboard-space"
2220
+ async dispatchAction(t, ...r) {
2221
+ const n = {
2222
+ [E.ADD_POINTS]: this._addDataPoints,
2223
+ [E.CHANGE_VALUES]: this._changeValues,
2224
+ [E.ASSIGN_VALUES_BULK]: this._assignValuesBulk,
2225
+ [E.DELETE_POINTS]: this._deleteDataPoints,
2226
+ [E.DRIFT_CORRECTION]: this._driftCorrection,
2227
+ [E.INTERPOLATE]: this._interpolate,
2228
+ [E.SHIFT_DATETIMES]: this._shift,
2229
+ [E.ASSIGN_DATETIMES_BULK]: this._assignDatetimesBulk,
2230
+ [E.FILL_GAPS]: this._fillGaps
2231
+ }, s = {
2232
+ [E.ADD_POINTS]: "mdi-plus",
2233
+ [E.CHANGE_VALUES]: "mdi-pencil",
2234
+ [E.ASSIGN_VALUES_BULK]: "mdi-pencil",
2235
+ [E.DELETE_POINTS]: "mdi-trash-can",
2236
+ [E.DRIFT_CORRECTION]: "mdi-chart-sankey",
2237
+ [E.INTERPOLATE]: "mdi-transit-connection-horizontal",
2238
+ [E.SHIFT_DATETIMES]: "mdi-calendar",
2239
+ [E.ASSIGN_DATETIMES_BULK]: "mdi-calendar",
2240
+ [E.FILL_GAPS]: "mdi-keyboard-space"
231
2241
  };
232
- let r = [];
2242
+ let a = [];
233
2243
  try {
234
- if (Array.isArray(t)) {
235
- for (let o = 0; o < t.length; o++) {
236
- const i = t[o][0], h = t[o].slice(1, t[o].length), l = {
237
- method: i,
238
- args: h,
239
- icon: n[i],
240
- isLoading: !1
241
- };
242
- this.history.push(l);
243
- }
244
- for (let o = this.history.length - t.length; o < this.history.length; o++) {
245
- const i = this.history[o];
246
- i.isLoading = !0;
247
- const h = await p(async () => await e[i.method].apply(
248
- this,
249
- i.args
250
- ));
251
- i.duration = h.duration, i.isLoading = !1, r.push(h.response);
252
- }
253
- } else {
254
- const o = {
255
- method: t,
256
- args: a,
257
- icon: n[t],
258
- isLoading: !0
259
- };
260
- this.history.push(o);
261
- const i = await p(async () => await e[t].apply(this, a));
262
- r = i.response, o.duration = i.duration, o.isLoading = !1;
263
- }
2244
+ this._isReplaying || (this.redoStack.length = 0);
2245
+ const o = {
2246
+ method: t,
2247
+ args: r,
2248
+ icon: s[t],
2249
+ isLoading: !0
2250
+ };
2251
+ this.history.push(o);
2252
+ const i = this.history.length - 1;
2253
+ this._pendingExecutionMode = "inline";
2254
+ const l = await we(async () => await n[t].apply(this, r));
2255
+ a = l.response;
2256
+ const f = this.history[i];
2257
+ f && (f.duration = l.duration, f.executionMode = this._pendingExecutionMode, f.isLoading = !1);
264
2258
  } catch (o) {
265
2259
  console.log(
266
2260
  `Failed to execute operation: ${t} with arguments: `,
267
- a
2261
+ r
268
2262
  ), console.log(o);
269
2263
  }
270
- return r;
2264
+ return a;
2265
+ }
2266
+ async dispatch(t, ...r) {
2267
+ const n = async (s, a) => v[s] ? await this.dispatchFilter(s, ...a) : await this.dispatchAction(s, ...a);
2268
+ if (Array.isArray(t)) {
2269
+ let s = [];
2270
+ for (let a = 0; a < t.length; a++) {
2271
+ const o = t[a][0], i = t[a].slice(1, t[a].length);
2272
+ s = await n(o, i);
2273
+ }
2274
+ return s;
2275
+ } else
2276
+ return await n(t, r);
271
2277
  }
272
- /** Filter operations do not transform the data and are not logged in history */
273
- async dispatchFilter(t, ...a) {
274
- const e = {
275
- [T.FIND_GAPS]: this._findGaps,
276
- [T.VALUE_THRESHOLD]: this._valueThreshold,
277
- [T.PERSISTENCE]: this._persistence,
278
- [T.RATE_OF_CHANGE]: this._rateOfChange
2278
+ /** Filter operations do not transform the data and return a selection */
2279
+ async dispatchFilter(t, ...r) {
2280
+ const n = {
2281
+ [v.FIND_GAPS]: this._findGaps,
2282
+ [v.VALUE_THRESHOLD]: this._valueThreshold,
2283
+ [v.DATETIME_RANGE]: this._datetimeRange,
2284
+ [v.PERSISTENCE]: this._persistence,
2285
+ [v.CHANGE]: this._change,
2286
+ [v.RATE_OF_CHANGE]: this._rateOfChange,
2287
+ [v.SELECTION]: this._selection
2288
+ }, s = {
2289
+ [v.FIND_GAPS]: "mdi-plus",
2290
+ [v.PERSISTENCE]: "mdi-plus",
2291
+ [v.CHANGE]: "mdi-plus",
2292
+ [v.RATE_OF_CHANGE]: "mdi-plus",
2293
+ [v.VALUE_THRESHOLD]: "mdi-plus",
2294
+ [v.DATETIME_RANGE]: "mdi-plus",
2295
+ [v.SELECTION]: "mdi-plus"
279
2296
  };
280
- let n = [];
2297
+ let a = [];
281
2298
  try {
282
- if (Array.isArray(t))
283
- for (let r = 0; r < t.length; r++) {
284
- const o = t[r][0], i = t[r].slice(1, t[r].length), h = await e[o].apply(this, i);
285
- n.push(h);
286
- }
287
- else
288
- n = await e[t].apply(this, a);
289
- } catch (r) {
2299
+ this._isReplaying || (this.redoStack.length = 0);
2300
+ const o = {
2301
+ method: t,
2302
+ args: r,
2303
+ icon: s[t],
2304
+ isLoading: !0
2305
+ }, i = this.history[this.history.length - 1];
2306
+ let l;
2307
+ v[i?.method] ? (l = this.history.length - 1, this.history[l] = o) : (this.history.push(o), l = this.history.length - 1), this._pendingExecutionMode = "inline";
2308
+ const f = await we(async () => await n[t].apply(this, r));
2309
+ a = f.response;
2310
+ const u = this.history[l];
2311
+ u && (u.duration = f.duration, u.executionMode = this._pendingExecutionMode, u.selected = f.response, u.isLoading = !1);
2312
+ } catch (o) {
290
2313
  console.log(
291
2314
  `Failed to execute filter operation: ${t} with arguments: `,
292
- a
293
- ), console.log(r);
2315
+ r
2316
+ ), console.log(o);
294
2317
  }
295
- return n;
2318
+ return a;
296
2319
  }
297
2320
  /**
298
2321
  * @param index An array containing the list of index of values to perform the operations on.
299
2322
  * @param operator The operator that will be applied
300
2323
  * @param value The value to use in the operation
301
- * @returns The modified DataFrame
302
- */
303
- _changeValues(t, a, e) {
304
- const n = (r) => {
305
- switch (a) {
306
- case y.ADD:
307
- return r + e;
308
- case y.ASSIGN:
309
- return e;
310
- case y.DIV:
311
- return r / e;
312
- case y.MULT:
313
- return r * e;
314
- case y.SUB:
315
- return r - e;
316
- default:
317
- return r;
318
- }
319
- };
320
- t.forEach((r) => {
321
- this.dataset.source.y[r] = n(this.dataset.source.y[r]);
322
- });
2324
+ * @returns an array of index values to keep selected in the plot
2325
+ */
2326
+ /**
2327
+ * Multi-threaded apply of an arithmetic operator to Y at the previously-filtered selection.
2328
+ * 1. Selection is read from the previous history entry (the last entry is this operation itself).
2329
+ * 2. Selection indexes are sharded into disjoint chunks; workers write in place to shared Y.
2330
+ * 3. Writes are conflict-free because the selection carries distinct indexes.
2331
+ */
2332
+ async _changeValues(t, r) {
2333
+ const n = this.history[this.history.length - 2]?.selected;
2334
+ if (!n || n.length === 0) return [];
2335
+ const s = n.length;
2336
+ if (!U(E.CHANGE_VALUES, {
2337
+ datasetSize: this.dataset.source.y.length,
2338
+ selectionSize: s
2339
+ }).useWorker || s < Gr)
2340
+ return ct(this.dataY, n, t, r), [];
2341
+ this._pendingExecutionMode = "worker";
2342
+ const o = Math.min(navigator.hardwareConcurrency || 1, s), i = Math.ceil(s / o), l = [], f = [];
2343
+ for (let u = 0; u < o; u++) {
2344
+ const p = u * i, g = Math.min((u + 1) * i, s);
2345
+ if (p >= g) break;
2346
+ const y = n.slice(p, g);
2347
+ f.push(
2348
+ new Promise((d) => {
2349
+ const h = new Lr();
2350
+ l.push(h), h.postMessage({
2351
+ bufferY: this.dataY.buffer,
2352
+ indexes: y,
2353
+ operator: t,
2354
+ value: r
2355
+ }), h.onmessage = (b) => {
2356
+ d(b.data);
2357
+ };
2358
+ })
2359
+ );
2360
+ }
2361
+ return await Promise.all(f), l.forEach((u) => u.terminate()), [];
323
2362
  }
324
- _interpolate(t) {
325
- this._getConsecutiveGroups(t).forEach((e) => {
326
- const n = e[0], r = e[e.length - 1];
327
- let o = Math.max(0, n - 1), i = Math.min(this.dataset.source.y.length - 1, r + 1);
328
- const h = this.dataset.source.x, l = this.dataset.source.y;
329
- for (let c = 0; c < e.length; c++)
330
- this.dataset.source.y[e[c]] = this._interpolateLinear(
331
- h[e[c]],
332
- h[o],
333
- l[o],
334
- h[i],
335
- l[i]
336
- );
337
- });
2363
+ /**
2364
+ * Apply an arithmetic operator to Y in-place on the main thread. Thin
2365
+ * wrapper around {@link changeValuesCore} kept so `_assignValuesBulk`
2366
+ * and callers outside this module can use the same routine the
2367
+ * CHANGE_VALUES fast path does.
2368
+ */
2369
+ _applyOperatorInPlace(t, r, n) {
2370
+ ct(this.dataY, t, r, n);
338
2371
  }
339
- /** Interpolate existing values in the data source */
340
- _interpolateLinear(t, a, e, n, r) {
341
- return e + (t - a) * (r - e) / (n - a);
2372
+ /**
2373
+ * One-shot assignment of distinct Y-values at the indices logged by the
2374
+ * previous SELECTION filter entry. Args: `(values: number[])`, where
2375
+ * `values[i]` is written to `dataY[selection[i]]`. Runs as a single
2376
+ * tight loop on the main thread — no workers, no per-row dispatch
2377
+ * ceremony. Intended for table-driven edits.
2378
+ *
2379
+ * Expected dispatch order (matches CHANGE_VALUES):
2380
+ * [[SELECTION, indices], [ASSIGN_VALUES_BULK, values]]
2381
+ * The SELECTION entry carries the indices for history, so this op does
2382
+ * not log them again.
2383
+ */
2384
+ async _assignValuesBulk(t) {
2385
+ const r = this.history[this.history.length - 2]?.selected;
2386
+ if (!r || !r.length || !t?.length) return [];
2387
+ const n = Math.min(r.length, t.length), s = this.dataY;
2388
+ for (let a = 0; a < n; a++) s[r[a]] = t[a];
2389
+ return [];
2390
+ }
2391
+ /**
2392
+ * One-shot assignment of distinct datetimes (epoch-ms) at the indices
2393
+ * logged by the previous SELECTION filter entry. Internally: compute
2394
+ * the replacement (x, y) pairs, do a single delete + single add — so
2395
+ * the reindex-and-sort step runs once regardless of how many rows changed.
2396
+ *
2397
+ * Expected dispatch order (matches SHIFT_DATETIMES pattern):
2398
+ * [[SELECTION, indices], [ASSIGN_DATETIMES_BULK, datetimes]]
2399
+ */
2400
+ async _assignDatetimesBulk(t) {
2401
+ const r = this.history[this.history.length - 2]?.selected;
2402
+ if (!r || !r.length || !t?.length) return [];
2403
+ const n = Math.min(r.length, t.length), s = new Array(n), a = new Array(n);
2404
+ for (let o = 0; o < n; o++)
2405
+ s[o] = [t[o], this.dataY[r[o]]], a[o] = r[o];
2406
+ return a.sort((o, i) => o - i), await this._deleteDataPoints(a), await this._addDataPoints(s), [];
2407
+ }
2408
+ /**
2409
+ * Multi-threaded linear interpolation over the selected indexes.
2410
+ * 1. Main thread partitions the selected indexes into consecutive groups and computes each group's lower/upper anchors.
2411
+ * 2. Groups are sharded across workers (disjoint by construction, so in-place writes are safe).
2412
+ * 3. Each worker writes interpolated Y values directly into the shared Y buffer — no output copy needed since only a subset of Y changes.
2413
+ */
2414
+ async _interpolate(t) {
2415
+ const r = this._getConsecutiveGroups(t);
2416
+ if (r.length === 0 || r[0].length === 0) return;
2417
+ const n = this.dataset.source.y.length, s = r.map((u) => ({
2418
+ indexes: u,
2419
+ lowerIdx: Math.max(0, u[0] - 1),
2420
+ upperIdx: Math.min(n - 1, u[u.length - 1] + 1)
2421
+ }));
2422
+ if (!U(E.INTERPOLATE, {
2423
+ datasetSize: n,
2424
+ selectionSize: t.length
2425
+ }).useWorker) {
2426
+ Dr(this.dataX, this.dataY, s);
2427
+ return;
2428
+ }
2429
+ this._pendingExecutionMode = "worker";
2430
+ const o = Math.min(
2431
+ navigator.hardwareConcurrency || 1,
2432
+ s.length
2433
+ ), i = Math.ceil(s.length / o), l = [], f = [];
2434
+ for (let u = 0; u < o; u++) {
2435
+ const p = s.slice(
2436
+ u * i,
2437
+ (u + 1) * i
2438
+ );
2439
+ if (p.length === 0) break;
2440
+ f.push(
2441
+ new Promise((g) => {
2442
+ const y = new wr();
2443
+ l.push(y), y.postMessage({
2444
+ bufferX: this.dataX.buffer,
2445
+ bufferY: this.dataY.buffer,
2446
+ groups: p
2447
+ }), y.onmessage = (d) => {
2448
+ g(d.data);
2449
+ };
2450
+ })
2451
+ );
2452
+ }
2453
+ await Promise.all(f), l.forEach((u) => u.terminate());
342
2454
  }
2455
+ /** Interpolate existing values in the data source */
2456
+ // private _interpolateLinear(
2457
+ // datetime: number,
2458
+ // lowerDatetime: number,
2459
+ // lowerValue: number,
2460
+ // upperDatetime: number,
2461
+ // upperValue: number,
2462
+ // ) {
2463
+ // const interpolatedValue =
2464
+ // lowerValue +
2465
+ // ((datetime - lowerDatetime) * (upperValue - lowerValue)) /
2466
+ // (upperDatetime - lowerDatetime);
2467
+ // return interpolatedValue;
2468
+ // }
343
2469
  /**
344
2470
  * Shifts the selected indexes by specified amount of units. Elements are reinserted according to their datetime.
345
2471
  * @param index The index of the elements to shift
@@ -347,60 +2473,141 @@ class q {
347
2473
  * @param unit {@link TimeUnit}
348
2474
  * @returns
349
2475
  */
350
- async _shift(t, a, e) {
351
- const n = t.map((r) => [
352
- V(this.dataX[r], a, e),
353
- this.dataY[r]
354
- ]);
355
- await this._deleteDataPoints(t), await this._addDataPoints(n);
356
- }
357
- async _fillGapsV2(t, a, e, n) {
358
- const r = navigator.hardwareConcurrency || 1, o = [], i = [], h = this.dataX.length, l = new SharedArrayBuffer(this.dataX.buffer.byteLength, {
359
- maxByteLength: this.dataX.buffer.maxByteLength
360
- }), c = new SharedArrayBuffer(this.dataY.buffer.byteLength, {
361
- maxByteLength: this.dataY.buffer.maxByteLength
362
- });
363
- for (let u = 0; u < r; u++)
364
- i.push(
365
- new Promise((d) => {
366
- const E = new C();
367
- o.push(E), E.postMessage({
2476
+ async _shift(t, r, n) {
2477
+ if (t.length === 0) return;
2478
+ const s = n === D.MONTH, a = n === D.YEAR, o = !s && !a ? r * te[n] * 1e3 : 0, i = t.length;
2479
+ if (!U(E.SHIFT_DATETIMES, {
2480
+ datasetSize: this.dataset.source.x.length,
2481
+ selectionSize: i
2482
+ }).useWorker) {
2483
+ const m = xr(
2484
+ this.dataX,
2485
+ this.dataY,
2486
+ t,
2487
+ { amount: r, isMonth: s, isYear: a, deltaMs: o }
2488
+ );
2489
+ await this._deleteDataPoints(t), await this._addDataPoints(m);
2490
+ return;
2491
+ }
2492
+ this._pendingExecutionMode = "worker";
2493
+ const f = new SharedArrayBuffer(
2494
+ i * Float64Array.BYTES_PER_ELEMENT
2495
+ ), u = new SharedArrayBuffer(
2496
+ i * Float32Array.BYTES_PER_ELEMENT
2497
+ ), p = Math.min(navigator.hardwareConcurrency || 1, i), g = Math.ceil(i / p), y = [], d = [];
2498
+ for (let m = 0; m < p; m++) {
2499
+ const S = m * g, A = Math.min((m + 1) * g, i);
2500
+ if (S >= A) break;
2501
+ const L = t.slice(S, A);
2502
+ d.push(
2503
+ new Promise((T) => {
2504
+ const I = new Er();
2505
+ y.push(I), I.postMessage({
368
2506
  bufferX: this.dataX.buffer,
369
2507
  bufferY: this.dataY.buffer,
370
- outputBufferX: l,
371
- outputBufferY: c
372
- }), E.onmessage = (g) => {
373
- d(g.data);
2508
+ outputBufferX: f,
2509
+ outputBufferY: u,
2510
+ indexes: L,
2511
+ outStart: S,
2512
+ amount: r,
2513
+ isMonth: s,
2514
+ isYear: a,
2515
+ deltaMs: o
2516
+ }), I.onmessage = (j) => {
2517
+ T(j.data);
374
2518
  };
375
2519
  })
376
2520
  );
377
- await Promise.all(i), o.forEach((u) => u.terminate()), this.dataset.source.x = new Float64Array(l), this.dataset.source.y = new Float32Array(c), this._resizeTo(h);
2521
+ }
2522
+ await Promise.all(d), y.forEach((m) => m.terminate());
2523
+ const h = new Float64Array(f), b = new Float32Array(u), w = new Array(i);
2524
+ for (let m = 0; m < i; m++)
2525
+ w[m] = [h[m], b[m]];
2526
+ await this._deleteDataPoints(t), await this._addDataPoints(w);
378
2527
  }
379
2528
  /**
380
- * Find gaps and fill them with placeholder value
381
- * @param gap Intervals to detect as gaps
382
- * @param fill Interval used to fill the detected gaps
383
- * @param interpolateValues If true, the new values will be linearly interpolated
384
- * @returns
2529
+ * Multi-threaded version of {@link _fillGaps}.
2530
+ * 1. The main thread scans once for gaps and computes the number of fill points per gap.
2531
+ * 2. The original array is split into equal segments; each gap is assigned to the segment containing its left index.
2532
+ * 3. Cumulative fill counts before each segment give each worker's output startTarget, ensuring no overlap.
2533
+ * 4. Each worker copies its segment to the output buffer and inserts its gap fills inline.
385
2534
  */
386
- // TODO: this needs to be improved using web workers
387
- _fillGaps(t, a, e, n) {
388
- const r = this._findGaps(t[0], t[1], n);
389
- for (let o = r.length - 1; o >= 0; o--) {
390
- const i = r[o], h = this.dataX[i[0]], l = this.dataX[i[1]], c = [], u = a[0] * A[a[1]] * 1e3;
391
- let d = h + u;
392
- for (; d < l; ) {
393
- const E = e ? this._interpolateLinear(
394
- d,
395
- this.dataX[i[0]],
396
- this.dataY[i[0]],
397
- this.dataX[i[1]],
398
- this.dataY[i[1]]
399
- ) : -9999;
400
- c.push([d, E]), d += u;
2535
+ async _fillGaps(t, r, n, s) {
2536
+ const a = this.dataX.length;
2537
+ if (a === 0) return;
2538
+ const o = t[0] * te[t[1]] * 1e3, i = r[0] * te[r[1]] * 1e3, l = -9999, f = s?.[0] ?? 0, u = s?.[1] ?? a - 1, p = this.dataX, g = [], y = [];
2539
+ let d = 0;
2540
+ for (let k = f + 1; k <= u; k++)
2541
+ if (p[k] - p[k - 1] > o) {
2542
+ let C = 0, W = p[k - 1] + i;
2543
+ for (; W < p[k]; )
2544
+ C++, W += i;
2545
+ C > 0 && (g.push([k - 1, k]), y.push(C), d += C);
401
2546
  }
402
- this._addDataPoints(c);
2547
+ if (d === 0) return;
2548
+ const h = a + d, b = h * Float64Array.BYTES_PER_ELEMENT, w = h * Float32Array.BYTES_PER_ELEMENT, m = new SharedArrayBuffer(b, {
2549
+ maxByteLength: Math.max(this.dataX.buffer.maxByteLength, b)
2550
+ }), S = new SharedArrayBuffer(w, {
2551
+ maxByteLength: Math.max(this.dataY.buffer.maxByteLength, w)
2552
+ });
2553
+ if (!U(E.FILL_GAPS, {
2554
+ datasetSize: a,
2555
+ selectionSize: d
2556
+ }).useWorker) {
2557
+ const k = new Float64Array(m), B = new Float32Array(S);
2558
+ Mr(
2559
+ this.dataX,
2560
+ this.dataY,
2561
+ g,
2562
+ k,
2563
+ B,
2564
+ 0,
2565
+ a - 1,
2566
+ 0,
2567
+ i,
2568
+ n,
2569
+ l
2570
+ ), this.dataset.source.x = k, this.dataset.source.y = B, this._resizeTo(h);
2571
+ return;
2572
+ }
2573
+ this._pendingExecutionMode = "worker";
2574
+ const L = navigator.hardwareConcurrency || 1, T = Math.ceil(a / L), I = [];
2575
+ let j = 0;
2576
+ for (let k = 0; k < L; k++) {
2577
+ const B = k * T, C = Math.min((k + 1) * T - 1, a - 1), W = [];
2578
+ let Z = 0;
2579
+ for (; j < g.length && g[j][0] <= C; )
2580
+ W.push(g[j]), Z += y[j], j++;
2581
+ I.push({ start: B, end: C, gapsSegment: W, fillsInSegment: Z });
2582
+ }
2583
+ const he = new Array(L).fill(0);
2584
+ for (let k = 1; k < L; k++)
2585
+ he[k] = he[k - 1] + I[k - 1].fillsInSegment;
2586
+ const Ce = [], Fe = [];
2587
+ for (let k = 0; k < L; k++) {
2588
+ const { start: B, end: C, gapsSegment: W } = I[k], Z = B + he[k];
2589
+ Fe.push(
2590
+ new Promise((Ct) => {
2591
+ const fe = new mr();
2592
+ Ce.push(fe), fe.postMessage({
2593
+ bufferX: this.dataX.buffer,
2594
+ bufferY: this.dataY.buffer,
2595
+ outputBufferX: m,
2596
+ outputBufferY: S,
2597
+ start: B,
2598
+ end: C,
2599
+ gapsSegment: W,
2600
+ startTarget: Z,
2601
+ fillDelta: i,
2602
+ interpolate: n,
2603
+ fillValue: l
2604
+ }), fe.onmessage = (Ft) => {
2605
+ Ct(Ft.data);
2606
+ };
2607
+ })
2608
+ );
403
2609
  }
2610
+ await Promise.all(Fe), Ce.forEach((k) => k.terminate()), this.dataset.source.x = new Float64Array(m), this.dataset.source.y = new Float32Array(S), this._resizeTo(h);
404
2611
  }
405
2612
  /**
406
2613
  Deletes data points from a large array using worker threads.
@@ -410,42 +2617,64 @@ class q {
410
2617
  4. Each worker processes its segment linearly, skipping deletions and copying kept elements to their computed positions.
411
2618
  * @param deleteIndices
412
2619
  */
413
- // TODO: implement similar multithread solutions for other operations
414
2620
  async _deleteDataPoints(t) {
415
- const a = navigator.hardwareConcurrency || 1, e = Math.ceil(this.dataX.length / a), n = [], r = [];
416
- for (let u = 0; u < a; u++) {
417
- const d = u * e, E = Math.min((u + 1) * e - 1, this.dataX.length - 1), g = k(t, d), _ = B(t, E), m = t.slice(g, _ + 1);
418
- r.push({ start: d, end: E, deleteSegment: m });
419
- }
420
- const o = new Array(a).fill(0);
421
- for (let u = 1; u < a; u++)
422
- o[u] = o[u - 1] + r[u - 1].deleteSegment.length;
423
- const i = [], h = this.dataX.length - t.length, l = new SharedArrayBuffer(this.dataX.buffer.byteLength, {
2621
+ const r = this.dataX.length, n = r - t.length;
2622
+ if (!U(E.DELETE_POINTS, {
2623
+ datasetSize: r,
2624
+ selectionSize: t.length
2625
+ }).useWorker) {
2626
+ const y = new SharedArrayBuffer(this.dataX.buffer.byteLength, {
2627
+ maxByteLength: this.dataX.buffer.maxByteLength
2628
+ }), d = new SharedArrayBuffer(this.dataY.buffer.byteLength, {
2629
+ maxByteLength: this.dataY.buffer.maxByteLength
2630
+ }), h = new Float64Array(y), b = new Float32Array(d);
2631
+ Or(
2632
+ this.dataX,
2633
+ this.dataY,
2634
+ t,
2635
+ h,
2636
+ b,
2637
+ 0,
2638
+ r - 1,
2639
+ 0
2640
+ ), this.dataset.source.x = h, this.dataset.source.y = b, this._resizeTo(n);
2641
+ return;
2642
+ }
2643
+ this._pendingExecutionMode = "worker";
2644
+ const a = navigator.hardwareConcurrency || 1, o = Math.ceil(this.dataX.length / a), i = [], l = [];
2645
+ for (let y = 0; y < a; y++) {
2646
+ const d = y * o, h = Math.min((y + 1) * o - 1, this.dataX.length - 1), b = re(t, d), w = be(t, h), m = t.slice(b, w + 1);
2647
+ l.push({ start: d, end: h, deleteSegment: m });
2648
+ }
2649
+ const f = new Array(a).fill(0);
2650
+ for (let y = 1; y < a; y++)
2651
+ f[y] = f[y - 1] + l[y - 1].deleteSegment.length;
2652
+ const u = [], p = new SharedArrayBuffer(this.dataX.buffer.byteLength, {
424
2653
  maxByteLength: this.dataX.buffer.maxByteLength
425
- }), c = new SharedArrayBuffer(this.dataY.buffer.byteLength, {
2654
+ }), g = new SharedArrayBuffer(this.dataY.buffer.byteLength, {
426
2655
  maxByteLength: this.dataY.buffer.maxByteLength
427
2656
  });
428
- for (let u = 0; u < a; u++) {
429
- const { start: d, end: E, deleteSegment: g } = r[u], _ = d - o[u];
430
- i.push(
2657
+ for (let y = 0; y < a; y++) {
2658
+ const { start: d, end: h, deleteSegment: b } = l[y], w = d - f[y];
2659
+ u.push(
431
2660
  new Promise((m) => {
432
- const w = new M();
433
- n.push(w), w.postMessage({
2661
+ const S = new gr();
2662
+ i.push(S), S.postMessage({
434
2663
  bufferX: this.dataX.buffer,
435
2664
  bufferY: this.dataY.buffer,
436
- outputBufferX: l,
437
- outputBufferY: c,
2665
+ outputBufferX: p,
2666
+ outputBufferY: g,
438
2667
  start: d,
439
- end: E,
440
- deleteSegment: g,
441
- startTarget: _
442
- }), w.onmessage = (P) => {
443
- m(P.data);
2668
+ end: h,
2669
+ deleteSegment: b,
2670
+ startTarget: w
2671
+ }), S.onmessage = (A) => {
2672
+ m(A.data);
444
2673
  };
445
2674
  })
446
2675
  );
447
2676
  }
448
- await Promise.all(i), n.forEach((u) => u.terminate()), this.dataset.source.x = new Float64Array(l), this.dataset.source.y = new Float32Array(c), this._resizeTo(h);
2677
+ await Promise.all(u), i.forEach((y) => y.terminate()), this.dataset.source.x = new Float64Array(p), this.dataset.source.y = new Float32Array(g), this._resizeTo(n);
449
2678
  }
450
2679
  /**
451
2680
  *
@@ -453,10 +2682,63 @@ class q {
453
2682
  * @param end The end index
454
2683
  * @param value The drift amount
455
2684
  */
456
- _driftCorrection(t, a, e) {
457
- const n = this.dataset.source.x, r = this.dataset.source.y, o = n[t], h = n[a] - o;
458
- for (let l = t; l < a; l++)
459
- this.dataset.source.y[l] = r[l] + e * ((n[l] - o) / h);
2685
+ /**
2686
+ * Multi-threaded drift correction over one or more [start, end, value] ranges.
2687
+ * 1. Main thread reads each range's anchors (startDatetime, extent) once and chunks the range.
2688
+ * 2. All chunks across all ranges are flattened into jobs and distributed round-robin across a fixed pool of workers.
2689
+ * 3. Each worker applies y_n = y_0 + value * ((x_i - startDatetime) / extent) in place on its jobs.
2690
+ * 4. Batching all ranges into a single call yields a single history entry.
2691
+ */
2692
+ async _driftCorrection(t) {
2693
+ if (!t || t.length === 0) return;
2694
+ const r = this.dataset.source.x, n = navigator.hardwareConcurrency || 1;
2695
+ let s = 0;
2696
+ for (const [p, g] of t)
2697
+ g > p && (s += g - p);
2698
+ if (!U(E.DRIFT_CORRECTION, {
2699
+ datasetSize: r.length,
2700
+ selectionSize: s
2701
+ }).useWorker) {
2702
+ Cr(r, this.dataY, t);
2703
+ return;
2704
+ }
2705
+ this._pendingExecutionMode = "worker";
2706
+ const o = [];
2707
+ for (const [p, g, y] of t) {
2708
+ if (g <= p) continue;
2709
+ const d = r[p], h = r[g] - d;
2710
+ if (h === 0) continue;
2711
+ const b = g - p, w = Math.max(1, Math.ceil(b / n));
2712
+ for (let m = p; m < g; m += w)
2713
+ o.push({
2714
+ chunkStart: m,
2715
+ chunkEnd: Math.min(m + w, g),
2716
+ startDatetime: d,
2717
+ value: y,
2718
+ extent: h
2719
+ });
2720
+ }
2721
+ if (o.length === 0) return;
2722
+ const i = Math.min(n, o.length), l = Array.from(
2723
+ { length: i },
2724
+ () => []
2725
+ );
2726
+ o.forEach((p, g) => l[g % i].push(p));
2727
+ const f = [], u = [];
2728
+ for (const p of l)
2729
+ p.length !== 0 && u.push(
2730
+ new Promise((g) => {
2731
+ const y = new br();
2732
+ f.push(y), y.postMessage({
2733
+ bufferX: this.dataX.buffer,
2734
+ bufferY: this.dataY.buffer,
2735
+ jobs: p
2736
+ }), y.onmessage = (d) => {
2737
+ g(d.data);
2738
+ };
2739
+ })
2740
+ );
2741
+ await Promise.all(u), f.forEach((p) => p.terminate());
460
2742
  }
461
2743
  /** Traverses the index array and returns groups of consecutive values.
462
2744
  * i.e.: `[0, 1, 3, 4, 6] => [[0, 1], [3, 4], [6]]`
@@ -464,28 +2746,73 @@ class q {
464
2746
  * @param index: the index array (sorted)
465
2747
  */
466
2748
  _getConsecutiveGroups(t) {
467
- const a = [[]];
468
- return t.reduce((e, n) => {
469
- const r = e[e.length - 1];
470
- return !r.length || n == r[r.length - 1] + 1 ? r.push(n) : e.push([n]), e;
471
- }, a), a;
2749
+ const r = [[]];
2750
+ return t.reduce((n, s) => {
2751
+ const a = n[n.length - 1];
2752
+ return !a.length || s == a[a.length - 1] + 1 ? a.push(s) : n.push([s]), n;
2753
+ }, r), r;
472
2754
  }
473
2755
  /**
474
- * Adds data points. Their insert index is determined using `findFirstGreaterOrEqual` in the x-axis.
475
- * @param dataPoints
2756
+ * Adds data points using worker threads.
2757
+ * 1. Main thread sorts insertions by datetime and computes each insertion's target index via binary search on the original X.
2758
+ * 2. The original array is split into equal chunks; each insertion is assigned to the chunk containing its target index.
2759
+ * 3. `firstIns` per chunk doubles as the prefix sum of insertions placed before the chunk, giving each worker its outStart in the output buffer without overlap.
2760
+ * 4. Each worker linearly merges its original slice with its insertion slice (both already sorted by datetime) into the output buffer. Originals win on datetime ties, matching the original `findLastLessOrEqual` semantics.
476
2761
  */
477
2762
  async _addDataPoints(t) {
478
- const a = this.dataX.length + t.length;
479
- this._growBuffer(a), t.sort((r, o) => r[0] - o[0]);
480
- const e = t.map((r) => B(this.dataX, r[0]) + 1);
481
- this._resizeTo(a), e.push(this.dataX.length);
482
- let n = t.length;
483
- for (let r = e.length - 1; r > 0; r--) {
484
- const o = e[r - 1], i = e[r] - 1;
485
- for (let h = i; h >= o; h--)
486
- this.dataX[h + n] = this.dataX[h], this.dataY[h + n] = this.dataY[h];
487
- n--, this.dataX[o + n] = t[r - 1][0], this.dataY[o + n] = t[r - 1][1];
2763
+ if (t.length === 0) return;
2764
+ const r = this.dataX.length, n = r + t.length;
2765
+ t.sort((d, h) => d[0] - h[0]);
2766
+ const s = n * Float64Array.BYTES_PER_ELEMENT, a = n * Float32Array.BYTES_PER_ELEMENT, o = new SharedArrayBuffer(s, {
2767
+ maxByteLength: Math.max(this.dataX.buffer.maxByteLength, s)
2768
+ }), i = new SharedArrayBuffer(a, {
2769
+ maxByteLength: Math.max(this.dataY.buffer.maxByteLength, a)
2770
+ });
2771
+ if (!U(E.ADD_POINTS, {
2772
+ datasetSize: r,
2773
+ selectionSize: t.length
2774
+ }).useWorker) {
2775
+ const d = new Float64Array(o), h = new Float32Array(i);
2776
+ Ur(
2777
+ this.dataX,
2778
+ this.dataY,
2779
+ t,
2780
+ d,
2781
+ h,
2782
+ 0,
2783
+ r,
2784
+ 0
2785
+ ), this.dataset.source.x = d, this.dataset.source.y = h, this._resizeTo(n);
2786
+ return;
2787
+ }
2788
+ this._pendingExecutionMode = "worker";
2789
+ const f = t.map(
2790
+ (d) => be(this.dataX, d[0]) + 1
2791
+ ), u = Math.max(
2792
+ 1,
2793
+ Math.min(navigator.hardwareConcurrency || 1, Math.max(r, 1))
2794
+ ), p = Math.ceil(Math.max(r, 1) / u), g = [], y = [];
2795
+ for (let d = 0; d < u; d++) {
2796
+ const h = d * p, b = Math.min((d + 1) * p, r), w = re(f, h), m = d === u - 1 ? t.length : re(f, b), S = t.slice(w, m), A = h + w;
2797
+ h >= b && S.length === 0 || y.push(
2798
+ new Promise((L) => {
2799
+ const T = new Sr();
2800
+ g.push(T), T.postMessage({
2801
+ bufferX: this.dataX.buffer,
2802
+ bufferY: this.dataY.buffer,
2803
+ outputBufferX: o,
2804
+ outputBufferY: i,
2805
+ origStart: h,
2806
+ origEnd: b,
2807
+ insertions: S,
2808
+ outStart: A
2809
+ }), T.onmessage = (I) => {
2810
+ L(I.data);
2811
+ };
2812
+ })
2813
+ );
488
2814
  }
2815
+ await Promise.all(y), g.forEach((d) => d.terminate()), this.dataset.source.x = new Float64Array(o), this.dataset.source.y = new Float32Array(i), this._resizeTo(n);
489
2816
  }
490
2817
  // =======================
491
2818
  // FILTER OPERATIONS
@@ -493,16 +2820,130 @@ class q {
493
2820
  /**
494
2821
  * Filter by applying a set of logical operations
495
2822
  * @param appliedFilters
2823
+ * @returns an array of index values to select in the plot
2824
+ */
2825
+ /**
2826
+ * Filter by applying a set of logical operations, using worker threads.
2827
+ * 1. Main thread encodes filters as numeric opcodes + thresholds (cheaper than string compares in the hot loop).
2828
+ * 2. Workers scan disjoint chunks of Y; an index is selected if ANY filter matches (short-circuit).
2829
+ * 3. Results from each chunk are concatenated in order to preserve ascending indexes.
2830
+ *
2831
+ * Opcodes: 0=LT, 1=LTE, 2=GT, 3=GTE, 4=E.
2832
+ */
2833
+ async _valueThreshold(t) {
2834
+ const r = Object.keys(t);
2835
+ if (r.length === 0) return [];
2836
+ const n = {
2837
+ [q.LT]: 0,
2838
+ [q.LTE]: 1,
2839
+ [q.GT]: 2,
2840
+ [q.GTE]: 3,
2841
+ [q.E]: 4
2842
+ }, s = r.map((h) => n[h] ?? 4), a = r.map((h) => t[h]), o = this.dataset.source.y, i = o.length;
2843
+ if (i === 0) return [];
2844
+ if (!U(v.VALUE_THRESHOLD, {
2845
+ datasetSize: i
2846
+ }).useWorker)
2847
+ return Dt(o, 0, i, s, a);
2848
+ this._pendingExecutionMode = "worker";
2849
+ const f = Math.min(navigator.hardwareConcurrency || 1, i), u = Math.ceil(i / f), p = [], g = [];
2850
+ for (let h = 0; h < f; h++) {
2851
+ const b = h * u, w = Math.min((h + 1) * u, i);
2852
+ if (b >= w) break;
2853
+ g.push(
2854
+ new Promise((m) => {
2855
+ const S = new $e();
2856
+ p.push(S), S.postMessage({
2857
+ bufferY: this.dataY.buffer,
2858
+ start: b,
2859
+ end: w,
2860
+ ops: s,
2861
+ values: a
2862
+ }), S.onmessage = (A) => {
2863
+ m(A.data);
2864
+ };
2865
+ })
2866
+ );
2867
+ }
2868
+ const y = await Promise.all(g);
2869
+ p.forEach((h) => h.terminate());
2870
+ const d = [];
2871
+ for (let h = 0; h < y.length; h++) {
2872
+ const b = y[h];
2873
+ for (let w = 0; w < b.length; w++) d.push(b[w]);
2874
+ }
2875
+ return d;
2876
+ }
2877
+ /**
2878
+ *
2879
+ * @param comparator
2880
+ * @param value
496
2881
  * @returns
497
2882
  */
498
- _valueThreshold(t) {
499
- const a = [];
500
- return this.dataset.source.y.forEach((e, n) => {
501
- Object.keys(t).some((r) => x[r]?.(
502
- e,
503
- t[r]
504
- )) && a.push(n);
505
- }), a;
2883
+ /**
2884
+ * Find points where the relative rate `(curr - prev) / |prev|` satisfies the comparator, using worker threads.
2885
+ * 1. Main thread partitions scan range [1, dataY.length) into chunks; `Y[i-1]` is safely read from the shared buffer across chunk boundaries.
2886
+ * 2. Each worker runs a hoisted branch matching the comparator and returns matching indexes in ascending order.
2887
+ * 3. Main thread concatenates results in chunk order, preserving ascending order.
2888
+ */
2889
+ async _rateOfChange(t, r) {
2890
+ const n = this.dataset.source.y;
2891
+ if (n.length < 2) return [];
2892
+ const s = 1, a = n.length, o = a - s;
2893
+ if (!U(v.RATE_OF_CHANGE, {
2894
+ datasetSize: n.length
2895
+ }).useWorker)
2896
+ return $r(n, s, a, t, r);
2897
+ this._pendingExecutionMode = "worker";
2898
+ const l = Math.min(navigator.hardwareConcurrency || 1, o), f = Math.ceil(o / l), u = [], p = [];
2899
+ for (let d = 0; d < l; d++) {
2900
+ const h = s + d * f, b = Math.min(s + (d + 1) * f, a);
2901
+ if (h >= b) break;
2902
+ p.push(
2903
+ new Promise((w) => {
2904
+ const m = new Ar();
2905
+ u.push(m), m.postMessage({
2906
+ bufferY: this.dataY.buffer,
2907
+ start: h,
2908
+ end: b,
2909
+ comparator: t,
2910
+ value: r
2911
+ }), m.onmessage = (S) => {
2912
+ w(S.data);
2913
+ };
2914
+ })
2915
+ );
2916
+ }
2917
+ const g = await Promise.all(p);
2918
+ u.forEach((d) => d.terminate());
2919
+ const y = [];
2920
+ for (let d = 0; d < g.length; d++) {
2921
+ const h = g[d];
2922
+ for (let b = 0; b < h.length; b++) y.push(h[b]);
2923
+ }
2924
+ return y;
2925
+ }
2926
+ /**
2927
+ * Select all points whose datetime falls inside `[from, to]` (inclusive).
2928
+ * `dataX` is sorted ascending, so binary search bounds the range in
2929
+ * O(log n) — no workers required. Pass `undefined` for either bound to
2930
+ * leave that side unconstrained; omitting both selects the full series.
2931
+ */
2932
+ async _datetimeRange(t, r) {
2933
+ const n = this.dataset.source.x, s = n.length;
2934
+ if (s === 0) return [];
2935
+ const a = t == null ? 0 : re(n, t), o = r == null ? s - 1 : be(n, r);
2936
+ if (a > o) return [];
2937
+ const i = new Array(o - a + 1);
2938
+ for (let l = a; l <= o; l++) i[l - a] = l;
2939
+ return i;
2940
+ }
2941
+ /**
2942
+ * @param index
2943
+ * @returns
2944
+ */
2945
+ async _selection(t) {
2946
+ return (!t || !t.length) && this.history.pop(), t;
506
2947
  }
507
2948
  /**
508
2949
  *
@@ -510,57 +2951,227 @@ class q {
510
2951
  * @param value
511
2952
  * @returns
512
2953
  */
513
- _rateOfChange(t, a) {
514
- const e = [], n = this.dataset.source.y;
515
- for (let r = 1; r < n.length; r++) {
516
- const o = n[r - 1], h = (n[r] - o) / Math.abs(o);
517
- U[t]?.(
518
- h,
519
- a
520
- ) && e.push(r);
2954
+ /**
2955
+ * Find points where the change from the previous value satisfies the comparator, using worker threads.
2956
+ * 1. Main thread partitions scan range [1, dataY.length) into chunks (each chunk's first index safely reads Y[i-1] from the shared buffer).
2957
+ * 2. Each worker runs a hoisted branch matching the comparator and returns matching indexes in ascending order.
2958
+ * 3. Main thread concatenates results in chunk order, preserving ascending order.
2959
+ */
2960
+ async _change(t, r) {
2961
+ const n = this.dataset.source.y;
2962
+ if (n.length < 2) return [];
2963
+ const s = 1, a = n.length, o = a - s;
2964
+ if (!U(v.CHANGE, {
2965
+ datasetSize: n.length
2966
+ }).useWorker)
2967
+ return Tr(n, s, a, t, r);
2968
+ this._pendingExecutionMode = "worker";
2969
+ const l = Math.min(navigator.hardwareConcurrency || 1, o), f = Math.ceil(o / l), u = [], p = [];
2970
+ for (let d = 0; d < l; d++) {
2971
+ const h = s + d * f, b = Math.min(s + (d + 1) * f, a);
2972
+ if (h >= b) break;
2973
+ p.push(
2974
+ new Promise((w) => {
2975
+ const m = new _r();
2976
+ u.push(m), m.postMessage({
2977
+ bufferY: this.dataY.buffer,
2978
+ start: h,
2979
+ end: b,
2980
+ comparator: t,
2981
+ value: r
2982
+ }), m.onmessage = (S) => {
2983
+ w(S.data);
2984
+ };
2985
+ })
2986
+ );
2987
+ }
2988
+ const g = await Promise.all(p);
2989
+ u.forEach((d) => d.terminate());
2990
+ const y = [];
2991
+ for (let d = 0; d < g.length; d++) {
2992
+ const h = g[d];
2993
+ for (let b = 0; b < h.length; b++) y.push(h[b]);
521
2994
  }
522
- return e;
2995
+ return y;
523
2996
  }
524
2997
  /**
525
- * Find gaps in the data
2998
+ * Find gaps in the data using worker threads.
2999
+ * 1. Main thread slices the scan range [start, end] into equal chunks with a 1-index overlap so adjacent workers observe the boundary delta correctly.
3000
+ * 2. Each worker scans its chunk and returns a flat list of [leftIdx, rightIdx] pairs for gaps whose delta exceeds the threshold.
3001
+ * 3. Main thread collects all pairs and dedups via Set — identical return shape to the original implementation.
526
3002
  * @param value The time value
527
3003
  * @param unit The time unit (TimeUnit)
528
3004
  * @param range If specified, the gaps will be found only within the range
529
- * @returns
530
3005
  */
531
- _findGaps(t, a, e) {
532
- const n = [], r = this.dataset.source.x;
533
- let o = 0, i = r.length;
534
- e?.[0] && e?.[1] && (o = e[0], i = e[1]);
535
- let h = r[o];
536
- for (let l = o + 1; l <= i; l++) {
537
- const c = r[l];
538
- c - h > t * A[a] * 1e3 && n.push([l - 1, l]), h = c;
3006
+ async _findGaps(t, r, n) {
3007
+ const s = this.dataset.source.x;
3008
+ let a = 0, o = s.length;
3009
+ if (n?.[0] && n?.[1] && (a = n[0], o = n[1]), o <= a) return [];
3010
+ const i = t * te[r] * 1e3;
3011
+ if (!U(v.FIND_GAPS, {
3012
+ datasetSize: o - a
3013
+ }).useWorker) {
3014
+ const b = Rr(s, a, o - 1, i), w = /* @__PURE__ */ new Set();
3015
+ for (let m = 0; m < b.length; m++) w.add(b[m]);
3016
+ return [...w];
3017
+ }
3018
+ this._pendingExecutionMode = "worker";
3019
+ const f = o - a, u = Math.min(navigator.hardwareConcurrency || 1, f), p = Math.ceil(f / u), g = [], y = [];
3020
+ for (let b = 0; b < u; b++) {
3021
+ const w = a + b * p, m = Math.min(a + (b + 1) * p, o);
3022
+ if (w >= m) break;
3023
+ y.push(
3024
+ new Promise((S) => {
3025
+ const A = new kr();
3026
+ g.push(A), A.postMessage({
3027
+ bufferX: this.dataX.buffer,
3028
+ start: w,
3029
+ endInclusive: m,
3030
+ threshold: i
3031
+ }), A.onmessage = (L) => {
3032
+ S(L.data);
3033
+ };
3034
+ })
3035
+ );
539
3036
  }
540
- return n;
3037
+ const d = await Promise.all(y);
3038
+ g.forEach((b) => b.terminate());
3039
+ const h = /* @__PURE__ */ new Set();
3040
+ for (let b = 0; b < d.length; b++) {
3041
+ const w = d[b];
3042
+ for (let m = 0; m < w.length; m++) h.add(w[m]);
3043
+ }
3044
+ return [...h];
541
3045
  }
542
3046
  /**
543
- * Find points where the values are the same at least x times in a row
544
- * @param times The number of times in a row that points can be equal
3047
+ * Find points where the values are the same at least `times` in a row, using worker threads.
3048
+ * 1. Main thread splits [start, end) into chunks and each worker emits its maximal runs of equal Y values as flat (startIndex, length, value) triplets.
3049
+ * 2. Main thread stitches runs that cross chunk boundaries (same value, adjacent indexes).
3050
+ * 3. Every run whose stitched length is >= `times` contributes all of its indexes to the selection.
3051
+ *
3052
+ * Matches the Python reference implementation in `edit_service.py::persistence` — every member of a qualifying run is selected (including the run's first index).
3053
+ * @param times The minimum run length to qualify
545
3054
  * @param range If specified, the points will be found only within the range
546
- * @returns
547
3055
  */
548
- _persistence(t, a) {
549
- let e = [], n = this.dataset.source.y, r = 0, o = n.length;
550
- a?.[0] && a?.[1] && (r = a[0], o = a[1]);
551
- let i = n[r], h = [];
552
- for (let l = r + 1; l < o; l++)
553
- n[l] != i || l === o ? (h.length >= t && (e = [...e, ...h]), h = []) : h.push(l);
554
- return e;
3056
+ async _persistence(t, r) {
3057
+ const n = this.dataset.source.y;
3058
+ let s = 0, a = n.length;
3059
+ if (r?.[0] && r?.[1] && (s = r[0], a = r[1]), a <= s) return [];
3060
+ const o = a - s;
3061
+ if (!U(v.PERSISTENCE, {
3062
+ datasetSize: o
3063
+ }).useWorker) {
3064
+ const w = Ir(n, s, a), m = [];
3065
+ for (let S = 0; S < w.length; S += 3) {
3066
+ const A = w[S], L = w[S + 1];
3067
+ if (L >= t)
3068
+ for (let T = 0; T < L; T++) m.push(A + T);
3069
+ }
3070
+ return m;
3071
+ }
3072
+ this._pendingExecutionMode = "worker";
3073
+ const l = Math.min(navigator.hardwareConcurrency || 1, o), f = Math.ceil(o / l), u = [], p = [];
3074
+ for (let w = 0; w < l; w++) {
3075
+ const m = s + w * f, S = Math.min(s + (w + 1) * f, a);
3076
+ if (m >= S) break;
3077
+ p.push(
3078
+ new Promise((A) => {
3079
+ const L = new vr();
3080
+ u.push(L), L.postMessage({
3081
+ bufferY: this.dataY.buffer,
3082
+ start: m,
3083
+ end: S
3084
+ }), L.onmessage = (T) => {
3085
+ A(T.data);
3086
+ };
3087
+ })
3088
+ );
3089
+ }
3090
+ const g = await Promise.all(p);
3091
+ u.forEach((w) => w.terminate());
3092
+ const y = [], d = [], h = [];
3093
+ for (let w = 0; w < g.length; w++) {
3094
+ const m = g[w];
3095
+ for (let S = 0; S < m.length; S += 3) {
3096
+ const A = m[S], L = m[S + 1], T = m[S + 2], I = y.length - 1;
3097
+ I >= 0 && h[I] === T && y[I] + d[I] === A ? d[I] += L : (y.push(A), d.push(L), h.push(T));
3098
+ }
3099
+ }
3100
+ const b = [];
3101
+ for (let w = 0; w < y.length; w++) {
3102
+ const m = d[w];
3103
+ if (m >= t) {
3104
+ const S = y[w];
3105
+ for (let A = 0; A < m; A++) b.push(S + A);
3106
+ }
3107
+ }
3108
+ return b;
555
3109
  }
556
3110
  }
557
3111
  export {
558
- f as EnumEditOperations,
559
- T as EnumFilterOperations,
560
- X as FilterOperation,
561
- x as FilterOperationFn,
562
- q as ObservationRecord,
563
- y as Operator,
564
- U as RateOfChangeComparator,
565
- G as RateOfChangeOperation
3112
+ x as ACCOUNT_BASE,
3113
+ Me as AUTH_BASE,
3114
+ rn as ApiKey,
3115
+ O as BASE_URL,
3116
+ sn as Collaborator,
3117
+ mt as DEFAULT_SNACK_DURATION,
3118
+ on as DataSource,
3119
+ Xr as Datastream,
3120
+ E as EnumEditOperations,
3121
+ v as EnumFilterOperations,
3122
+ q as FilterOperation,
3123
+ Nt as HydroShareArchive,
3124
+ Q as INCREASE_AMOUNT,
3125
+ jt as Location,
3126
+ Bt as LogicalOperation,
3127
+ tn as OAuthProvider,
3128
+ bn as ObservationRecord,
3129
+ Jr as ObservedProperty,
3130
+ Pt as Operator,
3131
+ Zr as Organization,
3132
+ ae as PROVIDER_BASE,
3133
+ ln as Payload,
3134
+ Wt as PermissionAction,
3135
+ Gt as PermissionResource,
3136
+ nr as Position,
3137
+ Hr as PostHydroShareArchive,
3138
+ Kr as ProcessingLevel,
3139
+ Qr as ResultQualifier,
3140
+ ge as SESSION_BASE,
3141
+ qr as Sensor,
3142
+ sr as Snack,
3143
+ wt as SnackColor,
3144
+ bt as SnackIcon,
3145
+ St as SnackTitle,
3146
+ or as Snackbar,
3147
+ qe as TAG_BASE,
3148
+ _ as THINGS_BASE,
3149
+ zr as Thing,
3150
+ D as TimeUnit,
3151
+ Vr as Unit,
3152
+ en as User,
3153
+ nn as Workspace,
3154
+ cn as api,
3155
+ c as apiMethods,
3156
+ mn as clearCalibration,
3157
+ Et as createPatchObject,
3158
+ wn as ensureCalibration,
3159
+ Yt as extractErrorMessage,
3160
+ re as findFirstGreaterOrEqual,
3161
+ be as findLastLessOrEqual,
3162
+ un as formatDate,
3163
+ hn as formatDuration,
3164
+ lt as getCSRFToken,
3165
+ pn as getCalibration,
3166
+ yn as getLastBenchmarkDetail,
3167
+ an as getObservationsEndpoint,
3168
+ gn as getOperationTable,
3169
+ we as measureEllapsedTime,
3170
+ dn as onCalibrationChange,
3171
+ ut as requestInterceptor,
3172
+ ht as responseInterceptor,
3173
+ Nr as runBenchmarks,
3174
+ U as shouldUseWorker,
3175
+ fn as subtractHours,
3176
+ te as timeUnitMultipliers
566
3177
  };