{"version":3,"file":"prefetch-strategies.mjs","sources":["../../../../src/lib/performance/prefetch/prefetch-strategies.ts"],"sourcesContent":["/**\n * @file Prefetch Strategies\n * @description Multiple prefetch strategies for different use cases including\n * viewport-based, interaction-based, and time-based prefetching.\n *\n * Features:\n * - Viewport intersection prefetching\n * - Hover/focus prefetching\n * - Idle time prefetching\n * - Sequential prefetching\n * - Conditional prefetching\n * - Strategy composition\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Prefetch strategy type\n */\nexport type PrefetchStrategyType =\n  | 'viewport'\n  | 'hover'\n  | 'focus'\n  | 'idle'\n  | 'sequential'\n  | 'immediate'\n  | 'conditional';\n\n/**\n * Prefetch target\n */\nexport interface PrefetchTarget {\n  url: string;\n  type: 'document' | 'script' | 'style' | 'image' | 'font' | 'fetch';\n  as?: string;\n  crossOrigin?: 'anonymous' | 'use-credentials';\n  importance?: 'high' | 'low' | 'auto';\n}\n\n/**\n * Strategy execution context\n */\nexport interface StrategyContext {\n  networkQuality: '4g' | '3g' | '2g' | 'slow-2g' | 'unknown';\n  dataSaver: boolean;\n  viewportWidth: number;\n  viewportHeight: number;\n  isVisible: boolean;\n  isIdle: boolean;\n  memoryPressure: 'none' | 'moderate' | 'critical';\n}\n\n/**\n * Strategy result\n */\nexport interface StrategyResult {\n  shouldPrefetch: boolean;\n  targets: PrefetchTarget[];\n  delay?: number;\n  reason: string;\n}\n\n/**\n * Base strategy configuration\n */\nexport interface BaseStrategyConfig {\n  /** Enable the strategy */\n  enabled: boolean;\n  /** Respect data saver preference */\n  respectDataSaver: boolean;\n  /** Minimum network quality required */\n  minNetworkQuality: '4g' | '3g' | '2g' | 'slow-2g';\n  /** Maximum memory pressure to allow prefetch */\n  maxMemoryPressure: 'none' | 'moderate' | 'critical';\n}\n\n/**\n * Viewport strategy configuration\n */\nexport interface ViewportStrategyConfig extends BaseStrategyConfig {\n  /** Root margin for intersection observer */\n  rootMargin: string;\n  /** Intersection threshold */\n  threshold: number;\n  /** Delay after intersection before prefetch */\n  delay: number;\n}\n\n/**\n * Hover strategy configuration\n */\nexport interface HoverStrategyConfig extends BaseStrategyConfig {\n  /** Delay after hover before prefetch */\n  delay: number;\n  /** Cancel if unhover before delay */\n  cancelOnUnhover: boolean;\n  /** Enable touch device support */\n  touchSupport: boolean;\n}\n\n/**\n * Idle strategy configuration\n */\nexport interface IdleStrategyConfig extends BaseStrategyConfig {\n  /** Timeout for idle callback */\n  timeout: number;\n  /** Minimum idle time required */\n  minIdleTime: number;\n}\n\n/**\n * Sequential strategy configuration\n */\nexport interface SequentialStrategyConfig extends BaseStrategyConfig {\n  /** Delay between sequential prefetches */\n  intervalDelay: number;\n  /** Maximum items to prefetch */\n  maxItems: number;\n  /** Prioritize by */\n  prioritizeBy: 'order' | 'size' | 'importance';\n}\n\n/**\n * Conditional strategy configuration\n */\nexport interface ConditionalStrategyConfig extends BaseStrategyConfig {\n  /** Condition function */\n  condition: (context: StrategyContext) => boolean;\n  /** Re-evaluate interval */\n  reevaluateInterval: number;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nconst DEFAULT_BASE_CONFIG: BaseStrategyConfig = {\n  enabled: true,\n  respectDataSaver: true,\n  minNetworkQuality: '3g',\n  maxMemoryPressure: 'moderate',\n};\n\nconst NETWORK_QUALITY_SCORES: Record<string, number> = {\n  '4g': 4,\n  '3g': 3,\n  '2g': 2,\n  'slow-2g': 1,\n  unknown: 3,\n};\n\n// ============================================================================\n// Base Strategy\n// ============================================================================\n\n/**\n * Abstract base class for prefetch strategies\n */\nexport abstract class PrefetchStrategy {\n  protected config: BaseStrategyConfig;\n  protected targets: PrefetchTarget[] = [];\n\n  protected constructor(config: Partial<BaseStrategyConfig> = {}) {\n    this.config = { ...DEFAULT_BASE_CONFIG, ...config };\n  }\n\n  /**\n   * Execute the strategy\n   */\n  abstract execute(context: StrategyContext): StrategyResult;\n\n  /**\n   * Add prefetch target\n   */\n  addTarget(target: PrefetchTarget): void {\n    this.targets.push(target);\n  }\n\n  /**\n   * Add multiple targets\n   */\n  addTargets(targets: PrefetchTarget[]): void {\n    this.targets.push(...targets);\n  }\n\n  /**\n   * Clear targets\n   */\n  clearTargets(): void {\n    this.targets = [];\n  }\n\n  /**\n   * Get current targets\n   */\n  getTargets(): PrefetchTarget[] {\n    return [...this.targets];\n  }\n\n  /**\n   * Check if prefetching should be allowed based on context\n   */\n  protected shouldAllowPrefetch(context: StrategyContext): {\n    allowed: boolean;\n    reason: string;\n  } {\n    if (!this.config.enabled) {\n      return { allowed: false, reason: 'Strategy disabled' };\n    }\n\n    if (this.config.respectDataSaver && context.dataSaver) {\n      return { allowed: false, reason: 'Data saver enabled' };\n    }\n\n    const currentQuality = NETWORK_QUALITY_SCORES[context.networkQuality] ?? 3;\n    const minQuality = NETWORK_QUALITY_SCORES[this.config.minNetworkQuality] ?? 3;\n\n    if (currentQuality < minQuality) {\n      return { allowed: false, reason: `Network quality ${context.networkQuality} below minimum` };\n    }\n\n    const pressureLevels = ['none', 'moderate', 'critical'];\n    const currentPressure = pressureLevels.indexOf(context.memoryPressure);\n    const maxPressure = pressureLevels.indexOf(this.config.maxMemoryPressure);\n\n    if (currentPressure > maxPressure) {\n      return { allowed: false, reason: `Memory pressure ${context.memoryPressure} too high` };\n    }\n\n    return { allowed: true, reason: 'Conditions met' };\n  }\n}\n\n// ============================================================================\n// Viewport Strategy\n// ============================================================================\n\n/**\n * Prefetch when elements enter the viewport\n */\nexport class ViewportPrefetchStrategy extends PrefetchStrategy {\n  private viewportConfig: ViewportStrategyConfig;\n  private observer: IntersectionObserver | null = null;\n  private observedElements: Map<Element, PrefetchTarget> = new Map();\n  private prefetchedUrls: Set<string> = new Set();\n  private onPrefetch: ((target: PrefetchTarget) => void) | null = null;\n\n  constructor(config: Partial<ViewportStrategyConfig> = {}) {\n    super(config);\n    this.viewportConfig = {\n      ...DEFAULT_BASE_CONFIG,\n      rootMargin: '200px',\n      threshold: 0,\n      delay: 0,\n      ...config,\n    };\n  }\n\n  execute(context: StrategyContext): StrategyResult {\n    const check = this.shouldAllowPrefetch(context);\n    if (!check.allowed) {\n      return { shouldPrefetch: false, targets: [], reason: check.reason };\n    }\n\n    // Return targets that are visible\n    const visibleTargets = this.targets.filter((t) => !this.prefetchedUrls.has(t.url));\n\n    return {\n      shouldPrefetch: visibleTargets.length > 0,\n      targets: visibleTargets,\n      delay: this.viewportConfig.delay,\n      reason: 'Elements in viewport',\n    };\n  }\n\n  /**\n   * Start observing an element\n   */\n  observe(element: Element, target: PrefetchTarget): void {\n    if (!this.observer) {\n      this.initObserver();\n    }\n\n    this.observedElements.set(element, target);\n    this.observer?.observe(element);\n  }\n\n  /**\n   * Stop observing an element\n   */\n  unobserve(element: Element): void {\n    this.observedElements.delete(element);\n    this.observer?.unobserve(element);\n  }\n\n  /**\n   * Set prefetch callback\n   */\n  setOnPrefetch(callback: (target: PrefetchTarget) => void): void {\n    this.onPrefetch = callback;\n  }\n\n  /**\n   * Disconnect observer\n   */\n  disconnect(): void {\n    this.observer?.disconnect();\n    this.observer = null;\n    this.observedElements.clear();\n  }\n\n  private initObserver(): void {\n    if (typeof IntersectionObserver === 'undefined') {\n      return;\n    }\n\n    this.observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          if (entry.isIntersecting) {\n            const target = this.observedElements.get(entry.target);\n            if (target && !this.prefetchedUrls.has(target.url)) {\n              this.handleIntersection(entry.target, target);\n            }\n          }\n        });\n      },\n      {\n        rootMargin: this.viewportConfig.rootMargin,\n        threshold: this.viewportConfig.threshold,\n      }\n    );\n  }\n\n  private handleIntersection(element: Element, target: PrefetchTarget): void {\n    const execute = (): void => {\n      this.prefetchedUrls.add(target.url);\n      this.onPrefetch?.(target);\n      this.unobserve(element);\n    };\n\n    if (this.viewportConfig.delay > 0) {\n      setTimeout(execute, this.viewportConfig.delay);\n    } else {\n      execute();\n    }\n  }\n}\n\n// ============================================================================\n// Hover Strategy\n// ============================================================================\n\n/**\n * Prefetch on hover/focus\n */\nexport class HoverPrefetchStrategy extends PrefetchStrategy {\n  private hoverConfig: HoverStrategyConfig;\n  private hoverTimers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n  private prefetchedUrls: Set<string> = new Set();\n  private onPrefetch: ((target: PrefetchTarget) => void) | null = null;\n\n  constructor(config: Partial<HoverStrategyConfig> = {}) {\n    super(config);\n    this.hoverConfig = {\n      ...DEFAULT_BASE_CONFIG,\n      delay: 100,\n      cancelOnUnhover: true,\n      touchSupport: true,\n      ...config,\n    };\n  }\n\n  execute(context: StrategyContext): StrategyResult {\n    const check = this.shouldAllowPrefetch(context);\n    if (!check.allowed) {\n      return { shouldPrefetch: false, targets: [], reason: check.reason };\n    }\n\n    return {\n      shouldPrefetch: true,\n      targets: this.targets.filter((t) => !this.prefetchedUrls.has(t.url)),\n      delay: this.hoverConfig.delay,\n      reason: 'Hover/focus detected',\n    };\n  }\n\n  /**\n   * Handle hover start\n   */\n  handleHoverStart(target: PrefetchTarget): void {\n    if (this.prefetchedUrls.has(target.url)) {\n      return;\n    }\n\n    const timer = setTimeout(() => {\n      this.prefetchedUrls.add(target.url);\n      this.onPrefetch?.(target);\n      this.hoverTimers.delete(target.url);\n    }, this.hoverConfig.delay);\n\n    this.hoverTimers.set(target.url, timer);\n  }\n\n  /**\n   * Handle hover end\n   */\n  handleHoverEnd(target: PrefetchTarget): void {\n    if (this.hoverConfig.cancelOnUnhover) {\n      const timer = this.hoverTimers.get(target.url);\n      if (timer) {\n        clearTimeout(timer);\n        this.hoverTimers.delete(target.url);\n      }\n    }\n  }\n\n  /**\n   * Set prefetch callback\n   */\n  setOnPrefetch(callback: (target: PrefetchTarget) => void): void {\n    this.onPrefetch = callback;\n  }\n\n  /**\n   * Create event handlers for an element\n   */\n  createHandlers(target: PrefetchTarget): {\n    onMouseEnter: () => void;\n    onMouseLeave: () => void;\n    onFocus: () => void;\n    onBlur: () => void;\n    onTouchStart?: () => void;\n  } {\n    const handlers = {\n      onMouseEnter: () => this.handleHoverStart(target),\n      onMouseLeave: () => this.handleHoverEnd(target),\n      onFocus: () => this.handleHoverStart(target),\n      onBlur: () => this.handleHoverEnd(target),\n    };\n\n    if (this.hoverConfig.touchSupport) {\n      return {\n        ...handlers,\n        onTouchStart: () => this.handleHoverStart(target),\n      };\n    }\n\n    return handlers;\n  }\n\n  /**\n   * Cleanup all pending hovers\n   */\n  cleanup(): void {\n    for (const timer of this.hoverTimers.values()) {\n      clearTimeout(timer);\n    }\n    this.hoverTimers.clear();\n  }\n}\n\n// ============================================================================\n// Idle Strategy\n// ============================================================================\n\n/**\n * Prefetch during browser idle time\n */\nexport class IdlePrefetchStrategy extends PrefetchStrategy {\n  private idleConfig: IdleStrategyConfig;\n  private idleCallbackId: number | null = null;\n  private prefetchedUrls: Set<string> = new Set();\n  private onPrefetch: ((target: PrefetchTarget) => void) | null = null;\n\n  constructor(config: Partial<IdleStrategyConfig> = {}) {\n    super(config);\n    this.idleConfig = {\n      ...DEFAULT_BASE_CONFIG,\n      timeout: 2000,\n      minIdleTime: 50,\n      ...config,\n    };\n  }\n\n  execute(context: StrategyContext): StrategyResult {\n    const check = this.shouldAllowPrefetch(context);\n    if (!check.allowed) {\n      return { shouldPrefetch: false, targets: [], reason: check.reason };\n    }\n\n    if (!context.isIdle) {\n      return { shouldPrefetch: false, targets: [], reason: 'Browser not idle' };\n    }\n\n    return {\n      shouldPrefetch: true,\n      targets: this.targets.filter((t) => !this.prefetchedUrls.has(t.url)),\n      reason: 'Browser idle',\n    };\n  }\n\n  /**\n   * Schedule idle prefetch\n   */\n  scheduleIdlePrefetch(): void {\n    if (typeof window === 'undefined') return;\n\n    const hasIdleCallback = 'requestIdleCallback' in window;\n\n    if (hasIdleCallback) {\n      this.idleCallbackId = (\n        window as Window &\n          typeof globalThis & {\n            requestIdleCallback: (\n              callback: (deadline: IdleDeadline) => void,\n              options?: { timeout?: number }\n            ) => number;\n          }\n      ).requestIdleCallback((deadline) => this.handleIdleCallback(deadline), {\n        timeout: this.idleConfig.timeout,\n      });\n    } else {\n      // Fallback to setTimeout\n      this.idleCallbackId = window.setTimeout(() => {\n        this.handleFallbackIdle();\n      }, this.idleConfig.timeout) as unknown as number;\n    }\n  }\n\n  /**\n   * Cancel scheduled prefetch\n   */\n  cancel(): void {\n    if (this.idleCallbackId !== null) {\n      if ('cancelIdleCallback' in window) {\n        (\n          window as Window &\n            typeof globalThis & {\n              cancelIdleCallback: (handle: number) => void;\n            }\n        ).cancelIdleCallback(this.idleCallbackId);\n      } else {\n        clearTimeout(this.idleCallbackId);\n      }\n      this.idleCallbackId = null;\n    }\n  }\n\n  /**\n   * Set prefetch callback\n   */\n  setOnPrefetch(callback: (target: PrefetchTarget) => void): void {\n    this.onPrefetch = callback;\n  }\n\n  private handleIdleCallback(deadline: IdleDeadline): void {\n    while (deadline.timeRemaining() >= this.idleConfig.minIdleTime && this.targets.length > 0) {\n      const target = this.targets.find((t) => !this.prefetchedUrls.has(t.url));\n      if (!target) break;\n\n      this.prefetchedUrls.add(target.url);\n      this.onPrefetch?.(target);\n    }\n\n    // Schedule another callback if there are remaining targets\n    if (this.targets.some((t) => !this.prefetchedUrls.has(t.url))) {\n      this.scheduleIdlePrefetch();\n    }\n  }\n\n  private handleFallbackIdle(): void {\n    const target = this.targets.find((t) => !this.prefetchedUrls.has(t.url));\n    if (target) {\n      this.prefetchedUrls.add(target.url);\n      this.onPrefetch?.(target);\n    }\n\n    // Schedule another if there are remaining targets\n    if (this.targets.some((t) => !this.prefetchedUrls.has(t.url))) {\n      this.scheduleIdlePrefetch();\n    }\n  }\n}\n\n// ============================================================================\n// Sequential Strategy\n// ============================================================================\n\n/**\n * Prefetch resources sequentially with delays\n */\nexport class SequentialPrefetchStrategy extends PrefetchStrategy {\n  private sequentialConfig: SequentialStrategyConfig;\n  private prefetchedUrls: Set<string> = new Set();\n  private currentIndex = 0;\n  private timer: ReturnType<typeof setTimeout> | null = null;\n  private onPrefetch: ((target: PrefetchTarget) => void) | null = null;\n\n  constructor(config: Partial<SequentialStrategyConfig> = {}) {\n    super(config);\n    this.sequentialConfig = {\n      ...DEFAULT_BASE_CONFIG,\n      intervalDelay: 500,\n      maxItems: 10,\n      prioritizeBy: 'order',\n      ...config,\n    };\n  }\n\n  execute(context: StrategyContext): StrategyResult {\n    const check = this.shouldAllowPrefetch(context);\n    if (!check.allowed) {\n      return { shouldPrefetch: false, targets: [], reason: check.reason };\n    }\n\n    const remaining = this.getOrderedTargets().filter((t) => !this.prefetchedUrls.has(t.url));\n\n    return {\n      shouldPrefetch: remaining.length > 0,\n      targets: remaining.slice(0, this.sequentialConfig.maxItems),\n      delay: this.sequentialConfig.intervalDelay,\n      reason: 'Sequential prefetch',\n    };\n  }\n\n  /**\n   * Start sequential prefetching\n   */\n  start(): void {\n    this.prefetchNext();\n  }\n\n  /**\n   * Stop sequential prefetching\n   */\n  stop(): void {\n    if (this.timer) {\n      clearTimeout(this.timer);\n      this.timer = null;\n    }\n  }\n\n  /**\n   * Reset to beginning\n   */\n  reset(): void {\n    this.stop();\n    this.currentIndex = 0;\n    this.prefetchedUrls.clear();\n  }\n\n  /**\n   * Set prefetch callback\n   */\n  setOnPrefetch(callback: (target: PrefetchTarget) => void): void {\n    this.onPrefetch = callback;\n  }\n\n  private prefetchNext(): void {\n    const ordered = this.getOrderedTargets();\n\n    if (\n      this.currentIndex >= ordered.length ||\n      this.currentIndex >= this.sequentialConfig.maxItems\n    ) {\n      return;\n    }\n\n    const target = ordered[this.currentIndex];\n    if (target && !this.prefetchedUrls.has(target.url)) {\n      this.prefetchedUrls.add(target.url);\n      this.onPrefetch?.(target);\n    }\n\n    this.currentIndex++;\n\n    // Schedule next\n    this.timer = setTimeout(() => {\n      this.prefetchNext();\n    }, this.sequentialConfig.intervalDelay);\n  }\n\n  private getOrderedTargets(): PrefetchTarget[] {\n    const targets = [...this.targets];\n\n    switch (this.sequentialConfig.prioritizeBy) {\n      case 'importance':\n        return targets.sort((a, b) => {\n          const importanceOrder = { high: 0, auto: 1, low: 2 };\n          return (\n            (importanceOrder[a.importance ?? 'auto'] ?? 1) -\n            (importanceOrder[b.importance ?? 'auto'] ?? 1)\n          );\n        });\n      case 'size':\n        // Smaller first (not available without fetch, so just return order)\n        return targets;\n      case 'order':\n      default:\n        return targets;\n    }\n  }\n}\n\n// ============================================================================\n// Conditional Strategy\n// ============================================================================\n\n/**\n * Prefetch based on custom conditions\n */\nexport class ConditionalPrefetchStrategy extends PrefetchStrategy {\n  private conditionalConfig: ConditionalStrategyConfig;\n  private prefetchedUrls: Set<string> = new Set();\n  private reevaluateTimer: ReturnType<typeof setInterval> | null = null;\n  private onPrefetch: ((target: PrefetchTarget) => void) | null = null;\n\n  constructor(\n    config: Partial<ConditionalStrategyConfig> & {\n      condition: (context: StrategyContext) => boolean;\n    }\n  ) {\n    super(config);\n    this.conditionalConfig = {\n      ...DEFAULT_BASE_CONFIG,\n      reevaluateInterval: config.reevaluateInterval ?? 1000,\n      ...config,\n    };\n  }\n\n  execute(context: StrategyContext): StrategyResult {\n    const baseCheck = this.shouldAllowPrefetch(context);\n    if (!baseCheck.allowed) {\n      return { shouldPrefetch: false, targets: [], reason: baseCheck.reason };\n    }\n\n    const conditionMet = this.conditionalConfig.condition(context);\n    if (!conditionMet) {\n      return { shouldPrefetch: false, targets: [], reason: 'Condition not met' };\n    }\n\n    return {\n      shouldPrefetch: true,\n      targets: this.targets.filter((t) => !this.prefetchedUrls.has(t.url)),\n      reason: 'Condition met',\n    };\n  }\n\n  /**\n   * Start periodic reevaluation\n   */\n  startReevaluation(getContext: () => StrategyContext): void {\n    if (this.reevaluateTimer) {\n      return;\n    }\n\n    this.reevaluateTimer = setInterval(() => {\n      const context = getContext();\n      const result = this.execute(context);\n\n      if (result.shouldPrefetch) {\n        result.targets.forEach((target) => {\n          this.prefetchedUrls.add(target.url);\n          this.onPrefetch?.(target);\n        });\n      }\n    }, this.conditionalConfig.reevaluateInterval);\n  }\n\n  /**\n   * Stop periodic reevaluation\n   */\n  stopReevaluation(): void {\n    if (this.reevaluateTimer) {\n      clearInterval(this.reevaluateTimer);\n      this.reevaluateTimer = null;\n    }\n  }\n\n  /**\n   * Set prefetch callback\n   */\n  setOnPrefetch(callback: (target: PrefetchTarget) => void): void {\n    this.onPrefetch = callback;\n  }\n}\n\n// ============================================================================\n// Strategy Composer\n// ============================================================================\n\n/**\n * Compose multiple strategies\n */\nexport class StrategyComposer {\n  private strategies: Map<string, PrefetchStrategy> = new Map();\n  private readonly mode: 'any' | 'all' = 'any';\n\n  constructor(mode: 'any' | 'all' = 'any') {\n    this.mode = mode;\n  }\n\n  /**\n   * Add a strategy\n   */\n  add(name: string, strategy: PrefetchStrategy): this {\n    this.strategies.set(name, strategy);\n    return this;\n  }\n\n  /**\n   * Remove a strategy\n   */\n  remove(name: string): boolean {\n    return this.strategies.delete(name);\n  }\n\n  /**\n   * Execute all strategies\n   */\n  execute(context: StrategyContext): StrategyResult {\n    const results = Array.from(this.strategies.values()).map((s) => s.execute(context));\n\n    if (this.mode === 'all') {\n      // All strategies must agree\n      const allShouldPrefetch = results.every((r) => r.shouldPrefetch);\n      const targets = this.mergeTargets(results);\n\n      return {\n        shouldPrefetch: allShouldPrefetch,\n        targets,\n        reason: allShouldPrefetch ? 'All strategies agree' : 'Not all strategies agree',\n      };\n    }\n\n    // Any strategy can trigger\n    const anyShouldPrefetch = results.some((r) => r.shouldPrefetch);\n    const targets = this.mergeTargets(results.filter((r) => r.shouldPrefetch));\n\n    return {\n      shouldPrefetch: anyShouldPrefetch,\n      targets,\n      reason: anyShouldPrefetch ? 'At least one strategy approved' : 'No strategy approved',\n    };\n  }\n\n  private mergeTargets(results: StrategyResult[]): PrefetchTarget[] {\n    const seen = new Set<string>();\n    const merged: PrefetchTarget[] = [];\n\n    for (const result of results) {\n      for (const target of result.targets) {\n        if (!seen.has(target.url)) {\n          seen.add(target.url);\n          merged.push(target);\n        }\n      }\n    }\n\n    return merged;\n  }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a viewport-based prefetch strategy\n */\nexport function createViewportStrategy(\n  config?: Partial<ViewportStrategyConfig>\n): ViewportPrefetchStrategy {\n  return new ViewportPrefetchStrategy(config);\n}\n\n/**\n * Create a hover-based prefetch strategy\n */\nexport function createHoverStrategy(config?: Partial<HoverStrategyConfig>): HoverPrefetchStrategy {\n  return new HoverPrefetchStrategy(config);\n}\n\n/**\n * Create an idle-based prefetch strategy\n */\nexport function createIdleStrategy(config?: Partial<IdleStrategyConfig>): IdlePrefetchStrategy {\n  return new IdlePrefetchStrategy(config);\n}\n\n/**\n * Create a sequential prefetch strategy\n */\nexport function createSequentialStrategy(\n  config?: Partial<SequentialStrategyConfig>\n): SequentialPrefetchStrategy {\n  return new SequentialPrefetchStrategy(config);\n}\n\n/**\n * Create a conditional prefetch strategy\n */\nexport function createConditionalStrategy(\n  config: Partial<ConditionalStrategyConfig> & { condition: (context: StrategyContext) => boolean }\n): ConditionalPrefetchStrategy {\n  return new ConditionalPrefetchStrategy(config);\n}\n"],"names":["DEFAULT_BASE_CONFIG","NETWORK_QUALITY_SCORES","PrefetchStrategy","config","target","targets","context","currentQuality","minQuality","pressureLevels","currentPressure","maxPressure","ViewportPrefetchStrategy","check","visibleTargets","t","element","callback","entries","entry","execute","HoverPrefetchStrategy","timer","handlers","IdlePrefetchStrategy","deadline","SequentialPrefetchStrategy","remaining","ordered","a","b","importanceOrder","ConditionalPrefetchStrategy","baseCheck","getContext","result","StrategyComposer","mode","name","strategy","results","s","allShouldPrefetch","r","anyShouldPrefetch","seen","merged","createViewportStrategy","createHoverStrategy","createIdleStrategy","createSequentialStrategy","createConditionalStrategy"],"mappings":"AA0IA,MAAMA,IAA0C;AAAA,EAC9C,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,mBAAmB;AAAA,EACnB,mBAAmB;AACrB,GAEMC,IAAiD;AAAA,EACrD,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,WAAW;AAAA,EACX,SAAS;AACX;AASO,MAAeC,EAAiB;AAAA,EAC3B;AAAA,EACA,UAA4B,CAAA;AAAA,EAE5B,YAAYC,IAAsC,IAAI;AAC9D,SAAK,SAAS,EAAE,GAAGH,GAAqB,GAAGG,EAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAUA,UAAUC,GAA8B;AACtC,SAAK,QAAQ,KAAKA,CAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAWC,GAAiC;AAC1C,SAAK,QAAQ,KAAK,GAAGA,CAAO;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAqB;AACnB,SAAK,UAAU,CAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,aAA+B;AAC7B,WAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKU,oBAAoBC,GAG5B;AACA,QAAI,CAAC,KAAK,OAAO;AACf,aAAO,EAAE,SAAS,IAAO,QAAQ,oBAAA;AAGnC,QAAI,KAAK,OAAO,oBAAoBA,EAAQ;AAC1C,aAAO,EAAE,SAAS,IAAO,QAAQ,qBAAA;AAGnC,UAAMC,IAAiBN,EAAuBK,EAAQ,cAAc,KAAK,GACnEE,IAAaP,EAAuB,KAAK,OAAO,iBAAiB,KAAK;AAE5E,QAAIM,IAAiBC;AACnB,aAAO,EAAE,SAAS,IAAO,QAAQ,mBAAmBF,EAAQ,cAAc,iBAAA;AAG5E,UAAMG,IAAiB,CAAC,QAAQ,YAAY,UAAU,GAChDC,IAAkBD,EAAe,QAAQH,EAAQ,cAAc,GAC/DK,IAAcF,EAAe,QAAQ,KAAK,OAAO,iBAAiB;AAExE,WAAIC,IAAkBC,IACb,EAAE,SAAS,IAAO,QAAQ,mBAAmBL,EAAQ,cAAc,YAAA,IAGrE,EAAE,SAAS,IAAM,QAAQ,iBAAA;AAAA,EAClC;AACF;AASO,MAAMM,UAAiCV,EAAiB;AAAA,EACrD;AAAA,EACA,WAAwC;AAAA,EACxC,uCAAqD,IAAA;AAAA,EACrD,qCAAkC,IAAA;AAAA,EAClC,aAAwD;AAAA,EAEhE,YAAYC,IAA0C,IAAI;AACxD,UAAMA,CAAM,GACZ,KAAK,iBAAiB;AAAA,MACpB,GAAGH;AAAA,MACH,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,OAAO;AAAA,MACP,GAAGG;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,QAAQG,GAA0C;AAChD,UAAMO,IAAQ,KAAK,oBAAoBP,CAAO;AAC9C,QAAI,CAACO,EAAM;AACT,aAAO,EAAE,gBAAgB,IAAO,SAAS,CAAA,GAAI,QAAQA,EAAM,OAAA;AAI7D,UAAMC,IAAiB,KAAK,QAAQ,OAAO,CAACC,MAAM,CAAC,KAAK,eAAe,IAAIA,EAAE,GAAG,CAAC;AAEjF,WAAO;AAAA,MACL,gBAAgBD,EAAe,SAAS;AAAA,MACxC,SAASA;AAAA,MACT,OAAO,KAAK,eAAe;AAAA,MAC3B,QAAQ;AAAA,IAAA;AAAA,EAEZ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQE,GAAkBZ,GAA8B;AACtD,IAAK,KAAK,YACR,KAAK,aAAA,GAGP,KAAK,iBAAiB,IAAIY,GAASZ,CAAM,GACzC,KAAK,UAAU,QAAQY,CAAO;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAUA,GAAwB;AAChC,SAAK,iBAAiB,OAAOA,CAAO,GACpC,KAAK,UAAU,UAAUA,CAAO;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAcC,GAAkD;AAC9D,SAAK,aAAaA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,UAAU,WAAA,GACf,KAAK,WAAW,MAChB,KAAK,iBAAiB,MAAA;AAAA,EACxB;AAAA,EAEQ,eAAqB;AAC3B,IAAI,OAAO,uBAAyB,QAIpC,KAAK,WAAW,IAAI;AAAA,MAClB,CAACC,MAAY;AACX,QAAAA,EAAQ,QAAQ,CAACC,MAAU;AACzB,cAAIA,EAAM,gBAAgB;AACxB,kBAAMf,IAAS,KAAK,iBAAiB,IAAIe,EAAM,MAAM;AACrD,YAAIf,KAAU,CAAC,KAAK,eAAe,IAAIA,EAAO,GAAG,KAC/C,KAAK,mBAAmBe,EAAM,QAAQf,CAAM;AAAA,UAEhD;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA;AAAA,QACE,YAAY,KAAK,eAAe;AAAA,QAChC,WAAW,KAAK,eAAe;AAAA,MAAA;AAAA,IACjC;AAAA,EAEJ;AAAA,EAEQ,mBAAmBY,GAAkBZ,GAA8B;AACzE,UAAMgB,IAAU,MAAY;AAC1B,WAAK,eAAe,IAAIhB,EAAO,GAAG,GAClC,KAAK,aAAaA,CAAM,GACxB,KAAK,UAAUY,CAAO;AAAA,IACxB;AAEA,IAAI,KAAK,eAAe,QAAQ,IAC9B,WAAWI,GAAS,KAAK,eAAe,KAAK,IAE7CA,EAAA;AAAA,EAEJ;AACF;AASO,MAAMC,UAA8BnB,EAAiB;AAAA,EAClD;AAAA,EACA,kCAA8D,IAAA;AAAA,EAC9D,qCAAkC,IAAA;AAAA,EAClC,aAAwD;AAAA,EAEhE,YAAYC,IAAuC,IAAI;AACrD,UAAMA,CAAM,GACZ,KAAK,cAAc;AAAA,MACjB,GAAGH;AAAA,MACH,OAAO;AAAA,MACP,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,GAAGG;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,QAAQG,GAA0C;AAChD,UAAMO,IAAQ,KAAK,oBAAoBP,CAAO;AAC9C,WAAKO,EAAM,UAIJ;AAAA,MACL,gBAAgB;AAAA,MAChB,SAAS,KAAK,QAAQ,OAAO,CAACE,MAAM,CAAC,KAAK,eAAe,IAAIA,EAAE,GAAG,CAAC;AAAA,MACnE,OAAO,KAAK,YAAY;AAAA,MACxB,QAAQ;AAAA,IAAA,IAPD,EAAE,gBAAgB,IAAO,SAAS,CAAA,GAAI,QAAQF,EAAM,OAAA;AAAA,EAS/D;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiBT,GAA8B;AAC7C,QAAI,KAAK,eAAe,IAAIA,EAAO,GAAG;AACpC;AAGF,UAAMkB,IAAQ,WAAW,MAAM;AAC7B,WAAK,eAAe,IAAIlB,EAAO,GAAG,GAClC,KAAK,aAAaA,CAAM,GACxB,KAAK,YAAY,OAAOA,EAAO,GAAG;AAAA,IACpC,GAAG,KAAK,YAAY,KAAK;AAEzB,SAAK,YAAY,IAAIA,EAAO,KAAKkB,CAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAelB,GAA8B;AAC3C,QAAI,KAAK,YAAY,iBAAiB;AACpC,YAAMkB,IAAQ,KAAK,YAAY,IAAIlB,EAAO,GAAG;AAC7C,MAAIkB,MACF,aAAaA,CAAK,GAClB,KAAK,YAAY,OAAOlB,EAAO,GAAG;AAAA,IAEtC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAca,GAAkD;AAC9D,SAAK,aAAaA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAeb,GAMb;AACA,UAAMmB,IAAW;AAAA,MACf,cAAc,MAAM,KAAK,iBAAiBnB,CAAM;AAAA,MAChD,cAAc,MAAM,KAAK,eAAeA,CAAM;AAAA,MAC9C,SAAS,MAAM,KAAK,iBAAiBA,CAAM;AAAA,MAC3C,QAAQ,MAAM,KAAK,eAAeA,CAAM;AAAA,IAAA;AAG1C,WAAI,KAAK,YAAY,eACZ;AAAA,MACL,GAAGmB;AAAA,MACH,cAAc,MAAM,KAAK,iBAAiBnB,CAAM;AAAA,IAAA,IAI7CmB;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAgB;AACd,eAAWD,KAAS,KAAK,YAAY,OAAA;AACnC,mBAAaA,CAAK;AAEpB,SAAK,YAAY,MAAA;AAAA,EACnB;AACF;AASO,MAAME,UAA6BtB,EAAiB;AAAA,EACjD;AAAA,EACA,iBAAgC;AAAA,EAChC,qCAAkC,IAAA;AAAA,EAClC,aAAwD;AAAA,EAEhE,YAAYC,IAAsC,IAAI;AACpD,UAAMA,CAAM,GACZ,KAAK,aAAa;AAAA,MAChB,GAAGH;AAAA,MACH,SAAS;AAAA,MACT,aAAa;AAAA,MACb,GAAGG;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,QAAQG,GAA0C;AAChD,UAAMO,IAAQ,KAAK,oBAAoBP,CAAO;AAC9C,WAAKO,EAAM,UAINP,EAAQ,SAIN;AAAA,MACL,gBAAgB;AAAA,MAChB,SAAS,KAAK,QAAQ,OAAO,CAACS,MAAM,CAAC,KAAK,eAAe,IAAIA,EAAE,GAAG,CAAC;AAAA,MACnE,QAAQ;AAAA,IAAA,IAND,EAAE,gBAAgB,IAAO,SAAS,CAAA,GAAI,QAAQ,mBAAA,IAJ9C,EAAE,gBAAgB,IAAO,SAAS,CAAA,GAAI,QAAQF,EAAM,OAAA;AAAA,EAY/D;AAAA;AAAA;AAAA;AAAA,EAKA,uBAA6B;AAC3B,QAAI,OAAO,SAAW,IAAa;AAInC,IAFwB,yBAAyB,SAG/C,KAAK,iBACH,OAOA,oBAAoB,CAACY,MAAa,KAAK,mBAAmBA,CAAQ,GAAG;AAAA,MACrE,SAAS,KAAK,WAAW;AAAA,IAAA,CAC1B,IAGD,KAAK,iBAAiB,OAAO,WAAW,MAAM;AAC5C,WAAK,mBAAA;AAAA,IACP,GAAG,KAAK,WAAW,OAAO;AAAA,EAE9B;AAAA;AAAA;AAAA;AAAA,EAKA,SAAe;AACb,IAAI,KAAK,mBAAmB,SACtB,wBAAwB,SAExB,OAIA,mBAAmB,KAAK,cAAc,IAExC,aAAa,KAAK,cAAc,GAElC,KAAK,iBAAiB;AAAA,EAE1B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAcR,GAAkD;AAC9D,SAAK,aAAaA;AAAA,EACpB;AAAA,EAEQ,mBAAmBQ,GAA8B;AACvD,WAAOA,EAAS,mBAAmB,KAAK,WAAW,eAAe,KAAK,QAAQ,SAAS,KAAG;AACzF,YAAMrB,IAAS,KAAK,QAAQ,KAAK,CAACW,MAAM,CAAC,KAAK,eAAe,IAAIA,EAAE,GAAG,CAAC;AACvE,UAAI,CAACX,EAAQ;AAEb,WAAK,eAAe,IAAIA,EAAO,GAAG,GAClC,KAAK,aAAaA,CAAM;AAAA,IAC1B;AAGA,IAAI,KAAK,QAAQ,KAAK,CAAC,MAAM,CAAC,KAAK,eAAe,IAAI,EAAE,GAAG,CAAC,KAC1D,KAAK,qBAAA;AAAA,EAET;AAAA,EAEQ,qBAA2B;AACjC,UAAMA,IAAS,KAAK,QAAQ,KAAK,CAAC,MAAM,CAAC,KAAK,eAAe,IAAI,EAAE,GAAG,CAAC;AACvE,IAAIA,MACF,KAAK,eAAe,IAAIA,EAAO,GAAG,GAClC,KAAK,aAAaA,CAAM,IAItB,KAAK,QAAQ,KAAK,CAAC,MAAM,CAAC,KAAK,eAAe,IAAI,EAAE,GAAG,CAAC,KAC1D,KAAK,qBAAA;AAAA,EAET;AACF;AASO,MAAMsB,UAAmCxB,EAAiB;AAAA,EACvD;AAAA,EACA,qCAAkC,IAAA;AAAA,EAClC,eAAe;AAAA,EACf,QAA8C;AAAA,EAC9C,aAAwD;AAAA,EAEhE,YAAYC,IAA4C,IAAI;AAC1D,UAAMA,CAAM,GACZ,KAAK,mBAAmB;AAAA,MACtB,GAAGH;AAAA,MACH,eAAe;AAAA,MACf,UAAU;AAAA,MACV,cAAc;AAAA,MACd,GAAGG;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,QAAQG,GAA0C;AAChD,UAAMO,IAAQ,KAAK,oBAAoBP,CAAO;AAC9C,QAAI,CAACO,EAAM;AACT,aAAO,EAAE,gBAAgB,IAAO,SAAS,CAAA,GAAI,QAAQA,EAAM,OAAA;AAG7D,UAAMc,IAAY,KAAK,kBAAA,EAAoB,OAAO,CAACZ,MAAM,CAAC,KAAK,eAAe,IAAIA,EAAE,GAAG,CAAC;AAExF,WAAO;AAAA,MACL,gBAAgBY,EAAU,SAAS;AAAA,MACnC,SAASA,EAAU,MAAM,GAAG,KAAK,iBAAiB,QAAQ;AAAA,MAC1D,OAAO,KAAK,iBAAiB;AAAA,MAC7B,QAAQ;AAAA,IAAA;AAAA,EAEZ;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,aAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKA,OAAa;AACX,IAAI,KAAK,UACP,aAAa,KAAK,KAAK,GACvB,KAAK,QAAQ;AAAA,EAEjB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,KAAA,GACL,KAAK,eAAe,GACpB,KAAK,eAAe,MAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAcV,GAAkD;AAC9D,SAAK,aAAaA;AAAA,EACpB;AAAA,EAEQ,eAAqB;AAC3B,UAAMW,IAAU,KAAK,kBAAA;AAErB,QACE,KAAK,gBAAgBA,EAAQ,UAC7B,KAAK,gBAAgB,KAAK,iBAAiB;AAE3C;AAGF,UAAMxB,IAASwB,EAAQ,KAAK,YAAY;AACxC,IAAIxB,KAAU,CAAC,KAAK,eAAe,IAAIA,EAAO,GAAG,MAC/C,KAAK,eAAe,IAAIA,EAAO,GAAG,GAClC,KAAK,aAAaA,CAAM,IAG1B,KAAK,gBAGL,KAAK,QAAQ,WAAW,MAAM;AAC5B,WAAK,aAAA;AAAA,IACP,GAAG,KAAK,iBAAiB,aAAa;AAAA,EACxC;AAAA,EAEQ,oBAAsC;AAC5C,UAAMC,IAAU,CAAC,GAAG,KAAK,OAAO;AAEhC,YAAQ,KAAK,iBAAiB,cAAA;AAAA,MAC5B,KAAK;AACH,eAAOA,EAAQ,KAAK,CAACwB,GAAGC,MAAM;AAC5B,gBAAMC,IAAkB,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,EAAA;AACjD,kBACGA,EAAgBF,EAAE,cAAc,MAAM,KAAK,MAC3CE,EAAgBD,EAAE,cAAc,MAAM,KAAK;AAAA,QAEhD,CAAC;AAAA,MACH,KAAK;AAEH,eAAOzB;AAAA,MACT,KAAK;AAAA,MACL;AACE,eAAOA;AAAA,IAAA;AAAA,EAEb;AACF;AASO,MAAM2B,UAAoC9B,EAAiB;AAAA,EACxD;AAAA,EACA,qCAAkC,IAAA;AAAA,EAClC,kBAAyD;AAAA,EACzD,aAAwD;AAAA,EAEhE,YACEC,GAGA;AACA,UAAMA,CAAM,GACZ,KAAK,oBAAoB;AAAA,MACvB,GAAGH;AAAA,MACH,oBAAoBG,EAAO,sBAAsB;AAAA,MACjD,GAAGA;AAAA,IAAA;AAAA,EAEP;AAAA,EAEA,QAAQG,GAA0C;AAChD,UAAM2B,IAAY,KAAK,oBAAoB3B,CAAO;AAClD,WAAK2B,EAAU,UAIM,KAAK,kBAAkB,UAAU3B,CAAO,IAKtD;AAAA,MACL,gBAAgB;AAAA,MAChB,SAAS,KAAK,QAAQ,OAAO,CAACS,MAAM,CAAC,KAAK,eAAe,IAAIA,EAAE,GAAG,CAAC;AAAA,MACnE,QAAQ;AAAA,IAAA,IAND,EAAE,gBAAgB,IAAO,SAAS,CAAA,GAAI,QAAQ,oBAAA,IAL9C,EAAE,gBAAgB,IAAO,SAAS,CAAA,GAAI,QAAQkB,EAAU,OAAA;AAAA,EAanE;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkBC,GAAyC;AACzD,IAAI,KAAK,oBAIT,KAAK,kBAAkB,YAAY,MAAM;AACvC,YAAM5B,IAAU4B,EAAA,GACVC,IAAS,KAAK,QAAQ7B,CAAO;AAEnC,MAAI6B,EAAO,kBACTA,EAAO,QAAQ,QAAQ,CAAC/B,MAAW;AACjC,aAAK,eAAe,IAAIA,EAAO,GAAG,GAClC,KAAK,aAAaA,CAAM;AAAA,MAC1B,CAAC;AAAA,IAEL,GAAG,KAAK,kBAAkB,kBAAkB;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAyB;AACvB,IAAI,KAAK,oBACP,cAAc,KAAK,eAAe,GAClC,KAAK,kBAAkB;AAAA,EAE3B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAca,GAAkD;AAC9D,SAAK,aAAaA;AAAA,EACpB;AACF;AASO,MAAMmB,EAAiB;AAAA,EACpB,iCAAgD,IAAA;AAAA,EACvC,OAAsB;AAAA,EAEvC,YAAYC,IAAsB,OAAO;AACvC,SAAK,OAAOA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIC,GAAcC,GAAkC;AAClD,gBAAK,WAAW,IAAID,GAAMC,CAAQ,GAC3B;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAOD,GAAuB;AAC5B,WAAO,KAAK,WAAW,OAAOA,CAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQhC,GAA0C;AAChD,UAAMkC,IAAU,MAAM,KAAK,KAAK,WAAW,OAAA,CAAQ,EAAE,IAAI,CAACC,MAAMA,EAAE,QAAQnC,CAAO,CAAC;AAElF,QAAI,KAAK,SAAS,OAAO;AAEvB,YAAMoC,IAAoBF,EAAQ,MAAM,CAACG,MAAMA,EAAE,cAAc,GACzDtC,IAAU,KAAK,aAAamC,CAAO;AAEzC,aAAO;AAAA,QACL,gBAAgBE;AAAA,QAChB,SAAArC;AAAAA,QACA,QAAQqC,IAAoB,yBAAyB;AAAA,MAAA;AAAA,IAEzD;AAGA,UAAME,IAAoBJ,EAAQ,KAAK,CAACG,MAAMA,EAAE,cAAc,GACxDtC,IAAU,KAAK,aAAamC,EAAQ,OAAO,CAACG,MAAMA,EAAE,cAAc,CAAC;AAEzE,WAAO;AAAA,MACL,gBAAgBC;AAAA,MAChB,SAAAvC;AAAA,MACA,QAAQuC,IAAoB,mCAAmC;AAAA,IAAA;AAAA,EAEnE;AAAA,EAEQ,aAAaJ,GAA6C;AAChE,UAAMK,wBAAW,IAAA,GACXC,IAA2B,CAAA;AAEjC,eAAWX,KAAUK;AACnB,iBAAWpC,KAAU+B,EAAO;AAC1B,QAAKU,EAAK,IAAIzC,EAAO,GAAG,MACtByC,EAAK,IAAIzC,EAAO,GAAG,GACnB0C,EAAO,KAAK1C,CAAM;AAKxB,WAAO0C;AAAA,EACT;AACF;AASO,SAASC,EACd5C,GAC0B;AAC1B,SAAO,IAAIS,EAAyBT,CAAM;AAC5C;AAKO,SAAS6C,EAAoB7C,GAA8D;AAChG,SAAO,IAAIkB,EAAsBlB,CAAM;AACzC;AAKO,SAAS8C,EAAmB9C,GAA4D;AAC7F,SAAO,IAAIqB,EAAqBrB,CAAM;AACxC;AAKO,SAAS+C,EACd/C,GAC4B;AAC5B,SAAO,IAAIuB,EAA2BvB,CAAM;AAC9C;AAKO,SAASgD,EACdhD,GAC6B;AAC7B,SAAO,IAAI6B,EAA4B7B,CAAM;AAC/C;"}