@alphacharts/core 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window-WvcPCDkK.js","names":["listeners","onFault","fn","emitFault","f","cache","CACHE_MAX","parseColor","hit","css","v","parse","s","h","c","m","ch","x","a","rgba","out","cssColor","F64_NAN","F32_NAN","U32_ZERO","MIN_CAPACITY","ColumnDeque","specs","capacity","filled","spec","abs","first","hi","lo","front","back","total","spare","frontRoom","b","col","fill","next","newHead","n","LOD_BASE","LOD_O","LOD_H","LOD_L","LOD_C","LOD_COLOR","Lod","src","k","last","level","bFirst","bLast","bucket","A","B","H","L","off","l","i","lv","LH","LL","lo2","top","O","C","COL","any","r0","r1","o","color","r","p","ro","rh","rl","CO","child","CH","CL","CC","CCOL","cb","co","cl","write","empty","Timeline","index","buf","mid","t","assertIncreasing","times","firstIndex","what","COL_O","COL_H","COL_L","COL_C","COL_V","COL_COLOR","COL_BAR_COLOR","SeriesData","shape","j","DataModel","reindexed","rows","normalize","input","snap","snapshotColors","carryColors","placeOnTimeline","touched","targets","tl","sFirst","tlFirstTime","idx","at","concatRows","extract","newFirst","writeRows","sLast","lastTime","appended","st","offset","isTarget","others","union","mergeUnique","same","sameTimes","stableFirst","placeRows","put","dst","time","sc","cols","pad","y","u","ohlcFromObjects","ohlcFromColumns","assertOhlc","valueFromObjects","valueFromColumns","assertFinite","bars","d","points","GLSL_COMMON","GLContext","gl","key","shader","vs","fs","error","prog","uniforms","attribs","type","RECORD_FLOATS","HOLE_X","HOLE_TEST","RECORD_BYTES","RAW_MAX_BARS_PER_PX","chooseLevel","perPx","spacingDev","data","InstanceWindow","zeroBase","compact","u0","u1","visHi","visLo","ua","ub","patchable","len","firstUnit","lastUnit","span","ab","w","log","pb","ohlc","lg","hole","half"],"sources":["../src/fault.ts","../src/render/color.ts","../src/data/deque.ts","../src/data/lod.ts","../src/data/timeline.ts","../src/data/model.ts","../src/render/gl.ts","../src/render/window.ts"],"sourcesContent":["// Fault emitter for the opt-in @alphacharts/report package. Exposed only through\n// \"@alphacharts/core/internal\". With no listener an emit is one size check.\n\nexport type FaultSource = \"draw-loop\" | \"ctor\" | \"context-lost\" | \"context-restored\" | \"shader\";\nexport interface Fault {\n source: FaultSource;\n /** The thrown value; undefined for context events. */\n error: unknown;\n renderer?: \"webgl\" | \"canvas2d\";\n}\n\nconst listeners = new Set<(f: Fault) => void>();\n\nexport function onFault(fn: (f: Fault) => void): () => void {\n listeners.add(fn);\n return () => void listeners.delete(fn);\n}\n\nexport function emitFault(f: Fault): void {\n for (const fn of [...listeners]) {\n try {\n fn(f);\n } catch {\n // a listener must never change what the chart does\n }\n }\n}\n","// Colours as packed 0xRRGGBBAA. Only hex and rgb()/rgba() are accepted: the\n// library has no DOM-free way to resolve named or computed colours, and a\n// colour it cannot read must fail loudly rather than render as black.\n\n// Bounded: per-point colours from live data can be unbounded strings.\nconst cache = new Map<string, number>();\nconst CACHE_MAX = 4096;\n\nexport function parseColor(css: string): number {\n const hit = cache.get(css);\n if (hit !== undefined) return hit;\n const v = parse(css.trim().toLowerCase());\n if (v === undefined) throw new TypeError(`unsupported colour \"${css}\": use #rgb, #rrggbb, #rrggbbaa, rgb() or rgba()`);\n if (cache.size >= CACHE_MAX) cache.clear();\n cache.set(css, v);\n return v;\n}\n\nfunction parse(s: string): number | undefined {\n if (s.startsWith(\"#\")) {\n const h = s.slice(1);\n if (!/^[0-9a-f]+$/.test(h)) return undefined;\n if (h.length === 3 || h.length === 4) {\n const e = [...h].map((c) => c + c).join(\"\");\n return parse(\"#\" + (h.length === 3 ? e + \"ff\" : e));\n }\n if (h.length === 6) return (parseInt(h, 16) * 256 + 255) >>> 0;\n if (h.length === 8) return parseInt(h, 16) >>> 0;\n return undefined;\n }\n const m = /^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)(?:[\\s,/]+([\\d.]+%?))?\\s*\\)$/.exec(s);\n if (!m) return undefined;\n const ch = (x: string) => Math.max(0, Math.min(255, Math.round(+x)));\n let a = 1;\n if (m[4] !== undefined) a = m[4].endsWith(\"%\") ? parseFloat(m[4]) / 100 : +m[4];\n return ((ch(m[1]!) << 24) | (ch(m[2]!) << 16) | (ch(m[3]!) << 8) | Math.round(Math.max(0, Math.min(1, a)) * 255)) >>> 0;\n}\n\n/** Unpack to premultiplied-free [r, g, b, a] in 0..1. */\nexport function rgba(c: number, out: Float32Array = new Float32Array(4)): Float32Array {\n out[0] = ((c >>> 24) & 255) / 255;\n out[1] = ((c >>> 16) & 255) / 255;\n out[2] = ((c >>> 8) & 255) / 255;\n out[3] = (c & 255) / 255;\n return out;\n}\n\nexport function cssColor(c: number): string {\n return `rgba(${(c >>> 24) & 255},${(c >>> 16) & 255},${(c >>> 8) & 255},${((c & 255) / 255).toFixed(3)})`;\n}\n","// Double-ended growable typed-array columns over an absolute index range.\n//\n// Every column shares one range [first, first + length). Element `abs` of a\n// column lives at buffer position `head + (abs - first)`. Growth at either end\n// reserves headroom proportional to the current size, so a run of prepends\n// (history paging) or appends (live bars) is amortised O(1) per element and\n// never copies on every call. Hot loops read the raw buffers through `pos()`\n// instead of per-element accessors.\n\nexport type TypedArray = Float64Array | Float32Array | Uint32Array | Int32Array | Uint8Array;\nexport type ColumnSpec = { readonly ctor: new (length: number) => TypedArray; readonly fill: number };\n\nexport const F64_NAN: ColumnSpec = { ctor: Float64Array, fill: Number.NaN };\nexport const F32_NAN: ColumnSpec = { ctor: Float32Array, fill: Number.NaN };\nexport const U32_ZERO: ColumnSpec = { ctor: Uint32Array, fill: 0 };\nexport const U8_ZERO: ColumnSpec = { ctor: Uint8Array, fill: 0 };\n\nconst MIN_CAPACITY = 64;\n\nexport class ColumnDeque {\n /** Raw buffers, one per column. Replaced on growth: never cache across a write. */\n cols: TypedArray[];\n /** Buffer position of `first`. */\n head = 0;\n /** Absolute index of the first element. */\n first = 0;\n length = 0;\n private capacity: number;\n\n private readonly specs: ColumnSpec[];\n\n constructor(specs: readonly ColumnSpec[], capacity = MIN_CAPACITY) {\n this.specs = [...specs];\n this.capacity = Math.max(MIN_CAPACITY, capacity);\n this.cols = specs.map((s) => filled(s, this.capacity));\n }\n\n /** Add a column over the current range, filled with its fill value. Existing columns and indices are untouched. */\n addColumn(spec: ColumnSpec): number {\n this.specs.push(spec);\n this.cols.push(filled(spec, this.capacity));\n return this.cols.length - 1;\n }\n\n /** Drop the last column (the one `addColumn` returned last). */\n dropColumn(): void {\n this.specs.pop();\n this.cols.pop();\n }\n\n /** One past the last absolute index. */\n get end(): number {\n return this.first + this.length;\n }\n\n /** Buffer position of absolute index `abs` (not bounds-checked). */\n pos(abs: number): number {\n return this.head + (abs - this.first);\n }\n\n has(abs: number): boolean {\n return abs >= this.first && abs < this.first + this.length;\n }\n\n clear(first = 0): void {\n for (let c = 0; c < this.cols.length; c++) {\n const col = this.cols[c]!;\n col.fill(this.specs[c]!.fill, this.head, this.head + this.length);\n }\n this.head = this.capacity >> 1;\n this.first = first;\n this.length = 0;\n }\n\n /**\n * Make [lo, hi) addressable, growing at either end. New slots hold the\n * column's fill value. Existing elements keep their absolute index.\n */\n cover(lo: number, hi: number): void {\n if (this.length === 0) {\n const n = hi - lo;\n // Grow to fit, or give memory back when a large series is replaced by a\n // much smaller one (10M bars → 1k would otherwise keep ~480 MB).\n if (n > this.capacity || this.capacity > Math.max(MIN_CAPACITY * 4, n * 4)) this.realloc(Math.max(MIN_CAPACITY, n + (n >> 1)), n >> 2);\n else this.head = Math.max(0, Math.min(this.capacity - n, (this.capacity - n) >> 1));\n this.first = lo;\n this.length = n;\n return;\n }\n const front = Math.max(0, this.first - lo);\n const back = Math.max(0, hi - this.end);\n if (front === 0 && back === 0) return;\n if (front > this.head || back > this.capacity - this.head - this.length) {\n const total = this.length + front + back;\n const spare = Math.max(MIN_CAPACITY, total >> 1);\n // Headroom goes to the side that is growing; both if both.\n const frontRoom = front > 0 ? (back > 0 ? spare >> 1 : spare) : 0;\n this.realloc(total + spare, frontRoom + front);\n }\n this.head -= front;\n this.first -= front;\n this.length += front + back;\n }\n\n /** Drop everything outside [lo, hi) (used when replacing a series' data). */\n truncate(lo: number, hi: number): void {\n const a = Math.max(lo, this.first);\n const b = Math.min(hi, this.end);\n if (b <= a) {\n this.clear(lo);\n return;\n }\n for (let c = 0; c < this.cols.length; c++) {\n const col = this.cols[c]!;\n const fill = this.specs[c]!.fill;\n col.fill(fill, this.head, this.pos(a));\n col.fill(fill, this.pos(b), this.head + this.length);\n }\n this.head = this.pos(a);\n this.first = a;\n this.length = b - a;\n }\n\n // Old elements land at `newHead`; `cover` then moves head back by `front`.\n private realloc(capacity: number, newHead: number): void {\n const next = this.specs.map((s) => filled(s, capacity));\n for (let c = 0; c < next.length; c++) {\n next[c]!.set(this.cols[c]!.subarray(this.head, this.head + this.length), newHead);\n }\n this.cols = next;\n this.capacity = capacity;\n this.head = newHead;\n }\n}\n\nfunction filled(spec: ColumnSpec, n: number): TypedArray {\n const a = new spec.ctor(n);\n if (spec.fill !== 0) a.fill(spec.fill);\n return a;\n}\n","// Level-of-detail pyramid over one series.\n//\n// Level k aggregates buckets of 2^k consecutive timeline indices, aligned to\n// absolute index (bucket b covers [b·2^k, (b+1)·2^k)), so prepending history\n// only adds buckets at the front and never re-aligns existing ones. A bucket\n// holds open-first, high-max, low-min and close-last of the rows it covers\n// (holes are NaN and skipped), plus the colour of the row that made the high.\n//\n// Levels start at LOD_BASE (8-row buckets). Below that the renderer draws raw\n// rows: at ≤ 8 rows per device pixel overlapping marks already produce the\n// per-pixel min/max a bucket would, and skipping levels 1–2 saves 3/4 of the\n// pyramid's memory. Levels are Float32: they feed pixels and autoscale, never\n// a displayed value (readouts always come from the Float64 rows).\n//\n// minMax(a, b) answers the high/low over any index range in O(log n), which is\n// what lets autoscale follow a pan over 10M bars every frame.\n\nimport { ColumnDeque, F32_NAN, U32_ZERO } from \"./deque.js\";\n\nexport const LOD_BASE = 3;\n\n/** Which source columns hold open/high/low/close (equal for single-value series). */\nexport interface LodSource {\n readonly store: ColumnDeque;\n readonly o: number;\n readonly h: number;\n readonly l: number;\n readonly c: number;\n /** Column of a packed RGBA colour per row, if the series has one. Set when the column is added; the owner then rebuilds the pyramid. */\n color?: number;\n /**\n * Which colour a bucket takes: \"high\" (default) that of the row that made its high; \"any\" the last non-zero colour of\n * its rows, so a highlighted bar still shows when 8 or more bars share a pixel.\n */\n colorMode?: \"high\" | \"any\";\n}\n\nexport const LOD_O = 0;\nexport const LOD_H = 1;\nexport const LOD_L = 2;\nexport const LOD_C = 3;\nexport const LOD_COLOR = 4;\n\nexport class Lod {\n /** levels[i] is level LOD_BASE + i, indexed by bucket number. */\n readonly levels: ColumnDeque[] = [];\n\n constructor(private readonly src: LodSource) {}\n\n get topLevel(): number {\n return LOD_BASE + this.levels.length - 1;\n }\n\n level(k: number): ColumnDeque | undefined {\n return this.levels[k - LOD_BASE];\n }\n\n rebuild(): void {\n this.levels.length = 0;\n const s = this.src.store;\n if (s.length > 0) this.update(s.first, s.end);\n }\n\n /** Recompute every bucket that covers source rows [lo, hi). */\n update(lo: number, hi: number): void {\n const s = this.src.store;\n if (s.length === 0) {\n this.levels.length = 0;\n return;\n }\n lo = Math.max(lo, s.first);\n hi = Math.min(hi, s.end);\n if (hi <= lo) return;\n const last = s.end - 1;\n for (let k = LOD_BASE; ; k++) {\n let level = this.levels[k - LOD_BASE];\n const bFirst = s.first >> k;\n const bLast = last >> k;\n let a = lo >> k;\n let b = (hi - 1) >> k;\n if (!level) {\n level = new ColumnDeque(this.src.color === undefined ? [F32_NAN, F32_NAN, F32_NAN, F32_NAN] : [F32_NAN, F32_NAN, F32_NAN, F32_NAN, U32_ZERO]);\n this.levels.push(level);\n // A new level has no buckets yet: fill all of them.\n a = bFirst;\n b = bLast;\n }\n level.cover(bFirst, bLast + 1);\n for (let bucket = a; bucket <= b; bucket++) {\n if (k === LOD_BASE) this.fromRows(level, bucket, k);\n else this.fromChildren(level, this.levels[k - 1 - LOD_BASE]!, bucket);\n }\n if (bLast - bFirst <= 1) {\n // At most two buckets: minMax reads the top level whole, so anything\n // above is redundant. (Ranges straddling index 0 never reach one\n // bucket: -1 >> k stays -1.)\n this.levels.length = k - LOD_BASE + 1;\n return;\n }\n }\n }\n\n /**\n * High and low over source rows [a, b] (inclusive). Writes [low, high] to\n * `out`; both are NaN when the range holds no rows.\n */\n minMax(a: number, b: number, out: Float64Array): Float64Array {\n const s = this.src.store;\n let lo = Number.POSITIVE_INFINITY;\n let hi = Number.NEGATIVE_INFINITY;\n let A = Math.max(a, s.first);\n let B = Math.min(b, s.end - 1) + 1; // exclusive\n const H = s.cols[this.src.h]!;\n const L = s.cols[this.src.l]!;\n const off = s.head - s.first;\n const step = 1 << LOD_BASE;\n // Raw rows up to the first and from the last 8-aligned boundary.\n while (A < B && (A & (step - 1)) !== 0) {\n const h = H[off + A]!, l = L[off + A]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n A++;\n }\n while (A < B && (B & (step - 1)) !== 0) {\n B--;\n const h = H[off + B]!, l = L[off + B]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n }\n if (A < B && this.levels.length > 0) {\n A >>= LOD_BASE;\n B >>= LOD_BASE;\n for (let i = 0; A < B; i++) {\n const lv = this.levels[i]!;\n const LH = lv.cols[LOD_H]!, LL = lv.cols[LOD_L]!;\n const lo2 = lv.head - lv.first;\n const top = i === this.levels.length - 1;\n // Peel unaligned ends at this level, then climb.\n while (A < B && (top || (A & 1) !== 0)) {\n const h = LH[lo2 + A]!, l = LL[lo2 + A]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n A++;\n }\n while (A < B && (B & 1) !== 0) {\n B--;\n const h = LH[lo2 + B]!, l = LL[lo2 + B]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n }\n A >>= 1;\n B >>= 1;\n }\n } else {\n for (; A < B; A++) {\n const h = H[off + A]!, l = L[off + A]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n }\n }\n out[0] = lo === Number.POSITIVE_INFINITY ? Number.NaN : lo;\n out[1] = hi === Number.NEGATIVE_INFINITY ? Number.NaN : hi;\n return out;\n }\n\n private fromRows(level: ColumnDeque, bucket: number, k: number): void {\n const s = this.src.store;\n const O = s.cols[this.src.o]!, H = s.cols[this.src.h]!, L = s.cols[this.src.l]!, C = s.cols[this.src.c]!;\n const COL = this.src.color === undefined ? undefined : s.cols[this.src.color]!;\n const any = this.src.colorMode === \"any\";\n const off = s.head - s.first;\n const r0 = Math.max(bucket << k, s.first);\n const r1 = Math.min((bucket + 1) << k, s.end);\n let o = Number.NaN, h = Number.NEGATIVE_INFINITY, l = Number.POSITIVE_INFINITY, c = Number.NaN, color = 0;\n for (let r = r0; r < r1; r++) {\n const p = off + r;\n const ro = O[p]!;\n if (ro !== ro) continue; // hole\n if (o !== o) o = ro;\n const rh = H[p]!;\n if (rh > h) {\n h = rh;\n if (COL && !any) color = COL[p]!;\n }\n if (COL && any && COL[p]! !== 0) color = COL[p]!;\n const rl = L[p]!;\n if (rl < l) l = rl;\n c = C[p]!;\n }\n write(level, bucket, o, h, l, c, color);\n }\n\n private fromChildren(level: ColumnDeque, child: ColumnDeque, bucket: number): void {\n let o = Number.NaN, h = Number.NEGATIVE_INFINITY, l = Number.POSITIVE_INFINITY, c = Number.NaN, color = 0;\n const CO = child.cols[LOD_O]!, CH = child.cols[LOD_H]!, CL = child.cols[LOD_L]!, CC = child.cols[LOD_C]!;\n const CCOL = child.cols[LOD_COLOR];\n const any = this.src.colorMode === \"any\";\n for (let cb = bucket << 1; cb <= (bucket << 1) + 1; cb++) {\n if (!child.has(cb)) continue;\n const p = child.pos(cb);\n const co = CO[p]!;\n if (co !== co) continue;\n if (o !== o) o = co;\n const ch = CH[p]!;\n if (ch > h) {\n h = ch;\n if (CCOL && !any) color = CCOL[p]!;\n }\n if (CCOL && any && CCOL[p]! !== 0) color = CCOL[p]!;\n const cl = CL[p]!;\n if (cl < l) l = cl;\n c = CC[p]!;\n }\n write(level, bucket, o, h, l, c, color);\n }\n}\n\nfunction write(level: ColumnDeque, bucket: number, o: number, h: number, l: number, c: number, color: number): void {\n const p = level.pos(bucket);\n const empty = o !== o;\n level.cols[LOD_O]![p] = o;\n level.cols[LOD_H]![p] = empty ? Number.NaN : h;\n level.cols[LOD_L]![p] = empty ? Number.NaN : l;\n level.cols[LOD_C]![p] = c;\n const COL = level.cols[LOD_COLOR];\n if (COL) COL[p] = color;\n}\n","// The chart's shared time axis: the sorted union of every series' bar times,\n// addressed by absolute logical index. The x axis is this index, not time, so\n// gaps (nights, weekends, holidays) take no space. Prepending history lowers\n// `first` instead of renumbering, so existing bars, LOD buckets and the view\n// keep their indices.\n\nimport { ColumnDeque, F64_NAN } from \"./deque.js\";\n\nexport class Timeline {\n private readonly q = new ColumnDeque([F64_NAN]);\n\n get first(): number {\n return this.q.first;\n }\n /** One past the last index. */\n get end(): number {\n return this.q.end;\n }\n get length(): number {\n return this.q.length;\n }\n\n timeAt(index: number): number {\n if (!this.q.has(index)) throw new RangeError(`timeline index ${index} outside [${this.first}, ${this.end})`);\n return this.q.cols[0]![this.q.pos(index)]!;\n }\n\n /** Raw view for hot loops: element `index` is at `buf[offset + index]`. */\n raw(): { buf: Float64Array; offset: number } {\n return { buf: this.q.cols[0] as Float64Array, offset: this.q.head - this.q.first };\n }\n\n /** Smallest index whose time is >= t (`end` if none). */\n lowerBound(t: number): number {\n const buf = this.q.cols[0]!;\n let lo = this.q.head;\n let hi = this.q.head + this.q.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (buf[mid]! < t) lo = mid + 1;\n else hi = mid;\n }\n return lo - this.q.head + this.q.first;\n }\n\n /**\n * The bar containing t: the last index whose time is <= t (bar times are\n * period starts). Undefined when t is before the first bar.\n */\n indexAtOrBefore(t: number): number | undefined {\n if (this.length === 0) return undefined;\n const i = this.lowerBound(t);\n if (i < this.end && this.timeAt(i) === t) return i;\n return i > this.first ? i - 1 : undefined;\n }\n\n /** Index whose time is exactly t, or undefined. */\n indexOf(t: number): number | undefined {\n const i = this.lowerBound(t);\n return i < this.end && this.timeAt(i) === t ? i : undefined;\n }\n\n /** Replace the whole axis with strictly increasing `times`, the first at `firstIndex`. */\n replace(times: ArrayLike<number>, firstIndex: number): void {\n assertIncreasing(times, \"timeline\");\n this.q.clear(firstIndex);\n if (times.length === 0) return;\n this.q.cover(firstIndex, firstIndex + times.length);\n const buf = this.q.cols[0]!;\n const h = this.q.head;\n for (let i = 0; i < times.length; i++) buf[h + i] = times[i]!;\n }\n\n /** Add strictly increasing times, all earlier than the current first. Returns the new first. */\n prepend(times: ArrayLike<number>): number {\n if (times.length === 0) return this.first;\n assertIncreasing(times, \"prepended times\");\n if (this.length > 0 && times[times.length - 1]! >= this.timeAt(this.first)) {\n throw new RangeError(\"prepended times must be earlier than the timeline's first time\");\n }\n const lo = this.first - times.length;\n this.q.cover(lo, this.end);\n const buf = this.q.cols[0]!;\n const h = this.q.head;\n for (let i = 0; i < times.length; i++) buf[h + i] = times[i]!;\n return lo;\n }\n\n /** Append one time later than the current last. Returns its index. */\n append(t: number): number {\n if (this.length > 0 && t <= this.timeAt(this.end - 1)) {\n throw new RangeError(\"appended time must be later than the timeline's last time\");\n }\n const i = this.end;\n this.q.cover(this.first, i + 1);\n this.q.cols[0]![this.q.pos(i)] = t;\n return i;\n }\n}\n\nexport function assertIncreasing(times: ArrayLike<number>, what: string): void {\n for (let i = 0; i < times.length; i++) {\n const t = times[i]!;\n if (!Number.isFinite(t)) throw new TypeError(`${what}: time at ${i} is not a finite number`);\n if (i > 0 && t <= times[i - 1]!) {\n throw new RangeError(`${what}: times must be strictly increasing (row ${i}: ${t} after ${times[i - 1]})`);\n }\n }\n}\n","// The chart's data: one Timeline shared by every series, and per series a\n// dense column store over timeline indices (NaN where the series has no bar at\n// that time) plus its LOD pyramid.\n//\n// Paths, cheapest first:\n// - update(): a live bar. Replaces the series' last bar or appends one;\n// O(log n) for the pyramid. Times may not go backwards.\n// - prepend(): a page of older history. Adds indices below `first`, so nothing\n// already on screen moves; O(page).\n// - setData(): replaces a series. When the timeline is non-empty and every\n// time of the new rows is already on it (and the series' old bars are all\n// kept), only that series is placed: one linear merge walk, O(its rows),\n// nothing else is touched. Otherwise the timeline is rebuilt as the union of\n// all series' times and every other series is re-indexed onto it; O(total).\n// - batch(): setData calls inside defer that union rebuild (one for the whole\n// batch) and every change event to the end. Reads of the timeline or of a\n// deferred series inside the batch see the state before the batch.\n// When prepend/update meet a time that no series has and that falls inside the\n// timeline (another series' gap), they take the setData path; that is a full\n// re-index, not an approximation.\n//\n// Per-bar colour (OHLC series): an optional Uint32 column (0xRRGGBBAA, 0 = the\n// series' own up/down colours) that is added to the store the first time a\n// colour is written, so a series that is never coloured has no such column, no\n// pyramid colour column and no extra work on any path below. A colour belongs\n// to (series, time): update() and prepend() leave the colour of bars they do\n// not name alone, and setData() carries the colours of the times it keeps (rows\n// that bring their own colour win). setColors() writes colours alone, without a\n// data change event the studies would answer by recomputing.\n\nimport { parseColor } from \"../render/color.js\";\nimport { ColumnDeque, F64_NAN, U32_ZERO } from \"./deque.js\";\nimport { Lod, type LodSource } from \"./lod.js\";\nimport { assertIncreasing, Timeline } from \"./timeline.js\";\n\nexport type SeriesShape = \"ohlc\" | \"value\";\n\n/** Times are UTC milliseconds since the epoch. */\nexport interface OhlcBar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n /** Per-bar colour override, CSS colour string; absent leaves the bar's colour as it is. */\n color?: string;\n}\nexport interface ValuePoint {\n time: number;\n value: number;\n /** Per-point colour override, CSS colour string. */\n color?: string;\n}\n/** Zero-copy bulk input: equal-length columns, times strictly increasing. */\nexport interface ColumnarOhlc {\n time: Float64Array;\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n /** Packed 0xRRGGBBAA per bar; 0 means the series colours. Absent leaves the bars' colours as they are. */\n color?: Uint32Array;\n}\n/** Colours alone for bars of an OHLC series, by time (times strictly increasing; a time the series has no bar at is ignored). */\nexport interface ColumnarColors {\n time: Float64Array;\n /** Packed 0xRRGGBBAA; 0 clears the bar back to the series colours. */\n color: Uint32Array;\n}\nexport interface ColumnarValue {\n time: Float64Array;\n value: Float64Array;\n /** Packed 0xRRGGBBAA per point; 0 means the series colour. */\n color?: Uint32Array;\n}\n\nexport type OhlcInput = readonly OhlcBar[] | ColumnarOhlc;\nexport type ValueInput = readonly ValuePoint[] | ColumnarValue;\n\n// Store column layout.\nexport const COL_O = 0, COL_H = 1, COL_L = 2, COL_C = 3;\nexport const COL_V = 0, COL_COLOR = 1;\n/** The optional colour column of an OHLC store, added by `SeriesData.enableColors`. */\nexport const COL_BAR_COLOR = 4;\n\n/** Normalised rows: times plus the store's columns in order. */\ninterface Rows {\n time: Float64Array;\n cols: (Float64Array | Uint32Array)[];\n}\n\n/** \"color\": only bar colours changed (no bar, price or time did): data followers such as studies have nothing to recompute. */\nexport type ChangeKind = \"replace\" | \"prepend\" | \"update\" | \"color\";\n\nexport interface DataChange {\n readonly series: SeriesData | null;\n readonly kind: ChangeKind;\n /** Timeline indices whose bars changed, [lo, hi). */\n readonly lo: number;\n readonly hi: number;\n /** Every index was renumbered (union rebuild). */\n readonly reindexed: boolean;\n /** An index was added at the end of the timeline. */\n readonly appended: boolean;\n}\n\nexport class SeriesData {\n readonly store: ColumnDeque;\n readonly lod: Lod;\n private readonly lodSrc: LodSource;\n /**\n * A value series: whether any point may carry its own colour (set when one is written, cleared when the series is\n * replaced). Conservative: renderers that draw uncoloured series faster read it.\n */\n pointColors = false;\n\n constructor(readonly shape: SeriesShape) {\n this.store =\n shape === \"ohlc\" ? new ColumnDeque([F64_NAN, F64_NAN, F64_NAN, F64_NAN]) : new ColumnDeque([F64_NAN, U32_ZERO]);\n this.lodSrc =\n shape === \"ohlc\"\n ? { store: this.store, o: COL_O, h: COL_H, l: COL_L, c: COL_C, colorMode: \"any\" }\n : { store: this.store, o: COL_V, h: COL_V, l: COL_V, c: COL_V, color: COL_COLOR };\n this.lod = new Lod(this.lodSrc);\n }\n\n /** Whether an OHLC series holds a per-bar colour column. */\n get colored(): boolean {\n return this.shape === \"ohlc\" && this.store.cols.length > COL_BAR_COLOR;\n }\n\n /** Add the colour column (all zero) and the pyramid's colour column. A no-op when present or for a value series. */\n enableColors(): void {\n if (this.shape !== \"ohlc\" || this.colored) return;\n this.store.addColumn(U32_ZERO);\n this.lodSrc.color = COL_BAR_COLOR;\n this.lod.rebuild();\n }\n\n /** Remove the colour column again, giving its memory back. */\n disableColors(): void {\n if (!this.colored) return;\n this.store.dropColumn();\n delete this.lodSrc.color;\n this.lod.rebuild();\n }\n\n /** True when the series has a bar at timeline index i. */\n has(i: number): boolean {\n const s = this.store;\n if (!s.has(i)) return false;\n const v = s.cols[0]![s.pos(i)]!;\n return v === v;\n }\n\n /** Value of column `col` at timeline index i (NaN when absent). */\n get(i: number, col: number): number {\n const s = this.store;\n return s.has(i) ? s.cols[col]![s.pos(i)]! : Number.NaN;\n }\n\n /** First/last timeline index that holds a bar, or undefined when empty. */\n firstIndex(): number | undefined {\n for (let i = this.store.first; i < this.store.end; i++) if (this.has(i)) return i;\n return undefined;\n }\n lastIndex(): number | undefined {\n for (let i = this.store.end - 1; i >= this.store.first; i--) if (this.has(i)) return i;\n return undefined;\n }\n\n /** Nearest index at or before i holding a bar (for crosshair readouts over holes). */\n indexAtOrBefore(i: number): number | undefined {\n for (let j = Math.min(i, this.store.end - 1); j >= this.store.first; j--) if (this.has(j)) return j;\n return undefined;\n }\n}\n\nexport class DataModel {\n readonly timeline = new Timeline();\n private readonly series = new Set<SeriesData>();\n private readonly listeners = new Set<(c: DataChange) => void>();\n private batchDepth = 0;\n /** setData rows inside a batch that need the union rebuild. */\n private readonly deferred = new Map<SeriesData, Rows>();\n /** Series placed or deferred inside the batch, to be announced at its end. */\n private readonly touched = new Set<SeriesData>();\n\n add(shape: SeriesShape): SeriesData {\n const s = new SeriesData(shape);\n this.series.add(s);\n return s;\n }\n\n remove(s: SeriesData): void {\n this.settle();\n if (!this.series.delete(s)) return;\n if (s.store.length > 0) {\n s.store.clear();\n s.lod.rebuild();\n const reindexed = this.rebuild([]);\n this.emit({ series: null, kind: \"replace\", lo: this.timeline.first, hi: this.timeline.end, reindexed, appended: false });\n }\n }\n\n /**\n * Run `fn` with the union rebuild and the change events deferred to its end:\n * adding k series costs one rebuild, not k. Nests; the outermost call\n * settles. Prepend, update and remove settle what is pending first.\n */\n batch<T>(fn: () => T): T {\n this.batchDepth++;\n try {\n return fn();\n } finally {\n if (--this.batchDepth === 0) this.settle();\n }\n }\n\n onChange(fn: (c: DataChange) => void): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n\n setData(s: SeriesData, input: OhlcInput | ValueInput): void {\n this.live(s);\n let rows = normalize(s.shape, input);\n // colours belong to (series, time): the times this call keeps keep theirs\n if (s.colored && rows.cols.length === COL_BAR_COLOR) {\n const snap = snapshotColors(s, this.timeline);\n if (snap) rows = carryColors(rows, snap);\n }\n if (this.batchDepth > 0) {\n this.touched.add(s);\n if (placeOnTimeline(s, rows, this.timeline)) this.deferred.delete(s);\n else this.deferred.set(s, rows);\n return;\n }\n if (placeOnTimeline(s, rows, this.timeline)) {\n this.emit({ series: s, kind: \"replace\", lo: this.timeline.first, hi: this.timeline.end, reindexed: false, appended: false });\n return;\n }\n const reindexed = this.rebuild([[s, rows]]);\n this.emit({ series: s, kind: \"replace\", lo: this.timeline.first, hi: this.timeline.end, reindexed, appended: false });\n }\n\n /** End of a batch (or a prepend/update/remove inside one): rebuild once, announce. */\n private settle(): void {\n if (this.touched.size === 0) return;\n const touched = [...this.touched];\n this.touched.clear();\n let reindexed = false;\n if (this.deferred.size > 0) {\n const targets = [...this.deferred];\n this.deferred.clear();\n reindexed = this.rebuild(targets);\n }\n const tl = this.timeline;\n // One event per series: each observes its own data (decimals) from it.\n for (const s of touched) {\n if (this.series.has(s)) this.emit({ series: s, kind: \"replace\", lo: tl.first, hi: tl.end, reindexed, appended: false });\n }\n }\n\n /** Older bars, all earlier than the series' first bar. */\n prepend(s: SeriesData, input: OhlcInput | ValueInput): void {\n this.settle();\n this.live(s);\n const rows = normalize(s.shape, input);\n const n = rows.time.length;\n if (n === 0) return;\n const tl = this.timeline;\n const sFirst = s.firstIndex();\n if (sFirst !== undefined && rows.time[n - 1]! >= tl.timeAt(sFirst)) {\n throw new RangeError(\"prepend: bars must be earlier than the series' first bar\");\n }\n if (tl.length === 0) {\n this.rebuildAndEmit(s, rows);\n return;\n }\n const tlFirstTime = tl.timeAt(tl.first);\n let m = 0;\n while (m < n && rows.time[m]! < tlFirstTime) m++;\n // Rows at or after the timeline's start must land on existing indices.\n const idx = new Float64Array(n);\n for (let i = m; i < n; i++) {\n const at = tl.indexOf(rows.time[i]!);\n if (at === undefined) {\n this.rebuildAndEmit(s, concatRows(rows, extract(s, tl)));\n return;\n }\n idx[i] = at;\n }\n const newFirst = tl.prepend(rows.time.subarray(0, m));\n for (let i = 0; i < m; i++) idx[i] = newFirst + i;\n const lo = idx[0]!;\n const hi = idx[n - 1]! + 1;\n s.store.cover(lo, Math.max(hi, s.store.length > 0 ? s.store.end : hi));\n writeRows(s, rows, idx);\n s.lod.update(lo, hi);\n this.emit({ series: s, kind: \"prepend\", lo, hi, reindexed: false, appended: false });\n }\n\n /** A live bar: replaces the series' last bar if the time matches, else appends. */\n update(s: SeriesData, input: OhlcBar | ValuePoint): void {\n this.settle();\n this.live(s);\n const rows = normalize(s.shape, [input] as OhlcInput | ValueInput);\n const t = rows.time[0]!;\n const tl = this.timeline;\n const sLast = s.lastIndex();\n if (sLast !== undefined) {\n const lastTime = tl.timeAt(sLast);\n if (t < lastTime) throw new RangeError(`update: time ${t} is earlier than the series' last bar ${lastTime}`);\n }\n let i: number | undefined;\n let appended = false;\n if (tl.length === 0 || t > tl.timeAt(tl.end - 1)) {\n i = tl.append(t);\n appended = true;\n } else {\n i = tl.indexOf(t);\n }\n if (i === undefined) {\n this.rebuildAndEmit(s, concatRows(extract(s, tl), rows));\n return;\n }\n s.store.cover(s.store.length > 0 ? Math.min(s.store.first, i) : i, Math.max(s.store.length > 0 ? s.store.end : 0, i + 1));\n writeRows(s, rows, Float64Array.of(i));\n s.lod.update(i, i + 1);\n this.emit({ series: s, kind: \"update\", lo: i, hi: i + 1, reindexed: false, appended });\n }\n\n /**\n * Write bar colours of an OHLC series without touching its bars. Times the series has no bar at are ignored; a colour\n * equal to the one already there changes nothing and announces nothing. Announces a \"color\" change over the bars that\n * did change (one event), which renderers answer by patching those records.\n */\n setColors(s: SeriesData, input: ColumnarColors): void {\n this.settle();\n this.live(s);\n if (s.shape !== \"ohlc\") throw new TypeError(\"setColors: only an OHLC series (candles, bars) has bar colours\");\n const n = input.time.length;\n if (input.color.length !== n) throw new RangeError(`setColors: color has ${input.color.length} rows, time has ${n}`);\n assertIncreasing(input.time, \"bar colours\");\n if (n === 0) return;\n if (!s.colored) {\n let any = false;\n for (let k = 0; k < n && !any; k++) any = input.color[k]! !== 0;\n if (!any) return;\n s.enableColors();\n }\n const tl = this.timeline;\n const { buf, offset } = tl.raw();\n const st = s.store;\n const C = st.cols[COL_BAR_COLOR] as Uint32Array;\n let lo = Number.POSITIVE_INFINITY, hi = Number.NEGATIVE_INFINITY;\n let j = tl.first;\n for (let k = 0; k < n; k++) {\n const t = input.time[k]!;\n while (j < tl.end && buf[offset + j]! < t) j++;\n if (j >= tl.end) break;\n if (buf[offset + j]! !== t || !s.has(j)) continue;\n const p = st.pos(j);\n if (C[p] === input.color[k]) continue;\n C[p] = input.color[k]!;\n if (j < lo) lo = j;\n if (j > hi) hi = j;\n }\n if (hi < lo) return;\n s.lod.update(lo, hi + 1);\n this.emit({ series: s, kind: \"color\", lo, hi: hi + 1, reindexed: false, appended: false });\n }\n\n /** Remove every bar colour of an OHLC series (and the colour column). Announces one \"color\" change when there were any. */\n clearColors(s: SeriesData): void {\n this.settle();\n this.live(s);\n if (!s.colored) return;\n const st = s.store;\n const C = st.cols[COL_BAR_COLOR] as Uint32Array;\n let lo = Number.POSITIVE_INFINITY, hi = Number.NEGATIVE_INFINITY;\n for (let i = st.first; i < st.end; i++) {\n if (C[st.pos(i)] === 0) continue;\n if (i < lo) lo = i;\n hi = i;\n }\n s.disableColors();\n if (hi < lo) return;\n this.emit({ series: s, kind: \"color\", lo, hi: hi + 1, reindexed: false, appended: false });\n }\n\n private rebuildAndEmit(s: SeriesData, rows: Rows): void {\n const reindexed = this.rebuild([[s, rows]]);\n this.emit({ series: s, kind: \"replace\", lo: this.timeline.first, hi: this.timeline.end, reindexed, appended: false });\n }\n\n /**\n * Replace the targets' rows and rebuild the timeline as the union of every\n * series' times, re-indexing the others only when the union changed. Returns\n * whether the union changed (every index renumbered or added).\n */\n private rebuild(targets: readonly (readonly [SeriesData, Rows])[]): boolean {\n const tl = this.timeline;\n const isTarget = new Set(targets.map(([s]) => s));\n const others: { s: SeriesData; rows: Rows }[] = [];\n for (const o of this.series) if (!isTarget.has(o) && o.store.length > 0) others.push({ s: o, rows: extract(o, tl) });\n\n let union: Float64Array = new Float64Array(0);\n for (const [, rows] of targets) union = mergeUnique(union, rows.time);\n for (const o of others) union = mergeUnique(union, o.rows.time);\n\n const same = union.length === tl.length && sameTimes(union, tl);\n if (!same) tl.replace(union, stableFirst(tl, union));\n\n for (const [s, rows] of targets) placeRows(s, rows, tl);\n if (!same) for (const o of others) placeRows(o.s, o.rows, tl);\n return !same;\n }\n\n /** A removed series must not reshape the timeline the others share. */\n private live(s: SeriesData): void {\n if (!this.series.has(s)) throw new Error(\"alphacharts: this series was removed from its chart\");\n }\n\n private emit(c: DataChange): void {\n for (const fn of this.listeners) fn(c);\n }\n}\n\n/** Re-create a series' store at the indices its times occupy on `tl`. */\nfunction placeRows(s: SeriesData, rows: Rows, tl: Timeline): void {\n s.store.clear();\n if (rows.time.length === 0) {\n s.lod.rebuild();\n return;\n }\n const idx = new Float64Array(rows.time.length);\n const { buf, offset } = tl.raw();\n let j = tl.first;\n for (let i = 0; i < idx.length; i++) {\n const t = rows.time[i]!;\n while (buf[offset + j]! < t) j++;\n idx[i] = j;\n }\n put(s, rows, idx);\n}\n\nfunction put(s: SeriesData, rows: Rows, idx: Float64Array): void {\n s.store.clear();\n s.pointColors = false;\n s.store.cover(idx[0]!, idx[idx.length - 1]! + 1);\n writeRows(s, rows, idx);\n s.lod.rebuild();\n}\n\n/**\n * Fast path of setData: place `rows` on the existing timeline when every time\n * is already on it and every bar the series has now is kept (otherwise the\n * timeline would keep a time nobody holds). One linear merge walk; touches\n * nothing but `s`. False (and nothing changed) when the union must be rebuilt.\n */\nfunction placeOnTimeline(s: SeriesData, rows: Rows, tl: Timeline): boolean {\n const n = rows.time.length;\n if (tl.length === 0 || n === 0) return false;\n const { buf, offset } = tl.raw();\n const idx = new Float64Array(n);\n let j = tl.first;\n for (let i = 0; i < n; i++) {\n const t = rows.time[i]!;\n while (j < tl.end && buf[offset + j]! < t) j++;\n if (j >= tl.end || buf[offset + j]! !== t) return false;\n idx[i] = j;\n }\n const st = s.store;\n if (st.length > 0) {\n let k = 0;\n for (let i = st.first; i < st.end; i++) {\n if (!s.has(i)) continue;\n while (k < n && idx[k]! < i) k++;\n if (k >= n || idx[k] !== i) return false;\n }\n }\n put(s, rows, idx);\n return true;\n}\n\nfunction writeRows(s: SeriesData, rows: Rows, idx: Float64Array): void {\n const st = s.store;\n // rows that bring colours add the column; rows that do not leave the colours of the bars they overwrite\n if (s.shape === \"ohlc\" && rows.cols.length > COL_BAR_COLOR) s.enableColors();\n for (let c = 0; c < rows.cols.length; c++) {\n const dst = st.cols[c]!;\n const src = rows.cols[c]!;\n const off = st.head - st.first;\n for (let i = 0; i < idx.length; i++) dst[off + idx[i]!] = src[i]!;\n if (s.shape === \"value\" && c === COL_COLOR && !s.pointColors) {\n for (let i = 0; i < src.length; i++) if (src[i] !== 0) { s.pointColors = true; break; }\n }\n }\n}\n\n/** The non-zero bar colours of an OHLC series with their times; null when there are none. */\nfunction snapshotColors(s: SeriesData, tl: Timeline): Rows | null {\n const st = s.store;\n const C = st.cols[COL_BAR_COLOR] as Uint32Array;\n let n = 0;\n for (let i = st.first; i < st.end; i++) if (C[st.pos(i)] !== 0 && s.has(i)) n++;\n if (n === 0) return null;\n const time = new Float64Array(n), color = new Uint32Array(n);\n let k = 0;\n for (let i = st.first; i < st.end; i++) {\n if (C[st.pos(i)] === 0 || !s.has(i)) continue;\n time[k] = tl.timeAt(i);\n color[k++] = C[st.pos(i)]!;\n }\n return { time, cols: [color] };\n}\n\n/** `rows` with a colour column: the snapshot's colour at every time it holds, zero elsewhere. */\nfunction carryColors(rows: Rows, snap: Rows): Rows {\n const n = rows.time.length;\n const color = new Uint32Array(n);\n const st = snap.time, sc = snap.cols[0] as Uint32Array;\n let j = 0;\n for (let i = 0; i < n; i++) {\n const t = rows.time[i]!;\n while (j < st.length && st[j]! < t) j++;\n if (j < st.length && st[j] === t) color[i] = sc[j]!;\n }\n return { time: rows.time, cols: [...rows.cols, color] };\n}\n\n/** A series' rows with their times, in index order. */\nfunction extract(s: SeriesData, tl: Timeline): Rows {\n const st = s.store;\n let n = 0;\n for (let i = st.first; i < st.end; i++) if (s.has(i)) n++;\n const time = new Float64Array(n);\n const cols = st.cols.map((c) => new (c.constructor as Float64ArrayConstructor | Uint32ArrayConstructor)(n));\n let k = 0;\n for (let i = st.first; i < st.end; i++) {\n if (!s.has(i)) continue;\n time[k] = tl.timeAt(i);\n const p = st.pos(i);\n for (let c = 0; c < cols.length; c++) cols[c]![k] = st.cols[c]![p]!;\n k++;\n }\n return { time, cols };\n}\n\nfunction concatRows(a: Rows, b: Rows): Rows {\n // one side may carry bar colours and the other not\n if (a.cols.length !== b.cols.length) {\n const pad = (r: Rows): Rows => (r.cols.length === COL_BAR_COLOR ? { time: r.time, cols: [...r.cols, new Uint32Array(r.time.length)] } : r);\n a = pad(a);\n b = pad(b);\n }\n const time = new Float64Array(a.time.length + b.time.length);\n time.set(a.time);\n time.set(b.time, a.time.length);\n const cols = a.cols.map((c, i) => {\n const out = new (c.constructor as Float64ArrayConstructor | Uint32ArrayConstructor)(time.length);\n out.set(c);\n out.set(b.cols[i]!, c.length);\n return out;\n });\n assertIncreasing(time, \"series\");\n return { time, cols };\n}\n\nfunction mergeUnique(a: Float64Array, b: Float64Array): Float64Array {\n if (a.length === 0) return b;\n if (b.length === 0) return a;\n const out = new Float64Array(a.length + b.length);\n let i = 0, j = 0, k = 0;\n while (i < a.length && j < b.length) {\n const x = a[i]!, y = b[j]!;\n if (x < y) (out[k++] = x), i++;\n else if (y < x) (out[k++] = y), j++;\n else (out[k++] = x), i++, j++;\n }\n while (i < a.length) out[k++] = a[i++]!;\n while (j < b.length) out[k++] = b[j++]!;\n return out.subarray(0, k);\n}\n\n/**\n * First index for a rebuilt timeline such that the earliest time present in\n * both the old and new axes keeps its index. Bars before an inserted time\n * keep their indices; only those after it move. With nothing in common (a\n * new instrument), the old first index is kept.\n */\nfunction stableFirst(tl: Timeline, union: Float64Array): number {\n if (tl.length === 0) return 0;\n const { buf, offset } = tl.raw();\n let i = 0, j = tl.first;\n while (i < union.length && j < tl.end) {\n const u = union[i]!, t = buf[offset + j]!;\n if (u === t) return j - i;\n if (u < t) i++;\n else j++;\n }\n return tl.first;\n}\n\nfunction sameTimes(a: Float64Array, tl: Timeline): boolean {\n const { buf, offset } = tl.raw();\n for (let i = 0; i < a.length; i++) if (a[i] !== buf[offset + tl.first + i]) return false;\n return true;\n}\n\nfunction normalize(shape: SeriesShape, input: OhlcInput | ValueInput): Rows {\n if (shape === \"ohlc\") {\n const rows = Array.isArray(input) ? ohlcFromObjects(input as readonly OhlcBar[]) : ohlcFromColumns(input as ColumnarOhlc);\n assertIncreasing(rows.time, \"ohlc data\");\n for (let c = 0; c < 4; c++) assertFinite(rows.cols[c] as Float64Array, [\"open\", \"high\", \"low\", \"close\"][c]!);\n assertOhlc(rows);\n return rows;\n }\n const rows = Array.isArray(input) ? valueFromObjects(input as readonly ValuePoint[]) : valueFromColumns(input as ColumnarValue);\n assertIncreasing(rows.time, \"value data\");\n assertFinite(rows.cols[COL_V] as Float64Array, \"value\");\n return rows;\n}\n\nfunction ohlcFromObjects(bars: readonly OhlcBar[]): Rows {\n const n = bars.length;\n const time = new Float64Array(n), o = new Float64Array(n), h = new Float64Array(n), l = new Float64Array(n), c = new Float64Array(n);\n let color: Uint32Array | undefined;\n for (let i = 0; i < n; i++) {\n const b = bars[i]!;\n time[i] = b.time;\n o[i] = b.open;\n h[i] = b.high;\n l[i] = b.low;\n c[i] = b.close;\n if (b.color !== undefined) (color ??= new Uint32Array(n))[i] = parseColor(b.color);\n }\n return { time, cols: color ? [o, h, l, c, color] : [o, h, l, c] };\n}\n\nfunction ohlcFromColumns(d: ColumnarOhlc): Rows {\n const n = d.time.length;\n for (const k of [\"open\", \"high\", \"low\", \"close\"] as const) {\n if (d[k].length !== n) throw new RangeError(`columnar ohlc: ${k} has ${d[k].length} rows, time has ${n}`);\n }\n if (d.color && d.color.length !== n) throw new RangeError(`columnar ohlc: color has ${d.color.length} rows, time has ${n}`);\n return { time: d.time, cols: d.color ? [d.open, d.high, d.low, d.close, d.color] : [d.open, d.high, d.low, d.close] };\n}\n\nfunction valueFromObjects(points: readonly ValuePoint[]): Rows {\n const n = points.length;\n const time = new Float64Array(n), v = new Float64Array(n), color = new Uint32Array(n);\n for (let i = 0; i < n; i++) {\n const p = points[i]!;\n time[i] = p.time;\n v[i] = p.value;\n if (p.color !== undefined) color[i] = parseColor(p.color);\n }\n return { time, cols: [v, color] };\n}\n\nfunction valueFromColumns(d: ColumnarValue): Rows {\n const n = d.time.length;\n if (d.value.length !== n) throw new RangeError(`columnar value: value has ${d.value.length} rows, time has ${n}`);\n if (d.color && d.color.length !== n) throw new RangeError(`columnar value: color has ${d.color.length} rows, time has ${n}`);\n return { time: d.time, cols: [d.value, d.color ?? new Uint32Array(n)] };\n}\n\n/** low <= open, close <= high on every row: autoscale and LOD rely on it. */\nfunction assertOhlc(rows: Rows): void {\n const [o, h, l, c] = rows.cols as Float64Array[];\n for (let i = 0; i < o!.length; i++) {\n const lo = l![i]!, hi = h![i]!;\n if (!(lo <= o![i]! && lo <= c![i]! && hi >= o![i]! && hi >= c![i]!)) {\n throw new RangeError(`ohlc row ${i} (time ${rows.time[i]}): needs low <= open, close <= high; got o=${o![i]} h=${hi} l=${lo} c=${c![i]}`);\n }\n }\n}\n\nfunction assertFinite(a: Float64Array, what: string): void {\n for (let i = 0; i < a.length; i++) {\n if (!Number.isFinite(a[i]!)) throw new TypeError(`${what} at row ${i} is not a finite number`);\n }\n}\n","// WebGL2 plumbing shared by every series renderer: program compilation and a\n// per-context program cache (so many series of one type share one program).\n\nimport { emitFault } from \"../fault.js\";\n\nexport const GLSL_COMMON = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\n// Pane size in device px.\nuniform vec2 u_view;\n// x_dev = x_rel * u_x.x + u_x.y; y_dev = u_y.y - p_rel * u_y.x (device px, y down).\nuniform vec2 u_x;\nuniform vec2 u_y;\nvec2 toClip(vec2 px) {\n return vec2(px.x / u_view.x * 2.0 - 1.0, 1.0 - px.y / u_view.y * 2.0);\n}\nfloat xDev(float xr) { return xr * u_x.x + u_x.y; }\nfloat yDev(float pr) { return u_y.y - pr * u_y.x; }\n// Corner of a two-triangle quad for vertex v in 0..5: (0,0) (1,0) (0,1) (0,1) (1,0) (1,1).\nvec2 corner(int v) {\n int c = v == 0 ? 0 : v == 1 ? 1 : v == 2 ? 2 : v == 3 ? 2 : v == 4 ? 1 : 3;\n return vec2(float(c & 1), float(c >> 1));\n}\nvec4 unpack(uint c) {\n return vec4(float((c >> 24) & 255u), float((c >> 16) & 255u), float((c >> 8) & 255u), float(c & 255u)) / 255.0;\n}\n`;\n\nexport interface Program {\n readonly program: WebGLProgram;\n readonly uniforms: Record<string, WebGLUniformLocation | null>;\n readonly attribs: Record<string, number>;\n}\n\nexport class GLContext {\n private readonly programs = new Map<string, Program>();\n\n constructor(readonly gl: WebGL2RenderingContext) {}\n\n program(key: string, vs: string, fs: string, uniforms: readonly string[], attribs: readonly string[]): Program {\n const hit = this.programs.get(key);\n if (hit) return hit;\n const gl = this.gl;\n const p = gl.createProgram();\n gl.attachShader(p, shader(gl, gl.VERTEX_SHADER, vs, key));\n gl.attachShader(p, shader(gl, gl.FRAGMENT_SHADER, fs, key));\n gl.linkProgram(p);\n if (!gl.getProgramParameter(p, gl.LINK_STATUS) && !gl.isContextLost()) {\n const error = new Error(`alphacharts: link failed for ${key}: ${gl.getProgramInfoLog(p)}`);\n emitFault({ source: \"shader\", error, renderer: \"webgl\" });\n throw error;\n }\n const prog: Program = {\n program: p,\n uniforms: Object.fromEntries([\"u_view\", \"u_x\", \"u_y\", ...uniforms].map((u) => [u, gl.getUniformLocation(p, u)])),\n attribs: Object.fromEntries(attribs.map((a) => [a, gl.getAttribLocation(p, a)])),\n };\n this.programs.set(key, prog);\n return prog;\n }\n\n /** Forget programs after a context loss; the next program() call recompiles. */\n lost(): void {\n this.programs.clear();\n }\n}\n\nfunction shader(gl: WebGL2RenderingContext, type: number, src: string, key: string): WebGLShader {\n const s = gl.createShader(type)!;\n gl.shaderSource(s, src);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS) && !gl.isContextLost()) {\n const error = new Error(`alphacharts: ${type === gl.VERTEX_SHADER ? \"vertex\" : \"fragment\"} shader ${key}: ${gl.getShaderInfoLog(s)}`);\n emitFault({ source: \"shader\", error, renderer: \"webgl\" });\n throw error;\n }\n return s;\n}\n","// The GPU-side copy of one series: a window of units around the visible range\n// at one level of detail, not the whole series.\n//\n// A unit is a timeline index at level 0, or an LOD bucket above it. Each unit\n// is one record [x, o, h, l, c, color], with x and prices relative to the\n// window's `base` index and `priceBase` (Float64 subtraction, then Float32;\n// log10 first on a log price scale),\n// so a deep zoom near a large price keeps sub-pixel precision. Holes are\n// records (x = HOLE_X); shaders collapse them.\n//\n// The window spans the visible units plus one screen on each side. Panning\n// inside it changes only uniforms. Leaving it, or changing level, re-uploads\n// (a few thousand to ~100k records). A live tick rewrites its one record with\n// bufferSubData.\n//\n// Why a window rather than whole-series buffers: 10M bars × 24 B is 240 MB of\n// GPU memory per series before any LOD level, for data that is never on\n// screen at that level.\n\nimport { LOD_BASE, LOD_C, LOD_COLOR, LOD_H, LOD_L, LOD_O } from \"../data/lod.js\";\nimport type { DataChange, SeriesData } from \"../data/model.js\";\nimport { COL_BAR_COLOR, COL_C, COL_COLOR, COL_H, COL_L, COL_O, COL_V } from \"../data/model.js\";\n\nexport const RECORD_FLOATS = 6;\n/**\n * x of a hole. GLSL ES isnan() is not reliable across drivers, so shaders\n * test `x < HOLE_TEST` instead of reading NaN prices.\n */\nexport const HOLE_X = -1e9;\nexport const HOLE_TEST = \"-1e8\";\nexport const RECORD_BYTES = RECORD_FLOATS * 4;\n\n/** Below this many bars per device px, raw rows are drawn (overlap does the aggregation). */\nconst RAW_MAX_BARS_PER_PX = 8;\n\nexport function chooseLevel(data: SeriesData, spacingDev: number): number {\n const perPx = 1 / spacingDev;\n if (perPx <= RAW_MAX_BARS_PER_PX || data.lod.levels.length === 0) return 0;\n return Math.min(data.lod.topLevel, Math.max(LOD_BASE, Math.floor(Math.log2(perPx))));\n}\n\nexport class InstanceWindow {\n readonly buffer: WebGLBuffer;\n level = -1;\n /** Units [lo, hi] are uploaded. */\n lo = 0;\n hi = -1;\n /** Index coordinate where x_rel = 0, and price where p_rel = 0. */\n base = 0;\n priceBase = 0;\n private f32 = new Float32Array(0);\n private u32 = new Uint32Array(0);\n private stale = true;\n private dirtyLo = Number.POSITIVE_INFINITY;\n private dirtyHi = Number.NEGATIVE_INFINITY;\n /** Records actually uploaded (fewer than units when compacted). */\n private uploaded = 0;\n /** Upload log10 of every price (log price scale). */\n private log = false;\n\n /**\n * `compact`: drop holes from the upload, so a pair renderer (line, area)\n * joins each present point to the next present one. A series whose times\n * are a subset of the shared timeline (another instrument's holidays, a\n * daily level on an intraday chart) has holes that are absence, not breaks.\n */\n constructor(\n private readonly gl: WebGL2RenderingContext,\n private readonly data: SeriesData,\n private readonly zeroBase: boolean,\n private readonly compact = false,\n ) {\n this.buffer = gl.createBuffer();\n }\n\n get count(): number {\n return this.uploaded;\n }\n\n private get units(): number {\n return this.hi >= this.lo ? this.hi - this.lo + 1 : 0;\n }\n\n dataChanged(c: DataChange): void {\n if (c.kind === \"replace\" || c.reindexed) {\n this.stale = true;\n return;\n }\n if (this.level < 0) return;\n const k = this.level;\n const u0 = Math.max(this.lo, c.lo >> k);\n const u1 = Math.min(this.hi, (c.hi - 1) >> k);\n if (u0 > u1) return; // outside the window: picked up when the view gets there\n this.dirtyLo = Math.min(this.dirtyLo, u0);\n this.dirtyHi = Math.max(this.dirtyHi, u1);\n }\n\n /** Make the visible index range [visLo, visHi] drawable at `level`. Binds the buffer. */\n ensure(level: number, visLo: number, visHi: number): void {\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n const st = this.data.store;\n if (st.length === 0 || visHi < visLo) {\n this.hi = this.lo - 1;\n this.uploaded = 0;\n return;\n }\n const ua = visLo >> level;\n const ub = visHi >> level;\n // A compacted window with holes has no unit-to-record mapping to patch.\n const patchable = this.uploaded === this.units;\n if (!this.stale && level === this.level && ua >= this.lo && ub <= this.hi && (patchable || this.dirtyLo > this.dirtyHi)) {\n if (this.dirtyLo <= this.dirtyHi) {\n this.fill(this.dirtyLo, this.dirtyHi);\n const off = (this.dirtyLo - this.lo) * RECORD_FLOATS;\n const len = (this.dirtyHi - this.dirtyLo + 1) * RECORD_FLOATS;\n gl.bufferSubData(gl.ARRAY_BUFFER, off * 4, this.f32, off, len);\n }\n this.dirtyLo = Number.POSITIVE_INFINITY;\n this.dirtyHi = Number.NEGATIVE_INFINITY;\n return;\n }\n const firstUnit = st.first >> level;\n const lastUnit = (st.end - 1) >> level;\n const span = ub - ua + 1;\n this.level = level;\n this.lo = Math.max(firstUnit, ua - span);\n this.hi = Math.min(lastUnit, ub + span);\n this.base = this.lo << level;\n this.priceBase = this.zeroBase ? 0 : this.pickBase();\n let n = this.units;\n if (this.f32.length < n * RECORD_FLOATS) {\n const ab = new ArrayBuffer(Math.ceil(n * 1.5) * RECORD_BYTES);\n this.f32 = new Float32Array(ab);\n this.u32 = new Uint32Array(ab);\n }\n if (n > 0) this.fill(this.lo, this.hi);\n if (this.compact) n = this.squeeze(n);\n this.uploaded = n;\n gl.bufferData(gl.ARRAY_BUFFER, this.f32.subarray(0, n * RECORD_FLOATS), gl.DYNAMIC_DRAW);\n this.stale = false;\n this.dirtyLo = Number.POSITIVE_INFINITY;\n this.dirtyHi = Number.NEGATIVE_INFINITY;\n }\n\n /** Move present records to the front, in order. Returns how many there are. */\n private squeeze(n: number): number {\n const f = this.f32, u = this.u32;\n let w = 0;\n for (let r = 0; r < n; r++) {\n const src = r * RECORD_FLOATS;\n if (f[src]! === HOLE_X) continue;\n if (w !== r) {\n const dst = w * RECORD_FLOATS;\n for (let j = 0; j < RECORD_FLOATS - 1; j++) f[dst + j] = f[src + j]!;\n u[dst + RECORD_FLOATS - 1] = u[src + RECORD_FLOATS - 1]!;\n }\n w++;\n }\n return w;\n }\n\n /** Switch between price and log10(price) coordinates; re-uploads on change. */\n setLog(log: boolean): void {\n if (log !== this.log) {\n this.log = log;\n this.stale = true;\n }\n }\n\n /** Force a full upload on the next ensure() (context restored, options changed). */\n invalidate(): void {\n this.stale = true;\n }\n\n dispose(): void {\n this.gl.deleteBuffer(this.buffer);\n }\n\n private pickBase(): number {\n const d = this.data;\n const mid = ((this.lo + this.hi) >> 1) << this.level;\n const col = d.shape === \"ohlc\" ? COL_C : COL_V;\n const i = d.indexAtOrBefore(Math.min(mid, d.store.end - 1)) ?? d.firstIndex();\n const v = i === undefined ? 0 : d.get(i, col);\n const c = this.log ? Math.log10(v) : v;\n return Number.isFinite(c) ? c : 0;\n }\n\n private fill(u0: number, u1: number): void {\n const f = this.f32, u = this.u32, pb = this.priceBase, k = this.level, d = this.data, log = this.log;\n if (k === 0) {\n const st = d.store;\n const ohlc = d.shape === \"ohlc\";\n const O = st.cols[ohlc ? COL_O : COL_V]!, H = st.cols[ohlc ? COL_H : COL_V]!, L = st.cols[ohlc ? COL_L : COL_V]!, C = st.cols[ohlc ? COL_C : COL_V]!;\n // OHLC bars have a colour column only once something coloured them\n const COL = ohlc ? st.cols[COL_BAR_COLOR] : st.cols[COL_COLOR]!;\n for (let i = u0; i <= u1; i++) {\n const r = (i - this.lo) * RECORD_FLOATS;\n const p = st.head + (i - st.first);\n let o = i >= st.first && i < st.end ? O[p]! : Number.NaN;\n let h = H[p]!, l = L[p]!, c = C[p]!;\n if (log) {\n o = lg(o);\n h = lg(h);\n l = lg(l);\n c = lg(c);\n }\n if (o !== o || h !== h || l !== l || c !== c) {\n hole(f, u, r);\n continue;\n }\n f[r] = i - this.base;\n f[r + 1] = o - pb;\n f[r + 2] = h - pb;\n f[r + 3] = l - pb;\n f[r + 4] = c - pb;\n u[r + 5] = COL ? COL[p]! : 0;\n }\n return;\n }\n const lv = d.lod.level(k)!;\n const O = lv.cols[LOD_O]!, H = lv.cols[LOD_H]!, L = lv.cols[LOD_L]!, C = lv.cols[LOD_C]!, COL = lv.cols[LOD_COLOR];\n const half = ((1 << k) - 1) / 2;\n for (let b = u0; b <= u1; b++) {\n const r = (b - this.lo) * RECORD_FLOATS;\n const p = lv.head + (b - lv.first);\n let o = lv.has(b) ? O[p]! : Number.NaN;\n let h = H[p]!, l = L[p]!, c = C[p]!;\n if (log) {\n o = lg(o);\n h = lg(h);\n l = lg(l);\n c = lg(c);\n }\n if (o !== o || h !== h || l !== l || c !== c) {\n hole(f, u, r);\n continue;\n }\n f[r] = (b << k) + half - this.base;\n f[r + 1] = o - pb;\n f[r + 2] = h - pb;\n f[r + 3] = l - pb;\n f[r + 4] = c - pb;\n u[r + 5] = COL ? COL[p]! : 0;\n }\n }\n}\n\nfunction hole(f: Float32Array, u: Uint32Array, r: number): void {\n f[r] = HOLE_X;\n f[r + 1] = f[r + 2] = f[r + 3] = f[r + 4] = 0;\n u[r + 5] = 0;\n}\n\n/** log10 for a log scale; a non-positive price has no position (a hole). */\nfunction lg(v: number): number {\n return v > 0 ? Math.log10(v) : Number.NaN;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alphacharts/core",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "WebGL2 financial charting engine: candles, lines, histograms, panes, scales, sync, datafeed. No runtime dependencies.",
5
5
  "keywords": [
6
6
  "chart",
@@ -1 +0,0 @@
1
- {"version":3,"file":"window-uK2QNvv5.js","names":["cache","CACHE_MAX","parseColor","hit","css","v","parse","s","h","c","m","ch","x","a","rgba","out","cssColor","F64_NAN","F32_NAN","U32_ZERO","MIN_CAPACITY","ColumnDeque","specs","capacity","filled","abs","first","hi","lo","front","back","total","spare","frontRoom","b","col","fill","next","newHead","spec","n","LOD_BASE","LOD_O","LOD_H","LOD_L","LOD_C","LOD_COLOR","Lod","src","k","last","level","bFirst","bLast","bucket","A","B","H","L","off","l","i","lv","LH","LL","lo2","top","O","C","COL","r0","r1","o","color","r","p","ro","rh","rl","CO","child","CH","CL","CC","CCOL","cb","co","cl","write","empty","Timeline","index","buf","mid","t","assertIncreasing","times","firstIndex","what","COL_O","COL_H","COL_L","COL_C","COL_V","COL_COLOR","SeriesData","shape","j","DataModel","reindexed","fn","rows","normalize","input","placeOnTimeline","touched","targets","tl","sFirst","tlFirstTime","idx","at","concatRows","extract","newFirst","writeRows","sLast","lastTime","appended","isTarget","others","union","mergeUnique","same","sameTimes","stableFirst","placeRows","offset","put","st","dst","time","cols","y","u","ohlcFromObjects","ohlcFromColumns","assertOhlc","valueFromObjects","valueFromColumns","assertFinite","bars","d","points","GLSL_COMMON","GLContext","gl","key","shader","vs","fs","prog","uniforms","attribs","type","RECORD_FLOATS","HOLE_X","HOLE_TEST","RECORD_BYTES","RAW_MAX_BARS_PER_PX","chooseLevel","perPx","spacingDev","data","InstanceWindow","zeroBase","compact","u0","u1","visHi","visLo","ua","ub","patchable","len","firstUnit","lastUnit","span","ab","f","w","log","pb","ohlc","lg","hole","half"],"sources":["../src/render/color.ts","../src/data/deque.ts","../src/data/lod.ts","../src/data/timeline.ts","../src/data/model.ts","../src/render/gl.ts","../src/render/window.ts"],"sourcesContent":["// Colours as packed 0xRRGGBBAA. Only hex and rgb()/rgba() are accepted: the\n// library has no DOM-free way to resolve named or computed colours, and a\n// colour it cannot read must fail loudly rather than render as black.\n\n// Bounded: per-point colours from live data can be unbounded strings.\nconst cache = new Map<string, number>();\nconst CACHE_MAX = 4096;\n\nexport function parseColor(css: string): number {\n const hit = cache.get(css);\n if (hit !== undefined) return hit;\n const v = parse(css.trim().toLowerCase());\n if (v === undefined) throw new TypeError(`unsupported colour \"${css}\": use #rgb, #rrggbb, #rrggbbaa, rgb() or rgba()`);\n if (cache.size >= CACHE_MAX) cache.clear();\n cache.set(css, v);\n return v;\n}\n\nfunction parse(s: string): number | undefined {\n if (s.startsWith(\"#\")) {\n const h = s.slice(1);\n if (!/^[0-9a-f]+$/.test(h)) return undefined;\n if (h.length === 3 || h.length === 4) {\n const e = [...h].map((c) => c + c).join(\"\");\n return parse(\"#\" + (h.length === 3 ? e + \"ff\" : e));\n }\n if (h.length === 6) return (parseInt(h, 16) * 256 + 255) >>> 0;\n if (h.length === 8) return parseInt(h, 16) >>> 0;\n return undefined;\n }\n const m = /^rgba?\\(\\s*([\\d.]+)[\\s,]+([\\d.]+)[\\s,]+([\\d.]+)(?:[\\s,/]+([\\d.]+%?))?\\s*\\)$/.exec(s);\n if (!m) return undefined;\n const ch = (x: string) => Math.max(0, Math.min(255, Math.round(+x)));\n let a = 1;\n if (m[4] !== undefined) a = m[4].endsWith(\"%\") ? parseFloat(m[4]) / 100 : +m[4];\n return ((ch(m[1]!) << 24) | (ch(m[2]!) << 16) | (ch(m[3]!) << 8) | Math.round(Math.max(0, Math.min(1, a)) * 255)) >>> 0;\n}\n\n/** Unpack to premultiplied-free [r, g, b, a] in 0..1. */\nexport function rgba(c: number, out: Float32Array = new Float32Array(4)): Float32Array {\n out[0] = ((c >>> 24) & 255) / 255;\n out[1] = ((c >>> 16) & 255) / 255;\n out[2] = ((c >>> 8) & 255) / 255;\n out[3] = (c & 255) / 255;\n return out;\n}\n\nexport function cssColor(c: number): string {\n return `rgba(${(c >>> 24) & 255},${(c >>> 16) & 255},${(c >>> 8) & 255},${((c & 255) / 255).toFixed(3)})`;\n}\n","// Double-ended growable typed-array columns over an absolute index range.\n//\n// Every column shares one range [first, first + length). Element `abs` of a\n// column lives at buffer position `head + (abs - first)`. Growth at either end\n// reserves headroom proportional to the current size, so a run of prepends\n// (history paging) or appends (live bars) is amortised O(1) per element and\n// never copies on every call. Hot loops read the raw buffers through `pos()`\n// instead of per-element accessors.\n\nexport type TypedArray = Float64Array | Float32Array | Uint32Array | Int32Array | Uint8Array;\nexport type ColumnSpec = { readonly ctor: new (length: number) => TypedArray; readonly fill: number };\n\nexport const F64_NAN: ColumnSpec = { ctor: Float64Array, fill: Number.NaN };\nexport const F32_NAN: ColumnSpec = { ctor: Float32Array, fill: Number.NaN };\nexport const U32_ZERO: ColumnSpec = { ctor: Uint32Array, fill: 0 };\nexport const U8_ZERO: ColumnSpec = { ctor: Uint8Array, fill: 0 };\n\nconst MIN_CAPACITY = 64;\n\nexport class ColumnDeque {\n /** Raw buffers, one per column. Replaced on growth: never cache across a write. */\n cols: TypedArray[];\n /** Buffer position of `first`. */\n head = 0;\n /** Absolute index of the first element. */\n first = 0;\n length = 0;\n private capacity: number;\n\n constructor(private readonly specs: readonly ColumnSpec[], capacity = MIN_CAPACITY) {\n this.capacity = Math.max(MIN_CAPACITY, capacity);\n this.cols = specs.map((s) => filled(s, this.capacity));\n }\n\n /** One past the last absolute index. */\n get end(): number {\n return this.first + this.length;\n }\n\n /** Buffer position of absolute index `abs` (not bounds-checked). */\n pos(abs: number): number {\n return this.head + (abs - this.first);\n }\n\n has(abs: number): boolean {\n return abs >= this.first && abs < this.first + this.length;\n }\n\n clear(first = 0): void {\n for (let c = 0; c < this.cols.length; c++) {\n const col = this.cols[c]!;\n col.fill(this.specs[c]!.fill, this.head, this.head + this.length);\n }\n this.head = this.capacity >> 1;\n this.first = first;\n this.length = 0;\n }\n\n /**\n * Make [lo, hi) addressable, growing at either end. New slots hold the\n * column's fill value. Existing elements keep their absolute index.\n */\n cover(lo: number, hi: number): void {\n if (this.length === 0) {\n const n = hi - lo;\n // Grow to fit, or give memory back when a large series is replaced by a\n // much smaller one (10M bars → 1k would otherwise keep ~480 MB).\n if (n > this.capacity || this.capacity > Math.max(MIN_CAPACITY * 4, n * 4)) this.realloc(Math.max(MIN_CAPACITY, n + (n >> 1)), n >> 2);\n else this.head = Math.max(0, Math.min(this.capacity - n, (this.capacity - n) >> 1));\n this.first = lo;\n this.length = n;\n return;\n }\n const front = Math.max(0, this.first - lo);\n const back = Math.max(0, hi - this.end);\n if (front === 0 && back === 0) return;\n if (front > this.head || back > this.capacity - this.head - this.length) {\n const total = this.length + front + back;\n const spare = Math.max(MIN_CAPACITY, total >> 1);\n // Headroom goes to the side that is growing; both if both.\n const frontRoom = front > 0 ? (back > 0 ? spare >> 1 : spare) : 0;\n this.realloc(total + spare, frontRoom + front);\n }\n this.head -= front;\n this.first -= front;\n this.length += front + back;\n }\n\n /** Drop everything outside [lo, hi) (used when replacing a series' data). */\n truncate(lo: number, hi: number): void {\n const a = Math.max(lo, this.first);\n const b = Math.min(hi, this.end);\n if (b <= a) {\n this.clear(lo);\n return;\n }\n for (let c = 0; c < this.cols.length; c++) {\n const col = this.cols[c]!;\n const fill = this.specs[c]!.fill;\n col.fill(fill, this.head, this.pos(a));\n col.fill(fill, this.pos(b), this.head + this.length);\n }\n this.head = this.pos(a);\n this.first = a;\n this.length = b - a;\n }\n\n // Old elements land at `newHead`; `cover` then moves head back by `front`.\n private realloc(capacity: number, newHead: number): void {\n const next = this.specs.map((s) => filled(s, capacity));\n for (let c = 0; c < next.length; c++) {\n next[c]!.set(this.cols[c]!.subarray(this.head, this.head + this.length), newHead);\n }\n this.cols = next;\n this.capacity = capacity;\n this.head = newHead;\n }\n}\n\nfunction filled(spec: ColumnSpec, n: number): TypedArray {\n const a = new spec.ctor(n);\n if (spec.fill !== 0) a.fill(spec.fill);\n return a;\n}\n","// Level-of-detail pyramid over one series.\n//\n// Level k aggregates buckets of 2^k consecutive timeline indices, aligned to\n// absolute index (bucket b covers [b·2^k, (b+1)·2^k)), so prepending history\n// only adds buckets at the front and never re-aligns existing ones. A bucket\n// holds open-first, high-max, low-min and close-last of the rows it covers\n// (holes are NaN and skipped), plus the colour of the row that made the high.\n//\n// Levels start at LOD_BASE (8-row buckets). Below that the renderer draws raw\n// rows: at ≤ 8 rows per device pixel overlapping marks already produce the\n// per-pixel min/max a bucket would, and skipping levels 1–2 saves 3/4 of the\n// pyramid's memory. Levels are Float32: they feed pixels and autoscale, never\n// a displayed value (readouts always come from the Float64 rows).\n//\n// minMax(a, b) answers the high/low over any index range in O(log n), which is\n// what lets autoscale follow a pan over 10M bars every frame.\n\nimport { ColumnDeque, F32_NAN, U32_ZERO } from \"./deque.js\";\n\nexport const LOD_BASE = 3;\n\n/** Which source columns hold open/high/low/close (equal for single-value series). */\nexport interface LodSource {\n readonly store: ColumnDeque;\n readonly o: number;\n readonly h: number;\n readonly l: number;\n readonly c: number;\n /** Column of a packed RGBA colour per row, if the series has one. */\n readonly color?: number;\n}\n\nexport const LOD_O = 0;\nexport const LOD_H = 1;\nexport const LOD_L = 2;\nexport const LOD_C = 3;\nexport const LOD_COLOR = 4;\n\nexport class Lod {\n /** levels[i] is level LOD_BASE + i, indexed by bucket number. */\n readonly levels: ColumnDeque[] = [];\n\n constructor(private readonly src: LodSource) {}\n\n get topLevel(): number {\n return LOD_BASE + this.levels.length - 1;\n }\n\n level(k: number): ColumnDeque | undefined {\n return this.levels[k - LOD_BASE];\n }\n\n rebuild(): void {\n this.levels.length = 0;\n const s = this.src.store;\n if (s.length > 0) this.update(s.first, s.end);\n }\n\n /** Recompute every bucket that covers source rows [lo, hi). */\n update(lo: number, hi: number): void {\n const s = this.src.store;\n if (s.length === 0) {\n this.levels.length = 0;\n return;\n }\n lo = Math.max(lo, s.first);\n hi = Math.min(hi, s.end);\n if (hi <= lo) return;\n const last = s.end - 1;\n for (let k = LOD_BASE; ; k++) {\n let level = this.levels[k - LOD_BASE];\n const bFirst = s.first >> k;\n const bLast = last >> k;\n let a = lo >> k;\n let b = (hi - 1) >> k;\n if (!level) {\n level = new ColumnDeque(this.src.color === undefined ? [F32_NAN, F32_NAN, F32_NAN, F32_NAN] : [F32_NAN, F32_NAN, F32_NAN, F32_NAN, U32_ZERO]);\n this.levels.push(level);\n // A new level has no buckets yet: fill all of them.\n a = bFirst;\n b = bLast;\n }\n level.cover(bFirst, bLast + 1);\n for (let bucket = a; bucket <= b; bucket++) {\n if (k === LOD_BASE) this.fromRows(level, bucket, k);\n else this.fromChildren(level, this.levels[k - 1 - LOD_BASE]!, bucket);\n }\n if (bLast - bFirst <= 1) {\n // At most two buckets: minMax reads the top level whole, so anything\n // above is redundant. (Ranges straddling index 0 never reach one\n // bucket: -1 >> k stays -1.)\n this.levels.length = k - LOD_BASE + 1;\n return;\n }\n }\n }\n\n /**\n * High and low over source rows [a, b] (inclusive). Writes [low, high] to\n * `out`; both are NaN when the range holds no rows.\n */\n minMax(a: number, b: number, out: Float64Array): Float64Array {\n const s = this.src.store;\n let lo = Number.POSITIVE_INFINITY;\n let hi = Number.NEGATIVE_INFINITY;\n let A = Math.max(a, s.first);\n let B = Math.min(b, s.end - 1) + 1; // exclusive\n const H = s.cols[this.src.h]!;\n const L = s.cols[this.src.l]!;\n const off = s.head - s.first;\n const step = 1 << LOD_BASE;\n // Raw rows up to the first and from the last 8-aligned boundary.\n while (A < B && (A & (step - 1)) !== 0) {\n const h = H[off + A]!, l = L[off + A]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n A++;\n }\n while (A < B && (B & (step - 1)) !== 0) {\n B--;\n const h = H[off + B]!, l = L[off + B]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n }\n if (A < B && this.levels.length > 0) {\n A >>= LOD_BASE;\n B >>= LOD_BASE;\n for (let i = 0; A < B; i++) {\n const lv = this.levels[i]!;\n const LH = lv.cols[LOD_H]!, LL = lv.cols[LOD_L]!;\n const lo2 = lv.head - lv.first;\n const top = i === this.levels.length - 1;\n // Peel unaligned ends at this level, then climb.\n while (A < B && (top || (A & 1) !== 0)) {\n const h = LH[lo2 + A]!, l = LL[lo2 + A]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n A++;\n }\n while (A < B && (B & 1) !== 0) {\n B--;\n const h = LH[lo2 + B]!, l = LL[lo2 + B]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n }\n A >>= 1;\n B >>= 1;\n }\n } else {\n for (; A < B; A++) {\n const h = H[off + A]!, l = L[off + A]!;\n if (h > hi) hi = h;\n if (l < lo) lo = l;\n }\n }\n out[0] = lo === Number.POSITIVE_INFINITY ? Number.NaN : lo;\n out[1] = hi === Number.NEGATIVE_INFINITY ? Number.NaN : hi;\n return out;\n }\n\n private fromRows(level: ColumnDeque, bucket: number, k: number): void {\n const s = this.src.store;\n const O = s.cols[this.src.o]!, H = s.cols[this.src.h]!, L = s.cols[this.src.l]!, C = s.cols[this.src.c]!;\n const COL = this.src.color === undefined ? undefined : s.cols[this.src.color]!;\n const off = s.head - s.first;\n const r0 = Math.max(bucket << k, s.first);\n const r1 = Math.min((bucket + 1) << k, s.end);\n let o = Number.NaN, h = Number.NEGATIVE_INFINITY, l = Number.POSITIVE_INFINITY, c = Number.NaN, color = 0;\n for (let r = r0; r < r1; r++) {\n const p = off + r;\n const ro = O[p]!;\n if (ro !== ro) continue; // hole\n if (o !== o) o = ro;\n const rh = H[p]!;\n if (rh > h) {\n h = rh;\n if (COL) color = COL[p]!;\n }\n const rl = L[p]!;\n if (rl < l) l = rl;\n c = C[p]!;\n }\n write(level, bucket, o, h, l, c, color);\n }\n\n private fromChildren(level: ColumnDeque, child: ColumnDeque, bucket: number): void {\n let o = Number.NaN, h = Number.NEGATIVE_INFINITY, l = Number.POSITIVE_INFINITY, c = Number.NaN, color = 0;\n const CO = child.cols[LOD_O]!, CH = child.cols[LOD_H]!, CL = child.cols[LOD_L]!, CC = child.cols[LOD_C]!;\n const CCOL = child.cols[LOD_COLOR];\n for (let cb = bucket << 1; cb <= (bucket << 1) + 1; cb++) {\n if (!child.has(cb)) continue;\n const p = child.pos(cb);\n const co = CO[p]!;\n if (co !== co) continue;\n if (o !== o) o = co;\n const ch = CH[p]!;\n if (ch > h) {\n h = ch;\n if (CCOL) color = CCOL[p]!;\n }\n const cl = CL[p]!;\n if (cl < l) l = cl;\n c = CC[p]!;\n }\n write(level, bucket, o, h, l, c, color);\n }\n}\n\nfunction write(level: ColumnDeque, bucket: number, o: number, h: number, l: number, c: number, color: number): void {\n const p = level.pos(bucket);\n const empty = o !== o;\n level.cols[LOD_O]![p] = o;\n level.cols[LOD_H]![p] = empty ? Number.NaN : h;\n level.cols[LOD_L]![p] = empty ? Number.NaN : l;\n level.cols[LOD_C]![p] = c;\n const COL = level.cols[LOD_COLOR];\n if (COL) COL[p] = color;\n}\n","// The chart's shared time axis: the sorted union of every series' bar times,\n// addressed by absolute logical index. The x axis is this index, not time, so\n// gaps (nights, weekends, holidays) take no space. Prepending history lowers\n// `first` instead of renumbering, so existing bars, LOD buckets and the view\n// keep their indices.\n\nimport { ColumnDeque, F64_NAN } from \"./deque.js\";\n\nexport class Timeline {\n private readonly q = new ColumnDeque([F64_NAN]);\n\n get first(): number {\n return this.q.first;\n }\n /** One past the last index. */\n get end(): number {\n return this.q.end;\n }\n get length(): number {\n return this.q.length;\n }\n\n timeAt(index: number): number {\n if (!this.q.has(index)) throw new RangeError(`timeline index ${index} outside [${this.first}, ${this.end})`);\n return this.q.cols[0]![this.q.pos(index)]!;\n }\n\n /** Raw view for hot loops: element `index` is at `buf[offset + index]`. */\n raw(): { buf: Float64Array; offset: number } {\n return { buf: this.q.cols[0] as Float64Array, offset: this.q.head - this.q.first };\n }\n\n /** Smallest index whose time is >= t (`end` if none). */\n lowerBound(t: number): number {\n const buf = this.q.cols[0]!;\n let lo = this.q.head;\n let hi = this.q.head + this.q.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (buf[mid]! < t) lo = mid + 1;\n else hi = mid;\n }\n return lo - this.q.head + this.q.first;\n }\n\n /**\n * The bar containing t: the last index whose time is <= t (bar times are\n * period starts). Undefined when t is before the first bar.\n */\n indexAtOrBefore(t: number): number | undefined {\n if (this.length === 0) return undefined;\n const i = this.lowerBound(t);\n if (i < this.end && this.timeAt(i) === t) return i;\n return i > this.first ? i - 1 : undefined;\n }\n\n /** Index whose time is exactly t, or undefined. */\n indexOf(t: number): number | undefined {\n const i = this.lowerBound(t);\n return i < this.end && this.timeAt(i) === t ? i : undefined;\n }\n\n /** Replace the whole axis with strictly increasing `times`, the first at `firstIndex`. */\n replace(times: ArrayLike<number>, firstIndex: number): void {\n assertIncreasing(times, \"timeline\");\n this.q.clear(firstIndex);\n if (times.length === 0) return;\n this.q.cover(firstIndex, firstIndex + times.length);\n const buf = this.q.cols[0]!;\n const h = this.q.head;\n for (let i = 0; i < times.length; i++) buf[h + i] = times[i]!;\n }\n\n /** Add strictly increasing times, all earlier than the current first. Returns the new first. */\n prepend(times: ArrayLike<number>): number {\n if (times.length === 0) return this.first;\n assertIncreasing(times, \"prepended times\");\n if (this.length > 0 && times[times.length - 1]! >= this.timeAt(this.first)) {\n throw new RangeError(\"prepended times must be earlier than the timeline's first time\");\n }\n const lo = this.first - times.length;\n this.q.cover(lo, this.end);\n const buf = this.q.cols[0]!;\n const h = this.q.head;\n for (let i = 0; i < times.length; i++) buf[h + i] = times[i]!;\n return lo;\n }\n\n /** Append one time later than the current last. Returns its index. */\n append(t: number): number {\n if (this.length > 0 && t <= this.timeAt(this.end - 1)) {\n throw new RangeError(\"appended time must be later than the timeline's last time\");\n }\n const i = this.end;\n this.q.cover(this.first, i + 1);\n this.q.cols[0]![this.q.pos(i)] = t;\n return i;\n }\n}\n\nexport function assertIncreasing(times: ArrayLike<number>, what: string): void {\n for (let i = 0; i < times.length; i++) {\n const t = times[i]!;\n if (!Number.isFinite(t)) throw new TypeError(`${what}: time at ${i} is not a finite number`);\n if (i > 0 && t <= times[i - 1]!) {\n throw new RangeError(`${what}: times must be strictly increasing (row ${i}: ${t} after ${times[i - 1]})`);\n }\n }\n}\n","// The chart's data: one Timeline shared by every series, and per series a\n// dense column store over timeline indices (NaN where the series has no bar at\n// that time) plus its LOD pyramid.\n//\n// Paths, cheapest first:\n// - update(): a live bar. Replaces the series' last bar or appends one;\n// O(log n) for the pyramid. Times may not go backwards.\n// - prepend(): a page of older history. Adds indices below `first`, so nothing\n// already on screen moves; O(page).\n// - setData(): replaces a series. When the timeline is non-empty and every\n// time of the new rows is already on it (and the series' old bars are all\n// kept), only that series is placed: one linear merge walk, O(its rows),\n// nothing else is touched. Otherwise the timeline is rebuilt as the union of\n// all series' times and every other series is re-indexed onto it; O(total).\n// - batch(): setData calls inside defer that union rebuild (one for the whole\n// batch) and every change event to the end. Reads of the timeline or of a\n// deferred series inside the batch see the state before the batch.\n// When prepend/update meet a time that no series has and that falls inside the\n// timeline (another series' gap), they take the setData path; that is a full\n// re-index, not an approximation.\n\nimport { parseColor } from \"../render/color.js\";\nimport { ColumnDeque, F64_NAN, U32_ZERO } from \"./deque.js\";\nimport { Lod } from \"./lod.js\";\nimport { assertIncreasing, Timeline } from \"./timeline.js\";\n\nexport type SeriesShape = \"ohlc\" | \"value\";\n\n/** Times are UTC milliseconds since the epoch. */\nexport interface OhlcBar {\n time: number;\n open: number;\n high: number;\n low: number;\n close: number;\n}\nexport interface ValuePoint {\n time: number;\n value: number;\n /** Per-point colour override, CSS colour string. */\n color?: string;\n}\n/** Zero-copy bulk input: equal-length columns, times strictly increasing. */\nexport interface ColumnarOhlc {\n time: Float64Array;\n open: Float64Array;\n high: Float64Array;\n low: Float64Array;\n close: Float64Array;\n}\nexport interface ColumnarValue {\n time: Float64Array;\n value: Float64Array;\n /** Packed 0xRRGGBBAA per point; 0 means the series colour. */\n color?: Uint32Array;\n}\n\nexport type OhlcInput = readonly OhlcBar[] | ColumnarOhlc;\nexport type ValueInput = readonly ValuePoint[] | ColumnarValue;\n\n// Store column layout.\nexport const COL_O = 0, COL_H = 1, COL_L = 2, COL_C = 3;\nexport const COL_V = 0, COL_COLOR = 1;\n\n/** Normalised rows: times plus the store's columns in order. */\ninterface Rows {\n time: Float64Array;\n cols: (Float64Array | Uint32Array)[];\n}\n\nexport type ChangeKind = \"replace\" | \"prepend\" | \"update\";\n\nexport interface DataChange {\n readonly series: SeriesData | null;\n readonly kind: ChangeKind;\n /** Timeline indices whose bars changed, [lo, hi). */\n readonly lo: number;\n readonly hi: number;\n /** Every index was renumbered (union rebuild). */\n readonly reindexed: boolean;\n /** An index was added at the end of the timeline. */\n readonly appended: boolean;\n}\n\nexport class SeriesData {\n readonly store: ColumnDeque;\n readonly lod: Lod;\n\n constructor(readonly shape: SeriesShape) {\n this.store =\n shape === \"ohlc\" ? new ColumnDeque([F64_NAN, F64_NAN, F64_NAN, F64_NAN]) : new ColumnDeque([F64_NAN, U32_ZERO]);\n this.lod =\n shape === \"ohlc\"\n ? new Lod({ store: this.store, o: COL_O, h: COL_H, l: COL_L, c: COL_C })\n : new Lod({ store: this.store, o: COL_V, h: COL_V, l: COL_V, c: COL_V, color: COL_COLOR });\n }\n\n /** True when the series has a bar at timeline index i. */\n has(i: number): boolean {\n const s = this.store;\n if (!s.has(i)) return false;\n const v = s.cols[0]![s.pos(i)]!;\n return v === v;\n }\n\n /** Value of column `col` at timeline index i (NaN when absent). */\n get(i: number, col: number): number {\n const s = this.store;\n return s.has(i) ? s.cols[col]![s.pos(i)]! : Number.NaN;\n }\n\n /** First/last timeline index that holds a bar, or undefined when empty. */\n firstIndex(): number | undefined {\n for (let i = this.store.first; i < this.store.end; i++) if (this.has(i)) return i;\n return undefined;\n }\n lastIndex(): number | undefined {\n for (let i = this.store.end - 1; i >= this.store.first; i--) if (this.has(i)) return i;\n return undefined;\n }\n\n /** Nearest index at or before i holding a bar (for crosshair readouts over holes). */\n indexAtOrBefore(i: number): number | undefined {\n for (let j = Math.min(i, this.store.end - 1); j >= this.store.first; j--) if (this.has(j)) return j;\n return undefined;\n }\n}\n\nexport class DataModel {\n readonly timeline = new Timeline();\n private readonly series = new Set<SeriesData>();\n private readonly listeners = new Set<(c: DataChange) => void>();\n private batchDepth = 0;\n /** setData rows inside a batch that need the union rebuild. */\n private readonly deferred = new Map<SeriesData, Rows>();\n /** Series placed or deferred inside the batch, to be announced at its end. */\n private readonly touched = new Set<SeriesData>();\n\n add(shape: SeriesShape): SeriesData {\n const s = new SeriesData(shape);\n this.series.add(s);\n return s;\n }\n\n remove(s: SeriesData): void {\n this.settle();\n if (!this.series.delete(s)) return;\n if (s.store.length > 0) {\n s.store.clear();\n s.lod.rebuild();\n const reindexed = this.rebuild([]);\n this.emit({ series: null, kind: \"replace\", lo: this.timeline.first, hi: this.timeline.end, reindexed, appended: false });\n }\n }\n\n /**\n * Run `fn` with the union rebuild and the change events deferred to its end:\n * adding k series costs one rebuild, not k. Nests; the outermost call\n * settles. Prepend, update and remove settle what is pending first.\n */\n batch<T>(fn: () => T): T {\n this.batchDepth++;\n try {\n return fn();\n } finally {\n if (--this.batchDepth === 0) this.settle();\n }\n }\n\n onChange(fn: (c: DataChange) => void): () => void {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n\n setData(s: SeriesData, input: OhlcInput | ValueInput): void {\n this.live(s);\n const rows = normalize(s.shape, input);\n if (this.batchDepth > 0) {\n this.touched.add(s);\n if (placeOnTimeline(s, rows, this.timeline)) this.deferred.delete(s);\n else this.deferred.set(s, rows);\n return;\n }\n if (placeOnTimeline(s, rows, this.timeline)) {\n this.emit({ series: s, kind: \"replace\", lo: this.timeline.first, hi: this.timeline.end, reindexed: false, appended: false });\n return;\n }\n const reindexed = this.rebuild([[s, rows]]);\n this.emit({ series: s, kind: \"replace\", lo: this.timeline.first, hi: this.timeline.end, reindexed, appended: false });\n }\n\n /** End of a batch (or a prepend/update/remove inside one): rebuild once, announce. */\n private settle(): void {\n if (this.touched.size === 0) return;\n const touched = [...this.touched];\n this.touched.clear();\n let reindexed = false;\n if (this.deferred.size > 0) {\n const targets = [...this.deferred];\n this.deferred.clear();\n reindexed = this.rebuild(targets);\n }\n const tl = this.timeline;\n // One event per series: each observes its own data (decimals) from it.\n for (const s of touched) {\n if (this.series.has(s)) this.emit({ series: s, kind: \"replace\", lo: tl.first, hi: tl.end, reindexed, appended: false });\n }\n }\n\n /** Older bars, all earlier than the series' first bar. */\n prepend(s: SeriesData, input: OhlcInput | ValueInput): void {\n this.settle();\n this.live(s);\n const rows = normalize(s.shape, input);\n const n = rows.time.length;\n if (n === 0) return;\n const tl = this.timeline;\n const sFirst = s.firstIndex();\n if (sFirst !== undefined && rows.time[n - 1]! >= tl.timeAt(sFirst)) {\n throw new RangeError(\"prepend: bars must be earlier than the series' first bar\");\n }\n if (tl.length === 0) {\n this.rebuildAndEmit(s, rows);\n return;\n }\n const tlFirstTime = tl.timeAt(tl.first);\n let m = 0;\n while (m < n && rows.time[m]! < tlFirstTime) m++;\n // Rows at or after the timeline's start must land on existing indices.\n const idx = new Float64Array(n);\n for (let i = m; i < n; i++) {\n const at = tl.indexOf(rows.time[i]!);\n if (at === undefined) {\n this.rebuildAndEmit(s, concatRows(rows, extract(s, tl)));\n return;\n }\n idx[i] = at;\n }\n const newFirst = tl.prepend(rows.time.subarray(0, m));\n for (let i = 0; i < m; i++) idx[i] = newFirst + i;\n const lo = idx[0]!;\n const hi = idx[n - 1]! + 1;\n s.store.cover(lo, Math.max(hi, s.store.length > 0 ? s.store.end : hi));\n writeRows(s, rows, idx);\n s.lod.update(lo, hi);\n this.emit({ series: s, kind: \"prepend\", lo, hi, reindexed: false, appended: false });\n }\n\n /** A live bar: replaces the series' last bar if the time matches, else appends. */\n update(s: SeriesData, input: OhlcBar | ValuePoint): void {\n this.settle();\n this.live(s);\n const rows = normalize(s.shape, [input] as OhlcInput | ValueInput);\n const t = rows.time[0]!;\n const tl = this.timeline;\n const sLast = s.lastIndex();\n if (sLast !== undefined) {\n const lastTime = tl.timeAt(sLast);\n if (t < lastTime) throw new RangeError(`update: time ${t} is earlier than the series' last bar ${lastTime}`);\n }\n let i: number | undefined;\n let appended = false;\n if (tl.length === 0 || t > tl.timeAt(tl.end - 1)) {\n i = tl.append(t);\n appended = true;\n } else {\n i = tl.indexOf(t);\n }\n if (i === undefined) {\n this.rebuildAndEmit(s, concatRows(extract(s, tl), rows));\n return;\n }\n s.store.cover(s.store.length > 0 ? Math.min(s.store.first, i) : i, Math.max(s.store.length > 0 ? s.store.end : 0, i + 1));\n writeRows(s, rows, Float64Array.of(i));\n s.lod.update(i, i + 1);\n this.emit({ series: s, kind: \"update\", lo: i, hi: i + 1, reindexed: false, appended });\n }\n\n private rebuildAndEmit(s: SeriesData, rows: Rows): void {\n const reindexed = this.rebuild([[s, rows]]);\n this.emit({ series: s, kind: \"replace\", lo: this.timeline.first, hi: this.timeline.end, reindexed, appended: false });\n }\n\n /**\n * Replace the targets' rows and rebuild the timeline as the union of every\n * series' times, re-indexing the others only when the union changed. Returns\n * whether the union changed (every index renumbered or added).\n */\n private rebuild(targets: readonly (readonly [SeriesData, Rows])[]): boolean {\n const tl = this.timeline;\n const isTarget = new Set(targets.map(([s]) => s));\n const others: { s: SeriesData; rows: Rows }[] = [];\n for (const o of this.series) if (!isTarget.has(o) && o.store.length > 0) others.push({ s: o, rows: extract(o, tl) });\n\n let union: Float64Array = new Float64Array(0);\n for (const [, rows] of targets) union = mergeUnique(union, rows.time);\n for (const o of others) union = mergeUnique(union, o.rows.time);\n\n const same = union.length === tl.length && sameTimes(union, tl);\n if (!same) tl.replace(union, stableFirst(tl, union));\n\n for (const [s, rows] of targets) placeRows(s, rows, tl);\n if (!same) for (const o of others) placeRows(o.s, o.rows, tl);\n return !same;\n }\n\n /** A removed series must not reshape the timeline the others share. */\n private live(s: SeriesData): void {\n if (!this.series.has(s)) throw new Error(\"alphacharts: this series was removed from its chart\");\n }\n\n private emit(c: DataChange): void {\n for (const fn of this.listeners) fn(c);\n }\n}\n\n/** Re-create a series' store at the indices its times occupy on `tl`. */\nfunction placeRows(s: SeriesData, rows: Rows, tl: Timeline): void {\n s.store.clear();\n if (rows.time.length === 0) {\n s.lod.rebuild();\n return;\n }\n const idx = new Float64Array(rows.time.length);\n const { buf, offset } = tl.raw();\n let j = tl.first;\n for (let i = 0; i < idx.length; i++) {\n const t = rows.time[i]!;\n while (buf[offset + j]! < t) j++;\n idx[i] = j;\n }\n put(s, rows, idx);\n}\n\nfunction put(s: SeriesData, rows: Rows, idx: Float64Array): void {\n s.store.clear();\n s.store.cover(idx[0]!, idx[idx.length - 1]! + 1);\n writeRows(s, rows, idx);\n s.lod.rebuild();\n}\n\n/**\n * Fast path of setData: place `rows` on the existing timeline when every time\n * is already on it and every bar the series has now is kept (otherwise the\n * timeline would keep a time nobody holds). One linear merge walk; touches\n * nothing but `s`. False (and nothing changed) when the union must be rebuilt.\n */\nfunction placeOnTimeline(s: SeriesData, rows: Rows, tl: Timeline): boolean {\n const n = rows.time.length;\n if (tl.length === 0 || n === 0) return false;\n const { buf, offset } = tl.raw();\n const idx = new Float64Array(n);\n let j = tl.first;\n for (let i = 0; i < n; i++) {\n const t = rows.time[i]!;\n while (j < tl.end && buf[offset + j]! < t) j++;\n if (j >= tl.end || buf[offset + j]! !== t) return false;\n idx[i] = j;\n }\n const st = s.store;\n if (st.length > 0) {\n let k = 0;\n for (let i = st.first; i < st.end; i++) {\n if (!s.has(i)) continue;\n while (k < n && idx[k]! < i) k++;\n if (k >= n || idx[k] !== i) return false;\n }\n }\n put(s, rows, idx);\n return true;\n}\n\nfunction writeRows(s: SeriesData, rows: Rows, idx: Float64Array): void {\n const st = s.store;\n for (let c = 0; c < rows.cols.length; c++) {\n const dst = st.cols[c]!;\n const src = rows.cols[c]!;\n const off = st.head - st.first;\n for (let i = 0; i < idx.length; i++) dst[off + idx[i]!] = src[i]!;\n }\n}\n\n/** A series' rows with their times, in index order. */\nfunction extract(s: SeriesData, tl: Timeline): Rows {\n const st = s.store;\n let n = 0;\n for (let i = st.first; i < st.end; i++) if (s.has(i)) n++;\n const time = new Float64Array(n);\n const cols = st.cols.map((c) => new (c.constructor as Float64ArrayConstructor | Uint32ArrayConstructor)(n));\n let k = 0;\n for (let i = st.first; i < st.end; i++) {\n if (!s.has(i)) continue;\n time[k] = tl.timeAt(i);\n const p = st.pos(i);\n for (let c = 0; c < cols.length; c++) cols[c]![k] = st.cols[c]![p]!;\n k++;\n }\n return { time, cols };\n}\n\nfunction concatRows(a: Rows, b: Rows): Rows {\n const time = new Float64Array(a.time.length + b.time.length);\n time.set(a.time);\n time.set(b.time, a.time.length);\n const cols = a.cols.map((c, i) => {\n const out = new (c.constructor as Float64ArrayConstructor | Uint32ArrayConstructor)(time.length);\n out.set(c);\n out.set(b.cols[i]!, c.length);\n return out;\n });\n assertIncreasing(time, \"series\");\n return { time, cols };\n}\n\nfunction mergeUnique(a: Float64Array, b: Float64Array): Float64Array {\n if (a.length === 0) return b;\n if (b.length === 0) return a;\n const out = new Float64Array(a.length + b.length);\n let i = 0, j = 0, k = 0;\n while (i < a.length && j < b.length) {\n const x = a[i]!, y = b[j]!;\n if (x < y) (out[k++] = x), i++;\n else if (y < x) (out[k++] = y), j++;\n else (out[k++] = x), i++, j++;\n }\n while (i < a.length) out[k++] = a[i++]!;\n while (j < b.length) out[k++] = b[j++]!;\n return out.subarray(0, k);\n}\n\n/**\n * First index for a rebuilt timeline such that the earliest time present in\n * both the old and new axes keeps its index. Bars before an inserted time\n * keep their indices; only those after it move. With nothing in common (a\n * new instrument), the old first index is kept.\n */\nfunction stableFirst(tl: Timeline, union: Float64Array): number {\n if (tl.length === 0) return 0;\n const { buf, offset } = tl.raw();\n let i = 0, j = tl.first;\n while (i < union.length && j < tl.end) {\n const u = union[i]!, t = buf[offset + j]!;\n if (u === t) return j - i;\n if (u < t) i++;\n else j++;\n }\n return tl.first;\n}\n\nfunction sameTimes(a: Float64Array, tl: Timeline): boolean {\n const { buf, offset } = tl.raw();\n for (let i = 0; i < a.length; i++) if (a[i] !== buf[offset + tl.first + i]) return false;\n return true;\n}\n\nfunction normalize(shape: SeriesShape, input: OhlcInput | ValueInput): Rows {\n if (shape === \"ohlc\") {\n const rows = Array.isArray(input) ? ohlcFromObjects(input as readonly OhlcBar[]) : ohlcFromColumns(input as ColumnarOhlc);\n assertIncreasing(rows.time, \"ohlc data\");\n for (let c = 0; c < 4; c++) assertFinite(rows.cols[c] as Float64Array, [\"open\", \"high\", \"low\", \"close\"][c]!);\n assertOhlc(rows);\n return rows;\n }\n const rows = Array.isArray(input) ? valueFromObjects(input as readonly ValuePoint[]) : valueFromColumns(input as ColumnarValue);\n assertIncreasing(rows.time, \"value data\");\n assertFinite(rows.cols[COL_V] as Float64Array, \"value\");\n return rows;\n}\n\nfunction ohlcFromObjects(bars: readonly OhlcBar[]): Rows {\n const n = bars.length;\n const time = new Float64Array(n), o = new Float64Array(n), h = new Float64Array(n), l = new Float64Array(n), c = new Float64Array(n);\n for (let i = 0; i < n; i++) {\n const b = bars[i]!;\n time[i] = b.time;\n o[i] = b.open;\n h[i] = b.high;\n l[i] = b.low;\n c[i] = b.close;\n }\n return { time, cols: [o, h, l, c] };\n}\n\nfunction ohlcFromColumns(d: ColumnarOhlc): Rows {\n const n = d.time.length;\n for (const k of [\"open\", \"high\", \"low\", \"close\"] as const) {\n if (d[k].length !== n) throw new RangeError(`columnar ohlc: ${k} has ${d[k].length} rows, time has ${n}`);\n }\n return { time: d.time, cols: [d.open, d.high, d.low, d.close] };\n}\n\nfunction valueFromObjects(points: readonly ValuePoint[]): Rows {\n const n = points.length;\n const time = new Float64Array(n), v = new Float64Array(n), color = new Uint32Array(n);\n for (let i = 0; i < n; i++) {\n const p = points[i]!;\n time[i] = p.time;\n v[i] = p.value;\n if (p.color !== undefined) color[i] = parseColor(p.color);\n }\n return { time, cols: [v, color] };\n}\n\nfunction valueFromColumns(d: ColumnarValue): Rows {\n const n = d.time.length;\n if (d.value.length !== n) throw new RangeError(`columnar value: value has ${d.value.length} rows, time has ${n}`);\n if (d.color && d.color.length !== n) throw new RangeError(`columnar value: color has ${d.color.length} rows, time has ${n}`);\n return { time: d.time, cols: [d.value, d.color ?? new Uint32Array(n)] };\n}\n\n/** low <= open, close <= high on every row: autoscale and LOD rely on it. */\nfunction assertOhlc(rows: Rows): void {\n const [o, h, l, c] = rows.cols as Float64Array[];\n for (let i = 0; i < o!.length; i++) {\n const lo = l![i]!, hi = h![i]!;\n if (!(lo <= o![i]! && lo <= c![i]! && hi >= o![i]! && hi >= c![i]!)) {\n throw new RangeError(`ohlc row ${i} (time ${rows.time[i]}): needs low <= open, close <= high; got o=${o![i]} h=${hi} l=${lo} c=${c![i]}`);\n }\n }\n}\n\nfunction assertFinite(a: Float64Array, what: string): void {\n for (let i = 0; i < a.length; i++) {\n if (!Number.isFinite(a[i]!)) throw new TypeError(`${what} at row ${i} is not a finite number`);\n }\n}\n","// WebGL2 plumbing shared by every series renderer: program compilation and a\n// per-context program cache (so many series of one type share one program).\n\nexport const GLSL_COMMON = /* glsl */ `#version 300 es\nprecision highp float;\nprecision highp int;\n// Pane size in device px.\nuniform vec2 u_view;\n// x_dev = x_rel * u_x.x + u_x.y; y_dev = u_y.y - p_rel * u_y.x (device px, y down).\nuniform vec2 u_x;\nuniform vec2 u_y;\nvec2 toClip(vec2 px) {\n return vec2(px.x / u_view.x * 2.0 - 1.0, 1.0 - px.y / u_view.y * 2.0);\n}\nfloat xDev(float xr) { return xr * u_x.x + u_x.y; }\nfloat yDev(float pr) { return u_y.y - pr * u_y.x; }\n// Corner of a two-triangle quad for vertex v in 0..5: (0,0) (1,0) (0,1) (0,1) (1,0) (1,1).\nvec2 corner(int v) {\n int c = v == 0 ? 0 : v == 1 ? 1 : v == 2 ? 2 : v == 3 ? 2 : v == 4 ? 1 : 3;\n return vec2(float(c & 1), float(c >> 1));\n}\nvec4 unpack(uint c) {\n return vec4(float((c >> 24) & 255u), float((c >> 16) & 255u), float((c >> 8) & 255u), float(c & 255u)) / 255.0;\n}\n`;\n\nexport interface Program {\n readonly program: WebGLProgram;\n readonly uniforms: Record<string, WebGLUniformLocation | null>;\n readonly attribs: Record<string, number>;\n}\n\nexport class GLContext {\n private readonly programs = new Map<string, Program>();\n\n constructor(readonly gl: WebGL2RenderingContext) {}\n\n program(key: string, vs: string, fs: string, uniforms: readonly string[], attribs: readonly string[]): Program {\n const hit = this.programs.get(key);\n if (hit) return hit;\n const gl = this.gl;\n const p = gl.createProgram();\n gl.attachShader(p, shader(gl, gl.VERTEX_SHADER, vs, key));\n gl.attachShader(p, shader(gl, gl.FRAGMENT_SHADER, fs, key));\n gl.linkProgram(p);\n if (!gl.getProgramParameter(p, gl.LINK_STATUS) && !gl.isContextLost()) {\n throw new Error(`alphacharts: link failed for ${key}: ${gl.getProgramInfoLog(p)}`);\n }\n const prog: Program = {\n program: p,\n uniforms: Object.fromEntries([\"u_view\", \"u_x\", \"u_y\", ...uniforms].map((u) => [u, gl.getUniformLocation(p, u)])),\n attribs: Object.fromEntries(attribs.map((a) => [a, gl.getAttribLocation(p, a)])),\n };\n this.programs.set(key, prog);\n return prog;\n }\n\n /** Forget programs after a context loss; the next program() call recompiles. */\n lost(): void {\n this.programs.clear();\n }\n}\n\nfunction shader(gl: WebGL2RenderingContext, type: number, src: string, key: string): WebGLShader {\n const s = gl.createShader(type)!;\n gl.shaderSource(s, src);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS) && !gl.isContextLost()) {\n throw new Error(`alphacharts: ${type === gl.VERTEX_SHADER ? \"vertex\" : \"fragment\"} shader ${key}: ${gl.getShaderInfoLog(s)}`);\n }\n return s;\n}\n","// The GPU-side copy of one series: a window of units around the visible range\n// at one level of detail, not the whole series.\n//\n// A unit is a timeline index at level 0, or an LOD bucket above it. Each unit\n// is one record [x, o, h, l, c, color], with x and prices relative to the\n// window's `base` index and `priceBase` (Float64 subtraction, then Float32;\n// log10 first on a log price scale),\n// so a deep zoom near a large price keeps sub-pixel precision. Holes are\n// records (x = HOLE_X); shaders collapse them.\n//\n// The window spans the visible units plus one screen on each side. Panning\n// inside it changes only uniforms. Leaving it, or changing level, re-uploads\n// (a few thousand to ~100k records). A live tick rewrites its one record with\n// bufferSubData.\n//\n// Why a window rather than whole-series buffers: 10M bars × 24 B is 240 MB of\n// GPU memory per series before any LOD level, for data that is never on\n// screen at that level.\n\nimport { LOD_BASE, LOD_C, LOD_COLOR, LOD_H, LOD_L, LOD_O } from \"../data/lod.js\";\nimport type { DataChange, SeriesData } from \"../data/model.js\";\nimport { COL_C, COL_COLOR, COL_H, COL_L, COL_O, COL_V } from \"../data/model.js\";\n\nexport const RECORD_FLOATS = 6;\n/**\n * x of a hole. GLSL ES isnan() is not reliable across drivers, so shaders\n * test `x < HOLE_TEST` instead of reading NaN prices.\n */\nexport const HOLE_X = -1e9;\nexport const HOLE_TEST = \"-1e8\";\nexport const RECORD_BYTES = RECORD_FLOATS * 4;\n\n/** Below this many bars per device px, raw rows are drawn (overlap does the aggregation). */\nconst RAW_MAX_BARS_PER_PX = 8;\n\nexport function chooseLevel(data: SeriesData, spacingDev: number): number {\n const perPx = 1 / spacingDev;\n if (perPx <= RAW_MAX_BARS_PER_PX || data.lod.levels.length === 0) return 0;\n return Math.min(data.lod.topLevel, Math.max(LOD_BASE, Math.floor(Math.log2(perPx))));\n}\n\nexport class InstanceWindow {\n readonly buffer: WebGLBuffer;\n level = -1;\n /** Units [lo, hi] are uploaded. */\n lo = 0;\n hi = -1;\n /** Index coordinate where x_rel = 0, and price where p_rel = 0. */\n base = 0;\n priceBase = 0;\n private f32 = new Float32Array(0);\n private u32 = new Uint32Array(0);\n private stale = true;\n private dirtyLo = Number.POSITIVE_INFINITY;\n private dirtyHi = Number.NEGATIVE_INFINITY;\n /** Records actually uploaded (fewer than units when compacted). */\n private uploaded = 0;\n /** Upload log10 of every price (log price scale). */\n private log = false;\n\n /**\n * `compact`: drop holes from the upload, so a pair renderer (line, area)\n * joins each present point to the next present one. A series whose times\n * are a subset of the shared timeline (another instrument's holidays, a\n * daily level on an intraday chart) has holes that are absence, not breaks.\n */\n constructor(\n private readonly gl: WebGL2RenderingContext,\n private readonly data: SeriesData,\n private readonly zeroBase: boolean,\n private readonly compact = false,\n ) {\n this.buffer = gl.createBuffer();\n }\n\n get count(): number {\n return this.uploaded;\n }\n\n private get units(): number {\n return this.hi >= this.lo ? this.hi - this.lo + 1 : 0;\n }\n\n dataChanged(c: DataChange): void {\n if (c.kind === \"replace\" || c.reindexed) {\n this.stale = true;\n return;\n }\n if (this.level < 0) return;\n const k = this.level;\n const u0 = Math.max(this.lo, c.lo >> k);\n const u1 = Math.min(this.hi, (c.hi - 1) >> k);\n if (u0 > u1) return; // outside the window: picked up when the view gets there\n this.dirtyLo = Math.min(this.dirtyLo, u0);\n this.dirtyHi = Math.max(this.dirtyHi, u1);\n }\n\n /** Make the visible index range [visLo, visHi] drawable at `level`. Binds the buffer. */\n ensure(level: number, visLo: number, visHi: number): void {\n const gl = this.gl;\n gl.bindBuffer(gl.ARRAY_BUFFER, this.buffer);\n const st = this.data.store;\n if (st.length === 0 || visHi < visLo) {\n this.hi = this.lo - 1;\n this.uploaded = 0;\n return;\n }\n const ua = visLo >> level;\n const ub = visHi >> level;\n // A compacted window with holes has no unit-to-record mapping to patch.\n const patchable = this.uploaded === this.units;\n if (!this.stale && level === this.level && ua >= this.lo && ub <= this.hi && (patchable || this.dirtyLo > this.dirtyHi)) {\n if (this.dirtyLo <= this.dirtyHi) {\n this.fill(this.dirtyLo, this.dirtyHi);\n const off = (this.dirtyLo - this.lo) * RECORD_FLOATS;\n const len = (this.dirtyHi - this.dirtyLo + 1) * RECORD_FLOATS;\n gl.bufferSubData(gl.ARRAY_BUFFER, off * 4, this.f32, off, len);\n }\n this.dirtyLo = Number.POSITIVE_INFINITY;\n this.dirtyHi = Number.NEGATIVE_INFINITY;\n return;\n }\n const firstUnit = st.first >> level;\n const lastUnit = (st.end - 1) >> level;\n const span = ub - ua + 1;\n this.level = level;\n this.lo = Math.max(firstUnit, ua - span);\n this.hi = Math.min(lastUnit, ub + span);\n this.base = this.lo << level;\n this.priceBase = this.zeroBase ? 0 : this.pickBase();\n let n = this.units;\n if (this.f32.length < n * RECORD_FLOATS) {\n const ab = new ArrayBuffer(Math.ceil(n * 1.5) * RECORD_BYTES);\n this.f32 = new Float32Array(ab);\n this.u32 = new Uint32Array(ab);\n }\n if (n > 0) this.fill(this.lo, this.hi);\n if (this.compact) n = this.squeeze(n);\n this.uploaded = n;\n gl.bufferData(gl.ARRAY_BUFFER, this.f32.subarray(0, n * RECORD_FLOATS), gl.DYNAMIC_DRAW);\n this.stale = false;\n this.dirtyLo = Number.POSITIVE_INFINITY;\n this.dirtyHi = Number.NEGATIVE_INFINITY;\n }\n\n /** Move present records to the front, in order. Returns how many there are. */\n private squeeze(n: number): number {\n const f = this.f32, u = this.u32;\n let w = 0;\n for (let r = 0; r < n; r++) {\n const src = r * RECORD_FLOATS;\n if (f[src]! === HOLE_X) continue;\n if (w !== r) {\n const dst = w * RECORD_FLOATS;\n for (let j = 0; j < RECORD_FLOATS - 1; j++) f[dst + j] = f[src + j]!;\n u[dst + RECORD_FLOATS - 1] = u[src + RECORD_FLOATS - 1]!;\n }\n w++;\n }\n return w;\n }\n\n /** Switch between price and log10(price) coordinates; re-uploads on change. */\n setLog(log: boolean): void {\n if (log !== this.log) {\n this.log = log;\n this.stale = true;\n }\n }\n\n /** Force a full upload on the next ensure() (context restored, options changed). */\n invalidate(): void {\n this.stale = true;\n }\n\n dispose(): void {\n this.gl.deleteBuffer(this.buffer);\n }\n\n private pickBase(): number {\n const d = this.data;\n const mid = ((this.lo + this.hi) >> 1) << this.level;\n const col = d.shape === \"ohlc\" ? COL_C : COL_V;\n const i = d.indexAtOrBefore(Math.min(mid, d.store.end - 1)) ?? d.firstIndex();\n const v = i === undefined ? 0 : d.get(i, col);\n const c = this.log ? Math.log10(v) : v;\n return Number.isFinite(c) ? c : 0;\n }\n\n private fill(u0: number, u1: number): void {\n const f = this.f32, u = this.u32, pb = this.priceBase, k = this.level, d = this.data, log = this.log;\n if (k === 0) {\n const st = d.store;\n const ohlc = d.shape === \"ohlc\";\n const O = st.cols[ohlc ? COL_O : COL_V]!, H = st.cols[ohlc ? COL_H : COL_V]!, L = st.cols[ohlc ? COL_L : COL_V]!, C = st.cols[ohlc ? COL_C : COL_V]!;\n const COL = ohlc ? undefined : st.cols[COL_COLOR]!;\n for (let i = u0; i <= u1; i++) {\n const r = (i - this.lo) * RECORD_FLOATS;\n const p = st.head + (i - st.first);\n let o = i >= st.first && i < st.end ? O[p]! : Number.NaN;\n let h = H[p]!, l = L[p]!, c = C[p]!;\n if (log) {\n o = lg(o);\n h = lg(h);\n l = lg(l);\n c = lg(c);\n }\n if (o !== o || h !== h || l !== l || c !== c) {\n hole(f, u, r);\n continue;\n }\n f[r] = i - this.base;\n f[r + 1] = o - pb;\n f[r + 2] = h - pb;\n f[r + 3] = l - pb;\n f[r + 4] = c - pb;\n u[r + 5] = COL ? COL[p]! : 0;\n }\n return;\n }\n const lv = d.lod.level(k)!;\n const O = lv.cols[LOD_O]!, H = lv.cols[LOD_H]!, L = lv.cols[LOD_L]!, C = lv.cols[LOD_C]!, COL = lv.cols[LOD_COLOR];\n const half = ((1 << k) - 1) / 2;\n for (let b = u0; b <= u1; b++) {\n const r = (b - this.lo) * RECORD_FLOATS;\n const p = lv.head + (b - lv.first);\n let o = lv.has(b) ? O[p]! : Number.NaN;\n let h = H[p]!, l = L[p]!, c = C[p]!;\n if (log) {\n o = lg(o);\n h = lg(h);\n l = lg(l);\n c = lg(c);\n }\n if (o !== o || h !== h || l !== l || c !== c) {\n hole(f, u, r);\n continue;\n }\n f[r] = (b << k) + half - this.base;\n f[r + 1] = o - pb;\n f[r + 2] = h - pb;\n f[r + 3] = l - pb;\n f[r + 4] = c - pb;\n u[r + 5] = COL ? COL[p]! : 0;\n }\n }\n}\n\nfunction hole(f: Float32Array, u: Uint32Array, r: number): void {\n f[r] = HOLE_X;\n f[r + 1] = f[r + 2] = f[r + 3] = f[r + 4] = 0;\n u[r + 5] = 0;\n}\n\n/** log10 for a log scale; a non-positive price has no position (a hole). */\nfunction lg(v: number): number {\n return v > 0 ? Math.log10(v) : Number.NaN;\n}\n"],"mappings":";AAKA,IAAMA,oBAAQ,IAAI,IAAoB,GAChCC,IAAY;AAElB,SAAgBC,EAAW,GAAqB;CAC9C,IAAMC,IAAMH,EAAM,IAAII,CAAG;CACzB,IAAID,MAAQ,KAAA,GAAW,OAAOA;CAC9B,IAAME,IAAIC,EAAMF,EAAI,KAAK,CAAC,CAAC,YAAY,CAAC;CACxC,IAAIC,MAAM,KAAA,GAAW,MAAU,UAAU,uBAAuBD,EAAI,iDAAiD;CAGrH,OAFIJ,EAAM,QAAQC,KAAWD,EAAM,MAAM,GACzCA,EAAM,IAAII,GAAKC,CAAC,GACTA;AACT;AAEA,SAASC,EAAM,GAA+B;CAC5C,IAAIC,EAAE,WAAW,GAAG,GAAG;EACrB,IAAMC,IAAID,EAAE,MAAM,CAAC;EACnB,IAAI,CAAC,cAAc,KAAKC,CAAC,GAAG;EAC5B,IAAIA,EAAE,WAAW,KAAKA,EAAE,WAAW,GAAG;GACpC,IAAM,IAAI,CAAC,GAAGA,CAAC,CAAC,CAAC,KAAK,MAAMC,IAAIA,CAAC,CAAC,CAAC,KAAK,EAAE;GAC1C,OAAOH,EAAM,OAAOE,EAAE,WAAW,IAAI,IAAI,OAAO,EAAE;EACpD;EAGA,OAFIA,EAAE,WAAW,IAAW,SAASA,GAAG,EAAE,IAAI,MAAM,QAAS,IACzDA,EAAE,WAAW,IAAU,SAASA,GAAG,EAAE,MAAM,IAC/C;CACF;CACA,IAAME,IAAI,8EAA8E,KAAKH,CAAC;CAC9F,IAAI,CAACG,GAAG;CACR,IAAMC,KAAM,MAAc,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,CAACC,CAAC,CAAC,CAAC,GAC/DC,IAAI;CAER,OADIH,EAAE,OAAO,KAAA,MAAW,IAAIA,EAAE,EAAE,CAAC,SAAS,GAAG,IAAI,WAAWA,EAAE,EAAE,IAAI,MAAM,CAACA,EAAE,MACpEC,EAAGD,EAAE,EAAG,KAAK,KAAOC,EAAGD,EAAE,EAAG,KAAK,KAAOC,EAAGD,EAAE,EAAG,KAAK,IAAK,KAAK,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGG,CAAC,CAAC,IAAI,GAAG,OAAO;AACxH;AAGA,SAAgBC,EAAK,GAAW,oBAAoB,IAAI,aAAa,CAAC,GAAiB;CAKrF,OAJA,EAAI,MAAOL,MAAM,KAAM,OAAO,KAC9B,EAAI,MAAOA,MAAM,KAAM,OAAO,KAC9B,EAAI,MAAOA,MAAM,IAAK,OAAO,KAC7B,EAAI,MAAMA,IAAI,OAAO,KACdM;AACT;AAEA,SAAgBC,EAAS,GAAmB;CAC1C,OAAO,QAASP,MAAM,KAAM,IAAI,GAAIA,MAAM,KAAM,IAAI,GAAIA,MAAM,IAAK,IAAI,KAAKA,IAAI,OAAO,IAAA,CAAK,QAAQ,CAAC,EAAE;AACzG;;;ACrCA,IAAaQ,IAAsB;CAAE,MAAM;CAAc,MAAM;AAAW,GAC7DC,IAAsB;CAAE,MAAM;CAAc,MAAM;AAAW,GAC7DC,IAAuB;CAAE,MAAM;CAAa,MAAM;AAAE,GAG3DC,IAAe,IAERC,IAAb,MAAyB;CAUM;CAR7B;CAEA,OAAO;CAEP,QAAQ;CACR,SAAS;CACT;CAEA,YAAY,GAA+C,IAAWD,GAAc;EAElF,AAF2B,KAAA,QAAAE,GAC3B,KAAK,WAAW,KAAK,IAAIF,GAAcG,CAAQ,GAC/C,KAAK,OAAOD,EAAM,KAAK,MAAME,EAAOjB,GAAG,KAAK,QAAQ,CAAC;CACvD;CAGA,IAAI,MAAc;EAChB,OAAO,KAAK,QAAQ,KAAK;CAC3B;CAGA,IAAI,GAAqB;EACvB,OAAO,KAAK,QAAQkB,IAAM,KAAK;CACjC;CAEA,IAAI,GAAsB;EACxB,OAAOA,KAAO,KAAK,SAASA,IAAM,KAAK,QAAQ,KAAK;CACtD;CAEA,MAAM,IAAQ,GAAS;EACrB,KAAK,IAAIhB,IAAI,GAAGA,IAAI,KAAK,KAAK,QAAQ,KAEpC,KADiB,KAAKA,EACtB,CAAI,KAAK,KAAK,MAAMA,EAAE,CAAE,MAAM,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM;EAIlE,AAFA,KAAK,OAAO,KAAK,YAAY,GAC7B,KAAK,QAAQiB,GACb,KAAK,SAAS;CAChB;CAMA,MAAM,GAAY,GAAkB;EAClC,IAAI,KAAK,WAAW,GAAG;GACrB,IAAM,IAAIC,IAAKC;GAMf,AAHI,IAAI,KAAK,YAAY,KAAK,WAAW,KAAK,IAAI,KAAkB,IAAI,CAAC,IAAG,KAAK,QAAQ,KAAK,IAAIR,GAAc,KAAK,KAAK,EAAE,GAAG,KAAK,CAAC,IAChI,KAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,WAAW,GAAI,KAAK,WAAW,KAAM,CAAC,CAAC,GAClF,KAAK,QAAQQ,GACb,KAAK,SAAS;GACd;EACF;EACA,IAAMC,IAAQ,KAAK,IAAI,GAAG,KAAK,QAAQD,CAAE,GACnCE,IAAO,KAAK,IAAI,GAAGH,IAAK,KAAK,GAAG;EACtC,IAAIE,MAAU,KAAKC,MAAS,GAC5B;OAAID,IAAQ,KAAK,QAAQC,IAAO,KAAK,WAAW,KAAK,OAAO,KAAK,QAAQ;IACvE,IAAMC,IAAQ,KAAK,SAASF,IAAQC,GAC9BE,IAAQ,KAAK,IAAIZ,GAAcW,KAAS,CAAC,GAEzCE,IAAYJ,IAAQ,IAAKC,IAAO,IAAIE,KAAS,IAAIA,IAAS;IAChE,KAAK,QAAQD,IAAQC,GAAOC,IAAYJ,CAAK;GAC/C;GAGA,AAFA,KAAK,QAAQA,GACb,KAAK,SAASA,GACd,KAAK,UAAUA,IAAQC;EAHvB;CAIF;CAGA,SAAS,GAAY,GAAkB;EACrC,IAAMjB,IAAI,KAAK,IAAIe,GAAI,KAAK,KAAK,GAC3BM,IAAI,KAAK,IAAIP,GAAI,KAAK,GAAG;EAC/B,IAAIO,KAAKrB,GACP,KAAK,MAAMe,CAAE;OAGf;QAAK,IAAInB,IAAI,GAAGA,IAAI,KAAK,KAAK,QAAQ,KAAK;IACzC,IAAM0B,IAAM,KAAK,KAAK1B,IAChB2B,IAAO,KAAK,MAAM3B,EAAE,CAAE;IAE5B,AADA0B,EAAI,KAAKC,GAAM,KAAK,MAAM,KAAK,IAAIvB,CAAC,CAAC,GACrCsB,EAAI,KAAKC,GAAM,KAAK,IAAIF,CAAC,GAAG,KAAK,OAAO,KAAK,MAAM;GACrD;GAGA,AAFA,KAAK,OAAO,KAAK,IAAIrB,CAAC,GACtB,KAAK,QAAQA,GACb,KAAK,SAASqB,IAAIrB;EAHlB;CAIF;CAGA,QAAgB,GAAkB,GAAuB;EACvD,IAAMwB,IAAO,KAAK,MAAM,KAAK,MAAMb,EAAOjB,GAAGgB,CAAQ,CAAC;EACtD,KAAK,IAAId,IAAI,GAAGA,IAAI4B,EAAK,QAAQ,KAC/B,EAAK5B,EAAE,CAAE,IAAI,KAAK,KAAKA,EAAE,CAAE,SAAS,KAAK,MAAM,KAAK,OAAO,KAAK,MAAM,GAAG6B,CAAO;EAIlF,AAFA,KAAK,OAAOD,GACZ,KAAK,WAAWd,GAChB,KAAK,OAAOe;CACd;AACF;AAEA,SAASd,EAAO,GAAkB,GAAuB;CACvD,IAAMX,IAAI,IAAI0B,EAAK,KAAKC,CAAC;CAEzB,OADID,EAAK,SAAS,KAAG1B,EAAE,KAAK0B,EAAK,IAAI,GAC9B1B;AACT;;;ACxGA,IAAa4B,IAAW,GAaXC,IAAQ,GACRC,IAAQ,GACRC,IAAQ,GACRC,IAAQ,GACRC,IAAY,GAEZC,IAAb,MAAiB;CAIc;CAF7B,SAAiC,CAAC;CAElC,YAAY,GAAiC;EAAhB,KAAA,MAAAC;CAAiB;CAE9C,IAAI,WAAmB;EACrB,OAAA,IAAkB,KAAK,OAAO,SAAS;CACzC;CAEA,MAAM,GAAoC;EACxC,OAAO,KAAK,OAAOC,IAAA;CACrB;CAEA,UAAgB;EACd,KAAK,OAAO,SAAS;EACrB,IAAM1C,IAAI,KAAK,IAAI;EACnB,AAAIA,EAAE,SAAS,KAAG,KAAK,OAAOA,EAAE,OAAOA,EAAE,GAAG;CAC9C;CAGA,OAAO,GAAY,GAAkB;EACnC,IAAMA,IAAI,KAAK,IAAI;EACnB,IAAIA,EAAE,WAAW,GAAG;GAClB,KAAK,OAAO,SAAS;GACrB;EACF;EAGA,IAFA,IAAK,KAAK,IAAIqB,GAAIrB,EAAE,KAAK,GACzB,IAAK,KAAK,IAAIoB,GAAIpB,EAAE,GAAG,GACnBoB,KAAMC,GAAI;EACd,IAAMsB,IAAO3C,EAAE,MAAM;EACrB,KAAK,IAAI0C,IAAA,IAAgB,KAAK;GAC5B,IAAIE,IAAQ,KAAK,OAAOF,IAAA,IAClBG,IAAS7C,EAAE,SAAS0C,GACpBI,IAAQH,KAAQD,GAClBpC,IAAIe,KAAMqB,GACVf,IAAKP,IAAK,KAAMsB;GAQpB,AAPKE,MACH,IAAQ,IAAI9B,EAAY,KAAK,IAAI,UAAU,KAAA,IAAY;IAACH;IAASA;IAASA;IAASA;GAAO,IAAI;IAACA;IAASA;IAASA;IAASA;IAASC;GAAQ,CAAC,GAC5I,KAAK,OAAO,KAAKgC,CAAK,GAEtB,IAAIC,GACJ,IAAIC,IAENF,EAAM,MAAMC,GAAQC,IAAQ,CAAC;GAC7B,KAAK,IAAIC,IAASzC,GAAGyC,KAAUpB,GAAG,KAChC,AAAIe,MAAA,IAAgB,KAAK,SAASE,GAAOG,GAAQL,CAAC,IAC7C,KAAK,aAAaE,GAAO,KAAK,OAAOF,IAAI,IAAA,IAAgBK,CAAM;GAEtE,IAAID,IAAQD,KAAU,GAAG;IAIvB,KAAK,OAAO,SAASH,IAAA,IAAe;IACpC;GACF;EACF;CACF;CAMA,OAAO,GAAW,GAAW,GAAiC;EAC5D,IAAM1C,IAAI,KAAK,IAAI,OACfqB,IAAK,UACLD,IAAK,WACL4B,IAAI,KAAK,IAAI1C,GAAGN,EAAE,KAAK,GACvBiD,IAAI,KAAK,IAAItB,GAAG3B,EAAE,MAAM,CAAC,IAAI,GAC3BkD,IAAIlD,EAAE,KAAK,KAAK,IAAI,IACpBmD,IAAInD,EAAE,KAAK,KAAK,IAAI,IACpBoD,IAAMpD,EAAE,OAAOA,EAAE;EAGvB,OAAOgD,IAAIC,KAAMD,IAAK,IAAkB;GACtC,IAAM/C,IAAIiD,EAAEE,IAAMJ,IAAKK,IAAIF,EAAEC,IAAMJ;GAGnC,AAFI/C,IAAImB,MAAI,IAAKnB,IACboD,IAAIhC,MAAI,IAAKgC,IACjB;EACF;EACA,OAAOL,IAAIC,KAAMA,IAAK,IAAkB;GACtC;GACA,IAAMhD,IAAIiD,EAAEE,IAAMH,IAAKI,IAAIF,EAAEC,IAAMH;GAEnC,AADIhD,IAAImB,MAAI,IAAKnB,IACboD,IAAIhC,MAAI,IAAKgC;EACnB;EACA,IAAIL,IAAIC,KAAK,KAAK,OAAO,SAAS,GAAG;GAEnC,AADA,MAAA,GACA,MAAA;GACA,KAAK,IAAIK,IAAI,GAAGN,IAAIC,GAAG,KAAK;IAC1B,IAAMM,IAAK,KAAK,OAAOD,IACjBE,IAAKD,EAAG,KAAA,IAAcE,IAAKF,EAAG,KAAA,IAC9BG,IAAMH,EAAG,OAAOA,EAAG,OACnBI,IAAML,MAAM,KAAK,OAAO,SAAS;IAEvC,OAAON,IAAIC,MAAMU,KAAQX,IAAI,KAAW;KACtC,IAAM/C,IAAIuD,EAAGE,IAAMV,IAAKK,IAAII,EAAGC,IAAMV;KAGrC,AAFI/C,IAAImB,MAAI,IAAKnB,IACboD,IAAIhC,MAAI,IAAKgC,IACjB;IACF;IACA,OAAOL,IAAIC,KAAMA,IAAI,IAAU;KAC7B;KACA,IAAMhD,IAAIuD,EAAGE,IAAMT,IAAKI,IAAII,EAAGC,IAAMT;KAErC,AADIhD,IAAImB,MAAI,IAAKnB,IACboD,IAAIhC,MAAI,IAAKgC;IACnB;IAEA,AADA,MAAM,GACN,MAAM;GACR;EACF,OACE,OAAOL,IAAIC,GAAG,KAAK;GACjB,IAAMhD,IAAIiD,EAAEE,IAAMJ,IAAKK,IAAIF,EAAEC,IAAMJ;GAEnC,AADI/C,IAAImB,MAAI,IAAKnB,IACboD,IAAIhC,MAAI,IAAKgC;EACnB;EAIF,OAFA,EAAI,KAAKhC,MAAO,WAA2B,MAAaA,GACxD,EAAI,KAAKD,MAAO,YAA2B,MAAaA,GACjDZ;CACT;CAEA,SAAiB,GAAoB,GAAgB,GAAiB;EACpE,IAAMR,IAAI,KAAK,IAAI,OACb4D,IAAI5D,EAAE,KAAK,KAAK,IAAI,IAAKkD,IAAIlD,EAAE,KAAK,KAAK,IAAI,IAAKmD,IAAInD,EAAE,KAAK,KAAK,IAAI,IAAK6D,IAAI7D,EAAE,KAAK,KAAK,IAAI,IAC/F8D,IAAM,KAAK,IAAI,UAAU,KAAA,IAAY,KAAA,IAAY9D,EAAE,KAAK,KAAK,IAAI,QACjEoD,IAAMpD,EAAE,OAAOA,EAAE,OACjB+D,IAAK,KAAK,IAAIhB,KAAUL,GAAG1C,EAAE,KAAK,GAClCgE,IAAK,KAAK,IAAKjB,IAAS,KAAML,GAAG1C,EAAE,GAAG,GACxCiE,IAAI,KAAYhE,IAAI,WAA0BoD,IAAI,UAA0BnD,IAAI,KAAYgE,IAAQ;EACxG,KAAK,IAAIC,IAAIJ,GAAII,IAAIH,GAAI,KAAK;GAC5B,IAAMI,IAAIhB,IAAMe,GACVE,IAAKT,EAAEQ;GACb,IAAIC,MAAOA,GAAI;GACf,AAAIJ,MAAMA,MAAG,IAAII;GACjB,IAAMC,IAAKpB,EAAEkB;GACb,AAAIE,IAAKrE,MACP,IAAIqE,GACAR,MAAK,IAAQA,EAAIM;GAEvB,IAAMG,IAAKpB,EAAEiB;GAEb,AADIG,IAAKlB,MAAG,IAAIkB,IAChB,IAAIV,EAAEO;EACR;EACA,EAAMxB,GAAOG,GAAQkB,GAAGhE,GAAGoD,GAAGnD,GAAGgE,CAAK;CACxC;CAEA,aAAqB,GAAoB,GAAoB,GAAsB;EACjF,IAAID,IAAI,KAAYhE,IAAI,WAA0BoD,IAAI,UAA0BnD,IAAI,KAAYgE,IAAQ,GAClGM,IAAKC,EAAM,KAAA,IAAcC,IAAKD,EAAM,KAAA,IAAcE,IAAKF,EAAM,KAAA,IAAcG,IAAKH,EAAM,KAAA,IACtFI,IAAOJ,EAAM,KAAA;EACnB,KAAK,IAAIK,IAAK/B,KAAU,GAAG+B,MAAO/B,KAAU,KAAK,GAAG,KAAM;GACxD,IAAI,CAAC0B,EAAM,IAAIK,CAAE,GAAG;GACpB,IAAMV,IAAIK,EAAM,IAAIK,CAAE,GAChBC,IAAKP,EAAGJ;GACd,IAAIW,MAAOA,GAAI;GACf,AAAId,MAAMA,MAAG,IAAIc;GACjB,IAAM3E,IAAKsE,EAAGN;GACd,AAAIhE,IAAKH,MACP,IAAIG,GACAyE,MAAM,IAAQA,EAAKT;GAEzB,IAAMY,IAAKL,EAAGP;GAEd,AADIY,IAAK3B,MAAG,IAAI2B,IAChB,IAAIJ,EAAGR;EACT;EACA,EAAMxB,GAAOG,GAAQkB,GAAGhE,GAAGoD,GAAGnD,GAAGgE,CAAK;CACxC;AACF;AAEA,SAASe,EAAM,GAAoB,GAAgB,GAAW,GAAW,GAAW,GAAW,GAAqB;CAClH,IAAMb,IAAIxB,EAAM,IAAIG,CAAM,GACpBmC,IAAQjB,MAAMA;CAIpB,AAHA,EAAM,KAAA,EAAW,CAAEG,KAAKH,GACxB,EAAM,KAAA,EAAW,CAAEG,KAAKc,IAAQ,MAAajF,GAC7C,EAAM,KAAA,EAAW,CAAEmE,KAAKc,IAAQ,MAAa7B,GAC7C,EAAM,KAAA,EAAW,CAAEe,KAAKlE;CACxB,IAAM4D,IAAMlB,EAAM,KAAA;CAClB,AAAIkB,MAAK,EAAIM,KAAKF;AACpB;;;ACjNA,IAAaiB,IAAb,MAAsB;CACpB,IAAqB,IAAIrE,EAAY,CAACJ,CAAO,CAAC;CAE9C,IAAI,QAAgB;EAClB,OAAO,KAAK,EAAE;CAChB;CAEA,IAAI,MAAc;EAChB,OAAO,KAAK,EAAE;CAChB;CACA,IAAI,SAAiB;EACnB,OAAO,KAAK,EAAE;CAChB;CAEA,OAAO,GAAuB;EAC5B,IAAI,CAAC,KAAK,EAAE,IAAI0E,CAAK,GAAG,MAAU,WAAW,kBAAkBA,EAAM,YAAY,KAAK,MAAM,IAAI,KAAK,IAAI,EAAE;EAC3G,OAAO,KAAK,EAAE,KAAK,EAAE,CAAE,KAAK,EAAE,IAAIA,CAAK;CACzC;CAGA,MAA6C;EAC3C,OAAO;GAAE,KAAK,KAAK,EAAE,KAAK;GAAoB,QAAQ,KAAK,EAAE,OAAO,KAAK,EAAE;EAAM;CACnF;CAGA,WAAW,GAAmB;EAC5B,IAAMC,IAAM,KAAK,EAAE,KAAK,IACpBhE,IAAK,KAAK,EAAE,MACZD,IAAK,KAAK,EAAE,OAAO,KAAK,EAAE;EAC9B,OAAOC,IAAKD,IAAI;GACd,IAAMkE,IAAOjE,IAAKD,MAAQ;GAC1B,AAAIiE,EAAIC,KAAQC,IAAG,IAAKD,IAAM,IACzB,IAAKA;EACZ;EACA,OAAOjE,IAAK,KAAK,EAAE,OAAO,KAAK,EAAE;CACnC;CAMA,gBAAgB,GAA+B;EAC7C,IAAI,KAAK,WAAW,GAAG;EACvB,IAAMiC,IAAI,KAAK,WAAWiC,CAAC;EAE3B,OADIjC,IAAI,KAAK,OAAO,KAAK,OAAOA,CAAC,MAAMiC,IAAUjC,IAC1CA,IAAI,KAAK,QAAQA,IAAI,IAAI,KAAA;CAClC;CAGA,QAAQ,GAA+B;EACrC,IAAMA,IAAI,KAAK,WAAWiC,CAAC;EAC3B,OAAOjC,IAAI,KAAK,OAAO,KAAK,OAAOA,CAAC,MAAMiC,IAAIjC,IAAI,KAAA;CACpD;CAGA,QAAQ,GAA0B,GAA0B;EAG1D,IAFAkC,EAAiBC,GAAO,UAAU,GAClC,KAAK,EAAE,MAAMC,CAAU,GACnBD,EAAM,WAAW,GAAG;EACxB,KAAK,EAAE,MAAMC,GAAYA,IAAaD,EAAM,MAAM;EAClD,IAAMJ,IAAM,KAAK,EAAE,KAAK,IAClBpF,IAAI,KAAK,EAAE;EACjB,KAAK,IAAIqD,IAAI,GAAGA,IAAImC,EAAM,QAAQ,KAAK,EAAIxF,IAAIqD,KAAKmC,EAAMnC;CAC5D;CAGA,QAAQ,GAAkC;EACxC,IAAImC,EAAM,WAAW,GAAG,OAAO,KAAK;EAEpC,IADAD,EAAiBC,GAAO,iBAAiB,GACrC,KAAK,SAAS,KAAKA,EAAMA,EAAM,SAAS,MAAO,KAAK,OAAO,KAAK,KAAK,GACvE,MAAU,WAAW,gEAAgE;EAEvF,IAAMpE,IAAK,KAAK,QAAQoE,EAAM;EAC9B,KAAK,EAAE,MAAMpE,GAAI,KAAK,GAAG;EACzB,IAAMgE,IAAM,KAAK,EAAE,KAAK,IAClBpF,IAAI,KAAK,EAAE;EACjB,KAAK,IAAIqD,IAAI,GAAGA,IAAImC,EAAM,QAAQ,KAAK,EAAIxF,IAAIqD,KAAKmC,EAAMnC;EAC1D,OAAOjC;CACT;CAGA,OAAO,GAAmB;EACxB,IAAI,KAAK,SAAS,KAAKkE,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC,GAClD,MAAU,WAAW,2DAA2D;EAElF,IAAMjC,IAAI,KAAK;EAGf,OAFA,KAAK,EAAE,MAAM,KAAK,OAAOA,IAAI,CAAC,GAC9B,KAAK,EAAE,KAAK,EAAE,CAAE,KAAK,EAAE,IAAIA,CAAC,KAAKiC,GAC1BjC;CACT;AACF;AAEA,SAAgBkC,EAAiB,GAA0B,GAAoB;CAC7E,KAAK,IAAIlC,IAAI,GAAGA,IAAImC,EAAM,QAAQ,KAAK;EACrC,IAAMF,IAAIE,EAAMnC;EAChB,IAAI,CAAC,OAAO,SAASiC,CAAC,GAAG,MAAU,UAAU,GAAGI,EAAK,YAAYrC,EAAE,wBAAwB;EAC3F,IAAIA,IAAI,KAAKiC,KAAKE,EAAMnC,IAAI,IAC1B,MAAU,WAAW,GAAGqC,EAAK,2CAA2CrC,EAAE,IAAIiC,EAAE,SAASE,EAAMnC,IAAI,GAAG,EAAE;CAE5G;AACF;;;AC/CA,IAAasC,IAAQ,GAAGC,KAAQ,GAAGC,KAAQ,GAAGC,IAAQ,GACzCC,IAAQ,GAAGC,IAAY,GAsBvBC,IAAb,MAAwB;CAID;CAHrB;CACA;CAEA,YAAY,GAA6B;EAGvC,AAHmB,KAAA,QAAAC,GACnB,KAAK,QACHA,MAAU,SAAS,IAAIrF,EAAY;GAACJ;GAASA;GAASA;GAASA;EAAO,CAAC,IAAI,IAAII,EAAY,CAACJ,GAASE,CAAQ,CAAC,GAChH,KAAK,MACHuF,MAAU,SACN,IAAI3D,EAAI;GAAE,OAAO,KAAK;GAAO,GAAA;GAAU,GAAA;GAAU,GAAA;GAAU,GAAA;EAAS,CAAC,IACrE,IAAIA,EAAI;GAAE,OAAO,KAAK;GAAO,GAAA;GAAU,GAAA;GAAU,GAAA;GAAU,GAAA;GAAU,OAAA;EAAiB,CAAC;CAC/F;CAGA,IAAI,GAAoB;EACtB,IAAMxC,IAAI,KAAK;EACf,IAAI,CAACA,EAAE,IAAIsD,CAAC,GAAG,OAAO;EACtB,IAAMxD,IAAIE,EAAE,KAAK,EAAE,CAAEA,EAAE,IAAIsD,CAAC;EAC5B,OAAOxD,MAAMA;CACf;CAGA,IAAI,GAAW,GAAqB;EAClC,IAAME,IAAI,KAAK;EACf,OAAOA,EAAE,IAAIsD,CAAC,IAAItD,EAAE,KAAK4B,EAAI,CAAE5B,EAAE,IAAIsD,CAAC,KAAM;CAC9C;CAGA,aAAiC;EAC/B,KAAK,IAAIA,IAAI,KAAK,MAAM,OAAOA,IAAI,KAAK,MAAM,KAAK,KAAK,IAAI,KAAK,IAAIA,CAAC,GAAG,OAAOA;CAElF;CACA,YAAgC;EAC9B,KAAK,IAAIA,IAAI,KAAK,MAAM,MAAM,GAAGA,KAAK,KAAK,MAAM,OAAO,KAAK,IAAI,KAAK,IAAIA,CAAC,GAAG,OAAOA;CAEvF;CAGA,gBAAgB,GAA+B;EAC7C,KAAK,IAAI8C,IAAI,KAAK,IAAI9C,GAAG,KAAK,MAAM,MAAM,CAAC,GAAG8C,KAAK,KAAK,MAAM,OAAO,KAAK,IAAI,KAAK,IAAIA,CAAC,GAAG,OAAOA;CAEpG;AACF,GAEaC,IAAb,MAAuB;CACrB,WAAoB,IAAIlB,EAAS;CACjC,yBAA0B,IAAI,IAAgB;CAC9C,4BAA6B,IAAI,IAA6B;CAC9D,aAAqB;CAErB,2BAA4B,IAAI,IAAsB;CAEtD,0BAA2B,IAAI,IAAgB;CAE/C,IAAI,GAAgC;EAClC,IAAMnF,IAAI,IAAIkG,EAAWC,CAAK;EAE9B,OADA,KAAK,OAAO,IAAInG,CAAC,GACVA;CACT;CAEA,OAAO,GAAqB;EAE1B,IADA,KAAK,OAAO,GACP,KAAK,OAAO,OAAOA,CAAC,KACrBA,EAAE,MAAM,SAAS,GAAG;GAEtB,AADAA,EAAE,MAAM,MAAM,GACdA,EAAE,IAAI,QAAQ;GACd,IAAMsG,IAAY,KAAK,QAAQ,CAAC,CAAC;GACjC,KAAK,KAAK;IAAE,QAAQ;IAAM,MAAM;IAAW,IAAI,KAAK,SAAS;IAAO,IAAI,KAAK,SAAS;IAAK;IAAW,UAAU;GAAM,CAAC;EACzH;CACF;CAOA,MAAS,GAAgB;EACvB,KAAK;EACL,IAAI;GACF,OAAOC,EAAG;EACZ,UAAU;GACR,AAAI,EAAE,KAAK,eAAe,KAAG,KAAK,OAAO;EAC3C;CACF;CAEA,SAAS,GAAyC;EAEhD,OADA,KAAK,UAAU,IAAIA,CAAE,SACR,KAAK,UAAU,OAAOA,CAAE;CACvC;CAEA,QAAQ,GAAe,GAAqC;EAC1D,KAAK,KAAKvG,CAAC;EACX,IAAMwG,IAAOC,EAAUzG,EAAE,OAAO0G,CAAK;EACrC,IAAI,KAAK,aAAa,GAAG;GAEvB,AADA,KAAK,QAAQ,IAAI1G,CAAC,GACd2G,EAAgB3G,GAAGwG,GAAM,KAAK,QAAQ,IAAG,KAAK,SAAS,OAAOxG,CAAC,IAC9D,KAAK,SAAS,IAAIA,GAAGwG,CAAI;GAC9B;EACF;EACA,IAAIG,EAAgB3G,GAAGwG,GAAM,KAAK,QAAQ,GAAG;GAC3C,KAAK,KAAK;IAAE,QAAQxG;IAAG,MAAM;IAAW,IAAI,KAAK,SAAS;IAAO,IAAI,KAAK,SAAS;IAAK,WAAW;IAAO,UAAU;GAAM,CAAC;GAC3H;EACF;EACA,IAAMsG,IAAY,KAAK,QAAQ,CAAC,CAACtG,GAAGwG,CAAI,CAAC,CAAC;EAC1C,KAAK,KAAK;GAAE,QAAQxG;GAAG,MAAM;GAAW,IAAI,KAAK,SAAS;GAAO,IAAI,KAAK,SAAS;GAAK;GAAW,UAAU;EAAM,CAAC;CACtH;CAGA,SAAuB;EACrB,IAAI,KAAK,QAAQ,SAAS,GAAG;EAC7B,IAAM4G,IAAU,CAAC,GAAG,KAAK,OAAO;EAChC,KAAK,QAAQ,MAAM;EACnB,IAAIN,IAAY;EAChB,IAAI,KAAK,SAAS,OAAO,GAAG;GAC1B,IAAMO,IAAU,CAAC,GAAG,KAAK,QAAQ;GAEjC,AADA,KAAK,SAAS,MAAM,GACpB,IAAY,KAAK,QAAQA,CAAO;EAClC;EACA,IAAMC,IAAK,KAAK;EAEhB,KAAK,IAAM9G,KAAK4G,GACd,AAAI,KAAK,OAAO,IAAI5G,CAAC,KAAG,KAAK,KAAK;GAAE,QAAQA;GAAG,MAAM;GAAW,IAAI8G,EAAG;GAAO,IAAIA,EAAG;GAAK;GAAW,UAAU;EAAM,CAAC;CAE1H;CAGA,QAAQ,GAAe,GAAqC;EAE1D,AADA,KAAK,OAAO,GACZ,KAAK,KAAK9G,CAAC;EACX,IAAMwG,IAAOC,EAAUzG,EAAE,OAAO0G,CAAK,GAC/BzE,IAAIuE,EAAK,KAAK;EACpB,IAAIvE,MAAM,GAAG;EACb,IAAM6E,IAAK,KAAK,UACVC,IAAS/G,EAAE,WAAW;EAC5B,IAAI+G,MAAW,KAAA,KAAaP,EAAK,KAAKvE,IAAI,MAAO6E,EAAG,OAAOC,CAAM,GAC/D,MAAU,WAAW,0DAA0D;EAEjF,IAAID,EAAG,WAAW,GAAG;GACnB,KAAK,eAAe9G,GAAGwG,CAAI;GAC3B;EACF;EACA,IAAMQ,IAAcF,EAAG,OAAOA,EAAG,KAAK,GAClC3G,IAAI;EACR,OAAOA,IAAI8B,KAAKuE,EAAK,KAAKrG,KAAM6G,IAAa;EAE7C,IAAMC,IAAM,IAAI,aAAahF,CAAC;EAC9B,KAAK,IAAIqB,IAAInD,GAAGmD,IAAIrB,GAAG,KAAK;GAC1B,IAAMiF,IAAKJ,EAAG,QAAQN,EAAK,KAAKlD,EAAG;GACnC,IAAI4D,MAAO,KAAA,GAAW;IACpB,KAAK,eAAelH,GAAGmH,EAAWX,GAAMY,EAAQpH,GAAG8G,CAAE,CAAC,CAAC;IACvD;GACF;GACA,EAAIxD,KAAK4D;EACX;EACA,IAAMG,IAAWP,EAAG,QAAQN,EAAK,KAAK,SAAS,GAAGrG,CAAC,CAAC;EACpD,KAAK,IAAImD,IAAI,GAAGA,IAAInD,GAAG,KAAK,EAAImD,KAAK+D,IAAW/D;EAChD,IAAMjC,IAAK4F,EAAI,IACT7F,IAAK6F,EAAIhF,IAAI,KAAM;EAIzB,AAHAjC,EAAE,MAAM,MAAMqB,GAAI,KAAK,IAAID,GAAIpB,EAAE,MAAM,SAAS,IAAIA,EAAE,MAAM,MAAMoB,CAAE,CAAC,GACrEkG,EAAUtH,GAAGwG,GAAMS,CAAG,GACtBjH,EAAE,IAAI,OAAOqB,GAAID,CAAE,GACnB,KAAK,KAAK;GAAE,QAAQpB;GAAG,MAAM;GAAW;GAAI;GAAI,WAAW;GAAO,UAAU;EAAM,CAAC;CACrF;CAGA,OAAO,GAAe,GAAmC;EAEvD,AADA,KAAK,OAAO,GACZ,KAAK,KAAKA,CAAC;EACX,IAAMwG,IAAOC,EAAUzG,EAAE,OAAO,CAAC0G,CAAK,CAA2B,GAC3DnB,IAAIiB,EAAK,KAAK,IACdM,IAAK,KAAK,UACVS,IAAQvH,EAAE,UAAU;EAC1B,IAAIuH,MAAU,KAAA,GAAW;GACvB,IAAMC,IAAWV,EAAG,OAAOS,CAAK;GAChC,IAAIhC,IAAIiC,GAAU,MAAU,WAAW,gBAAgBjC,EAAE,wCAAwCiC,GAAU;EAC7G;EACA,IAAIlE,GACAmE,IAAW;EAOf,AANIX,EAAG,WAAW,KAAKvB,IAAIuB,EAAG,OAAOA,EAAG,MAAM,CAAC,KAC7C,IAAIA,EAAG,OAAOvB,CAAC,GACf,IAAW,MAEX,IAAIuB,EAAG,QAAQvB,CAAC,GAEdjC,MAAM,KAAA,IACR,KAAK,eAAetD,GAAGmH,EAAWC,EAAQpH,GAAG8G,CAAE,GAAGN,CAAI,CAAC,KAGzDxG,EAAE,MAAM,MAAMA,EAAE,MAAM,SAAS,IAAI,KAAK,IAAIA,EAAE,MAAM,OAAOsD,CAAC,IAAIA,GAAG,KAAK,IAAItD,EAAE,MAAM,SAAS,IAAIA,EAAE,MAAM,MAAM,GAAGsD,IAAI,CAAC,CAAC,GACxHgE,EAAUtH,GAAGwG,GAAM,aAAa,GAAGlD,CAAC,CAAC,GACrCtD,EAAE,IAAI,OAAOsD,GAAGA,IAAI,CAAC,GACrB,KAAK,KAAK;GAAE,QAAQtD;GAAG,MAAM;GAAU,IAAIsD;GAAG,IAAIA,IAAI;GAAG,WAAW;GAAO;EAAS,CAAC;CACvF;CAEA,eAAuB,GAAe,GAAkB;EACtD,IAAMgD,IAAY,KAAK,QAAQ,CAAC,CAACtG,GAAGwG,CAAI,CAAC,CAAC;EAC1C,KAAK,KAAK;GAAE,QAAQxG;GAAG,MAAM;GAAW,IAAI,KAAK,SAAS;GAAO,IAAI,KAAK,SAAS;GAAK;GAAW,UAAU;EAAM,CAAC;CACtH;CAOA,QAAgB,GAA4D;EAC1E,IAAM8G,IAAK,KAAK,UACVY,IAAW,IAAI,IAAIb,EAAQ,KAAK,CAAC7G,OAAOA,CAAC,CAAC,GAC1C2H,IAA0C,CAAC;EACjD,KAAK,IAAM1D,KAAK,KAAK,QAAQ,AAAI,CAACyD,EAAS,IAAIzD,CAAC,KAAKA,EAAE,MAAM,SAAS,KAAG0D,EAAO,KAAK;GAAE,GAAG1D;GAAG,MAAMmD,EAAQnD,GAAG6C,CAAE;EAAE,CAAC;EAEnH,IAAIc,oBAAsB,IAAI,aAAc;EAC5C,KAAK,IAAM,GAAGpB,MAASK,GAAS,IAAQgB,EAAYD,GAAOpB,EAAK,IAAI;EACpE,KAAK,IAAMvC,KAAK0D,GAAQ,IAAQE,EAAYD,GAAO3D,EAAE,KAAK,IAAI;EAE9D,IAAM6D,IAAOF,EAAM,WAAWd,EAAG,UAAUiB,EAAUH,GAAOd,CAAE;EAC9D,AAAKgB,KAAMhB,EAAG,QAAQc,GAAOI,EAAYlB,GAAIc,CAAK,CAAC;EAEnD,KAAK,IAAM,CAAC5H,GAAGwG,MAASK,GAAS,EAAU7G,GAAGwG,GAAMM,CAAE;EACtD,IAAI,CAACgB,GAAM,KAAK,IAAM7D,KAAK0D,GAAQ,EAAU1D,EAAE,GAAGA,EAAE,MAAM6C,CAAE;EAC5D,OAAO,CAACgB;CACV;CAGA,KAAa,GAAqB;EAChC,IAAI,CAAC,KAAK,OAAO,IAAI9H,CAAC,GAAG,MAAU,MAAM,qDAAqD;CAChG;CAEA,KAAa,GAAqB;EAChC,KAAK,IAAMuG,KAAM,KAAK,WAAW,EAAGrG,CAAC;CACvC;AACF;AAGA,SAAS+H,EAAU,GAAe,GAAY,GAAoB;CAEhE,IADAjI,EAAE,MAAM,MAAM,GACVwG,EAAK,KAAK,WAAW,GAAG;EAC1B,EAAE,IAAI,QAAQ;EACd;CACF;CACA,IAAMS,IAAM,IAAI,aAAaT,EAAK,KAAK,MAAM,GACvC,EAAE,QAAK,cAAWM,EAAG,IAAI,GAC3BV,IAAIU,EAAG;CACX,KAAK,IAAIxD,IAAI,GAAGA,IAAI2D,EAAI,QAAQ,KAAK;EACnC,IAAM1B,IAAIiB,EAAK,KAAKlD;EACpB,OAAO+B,EAAI6C,IAAS9B,KAAMb,IAAG;EAC7B,EAAIjC,KAAK8C;CACX;CACA,EAAIpG,GAAGwG,GAAMS,CAAG;AAClB;AAEA,SAASkB,EAAI,GAAe,GAAY,GAAyB;CAI/D,AAHAnI,EAAE,MAAM,MAAM,GACdA,EAAE,MAAM,MAAMiH,EAAI,IAAKA,EAAIA,EAAI,SAAS,KAAM,CAAC,GAC/CK,EAAUtH,GAAGwG,GAAMS,CAAG,GACtBjH,EAAE,IAAI,QAAQ;AAChB;AAQA,SAAS2G,EAAgB,GAAe,GAAY,GAAuB;CACzE,IAAM1E,IAAIuE,EAAK,KAAK;CACpB,IAAIM,EAAG,WAAW,KAAK7E,MAAM,GAAG,OAAO;CACvC,IAAM,EAAE,QAAK,cAAW6E,EAAG,IAAI,GACzBG,IAAM,IAAI,aAAahF,CAAC,GAC1BmE,IAAIU,EAAG;CACX,KAAK,IAAIxD,IAAI,GAAGA,IAAIrB,GAAG,KAAK;EAC1B,IAAMsD,IAAIiB,EAAK,KAAKlD;EACpB,OAAO8C,IAAIU,EAAG,OAAOzB,EAAI6C,IAAS9B,KAAMb,IAAG;EAC3C,IAAIa,KAAKU,EAAG,OAAOzB,EAAI6C,IAAS9B,OAAQb,GAAG,OAAO;EAClD,EAAIjC,KAAK8C;CACX;CACA,IAAMgC,IAAKpI,EAAE;CACb,IAAIoI,EAAG,SAAS,GAAG;EACjB,IAAI1F,IAAI;EACR,KAAK,IAAIY,IAAI8E,EAAG,OAAO9E,IAAI8E,EAAG,KAAK,KACjC,IAAKpI,EAAE,IAAIsD,CAAC,GACZ;UAAOZ,IAAIT,KAAKgF,EAAIvE,KAAMY,IAAG;GAC7B,IAAIZ,KAAKT,KAAKgF,EAAIvE,OAAOY,GAAG,OAAO;EADN;CAGjC;CAEA,OADA6E,EAAInI,GAAGwG,GAAMS,CAAG,GACT;AACT;AAEA,SAASK,EAAU,GAAe,GAAY,GAAyB;CACrE,IAAMc,IAAKpI,EAAE;CACb,KAAK,IAAIE,IAAI,GAAGA,IAAIsG,EAAK,KAAK,QAAQ,KAAK;EACzC,IAAM6B,IAAMD,EAAG,KAAKlI,IACduC,IAAM+D,EAAK,KAAKtG,IAChBkD,IAAMgF,EAAG,OAAOA,EAAG;EACzB,KAAK,IAAI9E,IAAI,GAAGA,IAAI2D,EAAI,QAAQ,KAAK,EAAI7D,IAAM6D,EAAI3D,MAAOb,EAAIa;CAChE;AACF;AAGA,SAAS8D,EAAQ,GAAe,GAAoB;CAClD,IAAMgB,IAAKpI,EAAE,OACTiC,IAAI;CACR,KAAK,IAAIqB,IAAI8E,EAAG,OAAO9E,IAAI8E,EAAG,KAAK,KAAK,AAAIpI,EAAE,IAAIsD,CAAC,KAAG;CACtD,IAAMgF,IAAO,IAAI,aAAarG,CAAC,GACzBsG,IAAOH,EAAG,KAAK,KAAK,MAAM,IAAKlI,EAAE,YAAiE+B,CAAC,CAAC,GACtGS,IAAI;CACR,KAAK,IAAIY,IAAI8E,EAAG,OAAO9E,IAAI8E,EAAG,KAAK,KAAK;EACtC,IAAI,CAACpI,EAAE,IAAIsD,CAAC,GAAG;EACf,EAAKZ,KAAKoE,EAAG,OAAOxD,CAAC;EACrB,IAAMc,IAAIgE,EAAG,IAAI9E,CAAC;EAClB,KAAK,IAAIpD,IAAI,GAAGA,IAAIqI,EAAK,QAAQ,KAAK,EAAKrI,EAAE,CAAEwC,KAAK0F,EAAG,KAAKlI,EAAE,CAAEkE;EAChE;CACF;CACA,OAAO;EAAE;EAAM;CAAK;AACtB;AAEA,SAAS+C,EAAW,GAAS,GAAe;CAC1C,IAAMmB,IAAO,IAAI,aAAahI,EAAE,KAAK,SAASqB,EAAE,KAAK,MAAM;CAE3D,AADA2G,EAAK,IAAIhI,EAAE,IAAI,GACfgI,EAAK,IAAI3G,EAAE,MAAMrB,EAAE,KAAK,MAAM;CAC9B,IAAMiI,IAAOjI,EAAE,KAAK,KAAK,GAAG,MAAM;EAChC,IAAME,IAAM,IAAKN,EAAE,YAAiEoI,EAAK,MAAM;EAG/F,OAFA9H,EAAI,IAAIN,CAAC,GACTM,EAAI,IAAImB,EAAE,KAAK2B,IAAKpD,EAAE,MAAM,GACrBM;CACT,CAAC;CAED,OADAgF,EAAiB8C,GAAM,QAAQ,GACxB;EAAE;EAAM;CAAK;AACtB;AAEA,SAAST,EAAY,GAAiB,GAA+B;CACnE,IAAIvH,EAAE,WAAW,GAAG,OAAOqB;CAC3B,IAAIA,EAAE,WAAW,GAAG,OAAOrB;CAC3B,IAAME,IAAM,IAAI,aAAaF,EAAE,SAASqB,EAAE,MAAM,GAC5C2B,IAAI,GAAG8C,IAAI,GAAG1D,IAAI;CACtB,OAAOY,IAAIhD,EAAE,UAAU8F,IAAIzE,EAAE,SAAQ;EACnC,IAAMtB,IAAIC,EAAEgD,IAAKkF,IAAI7G,EAAEyE;EACvB,AAAI/F,IAAImI,KAAG,EAAK,OAAOnI,GAAI,OAClBmI,IAAInI,KAAG,EAAK,OAAOmI,GAAI,QAC3B,EAAK,OAAOnI,GAAI,KAAK;CAC5B;CACA,OAAOiD,IAAIhD,EAAE,SAAQ,EAAI,OAAOA,EAAE;CAClC,OAAO8F,IAAIzE,EAAE,SAAQ,EAAI,OAAOA,EAAE;CAClC,OAAOnB,EAAI,SAAS,GAAGkC,CAAC;AAC1B;AAQA,SAASsF,EAAY,GAAc,GAA6B;CAC9D,IAAIlB,EAAG,WAAW,GAAG,OAAO;CAC5B,IAAM,EAAE,QAAK,cAAWA,EAAG,IAAI,GAC3B,IAAI,GAAGV,IAAIU,EAAG;CAClB,OAAO,IAAIc,EAAM,UAAUxB,IAAIU,EAAG,MAAK;EACrC,IAAM2B,IAAIb,EAAM,IAAKrC,IAAIF,EAAI6C,IAAS9B;EACtC,IAAIqC,MAAMlD,GAAG,OAAOa,IAAI;EACxB,AAAIqC,IAAIlD,IAAG,MACN;CACP;CACA,OAAOuB,EAAG;AACZ;AAEA,SAASiB,EAAU,GAAiB,GAAuB;CACzD,IAAM,EAAE,QAAK,cAAWjB,EAAG,IAAI;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAIxG,EAAE,QAAQ,KAAK,IAAIA,EAAE,OAAO+E,EAAI6C,IAASpB,EAAG,QAAQ,IAAI,OAAO;CACnF,OAAO;AACT;AAEA,SAASL,EAAU,GAAoB,GAAqC;CAC1E,IAAIN,MAAU,QAAQ;EACpB,IAAMK,IAAO,MAAM,QAAQE,CAAK,IAAIgC,EAAgBhC,CAA2B,IAAIiC,EAAgBjC,CAAqB;EACxH,EAAiBF,EAAK,MAAM,WAAW;EACvC,KAAK,IAAItG,IAAI,GAAGA,IAAI,GAAG,KAAK,EAAasG,EAAK,KAAKtG,IAAoB;GAAC;GAAQ;GAAQ;GAAO;EAAO,CAAC,CAACA,EAAG;EAE3G,OADA0I,EAAWpC,CAAI,GACRA;CACT;CACA,IAAMA,IAAO,MAAM,QAAQE,CAAK,IAAImC,EAAiBnC,CAA8B,IAAIoC,EAAiBpC,CAAsB;CAG9H,OAFAlB,EAAiBgB,EAAK,MAAM,YAAY,GACxCuC,EAAavC,EAAK,KAAA,IAA6B,OAAO,GAC/CA;AACT;AAEA,SAASkC,EAAgB,GAAgC;CACvD,IAAMzG,IAAI+G,EAAK,QACTV,IAAO,IAAI,aAAarG,CAAC,GAAGgC,IAAI,IAAI,aAAahC,CAAC,GAAGhC,IAAI,IAAI,aAAagC,CAAC,GAAGoB,IAAI,IAAI,aAAapB,CAAC,GAAG/B,IAAI,IAAI,aAAa+B,CAAC;CACnI,KAAK,IAAIqB,IAAI,GAAGA,IAAIrB,GAAG,KAAK;EAC1B,IAAMN,IAAIqH,EAAK1F;EAKf,AAJA,EAAKA,KAAK3B,EAAE,MACZ,EAAE2B,KAAK3B,EAAE,MACT,EAAE2B,KAAK3B,EAAE,MACT,EAAE2B,KAAK3B,EAAE,KACT,EAAE2B,KAAK3B,EAAE;CACX;CACA,OAAO;EAAE;EAAM,MAAM;GAACsC;GAAGhE;GAAGoD;GAAGnD;EAAC;CAAE;AACpC;AAEA,SAASyI,EAAgB,GAAuB;CAC9C,IAAM1G,IAAIgH,EAAE,KAAK;CACjB,KAAK,IAAMvG,KAAK;EAAC;EAAQ;EAAQ;EAAO;CAAO,GAC7C,IAAIuG,EAAEvG,EAAE,CAAC,WAAWT,GAAG,MAAU,WAAW,kBAAkBS,EAAE,OAAOuG,EAAEvG,EAAE,CAAC,OAAO,kBAAkBT,GAAG;CAE1G,OAAO;EAAE,MAAMgH,EAAE;EAAM,MAAM;GAACA,EAAE;GAAMA,EAAE;GAAMA,EAAE;GAAKA,EAAE;EAAK;CAAE;AAChE;AAEA,SAASJ,EAAiB,GAAqC;CAC7D,IAAM5G,IAAIiH,EAAO,QACXZ,IAAO,IAAI,aAAarG,CAAC,GAAGnC,IAAI,IAAI,aAAamC,CAAC,GAAGiC,IAAQ,IAAI,YAAYjC,CAAC;CACpF,KAAK,IAAIqB,IAAI,GAAGA,IAAIrB,GAAG,KAAK;EAC1B,IAAMmC,IAAI8E,EAAO5F;EAGjB,AAFA,EAAKA,KAAKc,EAAE,MACZ,EAAEd,KAAKc,EAAE,OACLA,EAAE,UAAU,KAAA,MAAW,EAAMd,KAAK3D,EAAWyE,EAAE,KAAK;CAC1D;CACA,OAAO;EAAE;EAAM,MAAM,CAACtE,GAAGoE,CAAK;CAAE;AAClC;AAEA,SAAS4E,EAAiB,GAAwB;CAChD,IAAM7G,IAAIgH,EAAE,KAAK;CACjB,IAAIA,EAAE,MAAM,WAAWhH,GAAG,MAAU,WAAW,6BAA6BgH,EAAE,MAAM,OAAO,kBAAkBhH,GAAG;CAChH,IAAIgH,EAAE,SAASA,EAAE,MAAM,WAAWhH,GAAG,MAAU,WAAW,6BAA6BgH,EAAE,MAAM,OAAO,kBAAkBhH,GAAG;CAC3H,OAAO;EAAE,MAAMgH,EAAE;EAAM,MAAM,CAACA,EAAE,OAAOA,EAAE,SAAS,IAAI,YAAYhH,CAAC,CAAC;CAAE;AACxE;AAGA,SAAS2G,EAAW,GAAkB;CACpC,IAAM,CAAC3E,GAAGhE,GAAGoD,GAAGnD,KAAKsG,EAAK;CAC1B,KAAK,IAAIlD,IAAI,GAAGA,IAAIW,EAAG,QAAQ,KAAK;EAClC,IAAM5C,IAAKgC,EAAGC,IAAKlC,IAAKnB,EAAGqD;EAC3B,IAAI,EAAEjC,KAAM4C,EAAGX,MAAOjC,KAAMnB,EAAGoD,MAAOlC,KAAM6C,EAAGX,MAAOlC,KAAMlB,EAAGoD,KAC7D,MAAU,WAAW,YAAYA,EAAE,SAASkD,EAAK,KAAKlD,GAAG,6CAA6CW,EAAGX,GAAG,KAAKlC,EAAG,KAAKC,EAAG,KAAKnB,EAAGoD,IAAI;CAE5I;AACF;AAEA,SAASyF,EAAa,GAAiB,GAAoB;CACzD,KAAK,IAAIzF,IAAI,GAAGA,IAAIhD,EAAE,QAAQ,KAC5B,IAAI,CAAC,OAAO,SAASA,EAAEgD,EAAG,GAAG,MAAU,UAAU,GAAGqC,EAAK,UAAUrC,EAAE,wBAAwB;AAEjG;;;AC1gBA,IAAa6F,IAAyB,+zBA6BzBC,IAAb,MAAuB;CAGA;CAFrB,2BAA4B,IAAI,IAAqB;CAErD,YAAY,GAAqC;EAA5B,KAAA,KAAAC;CAA6B;CAElD,QAAQ,GAAa,GAAY,GAAY,GAA6B,GAAqC;EAC7G,IAAMzJ,IAAM,KAAK,SAAS,IAAI0J,CAAG;EACjC,IAAI1J,GAAK,OAAOA;EAChB,IAAMyJ,IAAK,KAAK,IACVjF,IAAIiF,EAAG,cAAc;EAI3B,IAHAA,EAAG,aAAajF,GAAGmF,EAAOF,GAAIA,EAAG,eAAeG,GAAIF,CAAG,CAAC,GACxDD,EAAG,aAAajF,GAAGmF,EAAOF,GAAIA,EAAG,iBAAiBI,GAAIH,CAAG,CAAC,GAC1DD,EAAG,YAAYjF,CAAC,GACZ,CAACiF,EAAG,oBAAoBjF,GAAGiF,EAAG,WAAW,KAAK,CAACA,EAAG,cAAc,GAClE,MAAU,MAAM,gCAAgCC,EAAI,IAAID,EAAG,kBAAkBjF,CAAC,GAAG;EAEnF,IAAMsF,IAAgB;GACpB,SAAStF;GACT,UAAU,OAAO,YAAY;IAAC;IAAU;IAAO;IAAO,GAAGuF;GAAQ,CAAC,CAAC,KAAK,MAAM,CAAClB,GAAGY,EAAG,mBAAmBjF,GAAGqE,CAAC,CAAC,CAAC,CAAC;GAC/G,SAAS,OAAO,YAAYmB,EAAQ,KAAK,MAAM,CAACtJ,GAAG+I,EAAG,kBAAkBjF,GAAG9D,CAAC,CAAC,CAAC,CAAC;EACjF;EAEA,OADA,KAAK,SAAS,IAAIgJ,GAAKI,CAAI,GACpBA;CACT;CAGA,OAAa;EACX,KAAK,SAAS,MAAM;CACtB;AACF;AAEA,SAASH,EAAO,GAA4B,GAAc,GAAa,GAA0B;CAC/F,IAAMvJ,IAAIqJ,EAAG,aAAaQ,CAAI;CAG9B,IAFAR,EAAG,aAAarJ,GAAGyC,CAAG,GACtB4G,EAAG,cAAcrJ,CAAC,GACd,CAACqJ,EAAG,mBAAmBrJ,GAAGqJ,EAAG,cAAc,KAAK,CAACA,EAAG,cAAc,GACpE,MAAU,MAAM,gBAAgBQ,MAASR,EAAG,gBAAgB,WAAW,WAAW,UAAUC,EAAI,IAAID,EAAG,iBAAiBrJ,CAAC,GAAG;CAE9H,OAAOA;AACT;;;AChDA,IAAa8J,IAAgB,GAKhBC,IAAS,MACTC,IAAY,QACZC,IAAe,IAGtBC,IAAsB;AAE5B,SAAgBC,GAAY,GAAkB,GAA4B;CACxE,IAAMC,IAAQ,IAAIC;CAElB,OADID,KAASF,KAAuBI,EAAK,IAAI,OAAO,WAAW,IAAU,IAClE,KAAK,IAAIA,EAAK,IAAI,UAAU,KAAK,IAAA,GAAc,KAAK,MAAM,KAAK,KAAKF,CAAK,CAAC,CAAC,CAAC;AACrF;AAEA,IAAaG,KAAb,MAA4B;CA0BP;CACA;CACA;CACA;CA5BnB;CACA,QAAQ;CAER,KAAK;CACL,KAAK;CAEL,OAAO;CACP,YAAY;CACZ,sBAAc,IAAI,aAAc;CAChC,sBAAc,IAAI,YAAa;CAC/B,QAAgB;CAChB,UAAkB;CAClB,UAAkB;CAElB,WAAmB;CAEnB,MAAc;CAQd,YACE,GACA,GACA,GACA,IAA2B,IAC3B;EACA,AALiB,KAAA,KAAAlB,GACA,KAAA,OAAAiB,GACA,KAAA,WAAAE,GACA,KAAA,UAAAC,GAEjB,KAAK,SAASpB,EAAG,aAAa;CAChC;CAEA,IAAI,QAAgB;EAClB,OAAO,KAAK;CACd;CAEA,IAAY,QAAgB;EAC1B,OAAO,KAAK,MAAM,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,IAAI;CACtD;CAEA,YAAY,GAAqB;EAC/B,IAAInJ,EAAE,SAAS,aAAaA,EAAE,WAAW;GACvC,KAAK,QAAQ;GACb;EACF;EACA,IAAI,KAAK,QAAQ,GAAG;EACpB,IAAMwC,IAAI,KAAK,OACTgI,IAAK,KAAK,IAAI,KAAK,IAAIxK,EAAE,MAAMwC,CAAC,GAChCiI,IAAK,KAAK,IAAI,KAAK,IAAKzK,EAAE,KAAK,KAAMwC,CAAC;EAC5C,AAAIgI,IAAKC,MACT,KAAK,UAAU,KAAK,IAAI,KAAK,SAASD,CAAE,GACxC,KAAK,UAAU,KAAK,IAAI,KAAK,SAASC,CAAE;CAC1C;CAGA,OAAO,GAAe,GAAe,GAAqB;EACxD,IAAMtB,IAAK,KAAK;EAChB,EAAG,WAAWA,EAAG,cAAc,KAAK,MAAM;EAC1C,IAAMjB,IAAK,KAAK,KAAK;EACrB,IAAIA,EAAG,WAAW,KAAKwC,IAAQC,GAAO;GAEpC,AADA,KAAK,KAAK,KAAK,KAAK,GACpB,KAAK,WAAW;GAChB;EACF;EACA,IAAMC,IAAKD,KAASjI,GACdmI,IAAKH,KAAShI,GAEdoI,IAAY,KAAK,aAAa,KAAK;EACzC,IAAI,CAAC,KAAK,SAASpI,MAAU,KAAK,SAASkI,KAAM,KAAK,MAAMC,KAAM,KAAK,OAAOC,KAAa,KAAK,UAAU,KAAK,UAAU;GACvH,IAAI,KAAK,WAAW,KAAK,SAAS;IAChC,KAAK,KAAK,KAAK,SAAS,KAAK,OAAO;IACpC,IAAM5H,KAAO,KAAK,UAAU,KAAK,MAAA,GAC3B6H,KAAO,KAAK,UAAU,KAAK,UAAU,KAAA;IAC3C,EAAG,cAAc5B,EAAG,cAAcjG,IAAM,GAAG,KAAK,KAAKA,GAAK6H,CAAG;GAC/D;GAEA,AADA,KAAK,UAAU,UACf,KAAK,UAAU;GACf;EACF;EACA,IAAMC,IAAY9C,EAAG,SAASxF,GACxBuI,IAAY/C,EAAG,MAAM,KAAMxF,GAC3BwI,IAAOL,IAAKD,IAAK;EAKvB,AAJA,KAAK,QAAQlI,GACb,KAAK,KAAK,KAAK,IAAIsI,GAAWJ,IAAKM,CAAI,GACvC,KAAK,KAAK,KAAK,IAAID,GAAUJ,IAAKK,CAAI,GACtC,KAAK,OAAO,KAAK,MAAMxI,GACvB,KAAK,YAAY,KAAK,WAAW,IAAI,KAAK,SAAS;EACnD,IAAIX,IAAI,KAAK;EACb,IAAI,KAAK,IAAI,SAASA,IAAA,GAAmB;GACvC,IAAMoJ,oBAAK,IAAI,YAAY,KAAK,KAAKpJ,IAAI,GAAG,IAAA,EAAgB;GAE5D,AADA,KAAK,MAAM,IAAI,aAAaoJ,CAAE,GAC9B,KAAK,MAAM,IAAI,YAAYA,CAAE;EAC/B;EAOA,AANIpJ,IAAI,KAAG,KAAK,KAAK,KAAK,IAAI,KAAK,EAAE,GACjC,KAAK,YAAS,IAAI,KAAK,QAAQA,CAAC,IACpC,KAAK,WAAWA,GAChBoH,EAAG,WAAWA,EAAG,cAAc,KAAK,IAAI,SAAS,GAAGpH,IAAA,CAAiB,GAAGoH,EAAG,YAAY,GACvF,KAAK,QAAQ,IACb,KAAK,UAAU,UACf,KAAK,UAAU;CACjB;CAGA,QAAgB,GAAmB;EACjC,IAAMiC,IAAI,KAAK,KAAK7C,IAAI,KAAK,KACzB8C,IAAI;EACR,KAAK,IAAIpH,IAAI,GAAGA,IAAIlC,GAAG,KAAK;GAC1B,IAAMQ,IAAM0B,IAAA;GACZ,IAAImH,EAAE7I,OAAA,MACN;QAAI8I,MAAMpH,GAAG;KACX,IAAMkE,IAAMkD,IAAA;KACZ,KAAK,IAAInF,IAAI,GAAGA,IAAI,GAAmB,KAAK,EAAEiC,IAAMjC,KAAKkF,EAAE7I,IAAM2D;KACjE,EAAEiC,IAAA,IAAsB,KAAKI,EAAEhG,IAAA,IAAsB;IACvD;IACA;GADA;EAEF;EACA,OAAO8I;CACT;CAGA,OAAO,GAAoB;EACzB,AAAIC,MAAQ,KAAK,QACf,KAAK,MAAMA,GACX,KAAK,QAAQ;CAEjB;CAGA,aAAmB;EACjB,KAAK,QAAQ;CACf;CAEA,UAAgB;EACd,KAAK,GAAG,aAAa,KAAK,MAAM;CAClC;CAEA,WAA2B;EACzB,IAAMvC,IAAI,KAAK,MACT3D,IAAQ,KAAK,KAAK,KAAK,MAAO,KAAM,KAAK,OACzC1D,IAAMqH,EAAE,UAAU,SAAA,IAAA,GAClB3F,IAAI2F,EAAE,gBAAgB,KAAK,IAAI3D,GAAK2D,EAAE,MAAM,MAAM,CAAC,CAAC,KAAKA,EAAE,WAAW,GACtEnJ,IAAIwD,MAAM,KAAA,IAAY,IAAI2F,EAAE,IAAI3F,GAAG1B,CAAG,GACtC1B,IAAI,KAAK,MAAM,KAAK,MAAMJ,CAAC,IAAIA;EACrC,OAAO,OAAO,SAASI,CAAC,IAAIA,IAAI;CAClC;CAEA,KAAa,GAAY,GAAkB;EACzC,IAAMoL,IAAI,KAAK,KAAK7C,IAAI,KAAK,KAAKgD,IAAK,KAAK,WAAW/I,IAAI,KAAK,OAAOuG,IAAI,KAAK,MAAMuC,IAAM,KAAK;EACjG,IAAI9I,MAAM,GAAG;GACX,IAAM0F,IAAKa,EAAE,OACPyC,IAAOzC,EAAE,UAAU,QACnBrF,IAAIwE,EAAG,KAAK,IAAwBlF,IAAIkF,EAAG,KAAK,OAAwBjF,IAAIiF,EAAG,KAAKsD,IAAA,IAAA,IAAwB7H,IAAIuE,EAAG,KAAKsD,IAAA,IAAA,IACxH5H,IAAM4H,IAAO,KAAA,IAAYtD,EAAG,KAAA;GAClC,KAAK,IAAI9E,IAAIoH,GAAIpH,KAAKqH,GAAI,KAAK;IAC7B,IAAMxG,KAAKb,IAAI,KAAK,MAAA,GACdc,IAAIgE,EAAG,QAAQ9E,IAAI8E,EAAG,QACxBnE,IAAIX,KAAK8E,EAAG,SAAS9E,IAAI8E,EAAG,MAAMxE,EAAEQ,KAAM,KAC1CnE,IAAIiD,EAAEkB,IAAKf,IAAIF,EAAEiB,IAAKlE,IAAI2D,EAAEO;IAOhC,AANIoH,MACF,IAAIG,EAAG1H,CAAC,GACR,IAAI0H,EAAG1L,CAAC,GACR,IAAI0L,EAAGtI,CAAC,GACR,IAAIsI,EAAGzL,CAAC,IAEN+D,MAAMA,KAAKhE,MAAMA,KAAKoD,MAAMA,KAAKnD,MAAMA,IACzC0L,EAAKN,GAAG7C,GAAGtE,CAAC,KAGd,EAAEA,KAAKb,IAAI,KAAK,MAChB,EAAEa,IAAI,KAAKF,IAAIwH,GACf,EAAEtH,IAAI,KAAKlE,IAAIwL,GACf,EAAEtH,IAAI,KAAKd,IAAIoI,GACf,EAAEtH,IAAI,KAAKjE,IAAIuL,GACf,EAAEtH,IAAI,KAAKL,IAAMA,EAAIM,KAAM;GAC7B;GACA;EACF;EACA,IAAMb,IAAK0F,EAAE,IAAI,MAAMvG,CAAC,GAClBkB,IAAIL,EAAG,KAAA,IAAcL,IAAIK,EAAG,KAAA,IAAcJ,IAAII,EAAG,KAAA,IAAcM,IAAIN,EAAG,KAAA,IAAcO,IAAMP,EAAG,KAAA,IAC7FsI,MAAS,KAAKnJ,KAAK,KAAK;EAC9B,KAAK,IAAIf,IAAI+I,GAAI/I,KAAKgJ,GAAI,KAAK;GAC7B,IAAMxG,KAAKxC,IAAI,KAAK,MAAA,GACdyC,IAAIb,EAAG,QAAQ5B,IAAI4B,EAAG,QACxBU,IAAIV,EAAG,IAAI5B,CAAC,IAAIiC,EAAEQ,KAAM,KACxBnE,IAAIiD,EAAEkB,IAAKf,IAAIF,EAAEiB,IAAKlE,IAAI2D,EAAEO;GAOhC,AANIoH,MACF,IAAIG,EAAG1H,CAAC,GACR,IAAI0H,EAAG1L,CAAC,GACR,IAAI0L,EAAGtI,CAAC,GACR,IAAIsI,EAAGzL,CAAC,IAEN+D,MAAMA,KAAKhE,MAAMA,KAAKoD,MAAMA,KAAKnD,MAAMA,IACzC0L,EAAKN,GAAG7C,GAAGtE,CAAC,KAGd,EAAEA,MAAMxC,KAAKe,KAAKmJ,IAAO,KAAK,MAC9B,EAAE1H,IAAI,KAAKF,IAAIwH,GACf,EAAEtH,IAAI,KAAKlE,IAAIwL,GACf,EAAEtH,IAAI,KAAKd,IAAIoI,GACf,EAAEtH,IAAI,KAAKjE,IAAIuL,GACf,EAAEtH,IAAI,KAAKL,IAAMA,EAAIM,KAAM;EAC7B;CACF;AACF;AAEA,SAASwH,EAAK,GAAiB,GAAgB,GAAiB;CAG9D,AAFA,EAAEzH,KAAK4F,GACP,EAAE5F,IAAI,KAAK,EAAEA,IAAI,KAAK,EAAEA,IAAI,KAAK,EAAEA,IAAI,KAAK,GAC5C,EAAEA,IAAI,KAAK;AACb;AAGA,SAASwH,EAAG,GAAmB;CAC7B,OAAO7L,IAAI,IAAI,KAAK,MAAMA,CAAC,IAAI;AACjC"}