@ldlework/feedback 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/geometry.ts","../src/core/document.ts","../src/core/persistence.ts","../src/core/useFeedbackDoc.ts","../src/core/navigation.ts","../src/core/submission.ts","../src/core/context.tsx","../src/core/coordinates.ts","../src/hooks/useReview.ts","../src/hooks/useSubmission.ts","../src/core/targetAddress.ts","../src/hooks/useEdgeDraft.ts","../src/hooks/usePointerDrag.ts","../src/hooks/useSpawnGesture.ts","../src/hooks/useAutoGrow.ts","../src/hooks/useElementHeight.ts","../src/design/IconButton.tsx","../src/design/Icon.tsx","../src/design/icons.tsx","../src/ontology/note/StickyNote.tsx","../src/ontology/note/NoteKnobs.tsx","../src/design/Arrow.tsx","../src/ontology/edge/Edge.tsx","../src/ontology/edge/DraftEdge.tsx","../src/ontology/Overlay.tsx","../src/ontology/note/GhostNote.tsx","../src/ontology/dock/FeedbackDock.tsx","../src/design/Toolbar.tsx","../src/ontology/review/ReviewBar.tsx","../src/hooks/useAnchoredPosition.ts","../src/design/Popover.tsx","../src/ontology/help/HelpGuide.tsx","../src/ontology/FeedbackLayer.tsx","../src/core/FeedbackRegion.tsx"],"names":["useState","useEffect","useMemo","useCallback","useRef","IconButton","jsx","jsxs","originX","Fragment","createPortal","Knob"],"mappings":";;;;;;;AAEO,IAAM,UAAA,GAAa,GAAA;AACnB,IAAM,eAAA,GAAkB,GAAA;AAKxB,IAAM,KAAA,GAAgB,CAAC,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAQhD,SAAS,SAAA,CAAU,IAAA,EAAa,IAAA,EAAY,MAAA,EAAuB;AACxE,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,MAAA;AACH,MAAA,OAAO,EAAE,GAAG,IAAA,CAAK,CAAA,EAAG,GAAG,IAAA,CAAK,CAAA,GAAI,SAAS,CAAA,EAAE;AAAA,IAC7C,KAAK,OAAA;AACH,MAAA,OAAO,EAAE,GAAG,IAAA,CAAK,CAAA,GAAI,YAAY,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,MAAA,GAAS,CAAA,EAAE;AAAA,IAC1D,KAAK,QAAA;AACH,MAAA,OAAO,EAAE,GAAG,IAAA,CAAK,CAAA,GAAI,aAAa,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,MAAA,EAAO;AAAA;AAE9D;AAcA,IAAM,GAAA,GAAM,EAAA;AACZ,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,UAAA,GAAa,GAAA;AAMZ,SAAS,aAAA,CAAc,OAAc,IAAA,EAA4B;AACtE,EAAA,MAAM,SAAS,EAAE,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,CAAM,GAAG,IAAA,CAAK,CAAC,IAAI,GAAA,EAAK,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,CAAM,GAAG,IAAA,CAAK,CAAC,IAAI,GAAA,EAAI;AACxF,EAAA,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,GAAI,MAAA,CAAO,CAAA,EAAE;AACzD,EAAA,MAAM,CAAA,GAAI,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,MAAA,CAAO,CAAA,EAAE;AACvD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AAChD,EAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AACzB,EAAA,MAAM,EAAA,GAAA,CAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,CAAA,IAAK,GAAA;AACzB,EAAA,MAAM,IAAA,GAAO,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,SAAA,EAAW,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,EAAA,GAAK,SAAA,EAAU;AAChE,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,KAAA,EAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,CAAM,CAAC,IAAI,GAAA,GAAM,CAAA;AAAA,IAC1C,MAAA,EAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,CAAM,CAAC,IAAI,GAAA,GAAM,CAAA;AAAA,IAC3C,KAAA,EAAO,CAAA;AAAA,IACP,IAAA;AAAA,IACA,IAAA,EAAM,CAAA;AAAA,IACN,KAAA,EAAO;AAAA,MACL,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,YAAY,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,UAAA,EAAW;AAAA,MAC3D,EAAE,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,YAAY,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,EAAA,GAAK,UAAA;AAAW;AAC7D,GACF;AACF;;;ACbO,IAAM,YAAyB,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,EAAC;AAOpD,SAAS,aAAa,IAAA,EAA4B;AACvD,EAAA,MAAM,KAAA,GAAQ,eAAe,IAAI,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,eAAe,QAAA,CAAS,IAAI,IAAI,IAAA,CAAK,KAAA,GAAQ,MAAS,CAAA,CAAE,MAAA;AAAA,IAAO,CAAC,SAC5E,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,EAAA,KAAO,IAAA,CAAK,MAAM;AAAA,GAC9C;AACA,EAAA,OAAO,EAAE,OAAO,KAAA,EAAM;AACxB;AAEA,SAAS,eAAe,IAAA,EAA+B;AACrD,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,OAAO,QAAA,CAAS,IAAI,CAAA,IAAK,KAAA,CAAM,QAAQ,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAC;AACrG,EAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAI,MAAM,CAAA;AACxC;AAEA,SAAS,eAAe,IAAA,EAA+B;AACrD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AACpE;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAEA,SAAS,OAAO,CAAA,EAA0C;AACxD,EAAA,OAAO;AAAA,IACL,IAAI,OAAO,CAAA,CAAE,OAAO,QAAA,GAAW,CAAA,CAAE,KAAK,GAAA,EAAI;AAAA,IAC1C,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,GAAA;AAAA,IAC5C,SAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA;AAAA,IACrD,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AAAA,IAClB,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AAAA,IAClB,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,EAAA;AAAA,IAC5C,QAAA,EAAU,EAAE,QAAA,KAAa;AAAA,GAC3B;AACF;AAEA,SAAS,OAAO,CAAA,EAA0C;AACxD,EAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,KAAS,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAA,CAAE,IAAA,KAAS,OAAA,GAAU,CAAA,CAAE,IAAA,GAAO,OAAA;AACvF,EAAA,OAAO;AAAA,IACL,IAAI,OAAO,CAAA,CAAE,OAAO,QAAA,GAAW,CAAA,CAAE,KAAK,GAAA,EAAI;AAAA,IAC1C,MAAM,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,GAAW,EAAE,IAAA,GAAO,GAAA;AAAA,IAC5C,SAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,IAAA;AAAA,IACrD,QAAQ,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,GAAW,EAAE,MAAA,GAAS,EAAA;AAAA,IAClD,IAAA;AAAA,IACA,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AAAA,IAClB,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,IAAK,CAAA;AAAA,IAClB,MAAA,EAAQ,QAAA,CAAS,CAAA,CAAE,MAAM;AAAA,GAC3B;AACF;AAEA,SAAS,SAAS,IAAA,EAAkC;AAClD,EAAA,IAAI,CAAC,SAAS,IAAI,CAAA,IAAK,OAAO,IAAA,CAAK,QAAA,KAAa,UAAU,OAAO,IAAA;AACjE,EAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,IAAA,GAAO,IAAA,EAAK;AAC3F;AAGO,SAAS,GAAA,GAAc;AAC5B,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,gBAAgB,MAAA,EAAQ,OAAO,OAAO,UAAA,EAAW;AACtF,EAAA,OAAO,MAAM,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,IAAI,IAAA,CAAK,GAAA,EAAI,CAAE,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AAC7E;;;ACnGO,SAAS,OAAA,CAAQ,UAAA,EAAoB,IAAA,GAAoB,SAAA,EAAwB;AACtF,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AACrD,EAAA,IAAI,MAAA,KAAW,MAAM,OAAO,IAAA;AAC5B,EAAA,IAAI;AACF,IAAA,OAAO,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,EACxC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,SAAS,QAAA,CAAS,YAAoB,GAAA,EAAwB;AACnE,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,EAAA,IAAI;AACF,IAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EAC7D,SAAS,GAAA,EAAK;AACZ,IAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,GAAG,CAAA;AAAA,EACnD;AACF;AAGA,eAAsB,SAAA,CAAU,KAAkB,QAAA,EAAiC;AACjF,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,EAAE,6BAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,EAAG,GAAG,GAAA,EAAI,EAAG,MAAM,CAAC,CAAA;AACxF,EAAA,IAAI,MAAM,aAAA,CAAc,OAAA,EAAS,QAAQ,CAAA,EAAG;AAC5C,EAAA,eAAA,CAAgB,SAAS,QAAQ,CAAA;AACnC;AAGA,eAAsB,SAAA,GAAyC;AAC7D,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,EAAS;AAC5B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,IAAI;AACF,IAAA,OAAO,aAAa,IAAA,CAAK,KAAA,CAAM,MAAM,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAsBA,IAAM,UAAA,GAAa,CAAC,EAAE,WAAA,EAAa,MAAA,EAAQ,MAAA,EAAQ,EAAE,kBAAA,EAAoB,CAAC,OAAO,CAAA,EAAE,EAAG,CAAA;AAGtF,eAAe,aAAA,CAAc,MAAc,QAAA,EAAoC;AAC7E,EAAA,MAAM,SAAU,MAAA,CAA8D,kBAAA;AAC9E,EAAA,IAAI,OAAO,MAAA,KAAW,UAAA,EAAY,OAAO,KAAA;AACzC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,EAAE,eAAe,QAAA,EAAU,KAAA,EAAO,YAAY,CAAA;AAC1E,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,cAAA,EAAe;AAC7C,IAAA,MAAM,QAAA,CAAS,MAAM,IAAI,CAAA;AACzB,IAAA,MAAM,SAAS,KAAA,EAAM;AACrB,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,GAAA,EAAK;AAEZ,IAAA,IAAI,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,cAAc,OAAO,IAAA;AACrE,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,eAAA,CAAgB,MAAc,QAAA,EAAwB;AAC7D,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,IAAA,CAAK,CAAC,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAC,CAAA;AAC9E,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACzC,EAAA,MAAA,CAAO,IAAA,GAAO,GAAA;AACd,EAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,EAAA,MAAA,CAAO,KAAA,EAAM;AACb,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACzB;AAEA,eAAe,QAAA,GAAiC;AAC9C,EAAA,MAAM,SAAU,MAAA,CAA8D,kBAAA;AAC9E,EAAA,IAAI,OAAO,WAAW,UAAA,EAAY;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,CAAC,MAAM,CAAA,GAAI,MAAM,MAAA,CAAO,EAAE,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,UAAA,EAAY,CAAA;AACpE,MAAA,OAAO,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,EAAQ,GAAI,IAAA;AAAA,IAC3C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,YAAA,IAAgB,GAAA,CAAI,IAAA,KAAS,cAAc,OAAO,IAAA;AAAA,IAEvE;AAAA,EACF;AACA,EAAA,OAAO,YAAA,EAAa;AACtB;AAGA,SAAS,YAAA,GAAqC;AAC5C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,aAAA,CAAc,OAAO,CAAA;AAC5C,IAAA,KAAA,CAAM,IAAA,GAAO,MAAA;AACb,IAAA,KAAA,CAAM,MAAA,GAAS,wBAAA;AACf,IAAA,KAAA,CAAM,gBAAA,CAAiB,QAAA,EAAU,MAAM,OAAA,CAAQ,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,IAAK,IAAI,CAAA,EAAG,EAAE,IAAA,EAAM,MAAM,CAAA;AACxF,IAAA,KAAA,CAAM,KAAA,EAAM;AAAA,EACd,CAAC,CAAA;AACH;;;ACrGO,SAAS,cAAA,CAAe,YAAoB,IAAA,EAAoC;AACrF,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAI,QAAA;AAAA,IAAsB,MAC1C,OAAA,CAAQ,UAAA,EAAY,OAAO,YAAA,CAAa,IAAI,IAAI,SAAS;AAAA,GAC3D;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,YAAY,GAAG,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,UAAA,EAAY,GAAG,CAAC,CAAA;AAEpB,EAAA,MAAM,UAAU,WAAA,CAAY,CAAC,IAAA,EAAc,OAAA,EAAwB,GAAW,CAAA,KAAc;AAC1F,IAAA,MAAM,IAAA,GAAqB,EAAE,EAAA,EAAI,GAAA,EAAI,EAAG,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,IAAA,EAAM,EAAA,EAAI,QAAA,EAAU,KAAA,EAAM;AACvF,IAAA,MAAA,CAAO,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAC,GAAG,CAAA,CAAE,KAAA,EAAO,IAAI,CAAA,EAAE,CAAE,CAAA;AACnD,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EACd,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,EAAA,EAAY,KAAA,KAAqB;AAC/D,IAAA,MAAA,CAAO,CAAC,OAAO,EAAE,GAAG,GAAG,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAO,EAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,GAAG,KAAA,EAAM,GAAI,CAAE,CAAA,EAAE,CAAE,CAAA;AAAA,EAC7F,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,EAAA,KAAe;AAC7C,IAAA,MAAA,CAAO,CAAC,CAAA,MAAO;AAAA,MACb,KAAA,EAAO,EAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAAA,MACxC,KAAA,EAAO,EAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,EAAE;AAAA,KAC9C,CAAE,CAAA;AAAA,EACJ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,CAAC,IAAA,KAAmC;AAC9D,IAAA,MAAA,CAAO,CAAC,CAAA,MAAO,EAAE,GAAG,CAAA,EAAG,KAAA,EAAO,CAAC,GAAG,CAAA,CAAE,KAAA,EAAO,EAAE,GAAG,IAAA,EAAM,EAAA,EAAI,KAAI,EAAG,GAAE,CAAE,CAAA;AAAA,EACvE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,EAAA,EAAY,KAAA,KAAqB;AAC/D,IAAA,MAAA,CAAO,CAAC,OAAO,EAAE,GAAG,GAAG,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAO,EAAE,EAAA,KAAO,EAAA,GAAK,EAAE,GAAG,CAAA,EAAG,GAAG,KAAA,EAAM,GAAI,CAAE,CAAA,EAAE,CAAE,CAAA;AAAA,EAC7F,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,CAAC,EAAA,KAAe;AAC7C,IAAA,MAAA,CAAO,CAAC,CAAA,MAAO,EAAE,GAAG,GAAG,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,GAAE,CAAE,CAAA;AAAA,EACrE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAU,YAAY,CAAC,IAAA,KAAsB,OAAO,IAAI,CAAA,EAAG,EAAE,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF;AC3DO,SAAS,qBAAA,GAA4C;AAC1D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,QAAAA,CAAS,MAAO,OAAO,QAAA,KAAa,WAAA,GAAc,GAAA,GAAM,QAAA,CAAS,QAAS,CAAA;AAElG,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA;AAC5C,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,IAAI,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,UAAA,EAAY,IAAI,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,OAAA;AAAA,IACL,OAAO;AAAA,MACL,IAAA;AAAA,MACA,QAAA,EAAU,CAAC,EAAA,KAAO;AAChB,QAAA,IAAI,EAAA,KAAO,SAAS,QAAA,EAAU;AAC9B,QAAA,OAAA,CAAQ,SAAA,CAAU,IAAA,EAAM,EAAA,EAAI,EAAE,CAAA;AAC9B,QAAA,OAAA,CAAQ,EAAE,CAAA;AACV,QAAA,MAAA,CAAO,aAAA,CAAc,IAAI,aAAA,CAAc,UAAU,CAAC,CAAA;AAAA,MACpD;AAAA,KACF,CAAA;AAAA,IACA,CAAC,IAAI;AAAA,GACP;AACF;;;AClBO,SAAS,iBAAA,CAAkB,GAAA,EAAa,OAAA,GAA2B,EAAC,EAAsB;AAC/F,EAAA,OAAO,OAAO,GAAA,KAAQ;AACpB,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,MAAA,EAAQ,QAAQ,MAAA,IAAU,MAAA;AAAA,MAC1B,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,SAAS,EAAE,cAAA,EAAgB,kBAAA,EAAoB,GAAG,QAAQ,OAAA,EAAQ;AAAA,MAClE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,EAAE,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,EAAG,GAAG,GAAA,EAAK;AAAA,KACvE,CAAA;AACD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAI,MAAM,CAAA,4BAAA,EAA+B,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,IACzF;AAAA,EACF,CAAA;AACF;AAGO,SAAS,iBAAiB,MAAA,EAA+D;AAC9F,EAAA,IAAI,MAAA,IAAU,MAAM,OAAO,IAAA;AAC3B,EAAA,OAAO,OAAO,MAAA,KAAW,QAAA,GAAW,iBAAA,CAAkB,MAAM,CAAA,GAAI,MAAA;AAClE;ACiBA,IAAM,eAAA,GAAkB,cAA2C,IAAI,CAAA;AA8BhE,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,UAAA,GAAa,UAAA;AAAA,EACb,QAAA,GAAW,eAAA;AAAA,EACX,UAAA;AAAA,EACA,cAAA,GAAiB,QAAA;AAAA,EACjB,SAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA0B;AACxB,EAAA,MAAM,GAAA,GAAM,cAAA,CAAe,UAAA,EAAY,UAAU,CAAA;AACjD,EAAA,MAAM,SAAA,GAAYC,QAAQ,MAAM,gBAAA,CAAiB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAClE,EAAA,MAAM,cAAc,qBAAA,EAAsB;AAC1C,EAAA,MAAM,MAAM,UAAA,IAAc,WAAA;AAE1B,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIF,SAA+B,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,QAAAA,CAAiC,EAAE,CAAA;AACjE,EAAA,MAAM,OAAA,GAAU,OAAsB,IAAI,CAAA;AAE1C,EAAA,MAAM,UAAA,GAAaG,WAAAA,CAAY,CAAC,IAAA,KAA+B;AAC7D,IAAA,UAAA,CAAW,IAAI,CAAA;AAEf,IAAA,IAAI,IAAA,EAAM,MAAA,IAAU,OAAA,CAAQ,OAAA,IAAW,IAAA,EAAM;AAC3C,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,OAAO,CAAA;AAC3B,MAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,IACpB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,WAAAA,CAAY,CAAC,OAAA,KAA2B;AAC7D,IAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAAA,EACpB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,WAAAA,CAAY,CAAC,EAAA,EAAY,MAAA,KAAmB;AAC/D,IAAA,UAAA,CAAW,CAAC,CAAA,KAAO,CAAA,CAAE,EAAE,MAAM,MAAA,GAAS,CAAA,GAAI,EAAE,GAAG,CAAA,EAAG,CAAC,EAAE,GAAG,QAAS,CAAA;AAAA,EACnE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,CAAC,EAAA,KAAe;AAC9C,IAAA,UAAA,CAAW,CAAC,CAAA,KAAM;AAChB,MAAA,IAAI,EAAE,EAAA,IAAM,CAAA,CAAA,EAAI,OAAO,CAAA;AACvB,MAAA,MAAM,EAAE,CAAC,EAAE,GAAG,KAAA,EAAO,GAAG,MAAK,GAAI,CAAA;AACjC,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,WAAAA,CAAY,CAAC,EAAA,KAAe,OAAA,CAAQ,EAAE,CAAA,IAAK,eAAA,EAAiB,CAAC,OAAO,CAAC,CAAA;AAEtF,EAAA,MAAM,MAAA,GAAiBD,OAAAA;AAAA,IACrB,OAAO,EAAE,OAAA,EAAS,OAAA,EAAS,WAAW,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,OAAA,IAAW,cAAA,EAAe,CAAA;AAAA,IACxF,CAAC,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,SAAS,cAAc;AAAA,GACrD;AAEA,EAAA,MAAM,KAAA,GAA8BA,OAAAA;AAAA,IAClC,OAAO;AAAA,MACL,GAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,MAC7B,MAAA,EAAQ,OAAA,EAAS,MAAA,KAAW,MAAM;AAAA,MAAC,CAAA,CAAA;AAAA,MACnC,UAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,aAAA,EAAe,SAAA,GAAY,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,GAAK,SAAA;AAAA,MACpD,SAAA,EAAW;AAAA,KACb,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,UAAA,EAAY,cAAA,EAAgB,QAAA,EAAU,YAAA,EAAc,WAAA,EAAa,QAAA,EAAU,SAAA,EAAW,WAAW,KAAK;AAAA,GACpI;AAEA,EAAA,uBAAO,GAAA,CAAC,eAAA,CAAgB,QAAA,EAAhB,EAAyB,OAAe,QAAA,EAAS,CAAA;AAC3D;AAGO,SAAS,WAAA,GAAoC;AAClD,EAAA,MAAM,GAAA,GAAM,WAAW,eAAe,CAAA;AACtC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAC9E,EAAA,OAAO,GAAA;AACT;ACpIA,SAAS,aAAa,MAAA,EAAwB;AAC5C,EAAA,OAAO,MAAA,CAAO,OAAA,EAAS,WAAA,IAAe,QAAA,CAAS,eAAA,CAAgB,WAAA;AACjE;AAMO,SAAS,QAAQ,MAAA,EAAwB;AAC9C,EAAA,MAAM,KAAA,GAAQ,aAAa,MAAM,CAAA;AACjC,EAAA,QAAQ,OAAO,OAAA;AAAS,IACtB,KAAK,MAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,KAAA,GAAQ,CAAA;AAAA,IACjB,KAAK,OAAA;AACH,MAAA,OAAO,KAAA;AAAA;AAEb;AAUO,SAAS,SAAA,CAAU,OAAA,EAAiB,OAAA,EAAiB,MAAA,EAAuB;AACjF,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM,CAAA;AAC7B,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO,EAAE,GAAG,OAAA,GAAU,MAAA,CAAO,UAAU,MAAA,EAAQ,CAAA,EAAG,OAAA,GAAU,MAAA,CAAO,OAAA,EAAQ;AAAA,EAC7E;AACA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,qBAAA,EAAsB;AAClD,EAAA,OAAO;AAAA,IACL,GAAG,OAAA,GAAU,IAAA,CAAK,IAAA,GAAO,MAAA,CAAO,QAAQ,UAAA,GAAa,MAAA;AAAA,IACrD,CAAA,EAAG,OAAA,GAAU,IAAA,CAAK,GAAA,GAAM,OAAO,OAAA,CAAQ;AAAA,GACzC;AACF;AAGO,SAAS,WAAW,MAAA,EAAwB;AACjD,EAAA,MAAM,CAAC,QAAQ,SAAS,CAAA,GAAIF,SAAS,MAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC1D,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC9C,IAAA,MAAA,EAAO;AACP,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,MAAM,CAAA;AACxC,IAAA,MAAM,WAAW,MAAA,CAAO,OAAA,GAAU,IAAI,cAAA,CAAe,MAAM,CAAA,GAAI,IAAA;AAC/D,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,OAAA,CAAQ,OAAO,OAAO,CAAA;AACpD,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,MAAM,CAAA;AAC3C,MAAA,QAAA,EAAU,UAAA,EAAW;AAAA,IACvB,CAAA;AAAA,EACF,GAAG,CAAC,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,OAAO,CAAC,CAAA;AACnC,EAAA,OAAO,MAAA;AACT;ACjEO,SAAS,UAAU,KAAA,EAA+B;AACvD,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,cAAA,EAAgB,OAAA,KAAY,WAAA,EAAY;AAC7D,EAAA,MAAM,CAAC,EAAA,EAAI,KAAK,CAAA,GAAID,SAAS,KAAK,CAAA;AAClC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5D,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAS,CAAC,CAAA;AAEpC,EAAA,MAAM,IAAA,GAAOE,QAAQ,MAAM;AACzB,IAAA,MAAM,UAAU,CAAC,GAAG,KAAK,CAAA,CAAE,KAAK,YAAY,CAAA;AAC5C,IAAA,OAAO,eAAA,GAAkB,UAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ,CAAA;AAAA,EACtE,CAAA,EAAG,CAAC,KAAA,EAAO,eAAe,CAAC,CAAA;AAE3B,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,MAAA,GAAS,CAAC,CAAC,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAO,CAAA,IAAK,IAAA;AAGjC,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,OAAA,EAAS;AACrB,IAAA,UAAA,CAAW,SAAS,GAAA,CAAI,IAAA,EAAM,SAAS,GAAA,CAAI,QAAA,EAAU,QAAQ,cAAc,CAAA;AAC3E,IAAA,YAAA,CAAa,QAAQ,EAAE,CAAA;AAAA,EAEzB,CAAA,EAAG,CAAC,EAAA,EAAI,OAAA,EAAS,EAAE,CAAC,CAAA;AAEpB,EAAA,MAAM,EAAA,GAAKE,WAAAA;AAAA,IACT,CAAC,EAAA,KAAe,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA;AAAA,IAChF,CAAC,KAAK,MAAM;AAAA,GACd;AAEA,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,KAAA,CAAM,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AACf,IAAA,QAAA,CAAS,CAAC,CAAA;AAAA,EACZ,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,EAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAA;AAAA,IACA,qBAAA,EAAuBA,WAAAA,CAAY,MAAM,kBAAA,CAAmB,CAAC,MAAM,CAAC,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IAC1E,QAAA,EAAU,IAAA,CAAK,MAAA,GAAS,OAAA,GAAU,CAAA,GAAI,CAAA;AAAA,IACtC,OAAO,IAAA,CAAK,MAAA;AAAA,IACZ,KAAA,EAAOA,YAAY,MAAM,EAAA,CAAG,CAAC,CAAA,EAAG,CAAC,EAAE,CAAC,CAAA;AAAA,IACpC,IAAA,EAAMA,WAAAA,CAAY,MAAM,EAAA,CAAG,OAAA,GAAU,CAAC,CAAA,EAAG,CAAC,EAAA,EAAI,OAAO,CAAC,CAAA;AAAA,IACtD,IAAA,EAAMA,WAAAA,CAAY,MAAM,EAAA,CAAG,OAAA,GAAU,CAAC,CAAA,EAAG,CAAC,EAAA,EAAI,OAAO,CAAC,CAAA;AAAA,IACtD,IAAA,EAAMA,WAAAA,CAAY,MAAM,EAAA,CAAG,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,EAAG,CAAC,EAAA,EAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IAC9D,SAAA,EAAW,SAAS,EAAA,IAAM;AAAA,GAC5B;AACF;AAGA,SAAS,WACP,IAAA,EACA,IAAA,EACA,OAAA,EACA,QAAA,EACA,QACA,cAAA,EACA;AACA,EAAA,IAAI,IAAA,CAAK,SAAS,IAAA,EAAM;AACtB,IAAA,cAAA,CAAe,KAAK,OAAO,CAAA;AAC3B,IAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,EACpB,WAAW,IAAA,CAAK,OAAA,IAAW,IAAA,IAAQ,IAAA,CAAK,YAAY,OAAA,EAAS;AAC3D,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EACrB;AACF;AAGA,SAAS,aAAa,EAAA,EAAY;AAChC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,MAAM,EAAA,GAAK,QAAA,CAAS,aAAA,CAAc,CAAA,eAAA,EAAkB,EAAE,CAAA,EAAA,CAAI,CAAA;AAC1D,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,EAAA,CAAG,cAAA,CAAe,EAAE,KAAA,EAAO,QAAA,EAAU,QAAQ,QAAA,EAAU,QAAA,EAAU,UAAU,CAAA;AAAA,IAC7E,CAAA,MAAA,IAAW,UAAU,EAAA,EAAI;AACvB,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA;AACA,EAAA,qBAAA,CAAsB,IAAI,CAAA;AAC5B;AAEA,SAAS,YAAA,CAAa,GAAiB,CAAA,EAAyB;AAC9D,EAAA,IAAI,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,SAAa,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,IAAA,GAAO,EAAA,GAAK,CAAA;AACrD,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,EAAA;AACxB,EAAA,MAAM,EAAA,GAAK,EAAE,OAAA,IAAW,EAAA;AACxB,EAAA,IAAI,EAAA,KAAO,EAAA,EAAI,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrC,EAAA,IAAI,EAAE,CAAA,KAAM,CAAA,CAAE,GAAG,OAAO,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAChC,EAAA,OAAO,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AACjB;AClGA,IAAM,SAAA,GAAY,IAAA;AAOX,SAAS,cAAc,SAAA,EAAoD;AAChF,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,SAA2B,MAAM,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAWI,OAAO,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQA,OAA2B,MAAS,CAAA;AAElD,EAAAH,SAAAA,CAAU,MAAM,MAAM,MAAA,CAAO,aAAa,KAAA,CAAM,OAAO,CAAA,EAAG,EAAE,CAAA;AAE5D,EAAA,MAAM,MAAA,GAASE,WAAAA,CAAY,CAAC,OAAA,KAA8B;AACxD,IAAA,SAAA,CAAU,OAAO,CAAA;AACjB,IAAA,MAAA,CAAO,YAAA,CAAa,MAAM,OAAO,CAAA;AACjC,IAAA,KAAA,CAAM,UAAU,MAAA,CAAO,UAAA,CAAW,MAAM,SAAA,CAAU,MAAM,GAAG,SAAS,CAAA;AAAA,EACtE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,OAAO,GAAA,KAAqB;AAC1B,MAAA,IAAI,CAAC,SAAA,IAAa,QAAA,CAAS,OAAA,EAAS;AACpC,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,MAAA,MAAA,CAAO,YAAA,CAAa,MAAM,OAAO,CAAA;AACjC,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,GAAG,CAAA;AACnB,QAAA,MAAA,CAAO,MAAM,CAAA;AAAA,MACf,SAAS,GAAA,EAAK;AACZ,QAAA,OAAA,CAAQ,KAAA,CAAM,gCAAgC,GAAG,CAAA;AACjD,QAAA,MAAA,CAAO,OAAO,CAAA;AAAA,MAChB,CAAA,SAAE;AACA,QAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAAA,MACrB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,WAAW,MAAM;AAAA,GACpB;AAEA,EAAA,OAAO,EAAE,QAAQ,IAAA,EAAK;AACxB;;;AClDA,IAAM,SAAA,GAAY,CAAA;AAClB,IAAM,QAAA,GAAW,GAAA;AASV,SAAS,cAAA,CAAe,SAAiB,OAAA,EAAoC;AAClF,EAAA,MAAM,EAAA,GAAK,cAAA,CAAe,OAAA,EAAS,OAAO,CAAA;AAC1C,EAAA,OAAO,EAAA,GAAK,EAAE,QAAA,EAAU,OAAA,CAAQ,EAAE,GAAG,IAAA,EAAM,OAAA,CAAQ,EAAE,CAAA,EAAE,GAAI,IAAA;AAC7D;AAEA,SAAS,cAAA,CAAe,GAAW,CAAA,EAA2B;AAC5D,EAAA,KAAA,MAAW,EAAA,IAAM,QAAA,CAAS,iBAAA,CAAkB,CAAA,EAAG,CAAC,CAAA,EAAG;AACjD,IAAA,IAAI,CAAC,EAAA,CAAG,OAAA,CAAQ,iBAAiB,CAAA,IAAK,OAAO,QAAA,CAAS,eAAA,IAAmB,EAAA,KAAO,QAAA,CAAS,IAAA,EAAM;AAC7F,MAAA,OAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAQ,EAAA,EAAqB;AACpC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,IAAA,GAAuB,EAAA;AAC3B,EAAA,OAAO,IAAA,IAAQ,SAAS,QAAA,CAAS,IAAA,IAAQ,SAAS,QAAA,CAAS,eAAA,IAAmB,KAAA,CAAM,MAAA,GAAS,SAAA,EAAW;AACtG,IAAA,KAAA,CAAM,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAC,CAAA;AAChC,IAAA,IAAA,GAAO,IAAA,CAAK,aAAA;AAAA,EACd;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;AAEA,SAAS,aAAa,EAAA,EAAqB;AACzC,EAAA,MAAM,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA,CAAA,EAAI,IAAI,EAAA,CAAG,EAAE,CAAC,CAAA,CAAA,GAAK,EAAA;AACtC,EAAA,MAAM,UAAU,KAAA,CAAM,IAAA,CAAK,EAAA,CAAG,SAAS,EACpC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,IAAI,CAAC,CAAC,CAAA,CAAE,CAAA,CACvB,KAAK,EAAE,CAAA;AACV,EAAA,OAAO,CAAA,EAAG,EAAA,CAAG,OAAA,CAAQ,WAAA,EAAa,CAAA,EAAG,EAAE,CAAA,EAAG,OAAO,CAAA,EAAG,SAAA,CAAU,EAAE,CAAC,CAAA,CAAA;AACnE;AAGA,SAAS,UAAU,EAAA,EAAqB;AACtC,EAAA,MAAM,WAAW,EAAA,CAAG,aAAA,GAChB,KAAA,CAAM,IAAA,CAAK,GAAG,aAAA,CAAc,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,YAAY,EAAA,CAAG,OAAO,IAC5E,EAAC;AACL,EAAA,OAAO,QAAA,CAAS,SAAS,CAAA,GAAI,EAAA,GAAK,gBAAgB,QAAA,CAAS,OAAA,CAAQ,EAAE,CAAA,GAAI,CAAC,CAAA,CAAA,CAAA;AAC5E;AAEA,SAAS,QAAQ,EAAA,EAA4B;AAC3C,EAAA,MAAM,IAAA,GAAA,CAAQ,GAAG,WAAA,IAAe,EAAA,EAAI,QAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC9D,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,OAAO,IAAA,CAAK,SAAS,QAAA,GAAW,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAC,CAAA,MAAA,CAAA,GAAM,IAAA;AAClE;AAEA,SAAS,IAAI,KAAA,EAAuB;AAClC,EAAA,OAAO,OAAO,GAAA,EAAK,MAAA,GAAS,OAAO,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AACzD;;;ACrDA,IAAM,QAAA,GAAW,EAAA;AA6BV,SAAS,aAAa,EAAE,MAAA,EAAQ,QAAA,EAAU,QAAA,EAAU,UAAS,EAAgC;AAClG,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAA2B,IAAI,CAAA;AACzD,EAAA,MAAM,IAAA,GAAOI,OAAyB,IAAI,CAAA;AAE1C,EAAA,MAAM,GAAA,GAAM,CAAC,IAAA,KAA2B;AACtC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAgB,IAAA,KAAe;AAC5C,IAAA,MAAM,IAAA,GAAO,SAAS,MAAM,CAAA;AAC5B,IAAA,IAAI,IAAA,EAAM,GAAA,CAAI,EAAE,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,QAAA,CAAS,MAAM,CAAC,GAAG,CAAA;AAAA,EAC/E,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,OAAA,EAAiB,OAAA,KAAoB;AACjD,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,IAAA,IAAI,CAAA,EAAG,GAAA,CAAI,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,SAAA,CAAU,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA,EAAG,CAAA;AAAA,EAChE,CAAA;AAEA,EAAA,MAAM,GAAA,GAAM,CAAC,OAAA,EAAiB,OAAA,KAAoB;AAChD,IAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,IAAA,MAAM,IAAA,GAAO,CAAA,IAAK,QAAA,CAAS,CAAA,CAAE,MAAM,CAAA;AACnC,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AAC/C,MAAA,MAAM,IAAA,GAAO,UAAU,IAAA,EAAM,CAAA,CAAE,MAAM,QAAA,CAAS,CAAA,CAAE,MAAM,CAAC,CAAA;AACvD,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,QAAA,EAAU;AAC3D,QAAA,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,EAAM,MAAM,cAAA,CAAe,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,MACnE;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAI,CAAA;AAAA,EACV,CAAA;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,GAAA,EAAI;AACnC;ACjDA,IAAM,OAAA,GAAU,CAAC,CAAA,MAAsC,EAAE,GAAG,CAAA,CAAE,OAAA,EAAS,CAAA,EAAG,CAAA,CAAE,OAAA,EAAQ,CAAA;AAO7E,SAAS,cAAA,CAAe,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAM,EAA+C;AACrG,EAAA,MAAM,QAAA,GAAWA,OAAO,KAAK,CAAA;AAE7B,EAAA,MAAM,aAAA,GAAgBD,WAAAA;AAAA,IACpB,CAAC,CAAA,KAA0B;AACzB,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACnB,MAAA,CAAA,CAAE,aAAA,CAAc,iBAAA,CAAkB,CAAA,CAAE,SAAS,CAAA;AAC7C,MAAA,OAAA,GAAU,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,aAAA,GAAgBA,WAAAA;AAAA,IACpB,CAAC,CAAA,KAA0B;AACzB,MAAA,IAAI,QAAA,CAAS,OAAA,EAAS,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IAC3C,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,WAAA,GAAcA,WAAAA;AAAA,IAClB,CAAC,CAAA,KAA0B;AACzB,MAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,MAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AACnB,MAAA,CAAA,CAAE,aAAA,CAAc,qBAAA,CAAsB,CAAA,CAAE,SAAS,CAAA;AACjD,MAAA,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,OAAO,EAAE,aAAA,EAAe,aAAA,EAAe,WAAA,EAAY;AACrD;;;ACrDA,IAAM,aAAA,GAAgB,CAAA;AAQf,SAAS,gBAAgB,MAAA,EAAoD;AAClF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,SAA2B,IAAI,CAAA;AACzD,EAAA,MAAM,MAAA,GAASI,OAAyB,IAAI,CAAA;AAE5C,EAAA,MAAM,WAAW,cAAA,CAAe;AAAA,IAC9B,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,MAAA,MAAA,CAAO,OAAA,GAAU,CAAA;AACjB,MAAA,QAAA,CAAS,CAAC,CAAA;AAAA,IACZ,CAAA;AAAA,IACA,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA,EAAO,CAAC,CAAA,KAAM;AACZ,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,MAAM,OAAO,MAAA,CAAO,OAAA;AACpB,MAAA,MAAM,MAAA,GAAS,CAAC,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAA,EAAG,CAAA,CAAE,CAAA,GAAI,IAAA,CAAK,CAAC,CAAA,GAAI,aAAA;AACjE,MAAA,MAAM,IAAA,GAAO,MAAA,GAAS,YAAA,EAAa,GAAI,CAAA;AACvC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AAAA,IACvB;AAAA,GACD,CAAA;AAED,EAAA,OAAO,EAAE,OAAO,QAAA,EAAS;AAC3B;AAGA,SAAS,YAAA,GAA0B;AACjC,EAAA,OAAO,EAAE,CAAA,EAAG,MAAA,CAAO,UAAA,GAAa,CAAA,GAAI,aAAa,CAAA,EAAG,CAAA,EAAG,MAAA,CAAO,WAAA,GAAc,CAAA,EAAE;AAChF;AC/BO,SAAS,YAAY,IAAA,EAAc;AACxC,EAAA,MAAM,GAAA,GAAMA,OAA4B,IAAI,CAAA;AAC5C,EAAAH,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,EAAA,CAAG,MAAM,MAAA,GAAS,MAAA;AAClB,IAAA,EAAA,CAAG,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,EAAA,CAAG,YAAY,CAAA,EAAA,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACT,EAAA,OAAO,GAAA;AACT;ACRO,SAAS,gBAAA,CACd,GAAA,EACA,QAAA,EACA,MAAA,EACM;AACN,EAAAA,UAAU,MAAM;AACd,IAAA,MAAM,KAAK,GAAA,CAAI,OAAA;AACf,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,EAAA,CAAG,YAAY,CAAA;AAC7C,IAAA,MAAA,EAAO;AACP,IAAA,MAAM,QAAA,GAAW,IAAI,cAAA,CAAe,MAAM,CAAA;AAC1C,IAAA,QAAA,CAAS,QAAQ,EAAE,CAAA;AACnB,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,UAAA,EAAW;AACpB,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AACV;ACLO,IAAM,aAAa,UAAA,CAA+C,SAASI,YAChF,EAAE,QAAA,EAAU,UAAU,OAAA,EAAS,IAAA,GAAO,MAAM,IAAA,GAAO,QAAA,EAAU,SAAS,KAAA,EAAO,KAAA,EAAO,WAAW,GAAG,IAAA,IAClG,GAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,QAAA;AAAA,IACA,WAAW,OAAO,CAAA,CAAA;AAAA,IAClB,WAAW,IAAI,CAAA,CAAA;AAAA,IACf,WAAW,IAAI,CAAA,CAAA;AAAA,IACf,SAAS,WAAA,GAAc,EAAA;AAAA,IACvB,SAAA,IAAa;AAAA,GACf,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,MAAM,MAAA,mBACJC,GAAAA,CAAC,QAAA,EAAA,EAAO,KAAU,SAAA,EAAW,OAAA,EAAU,GAAG,IAAA,EACvC,QAAA,EACH,CAAA;AAGF,EAAA,IAAI,KAAA,IAAS,MAAM,OAAO,MAAA;AAC1B,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EACb,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,oBACDA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iBAAiB,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EACzC,CAAA;AAEJ,CAAC,CAAA;ACzCM,SAAS,IAAA,CAAK,EAAE,IAAA,GAAO,EAAA,EAAI,WAAW,QAAA,EAAU,GAAG,MAAK,EAAc;AAC3E,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MACf,SAAA;AAAA,MACA,aAAA,EAAW,IAAA;AAAA,MACV,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH;AAEJ;ACtBO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,+DAAA,EAAgE,CAAA;AAAA,oBACxEA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACvC,CAAA;AAEJ;AAGO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2CAAA,EAA4C,CAAA;AAAA,oBACpDA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB,CAAA;AAAA,oBACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EACvC,CAAA;AAEJ;AAGO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2CAAA,EAA4C,CAAA;AAAA,oBACpDA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,eAAA,EAAgB,CAAA;AAAA,oBACjCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACvC,CAAA;AAEJ;AAGO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACrCA,GAAAA,CAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,2BAAA,EAA4B;AAAA,GAAA,EAC9C,CAAA;AAEJ;AAGO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,oCAAA,EAAqC,CAAA;AAAA,oBAC7CA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,uBAAA,EAAwB;AAAA,GAAA,EAC3C,CAAA;AAEJ;AAGO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,IAAA,EAAK,CAAA;AAAA,oBAC/BA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,qCAAA,EAAsC,CAAA;AAAA,oBAC9CA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,OAAA,EAAQ,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EAC3C,CAAA;AAEJ;AAGO,SAAS,UAAA,GAAa;AAC3B,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,uEAAA,EAAwE,CAAA;AAAA,oBAChFA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,2EAAA,EAA4E,CAAA;AAAA,oBACpFA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,kBAAA,EAAmB;AAAA,GAAA,EACtC,CAAA;AAEJ;AAEO,SAAS,SAAA,GAAY;AAC1B,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,UAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACtC,CAAA;AAEJ;AAEO,SAAS,SAAA,GAAY;AAC1B,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,0BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,CAAA,EACpC,CAAA;AAEJ;AAEO,SAAS,SAAA,GAAY;AAC1B,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,cAAA,EAAe,CAAA;AAAA,oBAChCA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,gFAAA,EAAiF,CAAA;AAAA,oBACzFA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,CAAA;AAAA,oBACtCA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACxC,CAAA;AAEJ;AAGO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEC,KAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAI,IAAA,EAAK,cAAA,EAAe,QAAO,MAAA,EACzC,QAAA,EAAA;AAAA,oBAAAD,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,GAAE,KAAA,EAAM,CAAA;AAAA,oBAC9BA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,GAAA,EAAI,GAAE,KAAA,EAAM,CAAA;AAAA,oBAC/BA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,GAAE,KAAA,EAAM,CAAA;AAAA,oBAC/BA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,KAAA,EAAM,CAAA;AAAA,oBAChCA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,IAAA,EAAK,GAAE,KAAA,EAAM,CAAA;AAAA,oBAC/BA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,KAAA,EAAM;AAAA,GAAA,EAClC,CAAA;AAEJ;AAGO,SAAS,SAAA,GAAY;AAC1B,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,IAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,mBAAkB,IAAA,EAAK,cAAA,EAAe,QAAO,MAAA,EAAO,CAAA;AAAA,oBACpEA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,IAAG,IAAA,EAAK,EAAA,EAAG,GAAA,EAAI,EAAA,EAAG,GAAA,EAAI;AAAA,GAAA,EACrC,CAAA;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,0BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,iBAAA,EAAkB,CAAA,EACrC,CAAA;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEA,GAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,0BAAAA,GAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB,CAAA,EACpC,CAAA;AAEJ;AAGO,SAAS,QAAA,GAAW;AACzB,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,IAAC,SAAA,EAAA,EAAQ,MAAA,EAAO,kBAAiB,IAAA,EAAK,cAAA,EAAe,QAAO,MAAA,EAAO,CAAA;AAAA,oBACnEA,GAAAA,CAAC,MAAA,EAAA,EAAK,EAAA,EAAG,IAAA,EAAK,IAAG,GAAA,EAAI,EAAA,EAAG,IAAA,EAAK,EAAA,EAAG,IAAA,EAAK;AAAA,GAAA,EACvC,CAAA;AAEJ;AAGO,SAAS,OAAA,GAAU;AACxB,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,EAAA,EACV,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,kDAAA,EAAmD,CAAA;AAAA,oBAC3DA,IAAC,QAAA,EAAA,EAAO,EAAA,EAAG,MAAK,EAAA,EAAG,IAAA,EAAK,GAAE,GAAA,EAAI;AAAA,GAAA,EAChC,CAAA;AAEJ;ACtIO,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,OAAA,EAAAE,QAAAA,EAAS,SAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,gBAAA,EAAkB,QAAA,EAAS,EAAoB;AAC7H,EAAA,MAAM,EAAE,YAAA,EAAc,WAAA,EAAY,GAAI,WAAA,EAAY;AAClD,EAAA,MAAM,OAAA,GAAUJ,OAAuB,IAAI,CAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACrC,EAAA,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM,YAAA,CAAa,IAAA,CAAK,EAAA,EAAI,CAAC,CAAA,EAAG,MAAM,WAAA,CAAY,IAAA,CAAK,EAAE,CAAC,CAAA;AAIrF,EAAA,MAAM,MAAA,GAASA,MAAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AACpD,EAAA,MAAM,OAAO,cAAA,CAAe;AAAA,IAC1B,SAAS,CAAC,CAAA,KAAO,MAAA,CAAO,OAAA,GAAU,EAAE,EAAA,EAAI,CAAA,CAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,EAAI,KAAK,CAAA,EAAG,EAAA,EAAI,KAAK,CAAA,EAAE;AAAA,IAC7E,MAAA,EAAQ,CAAC,CAAA,KAAM;AACb,MAAA,MAAM,IAAI,MAAA,CAAO,OAAA;AACjB,MAAA,MAAA,CAAO,CAAA,CAAE,EAAA,IAAM,CAAA,CAAE,CAAA,GAAI,EAAE,EAAA,CAAA,EAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAE,EAAA,IAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,GAAG,CAAC,CAAA;AAAA,IAC9D;AAAA,GACD,CAAA;AAED,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,SAAA;AAAA,IACA,UAAU,kBAAA,GAAqB,EAAA;AAAA,IAC/B,IAAA,CAAK,WAAW,mBAAA,GAAsB;AAAA,GACxC,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,EAAA,uBACEG,KAAC,KAAA,EAAA,EAAI,GAAA,EAAK,SAAS,cAAA,EAAc,IAAA,CAAK,IAAI,SAAA,EAAsB,KAAA,EAAO,EAAE,IAAA,EAAMC,QAAAA,GAAU,KAAK,CAAA,EAAG,GAAA,EAAK,KAAK,CAAA,EAAG,KAAA,EAAO,YAAW,EAC9H,QAAA,EAAA;AAAA,oBAAAD,IAAAA,CAAC,QAAA,EAAA,EAAQ,GAAG,IAAA,EAAM,WAAU,iBAAA,EAC1B,QAAA,EAAA;AAAA,sBAAAD,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,sBACVC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,IAAA,EAAK,SAAA;AAAA,YACL,QAAQ,IAAA,CAAK,QAAA;AAAA,YACb,OAAA,EAAS,gBAAA;AAAA,YACT,aAAA,EAAe,IAAA;AAAA,YACf,KAAA,EAAO,IAAA,CAAK,QAAA,GAAW,iCAAA,GAA+B,eAAA;AAAA,YACtD,YAAA,EAAY,IAAA,CAAK,QAAA,GAAW,aAAA,GAAgB,eAAA;AAAA,YAE5C,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA,SACb;AAAA,wBACAA,GAAAA;AAAA,UAAC,UAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,QAAA;AAAA,YACT,aAAA,EAAe,IAAA;AAAA,YACf,KAAA,EAAM,aAAA;AAAA,YACN,YAAA,EAAW,aAAA;AAAA,YAEX,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA;AACb,OAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,OAAO,IAAA,CAAK,IAAA;AAAA,QACZ,SAAA;AAAA,QACA,UAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACtC,WAAA,EAAY,sBAAA;AAAA,QACZ,SAAA,EAAU,eAAA;AAAA,QACV,KAAA,EAAO,EAAE,SAAA,EAAW,eAAA,GAAkB,EAAA;AAAG;AAAA;AAC3C,GAAA,EACF,CAAA;AAEJ;AAGA,IAAM,IAAA,GAAO,CAAC,CAAA,KAA0B,CAAA,CAAE,eAAA,EAAgB;ACpFnD,SAAS,SAAA,CAAU,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAAE,QAAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAM,EAAmB;AAC3F,EAAA,uBACEF,GAAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AACnB,IAAA,MAAM,CAAA,GAAI,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,MAAM,CAAA;AACtC,IAAA,uBACEA,GAAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,CAAA,EAAGE,WAAU,CAAA,CAAE,CAAA;AAAA,QACf,GAAG,CAAA,CAAE,CAAA;AAAA,QACL,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,QACpC,MAAA;AAAA,QACA;AAAA,OAAA;AAAA,MALK;AAAA,KAMP;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ;AAUA,SAAS,KAAK,EAAE,CAAA,EAAG,GAAG,OAAA,EAAS,MAAA,EAAQ,OAAM,EAAc;AACzD,EAAA,MAAM,OAAO,cAAA,CAAe;AAAA,IAC1B,OAAA;AAAA,IACA,QAAQ,CAAC,CAAA,KAAM,OAAO,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IAC9B,OAAO,CAAC,CAAA,KAAM,MAAM,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC;AAAA,GAC7B,CAAA;AACD,EAAA,uBACEF,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACE,GAAG,IAAA;AAAA,MACJ,KAAA,EAAM,uBAAA;AAAA,MACN,YAAA,EAAW,eAAA;AAAA,MACX,SAAA,EAAU,SAAA;AAAA,MACV,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA;AAAE;AAAA,GAC3B;AAEJ;ACrDO,SAAS,UAAA,CAAW,GAAUE,QAAAA,EAAwB;AAC3D,EAAA,OAAO,EAAE,CAAA,EAAGA,QAAAA,GAAU,EAAE,CAAA,EAAG,CAAA,EAAG,EAAE,CAAA,EAAE;AACpC;AAGO,SAAS,SAAS,GAAA,EAAmC;AAC1D,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,MAAA,CAAO,GAAG,GAAA,EAAK,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,MAAA,EAAQ,IAAI,MAAA,EAAO;AACvF;AASO,SAAS,SAAA,CAAU,EAAE,GAAA,EAAK,KAAA,EAAO,OAAM,EAAmB;AAC/D,EAAA,uBACED,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,IAAI,KAAA,CAAM,CAAA;AAAA,QACd,EAAA,EAAI,IAAI,KAAA,CAAM,CAAA;AAAA,QACd,EAAA,EAAI,IAAI,IAAA,CAAK,CAAA;AAAA,QACb,EAAA,EAAI,IAAI,IAAA,CAAK,CAAA;AAAA,QACb,MAAA,EAAQ,KAAA;AAAA,QACR,WAAA,EAAa,KAAA;AAAA,QACb,aAAA,EAAc;AAAA;AAAA,KAChB;AAAA,oBACAA,GAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAC,EAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,CAAC,CAAA,CAAE,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,KAAA,CAAM,CAAC,EAAE,CAAC,CAAA,CAAA;AAAA,QAC3G,IAAA,EAAM;AAAA;AAAA;AACR,GAAA,EACF,CAAA;AAEJ;AAGO,SAAS,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,OAAM,EAAgE;AAChH,EAAA,MAAM,GAAA,GAAM,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AACrC,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAW,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,EAC3C,0BAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,GAAA,EAAU,KAAA,EAAc,OAAc,CAAA,EACnD,CAAA;AAEJ;AC3CA,IAAM,MAAA,GAAS,kBAAA;AACf,IAAM,YAAA,GAAe,wBAAA;AAmBd,SAAS,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAAE,UAAS,QAAA,EAAU,QAAA,EAAU,UAAA,EAAY,OAAA,EAAQ,EAAc;AACjG,EAAA,MAAM,GAAA,GAAM,cAAc,UAAA,CAAW,KAAA,EAAOA,QAAO,CAAA,EAAG,UAAA,CAAW,IAAA,EAAMA,QAAO,CAAC,CAAA;AAI/E,EAAA,MAAM,IAAA,GAAOJ,MAAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA;AAClD,EAAA,MAAM,OAAO,cAAA,CAAe;AAAA,IAC1B,SAAS,CAAC,CAAA,KAAO,IAAA,CAAK,OAAA,GAAU,EAAE,EAAA,EAAI,IAAA,CAAK,CAAA,EAAG,EAAA,EAAI,KAAK,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,EAAE;AAAA,IAC3E,QAAQ,CAAC,CAAA,KAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA,GAAI,KAAK,OAAA,CAAQ,EAAA,CAAA,EAAK,KAAK,OAAA,CAAQ,EAAA,IAAM,EAAE,CAAA,GAAI,IAAA,CAAK,QAAQ,EAAA,CAAG,CAAA;AAAA,IAC9G,OAAO,CAAC,CAAA,KAAM,QAAQ,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC;AAAA,GAC/B,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,GAAe,MAAA;AACxC,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAA0B;AACxC,IAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,IAAA,IAAI,QAAA,CAAS,aAAA,YAAyB,WAAA,EAAa,QAAA,CAAS,cAAc,IAAA,EAAK;AAC/E,IAAA,QAAA,EAAS;AAAA,EACX,CAAA;AAEA,EAAA,uBACEG,KAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAW,KAAA,EAAO,QAAA,CAAS,GAAG,CAAA,EAE3C,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,IAAI,KAAA,CAAM,CAAA;AAAA,QACd,EAAA,EAAI,IAAI,KAAA,CAAM,CAAA;AAAA,QACd,EAAA,EAAI,IAAI,IAAA,CAAK,CAAA;AAAA,QACb,EAAA,EAAI,IAAI,IAAA,CAAK,CAAA;AAAA,QACb,MAAA,EAAO,aAAA;AAAA,QACP,WAAA,EAAa,EAAA;AAAA,QACb,aAAA,EAAc,OAAA;AAAA,QACd,SAAA,EAAU,cAAA;AAAA,QACV,aAAA,EAAe;AAAA;AAAA,KACjB;AAAA,oBACAA,IAAC,SAAA,EAAA,EAAU,GAAA,EAAU,OAAc,KAAA,EAAO,QAAA,GAAW,IAAI,CAAA,EAAG,CAAA;AAAA,oBAC5DA,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,IAAI,IAAA,CAAK,CAAA;AAAA,QACb,EAAA,EAAI,IAAI,IAAA,CAAK,CAAA;AAAA,QACb,CAAA,EAAG,WAAW,CAAA,GAAI,CAAA;AAAA,QAClB,IAAA,EAAM,KAAA;AAAA,QACN,MAAA,EAAO,mBAAA;AAAA,QACP,WAAA,EAAa,WAAW,CAAA,GAAI,CAAA;AAAA,QAC5B,SAAA,EAAU,eAAA;AAAA,QACV,aAAA,EAAe,CAAC,CAAA,KAAM;AACpB,UAAA,MAAA,CAAO,CAAC,CAAA;AACR,UAAA,IAAA,CAAK,cAAc,CAAC,CAAA;AAAA,QACtB,CAAA;AAAA,QACA,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,aAAa,IAAA,CAAK;AAAA;AAAA;AACpB,GAAA,EACF,CAAA;AAEJ;ACzEO,SAAS,UAAU,EAAE,KAAA,EAAO,IAAA,EAAM,OAAA,EAAAE,UAAQ,EAAmD;AAClG,EAAA,uBAAOF,GAAAA,CAAC,KAAA,EAAA,EAAM,KAAA,EAAO,UAAA,CAAW,OAAOE,QAAO,CAAA,EAAG,IAAA,EAAM,UAAA,CAAW,MAAMA,QAAO,CAAA,EAAG,KAAA,EAAM,kBAAA,EAAmB,OAAO,CAAA,EAAG,CAAA;AACvH;ACwBO,SAAS,OAAA,CAAQ,EAAE,OAAA,EAAAA,QAAAA,EAAS,OAAA,EAAS,iBAAiB,SAAA,EAAW,YAAA,EAAc,YAAA,EAAc,KAAA,EAAM,EAAiB;AACzH,EAAA,MAAM,EAAE,KAAK,MAAA,EAAQ,OAAA,EAAS,KAAK,QAAA,EAAU,aAAA,EAAe,SAAA,EAAU,GAAI,WAAA,EAAY;AAEtF,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KACf,CAAA,CAAE,IAAA,KAAS,IAAI,IAAA,IAAA,CAAS,CAAA,CAAE,OAAA,IAAW,IAAA,OAAW,OAAA,IAAW,IAAA,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,CAAC,EAAA,KAAyC,GAAA,CAAI,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAC5F,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AAC1C,EAAA,MAAM,YAAY,KAAA,CAAM,KAAA,GAAQ,SAAS,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,GAAI,IAAA;AAE/D,EAAA,OAAO,YAAA;AAAA,oBACLD,IAAAA,CAAC,KAAA,EAAA,EAAI,eAAA,EAAa,IAAA,EAAC,WAAW,CAAA,EAAG,aAAa,CAAA,WAAA,CAAA,EAAe,KAAA,EAAO,SAAA,EACjE,QAAA,EAAA;AAAA,MAAA,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS;AACvB,QAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA;AACjC,QAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,QAAA,uBACED,GAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,KAAA,EAAO,UAAU,IAAA,EAAM,IAAA,CAAK,MAAM,QAAA,CAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,YACnD,MAAM,EAAE,CAAA,EAAG,KAAK,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA,EAAE;AAAA,YAC7B,OAAA,EAASE,QAAAA;AAAA,YACT,QAAA,EAAU,iBAAiB,IAAA,CAAK,EAAA;AAAA,YAChC,QAAA,EAAU,MAAM,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA;AAAA,YACpC,UAAA,EAAY,CAAC,CAAA,EAAG,CAAA,KAAM,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,YACtD,OAAA,EAAS,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,EAAE,MAAA,EAAQ,cAAA,CAAe,CAAA,EAAG,CAAC,GAAG;AAAA,WAAA;AAAA,UAPtE,IAAA,CAAK;AAAA,SAQZ;AAAA,MAEJ,CAAC,CAAA;AAAA,MAEA,KAAA,CAAM,SAAS,SAAA,oBACdF,IAAC,SAAA,EAAA,EAAU,KAAA,EAAO,SAAA,CAAU,SAAA,EAAW,KAAA,CAAM,KAAA,CAAM,MAAM,QAAA,CAAS,SAAA,CAAU,EAAE,CAAC,CAAA,EAAG,MAAM,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,OAAA,EAASE,QAAAA,EAAS,CAAA;AAAA,MAG7H,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,qBACdF,GAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,OAAA,EAASE,QAAAA;AAAA,UACT,SAAA,EAAW,KAAK,EAAA,KAAO,OAAA;AAAA,UACvB,OAAA,EAAS,SAAA,IAAa,IAAA,CAAK,EAAA,KAAO,eAAA;AAAA,UAClC,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA;AAAA,UAClD,MAAA,EAAQ,CAAC,IAAA,KAAS,GAAA,CAAI,WAAW,IAAA,CAAK,EAAA,EAAI,EAAE,IAAA,EAAM,CAAA;AAAA,UAClD,gBAAA,EAAkB,MAAM,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,EAAA,EAAI,EAAE,QAAA,EAAU,CAAC,IAAA,CAAK,QAAA,EAAU,CAAA;AAAA,UAC5E,QAAA,EAAU,MAAM,GAAA,CAAI,UAAA,CAAW,KAAK,EAAE;AAAA,SAAA;AAAA,QARjC,IAAA,CAAK;AAAA,OAUb,CAAA;AAAA,MAEA,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,qBACdF,GAAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UAEC,IAAA;AAAA,UACA,MAAA,EAAQ,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA;AAAA,UACxB,OAAA,EAASE,QAAAA;AAAA,UACT,SAAS,KAAA,CAAM,KAAA;AAAA,UACf,QAAQ,KAAA,CAAM,IAAA;AAAA,UACd,OAAO,KAAA,CAAM;AAAA,SAAA;AAAA,QANR,CAAA,MAAA,EAAS,KAAK,EAAE,CAAA;AAAA,OAQxB;AAAA,KAAA,EACH,CAAA;AAAA,IACA,MAAA,CAAO,WAAW,QAAA,CAAS;AAAA,GAC7B;AACF;ACxFO,SAAS,SAAA,CAAU,EAAE,CAAA,EAAG,CAAA,EAAE,EAA6B;AAC5D,EAAA,uBAAOF,GAAAA,CAAC,KAAA,EAAA,EAAI,aAAA,EAAW,IAAA,EAAC,WAAU,UAAA,EAAW,KAAA,EAAO,EAAE,IAAA,EAAM,GAAG,GAAA,EAAK,CAAA,EAAG,OAAO,UAAA,EAAY,MAAA,EAAQ,iBAAgB,EAAG,CAAA;AACvH;ACkBA,IAAM,aAAA,GAAkD;AAAA,EACtD,IAAA,EAAM,yBAAA;AAAA,EACN,OAAA,EAAS,wBAAA;AAAA,EACT,IAAA,EAAM,eAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAGO,SAAS,YAAA,CAAa,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,YAAA,EAAc,cAAA,EAAgB,SAAA,EAAW,YAAA,EAAc,QAAA,EAAU,OAAA,EAAS,OAAM,EAAsB;AACvK,EAAA,uBACEC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EACb,QAAA,EAAA;AAAA,oBAAAD,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,OAAA;AAAA,QACL,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,MAAA,EAAQ,QAAA;AAAA,QACR,cAAA,EAAc,QAAA;AAAA,QACd,OAAA,EAAS,YAAA;AAAA,QACT,KAAA,EAAM,oBAAA;AAAA,QAEN,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA,KACZ;AAAA,oBAEAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACE,GAAG,QAAA;AAAA,QACJ,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,OAAO,KAAA,IAAS,MAAA;AAAA,QAChB,KAAA,EAAM,6CAAA;AAAA,QACN,SAAA,EAAU,mBAAA;AAAA,QAEV,QAAA,kBAAAA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA,KACZ;AAAA,IAEC,4BACCA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,IAAA,EAAM,YAAA,KAAiB,OAAA,GAAU,QAAA,GAAW,SAAA;AAAA,QAC5C,MAAA,EAAQ,YAAA,KAAiB,MAAA,IAAU,YAAA,KAAiB,OAAA;AAAA,QACpD,OAAA,EAAS,QAAA;AAAA,QACT,QAAA,EAAU,KAAA,KAAU,CAAA,IAAK,YAAA,KAAiB,SAAA;AAAA,QAC1C,SAAA,EAAW,YAAA,KAAiB,SAAA,GAAY,0BAAA,GAA6B,eAAA;AAAA,QACrE,KAAA,EAAO,cAAc,YAAY,CAAA;AAAA,QAEhC,QAAA,EAAA,YAAA,KAAiB,yBAASA,GAAAA,CAAC,YAAS,CAAA,mBAAKA,IAAC,QAAA,EAAA,EAAS;AAAA;AAAA,KACtD;AAAA,oBAGFA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAA,EAAG,KAAA,EAAM,qCAClF,QAAA,kBAAAA,GAAAA,CAAC,YAAS,CAAA,EACZ,CAAA;AAAA,oBAEAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,KAAA,EAAM,iCAAA,EAC3D,QAAA,kBAAAA,GAAAA,CAAC,YAAS,CAAA,EACZ,CAAA;AAAA,oBAEAA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,IAAA;AAAA,QACL,MAAA,EAAQ,SAAA;AAAA,QACR,cAAA,EAAc,SAAA;AAAA,QACd,OAAA,EAAS,cAAA;AAAA,QACT,UAAU,KAAA,KAAU,CAAA;AAAA,QACpB,KAAA,EAAO,YAAY,kBAAA,GAAqB,yBAAA;AAAA,QAExC,QAAA,kBAAAA,IAAC,UAAA,EAAA,EAAW;AAAA;AAAA;AACd,GAAA,EACF,CAAA;AAEJ;ACtFO,SAAS,QAAQ,EAAE,QAAA,EAAU,SAAA,EAAW,GAAG,MAAK,EAAiB;AACtE,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAC,cAAc,SAAS,CAAA,CAAE,MAAA,CAAO,OAAO,EAAE,IAAA,CAAK,GAAG,CAAA,EAAI,GAAG,MACtE,QAAA,EACH,CAAA;AAEJ;AAGO,SAAS,cAAA,GAAiB;AAC/B,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAC/C;ACKO,SAAS,SAAA,CAAU;AAAA,EACxB,QAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,uBAAA;AAAA,EACA;AACF,CAAA,EAAmB;AACjB,EAAA,MAAM,UAAU,QAAA,IAAY,CAAA;AAC5B,EAAA,MAAM,QAAQ,QAAA,IAAY,KAAA;AAC1B,EAAA,MAAM,QAAQ,KAAA,KAAU,CAAA;AAExB,EAAA,uBACEC,KAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,gBAAe,IAAA,EAAK,SAAA,EAAU,cAAW,cAAA,EAC1D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,OAAA,EAAS,KAAA,EAAM,YAAA,EACrD,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EACb,CAAA;AAAA,oBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,KAAA,EAAM,eAAA,EACpD,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ,CAAA;AAAA,oBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,KAAA,GAAQ,UAAA,GAAa,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,KAAK,CAAA,CAAA,EAAG,CAAA;AAAA,oBAErFA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,KAAA,EAAM,WAAA,EAClD,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ,CAAA;AAAA,oBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,KAAA,EAAM,WAAA,EAClD,QAAA,kBAAAA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ,CAAA;AAAA,oBAEAA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,oBAEhBA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,SAAA;AAAA,QACL,MAAA,EAAQ,eAAA;AAAA,QACR,cAAA,EAAc,eAAA;AAAA,QACd,OAAA,EAAS,gBAAA;AAAA,QACT,UAAU,CAAC,UAAA;AAAA,QACX,KAAA,EAAO,kBAAkB,kBAAA,GAAqB,mBAAA;AAAA,QAE9C,QAAA,kBAAAA,IAAC,SAAA,EAAA,EAAU;AAAA;AAAA,KACb;AAAA,oBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAK,UAAS,OAAA,EAAS,eAAA,EAAiB,QAAA,EAAU,CAAC,YAAY,KAAA,EAAM,kBAAA,EAC/E,QAAA,kBAAAA,GAAAA,CAAC,aAAU,CAAA,EACb,CAAA;AAAA,oBAEAA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,oBAEhBA,GAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,eAAA;AAAA,QACR,cAAA,EAAc,eAAA;AAAA,QACd,OAAA,EAAS,uBAAA;AAAA,QACT,KAAA,EAAO,kBAAkB,0BAAA,GAA6B,yBAAA;AAAA,QAEtD,QAAA,kBAAAA,IAAC,OAAA,EAAA,EAAQ;AAAA;AAAA,KACX;AAAA,oBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAA,EAAQ,OAAM,aAAA,EACjC,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EACb;AAAA,GAAA,EACF,CAAA;AAEJ;ACzFA,IAAM,GAAA,GAAM,CAAA;AACZ,IAAM,MAAA,GAAS,EAAA;AAaR,SAAS,mBAAA,CACd,QACA,QAAA,EACyB;AACzB,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIN,SAAkC,IAAI,CAAA;AAE5D,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,QAAQ,MAAM;AAClB,MAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,MAAA,IAAI,CAAC,KAAA,IAAS,CAAC,MAAA,EAAQ;AACvB,MAAA,MAAM,CAAA,GAAI,OAAO,qBAAA,EAAsB;AACvC,MAAA,MAAM,CAAA,GAAI,MAAM,qBAAA,EAAsB;AACtC,MAAA,MAAA,CAAO;AAAA,QACL,IAAA,EAAM,KAAA,CAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,CAAO,UAAA,GAAa,CAAA,CAAE,KAAA,GAAQ,MAAM,CAAA;AAAA,QAC3E,GAAA,EAAK,KAAA,CAAM,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,GAAA,EAAK,MAAA,EAAQ,MAAA,CAAO,WAAA,GAAc,CAAA,CAAE,MAAA,GAAS,MAAM;AAAA,OAClF,CAAA;AAAA,IACH,CAAA;AACA,IAAA,KAAA,EAAM;AACN,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,KAAK,CAAA;AACvC,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,KAAK,CAAA;AAC1C,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,KAAA,EAAO,IAAI,CAAA;AAAA,IAClD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAErB,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,KAAA,CAAM,KAAA,EAAe,EAAA,EAAY,EAAA,EAAoB;AAC5D,EAAA,OAAO,KAAK,GAAA,CAAI,EAAA,EAAI,KAAK,GAAA,CAAI,KAAA,EAAO,EAAE,CAAC,CAAA;AACzC;AC5BO,SAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAO,SAAA,EAAW,KAAA,EAAO,UAAS,EAAiB;AAC5F,EAAA,MAAM,GAAA,GAAMI,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,MAAA,EAAQ,GAAG,CAAA;AAE3C,EAAAH,UAAU,MAAM;AACd,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,KAAoB;AAClC,MAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,IAAK,CAAC,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAG,OAAA,EAAQ;AAAA,IAC3E,CAAA;AACA,IAAA,MAAM,QAAQ,CAAC,CAAA,KAAqB,CAAA,CAAE,GAAA,KAAQ,YAAY,OAAA,EAAQ;AAClE,IAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,MAAM,CAAA;AAC/C,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,KAAK,CAAA;AAC1C,IAAA,OAAO,MAAM;AACX,MAAA,QAAA,CAAS,mBAAA,CAAoB,eAAe,MAAM,CAAA;AAClD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,KAAK,CAAA;AAAA,IAC/C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,OAAO,CAAC,CAAA;AAEpB,EAAA,OAAOS,YAAAA;AAAA,oBACLJ,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,eAAA,EAAa,IAAA;AAAA,QACb,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAY,KAAA;AAAA,QACZ,SAAA,EAAW,CAAC,YAAA,EAAc,SAAS,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,QAC7D,KAAA,EAAO;AAAA,UACL,GAAA,EAAK,KAAK,GAAA,IAAO,KAAA;AAAA,UACjB,IAAA,EAAM,KAAK,IAAA,IAAQ,KAAA;AAAA,UACnB,UAAA,EAAY,MAAM,SAAA,GAAY,QAAA;AAAA,UAC9B,GAAG;AAAA,SACL;AAAA,QAEC;AAAA;AAAA,KACH;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;ACvCO,SAAS,SAAA,CAAU,EAAE,MAAA,EAAQ,OAAA,EAAQ,EAAmB;AAC7D,EAAA,MAAM,EAAE,MAAA,EAAQ,aAAA,EAAe,SAAA,KAAc,WAAA,EAAY;AACzD,EAAA,uBACEC,IAAAA,CAAC,OAAA,EAAA,EAAQ,MAAA,EAAgB,OAAA,EAAkB,OAAM,oBAAA,EAAqB,SAAA,EAAW,aAAA,EAAe,KAAA,EAAO,SAAA,EACrG,QAAA,EAAA;AAAA,oBAAAA,IAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,kBAAA,EAChB,QAAA,EAAA;AAAA,sBAAAD,GAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,sBAChDA,GAAAA,CAAC,QAAA,EAAA,EAAO,OAAA,EAAS,OAAA,EAAS,YAAA,EAAW,OAAA,EAAQ,SAAA,EAAU,iBAAA,EACrD,QAAA,kBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,CAAA,EACb;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAA,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,kBAAiB,QAAA,EAAA,kEAAA,EAAgE,CAAA;AAAA,oBAE9FC,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,sBAAAA,KAAC,IAAA,EAAA,EAAK,IAAA,kBAAMD,GAAAA,CAAC,YAAS,CAAA,EACpB,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,OAAE,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,QAAI,WAAA;AAAA,QAAU,GAAA;AAAA,wBAC7BA,GAAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,YAAS,CAAA,EACZ,CAAA;AAAA,QAAc,GAAA;AAAA,QAAI;AAAA,OAAA,EAEpB,CAAA;AAAA,sBACAC,IAAAA,CAAC,IAAA,EAAA,EAAK,sBAAMD,GAAAA,CAAC,YAAS,CAAA,EACpB,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,OAAE,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,QAAI;AAAA,OAAA,EAE3B,CAAA;AAAA,sBACAC,KAAC,IAAA,EAAA,EAAK,IAAA,kBAAMD,GAAAA,CAACK,KAAAA,EAAA,EAAK,CAAA,EAChB,QAAA,EAAA;AAAA,wBAAAL,GAAAA,CAAC,OAAE,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,QAAI;AAAA,OAAA,EAErB,CAAA;AAAA,sBACAC,IAAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,MAAA,mBAASD,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,mBAAKA,GAAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EAC5C,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,OAAE,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,QAAI,8DAAA;AAAA,QAA6D,GAAA;AAAA,QAC9E,MAAA,mBACCC,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,YAAS,CAAA,EACZ,CAAA;AAAA,UAAc,GAAA;AAAA,UAAI;AAAA,SAAA,EAEpB,CAAA,mBAEAC,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAH,GAAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAAC,YAAS,CAAA,EACZ,CAAA;AAAA,UAAc,GAAA;AAAA,UAAI;AAAA,SAAA,EAEpB;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAS,EAA6C;AAC1E,EAAA,uBACEC,IAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qBAAA,EAAuB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,oBAC5CA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAuB,QAAA,EAAS;AAAA,GAAA,EAClD,CAAA;AAEJ;AAGA,SAAS,UAAA,CAAW,EAAE,QAAA,EAAS,EAA4B;AACzD,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAyB,QAAA,EAAS,CAAA;AAC3D;AAGA,SAASK,KAAAA,GAAO;AACd,EAAA,uBAAOL,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAC1C;AC/DO,SAAS,aAAA,GAAgB;AAC9B,EAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,aAAA,EAAe,SAAA,EAAU,GAAI,WAAA,EAAY;AACxG,EAAA,MAAME,QAAAA,GAAU,WAAW,MAAM,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAClC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIR,SAAwB,IAAI,CAAA;AAC1D,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,SAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAUI,OAA0B,IAAI,CAAA;AAE9C,EAAA,MAAM,WAAWD,WAAAA,CAAY,CAAC,EAAA,KAAe,GAAA,CAAI,MAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA,EAAG,CAAC,GAAA,CAAI,KAAK,CAAC,CAAA;AAE5F,EAAA,MAAM,QAAQ,YAAA,CAAa;AAAA,IACzB,MAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,EAAU,CAAC,MAAA,EAAQ,IAAA,EAAM,MAAM,MAAA,KAC7B,GAAA,CAAI,OAAA,CAAQ,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA,EAAG,IAAA,CAAK,GAAG,CAAA,EAAG,IAAA,CAAK,CAAA,EAAG,MAAA,EAAQ;AAAA,GACtF,CAAA;AAED,EAAA,MAAM,KAAA,GAAQA,WAAAA;AAAA,IACZ,CAAC,SAAiB,OAAA,KAAoB;AACpC,MAAA,MAAM,EAAE,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,OAAA,EAAS,SAAS,MAAM,CAAA;AACnD,MAAA,UAAA,CAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,OAAA,EAAS,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,CAAC,GAAA,EAAK,GAAA,CAAI,IAAA,EAAM,SAAS,MAAM;AAAA,GACjC;AACA,EAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,gBAAgB,KAAK,CAAA;AAEjD,EAAA,MAAM,IAAA,GAAOA,YAAY,YAAY;AACnC,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,EAAU;AAC/B,IAAA,IAAI,MAAA,EAAQ,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,MAAM,OAAOA,WAAAA,CAAY,MAAM,KAAK,SAAA,CAAU,EAAE,OAAO,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,OAAM,EAAG,QAAQ,GAAG,CAAC,GAAA,EAAK,QAAQ,CAAC,CAAA;AAEhH,EAAA,MAAM,UAAA,GAAa,cAAc,MAAM,CAAA;AACvC,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,MAAM,KAAK,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,KAAA,EAAO,GAAA,CAAI,KAAA,EAAO,CAAA;AAAA,IACjE,CAAC,UAAA,CAAW,IAAA,EAAM,GAAA,CAAI,KAAA,EAAO,IAAI,KAAK;AAAA,GACxC;AAGA,EAAAF,UAAU,MAAM;AACd,IAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AACxC,IAAA,QAAA,CAAS,gBAAA,CAAiB,eAAe,KAAK,CAAA;AAC9C,IAAA,OAAO,MAAM,QAAA,CAAS,mBAAA,CAAoB,aAAA,EAAe,KAAK,CAAA;AAAA,EAChE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KAAqB;AAClC,MAAA,IAAA,CAAK,CAAA,CAAE,GAAA,KAAQ,QAAA,IAAY,CAAA,CAAE,GAAA,KAAQ,gBAAgB,CAAC,UAAA,CAAW,QAAA,CAAS,aAAa,CAAA,EAAG;AACxF,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,GAAA,CAAI,WAAW,YAAY,CAAA;AAC3B,QAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,MACtB;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,KAAK,CAAA;AACxC,IAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,EAC1D,CAAA,EAAG,CAAC,YAAA,EAAc,GAAG,CAAC,CAAA;AAEtB,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,SAAS,CAAA,IAAK,IAAA;AAEpE,EAAA,uBACEM,IAAAA,CAAAE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,GAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAASE,QAAAA;AAAA,QACT,OAAA;AAAA,QACA,iBAAiB,MAAA,CAAO,SAAA;AAAA,QACxB,WAAW,MAAA,CAAO,EAAA;AAAA,QAClB,YAAA;AAAA,QACA,YAAA,EAAc,eAAA;AAAA,QACd;AAAA;AAAA,KACF;AAAA,IAECE,YAAAA;AAAA,sBACCH,KAAC,KAAA,EAAA,EAAI,eAAA,EAAa,MAAC,SAAA,EAAW,aAAA,EAAe,OAAO,SAAA,EACjD,QAAA,EAAA;AAAA,QAAA,KAAA,oBAASD,IAAC,SAAA,EAAA,EAAU,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA;AAAA,QAE5C,MAAA,CAAO,sBACNA,GAAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YACC,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,YAAY,OAAA,KAAY,IAAA;AAAA,YACxB,eAAA,EAAiB,SAAS,QAAA,IAAY,KAAA;AAAA,YACtC,iBAAiB,MAAA,CAAO,eAAA;AAAA,YACxB,SAAS,MAAA,CAAO,KAAA;AAAA,YAChB,QAAQ,MAAA,CAAO,IAAA;AAAA,YACf,QAAQ,MAAA,CAAO,IAAA;AAAA,YACf,QAAQ,MAAA,CAAO,IAAA;AAAA,YACf,gBAAA,EAAkB,MAAM,OAAA,IAAW,GAAA,CAAI,UAAA,CAAW,OAAA,CAAQ,EAAA,EAAI,EAAE,QAAA,EAAU,CAAC,OAAA,CAAQ,QAAA,EAAU,CAAA;AAAA,YAC7F,iBAAiB,MAAM,OAAA,IAAW,GAAA,CAAI,UAAA,CAAW,QAAQ,EAAE,CAAA;AAAA,YAC3D,yBAAyB,MAAA,CAAO,qBAAA;AAAA,YAChC,QAAQ,MAAA,CAAO;AAAA;AAAA,SACjB;AAAA,wBAGFA,GAAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,QAAA,EAAU,QAAA;AAAA,YACV,MAAA,EAAQ,IAAA;AAAA,YACR,MAAA,EAAQ,MAAM,KAAK,IAAA,EAAK;AAAA,YACxB,QAAA,EAAU,SAAS,IAAA,GAAO,IAAA;AAAA,YAC1B,cAAc,UAAA,CAAW,MAAA;AAAA,YACzB,gBAAgB,MAAA,CAAO,MAAA;AAAA,YACvB,WAAW,MAAA,CAAO,EAAA;AAAA,YAClB,cAAc,MAAM,WAAA,CAAY,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,YAC/C,QAAA;AAAA,YACA,OAAA;AAAA,YACA,KAAA,EAAO,IAAI,KAAA,CAAM;AAAA;AAAA,SACnB;AAAA,QAEC,QAAA,oBAAYA,GAAAA,CAAC,SAAA,EAAA,EAAU,MAAA,EAAQ,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,MAAM,WAAA,CAAY,KAAK,CAAA,EAAG;AAAA,OAAA,EACtF,CAAA;AAAA,MACA,QAAA,CAAS;AAAA;AACX,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,WAAW,EAAA,EAA6B;AAC/C,EAAA,IAAI,CAAC,IAAI,OAAO,KAAA;AAChB,EAAA,OAAO,GAAG,OAAA,KAAY,OAAA,IAAW,EAAA,CAAG,OAAA,KAAY,cAAe,EAAA,CAAmB,iBAAA;AACpF;ACtHO,SAAS,cAAA,CAAe,EAAE,QAAA,EAAU,OAAA,EAAS,UAAU,IAAA,EAAM,QAAA,EAAU,SAAA,EAAW,KAAA,EAAM,EAAwB;AACrH,EAAA,MAAM,GAAA,GAAMF,OAAuB,IAAI,CAAA;AACvC,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,WAAA,EAAY;AACnC,EAAA,MAAM,SAAA,GAAYA,OAAO,QAAQ,CAAA;AACjC,EAAA,SAAA,CAAU,OAAA,GAAU,QAAA;AACpB,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,QAAA;AAEpB,EAAAH,UAAU,MAAM;AACd,IAAA,UAAA,CAAW;AAAA,MACT,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,OAAA;AAAA,MACA,OAAA;AAAA,MACA,QAAQ,SAAA,GAAY,CAAC,MAAM,SAAA,CAAU,OAAA,GAAU,CAAC,CAAA,GAAI;AAAA,KACrD,CAAA;AACD,IAAA,OAAO,MAAM,WAAW,IAAI,CAAA;AAAA,EAC9B,GAAG,CAAC,OAAA,EAAS,OAAA,EAAS,SAAA,EAAW,UAAU,CAAC,CAAA;AAK5C,EAAA,uBACEK,GAAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAsB,KAAA,EAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,UAAA,EAAW,EAC1E,QAAA,EACH,CAAA;AAEJ","file":"index.js","sourcesContent":["/** Shared dimensions and arrow math for notes and their edges. */\n\nexport const NOTE_WIDTH = 224\nexport const NOTE_MIN_HEIGHT = 132\n\n/** Which knob on a note's border an edge grows from. */\nexport type Port = 'left' | 'bottom' | 'right'\n\nexport const PORTS: Port[] = ['left', 'bottom', 'right']\n\nexport interface Point {\n x: number\n y: number\n}\n\n/** The content-space position of a note's knob for the given port. */\nexport function knobPoint(note: Point, port: Port, height: number): Point {\n switch (port) {\n case 'left':\n return { x: note.x, y: note.y + height / 2 }\n case 'right':\n return { x: note.x + NOTE_WIDTH, y: note.y + height / 2 }\n case 'bottom':\n return { x: note.x + NOTE_WIDTH / 2, y: note.y + height }\n }\n}\n\nexport interface ArrowGeometry {\n /** Top-left of the bounding svg, in content coordinates. */\n origin: Point\n width: number\n height: number\n /** Tail, arrowhead base, and tip — all in the svg's local coordinates. */\n start: Point\n base: Point\n head: Point\n wings: [Point, Point]\n}\n\nconst PAD = 14\nconst ARROW_LEN = 12\nconst ARROW_HALF = 6.5\n\n/**\n * Everything needed to draw an arrow from `start` to `head`: a padded\n * bounding box plus local-space points for the shaft and arrowhead.\n */\nexport function arrowGeometry(start: Point, head: Point): ArrowGeometry {\n const origin = { x: Math.min(start.x, head.x) - PAD, y: Math.min(start.y, head.y) - PAD }\n const s = { x: start.x - origin.x, y: start.y - origin.y }\n const h = { x: head.x - origin.x, y: head.y - origin.y }\n const len = Math.hypot(h.x - s.x, h.y - s.y) || 1\n const ux = (h.x - s.x) / len\n const uy = (h.y - s.y) / len\n const base = { x: h.x - ux * ARROW_LEN, y: h.y - uy * ARROW_LEN }\n return {\n origin,\n width: Math.abs(head.x - start.x) + PAD * 2,\n height: Math.abs(head.y - start.y) + PAD * 2,\n start: s,\n base,\n head: h,\n wings: [\n { x: base.x - uy * ARROW_HALF, y: base.y + ux * ARROW_HALF },\n { x: base.x + uy * ARROW_HALF, y: base.y - ux * ARROW_HALF },\n ],\n }\n}\n","/**\n * The feedback document: notes and edges, plus the coercion that turns\n * untrusted data (a loaded file, or restored storage) into a valid one.\n *\n * Notes are the sticky notes a reviewer drops; edges are arrows drawn\n * from a note's knob to a free point. Coordinates are stored in content\n * space (see `coordinates.ts`) so they track the layout across window\n * sizes. Pure data — the React binding lives in `useFeedbackDoc`.\n */\n\nimport type { Port } from './geometry'\n\nexport interface FeedbackNote {\n id: string\n /** Top-level scope the note was dropped on (a route/path); revisited during review. */\n page: string\n /** Sub-scope within the page (e.g. a carousel step); null spans the page. */\n section: string | null\n /** Stored in content coordinates — see `coordinates.ts`. */\n x: number\n y: number\n text: string\n /** Marked done during review; kept, not deleted. */\n resolved: boolean\n}\n\n/** The page element an arrow lands on, addressed for later identification. */\nexport interface EdgeTarget {\n /** A CSS path carrying every class at each level, e.g. `article.prose > p.lead`. */\n selector: string\n /** A short text excerpt from the element, or null when it has none. */\n text: string | null\n}\n\nexport interface FeedbackEdge {\n id: string\n page: string\n section: string | null\n /** The note this arrow's tail is pinned to. */\n noteId: string\n /** Which of the note's knobs the tail grows from. */\n port: Port\n /** The arrowhead, in the same content coordinates as a note. */\n x: number\n y: number\n /** What the arrowhead points at, captured on draw and re-aim. */\n target: EdgeTarget | null\n}\n\nexport interface FeedbackDoc {\n notes: FeedbackNote[]\n edges: FeedbackEdge[]\n}\n\nexport const EMPTY_DOC: FeedbackDoc = { notes: [], edges: [] }\n\n/**\n * Coerce untrusted data into a document. Accepts a `{ notes, edges }`\n * envelope, or a bare notes array from an older export. Edges whose note\n * is gone are dropped.\n */\nexport function normalizeDoc(data: unknown): FeedbackDoc {\n const notes = normalizeNotes(data)\n const edges = normalizeEdges(isRecord(data) ? data.edges : undefined).filter((edge) =>\n notes.some((note) => note.id === edge.noteId),\n )\n return { notes, edges }\n}\n\nfunction normalizeNotes(data: unknown): FeedbackNote[] {\n const raw = Array.isArray(data) ? data : isRecord(data) && Array.isArray(data.notes) ? data.notes : []\n return raw.filter(isRecord).map(toNote)\n}\n\nfunction normalizeEdges(data: unknown): FeedbackEdge[] {\n return Array.isArray(data) ? data.filter(isRecord).map(toEdge) : []\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null\n}\n\nfunction toNote(r: Record<string, unknown>): FeedbackNote {\n return {\n id: typeof r.id === 'string' ? r.id : uid(),\n page: typeof r.page === 'string' ? r.page : '/',\n section: typeof r.section === 'string' ? r.section : null,\n x: Number(r.x) || 0,\n y: Number(r.y) || 0,\n text: typeof r.text === 'string' ? r.text : '',\n resolved: r.resolved === true,\n }\n}\n\nfunction toEdge(r: Record<string, unknown>): FeedbackEdge {\n const port = r.port === 'left' || r.port === 'bottom' || r.port === 'right' ? r.port : 'right'\n return {\n id: typeof r.id === 'string' ? r.id : uid(),\n page: typeof r.page === 'string' ? r.page : '/',\n section: typeof r.section === 'string' ? r.section : null,\n noteId: typeof r.noteId === 'string' ? r.noteId : '',\n port,\n x: Number(r.x) || 0,\n y: Number(r.y) || 0,\n target: toTarget(r.target),\n }\n}\n\nfunction toTarget(data: unknown): EdgeTarget | null {\n if (!isRecord(data) || typeof data.selector !== 'string') return null\n return { selector: data.selector, text: typeof data.text === 'string' ? data.text : null }\n}\n\n/** A collision-resistant id, with a fallback for non-secure contexts. */\nexport function uid(): string {\n if (typeof crypto !== 'undefined' && 'randomUUID' in crypto) return crypto.randomUUID()\n return `fb-${Math.random().toString(36).slice(2)}-${Date.now().toString(36)}`\n}\n","/**\n * Persistence: the feedback document survives in `localStorage` between\n * visits, and can be exported to / imported from a single JSON file so a\n * reviewer can send their notes to whoever owns the page.\n *\n * The file dialogs prefer the File System Access API where it exists\n * (Chromium) and fall back to a plain download / hidden input elsewhere\n * (Firefox, Safari).\n */\n\nimport { EMPTY_DOC, normalizeDoc, type FeedbackDoc } from './document'\n\n/**\n * Restore the stored document, falling back to `seed` only when this key\n * has never been written — the seam a pre-populated demo hangs on. A key\n * that exists but is empty stays empty: a reader who cleared their notes\n * shouldn't have the seed grow back on the next load.\n */\nexport function readDoc(storageKey: string, seed: FeedbackDoc = EMPTY_DOC): FeedbackDoc {\n if (typeof window === 'undefined') return seed\n const stored = window.localStorage.getItem(storageKey)\n if (stored === null) return seed\n try {\n return normalizeDoc(JSON.parse(stored))\n } catch {\n return seed\n }\n}\n\nexport function writeDoc(storageKey: string, doc: FeedbackDoc): void {\n if (typeof window === 'undefined') return\n try {\n window.localStorage.setItem(storageKey, JSON.stringify(doc))\n } catch (err) {\n console.error('[feedback] failed to persist', err)\n }\n}\n\n/** Save the whole document to one JSON file. */\nexport async function exportDoc(doc: FeedbackDoc, fileName: string): Promise<void> {\n const payload = JSON.stringify({ exportedAt: new Date().toISOString(), ...doc }, null, 2)\n if (await saveViaPicker(payload, fileName)) return\n saveViaDownload(payload, fileName)\n}\n\n/** Open a saved file and parse it into a document, or null if cancelled. */\nexport async function importDoc(): Promise<FeedbackDoc | null> {\n const file = await pickFile()\n if (!file) return null\n try {\n return normalizeDoc(JSON.parse(await file.text()))\n } catch {\n return EMPTY_DOC\n }\n}\n\n// --- File System Access API shims (typed narrowly, feature-detected) ---\n\ninterface WritableFileStreamLike {\n write: (data: string) => Promise<void>\n close: () => Promise<void>\n}\ninterface SaveHandleLike {\n createWritable: () => Promise<WritableFileStreamLike>\n}\ninterface OpenHandleLike {\n getFile: () => Promise<File>\n}\ninterface PickerTypes {\n suggestedName?: string\n multiple?: boolean\n types?: { description?: string; accept: Record<string, string[]> }[]\n}\ntype SaveFilePicker = (options?: PickerTypes) => Promise<SaveHandleLike>\ntype OpenFilePicker = (options?: PickerTypes) => Promise<OpenHandleLike[]>\n\nconst JSON_TYPES = [{ description: 'JSON', accept: { 'application/json': ['.json'] } }]\n\n/** Returns true when the save was handled (written, or the dialog cancelled). */\nasync function saveViaPicker(text: string, fileName: string): Promise<boolean> {\n const picker = (window as unknown as { showSaveFilePicker?: SaveFilePicker }).showSaveFilePicker\n if (typeof picker !== 'function') return false\n try {\n const handle = await picker({ suggestedName: fileName, types: JSON_TYPES })\n const writable = await handle.createWritable()\n await writable.write(text)\n await writable.close()\n return true\n } catch (err) {\n // Dismissing the dialog is a completed choice, not a reason to fall back.\n if (err instanceof DOMException && err.name === 'AbortError') return true\n return false\n }\n}\n\nfunction saveViaDownload(text: string, fileName: string): void {\n const url = URL.createObjectURL(new Blob([text], { type: 'application/json' }))\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.download = fileName\n anchor.click()\n URL.revokeObjectURL(url)\n}\n\nasync function pickFile(): Promise<File | null> {\n const picker = (window as unknown as { showOpenFilePicker?: OpenFilePicker }).showOpenFilePicker\n if (typeof picker === 'function') {\n try {\n const [handle] = await picker({ multiple: false, types: JSON_TYPES })\n return handle ? await handle.getFile() : null\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return null\n // Any other failure: fall through to the input fallback.\n }\n }\n return pickViaInput()\n}\n\n/** Fallback for browsers without the File System Access API. */\nfunction pickViaInput(): Promise<File | null> {\n return new Promise((resolve) => {\n const input = document.createElement('input')\n input.type = 'file'\n input.accept = 'application/json,.json'\n input.addEventListener('change', () => resolve(input.files?.[0] ?? null), { once: true })\n input.click()\n })\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport { EMPTY_DOC, normalizeDoc, uid, type FeedbackDoc, type FeedbackEdge, type FeedbackNote } from './document'\nimport { readDoc, writeDoc } from './persistence'\n\ntype NotePatch = Partial<Pick<FeedbackNote, 'x' | 'y' | 'text' | 'resolved'>>\ntype EdgePatch = Partial<Pick<FeedbackEdge, 'x' | 'y' | 'target'>>\n\nexport interface FeedbackDocApi {\n notes: FeedbackNote[]\n edges: FeedbackEdge[]\n addNote: (page: string, section: string | null, x: number, y: number) => string\n updateNote: (id: string, patch: NotePatch) => void\n removeNote: (id: string) => void\n addEdge: (edge: Omit<FeedbackEdge, 'id'>) => void\n updateEdge: (id: string, patch: EdgePatch) => void\n removeEdge: (id: string) => void\n /** Replace the whole document — the load path. */\n replace: (doc: FeedbackDoc) => void\n}\n\n/**\n * Holds the whole document in state and writes it back to `localStorage`\n * on any change — so a move, keystroke, resolve, arrow, or load is saved\n * the moment it happens. `seed` populates the very first visit, before\n * anything has been stored under `storageKey`.\n */\nexport function useFeedbackDoc(storageKey: string, seed?: FeedbackDoc): FeedbackDocApi {\n const [doc, setDoc] = useState<FeedbackDoc>(() =>\n readDoc(storageKey, seed ? normalizeDoc(seed) : EMPTY_DOC),\n )\n\n useEffect(() => {\n writeDoc(storageKey, doc)\n }, [storageKey, doc])\n\n const addNote = useCallback((page: string, section: string | null, x: number, y: number) => {\n const note: FeedbackNote = { id: uid(), page, section, x, y, text: '', resolved: false }\n setDoc((d) => ({ ...d, notes: [...d.notes, note] }))\n return note.id\n }, [])\n\n const updateNote = useCallback((id: string, patch: NotePatch) => {\n setDoc((d) => ({ ...d, notes: d.notes.map((n) => (n.id === id ? { ...n, ...patch } : n)) }))\n }, [])\n\n // Removing a note takes its arrows with it — an arrow to nowhere is noise.\n const removeNote = useCallback((id: string) => {\n setDoc((d) => ({\n notes: d.notes.filter((n) => n.id !== id),\n edges: d.edges.filter((e) => e.noteId !== id),\n }))\n }, [])\n\n const addEdge = useCallback((edge: Omit<FeedbackEdge, 'id'>) => {\n setDoc((d) => ({ ...d, edges: [...d.edges, { ...edge, id: uid() }] }))\n }, [])\n\n const updateEdge = useCallback((id: string, patch: EdgePatch) => {\n setDoc((d) => ({ ...d, edges: d.edges.map((e) => (e.id === id ? { ...e, ...patch } : e)) }))\n }, [])\n\n const removeEdge = useCallback((id: string) => {\n setDoc((d) => ({ ...d, edges: d.edges.filter((e) => e.id !== id) }))\n }, [])\n\n const replace = useCallback((next: FeedbackDoc) => setDoc(next), [])\n\n return {\n notes: doc.notes,\n edges: doc.edges,\n addNote,\n updateNote,\n removeNote,\n addEdge,\n updateEdge,\n removeEdge,\n replace,\n }\n}\n","import { useEffect, useMemo, useState } from 'react'\n\n/**\n * How feedback learns which \"page\" it's on and how to move between them.\n *\n * A note remembers the page it was left on so review can return to it.\n * Apps that route client-side (React Router, TanStack Router, Next) pass\n * their own adapter so review navigates through the router rather than\n * reloading. With no adapter, feedback reads `location.pathname` and\n * navigates by pushing history state — enough for a single-page site.\n */\nexport interface FeedbackNavigation {\n /** The current page identity — the scope a new note is filed under. */\n page: string\n /** Move to a page so review can reveal a note left there. */\n navigate: (page: string) => void\n}\n\n/** The built-in adapter: `location.pathname`, history-based navigation. */\nexport function useLocationNavigation(): FeedbackNavigation {\n const [page, setPage] = useState(() => (typeof location === 'undefined' ? '/' : location.pathname))\n\n useEffect(() => {\n const sync = () => setPage(location.pathname)\n window.addEventListener('popstate', sync)\n return () => window.removeEventListener('popstate', sync)\n }, [])\n\n return useMemo(\n () => ({\n page,\n navigate: (to) => {\n if (to === location.pathname) return\n history.pushState(null, '', to)\n setPage(to)\n window.dispatchEvent(new PopStateEvent('popstate'))\n },\n }),\n [page],\n )\n}\n","/**\n * Submission: the network counterpart to file export. A page that has\n * somewhere to send feedback configures `<FeedbackProvider submit>` with\n * either an endpoint URL — the document is POSTed there as JSON — or its\n * own async function for anything richer (auth flows, an SDK, a queue).\n */\n\nimport type { FeedbackDoc } from './document'\n\n/** Delivers a document to wherever feedback is collected. Throw to signal failure. */\nexport type FeedbackSubmitter = (doc: FeedbackDoc) => Promise<void>\n\nexport interface EndpointOptions {\n /** HTTP method. Default `POST`. */\n method?: string\n /** Extra headers merged over the JSON content type — e.g. authorization. */\n headers?: Record<string, string>\n /** Passed through to `fetch`, for cookie-authenticated endpoints. */\n credentials?: RequestCredentials\n}\n\n/** Send the document as a JSON request to `url`; any non-2xx response is a failure. */\nexport function endpointSubmitter(url: string, options: EndpointOptions = {}): FeedbackSubmitter {\n return async (doc) => {\n const response = await fetch(url, {\n method: options.method ?? 'POST',\n credentials: options.credentials,\n headers: { 'Content-Type': 'application/json', ...options.headers },\n body: JSON.stringify({ submittedAt: new Date().toISOString(), ...doc }),\n })\n if (!response.ok) {\n throw new Error(`feedback submission failed: ${response.status} ${response.statusText}`)\n }\n }\n}\n\n/** Normalize the provider's `submit` prop into a callable, or null when unconfigured. */\nexport function resolveSubmitter(submit?: string | FeedbackSubmitter): FeedbackSubmitter | null {\n if (submit == null) return null\n return typeof submit === 'string' ? endpointSubmitter(submit) : submit\n}\n","import {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react'\nimport type { AnchorX, Region } from './coordinates'\nimport type { FeedbackDoc } from './document'\nimport { NOTE_MIN_HEIGHT } from './geometry'\nimport { useFeedbackDoc, type FeedbackDocApi } from './useFeedbackDoc'\nimport { useLocationNavigation, type FeedbackNavigation } from './navigation'\nimport { resolveSubmitter, type FeedbackSubmitter } from './submission'\n\n/**\n * The one place all feedback state lives, scoped to a `<FeedbackProvider>`\n * — the document, the active region, live note heights, and the app's\n * navigation adapter. Everything else reads it through `useFeedback`.\n * Being context rather than a module global means two providers can\n * coexist and never collide.\n */\nexport interface FeedbackContextValue {\n doc: FeedbackDocApi\n /** Current page + how review moves between pages. */\n nav: FeedbackNavigation\n /** The resolved coordinate frame notes are drawn in. */\n region: Region\n /** The active sub-scope, if a page bound one. */\n section: string | null\n /** Ask the active page to reveal a section (used by review). */\n reveal: (section: string) => void\n /** How a `<FeedbackRegion>` registers/updates its element and sub-scope. */\n bindRegion: (binding: RegionBinding | null) => void\n /** A section review wants shown the moment a page can satisfy it. */\n requestSection: (section: string | null) => void\n heightOf: (id: string) => number\n reportHeight: (id: string, height: number) => void\n clearHeight: (id: string) => void\n fileName: string\n /** Delivers the document to the configured collector, or null when none. */\n submit: FeedbackSubmitter | null\n /** Applied to every portal root, so a theme override reaches the overlay. */\n rootClassName: string\n rootStyle?: CSSProperties\n}\n\n/** What a mounted `<FeedbackRegion>` hands the layer. */\nexport interface RegionBinding {\n element: HTMLElement | null\n anchorX?: AnchorX\n section?: string | null\n reveal?: (section: string) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextValue | null>(null)\n\nexport interface FeedbackProviderProps {\n children: ReactNode\n /** localStorage key the document is saved under. Default `\"feedback\"`. */\n storageKey?: string\n /** Suggested name for exported files. Default `\"feedback.json\"`. */\n fileName?: string\n /**\n * Seeds the document the first time `storageKey` is used, so a page can\n * ship with notes already on it — a live demo, or a review handed back\n * to its author. Ignored once anything has been stored under the key.\n */\n initialDoc?: FeedbackDoc\n /** Router adapter. Default reads `location.pathname`. */\n navigation?: FeedbackNavigation\n /**\n * Where \"send feedback\" delivers the document: an endpoint URL (the\n * document is POSTed there as JSON) or a custom async submitter.\n * Omitted, the dock offers file export only.\n */\n submit?: string | FeedbackSubmitter\n /** How x is anchored on pages that mount no region. Default `\"center\"`. */\n defaultAnchorX?: AnchorX\n /** Extra class on every portal root — e.g. a theme scope. */\n className?: string\n /** CSS-variable overrides applied to every portal root. */\n style?: CSSProperties\n}\n\nexport function FeedbackProvider({\n children,\n storageKey = 'feedback',\n fileName = 'feedback.json',\n navigation,\n defaultAnchorX = 'center',\n className,\n style,\n initialDoc,\n submit,\n}: FeedbackProviderProps) {\n const doc = useFeedbackDoc(storageKey, initialDoc)\n const submitter = useMemo(() => resolveSubmitter(submit), [submit])\n const fallbackNav = useLocationNavigation()\n const nav = navigation ?? fallbackNav\n\n const [binding, setBinding] = useState<RegionBinding | null>(null)\n const [heights, setHeights] = useState<Record<string, number>>({})\n const pending = useRef<string | null>(null)\n\n const bindRegion = useCallback((next: RegionBinding | null) => {\n setBinding(next)\n // A cross-page review jump that landed before this page could route.\n if (next?.reveal && pending.current != null) {\n next.reveal(pending.current)\n pending.current = null\n }\n }, [])\n\n const requestSection = useCallback((section: string | null) => {\n pending.current = section\n }, [])\n\n const reportHeight = useCallback((id: string, height: number) => {\n setHeights((h) => (h[id] === height ? h : { ...h, [id]: height }))\n }, [])\n\n const clearHeight = useCallback((id: string) => {\n setHeights((h) => {\n if (!(id in h)) return h\n const { [id]: _drop, ...rest } = h\n return rest\n })\n }, [])\n\n const heightOf = useCallback((id: string) => heights[id] ?? NOTE_MIN_HEIGHT, [heights])\n\n const region: Region = useMemo(\n () => ({ element: binding?.element ?? null, anchorX: binding?.anchorX ?? defaultAnchorX }),\n [binding?.element, binding?.anchorX, defaultAnchorX],\n )\n\n const value: FeedbackContextValue = useMemo(\n () => ({\n doc,\n nav,\n region,\n section: binding?.section ?? null,\n reveal: binding?.reveal ?? (() => {}),\n bindRegion,\n requestSection,\n heightOf,\n reportHeight,\n clearHeight,\n fileName,\n submit: submitter,\n rootClassName: className ? `fb-root ${className}` : 'fb-root',\n rootStyle: style,\n }),\n [doc, nav, region, binding, bindRegion, requestSection, heightOf, reportHeight, clearHeight, fileName, submitter, className, style],\n )\n\n return <FeedbackContext.Provider value={value}>{children}</FeedbackContext.Provider>\n}\n\n/** Read the feedback context, or throw if used outside a provider. */\nexport function useFeedback(): FeedbackContextValue {\n const ctx = useContext(FeedbackContext)\n if (!ctx) throw new Error('useFeedback must be used within <FeedbackProvider>')\n return ctx\n}\n","import { useEffect, useState } from 'react'\nimport type { Point } from './geometry'\n\n/**\n * The coordinate system.\n *\n * A note stores its position in *content* coordinates — independent of\n * how the page is scrolled or where its region sits on screen. `y` is\n * measured from the content top; `x` is measured from an **anchor line**\n * chosen by `anchorX`, so positions survive a resize the way the content\n * itself does:\n *\n * - `left` — x from the content's left edge (absolute).\n * - `center` — x signed from the horizontal centre line. A note dropped\n * on a centred column stays glued to it as the window narrows. This is\n * the default, because most sites centre their main content.\n * - `right` — x from the content's right edge.\n *\n * A **region** is the element those coordinates live in: either the\n * document/viewport (the default) or the content a page wrapped in a\n * `<FeedbackRegion>`. This module is the single seam that converts a live\n * pointer into stored coordinates and back; every part above it stays\n * origin-agnostic.\n */\n\nexport type AnchorX = 'left' | 'center' | 'right'\n\nexport interface Region {\n /** The bound content element, or null for the document/viewport. */\n element: HTMLElement | null\n /** Which edge of the content x is measured from. */\n anchorX: AnchorX\n}\n\n/** The width of a region's content box. */\nfunction contentWidth(region: Region): number {\n return region.element?.clientWidth ?? document.documentElement.clientWidth\n}\n\n/**\n * The anchor line, in region-local pixels: the x origin a stored `x` is\n * added to when drawing and subtracted from when capturing.\n */\nexport function originX(region: Region): number {\n const width = contentWidth(region)\n switch (region.anchorX) {\n case 'left':\n return 0\n case 'center':\n return width / 2\n case 'right':\n return width\n }\n}\n\n/**\n * A viewport (client) point, in stored content coordinates: `x` relative\n * to the region's anchor line, `y` from the content top. The math is\n * agnostic to what was bound: a scroll container's rect is fixed while\n * its scroll offset varies; a content wrapper's rect moves with the\n * scroll while its own offset stays zero. Either way the sum is the\n * distance into the content.\n */\nexport function toContent(clientX: number, clientY: number, region: Region): Point {\n const origin = originX(region)\n if (!region.element) {\n return { x: clientX + window.scrollX - origin, y: clientY + window.scrollY }\n }\n const rect = region.element.getBoundingClientRect()\n return {\n x: clientX - rect.left + region.element.scrollLeft - origin,\n y: clientY - rect.top + region.element.scrollTop,\n }\n}\n\n/** Reactive `originX`, so drawn positions re-flow live as the region resizes. */\nexport function useOriginX(region: Region): number {\n const [origin, setOrigin] = useState(() => originX(region))\n useEffect(() => {\n const update = () => setOrigin(originX(region))\n update()\n window.addEventListener('resize', update)\n const observer = region.element ? new ResizeObserver(update) : null\n if (region.element) observer?.observe(region.element)\n return () => {\n window.removeEventListener('resize', update)\n observer?.disconnect()\n }\n }, [region.element, region.anchorX])\n return origin\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useFeedback } from '../core/context'\nimport type { FeedbackNote } from '../core/document'\n\nexport interface Review {\n on: boolean\n toggle: () => void\n includeResolved: boolean\n toggleIncludeResolved: () => void\n /** 1-based position in the review set, 0 when empty. */\n position: number\n total: number\n first: () => void\n prev: () => void\n next: () => void\n last: () => void\n /** The note being reviewed, for highlighting. */\n currentId: string | null\n}\n\n/**\n * Steps through the loaded notes, routing to each one's page and section\n * and scrolling it into view. Resolved notes are skipped unless\n * `includeResolved` is on. Turning review off leaves every note in place.\n */\nexport function useReview(notes: FeedbackNote[]): Review {\n const { nav, reveal, requestSection, section } = useFeedback()\n const [on, setOn] = useState(false)\n const [includeResolved, setIncludeResolved] = useState(false)\n const [index, setIndex] = useState(0)\n\n const list = useMemo(() => {\n const ordered = [...notes].sort(compareNotes)\n return includeResolved ? ordered : ordered.filter((n) => !n.resolved)\n }, [notes, includeResolved])\n\n const clamped = Math.min(index, Math.max(0, list.length - 1))\n const current = list[clamped] ?? null\n\n // Whenever the note under review changes, bring it on screen.\n useEffect(() => {\n if (!on || !current) return\n revealNote(current, nav.page, section, nav.navigate, reveal, requestSection)\n scrollToNote(current.id)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [on, current?.id])\n\n const go = useCallback(\n (to: number) => setIndex(Math.min(Math.max(0, to), Math.max(0, list.length - 1))),\n [list.length],\n )\n\n const toggle = useCallback(() => {\n setOn((v) => !v)\n setIndex(0)\n }, [])\n\n return {\n on,\n toggle,\n includeResolved,\n toggleIncludeResolved: useCallback(() => setIncludeResolved((v) => !v), []),\n position: list.length ? clamped + 1 : 0,\n total: list.length,\n first: useCallback(() => go(0), [go]),\n prev: useCallback(() => go(clamped - 1), [go, clamped]),\n next: useCallback(() => go(clamped + 1), [go, clamped]),\n last: useCallback(() => go(list.length - 1), [go, list.length]),\n currentId: current?.id ?? null,\n }\n}\n\n/** Route to the note's page and ask that page to reveal its section. */\nfunction revealNote(\n note: FeedbackNote,\n page: string,\n section: string | null,\n navigate: (page: string) => void,\n reveal: (section: string) => void,\n requestSection: (section: string | null) => void,\n) {\n if (note.page !== page) {\n requestSection(note.section)\n navigate(note.page)\n } else if (note.section != null && note.section !== section) {\n reveal(note.section)\n }\n}\n\n/** Poll for the note element (it may still be mounting after a page change). */\nfunction scrollToNote(id: string) {\n let tries = 0\n const tick = () => {\n const el = document.querySelector(`[data-note-id=\"${id}\"]`)\n if (el) {\n el.scrollIntoView({ block: 'center', inline: 'center', behavior: 'smooth' })\n } else if (tries++ < 30) {\n requestAnimationFrame(tick)\n }\n }\n requestAnimationFrame(tick)\n}\n\nfunction compareNotes(a: FeedbackNote, b: FeedbackNote): number {\n if (a.page !== b.page) return a.page < b.page ? -1 : 1\n const sa = a.section ?? ''\n const sb = b.section ?? ''\n if (sa !== sb) return sa < sb ? -1 : 1\n if (a.y !== b.y) return a.y - b.y\n return a.x - b.x\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { FeedbackDoc } from '../core/document'\nimport type { FeedbackSubmitter } from '../core/submission'\n\nexport type SubmissionStatus = 'idle' | 'sending' | 'sent' | 'error'\n\nexport interface SubmissionApi {\n status: SubmissionStatus\n send: (doc: FeedbackDoc) => Promise<void>\n}\n\n/** How long the sent / error verdict lingers before the button resets. */\nconst SETTLE_MS = 2500\n\n/**\n * Drives the dock's send button: run the configured submitter, surface\n * its lifecycle as a status, and settle back to idle so the button is\n * ready for the next round.\n */\nexport function useSubmission(submitter: FeedbackSubmitter | null): SubmissionApi {\n const [status, setStatus] = useState<SubmissionStatus>('idle')\n const inFlight = useRef(false)\n const timer = useRef<number | undefined>(undefined)\n\n useEffect(() => () => window.clearTimeout(timer.current), [])\n\n const settle = useCallback((outcome: 'sent' | 'error') => {\n setStatus(outcome)\n window.clearTimeout(timer.current)\n timer.current = window.setTimeout(() => setStatus('idle'), SETTLE_MS)\n }, [])\n\n const send = useCallback(\n async (doc: FeedbackDoc) => {\n if (!submitter || inFlight.current) return\n inFlight.current = true\n window.clearTimeout(timer.current)\n setStatus('sending')\n try {\n await submitter(doc)\n settle('sent')\n } catch (err) {\n console.error('[feedback] submission failed', err)\n settle('error')\n } finally {\n inFlight.current = false\n }\n },\n [submitter, settle],\n )\n\n return { status, send }\n}\n","import type { EdgeTarget } from './document'\n\nconst MAX_DEPTH = 8\nconst MAX_TEXT = 120\n\n/**\n * Describe the page element an arrowhead lands on, so it can be\n * identified later without the picture: a CSS path carrying every class\n * at each level, plus a short text excerpt. Feedback UI (tagged\n * `data-feedback`) is skipped, so an arrow addresses the content beneath\n * it, never the overlay itself.\n */\nexport function describeTarget(clientX: number, clientY: number): EdgeTarget | null {\n const el = topPageElement(clientX, clientY)\n return el ? { selector: cssPath(el), text: excerpt(el) } : null\n}\n\nfunction topPageElement(x: number, y: number): Element | null {\n for (const el of document.elementsFromPoint(x, y)) {\n if (!el.closest('[data-feedback]') && el !== document.documentElement && el !== document.body) {\n return el\n }\n }\n return null\n}\n\nfunction cssPath(el: Element): string {\n const parts: string[] = []\n let node: Element | null = el\n while (node && node !== document.body && node !== document.documentElement && parts.length < MAX_DEPTH) {\n parts.unshift(describeNode(node))\n node = node.parentElement\n }\n return parts.join(' > ')\n}\n\nfunction describeNode(el: Element): string {\n const id = el.id ? `#${esc(el.id)}` : ''\n const classes = Array.from(el.classList)\n .map((c) => `.${esc(c)}`)\n .join('')\n return `${el.tagName.toLowerCase()}${id}${classes}${nthOfType(el)}`\n}\n\n/** Disambiguate among same-tag siblings, so the path resolves to one element. */\nfunction nthOfType(el: Element): string {\n const siblings = el.parentElement\n ? Array.from(el.parentElement.children).filter((c) => c.tagName === el.tagName)\n : []\n return siblings.length < 2 ? '' : `:nth-of-type(${siblings.indexOf(el) + 1})`\n}\n\nfunction excerpt(el: Element): string | null {\n const text = (el.textContent ?? '').replace(/\\s+/g, ' ').trim()\n if (!text) return null\n return text.length > MAX_TEXT ? `${text.slice(0, MAX_TEXT)}…` : text\n}\n\nfunction esc(value: string): string {\n return window.CSS?.escape ? window.CSS.escape(value) : value\n}\n","import { useRef, useState } from 'react'\nimport { toContent, type Region } from '../core/coordinates'\nimport { describeTarget } from '../core/targetAddress'\nimport { knobPoint, type Point, type Port } from '../core/geometry'\nimport type { EdgeTarget, FeedbackNote } from '../core/document'\n\n/** Ignore a knob press that barely moved — it's a click, not an arrow. */\nconst MIN_DRAG = 16\n\nexport interface EdgeDraft {\n noteId: string\n port: Port\n /** The head so far, in content coordinates. */\n head: Point\n}\n\nexport interface EdgeDraftApi {\n /** The live draft while a knob is being dragged, else null. */\n draft: EdgeDraft | null\n start: (noteId: string, port: Port) => void\n move: (clientX: number, clientY: number) => void\n end: (clientX: number, clientY: number) => void\n}\n\ninterface EdgeDraftDeps {\n region: Region\n noteById: (id: string) => FeedbackNote | undefined\n heightOf: (id: string) => number\n onCommit: (noteId: string, port: Port, head: Point, target: EdgeTarget | null) => void\n}\n\n/**\n * The drag-from-a-knob gesture. Tracks a live head while dragging and\n * commits a real arrow on release, unless the drag was too short. A ref\n * mirrors the draft so the pointer-up handler never reads a stale head.\n */\nexport function useEdgeDraft({ region, noteById, heightOf, onCommit }: EdgeDraftDeps): EdgeDraftApi {\n const [draft, setDraft] = useState<EdgeDraft | null>(null)\n const live = useRef<EdgeDraft | null>(null)\n\n const set = (next: EdgeDraft | null) => {\n live.current = next\n setDraft(next)\n }\n\n const start = (noteId: string, port: Port) => {\n const note = noteById(noteId)\n if (note) set({ noteId, port, head: knobPoint(note, port, heightOf(noteId)) })\n }\n\n const move = (clientX: number, clientY: number) => {\n const d = live.current\n if (d) set({ ...d, head: toContent(clientX, clientY, region) })\n }\n\n const end = (clientX: number, clientY: number) => {\n const d = live.current\n const note = d && noteById(d.noteId)\n if (d && note) {\n const head = toContent(clientX, clientY, region)\n const tail = knobPoint(note, d.port, heightOf(d.noteId))\n if (Math.hypot(head.x - tail.x, head.y - tail.y) > MIN_DRAG) {\n onCommit(d.noteId, d.port, head, describeTarget(clientX, clientY))\n }\n }\n set(null)\n }\n\n return { draft, start, move, end }\n}\n","import { useCallback, useRef } from 'react'\n\n/** A pointer position in viewport (client) space. */\nexport interface DragPoint {\n x: number\n y: number\n}\n\nexport interface PointerDragHandlers {\n onPointerDown: (e: React.PointerEvent) => void\n onPointerMove: (e: React.PointerEvent) => void\n onPointerUp: (e: React.PointerEvent) => void\n}\n\ninterface UsePointerDragOptions {\n onStart?: (p: DragPoint) => void\n onMove?: (p: DragPoint) => void\n onEnd?: (p: DragPoint) => void\n}\n\nconst pointOf = (e: React.PointerEvent): DragPoint => ({ x: e.clientX, y: e.clientY })\n\n/**\n * A drag reported in viewport coordinates. Captures the pointer on press\n * so movement is tracked even once it leaves the source element. Returns\n * handlers to spread onto any element.\n */\nexport function usePointerDrag({ onStart, onMove, onEnd }: UsePointerDragOptions): PointerDragHandlers {\n const dragging = useRef(false)\n\n const onPointerDown = useCallback(\n (e: React.PointerEvent) => {\n dragging.current = true\n e.currentTarget.setPointerCapture(e.pointerId)\n onStart?.(pointOf(e))\n },\n [onStart],\n )\n\n const onPointerMove = useCallback(\n (e: React.PointerEvent) => {\n if (dragging.current) onMove?.(pointOf(e))\n },\n [onMove],\n )\n\n const onPointerUp = useCallback(\n (e: React.PointerEvent) => {\n if (!dragging.current) return\n dragging.current = false\n e.currentTarget.releasePointerCapture(e.pointerId)\n onEnd?.(pointOf(e))\n },\n [onEnd],\n )\n\n return { onPointerDown, onPointerMove, onPointerUp }\n}\n","import { useRef, useState } from 'react'\nimport { usePointerDrag, type DragPoint } from './usePointerDrag'\nimport { NOTE_WIDTH } from '../core/geometry'\n\nconst TAP_THRESHOLD = 8\n\n/**\n * The drag-to-create gesture for the dock's launcher. Exposes a live\n * `ghost` outline (viewport coordinates) while dragging and reports the\n * viewport point where the pointer lands. A near-motionless press (a tap)\n * drops a note into view instead of burying it under the dock.\n */\nexport function useSpawnGesture(onDrop: (clientX: number, clientY: number) => void) {\n const [ghost, setGhost] = useState<DragPoint | null>(null)\n const origin = useRef<DragPoint | null>(null)\n\n const handlers = usePointerDrag({\n onStart: (p) => {\n origin.current = p\n setGhost(p)\n },\n onMove: setGhost,\n onEnd: (p) => {\n setGhost(null)\n const from = origin.current\n const tapped = !from || Math.hypot(p.x - from.x, p.y - from.y) < TAP_THRESHOLD\n const drop = tapped ? viewportSpot() : p\n onDrop(drop.x, drop.y)\n },\n })\n\n return { ghost, handlers }\n}\n\n/** Upper third of the current viewport, in client coordinates. */\nfunction viewportSpot(): DragPoint {\n return { x: window.innerWidth / 2 - NOTE_WIDTH / 2, y: window.innerHeight / 3 }\n}\n","import { useEffect, useRef } from 'react'\n\n/**\n * Grow a textarea to fit its content, so a note never hides its own tail.\n * Returns a ref to attach to the `<textarea>`.\n */\nexport function useAutoGrow(text: string) {\n const ref = useRef<HTMLTextAreaElement>(null)\n useEffect(() => {\n const el = ref.current\n if (!el) return\n el.style.height = 'auto'\n el.style.height = `${el.scrollHeight}px`\n }, [text])\n return ref\n}\n","import { useEffect, type RefObject } from 'react'\n\n/**\n * Report a mounted element's live height through a callback, tracking it\n * as content grows and clearing on unmount. Notes use this so an edge can\n * anchor to the note's border as its text reflows.\n */\nexport function useElementHeight(\n ref: RefObject<HTMLElement | null>,\n onHeight: (height: number) => void,\n onGone: () => void,\n): void {\n useEffect(() => {\n const el = ref.current\n if (!el) return\n const report = () => onHeight(el.offsetHeight)\n report()\n const observer = new ResizeObserver(report)\n observer.observe(el)\n return () => {\n observer.disconnect()\n onGone()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ref])\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n children: ReactNode\n /** `solid` is a standalone chip; `ghost` sits bare inside a toolbar. */\n variant?: 'solid' | 'ghost'\n size?: 'sm' | 'md' | 'lg'\n /** The colour a hover / active state pulls toward. */\n tone?: 'accent' | 'success' | 'danger'\n /** Pressed / toggled-on look. */\n active?: boolean\n /** A small count in the corner (hidden when undefined). */\n badge?: number\n}\n\n/**\n * The one round control the whole UI is built from — dock chips, review\n * steppers, note actions. Everything but the glyph is a prop, so each\n * caller stays a single expressive line.\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { children, variant = 'ghost', size = 'md', tone = 'accent', active = false, badge, className, ...rest },\n ref,\n) {\n const classes = [\n 'fb-btn',\n `fb-btn--${variant}`,\n `fb-btn--${size}`,\n `fb-btn--${tone}`,\n active ? 'is-active' : '',\n className ?? '',\n ]\n .filter(Boolean)\n .join(' ')\n\n const button = (\n <button ref={ref} className={classes} {...rest}>\n {children}\n </button>\n )\n\n if (badge == null) return button\n return (\n <span className=\"fb-btn-wrap\">\n {button}\n <span className=\"fb-btn__badge\">{badge}</span>\n </span>\n )\n})\n","import type { SVGProps } from 'react'\n\ninterface IconProps extends SVGProps<SVGSVGElement> {\n size?: number\n}\n\n/** A 24-grid stroke icon. Children are the path data; colour is inherited. */\nexport function Icon({ size = 16, className, children, ...rest }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n aria-hidden\n {...rest}\n >\n {children}\n </svg>\n )\n}\n","import { Icon } from './Icon'\n\n/** Speech bubble with a plus — \"leave a note\". */\nexport function NoteIcon() {\n return (\n <Icon size={20}>\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"14\" />\n <line x1=\"9\" y1=\"11\" x2=\"15\" y2=\"11\" />\n </Icon>\n )\n}\n\n/** Downward tray — \"save to a file\". */\nexport function SaveIcon() {\n return (\n <Icon size={20}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </Icon>\n )\n}\n\n/** Upward tray — \"load a file\". */\nexport function LoadIcon() {\n return (\n <Icon size={20}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </Icon>\n )\n}\n\n/** Paper plane — \"submit feedback to the collector\". */\nexport function SendIcon() {\n return (\n <Icon size={20}>\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\" />\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\" />\n </Icon>\n )\n}\n\n/** Check in a circle — \"the send went through\". */\nexport function SentIcon() {\n return (\n <Icon size={20}>\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\" />\n <polyline points=\"22 4 12 14.01 9 11.01\" />\n </Icon>\n )\n}\n\n/** Question mark in a circle — \"how does this work?\". */\nexport function HelpIcon() {\n return (\n <Icon size={20}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M9.1 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </Icon>\n )\n}\n\n/** Clipboard with a check — \"review mode\". */\nexport function ReviewIcon() {\n return (\n <Icon size={20}>\n <path d=\"M9 4h6a1 1 0 0 1 1 1v1a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1z\" />\n <path d=\"M8 5H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2h-2\" />\n <polyline points=\"9 14 11 16 15 12\" />\n </Icon>\n )\n}\n\nexport function CloseIcon() {\n return (\n <Icon size={14}>\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </Icon>\n )\n}\n\nexport function CheckIcon() {\n return (\n <Icon size={14}>\n <polyline points=\"20 6 9 17 4 12\" />\n </Icon>\n )\n}\n\nexport function TrashIcon() {\n return (\n <Icon size={16}>\n <polyline points=\"3 6 5 6 21 6\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" y1=\"11\" x2=\"10\" y2=\"17\" />\n <line x1=\"14\" y1=\"11\" x2=\"14\" y2=\"17\" />\n </Icon>\n )\n}\n\n/** Six dots — the universal \"grab here to drag\" affordance. */\nexport function GripIcon() {\n return (\n <Icon size={14} fill=\"currentColor\" stroke=\"none\">\n <circle cx=\"9\" cy=\"6\" r=\"1.4\" />\n <circle cx=\"15\" cy=\"6\" r=\"1.4\" />\n <circle cx=\"9\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"15\" cy=\"12\" r=\"1.4\" />\n <circle cx=\"9\" cy=\"18\" r=\"1.4\" />\n <circle cx=\"15\" cy=\"18\" r=\"1.4\" />\n </Icon>\n )\n}\n\n/** ◁| — jump to the first note. */\nexport function FirstIcon() {\n return (\n <Icon size={18}>\n <polygon points=\"19 20 9 12 19 4\" fill=\"currentColor\" stroke=\"none\" />\n <line x1=\"5\" y1=\"19\" x2=\"5\" y2=\"5\" />\n </Icon>\n )\n}\n\nexport function PrevIcon() {\n return (\n <Icon size={18}>\n <polyline points=\"15 18 9 12 15 6\" />\n </Icon>\n )\n}\n\nexport function NextIcon() {\n return (\n <Icon size={18}>\n <polyline points=\"9 18 15 12 9 6\" />\n </Icon>\n )\n}\n\n/** |▷ — jump to the last note. */\nexport function LastIcon() {\n return (\n <Icon size={18}>\n <polygon points=\"5 4 15 12 5 20\" fill=\"currentColor\" stroke=\"none\" />\n <line x1=\"19\" y1=\"5\" x2=\"19\" y2=\"19\" />\n </Icon>\n )\n}\n\n/** Eye — \"include resolved notes while navigating\". */\nexport function EyeIcon() {\n return (\n <Icon size={18}>\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </Icon>\n )\n}\n","import { useRef } from 'react'\nimport { usePointerDrag } from '../../hooks/usePointerDrag'\nimport { useAutoGrow } from '../../hooks/useAutoGrow'\nimport { useElementHeight } from '../../hooks/useElementHeight'\nimport { useFeedback } from '../../core/context'\nimport { NOTE_WIDTH, NOTE_MIN_HEIGHT } from '../../core/geometry'\nimport { IconButton } from '../../design/IconButton'\nimport { GripIcon, CloseIcon, CheckIcon } from '../../design/icons'\nimport type { FeedbackNote } from '../../core/document'\n\ninterface StickyNoteProps {\n note: FeedbackNote\n /** The anchor line the note's x is measured from. */\n originX: number\n autoFocus: boolean\n /** Highlighted as the note under review right now. */\n current: boolean\n onMove: (x: number, y: number) => void\n onEdit: (text: string) => void\n onToggleResolved: () => void\n onRemove: () => void\n}\n\n/**\n * One sticky note: drag the grip bar to reposition, type in the body to\n * edit, check it off when resolved. Every gesture flows straight to the\n * parent, which persists it; the note reports its own live height so\n * edges can follow its border.\n */\nexport function StickyNote({ note, originX, autoFocus, current, onMove, onEdit, onToggleResolved, onRemove }: StickyNoteProps) {\n const { reportHeight, clearHeight } = useFeedback()\n const rootRef = useRef<HTMLDivElement>(null)\n const bodyRef = useAutoGrow(note.text)\n useElementHeight(rootRef, (h) => reportHeight(note.id, h), () => clearHeight(note.id))\n\n // Track the drag as a delta from where it began: a viewport delta\n // equals a stored delta, so the anchor offset never enters the math.\n const origin = useRef({ px: 0, py: 0, nx: 0, ny: 0 })\n const grip = usePointerDrag({\n onStart: (p) => (origin.current = { px: p.x, py: p.y, nx: note.x, ny: note.y }),\n onMove: (p) => {\n const o = origin.current\n onMove(o.nx + (p.x - o.px), Math.max(0, o.ny + (p.y - o.py)))\n },\n })\n\n const className = [\n 'fb-note',\n current ? 'fb-note--current' : '',\n note.resolved ? 'fb-note--resolved' : '',\n ]\n .filter(Boolean)\n .join(' ')\n\n return (\n <div ref={rootRef} data-note-id={note.id} className={className} style={{ left: originX + note.x, top: note.y, width: NOTE_WIDTH }}>\n <header {...grip} className=\"fb-note__header\">\n <GripIcon />\n <div className=\"fb-note__actions\">\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n tone=\"success\"\n active={note.resolved}\n onClick={onToggleResolved}\n onPointerDown={stop}\n title={note.resolved ? 'Resolved — click to reopen' : 'Mark resolved'}\n aria-label={note.resolved ? 'Reopen note' : 'Mark resolved'}\n >\n <CheckIcon />\n </IconButton>\n <IconButton\n variant=\"ghost\"\n size=\"sm\"\n tone=\"danger\"\n onClick={onRemove}\n onPointerDown={stop}\n title=\"Delete note\"\n aria-label=\"Delete note\"\n >\n <CloseIcon />\n </IconButton>\n </div>\n </header>\n <textarea\n ref={bodyRef}\n value={note.text}\n autoFocus={autoFocus}\n onChange={(e) => onEdit(e.target.value)}\n placeholder=\"Write feedback…\"\n className=\"fb-note__body\"\n style={{ minHeight: NOTE_MIN_HEIGHT - 28 }}\n />\n </div>\n )\n}\n\n/** Keep a header button's press from starting a note drag. */\nconst stop = (e: React.PointerEvent) => e.stopPropagation()\n","import { usePointerDrag } from '../../hooks/usePointerDrag'\nimport { knobPoint, PORTS, type Port } from '../../core/geometry'\nimport type { FeedbackNote } from '../../core/document'\n\ninterface NoteKnobsProps {\n note: FeedbackNote\n height: number\n originX: number\n onStart: (noteId: string, port: Port) => void\n onMove: (clientX: number, clientY: number) => void\n onEnd: (clientX: number, clientY: number) => void\n}\n\n/** The three border knobs an arrow can be drawn from. */\nexport function NoteKnobs({ note, height, originX, onStart, onMove, onEnd }: NoteKnobsProps) {\n return (\n <>\n {PORTS.map((port) => {\n const k = knobPoint(note, port, height)\n return (\n <Knob\n key={port}\n x={originX + k.x}\n y={k.y}\n onStart={() => onStart(note.id, port)}\n onMove={onMove}\n onEnd={onEnd}\n />\n )\n })}\n </>\n )\n}\n\ninterface KnobProps {\n x: number\n y: number\n onStart: () => void\n onMove: (clientX: number, clientY: number) => void\n onEnd: (clientX: number, clientY: number) => void\n}\n\nfunction Knob({ x, y, onStart, onMove, onEnd }: KnobProps) {\n const drag = usePointerDrag({\n onStart,\n onMove: (p) => onMove(p.x, p.y),\n onEnd: (p) => onEnd(p.x, p.y),\n })\n return (\n <span\n {...drag}\n title=\"Drag to draw an arrow\"\n aria-label=\"Draw an arrow\"\n className=\"fb-knob\"\n style={{ left: x, top: y }}\n />\n )\n}\n","import type { CSSProperties } from 'react'\nimport { arrowGeometry, type ArrowGeometry, type Point } from '../core/geometry'\n\n/** Lift a stored (origin-relative) point to absolute pixels for drawing. */\nexport function withOrigin(p: Point, originX: number): Point {\n return { x: originX + p.x, y: p.y }\n}\n\n/** The absolutely-positioned frame an arrow's svg occupies. */\nexport function svgFrame(geo: ArrowGeometry): CSSProperties {\n return { left: geo.origin.x, top: geo.origin.y, width: geo.width, height: geo.height }\n}\n\ninterface ArrowBodyProps {\n geo: ArrowGeometry\n color: string\n width: number\n}\n\n/** The shaft and arrowhead, in an svg's local coordinates. */\nexport function ArrowBody({ geo, color, width }: ArrowBodyProps) {\n return (\n <>\n <line\n x1={geo.start.x}\n y1={geo.start.y}\n x2={geo.base.x}\n y2={geo.base.y}\n stroke={color}\n strokeWidth={width}\n strokeLinecap=\"round\"\n />\n <polygon\n points={`${geo.head.x},${geo.head.y} ${geo.wings[0].x},${geo.wings[0].y} ${geo.wings[1].x},${geo.wings[1].y}`}\n fill={color}\n />\n </>\n )\n}\n\n/** A complete arrow drawn between two absolute points. */\nexport function Arrow({ start, head, color, width }: { start: Point; head: Point; color: string; width: number }) {\n const geo = arrowGeometry(start, head)\n return (\n <svg className=\"fb-arrow\" style={svgFrame(geo)}>\n <ArrowBody geo={geo} color={color} width={width} />\n </svg>\n )\n}\n","import { useRef } from 'react'\nimport { usePointerDrag } from '../../hooks/usePointerDrag'\nimport { arrowGeometry, type Point } from '../../core/geometry'\nimport { ArrowBody, svgFrame, withOrigin } from '../../design/Arrow'\n\nconst ACCENT = 'var(--fb-accent)'\nconst ACCENT_HOVER = 'var(--fb-accent-hover)'\n\ninterface EdgeProps {\n /** Tail and head in stored (origin-relative) coordinates. */\n start: Point\n head: Point\n originX: number\n selected: boolean\n onSelect: () => void\n onMoveHead: (x: number, y: number) => void\n /** Fired on release with the drop point, to re-address what it lands on. */\n onReaim: (clientX: number, clientY: number) => void\n}\n\n/**\n * One committed arrow: click the shaft or head to select it, drag the\n * head to re-aim it. The tail follows its note (the parent recomputes\n * `start`).\n */\nexport function Edge({ start, head, originX, selected, onSelect, onMoveHead, onReaim }: EdgeProps) {\n const geo = arrowGeometry(withOrigin(start, originX), withOrigin(head, originX))\n\n // Head drag is a delta from the grab point; a viewport delta equals a\n // stored delta, so the anchor offset never enters the math.\n const grab = useRef({ hx: 0, hy: 0, px: 0, py: 0 })\n const drag = usePointerDrag({\n onStart: (p) => (grab.current = { hx: head.x, hy: head.y, px: p.x, py: p.y }),\n onMove: (p) => onMoveHead(grab.current.hx + (p.x - grab.current.px), grab.current.hy + (p.y - grab.current.py)),\n onEnd: (p) => onReaim(p.x, p.y),\n })\n\n const color = selected ? ACCENT_HOVER : ACCENT\n const select = (e: React.PointerEvent) => {\n e.stopPropagation()\n // Leave any note being edited, so a following Delete removes the arrow.\n if (document.activeElement instanceof HTMLElement) document.activeElement.blur()\n onSelect()\n }\n\n return (\n <svg className=\"fb-arrow\" style={svgFrame(geo)}>\n {/* fat transparent hit target along the shaft */}\n <line\n x1={geo.start.x}\n y1={geo.start.y}\n x2={geo.head.x}\n y2={geo.head.y}\n stroke=\"transparent\"\n strokeWidth={14}\n strokeLinecap=\"round\"\n className=\"fb-edge__hit\"\n onPointerDown={select}\n />\n <ArrowBody geo={geo} color={color} width={selected ? 3 : 2} />\n <circle\n cx={geo.head.x}\n cy={geo.head.y}\n r={selected ? 7 : 5}\n fill={color}\n stroke=\"var(--fb-surface)\"\n strokeWidth={selected ? 2 : 0}\n className=\"fb-edge__head\"\n onPointerDown={(e) => {\n select(e)\n drag.onPointerDown(e)\n }}\n onPointerMove={drag.onPointerMove}\n onPointerUp={drag.onPointerUp}\n />\n </svg>\n )\n}\n","import { Arrow, withOrigin } from '../../design/Arrow'\nimport type { Point } from '../../core/geometry'\n\n/** The provisional arrow shown while dragging one out from a knob. */\nexport function DraftEdge({ start, head, originX }: { start: Point; head: Point; originX: number }) {\n return <Arrow start={withOrigin(start, originX)} head={withOrigin(head, originX)} color=\"var(--fb-accent)\" width={2} />\n}\n","import { createPortal } from 'react-dom'\nimport { useFeedback } from '../core/context'\nimport { knobPoint } from '../core/geometry'\nimport { describeTarget } from '../core/targetAddress'\nimport type { FeedbackNote } from '../core/document'\nimport type { EdgeDraftApi } from '../hooks/useEdgeDraft'\nimport { StickyNote } from './note/StickyNote'\nimport { NoteKnobs } from './note/NoteKnobs'\nimport { Edge } from './edge/Edge'\nimport { DraftEdge } from './edge/DraftEdge'\n\ninterface OverlayProps {\n originX: number\n /** A just-created note to focus for typing. */\n focusId: string | null\n /** The note under review, highlighted. */\n reviewCurrentId: string | null\n reviewing: boolean\n selectedEdge: string | null\n onSelectEdge: (id: string) => void\n /** The live drag-from-a-knob gesture. */\n draft: EdgeDraftApi\n}\n\n/**\n * The draw layer: every note, knob, and arrow for the active region,\n * portalled into that region so they scroll and clip with its content.\n * Positions come in origin-relative and are lifted by `originX` here — the\n * one place the anchor line meets the screen.\n */\nexport function Overlay({ originX, focusId, reviewCurrentId, reviewing, selectedEdge, onSelectEdge, draft }: OverlayProps) {\n const { doc, region, section, nav, heightOf, rootClassName, rootStyle } = useFeedback()\n\n const inScope = (o: { page: string; section: string | null }) =>\n o.page === nav.page && (o.section ?? null) === (section ?? null)\n const noteById = (id: string): FeedbackNote | undefined => doc.notes.find((n) => n.id === id)\n const pageNotes = doc.notes.filter(inScope)\n const pageEdges = doc.edges.filter(inScope)\n const draftNote = draft.draft ? noteById(draft.draft.noteId) : null\n\n return createPortal(\n <div data-feedback className={`${rootClassName} fb-overlay`} style={rootStyle}>\n {pageEdges.map((edge) => {\n const note = noteById(edge.noteId)\n if (!note) return null\n return (\n <Edge\n key={edge.id}\n start={knobPoint(note, edge.port, heightOf(note.id))}\n head={{ x: edge.x, y: edge.y }}\n originX={originX}\n selected={selectedEdge === edge.id}\n onSelect={() => onSelectEdge(edge.id)}\n onMoveHead={(x, y) => doc.updateEdge(edge.id, { x, y })}\n onReaim={(x, y) => doc.updateEdge(edge.id, { target: describeTarget(x, y) })}\n />\n )\n })}\n\n {draft.draft && draftNote && (\n <DraftEdge start={knobPoint(draftNote, draft.draft.port, heightOf(draftNote.id))} head={draft.draft.head} originX={originX} />\n )}\n\n {pageNotes.map((note) => (\n <StickyNote\n key={note.id}\n note={note}\n originX={originX}\n autoFocus={note.id === focusId}\n current={reviewing && note.id === reviewCurrentId}\n onMove={(x, y) => doc.updateNote(note.id, { x, y })}\n onEdit={(text) => doc.updateNote(note.id, { text })}\n onToggleResolved={() => doc.updateNote(note.id, { resolved: !note.resolved })}\n onRemove={() => doc.removeNote(note.id)}\n />\n ))}\n\n {pageNotes.map((note) => (\n <NoteKnobs\n key={`knobs-${note.id}`}\n note={note}\n height={heightOf(note.id)}\n originX={originX}\n onStart={draft.start}\n onMove={draft.move}\n onEnd={draft.end}\n />\n ))}\n </div>,\n region.element ?? document.body,\n )\n}\n","import { NOTE_WIDTH, NOTE_MIN_HEIGHT } from '../../core/geometry'\n\n/** The dashed outline that trails the pointer, showing where a note will land. */\nexport function GhostNote({ x, y }: { x: number; y: number }) {\n return <div aria-hidden className=\"fb-ghost\" style={{ left: x, top: y, width: NOTE_WIDTH, height: NOTE_MIN_HEIGHT }} />\n}\n","import type { Ref } from 'react'\nimport type { PointerDragHandlers } from '../../hooks/usePointerDrag'\nimport type { SubmissionStatus } from '../../hooks/useSubmission'\nimport { IconButton } from '../../design/IconButton'\nimport { NoteIcon, SaveIcon, LoadIcon, SendIcon, SentIcon, ReviewIcon, HelpIcon } from '../../design/icons'\n\ninterface FeedbackDockProps {\n /** Pointer handlers for the drag-to-create gesture. */\n launcher: PointerDragHandlers\n onSave: () => void\n onLoad: () => void\n /** Null when the provider has no `submit` target — the button stays hidden. */\n onSubmit: (() => void) | null\n submitStatus: SubmissionStatus\n onToggleReview: () => void\n reviewing: boolean\n onToggleHelp: () => void\n helpOpen: boolean\n helpRef: Ref<HTMLButtonElement>\n /** Total notes across all pages — badges the launcher, gates save/review. */\n count: number\n}\n\nconst SUBMIT_TITLES: Record<SubmissionStatus, string> = {\n idle: 'Send all feedback notes',\n sending: 'Sending feedback…',\n sent: 'Feedback sent',\n error: 'Sending failed — try again',\n}\n\n/** The persistent corner: help, create, send, save, load, and enter review. */\nexport function FeedbackDock({ launcher, onSave, onLoad, onSubmit, submitStatus, onToggleReview, reviewing, onToggleHelp, helpOpen, helpRef, count }: FeedbackDockProps) {\n return (\n <div className=\"fb-dock\">\n <IconButton\n ref={helpRef}\n variant=\"solid\"\n size=\"lg\"\n active={helpOpen}\n aria-pressed={helpOpen}\n onClick={onToggleHelp}\n title=\"How feedback works\"\n >\n <HelpIcon />\n </IconButton>\n\n <IconButton\n {...launcher}\n variant=\"solid\"\n size=\"lg\"\n badge={count || undefined}\n title=\"Drag onto the page to leave a feedback note\"\n className=\"fb-dock__launcher\"\n >\n <NoteIcon />\n </IconButton>\n\n {onSubmit && (\n <IconButton\n variant=\"solid\"\n size=\"lg\"\n tone={submitStatus === 'error' ? 'danger' : 'success'}\n active={submitStatus === 'sent' || submitStatus === 'error'}\n onClick={onSubmit}\n disabled={count === 0 || submitStatus === 'sending'}\n className={submitStatus === 'sending' ? 'fb-dock__send is-sending' : 'fb-dock__send'}\n title={SUBMIT_TITLES[submitStatus]}\n >\n {submitStatus === 'sent' ? <SentIcon /> : <SendIcon />}\n </IconButton>\n )}\n\n <IconButton variant=\"solid\" size=\"lg\" onClick={onSave} disabled={count === 0} title=\"Save all feedback notes to a file\">\n <SaveIcon />\n </IconButton>\n\n <IconButton variant=\"solid\" size=\"lg\" onClick={onLoad} title=\"Load feedback notes from a file\">\n <LoadIcon />\n </IconButton>\n\n <IconButton\n variant=\"solid\"\n size=\"lg\"\n active={reviewing}\n aria-pressed={reviewing}\n onClick={onToggleReview}\n disabled={count === 0}\n title={reviewing ? 'Exit review mode' : 'Review the loaded notes'}\n >\n <ReviewIcon />\n </IconButton>\n </div>\n )\n}\n","import type { HTMLAttributes, ReactNode } from 'react'\n\ninterface ToolbarProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode\n}\n\n/** A floating, blurred pill that groups a row of controls. */\nexport function Toolbar({ children, className, ...rest }: ToolbarProps) {\n return (\n <div className={['fb-toolbar', className].filter(Boolean).join(' ')} {...rest}>\n {children}\n </div>\n )\n}\n\n/** A hairline separator between groups of toolbar controls. */\nexport function ToolbarDivider() {\n return <span className=\"fb-toolbar__divider\" />\n}\n","import { Toolbar, ToolbarDivider } from '../../design/Toolbar'\nimport { IconButton } from '../../design/IconButton'\nimport { FirstIcon, PrevIcon, NextIcon, LastIcon, CheckIcon, TrashIcon, EyeIcon, CloseIcon } from '../../design/icons'\n\ninterface ReviewBarProps {\n /** 1-based position of the current note, or 0 when the set is empty. */\n position: number\n total: number\n /** Whether there is a current note, so resolve/delete can enable. */\n hasCurrent: boolean\n currentResolved: boolean\n includeResolved: boolean\n onFirst: () => void\n onPrev: () => void\n onNext: () => void\n onLast: () => void\n onResolveCurrent: () => void\n onDeleteCurrent: () => void\n onToggleIncludeResolved: () => void\n onExit: () => void\n}\n\n/** The review stepper, plus resolve/delete for the current note. */\nexport function ReviewBar({\n position,\n total,\n hasCurrent,\n currentResolved,\n includeResolved,\n onFirst,\n onPrev,\n onNext,\n onLast,\n onResolveCurrent,\n onDeleteCurrent,\n onToggleIncludeResolved,\n onExit,\n}: ReviewBarProps) {\n const atStart = position <= 1\n const atEnd = position >= total\n const empty = total === 0\n\n return (\n <Toolbar className=\"fb-reviewbar\" role=\"toolbar\" aria-label=\"Review notes\">\n <IconButton onClick={onFirst} disabled={atStart} title=\"First note\">\n <FirstIcon />\n </IconButton>\n <IconButton onClick={onPrev} disabled={atStart} title=\"Previous note\">\n <PrevIcon />\n </IconButton>\n\n <span className=\"fb-reviewbar__count\">{empty ? 'no notes' : `${position} / ${total}`}</span>\n\n <IconButton onClick={onNext} disabled={atEnd} title=\"Next note\">\n <NextIcon />\n </IconButton>\n <IconButton onClick={onLast} disabled={atEnd} title=\"Last note\">\n <LastIcon />\n </IconButton>\n\n <ToolbarDivider />\n\n <IconButton\n tone=\"success\"\n active={currentResolved}\n aria-pressed={currentResolved}\n onClick={onResolveCurrent}\n disabled={!hasCurrent}\n title={currentResolved ? 'Reopen this note' : 'Resolve this note'}\n >\n <CheckIcon />\n </IconButton>\n <IconButton tone=\"danger\" onClick={onDeleteCurrent} disabled={!hasCurrent} title=\"Delete this note\">\n <TrashIcon />\n </IconButton>\n\n <ToolbarDivider />\n\n <IconButton\n active={includeResolved}\n aria-pressed={includeResolved}\n onClick={onToggleIncludeResolved}\n title={includeResolved ? 'Including resolved notes' : 'Skipping resolved notes'}\n >\n <EyeIcon />\n </IconButton>\n <IconButton onClick={onExit} title=\"Exit review\">\n <CloseIcon />\n </IconButton>\n </Toolbar>\n )\n}\n","import { useLayoutEffect, useState, type RefObject } from 'react'\n\nconst GAP = 8\nconst MARGIN = 12\n\nexport interface AnchoredPosition {\n top: number\n left: number\n}\n\n/**\n * Place a floating panel against an anchor element, opening up and to the\n * left of it, and clamp the result inside the viewport so it never spills\n * off an edge. Recomputes on resize and scroll. Null until measured, so\n * the panel can render hidden on its first paint.\n */\nexport function useAnchoredPosition(\n anchor: HTMLElement | null,\n panelRef: RefObject<HTMLElement | null>,\n): AnchoredPosition | null {\n const [pos, setPos] = useState<AnchoredPosition | null>(null)\n\n useLayoutEffect(() => {\n const place = () => {\n const panel = panelRef.current\n if (!panel || !anchor) return\n const a = anchor.getBoundingClientRect()\n const p = panel.getBoundingClientRect()\n setPos({\n left: clamp(a.right - p.width, MARGIN, window.innerWidth - p.width - MARGIN),\n top: clamp(a.top - p.height - GAP, MARGIN, window.innerHeight - p.height - MARGIN),\n })\n }\n place()\n window.addEventListener('resize', place)\n window.addEventListener('scroll', place, true)\n return () => {\n window.removeEventListener('resize', place)\n window.removeEventListener('scroll', place, true)\n }\n }, [anchor, panelRef])\n\n return pos\n}\n\nfunction clamp(value: number, lo: number, hi: number): number {\n return Math.max(lo, Math.min(value, hi))\n}\n","import { useEffect, useRef, type CSSProperties, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useAnchoredPosition } from '../hooks/useAnchoredPosition'\n\ninterface PopoverProps {\n /** The element the popover springs from and clamps against. */\n anchor: HTMLElement | null\n onClose: () => void\n label?: string\n className?: string\n style?: CSSProperties\n children: ReactNode\n}\n\n/**\n * A floating panel anchored to a trigger. It positions and clamps itself\n * to the viewport, portals to the body so no parent can clip it, and\n * dismisses on an outside click or Escape. Contents are the caller's.\n */\nexport function Popover({ anchor, onClose, label, className, style, children }: PopoverProps) {\n const ref = useRef<HTMLDivElement>(null)\n const pos = useAnchoredPosition(anchor, ref)\n\n useEffect(() => {\n const onDown = (e: PointerEvent) => {\n const target = e.target as Node\n if (!ref.current?.contains(target) && !anchor?.contains(target)) onClose()\n }\n const onKey = (e: KeyboardEvent) => e.key === 'Escape' && onClose()\n document.addEventListener('pointerdown', onDown)\n document.addEventListener('keydown', onKey)\n return () => {\n document.removeEventListener('pointerdown', onDown)\n document.removeEventListener('keydown', onKey)\n }\n }, [anchor, onClose])\n\n return createPortal(\n <div\n ref={ref}\n data-feedback\n role=\"dialog\"\n aria-label={label}\n className={['fb-popover', className].filter(Boolean).join(' ')}\n style={{\n top: pos?.top ?? -9999,\n left: pos?.left ?? -9999,\n visibility: pos ? 'visible' : 'hidden',\n ...style,\n }}\n >\n {children}\n </div>,\n document.body,\n )\n}\n","import type { ReactNode } from 'react'\nimport { Popover } from '../../design/Popover'\nimport { useFeedback } from '../../core/context'\nimport { NoteIcon, SaveIcon, SendIcon, GripIcon, CloseIcon } from '../../design/icons'\n\ninterface HelpGuideProps {\n /** The button the guide springs from. */\n anchor: HTMLElement | null\n onClose: () => void\n}\n\n/**\n * A short guide for someone leaving feedback, sprung from the help\n * button. Pure content over the `Popover` primitive; the provider's theme\n * follows it onto the portal.\n */\nexport function HelpGuide({ anchor, onClose }: HelpGuideProps) {\n const { submit, rootClassName, rootStyle } = useFeedback()\n return (\n <Popover anchor={anchor} onClose={onClose} label=\"How feedback works\" className={rootClassName} style={rootStyle}>\n <header className=\"fb-guide__header\">\n <h2 className=\"fb-guide__title\">Leaving feedback</h2>\n <button onClick={onClose} aria-label=\"Close\" className=\"fb-guide__close\">\n <CloseIcon />\n </button>\n </header>\n\n <p className=\"fb-guide__lead\">See something worth flagging? Mark it up right here on the page.</p>\n\n <ul className=\"fb-guide__steps\">\n <Step icon={<NoteIcon />}>\n <b>Drop a note.</b> Drag the{' '}\n <InlineIcon>\n <NoteIcon />\n </InlineIcon>{' '}\n button onto the page and let go where you want to comment.\n </Step>\n <Step icon={<GripIcon />}>\n <b>Move and describe.</b> Drag the note's top bar to slide it anywhere, and click its text to write down\n what you're flagging.\n </Step>\n <Step icon={<Knob />}>\n <b>Point at it.</b> Drag from a knob on a note's edge to draw an arrow at exactly what you mean. Drag the\n arrowhead to fine-tune, or select it and press Delete.\n </Step>\n <Step icon={submit ? <SendIcon /> : <SaveIcon />}>\n <b>Send it in.</b> Notes save in your browser as you go. When you're done, hit{' '}\n {submit ? (\n <>\n <InlineIcon>\n <SendIcon />\n </InlineIcon>{' '}\n to submit them.\n </>\n ) : (\n <>\n <InlineIcon>\n <SaveIcon />\n </InlineIcon>{' '}\n to download them as a file and send it along.\n </>\n )}\n </Step>\n </ul>\n </Popover>\n )\n}\n\nfunction Step({ icon, children }: { icon: ReactNode; children: ReactNode }) {\n return (\n <li className=\"fb-guide__step\">\n <span className=\"fb-guide__step-icon\">{icon}</span>\n <span className=\"fb-guide__step-text\">{children}</span>\n </li>\n )\n}\n\n/** A dock button shown inline in the text, so its icon is recognisable on the page. */\nfunction InlineIcon({ children }: { children: ReactNode }) {\n return <span className=\"fb-guide__inline-icon\">{children}</span>\n}\n\n/** A miniature of a note's border knob, so the guide matches the page. */\nfunction Knob() {\n return <span className=\"fb-guide__knob\" />\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useFeedback } from '../core/context'\nimport { toContent, useOriginX } from '../core/coordinates'\nimport { importDoc, exportDoc } from '../core/persistence'\nimport { useReview } from '../hooks/useReview'\nimport { useSubmission } from '../hooks/useSubmission'\nimport { useEdgeDraft } from '../hooks/useEdgeDraft'\nimport { useSpawnGesture } from '../hooks/useSpawnGesture'\nimport { Overlay } from './Overlay'\nimport { GhostNote } from './note/GhostNote'\nimport { FeedbackDock } from './dock/FeedbackDock'\nimport { ReviewBar } from './review/ReviewBar'\nimport { HelpGuide } from './help/HelpGuide'\n\n/**\n * The always-on feedback layer. Mount it once inside a\n * `<FeedbackProvider>` and it draws itself: the overlay of notes and\n * arrows portals into the active region; the dock, review bar, and help\n * pin to the viewport. Wiring only — every behaviour lives in its own\n * delegate.\n */\nexport function FeedbackLayer() {\n const { doc, nav, region, section, heightOf, fileName, submit, rootClassName, rootStyle } = useFeedback()\n const originX = useOriginX(region)\n const review = useReview(doc.notes)\n const [focusId, setFocusId] = useState<string | null>(null)\n const [selectedEdge, setSelectedEdge] = useState<string | null>(null)\n const [helpOpen, setHelpOpen] = useState(false)\n const helpRef = useRef<HTMLButtonElement>(null)\n\n const noteById = useCallback((id: string) => doc.notes.find((n) => n.id === id), [doc.notes])\n\n const draft = useEdgeDraft({\n region,\n noteById,\n heightOf,\n onCommit: (noteId, port, head, target) =>\n doc.addEdge({ page: nav.page, section, noteId, port, x: head.x, y: head.y, target }),\n })\n\n const spawn = useCallback(\n (clientX: number, clientY: number) => {\n const { x, y } = toContent(clientX, clientY, region)\n setFocusId(doc.addNote(nav.page, section, x, Math.max(0, y)))\n },\n [doc, nav.page, section, region],\n )\n const { ghost, handlers } = useSpawnGesture(spawn)\n\n const load = useCallback(async () => {\n const loaded = await importDoc()\n if (loaded) doc.replace(loaded)\n }, [doc])\n\n const save = useCallback(() => void exportDoc({ notes: doc.notes, edges: doc.edges }, fileName), [doc, fileName])\n\n const submission = useSubmission(submit)\n const send = useCallback(\n () => void submission.send({ notes: doc.notes, edges: doc.edges }),\n [submission.send, doc.notes, doc.edges],\n )\n\n // Clicking anywhere but an arrow (arrows stop propagation) deselects it.\n useEffect(() => {\n const clear = () => setSelectedEdge(null)\n document.addEventListener('pointerdown', clear)\n return () => document.removeEventListener('pointerdown', clear)\n }, [])\n\n // Delete removes the selected arrow, but never while editing note text.\n useEffect(() => {\n if (!selectedEdge) return\n const onKey = (e: KeyboardEvent) => {\n if ((e.key === 'Delete' || e.key === 'Backspace') && !isEditable(document.activeElement)) {\n e.preventDefault()\n doc.removeEdge(selectedEdge)\n setSelectedEdge(null)\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [selectedEdge, doc])\n\n const current = doc.notes.find((n) => n.id === review.currentId) ?? null\n\n return (\n <>\n <Overlay\n originX={originX}\n focusId={focusId}\n reviewCurrentId={review.currentId}\n reviewing={review.on}\n selectedEdge={selectedEdge}\n onSelectEdge={setSelectedEdge}\n draft={draft}\n />\n\n {createPortal(\n <div data-feedback className={rootClassName} style={rootStyle}>\n {ghost && <GhostNote x={ghost.x} y={ghost.y} />}\n\n {review.on && (\n <ReviewBar\n position={review.position}\n total={review.total}\n hasCurrent={current !== null}\n currentResolved={current?.resolved ?? false}\n includeResolved={review.includeResolved}\n onFirst={review.first}\n onPrev={review.prev}\n onNext={review.next}\n onLast={review.last}\n onResolveCurrent={() => current && doc.updateNote(current.id, { resolved: !current.resolved })}\n onDeleteCurrent={() => current && doc.removeNote(current.id)}\n onToggleIncludeResolved={review.toggleIncludeResolved}\n onExit={review.toggle}\n />\n )}\n\n <FeedbackDock\n launcher={handlers}\n onSave={save}\n onLoad={() => void load()}\n onSubmit={submit ? send : null}\n submitStatus={submission.status}\n onToggleReview={review.toggle}\n reviewing={review.on}\n onToggleHelp={() => setHelpOpen((open) => !open)}\n helpOpen={helpOpen}\n helpRef={helpRef}\n count={doc.notes.length}\n />\n\n {helpOpen && <HelpGuide anchor={helpRef.current} onClose={() => setHelpOpen(false)} />}\n </div>,\n document.body,\n )}\n </>\n )\n}\n\nfunction isEditable(el: Element | null): boolean {\n if (!el) return false\n return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || (el as HTMLElement).isContentEditable\n}\n","import { useEffect, useRef, type CSSProperties, type ReactNode } from 'react'\nimport type { AnchorX } from './coordinates'\nimport { useFeedback } from './context'\n\nexport interface FeedbackRegionProps {\n children: ReactNode\n /** How x is anchored within this region. Overrides the provider default. */\n anchorX?: AnchorX\n /** A sub-scope so notes on one view don't leak onto its siblings. */\n section?: string | null\n /** How review asks this page to reveal a section before scrolling to a note. */\n onReveal?: (section: string) => void\n /** Extra class on the wrapper element. */\n className?: string\n /** Extra styles on the wrapper element (`position` is reserved). */\n style?: CSSProperties\n}\n\n/**\n * The element notes live in. Wrap your page's content — inside whatever\n * scroll container you already have — and notes drop into it, ride along\n * with its scroll, and measure their coordinates against it. Pages that\n * scroll the window and have no sub-scopes don't need this at all — the\n * layer works out of the box. Reach for it to keep notes inside a\n * scrollable pane, change how x is anchored, or split a page into\n * review-navigable sections.\n */\nexport function FeedbackRegion({ children, anchorX, section = null, onReveal, className, style }: FeedbackRegionProps) {\n const ref = useRef<HTMLDivElement>(null)\n const { bindRegion } = useFeedback()\n const revealRef = useRef(onReveal)\n revealRef.current = onReveal\n const hasReveal = !!onReveal\n\n useEffect(() => {\n bindRegion({\n element: ref.current,\n anchorX,\n section,\n reveal: hasReveal ? (s) => revealRef.current?.(s) : undefined,\n })\n return () => bindRegion(null)\n }, [anchorX, section, hasReveal, bindRegion])\n\n // The wrapper is the containing block notes are absolutely positioned\n // in — the whole coordinate model hangs on this `position`, so it wins\n // over anything passed in `style`.\n return (\n <div ref={ref} className={className} style={{ ...style, position: 'relative' }}>\n {children}\n </div>\n )\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@ldlework/feedback",
3
+ "version": "0.1.0",
4
+ "description": "Drop-in, drag-and-drop feedback overlay for React — sticky notes and arrows pinned to your live page, saved to a file.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Dustin Lacewell",
8
+ "homepage": "https://feedback.ldlework.com",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/dustinlacewell/feedback.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/dustinlacewell/feedback/issues"
15
+ },
16
+ "keywords": [
17
+ "react",
18
+ "feedback",
19
+ "annotation",
20
+ "sticky-notes",
21
+ "review",
22
+ "markup",
23
+ "overlay",
24
+ "comments"
25
+ ],
26
+ "sideEffects": [
27
+ "*.css"
28
+ ],
29
+ "files": [
30
+ "dist",
31
+ "styles.css",
32
+ "README.md",
33
+ "LICENSE"
34
+ ],
35
+ "exports": {
36
+ ".": {
37
+ "types": "./dist/index.d.ts",
38
+ "import": "./dist/index.js"
39
+ },
40
+ "./styles.css": "./styles.css"
41
+ },
42
+ "main": "./dist/index.js",
43
+ "module": "./dist/index.js",
44
+ "types": "./dist/index.d.ts",
45
+ "peerDependencies": {
46
+ "react": ">=18",
47
+ "react-dom": ">=18"
48
+ },
49
+ "devDependencies": {
50
+ "@ldlework/workmark": "^1.5.0",
51
+ "@types/react": "^19",
52
+ "@types/react-dom": "^19",
53
+ "react": "^19",
54
+ "react-dom": "^19",
55
+ "tsup": "^8",
56
+ "typescript": "^5"
57
+ },
58
+ "scripts": {
59
+ "build": "tsup",
60
+ "dev": "tsup --watch",
61
+ "typecheck": "tsc --noEmit"
62
+ }
63
+ }