{"version":3,"file":"streaming-engine.mjs","sources":["../../../src/lib/streaming/streaming-engine.ts"],"sourcesContent":["/**\n * @file Dynamic HTML Streaming Engine - Core Implementation\n * @description Advanced streaming engine with priority queues, lifecycle management,\n * backpressure handling, and comprehensive metrics collection.\n *\n * This engine implements a sophisticated priority-based streaming system that\n * optimizes content delivery for modern web applications. It supports:\n *\n * - Priority-based stream scheduling (critical, high, normal, low)\n * - Stream lifecycle management (start, pause, resume, abort)\n * - Backpressure handling with configurable strategies\n * - Chunk buffering with high-water mark monitoring\n * - Automatic retry with exponential backoff\n * - Comprehensive metrics and telemetry\n * - Event-driven architecture for extensibility\n *\n * @module streaming/streaming-engine\n * @version 1.0.0\n * @author Harbor Framework Team\n *\n * @example\n * ```typescript\n * const engine = new StreamingEngine({\n *   maxConcurrentStreams: 4,\n *   backpressureStrategy: BackpressureStrategy.Pause,\n *   debug: true,\n * });\n *\n * engine.registerBoundary('hero', {\n *   priority: StreamPriority.Critical,\n *   onStreamComplete: () => console.log('Hero streamed!'),\n * });\n *\n * engine.start('hero');\n * ```\n */\n\nimport {\n  BackpressureStrategy,\n  type BoundaryMetrics,\n  createStreamError,\n  DEFAULT_ENGINE_CONFIG,\n  DEFAULT_METRICS,\n  type EngineConfig,\n  PRIORITY_VALUES,\n  type QueueEntry,\n  type StreamBoundaryData,\n  type StreamChunk,\n  type StreamConfig,\n  type StreamError,\n  StreamErrorCode,\n  type StreamEvent,\n  type StreamEventHandler,\n  StreamEventType,\n  type StreamMetrics,\n  StreamPriority,\n  StreamState,\n  type TransformContext,\n} from './types';\n\n// Re-export for use in other modules\nexport { StreamState, StreamPriority };\n\n// ============================================================================\n// Priority Queue Implementation\n// ============================================================================\n\n/**\n * Generic priority queue using a binary heap.\n *\n * @description\n * Implements a min-heap based priority queue for efficient O(log n)\n * insertion and extraction of highest priority items.\n *\n * @template T - Type of items in the queue\n */\nclass PriorityQueue<T extends { priority: number }> {\n  private heap: T[] = [];\n\n  /**\n   * Returns the number of items in the queue.\n   */\n  get size(): number {\n    return this.heap.length;\n  }\n\n  /**\n   * Returns whether the queue is empty.\n   */\n  get isEmpty(): boolean {\n    return this.heap.length === 0;\n  }\n\n  /**\n   * Inserts an item into the queue.\n   * @param item - Item to insert\n   */\n  enqueue(item: T): void {\n    this.heap.push(item);\n    this.bubbleUp(this.heap.length - 1);\n  }\n\n  /**\n   * Removes and returns the highest priority item.\n   * @returns The highest priority item or undefined if queue is empty\n   */\n  dequeue(): T | undefined {\n    if (this.heap.length === 0) return undefined;\n    if (this.heap.length === 1) return this.heap.pop();\n\n    const [result] = this.heap;\n    const lastItem = this.heap.pop();\n    if (lastItem !== undefined) {\n      this.heap[0] = lastItem;\n      this.bubbleDown(0);\n    }\n\n    return result;\n  }\n\n  /**\n   * Returns the highest priority item without removing it.\n   * @returns The highest priority item or undefined if queue is empty\n   */\n  peek(): T | undefined {\n    return this.heap[0];\n  }\n\n  /**\n   * Removes all items from the queue.\n   */\n  clear(): void {\n    this.heap = [];\n  }\n\n  /**\n   * Removes a specific item from the queue.\n   * @param predicate - Function to identify the item to remove\n   * @returns Whether an item was removed\n   */\n  remove(predicate: (item: T) => boolean): boolean {\n    const index = this.heap.findIndex(predicate);\n    if (index === -1) return false;\n\n    if (index === this.heap.length - 1) {\n      this.heap.pop();\n      return true;\n    }\n\n    const lastItem = this.heap.pop();\n    if (lastItem === undefined) return true;\n    \n    this.heap[index] = lastItem;\n    const parentIndex = Math.floor((index - 1) / 2);\n    const parentItem = this.heap[parentIndex];\n\n    if (index > 0 && parentItem != null && this.heap[index].priority < parentItem.priority) {\n      this.bubbleUp(index);\n    } else {\n      this.bubbleDown(index);\n    }\n\n    return true;\n  }\n\n  /**\n   * Returns all items in the queue (not in priority order).\n   */\n  toArray(): T[] {\n    return [...this.heap];\n  }\n\n  private bubbleUp(index: number): void {\n    while (index > 0) {\n      const parentIndex = Math.floor((index - 1) / 2);\n      const currentItem = this.heap[index];\n      const parentItem = this.heap[parentIndex];\n      if (!currentItem || !parentItem || currentItem.priority >= parentItem.priority) break;\n\n      [this.heap[index], this.heap[parentIndex]] = [parentItem, currentItem];\n      index = parentIndex;\n    }\n  }\n\n  private bubbleDown(index: number): void {\n    const lastIndex = this.heap.length - 1;\n\n    while (true) {\n      const leftChildIndex = 2 * index + 1;\n      const rightChildIndex = 2 * index + 2;\n      let smallestIndex = index;\n\n      const leftChild = this.heap[leftChildIndex];\n      const rightChild = this.heap[rightChildIndex];\n      const smallestItem = this.heap[smallestIndex];\n\n      if (\n        leftChildIndex <= lastIndex &&\n        leftChild &&\n        smallestItem &&\n        leftChild.priority < smallestItem.priority\n      ) {\n        smallestIndex = leftChildIndex;\n      }\n\n      const updatedSmallestItem = this.heap[smallestIndex];\n      if (\n        rightChildIndex <= lastIndex &&\n        rightChild &&\n        updatedSmallestItem &&\n        rightChild.priority < updatedSmallestItem.priority\n      ) {\n        smallestIndex = rightChildIndex;\n      }\n\n      if (smallestIndex === index) break;\n\n      const indexItem = this.heap[index];\n      const smallestIndexItem = this.heap[smallestIndex];\n      if (!indexItem || !smallestIndexItem) break;\n      \n      [this.heap[index], this.heap[smallestIndex]] = [smallestIndexItem, indexItem];\n      index = smallestIndex;\n    }\n  }\n}\n\n// ============================================================================\n// Stream Buffer Implementation\n// ============================================================================\n\n/**\n * Ring buffer for efficient chunk buffering with backpressure support.\n *\n * @description\n * Implements a circular buffer with high-water mark monitoring\n * for backpressure detection and handling.\n */\nclass StreamBuffer {\n  private buffer: (StreamChunk | undefined)[] = [];\n  private readonly capacity: number;\n  private readonly highWaterMark: number;\n  private head = 0;\n  private tail = 0;\n  private count = 0;\n  private totalBytes = 0;\n\n  constructor(capacity: number, highWaterMark: number) {\n    this.capacity = capacity;\n    this.highWaterMark = highWaterMark;\n    this.buffer = new Array<StreamChunk | undefined>(capacity);\n  }\n\n  /**\n   * Returns the number of chunks in the buffer.\n   */\n  get size(): number {\n    return this.count;\n  }\n\n  /**\n   * Returns the total bytes currently in the buffer.\n   */\n  get bytes(): number {\n    return this.totalBytes;\n  }\n\n  /**\n   * Returns the buffer utilization as a ratio (0-1).\n   */\n  get utilization(): number {\n    return this.count / this.capacity;\n  }\n\n  /**\n   * Returns whether backpressure should be applied.\n   */\n  get shouldApplyBackpressure(): boolean {\n    return this.totalBytes >= this.highWaterMark;\n  }\n\n  /**\n   * Returns whether the buffer is full.\n   */\n  get isFull(): boolean {\n    return this.count >= this.capacity;\n  }\n\n  /**\n   * Adds a chunk to the buffer.\n   * @param chunk - Chunk to add\n   * @returns Whether the chunk was added successfully\n   */\n  push(chunk: StreamChunk): boolean {\n    if (this.isFull) return false;\n\n    this.buffer[this.tail] = chunk;\n    this.tail = (this.tail + 1) % this.capacity;\n    this.count++;\n    this.totalBytes += chunk.size;\n\n    return true;\n  }\n\n  /**\n   * Removes and returns the oldest chunk from the buffer.\n   * @returns The oldest chunk or undefined if buffer is empty\n   */\n  shift(): StreamChunk | undefined {\n    if (this.count === 0) return undefined;\n\n    const chunk = this.buffer[this.head];\n    if (!chunk) return undefined;\n\n    this.buffer[this.head] = undefined;\n    this.head = (this.head + 1) % this.capacity;\n    this.count--;\n    this.totalBytes -= chunk.size;\n\n    return chunk;\n  }\n\n  /**\n   * Returns the oldest chunk without removing it.\n   */\n  peek(): StreamChunk | undefined {\n    return this.count > 0 ? this.buffer[this.head] : undefined;\n  }\n\n  /**\n   * Clears all chunks from the buffer.\n   */\n  clear(): void {\n    this.buffer = new Array<StreamChunk | undefined>(this.capacity);\n    this.head = 0;\n    this.tail = 0;\n    this.count = 0;\n    this.totalBytes = 0;\n  }\n\n  /**\n   * Drains all chunks from the buffer.\n   * @returns Array of all chunks in order\n   */\n  drain(): StreamChunk[] {\n    const chunks: StreamChunk[] = [];\n    while (this.count > 0) {\n      const chunk = this.shift();\n      if (chunk) chunks.push(chunk);\n    }\n    return chunks;\n  }\n}\n\n// ============================================================================\n// Streaming Engine Implementation\n// ============================================================================\n\n/**\n * Core streaming engine with priority-based scheduling and lifecycle management.\n *\n * @description\n * The StreamingEngine is the heart of the Dynamic HTML Streaming system.\n * It manages multiple stream boundaries, coordinating their execution\n * based on priority levels and system resource availability.\n *\n * Key features:\n * - Priority-based scheduling with preemption support\n * - Stream lifecycle management (start, pause, resume, abort)\n * - Backpressure handling with configurable strategies\n * - Automatic retry with exponential backoff\n * - Comprehensive event system for monitoring\n * - Thread-safe operations for concurrent access\n *\n * @example\n * ```typescript\n * const engine = new StreamingEngine({ debug: true });\n *\n * // Register boundaries\n * engine.registerBoundary('nav', { priority: StreamPriority.Critical });\n * engine.registerBoundary('hero', { priority: StreamPriority.High });\n * engine.registerBoundary('sidebar', { priority: StreamPriority.Low });\n *\n * // Subscribe to events\n * const unsubscribe = engine.subscribe((event) => {\n *   console.log(`${event.type}: ${event.boundaryId}`);\n * });\n *\n * // Start streaming\n * engine.startAll();\n * ```\n */\nexport class StreamingEngine {\n  private readonly config: EngineConfig;\n  private readonly boundaries: Map<string, StreamBoundaryData> = new Map();\n  private readonly priorityQueue: PriorityQueue<QueueEntry>;\n  private readonly buffer: StreamBuffer;\n  private readonly eventHandlers: Set<StreamEventHandler> = new Set();\n  private readonly metrics: StreamMetrics;\n  private activeStreams = 0;\n  private isProcessing = false;\n  private processingTimer: ReturnType<typeof setTimeout> | null = null;\n  private readonly chunkLatencies: number[] = [];\n  private readonly MAX_LATENCY_SAMPLES = 100;\n\n  /**\n   * Creates a new StreamingEngine instance.\n   * @param config - Engine configuration options\n   */\n  constructor(config: Partial<EngineConfig> = {}) {\n    this.config = { ...DEFAULT_ENGINE_CONFIG, ...config };\n    this.priorityQueue = new PriorityQueue();\n    this.buffer = new StreamBuffer(\n      Math.ceil(this.config.bufferSize / 1024), // Approximate chunk capacity\n      this.config.highWaterMark\n    );\n    this.metrics = this.createInitialMetrics();\n\n    this.log('Engine initialized with config:', this.config);\n  }\n\n  // ==========================================================================\n  // Public API - Boundary Management\n  // ==========================================================================\n\n  /**\n   * Checks if streaming is supported in the current environment.\n   */\n  static isStreamingSupported(): boolean {\n    return (\n      typeof ReadableStream !== 'undefined' &&\n      typeof TransformStream !== 'undefined' &&\n      typeof AbortController !== 'undefined'\n    );\n  }\n\n  /**\n   * Registers a new stream boundary with the engine.\n   *\n   * @param id - Unique identifier for the boundary\n   * @param config - Stream configuration\n   * @throws {Error} If boundary with same ID already exists\n   *\n   * @example\n   * ```typescript\n   * engine.registerBoundary('main-content', {\n   *   priority: StreamPriority.High,\n   *   placeholder: <ContentSkeleton />,\n   *   onStreamComplete: () => console.log('Content ready!'),\n   * });\n   * ```\n   */\n  registerBoundary(id: string, config: StreamConfig): void {\n    if (this.boundaries.has(id)) {\n      throw createStreamError(\n        StreamErrorCode.ConfigError,\n        `Boundary with ID \"${id}\" already exists`,\n        { boundaryId: id }\n      );\n    }\n\n    const boundaryData: StreamBoundaryData = {\n      id,\n      config,\n      state: StreamState.Idle,\n      chunks: [],\n      bytesReceived: 0,\n      bytesDelivered: 0,\n      retryCount: 0,\n      abortController: new AbortController(),\n    };\n\n    this.boundaries.set(id, boundaryData);\n    this.updateMetrics('register', id);\n    this.log(`Registered boundary: ${id}`, config);\n  }\n\n  /**\n   * Unregisters a stream boundary, aborting any active streams.\n   *\n   * @param id - Boundary identifier to unregister\n   * @returns Whether the boundary was found and unregistered\n   */\n  unregisterBoundary(id: string): boolean {\n    const boundary = this.boundaries.get(id);\n    if (!boundary) return false;\n\n    // Abort if streaming\n    if (this.isActiveState(boundary.state)) {\n      this.abort(id, 'Boundary unregistered');\n    }\n\n    // Remove from queue\n    this.priorityQueue.remove((entry) => entry.boundaryId === id);\n\n    this.boundaries.delete(id);\n    this.updateMetrics('unregister', id);\n    this.log(`Unregistered boundary: ${id}`);\n\n    return true;\n  }\n\n  /**\n   * Gets the current state of a boundary.\n   * @param id - Boundary identifier\n   * @returns Current state or null if not found\n   */\n  getState(id: string): StreamState | null {\n    return this.boundaries.get(id)?.state ?? null;\n  }\n\n  /**\n   * Gets the boundary data for inspection.\n   * @param id - Boundary identifier\n   * @returns Boundary data or undefined if not found\n   */\n  getBoundary(id: string): Readonly<StreamBoundaryData> | undefined {\n    return this.boundaries.get(id);\n  }\n\n  // ==========================================================================\n  // Public API - Lifecycle Management\n  // ==========================================================================\n\n  /**\n   * Returns all registered boundary IDs.\n   */\n  getBoundaryIds(): string[] {\n    return Array.from(this.boundaries.keys());\n  }\n\n  /**\n   * Starts streaming for a specific boundary.\n   *\n   * @param id - Boundary identifier\n   * @throws {Error} If boundary not found or in invalid state\n   *\n   * @example\n   * ```typescript\n   * engine.start('hero');\n   * ```\n   */\n  start(id: string): void {\n    const boundary = this.boundaries.get(id);\n    if (!boundary) {\n\n      throw createStreamError(StreamErrorCode.ConfigError, `Boundary \"${id}\" not found`, {\n        boundaryId: id,\n      });\n    }\n\n    if (!this.canTransitionTo(boundary.state, StreamState.Pending)) {\n\n      throw createStreamError(\n        StreamErrorCode.StateError,\n        `Cannot start boundary \"${id}\" from state \"${boundary.state}\"`,\n        { boundaryId: id }\n      );\n    }\n\n    this.transitionState(boundary, StreamState.Pending);\n    this.queueBoundary(boundary);\n    this.processQueue();\n  }\n\n  /**\n   * Starts streaming for all registered boundaries.\n   */\n  startAll(): void {\n    for (const id of this.boundaries.keys()) {\n      const boundary = this.boundaries.get(id);\n      if (boundary != null && boundary.state === StreamState.Idle) {\n        this.start(id);\n      }\n    }\n  }\n\n  /**\n   * Pauses streaming for a specific boundary.\n   *\n   * @param id - Boundary identifier\n   * @throws {Error} If boundary not found or not streaming\n   */\n  pause(id: string): void {\n    const boundary = this.boundaries.get(id);\n    if (!boundary) {\n\n      throw createStreamError(StreamErrorCode.ConfigError, `Boundary \"${id}\" not found`, {\n        boundaryId: id,\n      });\n    }\n\n    if (!this.canTransitionTo(boundary.state, StreamState.Paused)) {\n\n      throw createStreamError(\n        StreamErrorCode.StateError,\n        `Cannot pause boundary \"${id}\" from state \"${boundary.state}\"`,\n        { boundaryId: id }\n      );\n    }\n\n    this.transitionState(boundary, StreamState.Paused);\n    this.emitEvent(StreamEventType.Pause, id);\n    this.activeStreams--;\n    this.processQueue();\n  }\n\n  /**\n   * Resumes a paused stream.\n   *\n   * @param id - Boundary identifier\n   * @throws {Error} If boundary not found or not paused\n   */\n  resume(id: string): void {\n    const boundary = this.boundaries.get(id);\n    if (!boundary) {\n\n      throw createStreamError(StreamErrorCode.ConfigError, `Boundary \"${id}\" not found`, {\n        boundaryId: id,\n      });\n    }\n\n    if (boundary.state !== StreamState.Paused) {\n\n      throw createStreamError(\n        StreamErrorCode.StateError,\n        `Cannot resume boundary \"${id}\" from state \"${boundary.state}\"`,\n        { boundaryId: id }\n      );\n    }\n\n    this.transitionState(boundary, StreamState.Streaming);\n    this.activeStreams++;\n    this.emitEvent(StreamEventType.Resume, id);\n  }\n\n  /**\n   * Aborts streaming for a specific boundary.\n   *\n   * @param id - Boundary identifier\n   * @param reason - Optional reason for abortion\n   */\n  abort(id: string, reason = 'User requested abort'): void {\n    const boundary = this.boundaries.get(id);\n    if (!boundary) return;\n\n    if (this.isTerminalState(boundary.state)) return;\n\n    boundary.abortController.abort(reason);\n    this.transitionState(boundary, StreamState.Aborted);\n    this.emitEvent(StreamEventType.Abort, id, { reason });\n\n    if (this.isActiveState(boundary.state)) {\n      this.activeStreams--;\n    }\n\n    boundary.config.onStreamAbort?.(reason);\n    this.priorityQueue.remove((entry) => entry.boundaryId === id);\n    this.processQueue();\n  }\n\n  /**\n   * Aborts all active streams.\n   * @param reason - Optional reason for abortion\n   */\n  abortAll(reason = 'Bulk abort requested'): void {\n    for (const id of this.boundaries.keys()) {\n      this.abort(id, reason);\n    }\n  }\n\n  // ==========================================================================\n  // Public API - Chunk Management\n  // ==========================================================================\n\n  /**\n   * Resets a boundary to idle state for restart.\n   * @param id - Boundary identifier\n   */\n  reset(id: string): void {\n    const boundary = this.boundaries.get(id);\n    if (!boundary) return;\n\n    if (this.isActiveState(boundary.state)) {\n      this.abort(id, 'Reset requested');\n    }\n\n    boundary.state = StreamState.Idle;\n    boundary.chunks = [];\n    boundary.bytesReceived = 0;\n    boundary.bytesDelivered = 0;\n    boundary.startTime = undefined;\n    boundary.endTime = undefined;\n    boundary.lastError = undefined;\n    boundary.retryCount = 0;\n    boundary.abortController = new AbortController();\n\n    this.log(`Reset boundary: ${id}`);\n  }\n\n  /**\n   * Processes an incoming chunk for a boundary.\n   *\n   * @param chunk - The chunk to process\n   * @returns Whether the chunk was accepted\n   *\n   * @example\n   * ```typescript\n   * const chunk: StreamChunk = {\n   *   id: crypto.randomUUID(),\n   *   sequence: 0,\n   *   data: '<div>Content</div>',\n   *   timestamp: Date.now(),\n   *   size: 18,\n   *   isFinal: false,\n   *   boundaryId: 'main',\n   * };\n   *\n   * engine.processChunk(chunk);\n   * ```\n   */\n  async processChunk(chunk: StreamChunk): Promise<boolean> {\n    const boundary = this.boundaries.get(chunk.boundaryId);\n    if (!boundary || !this.isActiveState(boundary.state)) {\n      return false;\n    }\n\n    const startTime = performance.now();\n\n    try {\n      // Apply transformer if configured\n      const transformedChunk = this.config.chunkTransformer\n        ? await this.applyTransformer(chunk, boundary)\n        : chunk;\n\n      // Check buffer capacity\n      if (this.buffer.shouldApplyBackpressure) {\n        await this.handleBackpressure(boundary);\n      }\n\n      // Buffer the chunk\n      if (!this.buffer.push(transformedChunk)) {\n        return this.handleBufferFull(boundary, transformedChunk);\n      }\n\n      boundary.chunks.push(transformedChunk);\n      boundary.bytesReceived += transformedChunk.size;\n\n      // Track latency\n      const latency = performance.now() - startTime;\n      this.recordChunkLatency(latency);\n\n      this.emitEvent(StreamEventType.Chunk, chunk.boundaryId, transformedChunk);\n      this.updateMetrics('chunk', chunk.boundaryId, transformedChunk);\n\n      // Handle final chunk\n      if (transformedChunk.isFinal) {\n        this.completeStream(boundary);\n      }\n\n      return true;\n    } catch (error) {\n      await this.handleChunkError(boundary, chunk, error);\n      return false;\n    }\n  }\n\n  // ==========================================================================\n  // Public API - Events & Metrics\n  // ==========================================================================\n\n  /**\n   * Delivers buffered chunks to the client.\n   *\n   * @param boundaryId - Boundary to deliver chunks for\n   * @returns Array of delivered chunks\n   */\n  deliverChunks(boundaryId: string): StreamChunk[] {\n    const boundary = this.boundaries.get(boundaryId);\n    if (!boundary) return [];\n\n    const delivered: StreamChunk[] = [];\n\n    while (this.buffer.size > 0) {\n      const chunk = this.buffer.peek();\n      if (chunk?.boundaryId !== boundaryId) break;\n\n      const deliveredChunk = this.buffer.shift();\n      if (deliveredChunk != null) {\n        delivered.push(deliveredChunk);\n        boundary.bytesDelivered += deliveredChunk.size;\n      }\n    }\n\n    return delivered;\n  }\n\n  /**\n   * Subscribes to stream events.\n   *\n   * @param handler - Event handler function\n   * @returns Unsubscribe function\n   *\n   * @example\n   * ```typescript\n   * const unsubscribe = engine.subscribe((event) => {\n   *   switch (event.type) {\n   *     case StreamEventType.Start:\n   *       console.log(`Stream ${event.boundaryId} started`);\n   *       break;\n   *     case StreamEventType.Complete:\n   *       console.log(`Stream ${event.boundaryId} completed`);\n   *       break;\n   *   }\n   * });\n   *\n   * // Later...\n   * unsubscribe();\n   * ```\n   */\n  subscribe(handler: StreamEventHandler): () => void {\n    this.eventHandlers.add(handler);\n    return () => this.eventHandlers.delete(handler);\n  }\n\n  /**\n   * Returns current streaming metrics.\n   */\n  getMetrics(): Readonly<StreamMetrics> {\n    return { ...this.metrics };\n  }\n\n  /**\n   * Returns the current engine configuration.\n   */\n  getConfig(): Readonly<EngineConfig> {\n    return { ...this.config };\n  }\n\n  /**\n   * Disposes of the engine, cleaning up all resources.\n   */\n  dispose(): void {\n    this.abortAll('Engine disposed');\n    this.boundaries.clear();\n    this.priorityQueue.clear();\n    this.buffer.clear();\n    this.eventHandlers.clear();\n\n    if (this.processingTimer) {\n      clearTimeout(this.processingTimer);\n      this.processingTimer = null;\n    }\n\n    this.log('Engine disposed');\n  }\n\n  // ==========================================================================\n  // Priority Queue Processing\n  // ==========================================================================\n\n  private queueBoundary(boundary: StreamBoundaryData): void {\n    const priority = this.getPriorityValue(boundary.config.priority);\n    const deferMs = boundary.config.deferMs ?? 0;\n\n    const entry: QueueEntry = {\n      boundaryId: boundary.id,\n      priority,\n      queuedAt: Date.now(),\n      scheduledTime: Date.now() + deferMs,\n    };\n\n    this.priorityQueue.enqueue(entry);\n    this.log(`Queued boundary: ${boundary.id} with priority ${priority}, defer ${deferMs}ms`);\n  }\n\n  private processQueue(): void {\n    if (this.isProcessing) return;\n    this.isProcessing = true;\n\n    const processNext = (): void => {\n      // Check if we can process more streams\n      if (this.activeStreams >= this.config.maxConcurrentStreams) {\n        this.isProcessing = false;\n        return;\n      }\n\n      const entry = this.priorityQueue.peek();\n      if (!entry) {\n        this.isProcessing = false;\n        return;\n      }\n\n      const now = Date.now();\n      const delay = entry.scheduledTime - now;\n\n      if (delay > 0) {\n        // Schedule for later\n        this.processingTimer = setTimeout(() => {\n          this.processingTimer = null;\n          this.processEntry(entry);\n          processNext();\n        }, delay);\n        this.isProcessing = false;\n        return;\n      }\n\n      this.processEntry(entry);\n      processNext();\n    };\n\n    processNext();\n  }\n\n  private processEntry(entry: QueueEntry): void {\n    const poppedEntry = this.priorityQueue.dequeue();\n    if (!poppedEntry || poppedEntry.boundaryId !== entry.boundaryId) {\n      // Entry was removed from queue, skip\n      return;\n    }\n\n    const boundary = this.boundaries.get(entry.boundaryId);\n    if (!boundary || boundary.state !== StreamState.Pending) {\n      return;\n    }\n\n    this.startStreaming(boundary);\n  }\n\n  private startStreaming(boundary: StreamBoundaryData): void {\n    boundary.startTime = Date.now();\n    this.transitionState(boundary, StreamState.Streaming);\n    this.activeStreams++;\n\n    this.emitEvent(StreamEventType.Start, boundary.id);\n    boundary.config.onStreamStart?.();\n\n    // Set up timeout\n    if (\n      (boundary.config.timeoutMs != null && boundary.config.timeoutMs > 0) ||\n      (this.config.globalTimeoutMs != null && this.config.globalTimeoutMs > 0)\n    ) {\n      const timeout = boundary.config.timeoutMs ?? this.config.globalTimeoutMs ?? 0;\n      setTimeout(() => {\n        if (this.isActiveState(boundary.state)) {\n          this.handleTimeout(boundary);\n        }\n      }, timeout);\n    }\n\n    this.log(`Started streaming: ${boundary.id}`);\n  }\n\n  private completeStream(boundary: StreamBoundaryData): void {\n    boundary.endTime = Date.now();\n    this.transitionState(boundary, StreamState.Completed);\n    this.activeStreams--;\n\n    this.emitEvent(StreamEventType.Complete, boundary.id);\n    boundary.config.onStreamComplete?.();\n\n    // Record boundary metrics\n    this.recordBoundaryMetrics(boundary);\n    this.processQueue();\n\n    this.log(`Completed streaming: ${boundary.id}`);\n  }\n\n  // ==========================================================================\n  // Backpressure & Buffer Management\n  // ==========================================================================\n\n  private async handleBackpressure(boundary: StreamBoundaryData): Promise<void> {\n    this.metrics.backpressureEvents++;\n    this.emitEvent(StreamEventType.Backpressure, boundary.id, {\n      pressure: this.buffer.utilization,\n    });\n\n    switch (this.config.backpressureStrategy) {\n      case BackpressureStrategy.Pause:\n        // Pause until buffer drains\n        await this.waitForBufferDrain();\n        break;\n\n      case BackpressureStrategy.Drop:\n        // Will be handled in processChunk\n        this.log(`Backpressure: dropping chunks for ${boundary.id}`);\n        break;\n\n      case BackpressureStrategy.Buffer:\n        // Dynamic expansion not implemented - fall through to pause\n        await this.waitForBufferDrain();\n        break;\n\n      case BackpressureStrategy.Error: {\n        const error: StreamError = createStreamError(\n          StreamErrorCode.BufferOverflow,\n          'Buffer overflow - backpressure strategy is error',\n          { boundaryId: boundary.id }\n        );\n        throw error;\n      }\n    }\n  }\n\n  private handleBufferFull(boundary: StreamBoundaryData, chunk: StreamChunk): boolean {\n    if (this.config.backpressureStrategy === BackpressureStrategy.Drop) {\n      this.log(`Dropped chunk ${chunk.id} for ${boundary.id} - buffer full`);\n      return false;\n    }\n\n    const error: StreamError = createStreamError(\n      StreamErrorCode.BufferOverflow,\n      'Buffer full and backpressure strategy does not allow dropping',\n      { boundaryId: boundary.id, chunkId: chunk.id }\n    );\n    throw error;\n  }\n\n  private async waitForBufferDrain(): Promise<void> {\n    return new Promise((resolve) => {\n      const checkBuffer = (): void => {\n        if (!this.buffer.shouldApplyBackpressure) {\n          resolve();\n        } else {\n          setTimeout(checkBuffer, 10);\n        }\n      };\n      checkBuffer();\n    });\n  }\n\n  // ==========================================================================\n  // Error Handling & Retry\n  // ==========================================================================\n\n  private async handleChunkError(\n    boundary: StreamBoundaryData,\n    chunk: StreamChunk,\n    error: unknown\n  ): Promise<void> {\n    const streamError = this.normalizeError(error, boundary.id, chunk.id);\n    boundary.lastError = streamError;\n\n    if (\n      this.config.enableRetry &&\n      streamError.retryable &&\n      boundary.retryCount < this.config.maxRetries\n    ) {\n      await this.retryChunk(boundary, chunk);\n    } else {\n      this.handleStreamError(boundary, streamError);\n    }\n  }\n\n  private async retryChunk(boundary: StreamBoundaryData, chunk: StreamChunk): Promise<void> {\n    boundary.retryCount++;\n    this.metrics.retryAttempts++;\n\n    const delay = this.config.retryDelayMs * Math.pow(2, boundary.retryCount - 1);\n\n    this.emitEvent(StreamEventType.Retry, boundary.id, {\n      attempt: boundary.retryCount,\n      maxAttempts: this.config.maxRetries,\n    });\n\n    this.log(`Retrying chunk ${chunk.id} for ${boundary.id}, attempt ${boundary.retryCount}`);\n\n    await new Promise((resolve) => setTimeout(resolve, delay));\n\n    // Re-attempt processing\n    await this.processChunk(chunk);\n  }\n\n  private handleStreamError(boundary: StreamBoundaryData, error: StreamError): void {\n    this.transitionState(boundary, StreamState.Error);\n\n    if (this.isActiveState(boundary.state)) {\n      this.activeStreams--;\n    }\n\n    this.emitEvent(StreamEventType.Error, boundary.id, error);\n    boundary.config.onStreamError?.(error);\n    this.updateMetrics('error', boundary.id);\n\n    this.processQueue();\n  }\n\n  private handleTimeout(boundary: StreamBoundaryData): void {\n    const error = createStreamError(\n      StreamErrorCode.TimeoutError,\n      `Stream timeout exceeded for boundary \"${boundary.id}\"`,\n      { boundaryId: boundary.id }\n    );\n\n    this.handleStreamError(boundary, error);\n  }\n\n  private normalizeError(error: unknown, boundaryId: string, chunkId?: string): StreamError {\n    if (error instanceof Error) {\n      return createStreamError(StreamErrorCode.UnknownError, error.message, {\n        boundaryId,\n        chunkId,\n        cause: error,\n        stack: error.stack,\n      });\n    }\n\n    return createStreamError(StreamErrorCode.UnknownError, String(error), { boundaryId, chunkId });\n  }\n\n  // ==========================================================================\n  // Chunk Transformation\n  // ==========================================================================\n\n  private async applyTransformer(\n    chunk: StreamChunk,\n    boundary: StreamBoundaryData\n  ): Promise<StreamChunk> {\n    if (!this.config.chunkTransformer) return chunk;\n\n    const context: TransformContext = {\n      boundaryId: boundary.id,\n      config: boundary.config,\n      totalChunks: boundary.chunks.length,\n      totalBytes: boundary.bytesReceived,\n    };\n\n    return this.config.chunkTransformer(chunk, context);\n  }\n\n  // ==========================================================================\n  // State Machine\n  // ==========================================================================\n\n  private transitionState(boundary: StreamBoundaryData, newState: StreamState): void {\n    const oldState = boundary.state;\n\n    if (!this.canTransitionTo(oldState, newState)) {\n      this.log(`Invalid state transition: ${oldState} -> ${newState} for ${boundary.id}`);\n      return;\n    }\n\n    boundary.state = newState;\n\n    this.emitEvent(StreamEventType.StateChange, boundary.id, {\n      from: oldState,\n      to: newState,\n    });\n\n    this.log(`State transition: ${boundary.id} ${oldState} -> ${newState}`);\n  }\n\n  private canTransitionTo(from: StreamState, to: StreamState): boolean {\n    const validTransitions: Record<StreamState, StreamState[]> = {\n      [StreamState.Idle]: [StreamState.Pending],\n      [StreamState.Pending]: [StreamState.Streaming, StreamState.Aborted],\n      [StreamState.Streaming]: [\n        StreamState.Paused,\n        StreamState.Completed,\n        StreamState.Error,\n        StreamState.Aborted,\n      ],\n      [StreamState.Paused]: [StreamState.Streaming, StreamState.Aborted],\n      [StreamState.Completed]: [],\n      [StreamState.Error]: [],\n      [StreamState.Aborted]: [],\n    };\n\n    return validTransitions[from]?.includes(to) ?? false;\n  }\n\n  private isActiveState(state: StreamState): boolean {\n    return [StreamState.Streaming, StreamState.Paused].includes(state);\n  }\n\n  private isTerminalState(state: StreamState): boolean {\n    return [StreamState.Completed, StreamState.Error, StreamState.Aborted].includes(state);\n  }\n\n  // ==========================================================================\n  // Metrics & Telemetry\n  // ==========================================================================\n\n  private createInitialMetrics(): StreamMetrics {\n    return {\n      ...DEFAULT_METRICS,\n      boundaryMetrics: new Map(),\n      lastUpdated: Date.now(),\n    };\n  }\n\n  private updateMetrics(\n    action: 'register' | 'unregister' | 'chunk' | 'error',\n    boundaryId: string,\n    chunk?: StreamChunk\n  ): void {\n    if (!this.config.enableMetrics) return;\n\n    this.metrics.lastUpdated = Date.now();\n    this.metrics.activeStreams = this.activeStreams;\n\n    switch (action) {\n      case 'register': {\n        const boundary = this.boundaries.get(boundaryId);\n        if (boundary) {\n          const priority = this.normalizePriority(boundary.config.priority);\n          this.metrics.streamsByPriority[priority]++;\n        }\n        break;\n      }\n\n      case 'unregister':\n        // Metrics are preserved for historical analysis\n        break;\n\n      case 'chunk':\n        if (chunk) {\n          this.metrics.totalBytesTransferred += chunk.size;\n        }\n        break;\n\n      case 'error':\n        this.metrics.failedStreams++;\n        break;\n    }\n\n    this.metrics.bufferUtilization = this.buffer.utilization;\n  }\n\n  private recordChunkLatency(latency: number): void {\n    this.chunkLatencies.push(latency);\n\n    if (this.chunkLatencies.length > this.MAX_LATENCY_SAMPLES) {\n      this.chunkLatencies.shift();\n    }\n\n    this.metrics.averageChunkLatency =\n      this.chunkLatencies.reduce((sum, l) => sum + l, 0) / this.chunkLatencies.length;\n  }\n\n  private recordBoundaryMetrics(boundary: StreamBoundaryData): void {\n    const duration = (boundary.endTime ?? Date.now()) - (boundary.startTime ?? Date.now());\n\n    const [firstChunk] = boundary.chunks;\n    const metrics: BoundaryMetrics = {\n      boundaryId: boundary.id,\n      timeToFirstChunk: firstChunk ? firstChunk.timestamp - (boundary.startTime ?? 0) : 0,\n      timeToComplete: duration,\n      chunksReceived: boundary.chunks.length,\n      bytesReceived: boundary.bytesReceived,\n      averageChunkSize:\n        boundary.chunks.length > 0 ? boundary.bytesReceived / boundary.chunks.length : 0,\n      retries: boundary.retryCount,\n      successful: boundary.state === StreamState.Completed,\n    };\n\n    this.metrics.boundaryMetrics.set(boundary.id, metrics);\n    this.metrics.completedStreams++;\n\n    // Update average time to first chunk\n    const allTTFC = Array.from(this.metrics.boundaryMetrics.values()).map(\n      (m) => m.timeToFirstChunk\n    );\n    this.metrics.averageTimeToFirstChunk = allTTFC.reduce((sum, t) => sum + t, 0) / allTTFC.length;\n  }\n\n  // ==========================================================================\n  // Event Emission\n  // ==========================================================================\n\n  private emitEvent<T>(type: StreamEventType, boundaryId: string, payload?: T): void {\n    const event: StreamEvent<T> = {\n      type,\n      boundaryId,\n      timestamp: Date.now(),\n      payload,\n    };\n\n    for (const handler of this.eventHandlers) {\n      try {\n        handler(event);\n      } catch (error) {\n        this.log(`Event handler error: ${error instanceof Error ? error.message : String(error)}`);\n      }\n    }\n  }\n\n  // ==========================================================================\n  // Utility Methods\n  // ==========================================================================\n\n  private getPriorityValue(priority: StreamPriority | `${StreamPriority}`): number {\n    return PRIORITY_VALUES[priority as StreamPriority] ?? PRIORITY_VALUES[StreamPriority.Normal];\n  }\n\n  private normalizePriority(priority: StreamPriority | `${StreamPriority}`): StreamPriority {\n    if (Object.values(StreamPriority).includes(priority as StreamPriority)) {\n      return priority as StreamPriority;\n    }\n    return StreamPriority.Normal;\n  }\n\n  private log(...args: unknown[]): void {\n    if (this.config.debug) {\n      console.info('[StreamingEngine]', ...args);\n    }\n  }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Creates a new StreamingEngine instance with optional configuration.\n *\n * @param config - Partial engine configuration\n * @returns New StreamingEngine instance\n *\n * @example\n * ```typescript\n * const engine = createStreamingEngine({\n *   maxConcurrentStreams: 4,\n *   debug: true,\n * });\n * ```\n */\nexport function createStreamingEngine(config?: Partial<EngineConfig>): StreamingEngine {\n  return new StreamingEngine(config);\n}\n\n/**\n * Creates a chunk with proper defaults.\n *\n * @param data - Chunk data\n * @param boundaryId - Parent boundary ID\n * @param options - Additional chunk options\n * @returns Properly formatted StreamChunk\n */\nexport function createChunk(\n  data: string | Uint8Array,\n  boundaryId: string,\n  options?: Partial<Omit<StreamChunk, 'data' | 'boundaryId'>>\n): StreamChunk {\n  const dataSize = typeof data === 'string' ? new Blob([data]).size : data.byteLength;\n\n  return {\n    id: options?.id ?? `chunk-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n    sequence: options?.sequence ?? 0,\n    data,\n    timestamp: options?.timestamp ?? Date.now(),\n    size: options?.size ?? dataSize,\n    isFinal: options?.isFinal ?? false,\n    boundaryId,\n    checksum: options?.checksum,\n    metadata: options?.metadata,\n  };\n}\n\n/**\n * Calculates a simple checksum for chunk integrity verification.\n *\n * @param data - Data to checksum\n * @returns Hexadecimal checksum string\n */\nexport function calculateChecksum(data: string | Uint8Array): string {\n  const bytes = typeof data === 'string'\n    ? new TextEncoder().encode(data)\n    : data;\n\n  let hash = 0;\n  for (const byte of bytes) {\n    hash = ((hash << 5) - hash + byte) | 0;\n  }\n\n  return Math.abs(hash).toString(16).padStart(8, '0');\n}\n\n// ============================================================================\n// ReadableStream Integration\n// ============================================================================\n\n/**\n * Creates a ReadableStream that emits chunks from the engine.\n *\n * @param engine - StreamingEngine instance\n * @param boundaryId - Boundary to stream from\n * @returns ReadableStream of StreamChunks\n *\n * @example\n * ```typescript\n * const stream = createReadableStream(engine, 'main-content');\n *\n * const reader = stream.getReader();\n * while (true) {\n *   const { done, value } = await reader.read();\n *   if (done) break;\n *   console.log('Received chunk:', value);\n * }\n * ```\n */\nexport function createReadableStream(\n  engine: StreamingEngine,\n  boundaryId: string\n): ReadableStream<StreamChunk> {\n  let unsubscribe: (() => void) | null = null;\n\n  return new ReadableStream({\n    start(controller) {\n      unsubscribe = engine.subscribe((event) => {\n        if (event.boundaryId !== boundaryId) return;\n\n        switch (event.type) {\n          case StreamEventType.Chunk:\n            controller.enqueue(event.payload as StreamChunk);\n            break;\n          case StreamEventType.Complete:\n            controller.close();\n            break;\n          case StreamEventType.Error:\n          case StreamEventType.Abort:\n            controller.error(event.payload);\n            break;\n        }\n      });\n    },\n\n    cancel() {\n      engine.abort(boundaryId, 'Stream cancelled by consumer');\n      unsubscribe?.();\n    },\n  });\n}\n\n/**\n * Creates a TransformStream for processing chunks.\n *\n * @param transformer - Chunk transformer function\n * @returns TransformStream for chunk processing\n */\nexport function createChunkTransformStream(\n  transformer: (chunk: StreamChunk) => StreamChunk | Promise<StreamChunk>\n): TransformStream<StreamChunk, StreamChunk> {\n  return new TransformStream({\n    async transform(chunk, controller) {\n      const transformed = await transformer(chunk);\n      controller.enqueue(transformed);\n    },\n  });\n}\n"],"names":["PriorityQueue","item","result","lastItem","predicate","index","parentIndex","parentItem","currentItem","lastIndex","leftChildIndex","rightChildIndex","smallestIndex","leftChild","rightChild","smallestItem","updatedSmallestItem","indexItem","smallestIndexItem","StreamBuffer","capacity","highWaterMark","chunk","chunks","StreamingEngine","config","DEFAULT_ENGINE_CONFIG","id","createStreamError","StreamErrorCode","boundaryData","StreamState","boundary","entry","StreamEventType","reason","startTime","transformedChunk","latency","error","boundaryId","delivered","deliveredChunk","handler","priority","deferMs","processNext","now","delay","poppedEntry","timeout","BackpressureStrategy","resolve","checkBuffer","streamError","chunkId","context","newState","oldState","from","to","state","DEFAULT_METRICS","action","sum","l","duration","firstChunk","metrics","allTTFC","m","t","type","payload","event","PRIORITY_VALUES","StreamPriority","args","createStreamingEngine","createChunk","data","options","dataSize","calculateChecksum","bytes","hash","byte","createReadableStream","engine","unsubscribe","controller","createChunkTransformStream","transformer","transformed"],"mappings":";AA4EA,MAAMA,EAA8C;AAAA,EAC1C,OAAY,CAAA;AAAA;AAAA;AAAA;AAAA,EAKpB,IAAI,OAAe;AACjB,WAAO,KAAK,KAAK;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,UAAmB;AACrB,WAAO,KAAK,KAAK,WAAW;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQC,GAAe;AACrB,SAAK,KAAK,KAAKA,CAAI,GACnB,KAAK,SAAS,KAAK,KAAK,SAAS,CAAC;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAyB;AACvB,QAAI,KAAK,KAAK,WAAW,EAAG;AAC5B,QAAI,KAAK,KAAK,WAAW,EAAG,QAAO,KAAK,KAAK,IAAA;AAE7C,UAAM,CAACC,CAAM,IAAI,KAAK,MAChBC,IAAW,KAAK,KAAK,IAAA;AAC3B,WAAIA,MAAa,WACf,KAAK,KAAK,CAAC,IAAIA,GACf,KAAK,WAAW,CAAC,IAGZD;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAsB;AACpB,WAAO,KAAK,KAAK,CAAC;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,OAAO,CAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAOE,GAA0C;AAC/C,UAAMC,IAAQ,KAAK,KAAK,UAAUD,CAAS;AAC3C,QAAIC,MAAU,GAAI,QAAO;AAEzB,QAAIA,MAAU,KAAK,KAAK,SAAS;AAC/B,kBAAK,KAAK,IAAA,GACH;AAGT,UAAMF,IAAW,KAAK,KAAK,IAAA;AAC3B,QAAIA,MAAa,OAAW,QAAO;AAEnC,SAAK,KAAKE,CAAK,IAAIF;AACnB,UAAMG,IAAc,KAAK,OAAOD,IAAQ,KAAK,CAAC,GACxCE,IAAa,KAAK,KAAKD,CAAW;AAExC,WAAID,IAAQ,KAAKE,KAAc,QAAQ,KAAK,KAAKF,CAAK,EAAE,WAAWE,EAAW,WAC5E,KAAK,SAASF,CAAK,IAEnB,KAAK,WAAWA,CAAK,GAGhB;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAe;AACb,WAAO,CAAC,GAAG,KAAK,IAAI;AAAA,EACtB;AAAA,EAEQ,SAASA,GAAqB;AACpC,WAAOA,IAAQ,KAAG;AAChB,YAAMC,IAAc,KAAK,OAAOD,IAAQ,KAAK,CAAC,GACxCG,IAAc,KAAK,KAAKH,CAAK,GAC7BE,IAAa,KAAK,KAAKD,CAAW;AACxC,UAAI,CAACE,KAAe,CAACD,KAAcC,EAAY,YAAYD,EAAW,SAAU;AAEhF,OAAC,KAAK,KAAKF,CAAK,GAAG,KAAK,KAAKC,CAAW,CAAC,IAAI,CAACC,GAAYC,CAAW,GACrEH,IAAQC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,WAAWD,GAAqB;AACtC,UAAMI,IAAY,KAAK,KAAK,SAAS;AAErC,eAAa;AACX,YAAMC,IAAiB,IAAIL,IAAQ,GAC7BM,IAAkB,IAAIN,IAAQ;AACpC,UAAIO,IAAgBP;AAEpB,YAAMQ,IAAY,KAAK,KAAKH,CAAc,GACpCI,IAAa,KAAK,KAAKH,CAAe,GACtCI,IAAe,KAAK,KAAKH,CAAa;AAE5C,MACEF,KAAkBD,KAClBI,KACAE,KACAF,EAAU,WAAWE,EAAa,aAElCH,IAAgBF;AAGlB,YAAMM,IAAsB,KAAK,KAAKJ,CAAa;AAUnD,UARED,KAAmBF,KACnBK,KACAE,KACAF,EAAW,WAAWE,EAAoB,aAE1CJ,IAAgBD,IAGdC,MAAkBP,EAAO;AAE7B,YAAMY,IAAY,KAAK,KAAKZ,CAAK,GAC3Ba,IAAoB,KAAK,KAAKN,CAAa;AACjD,UAAI,CAACK,KAAa,CAACC,EAAmB;AAEtC,OAAC,KAAK,KAAKb,CAAK,GAAG,KAAK,KAAKO,CAAa,CAAC,IAAI,CAACM,GAAmBD,CAAS,GAC5EZ,IAAQO;AAAA,IACV;AAAA,EACF;AACF;AAaA,MAAMO,EAAa;AAAA,EACT,SAAsC,CAAA;AAAA,EAC7B;AAAA,EACA;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EAErB,YAAYC,GAAkBC,GAAuB;AACnD,SAAK,WAAWD,GAChB,KAAK,gBAAgBC,GACrB,KAAK,SAAS,IAAI,MAA+BD,CAAQ;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,OAAe;AACjB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAgB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAsB;AACxB,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,0BAAmC;AACrC,WAAO,KAAK,cAAc,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAkB;AACpB,WAAO,KAAK,SAAS,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAKE,GAA6B;AAChC,WAAI,KAAK,SAAe,MAExB,KAAK,OAAO,KAAK,IAAI,IAAIA,GACzB,KAAK,QAAQ,KAAK,OAAO,KAAK,KAAK,UACnC,KAAK,SACL,KAAK,cAAcA,EAAM,MAElB;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAiC;AAC/B,QAAI,KAAK,UAAU,EAAG;AAEtB,UAAMA,IAAQ,KAAK,OAAO,KAAK,IAAI;AACnC,QAAKA;AAEL,kBAAK,OAAO,KAAK,IAAI,IAAI,QACzB,KAAK,QAAQ,KAAK,OAAO,KAAK,KAAK,UACnC,KAAK,SACL,KAAK,cAAcA,EAAM,MAElBA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAgC;AAC9B,WAAO,KAAK,QAAQ,IAAI,KAAK,OAAO,KAAK,IAAI,IAAI;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,SAAS,IAAI,MAA+B,KAAK,QAAQ,GAC9D,KAAK,OAAO,GACZ,KAAK,OAAO,GACZ,KAAK,QAAQ,GACb,KAAK,aAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAuB;AACrB,UAAMC,IAAwB,CAAA;AAC9B,WAAO,KAAK,QAAQ,KAAG;AACrB,YAAMD,IAAQ,KAAK,MAAA;AACnB,MAAIA,KAAOC,EAAO,KAAKD,CAAK;AAAA,IAC9B;AACA,WAAOC;AAAA,EACT;AACF;AAwCO,MAAMC,EAAgB;AAAA,EACV;AAAA,EACA,iCAAkD,IAAA;AAAA,EAClD;AAAA,EACA;AAAA,EACA,oCAA6C,IAAA;AAAA,EAC7C;AAAA,EACT,gBAAgB;AAAA,EAChB,eAAe;AAAA,EACf,kBAAwD;AAAA,EAC/C,iBAA2B,CAAA;AAAA,EAC3B,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvC,YAAYC,IAAgC,IAAI;AAC9C,SAAK,SAAS,EAAE,GAAGC,GAAuB,GAAGD,EAAA,GAC7C,KAAK,gBAAgB,IAAIzB,EAAA,GACzB,KAAK,SAAS,IAAImB;AAAA,MAChB,KAAK,KAAK,KAAK,OAAO,aAAa,IAAI;AAAA;AAAA,MACvC,KAAK,OAAO;AAAA,IAAA,GAEd,KAAK,UAAU,KAAK,qBAAA,GAEpB,KAAK,IAAI,mCAAmC,KAAK,MAAM;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,uBAAgC;AACrC,WACE,OAAO,iBAAmB,OAC1B,OAAO,kBAAoB,OAC3B,OAAO,kBAAoB;AAAA,EAE/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,iBAAiBQ,GAAYF,GAA4B;AACvD,QAAI,KAAK,WAAW,IAAIE,CAAE;AACxB,YAAMC;AAAA,QACJC,EAAgB;AAAA,QAChB,qBAAqBF,CAAE;AAAA,QACvB,EAAE,YAAYA,EAAA;AAAA,MAAG;AAIrB,UAAMG,IAAmC;AAAA,MACvC,IAAAH;AAAA,MACA,QAAAF;AAAA,MACA,OAAOM,EAAY;AAAA,MACnB,QAAQ,CAAA;AAAA,MACR,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,iBAAiB,IAAI,gBAAA;AAAA,IAAgB;AAGvC,SAAK,WAAW,IAAIJ,GAAIG,CAAY,GACpC,KAAK,cAAc,YAAYH,CAAE,GACjC,KAAK,IAAI,wBAAwBA,CAAE,IAAIF,CAAM;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmBE,GAAqB;AACtC,UAAMK,IAAW,KAAK,WAAW,IAAIL,CAAE;AACvC,WAAKK,KAGD,KAAK,cAAcA,EAAS,KAAK,KACnC,KAAK,MAAML,GAAI,uBAAuB,GAIxC,KAAK,cAAc,OAAO,CAACM,MAAUA,EAAM,eAAeN,CAAE,GAE5D,KAAK,WAAW,OAAOA,CAAE,GACzB,KAAK,cAAc,cAAcA,CAAE,GACnC,KAAK,IAAI,0BAA0BA,CAAE,EAAE,GAEhC,MAde;AAAA,EAexB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAASA,GAAgC;AACvC,WAAO,KAAK,WAAW,IAAIA,CAAE,GAAG,SAAS;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAYA,GAAsD;AAChE,WAAO,KAAK,WAAW,IAAIA,CAAE;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAA2B;AACzB,WAAO,MAAM,KAAK,KAAK,WAAW,MAAM;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAMA,GAAkB;AACtB,UAAMK,IAAW,KAAK,WAAW,IAAIL,CAAE;AACvC,QAAI,CAACK;AAEH,YAAMJ,EAAkBC,EAAgB,aAAa,aAAaF,CAAE,eAAe;AAAA,QACjF,YAAYA;AAAA,MAAA,CACb;AAGH,QAAI,CAAC,KAAK,gBAAgBK,EAAS,OAAOD,EAAY,OAAO;AAE3D,YAAMH;AAAA,QACJC,EAAgB;AAAA,QAChB,0BAA0BF,CAAE,iBAAiBK,EAAS,KAAK;AAAA,QAC3D,EAAE,YAAYL,EAAA;AAAA,MAAG;AAIrB,SAAK,gBAAgBK,GAAUD,EAAY,OAAO,GAClD,KAAK,cAAcC,CAAQ,GAC3B,KAAK,aAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,WAAiB;AACf,eAAWL,KAAM,KAAK,WAAW,KAAA,GAAQ;AACvC,YAAMK,IAAW,KAAK,WAAW,IAAIL,CAAE;AACvC,MAAIK,KAAY,QAAQA,EAAS,UAAUD,EAAY,QACrD,KAAK,MAAMJ,CAAE;AAAA,IAEjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAMA,GAAkB;AACtB,UAAMK,IAAW,KAAK,WAAW,IAAIL,CAAE;AACvC,QAAI,CAACK;AAEH,YAAMJ,EAAkBC,EAAgB,aAAa,aAAaF,CAAE,eAAe;AAAA,QACjF,YAAYA;AAAA,MAAA,CACb;AAGH,QAAI,CAAC,KAAK,gBAAgBK,EAAS,OAAOD,EAAY,MAAM;AAE1D,YAAMH;AAAA,QACJC,EAAgB;AAAA,QAChB,0BAA0BF,CAAE,iBAAiBK,EAAS,KAAK;AAAA,QAC3D,EAAE,YAAYL,EAAA;AAAA,MAAG;AAIrB,SAAK,gBAAgBK,GAAUD,EAAY,MAAM,GACjD,KAAK,UAAUG,EAAgB,OAAOP,CAAE,GACxC,KAAK,iBACL,KAAK,aAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAOA,GAAkB;AACvB,UAAMK,IAAW,KAAK,WAAW,IAAIL,CAAE;AACvC,QAAI,CAACK;AAEH,YAAMJ,EAAkBC,EAAgB,aAAa,aAAaF,CAAE,eAAe;AAAA,QACjF,YAAYA;AAAA,MAAA,CACb;AAGH,QAAIK,EAAS,UAAUD,EAAY;AAEjC,YAAMH;AAAA,QACJC,EAAgB;AAAA,QAChB,2BAA2BF,CAAE,iBAAiBK,EAAS,KAAK;AAAA,QAC5D,EAAE,YAAYL,EAAA;AAAA,MAAG;AAIrB,SAAK,gBAAgBK,GAAUD,EAAY,SAAS,GACpD,KAAK,iBACL,KAAK,UAAUG,EAAgB,QAAQP,CAAE;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAMA,GAAYQ,IAAS,wBAA8B;AACvD,UAAMH,IAAW,KAAK,WAAW,IAAIL,CAAE;AACvC,IAAKK,MAED,KAAK,gBAAgBA,EAAS,KAAK,MAEvCA,EAAS,gBAAgB,MAAMG,CAAM,GACrC,KAAK,gBAAgBH,GAAUD,EAAY,OAAO,GAClD,KAAK,UAAUG,EAAgB,OAAOP,GAAI,EAAE,QAAAQ,GAAQ,GAEhD,KAAK,cAAcH,EAAS,KAAK,KACnC,KAAK,iBAGPA,EAAS,OAAO,gBAAgBG,CAAM,GACtC,KAAK,cAAc,OAAO,CAACF,MAAUA,EAAM,eAAeN,CAAE,GAC5D,KAAK,aAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,SAASQ,IAAS,wBAA8B;AAC9C,eAAWR,KAAM,KAAK,WAAW,KAAA;AAC/B,WAAK,MAAMA,GAAIQ,CAAM;AAAA,EAEzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAMR,GAAkB;AACtB,UAAMK,IAAW,KAAK,WAAW,IAAIL,CAAE;AACvC,IAAKK,MAED,KAAK,cAAcA,EAAS,KAAK,KACnC,KAAK,MAAML,GAAI,iBAAiB,GAGlCK,EAAS,QAAQD,EAAY,MAC7BC,EAAS,SAAS,CAAA,GAClBA,EAAS,gBAAgB,GACzBA,EAAS,iBAAiB,GAC1BA,EAAS,YAAY,QACrBA,EAAS,UAAU,QACnBA,EAAS,YAAY,QACrBA,EAAS,aAAa,GACtBA,EAAS,kBAAkB,IAAI,gBAAA,GAE/B,KAAK,IAAI,mBAAmBL,CAAE,EAAE;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBA,MAAM,aAAaL,GAAsC;AACvD,UAAMU,IAAW,KAAK,WAAW,IAAIV,EAAM,UAAU;AACrD,QAAI,CAACU,KAAY,CAAC,KAAK,cAAcA,EAAS,KAAK;AACjD,aAAO;AAGT,UAAMI,IAAY,YAAY,IAAA;AAE9B,QAAI;AAEF,YAAMC,IAAmB,KAAK,OAAO,mBACjC,MAAM,KAAK,iBAAiBf,GAAOU,CAAQ,IAC3CV;AAQJ,UALI,KAAK,OAAO,2BACd,MAAM,KAAK,mBAAmBU,CAAQ,GAIpC,CAAC,KAAK,OAAO,KAAKK,CAAgB;AACpC,eAAO,KAAK,iBAAiBL,GAAUK,CAAgB;AAGzD,MAAAL,EAAS,OAAO,KAAKK,CAAgB,GACrCL,EAAS,iBAAiBK,EAAiB;AAG3C,YAAMC,IAAU,YAAY,IAAA,IAAQF;AACpC,kBAAK,mBAAmBE,CAAO,GAE/B,KAAK,UAAUJ,EAAgB,OAAOZ,EAAM,YAAYe,CAAgB,GACxE,KAAK,cAAc,SAASf,EAAM,YAAYe,CAAgB,GAG1DA,EAAiB,WACnB,KAAK,eAAeL,CAAQ,GAGvB;AAAA,IACT,SAASO,GAAO;AACd,mBAAM,KAAK,iBAAiBP,GAAUV,GAAOiB,CAAK,GAC3C;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,cAAcC,GAAmC;AAC/C,UAAMR,IAAW,KAAK,WAAW,IAAIQ,CAAU;AAC/C,QAAI,CAACR,EAAU,QAAO,CAAA;AAEtB,UAAMS,IAA2B,CAAA;AAEjC,WAAO,KAAK,OAAO,OAAO,KACV,KAAK,OAAO,KAAA,GACf,eAAeD,KAFC;AAI3B,YAAME,IAAiB,KAAK,OAAO,MAAA;AACnC,MAAIA,KAAkB,SACpBD,EAAU,KAAKC,CAAc,GAC7BV,EAAS,kBAAkBU,EAAe;AAAA,IAE9C;AAEA,WAAOD;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBA,UAAUE,GAAyC;AACjD,gBAAK,cAAc,IAAIA,CAAO,GACvB,MAAM,KAAK,cAAc,OAAOA,CAAO;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAsC;AACpC,WAAO,EAAE,GAAG,KAAK,QAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAoC;AAClC,WAAO,EAAE,GAAG,KAAK,OAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,SAAK,SAAS,iBAAiB,GAC/B,KAAK,WAAW,MAAA,GAChB,KAAK,cAAc,MAAA,GACnB,KAAK,OAAO,MAAA,GACZ,KAAK,cAAc,MAAA,GAEf,KAAK,oBACP,aAAa,KAAK,eAAe,GACjC,KAAK,kBAAkB,OAGzB,KAAK,IAAI,iBAAiB;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAcX,GAAoC;AACxD,UAAMY,IAAW,KAAK,iBAAiBZ,EAAS,OAAO,QAAQ,GACzDa,IAAUb,EAAS,OAAO,WAAW,GAErCC,IAAoB;AAAA,MACxB,YAAYD,EAAS;AAAA,MACrB,UAAAY;AAAA,MACA,UAAU,KAAK,IAAA;AAAA,MACf,eAAe,KAAK,QAAQC;AAAA,IAAA;AAG9B,SAAK,cAAc,QAAQZ,CAAK,GAChC,KAAK,IAAI,oBAAoBD,EAAS,EAAE,kBAAkBY,CAAQ,WAAWC,CAAO,IAAI;AAAA,EAC1F;AAAA,EAEQ,eAAqB;AAC3B,QAAI,KAAK,aAAc;AACvB,SAAK,eAAe;AAEpB,UAAMC,IAAc,MAAY;AAE9B,UAAI,KAAK,iBAAiB,KAAK,OAAO,sBAAsB;AAC1D,aAAK,eAAe;AACpB;AAAA,MACF;AAEA,YAAMb,IAAQ,KAAK,cAAc,KAAA;AACjC,UAAI,CAACA,GAAO;AACV,aAAK,eAAe;AACpB;AAAA,MACF;AAEA,YAAMc,IAAM,KAAK,IAAA,GACXC,IAAQf,EAAM,gBAAgBc;AAEpC,UAAIC,IAAQ,GAAG;AAEb,aAAK,kBAAkB,WAAW,MAAM;AACtC,eAAK,kBAAkB,MACvB,KAAK,aAAaf,CAAK,GACvBa,EAAA;AAAA,QACF,GAAGE,CAAK,GACR,KAAK,eAAe;AACpB;AAAA,MACF;AAEA,WAAK,aAAaf,CAAK,GACvBa,EAAA;AAAA,IACF;AAEA,IAAAA,EAAA;AAAA,EACF;AAAA,EAEQ,aAAab,GAAyB;AAC5C,UAAMgB,IAAc,KAAK,cAAc,QAAA;AACvC,QAAI,CAACA,KAAeA,EAAY,eAAehB,EAAM;AAEnD;AAGF,UAAMD,IAAW,KAAK,WAAW,IAAIC,EAAM,UAAU;AACrD,IAAI,CAACD,KAAYA,EAAS,UAAUD,EAAY,WAIhD,KAAK,eAAeC,CAAQ;AAAA,EAC9B;AAAA,EAEQ,eAAeA,GAAoC;AASzD,QARAA,EAAS,YAAY,KAAK,IAAA,GAC1B,KAAK,gBAAgBA,GAAUD,EAAY,SAAS,GACpD,KAAK,iBAEL,KAAK,UAAUG,EAAgB,OAAOF,EAAS,EAAE,GACjDA,EAAS,OAAO,gBAAA,GAIbA,EAAS,OAAO,aAAa,QAAQA,EAAS,OAAO,YAAY,KACjE,KAAK,OAAO,mBAAmB,QAAQ,KAAK,OAAO,kBAAkB,GACtE;AACA,YAAMkB,IAAUlB,EAAS,OAAO,aAAa,KAAK,OAAO,mBAAmB;AAC5E,iBAAW,MAAM;AACf,QAAI,KAAK,cAAcA,EAAS,KAAK,KACnC,KAAK,cAAcA,CAAQ;AAAA,MAE/B,GAAGkB,CAAO;AAAA,IACZ;AAEA,SAAK,IAAI,sBAAsBlB,EAAS,EAAE,EAAE;AAAA,EAC9C;AAAA,EAEQ,eAAeA,GAAoC;AACzD,IAAAA,EAAS,UAAU,KAAK,IAAA,GACxB,KAAK,gBAAgBA,GAAUD,EAAY,SAAS,GACpD,KAAK,iBAEL,KAAK,UAAUG,EAAgB,UAAUF,EAAS,EAAE,GACpDA,EAAS,OAAO,mBAAA,GAGhB,KAAK,sBAAsBA,CAAQ,GACnC,KAAK,aAAA,GAEL,KAAK,IAAI,wBAAwBA,EAAS,EAAE,EAAE;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,mBAAmBA,GAA6C;AAM5E,YALA,KAAK,QAAQ,sBACb,KAAK,UAAUE,EAAgB,cAAcF,EAAS,IAAI;AAAA,MACxD,UAAU,KAAK,OAAO;AAAA,IAAA,CACvB,GAEO,KAAK,OAAO,sBAAA;AAAA,MAClB,KAAKmB,EAAqB;AAExB,cAAM,KAAK,mBAAA;AACX;AAAA,MAEF,KAAKA,EAAqB;AAExB,aAAK,IAAI,qCAAqCnB,EAAS,EAAE,EAAE;AAC3D;AAAA,MAEF,KAAKmB,EAAqB;AAExB,cAAM,KAAK,mBAAA;AACX;AAAA,MAEF,KAAKA,EAAqB;AAMxB,cAL2BvB;AAAA,UACzBC,EAAgB;AAAA,UAChB;AAAA,UACA,EAAE,YAAYG,EAAS,GAAA;AAAA,QAAG;AAAA,IAG9B;AAAA,EAEJ;AAAA,EAEQ,iBAAiBA,GAA8BV,GAA6B;AAClF,QAAI,KAAK,OAAO,yBAAyB6B,EAAqB;AAC5D,kBAAK,IAAI,iBAAiB7B,EAAM,EAAE,QAAQU,EAAS,EAAE,gBAAgB,GAC9D;AAQT,UAL2BJ;AAAA,MACzBC,EAAgB;AAAA,MAChB;AAAA,MACA,EAAE,YAAYG,EAAS,IAAI,SAASV,EAAM,GAAA;AAAA,IAAG;AAAA,EAGjD;AAAA,EAEA,MAAc,qBAAoC;AAChD,WAAO,IAAI,QAAQ,CAAC8B,MAAY;AAC9B,YAAMC,IAAc,MAAY;AAC9B,QAAK,KAAK,OAAO,0BAGf,WAAWA,GAAa,EAAE,IAF1BD,EAAA;AAAA,MAIJ;AACA,MAAAC,EAAA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBACZrB,GACAV,GACAiB,GACe;AACf,UAAMe,IAAc,KAAK,eAAef,GAAOP,EAAS,IAAIV,EAAM,EAAE;AACpE,IAAAU,EAAS,YAAYsB,GAGnB,KAAK,OAAO,eACZA,EAAY,aACZtB,EAAS,aAAa,KAAK,OAAO,aAElC,MAAM,KAAK,WAAWA,GAAUV,CAAK,IAErC,KAAK,kBAAkBU,GAAUsB,CAAW;AAAA,EAEhD;AAAA,EAEA,MAAc,WAAWtB,GAA8BV,GAAmC;AACxF,IAAAU,EAAS,cACT,KAAK,QAAQ;AAEb,UAAMgB,IAAQ,KAAK,OAAO,eAAe,KAAK,IAAI,GAAGhB,EAAS,aAAa,CAAC;AAE5E,SAAK,UAAUE,EAAgB,OAAOF,EAAS,IAAI;AAAA,MACjD,SAASA,EAAS;AAAA,MAClB,aAAa,KAAK,OAAO;AAAA,IAAA,CAC1B,GAED,KAAK,IAAI,kBAAkBV,EAAM,EAAE,QAAQU,EAAS,EAAE,aAAaA,EAAS,UAAU,EAAE,GAExF,MAAM,IAAI,QAAQ,CAACoB,MAAY,WAAWA,GAASJ,CAAK,CAAC,GAGzD,MAAM,KAAK,aAAa1B,CAAK;AAAA,EAC/B;AAAA,EAEQ,kBAAkBU,GAA8BO,GAA0B;AAChF,SAAK,gBAAgBP,GAAUD,EAAY,KAAK,GAE5C,KAAK,cAAcC,EAAS,KAAK,KACnC,KAAK,iBAGP,KAAK,UAAUE,EAAgB,OAAOF,EAAS,IAAIO,CAAK,GACxDP,EAAS,OAAO,gBAAgBO,CAAK,GACrC,KAAK,cAAc,SAASP,EAAS,EAAE,GAEvC,KAAK,aAAA;AAAA,EACP;AAAA,EAEQ,cAAcA,GAAoC;AACxD,UAAMO,IAAQX;AAAA,MACZC,EAAgB;AAAA,MAChB,yCAAyCG,EAAS,EAAE;AAAA,MACpD,EAAE,YAAYA,EAAS,GAAA;AAAA,IAAG;AAG5B,SAAK,kBAAkBA,GAAUO,CAAK;AAAA,EACxC;AAAA,EAEQ,eAAeA,GAAgBC,GAAoBe,GAA+B;AACxF,WAAIhB,aAAiB,QACZX,EAAkBC,EAAgB,cAAcU,EAAM,SAAS;AAAA,MACpE,YAAAC;AAAA,MACA,SAAAe;AAAA,MACA,OAAOhB;AAAA,MACP,OAAOA,EAAM;AAAA,IAAA,CACd,IAGIX,EAAkBC,EAAgB,cAAc,OAAOU,CAAK,GAAG,EAAE,YAAAC,GAAY,SAAAe,GAAS;AAAA,EAC/F;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,iBACZjC,GACAU,GACsB;AACtB,QAAI,CAAC,KAAK,OAAO,iBAAkB,QAAOV;AAE1C,UAAMkC,IAA4B;AAAA,MAChC,YAAYxB,EAAS;AAAA,MACrB,QAAQA,EAAS;AAAA,MACjB,aAAaA,EAAS,OAAO;AAAA,MAC7B,YAAYA,EAAS;AAAA,IAAA;AAGvB,WAAO,KAAK,OAAO,iBAAiBV,GAAOkC,CAAO;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgBxB,GAA8ByB,GAA6B;AACjF,UAAMC,IAAW1B,EAAS;AAE1B,QAAI,CAAC,KAAK,gBAAgB0B,GAAUD,CAAQ,GAAG;AAC7C,WAAK,IAAI,6BAA6BC,CAAQ,OAAOD,CAAQ,QAAQzB,EAAS,EAAE,EAAE;AAClF;AAAA,IACF;AAEA,IAAAA,EAAS,QAAQyB,GAEjB,KAAK,UAAUvB,EAAgB,aAAaF,EAAS,IAAI;AAAA,MACvD,MAAM0B;AAAA,MACN,IAAID;AAAA,IAAA,CACL,GAED,KAAK,IAAI,qBAAqBzB,EAAS,EAAE,IAAI0B,CAAQ,OAAOD,CAAQ,EAAE;AAAA,EACxE;AAAA,EAEQ,gBAAgBE,GAAmBC,GAA0B;AAgBnE,WAf6D;AAAA,MAC3D,CAAC7B,EAAY,IAAI,GAAG,CAACA,EAAY,OAAO;AAAA,MACxC,CAACA,EAAY,OAAO,GAAG,CAACA,EAAY,WAAWA,EAAY,OAAO;AAAA,MAClE,CAACA,EAAY,SAAS,GAAG;AAAA,QACvBA,EAAY;AAAA,QACZA,EAAY;AAAA,QACZA,EAAY;AAAA,QACZA,EAAY;AAAA,MAAA;AAAA,MAEd,CAACA,EAAY,MAAM,GAAG,CAACA,EAAY,WAAWA,EAAY,OAAO;AAAA,MACjE,CAACA,EAAY,SAAS,GAAG,CAAA;AAAA,MACzB,CAACA,EAAY,KAAK,GAAG,CAAA;AAAA,MACrB,CAACA,EAAY,OAAO,GAAG,CAAA;AAAA,IAAC,EAGF4B,CAAI,GAAG,SAASC,CAAE,KAAK;AAAA,EACjD;AAAA,EAEQ,cAAcC,GAA6B;AACjD,WAAO,CAAC9B,EAAY,WAAWA,EAAY,MAAM,EAAE,SAAS8B,CAAK;AAAA,EACnE;AAAA,EAEQ,gBAAgBA,GAA6B;AACnD,WAAO,CAAC9B,EAAY,WAAWA,EAAY,OAAOA,EAAY,OAAO,EAAE,SAAS8B,CAAK;AAAA,EACvF;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAsC;AAC5C,WAAO;AAAA,MACL,GAAGC;AAAA,MACH,qCAAqB,IAAA;AAAA,MACrB,aAAa,KAAK,IAAA;AAAA,IAAI;AAAA,EAE1B;AAAA,EAEQ,cACNC,GACAvB,GACAlB,GACM;AACN,QAAK,KAAK,OAAO,eAKjB;AAAA,cAHA,KAAK,QAAQ,cAAc,KAAK,IAAA,GAChC,KAAK,QAAQ,gBAAgB,KAAK,eAE1ByC,GAAA;AAAA,QACN,KAAK,YAAY;AACf,gBAAM/B,IAAW,KAAK,WAAW,IAAIQ,CAAU;AAC/C,cAAIR,GAAU;AACZ,kBAAMY,IAAW,KAAK,kBAAkBZ,EAAS,OAAO,QAAQ;AAChE,iBAAK,QAAQ,kBAAkBY,CAAQ;AAAA,UACzC;AACA;AAAA,QACF;AAAA,QAEA,KAAK;AAEH;AAAA,QAEF,KAAK;AACH,UAAItB,MACF,KAAK,QAAQ,yBAAyBA,EAAM;AAE9C;AAAA,QAEF,KAAK;AACH,eAAK,QAAQ;AACb;AAAA,MAAA;AAGJ,WAAK,QAAQ,oBAAoB,KAAK,OAAO;AAAA;AAAA,EAC/C;AAAA,EAEQ,mBAAmBgB,GAAuB;AAChD,SAAK,eAAe,KAAKA,CAAO,GAE5B,KAAK,eAAe,SAAS,KAAK,uBACpC,KAAK,eAAe,MAAA,GAGtB,KAAK,QAAQ,sBACX,KAAK,eAAe,OAAO,CAAC0B,GAAKC,MAAMD,IAAMC,GAAG,CAAC,IAAI,KAAK,eAAe;AAAA,EAC7E;AAAA,EAEQ,sBAAsBjC,GAAoC;AAChE,UAAMkC,KAAYlC,EAAS,WAAW,KAAK,UAAUA,EAAS,aAAa,KAAK,IAAA,IAE1E,CAACmC,CAAU,IAAInC,EAAS,QACxBoC,IAA2B;AAAA,MAC/B,YAAYpC,EAAS;AAAA,MACrB,kBAAkBmC,IAAaA,EAAW,aAAanC,EAAS,aAAa,KAAK;AAAA,MAClF,gBAAgBkC;AAAA,MAChB,gBAAgBlC,EAAS,OAAO;AAAA,MAChC,eAAeA,EAAS;AAAA,MACxB,kBACEA,EAAS,OAAO,SAAS,IAAIA,EAAS,gBAAgBA,EAAS,OAAO,SAAS;AAAA,MACjF,SAASA,EAAS;AAAA,MAClB,YAAYA,EAAS,UAAUD,EAAY;AAAA,IAAA;AAG7C,SAAK,QAAQ,gBAAgB,IAAIC,EAAS,IAAIoC,CAAO,GACrD,KAAK,QAAQ;AAGb,UAAMC,IAAU,MAAM,KAAK,KAAK,QAAQ,gBAAgB,OAAA,CAAQ,EAAE;AAAA,MAChE,CAACC,MAAMA,EAAE;AAAA,IAAA;AAEX,SAAK,QAAQ,0BAA0BD,EAAQ,OAAO,CAACL,GAAKO,MAAMP,IAAMO,GAAG,CAAC,IAAIF,EAAQ;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAaG,GAAuBhC,GAAoBiC,GAAmB;AACjF,UAAMC,IAAwB;AAAA,MAC5B,MAAAF;AAAA,MACA,YAAAhC;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,MAChB,SAAAiC;AAAA,IAAA;AAGF,eAAW9B,KAAW,KAAK;AACzB,UAAI;AACF,QAAAA,EAAQ+B,CAAK;AAAA,MACf,SAASnC,GAAO;AACd,aAAK,IAAI,wBAAwBA,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK,CAAC,EAAE;AAAA,MAC3F;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiBK,GAAwD;AAC/E,WAAO+B,EAAgB/B,CAA0B,KAAK+B,EAAgBC,EAAe,MAAM;AAAA,EAC7F;AAAA,EAEQ,kBAAkBhC,GAAgE;AACxF,WAAI,OAAO,OAAOgC,CAAc,EAAE,SAAShC,CAA0B,IAC5DA,IAEFgC,EAAe;AAAA,EACxB;AAAA,EAEQ,OAAOC,GAAuB;AACpC,IAAI,KAAK,OAAO,SACd,QAAQ,KAAK,qBAAqB,GAAGA,CAAI;AAAA,EAE7C;AACF;AAoBO,SAASC,EAAsBrD,GAAiD;AACrF,SAAO,IAAID,EAAgBC,CAAM;AACnC;AAUO,SAASsD,EACdC,GACAxC,GACAyC,GACa;AACb,QAAMC,IAAW,OAAOF,KAAS,WAAW,IAAI,KAAK,CAACA,CAAI,CAAC,EAAE,OAAOA,EAAK;AAEzE,SAAO;AAAA,IACL,IAAIC,GAAS,MAAM,SAAS,KAAK,KAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,IAChF,UAAUA,GAAS,YAAY;AAAA,IAC/B,MAAAD;AAAA,IACA,WAAWC,GAAS,aAAa,KAAK,IAAA;AAAA,IACtC,MAAMA,GAAS,QAAQC;AAAA,IACvB,SAASD,GAAS,WAAW;AAAA,IAC7B,YAAAzC;AAAA,IACA,UAAUyC,GAAS;AAAA,IACnB,UAAUA,GAAS;AAAA,EAAA;AAEvB;AAQO,SAASE,EAAkBH,GAAmC;AACnE,QAAMI,IAAQ,OAAOJ,KAAS,WAC1B,IAAI,cAAc,OAAOA,CAAI,IAC7BA;AAEJ,MAAIK,IAAO;AACX,aAAWC,KAAQF;AACjB,IAAAC,KAASA,KAAQ,KAAKA,IAAOC,IAAQ;AAGvC,SAAO,KAAK,IAAID,CAAI,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACpD;AAyBO,SAASE,EACdC,GACAhD,GAC6B;AAC7B,MAAIiD,IAAmC;AAEvC,SAAO,IAAI,eAAe;AAAA,IACxB,MAAMC,GAAY;AAChB,MAAAD,IAAcD,EAAO,UAAU,CAACd,MAAU;AACxC,YAAIA,EAAM,eAAelC;AAEzB,kBAAQkC,EAAM,MAAA;AAAA,YACZ,KAAKxC,EAAgB;AACnB,cAAAwD,EAAW,QAAQhB,EAAM,OAAsB;AAC/C;AAAA,YACF,KAAKxC,EAAgB;AACnB,cAAAwD,EAAW,MAAA;AACX;AAAA,YACF,KAAKxD,EAAgB;AAAA,YACrB,KAAKA,EAAgB;AACnB,cAAAwD,EAAW,MAAMhB,EAAM,OAAO;AAC9B;AAAA,UAAA;AAAA,MAEN,CAAC;AAAA,IACH;AAAA,IAEA,SAAS;AACP,MAAAc,EAAO,MAAMhD,GAAY,8BAA8B,GACvDiD,IAAA;AAAA,IACF;AAAA,EAAA,CACD;AACH;AAQO,SAASE,EACdC,GAC2C;AAC3C,SAAO,IAAI,gBAAgB;AAAA,IACzB,MAAM,UAAUtE,GAAOoE,GAAY;AACjC,YAAMG,IAAc,MAAMD,EAAYtE,CAAK;AAC3C,MAAAoE,EAAW,QAAQG,CAAW;AAAA,IAChC;AAAA,EAAA,CACD;AACH;"}