@lastbrain/ai-ui-react 1.0.10 → 1.0.12

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.
Files changed (61) hide show
  1. package/dist/components/AiImageButton.d.ts.map +1 -1
  2. package/dist/components/AiImageButton.js +5 -2
  3. package/dist/components/AiInput.d.ts.map +1 -1
  4. package/dist/components/AiInput.js +20 -7
  5. package/dist/components/AiPromptPanel.d.ts +14 -1
  6. package/dist/components/AiPromptPanel.d.ts.map +1 -1
  7. package/dist/components/AiPromptPanel.js +516 -64
  8. package/dist/components/AiSelect.d.ts.map +1 -1
  9. package/dist/components/AiSelect.js +4 -1
  10. package/dist/components/AiSettingsButton.d.ts.map +1 -1
  11. package/dist/components/AiSettingsButton.js +1 -1
  12. package/dist/components/AiStatusButton.d.ts.map +1 -1
  13. package/dist/components/AiStatusButton.js +225 -38
  14. package/dist/components/AiTextarea.d.ts.map +1 -1
  15. package/dist/components/AiTextarea.js +35 -8
  16. package/dist/components/UsageToast.d.ts +14 -0
  17. package/dist/components/UsageToast.d.ts.map +1 -0
  18. package/dist/components/UsageToast.js +144 -0
  19. package/dist/examples/AiImageGenerator.d.ts +34 -0
  20. package/dist/examples/AiImageGenerator.d.ts.map +1 -0
  21. package/dist/examples/AiImageGenerator.js +85 -0
  22. package/dist/examples/AiPromptPanelAdvanced.d.ts +20 -0
  23. package/dist/examples/AiPromptPanelAdvanced.d.ts.map +1 -0
  24. package/dist/examples/AiPromptPanelAdvanced.js +222 -0
  25. package/dist/examples/ExternalIntegration.d.ts +2 -0
  26. package/dist/examples/ExternalIntegration.d.ts.map +1 -0
  27. package/dist/examples/ExternalIntegration.js +2 -0
  28. package/dist/hooks/useAiStatus.d.ts.map +1 -1
  29. package/dist/hooks/useAiStatus.js +3 -0
  30. package/dist/hooks/useModelManagement.d.ts +32 -0
  31. package/dist/hooks/useModelManagement.d.ts.map +1 -0
  32. package/dist/hooks/useModelManagement.js +135 -0
  33. package/dist/hooks/usePrompts.d.ts +1 -0
  34. package/dist/hooks/usePrompts.d.ts.map +1 -1
  35. package/dist/hooks/usePrompts.js +0 -1
  36. package/dist/index.d.ts +4 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +6 -0
  39. package/dist/styles/inline.d.ts.map +1 -1
  40. package/dist/styles/inline.js +129 -63
  41. package/dist/utils/modelManagement.d.ts +29 -0
  42. package/dist/utils/modelManagement.d.ts.map +1 -0
  43. package/dist/utils/modelManagement.js +80 -0
  44. package/package.json +3 -2
  45. package/src/components/AiImageButton.tsx +13 -2
  46. package/src/components/AiInput.tsx +35 -27
  47. package/src/components/AiPromptPanel.tsx +1000 -143
  48. package/src/components/AiSelect.tsx +11 -0
  49. package/src/components/AiSettingsButton.tsx +4 -2
  50. package/src/components/AiStatusButton.tsx +424 -163
  51. package/src/components/AiTextarea.tsx +55 -28
  52. package/src/components/UsageToast.tsx +182 -0
  53. package/src/examples/AiImageGenerator.tsx +214 -0
  54. package/src/examples/AiPromptPanelAdvanced.tsx +381 -0
  55. package/src/examples/ExternalIntegration.ts +55 -0
  56. package/src/hooks/useAiStatus.ts +4 -0
  57. package/src/hooks/useModelManagement.ts +210 -0
  58. package/src/hooks/usePrompts.ts +1 -1
  59. package/src/index.ts +8 -0
  60. package/src/styles/inline.ts +139 -64
  61. package/src/utils/modelManagement.ts +130 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AiImageButton.d.ts","sourceRoot":"","sources":["../../src/components/AiImageButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C,MAAM,WAAW,kBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,oBAAoB,CAAC,iBAAiB,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,GAAG,WAAW,EACf,EAAE,kBAAkB,2CAyDpB"}
1
+ {"version":3,"file":"AiImageButton.d.ts","sourceRoot":"","sources":["../../src/components/AiImageButton.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAY,KAAK,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C,MAAM,WAAW,kBACf,SACE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,MAAM,CAAC,EACrC,oBAAoB,CAAC,iBAAiB,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,GAAG,WAAW,EACf,EAAE,kBAAkB,2CAmEpB"}
@@ -1,11 +1,13 @@
1
1
  "use client";
2
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState } from "react";
4
4
  import { useAiCallImage } from "../hooks/useAiCallImage";
5
5
  import { useAiModels } from "../hooks/useAiModels";
6
6
  import { AiPromptPanel } from "./AiPromptPanel";
7
+ import { UsageToast, useUsageToast } from "./UsageToast";
7
8
  export function AiImageButton({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, onImage, onToast, disabled, className, children, ...buttonProps }) {
8
9
  const [isOpen, setIsOpen] = useState(false);
10
+ const { showUsageToast, toastData, toastKey, clearToast } = useUsageToast();
9
11
  const { models } = useAiModels({ baseUrl, apiKeyId });
10
12
  const { generateImage, loading } = useAiCallImage({ baseUrl, apiKeyId });
11
13
  const handleOpenPanel = () => {
@@ -23,6 +25,7 @@ export function AiImageButton({ baseUrl, apiKeyId, uiMode = "modal", context, mo
23
25
  if (result.url) {
24
26
  onImage?.(result.url);
25
27
  onToast?.({ type: "success", message: "Image generated successfully" });
28
+ showUsageToast(result);
26
29
  }
27
30
  }
28
31
  catch (error) {
@@ -32,5 +35,5 @@ export function AiImageButton({ baseUrl, apiKeyId, uiMode = "modal", context, mo
32
35
  setIsOpen(false);
33
36
  }
34
37
  };
35
- return (_jsxs(_Fragment, { children: [_jsx("button", { ...buttonProps, onClick: handleOpenPanel, disabled: disabled || loading, className: className, "data-ai-image-button": true, children: loading ? "Generating..." : children || "Generate Image" }), isOpen && (_jsx(AiPromptPanel, { isOpen: isOpen, onClose: handleClosePanel, onSubmit: handleSubmit, uiMode: uiMode, models: models?.filter((m) => m.type === "image") || [] }))] }));
38
+ return (_jsxs("div", { style: { position: "relative", display: "inline-block" }, children: [_jsx("button", { ...buttonProps, onClick: handleOpenPanel, disabled: disabled || loading, className: className, "data-ai-image-button": true, children: loading ? "Generating..." : children || "Generate Image" }), isOpen && (_jsx(AiPromptPanel, { isOpen: isOpen, onClose: handleClosePanel, onSubmit: handleSubmit, uiMode: uiMode, models: models?.filter((m) => m.type === "image") || [] })), Boolean(toastData) && (_jsx(UsageToast, { result: toastData, position: "bottom-right", onComplete: clearToast }, toastKey))] }));
36
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AiInput.d.ts","sourceRoot":"","sources":["../../src/components/AiInput.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAoB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM5C,MAAM,WAAW,YACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IACxD,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,UAAU,EACd,EAAE,YAAY,2CAmKd"}
1
+ {"version":3,"file":"AiInput.d.ts","sourceRoot":"","sources":["../../src/components/AiInput.tsx"],"names":[],"mappings":"AAEA,OAAc,EAAoB,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAE1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAO5C,MAAM,WAAW,YACf,SACE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EACzB,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IACxD,MAAM,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC7B;AAED,wBAAgB,OAAO,CAAC,EACtB,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,OAAO,EACP,KAAK,EACL,MAAM,EACN,QAAgB,EAChB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,SAAS,EACT,GAAG,UAAU,EACd,EAAE,YAAY,2CAyKd"}
@@ -1,9 +1,11 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useRef } from "react";
4
+ import { Sparkles } from "lucide-react";
4
5
  import { useAiCallText } from "../hooks/useAiCallText";
5
6
  import { useAiModels } from "../hooks/useAiModels";
6
7
  import { AiPromptPanel } from "./AiPromptPanel";
8
+ import { UsageToast, useUsageToast } from "./UsageToast";
7
9
  import { aiStyles } from "../styles/inline";
8
10
  export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, prompt, editMode = false, onValue, onToast, disabled, className, ...inputProps }) {
9
11
  const [isOpen, setIsOpen] = useState(false);
@@ -11,6 +13,7 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
11
13
  const [isFocused, setIsFocused] = useState(false);
12
14
  const [isButtonHovered, setIsButtonHovered] = useState(false);
13
15
  const inputRef = useRef(null);
16
+ const { showUsageToast, toastData, toastKey, clearToast } = useUsageToast();
14
17
  const { models } = useAiModels({ baseUrl, apiKeyId });
15
18
  const { generateText, loading } = useAiCallText({ baseUrl, apiKeyId });
16
19
  const hasConfiguration = Boolean(model && prompt);
@@ -22,11 +25,16 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
22
25
  };
23
26
  const handleSubmit = async (selectedModel, selectedPrompt, promptId) => {
24
27
  try {
28
+ const resolvedContext = inputValue || context || undefined;
29
+ const hasContext = Boolean(resolvedContext && String(resolvedContext).trim());
30
+ const promptWithContext = hasContext
31
+ ? `${selectedPrompt}\n\nTexte:\n${String(resolvedContext)}`
32
+ : selectedPrompt;
25
33
  const result = await generateText({
26
34
  model: selectedModel,
27
- prompt: selectedPrompt,
28
- context: inputValue || context || undefined,
29
- actionType: "autocomplete",
35
+ prompt: promptWithContext,
36
+ context: resolvedContext,
37
+ actionType: hasContext ? "generate-text" : "autocomplete",
30
38
  });
31
39
  if (result.text) {
32
40
  setInputValue(result.text);
@@ -48,11 +56,16 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
48
56
  if (!model || !prompt)
49
57
  return;
50
58
  try {
59
+ const resolvedContext = inputValue || context || undefined;
60
+ const hasContext = Boolean(resolvedContext && String(resolvedContext).trim());
61
+ const promptWithContext = hasContext
62
+ ? `${prompt}\n\nTexte:\n${String(resolvedContext)}`
63
+ : prompt;
51
64
  const result = await generateText({
52
65
  model,
53
- prompt,
54
- context: inputValue || context || undefined,
55
- actionType: "autocomplete",
66
+ prompt: promptWithContext,
67
+ context: resolvedContext,
68
+ actionType: hasContext ? "generate-text" : "autocomplete",
56
69
  });
57
70
  if (result.text) {
58
71
  setInputValue(result.text);
@@ -87,5 +100,5 @@ export function AiInput({ baseUrl, apiKeyId, uiMode = "modal", context, model, p
87
100
  ...(disabled || loading
88
101
  ? { opacity: 0.5, cursor: "not-allowed" }
89
102
  : {}),
90
- }, onClick: hasConfiguration ? handleQuickGenerate : handleOpenPanel, onMouseEnter: () => setIsButtonHovered(true), onMouseLeave: () => setIsButtonHovered(false), disabled: disabled || loading, type: "button", title: hasConfiguration ? "Generate with AI" : "Setup AI", children: loading ? (_jsx("svg", { style: aiStyles.spinner, width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83" }) })) : hasConfiguration ? (_jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M12 5v14M5 12h14" }) })) : (_jsx("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: _jsx("path", { d: "M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4" }) })) }), isOpen && (_jsx(AiPromptPanel, { isOpen: isOpen, onClose: handleClosePanel, onSubmit: handleSubmit, uiMode: uiMode, models: models || [], sourceText: inputValue || undefined }))] }));
103
+ }, onClick: hasConfiguration ? handleQuickGenerate : handleOpenPanel, onMouseEnter: () => setIsButtonHovered(true), onMouseLeave: () => setIsButtonHovered(false), disabled: disabled || loading, type: "button", title: hasConfiguration ? "Generate with AI" : "Setup AI", children: loading ? (_jsx("svg", { style: aiStyles.spinner, width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", children: _jsx("path", { d: "M12 2v4m0 12v4M4.93 4.93l2.83 2.83m8.48 8.48l2.83 2.83M2 12h4m12 0h4M4.93 19.07l2.83-2.83m8.48-8.48l2.83-2.83" }) })) : (_jsx(Sparkles, { size: 16 })) }), isOpen && (_jsx(AiPromptPanel, { isOpen: isOpen, onClose: handleClosePanel, onSubmit: handleSubmit, uiMode: uiMode, models: models || [], sourceText: inputValue || undefined, apiKey: apiKeyId, baseUrl: baseUrl, enableModelManagement: true })), Boolean(toastData) && (_jsx(UsageToast, { result: toastData, position: "bottom-right", onComplete: clearToast }, toastKey))] }));
91
104
  }
@@ -1,6 +1,7 @@
1
1
  import { type ReactNode } from "react";
2
2
  import type { ModelRef } from "@lastbrain/ai-ui-core";
3
3
  import type { UiMode } from "../types";
4
+ import { type AIModel } from "../hooks/useModelManagement";
4
5
  export interface AiPromptPanelProps {
5
6
  isOpen: boolean;
6
7
  onClose: () => void;
@@ -9,6 +10,12 @@ export interface AiPromptPanelProps {
9
10
  models?: ModelRef[];
10
11
  sourceText?: string;
11
12
  children?: (props: AiPromptPanelRenderProps) => ReactNode;
13
+ enableModelManagement?: boolean;
14
+ availableModels?: AIModel[];
15
+ userModels?: string[];
16
+ onModelToggle?: (modelId: string, isActive: boolean) => Promise<void>;
17
+ apiKey?: string;
18
+ baseUrl?: string;
12
19
  }
13
20
  export interface AiPromptPanelRenderProps {
14
21
  models?: ModelRef[];
@@ -19,6 +26,12 @@ export interface AiPromptPanelRenderProps {
19
26
  sourceText?: string;
20
27
  handleSubmit: () => void;
21
28
  handleClose: () => void;
29
+ enableModelManagement?: boolean;
30
+ availableModels?: AIModel[];
31
+ userModels?: string[];
32
+ showAllModels?: boolean;
33
+ setShowAllModels?: (show: boolean) => void;
34
+ onModelToggle?: (modelId: string, isActive: boolean) => Promise<void>;
22
35
  }
23
- export declare function AiPromptPanel({ isOpen, onClose, onSubmit, uiMode, models, sourceText, children, }: AiPromptPanelProps): import("react/jsx-runtime").JSX.Element | null;
36
+ export declare function AiPromptPanel({ isOpen, onClose, onSubmit, uiMode: _uiMode, models, sourceText, children, enableModelManagement, availableModels, userModels, onModelToggle, apiKey, baseUrl, }: AiPromptPanelProps): import("react/jsx-runtime").JSX.Element | null;
24
37
  //# sourceMappingURL=AiPromptPanel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"AiPromptPanel.d.ts","sourceRoot":"","sources":["../../src/components/AiPromptPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAuB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIvC,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;CAC3D;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,MAAgB,EAChB,MAAW,EACX,UAAU,EACV,QAAQ,GACT,EAAE,kBAAkB,kDA0VpB"}
1
+ {"version":3,"file":"AiPromptPanel.d.ts","sourceRoot":"","sources":["../../src/components/AiPromptPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAOvC,OAAO,EAAsB,KAAK,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAE/E,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAE1D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,IAAI,CAAC;IAExB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE;AAED,wBAAgB,aAAa,CAAC,EAC5B,MAAM,EACN,OAAO,EACP,QAAQ,EACR,MAAM,EAAE,OAAiB,EACzB,MAAW,EACX,UAAU,EACV,QAAQ,EACR,qBAA6B,EAC7B,eAAoB,EACpB,UAAe,EACf,aAAa,EACb,MAAM,EACN,OAAO,GACR,EAAE,kBAAkB,kDAmpCpB"}