@lumen-stack/react 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -1
- package/dist/index.d.ts +43 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/errors.ts","../../core/src/client.ts","../../core/src/capture-screenshot.ts","../../core/src/capture-runtime.ts","../../core/src/capture-context.ts","../../core/src/record-audio.ts","../../core/src/record-video.ts","../src/context.ts","../src/AnnotationLayer.tsx","../src/CaptureModal.tsx","../src/trigger/autoDetectAvoid.ts","../src/trigger/useCollisionInsets.ts","../src/trigger/useViewportKeyboard.ts","../src/trigger/FloatingTrigger.tsx","../src/trigger/InlineTrigger.tsx","../src/trigger/NotchTrigger.tsx","../src/trigger/types.ts","../src/trigger/theme.ts","../src/trigger/useHideOn.ts","../src/trigger/useNativeShell.ts","../src/trigger/useRemoteConfig.ts","../src/LumenProvider.tsx","../src/FeedbackButton.tsx"],"names":["LumenError","message","code","status","LumenOriginError","LumenRateLimitError","retryAfter","LumenNetworkError","DEFAULT_API_URL","SUBMIT_PATH","RETRYABLE_STATUSES","LumenClient","config","payload","options","url","body","#buildFormData","lastError","attempt","wait","#sendOnce","e","fd","amplitude","context","screenshotFilename","resolve","reject","xhr","onUploadProgress","signal","onAbort","parseError","parsed","blob","ms","r","text","obj","DEFAULT_MAX_SCALE","MAX_SCREENSHOT_BYTES","captureScreen","assertBrowser","mode","normalizeProviderResult","captureDisplayMedia","captureDom","domError","canUseDisplayMedia","result","uniq","createManualCaptureResult","warnings","viewport","currentViewport","html2canvas","loadHtml2Canvas","target","scale","collectDomWarnings","canvas","el","encodeCanvas","stream","video","waitForVideoFrame","ctx","track","normalized","crossOriginImages","img","src","canvasToBlob","working","ratio","next","quality","type","visual","done","fail","start","MAX_WAIT_MS","values","consoleBuf","networkBuf","installed","ignoreUrlPrefix","installRuntimeCapture","patchConsole","patchFetch","patchXhr","readRuntimeCapture","pushBounded","buf","entry","safeStringify","args","out","arg","replacer","joined","_key","value","levels","level","original","isIgnored","originalFetch","input","init","method","started","res","truncate","OriginalXHR","originalOpen","originalSend","rest","meta","onDone","s","captureContext","capture","toCaptureMetadata","runtime","snapshotDevice","device","recordAudio","maxSeconds","mimeType","m","recorder","chunks","timeoutId","release","durationMs","finalType","recordVideo","videoTrack","LumenContext","createContext","useLumen","useContext","AnnotationLayer","screenshot","tool","color","strokeWidth","onDrawingChange","ref","baseCanvasRef","useRef","overlayCanvasRef","containerRef","imageBitmap","setImageBitmap","useState","annotations","setAnnotations","draftRef","isDrawingRef","lastSampleAtRef","rafPendingRef","useEffect","cancelled","decoded","bm","base","overlay","redraw","useImperativeHandle","cur","draft","all","anno","drawAnno","clientToCanvas","c","rect","sx","sy","scheduleDraftPaint","onPointerDown","onPointerMove","last","dist2","now","elapsed","onPointerUp","dx","dy","jsxs","jsx","a","x","y","w","h","drawSmoothPath","from","to","width","angle","head","points","first","second","i","p","mx","my","VOICE_MAX_SECONDS","VIDEO_MAX_SECONDS","SWATCHES","STROKE_SIZES","CATEGORIES","METHODS","CaptureModal","client","isOpen","closeCapture","user","step","setStep","setMethod","phase","setPhase","submitting","setSubmitting","progress","setProgress","flattenedShot","setFlattenedShot","setTool","strokeColor","setStrokeColor","setStrokeWidth","setText","category","setCategory","submitterEmail","setSubmitterEmail","setRecorder","audio","setAudio","recordSecs","setRecordSecs","videoRecorder","setVideoRecorder","setVideo","drawing","setDrawing","annotationRef","modalRef","previouslyFocusedRef","captureCancelledRef","html","prevOverflow","prevPaddingRight","scrollbar","restored","restore","onKey","root","focusables","getFocusable","active","onPaste","file","item","acceptManualScreenshot","id","sec","finishRecording","runCapture","showCaptureWarnings","selectMethod","discardVideo","startVideo","toast","j","startRecording","le","discardRecording","pe","finishVideo","handle","captured","goNext","flat","submit","goBack","trimmed","captureResult","flatScreenshot","T","fraction","onBackdropMouseDown","uploadingPct","isVideoMethod","nextDisabled","nextLabel","SheetGrabber","Stepper","Fragment","ToolButton","captureLabel","Waveform","AudioPreview","steps","label","onClick","onDismiss","startYRef","startTimeRef","targetRef","dt","velocity","canvasRef","dpr","cssWidth","cssHeight","AudioCtor","audioCtx","source","analyser","data","BARS","GAP","MIN_H","barW","radius","raf","frame","bucketSize","getCssVar","peak","v","roundRectPath","anyCtx","setUrl","u","name","FOCUSABLE_SELECTOR","detectBottomFloor","probeY","probeXs","seen","tallest","stack","cs","measureExplicitAvoidForSide","selectors","side","selector","nodes","node","overlap","useCollisionInsets","insets","setInsets","lastRef","avoidKey","avoidToKey","placement","offsetX","offsetY","measure","xSide","yExtra","xExtra","prev","schedule","ro","mo","vv","avoid","useViewportKeyboard","enabled","open","setOpen","KEYBOARD_THRESHOLD","check","shrink","FloatingTrigger","portalTarget","hidden","setTarget","buttonRef","keyboardOpen","useOcclusionWarning","sideY","sideX","yPx","xPx","style","createPortal","warnedRef","t","cx","cy","ourZ","parseZ","candidate","z","n","InlineTrigger","mount","icon","NotchTrigger","expanded","setExpanded","dragStartRef","className","onPointerCancel","resolveNotchConfig","cfg","resolveFloatingConfig","VAR_MAP","useApplyTheme","theme","instanceId","useId","attr","slug","previous","cssVar","key","k","PATCH_FLAG","EVENT_NAME","ensureHistoryPatch","dispatch","origPush","origReplace","useHideOn","predicate","setHidden","evaluate","NATIVE_UA_TOKENS","useNativeShell","native","setNative","wk","ua","STORAGE_PREFIX","STORAGE_TTL_MS","useRemoteConfig","apiKey","apiUrl","state","setState","cached","readCache","triggerEnabled","controller","trigger","parseTrigger","writeCache","VALID_PLACEMENTS","VALID_EDGES","raw","LumenProvider","floatingButton","hideOn","children","setIsOpen","isSubmitting","error","useMemo","ee","useCallback","close","isNativeShell","hideTrigger","remote","effectiveTrigger","resolveEffectiveTrigger","FeedbackButton","variant","floating","openCapture","cls"],"mappings":"uIAAO,IAAMA,CAAAA,CAAN,cAAyB,KAAM,CACpC,YACEC,CAAAA,CACgBC,CAAAA,CACAC,EAChB,CACA,KAAA,CAAMF,CAAO,CAAA,CAHG,IAAA,CAAA,IAAA,CAAAC,EACA,IAAA,CAAA,MAAA,CAAAC,EAGhB,IAAA,CAAK,IAAA,CAAO,aACd,CALkB,IAAA,CACA,MAKpB,CAAA,CAEaC,EAAAA,CAAN,cAA+BJ,CAAW,CAC/C,WAAA,EAAc,CACZ,KAAA,CACE,qEAAA,CACA,qBACA,GACF,CAAA,CACA,IAAA,CAAK,IAAA,CAAO,mBACd,CACF,EAEaK,EAAAA,CAAN,cAAkCL,CAAW,CAClD,WAAA,CAA4BM,EAAoB,CAC9C,KAAA,CACE,CAAA,gCAAA,EAA8BA,CAAU,CAAA,EAAA,CAAA,CACxC,cAAA,CACA,GACF,CAAA,CAL0B,IAAA,CAAA,WAAAA,CAAAA,CAM1B,IAAA,CAAK,KAAO,sBACd,CAP4B,UAQ9B,CAAA,CAEaC,EAAAA,CAAN,cAAgCP,CAAW,CAChD,WAAA,CAAYC,EAAiB,CAC3B,KAAA,CAAMA,EAAS,eAAe,CAAA,CAC9B,IAAA,CAAK,IAAA,CAAO,oBACd,CACF,ECvBMO,EAAAA,CAAkB,8BAAA,CAClBC,EAAAA,CAAc,oBAAA,CAEdC,EAAAA,CAAqB,IAAI,IAAI,CAAC,GAAA,CAAK,GAAA,CAAK,GAAG,CAAC,CAAA,CAErCC,GAAN,KAAkB,CACd,OACA,MAAA,CACT,IAAA,CACA,UAEA,WAAA,CAAYC,CAAAA,CAA2B,CACrC,GAAI,CAACA,CAAAA,CAAO,QAAU,CAACA,CAAAA,CAAO,OAAO,UAAA,CAAW,SAAS,EACvD,MAAM,IAAIZ,CAAAA,CACR,qEAAA,CACA,iBACF,CAAA,CAEF,KAAK,MAAA,CAASY,CAAAA,CAAO,OACrB,IAAA,CAAK,MAAA,CAAA,CAAUA,EAAO,MAAA,EAAUJ,EAAAA,EAAiB,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAA,CAClE,KAAK,IAAA,CAAOI,CAAAA,CAAO,KACnB,IAAA,CAAK,SAAA,CAAYA,EAAO,UAC1B,CAOA,MAAM,MAAA,CACJC,CAAAA,CACAC,CAAAA,CAAyB,EAAA,CACF,CACvB,IAAMC,CAAAA,CAAM,CAAA,EAAG,KAAK,MAAM,CAAA,EAAGN,EAAW,CAAA,CAAA,CAClCO,CAAAA,CAAO,IAAA,CAAKC,GAAeJ,CAAO,CAAA,CAEpCK,EAAqB,IAAA,CACzB,IAAA,IAASC,EAAU,CAAA,CAAGA,CAAAA,CAAU,CAAA,CAAGA,CAAAA,EAAAA,CAAW,CACxCA,CAAAA,CAAU,GACZ,MAAMC,EAAAA,CAAK,GAAKD,CAAAA,CAAU,GAAG,EAE/B,GAAI,CACF,OAAO,MAAM,IAAA,CAAKE,EAAAA,CAAUN,EAAKC,CAAAA,CAAMF,CAAO,CAChD,CAAA,MAASQ,CAAAA,CAAG,CASV,GARAJ,CAAAA,CAAYI,CAAAA,CAGVA,CAAAA,YAAalB,EAAAA,EACbkB,CAAAA,YAAajB,EAAAA,EAKbiB,aAAatB,CAAAA,EACb,OAAOsB,EAAE,MAAA,EAAW,QAAA,EACpB,CAACZ,EAAAA,CAAmB,GAAA,CAAIY,CAAAA,CAAE,MAAM,CAAA,CAEhC,MAAMA,CAEV,CACF,CACA,MAAIJ,CAAAA,YAAqB,KAAA,CAAaA,EAChC,IAAIX,EAAAA,CAAkB,iCAAiC,CAC/D,CAEAU,EAAAA,CAAeJ,EAAkC,CAC/C,IAAMU,EAAK,IAAI,QAAA,CACXV,EAAQ,OAAA,EAASU,CAAAA,CAAG,MAAA,CAAO,SAAA,CAAWV,CAAAA,CAAQ,OAAO,EACrDA,CAAAA,CAAQ,QAAA,EAAUU,EAAG,MAAA,CAAO,UAAA,CAAYV,EAAQ,QAAQ,CAAA,CACxDA,CAAAA,CAAQ,cAAA,EAAgBU,CAAAA,CAAG,MAAA,CAAO,iBAAkBV,CAAAA,CAAQ,cAAc,EAC1EA,CAAAA,CAAQ,oBAAA,EACVU,EAAG,MAAA,CAAO,sBAAA,CAAwBV,CAAAA,CAAQ,oBAAoB,CAAA,CAMhE,IAAMW,EAAYX,CAAAA,CAAQ,OAAA,CAAQ,WAAa,IAAA,CAAK,SAAA,CAC9CY,EAAUD,CAAAA,CACZ,CAAE,GAAGX,CAAAA,CAAQ,OAAA,CAAS,SAAA,CAAAW,CAAU,CAAA,CAChCX,CAAAA,CAAQ,QACZ,OAAAU,CAAAA,CAAG,OAAO,SAAA,CAAW,IAAA,CAAK,SAAA,CAAUE,CAAO,CAAC,CAAA,CACxCZ,EAAQ,UAAA,EACVU,CAAAA,CAAG,MAAA,CACD,YAAA,CACAV,CAAAA,CAAQ,UAAA,CACRa,GAAmBb,CAAAA,CAAQ,UAAU,CACvC,CAAA,CAEEA,CAAAA,CAAQ,KAAA,EACVU,EAAG,MAAA,CAAO,OAAA,CAASV,EAAQ,KAAA,CAAO,OAAO,EAEvCA,CAAAA,CAAQ,eAAA,EAAmB,IAAA,EAC7BU,CAAAA,CAAG,MAAA,CAAO,iBAAA,CAAmB,OAAOV,CAAAA,CAAQ,eAAe,CAAC,CAAA,CAE1DA,CAAAA,CAAQ,OACVU,CAAAA,CAAG,MAAA,CAAO,OAAA,CAASV,CAAAA,CAAQ,KAAA,CAAO,OAAO,EAEvCA,CAAAA,CAAQ,eAAA,EAAmB,MAC7BU,CAAAA,CAAG,MAAA,CAAO,kBAAmB,MAAA,CAAOV,CAAAA,CAAQ,eAAe,CAAC,CAAA,CAOvDU,CACT,CAEAF,EAAAA,CACEN,CAAAA,CACAC,EACAF,CAAAA,CACuB,CACvB,OAAO,IAAI,OAAA,CAAQ,CAACa,CAAAA,CAASC,CAAAA,GAAW,CACtC,IAAMC,CAAAA,CAAM,IAAI,eAChBA,CAAAA,CAAI,IAAA,CAAK,OAAQd,CAAAA,CAAK,IAAI,CAAA,CAC1Bc,CAAAA,CAAI,gBAAA,CAAiB,iBAAA,CAAmB,KAAK,MAAM,CAAA,CACnDA,EAAI,YAAA,CAAe,MAAA,CAEnB,GAAM,CAAE,gBAAA,CAAAC,CAAAA,CAAkB,MAAA,CAAAC,CAAO,CAAA,CAAIjB,EAEjCgB,CAAAA,EACFD,CAAAA,CAAI,OAAO,gBAAA,CAAiB,UAAA,CAAaP,GAAM,CACzCA,CAAAA,CAAE,gBAAA,EAAoBA,CAAAA,CAAE,KAAA,CAAQ,CAAA,EAClCQ,EAAiB,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGR,CAAAA,CAAE,MAAA,CAASA,CAAAA,CAAE,KAAK,CAAC,EAEpD,CAAC,CAAA,CAGH,IAAMU,CAAAA,CAAU,IAAM,CACpBH,CAAAA,CAAI,OAAA,CACJD,CAAAA,CAAO,IAAIrB,EAAAA,CAAkB,iBAAiB,CAAC,EACjD,CAAA,CACA,GAAIwB,EAAQ,CACV,GAAIA,EAAO,OAAA,CAAS,CAClBH,EAAO,IAAIrB,EAAAA,CAAkB,iBAAiB,CAAC,CAAA,CAC/C,MACF,CACAwB,CAAAA,CAAO,gBAAA,CAAiB,QAASC,CAAAA,CAAS,CAAE,KAAM,IAAK,CAAC,EAC1D,CAEAH,CAAAA,CAAI,gBAAA,CAAiB,OAAQ,IAAM,CAGjC,GAFIE,CAAAA,EAAQA,CAAAA,CAAO,oBAAoB,OAAA,CAASC,CAAO,CAAA,CAEnDH,CAAAA,CAAI,MAAA,GAAW,GAAA,CAAK,CACtBD,CAAAA,CAAO,IAAIxB,EAAkB,CAAA,CAC7B,MACF,CACA,GAAIyB,CAAAA,CAAI,MAAA,GAAW,GAAA,CAAK,CACtB,IAAMvB,EAAa,MAAA,CAAOuB,CAAAA,CAAI,kBAAkB,aAAa,CAAC,GAAK,EAAA,CACnED,CAAAA,CAAO,IAAIvB,EAAAA,CAAoBC,CAAU,CAAC,EAC1C,MACF,CACA,GAAIuB,CAAAA,CAAI,MAAA,CAAS,KAAOA,CAAAA,CAAI,MAAA,EAAU,GAAA,CAAK,CACzCD,CAAAA,CACE,IAAI5B,EACFiC,EAAAA,CAAWJ,CAAAA,CAAI,YAAY,CAAA,EAAK,CAAA,KAAA,EAAQA,CAAAA,CAAI,MAAM,CAAA,CAAA,CAClD,YAAA,CACAA,CAAAA,CAAI,MACN,CACF,CAAA,CACA,MACF,CACA,GAAI,CACF,IAAMK,CAAAA,CAAS,KAAK,KAAA,CAAML,CAAAA,CAAI,YAAY,CAAA,CAC1CF,CAAAA,CAAQO,CAAM,EAChB,CAAA,KAAQ,CACNN,EAAO,IAAI5B,CAAAA,CAAW,kCAAmC,cAAc,CAAC,EAC1E,CACF,CAAC,CAAA,CAED6B,EAAI,gBAAA,CAAiB,OAAA,CAAS,IAAM,CAC9BE,CAAAA,EAAQA,EAAO,mBAAA,CAAoB,OAAA,CAASC,CAAO,CAAA,CACvDJ,CAAAA,CAAO,IAAIrB,GAAkB,8BAA8B,CAAC,EAC9D,CAAC,CAAA,CAEDsB,EAAI,IAAA,CAAKb,CAAI,EACf,CAAC,CACH,CACF,EAEA,SAASU,EAAAA,CAAmBS,EAAoB,CAO9C,OAAO,cALLA,CAAAA,CAAK,IAAA,GAAS,YAAA,CACV,KAAA,CACAA,CAAAA,CAAK,IAAA,GAAS,aACZ,MAAA,CACA,KACgB,EAC1B,CAEA,SAASf,GAAKgB,CAAAA,CAA2B,CACvC,OAAO,IAAI,OAAA,CAASC,CAAAA,EAAM,WAAWA,CAAAA,CAAGD,CAAE,CAAC,CAC7C,CAEA,SAASH,EAAAA,CAAWK,CAAAA,CAA6B,CAC/C,GAAI,CACF,IAAMC,EAAM,IAAA,CAAK,KAAA,CAAMD,CAAI,CAAA,CAC3B,OAAOC,CAAAA,CAAI,OAASA,CAAAA,CAAI,OAAA,EAAW,IACrC,CAAA,KAAQ,CACN,OAAOD,GAAQ,IACjB,CACF,CCpNA,IAAME,EAAAA,CAAoB,EACpBC,CAAAA,CAAuB,CAAA,CAAI,IAAA,CAAO,IAAA,CAiBxC,eAAsBC,EAAAA,CACpB5B,EAAoC,EAAA,CACZ,CACxB6B,EAAAA,EAAAA,CAEA,IAAMC,CAAAA,CAAO9B,CAAAA,CAAQ,IAAA,EAAQ,MAAA,CAE7B,GAAIA,CAAAA,CAAQ,WAAa8B,CAAAA,GAAS,MAAA,EAAUA,IAAS,QAAA,CAAA,CACnD,GAAI,CACF,OAAOC,EAAAA,CAAwB,MAAM/B,CAAAA,CAAQ,QAAA,EAAA,CAAYA,CAAO,CAClE,CAAA,MAASQ,EAAG,CACV,GAAIsB,IAAS,QAAA,CAAU,MAAMtB,CAAAA,CAE7BR,CAAAA,CAAQ,SAAA,GAAY,CAClB,sEACF,CAAC,EACH,CAGF,GAAI8B,CAAAA,GAAS,SACX,MAAM,IAAI5C,CAAAA,CACR,6DAAA,CACA,yBACF,CAAA,CAGF,GAAI4C,CAAAA,GAAS,aAAA,CACX,OAAOE,EAAAA,CAAoBhC,CAAO,EAGpC,GAAI8B,CAAAA,GAAS,KAAA,CACX,OAAOG,EAAAA,CAAWjC,CAAO,EAG3B,GAAI8B,CAAAA,GAAS,SACX,MAAM,IAAI5C,EACR,+DAAA,CACA,2BACF,CAAA,CAGF,GAAI,CACF,OAAO,MAAM+C,EAAAA,CAAWjC,CAAO,CACjC,CAAA,MAASkC,CAAAA,CAAU,CACjB,GAAIC,EAAAA,EAAAA,CAAsB,CACxB,IAAMC,CAAAA,CAAS,MAAMJ,GAAoBhC,CAAO,CAAA,CAChD,OAAAoC,CAAAA,CAAO,QAAA,CAAWC,EAAK,CACrB,iEAAA,CACA,GAAGD,CAAAA,CAAO,QACZ,CAAC,EACDpC,CAAAA,CAAQ,SAAA,GAAYoC,EAAO,QAAQ,CAAA,CAC5BA,CACT,CACA,MAAMF,CACR,CACF,CAcO,SAASI,GACdjB,CAAAA,CACAkB,CAAAA,CAAqB,EAAA,CACN,CACfV,IAAAA,CACA,IAAMW,CAAAA,CAAWC,EAAAA,EAAAA,CACjB,OAAO,CACL,IAAA,CAAApB,CAAAA,CACA,MAAA,CAAQ,eAAA,CACR,QAAA,CAAU,KAAA,CACV,SAAAmB,CAAAA,CACA,UAAA,CAAY,MAAA,CAAO,gBAAA,EAAoB,CAAA,CACvC,QAAA,CAAUH,EAAKE,CAAQ,CACzB,CACF,CAEA,eAAeN,GACbjC,CAAAA,CACwB,CACxB,IAAM0C,CAAAA,CAAc,MAAMC,EAAAA,GAEpBC,CAAAA,CAAS5C,CAAAA,CAAQ,QAAU,QAAA,CAAS,eAAA,CACpCwC,EAAWC,EAAAA,EAAAA,CACXI,CAAAA,CAAQ,IAAA,CAAK,GAAA,CACjB,CAAA,CACA,KAAK,GAAA,CAAI,MAAA,CAAO,kBAAoB,CAAA,CAAG7C,CAAAA,CAAQ,UAAY0B,EAAiB,CAC9E,CAAA,CACMa,CAAAA,CAAWO,EAAAA,CAAmBF,CAAM,EAEpCG,CAAAA,CAAS,MAAML,CAAAA,CAAYE,CAAAA,CAAQ,CACvC,eAAA,CAAiB,KACjB,OAAA,CAAS,KAAA,CACT,OAAA,CAAS,IAAA,CACT,UAAA,CAAY,KAAA,CACZ,MAAOJ,CAAAA,CAAS,KAAA,CAChB,OAAQA,CAAAA,CAAS,MAAA,CACjB,YAAaA,CAAAA,CAAS,KAAA,CACtB,YAAA,CAAcA,CAAAA,CAAS,MAAA,CACvB,OAAA,CAAS,OAAO,OAAA,CAChB,OAAA,CAAS,OAAO,OAAA,CAChB,CAAA,CAAG,OAAO,OAAA,CACV,CAAA,CAAG,MAAA,CAAO,OAAA,CACV,KAAA,CAAAK,CAAAA,CACA,eAAiBG,CAAAA,EACfA,CAAAA,YAAc,cACbA,CAAAA,CAAG,OAAA,CAAQ,qBAAuB,MAAA,EACjC,CAAA,CAAQA,CAAAA,CAAG,OAAA,CAAQ,oCAAoC,EAC7D,CAAC,CAAA,CAGKZ,EAAS,CACb,IAAA,CAFW,MAAMa,EAAAA,CAAaF,CAAAA,CAAQR,CAAQ,CAAA,CAG9C,MAAA,CAAQ,SAAA,CACR,SAAU,KAAA,CACV,QAAA,CAAAC,EACA,UAAA,CAAYK,CAAAA,CACZ,SAAUR,CAAAA,CAAKE,CAAQ,CACzB,CAAA,CACA,OAAIH,CAAAA,CAAO,SAAS,MAAA,CAAS,CAAA,EAAGpC,EAAQ,SAAA,GAAYoC,CAAAA,CAAO,QAAQ,CAAA,CAC5DA,CACT,CAEA,eAAeO,EAAAA,EAAwC,CAErD,GAAM,CAAE,OAAA,CAASD,CAAY,CAAA,CAAI,aAAa,iBAAiB,CAAA,CAC/D,OAAOA,CACT,CAEA,eAAeV,GACbhC,CAAAA,CACwB,CACxB,GAAI,CAACmC,EAAAA,EAAAA,CACH,MAAM,IAAIjD,CAAAA,CACR,4DAAA,CACA,2BACF,CAAA,CAGF,IAAMgE,EAAS,MAAM,SAAA,CAAU,aAAa,eAAA,CAAgB,CAC1D,MAAO,IAAA,CACP,KAAA,CAAO,KACT,CAAC,CAAA,CAED,GAAI,CACF,IAAMC,CAAAA,CAAQ,SAAS,aAAA,CAAc,OAAO,EAC5CA,CAAAA,CAAM,KAAA,CAAQ,CAAA,CAAA,CACdA,CAAAA,CAAM,WAAA,CAAc,CAAA,CAAA,CACpBA,EAAM,SAAA,CAAYD,CAAAA,CAClB,MAAME,EAAAA,CAAkBD,CAAK,EAE7B,IAAMJ,CAAAA,CAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC9CA,EAAO,KAAA,CAAQI,CAAAA,CAAM,WACrBJ,CAAAA,CAAO,MAAA,CAASI,EAAM,WAAA,CACtB,IAAME,CAAAA,CAAMN,CAAAA,CAAO,UAAA,CAAW,IAAI,EAClC,GAAI,CAACM,EACH,MAAM,IAAInE,EACR,wDAAA,CACA,4BACF,CAAA,CAEFmE,CAAAA,CAAI,SAAA,CAAUF,CAAAA,CAAO,EAAG,CAAA,CAAGJ,CAAAA,CAAO,MAAOA,CAAAA,CAAO,MAAM,EAEtD,IAAMP,CAAAA,CAAWC,EAAAA,EAAAA,CACXF,CAAAA,CAAW,CACf,qEACF,CAAA,CAEMH,CAAAA,CAAS,CACb,IAAA,CAFW,MAAMa,GAAaF,CAAAA,CAAQR,CAAQ,CAAA,CAG9C,MAAA,CAAQ,mBAAA,CACR,QAAA,CAAU,MACV,QAAA,CAAAC,CAAAA,CACA,UAAA,CACEA,CAAAA,CAAS,KAAA,CAAQ,CAAA,CAAIO,EAAO,KAAA,CAAQP,CAAAA,CAAS,KAAA,CAAQ,KAAA,CAAA,CACvD,QAAA,CAAUH,CAAAA,CAAKE,CAAQ,CACzB,CAAA,CACA,OAAAvC,CAAAA,CAAQ,SAAA,GAAYoC,EAAO,QAAQ,CAAA,CAC5BA,CACT,CAAA,OAAA,CACE,IAAA,IAAWkB,KAASJ,CAAAA,CAAO,SAAA,GAAaI,CAAAA,CAAM,IAAA,GAChD,CACF,CAEA,SAASvB,EAAAA,CACPK,CAAAA,CACApC,CAAAA,CACe,CACf,IAAMwC,CAAAA,CAAWC,IAAAA,CACXc,CAAAA,CAAa,CACjB,GAAGnB,CAAAA,CACH,MAAA,CAAQA,CAAAA,CAAO,MAAA,EAAU,QAAA,CACzB,SAAUA,CAAAA,CAAO,QAAA,EAAY,SAC7B,QAAA,CAAUA,CAAAA,CAAO,UAAYI,CAAAA,CAC7B,UAAA,CAAYJ,CAAAA,CAAO,UAAA,EAAc,MAAA,CAAO,gBAAA,EAAoB,EAC5D,QAAA,CAAUC,CAAAA,CAAKD,EAAO,QAAA,EAAY,EAAE,CACtC,CAAA,CACA,OAAImB,CAAAA,CAAW,QAAA,CAAS,MAAA,CAAS,GAAGvD,CAAAA,CAAQ,SAAA,GAAYuD,EAAW,QAAQ,CAAA,CACpEA,CACT,CAEA,SAAST,EAAAA,CAAmBF,CAAAA,CAA+B,CACzD,IAAML,EAAW,IAAI,GAAA,CAEjBK,EAAO,aAAA,CAAc,QAAQ,GAC/BL,CAAAA,CAAS,GAAA,CAAI,6DAA6D,CAAA,CAExEK,CAAAA,CAAO,aAAA,CAAc,OAAO,CAAA,EAC9BL,CAAAA,CAAS,GAAA,CAAI,oDAAoD,CAAA,CAE/DK,CAAAA,CAAO,cAAc,QAAQ,CAAA,EAC/BL,CAAAA,CAAS,GAAA,CAAI,kEAAkE,CAAA,CAE7E,SAAS,KAAA,EAAS,QAAA,CAAS,MAAM,MAAA,GAAW,QAAA,EAC9CA,EAAS,GAAA,CAAI,gEAAgE,CAAA,CAG/E,IAAIiB,CAAAA,CAAoB,CAAA,CACxB,QAAWC,CAAAA,IAAO,KAAA,CAAM,KAAKb,CAAAA,CAAO,gBAAA,CAAiB,KAAK,CAAC,CAAA,CAAG,CAC5D,IAAMc,CAAAA,CAAMD,CAAAA,CAAI,YAAcA,CAAAA,CAAI,GAAA,CAClC,GAAKC,CAAAA,CACL,GAAI,CACU,IAAI,GAAA,CAAIA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAI,EACrC,MAAA,GAAW,MAAA,CAAO,SAAS,MAAA,EAAU,CAACD,EAAI,WAAA,GAChDD,CAAAA,EAAqB,CAAA,EAEzB,CAAA,KAAQ,CAER,CACF,CACA,OAAIA,CAAAA,CAAoB,GACtBjB,CAAAA,CAAS,GAAA,CACP,GAAGiB,CAAiB,CAAA,mBAAA,EAAsBA,CAAAA,GAAsB,CAAA,CAAI,EAAA,CAAK,GAAG,mDAC9E,CAAA,CAGK,KAAA,CAAM,KAAKjB,CAAQ,CAC5B,CAEA,eAAeU,EAAAA,CACbF,CAAAA,CACAR,CAAAA,CACe,CACf,IAAIlB,EAAO,MAAMsC,EAAAA,CAAaZ,EAAQ,WAAA,CAAa,GAAI,EACvD,GAAI1B,CAAAA,CAAK,IAAA,EAAQM,CAAAA,CAAsB,OAAON,CAAAA,CAE9CkB,EAAS,IAAA,CAAK,wDAAwD,CAAA,CAMtE,IAAIqB,CAAAA,CAAUb,CAAAA,CACV1C,EAAU,CAAA,CACd,KAAOgB,CAAAA,CAAK,IAAA,CAAOM,CAAAA,EAAwBtB,CAAAA,CAAU,GAAG,CACtD,IAAMwD,EAAQ,IAAA,CAAK,GAAA,CACjB,IACA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAM,IAAA,CAAK,IAAA,CAAKlC,CAAAA,CAAuBN,EAAK,IAAI,CAAA,CAAI,EAAG,CAClE,CAAA,CACMyC,EAAO,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC5CA,CAAAA,CAAK,KAAA,CAAQ,KAAK,GAAA,CAAI,CAAA,CAAG,KAAK,KAAA,CAAMF,CAAAA,CAAQ,MAAQC,CAAK,CAAC,CAAA,CAC1DC,CAAAA,CAAK,MAAA,CAAS,IAAA,CAAK,IAAI,CAAA,CAAG,IAAA,CAAK,MAAMF,CAAAA,CAAQ,MAAA,CAASC,CAAK,CAAC,CAAA,CAC5D,IAAMR,CAAAA,CAAMS,CAAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAChC,GAAI,CAACT,CAAAA,CAAK,OAAOhC,EACjBgC,CAAAA,CAAI,SAAA,CAAUO,CAAAA,CAAS,CAAA,CAAG,CAAA,CAAGE,CAAAA,CAAK,MAAOA,CAAAA,CAAK,MAAM,EACpDF,CAAAA,CAAUE,CAAAA,CAEV,QAAWC,CAAAA,IAAW,CAAC,GAAA,CAAM,GAAA,CAAM,GAAA,CAAM,EAAG,EAE1C,GADA1C,CAAAA,CAAO,MAAMsC,EAAAA,CAAaC,CAAAA,CAAS,aAAcG,CAAO,CAAA,CACpD1C,CAAAA,CAAK,IAAA,EAAQM,CAAAA,CAAsB,OAAON,EAIhD,GADAhB,CAAAA,EAAW,CAAA,CACPyD,CAAAA,CAAK,KAAA,CAAQ,GAAA,EAAOA,EAAK,MAAA,CAAS,GAAA,CAAK,KAC7C,CAEA,OAAIzC,CAAAA,CAAK,KAAOM,CAAAA,EACdY,CAAAA,CAAS,KACP,sEACF,CAAA,CAEKlB,CACT,CAEA,SAASsC,EAAAA,CACPZ,CAAAA,CACAiB,CAAAA,CACAD,CAAAA,CACe,CACf,OAAO,IAAI,QAAQ,CAAClD,CAAAA,CAASC,IAAW,CACtCiC,CAAAA,CAAO,MAAA,CACJ1B,CAAAA,EAAS,CACR,GAAI,CAACA,CAAAA,CAAM,CACTP,EAAO,IAAI5B,CAAAA,CAAW,+BAAgC,eAAe,CAAC,CAAA,CACtE,MACF,CACA2B,CAAAA,CAAQQ,CAAI,EACd,CAAA,CACA2C,EACAD,CACF,EACF,CAAC,CACH,CAEA,SAAStB,EAAAA,EAAqD,CAC5D,IAAMwB,EAAS,MAAA,CAAO,cAAA,CACtB,OAAO,CACL,KAAA,CAAO,KAAK,KAAA,CAAMA,CAAAA,EAAQ,KAAA,EAAS,MAAA,CAAO,UAAU,CAAA,CACpD,OAAQ,IAAA,CAAK,KAAA,CAAMA,GAAQ,MAAA,EAAU,MAAA,CAAO,WAAW,CACzD,CACF,CAEA,SAAS9B,EAAAA,EAA8B,CACrC,OAAO,CAAA,CAAQ,UAAU,YAAA,EAAc,eACzC,CAEA,eAAeiB,EAAAA,CAAkBD,CAAAA,CAAwC,CACvE,MAAM,IAAI,QAAc,CAACtC,CAAAA,CAASC,CAAAA,GAAW,CAC3C,IAAMoD,CAAAA,CAAO,IAAMrD,CAAAA,EAAAA,CACbsD,CAAAA,CAAO,IACXrD,CAAAA,CAAO,IAAI5B,EAAW,sCAAA,CAAwC,cAAc,CAAC,CAAA,CAC/EiE,CAAAA,CAAM,iBAAiB,gBAAA,CAAkBe,CAAAA,CAAM,CAAE,IAAA,CAAM,IAAK,CAAC,EAC7Df,CAAAA,CAAM,gBAAA,CAAiB,QAASgB,CAAAA,CAAM,CAAE,KAAM,IAAK,CAAC,CAAA,CAC/ChB,CAAAA,CAAM,IAAA,EAAA,CAAO,MAAMgB,CAAI,EAC9B,CAAC,CAAA,CAKD,IAAMC,EAAQ,WAAA,CAAY,GAAA,EAAA,CACpBC,CAAAA,CAAc,IAAA,CACpB,KAAOlB,EAAM,UAAA,GAAe,CAAA,EAAKA,EAAM,WAAA,GAAgB,CAAA,EAAG,CACxD,GAAI,WAAA,CAAY,GAAA,EAAA,CAAQiB,CAAAA,CAAQC,CAAAA,CAC9B,MAAM,IAAInF,CAAAA,CACR,kDACA,eACF,CAAA,CAEF,MAAM,IAAI,OAAA,CAAe2B,CAAAA,EACvB,qBAAA,CAAsB,IAAMA,CAAAA,EAAS,CACvC,EACF,CACF,CAEA,SAASgB,IAAsB,CAC7B,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,OAAO,SAAa,GAAA,CACvD,MAAM,IAAI3C,CAAAA,CACR,iDAAA,CACA,aACF,CAEJ,CAEA,SAASmD,CAAAA,CAAKiC,CAAAA,CAA4B,CACxC,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAIA,CAAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAC,CACnD,CClWA,IAAMC,EAAAA,CAA6B,EAAA,CAC7BC,EAAAA,CAA6B,EAAA,CAE/BC,EAAAA,CAAY,MACZC,EAAAA,CAAiC,IAAA,CAW9B,SAASC,EAAAA,CACd3E,CAAAA,CAAwC,GAClC,CACFyE,EAAAA,EACA,OAAO,MAAA,CAAW,GAAA,GACtBA,GAAY,IAAA,CACZC,EAAAA,CAAkB1E,CAAAA,CAAQ,eAAA,EAAmB,IAAA,CAC7C4E,EAAAA,GACAC,EAAAA,EAAAA,CACAC,IAAAA,EACF,CAEO,SAASC,EAAAA,EAGd,CACA,OAAO,CACL,UAAA,CAAYR,EAAAA,CAAW,OAAA,CACvB,UAAA,CAAYC,EAAAA,CAAW,KAAA,EACzB,CACF,CAEA,SAASQ,EAAAA,CAAeC,CAAAA,CAAUC,CAAAA,CAAgB,CAChDD,CAAAA,CAAI,KAAKC,CAAK,CAAA,CACVD,EAAI,MAAA,CAAS,GAAA,EAAaA,EAAI,MAAA,CAAO,CAAA,CAAGA,CAAAA,CAAI,MAAA,CAAS,GAAW,EACtE,CAEA,SAASE,EAAAA,CAAcC,EAAyB,CAC9C,IAAMC,EAAgB,EAAA,CACtB,IAAA,IAAWC,CAAAA,IAAOF,CAAAA,CAAM,CACtB,GAAI,OAAOE,CAAAA,EAAQ,SAAU,CAC3BD,CAAAA,CAAI,KAAKC,CAAG,CAAA,CACZ,QACF,CACA,GAAIA,CAAAA,YAAe,MAAO,CACxBD,CAAAA,CAAI,IAAA,CAAK,CAAA,EAAGC,CAAAA,CAAI,IAAI,KAAKA,CAAAA,CAAI,OAAO,CAAA,EAAGA,CAAAA,CAAI,KAAA,CAAQ;EAAKA,CAAAA,CAAI,KAAK,CAAA,CAAA,CAAK,EAAE,CAAA,CAAE,CAAA,CAC1E,QACF,CACA,GAAI,CACFD,CAAAA,CAAI,IAAA,CAAK,IAAA,CAAK,SAAA,CAAUC,CAAAA,CAAKC,EAAQ,CAAC,EACxC,CAAA,KAAQ,CACNF,CAAAA,CAAI,IAAA,CAAK,MAAA,CAAOC,CAAG,CAAC,EACtB,CACF,CACA,IAAME,CAAAA,CAASH,CAAAA,CAAI,IAAA,CAAK,GAAG,CAAA,CAC3B,OAAOG,CAAAA,CAAO,MAAA,CAAS,IAAA,CACnBA,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAG,IAAU,CAAA,CAAI,mBAAA,CAC9BA,CACN,CAIA,SAASD,EAAAA,CAASE,CAAAA,CAAcC,CAAAA,CAAyB,CACvD,OAAIA,CAAAA,YAAiB,OAAA,CAAgB,CAAA,SAAA,EAAaA,CAAAA,CAAkB,OAAO,CAAA,CAAA,CAAA,CACvE,OAAOA,CAAAA,EAAU,UAAA,CAAmB,YAAA,CACjCA,CACT,CAEA,SAASd,EAAAA,EAAqB,CAC5B,IAAMhC,CAAAA,CAAS,MAAA,CAAO,OAAA,CACtB,GAAI,CAACA,CAAAA,CAAQ,OACb,IAAM+C,CAAAA,CAAyB,CAAC,KAAA,CAAO,MAAA,CAAQ,MAAA,CAAQ,OAAA,CAAS,OAAO,CAAA,CACvE,IAAA,IAAWC,CAAAA,IAASD,CAAAA,CAAQ,CAC1B,IAAME,CAAAA,CAAWjD,CAAAA,CAAOgD,CAAK,CAAA,EAAG,IAAA,CAAKhD,CAAM,CAAA,CACtCiD,CAAAA,GACLjD,CAAAA,CAAOgD,CAAK,CAAA,CAAI,CAAA,GAAIR,CAAAA,GAAoB,CACtC,GAAI,CACFJ,EAAAA,CAAYT,EAAAA,CAAY,CACtB,KAAA,CAAAqB,CAAAA,CACA,EAAA,CAAI,IAAA,CAAK,GAAA,EAAA,CACT,OAAA,CAAST,EAAAA,CAAcC,CAAI,CAC7B,CAAC,EACH,CAAA,KAAQ,CAER,CACAS,CAAAA,CAAS,GAAGT,CAAI,EAClB,CAAA,EACF,CACF,CAEA,SAASU,EAAAA,CAAU7F,CAAAA,CAAsB,CACvC,OAAKyE,EAAAA,CACEzE,CAAAA,CAAI,UAAA,CAAWyE,EAAe,CAAA,CADR,KAE/B,CAEA,SAASG,EAAAA,EAAmB,CAC1B,IAAMkB,CAAAA,CAAgB,MAAA,CAAO,KAAA,CACzB,OAAOA,CAAAA,EAAkB,UAAA,GAC7B,MAAA,CAAO,KAAA,CAAQ,eACbC,CAAAA,CACAC,CAAAA,CACmB,CACnB,IAAMhG,CAAAA,CACJ,OAAO+F,CAAAA,EAAU,QAAA,CACbA,CAAAA,CACAA,CAAAA,YAAiB,GAAA,CACfA,CAAAA,CAAM,QAAA,EAAA,CACNA,CAAAA,CAAM,GAAA,CACRE,CAAAA,CAAAA,CAAUD,CAAAA,EAAM,MAAA,GAAWD,CAAAA,YAAiB,OAAA,CAAUA,CAAAA,CAAM,MAAA,CAAS,KAAA,CAAA,EAAQ,WAAA,EAAA,CACnF,GAAIF,EAAAA,CAAU7F,CAAG,CAAA,CACf,OAAO8F,CAAAA,CAAc,IAAA,CAAK,OAAQC,CAAAA,CAAsBC,CAAI,CAAA,CAE9D,IAAME,CAAAA,CAAU,WAAA,CAAY,GAAA,EAAA,CAC5B,GAAI,CACF,IAAMC,CAAAA,CAAM,MAAML,CAAAA,CAAc,IAAA,CAAK,MAAA,CAAQC,CAAAA,CAAsBC,CAAI,CAAA,CACvE,OAAAjB,EAAAA,CAAYR,EAAAA,CAAY,CACtB,IAAA,CAAM,OAAA,CACN,MAAA,CAAA0B,CAAAA,CACA,GAAA,CAAKG,EAAAA,CAASpG,CAAG,CAAA,CACjB,MAAA,CAAQmG,CAAAA,CAAI,MAAA,CACZ,EAAA,CAAIA,CAAAA,CAAI,EAAA,CACR,UAAA,CAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,EAAA,CAAQD,CAAO,CAAA,CAClD,EAAA,CAAI,IAAA,CAAK,GAAA,EACX,CAAC,CAAA,CACMC,CACT,CAAA,MAAS5F,CAAAA,CAAG,CACV,MAAAwE,EAAAA,CAAYR,EAAAA,CAAY,CACtB,IAAA,CAAM,OAAA,CACN,MAAA,CAAA0B,EACA,GAAA,CAAKG,EAAAA,CAASpG,CAAG,CAAA,CACjB,MAAA,CAAQ,CAAA,CACR,EAAA,CAAI,KAAA,CACJ,UAAA,CAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,EAAA,CAAQkG,CAAO,CAAA,CAClD,EAAA,CAAI,IAAA,CAAK,GAAA,EAAA,CACT,KAAA,CAAO3F,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,aAC1C,CAAC,CAAA,CACKA,CACR,CACF,CAAA,EACF,CAEA,SAASsE,EAAAA,EAAiB,CACxB,IAAMwB,CAAAA,CAAc,MAAA,CAAO,cAAA,CAC3B,GAAI,CAACA,CAAAA,CAAa,OAClB,IAAMC,CAAAA,CAAeD,CAAAA,CAAY,SAAA,CAAU,IAAA,CACrCE,CAAAA,CAAeF,CAAAA,CAAY,SAAA,CAAU,IAAA,CAE3CA,CAAAA,CAAY,SAAA,CAAU,IAAA,CAAO,SAE3BJ,CAAAA,CACAjG,CAAAA,CAAAA,GACGwG,CAAAA,CACH,CACA,OAAA,IAAA,CAAK,QAAU,CACb,MAAA,CAAQ,MAAA,CAAOP,CAAM,CAAA,CAAE,WAAA,EAAA,CACvB,GAAA,CAAK,OAAOjG,CAAAA,EAAQ,QAAA,CAAWA,CAAAA,CAAMA,CAAAA,CAAI,QAAA,EAAA,CACzC,CAAA,CAAG,CACL,CAAA,CAEOsG,CAAAA,CAAa,IAAA,CAAK,IAAA,CAAML,CAAAA,CAAQjG,CAAAA,CAAK,GAAGwG,CAAI,CACrD,CAAA,CAEAH,CAAAA,CAAY,SAAA,CAAU,IAAA,CAAO,SAE3BpG,CAAAA,CACA,CACA,IAAMwG,CAAAA,CAAO,IAAA,CAAK,OAAA,CAClB,GAAIA,CAAAA,EAAQ,CAACZ,EAAAA,CAAUY,CAAAA,CAAK,GAAG,CAAA,CAAG,CAChCA,CAAAA,CAAK,CAAA,CAAI,WAAA,CAAY,GAAA,EAAA,CACrB,IAAMC,CAAAA,CAAS,IAAM,CACnB,GAAI,CACF3B,EAAAA,CAAYR,EAAAA,CAAY,CACtB,IAAA,CAAM,KAAA,CACN,MAAA,CAAQkC,EAAK,MAAA,CACb,GAAA,CAAKL,EAAAA,CAASK,CAAAA,CAAK,GAAG,CAAA,CACtB,MAAA,CAAQ,IAAA,CAAK,MAAA,CACb,EAAA,CAAI,IAAA,CAAK,MAAA,EAAU,GAAA,EAAO,IAAA,CAAK,MAAA,CAAS,GAAA,CACxC,UAAA,CAAY,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,EAAA,CAAQA,CAAAA,CAAK,CAAC,CAAA,CACjD,EAAA,CAAI,IAAA,CAAK,GAAA,EACX,CAAC,EACH,CAAA,KAAQ,CAER,CACA,IAAA,CAAK,mBAAA,CAAoB,SAAA,CAAWC,CAAM,EAC5C,CAAA,CACA,IAAA,CAAK,gBAAA,CAAiB,SAAA,CAAWA,CAAM,EACzC,CACA,OAAOH,CAAAA,CAAa,IAAA,CAAK,IAAA,CAAMtG,CAAAA,EAAQ,IAAI,CAC7C,EACF,CAEA,SAASmG,EAAAA,CAASO,CAAAA,CAAmB,CACnC,OAAOA,CAAAA,CAAE,MAAA,CAAS,GAAA,CAAMA,CAAAA,CAAE,KAAA,CAAM,CAAA,CAAG,GAAG,CAAA,CAAI,QAAA,CAAMA,CAClD,CCtNO,SAASC,EAAAA,CACdC,CAAAA,CACiB,CACjB,GAAI,OAAO,MAAA,CAAW,GAAA,CACpB,OAAO,CACL,GAAA,CAAK,EAAA,CACL,SAAA,CAAW,EAAA,CACX,QAAA,CAAU,CAAE,KAAA,CAAO,CAAA,CAAG,MAAA,CAAQ,CAAE,CAAA,CAChC,OAAA,CAASC,EAAAA,CAAkBD,CAAO,CAAA,CAClC,UAAA,CAAY,EAAA,CACZ,UAAA,CAAY,EACd,CAAA,CAGF,IAAME,CAAAA,CAAUjC,EAAAA,EAAAA,CAChB,OAAO,CACL,GAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CACrB,SAAA,CAAW,SAAA,CAAU,SAAA,CACrB,QAAA,CAAU,CACR,KAAA,CAAO,MAAA,CAAO,UAAA,CACd,MAAA,CAAQ,MAAA,CAAO,WACjB,CAAA,CACA,OAAA,CAASgC,GAAkBD,CAAO,CAAA,CAClC,MAAA,CAAQG,EAAAA,EAAAA,CACR,UAAA,CAAYD,CAAAA,CAAQ,UAAA,CACpB,UAAA,CAAYA,CAAAA,CAAQ,UACtB,CACF,CAEA,SAASC,EAAAA,EAAgC,CACvC,IAAMC,CAAAA,CAAwB,EAAA,CAC9B,GAAI,CACFA,CAAAA,CAAO,MAAA,CAAS,CACd,KAAA,CAAO,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAS,CAAA,CAC/B,MAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAU,CACnC,CAAA,CACAA,CAAAA,CAAO,UAAA,CAAa,MAAA,CAAO,gBAAA,EAAoB,CAAA,CAC/CA,CAAAA,CAAO,QAAA,CAAW,SAAA,CAAU,QAAA,CAC5BA,CAAAA,CAAO,SAAA,CAAY,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,SAAA,EAAa,EAAE,CAAA,CACvDA,CAAAA,CAAO,QAAA,CAAW,IAAA,CAAK,cAAA,EAAA,CAAiB,eAAA,EAAA,CAAkB,QAAA,CAC1DA,EAAO,WAAA,CAAc,MAAA,CAAO,UAAA,GAAa,8BAA8B,CAAA,CAAE,OAAA,CACrE,MAAA,CACA,OAAA,CACJA,CAAAA,CAAO,QAAA,CAAW,QAAA,CAAS,QAAA,EAAY,KAAA,CAAA,CACvCA,CAAAA,CAAO,KAAA,CAAQ,QAAA,CAAS,KAAA,EAAS,KAAA,CAAA,CACjCA,CAAAA,CAAO,MAAA,CAAS,SAAA,CAAU,MAAA,CACd,WAAA,CAAY,gBAAA,CAAiB,YAAY,CAAA,CAAE,CAAC,CAAA,GAItDA,CAAAA,CAAO,QAAA,CAAW,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,GAAA,EAAK,CAAA,EAElD,CAAA,KAAQ,CAER,CACA,OAAOA,CACT,CAEA,SAASH,EAAAA,CACPD,CAAAA,CAC6B,CAC7B,GAAKA,CAAAA,CACL,OAAO,CACL,MAAA,CAAQA,CAAAA,CAAQ,MAAA,CAChB,QAAA,CAAUA,CAAAA,CAAQ,QAAA,CAClB,QAAA,CAAUA,CAAAA,CAAQ,QAAA,CAClB,UAAA,CAAYA,CAAAA,CAAQ,UAAA,CACpB,SAAUA,CAAAA,CAAQ,QACpB,CACF,CCjEA,eAAsBK,EAAAA,CACpBC,CAAAA,CAAa,EAAA,CACY,CACzB,GAAI,OAAO,MAAA,CAAW,GAAA,EAAe,CAAC,SAAA,CAAU,YAAA,CAC9C,MAAM,IAAIlI,CAAAA,CACR,uDAAA,CACA,aACF,CAAA,CAGF,IAAIgE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAS,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa,CAAE,KAAA,CAAO,CAAA,CAAK,CAAC,EACpE,CAAA,KAAQ,CACN,MAAM,IAAIhE,CAAAA,CACR,0CAAA,CACA,YACF,CACF,CAUA,IAAMmI,CAAAA,CANa,CACjB,wBAAA,CACA,YAAA,CACA,WAAA,CACA,uBACF,CAAA,CAEa,IAAA,CAAMC,CAAAA,EAAM,aAAA,CAAc,eAAA,CAAgBA,CAAC,CAAC,CAAA,EAAK,EAAA,CAExDC,CAAAA,CAAW,IAAI,aAAA,CAAcrE,CAAAA,CAAQmE,CAAAA,CAAW,CAAE,QAAA,CAAAA,CAAS,CAAA,CAAI,MAAS,CAAA,CACxEG,CAAAA,CAAiB,EAAA,CACjBpD,CAAAA,CAAQ,WAAA,CAAY,GAAA,EAAA,CACtBqD,CAAAA,CAA2B,IAAA,CAE/BF,CAAAA,CAAS,gBAAA,CAAiB,eAAA,CAAkB/G,CAAAA,EAAM,CAC5CA,CAAAA,CAAE,IAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,IAAA,CAAO,CAAA,EAAGgH,CAAAA,CAAO,IAAA,CAAKhH,CAAAA,CAAE,IAAI,EACnD,CAAC,CAAA,CAED+G,CAAAA,CAAS,KAAA,EAAA,CACTE,CAAAA,CAAY,MAAA,CAAO,UAAA,CAAW,IAAM,CAC9BF,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,CAAA,CAAGH,CAAAA,CAAa,GAAI,CAAA,CAEpB,SAASM,CAAAA,EAAU,CACbD,CAAAA,GAAc,IAAA,EAAM,MAAA,CAAO,YAAA,CAAaA,CAAS,EACrDA,CAAAA,CAAY,IAAA,CACZ,IAAA,IAAWnE,CAAAA,IAASJ,CAAAA,CAAO,SAAA,EAAA,CAAaI,CAAAA,CAAM,IAAA,GAChD,CAEA,OAAO,CACL,MAAA,CAAAJ,CAAAA,CACA,MAAA,EAAS,CACP,GAAI,CACEqE,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,CAAA,KAAQ,CAER,CACAG,CAAAA,GACF,CAAA,CACA,IAAA,EAAgC,CAC9B,OAAO,IAAI,OAAA,CAAQ,CAAC7G,CAAAA,CAASC,CAAAA,GAAW,CACtC,GAAIyG,CAAAA,CAAS,KAAA,GAAU,UAAA,CAAY,CACjCG,CAAAA,EAAAA,CACA5G,CAAAA,CAAO,IAAI5B,CAAAA,CAAW,2BAAA,CAA6B,kBAAkB,CAAC,CAAA,CACtE,MACF,CACAqI,CAAAA,CAAS,gBAAA,CACP,MAAA,CACA,IAAM,CACJ,IAAMI,EAAa,WAAA,CAAY,GAAA,EAAA,CAAQvD,CAAAA,CACjCwD,CAAAA,CAAYL,CAAAA,CAAS,QAAA,EAAYF,CAAAA,EAAY,YAAA,CAC7ChG,CAAAA,CAAO,IAAI,IAAA,CAAKmG,CAAAA,CAAQ,CAAE,IAAA,CAAMI,CAAU,CAAC,CAAA,CACjDF,CAAAA,EAAAA,CACA7G,CAAAA,CAAQ,CAAE,IAAA,CAAAQ,CAAAA,CAAM,UAAA,CAAAsG,CAAAA,CAAY,QAAA,CAAUC,CAAU,CAAC,EACnD,CAAA,CACA,CAAE,IAAA,CAAM,IAAK,CACf,CAAA,CACAL,CAAAA,CAAS,IAAA,GACX,CAAC,CACH,CACF,CACF,CC7EA,eAAsBM,EAAAA,CACpBT,CAAAA,CAAa,EAAA,CACiB,CAC9B,GACE,OAAO,MAAA,CAAW,GAAA,EAClB,CAAC,SAAA,CAAU,YAAA,EACX,OAAO,SAAA,CAAU,YAAA,CAAa,eAAA,EAAoB,UAAA,CAElD,MAAM,IAAIlI,CAAAA,CACR,2DAAA,CACA,aACF,CAAA,CAGF,IAAIgE,CAAAA,CACJ,GAAI,CACFA,CAAAA,CAAS,MAAM,SAAA,CAAU,YAAA,CAAa,eAAA,CAAgB,CACpD,KAAA,CAAO,CAAA,CAAA,CAEP,KAAA,CAAO,CAAA,CACT,CAAC,EACH,CAAA,KAAQ,CACN,MAAM,IAAIhE,CAAAA,CACR,yCAAA,CACA,eACF,CACF,CASA,IAAMmI,CAAAA,CANa,CACjB,4BAAA,CACA,4BAAA,CACA,YAAA,CACA,WACF,CAAA,CAEa,IAAA,CAAMC,CAAAA,EAAM,aAAA,CAAc,eAAA,CAAgBA,CAAC,CAAC,CAAA,EAAK,EAAA,CAExDC,CAAAA,CAAW,IAAI,aAAA,CAAcrE,CAAAA,CAAQmE,CAAAA,CAAW,CAAE,QAAA,CAAAA,CAAS,CAAA,CAAI,MAAS,CAAA,CACxEG,CAAAA,CAAiB,EAAA,CACjBpD,CAAAA,CAAQ,WAAA,CAAY,GAAA,EAAA,CACtBqD,CAAAA,CAA2B,IAAA,CAE/BF,CAAAA,CAAS,gBAAA,CAAiB,eAAA,CAAkB/G,CAAAA,EAAM,CAC5CA,CAAAA,CAAE,IAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,IAAA,CAAO,CAAA,EAAGgH,CAAAA,CAAO,IAAA,CAAKhH,CAAAA,CAAE,IAAI,EACnD,CAAC,CAAA,CAED+G,CAAAA,CAAS,KAAA,EAAA,CACTE,CAAAA,CAAY,MAAA,CAAO,UAAA,CAAW,IAAM,CAC9BF,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,CAAA,CAAGH,CAAAA,CAAa,GAAI,CAAA,CAIpB,IAAMU,CAAAA,CAAa5E,CAAAA,CAAO,cAAA,EAAA,CAAiB,CAAC,CAAA,CACxC4E,CAAAA,EACFA,CAAAA,CAAW,gBAAA,CAAiB,OAAA,CAAS,IAAM,CACrCP,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,CAAC,CAAA,CAGH,SAASG,CAAAA,EAAU,CACbD,CAAAA,GAAc,MAAM,MAAA,CAAO,YAAA,CAAaA,CAAS,CAAA,CACrDA,CAAAA,CAAY,IAAA,CACZ,IAAA,IAAWnE,CAAAA,IAASJ,CAAAA,CAAO,SAAA,EAAA,CAAaI,CAAAA,CAAM,IAAA,GAChD,CAEA,OAAO,CACL,MAAA,CAAAJ,CAAAA,CACA,MAAA,EAAS,CACP,GAAI,CACEqE,CAAAA,CAAS,KAAA,GAAU,UAAA,EAAYA,CAAAA,CAAS,IAAA,GAC9C,CAAA,KAAQ,CAER,CACAG,CAAAA,GACF,CAAA,CACA,IAAA,EAAgC,CAC9B,OAAO,IAAI,OAAA,CAAQ,CAAC7G,CAAAA,CAASC,CAAAA,GAAW,CACtC,GAAIyG,CAAAA,CAAS,KAAA,GAAU,UAAA,CAAY,CACjCG,CAAAA,EAAAA,CACA5G,CAAAA,CAAO,IAAI5B,CAAAA,CAAW,2BAAA,CAA6B,kBAAkB,CAAC,CAAA,CACtE,MACF,CACAqI,CAAAA,CAAS,gBAAA,CACP,OACA,IAAM,CACJ,IAAMI,CAAAA,CAAa,WAAA,CAAY,GAAA,EAAA,CAAQvD,CAAAA,CACjCwD,CAAAA,CAAYL,CAAAA,CAAS,QAAA,EAAYF,CAAAA,EAAY,YAAA,CAC7ChG,CAAAA,CAAO,IAAI,IAAA,CAAKmG,CAAAA,CAAQ,CAAE,IAAA,CAAMI,CAAU,CAAC,CAAA,CACjDF,CAAAA,EAAAA,CACA7G,CAAAA,CAAQ,CAAE,IAAA,CAAAQ,CAAAA,CAAM,UAAA,CAAAsG,CAAAA,CAAY,QAAA,CAAUC,CAAU,CAAC,EACnD,CAAA,CACA,CAAE,IAAA,CAAM,IAAK,CACf,CAAA,CACAL,CAAAA,CAAS,IAAA,GACX,CAAC,CACH,CACF,CACF,CCzFO,IAAMQ,EAAAA,CAAeC,mBAAAA,CAAwC,IAAI,CAAA,CAEjE,SAASC,CAAAA,EAA8B,CAC5C,IAAM5E,CAAAA,CAAM6E,gBAAAA,CAAWH,EAAY,CAAA,CACnC,GAAI,CAAC1E,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,iDAAiD,CAAA,CAEnE,OAAOA,CACT,CCMO,SAAS8E,EAAAA,CAAgB,CAC9B,UAAA,CAAAC,CAAAA,CACA,IAAA,CAAAC,CAAAA,CACA,KAAA,CAAAC,CAAAA,CAAQ,kBAAA,CACR,WAAA,CAAAC,CAAAA,CAAc,CAAA,CACd,eAAA,CAAAC,CAAAA,CACA,GAAA,CAAAC,CACF,CAAA,CAAyB,CACvB,IAAMC,CAAAA,CAAgBC,YAAAA,CAAiC,IAAI,CAAA,CACrDC,CAAAA,CAAmBD,YAAAA,CAAiC,IAAI,CAAA,CACxDE,CAAAA,CAAeF,YAAAA,CAA8B,IAAI,CAAA,CACjD,CAACG,CAAAA,CAAaC,CAAc,CAAA,CAAIC,cAAAA,CAA6B,IAAI,CAAA,CACjE,CAACC,CAAAA,CAAaC,CAAc,CAAA,CAAIF,cAAAA,CAAuB,EAAE,CAAA,CACzDG,CAAAA,CAAWR,YAAAA,CAA0B,IAAI,CAAA,CACzCS,CAAAA,CAAeT,YAAAA,CAAO,KAAK,CAAA,CAC3BU,CAAAA,CAAkBV,YAAAA,CAAO,CAAC,CAAA,CAC1BW,CAAAA,CAAgBX,YAAAA,CAAO,KAAK,CAAA,CAMlCY,eAAAA,CAAU,IAAM,CACd,IAAIC,CAAAA,CAAY,KAAA,CACZC,CAAAA,CAA8B,IAAA,CAClC,OAAA,CAAC,SAAY,CACX,GAAI,CACF,IAAMC,CAAAA,CAAK,MAAM,kBAAkBtB,CAAU,CAAA,CAC7C,GAAIoB,CAAAA,CAAW,CACbE,CAAAA,CAAG,KAAA,IAAQ,CACX,MACF,CACAD,CAAAA,CAAUC,CAAAA,CACVX,CAAAA,CAAeW,CAAE,EACnB,CAAA,KAAQ,CAGR,CACF,CAAA,GAAG,CACI,IAAM,CACXF,CAAAA,CAAY,IAAA,CACZC,CAAAA,EAAS,KAAA,KACX,CACF,CAAA,CAAG,CAACrB,CAAU,CAAC,CAAA,CAGfmB,eAAAA,CAAU,IAAM,CACd,GAAI,CAACT,CAAAA,CAAa,OAClB,IAAMa,CAAAA,CAAOjB,CAAAA,CAAc,OAAA,CACrBkB,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CACjC,GAAI,CAACe,CAAAA,EAAQ,CAACC,CAAAA,CAAS,OACvBD,CAAAA,CAAK,KAAA,CAAQb,CAAAA,CAAY,KAAA,CACzBa,CAAAA,CAAK,MAAA,CAASb,CAAAA,CAAY,MAAA,CAC1Bc,CAAAA,CAAQ,MAAQd,CAAAA,CAAY,KAAA,CAC5Bc,CAAAA,CAAQ,MAAA,CAASd,CAAAA,CAAY,MAAA,CAC7B,IAAMzF,CAAAA,CAAMsG,CAAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAC3BtG,CAAAA,GACLA,CAAAA,CAAI,qBAAA,CAAwB,KAAA,CAC5BA,CAAAA,CAAI,SAAA,CAAUyF,CAAAA,CAAa,CAAA,CAAG,CAAC,CAAA,EACjC,CAAA,CAAG,CAACA,CAAW,CAAC,CAAA,CAIhBS,eAAAA,CAAU,IAAM,CACd,IAAMK,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CAC5BgB,CAAAA,EACLC,EAAAA,CAAOD,CAAAA,CAASX,CAAAA,CAAaE,CAAAA,CAAS,OAAO,EAC/C,CAAA,CAAG,CAACF,CAAW,CAAC,CAAA,CAEhBa,yBAAAA,CACErB,CAAAA,CACA,KAA8B,CAC5B,cAAA,CAAgB,IAAMQ,CAAAA,CAAY,MAAA,CAAS,CAAA,CAC3C,KAAA,CAAO,IAAMC,CAAAA,CAAe,EAAE,CAAA,CAC9B,IAAA,CAAM,IACJA,CAAAA,CAAgBa,CAAAA,EACdA,CAAAA,CAAI,MAAA,GAAW,CAAA,CAAIA,CAAAA,CAAMA,CAAAA,CAAI,KAAA,CAAM,CAAA,CAAG,EAAE,CAC1C,CAAA,CACF,MAAM,OAAA,EAAU,CAId,IAAMC,CAAAA,CAAQb,CAAAA,CAAS,OAAA,CACjBc,CAAAA,CAAMD,CAAAA,CAAQ,CAAC,GAAGf,CAAAA,CAAae,CAAK,CAAA,CAAIf,CAAAA,CAI9C,GADIgB,CAAAA,CAAI,MAAA,GAAW,CAAA,EACf,CAACnB,CAAAA,CAAa,OAAOV,CAAAA,CACzB,IAAM/C,CAAAA,CAAM,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA,CAC3CA,CAAAA,CAAI,KAAA,CAAQyD,CAAAA,CAAY,KAAA,CACxBzD,CAAAA,CAAI,MAAA,CAASyD,CAAAA,CAAY,MAAA,CACzB,IAAMzF,CAAAA,CAAMgC,CAAAA,CAAI,UAAA,CAAW,IAAI,CAAA,CAC/B,GAAI,CAAChC,CAAAA,CAAK,OAAO+E,CAAAA,CACjB/E,CAAAA,CAAI,qBAAA,CAAwB,KAAA,CAC5BA,CAAAA,CAAI,SAAA,CAAUyF,CAAAA,CAAa,CAAA,CAAG,CAAC,CAAA,CAC/B,IAAA,IAAWoB,CAAAA,IAAQD,CAAAA,CAAKE,EAAAA,CAAS9G,CAAAA,CAAK6G,CAAI,CAAA,CAI1C,OAAO,MAAM,IAAI,OAAA,CAAerJ,CAAAA,EAAY,CAC1CwE,CAAAA,CAAI,MAAA,CACDhE,CAAAA,EAAS,CACRR,CAAAA,CAAQQ,CAAAA,EAAQ+G,CAAU,EAC5B,CAAA,CACA,YAAA,CACA,GACF,EACF,CAAC,CACH,CACF,CAAA,CAAA,CACA,CAACa,CAAAA,CAAaH,CAAAA,CAAaV,CAAU,CACvC,CAAA,CAEA,SAASgC,CAAAA,CACP5J,CAAAA,CAC0B,CAC1B,IAAM6J,CAAAA,CAAIzB,CAAAA,CAAiB,OAAA,CAC3B,GAAI,CAACyB,CAAAA,CAAG,OAAO,CAAE,CAAA,CAAG,CAAA,CAAG,CAAA,CAAG,CAAE,CAAA,CAC5B,IAAMC,CAAAA,CAAOD,CAAAA,CAAE,qBAAA,GACTE,CAAAA,CAAKF,CAAAA,CAAE,KAAA,CAAQ,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAK,KAAA,CAAO,CAAC,CAAA,CACrCE,CAAAA,CAAKH,CAAAA,CAAE,MAAA,CAAS,IAAA,CAAK,GAAA,CAAIC,CAAAA,CAAK,MAAA,CAAQ,CAAC,CAAA,CAC7C,OAAO,CACL,CAAA,CAAA,CAAI9J,CAAAA,CAAE,OAAA,CAAU8J,CAAAA,CAAK,IAAA,EAAQC,CAAAA,CAC7B,CAAA,CAAA,CAAI/J,CAAAA,CAAE,OAAA,CAAU8J,CAAAA,CAAK,GAAA,EAAOE,CAC9B,CACF,CAEA,SAASC,CAAAA,EAAqB,CACxBnB,CAAAA,CAAc,OAAA,GAClBA,CAAAA,CAAc,OAAA,CAAU,IAAA,CACxB,qBAAA,CAAsB,IAAM,CAC1BA,CAAAA,CAAc,OAAA,CAAU,KAAA,CACxB,IAAMM,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CAC5BgB,CAAAA,EACLC,EAAAA,CAAOD,CAAAA,CAASX,CAAAA,CAAaE,CAAAA,CAAS,OAAO,EAC/C,CAAC,CAAA,EACH,CAEA,SAASuB,CAAAA,CAAclK,CAAAA,CAA0C,CAC/D,GAAIA,CAAAA,CAAE,MAAA,GAAW,MAAA,EAAaA,CAAAA,CAAE,MAAA,GAAW,CAAA,CAAG,OAC9C,GAAI,CACFA,CAAAA,CAAE,aAAA,CAAc,iBAAA,CAAkBA,CAAAA,CAAE,SAAS,EAC/C,CAAA,KAAQ,CAKR,CACA4I,CAAAA,CAAa,OAAA,CAAU,IAAA,CACvBZ,CAAAA,GAAkB,IAAI,CAAA,CACtB,IAAM,CAAA,CAAI4B,CAAAA,CAAe5J,CAAC,CAAA,CACtB6H,CAAAA,GAAS,OAAA,CACXc,CAAAA,CAAS,OAAA,CAAU,CAAE,IAAA,CAAM,OAAA,CAAS,IAAA,CAAM,CAAA,CAAG,EAAA,CAAI,CAAA,CAAG,KAAA,CAAAb,CAAAA,CAAO,KAAA,CAAOC,CAAY,CAAA,CACrEF,CAAAA,GAAS,MAAA,CAClBc,CAAAA,CAAS,OAAA,CAAU,CAAE,IAAA,CAAM,MAAA,CAAQ,IAAA,CAAM,CAAA,CAAG,EAAA,CAAI,CAAA,CAAG,KAAA,CAAAb,CAAAA,CAAO,MAAOC,CAAY,CAAA,CAE7EY,CAAAA,CAAS,OAAA,CAAU,CACjB,IAAA,CAAM,UAAA,CACN,MAAA,CAAQ,CAAC,CAAC,CAAA,CACV,KAAA,CAAAb,CAAAA,CACA,KAAA,CAAOC,CACT,CAAA,CAEFc,CAAAA,CAAgB,OAAA,CAAU,WAAA,CAAY,GAAA,EAAI,CAC1CoB,CAAAA,GACF,CAEA,SAASE,CAAAA,CAAcnK,CAAAA,CAA0C,CAC/D,GAAI,CAAC4I,CAAAA,CAAa,OAAA,EAAW,CAACD,CAAAA,CAAS,OAAA,CAAS,OAChD,IAAM,CAAA,CAAIiB,CAAAA,CAAe5J,CAAC,CAAA,CACpBwJ,CAAAA,CAAQb,CAAAA,CAAS,OAAA,CACvB,GAAIa,CAAAA,CAAM,IAAA,GAAS,OAAA,EAAWA,CAAAA,CAAM,IAAA,GAAS,MAAA,CAC3CA,CAAAA,CAAM,EAAA,CAAK,CAAA,CAAA,KACN,CACL,IAAMY,CAAAA,CAAOZ,CAAAA,CAAM,MAAA,CAAOA,CAAAA,CAAM,MAAA,CAAO,MAAA,CAAS,CAAC,CAAA,CAC3Ca,CAAAA,CAAQD,CAAAA,CAAAA,CACTA,CAAAA,CAAK,CAAA,CAAI,CAAA,CAAE,CAAA,GAAM,CAAA,CAAA,CAAKA,CAAAA,CAAK,CAAA,CAAI,CAAA,CAAE,CAAA,GAAM,CAAA,CACxC,CAAA,CAAA,CAAA,CACEE,CAAAA,CAAM,WAAA,CAAY,GAAA,EAAI,CACtBC,CAAAA,CAAUD,CAAAA,CAAMzB,CAAAA,CAAgB,OAAA,CAAA,CAGlCwB,CAAAA,CAAQ,EAAA,EAAME,CAAAA,CAAU,EAAA,IAC1Bf,CAAAA,CAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CACnBX,CAAAA,CAAgB,OAAA,CAAUyB,CAAAA,EAE9B,CACAL,CAAAA,GACF,CAEA,SAASO,CAAAA,EAAc,CACrB,GAAI,CAAC5B,CAAAA,CAAa,OAAA,CAAS,OAC3BA,CAAAA,CAAa,OAAA,CAAU,KAAA,CACvBZ,CAAAA,GAAkB,KAAK,CAAA,CACvB,IAAMwB,CAAAA,CAAQb,CAAAA,CAAS,OAAA,CAEvB,GADAA,CAAAA,CAAS,OAAA,CAAU,IAAA,CACf,CAAA,CAACa,CAAAA,CACL,CAAA,GAAIA,EAAM,IAAA,GAAS,OAAA,EAAWA,CAAAA,CAAM,IAAA,GAAS,MAAA,CAAQ,CACnD,IAAMiB,CAAAA,CAAKjB,CAAAA,CAAM,EAAA,CAAG,CAAA,CAAIA,CAAAA,CAAM,IAAA,CAAK,CAAA,CAC7BkB,CAAAA,CAAKlB,CAAAA,CAAM,EAAA,CAAG,CAAA,CAAIA,CAAAA,CAAM,IAAA,CAAK,CAAA,CACnC,GAAIiB,CAAAA,CAAKA,CAAAA,CAAKC,CAAAA,CAAKA,CAAAA,CAAK,EAAA,CAAI,CAG1B,IAAMtB,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CAC7BgB,CAAAA,EAASC,EAAAA,CAAOD,CAAAA,CAASX,CAAAA,CAAa,IAAI,CAAA,CAC9C,MACF,CACF,CAAA,KAAA,GAAWe,CAAAA,CAAM,MAAA,CAAO,MAAA,CAAS,CAAA,CAAG,CAClC,IAAMJ,CAAAA,CAAUhB,CAAAA,CAAiB,OAAA,CAC7BgB,CAAAA,EAASC,EAAAA,CAAOD,CAAAA,CAASX,CAAAA,CAAa,IAAI,CAAA,CAC9C,MACF,CACAC,CAAAA,CAAgBa,CAAAA,EAAQ,CAAC,GAAGA,EAAKC,CAAK,CAAA,CAAE,KAAA,CAAM,GAAc,CAAC,EAAA,CAC/D,CAEA,OACEmB,eAAAA,CAAC,KAAA,CAAA,CAAI,GAAA,CAAKtC,CAAAA,CAAc,SAAA,CAAU,sBAAA,CAChC,QAAA,CAAA,CAAAuC,cAAAA,CAAC,QAAA,CAAA,CAAO,GAAA,CAAK1C,CAAAA,CAAe,CAAA,CAC5B0C,cAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKxC,CAAAA,CACL,SAAA,CAAU,wBAAA,CACV,aAAA,CAAe8B,CAAAA,CACf,aAAA,CAAeC,CAAAA,CACf,WAAA,CAAaK,CAAAA,CACb,eAAA,CAAiBA,CAAAA,CACnB,CAAA,CAAA,CACF,CAEJ,CAEA,SAASnB,EAAAA,CACP9G,CAAAA,CACAkG,CAAAA,CACAe,CAAAA,CACA,CACA,IAAM3G,CAAAA,CAAMN,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAClC,GAAKM,CAAAA,CACL,CAAAA,CAAAA,CAAI,SAAA,CAAU,CAAA,CAAG,CAAA,CAAGN,CAAAA,CAAO,KAAA,CAAOA,CAAAA,CAAO,MAAM,CAAA,CAC/C,QAAWsI,CAAAA,IAAKpC,CAAAA,CAAakB,EAAAA,CAAS9G,CAAAA,CAAKgI,CAAC,CAAA,CACxCrB,CAAAA,EAAOG,EAAAA,CAAS9G,CAAAA,CAAK2G,CAAK,EAAA,CAChC,CAEA,SAASG,EAAAA,CAAS9G,CAAAA,CAA+B6G,CAAAA,CAAkB,CAQjE,GAPA7G,CAAAA,CAAI,IAAA,EAAK,CACTA,CAAAA,CAAI,WAAA,CAAc6G,CAAAA,CAAK,KAAA,CACvB7G,CAAAA,CAAI,SAAA,CAAY6G,CAAAA,CAAK,KAAA,CACrB7G,CAAAA,CAAI,SAAA,CAAY6G,CAAAA,CAAK,KAAA,CACrB7G,CAAAA,CAAI,OAAA,CAAU,OAAA,CACdA,CAAAA,CAAI,QAAA,CAAW,OAAA,CAEX6G,CAAAA,CAAK,IAAA,GAAS,MAAA,CAAQ,CACxB,IAAMoB,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAIpB,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAGA,CAAAA,CAAK,EAAA,CAAG,CAAC,CAAA,CACnCqB,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAIrB,CAAAA,CAAK,IAAA,CAAK,CAAA,CAAGA,CAAAA,CAAK,EAAA,CAAG,CAAC,CAAA,CACnCsB,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAItB,CAAAA,CAAK,EAAA,CAAG,CAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CACpCuB,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAIvB,CAAAA,CAAK,EAAA,CAAG,CAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,CAAC,CAAA,CAC1C7G,CAAAA,CAAI,UAAA,CAAWiI,CAAAA,CAAGC,CAAAA,CAAGC,CAAAA,CAAGC,CAAC,EAC3B,CAAA,KAAA,GAAWvB,CAAAA,CAAK,IAAA,GAAS,UAAA,CACvBwB,EAAAA,CAAerI,CAAAA,CAAK6G,CAAAA,CAAK,MAAM,CAAA,CAAA,KAC1B,CACL,GAAM,CAAE,IAAA,CAAAyB,CAAAA,CAAM,EAAA,CAAAC,CAAAA,CAAI,KAAA,CAAAC,CAAM,CAAA,CAAI3B,CAAAA,CAC5B7G,CAAAA,CAAI,SAAA,EAAU,CACdA,CAAAA,CAAI,MAAA,CAAOsI,CAAAA,CAAK,CAAA,CAAGA,CAAAA,CAAK,CAAC,CAAA,CACzBtI,CAAAA,CAAI,MAAA,CAAOuI,CAAAA,CAAG,CAAA,CAAGA,CAAAA,CAAG,CAAC,CAAA,CACrBvI,CAAAA,CAAI,MAAA,EAAO,CACX,IAAMyI,CAAAA,CAAQ,IAAA,CAAK,KAAA,CAAMF,CAAAA,CAAG,CAAA,CAAID,CAAAA,CAAK,CAAA,CAAGC,CAAAA,CAAG,CAAA,CAAID,CAAAA,CAAK,CAAC,CAAA,CAC/CI,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAA,CAAIF,CAAAA,CAAQ,CAAC,CAAA,CACnCxI,CAAAA,CAAI,SAAA,EAAU,CACdA,CAAAA,CAAI,MAAA,CAAOuI,CAAAA,CAAG,CAAA,CAAGA,CAAAA,CAAG,CAAC,CAAA,CACrBvI,CAAAA,CAAI,MAAA,CACFuI,CAAAA,CAAG,CAAA,CAAIG,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAC1CF,CAAAA,CAAG,CAAA,CAAIG,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,CAAC,CAC5C,CAAA,CACAzI,CAAAA,CAAI,MAAA,CACFuI,CAAAA,CAAG,CAAA,CAAIG,CAAAA,CAAO,KAAK,GAAA,CAAID,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAC1CF,CAAAA,CAAG,CAAA,CAAIG,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAQ,IAAA,CAAK,EAAA,CAAK,CAAC,CAC5C,CAAA,CACAzI,CAAAA,CAAI,SAAA,EAAU,CACdA,CAAAA,CAAI,IAAA,GACN,CAEAA,CAAAA,CAAI,OAAA,GACN,CAQA,SAASqI,EAAAA,CACPrI,CAAAA,CACA2I,CAAAA,CACA,CACA,GAAIA,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,OACzB3I,CAAAA,CAAI,SAAA,EAAU,CACd,IAAM4I,CAAAA,CAAQD,CAAAA,CAAO,CAAC,CAAA,CACtB,GAAI,CAACC,CAAAA,CAAO,OAEZ,GADA5I,CAAAA,CAAI,MAAA,CAAO4I,CAAAA,CAAM,CAAA,CAAGA,CAAAA,CAAM,CAAC,CAAA,CACvBD,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,CAEvB3I,EAAI,GAAA,CAAI4I,CAAAA,CAAM,CAAA,CAAGA,CAAAA,CAAM,CAAA,CAAG5I,CAAAA,CAAI,SAAA,CAAY,CAAA,CAAG,CAAA,CAAG,IAAA,CAAK,EAAA,CAAK,CAAC,CAAA,CAC3DA,CAAAA,CAAI,IAAA,EAAK,CACT,MACF,CACA,GAAI2I,CAAAA,CAAO,MAAA,GAAW,CAAA,CAAG,CACvB,IAAME,CAAAA,CAASF,CAAAA,CAAO,CAAC,CAAA,CACvB3I,CAAAA,CAAI,MAAA,CAAO6I,CAAAA,CAAO,CAAA,CAAGA,CAAAA,CAAO,CAAC,CAAA,CAC7B7I,CAAAA,CAAI,MAAA,EAAO,CACX,MACF,CACA,IAAA,IAAS8I,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIH,CAAAA,CAAO,MAAA,CAAS,CAAA,CAAGG,CAAAA,EAAAA,CAAK,CAC1C,IAAMC,CAAAA,CAAIJ,CAAAA,CAAOG,CAAC,CAAA,CACZrI,CAAAA,CAAOkI,CAAAA,CAAOG,CAAAA,CAAI,CAAC,CAAA,CACnBE,CAAAA,CAAAA,CAAMD,CAAAA,CAAE,CAAA,CAAItI,EAAK,CAAA,EAAK,CAAA,CACtBwI,CAAAA,CAAAA,CAAMF,CAAAA,CAAE,CAAA,CAAItI,CAAAA,CAAK,CAAA,EAAK,CAAA,CAC5BT,CAAAA,CAAI,gBAAA,CAAiB+I,CAAAA,CAAE,CAAA,CAAGA,CAAAA,CAAE,CAAA,CAAGC,CAAAA,CAAIC,CAAE,EACvC,CAEA,IAAM1B,CAAAA,CAAOoB,CAAAA,CAAOA,CAAAA,CAAO,MAAA,CAAS,CAAC,CAAA,CACrC3I,CAAAA,CAAI,MAAA,CAAOuH,CAAAA,CAAK,CAAA,CAAGA,CAAAA,CAAK,CAAC,CAAA,CACzBvH,CAAAA,CAAI,MAAA,GACN,CC5VA,IAAMkJ,EAAAA,CAAoB,EAAA,CACpBC,EAAAA,CAAoB,EAAA,CAEpBC,EAAAA,CAA4D,CAChE,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,kBAAmB,CAAA,CAC1C,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,mBAAoB,EAC7C,CAAE,KAAA,CAAO,MAAA,CAAQ,KAAA,CAAO,mBAAoB,CAAA,CAC5C,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,kBAAmB,CAAA,CAC5C,CAAE,KAAA,CAAO,SAAA,CAAW,KAAA,CAAO,oBAAqB,CAClD,CAAA,CAEMC,EAAAA,CAA6E,CACjF,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,CAAA,CAAG,GAAA,CAAK,CAAE,CAAA,CACnC,CAAE,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,CAAA,CAAG,GAAA,CAAK,CAAE,CAAA,CACpC,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,CAAA,CAAG,GAAA,CAAK,EAAG,CACtC,CAAA,CAEMC,EAAAA,CAAwE,CAC5E,CAAE,KAAA,CAAO,KAAA,CAAO,KAAA,CAAO,KAAM,CAAA,CAC7B,CAAE,KAAA,CAAO,SAAA,CAAW,KAAA,CAAO,MAAO,CAAA,CAClC,CAAE,KAAA,CAAO,QAAS,KAAA,CAAO,OAAQ,CACnC,CAAA,CAIMC,EAAAA,CAAgF,CACpF,CAAE,KAAA,CAAO,MAAA,CAAQ,KAAA,CAAO,YAAA,CAAc,IAAA,CAAM,sBAAuB,CAAA,CACnE,CAAE,KAAA,CAAO,QAAA,CAAU,KAAA,CAAO,QAAA,CAAU,IAAA,CAAM,sBAAuB,CAAA,CACjE,CAAE,KAAA,CAAO,OAAA,CAAS,KAAA,CAAO,OAAA,CAAS,IAAA,CAAM,kBAAmB,CAC7D,CAAA,CAYO,SAASC,EAAAA,EAAe,CAC7B,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAQ,MAAA,CAAAC,CAAAA,CAAQ,YAAA,CAAAC,CAAAA,CAAc,IAAA,CAAAC,CAAAA,CAAM,OAAA,CAAAnG,CAAQ,CAAA,CAAImB,CAAAA,EAAS,CAC3D,CAACiF,CAAAA,CAAMC,CAAO,CAAA,CAAInE,cAAAA,CAAe,CAAC,CAAA,CAClC,CAAC9C,CAAAA,CAAQkH,CAAS,CAAA,CAAIpE,cAAAA,CAA+B,IAAI,EACzD,CAACqE,CAAAA,CAAOC,CAAQ,CAAA,CAAItE,cAAAA,CAAgB,CAAE,IAAA,CAAM,MAAO,CAAC,CAAA,CACpD,CAACuE,CAAAA,CAAYC,CAAa,CAAA,CAAIxE,cAAAA,CAAS,KAAK,CAAA,CAC5C,CAACyE,CAAAA,CAAUC,CAAW,CAAA,CAAI1E,cAAAA,CAAS,CAAC,CAAA,CAIpC,CAAC2E,CAAAA,CAAeC,CAAgB,CAAA,CAAI5E,cAAAA,CAAsB,IAAI,CAAA,CAE9D,CAACX,CAAAA,CAAMwF,CAAO,CAAA,CAAI7E,cAAAA,CAAyB,OAAO,CAAA,CAClD,CAAC8E,CAAAA,CAAaC,CAAc,CAAA,CAAI/E,cAAAA,CAAiByD,EAAAA,CAAS,CAAC,CAAA,CAAG,KAAK,CAAA,CACnE,CAAClE,CAAAA,CAAayF,CAAc,CAAA,CAAIhF,cAAAA,CAAiB0D,EAAAA,CAAa,CAAC,CAAA,CAAG,KAAK,CAAA,CACvE,CAAClL,CAAAA,CAAMyM,CAAO,CAAA,CAAIjF,cAAAA,CAAS,EAAE,CAAA,CAC7B,CAACkF,CAAAA,CAAUC,CAAW,CAAA,CAAInF,cAAAA,CAA2B,KAAK,CAAA,CAC1D,CAACoF,CAAAA,CAAgBC,CAAiB,CAAA,CAAIrF,cAAAA,CAASiE,CAAAA,EAAM,KAAA,EAAS,EAAE,CAAA,CAChE,CAAC1F,CAAAA,CAAU+G,CAAW,CAAA,CAAItF,cAAAA,CAAgC,IAAI,CAAA,CAC9D,CAACuF,CAAAA,CAAOC,CAAQ,CAAA,CAAIxF,cAAAA,CACxB,IACF,CAAA,CACM,CAACyF,EAAAA,CAAYC,EAAa,CAAA,CAAI1F,cAAAA,CAAS,CAAC,CAAA,CACxC,CAAC2F,CAAAA,CAAeC,CAAgB,CAAA,CACpC5F,cAAAA,CAAqC,IAAI,CAAA,CACrC,CAAC7F,CAAAA,CAAO0L,EAAQ,CAAA,CAAI7F,cAAAA,CACxB,IACF,CAAA,CACM,CAAC8F,EAAAA,CAASC,EAAU,CAAA,CAAI/F,cAAAA,CAAS,KAAK,CAAA,CACtCgG,EAAAA,CAAgBrG,YAAAA,CAA8B,IAAI,EAClDsG,EAAAA,CAAWtG,YAAAA,CAA8B,IAAI,CAAA,CAC7CuG,EAAAA,CAAuBvG,YAAAA,CAA2B,IAAI,CAAA,CAItDwG,CAAAA,CAAsBxG,YAAAA,CAAO,KAAK,CAAA,CAqHxC,GAjHAY,eAAAA,CAAU,IAAM,CACd,GAAKwD,CAAAA,CACL,OAAAoC,CAAAA,CAAoB,OAAA,CAAU,KAAA,CAC9BhC,CAAAA,CAAQ,CAAC,CAAA,CACTC,CAAAA,CAAU,IAAI,CAAA,CACda,CAAAA,CAAQ,EAAE,CAAA,CACVO,CAAAA,CAAS,IAAI,CAAA,CACbE,EAAAA,CAAc,CAAC,CAAA,CACfG,EAAAA,CAAS,IAAI,CAAA,CACbrB,CAAAA,CAAc,KAAK,CAAA,CACnBE,CAAAA,CAAY,CAAC,CAAA,CACbE,CAAAA,CAAiB,IAAI,CAAA,CACrBgB,CAAAA,CAAkB7E,CAAAA,GAChBA,CAAAA,EAAK,MAAA,EAAO,CACL,IAAA,CACR,CAAA,CAEDuD,CAAAA,CAASxG,CAAAA,EAAS,IAAA,GAAS,QAAA,CAAW,CAAE,IAAA,CAAM,QAAS,CAAA,CAAI,CAAE,IAAA,CAAM,MAAO,CAAC,CAAA,CACpE,IAAM,CACXqI,CAAAA,CAAoB,OAAA,CAAU,KAChC,CACF,CAAA,CAAG,CAACpC,CAAAA,CAAQjG,CAAO,CAAC,CAAA,CAKpByC,eAAAA,CAAU,IAAM,CACd,GAAI,CAACwD,CAAAA,CAAQ,OACbmC,EAAAA,CAAqB,OAAA,CAClB,QAAA,CAAS,aAAA,EAAwC,IAAA,CACpD,IAAME,CAAAA,CAAO,QAAA,CAAS,eAAA,CAChBC,CAAAA,CAAeD,CAAAA,CAAK,KAAA,CAAM,QAAA,CAC1BE,CAAAA,CAAmBF,CAAAA,CAAK,KAAA,CAAM,YAAA,CAC9BG,CAAAA,CAAY,MAAA,CAAO,UAAA,CAAaH,CAAAA,CAAK,WAAA,CAC3CA,CAAAA,CAAK,KAAA,CAAM,QAAA,CAAW,QAAA,CAClBG,CAAAA,CAAY,CAAA,GAAGH,CAAAA,CAAK,KAAA,CAAM,YAAA,CAAe,CAAA,EAAGG,CAAS,CAAA,EAAA,CAAA,CAAA,CACzD,IAAIC,CAAAA,CAAW,KAAA,CACTC,EAAU,IAAM,CACpB,GAAI,CAAAD,CAAAA,CACJ,CAAAA,CAAAA,CAAW,IAAA,CACXJ,CAAAA,CAAK,KAAA,CAAM,QAAA,CAAWC,CAAAA,CACtBD,CAAAA,CAAK,KAAA,CAAM,YAAA,CAAeE,CAAAA,CAC1B,GAAI,CACFJ,EAAAA,CAAqB,OAAA,EAAS,KAAA,KAChC,CAAA,KAAQ,CAER,CAAA,CACF,CAAA,CACA,OAAA,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAYO,CAAO,CAAA,CACpC,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoB,UAAA,CAAYA,CAAO,CAAA,CAC9CA,CAAAA,GACF,CACF,CAAA,CAAG,CAAC1C,CAAM,CAAC,CAAA,CAGXxD,eAAAA,CAAU,IAAM,CACd,GAAI,CAACwD,CAAAA,CAAQ,OACb,SAAS2C,CAAAA,CAAMlP,CAAAA,CAAkB,CAC/B,GAAIA,CAAAA,CAAE,GAAA,GAAQ,QAAA,CAAU,CACtBA,CAAAA,CAAE,cAAA,EAAe,CACjBwM,CAAAA,EAAa,CACb,MACF,CACA,GAAIxM,CAAAA,CAAE,GAAA,GAAQ,KAAA,CAAO,OACrB,IAAMmP,CAAAA,CAAOV,EAAAA,CAAS,OAAA,CACtB,GAAI,CAACU,CAAAA,CAAM,OACX,IAAMC,CAAAA,CAAaC,EAAAA,CAAaF,CAAI,CAAA,CACpC,GAAIC,CAAAA,CAAW,MAAA,GAAW,CAAA,CAAG,OAC7B,IAAM3D,CAAAA,CAAQ2D,CAAAA,CAAW,CAAC,CAAA,CACpBhF,CAAAA,CAAOgF,CAAAA,CAAWA,CAAAA,CAAW,MAAA,CAAS,CAAC,CAAA,CACvCE,EAAAA,CAAS,QAAA,CAAS,aAAA,CACpBtP,CAAAA,CAAE,QAAA,GAAasP,EAAAA,GAAW7D,CAAAA,EAAS,CAAC0D,CAAAA,CAAK,QAAA,CAASG,EAAM,CAAA,CAAA,EAC1DtP,CAAAA,CAAE,cAAA,EAAe,CACjBoK,CAAAA,CAAK,KAAA,EAAM,EACF,CAACpK,CAAAA,CAAE,QAAA,EAAYsP,EAAAA,GAAWlF,CAAAA,GACnCpK,EAAE,cAAA,EAAe,CACjByL,CAAAA,CAAM,KAAA,EAAM,EAEhB,CACA,OAAA,QAAA,CAAS,gBAAA,CAAiB,SAAA,CAAWyD,CAAK,CAAA,CACnC,IAAM,QAAA,CAAS,mBAAA,CAAoB,SAAA,CAAWA,CAAK,CAC5D,CAAA,CAAG,CAAC3C,CAAAA,CAAQC,CAAY,CAAC,CAAA,CAGzBzD,eAAAA,CAAU,IAAM,CACd,GAAI,CAACwD,CAAAA,EAAUM,CAAAA,CAAM,IAAA,GAAS,QAAA,CAAU,OACxC,SAAS0C,CAAAA,CAAQvP,CAAAA,CAAmB,CAGlC,IAAMwP,CAAAA,CAFQ,KAAA,CAAM,IAAA,CAAKxP,CAAAA,CAAE,aAAA,EAAe,KAAA,EAAS,EAAE,CAAA,CACjC,IAAA,CAAMyP,CAAAA,EAASA,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAC,CAAA,EAC7C,SAAA,EAAU,CACzBD,CAAAA,GACLxP,CAAAA,CAAE,cAAA,EAAe,CACjB0P,EAAAA,CAAuBF,CAAI,CAAA,EAC7B,CACA,OAAA,MAAA,CAAO,gBAAA,CAAiB,OAAA,CAASD,CAAO,CAAA,CACjC,IAAM,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAASA,CAAO,CAE1D,CAAA,CAAG,CAAChD,CAAAA,CAAQM,CAAAA,CAAM,IAAI,CAAC,CAAA,CAGvB9D,eAAAA,CAAU,IAAM,CACd,GAAI,CAAChC,CAAAA,CAAU,OACf,IAAMnD,CAAAA,CAAQ,IAAA,CAAK,GAAA,EAAI,CACjB+L,CAAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAM,CAClC,IAAMC,CAAAA,CAAM,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,CAAK,GAAA,EAAI,CAAIhM,CAAAA,EAAS,GAAI,CAAA,CAClDsK,EAAAA,CAAc0B,CAAG,CAAA,CACbA,CAAAA,EAAO7D,EAAAA,EAAmB8D,EAAAA,GAChC,CAAA,CAAG,GAAG,CAAA,CACN,OAAO,IAAM,MAAA,CAAO,aAAA,CAAcF,CAAE,CAEtC,CAAA,CAAG,CAAC5I,CAAQ,CAAC,CAAA,CAET,CAACwF,CAAAA,CAAQ,OAAO,IAAA,CAGpB,eAAeuD,EAAAA,CAAWxO,CAAAA,CAA+C,CACvEqN,CAAAA,CAAoB,OAAA,CAAU,KAAA,CAC9B7B,CAAAA,CAAS,CAAE,IAAA,CAAM,WAAY,CAAC,CAAA,CAC9B,GAAI,CACF,IAAMlL,CAAAA,CAAS,MAAMkJ,EAAAA,CAAc,CACjC,GAAGxE,CAAAA,CACH,IAAA,CAAAhF,CAAAA,CACA,MAAA,CAAQgF,CAAAA,EAAS,MAAA,EAAU,QAAA,CAAS,eACtC,CAAC,CAAA,CACD,OAAIqI,CAAAA,CAAoB,OAAA,CAAgB,CAAA,CAAA,EACxCoB,EAAAA,CAAoBnO,CAAM,CAAA,CAC1BkL,CAAAA,CAAS,CAAE,IAAA,CAAM,OAAA,CAAS,OAAA,CAASlL,CAAO,CAAC,CAAA,CACpC,CAAA,CAAA,CACT,CAAA,MAAS5B,CAAAA,CAAG,CACV,OAAI2O,CAAAA,CAAoB,OAAA,EACxB7B,CAAAA,CAAS,CACP,IAAA,CAAM,QAAA,CACN,KAAA,CACE9M,CAAAA,YAAa,KAAA,CACTA,CAAAA,CAAE,OAAA,CACF,+CACR,CAAC,CAAA,CACM,KACT,CACF,CAEA,eAAegQ,EAAAA,CAAalJ,CAAAA,CAAkB,CAC5C8F,CAAAA,CAAU9F,CAAC,CAAA,CAEXsG,CAAAA,CAAiB,IAAI,CAAA,CACjBtG,CAAAA,GAAM,OAAA,EAASmJ,EAAAA,EAAa,CAC5BnJ,CAAAA,GAAM,MAAA,CACR,MAAMgJ,EAAAA,CAAWxJ,CAAAA,EAAS,IAAA,EAAQ,MAAM,CAAA,CAC/BQ,CAAAA,GAAM,QAAA,CACf,MAAMgJ,EAAAA,CAAW,aAAa,CAAA,CAInB,MAAMA,EAAAA,CAAWxJ,CAAAA,EAAS,IAAA,EAAQ,MAAM,CAAA,EAC3C,MAAM4J,EAAAA,GAElB,CAEA,SAASR,EAAAA,CAAuBF,CAAAA,CAAY,CAC1C,GAAI,CAACA,CAAAA,CAAK,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,CAAG,CACnCW,YAAAA,CAAM,KAAA,CAAM,yCAAyC,CAAA,CACrD,MACF,CACA,IAAMvO,CAAAA,CAASwO,EAAAA,CAA0BZ,CAAAA,CAAM,CAC7C,gCACF,CAAC,CAAA,CACD1C,CAAAA,CAAS,CAAE,IAAA,CAAM,OAAA,CAAS,OAAA,CAASlL,CAAO,CAAC,EAC7C,CAEA,SAASmO,EAAAA,CAAoBnO,CAAAA,CAAuB,CAC9CA,CAAAA,CAAO,QAAA,CAAS,MAAA,GAAW,CAAA,EAC/BuO,YAAAA,CAAM,OAAA,CACJ,4FACF,EACF,CAGA,eAAeE,EAAAA,EAAiB,CAC9B,GAAI,CACF,IAAMtP,CAAAA,CAAI,MAAMuP,EAAAA,CAAYvE,EAAiB,CAAA,CAC7C+B,CAAAA,CAAY/M,CAAC,EACf,CAAA,MAASf,CAAAA,CAAG,CACVmQ,YAAAA,CAAM,KAAA,CAAMnQ,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,wBAAwB,EACvE,CACF,CACA,eAAe6P,EAAAA,EAAkB,CAC/B,GAAK9I,CAAAA,CACL,GAAI,CACF,IAAMnF,CAAAA,CAAS,MAAMmF,CAAAA,CAAS,IAAA,EAAK,CACnCiH,CAAAA,CAAS,CAAE,IAAA,CAAMpM,CAAAA,CAAO,IAAA,CAAM,UAAA,CAAYA,CAAAA,CAAO,UAAW,CAAC,EAC/D,CAAA,MAAS5B,CAAAA,CAAG,CACVmQ,YAAAA,CAAM,KAAA,CAAMnQ,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,0BAA0B,EACzE,CAAA,OAAE,CACA8N,CAAAA,CAAY,IAAI,EAClB,CACF,CACA,SAASyC,EAAAA,EAAmB,CAC1BxJ,CAAAA,EAAU,MAAA,EAAO,CACjB+G,CAAAA,CAAY,IAAI,CAAA,CAChBE,CAAAA,CAAS,IAAI,CAAA,CACbE,EAAAA,CAAc,CAAC,EACjB,CAGA,eAAegC,EAAAA,EAAa,CAC1B,GAAI,CACF,IAAMnP,CAAAA,CAAI,MAAMyP,EAAAA,CAAYxE,EAAiB,CAAA,CAC7CoC,CAAAA,CAAiBrN,CAAC,CAAA,CAClBA,CAAAA,CAAE,MAAA,CAAO,cAAA,EAAe,CAAE,CAAC,CAAA,EAAG,gBAAA,CAAiB,OAAA,CAAS,IAAM,CACvD0P,EAAAA,GACP,CAAC,EACH,CAAA,MAASzQ,CAAAA,CAAG,CACVmQ,YAAAA,CAAM,KAAA,CAAMnQ,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,4BAA4B,EAC3E,CACF,CACA,eAAeyQ,EAAAA,EAAc,CAC3B,GAAI,CAACtC,CAAAA,CAAe,OACpB,IAAMuC,CAAAA,CAASvC,CAAAA,CACfC,CAAAA,CAAiB,IAAI,CAAA,CACrB,GAAI,CACF,IAAMxM,CAAAA,CAAS,MAAM8O,CAAAA,CAAO,IAAA,EAAK,CACjCrC,EAAAA,CAAS,CAAE,IAAA,CAAMzM,CAAAA,CAAO,IAAA,CAAM,UAAA,CAAYA,EAAO,UAAW,CAAC,EAC/D,CAAA,MAAS5B,CAAAA,CAAG,CACVmQ,YAAAA,CAAM,KAAA,CAAMnQ,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,0BAA0B,EACzE,CACF,CACA,SAASiQ,EAAAA,EAAe,CACtB9B,CAAAA,EAAe,MAAA,EAAO,CACtBC,CAAAA,CAAiB,IAAI,CAAA,CACrBC,EAAAA,CAAS,IAAI,EACf,CAGA,IAAMsC,EAAAA,CAAW9D,CAAAA,CAAM,IAAA,GAAS,OAAA,CAChC,eAAe+D,EAAAA,EAAS,CACtB,GAAIlE,CAAAA,GAAS,CAAA,CAAG,CAKd,GAFIyB,CAAAA,EAAe,MAAMsC,EAAAA,EAAY,CAEjC5D,CAAAA,CAAM,IAAA,GAAS,OAAA,CAAS,CAC1B,IAAMgE,CAAAA,CAAO,MAAMrC,EAAAA,CAAc,OAAA,EAAS,OAAA,EAAQ,CAClDpB,CAAAA,CAAiByD,CAAAA,EAAQhE,CAAAA,CAAM,OAAA,CAAQ,IAAI,EAC7C,CACAF,CAAAA,CAAQ,CAAC,EACX,CAAA,KAAWD,CAAAA,GAAS,CAAA,CAClBC,CAAAA,CAAQ,CAAC,CAAA,CAET,MAAMmE,EAAAA,GAEV,CACA,SAASC,EAAAA,EAAS,CACZrE,CAAAA,CAAO,CAAA,EAAGC,CAAAA,CAASvG,CAAAA,EAAOA,CAAAA,CAAI,CAAU,EAC9C,CAEA,eAAe0K,EAAAA,EAAS,CACtB,GAAIjE,CAAAA,CAAM,IAAA,GAAS,OAAA,CAAS,OAC5B,IAAMmE,CAAAA,CAAUhQ,CAAAA,CAAK,IAAA,EAAK,CACpB,CAAE,OAAA,CAASiQ,CAAc,CAAA,CAAIpE,CAAAA,CACnCG,CAAAA,CAAc,IAAI,CAAA,CAClBE,CAAAA,CAAY,CAAC,CAAA,CACb,GAAI,CAGF,IAAMgE,CAAAA,CAAiB/D,CAAAA,EAAiB8D,CAAAA,CAAc,IAAA,CAChDrP,CAAAA,CAAS,MAAM0K,CAAAA,CAAO,MAAA,CAC1B,CACE,OAAA,CAAS0E,EAAQ,MAAA,CAAS,CAAA,CAAIA,CAAAA,CAAU,KAAA,CAAA,CACxC,QAAA,CAAAtD,CAAAA,CACA,cAAA,CAAgBE,CAAAA,CAAe,IAAA,EAAK,EAAK,KAAA,CAAA,CACzC,UAAA,CAAYsD,CAAAA,CACZ,KAAA,CAAOnD,CAAAA,EAAO,IAAA,CACd,eAAA,CAAiBA,CAAAA,EAAO,UAAA,CACxB,KAAA,CAAOpL,CAAAA,EAAO,IAAA,CACd,eAAA,CAAiBA,CAAAA,EAAO,UAAA,CACxB,OAAA,CAASwO,EAAAA,CAAeF,CAAa,CACvC,CAAA,CACA,CACE,gBAAA,CAAmBG,CAAAA,EAAalE,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,GAAA,CAAMkE,CAAQ,CAAC,CACtE,CACF,CAAA,CACAlE,CAAAA,CAAY,CAAC,CAAA,CACbiD,YAAAA,CAAM,OAAA,CAAQ,iCAA4B,CAAA,CACrCvO,CAAAA,CAAO,EAAA,CACZ4K,CAAAA,GACF,CAAA,MAASxM,CAAAA,CAAG,CACVmQ,YAAAA,CAAM,KAAA,CAAMnQ,CAAAA,YAAa,KAAA,CAAQA,CAAAA,CAAE,OAAA,CAAU,2BAA2B,CAAA,CACxEgN,CAAAA,CAAc,KAAK,EACrB,CACF,CAEA,SAASqE,EAAAA,CAAoBrR,CAAAA,CAAqC,CAC5DA,CAAAA,CAAE,MAAA,GAAWA,CAAAA,CAAE,aAAA,EAAiB,CAAC+M,CAAAA,EAAYP,CAAAA,GACnD,CAEA,IAAM8E,EAAAA,CAAe,IAAA,CAAK,KAAA,CAAMrE,CAAAA,CAAW,GAAG,CAAA,CACxCsE,EAAAA,CAAgB7L,CAAAA,GAAW,OAAA,CAC3B8L,EAAAA,CACH9E,CAAAA,GAAS,CAAA,EAAK,CAACiE,EAAAA,EAAa5D,CAAAA,CACzB0E,EAAAA,CACJ/E,CAAAA,CAAO,CAAA,CACH,MAAA,CACAK,CAAAA,CACEuE,EAAAA,CAAe,EAAA,CACb,CAAA,UAAA,EAAaA,EAAY,CAAA,OAAA,CAAA,CACzB,mBAAA,CACF,eAAA,CAER,OACE1G,cAAAA,CAAC,KAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,YAAA,CAAW,MAAA,CACX,YAAA,CAAW,eAAA,CACX,SAAA,CAAU,sBAAA,CACV,2BAAA,CAA0B,MAAA,CAC1B,WAAA,CAAayG,EAAAA,CAEb,QAAA,CAAA1G,eAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK8D,EAAAA,CACL,SAAA,CAAU,aAAA,CACV,oBAAA,CAAoBH,EAAAA,CAAU,MAAA,CAAS,MAAA,CAEvC,QAAA,CAAA,CAAA1D,cAAAA,CAAC8G,EAAAA,CAAA,CAAa,SAAA,CAAWlF,CAAAA,CAAc,CAAA,CAEvC7B,eAAAA,CAAC,QAAA,CAAA,CAAO,SAAA,CAAU,oBAAA,CAChB,QAAA,CAAA,CAAAA,eAAAA,CAAC,IAAA,CAAA,CAAG,SAAA,CAAU,mBAAA,CACZ,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,uBAAA,CAAwB,aAAA,CAAY,MAAA,CAAO,CAAA,CAAE,eAAA,CAAA,CAE/D,CAAA,CACAA,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS4B,CAAAA,CACT,SAAA,CAAU,gBAAA,CACV,YAAA,CAAW,OAAA,CACZ,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CAEA5B,cAAAA,CAAC+G,EAAAA,CAAA,CAAQ,IAAA,CAAMjF,CAAAA,CAAM,CAAA,CAErB/B,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CAEZ,QAAA,CAAA,CAAA+B,CAAAA,GAAS,CAAA,CACR/B,eAAAA,CAAC,OAAI,SAAA,CAAU,YAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,cAAA,CACV,IAAA,CAAK,OAAA,CACL,YAAA,CAAW,gBAAA,CAEV,QAAA,CAAAwB,EAAAA,CAAQ,GAAA,CAAKtF,CAAAA,EACZ6D,eAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,kBAAA,CACV,cAAA,CAAcjF,CAAAA,GAAWoB,CAAAA,CAAE,KAAA,CAC3B,OAAA,CAAS,IAAMkJ,EAAAA,CAAalJ,CAAAA,CAAE,KAAK,CAAA,CACnC,QAAA,CAAU+F,CAAAA,CAAM,IAAA,GAAS,WAAA,CAEzB,QAAA,CAAA,CAAAjC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAA,CAAsB,QAAA,CAAA9D,CAAAA,CAAE,KAAA,CAAM,CAAA,CAC9C8D,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBAAA,CAAqB,QAAA,CAAA9D,CAAAA,CAAE,IAAA,CAAK,CAAA,CAAA,CAAA,CARvCA,CAAAA,CAAE,KAST,CACD,CAAA,CACH,CAAA,CAEC+F,CAAAA,CAAM,IAAA,GAAS,MAAA,CACdlC,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,iBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,GAAA,CAAA,CAAE,QAAA,CAAA,oHAAA,CAGH,CAAA,CACAA,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,OAAA,CAAS,IAAMkC,CAAAA,CAAS,CAAE,IAAA,CAAM,QAAS,CAAC,CAAA,CAC3C,QAAA,CAAA,wBAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAEHD,CAAAA,CAAM,IAAA,GAAS,WAAA,CACdlC,eAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,cAAA,CACX,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,aAAA,CAAY,MAAA,CAAO,CAAA,CAAE,iBAAA,CAAA,CAEvD,CAAA,CACE,IAAA,CAEHiC,CAAAA,CAAM,IAAA,GAAS,QAAA,CACdlC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,GAAA,CAAA,CAAE,SAAA,CAAU,cAAA,CACV,QAAA,CAAAiC,CAAAA,CAAM,KAAA,CACH,8EAAA,CACA,2CAAA,CACN,CAAA,CACAlC,eAAAA,CAAC,OAAA,CAAA,CAAM,UAAU,mBAAA,CACf,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,8BAAA,CAA4B,CAAA,CAClCA,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,MAAA,CACL,MAAA,CAAO,iCAAA,CACP,QAAA,CAAW5K,CAAAA,EAAM,CACf,IAAMwP,CAAAA,CAAOxP,CAAAA,CAAE,aAAA,CAAc,KAAA,GAAQ,CAAC,CAAA,CAClCwP,CAAAA,EAAME,EAAAA,CAAuBF,CAAI,CAAA,CACrCxP,CAAAA,CAAE,aAAA,CAAc,KAAA,CAAQ,GAC1B,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAEH6M,CAAAA,CAAM,IAAA,GAAS,OAAA,CACdlC,eAAAA,CAAAiH,mBAAAA,CAAA,CACG,QAAA,CAAA,CAACL,EAAAA,CA8EE,IAAA,CA7EF5G,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,iBAAA,CACV,IAAA,CAAK,OAAA,CACL,YAAA,CAAW,iBAAA,CAEX,QAAA,CAAA,CAAAC,cAAAA,CAACiH,EAAAA,CAAA,CACC,KAAA,CAAM,OAAA,CACN,MAAA,CAAQhK,CAAAA,GAAS,OAAA,CACjB,OAAA,CAAS,IAAMwF,CAAAA,CAAQ,OAAO,CAAA,CAChC,CAAA,CACAzC,cAAAA,CAACiH,EAAAA,CAAA,CACC,KAAA,CAAM,KAAA,CACN,MAAA,CAAQhK,CAAAA,GAAS,MAAA,CACjB,OAAA,CAAS,IAAMwF,CAAAA,CAAQ,MAAM,CAAA,CAC/B,CAAA,CACAzC,cAAAA,CAACiH,EAAAA,CAAA,CACC,KAAA,CAAM,MAAA,CACN,MAAA,CAAQhK,CAAAA,GAAS,UAAA,CACjB,OAAA,CAAS,IAAMwF,CAAAA,CAAQ,UAAU,CAAA,CACnC,CAAA,CAAA,CACF,CAAA,CACAzC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,CAAA,CACpCA,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,IAAA,CAAK,OAAA,CACL,YAAA,CAAW,OAAA,CAEV,QAAA,CAAAqB,EAAAA,CAAS,GAAA,CAAK7F,CAAAA,EACbwE,cAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,cAAA,CACV,KAAA,CAAO,CAAE,WAAYxE,CAAAA,CAAE,KAAM,CAAA,CAC7B,YAAA,CAAYA,CAAAA,CAAE,KAAA,CACd,cAAA,CAAckH,CAAAA,GAAgBlH,CAAAA,CAAE,KAAA,CAChC,OAAA,CAAS,IAAMmH,CAAAA,CAAenH,CAAAA,CAAE,KAAK,CAAA,CAAA,CANhCA,CAAAA,CAAE,KAOT,CACD,CAAA,CACH,CAAA,CACAwE,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,oBAAA,CACV,IAAA,CAAK,OAAA,CACL,YAAA,CAAW,cAAA,CAEV,QAAA,CAAAsB,EAAAA,CAAa,GAAA,CAAK9F,CAAAA,EACjBwE,cAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,mBAAA,CACV,YAAA,CAAYxE,CAAAA,CAAE,KAAA,CACd,cAAA,CAAc2B,CAAAA,GAAgB3B,CAAAA,CAAE,KAAA,CAChC,OAAA,CAAS,IAAMoH,CAAAA,CAAepH,CAAAA,CAAE,KAAK,CAAA,CAErC,QAAA,CAAAwE,cAAAA,CAAC,MAAA,CAAA,CACC,SAAA,CAAU,uBAAA,CACV,KAAA,CAAO,CAAE,KAAA,CAAOxE,CAAAA,CAAE,GAAA,CAAK,OAAQA,CAAAA,CAAE,GAAI,CAAA,CACvC,CAAA,CAAA,CAVKA,CAAAA,CAAE,KAWT,CACD,CAAA,CACH,CAAA,CACAwE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,sBAAA,CAAuB,CAAA,CACvCA,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,OAAA,CAAS,IAAM4D,EAAAA,CAAc,OAAA,EAAS,IAAA,EAAK,CAC5C,QAAA,CAAA,MAAA,CAED,CAAA,CACA5D,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,OAAA,CAAS,IAAM4D,EAAAA,CAAc,OAAA,EAAS,KAAA,EAAM,CAC7C,QAAA,CAAA,OAAA,CAED,CAAA,CAAA,CACF,CAAA,CAGF5D,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,gBAAA,CACb,QAAA,CAAAA,cAAAA,CAACjD,EAAAA,CAAA,CACC,GAAA,CAAK6G,EAAAA,CACL,UAAA,CAAY3B,CAAAA,CAAM,OAAA,CAAQ,IAAA,CAC1B,IAAA,CAAMhF,CAAAA,CACN,KAAA,CAAOyF,CAAAA,CACP,WAAA,CAAavF,EACb,eAAA,CAAiBwG,EAAAA,CACnB,CAAA,CACF,CAAA,CAEA5D,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,mBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,OAAA,CAAS,IAAMlF,CAAAA,EAAUsK,EAAAA,CAAatK,CAAM,CAAA,CAE3C,QAAA,CAAA6L,EAAAA,CAAgB,kBAAA,CAAgB,kBAAA,CACnC,CAAA,CACCA,EAAAA,CACCpD,CAAAA,CACExD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACd,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,aAAA,CAAY,MAAA,CAAO,CAAA,CACnDA,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAA,CAAA,iBAAA,CAAU,CAAA,CAC3CA,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,iBAAA,CACV,OAAA,CAAS6F,EAAAA,CACV,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE9N,CAAAA,CACFgI,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAA,CAAA,CAAA,SAAA,CAC5B,IAAA,CAAK,KAAA,CAAMhI,CAAAA,CAAM,UAAA,CAAa,GAAI,CAAA,CAAE,YAAA,CAAA,CACzC,CAAA,CACE,IAAA,CAEJgI,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAmH,EAAAA,CAAapM,CAAM,CAAA,CAAE,4CAAA,CAAA,CAExB,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAAA,CACN,CAAA,CACE,IAAA,CAGHgH,CAAAA,GAAS,CAAA,CACR/B,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,uBAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,aAAA,CACf,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,gBAAA,CAAc,CAAA,CACpBA,cAAAA,CAAC,UAAA,CAAA,CACC,KAAA,CAAO5J,CAAAA,CACP,QAAA,CAAWhB,CAAAA,EAAMyN,CAAAA,CAAQzN,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACvC,IAAA,CAAM,CAAA,CACN,WAAA,CAAY,kCAAA,CACZ,SAAA,CAAU,aAAA,CAEV,SAAA,CAAS,IAAA,CACX,CAAA,CAAA,CACF,CAAA,CAEA2K,eAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,aAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,6BAAA,CAA2B,CAAA,CACjCD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,iBAAA,CACZ,QAAA,CAAA,CAAA,CAAC5D,CAAAA,EAAY,CAACgH,CAAAA,CACbnD,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASyF,EAAAA,CACT,SAAA,CAAU,iBAAA,CACX,QAAA,CAAA,mBAAA,CAED,CAAA,CACE,IAAA,CACHtJ,CAAAA,CACC4D,eAAAA,CAAAiH,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAjH,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iBAAA,CACd,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,aAAA,CAAY,MAAA,CAAO,CAAA,CACnDA,cAAAA,CAACmH,EAAAA,CAAA,CAAS,MAAA,CAAQhL,CAAAA,CAAS,MAAA,CAAQ,CAAA,CACnC4D,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAsD,EAAAA,CAAW,MAAA,CAAKlC,EAAAA,CAAkB,GAAA,CAAA,CACrC,CAAA,CAAA,CACF,CAAA,CACAnB,cAAAA,CAAC,QAAA,CAAA,CACC,KAAK,QAAA,CACL,OAAA,CAASiF,EAAAA,CACT,SAAA,CAAU,iBAAA,CACX,QAAA,CAAA,MAAA,CAED,CAAA,CACAjF,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS2F,EAAAA,CACT,SAAA,CAAU,iBAAA,CACX,QAAA,CAAA,QAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CACHxC,CAAAA,EAAS,CAAChH,CAAAA,CACT4D,eAAAA,CAAAiH,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAhH,cAAAA,CAACoH,EAAAA,CAAA,CACC,IAAA,CAAMjE,CAAAA,CAAM,IAAA,CACZ,UAAA,CAAYA,CAAAA,CAAM,UAAA,CACpB,CAAA,CACAnD,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS,IAAMoD,CAAAA,CAAS,IAAI,CAAA,CAC5B,SAAA,CAAU,iBAAA,CACX,QAAA,CAAA,QAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAAA,CACN,CAAA,CAAA,CACF,CAAA,CAEArD,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,aAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,UAAA,CAAQ,CAAA,CACdA,eAAC,KAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,IAAA,CAAK,OAAA,CACL,YAAA,CAAW,mBAAA,CAEV,QAAA,CAAAuB,EAAAA,CAAW,GAAA,CAAKtC,CAAAA,EACfe,cAAAA,CAAC,QAAA,CAAA,CAEC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,oBAAA,CACV,cAAA,CAAc8C,CAAAA,GAAa7D,CAAAA,CAAE,KAAA,CAC7B,OAAA,CAAS,IAAM8D,CAAAA,CAAY9D,CAAAA,CAAE,KAAK,CAAA,CAEjC,QAAA,CAAAA,CAAAA,CAAE,KAAA,CAAA,CANEA,CAAAA,CAAE,KAOT,CACD,CAAA,CACH,CAAA,CAAA,CACF,CAAA,CAEAc,eAAAA,CAAC,OAAA,CAAA,CAAM,SAAA,CAAU,aAAA,CACf,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,QAAA,CAAA,uBAAA,CAAqB,CAAA,CAC3BA,cAAAA,CAAC,OAAA,CAAA,CACC,IAAA,CAAK,OAAA,CACL,KAAA,CAAOgD,CAAAA,CACP,QAAA,CAAW5N,CAAAA,EAAM6N,CAAAA,CAAkB7N,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CACjD,WAAA,CAAY,iBAAA,CACZ,SAAA,CAAU,aAAA,CACZ,GACF,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAGH0M,CAAAA,GAAS,CAAA,CACR/B,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,yBAAA,CACb,QAAA,CAAA,CAAAA,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAA,CAAA,SAAA,CAAO,CAAA,CACxCD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAAmH,EAAAA,CAAapM,CAAM,CAAA,CAClB6L,EAAAA,CAAiC,EAAA,CAAjB,iBAAA,CAClB3G,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,YAAA,CACV,OAAA,CAAS,IAAM+B,CAAAA,CAAQ,CAAC,CAAA,CACzB,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAhC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAA,CAAA,UAAA,CAAQ,CAAA,CACzCD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACd,UAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,YAAA,CACb,QAAA,CAAAuB,EAAAA,CAAW,IAAA,CAAMtC,CAAAA,EAAMA,CAAAA,CAAE,KAAA,GAAU6D,CAAQ,CAAA,EAAG,KAAA,CACjD,CAAA,CACA9C,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,YAAA,CACV,OAAA,CAAS,IAAM+B,CAAAA,CAAQ,CAAC,CAAA,CACzB,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAhC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAA,CAAA,aAAA,CAAW,CAAA,CAC5CD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CACb,QAAA,CAAA,CAAA3J,CAAAA,CAAK,IAAA,EAAK,CACTA,CAAAA,CAAK,IAAA,EAAK,CAEV4J,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBAAA,CAAoB,QAAA,CAAA,QAAA,CAAC,CAAA,CAEvCA,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,aACV,OAAA,CAAS,IAAM+B,CAAAA,CAAQ,CAAC,CAAA,CACzB,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACAhC,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,kBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,QAAA,CAAA,UAAA,CAAQ,CAAA,CACzCD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,iCAAA,CACb,QAAA,CAAA,CAAAoD,CAAAA,CACCpD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAA,CAAA,kBAAA,CACnB,IAAA,CAAK,KAAA,CAAMoD,CAAAA,CAAM,UAAA,CAAa,GAAI,CAAA,CAAE,GAAA,CAC9CnD,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,aAAA,CACV,YAAA,CAAW,mBAAA,CACX,OAAA,CAAS,IAAMoD,CAAAA,CAAS,IAAI,CAAA,CAC7B,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CACHrL,CAAAA,CACCgI,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAA,CAAA,eAAA,CACpB,IAAA,CAAK,MAAMhI,CAAAA,CAAM,UAAA,CAAa,GAAI,CAAA,CAAE,GAAA,CAC7CiI,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,aAAA,CACV,YAAA,CAAW,cAAA,CACX,OAAA,CAASqF,EAAAA,CACV,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CACHrC,CAAAA,CAAe,IAAA,EAAK,CACnBjD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CAAe,QAAA,CAAA,CAAA,SAAA,CAAGiD,CAAAA,CAAe,IAAA,EAAK,CAAA,CAAE,CAAA,CACtD,IAAA,CACH,CAACG,CAAAA,EAAS,CAAChH,CAAAA,CACV6D,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,+BAAA,CACV,OAAA,CAAS,IAAM,CACb+B,CAAAA,CAAQ,CAAC,CAAA,CACJ0D,EAAAA,GACP,CAAA,CACD,QAAA,CAAA,cAAA,CAED,CAAA,CACE,IAAA,CACHlC,CAAAA,CACCxD,eAAAA,CAAAiH,mBAAAA,CAAA,CACE,QAAA,CAAA,CAAAjH,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,cAAA,CACd,QAAA,CAAA,CAAAC,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,eAAA,CAAgB,aAAA,CAAY,MAAA,CAAO,CAAA,CAAE,iBAAA,CAAA,CAEvD,CAAA,CACAA,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,+BAAA,CACV,OAAA,CAAS6F,EAAAA,CACV,QAAA,CAAA,MAAA,CAED,CAAA,CAAA,CACF,CAAA,CACG9N,CAAAA,CAQD,IAAA,CAPFiI,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,+BAAA,CACV,OAAA,CAASsF,EAAAA,CACV,QAAA,CAAA,oBAAA,CAED,CAAA,CAAA,CAEJ,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACE,IAAA,CAAA,CACN,CAAA,CAEAvF,eAAAA,CAAC,QAAA,CAAA,CAAO,SAAA,CAAU,oBAAA,CACf,QAAA,CAAA,CAAAoC,CAAAA,CACCnC,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,gBAAA,CACV,IAAA,CAAK,aAAA,CACL,eAAA,CAAe,CAAA,CACf,eAAA,CAAe,GAAA,CACf,eAAA,CAAe0G,EAAAA,CAEf,QAAA,CAAA1G,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,qBAAA,CACV,KAAA,CAAO,CAAE,MAAO,CAAA,EAAG0G,EAAY,CAAA,CAAA,CAAI,CAAA,CACrC,CAAA,CACF,CAAA,CACE,IAAA,CACJ3G,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAAS8B,CAAAA,GAAS,CAAA,CAAIF,CAAAA,CAAeuE,EAAAA,CACrC,SAAA,CAAU,iBAAA,CACV,QAAA,CAAUhE,CAAAA,CAET,QAAA,CAAAL,CAAAA,GAAS,CAAA,CAAI,QAAA,CAAW,MAAA,CAC3B,CAAA,CACA9B,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASgG,EAAAA,CACT,SAAA,CAAU,mBAAA,CACV,QAAA,CAAUY,EAAAA,CAET,QAAA,CAAAC,EAAAA,CACH,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAAA,CACF,CAEJ,CAEA,SAASK,EAAAA,CAAapM,CAAAA,CAAsC,CAC1D,OAAIA,CAAAA,GAAW,OAAA,CAAgB,kBAAA,CAC3BA,CAAAA,GAAW,QAAA,CAAiB,gBAAA,CACzB,YACT,CAEA,SAASiM,EAAAA,CAAQ,CAAE,IAAA,CAAAjF,CAAK,CAAA,CAAmB,CACzC,IAAMuF,CAAAA,CAAQ,CACZ,CAAE,CAAA,CAAG,CAAA,CAAG,KAAA,CAAO,SAAU,CAAA,CACzB,CAAE,CAAA,CAAG,CAAA,CAAG,KAAA,CAAO,UAAW,CAAA,CAC1B,CAAE,CAAA,CAAG,CAAA,CAAG,KAAA,CAAO,QAAS,CAC1B,CAAA,CACA,OACErH,cAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,aAAA,CAAY,MAAA,CACxC,QAAA,CAAAqH,CAAAA,CAAM,GAAA,CAAI,CAAC7L,CAAAA,CAAGuF,CAAAA,GACbhB,eAAAA,CAAC,KAAA,CAAA,CAEC,SAAA,CACE,YAAA,EACC+B,CAAAA,GAAStG,CAAAA,CAAE,CAAA,CAAI,oBAAA,CAAuB,EAAA,CAAA,EACtCsG,CAAAA,CAAOtG,CAAAA,CAAE,CAAA,CAAI,kBAAA,CAAqB,EAAA,CAAA,CAGrC,QAAA,CAAA,CAAAwE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAkB,QAAA,CAAAxE,CAAAA,CAAE,EAAE,CAAA,CACtCwE,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAkB,QAAA,CAAAxE,CAAAA,CAAE,KAAA,CAAM,CAAA,CACzCuF,CAAAA,CAAIsG,CAAAA,CAAM,MAAA,CAAS,CAAA,CAAIrH,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,CAAA,CAAK,IAAA,CAAA,CAAA,CATzDxE,CAAAA,CAAE,CAUT,CACD,CAAA,CACH,CAEJ,CAEA,SAASyL,EAAAA,CAAW,CAClB,KAAA,CAAAK,CAAAA,CACA,MAAA,CAAA5C,CAAAA,CACA,OAAA,CAAA6C,CACF,CAAA,CAIG,CACD,OACEvH,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,OAAA,CAASuH,CAAAA,CACT,SAAA,CAAU,YAAA,CACV,cAAA,CAAc7C,CAAAA,CAEb,QAAA,CAAA4C,CAAAA,CACH,CAEJ,CAGA,SAASR,EAAAA,CAAa,CAAE,SAAA,CAAAU,CAAU,CAAA,CAA8B,CAC9D,IAAMC,CAAAA,CAAYlK,YAAAA,CAAsB,IAAI,EACtCmK,CAAAA,CAAenK,YAAAA,CAAe,CAAC,CAAA,CAC/BoK,CAAAA,CAAYpK,YAAAA,CAA2B,IAAI,CAAA,CAEjD,SAAS+B,CAAAA,CAAclK,CAAAA,CAAuC,CAC5DA,CAAAA,CAAE,aAAA,CAAc,iBAAA,CAAkBA,CAAAA,CAAE,SAAS,CAAA,CAC7CqS,CAAAA,CAAU,OAAA,CAAUrS,CAAAA,CAAE,OAAA,CACtBsS,CAAAA,CAAa,OAAA,CAAU,WAAA,CAAY,GAAA,EAAI,CACvCC,CAAAA,CAAU,OAAA,CAAUvS,CAAAA,CAAE,aAAA,CAAc,cACtC,CACA,SAASmK,CAAAA,CAAcnK,CAAAA,CAAuC,CAC5D,GAAIqS,CAAAA,CAAU,OAAA,EAAW,IAAA,EAAQ,CAACE,CAAAA,CAAU,OAAA,CAAS,OACrD,IAAM7H,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG1K,CAAAA,CAAE,OAAA,CAAUqS,CAAAA,CAAU,OAAO,CAAA,CACpDE,CAAAA,CAAU,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAY,CAAA,WAAA,EAAc7H,CAAE,CAAA,GAAA,EACtD,CACA,SAASF,CAAAA,CAAYxK,CAAAA,CAAuC,CAC1D,GAAIqS,CAAAA,CAAU,OAAA,EAAW,IAAA,EAAQ,CAACE,CAAAA,CAAU,OAAA,CAAS,OACrD,IAAM7H,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG1K,CAAAA,CAAE,OAAA,CAAUqS,CAAAA,CAAU,OAAO,CAAA,CAC9CG,CAAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAG,WAAA,CAAY,GAAA,EAAI,CAAIF,CAAAA,CAAa,OAAO,CAAA,CACzDG,CAAAA,CAAW/H,CAAAA,CAAK8H,CAAAA,CACtBD,CAAAA,CAAU,OAAA,CAAQ,KAAA,CAAM,SAAA,CAAY,EAAA,CACpCA,CAAAA,CAAU,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAa,EAAA,CACrCF,CAAAA,CAAU,OAAA,CAAU,IAAA,CAAA,CAChB3H,CAAAA,CAAK,EAAA,EAAM+H,CAAAA,CAAW,EAAA,GAAKL,CAAAA,GACjC,CAEA,OACExH,cAAAA,CAAC,KAAA,CAAA,CACC,SAAA,CAAU,qBAAA,CACV,aAAA,CAAY,MAAA,CACZ,cAAeV,CAAAA,CACf,aAAA,CAAeC,CAAAA,CACf,WAAA,CAAaK,CAAAA,CACb,eAAA,CAAiBA,CAAAA,CACnB,CAEJ,CAMA,SAASuH,EAAAA,CAAS,CAAE,MAAA,CAAArP,CAAO,CAAA,CAA4B,CACrD,IAAMgQ,CAAAA,CAAYvK,YAAAA,CAAiC,IAAI,CAAA,CAEvD,OAAAY,eAAAA,CAAU,IAAM,CACd,IAAMxG,CAAAA,CAASmQ,CAAAA,CAAU,OAAA,CACzB,GAAI,CAACnQ,CAAAA,CAAQ,OACb,IAAMoQ,CAAAA,CAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,gBAAA,EAAoB,CAAA,CAAG,CAAC,CAAA,CAC9CC,CAAAA,CAAWrQ,CAAAA,CAAO,WAAA,EAAe,EAAA,CACjCsQ,CAAAA,CAAYtQ,CAAAA,CAAO,YAAA,EAAgB,EAAA,CACzCA,CAAAA,CAAO,KAAA,CAAQ,IAAA,CAAK,KAAA,CAAMqQ,CAAAA,CAAWD,CAAG,CAAA,CACxCpQ,CAAAA,CAAO,MAAA,CAAS,IAAA,CAAK,KAAA,CAAMsQ,CAAAA,CAAYF,CAAG,CAAA,CAC1C,IAAM9P,CAAAA,CAAMN,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAClC,GAAI,CAACM,CAAAA,CAAK,OACVA,CAAAA,CAAI,KAAA,CAAM8P,CAAAA,CAAKA,CAAG,CAAA,CAElB,IAAMG,CAAAA,CACJ,MAAA,CAAO,YAAA,EACN,MAAA,CACE,kBAAA,CACL,GAAI,CAACA,CAAAA,CAAW,OAChB,IAAMC,CAAAA,CAAW,IAAID,CAAAA,CACfE,CAAAA,CAASD,CAAAA,CAAS,uBAAA,CAAwBrQ,CAAM,CAAA,CAChDuQ,CAAAA,CAAWF,CAAAA,CAAS,cAAA,EAAe,CACzCE,CAAAA,CAAS,OAAA,CAAU,IAAA,CACnBA,CAAAA,CAAS,qBAAA,CAAwB,EAAA,CACjCD,CAAAA,CAAO,OAAA,CAAQC,CAAQ,CAAA,CACvB,IAAMC,CAAAA,CAAO,IAAI,UAAA,CAAWD,CAAAA,CAAS,OAAO,CAAA,CAEtCE,CAAAA,CAAO,EAAA,CACPC,CAAAA,CAAM,CAAA,CACNC,CAAAA,CAAQ,CAAA,CACRC,CAAAA,CAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,CAAIV,CAAAA,CAAWQ,CAAAA,EAAOD,CAAAA,CAAO,CAAA,CAAA,EAAMA,CAAI,CAAA,CACvDI,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAID,CAAAA,CAAO,CAAA,CAAG,CAAC,CAAA,CAC7BnO,CAAAA,CAAS,IAAI,KAAA,CAAcgO,CAAI,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,CAEzCK,CAAAA,CAAM,CAAA,CACNxK,CAAAA,CAAY,KAAA,CAChB,SAASyK,CAAAA,EAAQ,CACf,GAAIzK,CAAAA,CAAW,OACfiK,CAAAA,CAAS,qBAAA,CAAsBC,CAAI,CAAA,CACnC,IAAMQ,CAAAA,CAAa,IAAA,CAAK,KAAA,CAAMR,CAAAA,CAAK,MAAA,CAASC,CAAI,CAAA,CAChDtQ,CAAAA,CAAK,SAAA,CAAU,CAAA,CAAG,CAAA,CAAG+P,CAAAA,CAAUC,CAAS,CAAA,CACxChQ,CAAAA,CAAK,SAAA,CAAY8Q,EAAAA,CAAU,gBAAgB,CAAA,EAAK,gBAAA,CAChD,IAAA,IAAShI,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIwH,EAAMxH,CAAAA,EAAAA,CAAK,CAC7B,IAAIiI,CAAAA,CAAO,CAAA,CACX,IAAA,IAASxD,CAAAA,CAAI,CAAA,CAAGA,CAAAA,CAAIsD,CAAAA,CAAYtD,CAAAA,EAAAA,CAAK,CACnC,IAAMyD,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAA,CAAKX,CAAAA,CAAKvH,CAAAA,CAAI+H,CAAAA,CAAatD,CAAC,CAAA,EAAK,GAAA,EAAO,GAAG,CAAA,CACtDyD,CAAAA,CAAID,CAAAA,GAAMA,CAAAA,CAAOC,CAAAA,EACvB,CACA,IAAMzR,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAIwR,CAAAA,CAAO,GAAA,CAAO,GAAG,CAAA,CACvCrK,CAAAA,CAAMpE,CAAAA,CAAOwG,CAAC,CAAA,EAAK,CAAA,CACzBxG,CAAAA,CAAOwG,CAAC,CAAA,CAAIvJ,CAAAA,CAASmH,CAAAA,CAAMnH,CAAAA,CAASmH,CAAAA,CAAAA,CAAOnH,CAAAA,CAASmH,CAAAA,EAAO,GAAA,CAC3D,IAAM0B,CAAAA,CAAI,IAAA,CAAK,GAAA,CAAIoI,CAAAA,CAAOlO,CAAAA,CAAOwG,CAAC,CAAA,CAAKkH,CAAS,EAC1C/H,CAAAA,CAAIa,CAAAA,EAAK2H,CAAAA,CAAOF,CAAAA,CAAAA,CAChBrI,CAAAA,CAAAA,CAAK8H,CAAAA,CAAY5H,CAAAA,EAAK,CAAA,CAC5B6I,EAAAA,CAAcjR,CAAAA,CAAMiI,CAAAA,CAAGC,CAAAA,CAAGuI,CAAAA,CAAMrI,CAAAA,CAAGsI,CAAM,CAAA,CACzC1Q,CAAAA,CAAK,IAAA,GACP,CACA2Q,CAAAA,CAAM,qBAAA,CAAsBC,CAAK,EACnC,CACA,OAAAD,CAAAA,CAAM,qBAAA,CAAsBC,CAAK,CAAA,CAE1B,IAAM,CACXzK,CAAAA,CAAY,IAAA,CACZ,oBAAA,CAAqBwK,CAAG,CAAA,CACxB,GAAI,CACFR,CAAAA,CAAO,UAAA,GACT,CAAA,KAAQ,CAER,CACKD,CAAAA,CAAS,KAAA,GAChB,CACF,CAAA,CAAG,CAACrQ,CAAM,CAAC,CAAA,CAEJkI,cAAAA,CAAC,QAAA,CAAA,CAAO,GAAA,CAAK8H,CAAAA,CAAW,SAAA,CAAU,gBAAA,CAAiB,aAAA,CAAY,MAAA,CAAO,CAC/E,CAIA,SAASoB,EAAAA,CACPjR,CAAAA,CACAiI,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAlK,CAAAA,CACM,CACN,IAAMwS,CAAAA,CAAS,IAAA,CAAK,GAAA,CAAIxS,CAAAA,CAAGiK,CAAAA,CAAI,CAAA,CAAGC,CAAAA,CAAI,CAAC,CAAA,CACvCpI,CAAAA,CAAI,SAAA,EAAU,CACd,IAAMkR,CAAAA,CAASlR,CAAAA,CAGf,GAAI,OAAOkR,CAAAA,CAAO,SAAA,EAAc,UAAA,CAAY,CAC1CA,CAAAA,CAAO,SAAA,CAAUjJ,CAAAA,CAAGC,CAAAA,CAAGC,CAAAA,CAAGC,CAAAA,CAAGsI,CAAM,CAAA,CACnC,MACF,CACA1Q,CAAAA,CAAI,MAAA,CAAOiI,CAAAA,CAAIyI,CAAAA,CAAQxI,CAAC,CAAA,CACxBlI,CAAAA,CAAI,KAAA,CAAMiI,CAAAA,CAAIE,CAAAA,CAAGD,CAAAA,CAAGD,CAAAA,CAAIE,CAAAA,CAAGD,CAAAA,CAAIE,CAAAA,CAAGsI,CAAM,CAAA,CACxC1Q,CAAAA,CAAI,KAAA,CAAMiI,CAAAA,CAAIE,EAAGD,CAAAA,CAAIE,CAAAA,CAAGH,CAAAA,CAAGC,CAAAA,CAAIE,CAAAA,CAAGsI,CAAM,CAAA,CACxC1Q,CAAAA,CAAI,KAAA,CAAMiI,CAAAA,CAAGC,CAAAA,CAAIE,CAAAA,CAAGH,CAAAA,CAAGC,CAAAA,CAAGwI,CAAM,CAAA,CAChC1Q,CAAAA,CAAI,KAAA,CAAMiI,CAAAA,CAAGC,CAAAA,CAAGD,CAAAA,CAAIE,CAAAA,CAAGD,CAAAA,CAAGwI,CAAM,CAAA,CAChC1Q,CAAAA,CAAI,SAAA,GACN,CAIA,SAASmP,EAAAA,CAAa,CAAE,IAAA,CAAAnR,CAAAA,CAAM,UAAA,CAAAsG,CAAW,CAAA,CAAuC,CAC9E,GAAM,CAAC1H,CAAAA,CAAKuU,CAAM,CAAA,CAAIxL,cAAAA,CAAiB,EAAE,CAAA,CACzC,OAAAO,eAAAA,CAAU,IAAM,CACd,IAAMkL,CAAAA,CAAI,GAAA,CAAI,eAAA,CAAgBpT,CAAI,CAAA,CAClC,OAAAmT,CAAAA,CAAOC,CAAC,CAAA,CACD,IAAM,CACX,IAAI,eAAA,CAAgBA,CAAC,EACvB,CACF,CAAA,CAAG,CAACpT,CAAI,CAAC,CAAA,CAEP8J,eAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,qBAAA,CACb,QAAA,CAAA,CAAAC,cAAAA,CAAC,OAAA,CAAA,CAAM,QAAA,CAAQ,IAAA,CAAC,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAKnL,CAAAA,CAAK,SAAA,CAAU,gBAAA,CAAiB,CAAA,CACxEkL,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,kBAAA,CAAoB,QAAA,CAAA,CAAA,IAAA,CAAK,KAAA,CAAMxD,CAAAA,CAAa,GAAI,CAAA,CAAE,GAAA,CAAA,CAAC,CAAA,CAAA,CACrE,CAEJ,CAEA,SAASwM,EAAAA,CAAUO,CAAAA,CAAsB,CACvC,OAAI,OAAO,MAAA,CAAW,GAAA,CAAoB,EAAA,CACnC,gBAAA,CAAiB,QAAA,CAAS,eAAe,CAAA,CAC7C,gBAAA,CAAiBA,CAAI,CAAA,CACrB,IAAA,EACL,CAEA,IAAMC,EAAAA,CACJ,2IAAA,CAEF,SAAS9E,EAAAA,CAAaF,EAAkC,CACtD,OAAO,KAAA,CAAM,IAAA,CACXA,CAAAA,CAAK,gBAAA,CAA8BgF,EAAkB,CACvD,CAAA,CAAE,MAAA,CAAQ3R,CAAAA,EAAO,CAACA,CAAAA,CAAG,YAAA,CAAa,UAAU,CAAA,EAAKA,CAAAA,CAAG,YAAA,GAAiB,IAAI,CAC3E,CCjnCO,SAAS4R,EAAAA,EAA4B,CAC1C,GAAI,OAAO,QAAA,CAAa,GAAA,EAAe,OAAO,MAAA,CAAW,GAAA,CACvD,OAAO,CAAA,CAET,IAAMpJ,CAAAA,CAAI,MAAA,CAAO,UAAA,CACXC,CAAAA,CAAI,MAAA,CAAO,WAAA,CACjB,GAAID,CAAAA,GAAM,GAAKC,CAAAA,GAAM,CAAA,CAAG,OAAO,CAAA,CAE/B,IAAMoJ,CAAAA,CAASpJ,CAAAA,CAAI,CAAA,CACbqJ,CAAAA,CAAU,CAAC,IAAA,CAAK,KAAA,CAAMtJ,CAAAA,CAAI,EAAG,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAI,EAAG,CAAA,CAAG,IAAA,CAAK,KAAA,CAAMA,CAAAA,CAAI,EAAG,CAAC,CAAA,CACxEuJ,CAAAA,CAAO,IAAI,GAAA,CACbC,CAAAA,CAAU,CAAA,CAEd,IAAA,IAAW1J,CAAAA,IAAKwJ,CAAAA,CAAS,CACvB,IAAMG,CAAAA,CAAQ,QAAA,CAAS,iBAAA,CAAkB3J,CAAAA,CAAGuJ,CAAM,CAAA,CAClD,IAAA,IAAW7R,CAAAA,IAAMiS,CAAAA,CAAO,CACtB,GAAIF,CAAAA,CAAK,GAAA,CAAI/R,CAAE,CAAA,CAAG,SAClB+R,CAAAA,CAAK,GAAA,CAAI/R,CAAE,CAAA,CACX,IAAMkS,CAAAA,CAAK,MAAA,CAAO,gBAAA,CAAiBlS,CAAE,CAAA,CACrC,GAAIkS,CAAAA,CAAG,QAAA,GAAa,OAAA,EAAWA,CAAAA,CAAG,QAAA,GAAa,QAAA,CAAU,SACzD,IAAM5K,CAAAA,CAAOtH,CAAAA,CAAG,qBAAA,EAAsB,CAElCsH,CAAAA,CAAK,MAAA,CAASmB,CAAAA,CAAI,CAAA,EAClBnB,CAAAA,CAAK,MAAA,CAASmB,CAAAA,CAAI,CAAA,EAElBnB,CAAAA,CAAK,KAAA,CAAQkB,CAAAA,CAAI,EAAA,EACjBlB,CAAAA,CAAK,MAAA,CAAS0K,CAAAA,GAASA,CAAAA,CAAU1K,CAAAA,CAAK,MAAA,EAC5C,CACF,CACA,OAAO0K,CACT,CAoCO,SAASG,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACQ,CACR,GAAI,OAAO,QAAA,CAAa,GAAA,EAAe,OAAO,MAAA,CAAW,GAAA,CACvD,OAAO,CAAA,CAET,IAAM7J,CAAAA,CAAI,MAAA,CAAO,UAAA,CACXC,CAAAA,CAAI,MAAA,CAAO,WAAA,CACbuJ,CAAAA,CAAU,CAAA,CACd,IAAA,IAAWM,CAAAA,IAAYF,CAAAA,CAAW,CAChC,IAAIG,EACJ,GAAI,CACFA,CAAAA,CAAQ,QAAA,CAAS,gBAAA,CAAiBD,CAAQ,EAC5C,CAAA,KAAQ,CACN,QACF,CACA,IAAA,IAAWE,CAAAA,IAAQ,KAAA,CAAM,IAAA,CAAKD,CAAK,CAAA,CAAG,CACpC,IAAMjL,CAAAA,CAAOkL,CAAAA,CAAK,qBAAA,EAAsB,CACxC,GAAIlL,CAAAA,CAAK,MAAA,GAAW,CAAA,EAAKA,CAAAA,CAAK,KAAA,GAAU,CAAA,CAAG,SAC3C,IAAImL,CAAAA,CAAU,CAAA,CACd,OAAQJ,CAAAA,EACN,KAAK,QAAA,CACH,GAAI/K,CAAAA,CAAK,MAAA,CAASmB,CAAAA,CAAI,CAAA,CAAG,MACzBgK,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGhK,CAAAA,CAAInB,CAAAA,CAAK,GAAG,CAAA,CAClC,MACF,KAAK,KAAA,CACH,GAAIA,CAAAA,CAAK,GAAA,CAAM,CAAA,CAAG,MAClBmL,CAAAA,CAAU,KAAK,GAAA,CAAI,CAAA,CAAGnL,CAAAA,CAAK,MAAM,CAAA,CACjC,MACF,KAAK,MAAA,CACH,GAAIA,CAAAA,CAAK,IAAA,CAAO,CAAA,CAAG,MACnBmL,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGnL,CAAAA,CAAK,KAAK,CAAA,CAChC,MACF,KAAK,OAAA,CACH,GAAIA,CAAAA,CAAK,KAAA,CAAQkB,CAAAA,CAAI,CAAA,CAAG,MACxBiK,CAAAA,CAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAGjK,CAAAA,CAAIlB,CAAAA,CAAK,IAAI,CAAA,CACnC,KACJ,CACImL,CAAAA,CAAUT,CAAAA,GAASA,CAAAA,CAAUS,CAAAA,EACnC,CACF,CACA,OAAOT,CACT,CC3FO,SAASU,EAAAA,CACd5V,CAAAA,CACiB,CACjB,GAAM,CAAC6V,CAAAA,CAAQC,CAAS,CAAA,CAAI5M,cAAAA,CAA0B,KAAO,CAC3D,MAAA,CAAQlJ,CAAAA,CAAO,OAAO,CAAA,CACtB,KAAA,CAAOA,CAAAA,CAAO,MAAA,CAAO,CAAA,CACrB,IAAA,CAAMA,CAAAA,CAAO,MAAA,CAAO,CAAA,CACpB,GAAA,CAAKA,CAAAA,CAAO,MAAA,CAAO,CACrB,CAAA,CAAE,CAAA,CAII+V,CAAAA,CAAUlN,YAAAA,CAAOgN,CAAM,CAAA,CAIvBG,CAAAA,CAAWC,EAAAA,CAAWjW,CAAAA,CAAO,KAAK,CAAA,CAClCkW,CAAAA,CAAYlW,CAAAA,CAAO,SAAA,CACnBmW,CAAAA,CAAUnW,CAAAA,CAAO,MAAA,CAAO,CAAA,CACxBoW,CAAAA,CAAUpW,CAAAA,CAAO,MAAA,CAAO,CAAA,CAE9B,OAAAyJ,eAAAA,CAAU,IAAM,CACd,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OAEnC,IAAIyK,CAAAA,CAAM,CAAA,CACNxK,CAAAA,CAAY,KAAA,CAEV2M,CAAAA,CAAU,IAAM,CAEpB,GADAnC,CAAAA,CAAM,CAAA,CACFxK,CAAAA,CAAW,OAEf,IAAM6L,CAAAA,CAAOW,CAAAA,CAAU,CAAC,CAAA,GAAM,GAAA,CAAM,QAAA,CAAW,KAAA,CACzCI,CAAAA,CAAQJ,CAAAA,CAAU,CAAC,CAAA,GAAM,GAAA,CAAM,OAAA,CAAU,MAAA,CAE3CK,CAAAA,CAAS,CAAA,CACTC,CAAAA,CAAS,CAAA,CACTxW,CAAAA,CAAO,KAAA,GAAU,MAAA,EAAUuV,CAAAA,GAAS,QAAA,CACtCgB,CAAAA,CAASzB,EAAAA,EAAkB,CAClB,KAAA,CAAM,OAAA,CAAQ9U,CAAAA,CAAO,KAAK,CAAA,GACnCuW,CAAAA,CAASlB,EAAAA,CAA4BrV,CAAAA,CAAO,KAAA,CAAOuV,CAAI,CAAA,CACvDiB,CAAAA,CAASnB,EAAAA,CAA4BrV,CAAAA,CAAO,KAAA,CAAOsW,CAAK,CAAA,CAAA,CAG1D,IAAMtS,CAAAA,CAAwB,CAC5B,MAAA,CAAQuR,CAAAA,GAAS,QAAA,CAAWa,CAAAA,CAAUG,CAAAA,CAAS,CAAA,CAC/C,GAAA,CAAKhB,CAAAA,GAAS,KAAA,CAAQa,CAAAA,CAAUG,CAAAA,CAAS,CAAA,CACzC,KAAA,CAAOD,CAAAA,GAAU,OAAA,CAAUH,CAAAA,CAAUK,CAAAA,CAAS,CAAA,CAC9C,IAAA,CAAMF,CAAAA,GAAU,MAAA,CAASH,CAAAA,CAAUK,EAAS,CAC9C,CAAA,CACMC,CAAAA,CAAOV,CAAAA,CAAQ,OAAA,CAAA,CAEnB/R,CAAAA,CAAK,MAAA,GAAWyS,CAAAA,CAAK,MAAA,EACrBzS,CAAAA,CAAK,GAAA,GAAQyS,CAAAA,CAAK,GAAA,EAClBzS,CAAAA,CAAK,KAAA,GAAUyS,CAAAA,CAAK,KAAA,EACpBzS,CAAAA,CAAK,IAAA,GAASyS,CAAAA,CAAK,IAAA,IAEnBV,CAAAA,CAAQ,OAAA,CAAU/R,CAAAA,CAClB8R,CAAAA,CAAU9R,CAAI,CAAA,EAElB,CAAA,CAEM0S,CAAAA,CAAW,IAAM,CACjBxC,CAAAA,GACJA,CAAAA,CAAM,MAAA,CAAO,qBAAA,CAAsBmC,CAAO,CAAA,EAC5C,CAAA,CAEAK,CAAAA,EAAS,CAET,IAAMC,CAAAA,CACJ,OAAO,cAAA,CAAmB,GAAA,CACtB,IAAI,cAAA,CAAeD,CAAQ,CAAA,CAC3B,IAAA,CACNC,CAAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAA,CAEpC,IAAMC,CAAAA,CACJ,OAAO,gBAAA,CAAqB,GAAA,CACxB,IAAI,gBAAA,CAAiBF,CAAQ,CAAA,CAC7B,IAAA,CACNE,CAAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAM,CACzB,SAAA,CAAW,IAAA,CACX,OAAA,CAAS,IAAA,CACT,UAAA,CAAY,IAAA,CACZ,eAAA,CAAiB,CAAC,OAAA,CAAS,OAAA,CAAS,QAAQ,CAC9C,CAAC,CAAA,CAED,MAAA,CAAO,gBAAA,CAAiB,QAAA,CAAUF,CAAQ,CAAA,CAC1C,IAAMG,CAAAA,CAAK,MAAA,CAAO,cAAA,CAClB,OAAAA,CAAAA,EAAI,gBAAA,CAAiB,QAAA,CAAUH,CAAQ,CAAA,CACvCG,CAAAA,EAAI,gBAAA,CAAiB,QAAA,CAAUH,CAAQ,CAAA,CAEhC,IAAM,CACXhN,CAAAA,CAAY,IAAA,CACRwK,CAAAA,EAAK,MAAA,CAAO,oBAAA,CAAqBA,CAAG,CAAA,CACxCyC,CAAAA,EAAI,UAAA,EAAW,CACfC,CAAAA,EAAI,UAAA,EAAW,CACf,MAAA,CAAO,mBAAA,CAAoB,QAAA,CAAUF,CAAQ,CAAA,CAC7CG,CAAAA,EAAI,oBAAoB,QAAA,CAAUH,CAAQ,CAAA,CAC1CG,CAAAA,EAAI,mBAAA,CAAoB,QAAA,CAAUH,CAAQ,EAC5C,CAGF,CAAA,CAAG,CAACR,CAAAA,CAAWC,CAAAA,CAASC,CAAAA,CAASJ,CAAQ,CAAC,CAAA,CAEnCH,CACT,CAEA,SAASI,EAAAA,CAAWa,CAAAA,CAA0C,CAC5D,OAAIA,CAAAA,GAAU,KAAA,CAAc,OAAA,CACxBA,CAAAA,GAAU,MAAA,CAAe,MAAA,CACtBA,CAAAA,CAAM,IAAA,CAAK,GAAG,CACvB,CCjIO,SAASC,EAAAA,CAAoBC,CAAAA,CAA2B,CAC7D,GAAM,CAACC,CAAAA,CAAMC,CAAO,CAAA,CAAIhO,cAAAA,CAAS,KAAK,CAAA,CAEtC,OAAAO,eAAAA,CAAU,IAAM,CACd,GAAI,CAACuN,CAAAA,CAAS,CACZE,CAAAA,CAAQ,KAAK,CAAA,CACb,MACF,CACA,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OACnC,IAAML,CAAAA,CAAK,MAAA,CAAO,cAAA,CAElB,GADI,CAACA,CAAAA,EAEH,OAAO,MAAA,CAAO,UAAA,EAAe,UAAA,EAC7B,CAAC,MAAA,CAAO,UAAA,CAAW,mBAAmB,CAAA,CAAE,OAAA,CAExC,OAGF,IAAMM,CAAAA,CAAqB,GAAA,CACvBjD,CAAAA,CAAM,CAAA,CACJkD,CAAAA,CAAQ,IAAM,CAClBlD,CAAAA,CAAM,CAAA,CACN,IAAMmD,CAAAA,CAAS,MAAA,CAAO,WAAA,CAAcR,CAAAA,CAAG,MAAA,CACvCK,CAAAA,CAAQG,CAAAA,CAASF,CAAkB,EACrC,CAAA,CACMT,CAAAA,CAAW,IAAM,CACjBxC,CAAAA,GACJA,CAAAA,CAAM,MAAA,CAAO,qBAAA,CAAsBkD,CAAK,CAAA,EAC1C,CAAA,CAEA,OAAAV,CAAAA,EAAS,CACTG,CAAAA,CAAG,gBAAA,CAAiB,QAAA,CAAUH,CAAQ,CAAA,CACtCG,CAAAA,CAAG,gBAAA,CAAiB,QAAA,CAAUH,CAAQ,CAAA,CAC/B,IAAM,CACPxC,CAAAA,EAAK,MAAA,CAAO,oBAAA,CAAqBA,CAAG,CAAA,CACxC2C,CAAAA,CAAG,mBAAA,CAAoB,QAAA,CAAUH,CAAQ,CAAA,CACzCG,CAAAA,CAAG,mBAAA,CAAoB,QAAA,CAAUH,CAAQ,EAC3C,CACF,CAAA,CAAG,CAACM,CAAO,CAAC,CAAA,CAELC,CACT,CChCO,SAASK,EAAAA,CAAgB,CAC9B,MAAA,CAAAtX,CAAAA,CACA,YAAA,CAAAuX,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAA3E,CACF,CAAA,CAAyB,CACvB,GAAM,CAAC/P,CAAAA,CAAQ2U,CAAS,CAAA,CAAIvO,cAAAA,CAA6B,IAAI,CAAA,CACvDwO,CAAAA,CAAY7O,YAAAA,CAA0B,IAAI,CAAA,CAC1CgN,EAASD,EAAAA,CAAmB5V,CAAM,CAAA,CAClC2X,CAAAA,CAAeZ,EAAAA,CAAoB/W,CAAAA,CAAO,cAAc,CAAA,CAS9D,GAPAyJ,eAAAA,CAAU,IAAM,CACV,OAAO,QAAA,CAAa,GAAA,EACxBgO,CAAAA,CAAUF,CAAAA,EAAgB,QAAA,CAAS,IAAI,EACzC,CAAA,CAAG,CAACA,CAAY,CAAC,CAAA,CAEjBK,EAAAA,CAAoBF,CAAAA,CAAW,CAACF,CAAAA,EAAU,CAACG,CAAY,CAAA,CAEnD,CAAC7U,CAAAA,CAAQ,OAAO,IAAA,CAEpB,IAAMoT,CAAAA,CAAYlW,CAAAA,CAAO,SAAA,CACnB6X,CAAAA,CAAQ3B,CAAAA,CAAU,CAAC,CAAA,GAAM,GAAA,CAAM,QAAA,CAAW,KAAA,CAC1C4B,CAAAA,CAAQ5B,CAAAA,CAAU,CAAC,CAAA,GAAM,GAAA,CAAM,OAAA,CAAU,MAAA,CAEzC6B,CAAAA,CAAMF,CAAAA,GAAU,QAAA,CAAWhC,CAAAA,CAAO,MAAA,CAASA,CAAAA,CAAO,GAAA,CAClDmC,CAAAA,CAAMF,IAAU,OAAA,CAAUjC,CAAAA,CAAO,KAAA,CAAQA,CAAAA,CAAO,IAAA,CAEhDoC,CAAAA,CAA6B,CACjC,QAAA,CAAU,OAAA,CACV,CAACJ,CAAK,EAAG7X,CAAAA,CAAO,QAAA,CACZ,CAAA,KAAA,EAAQ+X,CAAG,CAAA,yBAAA,EAA4BF,CAAK,CAAA,OAAA,CAAA,CAC5C,CAAA,EAAGE,CAAG,CAAA,EAAA,CAAA,CACV,CAACD,CAAK,EAAG9X,CAAAA,CAAO,QAAA,CACZ,CAAA,KAAA,EAAQgY,CAAG,CAAA,yBAAA,EAA4BF,CAAK,CAAA,OAAA,CAAA,CAC5C,CAAA,EAAGE,CAAG,CAAA,EAAA,CAAA,CACV,MAAA,CAAQhY,CAAAA,CAAO,MAAA,CACf,OAAA,CAASwX,CAAAA,EAAUG,CAAAA,CAAe,CAAA,CAAI,CAAA,CACtC,aAAA,CAAeH,CAAAA,EAAUG,CAAAA,CAAe,MAAA,CAAS,MAAA,CACjD,UAAA,CAAY,oBACd,CAAA,CAEA,OAAOO,qBAAAA,CACL7M,eAAAA,CAAC,QAAA,CAAA,CACC,GAAA,CAAKqM,CAAAA,CACL,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,gDAAA,CACV,KAAA,CAAOO,EACP,YAAA,CAAYjY,CAAAA,CAAO,KAAA,CACnB,aAAA,CAAawX,CAAAA,EAAUG,CAAAA,CAAe,IAAA,CAAO,MAAA,CAC7C,QAAA,CAAUH,CAAAA,EAAUG,CAAAA,CAAe,EAAA,CAAK,CAAA,CACxC,OAAA,CAAS9E,CAAAA,CACT,oBAAA,CAAmB,EAAA,CACnB,2BAAA,CAA0B,MAAA,CAEzB,QAAA,CAAA,CAAA7S,CAAAA,CAAO,IAAA,CACRsL,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAtL,CAAAA,CAAO,KAAA,CAAM,CAAA,CAAA,CACtB,CAAA,CACA8C,CACF,CACF,CAMA,SAAS8U,EAAAA,CACPjP,CAAAA,CACAqH,CAAAA,CACA,CACA,IAAMmI,CAAAA,CAAYtP,YAAAA,CAAO,KAAK,CAAA,CAE9BY,eAAAA,CAAU,IAAM,CAId,GAHI,OAAA,CAAQ,GAAA,CAAI,QAAA,GAAa,YAAA,EACzB,CAACuG,CAAAA,EACDmI,CAAAA,CAAU,OAAA,EACV,OAAO,MAAA,CAAW,GAAA,CAAa,OAEnC,IAAMC,CAAAA,CAAI,MAAA,CAAO,UAAA,CAAW,IAAM,CAChC,IAAMlV,CAAAA,CAAKyF,CAAAA,CAAI,OAAA,CACf,GAAI,CAACzF,CAAAA,CAAI,OACT,IAAMsH,CAAAA,CAAOtH,CAAAA,CAAG,qBAAA,EAAsB,CACtC,GAAIsH,CAAAA,CAAK,KAAA,GAAU,CAAA,EAAKA,CAAAA,CAAK,MAAA,GAAW,CAAA,CAAG,OAC3C,IAAM6N,CAAAA,CAAK7N,CAAAA,CAAK,IAAA,CAAOA,CAAAA,CAAK,KAAA,CAAQ,CAAA,CAC9B8N,CAAAA,CAAK9N,CAAAA,CAAK,GAAA,CAAMA,CAAAA,CAAK,MAAA,CAAS,CAAA,CAC9B2K,CAAAA,CAAQ,QAAA,CAAS,iBAAA,CAAkBkD,CAAAA,CAAIC,CAAE,CAAA,CACzCC,CAAAA,CAAOC,EAAAA,CAAO,MAAA,CAAO,gBAAA,CAAiBtV,CAAE,CAAA,CAAE,MAAM,CAAA,CACtD,IAAA,IAAWuV,CAAAA,IAAatD,CAAAA,CAAO,CAC7B,GAAIsD,CAAAA,GAAcvV,CAAAA,EAAMA,CAAAA,CAAG,QAAA,CAASuV,CAAS,CAAA,CAAG,SAEhD,GADWD,GAAO,MAAA,CAAO,gBAAA,CAAiBC,CAAS,CAAA,CAAE,MAAM,CAAA,CAClDF,CAAAA,CAAM,CACbJ,CAAAA,CAAU,OAAA,CAAU,IAAA,CAEpB,OAAA,CAAQ,IAAA,CAAK,gCAAA,CAAkCM,CAAS,CAAA,CACxD,KACF,CACF,CACF,CAAA,CAAG,GAAG,CAAA,CACN,OAAO,IAAM,MAAA,CAAO,YAAA,CAAaL,CAAC,CACpC,CAAA,CAAG,CAACpI,CAAAA,CAAQrH,CAAG,CAAC,EAClB,CAEA,SAAS6P,EAAAA,CAAOE,CAAAA,CAAmB,CACjC,IAAMC,CAAAA,CAAI,QAAA,CAASD,CAAAA,CAAG,EAAE,CAAA,CACxB,OAAO,MAAA,CAAO,KAAA,CAAMC,CAAC,CAAA,CAAI,CAAA,CAAIA,CAC/B,CC5GO,SAASC,EAAAA,CAAc,CAC5B,KAAA,CAAAC,CAAAA,CACA,KAAA,CAAAjG,CAAAA,CACA,IAAA,CAAAkG,CAAAA,CACA,OAAA,CAAAjG,CACF,CAAA,CAAuB,CACrB,GAAM,CAAC/P,CAAAA,CAAQ2U,CAAS,CAAA,CAAIvO,cAAAA,CAA6B,IAAI,CAAA,CAS7D,OAPAO,eAAAA,CAAU,IAAM,CACd,GAAI,OAAO,QAAA,CAAa,GAAA,CAAa,OACrC,IAAMvG,CAAAA,CACJ2V,CAAAA,YAAiB,WAAA,CAAcA,CAAAA,CAASA,CAAAA,CAAM,OAAA,EAAW,IAAA,CAC3DpB,CAAAA,CAAUvU,CAAE,EACd,CAAA,CAAG,CAAC2V,CAAK,CAAC,CAAA,CAEL/V,CAAAA,CAEEoV,qBAAAA,CACL7M,eAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAU,6BAAA,CACV,OAAA,CAASwH,CAAAA,CACT,YAAA,CAAYD,CAAAA,CACZ,oBAAA,CAAmB,EAAA,CACnB,2BAAA,CAA0B,MAAA,CAEzB,QAAA,CAAA,CAAAkG,CAAAA,CACDxN,cAAAA,CAAC,MAAA,CAAA,CAAM,QAAA,CAAAsH,CAAAA,CAAM,CAAA,CAAA,CACf,CAAA,CACA9P,CACF,CAAA,CAfoB,IAgBtB,CCtBO,SAASiW,EAAAA,CAAa,CAC3B,MAAA,CAAA/Y,CAAAA,CACA,YAAA,CAAAuX,CAAAA,CACA,MAAA,CAAAC,CAAAA,CACA,OAAA,CAAA3E,CACF,CAAA,CAAsB,CACpB,GAAM,CAAC/P,CAAAA,CAAQ2U,CAAS,CAAA,CAAIvO,cAAAA,CAA6B,IAAI,CAAA,CACvD,CAAC8P,CAAAA,CAAUC,CAAW,CAAA,CAAI/P,cAAAA,CAAS,KAAK,CAAA,CACxCgQ,CAAAA,CAAerQ,aAAwC,IAAI,CAAA,CAOjE,GALAY,eAAAA,CAAU,IAAM,CACV,OAAO,QAAA,CAAa,GAAA,EACxBgO,CAAAA,CAAUF,CAAAA,EAAgB,QAAA,CAAS,IAAI,EACzC,CAAA,CAAG,CAACA,CAAY,CAAC,CAAA,CAEb,CAACzU,CAAAA,CAAQ,OAAO,IAAA,CAEpB,IAAMqW,CAAAA,CAAY,CAAA,wBAAA,EAA2BnZ,CAAAA,CAAO,IAAI,CAAA,EACtDgZ,CAAAA,CAAW,uBAAA,CAA0B,EACvC,CAAA,CAAA,CAEA,SAASpO,CAAAA,CAAclK,CAAAA,CAA0C,CAC/DwY,CAAAA,CAAa,OAAA,CAAU,CAAE,CAAA,CAAGxY,CAAAA,CAAE,OAAA,CAAS,CAAA,CAAGA,CAAAA,CAAE,OAAQ,CAAA,CACpDuY,CAAAA,CAAY,IAAI,CAAA,CAChBvY,CAAAA,CAAE,aAAA,CAAc,iBAAA,CAAkBA,CAAAA,CAAE,SAAS,EAC/C,CACA,SAASmK,CAAAA,CAAcnK,CAAAA,CAA0C,CAC/D,IAAM4D,EAAQ4U,CAAAA,CAAa,OAAA,CAC3B,GAAI,CAAC5U,CAAAA,CAAO,OACZ,IAAM6G,CAAAA,CAAKzK,CAAAA,CAAE,OAAA,CAAU4D,CAAAA,CAAM,CAAA,CACvB8G,CAAAA,CAAK1K,CAAAA,CAAE,OAAA,CAAU4D,CAAAA,CAAM,CAAA,CAAA,CAE1BtE,CAAAA,CAAO,IAAA,GAAS,KAAA,EAASoL,CAAAA,CAAK,EAAA,EAC9BpL,CAAAA,CAAO,IAAA,GAAS,QAAA,EAAYoL,CAAAA,CAAK,GAAA,EACjCpL,CAAAA,CAAO,IAAA,GAAS,OAAA,EAAWmL,CAAAA,CAAK,GAAA,EAChCnL,CAAAA,CAAO,IAAA,GAAS,MAAA,EAAUmL,CAAAA,CAAK,EAAA,IAEhC+N,CAAAA,CAAa,OAAA,CAAU,IAAA,CACvBrG,CAAAA,EAAQ,EAEZ,CACA,SAAS3H,CAAAA,EAAc,CACrBgO,CAAAA,CAAa,OAAA,CAAU,IAAA,CACvBD,CAAAA,CAAY,KAAK,EACnB,CACA,SAASG,CAAAA,EAAkB,CACzBF,CAAAA,CAAa,OAAA,CAAU,IAAA,CACvBD,CAAAA,CAAY,KAAK,EACnB,CAEA,OAAOf,qBAAAA,CACL7M,eAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAW8N,CAAAA,CACX,KAAA,CAAO,CACL,MAAA,CAAQnZ,CAAAA,CAAO,MAAA,CACf,OAAA,CAASwX,CAAAA,CAAS,CAAA,CAAI,CAAA,CACtB,aAAA,CAAeA,CAAAA,CAAS,MAAA,CAAS,MACnC,CAAA,CACA,YAAA,CAAYxX,CAAAA,CAAO,KAAA,CACnB,aAAA,CAAawX,CAAAA,CAAS,IAAA,CAAO,MAAA,CAC7B,QAAA,CAAUA,CAAAA,CAAS,EAAA,CAAK,CAAA,CACxB,OAAA,CAAS3E,CAAAA,CACT,aAAA,CAAejI,CAAAA,CACf,aAAA,CAAeC,CAAAA,CACf,WAAA,CAAaK,CAAAA,CACb,eAAA,CAAiBkO,CAAAA,CACjB,YAAA,CAAc,IAAMH,CAAAA,CAAY,IAAI,CAAA,CACpC,YAAA,CAAc,IAAMA,CAAAA,CAAY,KAAK,CAAA,CACrC,oBAAA,CAAmB,EAAA,CACnB,2BAAA,CAA0B,MAAA,CAE1B,QAAA,CAAA,CAAA3N,cAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,oBAAA,CAAqB,aAAA,CAAY,MAAA,CAAO,CAAA,CACxDD,eAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,mBAAA,CAAqB,QAAA,CAAA,CAAArL,CAAAA,CAAO,IAAA,CAAMA,CAAAA,CAAO,KAAA,CAAA,CAAM,CAAA,CAAA,CACjE,CAAA,CACA8C,CACF,CACF,CC/DO,SAASuW,EAAAA,CACdC,CAAAA,CACqB,CACrB,OAAO,CACL,IAAA,CAAM,OAAA,CACN,IAAA,CAAMA,CAAAA,CAAI,IAAA,EAAQ,KAAA,CAClB,KAAA,CAAOA,CAAAA,CAAI,KAAA,EAAS,UAAA,CACpB,IAAA,CAAMA,CAAAA,CAAI,IAAA,CACV,MAAA,CAAQA,CAAAA,CAAI,MAAA,EAAU,UACxB,CACF,CA0CO,SAASC,EAAAA,CACdD,CAAAA,CACwB,CACxB,OAAO,CACL,IAAA,CAAM,UAAA,CACN,SAAA,CAAWA,CAAAA,CAAI,SAAA,EAAa,IAAA,CAC5B,MAAA,CAAQ,CAAE,CAAA,CAAGA,CAAAA,CAAI,MAAA,EAAQ,CAAA,EAAK,EAAA,CAAI,CAAA,CAAGA,CAAAA,CAAI,MAAA,EAAQ,GAAK,EAAG,CAAA,CACzD,QAAA,CAAUA,CAAAA,CAAI,QAAA,EAAY,IAAA,CAC1B,KAAA,CACEA,CAAAA,CAAI,KAAA,GAAU,KAAA,CACV,KAAA,CACAA,CAAAA,CAAI,KAAA,EAAS,IAAA,CACX,MAAA,CACA,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAI,KAAK,CAAA,CACrBA,CAAAA,CAAI,KAAA,CACJ,CAACA,CAAAA,CAAI,KAAK,CAAA,CACpB,cAAA,CAAgBA,CAAAA,CAAI,cAAA,EAAkB,IAAA,CACtC,MAAA,CAAQA,CAAAA,CAAI,MAAA,EAAU,UAAA,CACtB,KAAA,CAAOA,CAAAA,CAAI,KAAA,EAAS,UAAA,CACpB,IAAA,CAAMA,CAAAA,CAAI,IACZ,CACF,CCxGA,IAAME,EAAAA,CAA6D,CACjE,YAAA,CAAc,YAAA,CACd,YAAA,CAAc,YAAA,CACd,iBAAA,CAAmB,QAAA,CACnB,gBAAA,CAAkB,QACpB,CAAA,CAUO,SAASC,GAAcC,CAAAA,CAAqC,CACjE,IAAMC,CAAAA,CAAaC,WAAAA,EAAM,CAEzBnQ,eAAAA,CAAU,IAAM,CACd,GAAI,OAAO,QAAA,CAAa,GAAA,CAAa,OACrC,IAAMoG,CAAAA,CAAO,QAAA,CAAS,eAAA,CAChBgK,CAAAA,CAAO,CAAA,iBAAA,EAAoBC,EAAAA,CAAKH,CAAU,CAAC,CAAA,CAAA,CAC3CI,CAAAA,CAA0C,EAAC,CAEjD,GAAIL,CAAAA,GAAU,MAAA,EAAUA,CAAAA,EAAS,IAAA,CAE/B7J,CAAAA,CAAK,eAAA,CAAgB,kBAAkB,CAAA,CAAA,KAAA,GAC9B6J,CAAAA,GAAU,OAAA,EAAWA,CAAAA,GAAU,MAAA,CACxCK,CAAAA,CAAS,kBAAkB,CAAA,CAAIlK,CAAAA,CAAK,YAAA,CAAa,kBAAkB,CAAA,CACnEA,CAAAA,CAAK,YAAA,CAAa,kBAAA,CAAoB6J,CAAK,CAAA,CAAA,KAE3C,IAAA,GAAW,CAACM,CAAAA,CAAQC,CAAG,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQT,EAAO,CAAA,CAAG,CACnD,IAAMjF,CAAAA,CAAImF,CAAAA,CAAMO,CAAyB,CAAA,CACrC,OAAO1F,CAAAA,EAAM,QAAA,EAAYA,CAAAA,CAAE,MAAA,CAAS,CAAA,GACtCwF,CAAAA,CAASC,CAAM,CAAA,CAAInK,CAAAA,CAAK,KAAA,CAAM,gBAAA,CAAiBmK,CAAM,CAAA,EAAK,IAAA,CAC1DnK,CAAAA,CAAK,KAAA,CAAM,WAAA,CAAYmK,CAAAA,CAAQzF,CAAC,CAAA,EAEpC,CAEF,OAAA1E,CAAAA,CAAK,YAAA,CAAagK,CAAAA,CAAM,EAAE,CAAA,CAEnB,IAAM,CACXhK,CAAAA,CAAK,eAAA,CAAgBgK,CAAI,CAAA,CACzB,IAAA,GAAW,CAACK,CAAAA,CAAG3F,CAAC,CAAA,GAAK,MAAA,CAAO,OAAA,CAAQwF,CAAQ,CAAA,CACtCG,CAAAA,CAAE,UAAA,CAAW,IAAI,CAAA,CACf3F,CAAAA,CAAG1E,CAAAA,CAAK,KAAA,CAAM,WAAA,CAAYqK,CAAAA,CAAG3F,CAAC,CAAA,CAC7B1E,CAAAA,CAAK,KAAA,CAAM,cAAA,CAAeqK,CAAC,CAAA,CACvB3F,CAAAA,EAAK,IAAA,CACd1E,CAAAA,CAAK,eAAA,CAAgBqK,CAAC,CAAA,CAEtBrK,CAAAA,CAAK,YAAA,CAAaqK,CAAAA,CAAG3F,CAAC,EAG5B,CACF,CAAA,CAAG,CAACmF,CAAAA,CAAOC,CAAU,CAAC,EACxB,CAEA,SAASG,EAAAA,CAAKhT,CAAAA,CAAmB,CAC/B,OAAOA,CAAAA,CAAE,OAAA,CAAQ,eAAA,CAAiB,EAAE,CACtC,CC5DA,IAAMqT,EAAAA,CAAa,MAAA,CAAO,GAAA,CAAI,uBAAuB,CAAA,CAC/CC,EAAAA,CAAa,sBAAA,CAWnB,SAASC,EAAAA,EAA2B,CAClC,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OACnC,IAAM3O,CAAAA,CAAI,MAAA,CACV,GAAIA,CAAAA,CAAEyO,EAAU,CAAA,CAAG,OACnBzO,CAAAA,CAAEyO,EAAU,CAAA,CAAI,KAEhB,IAAMG,CAAAA,CAAW,IAAM,MAAA,CAAO,aAAA,CAAc,IAAI,KAAA,CAAMF,EAAU,CAAC,CAAA,CAE3DG,CAAAA,CAAW,OAAA,CAAQ,SAAA,CACzB,OAAA,CAAQ,SAAA,CAAY,SAAA,GAAajV,CAAAA,CAAwC,CACvE,IAAM7D,CAAAA,CAAI8Y,CAAAA,CAAS,KAAA,CAAM,IAAA,CAAMjV,CAAI,CAAA,CACnC,OAAAgV,CAAAA,EAAS,CACF7Y,CACT,CAAA,CACA,IAAM+Y,CAAAA,CAAc,OAAA,CAAQ,YAAA,CAC5B,OAAA,CAAQ,YAAA,CAAe,SAAA,GAClBlV,CAAAA,CACH,CACA,IAAM7D,CAAAA,CAAI+Y,CAAAA,CAAY,KAAA,CAAM,IAAA,CAAMlV,CAAI,CAAA,CACtC,OAAAgV,CAAAA,EAAS,CACF7Y,CACT,CAAA,CACA,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAY6Y,CAAQ,EAC9C,CAMO,SAASG,EAAAA,CACdC,CAAAA,CACS,CACT,GAAM,CAAClD,CAAAA,CAAQmD,CAAS,CAAA,CAAIzR,cAAAA,CAAS,KAAK,CAAA,CAE1C,OAAAO,eAAAA,CAAU,IAAM,CACd,GAAI,CAACiR,CAAAA,CAAW,CACdC,CAAAA,CAAU,KAAK,CAAA,CACf,MACF,CACA,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OACnCN,EAAAA,EAAmB,CAEnB,IAAMO,CAAAA,CAAW,IAAM,CACrB,GAAI,CACFD,CAAAA,CAAU,CAAC,CAACD,CAAAA,CAAU,CAAE,QAAA,CAAU,MAAA,CAAO,QAAA,CAAS,QAAS,CAAC,CAAC,EAC/D,CAAA,KAAQ,CACNC,CAAAA,CAAU,KAAK,EACjB,CACF,CAAA,CACA,OAAAC,CAAAA,EAAS,CACT,MAAA,CAAO,gBAAA,CAAiBR,EAAAA,CAAYQ,CAAQ,CAAA,CAC5C,MAAA,CAAO,gBAAA,CAAiB,UAAA,CAAYA,CAAQ,CAAA,CACrC,IAAM,CACX,MAAA,CAAO,mBAAA,CAAoBR,EAAAA,CAAYQ,CAAQ,CAAA,CAC/C,MAAA,CAAO,mBAAA,CAAoB,UAAA,CAAYA,CAAQ,EACjD,CACF,CAAA,CAAG,CAACF,CAAS,CAAC,CAAA,CAEPlD,CACT,CCvEA,IAAMqD,EAAAA,CAAmB,CACvB,IAAA,CACA,WAAA,CACA,SAAA,CACA,MAAA,CACA,MAAA,CACA,MAAA,CACA,WAAA,CACA,OAAA,CACA,SACF,CAAA,CAOO,SAASC,EAAAA,EAA0B,CACxC,GAAM,CAACC,CAAAA,CAAQC,CAAS,CAAA,CAAI9R,cAAAA,CAAS,KAAK,CAAA,CAE1C,OAAAO,eAAAA,CAAU,IAAM,CACd,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OACnC,IAAMiC,CAAAA,CAAI,OACV,GAAIA,CAAAA,CAAE,kBAAA,CAAoB,CACxBsP,CAAAA,CAAU,IAAI,CAAA,CACd,MACF,CACA,IAAMC,CAAAA,CAAKvP,CAAAA,CAAE,MAAA,CACb,GAAIuP,CAAAA,EAAMA,CAAAA,CAAG,eAAA,CAAiB,CAC5BD,CAAAA,CAAU,IAAI,CAAA,CACd,MACF,CACA,IAAME,CAAAA,CAAK,SAAA,CAAU,SAAA,EAAa,EAAA,CAC9BL,EAAAA,CAAiB,IAAA,CAAMzC,CAAAA,EAAM8C,CAAAA,CAAG,QAAA,CAAS9C,CAAC,CAAC,CAAA,EAC7C4C,CAAAA,CAAU,IAAI,EAElB,CAAA,CAAG,EAAE,CAAA,CAEED,CACT,CCrCA,IAAMI,EAAAA,CAAiB,kBAAA,CACjBC,EAAAA,CAAiB,IAAA,CAAU,GAAA,CAyB1B,SAASC,EAAAA,CACdC,CAAAA,CACAC,CAAAA,CACmB,CACnB,GAAM,CAACC,CAAAA,CAAOC,CAAQ,CAAA,CAAIvS,cAAAA,CAA4B,KAAO,CAC3D,OAAA,CAAS,IAAA,CACT,OAAA,CAAS,IAAA,CACT,OAAA,CAAS,IACX,CAAA,CAAE,CAAA,CAEF,OAAAO,eAAAA,CAAU,IAAM,CACd,GAAI,OAAO,MAAA,CAAW,GAAA,CAAa,OAEnC,IAAMiS,CAAAA,CAASC,EAAAA,CAAUL,CAAM,CAAA,CAC3BI,CAAAA,EACFD,CAAAA,CAAS,CACP,OAAA,CAASC,CAAAA,CAAO,OAAA,CAChB,OAAA,CAASE,EAAAA,CAAeF,CAAAA,CAAO,OAAO,CAAA,CACtC,OAAA,CAAS,KACX,CAAC,CAAA,CAGH,IAAMG,CAAAA,CAAa,IAAI,eAAA,CAIjBlU,CAAAA,CAAY,MAAA,CAAO,UAAA,CAAW,IAAMkU,CAAAA,CAAW,KAAA,EAAM,CAAG,GAAI,CAAA,CAC5D1b,CAAAA,CAAM,CAAA,EAAGob,CAAAA,CAAO,OAAA,CAAQ,KAAA,CAAO,EAAE,CAAC,CAAA,0BAAA,EAA6B,kBAAA,CAAmBD,CAAM,CAAC,CAAA,CAAA,CAC/F,OAAA,KAAA,CAAMnb,CAAAA,CAAK,CACT,MAAA,CAAQ,KAAA,CACR,IAAA,CAAM,MAAA,CACN,WAAA,CAAa,MAAA,CACb,MAAA,CAAQ0b,CAAAA,CAAW,MACrB,CAAC,CAAA,CACE,IAAA,CAAK,MAAOvV,CAAAA,EAAQ,CACnB,GAAI,CAACA,CAAAA,CAAI,EAAA,CAAI,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQA,CAAAA,CAAI,MAAM,CAAA,CAAE,CAAA,CACjD,IAAMlG,CAAAA,CAAQ,MAAMkG,CAAAA,CAAI,IAAA,EAAK,CACvBwV,CAAAA,CAAUC,EAAAA,CAAa3b,CAAAA,CAAK,OAAO,CAAA,CACzC,GAAI,CAAC0b,CAAAA,CAAS,MAAM,IAAI,KAAA,CAAM,2BAA2B,CAAA,CACzDE,EAAAA,CAAWV,CAAAA,CAAQQ,CAAO,CAAA,CAC1BL,CAAAA,CAAS,CACP,OAAA,CAAAK,EACA,OAAA,CAASF,EAAAA,CAAeE,CAAO,CAAA,CAC/B,OAAA,CAAS,KACX,CAAC,EACH,CAAC,CAAA,CACA,KAAA,CAAM,IAAM,CAEXL,CAAAA,CAAUhF,CAAAA,EACRA,CAAAA,CAAK,OAAA,CACD,CAAE,OAAA,CAAS,IAAA,CAAM,OAAA,CAAS,IAAA,CAAM,OAAA,CAAS,KAAM,CAAA,CAC/CA,CACN,EACF,CAAC,CAAA,CACA,OAAA,CAAQ,IAAM,MAAA,CAAO,YAAA,CAAa9O,CAAS,CAAC,CAAA,CAExC,IAAM,CACX,MAAA,CAAO,YAAA,CAAaA,CAAS,CAAA,CAC7BkU,CAAAA,CAAW,KAAA,GACb,CACF,CAAA,CAAG,CAACP,CAAAA,CAAQC,CAAM,CAAC,CAAA,CAEZC,CACT,CAEA,SAASI,EAAAA,CAAexD,CAAAA,CAA0B,CAKhD,OAAOA,CAAAA,CAAE,IAAA,GAAS,UACpB,CAEA,IAAM6D,EAAAA,CAAqD,CACzD,IAAA,CACA,IAAA,CACA,IAAA,CACA,IACF,CAAA,CACMC,EAAAA,CAAoC,CAAC,KAAA,CAAO,OAAA,CAAS,QAAA,CAAU,MAAM,CAAA,CAOpE,SAASH,EAAAA,CAAaI,CAAAA,CAAmC,CAC9D,GAAI,CAACA,CAAAA,EAAO,OAAOA,CAAAA,EAAQ,QAAA,CAAU,OAAO,IAAA,CAC5C,IAAM1a,CAAAA,CAAI0a,CAAAA,CAIV,GAAI1a,CAAAA,CAAE,OAAA,GAAY,KAAA,CAAO,OAAO,CAAE,IAAA,CAAM,UAAW,CAAA,CAEnD,IAAMmR,CAAAA,CAAQ,OAAOnR,CAAAA,CAAE,KAAA,EAAU,QAAA,CAAWA,CAAAA,CAAE,KAAA,CAAQ,UAAA,CAEtD,OAAIA,CAAAA,CAAE,IAAA,GAAS,UAAA,CAGN,CAAE,IAAA,CAAM,UAAA,CAAY,SAAA,CADzBwa,EAAAA,CAAiB,IAAA,CAAM3P,CAAAA,EAAMA,CAAAA,GAAM7K,CAAAA,CAAE,SAAS,CAAA,EAAK,KACf,KAAA,CAAAmR,CAAM,CAAA,CAE1CnR,CAAAA,CAAE,IAAA,GAAS,OAAA,CAEN,CAAE,IAAA,CAAM,OAAA,CAAS,IAAA,CADXya,EAAAA,CAAY,IAAA,CAAMxb,CAAAA,EAAMA,CAAAA,GAAMe,CAAAA,CAAE,IAAI,CAAA,EAAK,KAAA,CACxB,KAAA,CAAAmR,CAAM,CAAA,CAE/B,IACT,CAEA,SAAS+I,EAAAA,CAAUL,CAAAA,CAAoC,CACrD,GAAI,CACF,IAAMa,CAAAA,CAAM,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQhB,EAAAA,CAAiBG,CAAM,CAAA,CAC/D,GAAI,CAACa,CAAAA,CAAK,OAAO,IAAA,CACjB,IAAM7a,CAAAA,CAAS,IAAA,CAAK,KAAA,CAAM6a,CAAG,CAAA,CAC7B,GACE,OAAO7a,CAAAA,EAAQ,SAAA,EAAc,QAAA,EAC7B,IAAA,CAAK,GAAA,EAAI,CAAIA,CAAAA,CAAO,SAAA,CAAY8Z,EAAAA,CAEhC,OAAO,IAAA,CAET,IAAMU,EAAUC,EAAAA,CAAaza,CAAAA,CAAO,OAAO,CAAA,CAC3C,OAAOwa,CAAAA,CAAU,CAAE,SAAA,CAAWxa,CAAAA,CAAO,SAAA,CAAW,OAAA,CAAAwa,CAAQ,CAAA,CAAI,IAC9D,CAAA,KAAQ,CACN,OAAO,IACT,CACF,CAEA,SAASE,EAAAA,CAAWV,CAAAA,CAAgBQ,CAAAA,CAA6B,CAC/D,GAAI,CACF,MAAA,CAAO,YAAA,CAAa,OAAA,CAClBX,EAAAA,CAAiBG,CAAAA,CACjB,IAAA,CAAK,SAAA,CAAU,CAAE,SAAA,CAAW,IAAA,CAAK,GAAA,EAAI,CAAG,OAAA,CAAAQ,CAAQ,CAAC,CACnD,EACF,CAAA,KAAQ,CAER,CACF,CC3IA,IAAMlc,EAAAA,CAAkB,8BAAA,CAoCjB,SAASwc,EAAAA,CAAc,CAC5B,MAAA,CAAAd,CAAAA,CACA,OAAAC,CAAAA,CACA,IAAA,CAAApO,CAAAA,CACA,SAAA,CAAAvM,CAAAA,CACA,cAAA,CAAAyb,CAAAA,CAAiB,IAAA,CACjB,OAAA,CAAAP,CAAAA,CACA,MAAA,CAAAQ,CAAAA,CACA,KAAA,CAAA5C,CAAAA,CACA,YAAA,CAAAnC,CAAAA,CACA,OAAA,CAAAvQ,CAAAA,CACA,QAAA,CAAAuV,CACF,CAAA,CAAuB,CACrB,GAAM,CAACtP,CAAAA,CAAQuP,CAAS,CAAA,CAAItT,cAAAA,CAAS,KAAK,CAAA,CACpC,CAACuT,CAAY,CAAA,CAAIvT,cAAAA,CAAS,KAAK,CAAA,CAC/B,CAACwT,CAAK,CAAA,CAAIxT,cAAAA,CAAuB,IAAI,CAAA,CAErC8D,CAAAA,CAAS2P,aAAAA,CACb,IAAM,IAAIhR,EAAAA,CAAY,CAAE,MAAA,CAAA2P,CAAAA,CAAQ,MAAA,CAAAC,CAAAA,CAAQ,IAAA,CAAApO,CAAAA,CAAM,SAAA,CAAAvM,CAAU,CAAC,CAAA,CACzD,CACE0a,CAAAA,CACAC,CAAAA,CACApO,CAAAA,EAAM,EAAA,CACNA,CAAAA,EAAM,KAAA,CACNA,CAAAA,EAAM,IAAA,CACNvM,CAAAA,EAAW,MAAA,CACXA,CAAAA,EAAW,QAAA,CACXA,CAAAA,EAAW,SACb,CACF,CAAA,CAIA6I,eAAAA,CAAU,IAAM,CACdmT,EAAAA,CAAsB,CACpB,eAAA,CAAA,CAAkBrB,CAAAA,EAAU3b,EAAAA,EAAiB,OAAA,CAAQ,KAAA,CAAO,EAAE,CAChE,CAAC,EACH,CAAA,CAAG,CAAC2b,CAAM,CAAC,CAAA,CAEX,IAAMtE,CAAAA,CAAO4F,iBAAAA,CAAY,IAAML,CAAAA,CAAU,IAAI,CAAA,CAAG,EAAE,CAAA,CAC5CM,CAAAA,CAAQD,iBAAAA,CAAY,IAAML,CAAAA,CAAU,KAAK,CAAA,CAAG,EAAE,CAAA,CAC9ChL,CAAAA,CAASqL,iBAAAA,CAAY7P,CAAAA,CAAO,MAAA,CAAO,IAAA,CAAKA,CAAM,CAAA,CAAG,CAACA,CAAM,CAAC,CAAA,CAEzD+P,CAAAA,CAAgBjC,EAAAA,GAChBkC,CAAAA,CAAcvC,EAAAA,CAAU6B,CAAM,CAAA,CACpC7C,EAAAA,CAAcC,CAAK,CAAA,CAKnB,IAAMuD,CAAAA,CAAS5B,EAAAA,CACbS,CAAAA,CAAU,EAAA,CAAKR,CAAAA,CACfC,CAAAA,EAAU3b,EACZ,CAAA,CAEMgG,CAAAA,CAAQ+W,aAAAA,CACZ,KAAO,CACL,MAAA,CAAA3P,CAAAA,CACA,IAAA,CAAAG,CAAAA,CACA,MAAA,CAAAF,CAAAA,CACA,YAAA,CAAAwP,CAAAA,CACA,KAAA,CAAAC,CAAAA,CACA,IAAA,CAAAzF,CAAAA,CACA,KAAA,CAAA6F,CAAAA,CACA,WAAA,CAAa7F,CAAAA,CACb,YAAA,CAAc6F,CAAAA,CACd,MAAA,CAAAtL,CAAAA,CACA,aAAA,CAAAuL,CAAAA,CACA,OAAA,CAAA/V,CACF,CAAA,CAAA,CACA,CACEgG,CAAAA,CACAG,CAAAA,CACAF,CAAAA,CACAwP,CAAAA,CACAC,CAAAA,CACAzF,CAAAA,CACA6F,CAAAA,CACAtL,CAAAA,CACAuL,CAAAA,CACA/V,CACF,CACF,CAAA,CAEMkW,CAAAA,CAAmBC,EAAAA,CAAwB,CAC/C,QAAA,CAAUrB,EACV,MAAA,CAAQmB,CAAAA,CAAO,OAAA,CACf,aAAA,CAAeA,CAAAA,CAAO,OAAA,CACtB,cAAA,CAAAZ,CACF,CAAC,CAAA,CAED,OACEhR,eAAAA,CAACpD,EAAAA,CAAa,QAAA,CAAb,CAAsB,KAAA,CAAOrC,CAAAA,CAC3B,QAAA,CAAA,CAAA2W,CAAAA,CACAW,CAAAA,EAAkB,IAAA,GAAS,UAAA,CAC1B5R,cAAAA,CAACgM,EAAAA,CAAA,CACC,MAAA,CAAQiC,EAAAA,CAAsB2D,CAAgB,CAAA,CAC9C,YAAA,CAAc3F,CAAAA,CACd,MAAA,CAAQyF,CAAAA,CACR,OAAA,CAAS/F,CAAAA,CACX,CAAA,CACE,IAAA,CACHiG,CAAAA,EAAkB,IAAA,GAAS,OAAA,CAC1B5R,cAAAA,CAACyN,EAAAA,CAAA,CACC,MAAA,CAAQM,EAAAA,CAAmB6D,CAAgB,CAAA,CAC3C,YAAA,CAAc3F,CAAAA,CACd,MAAA,CAAQyF,CAAAA,CACR,OAAA,CAAS/F,CAAAA,CACX,CAAA,CACE,IAAA,CACHiG,CAAAA,EAAkB,IAAA,GAAS,QAAA,CAC1B5R,cAAAA,CAACsN,EAAAA,CAAA,CACC,KAAA,CAAOsE,EAAiB,KAAA,CACxB,KAAA,CAAOA,CAAAA,CAAiB,KAAA,EAAS,UAAA,CACjC,IAAA,CAAMA,CAAAA,CAAiB,IAAA,CACvB,OAAA,CAASjG,CAAAA,CACX,CAAA,CACE,IAAA,CACJ3L,cAAAA,CAACyB,EAAAA,CAAA,EAAa,CAAA,CAAA,CAChB,CAEJ,CAYA,SAASoQ,EAAAA,CAAwB7X,CAAAA,CAKT,CACtB,OAAIA,CAAAA,CAAK,QAAA,CAAiBA,CAAAA,CAAK,QAAA,CAC3BA,CAAAA,CAAK,cAAA,GAAmB,KAAA,CAAc,CAAE,IAAA,CAAM,UAAW,CAAA,CACzDA,CAAAA,CAAK,MAAA,CAAeA,CAAAA,CAAK,MAAA,CACzBA,CAAAA,CAAK,aAAA,CAAsB,IAAA,CACxB,CAAE,IAAA,CAAM,UAAW,CAC5B,CCpMO,SAAS8X,EAAAA,CAAe,CAC7B,OAAA,CAAAC,CAAAA,CAAU,SAAA,CACV,QAAA,CAAAC,CAAAA,CAAW,KAAA,CACX,SAAA,CAAAnE,CAAAA,CACA,QAAA,CAAAoD,CAAAA,CAAW,UAAA,CACX,OAAA,CAAA1J,CAAAA,CACA,GAAGlM,CACL,CAAA,CAAwB,CACtB,GAAM,CAAE,WAAA,CAAA4W,CAAY,CAAA,CAAIpV,CAAAA,EAAS,CAC3BqV,CAAAA,CAAM,CACV,WAAA,CACAH,CAAAA,GAAY,SAAA,CAAY,mBAAA,CAAsB,IAAA,CAC9CA,CAAAA,GAAY,OAAA,CAAU,iBAAA,CAAoB,IAAA,CAC1CA,CAAAA,GAAY,SAAA,CAAY,mBAAA,CAAsB,IAAA,CAC9CC,CAAAA,CAAW,oBAAA,CAAuB,IAAA,CAClCnE,CACF,CAAA,CACG,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,CAEX,OACE7N,cAAAA,CAAC,QAAA,CAAA,CACC,IAAA,CAAK,QAAA,CACL,SAAA,CAAWkS,CAAAA,CACX,OAAA,CAAU9c,CAAAA,EAAM,CACdmS,CAAAA,GAAUnS,CAAC,CAAA,CACNA,CAAAA,CAAE,gBAAA,EAAkB6c,CAAAA,GAC3B,CAAA,CACC,GAAG5W,CAAAA,CAEH,QAAA,CAAA4V,CAAAA,CACH,CAEJ","file":"index.cjs","sourcesContent":["export class LumenError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n ) {\n super(message);\n this.name = \"LumenError\";\n }\n}\n\nexport class LumenOriginError extends LumenError {\n constructor() {\n super(\n \"Origin not allowed. Add this origin in your Lumen project settings.\",\n \"ORIGIN_NOT_ALLOWED\",\n 403,\n );\n this.name = \"LumenOriginError\";\n }\n}\n\nexport class LumenRateLimitError extends LumenError {\n constructor(public readonly retryAfter: number) {\n super(\n `Rate limited — retry after ${retryAfter}s.`,\n \"RATE_LIMITED\",\n 429,\n );\n this.name = \"LumenRateLimitError\";\n }\n}\n\nexport class LumenNetworkError extends LumenError {\n constructor(message: string) {\n super(message, \"NETWORK_ERROR\");\n this.name = \"LumenNetworkError\";\n }\n}\n","import type {\n AmplitudeIdentity,\n LumenClientConfig,\n LumenUser,\n SubmitOptions,\n SubmitPayload,\n SubmitResult,\n} from \"./types\";\nimport {\n LumenError,\n LumenNetworkError,\n LumenOriginError,\n LumenRateLimitError,\n} from \"./errors\";\n\nconst DEFAULT_API_URL = \"https://shakebugs.vercel.app\";\nconst SUBMIT_PATH = \"/api/v1/sdk/submit\";\n\nconst RETRYABLE_STATUSES = new Set([502, 503, 504]);\n\nexport class LumenClient {\n readonly apiKey: string;\n readonly apiUrl: string;\n user: LumenUser | undefined;\n amplitude: AmplitudeIdentity | undefined;\n\n constructor(config: LumenClientConfig) {\n if (!config.apiKey || !config.apiKey.startsWith(\"lk_pub_\")) {\n throw new LumenError(\n \"Invalid Lumen apiKey — expected a key starting with `lk_pub_`.\",\n \"INVALID_API_KEY\",\n );\n }\n this.apiKey = config.apiKey;\n this.apiUrl = (config.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.user = config.user;\n this.amplitude = config.amplitude;\n }\n\n /**\n * Submit a feedback payload. Uses XHR (not fetch) so we can surface\n * upload-progress events to the UI. Retries up to 2 times on 5xx /\n * network errors with exponential backoff.\n */\n async submit(\n payload: SubmitPayload,\n options: SubmitOptions = {},\n ): Promise<SubmitResult> {\n const url = `${this.apiUrl}${SUBMIT_PATH}`;\n const body = this.#buildFormData(payload);\n\n let lastError: unknown = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n if (attempt > 0) {\n await wait(2 ** attempt * 250);\n }\n try {\n return await this.#sendOnce(url, body, options);\n } catch (e) {\n lastError = e;\n // Don't retry deterministic client errors.\n if (\n e instanceof LumenOriginError ||\n e instanceof LumenRateLimitError\n ) {\n throw e;\n }\n if (\n e instanceof LumenError &&\n typeof e.status === \"number\" &&\n !RETRYABLE_STATUSES.has(e.status)\n ) {\n throw e;\n }\n }\n }\n if (lastError instanceof Error) throw lastError;\n throw new LumenNetworkError(\"Submit failed after 3 attempts.\");\n }\n\n #buildFormData(payload: SubmitPayload): FormData {\n const fd = new FormData();\n if (payload.rawText) fd.append(\"rawText\", payload.rawText);\n if (payload.category) fd.append(\"category\", payload.category);\n if (payload.submitterEmail) fd.append(\"submitterEmail\", payload.submitterEmail);\n if (payload.submitterFingerprint) {\n fd.append(\"submitterFingerprint\", payload.submitterFingerprint);\n }\n // Inject the configured Amplitude identity into the context channel\n // (unless the caller already set one on the payload). These are\n // analytics ids, not PII — the server reads them to pull the user's\n // event timeline during enrichment.\n const amplitude = payload.context.amplitude ?? this.amplitude;\n const context = amplitude\n ? { ...payload.context, amplitude }\n : payload.context;\n fd.append(\"context\", JSON.stringify(context));\n if (payload.screenshot) {\n fd.append(\n \"screenshot\",\n payload.screenshot,\n screenshotFilename(payload.screenshot),\n );\n }\n if (payload.audio) {\n fd.append(\"audio\", payload.audio, \"audio\");\n }\n if (payload.audioDurationMs != null) {\n fd.append(\"audioDurationMs\", String(payload.audioDurationMs));\n }\n if (payload.video) {\n fd.append(\"video\", payload.video, \"video\");\n }\n if (payload.videoDurationMs != null) {\n fd.append(\"videoDurationMs\", String(payload.videoDurationMs));\n }\n // `user` (id/email/name) is intentionally NOT sent. The server has\n // never read these fields, so transmitting them just leaks PII over\n // the wire for no benefit. The `LumenUser` type stays in the public\n // API as a no-op until a future release adds an authenticated\n // identity flow that the server can actually trust.\n return fd;\n }\n\n #sendOnce(\n url: string,\n body: FormData,\n options: SubmitOptions,\n ): Promise<SubmitResult> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url, true);\n xhr.setRequestHeader(\"X-Lumen-Api-Key\", this.apiKey);\n xhr.responseType = \"text\";\n\n const { onUploadProgress, signal } = options;\n\n if (onUploadProgress) {\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable && e.total > 0) {\n onUploadProgress(Math.min(1, e.loaded / e.total));\n }\n });\n }\n\n const onAbort = () => {\n xhr.abort();\n reject(new LumenNetworkError(\"Submit aborted.\"));\n };\n if (signal) {\n if (signal.aborted) {\n reject(new LumenNetworkError(\"Submit aborted.\"));\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n xhr.addEventListener(\"load\", () => {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n\n if (xhr.status === 403) {\n reject(new LumenOriginError());\n return;\n }\n if (xhr.status === 429) {\n const retryAfter = Number(xhr.getResponseHeader(\"Retry-After\")) || 60;\n reject(new LumenRateLimitError(retryAfter));\n return;\n }\n if (xhr.status < 200 || xhr.status >= 300) {\n reject(\n new LumenError(\n parseError(xhr.responseText) ?? `HTTP ${xhr.status}`,\n \"HTTP_ERROR\",\n xhr.status,\n ),\n );\n return;\n }\n try {\n const parsed = JSON.parse(xhr.responseText) as SubmitResult;\n resolve(parsed);\n } catch {\n reject(new LumenError(\"Malformed response from server.\", \"BAD_RESPONSE\"));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n reject(new LumenNetworkError(\"Network error during submit.\"));\n });\n\n xhr.send(body);\n });\n }\n}\n\nfunction screenshotFilename(blob: Blob): string {\n const ext =\n blob.type === \"image/jpeg\"\n ? \"jpg\"\n : blob.type === \"image/webp\"\n ? \"webp\"\n : \"png\";\n return `screenshot.${ext}`;\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction parseError(text: string): string | null {\n try {\n const obj = JSON.parse(text) as { error?: string; message?: string };\n return obj.error ?? obj.message ?? null;\n } catch {\n return text || null;\n }\n}\n","import { LumenError } from \"./errors\";\nimport type {\n CaptureResult,\n ScreenshotCaptureOptions,\n} from \"./types\";\n\nconst DEFAULT_MAX_SCALE = 2;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\n\ntype Html2Canvas = typeof import(\"html2canvas-pro\").default;\n\nlet html2canvasForTest: Html2Canvas | null = null;\n\nexport function __setHtml2CanvasForTest(renderer: Html2Canvas | null): void {\n html2canvasForTest = renderer;\n}\n\n/**\n * Capture the visible app screen with method/platform metadata.\n *\n * `mode: \"auto\"` keeps the no-permission DOM path first, then falls\n * back to the browser Screen Capture API if DOM rendering fails.\n * Hosts that need native-quality pixels can pass a custom provider.\n */\nexport async function captureScreen(\n options: ScreenshotCaptureOptions = {},\n): Promise<CaptureResult> {\n assertBrowser();\n\n const mode = options.mode ?? \"auto\";\n\n if (options.provider && (mode === \"auto\" || mode === \"custom\")) {\n try {\n return normalizeProviderResult(await options.provider(), options);\n } catch (e) {\n if (mode === \"custom\") throw e;\n // In auto mode a broken custom provider should not strand web apps.\n options.onWarning?.([\n \"Custom capture provider failed; falling back to browser DOM capture.\",\n ]);\n }\n }\n\n if (mode === \"manual\") {\n throw new LumenError(\n \"Manual screenshot upload is required for this capture mode.\",\n \"MANUAL_CAPTURE_REQUIRED\",\n );\n }\n\n if (mode === \"true-screen\") {\n return captureDisplayMedia(options);\n }\n\n if (mode === \"dom\") {\n return captureDom(options);\n }\n\n if (mode === \"custom\") {\n throw new LumenError(\n \"`capture.provider` is required when capture mode is `custom`.\",\n \"CAPTURE_PROVIDER_REQUIRED\",\n );\n }\n\n try {\n return await captureDom(options);\n } catch (domError) {\n if (canUseDisplayMedia()) {\n const result = await captureDisplayMedia(options);\n result.warnings = uniq([\n \"DOM screenshot failed; used browser screen permission fallback.\",\n ...result.warnings,\n ]);\n options.onWarning?.(result.warnings);\n return result;\n }\n throw domError;\n }\n}\n\n/**\n * Back-compatible wrapper kept for existing integrations.\n * New code should prefer `captureScreen()` so capture quality metadata\n * can be stored with the feedback.\n */\nexport async function captureScreenshot(\n target?: HTMLElement,\n): Promise<Blob> {\n const result = await captureScreen({ target, mode: \"auto\" });\n return result.blob;\n}\n\nexport function createManualCaptureResult(\n blob: Blob,\n warnings: string[] = [],\n): CaptureResult {\n assertBrowser();\n const viewport = currentViewport();\n return {\n blob,\n method: \"manual-upload\",\n platform: \"web\",\n viewport,\n pixelRatio: window.devicePixelRatio ?? 1,\n warnings: uniq(warnings),\n };\n}\n\nasync function captureDom(\n options: ScreenshotCaptureOptions,\n): Promise<CaptureResult> {\n const html2canvas = await loadHtml2Canvas();\n\n const target = options.target ?? document.documentElement;\n const viewport = currentViewport();\n const scale = Math.max(\n 1,\n Math.min(window.devicePixelRatio ?? 1, options.maxScale ?? DEFAULT_MAX_SCALE),\n );\n const warnings = collectDomWarnings(target);\n\n const canvas = await html2canvas(target, {\n backgroundColor: null,\n logging: false,\n useCORS: true,\n allowTaint: false,\n width: viewport.width,\n height: viewport.height,\n windowWidth: viewport.width,\n windowHeight: viewport.height,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n x: window.scrollX,\n y: window.scrollY,\n scale,\n ignoreElements: (el) =>\n el instanceof HTMLElement &&\n (el.dataset.lumenCaptureIgnore === \"true\" ||\n Boolean(el.closest(\"[data-lumen-capture-ignore='true']\"))),\n });\n\n const blob = await encodeCanvas(canvas, warnings);\n const result = {\n blob,\n method: \"web-dom\",\n platform: \"web\",\n viewport,\n pixelRatio: scale,\n warnings: uniq(warnings),\n } satisfies CaptureResult;\n if (result.warnings.length > 0) options.onWarning?.(result.warnings);\n return result;\n}\n\nasync function loadHtml2Canvas(): Promise<Html2Canvas> {\n if (html2canvasForTest) return html2canvasForTest;\n const { default: html2canvas } = await import(\"html2canvas-pro\");\n return html2canvas;\n}\n\nasync function captureDisplayMedia(\n options: ScreenshotCaptureOptions,\n): Promise<CaptureResult> {\n if (!canUseDisplayMedia()) {\n throw new LumenError(\n \"Browser screen capture is unavailable in this environment.\",\n \"DISPLAY_MEDIA_UNAVAILABLE\",\n );\n }\n\n const stream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n audio: false,\n });\n\n try {\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n video.srcObject = stream;\n await waitForVideoFrame(video);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new LumenError(\n \"Could not create a drawing context for screen capture.\",\n \"CANVAS_CONTEXT_UNAVAILABLE\",\n );\n }\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n const viewport = currentViewport();\n const warnings = [\n \"Browser screen capture uses the window or tab selected by the user.\",\n ];\n const blob = await encodeCanvas(canvas, warnings);\n const result = {\n blob,\n method: \"web-display-media\",\n platform: \"web\",\n viewport,\n pixelRatio:\n viewport.width > 0 ? canvas.width / viewport.width : undefined,\n warnings: uniq(warnings),\n } satisfies CaptureResult;\n options.onWarning?.(result.warnings);\n return result;\n } finally {\n for (const track of stream.getTracks()) track.stop();\n }\n}\n\nfunction normalizeProviderResult(\n result: CaptureResult,\n options: ScreenshotCaptureOptions,\n): CaptureResult {\n const viewport = currentViewport();\n const normalized = {\n ...result,\n method: result.method ?? \"custom\",\n platform: result.platform ?? \"custom\",\n viewport: result.viewport ?? viewport,\n pixelRatio: result.pixelRatio ?? window.devicePixelRatio ?? 1,\n warnings: uniq(result.warnings ?? []),\n } satisfies CaptureResult;\n if (normalized.warnings.length > 0) options.onWarning?.(normalized.warnings);\n return normalized;\n}\n\nfunction collectDomWarnings(target: HTMLElement): string[] {\n const warnings = new Set<string>();\n\n if (target.querySelector(\"iframe\")) {\n warnings.add(\"Embedded iframes may be blank or incomplete in DOM capture.\");\n }\n if (target.querySelector(\"video\")) {\n warnings.add(\"Video frames may be blank or stale in DOM capture.\");\n }\n if (target.querySelector(\"canvas\")) {\n warnings.add(\"Canvas/WebGL content may be blank if it is cross-origin tainted.\");\n }\n if (document.fonts && document.fonts.status !== \"loaded\") {\n warnings.add(\"Web fonts were still loading when the screenshot was captured.\");\n }\n\n let crossOriginImages = 0;\n for (const img of Array.from(target.querySelectorAll(\"img\"))) {\n const src = img.currentSrc || img.src;\n if (!src) continue;\n try {\n const url = new URL(src, window.location.href);\n if (url.origin !== window.location.origin && !img.crossOrigin) {\n crossOriginImages += 1;\n }\n } catch {\n // Invalid image URLs are ignored here; html2canvas will handle them.\n }\n }\n if (crossOriginImages > 0) {\n warnings.add(\n `${crossOriginImages} cross-origin image${crossOriginImages === 1 ? \"\" : \"s\"} without CORS may be omitted from the screenshot.`,\n );\n }\n\n return Array.from(warnings);\n}\n\nasync function encodeCanvas(\n canvas: HTMLCanvasElement,\n warnings: string[],\n): Promise<Blob> {\n let blob = await canvasToBlob(canvas, \"image/png\", 0.92);\n if (blob.size <= MAX_SCREENSHOT_BYTES) return blob;\n\n warnings.push(\"Screenshot exceeded the upload cap and was compressed.\");\n\n // Progressively downscale + re-encode until we're under the cap, or until\n // the image is too small to be useful. Without this loop a very large\n // screenshot from a 4K monitor at 2x DPR could still exceed the cap after\n // a single pass and silently fail to upload server-side.\n let working = canvas;\n let attempt = 0;\n while (blob.size > MAX_SCREENSHOT_BYTES && attempt < 6) {\n const ratio = Math.max(\n 0.35,\n Math.min(0.95, Math.sqrt(MAX_SCREENSHOT_BYTES / blob.size) * 0.9),\n );\n const next = document.createElement(\"canvas\");\n next.width = Math.max(1, Math.round(working.width * ratio));\n next.height = Math.max(1, Math.round(working.height * ratio));\n const ctx = next.getContext(\"2d\");\n if (!ctx) return blob;\n ctx.drawImage(working, 0, 0, next.width, next.height);\n working = next;\n\n for (const quality of [0.86, 0.74, 0.62, 0.5]) {\n blob = await canvasToBlob(working, \"image/jpeg\", quality);\n if (blob.size <= MAX_SCREENSHOT_BYTES) return blob;\n }\n\n attempt += 1;\n if (next.width < 480 || next.height < 320) break;\n }\n\n if (blob.size > MAX_SCREENSHOT_BYTES) {\n warnings.push(\n \"Screenshot remained large after compression; upload may be rejected.\",\n );\n }\n return blob;\n}\n\nfunction canvasToBlob(\n canvas: HTMLCanvasElement,\n type: \"image/png\" | \"image/jpeg\",\n quality: number,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new LumenError(\"Could not encode screenshot.\", \"ENCODE_FAILED\"));\n return;\n }\n resolve(blob);\n },\n type,\n quality,\n );\n });\n}\n\nfunction currentViewport(): { width: number; height: number } {\n const visual = window.visualViewport;\n return {\n width: Math.round(visual?.width ?? window.innerWidth),\n height: Math.round(visual?.height ?? window.innerHeight),\n };\n}\n\nfunction canUseDisplayMedia(): boolean {\n return Boolean(navigator.mediaDevices?.getDisplayMedia);\n}\n\nasync function waitForVideoFrame(video: HTMLVideoElement): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const done = () => resolve();\n const fail = () =>\n reject(new LumenError(\"Could not read screen capture video.\", \"VIDEO_FAILED\"));\n video.addEventListener(\"loadedmetadata\", done, { once: true });\n video.addEventListener(\"error\", fail, { once: true });\n void video.play().catch(fail);\n });\n\n // Wait until the browser actually reports a non-zero frame size. We poll\n // via rAF (cheap, paints-aligned) with a hard cap so a stalled stream\n // can't hang the capture flow.\n const start = performance.now();\n const MAX_WAIT_MS = 1500;\n while (video.videoWidth === 0 || video.videoHeight === 0) {\n if (performance.now() - start > MAX_WAIT_MS) {\n throw new LumenError(\n \"Screen capture did not produce a frame in time.\",\n \"VIDEO_TIMEOUT\",\n );\n }\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n }\n}\n\nfunction assertBrowser(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new LumenError(\n \"Screenshot capture can only run in the browser.\",\n \"INVALID_ENV\",\n );\n }\n}\n\nfunction uniq(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)));\n}\n","/**\n * Lightweight runtime capture: console + fetch/XHR ring buffers.\n *\n * Patched lazily on first install; idempotent. The buffers are drained\n * (not cleared) when `readRuntimeCapture()` is called so multiple\n * submissions in one session each get the latest tail.\n *\n * Keep this file dependency-free and small — it sits on every host\n * page's main bundle.\n */\n\nconst MAX_ENTRIES = 200;\nconst MAX_STRING = 4096;\n\ntype ConsoleLevel = \"log\" | \"info\" | \"warn\" | \"error\" | \"debug\";\n\nexport interface ConsoleEntry {\n level: ConsoleLevel;\n ts: number;\n message: string;\n}\n\nexport interface NetworkEntry {\n type: \"fetch\" | \"xhr\";\n method: string;\n url: string;\n status: number;\n ok: boolean;\n durationMs: number;\n ts: number;\n error?: string;\n}\n\nconst consoleBuf: ConsoleEntry[] = [];\nconst networkBuf: NetworkEntry[] = [];\n\nlet installed = false;\nlet ignoreUrlPrefix: string | null = null;\n\nexport interface InstallRuntimeCaptureOptions {\n /**\n * Requests to URLs starting with this prefix are skipped — prevents\n * the SDK from logging its own submit/config calls in a recursive\n * loop and from leaking apiKey headers into the buffer.\n */\n ignoreUrlPrefix?: string;\n}\n\nexport function installRuntimeCapture(\n options: InstallRuntimeCaptureOptions = {},\n): void {\n if (installed) return;\n if (typeof window === \"undefined\") return;\n installed = true;\n ignoreUrlPrefix = options.ignoreUrlPrefix ?? null;\n patchConsole();\n patchFetch();\n patchXhr();\n}\n\nexport function readRuntimeCapture(): {\n consoleLog: ConsoleEntry[];\n networkLog: NetworkEntry[];\n} {\n return {\n consoleLog: consoleBuf.slice(),\n networkLog: networkBuf.slice(),\n };\n}\n\nfunction pushBounded<T>(buf: T[], entry: T): void {\n buf.push(entry);\n if (buf.length > MAX_ENTRIES) buf.splice(0, buf.length - MAX_ENTRIES);\n}\n\nfunction safeStringify(args: unknown[]): string {\n const out: string[] = [];\n for (const arg of args) {\n if (typeof arg === \"string\") {\n out.push(arg);\n continue;\n }\n if (arg instanceof Error) {\n out.push(`${arg.name}: ${arg.message}${arg.stack ? `\\n${arg.stack}` : \"\"}`);\n continue;\n }\n try {\n out.push(JSON.stringify(arg, replacer));\n } catch {\n out.push(String(arg));\n }\n }\n const joined = out.join(\" \");\n return joined.length > MAX_STRING\n ? joined.slice(0, MAX_STRING) + \"…[truncated]\"\n : joined;\n}\n\n// Drops common circular refs (DOM nodes, React fibers) so JSON.stringify\n// doesn't throw and the buffer stays small.\nfunction replacer(_key: string, value: unknown): unknown {\n if (value instanceof Element) return `[Element ${(value as Element).tagName}]`;\n if (typeof value === \"function\") return \"[Function]\";\n return value;\n}\n\nfunction patchConsole(): void {\n const target = window.console;\n if (!target) return;\n const levels: ConsoleLevel[] = [\"log\", \"info\", \"warn\", \"error\", \"debug\"];\n for (const level of levels) {\n const original = target[level]?.bind(target);\n if (!original) continue;\n target[level] = (...args: unknown[]) => {\n try {\n pushBounded(consoleBuf, {\n level,\n ts: Date.now(),\n message: safeStringify(args),\n });\n } catch {\n // Never let our interception throw into the host app.\n }\n original(...args);\n };\n }\n}\n\nfunction isIgnored(url: string): boolean {\n if (!ignoreUrlPrefix) return false;\n return url.startsWith(ignoreUrlPrefix);\n}\n\nfunction patchFetch(): void {\n const originalFetch = window.fetch;\n if (typeof originalFetch !== \"function\") return;\n window.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n const method = (init?.method ?? (input instanceof Request ? input.method : \"GET\")).toUpperCase();\n if (isIgnored(url)) {\n return originalFetch.call(window, input as RequestInfo, init);\n }\n const started = performance.now();\n try {\n const res = await originalFetch.call(window, input as RequestInfo, init);\n pushBounded(networkBuf, {\n type: \"fetch\",\n method,\n url: truncate(url),\n status: res.status,\n ok: res.ok,\n durationMs: Math.round(performance.now() - started),\n ts: Date.now(),\n });\n return res;\n } catch (e) {\n pushBounded(networkBuf, {\n type: \"fetch\",\n method,\n url: truncate(url),\n status: 0,\n ok: false,\n durationMs: Math.round(performance.now() - started),\n ts: Date.now(),\n error: e instanceof Error ? e.message : \"fetch error\",\n });\n throw e;\n }\n } as typeof window.fetch;\n}\n\nfunction patchXhr(): void {\n const OriginalXHR = window.XMLHttpRequest;\n if (!OriginalXHR) return;\n const originalOpen = OriginalXHR.prototype.open;\n const originalSend = OriginalXHR.prototype.send;\n\n OriginalXHR.prototype.open = function patchedOpen(\n this: XMLHttpRequest & { __lumen?: { method: string; url: string; t: number } },\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n this.__lumen = {\n method: String(method).toUpperCase(),\n url: typeof url === \"string\" ? url : url.toString(),\n t: 0,\n };\n // @ts-expect-error variadic passthrough\n return originalOpen.call(this, method, url, ...rest);\n } as typeof OriginalXHR.prototype.open;\n\n OriginalXHR.prototype.send = function patchedSend(\n this: XMLHttpRequest & { __lumen?: { method: string; url: string; t: number } },\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const meta = this.__lumen;\n if (meta && !isIgnored(meta.url)) {\n meta.t = performance.now();\n const onDone = () => {\n try {\n pushBounded(networkBuf, {\n type: \"xhr\",\n method: meta.method,\n url: truncate(meta.url),\n status: this.status,\n ok: this.status >= 200 && this.status < 400,\n durationMs: Math.round(performance.now() - meta.t),\n ts: Date.now(),\n });\n } catch {\n // ignore\n }\n this.removeEventListener(\"loadend\", onDone);\n };\n this.addEventListener(\"loadend\", onDone);\n }\n return originalSend.call(this, body ?? null);\n } as typeof OriginalXHR.prototype.send;\n}\n\nfunction truncate(s: string): string {\n return s.length > 512 ? s.slice(0, 512) + \"…\" : s;\n}\n","import { readRuntimeCapture } from \"./capture-runtime\";\nimport type {\n CapturedContext,\n CaptureMetadata,\n CaptureResult,\n DeviceContext,\n} from \"./types\";\n\n/**\n * Snapshot of basic page context at submit-time.\n *\n * Console + network logs are sourced from the runtime ring buffer when\n * `installRuntimeCapture()` has been called by the host (the React\n * provider does this on mount). When the host hasn't installed\n * interception the buffer is empty and the legacy `[]` is sent — same\n * shape, no migration impact.\n */\nexport function captureContext(\n capture?: CaptureResult | CaptureMetadata,\n): CapturedContext {\n if (typeof window === \"undefined\") {\n return {\n url: \"\",\n userAgent: \"\",\n viewport: { width: 0, height: 0 },\n capture: toCaptureMetadata(capture),\n consoleLog: [],\n networkLog: [],\n };\n }\n\n const runtime = readRuntimeCapture();\n return {\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n capture: toCaptureMetadata(capture),\n device: snapshotDevice(),\n consoleLog: runtime.consoleLog,\n networkLog: runtime.networkLog,\n };\n}\n\nfunction snapshotDevice(): DeviceContext {\n const device: DeviceContext = {};\n try {\n device.screen = {\n width: window.screen?.width ?? 0,\n height: window.screen?.height ?? 0,\n };\n device.pixelRatio = window.devicePixelRatio ?? 1;\n device.language = navigator.language;\n device.languages = Array.from(navigator.languages ?? []);\n device.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n device.colorScheme = window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n device.referrer = document.referrer || undefined;\n device.title = document.title || undefined;\n device.online = navigator.onLine;\n const nav = performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined;\n if (nav) {\n device.uptimeMs = Math.round(performance.now());\n }\n } catch {\n // Best-effort snapshot — don't block submit on a missing API.\n }\n return device;\n}\n\nfunction toCaptureMetadata(\n capture?: CaptureResult | CaptureMetadata,\n): CaptureMetadata | undefined {\n if (!capture) return undefined;\n return {\n method: capture.method,\n platform: capture.platform,\n viewport: capture.viewport,\n pixelRatio: capture.pixelRatio,\n warnings: capture.warnings,\n };\n}\n","import { LumenError } from \"./errors\";\n\nexport interface AudioRecording {\n blob: Blob;\n durationMs: number;\n mimeType: string;\n}\n\nexport interface RecorderHandle {\n /** Stop recording and resolve with the recorded blob. */\n stop: () => Promise<AudioRecording>;\n /** Cancel without producing a blob; releases the mic immediately. */\n cancel: () => void;\n /** Stream object (use to render a live waveform in Phase 2). */\n stream: MediaStream;\n}\n\n/**\n * Start a MediaRecorder. Caller is responsible for stopping/canceling.\n * Auto-stops after `maxSeconds` seconds to avoid runaway recordings.\n */\nexport async function recordAudio(\n maxSeconds = 60,\n): Promise<RecorderHandle> {\n if (typeof window === \"undefined\" || !navigator.mediaDevices) {\n throw new LumenError(\n \"Audio recording requires a browser with MediaDevices.\",\n \"INVALID_ENV\",\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch {\n throw new LumenError(\n \"Microphone access denied or unavailable.\",\n \"MIC_DENIED\",\n );\n }\n\n // Pick the first MIME type supported by the browser; webm/opus on\n // Chromium, mp4/aac on Safari, ogg on Firefox.\n const candidates = [\n \"audio/webm;codecs=opus\",\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg;codecs=opus\",\n ];\n const mimeType =\n candidates.find((m) => MediaRecorder.isTypeSupported(m)) ?? \"\";\n\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n const chunks: Blob[] = [];\n const start = performance.now();\n let timeoutId: number | null = null;\n\n recorder.addEventListener(\"dataavailable\", (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n });\n\n recorder.start();\n timeoutId = window.setTimeout(() => {\n if (recorder.state !== \"inactive\") recorder.stop();\n }, maxSeconds * 1000);\n\n function release() {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n for (const track of stream.getTracks()) track.stop();\n }\n\n return {\n stream,\n cancel() {\n try {\n if (recorder.state !== \"inactive\") recorder.stop();\n } catch {\n /* ignore */\n }\n release();\n },\n stop(): Promise<AudioRecording> {\n return new Promise((resolve, reject) => {\n if (recorder.state === \"inactive\") {\n release();\n reject(new LumenError(\"Recorder already stopped.\", \"RECORDER_STOPPED\"));\n return;\n }\n recorder.addEventListener(\n \"stop\",\n () => {\n const durationMs = performance.now() - start;\n const finalType = recorder.mimeType || mimeType || \"audio/webm\";\n const blob = new Blob(chunks, { type: finalType });\n release();\n resolve({ blob, durationMs, mimeType: finalType });\n },\n { once: true },\n );\n recorder.stop();\n });\n },\n };\n}\n","import { LumenError } from \"./errors\";\n\nexport interface VideoRecording {\n blob: Blob;\n durationMs: number;\n mimeType: string;\n}\n\nexport interface VideoRecorderHandle {\n /** Stop recording and resolve with the recorded blob. */\n stop: () => Promise<VideoRecording>;\n /** Cancel without producing a blob; releases the screen capture. */\n cancel: () => void;\n /** The screen-capture stream (use to render a live preview). */\n stream: MediaStream;\n}\n\n/**\n * Record the screen via the browser Screen Capture API + MediaRecorder.\n * Mirrors {@link recordAudio} but over `getDisplayMedia`. The user picks a\n * tab / window / screen in the browser's native picker; if they cancel the\n * picker this rejects with `SCREEN_DENIED`.\n *\n * Auto-stops after `maxSeconds`. The browser also surfaces its own \"Stop\n * sharing\" control — we listen for the track ending so that path resolves\n * the recording too.\n */\nexport async function recordVideo(\n maxSeconds = 60,\n): Promise<VideoRecorderHandle> {\n if (\n typeof window === \"undefined\" ||\n !navigator.mediaDevices ||\n typeof navigator.mediaDevices.getDisplayMedia !== \"function\"\n ) {\n throw new LumenError(\n \"Screen recording requires a browser with getDisplayMedia.\",\n \"INVALID_ENV\",\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n // Capture system/tab audio when the user opts in via the picker.\n audio: true,\n });\n } catch {\n throw new LumenError(\n \"Screen capture was denied or cancelled.\",\n \"SCREEN_DENIED\",\n );\n }\n\n // VP9/VP8 webm on Chromium; mp4 on Safari.\n const candidates = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm\",\n \"video/mp4\",\n ];\n const mimeType =\n candidates.find((m) => MediaRecorder.isTypeSupported(m)) ?? \"\";\n\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n const chunks: Blob[] = [];\n const start = performance.now();\n let timeoutId: number | null = null;\n\n recorder.addEventListener(\"dataavailable\", (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n });\n\n recorder.start();\n timeoutId = window.setTimeout(() => {\n if (recorder.state !== \"inactive\") recorder.stop();\n }, maxSeconds * 1000);\n\n // The user can end the share from the browser's own UI — treat that as\n // a stop so the in-flight recording still resolves.\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n videoTrack.addEventListener(\"ended\", () => {\n if (recorder.state !== \"inactive\") recorder.stop();\n });\n }\n\n function release() {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n for (const track of stream.getTracks()) track.stop();\n }\n\n return {\n stream,\n cancel() {\n try {\n if (recorder.state !== \"inactive\") recorder.stop();\n } catch {\n /* ignore */\n }\n release();\n },\n stop(): Promise<VideoRecording> {\n return new Promise((resolve, reject) => {\n if (recorder.state === \"inactive\") {\n release();\n reject(new LumenError(\"Recorder already stopped.\", \"RECORDER_STOPPED\"));\n return;\n }\n recorder.addEventListener(\n \"stop\",\n () => {\n const durationMs = performance.now() - start;\n const finalType = recorder.mimeType || mimeType || \"video/webm\";\n const blob = new Blob(chunks, { type: finalType });\n release();\n resolve({ blob, durationMs, mimeType: finalType });\n },\n { once: true },\n );\n recorder.stop();\n });\n },\n };\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type {\n LumenClient,\n ScreenshotCaptureOptions,\n LumenUser,\n SubmitOptions,\n SubmitPayload,\n SubmitResult,\n} from \"@lumen-stack/core\";\n\nexport interface LumenContextValue {\n client: LumenClient;\n user: LumenUser | undefined;\n\n // v2 surface\n open: () => void;\n close: () => void;\n isOpen: boolean;\n /** Pass-through to client.submit — for headless hosts that build their own payload. */\n submit: (\n payload: SubmitPayload,\n options?: SubmitOptions,\n ) => Promise<SubmitResult>;\n /** Best-effort: true when running inside a native shell (RN WebView, Capacitor, …). */\n isNativeShell: boolean;\n /** Capture options from <LumenProvider>. */\n capture: ScreenshotCaptureOptions | undefined;\n\n // Back-compat aliases (kept; do not remove).\n openCapture: () => void;\n closeCapture: () => void;\n isSubmitting: boolean;\n error: Error | null;\n}\n\nexport const LumenContext = createContext<LumenContextValue | null>(null);\n\nexport function useLumen(): LumenContextValue {\n const ctx = useContext(LumenContext);\n if (!ctx) {\n throw new Error(\"useLumen() must be used inside <LumenProvider>.\");\n }\n return ctx;\n}\n","\"use client\";\n\nimport { useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport * as React from \"react\";\n\nexport type AnnotationTool = \"arrow\" | \"rect\" | \"freehand\";\n\ninterface ArrowAnno {\n kind: \"arrow\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n color: string;\n width: number;\n}\ninterface RectAnno {\n kind: \"rect\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n color: string;\n width: number;\n}\ninterface FreehandAnno {\n kind: \"freehand\";\n points: Array<{ x: number; y: number }>;\n color: string;\n width: number;\n}\ntype Annotation = ArrowAnno | RectAnno | FreehandAnno;\n\nconst HISTORY_LIMIT = 50;\n\nexport interface AnnotationLayerHandle {\n flatten: () => Promise<Blob>;\n reset: () => void;\n undo: () => void;\n hasAnnotations: () => boolean;\n}\n\nexport interface AnnotationLayerProps {\n screenshot: Blob;\n tool: AnnotationTool;\n /** Stroke color (CSS color). Default red-500. */\n color?: string;\n /** Stroke width in bitmap px. Default 4. */\n strokeWidth?: number;\n /** Called when the user starts/stops drawing — used by the modal to\n * lock its scrollable body during a stroke. */\n onDrawingChange?: (drawing: boolean) => void;\n ref?: React.Ref<AnnotationLayerHandle>;\n}\n\nexport function AnnotationLayer({\n screenshot,\n tool,\n color = \"rgb(239, 68, 68)\",\n strokeWidth = 4,\n onDrawingChange,\n ref,\n}: AnnotationLayerProps) {\n const baseCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const overlayCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [imageBitmap, setImageBitmap] = useState<ImageBitmap | null>(null);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const draftRef = useRef<Annotation | null>(null);\n const isDrawingRef = useRef(false);\n const lastSampleAtRef = useRef(0);\n const rafPendingRef = useRef(false);\n\n // Decode the screenshot once into a bitmap so we can redraw cheaply.\n // In React Strict Mode the effect runs twice on mount — we must close\n // the second-run bitmap and free both via .close() on unmount so we\n // don't leak GPU memory across repeated capture sessions.\n useEffect(() => {\n let cancelled = false;\n let decoded: ImageBitmap | null = null;\n (async () => {\n try {\n const bm = await createImageBitmap(screenshot);\n if (cancelled) {\n bm.close?.();\n return;\n }\n decoded = bm;\n setImageBitmap(bm);\n } catch {\n // Decoding failure leaves the layer in its loading state; the\n // surrounding modal will surface the error via toast on submit.\n }\n })();\n return () => {\n cancelled = true;\n decoded?.close?.();\n };\n }, [screenshot]);\n\n // Size + paint base canvas exactly once per bitmap.\n useEffect(() => {\n if (!imageBitmap) return;\n const base = baseCanvasRef.current;\n const overlay = overlayCanvasRef.current;\n if (!base || !overlay) return;\n base.width = imageBitmap.width;\n base.height = imageBitmap.height;\n overlay.width = imageBitmap.width;\n overlay.height = imageBitmap.height;\n const ctx = base.getContext(\"2d\");\n if (!ctx) return;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(imageBitmap, 0, 0);\n }, [imageBitmap]);\n\n // Repaint the OVERLAY only when annotations change. Base canvas is\n // never touched after the initial draw.\n useEffect(() => {\n const overlay = overlayCanvasRef.current;\n if (!overlay) return;\n redraw(overlay, annotations, draftRef.current);\n }, [annotations]);\n\n useImperativeHandle(\n ref,\n (): AnnotationLayerHandle => ({\n hasAnnotations: () => annotations.length > 0,\n reset: () => setAnnotations([]),\n undo: () =>\n setAnnotations((cur) =>\n cur.length === 0 ? cur : cur.slice(0, -1),\n ),\n async flatten() {\n // Mid-stroke at submit time: bake the live draft so the user\n // doesn't lose the annotation they were drawing when they clicked\n // Send.\n const draft = draftRef.current;\n const all = draft ? [...annotations, draft] : annotations;\n // No annotations → no re-encode. A 2MB PNG screenshot through\n // canvas.toBlob can take 100-300ms on a phone for zero benefit.\n if (all.length === 0) return screenshot;\n if (!imageBitmap) return screenshot;\n const out = document.createElement(\"canvas\");\n out.width = imageBitmap.width;\n out.height = imageBitmap.height;\n const ctx = out.getContext(\"2d\");\n if (!ctx) return screenshot;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(imageBitmap, 0, 0);\n for (const anno of all) drawAnno(ctx, anno);\n // JPEG q=0.85: ~4-10× smaller than PNG for screenshot content,\n // which dominates submit time on slow uplinks. Annotations are\n // simple shapes that survive JPEG without visible artifacts.\n return await new Promise<Blob>((resolve) => {\n out.toBlob(\n (blob) => {\n resolve(blob ?? screenshot);\n },\n \"image/jpeg\",\n 0.85,\n );\n });\n },\n }),\n [annotations, imageBitmap, screenshot],\n );\n\n function clientToCanvas(\n e: React.PointerEvent<HTMLCanvasElement>,\n ): { x: number; y: number } {\n const c = overlayCanvasRef.current;\n if (!c) return { x: 0, y: 0 };\n const rect = c.getBoundingClientRect();\n const sx = c.width / Math.max(rect.width, 1);\n const sy = c.height / Math.max(rect.height, 1);\n return {\n x: (e.clientX - rect.left) * sx,\n y: (e.clientY - rect.top) * sy,\n };\n }\n\n function scheduleDraftPaint() {\n if (rafPendingRef.current) return;\n rafPendingRef.current = true;\n requestAnimationFrame(() => {\n rafPendingRef.current = false;\n const overlay = overlayCanvasRef.current;\n if (!overlay) return;\n redraw(overlay, annotations, draftRef.current);\n });\n }\n\n function onPointerDown(e: React.PointerEvent<HTMLCanvasElement>) {\n if (e.button !== undefined && e.button !== 0) return;\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // iOS Safari can throw NotSupportedError if the pointer is already\n // captured by an ancestor (e.g. the sheet grabber's drag handler).\n // Swallow — capture is a nice-to-have for off-canvas tracking; the\n // stroke still works without it.\n }\n isDrawingRef.current = true;\n onDrawingChange?.(true);\n const p = clientToCanvas(e);\n if (tool === \"arrow\") {\n draftRef.current = { kind: \"arrow\", from: p, to: p, color, width: strokeWidth };\n } else if (tool === \"rect\") {\n draftRef.current = { kind: \"rect\", from: p, to: p, color, width: strokeWidth };\n } else {\n draftRef.current = {\n kind: \"freehand\",\n points: [p],\n color,\n width: strokeWidth,\n };\n }\n lastSampleAtRef.current = performance.now();\n scheduleDraftPaint();\n }\n\n function onPointerMove(e: React.PointerEvent<HTMLCanvasElement>) {\n if (!isDrawingRef.current || !draftRef.current) return;\n const p = clientToCanvas(e);\n const draft = draftRef.current;\n if (draft.kind === \"arrow\" || draft.kind === \"rect\") {\n draft.to = p;\n } else {\n const last = draft.points[draft.points.length - 1];\n const dist2 = last\n ? (last.x - p.x) ** 2 + (last.y - p.y) ** 2\n : Infinity;\n const now = performance.now();\n const elapsed = now - lastSampleAtRef.current;\n // Sample if we've moved ≥ 4 bitmap-px OR ≥ 16ms passed (handles\n // very slow strokes where a single point would otherwise stall).\n if (dist2 > 16 || elapsed > 16) {\n draft.points.push(p);\n lastSampleAtRef.current = now;\n }\n }\n scheduleDraftPaint();\n }\n\n function onPointerUp() {\n if (!isDrawingRef.current) return;\n isDrawingRef.current = false;\n onDrawingChange?.(false);\n const draft = draftRef.current;\n draftRef.current = null;\n if (!draft) return;\n if (draft.kind === \"arrow\" || draft.kind === \"rect\") {\n const dx = draft.to.x - draft.from.x;\n const dy = draft.to.y - draft.from.y;\n if (dx * dx + dy * dy < 16) {\n // Tap — discard. Force a clean overlay repaint so the empty\n // draft doesn't linger.\n const overlay = overlayCanvasRef.current;\n if (overlay) redraw(overlay, annotations, null);\n return;\n }\n } else if (draft.points.length < 2) {\n const overlay = overlayCanvasRef.current;\n if (overlay) redraw(overlay, annotations, null);\n return;\n }\n setAnnotations((cur) => [...cur, draft].slice(-HISTORY_LIMIT));\n }\n\n return (\n <div ref={containerRef} className=\"lumen-annotate-frame\">\n <canvas ref={baseCanvasRef} />\n <canvas\n ref={overlayCanvasRef}\n className=\"lumen-annotate-overlay\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n />\n </div>\n );\n}\n\nfunction redraw(\n canvas: HTMLCanvasElement,\n annotations: Annotation[],\n draft: Annotation | null,\n) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n for (const a of annotations) drawAnno(ctx, a);\n if (draft) drawAnno(ctx, draft);\n}\n\nfunction drawAnno(ctx: CanvasRenderingContext2D, anno: Annotation) {\n ctx.save();\n ctx.strokeStyle = anno.color;\n ctx.fillStyle = anno.color;\n ctx.lineWidth = anno.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n if (anno.kind === \"rect\") {\n const x = Math.min(anno.from.x, anno.to.x);\n const y = Math.min(anno.from.y, anno.to.y);\n const w = Math.abs(anno.to.x - anno.from.x);\n const h = Math.abs(anno.to.y - anno.from.y);\n ctx.strokeRect(x, y, w, h);\n } else if (anno.kind === \"freehand\") {\n drawSmoothPath(ctx, anno.points);\n } else {\n const { from, to, width } = anno;\n ctx.beginPath();\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\n const head = Math.max(12, width * 4);\n ctx.beginPath();\n ctx.moveTo(to.x, to.y);\n ctx.lineTo(\n to.x - head * Math.cos(angle - Math.PI / 7),\n to.y - head * Math.sin(angle - Math.PI / 7),\n );\n ctx.lineTo(\n to.x - head * Math.cos(angle + Math.PI / 7),\n to.y - head * Math.sin(angle + Math.PI / 7),\n );\n ctx.closePath();\n ctx.fill();\n }\n\n ctx.restore();\n}\n\n/**\n * Draw a polyline as quadratic curves through midpoints. Each pair of\n * adjacent points contributes one curve where the original point is\n * the control point and the midpoint to the next is the end. This is\n * the standard \"midpoint smoothing\" trick — zero-dep, single pass.\n */\nfunction drawSmoothPath(\n ctx: CanvasRenderingContext2D,\n points: ReadonlyArray<{ x: number; y: number }>,\n) {\n if (points.length === 0) return;\n ctx.beginPath();\n const first = points[0];\n if (!first) return;\n ctx.moveTo(first.x, first.y);\n if (points.length === 1) {\n // Single dot — render a small filled circle so a tap is visible.\n ctx.arc(first.x, first.y, ctx.lineWidth / 2, 0, Math.PI * 2);\n ctx.fill();\n return;\n }\n if (points.length === 2) {\n const second = points[1]!;\n ctx.lineTo(second.x, second.y);\n ctx.stroke();\n return;\n }\n for (let i = 1; i < points.length - 1; i++) {\n const p = points[i]!;\n const next = points[i + 1]!;\n const mx = (p.x + next.x) / 2;\n const my = (p.y + next.y) / 2;\n ctx.quadraticCurveTo(p.x, p.y, mx, my);\n }\n // Final segment to the last point.\n const last = points[points.length - 1]!;\n ctx.lineTo(last.x, last.y);\n ctx.stroke();\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n captureContext,\n captureScreen,\n createManualCaptureResult,\n recordAudio,\n recordVideo,\n type CaptureResult,\n type FeedbackCategory,\n type RecorderHandle,\n type ScreenshotCaptureMode,\n type VideoRecorderHandle,\n} from \"@lumen-stack/core\";\n\nimport { useLumen } from \"./context\";\nimport {\n AnnotationLayer,\n type AnnotationLayerHandle,\n type AnnotationTool,\n} from \"./AnnotationLayer\";\n\nconst VOICE_MAX_SECONDS = 60;\nconst VIDEO_MAX_SECONDS = 60;\n\nconst SWATCHES: ReadonlyArray<{ label: string; value: string }> = [\n { label: \"Red\", value: \"rgb(239, 68, 68)\" },\n { label: \"Amber\", value: \"rgb(245, 158, 11)\" },\n { label: \"Blue\", value: \"rgb(59, 130, 246)\" },\n { label: \"Green\", value: \"rgb(34, 197, 94)\" },\n { label: \"Neutral\", value: \"rgb(244, 244, 245)\" },\n];\n\nconst STROKE_SIZES: ReadonlyArray<{ label: string; value: number; dot: number }> = [\n { label: \"Small\", value: 2, dot: 6 },\n { label: \"Medium\", value: 4, dot: 9 },\n { label: \"Large\", value: 6, dot: 12 },\n];\n\nconst CATEGORIES: ReadonlyArray<{ value: FeedbackCategory; label: string }> = [\n { value: \"bug\", label: \"Bug\" },\n { value: \"feature\", label: \"Idea\" },\n { value: \"other\", label: \"Other\" },\n];\n\ntype CaptureMethod = \"shot\" | \"screen\" | \"video\";\n\nconst METHODS: ReadonlyArray<{ value: CaptureMethod; label: string; hint: string }> = [\n { value: \"shot\", label: \"Screenshot\", hint: \"This page, instantly\" },\n { value: \"screen\", label: \"Screen\", hint: \"Pick a window or tab\" },\n { value: \"video\", label: \"Video\", hint: \"Record up to 60s\" },\n];\n\ntype Step = 1 | 2 | 3;\n\n// Capture sub-state, independent of the wizard step. The annotated artifact\n// lives on `ready`. `idle` = step 1 with nothing captured yet.\ntype Phase =\n | { kind: \"idle\" }\n | { kind: \"capturing\" }\n | { kind: \"manual\"; error?: string }\n | { kind: \"ready\"; capture: CaptureResult };\n\nexport function CaptureModal() {\n const { client, isOpen, closeCapture, user, capture } = useLumen();\n const [step, setStep] = useState<Step>(1);\n const [method, setMethod] = useState<CaptureMethod | null>(null);\n const [phase, setPhase] = useState<Phase>({ kind: \"idle\" });\n const [submitting, setSubmitting] = useState(false);\n const [progress, setProgress] = useState(0);\n // The annotated screenshot is flattened when leaving step 1 (the only step\n // where AnnotationLayer is mounted) and stashed here, because submit() runs\n // on step 3 where the annotator — and its ref — no longer exist.\n const [flattenedShot, setFlattenedShot] = useState<Blob | null>(null);\n\n const [tool, setTool] = useState<AnnotationTool>(\"arrow\");\n const [strokeColor, setStrokeColor] = useState<string>(SWATCHES[0]!.value);\n const [strokeWidth, setStrokeWidth] = useState<number>(STROKE_SIZES[1]!.value);\n const [text, setText] = useState(\"\");\n const [category, setCategory] = useState<FeedbackCategory>(\"bug\");\n const [submitterEmail, setSubmitterEmail] = useState(user?.email ?? \"\");\n const [recorder, setRecorder] = useState<RecorderHandle | null>(null);\n const [audio, setAudio] = useState<{ blob: Blob; durationMs: number } | null>(\n null,\n );\n const [recordSecs, setRecordSecs] = useState(0);\n const [videoRecorder, setVideoRecorder] =\n useState<VideoRecorderHandle | null>(null);\n const [video, setVideo] = useState<{ blob: Blob; durationMs: number } | null>(\n null,\n );\n const [drawing, setDrawing] = useState(false);\n const annotationRef = useRef<AnnotationLayerHandle>(null);\n const modalRef = useRef<HTMLDivElement | null>(null);\n const previouslyFocusedRef = useRef<HTMLElement | null>(null);\n\n // Cancellation flag for in-flight captures — survives a Strict-Mode double\n // mount or a fast re-open so a stale capture can't stomp the latest phase.\n const captureCancelledRef = useRef(false);\n\n // Reset everything when the modal opens. No auto-capture: the user picks a\n // method deliberately (capture used to fire the instant the modal opened).\n useEffect(() => {\n if (!isOpen) return;\n captureCancelledRef.current = false;\n setStep(1);\n setMethod(null);\n setText(\"\");\n setAudio(null);\n setRecordSecs(0);\n setVideo(null);\n setSubmitting(false);\n setProgress(0);\n setFlattenedShot(null);\n setVideoRecorder((cur) => {\n cur?.cancel();\n return null;\n });\n // Honor a host that forces manual upload (e.g. native shells / no DOM).\n setPhase(capture?.mode === \"manual\" ? { kind: \"manual\" } : { kind: \"idle\" });\n return () => {\n captureCancelledRef.current = true;\n };\n }, [isOpen, capture]);\n\n // Body scroll-lock + remember/restore focus while the modal is open.\n // Restore is wired through pagehide as well, so a navigation or a host\n // app crash while the modal is open can't leave the page unscrollable.\n useEffect(() => {\n if (!isOpen) return;\n previouslyFocusedRef.current =\n (document.activeElement as HTMLElement | null) ?? null;\n const html = document.documentElement;\n const prevOverflow = html.style.overflow;\n const prevPaddingRight = html.style.paddingRight;\n const scrollbar = window.innerWidth - html.clientWidth;\n html.style.overflow = \"hidden\";\n if (scrollbar > 0) html.style.paddingRight = `${scrollbar}px`;\n let restored = false;\n const restore = () => {\n if (restored) return;\n restored = true;\n html.style.overflow = prevOverflow;\n html.style.paddingRight = prevPaddingRight;\n try {\n previouslyFocusedRef.current?.focus?.();\n } catch {\n // focus() can throw if the prior element was removed from DOM.\n }\n };\n window.addEventListener(\"pagehide\", restore);\n return () => {\n window.removeEventListener(\"pagehide\", restore);\n restore();\n };\n }, [isOpen]);\n\n // ESC to close. Tab/Shift-Tab focus trap.\n useEffect(() => {\n if (!isOpen) return;\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n closeCapture();\n return;\n }\n if (e.key !== \"Tab\") return;\n const root = modalRef.current;\n if (!root) return;\n const focusables = getFocusable(root);\n if (focusables.length === 0) return;\n const first = focusables[0]!;\n const last = focusables[focusables.length - 1]!;\n const active = document.activeElement as HTMLElement | null;\n if (e.shiftKey && (active === first || !root.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [isOpen, closeCapture]);\n\n // Paste-to-upload while on the manual-capture fallback.\n useEffect(() => {\n if (!isOpen || phase.kind !== \"manual\") return;\n function onPaste(e: ClipboardEvent) {\n const items = Array.from(e.clipboardData?.items ?? []);\n const image = items.find((item) => item.type.startsWith(\"image/\"));\n const file = image?.getAsFile();\n if (!file) return;\n e.preventDefault();\n acceptManualScreenshot(file);\n }\n window.addEventListener(\"paste\", onPaste);\n return () => window.removeEventListener(\"paste\", onPaste);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, phase.kind]);\n\n // Voice record timer.\n useEffect(() => {\n if (!recorder) return;\n const start = Date.now();\n const id = window.setInterval(() => {\n const sec = Math.floor((Date.now() - start) / 1000);\n setRecordSecs(sec);\n if (sec >= VOICE_MAX_SECONDS) finishRecording();\n }, 250);\n return () => window.clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder]);\n\n if (!isOpen) return null;\n\n // ── Capture ───────────────────────────────────────────────────────────\n async function runCapture(mode: ScreenshotCaptureMode): Promise<boolean> {\n captureCancelledRef.current = false;\n setPhase({ kind: \"capturing\" });\n try {\n const result = await captureScreen({\n ...capture,\n mode,\n target: capture?.target ?? document.documentElement,\n });\n if (captureCancelledRef.current) return false;\n showCaptureWarnings(result);\n setPhase({ kind: \"ready\", capture: result });\n return true;\n } catch (e) {\n if (captureCancelledRef.current) return false;\n setPhase({\n kind: \"manual\",\n error:\n e instanceof Error\n ? e.message\n : \"Automatic screenshot capture was unavailable.\",\n });\n return false;\n }\n }\n\n async function selectMethod(m: CaptureMethod) {\n setMethod(m);\n // A fresh capture invalidates any previously-flattened annotation.\n setFlattenedShot(null);\n if (m !== \"video\") discardVideo();\n if (m === \"shot\") {\n await runCapture(capture?.mode ?? \"auto\");\n } else if (m === \"screen\") {\n await runCapture(\"true-screen\");\n } else {\n // Video still needs a screenshot poster for the required `screenshot`\n // field. Grab a DOM shot first, then start recording.\n const ok = await runCapture(capture?.mode ?? \"auto\");\n if (ok) await startVideo();\n }\n }\n\n function acceptManualScreenshot(file: Blob) {\n if (!file.type.startsWith(\"image/\")) {\n toast.error(\"Choose a PNG, JPEG, or WebP screenshot.\");\n return;\n }\n const result = createManualCaptureResult(file, [\n \"Manual screenshot upload used.\",\n ]);\n setPhase({ kind: \"ready\", capture: result });\n }\n\n function showCaptureWarnings(result: CaptureResult) {\n if (result.warnings.length === 0) return;\n toast.warning(\n \"Screenshot captured, but iframe, video, canvas, or cross-origin content may be incomplete.\",\n );\n }\n\n // ── Voice ─────────────────────────────────────────────────────────────\n async function startRecording() {\n try {\n const r = await recordAudio(VOICE_MAX_SECONDS);\n setRecorder(r);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Microphone unavailable\");\n }\n }\n async function finishRecording() {\n if (!recorder) return;\n try {\n const result = await recorder.stop();\n setAudio({ blob: result.blob, durationMs: result.durationMs });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not stop recording\");\n } finally {\n setRecorder(null);\n }\n }\n function discardRecording() {\n recorder?.cancel();\n setRecorder(null);\n setAudio(null);\n setRecordSecs(0);\n }\n\n // ── Screen recording ──────────────────────────────────────────────────\n async function startVideo() {\n try {\n const r = await recordVideo(VIDEO_MAX_SECONDS);\n setVideoRecorder(r);\n r.stream.getVideoTracks()[0]?.addEventListener(\"ended\", () => {\n void finishVideo();\n });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Screen capture unavailable\");\n }\n }\n async function finishVideo() {\n if (!videoRecorder) return;\n const handle = videoRecorder;\n setVideoRecorder(null);\n try {\n const result = await handle.stop();\n setVideo({ blob: result.blob, durationMs: result.durationMs });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not stop recording\");\n }\n }\n function discardVideo() {\n videoRecorder?.cancel();\n setVideoRecorder(null);\n setVideo(null);\n }\n\n // ── Navigation ────────────────────────────────────────────────────────\n const captured = phase.kind === \"ready\";\n async function goNext() {\n if (step === 1) {\n // Finalize a still-running recording before advancing so its blob is\n // ready by submit (awaited — not fire-and-forget).\n if (videoRecorder) await finishVideo();\n // Flatten the annotation now, while AnnotationLayer is still mounted.\n if (phase.kind === \"ready\") {\n const flat = await annotationRef.current?.flatten();\n setFlattenedShot(flat ?? phase.capture.blob);\n }\n setStep(2);\n } else if (step === 2) {\n setStep(3);\n } else {\n await submit();\n }\n }\n function goBack() {\n if (step > 1) setStep((s) => (s - 1) as Step);\n }\n\n async function submit() {\n if (phase.kind !== \"ready\") return;\n const trimmed = text.trim();\n const { capture: captureResult } = phase;\n setSubmitting(true);\n setProgress(0);\n try {\n // Use the annotation flattened when we left step 1; AnnotationLayer is\n // unmounted by now so we can't re-flatten here.\n const flatScreenshot = flattenedShot ?? captureResult.blob;\n const result = await client.submit(\n {\n rawText: trimmed.length > 0 ? trimmed : undefined,\n category,\n submitterEmail: submitterEmail.trim() || undefined,\n screenshot: flatScreenshot,\n audio: audio?.blob,\n audioDurationMs: audio?.durationMs,\n video: video?.blob,\n videoDurationMs: video?.durationMs,\n context: captureContext(captureResult),\n },\n {\n onUploadProgress: (fraction) => setProgress(Math.min(0.95, fraction)),\n },\n );\n setProgress(1);\n toast.success(\"Feedback sent — thank you.\");\n void result.id;\n closeCapture();\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not submit feedback\");\n setSubmitting(false);\n }\n }\n\n function onBackdropMouseDown(e: React.MouseEvent<HTMLDivElement>) {\n if (e.target === e.currentTarget && !submitting) closeCapture();\n }\n\n const uploadingPct = Math.round(progress * 100);\n const isVideoMethod = method === \"video\";\n const nextDisabled =\n (step === 1 && !captured) || submitting;\n const nextLabel =\n step < 3\n ? \"Next\"\n : submitting\n ? uploadingPct < 95\n ? `Uploading ${uploadingPct}%…`\n : \"Almost done…\"\n : \"Send feedback\";\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Send feedback\"\n className=\"lumen-modal-backdrop\"\n data-lumen-capture-ignore=\"true\"\n onMouseDown={onBackdropMouseDown}\n >\n <div\n ref={modalRef}\n className=\"lumen-modal\"\n data-lumen-drawing={drawing ? \"true\" : undefined}\n >\n <SheetGrabber onDismiss={closeCapture} />\n\n <header className=\"lumen-modal-header\">\n <h2 className=\"lumen-modal-title\">\n <span className=\"lumen-modal-title-dot\" aria-hidden=\"true\" />\n Send feedback\n </h2>\n <button\n type=\"button\"\n onClick={closeCapture}\n className=\"lumen-icon-btn\"\n aria-label=\"Close\"\n >\n ×\n </button>\n </header>\n\n <Stepper step={step} />\n\n <div className=\"lumen-modal-body\">\n {/* ── STEP 1 — Capture ── */}\n {step === 1 ? (\n <div className=\"lumen-pane\">\n <div\n className=\"lumen-method\"\n role=\"group\"\n aria-label=\"Capture method\"\n >\n {METHODS.map((m) => (\n <button\n key={m.value}\n type=\"button\"\n className=\"lumen-method-btn\"\n aria-pressed={method === m.value}\n onClick={() => selectMethod(m.value)}\n disabled={phase.kind === \"capturing\"}\n >\n <span className=\"lumen-method-label\">{m.label}</span>\n <span className=\"lumen-method-hint\">{m.hint}</span>\n </button>\n ))}\n </div>\n\n {phase.kind === \"idle\" ? (\n <div className=\"lumen-cap-empty\">\n <p>\n Pick a capture method above — nothing is captured until you\n choose, so take your time positioning the screen.\n </p>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => setPhase({ kind: \"manual\" })}\n >\n Or upload a screenshot\n </button>\n </div>\n ) : null}\n\n {phase.kind === \"capturing\" ? (\n <p className=\"lumen-status\">\n <span className=\"lumen-spinner\" aria-hidden=\"true\" />\n Capturing…\n </p>\n ) : null}\n\n {phase.kind === \"manual\" ? (\n <div className=\"lumen-manual-capture\">\n <p className=\"lumen-status\">\n {phase.error\n ? \"Automatic capture was unavailable. Upload or paste a screenshot to continue.\"\n : \"Upload or paste a screenshot to continue.\"}\n </p>\n <label className=\"lumen-manual-drop\">\n <span>Choose or paste a screenshot</span>\n <input\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp\"\n onChange={(e) => {\n const file = e.currentTarget.files?.[0];\n if (file) acceptManualScreenshot(file);\n e.currentTarget.value = \"\";\n }}\n />\n </label>\n </div>\n ) : null}\n\n {phase.kind === \"ready\" ? (\n <>\n {!isVideoMethod ? (\n <div className=\"lumen-toolbar\">\n <div\n className=\"lumen-segmented\"\n role=\"group\"\n aria-label=\"Annotation tool\"\n >\n <ToolButton\n label=\"Arrow\"\n active={tool === \"arrow\"}\n onClick={() => setTool(\"arrow\")}\n />\n <ToolButton\n label=\"Box\"\n active={tool === \"rect\"}\n onClick={() => setTool(\"rect\")}\n />\n <ToolButton\n label=\"Draw\"\n active={tool === \"freehand\"}\n onClick={() => setTool(\"freehand\")}\n />\n </div>\n <span className=\"lumen-toolbar-sep\" />\n <div\n className=\"lumen-swatches\"\n role=\"group\"\n aria-label=\"Color\"\n >\n {SWATCHES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n className=\"lumen-swatch\"\n style={{ background: s.value }}\n aria-label={s.label}\n aria-pressed={strokeColor === s.value}\n onClick={() => setStrokeColor(s.value)}\n />\n ))}\n </div>\n <div\n className=\"lumen-stroke-sizes\"\n role=\"group\"\n aria-label=\"Stroke width\"\n >\n {STROKE_SIZES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n className=\"lumen-stroke-size\"\n aria-label={s.label}\n aria-pressed={strokeWidth === s.value}\n onClick={() => setStrokeWidth(s.value)}\n >\n <span\n className=\"lumen-stroke-size-dot\"\n style={{ width: s.dot, height: s.dot }}\n />\n </button>\n ))}\n </div>\n <span className=\"lumen-toolbar-spacer\" />\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => annotationRef.current?.undo()}\n >\n Undo\n </button>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => annotationRef.current?.reset()}\n >\n Clear\n </button>\n </div>\n ) : null}\n\n <div className=\"lumen-annotate\">\n <AnnotationLayer\n ref={annotationRef}\n screenshot={phase.capture.blob}\n tool={tool}\n color={strokeColor}\n strokeWidth={strokeWidth}\n onDrawingChange={setDrawing}\n />\n </div>\n\n <div className=\"lumen-cap-actions\">\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => method && selectMethod(method)}\n >\n {isVideoMethod ? \"↻ Re-record\" : \"↻ Recapture\"}\n </button>\n {isVideoMethod ? (\n videoRecorder ? (\n <span className=\"lumen-recording\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n <span className=\"lumen-rec-time\">Recording…</span>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={finishVideo}\n >\n Stop\n </button>\n </span>\n ) : video ? (\n <span className=\"lumen-cap-note\">\n ✓ {Math.round(video.durationMs / 1000)}s recorded\n </span>\n ) : null\n ) : (\n <span className=\"lumen-cap-note\">\n {captureLabel(method)} captured · switch method above\n anytime\n </span>\n )}\n </div>\n </>\n ) : null}\n </div>\n ) : null}\n\n {/* ── STEP 2 — Describe ── */}\n {step === 2 ? (\n <div className=\"lumen-pane lumen-form\">\n <label className=\"lumen-label\">\n <span>What happened?</span>\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n rows={3}\n placeholder=\"Describe the issue or idea…\"\n className=\"lumen-input\"\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n </label>\n\n <div className=\"lumen-label\">\n <span>Add a voice note (optional)</span>\n <div className=\"lumen-audio-row\">\n {!recorder && !audio ? (\n <button\n type=\"button\"\n onClick={startRecording}\n className=\"lumen-btn-ghost\"\n >\n Record voice note\n </button>\n ) : null}\n {recorder ? (\n <>\n <span className=\"lumen-recording\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n <Waveform stream={recorder.stream} />\n <span className=\"lumen-rec-time\">\n {recordSecs}s / {VOICE_MAX_SECONDS}s\n </span>\n </span>\n <button\n type=\"button\"\n onClick={finishRecording}\n className=\"lumen-btn-ghost\"\n >\n Stop\n </button>\n <button\n type=\"button\"\n onClick={discardRecording}\n className=\"lumen-btn-ghost\"\n >\n Cancel\n </button>\n </>\n ) : null}\n {audio && !recorder ? (\n <>\n <AudioPreview\n blob={audio.blob}\n durationMs={audio.durationMs}\n />\n <button\n type=\"button\"\n onClick={() => setAudio(null)}\n className=\"lumen-btn-ghost\"\n >\n Remove\n </button>\n </>\n ) : null}\n </div>\n </div>\n\n <div className=\"lumen-label\">\n <span>Category</span>\n <div\n className=\"lumen-category\"\n role=\"group\"\n aria-label=\"Feedback category\"\n >\n {CATEGORIES.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n className=\"lumen-category-opt\"\n aria-pressed={category === c.value}\n onClick={() => setCategory(c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n </div>\n\n <label className=\"lumen-label\">\n <span>Your email (optional)</span>\n <input\n type=\"email\"\n value={submitterEmail}\n onChange={(e) => setSubmitterEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className=\"lumen-input\"\n />\n </label>\n </div>\n ) : null}\n\n {/* ── STEP 3 — Review ── */}\n {step === 3 ? (\n <div className=\"lumen-pane lumen-review\">\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Capture</span>\n <span className=\"lumen-review-v\">\n {captureLabel(method)}\n {!isVideoMethod ? \" · annotated\" : \"\"}\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(1)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Category</span>\n <span className=\"lumen-review-v\">\n <span className=\"lumen-chip\">\n {CATEGORIES.find((c) => c.value === category)?.label}\n </span>\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(2)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Description</span>\n <span className=\"lumen-review-v\">\n {text.trim() ? (\n text.trim()\n ) : (\n <span className=\"lumen-muted-empty\">—</span>\n )}\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(2)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Material</span>\n <span className=\"lumen-review-v lumen-attach-row\">\n {audio ? (\n <span className=\"lumen-attach\">\n 🎙 Voice {Math.round(audio.durationMs / 1000)}s\n <button\n type=\"button\"\n className=\"lumen-att-x\"\n aria-label=\"Remove voice note\"\n onClick={() => setAudio(null)}\n >\n ×\n </button>\n </span>\n ) : null}\n {video ? (\n <span className=\"lumen-attach\">\n ▶ Video {Math.round(video.durationMs / 1000)}s\n <button\n type=\"button\"\n className=\"lumen-att-x\"\n aria-label=\"Remove video\"\n onClick={discardVideo}\n >\n ×\n </button>\n </span>\n ) : null}\n {submitterEmail.trim() ? (\n <span className=\"lumen-attach\">✉ {submitterEmail.trim()}</span>\n ) : null}\n {!audio && !recorder ? (\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={() => {\n setStep(2);\n void startRecording();\n }}\n >\n + Voice note\n </button>\n ) : null}\n {videoRecorder ? (\n <>\n <span className=\"lumen-attach\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n Recording…\n </span>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={finishVideo}\n >\n Stop\n </button>\n </>\n ) : !video ? (\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={startVideo}\n >\n + Screen recording\n </button>\n ) : null}\n </span>\n </div>\n </div>\n ) : null}\n </div>\n\n <footer className=\"lumen-modal-footer\">\n {submitting ? (\n <div\n className=\"lumen-progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={uploadingPct}\n >\n <div\n className=\"lumen-progress-fill\"\n style={{ width: `${uploadingPct}%` }}\n />\n </div>\n ) : null}\n <div className=\"lumen-modal-actions\">\n <button\n type=\"button\"\n onClick={step === 1 ? closeCapture : goBack}\n className=\"lumen-btn-ghost\"\n disabled={submitting}\n >\n {step === 1 ? \"Cancel\" : \"Back\"}\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n className=\"lumen-btn-primary\"\n disabled={nextDisabled}\n >\n {nextLabel}\n </button>\n </div>\n </footer>\n </div>\n </div>\n );\n}\n\nfunction captureLabel(method: CaptureMethod | null): string {\n if (method === \"video\") return \"Screen recording\";\n if (method === \"screen\") return \"Screen capture\";\n return \"Screenshot\";\n}\n\nfunction Stepper({ step }: { step: Step }) {\n const steps = [\n { n: 1, label: \"Capture\" },\n { n: 2, label: \"Describe\" },\n { n: 3, label: \"Review\" },\n ] as const;\n return (\n <div className=\"lumen-stepper\" aria-hidden=\"true\">\n {steps.map((s, i) => (\n <div\n key={s.n}\n className={\n \"lumen-step\" +\n (step === s.n ? \" lumen-step-active\" : \"\") +\n (step > s.n ? \" lumen-step-done\" : \"\")\n }\n >\n <span className=\"lumen-step-num\">{s.n}</span>\n <span className=\"lumen-step-lbl\">{s.label}</span>\n {i < steps.length - 1 ? <span className=\"lumen-step-bar\" /> : null}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ToolButton({\n label,\n active,\n onClick,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"lumen-tool\"\n aria-pressed={active}\n >\n {label}\n </button>\n );\n}\n\n/** Mobile sheet drag-to-dismiss handle. Hidden on ≥ 640px via CSS. */\nfunction SheetGrabber({ onDismiss }: { onDismiss: () => void }) {\n const startYRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n const targetRef = useRef<HTMLElement | null>(null);\n\n function onPointerDown(e: React.PointerEvent<HTMLDivElement>) {\n e.currentTarget.setPointerCapture(e.pointerId);\n startYRef.current = e.clientY;\n startTimeRef.current = performance.now();\n targetRef.current = e.currentTarget.parentElement;\n }\n function onPointerMove(e: React.PointerEvent<HTMLDivElement>) {\n if (startYRef.current == null || !targetRef.current) return;\n const dy = Math.max(0, e.clientY - startYRef.current);\n targetRef.current.style.transform = `translateY(${dy}px)`;\n }\n function onPointerUp(e: React.PointerEvent<HTMLDivElement>) {\n if (startYRef.current == null || !targetRef.current) return;\n const dy = Math.max(0, e.clientY - startYRef.current);\n const dt = Math.max(1, performance.now() - startTimeRef.current);\n const velocity = dy / dt;\n targetRef.current.style.transform = \"\";\n targetRef.current.style.transition = \"\";\n startYRef.current = null;\n if (dy > 80 || velocity > 0.6) onDismiss();\n }\n\n return (\n <div\n className=\"lumen-modal-grabber\"\n aria-hidden=\"true\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n />\n );\n}\n\n/** Live mic level visualisation. Reads time-domain samples from the\n * recorder stream and renders a centred series of rounded bars that\n * ease toward each new amplitude. AudioContext + AnalyserNode are torn\n * down on unmount so the mic isn't held open by a stale graph. */\nfunction Waveform({ stream }: { stream: MediaStream }) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n const cssWidth = canvas.clientWidth || 88;\n const cssHeight = canvas.clientHeight || 22;\n canvas.width = Math.round(cssWidth * dpr);\n canvas.height = Math.round(cssHeight * dpr);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.scale(dpr, dpr);\n\n const AudioCtor: typeof AudioContext | undefined =\n window.AudioContext ??\n (window as unknown as { webkitAudioContext?: typeof AudioContext })\n .webkitAudioContext;\n if (!AudioCtor) return;\n const audioCtx = new AudioCtor();\n const source = audioCtx.createMediaStreamSource(stream);\n const analyser = audioCtx.createAnalyser();\n analyser.fftSize = 1024;\n analyser.smoothingTimeConstant = 0.6;\n source.connect(analyser);\n const data = new Uint8Array(analyser.fftSize);\n\n const BARS = 18;\n const GAP = 3;\n const MIN_H = 3;\n const barW = Math.max(2, (cssWidth - GAP * (BARS - 1)) / BARS);\n const radius = Math.min(barW / 2, 3);\n const levels = new Array<number>(BARS).fill(0);\n\n let raf = 0;\n let cancelled = false;\n function frame() {\n if (cancelled) return;\n analyser.getByteTimeDomainData(data);\n const bucketSize = Math.floor(data.length / BARS);\n ctx!.clearRect(0, 0, cssWidth, cssHeight);\n ctx!.fillStyle = getCssVar(\"--lumen-danger\") || \"rgb(239,68,68)\";\n for (let i = 0; i < BARS; i++) {\n let peak = 0;\n for (let j = 0; j < bucketSize; j++) {\n const v = Math.abs((data[i * bucketSize + j] ?? 128) - 128);\n if (v > peak) peak = v;\n }\n const target = Math.min(1, (peak / 128) * 1.8);\n const cur = levels[i] ?? 0;\n levels[i] = target > cur ? target : cur + (target - cur) * 0.35;\n const h = Math.max(MIN_H, levels[i]! * cssHeight);\n const x = i * (barW + GAP);\n const y = (cssHeight - h) / 2;\n roundRectPath(ctx!, x, y, barW, h, radius);\n ctx!.fill();\n }\n raf = requestAnimationFrame(frame);\n }\n raf = requestAnimationFrame(frame);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(raf);\n try {\n source.disconnect();\n } catch {\n /* ignore */\n }\n void audioCtx.close();\n };\n }, [stream]);\n\n return <canvas ref={canvasRef} className=\"lumen-waveform\" aria-hidden=\"true\" />;\n}\n\n/** Trace a rounded-rect path. Uses native `roundRect` when present and\n * falls back to manual arcs for older Safari/Firefox. */\nfunction roundRectPath(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): void {\n const radius = Math.min(r, w / 2, h / 2);\n ctx.beginPath();\n const anyCtx = ctx as CanvasRenderingContext2D & {\n roundRect?: (x: number, y: number, w: number, h: number, r: number) => void;\n };\n if (typeof anyCtx.roundRect === \"function\") {\n anyCtx.roundRect(x, y, w, h, radius);\n return;\n }\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n}\n\n/** Preview the recorded clip with a native <audio> element. ObjectURL is\n * revoked on unmount/swap to avoid leaking the blob into memory. */\nfunction AudioPreview({ blob, durationMs }: { blob: Blob; durationMs: number }) {\n const [url, setUrl] = useState<string>(\"\");\n useEffect(() => {\n const u = URL.createObjectURL(blob);\n setUrl(u);\n return () => {\n URL.revokeObjectURL(u);\n };\n }, [blob]);\n return (\n <div className=\"lumen-audio-preview\">\n <audio controls preload=\"metadata\" src={url} className=\"lumen-audio-el\" />\n <span className=\"lumen-audio-meta\">{Math.round(durationMs / 1000)}s</span>\n </div>\n );\n}\n\nfunction getCssVar(name: string): string {\n if (typeof window === \"undefined\") return \"\";\n return getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n}\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction getFocusable(root: HTMLElement): HTMLElement[] {\n return Array.from(\n root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((el) => !el.hasAttribute(\"disabled\") && el.offsetParent !== null);\n}\n","/**\n * Heuristic floor detector. Returns the height (px) of the tallest\n * full-width fixed element anchored near the bottom of the viewport\n * (e.g. a tab bar). 0 if nothing matches.\n *\n * Cheap by design: probes `elementsFromPoint` at three x positions,\n * walks up parents, dedupes. O(small constant) — the spec's literal\n * `querySelectorAll('*')` would be O(DOM) per measurement.\n */\nexport function detectBottomFloor(): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const w = window.innerWidth;\n const h = window.innerHeight;\n if (w === 0 || h === 0) return 0;\n\n const probeY = h - 4;\n const probeXs = [Math.round(w * 0.1), Math.round(w * 0.5), Math.round(w * 0.9)];\n const seen = new Set<Element>();\n let tallest = 0;\n\n for (const x of probeXs) {\n const stack = document.elementsFromPoint(x, probeY);\n for (const el of stack) {\n if (seen.has(el)) continue;\n seen.add(el);\n const cs = window.getComputedStyle(el);\n if (cs.position !== \"fixed\" && cs.position !== \"sticky\") continue;\n const rect = el.getBoundingClientRect();\n // Anchored at bottom: rect.bottom is within ~8px of viewport bottom.\n if (rect.bottom < h - 8) continue;\n if (rect.bottom > h + 8) continue;\n // Full-width-ish: at least 60% of the viewport.\n if (rect.width < w * 0.6) continue;\n if (rect.height > tallest) tallest = rect.height;\n }\n }\n return tallest;\n}\n\n/**\n * Measure the bottom-overlap of every node matching the given selectors.\n * Returns the tallest overlap.\n */\nexport function measureExplicitAvoid(selectors: string[]): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const h = window.innerHeight;\n let tallest = 0;\n for (const selector of selectors) {\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n continue;\n }\n for (const node of Array.from(nodes)) {\n const rect = node.getBoundingClientRect();\n if (rect.height === 0 || rect.width === 0) continue;\n // Bottom-overlap = how far the node extends above the bottom edge,\n // assuming it's anchored to the bottom (rect.bottom near h).\n if (rect.bottom < h - 8) continue;\n const overlap = Math.max(0, h - rect.top);\n if (overlap > tallest) tallest = overlap;\n }\n }\n return tallest;\n}\n\n/**\n * Same idea as measureExplicitAvoid but for any of the four edges.\n * Returns inset to add for the given side.\n */\nexport function measureExplicitAvoidForSide(\n selectors: string[],\n side: \"top\" | \"bottom\" | \"left\" | \"right\",\n): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const w = window.innerWidth;\n const h = window.innerHeight;\n let tallest = 0;\n for (const selector of selectors) {\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n continue;\n }\n for (const node of Array.from(nodes)) {\n const rect = node.getBoundingClientRect();\n if (rect.height === 0 || rect.width === 0) continue;\n let overlap = 0;\n switch (side) {\n case \"bottom\":\n if (rect.bottom < h - 8) break;\n overlap = Math.max(0, h - rect.top);\n break;\n case \"top\":\n if (rect.top > 8) break;\n overlap = Math.max(0, rect.bottom);\n break;\n case \"left\":\n if (rect.left > 8) break;\n overlap = Math.max(0, rect.right);\n break;\n case \"right\":\n if (rect.right < w - 8) break;\n overlap = Math.max(0, w - rect.left);\n break;\n }\n if (overlap > tallest) tallest = overlap;\n }\n }\n return tallest;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport {\n detectBottomFloor,\n measureExplicitAvoidForSide,\n} from \"./autoDetectAvoid\";\nimport type { ResolvedFloatingConfig } from \"./types\";\n\nexport interface CollisionInsets {\n bottom: number;\n right: number;\n left: number;\n top: number;\n}\n\n/**\n * Computes the inset (px, before safe-area) the floating trigger needs\n * for its anchored corner. Subscribes to:\n * - ResizeObserver on documentElement\n * - MutationObserver on document.body (childList/attributes)\n * - visualViewport resize/scroll\n *\n * All callbacks coalesce into a single rAF measure to avoid feedback\n * loops where our CSS-var write triggers the next observer fire.\n */\nexport function useCollisionInsets(\n config: ResolvedFloatingConfig,\n): CollisionInsets {\n const [insets, setInsets] = useState<CollisionInsets>(() => ({\n bottom: config.offset.y,\n right: config.offset.x,\n left: config.offset.x,\n top: config.offset.y,\n }));\n\n // Hold the latest insets in a ref so the rAF body can compare without\n // capturing stale state.\n const lastRef = useRef(insets);\n\n // Stable identifier for the avoid array so the effect doesn't re-run\n // every render when callers pass an inline array.\n const avoidKey = avoidToKey(config.avoid);\n const placement = config.placement;\n const offsetX = config.offset.x;\n const offsetY = config.offset.y;\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let raf = 0;\n let cancelled = false;\n\n const measure = () => {\n raf = 0;\n if (cancelled) return;\n\n const side = placement[0] === \"b\" ? \"bottom\" : \"top\";\n const xSide = placement[1] === \"r\" ? \"right\" : \"left\";\n\n let yExtra = 0;\n let xExtra = 0;\n if (config.avoid === \"auto\" && side === \"bottom\") {\n yExtra = detectBottomFloor();\n } else if (Array.isArray(config.avoid)) {\n yExtra = measureExplicitAvoidForSide(config.avoid, side);\n xExtra = measureExplicitAvoidForSide(config.avoid, xSide);\n }\n\n const next: CollisionInsets = {\n bottom: side === \"bottom\" ? offsetY + yExtra : 0,\n top: side === \"top\" ? offsetY + yExtra : 0,\n right: xSide === \"right\" ? offsetX + xExtra : 0,\n left: xSide === \"left\" ? offsetX + xExtra : 0,\n };\n const prev = lastRef.current;\n if (\n next.bottom !== prev.bottom ||\n next.top !== prev.top ||\n next.right !== prev.right ||\n next.left !== prev.left\n ) {\n lastRef.current = next;\n setInsets(next);\n }\n };\n\n const schedule = () => {\n if (raf) return;\n raf = window.requestAnimationFrame(measure);\n };\n\n schedule();\n\n const ro =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(schedule)\n : null;\n ro?.observe(document.documentElement);\n\n const mo =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(schedule)\n : null;\n mo?.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"hidden\"],\n });\n\n window.addEventListener(\"resize\", schedule);\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", schedule);\n vv?.addEventListener(\"scroll\", schedule);\n\n return () => {\n cancelled = true;\n if (raf) window.cancelAnimationFrame(raf);\n ro?.disconnect();\n mo?.disconnect();\n window.removeEventListener(\"resize\", schedule);\n vv?.removeEventListener(\"resize\", schedule);\n vv?.removeEventListener(\"scroll\", schedule);\n };\n // `config.avoid` is captured via avoidKey; safe to ignore in deps.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [placement, offsetX, offsetY, avoidKey]);\n\n return insets;\n}\n\nfunction avoidToKey(avoid: string[] | false | \"auto\"): string {\n if (avoid === false) return \"false\";\n if (avoid === \"auto\") return \"auto\";\n return avoid.join(\"|\");\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * True when the on-screen keyboard is likely visible (visualViewport has\n * shrunk by >100px). Touch devices only — desktop never returns true.\n */\nexport function useViewportKeyboard(enabled: boolean): boolean {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n if (!enabled) {\n setOpen(false);\n return;\n }\n if (typeof window === \"undefined\") return;\n const vv = window.visualViewport;\n if (!vv) return;\n if (\n typeof window.matchMedia !== \"function\" ||\n !window.matchMedia(\"(pointer: coarse)\").matches\n ) {\n return;\n }\n\n const KEYBOARD_THRESHOLD = 100;\n let raf = 0;\n const check = () => {\n raf = 0;\n const shrink = window.innerHeight - vv.height;\n setOpen(shrink > KEYBOARD_THRESHOLD);\n };\n const schedule = () => {\n if (raf) return;\n raf = window.requestAnimationFrame(check);\n };\n\n schedule();\n vv.addEventListener(\"resize\", schedule);\n vv.addEventListener(\"scroll\", schedule);\n return () => {\n if (raf) window.cancelAnimationFrame(raf);\n vv.removeEventListener(\"resize\", schedule);\n vv.removeEventListener(\"scroll\", schedule);\n };\n }, [enabled]);\n\n return open;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport * as React from \"react\";\n\nimport { useCollisionInsets } from \"./useCollisionInsets\";\nimport { useViewportKeyboard } from \"./useViewportKeyboard\";\nimport type { ResolvedFloatingConfig } from \"./types\";\n\nexport interface FloatingTriggerProps {\n config: ResolvedFloatingConfig;\n portalTarget?: HTMLElement;\n hidden: boolean;\n onClick: () => void;\n}\n\nexport function FloatingTrigger({\n config,\n portalTarget,\n hidden,\n onClick,\n}: FloatingTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const insets = useCollisionInsets(config);\n const keyboardOpen = useViewportKeyboard(config.hideOnKeyboard);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setTarget(portalTarget ?? document.body);\n }, [portalTarget]);\n\n useOcclusionWarning(buttonRef, !hidden && !keyboardOpen);\n\n if (!target) return null;\n\n const placement = config.placement;\n const sideY = placement[0] === \"b\" ? \"bottom\" : \"top\";\n const sideX = placement[1] === \"r\" ? \"right\" : \"left\";\n\n const yPx = sideY === \"bottom\" ? insets.bottom : insets.top;\n const xPx = sideX === \"right\" ? insets.right : insets.left;\n\n const style: React.CSSProperties = {\n position: \"fixed\",\n [sideY]: config.safeArea\n ? `calc(${yPx}px + env(safe-area-inset-${sideY}, 0px))`\n : `${yPx}px`,\n [sideX]: config.safeArea\n ? `calc(${xPx}px + env(safe-area-inset-${sideX}, 0px))`\n : `${xPx}px`,\n zIndex: config.zIndex,\n opacity: hidden || keyboardOpen ? 0 : 1,\n pointerEvents: hidden || keyboardOpen ? \"none\" : \"auto\",\n transition: \"opacity 160ms ease\",\n };\n\n return createPortal(\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"lumen-btn lumen-btn-primary lumen-btn-floating\"\n style={style}\n aria-label={config.label}\n aria-hidden={hidden || keyboardOpen ? true : undefined}\n tabIndex={hidden || keyboardOpen ? -1 : 0}\n onClick={onClick}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n {config.icon}\n <span>{config.label}</span>\n </button>,\n target,\n );\n}\n\n/**\n * Dev-only: after the first stable measurement, sample the trigger's\n * center point and warn once if a higher-z-index element overlaps it.\n */\nfunction useOcclusionWarning(\n ref: React.RefObject<HTMLButtonElement | null>,\n active: boolean,\n) {\n const warnedRef = useRef(false);\n\n useEffect(() => {\n if (process.env.NODE_ENV === \"production\") return;\n if (!active) return;\n if (warnedRef.current) return;\n if (typeof window === \"undefined\") return;\n\n const t = window.setTimeout(() => {\n const el = ref.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const stack = document.elementsFromPoint(cx, cy);\n const ourZ = parseZ(window.getComputedStyle(el).zIndex);\n for (const candidate of stack) {\n if (candidate === el || el.contains(candidate)) continue;\n const cz = parseZ(window.getComputedStyle(candidate).zIndex);\n if (cz > ourZ) {\n warnedRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\"[lumen] trigger is occluded by\", candidate);\n break;\n }\n }\n }, 250);\n return () => window.clearTimeout(t);\n }, [active, ref]);\n}\n\nfunction parseZ(z: string): number {\n const n = parseInt(z, 10);\n return Number.isNaN(n) ? 0 : n;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { ReactNode, RefObject } from \"react\";\n\nexport interface InlineTriggerProps {\n mount: HTMLElement | RefObject<HTMLElement | null>;\n label: string;\n icon?: ReactNode;\n onClick: () => void;\n}\n\nexport function InlineTrigger({\n mount,\n label,\n icon,\n onClick,\n}: InlineTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const el =\n mount instanceof HTMLElement ? mount : (mount.current ?? null);\n setTarget(el);\n }, [mount]);\n\n if (!target) return null;\n\n return createPortal(\n <button\n type=\"button\"\n className=\"lumen-btn lumen-btn-primary\"\n onClick={onClick}\n aria-label={label}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n {icon}\n <span>{label}</span>\n </button>,\n target,\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { ResolvedNotchConfig } from \"./types\";\n\nexport interface NotchTriggerProps {\n config: ResolvedNotchConfig;\n portalTarget?: HTMLElement;\n hidden: boolean;\n onClick: () => void;\n}\n\n/**\n * Edge-anchored notch. The resting state is a small tab on a screen\n * edge; on hover/tap it expands and opens the capture modal. A short\n * drag away from the edge (>16px) also opens, mimicking the iOS\n * Dynamic-Island pull gesture.\n *\n * Top edge → drag down. Right edge → drag left. Etc.\n */\nexport function NotchTrigger({\n config,\n portalTarget,\n hidden,\n onClick,\n}: NotchTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const [expanded, setExpanded] = useState(false);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setTarget(portalTarget ?? document.body);\n }, [portalTarget]);\n\n if (!target) return null;\n\n const className = `lumen-notch lumen-notch-${config.edge}${\n expanded ? \" lumen-notch-expanded\" : \"\"\n }`;\n\n function onPointerDown(e: React.PointerEvent<HTMLButtonElement>) {\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n setExpanded(true);\n e.currentTarget.setPointerCapture(e.pointerId);\n }\n function onPointerMove(e: React.PointerEvent<HTMLButtonElement>) {\n const start = dragStartRef.current;\n if (!start) return;\n const dx = e.clientX - start.x;\n const dy = e.clientY - start.y;\n const triggered =\n (config.edge === \"top\" && dy > 16) ||\n (config.edge === \"bottom\" && dy < -16) ||\n (config.edge === \"right\" && dx < -16) ||\n (config.edge === \"left\" && dx > 16);\n if (triggered) {\n dragStartRef.current = null;\n onClick();\n }\n }\n function onPointerUp() {\n dragStartRef.current = null;\n setExpanded(false);\n }\n function onPointerCancel() {\n dragStartRef.current = null;\n setExpanded(false);\n }\n\n return createPortal(\n <button\n type=\"button\"\n className={className}\n style={{\n zIndex: config.zIndex,\n opacity: hidden ? 0 : 1,\n pointerEvents: hidden ? \"none\" : \"auto\",\n }}\n aria-label={config.label}\n aria-hidden={hidden ? true : undefined}\n tabIndex={hidden ? -1 : 0}\n onClick={onClick}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n onMouseEnter={() => setExpanded(true)}\n onMouseLeave={() => setExpanded(false)}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n <span className=\"lumen-notch-handle\" aria-hidden=\"true\" />\n <span className=\"lumen-notch-label\">{config.icon}{config.label}</span>\n </button>,\n target,\n );\n}\n","import type { ReactNode, RefObject } from \"react\";\n\nexport type LumenTriggerPlacement = \"br\" | \"bl\" | \"tr\" | \"tl\";\n\nexport interface FloatingTriggerConfig {\n kind: \"floating\";\n placement?: LumenTriggerPlacement;\n offset?: { x?: number; y?: number };\n safeArea?: boolean;\n /** Selectors to clear; pass `false` to disable auto-detect entirely. */\n avoid?: string | string[] | false;\n hideOnKeyboard?: boolean;\n zIndex?: number;\n label?: string;\n icon?: ReactNode;\n}\n\nexport type NotchEdge = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface NotchTriggerConfig {\n kind: \"notch\";\n edge?: NotchEdge;\n label?: string;\n icon?: ReactNode;\n /** z-index for the notch tab. Default 2147483600. */\n zIndex?: number;\n}\n\nexport interface ResolvedNotchConfig {\n kind: \"notch\";\n edge: NotchEdge;\n label: string;\n icon: ReactNode | undefined;\n zIndex: number;\n}\n\nexport function resolveNotchConfig(\n cfg: NotchTriggerConfig,\n): ResolvedNotchConfig {\n return {\n kind: \"notch\",\n edge: cfg.edge ?? \"top\",\n label: cfg.label ?? \"Feedback\",\n icon: cfg.icon,\n zIndex: cfg.zIndex ?? 2147483600,\n };\n}\n\nexport interface HeadlessTriggerConfig {\n kind: \"headless\";\n}\n\nexport interface InlineTriggerConfig {\n kind: \"inline\";\n mount: HTMLElement | RefObject<HTMLElement | null>;\n label?: string;\n icon?: ReactNode;\n}\n\nexport type LumenTrigger =\n | FloatingTriggerConfig\n | NotchTriggerConfig\n | HeadlessTriggerConfig\n | InlineTriggerConfig;\n\nexport type LumenTheme =\n | \"auto\"\n | \"light\"\n | \"dark\"\n | {\n background?: string;\n foreground?: string;\n accent?: string;\n radius?: string;\n };\n\nexport interface ResolvedFloatingConfig {\n kind: \"floating\";\n placement: LumenTriggerPlacement;\n offset: { x: number; y: number };\n safeArea: boolean;\n avoid: string[] | false | \"auto\";\n hideOnKeyboard: boolean;\n zIndex: number;\n label: string;\n icon: ReactNode | undefined;\n}\n\nexport function resolveFloatingConfig(\n cfg: FloatingTriggerConfig,\n): ResolvedFloatingConfig {\n return {\n kind: \"floating\",\n placement: cfg.placement ?? \"br\",\n offset: { x: cfg.offset?.x ?? 16, y: cfg.offset?.y ?? 16 },\n safeArea: cfg.safeArea ?? true,\n avoid:\n cfg.avoid === false\n ? false\n : cfg.avoid == null\n ? \"auto\"\n : Array.isArray(cfg.avoid)\n ? cfg.avoid\n : [cfg.avoid],\n hideOnKeyboard: cfg.hideOnKeyboard ?? true,\n zIndex: cfg.zIndex ?? 2147483600,\n label: cfg.label ?? \"Feedback\",\n icon: cfg.icon,\n };\n}\n","\"use client\";\n\nimport { useEffect, useId } from \"react\";\nimport type { LumenTheme } from \"./types\";\n\nconst VAR_MAP: Record<string, keyof Extract<LumenTheme, object>> = {\n \"--lumen-bg\": \"background\",\n \"--lumen-fg\": \"foreground\",\n \"--lumen-primary\": \"accent\",\n \"--lumen-radius\": \"radius\",\n};\n\n/**\n * Applies the theme by writing CSS variables to <html> (so they reach\n * the portaled CaptureModal) and toggling a data attribute for explicit\n * light/dark. Cleanup restores prior values on unmount.\n *\n * The instance id scopes attribute cleanup so two providers don't\n * stomp each other.\n */\nexport function useApplyTheme(theme: LumenTheme | undefined): void {\n const instanceId = useId();\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const attr = `data-lumen-theme-${slug(instanceId)}`;\n const previous: Record<string, string | null> = {};\n\n if (theme === \"auto\" || theme == null) {\n // Default: rely on prefers-color-scheme already in styles.css.\n root.removeAttribute(\"data-lumen-theme\");\n } else if (theme === \"light\" || theme === \"dark\") {\n previous[\"data-lumen-theme\"] = root.getAttribute(\"data-lumen-theme\");\n root.setAttribute(\"data-lumen-theme\", theme);\n } else {\n for (const [cssVar, key] of Object.entries(VAR_MAP)) {\n const v = theme[key as keyof typeof theme];\n if (typeof v === \"string\" && v.length > 0) {\n previous[cssVar] = root.style.getPropertyValue(cssVar) || null;\n root.style.setProperty(cssVar, v);\n }\n }\n }\n root.setAttribute(attr, \"\");\n\n return () => {\n root.removeAttribute(attr);\n for (const [k, v] of Object.entries(previous)) {\n if (k.startsWith(\"--\")) {\n if (v) root.style.setProperty(k, v);\n else root.style.removeProperty(k);\n } else if (v == null) {\n root.removeAttribute(k);\n } else {\n root.setAttribute(k, v);\n }\n }\n };\n }, [theme, instanceId]);\n}\n\nfunction slug(s: string): string {\n return s.replace(/[^a-zA-Z0-9]/g, \"\");\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst PATCH_FLAG = Symbol.for(\"lumen.history.patched\");\nconst EVENT_NAME = \"lumen:locationchange\";\n\ninterface PatchedWindow extends Window {\n [PATCH_FLAG]?: true;\n}\n\n/**\n * Idempotent global patch: monkey-patches pushState/replaceState exactly\n * once per window so any number of LumenProvider instances (and React\n * StrictMode double-mounts) can subscribe without stacking patches.\n */\nfunction ensureHistoryPatch(): void {\n if (typeof window === \"undefined\") return;\n const w = window as PatchedWindow;\n if (w[PATCH_FLAG]) return;\n w[PATCH_FLAG] = true;\n\n const dispatch = () => window.dispatchEvent(new Event(EVENT_NAME));\n\n const origPush = history.pushState;\n history.pushState = function (...args: Parameters<History[\"pushState\"]>) {\n const r = origPush.apply(this, args);\n dispatch();\n return r;\n };\n const origReplace = history.replaceState;\n history.replaceState = function (\n ...args: Parameters<History[\"replaceState\"]>\n ) {\n const r = origReplace.apply(this, args);\n dispatch();\n return r;\n };\n window.addEventListener(\"popstate\", dispatch);\n}\n\n/**\n * Returns true when `predicate(location)` returns true for the current\n * location. Re-evaluates on history changes.\n */\nexport function useHideOn(\n predicate: ((location: { pathname: string }) => boolean) | undefined,\n): boolean {\n const [hidden, setHidden] = useState(false);\n\n useEffect(() => {\n if (!predicate) {\n setHidden(false);\n return;\n }\n if (typeof window === \"undefined\") return;\n ensureHistoryPatch();\n\n const evaluate = () => {\n try {\n setHidden(!!predicate({ pathname: window.location.pathname }));\n } catch {\n setHidden(false);\n }\n };\n evaluate();\n window.addEventListener(EVENT_NAME, evaluate);\n window.addEventListener(\"popstate\", evaluate);\n return () => {\n window.removeEventListener(EVENT_NAME, evaluate);\n window.removeEventListener(\"popstate\", evaluate);\n };\n }, [predicate]);\n\n return hidden;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst NATIVE_UA_TOKENS = [\n \"wv\", // generic Android WebView\n \"Capacitor\",\n \"Cordova\",\n \"Expo\",\n \"FBAN\",\n \"FBAV\",\n \"Instagram\",\n \"Line/\",\n \"Twitter\",\n];\n\n/**\n * Best-effort detection of a native shell (RN WebView, Capacitor,\n * Cordova, social-app webviews). Reported via context so hosts can\n * branch their own UI; we never auto-hide based on it.\n */\nexport function useNativeShell(): boolean {\n const [native, setNative] = useState(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const w = window as unknown as Record<string, unknown>;\n if (w.ReactNativeWebView) {\n setNative(true);\n return;\n }\n const wk = w.webkit as { messageHandlers?: unknown } | undefined;\n if (wk && wk.messageHandlers) {\n setNative(true);\n return;\n }\n const ua = navigator.userAgent || \"\";\n if (NATIVE_UA_TOKENS.some((t) => ua.includes(t))) {\n setNative(true);\n }\n }, []);\n\n return native;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport type { LumenTrigger, NotchEdge, LumenTriggerPlacement } from \"./types\";\n\nconst STORAGE_PREFIX = \"lumen.config.v1.\";\nconst STORAGE_TTL_MS = 60 * 60 * 1000; // 1h\n\ninterface CachedEntry {\n fetchedAt: number;\n trigger: LumenTrigger;\n}\n\nexport interface RemoteConfigState {\n /** Trigger from the remote config; null while loading and no cache. */\n trigger: LumenTrigger | null;\n /** Whether the SDK should render any trigger at all. */\n enabled: boolean;\n /** True until either localStorage or the network has answered. */\n loading: boolean;\n}\n\n/**\n * Fetches `/api/v1/sdk/config?apiKey=…` and caches the result in\n * localStorage so the trigger can render instantly on subsequent loads.\n *\n * Returns immediately from the cache, then revalidates in the\n * background. Falls back to `null` (caller will use its built-in\n * default) on every error path so a flaky config endpoint can never\n * break the host page.\n */\nexport function useRemoteConfig(\n apiKey: string,\n apiUrl: string,\n): RemoteConfigState {\n const [state, setState] = useState<RemoteConfigState>(() => ({\n trigger: null,\n enabled: true,\n loading: true,\n }));\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const cached = readCache(apiKey);\n if (cached) {\n setState({\n trigger: cached.trigger,\n enabled: triggerEnabled(cached.trigger),\n loading: false,\n });\n }\n\n const controller = new AbortController();\n // Hard timeout: the SDK can't hold its loading state hostage to a\n // slow or hung /sdk/config endpoint. After 5s we abort and resolve\n // to a sensible default so the host page never sees a broken widget.\n const timeoutId = window.setTimeout(() => controller.abort(), 5000);\n const url = `${apiUrl.replace(/\\/$/, \"\")}/api/v1/sdk/config?apiKey=${encodeURIComponent(apiKey)}`;\n fetch(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n signal: controller.signal,\n })\n .then(async (res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const body = (await res.json()) as { trigger?: unknown };\n const trigger = parseTrigger(body.trigger);\n if (!trigger) throw new Error(\"Malformed config response\");\n writeCache(apiKey, trigger);\n setState({\n trigger,\n enabled: triggerEnabled(trigger),\n loading: false,\n });\n })\n .catch(() => {\n // Network/parse errors fall through to defaults — never block.\n setState((prev) =>\n prev.loading\n ? { trigger: null, enabled: true, loading: false }\n : prev,\n );\n })\n .finally(() => window.clearTimeout(timeoutId));\n\n return () => {\n window.clearTimeout(timeoutId);\n controller.abort();\n };\n }, [apiKey, apiUrl]);\n\n return state;\n}\n\nfunction triggerEnabled(t: LumenTrigger): boolean {\n // The SDK type doesn't carry `enabled` directly because hosts that\n // build a trigger inline would never need it; the *remote* type does\n // ship it as the on/off toggle and we encode that here as the\n // headless variant.\n return t.kind !== \"headless\";\n}\n\nconst VALID_PLACEMENTS: readonly LumenTriggerPlacement[] = [\n \"br\",\n \"bl\",\n \"tr\",\n \"tl\",\n];\nconst VALID_EDGES: readonly NotchEdge[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\n/**\n * Defensive parser for the remote config payload. Exported for tests;\n * the hook uses it internally. Returns null when the shape is bad so\n * the caller can fall back to defaults instead of rendering garbage.\n */\nexport function parseTrigger(raw: unknown): LumenTrigger | null {\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n\n // The dashboard ships `enabled` as the on/off toggle — when off,\n // collapse to a headless trigger so the SDK renders nothing.\n if (r.enabled === false) return { kind: \"headless\" };\n\n const label = typeof r.label === \"string\" ? r.label : \"Feedback\";\n\n if (r.kind === \"floating\") {\n const placement =\n VALID_PLACEMENTS.find((p) => p === r.placement) ?? \"br\";\n return { kind: \"floating\", placement, label };\n }\n if (r.kind === \"notch\") {\n const edge = VALID_EDGES.find((e) => e === r.edge) ?? \"top\";\n return { kind: \"notch\", edge, label };\n }\n return null;\n}\n\nfunction readCache(apiKey: string): CachedEntry | null {\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + apiKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as CachedEntry;\n if (\n typeof parsed?.fetchedAt !== \"number\" ||\n Date.now() - parsed.fetchedAt > STORAGE_TTL_MS\n ) {\n return null;\n }\n const trigger = parseTrigger(parsed.trigger);\n return trigger ? { fetchedAt: parsed.fetchedAt, trigger } : null;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(apiKey: string, trigger: LumenTrigger): void {\n try {\n window.localStorage.setItem(\n STORAGE_PREFIX + apiKey,\n JSON.stringify({ fetchedAt: Date.now(), trigger }),\n );\n } catch {\n // Quota / private mode — fail silent.\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport * as React from \"react\";\nimport {\n installRuntimeCapture,\n LumenClient,\n type AmplitudeIdentity,\n type LumenUser,\n type ScreenshotCaptureOptions,\n} from \"@lumen-stack/core\";\n\nimport { LumenContext, type LumenContextValue } from \"./context\";\nimport { CaptureModal } from \"./CaptureModal\";\nimport { FloatingTrigger } from \"./trigger/FloatingTrigger\";\nimport { InlineTrigger } from \"./trigger/InlineTrigger\";\nimport { NotchTrigger } from \"./trigger/NotchTrigger\";\nimport {\n resolveFloatingConfig,\n resolveNotchConfig,\n type LumenTheme,\n type LumenTrigger,\n} from \"./trigger/types\";\nimport { useApplyTheme } from \"./trigger/theme\";\nimport { useHideOn } from \"./trigger/useHideOn\";\nimport { useNativeShell } from \"./trigger/useNativeShell\";\nimport { useRemoteConfig } from \"./trigger/useRemoteConfig\";\n\nconst DEFAULT_API_URL = \"https://shakebugs.vercel.app\";\n\nexport interface LumenProviderProps {\n apiKey: string;\n /** Override the dashboard origin. Defaults to https://shakebugs.vercel.app. */\n apiUrl?: string;\n user?: LumenUser;\n /**\n * Amplitude analytics identity for the current user. When set and the\n * project has the Amplitude integration enabled, Lumen pulls this user's\n * recent event timeline at enrichment time so the AI triage understands\n * what they did before reporting. Pass what your Amplitude instance holds:\n * `amplitude={{ userId: amp.getUserId(), deviceId: amp.getDeviceId(), sessionId: String(amp.getSessionId()) }}`.\n */\n amplitude?: AmplitudeIdentity;\n /**\n * @deprecated Use `trigger` instead. `floatingButton={false}` is\n * equivalent to `trigger={{ kind: \"headless\" }}`.\n */\n floatingButton?: boolean;\n /**\n * Trigger configuration. When omitted the SDK fetches the dashboard's\n * widget config from `/api/v1/sdk/config` and renders that. Pass a\n * value here to override the dashboard config locally.\n */\n trigger?: LumenTrigger;\n /** Hide the trigger on certain routes. Modal stays open if already open. */\n hideOn?: (location: { pathname: string }) => boolean;\n theme?: LumenTheme;\n /** Where to portal the floating trigger. Defaults to document.body. */\n portalTarget?: HTMLElement;\n /** Screenshot capture behavior and optional native/custom provider. */\n capture?: ScreenshotCaptureOptions;\n children: React.ReactNode;\n}\n\nexport function LumenProvider({\n apiKey,\n apiUrl,\n user,\n amplitude,\n floatingButton = true,\n trigger,\n hideOn,\n theme,\n portalTarget,\n capture,\n children,\n}: LumenProviderProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isSubmitting] = useState(false);\n const [error] = useState<Error | null>(null);\n\n const client = useMemo(\n () => new LumenClient({ apiKey, apiUrl, user, amplitude }),\n [\n apiKey,\n apiUrl,\n user?.id,\n user?.email,\n user?.name,\n amplitude?.userId,\n amplitude?.deviceId,\n amplitude?.sessionId,\n ],\n );\n\n // Patches console + fetch + XHR on mount. Idempotent — safe under\n // Strict Mode double-invocation, and a no-op on the server.\n useEffect(() => {\n installRuntimeCapture({\n ignoreUrlPrefix: (apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\"),\n });\n }, [apiUrl]);\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const submit = useCallback(client.submit.bind(client), [client]);\n\n const isNativeShell = useNativeShell();\n const hideTrigger = useHideOn(hideOn);\n useApplyTheme(theme);\n\n // Remote config: only fetched when the host hasn't pinned a trigger.\n // Passing the same apiUrl the LumenClient resolves to keeps the two\n // calls in lockstep.\n const remote = useRemoteConfig(\n trigger ? \"\" : apiKey,\n apiUrl ?? DEFAULT_API_URL,\n );\n\n const value = useMemo<LumenContextValue>(\n () => ({\n client,\n user,\n isOpen,\n isSubmitting,\n error,\n open,\n close,\n openCapture: open,\n closeCapture: close,\n submit,\n isNativeShell,\n capture,\n }),\n [\n client,\n user,\n isOpen,\n isSubmitting,\n error,\n open,\n close,\n submit,\n isNativeShell,\n capture,\n ],\n );\n\n const effectiveTrigger = resolveEffectiveTrigger({\n explicit: trigger,\n remote: remote.trigger,\n remoteLoading: remote.loading,\n floatingButton,\n });\n\n return (\n <LumenContext.Provider value={value}>\n {children}\n {effectiveTrigger?.kind === \"floating\" ? (\n <FloatingTrigger\n config={resolveFloatingConfig(effectiveTrigger)}\n portalTarget={portalTarget}\n hidden={hideTrigger}\n onClick={open}\n />\n ) : null}\n {effectiveTrigger?.kind === \"notch\" ? (\n <NotchTrigger\n config={resolveNotchConfig(effectiveTrigger)}\n portalTarget={portalTarget}\n hidden={hideTrigger}\n onClick={open}\n />\n ) : null}\n {effectiveTrigger?.kind === \"inline\" ? (\n <InlineTrigger\n mount={effectiveTrigger.mount}\n label={effectiveTrigger.label ?? \"Feedback\"}\n icon={effectiveTrigger.icon}\n onClick={open}\n />\n ) : null}\n <CaptureModal />\n </LumenContext.Provider>\n );\n}\n\n/**\n * Trigger resolution precedence:\n * 1. Explicit `trigger` prop wins (host opt-out from remote).\n * 2. `floatingButton={false}` → headless (legacy escape hatch).\n * 3. Remote config from /api/v1/sdk/config.\n * 4. While remote is still loading without a cached value, render\n * nothing (avoids a flash of the default in the wrong place).\n * 5. If remote ultimately fails, fall back to the floating default\n * so the host always has *something*.\n */\nfunction resolveEffectiveTrigger(args: {\n explicit: LumenTrigger | undefined;\n remote: LumenTrigger | null;\n remoteLoading: boolean;\n floatingButton: boolean;\n}): LumenTrigger | null {\n if (args.explicit) return args.explicit;\n if (args.floatingButton === false) return { kind: \"headless\" };\n if (args.remote) return args.remote;\n if (args.remoteLoading) return null;\n return { kind: \"floating\" };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useLumen } from \"./context\";\n\nexport interface FeedbackButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"default\" | \"ghost\" | \"outline\";\n /** Render fixed in the bottom-right corner. */\n floating?: boolean;\n}\n\nexport function FeedbackButton({\n variant = \"default\",\n floating = false,\n className,\n children = \"Feedback\",\n onClick,\n ...rest\n}: FeedbackButtonProps) {\n const { openCapture } = useLumen();\n const cls = [\n \"lumen-btn\",\n variant === \"default\" ? \"lumen-btn-primary\" : null,\n variant === \"ghost\" ? \"lumen-btn-ghost\" : null,\n variant === \"outline\" ? \"lumen-btn-outline\" : null,\n floating ? \"lumen-btn-floating\" : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n type=\"button\"\n className={cls}\n onClick={(e) => {\n onClick?.(e);\n if (!e.defaultPrevented) openCapture();\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/errors.ts","../../core/src/client.ts","../../core/src/capture-screenshot.ts","../../core/src/capture-runtime.ts","../../core/src/capture-context.ts","../../core/src/record-audio.ts","../../core/src/record-video.ts","../src/context.ts","../src/AnnotationLayer.tsx","../src/CaptureModal.tsx","../src/trigger/autoDetectAvoid.ts","../src/trigger/useCollisionInsets.ts","../src/trigger/useViewportKeyboard.ts","../src/trigger/FloatingTrigger.tsx","../src/trigger/InlineTrigger.tsx","../src/trigger/NotchTrigger.tsx","../src/trigger/types.ts","../src/trigger/theme.ts","../src/trigger/useHideOn.ts","../src/trigger/useNativeShell.ts","../src/trigger/useRemoteConfig.ts","../src/LumenProvider.tsx","../src/FeedbackButton.tsx"],"names":["LumenError","message","code","status","LumenOriginError","LumenRateLimitError","retryAfter","LumenNetworkError","DEFAULT_API_URL","SUBMIT_PATH","RETRYABLE_STATUSES","LumenClient","config","payload","options","url","body","#buildFormData","lastError","attempt","wait","#sendOnce","e","fd","amplitude","context","screenshotFilename","resolve","reject","xhr","onUploadProgress","signal","onAbort","parseError","parsed","blob","ms","r","text","obj","DEFAULT_MAX_SCALE","MAX_SCREENSHOT_BYTES","captureScreen","assertBrowser","mode","normalizeProviderResult","captureDisplayMedia","captureDom","domError","canUseDisplayMedia","result","uniq","createManualCaptureResult","warnings","viewport","currentViewport","html2canvas","loadHtml2Canvas","target","scale","collectDomWarnings","canvas","el","encodeCanvas","stream","video","waitForVideoFrame","ctx","track","normalized","crossOriginImages","img","src","canvasToBlob","working","ratio","next","quality","type","visual","done","fail","start","MAX_WAIT_MS","values","consoleBuf","networkBuf","installed","ignoreUrlPrefix","installRuntimeCapture","patchConsole","patchFetch","patchXhr","readRuntimeCapture","pushBounded","buf","entry","safeStringify","args","out","arg","replacer","joined","_key","value","levels","level","original","isIgnored","originalFetch","input","init","method","started","res","truncate","OriginalXHR","originalOpen","originalSend","rest","meta","onDone","s","captureContext","capture","toCaptureMetadata","runtime","snapshotDevice","device","recordAudio","maxSeconds","mimeType","m","recorder","chunks","timeoutId","release","durationMs","finalType","recordVideo","videoTrack","LumenContext","createContext","useLumen","useContext","AnnotationLayer","screenshot","tool","color","strokeWidth","onDrawingChange","ref","baseCanvasRef","useRef","overlayCanvasRef","containerRef","imageBitmap","setImageBitmap","useState","annotations","setAnnotations","draftRef","isDrawingRef","lastSampleAtRef","rafPendingRef","useEffect","cancelled","decoded","bm","base","overlay","redraw","useImperativeHandle","cur","draft","all","anno","drawAnno","clientToCanvas","c","rect","sx","sy","scheduleDraftPaint","onPointerDown","p","onPointerMove","last","dist2","now","elapsed","onPointerUp","dx","dy","jsxs","jsx","a","x","y","w","h","drawSmoothPath","from","to","width","angle","head","points","first","second","i","mx","my","VOICE_MAX_SECONDS","VIDEO_MAX_SECONDS","SWATCHES","STROKE_SIZES","CATEGORIES","METHODS","CaptureModal","client","isOpen","closeCapture","user","step","setStep","setMethod","phase","setPhase","submitting","setSubmitting","progress","setProgress","flattenedShot","setFlattenedShot","wasAnnotated","setWasAnnotated","setTool","strokeColor","setStrokeColor","setStrokeWidth","setText","category","setCategory","submitterEmail","setSubmitterEmail","setRecorder","audio","setAudio","recordSecs","setRecordSecs","videoRecorder","setVideoRecorder","setVideo","drawing","setDrawing","annotationRef","modalRef","previouslyFocusedRef","captureCancelledRef","html","prevOverflow","prevPaddingRight","scrollbar","restored","restore","onKey","root","focusables","getFocusable","active","onPaste","file","item","acceptManualScreenshot","id","sec","finishRecording","runCapture","showCaptureWarnings","selectMethod","discardVideo","startVideo","toast","j","startRecording","le","discardRecording","pe","finishVideo","handle","captured","goNext","flat","submit","goBack","trimmed","captureResult","flatScreenshot","T","fraction","onBackdropMouseDown","uploadingPct","isVideoMethod","nextDisabled","nextLabel","SheetGrabber","Stepper","Fragment","ToolButton","captureLabel","Waveform","AudioPreview","steps","label","onClick","onDismiss","startYRef","startTimeRef","targetRef","dt","velocity","canvasRef","dpr","cssWidth","cssHeight","AudioCtor","audioCtx","source","analyser","data","BARS","GAP","MIN_H","barW","radius","raf","frame","bucketSize","getCssVar","peak","v","roundRectPath","anyCtx","setUrl","u","name","FOCUSABLE_SELECTOR","detectBottomFloor","probeY","probeXs","seen","tallest","stack","cs","measureExplicitAvoidForSide","selectors","side","selector","nodes","node","overlap","useCollisionInsets","insets","setInsets","lastRef","avoidKey","avoidToKey","placement","offsetX","offsetY","measure","xSide","yExtra","xExtra","prev","schedule","ro","mo","vv","avoid","useViewportKeyboard","enabled","open","setOpen","KEYBOARD_THRESHOLD","check","shrink","FloatingTrigger","portalTarget","hidden","setTarget","buttonRef","keyboardOpen","useOcclusionWarning","sideY","sideX","yPx","xPx","style","createPortal","warnedRef","t","cx","cy","ourZ","parseZ","candidate","z","n","InlineTrigger","mount","icon","NotchTrigger","expanded","setExpanded","dragStartRef","className","onPointerCancel","resolveNotchConfig","cfg","resolveFloatingConfig","VAR_MAP","useApplyTheme","theme","instanceId","useId","attr","slug","previous","cssVar","key","k","PATCH_FLAG","EVENT_NAME","ensureHistoryPatch","dispatch","origPush","origReplace","useHideOn","predicate","setHidden","evaluate","NATIVE_UA_TOKENS","useNativeShell","native","setNative","wk","ua","STORAGE_PREFIX","STORAGE_TTL_MS","useRemoteConfig","apiKey","apiUrl","state","setState","cached","readCache","triggerEnabled","controller","trigger","parseTrigger","writeCache","VALID_PLACEMENTS","VALID_EDGES","raw","LumenProvider","floatingButton","hideOn","onOpenChange","children","setIsOpen","isSubmitting","error","useMemo","ee","onOpenChangeRef","prevIsOpenRef","useCallback","close","isNativeShell","hideTrigger","remote","effectiveTrigger","resolveEffectiveTrigger","FeedbackButton","variant","floating","openCapture","cls"],"mappings":"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","file":"index.cjs","sourcesContent":["export class LumenError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly status?: number,\n ) {\n super(message);\n this.name = \"LumenError\";\n }\n}\n\nexport class LumenOriginError extends LumenError {\n constructor() {\n super(\n \"Origin not allowed. Add this origin in your Lumen project settings.\",\n \"ORIGIN_NOT_ALLOWED\",\n 403,\n );\n this.name = \"LumenOriginError\";\n }\n}\n\nexport class LumenRateLimitError extends LumenError {\n constructor(public readonly retryAfter: number) {\n super(\n `Rate limited — retry after ${retryAfter}s.`,\n \"RATE_LIMITED\",\n 429,\n );\n this.name = \"LumenRateLimitError\";\n }\n}\n\nexport class LumenNetworkError extends LumenError {\n constructor(message: string) {\n super(message, \"NETWORK_ERROR\");\n this.name = \"LumenNetworkError\";\n }\n}\n","import type {\n AmplitudeIdentity,\n LumenClientConfig,\n LumenUser,\n SubmitOptions,\n SubmitPayload,\n SubmitResult,\n} from \"./types\";\nimport {\n LumenError,\n LumenNetworkError,\n LumenOriginError,\n LumenRateLimitError,\n} from \"./errors\";\n\nconst DEFAULT_API_URL = \"https://shakebugs.vercel.app\";\nconst SUBMIT_PATH = \"/api/v1/sdk/submit\";\n\nconst RETRYABLE_STATUSES = new Set([502, 503, 504]);\n\nexport class LumenClient {\n readonly apiKey: string;\n readonly apiUrl: string;\n user: LumenUser | undefined;\n amplitude: AmplitudeIdentity | undefined;\n\n constructor(config: LumenClientConfig) {\n if (!config.apiKey || !config.apiKey.startsWith(\"lk_pub_\")) {\n throw new LumenError(\n \"Invalid Lumen apiKey — expected a key starting with `lk_pub_`.\",\n \"INVALID_API_KEY\",\n );\n }\n this.apiKey = config.apiKey;\n this.apiUrl = (config.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n this.user = config.user;\n this.amplitude = config.amplitude;\n }\n\n /**\n * Submit a feedback payload. Uses XHR (not fetch) so we can surface\n * upload-progress events to the UI. Retries up to 2 times on 5xx /\n * network errors with exponential backoff.\n */\n async submit(\n payload: SubmitPayload,\n options: SubmitOptions = {},\n ): Promise<SubmitResult> {\n const url = `${this.apiUrl}${SUBMIT_PATH}`;\n const body = this.#buildFormData(payload);\n\n let lastError: unknown = null;\n for (let attempt = 0; attempt < 3; attempt++) {\n if (attempt > 0) {\n await wait(2 ** attempt * 250);\n }\n try {\n return await this.#sendOnce(url, body, options);\n } catch (e) {\n lastError = e;\n // Don't retry deterministic client errors.\n if (\n e instanceof LumenOriginError ||\n e instanceof LumenRateLimitError\n ) {\n throw e;\n }\n if (\n e instanceof LumenError &&\n typeof e.status === \"number\" &&\n !RETRYABLE_STATUSES.has(e.status)\n ) {\n throw e;\n }\n }\n }\n if (lastError instanceof Error) throw lastError;\n throw new LumenNetworkError(\"Submit failed after 3 attempts.\");\n }\n\n #buildFormData(payload: SubmitPayload): FormData {\n const fd = new FormData();\n if (payload.rawText) fd.append(\"rawText\", payload.rawText);\n if (payload.category) fd.append(\"category\", payload.category);\n if (payload.submitterEmail) fd.append(\"submitterEmail\", payload.submitterEmail);\n if (payload.submitterFingerprint) {\n fd.append(\"submitterFingerprint\", payload.submitterFingerprint);\n }\n // Inject the configured Amplitude identity into the context channel\n // (unless the caller already set one on the payload). These are\n // analytics ids, not PII — the server reads them to pull the user's\n // event timeline during enrichment.\n const amplitude = payload.context.amplitude ?? this.amplitude;\n const context = amplitude\n ? { ...payload.context, amplitude }\n : payload.context;\n fd.append(\"context\", JSON.stringify(context));\n if (payload.screenshot) {\n fd.append(\n \"screenshot\",\n payload.screenshot,\n screenshotFilename(payload.screenshot),\n );\n }\n if (payload.audio) {\n fd.append(\"audio\", payload.audio, \"audio\");\n }\n if (payload.audioDurationMs != null) {\n fd.append(\"audioDurationMs\", String(payload.audioDurationMs));\n }\n if (payload.video) {\n fd.append(\"video\", payload.video, \"video\");\n }\n if (payload.videoDurationMs != null) {\n fd.append(\"videoDurationMs\", String(payload.videoDurationMs));\n }\n // `user` (id/email/name) is intentionally NOT sent. The server has\n // never read these fields, so transmitting them just leaks PII over\n // the wire for no benefit. The `LumenUser` type stays in the public\n // API as a no-op until a future release adds an authenticated\n // identity flow that the server can actually trust.\n return fd;\n }\n\n #sendOnce(\n url: string,\n body: FormData,\n options: SubmitOptions,\n ): Promise<SubmitResult> {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest();\n xhr.open(\"POST\", url, true);\n xhr.setRequestHeader(\"X-Lumen-Api-Key\", this.apiKey);\n xhr.responseType = \"text\";\n\n const { onUploadProgress, signal } = options;\n\n if (onUploadProgress) {\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable && e.total > 0) {\n onUploadProgress(Math.min(1, e.loaded / e.total));\n }\n });\n }\n\n const onAbort = () => {\n xhr.abort();\n reject(new LumenNetworkError(\"Submit aborted.\"));\n };\n if (signal) {\n if (signal.aborted) {\n reject(new LumenNetworkError(\"Submit aborted.\"));\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n xhr.addEventListener(\"load\", () => {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n\n if (xhr.status === 403) {\n reject(new LumenOriginError());\n return;\n }\n if (xhr.status === 429) {\n const retryAfter = Number(xhr.getResponseHeader(\"Retry-After\")) || 60;\n reject(new LumenRateLimitError(retryAfter));\n return;\n }\n if (xhr.status < 200 || xhr.status >= 300) {\n reject(\n new LumenError(\n parseError(xhr.responseText) ?? `HTTP ${xhr.status}`,\n \"HTTP_ERROR\",\n xhr.status,\n ),\n );\n return;\n }\n try {\n const parsed = JSON.parse(xhr.responseText) as SubmitResult;\n resolve(parsed);\n } catch {\n reject(new LumenError(\"Malformed response from server.\", \"BAD_RESPONSE\"));\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n reject(new LumenNetworkError(\"Network error during submit.\"));\n });\n\n xhr.send(body);\n });\n }\n}\n\nfunction screenshotFilename(blob: Blob): string {\n const ext =\n blob.type === \"image/jpeg\"\n ? \"jpg\"\n : blob.type === \"image/webp\"\n ? \"webp\"\n : \"png\";\n return `screenshot.${ext}`;\n}\n\nfunction wait(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction parseError(text: string): string | null {\n try {\n const obj = JSON.parse(text) as { error?: string; message?: string };\n return obj.error ?? obj.message ?? null;\n } catch {\n return text || null;\n }\n}\n","import { LumenError } from \"./errors\";\nimport type {\n CaptureResult,\n ScreenshotCaptureOptions,\n} from \"./types\";\n\nconst DEFAULT_MAX_SCALE = 2;\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\n\ntype Html2Canvas = typeof import(\"html2canvas-pro\").default;\n\nlet html2canvasForTest: Html2Canvas | null = null;\n\nexport function __setHtml2CanvasForTest(renderer: Html2Canvas | null): void {\n html2canvasForTest = renderer;\n}\n\n/**\n * Capture the visible app screen with method/platform metadata.\n *\n * `mode: \"auto\"` keeps the no-permission DOM path first, then falls\n * back to the browser Screen Capture API if DOM rendering fails.\n * Hosts that need native-quality pixels can pass a custom provider.\n */\nexport async function captureScreen(\n options: ScreenshotCaptureOptions = {},\n): Promise<CaptureResult> {\n assertBrowser();\n\n const mode = options.mode ?? \"auto\";\n\n if (options.provider && (mode === \"auto\" || mode === \"custom\")) {\n try {\n return normalizeProviderResult(await options.provider(), options);\n } catch (e) {\n if (mode === \"custom\") throw e;\n // In auto mode a broken custom provider should not strand web apps.\n options.onWarning?.([\n \"Custom capture provider failed; falling back to browser DOM capture.\",\n ]);\n }\n }\n\n if (mode === \"manual\") {\n throw new LumenError(\n \"Manual screenshot upload is required for this capture mode.\",\n \"MANUAL_CAPTURE_REQUIRED\",\n );\n }\n\n if (mode === \"true-screen\") {\n return captureDisplayMedia(options);\n }\n\n if (mode === \"dom\") {\n return captureDom(options);\n }\n\n if (mode === \"custom\") {\n throw new LumenError(\n \"`capture.provider` is required when capture mode is `custom`.\",\n \"CAPTURE_PROVIDER_REQUIRED\",\n );\n }\n\n try {\n return await captureDom(options);\n } catch (domError) {\n if (canUseDisplayMedia()) {\n const result = await captureDisplayMedia(options);\n result.warnings = uniq([\n \"DOM screenshot failed; used browser screen permission fallback.\",\n ...result.warnings,\n ]);\n options.onWarning?.(result.warnings);\n return result;\n }\n throw domError;\n }\n}\n\n/**\n * Back-compatible wrapper kept for existing integrations.\n * New code should prefer `captureScreen()` so capture quality metadata\n * can be stored with the feedback.\n */\nexport async function captureScreenshot(\n target?: HTMLElement,\n): Promise<Blob> {\n const result = await captureScreen({ target, mode: \"auto\" });\n return result.blob;\n}\n\nexport function createManualCaptureResult(\n blob: Blob,\n warnings: string[] = [],\n): CaptureResult {\n assertBrowser();\n const viewport = currentViewport();\n return {\n blob,\n method: \"manual-upload\",\n platform: \"web\",\n viewport,\n pixelRatio: window.devicePixelRatio ?? 1,\n warnings: uniq(warnings),\n };\n}\n\nasync function captureDom(\n options: ScreenshotCaptureOptions,\n): Promise<CaptureResult> {\n const html2canvas = await loadHtml2Canvas();\n\n const target = options.target ?? document.documentElement;\n const viewport = currentViewport();\n const scale = Math.max(\n 1,\n Math.min(window.devicePixelRatio ?? 1, options.maxScale ?? DEFAULT_MAX_SCALE),\n );\n const warnings = collectDomWarnings(target);\n\n const canvas = await html2canvas(target, {\n backgroundColor: null,\n logging: false,\n useCORS: true,\n allowTaint: false,\n width: viewport.width,\n height: viewport.height,\n windowWidth: viewport.width,\n windowHeight: viewport.height,\n scrollX: window.scrollX,\n scrollY: window.scrollY,\n x: window.scrollX,\n y: window.scrollY,\n scale,\n ignoreElements: (el) =>\n el instanceof HTMLElement &&\n (el.dataset.lumenCaptureIgnore === \"true\" ||\n Boolean(el.closest(\"[data-lumen-capture-ignore='true']\"))),\n });\n\n const blob = await encodeCanvas(canvas, warnings);\n const result = {\n blob,\n method: \"web-dom\",\n platform: \"web\",\n viewport,\n pixelRatio: scale,\n warnings: uniq(warnings),\n } satisfies CaptureResult;\n if (result.warnings.length > 0) options.onWarning?.(result.warnings);\n return result;\n}\n\nasync function loadHtml2Canvas(): Promise<Html2Canvas> {\n if (html2canvasForTest) return html2canvasForTest;\n const { default: html2canvas } = await import(\"html2canvas-pro\");\n return html2canvas;\n}\n\nasync function captureDisplayMedia(\n options: ScreenshotCaptureOptions,\n): Promise<CaptureResult> {\n if (!canUseDisplayMedia()) {\n throw new LumenError(\n \"Browser screen capture is unavailable in this environment.\",\n \"DISPLAY_MEDIA_UNAVAILABLE\",\n );\n }\n\n const stream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n audio: false,\n });\n\n try {\n const video = document.createElement(\"video\");\n video.muted = true;\n video.playsInline = true;\n video.srcObject = stream;\n await waitForVideoFrame(video);\n\n const canvas = document.createElement(\"canvas\");\n canvas.width = video.videoWidth;\n canvas.height = video.videoHeight;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new LumenError(\n \"Could not create a drawing context for screen capture.\",\n \"CANVAS_CONTEXT_UNAVAILABLE\",\n );\n }\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n\n const viewport = currentViewport();\n const warnings = [\n \"Browser screen capture uses the window or tab selected by the user.\",\n ];\n const blob = await encodeCanvas(canvas, warnings);\n const result = {\n blob,\n method: \"web-display-media\",\n platform: \"web\",\n viewport,\n pixelRatio:\n viewport.width > 0 ? canvas.width / viewport.width : undefined,\n warnings: uniq(warnings),\n } satisfies CaptureResult;\n options.onWarning?.(result.warnings);\n return result;\n } finally {\n for (const track of stream.getTracks()) track.stop();\n }\n}\n\nfunction normalizeProviderResult(\n result: CaptureResult,\n options: ScreenshotCaptureOptions,\n): CaptureResult {\n const viewport = currentViewport();\n const normalized = {\n ...result,\n method: result.method ?? \"custom\",\n platform: result.platform ?? \"custom\",\n viewport: result.viewport ?? viewport,\n pixelRatio: result.pixelRatio ?? window.devicePixelRatio ?? 1,\n warnings: uniq(result.warnings ?? []),\n } satisfies CaptureResult;\n if (normalized.warnings.length > 0) options.onWarning?.(normalized.warnings);\n return normalized;\n}\n\nfunction collectDomWarnings(target: HTMLElement): string[] {\n const warnings = new Set<string>();\n\n if (target.querySelector(\"iframe\")) {\n warnings.add(\"Embedded iframes may be blank or incomplete in DOM capture.\");\n }\n if (target.querySelector(\"video\")) {\n warnings.add(\"Video frames may be blank or stale in DOM capture.\");\n }\n if (target.querySelector(\"canvas\")) {\n warnings.add(\"Canvas/WebGL content may be blank if it is cross-origin tainted.\");\n }\n if (document.fonts && document.fonts.status !== \"loaded\") {\n warnings.add(\"Web fonts were still loading when the screenshot was captured.\");\n }\n\n let crossOriginImages = 0;\n for (const img of Array.from(target.querySelectorAll(\"img\"))) {\n const src = img.currentSrc || img.src;\n if (!src) continue;\n try {\n const url = new URL(src, window.location.href);\n if (url.origin !== window.location.origin && !img.crossOrigin) {\n crossOriginImages += 1;\n }\n } catch {\n // Invalid image URLs are ignored here; html2canvas will handle them.\n }\n }\n if (crossOriginImages > 0) {\n warnings.add(\n `${crossOriginImages} cross-origin image${crossOriginImages === 1 ? \"\" : \"s\"} without CORS may be omitted from the screenshot.`,\n );\n }\n\n return Array.from(warnings);\n}\n\nasync function encodeCanvas(\n canvas: HTMLCanvasElement,\n warnings: string[],\n): Promise<Blob> {\n let blob = await canvasToBlob(canvas, \"image/png\", 0.92);\n if (blob.size <= MAX_SCREENSHOT_BYTES) return blob;\n\n warnings.push(\"Screenshot exceeded the upload cap and was compressed.\");\n\n // Progressively downscale + re-encode until we're under the cap, or until\n // the image is too small to be useful. Without this loop a very large\n // screenshot from a 4K monitor at 2x DPR could still exceed the cap after\n // a single pass and silently fail to upload server-side.\n let working = canvas;\n let attempt = 0;\n while (blob.size > MAX_SCREENSHOT_BYTES && attempt < 6) {\n const ratio = Math.max(\n 0.35,\n Math.min(0.95, Math.sqrt(MAX_SCREENSHOT_BYTES / blob.size) * 0.9),\n );\n const next = document.createElement(\"canvas\");\n next.width = Math.max(1, Math.round(working.width * ratio));\n next.height = Math.max(1, Math.round(working.height * ratio));\n const ctx = next.getContext(\"2d\");\n if (!ctx) return blob;\n ctx.drawImage(working, 0, 0, next.width, next.height);\n working = next;\n\n for (const quality of [0.86, 0.74, 0.62, 0.5]) {\n blob = await canvasToBlob(working, \"image/jpeg\", quality);\n if (blob.size <= MAX_SCREENSHOT_BYTES) return blob;\n }\n\n attempt += 1;\n if (next.width < 480 || next.height < 320) break;\n }\n\n if (blob.size > MAX_SCREENSHOT_BYTES) {\n warnings.push(\n \"Screenshot remained large after compression; upload may be rejected.\",\n );\n }\n return blob;\n}\n\nfunction canvasToBlob(\n canvas: HTMLCanvasElement,\n type: \"image/png\" | \"image/jpeg\",\n quality: number,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new LumenError(\"Could not encode screenshot.\", \"ENCODE_FAILED\"));\n return;\n }\n resolve(blob);\n },\n type,\n quality,\n );\n });\n}\n\nfunction currentViewport(): { width: number; height: number } {\n const visual = window.visualViewport;\n return {\n width: Math.round(visual?.width ?? window.innerWidth),\n height: Math.round(visual?.height ?? window.innerHeight),\n };\n}\n\nfunction canUseDisplayMedia(): boolean {\n return Boolean(navigator.mediaDevices?.getDisplayMedia);\n}\n\nasync function waitForVideoFrame(video: HTMLVideoElement): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const done = () => resolve();\n const fail = () =>\n reject(new LumenError(\"Could not read screen capture video.\", \"VIDEO_FAILED\"));\n video.addEventListener(\"loadedmetadata\", done, { once: true });\n video.addEventListener(\"error\", fail, { once: true });\n void video.play().catch(fail);\n });\n\n // Wait until the browser actually reports a non-zero frame size. We poll\n // via rAF (cheap, paints-aligned) with a hard cap so a stalled stream\n // can't hang the capture flow.\n const start = performance.now();\n const MAX_WAIT_MS = 1500;\n while (video.videoWidth === 0 || video.videoHeight === 0) {\n if (performance.now() - start > MAX_WAIT_MS) {\n throw new LumenError(\n \"Screen capture did not produce a frame in time.\",\n \"VIDEO_TIMEOUT\",\n );\n }\n await new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n );\n }\n}\n\nfunction assertBrowser(): void {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n throw new LumenError(\n \"Screenshot capture can only run in the browser.\",\n \"INVALID_ENV\",\n );\n }\n}\n\nfunction uniq(values: string[]): string[] {\n return Array.from(new Set(values.filter(Boolean)));\n}\n","/**\n * Lightweight runtime capture: console + fetch/XHR ring buffers.\n *\n * Patched lazily on first install; idempotent. The buffers are drained\n * (not cleared) when `readRuntimeCapture()` is called so multiple\n * submissions in one session each get the latest tail.\n *\n * Keep this file dependency-free and small — it sits on every host\n * page's main bundle.\n */\n\nconst MAX_ENTRIES = 200;\nconst MAX_STRING = 4096;\n\ntype ConsoleLevel = \"log\" | \"info\" | \"warn\" | \"error\" | \"debug\";\n\nexport interface ConsoleEntry {\n level: ConsoleLevel;\n ts: number;\n message: string;\n}\n\nexport interface NetworkEntry {\n type: \"fetch\" | \"xhr\";\n method: string;\n url: string;\n status: number;\n ok: boolean;\n durationMs: number;\n ts: number;\n error?: string;\n}\n\nconst consoleBuf: ConsoleEntry[] = [];\nconst networkBuf: NetworkEntry[] = [];\n\nlet installed = false;\nlet ignoreUrlPrefix: string | null = null;\n\nexport interface InstallRuntimeCaptureOptions {\n /**\n * Requests to URLs starting with this prefix are skipped — prevents\n * the SDK from logging its own submit/config calls in a recursive\n * loop and from leaking apiKey headers into the buffer.\n */\n ignoreUrlPrefix?: string;\n}\n\nexport function installRuntimeCapture(\n options: InstallRuntimeCaptureOptions = {},\n): void {\n if (installed) return;\n if (typeof window === \"undefined\") return;\n installed = true;\n ignoreUrlPrefix = options.ignoreUrlPrefix ?? null;\n patchConsole();\n patchFetch();\n patchXhr();\n}\n\nexport function readRuntimeCapture(): {\n consoleLog: ConsoleEntry[];\n networkLog: NetworkEntry[];\n} {\n return {\n consoleLog: consoleBuf.slice(),\n networkLog: networkBuf.slice(),\n };\n}\n\nfunction pushBounded<T>(buf: T[], entry: T): void {\n buf.push(entry);\n if (buf.length > MAX_ENTRIES) buf.splice(0, buf.length - MAX_ENTRIES);\n}\n\nfunction safeStringify(args: unknown[]): string {\n const out: string[] = [];\n for (const arg of args) {\n if (typeof arg === \"string\") {\n out.push(arg);\n continue;\n }\n if (arg instanceof Error) {\n out.push(`${arg.name}: ${arg.message}${arg.stack ? `\\n${arg.stack}` : \"\"}`);\n continue;\n }\n try {\n out.push(JSON.stringify(arg, replacer));\n } catch {\n out.push(String(arg));\n }\n }\n const joined = out.join(\" \");\n return joined.length > MAX_STRING\n ? joined.slice(0, MAX_STRING) + \"…[truncated]\"\n : joined;\n}\n\n// Drops common circular refs (DOM nodes, React fibers) so JSON.stringify\n// doesn't throw and the buffer stays small.\nfunction replacer(_key: string, value: unknown): unknown {\n if (value instanceof Element) return `[Element ${(value as Element).tagName}]`;\n if (typeof value === \"function\") return \"[Function]\";\n return value;\n}\n\nfunction patchConsole(): void {\n const target = window.console;\n if (!target) return;\n const levels: ConsoleLevel[] = [\"log\", \"info\", \"warn\", \"error\", \"debug\"];\n for (const level of levels) {\n const original = target[level]?.bind(target);\n if (!original) continue;\n target[level] = (...args: unknown[]) => {\n try {\n pushBounded(consoleBuf, {\n level,\n ts: Date.now(),\n message: safeStringify(args),\n });\n } catch {\n // Never let our interception throw into the host app.\n }\n original(...args);\n };\n }\n}\n\nfunction isIgnored(url: string): boolean {\n if (!ignoreUrlPrefix) return false;\n return url.startsWith(ignoreUrlPrefix);\n}\n\nfunction patchFetch(): void {\n const originalFetch = window.fetch;\n if (typeof originalFetch !== \"function\") return;\n window.fetch = async function patchedFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n const method = (init?.method ?? (input instanceof Request ? input.method : \"GET\")).toUpperCase();\n if (isIgnored(url)) {\n return originalFetch.call(window, input as RequestInfo, init);\n }\n const started = performance.now();\n try {\n const res = await originalFetch.call(window, input as RequestInfo, init);\n pushBounded(networkBuf, {\n type: \"fetch\",\n method,\n url: truncate(url),\n status: res.status,\n ok: res.ok,\n durationMs: Math.round(performance.now() - started),\n ts: Date.now(),\n });\n return res;\n } catch (e) {\n pushBounded(networkBuf, {\n type: \"fetch\",\n method,\n url: truncate(url),\n status: 0,\n ok: false,\n durationMs: Math.round(performance.now() - started),\n ts: Date.now(),\n error: e instanceof Error ? e.message : \"fetch error\",\n });\n throw e;\n }\n } as typeof window.fetch;\n}\n\nfunction patchXhr(): void {\n const OriginalXHR = window.XMLHttpRequest;\n if (!OriginalXHR) return;\n const originalOpen = OriginalXHR.prototype.open;\n const originalSend = OriginalXHR.prototype.send;\n\n OriginalXHR.prototype.open = function patchedOpen(\n this: XMLHttpRequest & { __lumen?: { method: string; url: string; t: number } },\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ) {\n this.__lumen = {\n method: String(method).toUpperCase(),\n url: typeof url === \"string\" ? url : url.toString(),\n t: 0,\n };\n // @ts-expect-error variadic passthrough\n return originalOpen.call(this, method, url, ...rest);\n } as typeof OriginalXHR.prototype.open;\n\n OriginalXHR.prototype.send = function patchedSend(\n this: XMLHttpRequest & { __lumen?: { method: string; url: string; t: number } },\n body?: Document | XMLHttpRequestBodyInit | null,\n ) {\n const meta = this.__lumen;\n if (meta && !isIgnored(meta.url)) {\n meta.t = performance.now();\n const onDone = () => {\n try {\n pushBounded(networkBuf, {\n type: \"xhr\",\n method: meta.method,\n url: truncate(meta.url),\n status: this.status,\n ok: this.status >= 200 && this.status < 400,\n durationMs: Math.round(performance.now() - meta.t),\n ts: Date.now(),\n });\n } catch {\n // ignore\n }\n this.removeEventListener(\"loadend\", onDone);\n };\n this.addEventListener(\"loadend\", onDone);\n }\n return originalSend.call(this, body ?? null);\n } as typeof OriginalXHR.prototype.send;\n}\n\nfunction truncate(s: string): string {\n return s.length > 512 ? s.slice(0, 512) + \"…\" : s;\n}\n","import { readRuntimeCapture } from \"./capture-runtime\";\nimport type {\n CapturedContext,\n CaptureMetadata,\n CaptureResult,\n DeviceContext,\n} from \"./types\";\n\n/**\n * Snapshot of basic page context at submit-time.\n *\n * Console + network logs are sourced from the runtime ring buffer when\n * `installRuntimeCapture()` has been called by the host (the React\n * provider does this on mount). When the host hasn't installed\n * interception the buffer is empty and the legacy `[]` is sent — same\n * shape, no migration impact.\n */\nexport function captureContext(\n capture?: CaptureResult | CaptureMetadata,\n): CapturedContext {\n if (typeof window === \"undefined\") {\n return {\n url: \"\",\n userAgent: \"\",\n viewport: { width: 0, height: 0 },\n capture: toCaptureMetadata(capture),\n consoleLog: [],\n networkLog: [],\n };\n }\n\n const runtime = readRuntimeCapture();\n return {\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n capture: toCaptureMetadata(capture),\n device: snapshotDevice(),\n consoleLog: runtime.consoleLog,\n networkLog: runtime.networkLog,\n };\n}\n\nfunction snapshotDevice(): DeviceContext {\n const device: DeviceContext = {};\n try {\n device.screen = {\n width: window.screen?.width ?? 0,\n height: window.screen?.height ?? 0,\n };\n device.pixelRatio = window.devicePixelRatio ?? 1;\n device.language = navigator.language;\n device.languages = Array.from(navigator.languages ?? []);\n device.timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n device.colorScheme = window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n device.referrer = document.referrer || undefined;\n device.title = document.title || undefined;\n device.online = navigator.onLine;\n const nav = performance.getEntriesByType(\"navigation\")[0] as\n | PerformanceNavigationTiming\n | undefined;\n if (nav) {\n device.uptimeMs = Math.round(performance.now());\n }\n } catch {\n // Best-effort snapshot — don't block submit on a missing API.\n }\n return device;\n}\n\nfunction toCaptureMetadata(\n capture?: CaptureResult | CaptureMetadata,\n): CaptureMetadata | undefined {\n if (!capture) return undefined;\n return {\n method: capture.method,\n platform: capture.platform,\n viewport: capture.viewport,\n pixelRatio: capture.pixelRatio,\n warnings: capture.warnings,\n };\n}\n","import { LumenError } from \"./errors\";\n\nexport interface AudioRecording {\n blob: Blob;\n durationMs: number;\n mimeType: string;\n}\n\nexport interface RecorderHandle {\n /** Stop recording and resolve with the recorded blob. */\n stop: () => Promise<AudioRecording>;\n /** Cancel without producing a blob; releases the mic immediately. */\n cancel: () => void;\n /** Stream object (use to render a live waveform in Phase 2). */\n stream: MediaStream;\n}\n\n/**\n * Start a MediaRecorder. Caller is responsible for stopping/canceling.\n * Auto-stops after `maxSeconds` seconds to avoid runaway recordings.\n */\nexport async function recordAudio(\n maxSeconds = 60,\n): Promise<RecorderHandle> {\n if (typeof window === \"undefined\" || !navigator.mediaDevices) {\n throw new LumenError(\n \"Audio recording requires a browser with MediaDevices.\",\n \"INVALID_ENV\",\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n } catch {\n throw new LumenError(\n \"Microphone access denied or unavailable.\",\n \"MIC_DENIED\",\n );\n }\n\n // Pick the first MIME type supported by the browser; webm/opus on\n // Chromium, mp4/aac on Safari, ogg on Firefox.\n const candidates = [\n \"audio/webm;codecs=opus\",\n \"audio/webm\",\n \"audio/mp4\",\n \"audio/ogg;codecs=opus\",\n ];\n const mimeType =\n candidates.find((m) => MediaRecorder.isTypeSupported(m)) ?? \"\";\n\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n const chunks: Blob[] = [];\n const start = performance.now();\n let timeoutId: number | null = null;\n\n recorder.addEventListener(\"dataavailable\", (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n });\n\n recorder.start();\n timeoutId = window.setTimeout(() => {\n if (recorder.state !== \"inactive\") recorder.stop();\n }, maxSeconds * 1000);\n\n function release() {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n for (const track of stream.getTracks()) track.stop();\n }\n\n return {\n stream,\n cancel() {\n try {\n if (recorder.state !== \"inactive\") recorder.stop();\n } catch {\n /* ignore */\n }\n release();\n },\n stop(): Promise<AudioRecording> {\n return new Promise((resolve, reject) => {\n if (recorder.state === \"inactive\") {\n release();\n reject(new LumenError(\"Recorder already stopped.\", \"RECORDER_STOPPED\"));\n return;\n }\n recorder.addEventListener(\n \"stop\",\n () => {\n const durationMs = performance.now() - start;\n const finalType = recorder.mimeType || mimeType || \"audio/webm\";\n const blob = new Blob(chunks, { type: finalType });\n release();\n resolve({ blob, durationMs, mimeType: finalType });\n },\n { once: true },\n );\n recorder.stop();\n });\n },\n };\n}\n","import { LumenError } from \"./errors\";\n\nexport interface VideoRecording {\n blob: Blob;\n durationMs: number;\n mimeType: string;\n}\n\nexport interface VideoRecorderHandle {\n /** Stop recording and resolve with the recorded blob. */\n stop: () => Promise<VideoRecording>;\n /** Cancel without producing a blob; releases the screen capture. */\n cancel: () => void;\n /** The screen-capture stream (use to render a live preview). */\n stream: MediaStream;\n}\n\n/**\n * Record the screen via the browser Screen Capture API + MediaRecorder.\n * Mirrors {@link recordAudio} but over `getDisplayMedia`. The user picks a\n * tab / window / screen in the browser's native picker; if they cancel the\n * picker this rejects with `SCREEN_DENIED`.\n *\n * Auto-stops after `maxSeconds`. The browser also surfaces its own \"Stop\n * sharing\" control — we listen for the track ending so that path resolves\n * the recording too.\n */\nexport async function recordVideo(\n maxSeconds = 60,\n): Promise<VideoRecorderHandle> {\n if (\n typeof window === \"undefined\" ||\n !navigator.mediaDevices ||\n typeof navigator.mediaDevices.getDisplayMedia !== \"function\"\n ) {\n throw new LumenError(\n \"Screen recording requires a browser with getDisplayMedia.\",\n \"INVALID_ENV\",\n );\n }\n\n let stream: MediaStream;\n try {\n stream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n // Capture system/tab audio when the user opts in via the picker.\n audio: true,\n });\n } catch {\n throw new LumenError(\n \"Screen capture was denied or cancelled.\",\n \"SCREEN_DENIED\",\n );\n }\n\n // VP9/VP8 webm on Chromium; mp4 on Safari.\n const candidates = [\n \"video/webm;codecs=vp9,opus\",\n \"video/webm;codecs=vp8,opus\",\n \"video/webm\",\n \"video/mp4\",\n ];\n const mimeType =\n candidates.find((m) => MediaRecorder.isTypeSupported(m)) ?? \"\";\n\n const recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);\n const chunks: Blob[] = [];\n const start = performance.now();\n let timeoutId: number | null = null;\n\n recorder.addEventListener(\"dataavailable\", (e) => {\n if (e.data && e.data.size > 0) chunks.push(e.data);\n });\n\n recorder.start();\n timeoutId = window.setTimeout(() => {\n if (recorder.state !== \"inactive\") recorder.stop();\n }, maxSeconds * 1000);\n\n // The user can end the share from the browser's own UI — treat that as\n // a stop so the in-flight recording still resolves.\n const videoTrack = stream.getVideoTracks()[0];\n if (videoTrack) {\n videoTrack.addEventListener(\"ended\", () => {\n if (recorder.state !== \"inactive\") recorder.stop();\n });\n }\n\n function release() {\n if (timeoutId !== null) window.clearTimeout(timeoutId);\n timeoutId = null;\n for (const track of stream.getTracks()) track.stop();\n }\n\n return {\n stream,\n cancel() {\n try {\n if (recorder.state !== \"inactive\") recorder.stop();\n } catch {\n /* ignore */\n }\n release();\n },\n stop(): Promise<VideoRecording> {\n return new Promise((resolve, reject) => {\n if (recorder.state === \"inactive\") {\n release();\n reject(new LumenError(\"Recorder already stopped.\", \"RECORDER_STOPPED\"));\n return;\n }\n recorder.addEventListener(\n \"stop\",\n () => {\n const durationMs = performance.now() - start;\n const finalType = recorder.mimeType || mimeType || \"video/webm\";\n const blob = new Blob(chunks, { type: finalType });\n release();\n resolve({ blob, durationMs, mimeType: finalType });\n },\n { once: true },\n );\n recorder.stop();\n });\n },\n };\n}\n","\"use client\";\n\nimport { createContext, useContext } from \"react\";\nimport type {\n LumenClient,\n ScreenshotCaptureOptions,\n LumenUser,\n SubmitOptions,\n SubmitPayload,\n SubmitResult,\n} from \"@lumen-stack/core\";\n\nexport interface LumenContextValue {\n client: LumenClient;\n user: LumenUser | undefined;\n\n // v2 surface\n open: () => void;\n close: () => void;\n isOpen: boolean;\n /** Pass-through to client.submit — for headless hosts that build their own payload. */\n submit: (\n payload: SubmitPayload,\n options?: SubmitOptions,\n ) => Promise<SubmitResult>;\n /** Best-effort: true when running inside a native shell (RN WebView, Capacitor, …). */\n isNativeShell: boolean;\n /** Capture options from <LumenProvider>. */\n capture: ScreenshotCaptureOptions | undefined;\n\n // Back-compat aliases (kept; do not remove).\n openCapture: () => void;\n closeCapture: () => void;\n isSubmitting: boolean;\n error: Error | null;\n}\n\nexport const LumenContext = createContext<LumenContextValue | null>(null);\n\nexport function useLumen(): LumenContextValue {\n const ctx = useContext(LumenContext);\n if (!ctx) {\n throw new Error(\"useLumen() must be used inside <LumenProvider>.\");\n }\n return ctx;\n}\n","\"use client\";\n\nimport { useEffect, useImperativeHandle, useRef, useState } from \"react\";\nimport * as React from \"react\";\n\nexport type AnnotationTool = \"arrow\" | \"rect\" | \"freehand\";\n\ninterface ArrowAnno {\n kind: \"arrow\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n color: string;\n width: number;\n}\ninterface RectAnno {\n kind: \"rect\";\n from: { x: number; y: number };\n to: { x: number; y: number };\n color: string;\n width: number;\n}\ninterface FreehandAnno {\n kind: \"freehand\";\n points: Array<{ x: number; y: number }>;\n color: string;\n width: number;\n}\ntype Annotation = ArrowAnno | RectAnno | FreehandAnno;\n\nconst HISTORY_LIMIT = 50;\n\nexport interface AnnotationLayerHandle {\n flatten: () => Promise<Blob>;\n reset: () => void;\n undo: () => void;\n hasAnnotations: () => boolean;\n}\n\nexport interface AnnotationLayerProps {\n screenshot: Blob;\n tool: AnnotationTool;\n /** Stroke color (CSS color). Default red-500. */\n color?: string;\n /** Stroke width in bitmap px. Default 4. */\n strokeWidth?: number;\n /** Called when the user starts/stops drawing — used by the modal to\n * lock its scrollable body during a stroke. */\n onDrawingChange?: (drawing: boolean) => void;\n ref?: React.Ref<AnnotationLayerHandle>;\n}\n\nexport function AnnotationLayer({\n screenshot,\n tool,\n color = \"rgb(239, 68, 68)\",\n strokeWidth = 4,\n onDrawingChange,\n ref,\n}: AnnotationLayerProps) {\n const baseCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const overlayCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [imageBitmap, setImageBitmap] = useState<ImageBitmap | null>(null);\n const [annotations, setAnnotations] = useState<Annotation[]>([]);\n const draftRef = useRef<Annotation | null>(null);\n const isDrawingRef = useRef(false);\n const lastSampleAtRef = useRef(0);\n const rafPendingRef = useRef(false);\n\n // Decode the screenshot once into a bitmap so we can redraw cheaply.\n // In React Strict Mode the effect runs twice on mount — we must close\n // the second-run bitmap and free both via .close() on unmount so we\n // don't leak GPU memory across repeated capture sessions.\n useEffect(() => {\n let cancelled = false;\n let decoded: ImageBitmap | null = null;\n (async () => {\n try {\n const bm = await createImageBitmap(screenshot);\n if (cancelled) {\n bm.close?.();\n return;\n }\n decoded = bm;\n setImageBitmap(bm);\n } catch {\n // Decoding failure leaves the layer in its loading state; the\n // surrounding modal will surface the error via toast on submit.\n }\n })();\n return () => {\n cancelled = true;\n decoded?.close?.();\n };\n }, [screenshot]);\n\n // Size + paint base canvas exactly once per bitmap.\n useEffect(() => {\n if (!imageBitmap) return;\n const base = baseCanvasRef.current;\n const overlay = overlayCanvasRef.current;\n if (!base || !overlay) return;\n base.width = imageBitmap.width;\n base.height = imageBitmap.height;\n overlay.width = imageBitmap.width;\n overlay.height = imageBitmap.height;\n const ctx = base.getContext(\"2d\");\n if (!ctx) return;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(imageBitmap, 0, 0);\n }, [imageBitmap]);\n\n // Repaint the OVERLAY only when annotations change. Base canvas is\n // never touched after the initial draw.\n useEffect(() => {\n const overlay = overlayCanvasRef.current;\n if (!overlay) return;\n redraw(overlay, annotations, draftRef.current);\n }, [annotations]);\n\n useImperativeHandle(\n ref,\n (): AnnotationLayerHandle => ({\n hasAnnotations: () => annotations.length > 0,\n reset: () => setAnnotations([]),\n undo: () =>\n setAnnotations((cur) =>\n cur.length === 0 ? cur : cur.slice(0, -1),\n ),\n async flatten() {\n // Mid-stroke at submit time: bake the live draft so the user\n // doesn't lose the annotation they were drawing when they clicked\n // Send.\n const draft = draftRef.current;\n const all = draft ? [...annotations, draft] : annotations;\n // No annotations → no re-encode. A 2MB PNG screenshot through\n // canvas.toBlob can take 100-300ms on a phone for zero benefit.\n if (all.length === 0) return screenshot;\n if (!imageBitmap) return screenshot;\n const out = document.createElement(\"canvas\");\n out.width = imageBitmap.width;\n out.height = imageBitmap.height;\n const ctx = out.getContext(\"2d\");\n if (!ctx) return screenshot;\n ctx.imageSmoothingEnabled = false;\n ctx.drawImage(imageBitmap, 0, 0);\n for (const anno of all) drawAnno(ctx, anno);\n // JPEG q=0.85: ~4-10× smaller than PNG for screenshot content,\n // which dominates submit time on slow uplinks. Annotations are\n // simple shapes that survive JPEG without visible artifacts.\n return await new Promise<Blob>((resolve) => {\n out.toBlob(\n (blob) => {\n resolve(blob ?? screenshot);\n },\n \"image/jpeg\",\n 0.85,\n );\n });\n },\n }),\n [annotations, imageBitmap, screenshot],\n );\n\n function clientToCanvas(\n e: React.PointerEvent<HTMLCanvasElement>,\n ): { x: number; y: number } {\n const c = overlayCanvasRef.current;\n if (!c) return { x: 0, y: 0 };\n const rect = c.getBoundingClientRect();\n const sx = c.width / Math.max(rect.width, 1);\n const sy = c.height / Math.max(rect.height, 1);\n return {\n x: (e.clientX - rect.left) * sx,\n y: (e.clientY - rect.top) * sy,\n };\n }\n\n function scheduleDraftPaint() {\n if (rafPendingRef.current) return;\n rafPendingRef.current = true;\n requestAnimationFrame(() => {\n rafPendingRef.current = false;\n const overlay = overlayCanvasRef.current;\n if (!overlay) return;\n redraw(overlay, annotations, draftRef.current);\n });\n }\n\n function onPointerDown(e: React.PointerEvent<HTMLCanvasElement>) {\n if (e.button !== undefined && e.button !== 0) return;\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // iOS Safari can throw NotSupportedError if the pointer is already\n // captured by an ancestor (e.g. the sheet grabber's drag handler).\n // Swallow — capture is a nice-to-have for off-canvas tracking; the\n // stroke still works without it.\n }\n isDrawingRef.current = true;\n onDrawingChange?.(true);\n const p = clientToCanvas(e);\n if (tool === \"arrow\") {\n draftRef.current = { kind: \"arrow\", from: p, to: p, color, width: strokeWidth };\n } else if (tool === \"rect\") {\n draftRef.current = { kind: \"rect\", from: p, to: p, color, width: strokeWidth };\n } else {\n draftRef.current = {\n kind: \"freehand\",\n points: [p],\n color,\n width: strokeWidth,\n };\n }\n lastSampleAtRef.current = performance.now();\n scheduleDraftPaint();\n }\n\n function onPointerMove(e: React.PointerEvent<HTMLCanvasElement>) {\n if (!isDrawingRef.current || !draftRef.current) return;\n const p = clientToCanvas(e);\n const draft = draftRef.current;\n if (draft.kind === \"arrow\" || draft.kind === \"rect\") {\n draft.to = p;\n } else {\n const last = draft.points[draft.points.length - 1];\n const dist2 = last\n ? (last.x - p.x) ** 2 + (last.y - p.y) ** 2\n : Infinity;\n const now = performance.now();\n const elapsed = now - lastSampleAtRef.current;\n // Sample if we've moved ≥ 4 bitmap-px OR ≥ 16ms passed (handles\n // very slow strokes where a single point would otherwise stall).\n if (dist2 > 16 || elapsed > 16) {\n draft.points.push(p);\n lastSampleAtRef.current = now;\n }\n }\n scheduleDraftPaint();\n }\n\n function onPointerUp() {\n if (!isDrawingRef.current) return;\n isDrawingRef.current = false;\n onDrawingChange?.(false);\n const draft = draftRef.current;\n draftRef.current = null;\n if (!draft) return;\n if (draft.kind === \"arrow\" || draft.kind === \"rect\") {\n const dx = draft.to.x - draft.from.x;\n const dy = draft.to.y - draft.from.y;\n if (dx * dx + dy * dy < 16) {\n // Tap — discard. Force a clean overlay repaint so the empty\n // draft doesn't linger.\n const overlay = overlayCanvasRef.current;\n if (overlay) redraw(overlay, annotations, null);\n return;\n }\n } else if (draft.points.length < 2) {\n const overlay = overlayCanvasRef.current;\n if (overlay) redraw(overlay, annotations, null);\n return;\n }\n setAnnotations((cur) => [...cur, draft].slice(-HISTORY_LIMIT));\n }\n\n return (\n <div ref={containerRef} className=\"lumen-annotate-frame\">\n <canvas ref={baseCanvasRef} />\n <canvas\n ref={overlayCanvasRef}\n className=\"lumen-annotate-overlay\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n />\n </div>\n );\n}\n\nfunction redraw(\n canvas: HTMLCanvasElement,\n annotations: Annotation[],\n draft: Annotation | null,\n) {\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n for (const a of annotations) drawAnno(ctx, a);\n if (draft) drawAnno(ctx, draft);\n}\n\nfunction drawAnno(ctx: CanvasRenderingContext2D, anno: Annotation) {\n ctx.save();\n ctx.strokeStyle = anno.color;\n ctx.fillStyle = anno.color;\n ctx.lineWidth = anno.width;\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n\n if (anno.kind === \"rect\") {\n const x = Math.min(anno.from.x, anno.to.x);\n const y = Math.min(anno.from.y, anno.to.y);\n const w = Math.abs(anno.to.x - anno.from.x);\n const h = Math.abs(anno.to.y - anno.from.y);\n ctx.strokeRect(x, y, w, h);\n } else if (anno.kind === \"freehand\") {\n drawSmoothPath(ctx, anno.points);\n } else {\n const { from, to, width } = anno;\n ctx.beginPath();\n ctx.moveTo(from.x, from.y);\n ctx.lineTo(to.x, to.y);\n ctx.stroke();\n const angle = Math.atan2(to.y - from.y, to.x - from.x);\n const head = Math.max(12, width * 4);\n ctx.beginPath();\n ctx.moveTo(to.x, to.y);\n ctx.lineTo(\n to.x - head * Math.cos(angle - Math.PI / 7),\n to.y - head * Math.sin(angle - Math.PI / 7),\n );\n ctx.lineTo(\n to.x - head * Math.cos(angle + Math.PI / 7),\n to.y - head * Math.sin(angle + Math.PI / 7),\n );\n ctx.closePath();\n ctx.fill();\n }\n\n ctx.restore();\n}\n\n/**\n * Draw a polyline as quadratic curves through midpoints. Each pair of\n * adjacent points contributes one curve where the original point is\n * the control point and the midpoint to the next is the end. This is\n * the standard \"midpoint smoothing\" trick — zero-dep, single pass.\n */\nfunction drawSmoothPath(\n ctx: CanvasRenderingContext2D,\n points: ReadonlyArray<{ x: number; y: number }>,\n) {\n if (points.length === 0) return;\n ctx.beginPath();\n const first = points[0];\n if (!first) return;\n ctx.moveTo(first.x, first.y);\n if (points.length === 1) {\n // Single dot — render a small filled circle so a tap is visible.\n ctx.arc(first.x, first.y, ctx.lineWidth / 2, 0, Math.PI * 2);\n ctx.fill();\n return;\n }\n if (points.length === 2) {\n const second = points[1]!;\n ctx.lineTo(second.x, second.y);\n ctx.stroke();\n return;\n }\n for (let i = 1; i < points.length - 1; i++) {\n const p = points[i]!;\n const next = points[i + 1]!;\n const mx = (p.x + next.x) / 2;\n const my = (p.y + next.y) / 2;\n ctx.quadraticCurveTo(p.x, p.y, mx, my);\n }\n // Final segment to the last point.\n const last = points[points.length - 1]!;\n ctx.lineTo(last.x, last.y);\n ctx.stroke();\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n captureContext,\n captureScreen,\n createManualCaptureResult,\n recordAudio,\n recordVideo,\n type CaptureResult,\n type FeedbackCategory,\n type RecorderHandle,\n type ScreenshotCaptureMode,\n type VideoRecorderHandle,\n} from \"@lumen-stack/core\";\n\nimport { useLumen } from \"./context\";\nimport {\n AnnotationLayer,\n type AnnotationLayerHandle,\n type AnnotationTool,\n} from \"./AnnotationLayer\";\n\nconst VOICE_MAX_SECONDS = 60;\nconst VIDEO_MAX_SECONDS = 60;\n\nconst SWATCHES: ReadonlyArray<{ label: string; value: string }> = [\n { label: \"Red\", value: \"rgb(239, 68, 68)\" },\n { label: \"Amber\", value: \"rgb(245, 158, 11)\" },\n { label: \"Blue\", value: \"rgb(59, 130, 246)\" },\n { label: \"Green\", value: \"rgb(34, 197, 94)\" },\n { label: \"Neutral\", value: \"rgb(244, 244, 245)\" },\n];\n\nconst STROKE_SIZES: ReadonlyArray<{ label: string; value: number; dot: number }> = [\n { label: \"Small\", value: 2, dot: 6 },\n { label: \"Medium\", value: 4, dot: 9 },\n { label: \"Large\", value: 6, dot: 12 },\n];\n\nconst CATEGORIES: ReadonlyArray<{ value: FeedbackCategory; label: string }> = [\n { value: \"bug\", label: \"Bug\" },\n { value: \"feature\", label: \"Idea\" },\n { value: \"other\", label: \"Other\" },\n];\n\ntype CaptureMethod = \"shot\" | \"screen\" | \"video\";\n\nconst METHODS: ReadonlyArray<{ value: CaptureMethod; label: string; hint: string }> = [\n { value: \"shot\", label: \"Screenshot\", hint: \"This page, instantly\" },\n { value: \"screen\", label: \"Screen\", hint: \"Pick a window or tab\" },\n { value: \"video\", label: \"Video\", hint: \"Record up to 60s\" },\n];\n\ntype Step = 1 | 2 | 3;\n\n// Capture sub-state, independent of the wizard step. The annotated artifact\n// lives on `ready`. `idle` = step 1 with nothing captured yet.\ntype Phase =\n | { kind: \"idle\" }\n | { kind: \"capturing\" }\n | { kind: \"manual\"; error?: string }\n | { kind: \"ready\"; capture: CaptureResult };\n\nexport function CaptureModal() {\n const { client, isOpen, closeCapture, user, capture } = useLumen();\n const [step, setStep] = useState<Step>(1);\n const [method, setMethod] = useState<CaptureMethod | null>(null);\n const [phase, setPhase] = useState<Phase>({ kind: \"idle\" });\n const [submitting, setSubmitting] = useState(false);\n const [progress, setProgress] = useState(0);\n // The annotated screenshot is flattened when leaving step 1 (the only step\n // where AnnotationLayer is mounted) and stashed here, because submit() runs\n // on step 3 where the annotator — and its ref — no longer exist.\n const [flattenedShot, setFlattenedShot] = useState<Blob | null>(null);\n const [wasAnnotated, setWasAnnotated] = useState(false);\n\n const [tool, setTool] = useState<AnnotationTool>(\"arrow\");\n const [strokeColor, setStrokeColor] = useState<string>(SWATCHES[0]!.value);\n const [strokeWidth, setStrokeWidth] = useState<number>(STROKE_SIZES[1]!.value);\n const [text, setText] = useState(\"\");\n const [category, setCategory] = useState<FeedbackCategory>(\"bug\");\n const [submitterEmail, setSubmitterEmail] = useState(user?.email ?? \"\");\n const [recorder, setRecorder] = useState<RecorderHandle | null>(null);\n const [audio, setAudio] = useState<{ blob: Blob; durationMs: number } | null>(\n null,\n );\n const [recordSecs, setRecordSecs] = useState(0);\n const [videoRecorder, setVideoRecorder] =\n useState<VideoRecorderHandle | null>(null);\n const [video, setVideo] = useState<{ blob: Blob; durationMs: number } | null>(\n null,\n );\n const [drawing, setDrawing] = useState(false);\n const annotationRef = useRef<AnnotationLayerHandle>(null);\n const modalRef = useRef<HTMLDivElement | null>(null);\n const previouslyFocusedRef = useRef<HTMLElement | null>(null);\n\n // Cancellation flag for in-flight captures — survives a Strict-Mode double\n // mount or a fast re-open so a stale capture can't stomp the latest phase.\n const captureCancelledRef = useRef(false);\n\n // Reset everything when the modal opens. No auto-capture: the user picks a\n // method deliberately (capture used to fire the instant the modal opened).\n useEffect(() => {\n if (!isOpen) return;\n captureCancelledRef.current = false;\n setStep(1);\n setMethod(null);\n setText(\"\");\n setAudio(null);\n setRecordSecs(0);\n setVideo(null);\n setSubmitting(false);\n setProgress(0);\n setFlattenedShot(null);\n setWasAnnotated(false);\n setVideoRecorder((cur) => {\n cur?.cancel();\n return null;\n });\n // Honor a host that forces manual upload (e.g. native shells / no DOM).\n setPhase(capture?.mode === \"manual\" ? { kind: \"manual\" } : { kind: \"idle\" });\n return () => {\n captureCancelledRef.current = true;\n };\n }, [isOpen, capture]);\n\n // Body scroll-lock + remember/restore focus while the modal is open.\n // Restore is wired through pagehide as well, so a navigation or a host\n // app crash while the modal is open can't leave the page unscrollable.\n useEffect(() => {\n if (!isOpen) return;\n previouslyFocusedRef.current =\n (document.activeElement as HTMLElement | null) ?? null;\n const html = document.documentElement;\n const prevOverflow = html.style.overflow;\n const prevPaddingRight = html.style.paddingRight;\n const scrollbar = window.innerWidth - html.clientWidth;\n html.style.overflow = \"hidden\";\n if (scrollbar > 0) html.style.paddingRight = `${scrollbar}px`;\n let restored = false;\n const restore = () => {\n if (restored) return;\n restored = true;\n html.style.overflow = prevOverflow;\n html.style.paddingRight = prevPaddingRight;\n try {\n previouslyFocusedRef.current?.focus?.();\n } catch {\n // focus() can throw if the prior element was removed from DOM.\n }\n };\n window.addEventListener(\"pagehide\", restore);\n return () => {\n window.removeEventListener(\"pagehide\", restore);\n restore();\n };\n }, [isOpen]);\n\n // ESC to close. Tab/Shift-Tab focus trap.\n useEffect(() => {\n if (!isOpen) return;\n function onKey(e: KeyboardEvent) {\n if (e.key === \"Escape\") {\n e.preventDefault();\n closeCapture();\n return;\n }\n if (e.key !== \"Tab\") return;\n const root = modalRef.current;\n if (!root) return;\n const focusables = getFocusable(root);\n if (focusables.length === 0) return;\n const first = focusables[0]!;\n const last = focusables[focusables.length - 1]!;\n const active = document.activeElement as HTMLElement | null;\n if (e.shiftKey && (active === first || !root.contains(active))) {\n e.preventDefault();\n last.focus();\n } else if (!e.shiftKey && active === last) {\n e.preventDefault();\n first.focus();\n }\n }\n document.addEventListener(\"keydown\", onKey);\n return () => document.removeEventListener(\"keydown\", onKey);\n }, [isOpen, closeCapture]);\n\n // Paste-to-upload while on the manual-capture fallback.\n useEffect(() => {\n if (!isOpen || phase.kind !== \"manual\") return;\n function onPaste(e: ClipboardEvent) {\n const items = Array.from(e.clipboardData?.items ?? []);\n const image = items.find((item) => item.type.startsWith(\"image/\"));\n const file = image?.getAsFile();\n if (!file) return;\n e.preventDefault();\n acceptManualScreenshot(file);\n }\n window.addEventListener(\"paste\", onPaste);\n return () => window.removeEventListener(\"paste\", onPaste);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isOpen, phase.kind]);\n\n // Voice record timer.\n useEffect(() => {\n if (!recorder) return;\n const start = Date.now();\n const id = window.setInterval(() => {\n const sec = Math.floor((Date.now() - start) / 1000);\n setRecordSecs(sec);\n if (sec >= VOICE_MAX_SECONDS) finishRecording();\n }, 250);\n return () => window.clearInterval(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [recorder]);\n\n if (!isOpen) return null;\n\n // ── Capture ───────────────────────────────────────────────────────────\n async function runCapture(mode: ScreenshotCaptureMode): Promise<boolean> {\n captureCancelledRef.current = false;\n setPhase({ kind: \"capturing\" });\n try {\n const result = await captureScreen({\n ...capture,\n mode,\n target: capture?.target ?? document.documentElement,\n });\n if (captureCancelledRef.current) return false;\n showCaptureWarnings(result);\n setPhase({ kind: \"ready\", capture: result });\n return true;\n } catch (e) {\n if (captureCancelledRef.current) return false;\n setPhase({\n kind: \"manual\",\n error:\n e instanceof Error\n ? e.message\n : \"Automatic screenshot capture was unavailable.\",\n });\n return false;\n }\n }\n\n async function selectMethod(m: CaptureMethod) {\n setMethod(m);\n // A fresh capture invalidates any previously-flattened annotation.\n setFlattenedShot(null);\n if (m !== \"video\") discardVideo();\n if (m === \"shot\") {\n await runCapture(capture?.mode ?? \"auto\");\n } else if (m === \"screen\") {\n await runCapture(\"true-screen\");\n } else {\n // Video still needs a screenshot poster for the required `screenshot`\n // field. Grab a DOM shot first, then start recording.\n const ok = await runCapture(capture?.mode ?? \"auto\");\n if (ok) await startVideo();\n }\n }\n\n function acceptManualScreenshot(file: Blob) {\n if (!file.type.startsWith(\"image/\")) {\n toast.error(\"Choose a PNG, JPEG, or WebP screenshot.\");\n return;\n }\n const result = createManualCaptureResult(file, [\n \"Manual screenshot upload used.\",\n ]);\n setPhase({ kind: \"ready\", capture: result });\n }\n\n function showCaptureWarnings(result: CaptureResult) {\n if (result.warnings.length === 0) return;\n toast.warning(\n \"Screenshot captured, but iframe, video, canvas, or cross-origin content may be incomplete.\",\n );\n }\n\n // ── Voice ─────────────────────────────────────────────────────────────\n async function startRecording() {\n try {\n const r = await recordAudio(VOICE_MAX_SECONDS);\n setRecorder(r);\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Microphone unavailable\");\n }\n }\n async function finishRecording() {\n if (!recorder) return;\n try {\n const result = await recorder.stop();\n setAudio({ blob: result.blob, durationMs: result.durationMs });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not stop recording\");\n } finally {\n setRecorder(null);\n }\n }\n function discardRecording() {\n recorder?.cancel();\n setRecorder(null);\n setAudio(null);\n setRecordSecs(0);\n }\n\n // ── Screen recording ──────────────────────────────────────────────────\n async function startVideo() {\n try {\n const r = await recordVideo(VIDEO_MAX_SECONDS);\n setVideoRecorder(r);\n r.stream.getVideoTracks()[0]?.addEventListener(\"ended\", () => {\n void finishVideo();\n });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Screen capture unavailable\");\n }\n }\n async function finishVideo() {\n if (!videoRecorder) return;\n const handle = videoRecorder;\n setVideoRecorder(null);\n try {\n const result = await handle.stop();\n setVideo({ blob: result.blob, durationMs: result.durationMs });\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not stop recording\");\n }\n }\n function discardVideo() {\n videoRecorder?.cancel();\n setVideoRecorder(null);\n setVideo(null);\n }\n\n // ── Navigation ────────────────────────────────────────────────────────\n const captured = phase.kind === \"ready\";\n async function goNext() {\n if (step === 1) {\n // Finalize a still-running recording before advancing so its blob is\n // ready by submit (awaited — not fire-and-forget).\n if (videoRecorder) await finishVideo();\n // Flatten the annotation now, while AnnotationLayer is still mounted.\n if (phase.kind === \"ready\") {\n const flat = await annotationRef.current?.flatten();\n setFlattenedShot(flat ?? phase.capture.blob);\n setWasAnnotated(flat != null && flat !== phase.capture.blob);\n }\n setStep(2);\n } else if (step === 2) {\n setStep(3);\n } else {\n await submit();\n }\n }\n function goBack() {\n if (step > 1) setStep((s) => (s - 1) as Step);\n }\n\n async function submit() {\n if (phase.kind !== \"ready\") return;\n const trimmed = text.trim();\n const { capture: captureResult } = phase;\n setSubmitting(true);\n setProgress(0);\n try {\n // Use the annotation flattened when we left step 1; AnnotationLayer is\n // unmounted by now so we can't re-flatten here.\n const flatScreenshot = flattenedShot ?? captureResult.blob;\n const result = await client.submit(\n {\n rawText: trimmed.length > 0 ? trimmed : undefined,\n category,\n submitterEmail: submitterEmail.trim() || undefined,\n screenshot: flatScreenshot,\n audio: audio?.blob,\n audioDurationMs: audio?.durationMs,\n video: video?.blob,\n videoDurationMs: video?.durationMs,\n context: captureContext(captureResult),\n },\n {\n onUploadProgress: (fraction) => setProgress(Math.min(0.95, fraction)),\n },\n );\n setProgress(1);\n toast.success(\"Feedback sent — thank you.\");\n void result.id;\n closeCapture();\n } catch (e) {\n toast.error(e instanceof Error ? e.message : \"Could not submit feedback\");\n setSubmitting(false);\n }\n }\n\n function onBackdropMouseDown(e: React.MouseEvent<HTMLDivElement>) {\n if (e.target === e.currentTarget && !submitting) closeCapture();\n }\n\n const uploadingPct = Math.round(progress * 100);\n const isVideoMethod = method === \"video\";\n const nextDisabled =\n (step === 1 && !captured) || submitting;\n const nextLabel =\n step < 3\n ? \"Next\"\n : submitting\n ? uploadingPct < 95\n ? `Uploading ${uploadingPct}%…`\n : \"Almost done…\"\n : \"Send feedback\";\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label=\"Send feedback\"\n className=\"lumen-modal-backdrop\"\n data-lumen-capture-ignore=\"true\"\n onMouseDown={onBackdropMouseDown}\n >\n <div\n ref={modalRef}\n className=\"lumen-modal\"\n data-lumen-drawing={drawing ? \"true\" : undefined}\n >\n <SheetGrabber onDismiss={closeCapture} />\n\n <header className=\"lumen-modal-header\">\n <h2 className=\"lumen-modal-title\">\n <span className=\"lumen-modal-title-dot\" aria-hidden=\"true\" />\n Send feedback\n </h2>\n <button\n type=\"button\"\n onClick={closeCapture}\n className=\"lumen-icon-btn\"\n aria-label=\"Close\"\n >\n ×\n </button>\n </header>\n\n <Stepper step={step} />\n\n <div className=\"lumen-modal-body\">\n {/* ── STEP 1 — Capture ── */}\n {step === 1 ? (\n <div className=\"lumen-pane\">\n <div\n className=\"lumen-method\"\n role=\"group\"\n aria-label=\"Capture method\"\n >\n {METHODS.map((m) => (\n <button\n key={m.value}\n type=\"button\"\n className=\"lumen-method-btn\"\n aria-pressed={method === m.value}\n onClick={() => selectMethod(m.value)}\n disabled={phase.kind === \"capturing\"}\n >\n <span className=\"lumen-method-label\">{m.label}</span>\n <span className=\"lumen-method-hint\">{m.hint}</span>\n </button>\n ))}\n </div>\n\n {phase.kind === \"idle\" ? (\n <div className=\"lumen-cap-empty\">\n <p>\n Pick a capture method above — nothing is captured until you\n choose, so take your time positioning the screen.\n </p>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => setPhase({ kind: \"manual\" })}\n >\n Or upload a screenshot\n </button>\n </div>\n ) : null}\n\n {phase.kind === \"capturing\" ? (\n <p className=\"lumen-status\">\n <span className=\"lumen-spinner\" aria-hidden=\"true\" />\n Capturing…\n </p>\n ) : null}\n\n {phase.kind === \"manual\" ? (\n <div className=\"lumen-manual-capture\">\n <p className=\"lumen-status\">\n {phase.error\n ? \"Automatic capture was unavailable. Upload or paste a screenshot to continue.\"\n : \"Upload or paste a screenshot to continue.\"}\n </p>\n <label className=\"lumen-manual-drop\">\n <span>Choose or paste a screenshot</span>\n <input\n type=\"file\"\n accept=\"image/png,image/jpeg,image/webp\"\n onChange={(e) => {\n const file = e.currentTarget.files?.[0];\n if (file) acceptManualScreenshot(file);\n e.currentTarget.value = \"\";\n }}\n />\n </label>\n </div>\n ) : null}\n\n {phase.kind === \"ready\" ? (\n <>\n {!isVideoMethod ? (\n <div className=\"lumen-toolbar\">\n <div\n className=\"lumen-segmented\"\n role=\"group\"\n aria-label=\"Annotation tool\"\n >\n <ToolButton\n label=\"Arrow\"\n active={tool === \"arrow\"}\n onClick={() => setTool(\"arrow\")}\n />\n <ToolButton\n label=\"Box\"\n active={tool === \"rect\"}\n onClick={() => setTool(\"rect\")}\n />\n <ToolButton\n label=\"Draw\"\n active={tool === \"freehand\"}\n onClick={() => setTool(\"freehand\")}\n />\n </div>\n <span className=\"lumen-toolbar-sep\" />\n <div\n className=\"lumen-swatches\"\n role=\"group\"\n aria-label=\"Color\"\n >\n {SWATCHES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n className=\"lumen-swatch\"\n style={{ background: s.value }}\n aria-label={s.label}\n aria-pressed={strokeColor === s.value}\n onClick={() => setStrokeColor(s.value)}\n />\n ))}\n </div>\n <div\n className=\"lumen-stroke-sizes\"\n role=\"group\"\n aria-label=\"Stroke width\"\n >\n {STROKE_SIZES.map((s) => (\n <button\n key={s.value}\n type=\"button\"\n className=\"lumen-stroke-size\"\n aria-label={s.label}\n aria-pressed={strokeWidth === s.value}\n onClick={() => setStrokeWidth(s.value)}\n >\n <span\n className=\"lumen-stroke-size-dot\"\n style={{ width: s.dot, height: s.dot }}\n />\n </button>\n ))}\n </div>\n <span className=\"lumen-toolbar-spacer\" />\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => annotationRef.current?.undo()}\n >\n Undo\n </button>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => annotationRef.current?.reset()}\n >\n Clear\n </button>\n </div>\n ) : null}\n\n <div className=\"lumen-annotate\">\n <AnnotationLayer\n ref={annotationRef}\n screenshot={phase.capture.blob}\n tool={tool}\n color={strokeColor}\n strokeWidth={strokeWidth}\n onDrawingChange={setDrawing}\n />\n </div>\n\n <div className=\"lumen-cap-actions\">\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={() => method && selectMethod(method)}\n >\n {isVideoMethod ? \"↻ Re-record\" : \"↻ Recapture\"}\n </button>\n {isVideoMethod ? (\n videoRecorder ? (\n <span className=\"lumen-recording\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n <span className=\"lumen-rec-time\">Recording…</span>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost\"\n onClick={finishVideo}\n >\n Stop\n </button>\n </span>\n ) : video ? (\n <span className=\"lumen-cap-note\">\n ✓ {Math.round(video.durationMs / 1000)}s recorded\n </span>\n ) : null\n ) : (\n <span className=\"lumen-cap-note\">\n {captureLabel(method)} captured · switch method above\n anytime\n </span>\n )}\n </div>\n </>\n ) : null}\n </div>\n ) : null}\n\n {/* ── STEP 2 — Describe ── */}\n {step === 2 ? (\n <div className=\"lumen-pane lumen-form\">\n <label className=\"lumen-label\">\n <span>What happened?</span>\n <textarea\n value={text}\n onChange={(e) => setText(e.target.value)}\n rows={3}\n placeholder=\"Describe the issue or idea…\"\n className=\"lumen-input\"\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus\n />\n </label>\n\n <div className=\"lumen-label\">\n <span>Add a voice note (optional)</span>\n <div className=\"lumen-audio-row\">\n {!recorder && !audio ? (\n <button\n type=\"button\"\n onClick={startRecording}\n className=\"lumen-btn-ghost\"\n >\n Record voice note\n </button>\n ) : null}\n {recorder ? (\n <>\n <span className=\"lumen-recording\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n <Waveform stream={recorder.stream} />\n <span className=\"lumen-rec-time\">\n {recordSecs}s / {VOICE_MAX_SECONDS}s\n </span>\n </span>\n <button\n type=\"button\"\n onClick={finishRecording}\n className=\"lumen-btn-ghost\"\n >\n Stop\n </button>\n <button\n type=\"button\"\n onClick={discardRecording}\n className=\"lumen-btn-ghost\"\n >\n Cancel\n </button>\n </>\n ) : null}\n {audio && !recorder ? (\n <>\n <AudioPreview\n blob={audio.blob}\n durationMs={audio.durationMs}\n />\n <button\n type=\"button\"\n onClick={() => setAudio(null)}\n className=\"lumen-btn-ghost\"\n >\n Remove\n </button>\n </>\n ) : null}\n </div>\n </div>\n\n <div className=\"lumen-label\">\n <span>Category</span>\n <div\n className=\"lumen-category\"\n role=\"group\"\n aria-label=\"Feedback category\"\n >\n {CATEGORIES.map((c) => (\n <button\n key={c.value}\n type=\"button\"\n className=\"lumen-category-opt\"\n aria-pressed={category === c.value}\n onClick={() => setCategory(c.value)}\n >\n {c.label}\n </button>\n ))}\n </div>\n </div>\n\n <label className=\"lumen-label\">\n <span>Your email (optional)</span>\n <input\n type=\"email\"\n value={submitterEmail}\n onChange={(e) => setSubmitterEmail(e.target.value)}\n placeholder=\"you@example.com\"\n className=\"lumen-input\"\n />\n </label>\n </div>\n ) : null}\n\n {/* ── STEP 3 — Review ── */}\n {step === 3 ? (\n <div className=\"lumen-pane lumen-review\">\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Capture</span>\n <span className=\"lumen-review-v\">\n {captureLabel(method)}\n {wasAnnotated ? \" · annotated\" : \"\"}\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(1)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Category</span>\n <span className=\"lumen-review-v\">\n <span className=\"lumen-chip\">\n {CATEGORIES.find((c) => c.value === category)?.label}\n </span>\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(2)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Description</span>\n <span className=\"lumen-review-v\">\n {text.trim() ? (\n text.trim()\n ) : (\n <span className=\"lumen-muted-empty\">—</span>\n )}\n <button\n type=\"button\"\n className=\"lumen-edit\"\n onClick={() => setStep(2)}\n >\n edit\n </button>\n </span>\n </div>\n <div className=\"lumen-review-row\">\n <span className=\"lumen-review-k\">Material</span>\n <span className=\"lumen-review-v lumen-attach-row\">\n {audio ? (\n <span className=\"lumen-attach\">\n 🎙 Voice {Math.round(audio.durationMs / 1000)}s\n <button\n type=\"button\"\n className=\"lumen-att-x\"\n aria-label=\"Remove voice note\"\n onClick={() => setAudio(null)}\n >\n ×\n </button>\n </span>\n ) : null}\n {video ? (\n <span className=\"lumen-attach\">\n ▶ Video {Math.round(video.durationMs / 1000)}s\n <button\n type=\"button\"\n className=\"lumen-att-x\"\n aria-label=\"Remove video\"\n onClick={discardVideo}\n >\n ×\n </button>\n </span>\n ) : null}\n {submitterEmail.trim() ? (\n <span className=\"lumen-attach\">✉ {submitterEmail.trim()}</span>\n ) : null}\n {!audio && !recorder ? (\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={() => {\n setStep(2);\n void startRecording();\n }}\n >\n + Voice note\n </button>\n ) : null}\n {videoRecorder ? (\n <>\n <span className=\"lumen-attach\">\n <span className=\"lumen-rec-dot\" aria-hidden=\"true\" />\n Recording…\n </span>\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={finishVideo}\n >\n Stop\n </button>\n </>\n ) : !video ? (\n <button\n type=\"button\"\n className=\"lumen-btn-ghost lumen-add-btn\"\n onClick={startVideo}\n >\n + Screen recording\n </button>\n ) : null}\n </span>\n </div>\n </div>\n ) : null}\n </div>\n\n <footer className=\"lumen-modal-footer\">\n {submitting ? (\n <div\n className=\"lumen-progress\"\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={uploadingPct}\n >\n <div\n className=\"lumen-progress-fill\"\n style={{ width: `${uploadingPct}%` }}\n />\n </div>\n ) : null}\n <div className=\"lumen-modal-actions\">\n <button\n type=\"button\"\n onClick={step === 1 ? closeCapture : goBack}\n className=\"lumen-btn-ghost\"\n disabled={submitting}\n >\n {step === 1 ? \"Cancel\" : \"Back\"}\n </button>\n <button\n type=\"button\"\n onClick={goNext}\n className=\"lumen-btn-primary\"\n disabled={nextDisabled}\n >\n {nextLabel}\n </button>\n </div>\n </footer>\n </div>\n </div>\n );\n}\n\nfunction captureLabel(method: CaptureMethod | null): string {\n if (method === \"video\") return \"Screen recording\";\n if (method === \"screen\") return \"Screen capture\";\n return \"Screenshot\";\n}\n\nfunction Stepper({ step }: { step: Step }) {\n const steps = [\n { n: 1, label: \"Capture\" },\n { n: 2, label: \"Describe\" },\n { n: 3, label: \"Review\" },\n ] as const;\n return (\n <div className=\"lumen-stepper\" aria-hidden=\"true\">\n {steps.map((s, i) => (\n <div\n key={s.n}\n className={\n \"lumen-step\" +\n (step === s.n ? \" lumen-step-active\" : \"\") +\n (step > s.n ? \" lumen-step-done\" : \"\")\n }\n >\n <span className=\"lumen-step-num\">{s.n}</span>\n <span className=\"lumen-step-lbl\">{s.label}</span>\n {i < steps.length - 1 ? <span className=\"lumen-step-bar\" /> : null}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ToolButton({\n label,\n active,\n onClick,\n}: {\n label: string;\n active: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"lumen-tool\"\n aria-pressed={active}\n >\n {label}\n </button>\n );\n}\n\n/** Mobile sheet drag-to-dismiss handle. Hidden on ≥ 640px via CSS. */\nfunction SheetGrabber({ onDismiss }: { onDismiss: () => void }) {\n const startYRef = useRef<number | null>(null);\n const startTimeRef = useRef<number>(0);\n const targetRef = useRef<HTMLElement | null>(null);\n\n function onPointerDown(e: React.PointerEvent<HTMLDivElement>) {\n e.currentTarget.setPointerCapture(e.pointerId);\n startYRef.current = e.clientY;\n startTimeRef.current = performance.now();\n targetRef.current = e.currentTarget.parentElement;\n }\n function onPointerMove(e: React.PointerEvent<HTMLDivElement>) {\n if (startYRef.current == null || !targetRef.current) return;\n const dy = Math.max(0, e.clientY - startYRef.current);\n targetRef.current.style.transform = `translateY(${dy}px)`;\n }\n function onPointerUp(e: React.PointerEvent<HTMLDivElement>) {\n if (startYRef.current == null || !targetRef.current) return;\n const dy = Math.max(0, e.clientY - startYRef.current);\n const dt = Math.max(1, performance.now() - startTimeRef.current);\n const velocity = dy / dt;\n targetRef.current.style.transform = \"\";\n targetRef.current.style.transition = \"\";\n startYRef.current = null;\n if (dy > 80 || velocity > 0.6) onDismiss();\n }\n\n return (\n <div\n className=\"lumen-modal-grabber\"\n aria-hidden=\"true\"\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerUp}\n />\n );\n}\n\n/** Live mic level visualisation. Reads time-domain samples from the\n * recorder stream and renders a centred series of rounded bars that\n * ease toward each new amplitude. AudioContext + AnalyserNode are torn\n * down on unmount so the mic isn't held open by a stale graph. */\nfunction Waveform({ stream }: { stream: MediaStream }) {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n const cssWidth = canvas.clientWidth || 88;\n const cssHeight = canvas.clientHeight || 22;\n canvas.width = Math.round(cssWidth * dpr);\n canvas.height = Math.round(cssHeight * dpr);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.scale(dpr, dpr);\n\n const AudioCtor: typeof AudioContext | undefined =\n window.AudioContext ??\n (window as unknown as { webkitAudioContext?: typeof AudioContext })\n .webkitAudioContext;\n if (!AudioCtor) return;\n const audioCtx = new AudioCtor();\n const source = audioCtx.createMediaStreamSource(stream);\n const analyser = audioCtx.createAnalyser();\n analyser.fftSize = 1024;\n analyser.smoothingTimeConstant = 0.6;\n source.connect(analyser);\n const data = new Uint8Array(analyser.fftSize);\n\n const BARS = 18;\n const GAP = 3;\n const MIN_H = 3;\n const barW = Math.max(2, (cssWidth - GAP * (BARS - 1)) / BARS);\n const radius = Math.min(barW / 2, 3);\n const levels = new Array<number>(BARS).fill(0);\n\n let raf = 0;\n let cancelled = false;\n function frame() {\n if (cancelled) return;\n analyser.getByteTimeDomainData(data);\n const bucketSize = Math.floor(data.length / BARS);\n ctx!.clearRect(0, 0, cssWidth, cssHeight);\n ctx!.fillStyle = getCssVar(\"--lumen-danger\") || \"rgb(239,68,68)\";\n for (let i = 0; i < BARS; i++) {\n let peak = 0;\n for (let j = 0; j < bucketSize; j++) {\n const v = Math.abs((data[i * bucketSize + j] ?? 128) - 128);\n if (v > peak) peak = v;\n }\n const target = Math.min(1, (peak / 128) * 1.8);\n const cur = levels[i] ?? 0;\n levels[i] = target > cur ? target : cur + (target - cur) * 0.35;\n const h = Math.max(MIN_H, levels[i]! * cssHeight);\n const x = i * (barW + GAP);\n const y = (cssHeight - h) / 2;\n roundRectPath(ctx!, x, y, barW, h, radius);\n ctx!.fill();\n }\n raf = requestAnimationFrame(frame);\n }\n raf = requestAnimationFrame(frame);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(raf);\n try {\n source.disconnect();\n } catch {\n /* ignore */\n }\n void audioCtx.close();\n };\n }, [stream]);\n\n return <canvas ref={canvasRef} className=\"lumen-waveform\" aria-hidden=\"true\" />;\n}\n\n/** Trace a rounded-rect path. Uses native `roundRect` when present and\n * falls back to manual arcs for older Safari/Firefox. */\nfunction roundRectPath(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n w: number,\n h: number,\n r: number,\n): void {\n const radius = Math.min(r, w / 2, h / 2);\n ctx.beginPath();\n const anyCtx = ctx as CanvasRenderingContext2D & {\n roundRect?: (x: number, y: number, w: number, h: number, r: number) => void;\n };\n if (typeof anyCtx.roundRect === \"function\") {\n anyCtx.roundRect(x, y, w, h, radius);\n return;\n }\n ctx.moveTo(x + radius, y);\n ctx.arcTo(x + w, y, x + w, y + h, radius);\n ctx.arcTo(x + w, y + h, x, y + h, radius);\n ctx.arcTo(x, y + h, x, y, radius);\n ctx.arcTo(x, y, x + w, y, radius);\n ctx.closePath();\n}\n\n/** Preview the recorded clip with a native <audio> element. ObjectURL is\n * revoked on unmount/swap to avoid leaking the blob into memory. */\nfunction AudioPreview({ blob, durationMs }: { blob: Blob; durationMs: number }) {\n const [url, setUrl] = useState<string>(\"\");\n useEffect(() => {\n const u = URL.createObjectURL(blob);\n setUrl(u);\n return () => {\n URL.revokeObjectURL(u);\n };\n }, [blob]);\n return (\n <div className=\"lumen-audio-preview\">\n <audio controls preload=\"metadata\" src={url} className=\"lumen-audio-el\" />\n <span className=\"lumen-audio-meta\">{Math.round(durationMs / 1000)}s</span>\n </div>\n );\n}\n\nfunction getCssVar(name: string): string {\n if (typeof window === \"undefined\") return \"\";\n return getComputedStyle(document.documentElement)\n .getPropertyValue(name)\n .trim();\n}\n\nconst FOCUSABLE_SELECTOR =\n 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\nfunction getFocusable(root: HTMLElement): HTMLElement[] {\n return Array.from(\n root.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR),\n ).filter((el) => !el.hasAttribute(\"disabled\") && el.offsetParent !== null);\n}\n","/**\n * Heuristic floor detector. Returns the height (px) of the tallest\n * full-width fixed element anchored near the bottom of the viewport\n * (e.g. a tab bar). 0 if nothing matches.\n *\n * Cheap by design: probes `elementsFromPoint` at three x positions,\n * walks up parents, dedupes. O(small constant) — the spec's literal\n * `querySelectorAll('*')` would be O(DOM) per measurement.\n */\nexport function detectBottomFloor(): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const w = window.innerWidth;\n const h = window.innerHeight;\n if (w === 0 || h === 0) return 0;\n\n const probeY = h - 4;\n const probeXs = [Math.round(w * 0.1), Math.round(w * 0.5), Math.round(w * 0.9)];\n const seen = new Set<Element>();\n let tallest = 0;\n\n for (const x of probeXs) {\n const stack = document.elementsFromPoint(x, probeY);\n for (const el of stack) {\n if (seen.has(el)) continue;\n seen.add(el);\n const cs = window.getComputedStyle(el);\n if (cs.position !== \"fixed\" && cs.position !== \"sticky\") continue;\n const rect = el.getBoundingClientRect();\n // Anchored at bottom: rect.bottom is within ~8px of viewport bottom.\n if (rect.bottom < h - 8) continue;\n if (rect.bottom > h + 8) continue;\n // Full-width-ish: at least 60% of the viewport.\n if (rect.width < w * 0.6) continue;\n if (rect.height > tallest) tallest = rect.height;\n }\n }\n return tallest;\n}\n\n/**\n * Measure the bottom-overlap of every node matching the given selectors.\n * Returns the tallest overlap.\n */\nexport function measureExplicitAvoid(selectors: string[]): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const h = window.innerHeight;\n let tallest = 0;\n for (const selector of selectors) {\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n continue;\n }\n for (const node of Array.from(nodes)) {\n const rect = node.getBoundingClientRect();\n if (rect.height === 0 || rect.width === 0) continue;\n // Bottom-overlap = how far the node extends above the bottom edge,\n // assuming it's anchored to the bottom (rect.bottom near h).\n if (rect.bottom < h - 8) continue;\n const overlap = Math.max(0, h - rect.top);\n if (overlap > tallest) tallest = overlap;\n }\n }\n return tallest;\n}\n\n/**\n * Same idea as measureExplicitAvoid but for any of the four edges.\n * Returns inset to add for the given side.\n */\nexport function measureExplicitAvoidForSide(\n selectors: string[],\n side: \"top\" | \"bottom\" | \"left\" | \"right\",\n): number {\n if (typeof document === \"undefined\" || typeof window === \"undefined\") {\n return 0;\n }\n const w = window.innerWidth;\n const h = window.innerHeight;\n let tallest = 0;\n for (const selector of selectors) {\n let nodes: NodeListOf<Element>;\n try {\n nodes = document.querySelectorAll(selector);\n } catch {\n continue;\n }\n for (const node of Array.from(nodes)) {\n const rect = node.getBoundingClientRect();\n if (rect.height === 0 || rect.width === 0) continue;\n let overlap = 0;\n switch (side) {\n case \"bottom\":\n if (rect.bottom < h - 8) break;\n overlap = Math.max(0, h - rect.top);\n break;\n case \"top\":\n if (rect.top > 8) break;\n overlap = Math.max(0, rect.bottom);\n break;\n case \"left\":\n if (rect.left > 8) break;\n overlap = Math.max(0, rect.right);\n break;\n case \"right\":\n if (rect.right < w - 8) break;\n overlap = Math.max(0, w - rect.left);\n break;\n }\n if (overlap > tallest) tallest = overlap;\n }\n }\n return tallest;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\n\nimport {\n detectBottomFloor,\n measureExplicitAvoidForSide,\n} from \"./autoDetectAvoid\";\nimport type { ResolvedFloatingConfig } from \"./types\";\n\nexport interface CollisionInsets {\n bottom: number;\n right: number;\n left: number;\n top: number;\n}\n\n/**\n * Computes the inset (px, before safe-area) the floating trigger needs\n * for its anchored corner. Subscribes to:\n * - ResizeObserver on documentElement\n * - MutationObserver on document.body (childList/attributes)\n * - visualViewport resize/scroll\n *\n * All callbacks coalesce into a single rAF measure to avoid feedback\n * loops where our CSS-var write triggers the next observer fire.\n */\nexport function useCollisionInsets(\n config: ResolvedFloatingConfig,\n): CollisionInsets {\n const [insets, setInsets] = useState<CollisionInsets>(() => ({\n bottom: config.offset.y,\n right: config.offset.x,\n left: config.offset.x,\n top: config.offset.y,\n }));\n\n // Hold the latest insets in a ref so the rAF body can compare without\n // capturing stale state.\n const lastRef = useRef(insets);\n\n // Stable identifier for the avoid array so the effect doesn't re-run\n // every render when callers pass an inline array.\n const avoidKey = avoidToKey(config.avoid);\n const placement = config.placement;\n const offsetX = config.offset.x;\n const offsetY = config.offset.y;\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n let raf = 0;\n let cancelled = false;\n\n const measure = () => {\n raf = 0;\n if (cancelled) return;\n\n const side = placement[0] === \"b\" ? \"bottom\" : \"top\";\n const xSide = placement[1] === \"r\" ? \"right\" : \"left\";\n\n let yExtra = 0;\n let xExtra = 0;\n if (config.avoid === \"auto\" && side === \"bottom\") {\n yExtra = detectBottomFloor();\n } else if (Array.isArray(config.avoid)) {\n yExtra = measureExplicitAvoidForSide(config.avoid, side);\n xExtra = measureExplicitAvoidForSide(config.avoid, xSide);\n }\n\n const next: CollisionInsets = {\n bottom: side === \"bottom\" ? offsetY + yExtra : 0,\n top: side === \"top\" ? offsetY + yExtra : 0,\n right: xSide === \"right\" ? offsetX + xExtra : 0,\n left: xSide === \"left\" ? offsetX + xExtra : 0,\n };\n const prev = lastRef.current;\n if (\n next.bottom !== prev.bottom ||\n next.top !== prev.top ||\n next.right !== prev.right ||\n next.left !== prev.left\n ) {\n lastRef.current = next;\n setInsets(next);\n }\n };\n\n const schedule = () => {\n if (raf) return;\n raf = window.requestAnimationFrame(measure);\n };\n\n schedule();\n\n const ro =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(schedule)\n : null;\n ro?.observe(document.documentElement);\n\n const mo =\n typeof MutationObserver !== \"undefined\"\n ? new MutationObserver(schedule)\n : null;\n mo?.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"hidden\"],\n });\n\n window.addEventListener(\"resize\", schedule);\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", schedule);\n vv?.addEventListener(\"scroll\", schedule);\n\n return () => {\n cancelled = true;\n if (raf) window.cancelAnimationFrame(raf);\n ro?.disconnect();\n mo?.disconnect();\n window.removeEventListener(\"resize\", schedule);\n vv?.removeEventListener(\"resize\", schedule);\n vv?.removeEventListener(\"scroll\", schedule);\n };\n // `config.avoid` is captured via avoidKey; safe to ignore in deps.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [placement, offsetX, offsetY, avoidKey]);\n\n return insets;\n}\n\nfunction avoidToKey(avoid: string[] | false | \"auto\"): string {\n if (avoid === false) return \"false\";\n if (avoid === \"auto\") return \"auto\";\n return avoid.join(\"|\");\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\n/**\n * True when the on-screen keyboard is likely visible (visualViewport has\n * shrunk by >100px). Touch devices only — desktop never returns true.\n */\nexport function useViewportKeyboard(enabled: boolean): boolean {\n const [open, setOpen] = useState(false);\n\n useEffect(() => {\n if (!enabled) {\n setOpen(false);\n return;\n }\n if (typeof window === \"undefined\") return;\n const vv = window.visualViewport;\n if (!vv) return;\n if (\n typeof window.matchMedia !== \"function\" ||\n !window.matchMedia(\"(pointer: coarse)\").matches\n ) {\n return;\n }\n\n const KEYBOARD_THRESHOLD = 100;\n let raf = 0;\n const check = () => {\n raf = 0;\n const shrink = window.innerHeight - vv.height;\n setOpen(shrink > KEYBOARD_THRESHOLD);\n };\n const schedule = () => {\n if (raf) return;\n raf = window.requestAnimationFrame(check);\n };\n\n schedule();\n vv.addEventListener(\"resize\", schedule);\n vv.addEventListener(\"scroll\", schedule);\n return () => {\n if (raf) window.cancelAnimationFrame(raf);\n vv.removeEventListener(\"resize\", schedule);\n vv.removeEventListener(\"scroll\", schedule);\n };\n }, [enabled]);\n\n return open;\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport * as React from \"react\";\n\nimport { useCollisionInsets } from \"./useCollisionInsets\";\nimport { useViewportKeyboard } from \"./useViewportKeyboard\";\nimport type { ResolvedFloatingConfig } from \"./types\";\n\nexport interface FloatingTriggerProps {\n config: ResolvedFloatingConfig;\n portalTarget?: HTMLElement;\n hidden: boolean;\n onClick: () => void;\n}\n\nexport function FloatingTrigger({\n config,\n portalTarget,\n hidden,\n onClick,\n}: FloatingTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const insets = useCollisionInsets(config);\n const keyboardOpen = useViewportKeyboard(config.hideOnKeyboard);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setTarget(portalTarget ?? document.body);\n }, [portalTarget]);\n\n useOcclusionWarning(buttonRef, !hidden && !keyboardOpen);\n\n if (!target) return null;\n\n const placement = config.placement;\n const sideY = placement[0] === \"b\" ? \"bottom\" : \"top\";\n const sideX = placement[1] === \"r\" ? \"right\" : \"left\";\n\n const yPx = sideY === \"bottom\" ? insets.bottom : insets.top;\n const xPx = sideX === \"right\" ? insets.right : insets.left;\n\n const style: React.CSSProperties = {\n position: \"fixed\",\n [sideY]: config.safeArea\n ? `calc(${yPx}px + env(safe-area-inset-${sideY}, 0px))`\n : `${yPx}px`,\n [sideX]: config.safeArea\n ? `calc(${xPx}px + env(safe-area-inset-${sideX}, 0px))`\n : `${xPx}px`,\n zIndex: config.zIndex,\n opacity: hidden || keyboardOpen ? 0 : 1,\n pointerEvents: hidden || keyboardOpen ? \"none\" : \"auto\",\n transition: \"opacity 160ms ease\",\n };\n\n return createPortal(\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"lumen-btn lumen-btn-primary lumen-btn-floating\"\n style={style}\n aria-label={config.label}\n aria-hidden={hidden || keyboardOpen ? true : undefined}\n tabIndex={hidden || keyboardOpen ? -1 : 0}\n onClick={onClick}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n {config.icon}\n <span>{config.label}</span>\n </button>,\n target,\n );\n}\n\n/**\n * Dev-only: after the first stable measurement, sample the trigger's\n * center point and warn once if a higher-z-index element overlaps it.\n */\nfunction useOcclusionWarning(\n ref: React.RefObject<HTMLButtonElement | null>,\n active: boolean,\n) {\n const warnedRef = useRef(false);\n\n useEffect(() => {\n if (process.env.NODE_ENV === \"production\") return;\n if (!active) return;\n if (warnedRef.current) return;\n if (typeof window === \"undefined\") return;\n\n const t = window.setTimeout(() => {\n const el = ref.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return;\n const cx = rect.left + rect.width / 2;\n const cy = rect.top + rect.height / 2;\n const stack = document.elementsFromPoint(cx, cy);\n const ourZ = parseZ(window.getComputedStyle(el).zIndex);\n for (const candidate of stack) {\n if (candidate === el || el.contains(candidate)) continue;\n const cz = parseZ(window.getComputedStyle(candidate).zIndex);\n if (cz > ourZ) {\n warnedRef.current = true;\n // eslint-disable-next-line no-console\n console.warn(\"[lumen] trigger is occluded by\", candidate);\n break;\n }\n }\n }, 250);\n return () => window.clearTimeout(t);\n }, [active, ref]);\n}\n\nfunction parseZ(z: string): number {\n const n = parseInt(z, 10);\n return Number.isNaN(n) ? 0 : n;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { ReactNode, RefObject } from \"react\";\n\nexport interface InlineTriggerProps {\n mount: HTMLElement | RefObject<HTMLElement | null>;\n label: string;\n icon?: ReactNode;\n onClick: () => void;\n}\n\nexport function InlineTrigger({\n mount,\n label,\n icon,\n onClick,\n}: InlineTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const el =\n mount instanceof HTMLElement ? mount : (mount.current ?? null);\n setTarget(el);\n }, [mount]);\n\n if (!target) return null;\n\n return createPortal(\n <button\n type=\"button\"\n className=\"lumen-btn lumen-btn-primary\"\n onClick={onClick}\n aria-label={label}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n {icon}\n <span>{label}</span>\n </button>,\n target,\n );\n}\n","\"use client\";\n\nimport { useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport type { ResolvedNotchConfig } from \"./types\";\n\nexport interface NotchTriggerProps {\n config: ResolvedNotchConfig;\n portalTarget?: HTMLElement;\n hidden: boolean;\n onClick: () => void;\n}\n\n/**\n * Edge-anchored notch. The resting state is a small tab on a screen\n * edge; on hover/tap it expands and opens the capture modal. A short\n * drag away from the edge (>16px) also opens, mimicking the iOS\n * Dynamic-Island pull gesture.\n *\n * Top edge → drag down. Right edge → drag left. Etc.\n */\nexport function NotchTrigger({\n config,\n portalTarget,\n hidden,\n onClick,\n}: NotchTriggerProps) {\n const [target, setTarget] = useState<HTMLElement | null>(null);\n const [expanded, setExpanded] = useState(false);\n const dragStartRef = useRef<{ x: number; y: number } | null>(null);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n setTarget(portalTarget ?? document.body);\n }, [portalTarget]);\n\n if (!target) return null;\n\n const className = `lumen-notch lumen-notch-${config.edge}${\n expanded ? \" lumen-notch-expanded\" : \"\"\n }`;\n\n function onPointerDown(e: React.PointerEvent<HTMLButtonElement>) {\n dragStartRef.current = { x: e.clientX, y: e.clientY };\n setExpanded(true);\n e.currentTarget.setPointerCapture(e.pointerId);\n }\n function onPointerMove(e: React.PointerEvent<HTMLButtonElement>) {\n const start = dragStartRef.current;\n if (!start) return;\n const dx = e.clientX - start.x;\n const dy = e.clientY - start.y;\n const triggered =\n (config.edge === \"top\" && dy > 16) ||\n (config.edge === \"bottom\" && dy < -16) ||\n (config.edge === \"right\" && dx < -16) ||\n (config.edge === \"left\" && dx > 16);\n if (triggered) {\n dragStartRef.current = null;\n onClick();\n }\n }\n function onPointerUp() {\n dragStartRef.current = null;\n setExpanded(false);\n }\n function onPointerCancel() {\n dragStartRef.current = null;\n setExpanded(false);\n }\n\n return createPortal(\n <button\n type=\"button\"\n className={className}\n style={{\n zIndex: config.zIndex,\n opacity: hidden ? 0 : 1,\n pointerEvents: hidden ? \"none\" : \"auto\",\n }}\n aria-label={config.label}\n aria-hidden={hidden ? true : undefined}\n tabIndex={hidden ? -1 : 0}\n onClick={onClick}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n onMouseEnter={() => setExpanded(true)}\n onMouseLeave={() => setExpanded(false)}\n data-lumen-trigger=\"\"\n data-lumen-capture-ignore=\"true\"\n >\n <span className=\"lumen-notch-handle\" aria-hidden=\"true\" />\n <span className=\"lumen-notch-label\">{config.icon}{config.label}</span>\n </button>,\n target,\n );\n}\n","import type { ReactNode, RefObject } from \"react\";\n\nexport type LumenTriggerPlacement = \"br\" | \"bl\" | \"tr\" | \"tl\";\n\nexport interface FloatingTriggerConfig {\n kind: \"floating\";\n placement?: LumenTriggerPlacement;\n offset?: { x?: number; y?: number };\n safeArea?: boolean;\n /** Selectors to clear; pass `false` to disable auto-detect entirely. */\n avoid?: string | string[] | false;\n hideOnKeyboard?: boolean;\n zIndex?: number;\n label?: string;\n icon?: ReactNode;\n}\n\nexport type NotchEdge = \"top\" | \"right\" | \"bottom\" | \"left\";\n\nexport interface NotchTriggerConfig {\n kind: \"notch\";\n edge?: NotchEdge;\n label?: string;\n icon?: ReactNode;\n /** z-index for the notch tab. Default 2147483600. */\n zIndex?: number;\n}\n\nexport interface ResolvedNotchConfig {\n kind: \"notch\";\n edge: NotchEdge;\n label: string;\n icon: ReactNode | undefined;\n zIndex: number;\n}\n\nexport function resolveNotchConfig(\n cfg: NotchTriggerConfig,\n): ResolvedNotchConfig {\n return {\n kind: \"notch\",\n edge: cfg.edge ?? \"top\",\n label: cfg.label ?? \"Feedback\",\n icon: cfg.icon,\n zIndex: cfg.zIndex ?? 2147483600,\n };\n}\n\nexport interface HeadlessTriggerConfig {\n kind: \"headless\";\n}\n\nexport interface InlineTriggerConfig {\n kind: \"inline\";\n mount: HTMLElement | RefObject<HTMLElement | null>;\n label?: string;\n icon?: ReactNode;\n}\n\nexport type LumenTrigger =\n | FloatingTriggerConfig\n | NotchTriggerConfig\n | HeadlessTriggerConfig\n | InlineTriggerConfig;\n\nexport type LumenTheme =\n | \"auto\"\n | \"light\"\n | \"dark\"\n | {\n background?: string;\n foreground?: string;\n accent?: string;\n radius?: string;\n };\n\nexport interface ResolvedFloatingConfig {\n kind: \"floating\";\n placement: LumenTriggerPlacement;\n offset: { x: number; y: number };\n safeArea: boolean;\n avoid: string[] | false | \"auto\";\n hideOnKeyboard: boolean;\n zIndex: number;\n label: string;\n icon: ReactNode | undefined;\n}\n\nexport function resolveFloatingConfig(\n cfg: FloatingTriggerConfig,\n): ResolvedFloatingConfig {\n return {\n kind: \"floating\",\n placement: cfg.placement ?? \"br\",\n offset: { x: cfg.offset?.x ?? 16, y: cfg.offset?.y ?? 16 },\n safeArea: cfg.safeArea ?? true,\n avoid:\n cfg.avoid === false\n ? false\n : cfg.avoid == null\n ? \"auto\"\n : Array.isArray(cfg.avoid)\n ? cfg.avoid\n : [cfg.avoid],\n hideOnKeyboard: cfg.hideOnKeyboard ?? true,\n zIndex: cfg.zIndex ?? 2147483600,\n label: cfg.label ?? \"Feedback\",\n icon: cfg.icon,\n };\n}\n","\"use client\";\n\nimport { useEffect, useId } from \"react\";\nimport type { LumenTheme } from \"./types\";\n\nconst VAR_MAP: Record<string, keyof Extract<LumenTheme, object>> = {\n \"--lumen-bg\": \"background\",\n \"--lumen-fg\": \"foreground\",\n \"--lumen-primary\": \"accent\",\n \"--lumen-radius\": \"radius\",\n};\n\n/**\n * Applies the theme by writing CSS variables to <html> (so they reach\n * the portaled CaptureModal) and toggling a data attribute for explicit\n * light/dark. Cleanup restores prior values on unmount.\n *\n * The instance id scopes attribute cleanup so two providers don't\n * stomp each other.\n */\nexport function useApplyTheme(theme: LumenTheme | undefined): void {\n const instanceId = useId();\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n const attr = `data-lumen-theme-${slug(instanceId)}`;\n const previous: Record<string, string | null> = {};\n\n if (theme === \"auto\" || theme == null) {\n // Default: rely on prefers-color-scheme already in styles.css.\n root.removeAttribute(\"data-lumen-theme\");\n } else if (theme === \"light\" || theme === \"dark\") {\n previous[\"data-lumen-theme\"] = root.getAttribute(\"data-lumen-theme\");\n root.setAttribute(\"data-lumen-theme\", theme);\n } else {\n for (const [cssVar, key] of Object.entries(VAR_MAP)) {\n const v = theme[key as keyof typeof theme];\n if (typeof v === \"string\" && v.length > 0) {\n previous[cssVar] = root.style.getPropertyValue(cssVar) || null;\n root.style.setProperty(cssVar, v);\n }\n }\n }\n root.setAttribute(attr, \"\");\n\n return () => {\n root.removeAttribute(attr);\n for (const [k, v] of Object.entries(previous)) {\n if (k.startsWith(\"--\")) {\n if (v) root.style.setProperty(k, v);\n else root.style.removeProperty(k);\n } else if (v == null) {\n root.removeAttribute(k);\n } else {\n root.setAttribute(k, v);\n }\n }\n };\n }, [theme, instanceId]);\n}\n\nfunction slug(s: string): string {\n return s.replace(/[^a-zA-Z0-9]/g, \"\");\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst PATCH_FLAG = Symbol.for(\"lumen.history.patched\");\nconst EVENT_NAME = \"lumen:locationchange\";\n\ninterface PatchedWindow extends Window {\n [PATCH_FLAG]?: true;\n}\n\n/**\n * Idempotent global patch: monkey-patches pushState/replaceState exactly\n * once per window so any number of LumenProvider instances (and React\n * StrictMode double-mounts) can subscribe without stacking patches.\n */\nfunction ensureHistoryPatch(): void {\n if (typeof window === \"undefined\") return;\n const w = window as PatchedWindow;\n if (w[PATCH_FLAG]) return;\n w[PATCH_FLAG] = true;\n\n const dispatch = () => window.dispatchEvent(new Event(EVENT_NAME));\n\n const origPush = history.pushState;\n history.pushState = function (...args: Parameters<History[\"pushState\"]>) {\n const r = origPush.apply(this, args);\n dispatch();\n return r;\n };\n const origReplace = history.replaceState;\n history.replaceState = function (\n ...args: Parameters<History[\"replaceState\"]>\n ) {\n const r = origReplace.apply(this, args);\n dispatch();\n return r;\n };\n window.addEventListener(\"popstate\", dispatch);\n}\n\n/**\n * Returns true when `predicate(location)` returns true for the current\n * location. Re-evaluates on history changes.\n */\nexport function useHideOn(\n predicate: ((location: { pathname: string }) => boolean) | undefined,\n): boolean {\n const [hidden, setHidden] = useState(false);\n\n useEffect(() => {\n if (!predicate) {\n setHidden(false);\n return;\n }\n if (typeof window === \"undefined\") return;\n ensureHistoryPatch();\n\n const evaluate = () => {\n try {\n setHidden(!!predicate({ pathname: window.location.pathname }));\n } catch {\n setHidden(false);\n }\n };\n evaluate();\n window.addEventListener(EVENT_NAME, evaluate);\n window.addEventListener(\"popstate\", evaluate);\n return () => {\n window.removeEventListener(EVENT_NAME, evaluate);\n window.removeEventListener(\"popstate\", evaluate);\n };\n }, [predicate]);\n\n return hidden;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nconst NATIVE_UA_TOKENS = [\n \"wv\", // generic Android WebView\n \"Capacitor\",\n \"Cordova\",\n \"Expo\",\n \"FBAN\",\n \"FBAV\",\n \"Instagram\",\n \"Line/\",\n \"Twitter\",\n];\n\n/**\n * Best-effort detection of a native shell (RN WebView, Capacitor,\n * Cordova, social-app webviews). Reported via context so hosts can\n * branch their own UI; we never auto-hide based on it.\n */\nexport function useNativeShell(): boolean {\n const [native, setNative] = useState(false);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const w = window as unknown as Record<string, unknown>;\n if (w.ReactNativeWebView) {\n setNative(true);\n return;\n }\n const wk = w.webkit as { messageHandlers?: unknown } | undefined;\n if (wk && wk.messageHandlers) {\n setNative(true);\n return;\n }\n const ua = navigator.userAgent || \"\";\n if (NATIVE_UA_TOKENS.some((t) => ua.includes(t))) {\n setNative(true);\n }\n }, []);\n\n return native;\n}\n","\"use client\";\n\nimport { useEffect, useState } from \"react\";\n\nimport type { LumenTrigger, NotchEdge, LumenTriggerPlacement } from \"./types\";\n\nconst STORAGE_PREFIX = \"lumen.config.v1.\";\nconst STORAGE_TTL_MS = 60 * 60 * 1000; // 1h\n\ninterface CachedEntry {\n fetchedAt: number;\n trigger: LumenTrigger;\n}\n\nexport interface RemoteConfigState {\n /** Trigger from the remote config; null while loading and no cache. */\n trigger: LumenTrigger | null;\n /** Whether the SDK should render any trigger at all. */\n enabled: boolean;\n /** True until either localStorage or the network has answered. */\n loading: boolean;\n}\n\n/**\n * Fetches `/api/v1/sdk/config?apiKey=…` and caches the result in\n * localStorage so the trigger can render instantly on subsequent loads.\n *\n * Returns immediately from the cache, then revalidates in the\n * background. Falls back to `null` (caller will use its built-in\n * default) on every error path so a flaky config endpoint can never\n * break the host page.\n */\nexport function useRemoteConfig(\n apiKey: string,\n apiUrl: string,\n): RemoteConfigState {\n const [state, setState] = useState<RemoteConfigState>(() => ({\n trigger: null,\n enabled: true,\n loading: true,\n }));\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n\n const cached = readCache(apiKey);\n if (cached) {\n setState({\n trigger: cached.trigger,\n enabled: triggerEnabled(cached.trigger),\n loading: false,\n });\n }\n\n const controller = new AbortController();\n // Hard timeout: the SDK can't hold its loading state hostage to a\n // slow or hung /sdk/config endpoint. After 5s we abort and resolve\n // to a sensible default so the host page never sees a broken widget.\n const timeoutId = window.setTimeout(() => controller.abort(), 5000);\n const url = `${apiUrl.replace(/\\/$/, \"\")}/api/v1/sdk/config?apiKey=${encodeURIComponent(apiKey)}`;\n fetch(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n signal: controller.signal,\n })\n .then(async (res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const body = (await res.json()) as { trigger?: unknown };\n const trigger = parseTrigger(body.trigger);\n if (!trigger) throw new Error(\"Malformed config response\");\n writeCache(apiKey, trigger);\n setState({\n trigger,\n enabled: triggerEnabled(trigger),\n loading: false,\n });\n })\n .catch(() => {\n // Network/parse errors fall through to defaults — never block.\n setState((prev) =>\n prev.loading\n ? { trigger: null, enabled: true, loading: false }\n : prev,\n );\n })\n .finally(() => window.clearTimeout(timeoutId));\n\n return () => {\n window.clearTimeout(timeoutId);\n controller.abort();\n };\n }, [apiKey, apiUrl]);\n\n return state;\n}\n\nfunction triggerEnabled(t: LumenTrigger): boolean {\n // The SDK type doesn't carry `enabled` directly because hosts that\n // build a trigger inline would never need it; the *remote* type does\n // ship it as the on/off toggle and we encode that here as the\n // headless variant.\n return t.kind !== \"headless\";\n}\n\nconst VALID_PLACEMENTS: readonly LumenTriggerPlacement[] = [\n \"br\",\n \"bl\",\n \"tr\",\n \"tl\",\n];\nconst VALID_EDGES: readonly NotchEdge[] = [\"top\", \"right\", \"bottom\", \"left\"];\n\n/**\n * Defensive parser for the remote config payload. Exported for tests;\n * the hook uses it internally. Returns null when the shape is bad so\n * the caller can fall back to defaults instead of rendering garbage.\n */\nexport function parseTrigger(raw: unknown): LumenTrigger | null {\n if (!raw || typeof raw !== \"object\") return null;\n const r = raw as Record<string, unknown>;\n\n // The dashboard ships `enabled` as the on/off toggle — when off,\n // collapse to a headless trigger so the SDK renders nothing.\n if (r.enabled === false) return { kind: \"headless\" };\n\n const label = typeof r.label === \"string\" ? r.label : \"Feedback\";\n\n if (r.kind === \"floating\") {\n const placement =\n VALID_PLACEMENTS.find((p) => p === r.placement) ?? \"br\";\n return { kind: \"floating\", placement, label };\n }\n if (r.kind === \"notch\") {\n const edge = VALID_EDGES.find((e) => e === r.edge) ?? \"top\";\n return { kind: \"notch\", edge, label };\n }\n return null;\n}\n\nfunction readCache(apiKey: string): CachedEntry | null {\n try {\n const raw = window.localStorage.getItem(STORAGE_PREFIX + apiKey);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as CachedEntry;\n if (\n typeof parsed?.fetchedAt !== \"number\" ||\n Date.now() - parsed.fetchedAt > STORAGE_TTL_MS\n ) {\n return null;\n }\n const trigger = parseTrigger(parsed.trigger);\n return trigger ? { fetchedAt: parsed.fetchedAt, trigger } : null;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(apiKey: string, trigger: LumenTrigger): void {\n try {\n window.localStorage.setItem(\n STORAGE_PREFIX + apiKey,\n JSON.stringify({ fetchedAt: Date.now(), trigger }),\n );\n } catch {\n // Quota / private mode — fail silent.\n }\n}\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport * as React from \"react\";\nimport {\n installRuntimeCapture,\n LumenClient,\n type AmplitudeIdentity,\n type LumenUser,\n type ScreenshotCaptureOptions,\n} from \"@lumen-stack/core\";\n\nimport { LumenContext, type LumenContextValue } from \"./context\";\nimport { CaptureModal } from \"./CaptureModal\";\nimport { FloatingTrigger } from \"./trigger/FloatingTrigger\";\nimport { InlineTrigger } from \"./trigger/InlineTrigger\";\nimport { NotchTrigger } from \"./trigger/NotchTrigger\";\nimport {\n resolveFloatingConfig,\n resolveNotchConfig,\n type LumenTheme,\n type LumenTrigger,\n} from \"./trigger/types\";\nimport { useApplyTheme } from \"./trigger/theme\";\nimport { useHideOn } from \"./trigger/useHideOn\";\nimport { useNativeShell } from \"./trigger/useNativeShell\";\nimport { useRemoteConfig } from \"./trigger/useRemoteConfig\";\n\nconst DEFAULT_API_URL = \"https://shakebugs.vercel.app\";\n\nexport interface LumenProviderProps {\n apiKey: string;\n /** Override the dashboard origin. Defaults to https://shakebugs.vercel.app. */\n apiUrl?: string;\n user?: LumenUser;\n /**\n * Amplitude analytics identity for the current user. When set and the\n * project has the Amplitude integration enabled, Lumen pulls this user's\n * recent event timeline at enrichment time so the AI triage understands\n * what they did before reporting. Pass what your Amplitude instance holds:\n * `amplitude={{ userId: amp.getUserId(), deviceId: amp.getDeviceId(), sessionId: String(amp.getSessionId()) }}`.\n */\n amplitude?: AmplitudeIdentity;\n /**\n * @deprecated Use `trigger` instead. `floatingButton={false}` is\n * equivalent to `trigger={{ kind: \"headless\" }}`.\n */\n floatingButton?: boolean;\n /**\n * Trigger configuration. When omitted the SDK fetches the dashboard's\n * widget config from `/api/v1/sdk/config` and renders that. Pass a\n * value here to override the dashboard config locally.\n */\n trigger?: LumenTrigger;\n /** Hide the trigger on certain routes. Modal stays open if already open. */\n hideOn?: (location: { pathname: string }) => boolean;\n theme?: LumenTheme;\n /** Where to portal the floating trigger. Defaults to document.body. */\n portalTarget?: HTMLElement;\n /** Screenshot capture behavior and optional native/custom provider. */\n capture?: ScreenshotCaptureOptions;\n /**\n * Called exactly once whenever the Lumen sheet opens (`true`) or closes\n * (`false`). Never fires on the initial mount. Correct across all trigger\n * types. No spurious `false` during the 3-step capture wizard — `isOpen`\n * stays `true` throughout.\n *\n * Use this to hide/show native UI in a WebView host. Two complementary\n * approaches work together:\n *\n * **Option A — React prop (same-process host):**\n * ```tsx\n * <LumenProvider\n * onOpenChange={(open) => tabBarRef.current?.setVisible(!open)}\n * >\n * ```\n *\n * **Option B — MutationObserver (injected JS from native shell):**\n * While Lumen is open, `document.body` carries `data-lumen-open=\"true\"`.\n * Observe it from React Native / Capacitor / Electron:\n * ```tsx\n * // React Native (App.tsx)\n * <WebView\n * injectedJavaScript={`\n * const obs = new MutationObserver(() => {\n * const open = document.body.hasAttribute('data-lumen-open');\n * window.ReactNativeWebView.postMessage(\n * JSON.stringify({ type: 'lumen:openChange', open })\n * );\n * });\n * obs.observe(document.body, {\n * attributes: true,\n * attributeFilter: ['data-lumen-open'],\n * });\n * `}\n * onMessage={(e) => {\n * const { type, open } = JSON.parse(e.nativeEvent.data);\n * if (type === 'lumen:openChange') setTabBarVisible(!open);\n * }}\n * />\n * ```\n */\n onOpenChange?: (open: boolean) => void;\n children: React.ReactNode;\n}\n\nexport function LumenProvider({\n apiKey,\n apiUrl,\n user,\n amplitude,\n floatingButton = true,\n trigger,\n hideOn,\n theme,\n portalTarget,\n capture,\n onOpenChange,\n children,\n}: LumenProviderProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [isSubmitting] = useState(false);\n const [error] = useState<Error | null>(null);\n\n const client = useMemo(\n () => new LumenClient({ apiKey, apiUrl, user, amplitude }),\n [\n apiKey,\n apiUrl,\n user?.id,\n user?.email,\n user?.name,\n amplitude?.userId,\n amplitude?.deviceId,\n amplitude?.sessionId,\n ],\n );\n\n // Patches console + fetch + XHR on mount. Idempotent — safe under\n // Strict Mode double-invocation, and a no-op on the server.\n useEffect(() => {\n installRuntimeCapture({\n ignoreUrlPrefix: (apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\"),\n });\n }, [apiUrl]);\n\n // ── onOpenChange + data-lumen-open DOM attribute ─────────────────────────\n // Kept in two separate effects so the DOM attribute (which needs a cleanup\n // to survive Strict-Mode's fake-unmount cycle) and the callback (which must\n // fire exactly once per transition) stay independent.\n\n // Stable ref so inline callbacks never cause stale-closure problems.\n const onOpenChangeRef = useRef(onOpenChange);\n onOpenChangeRef.current = onOpenChange;\n\n // DOM attribute — readable by MutationObserver from injected WebView JS.\n // cleanup runs on Strict-Mode teardown AND real unmount, so the attribute\n // is always removed when this effect version is discarded.\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n if (isOpen) {\n document.body.setAttribute(\"data-lumen-open\", \"true\");\n } else {\n document.body.removeAttribute(\"data-lumen-open\");\n }\n return () => {\n document.body.removeAttribute(\"data-lumen-open\");\n };\n }, [isOpen]);\n\n // Callback — fires exactly once per real open/close transition.\n // prevIsOpenRef starts as null so the initial false on mount is skipped.\n // The `=== isOpen` guard prevents double-fire under Strict-Mode re-runs.\n const prevIsOpenRef = useRef<boolean | null>(null);\n useEffect(() => {\n if (prevIsOpenRef.current === isOpen) return;\n const prev = prevIsOpenRef.current;\n prevIsOpenRef.current = isOpen;\n if (prev === null) return; // initial mount — no transition yet\n onOpenChangeRef.current?.(isOpen);\n }, [isOpen]);\n // ─────────────────────────────────────────────────────────────────────────\n\n const open = useCallback(() => setIsOpen(true), []);\n const close = useCallback(() => setIsOpen(false), []);\n const submit = useCallback(client.submit.bind(client), [client]);\n\n const isNativeShell = useNativeShell();\n const hideTrigger = useHideOn(hideOn);\n useApplyTheme(theme);\n\n // Remote config: only fetched when the host hasn't pinned a trigger.\n // Passing the same apiUrl the LumenClient resolves to keeps the two\n // calls in lockstep.\n const remote = useRemoteConfig(\n trigger ? \"\" : apiKey,\n apiUrl ?? DEFAULT_API_URL,\n );\n\n const value = useMemo<LumenContextValue>(\n () => ({\n client,\n user,\n isOpen,\n isSubmitting,\n error,\n open,\n close,\n openCapture: open,\n closeCapture: close,\n submit,\n isNativeShell,\n capture,\n }),\n [\n client,\n user,\n isOpen,\n isSubmitting,\n error,\n open,\n close,\n submit,\n isNativeShell,\n capture,\n ],\n );\n\n const effectiveTrigger = resolveEffectiveTrigger({\n explicit: trigger,\n remote: remote.trigger,\n remoteLoading: remote.loading,\n floatingButton,\n });\n\n return (\n <LumenContext.Provider value={value}>\n {children}\n {effectiveTrigger?.kind === \"floating\" ? (\n <FloatingTrigger\n config={resolveFloatingConfig(effectiveTrigger)}\n portalTarget={portalTarget}\n hidden={hideTrigger}\n onClick={open}\n />\n ) : null}\n {effectiveTrigger?.kind === \"notch\" ? (\n <NotchTrigger\n config={resolveNotchConfig(effectiveTrigger)}\n portalTarget={portalTarget}\n hidden={hideTrigger}\n onClick={open}\n />\n ) : null}\n {effectiveTrigger?.kind === \"inline\" ? (\n <InlineTrigger\n mount={effectiveTrigger.mount}\n label={effectiveTrigger.label ?? \"Feedback\"}\n icon={effectiveTrigger.icon}\n onClick={open}\n />\n ) : null}\n <CaptureModal />\n </LumenContext.Provider>\n );\n}\n\n/**\n * Trigger resolution precedence:\n * 1. Explicit `trigger` prop wins (host opt-out from remote).\n * 2. `floatingButton={false}` → headless (legacy escape hatch).\n * 3. Remote config from /api/v1/sdk/config.\n * 4. While remote is still loading without a cached value, render\n * nothing (avoids a flash of the default in the wrong place).\n * 5. If remote ultimately fails, fall back to the floating default\n * so the host always has *something*.\n */\nfunction resolveEffectiveTrigger(args: {\n explicit: LumenTrigger | undefined;\n remote: LumenTrigger | null;\n remoteLoading: boolean;\n floatingButton: boolean;\n}): LumenTrigger | null {\n if (args.explicit) return args.explicit;\n if (args.floatingButton === false) return { kind: \"headless\" };\n if (args.remote) return args.remote;\n if (args.remoteLoading) return null;\n return { kind: \"floating\" };\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useLumen } from \"./context\";\n\nexport interface FeedbackButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"default\" | \"ghost\" | \"outline\";\n /** Render fixed in the bottom-right corner. */\n floating?: boolean;\n}\n\nexport function FeedbackButton({\n variant = \"default\",\n floating = false,\n className,\n children = \"Feedback\",\n onClick,\n ...rest\n}: FeedbackButtonProps) {\n const { openCapture } = useLumen();\n const cls = [\n \"lumen-btn\",\n variant === \"default\" ? \"lumen-btn-primary\" : null,\n variant === \"ghost\" ? \"lumen-btn-ghost\" : null,\n variant === \"outline\" ? \"lumen-btn-outline\" : null,\n floating ? \"lumen-btn-floating\" : null,\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n type=\"button\"\n className={cls}\n onClick={(e) => {\n onClick?.(e);\n if (!e.defaultPrevented) openCapture();\n }}\n {...rest}\n >\n {children}\n </button>\n );\n}\n"]}
|