@lapp-studio/react-toast-engine 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -37
- package/dist/core.d.cts +3 -3
- package/dist/core.d.ts +2 -2
- package/dist/native.d.cts +1 -1
- package/dist/native.d.ts +1 -1
- package/dist/{toasts-renderer-DsSfXdUq.d.cts → toasts-renderer-Ad20ipzA.d.ts} +8 -2
- package/dist/{toasts-renderer-DsSfXdUq.d.cts.map → toasts-renderer-Ad20ipzA.d.ts.map} +1 -1
- package/dist/{toasts-renderer-vMIJr1FV.d.ts → toasts-renderer-CoN_jkgy.d.cts} +9 -2
- package/dist/toasts-renderer-CoN_jkgy.d.cts.map +1 -0
- package/package.json +15 -1
- package/dist/toasts-renderer-vMIJr1FV.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,33 +1,40 @@
|
|
|
1
1
|
# React Toast Engine 🍞
|
|
2
2
|
|
|
3
|
+
[](https://www.npmjs.com/package/@lapp-studio/react-toast-engine)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
|
|
3
6
|
**React Toast Engine** is a high-performance, headless toast management library for **React** and **React Native**.
|
|
4
7
|
|
|
5
|
-
It separates state logic (powered by Zustand) from the UI layer, allowing you to share the same notification logic across Web and Mobile
|
|
8
|
+
It separates state logic (powered by [Zustand](https://github.com/pmndrs/zustand)) from the UI layer, allowing you to share the exact same notification logic across Web and Mobile. For React Native, it maintains flawless 60FPS animations natively using **Reanimated** and **Gesture Handler**, without locking the JS thread.
|
|
6
9
|
|
|
7
10
|
## ✨ Key Features
|
|
8
11
|
|
|
9
|
-
- 🚀 **Zero-Lag State:** Atomic updates via Zustand to prevent unnecessary re-renders.
|
|
10
|
-
- 📱 **Native First:** Deep integration with `react-native-reanimated` and `
|
|
11
|
-
- 🌐 **Truly Hybrid:**
|
|
12
|
-
- 🏗️ **Headless & Flexible:** You
|
|
12
|
+
- 🚀 **Zero-Lag State:** Atomic updates via Zustand to prevent unnecessary re-renders across your app.
|
|
13
|
+
- 📱 **Native First:** Deep, out-of-the-box integration with `react-native-reanimated`, `react-native-gesture-handler`, and `react-native-worklets`.
|
|
14
|
+
- 🌐 **Truly Hybrid (Tree-Shakeable):** Separate entry points for Core (`/`) and Native (`/native`) ensure your Web builds never bundle heavy React Native libraries.
|
|
15
|
+
- 🏗️ **100% Headless & Flexible:** You build the UI components; the engine handles the stacking, queuing, lifecycle, and gesture logic.
|
|
16
|
+
- 🛡️ **Smart Provider Stacking:** If multiple providers exist in the DOM/Tree, the engine intelligently routes toasts only to the topmost (active) provider to prevent duplicates.
|
|
13
17
|
|
|
14
18
|
---
|
|
15
19
|
|
|
16
20
|
## 📦 Installation
|
|
17
21
|
|
|
22
|
+
Install the core library:
|
|
23
|
+
|
|
18
24
|
```bash
|
|
19
25
|
# npm
|
|
20
26
|
npm i @lapp-studio/react-toast-engine
|
|
27
|
+
|
|
21
28
|
# yarn
|
|
22
29
|
yarn add @lapp-studio/react-toast-engine
|
|
23
30
|
```
|
|
24
31
|
|
|
25
|
-
### Peer Dependencies
|
|
32
|
+
### React Native Peer Dependencies
|
|
26
33
|
|
|
27
|
-
|
|
34
|
+
If you are using React Native, ensure you have the required animation and gesture libraries installed in your project:
|
|
28
35
|
|
|
29
36
|
```bash
|
|
30
|
-
yarn add react-native-reanimated react-native-gesture-handler react-native-safe-area-context
|
|
37
|
+
yarn add react-native-reanimated react-native-gesture-handler react-native-safe-area-context react-native-worklets
|
|
31
38
|
```
|
|
32
39
|
|
|
33
40
|
---
|
|
@@ -36,29 +43,39 @@ yarn add react-native-reanimated react-native-gesture-handler react-native-safe-
|
|
|
36
43
|
|
|
37
44
|
### 1. Initialize the Client
|
|
38
45
|
|
|
39
|
-
|
|
46
|
+
Create a shared file (e.g., `src/lib/toasts.ts`) to configure your UI components and initialize the engine.
|
|
40
47
|
|
|
41
48
|
```typescript
|
|
42
49
|
// src/lib/toasts.ts
|
|
43
|
-
import { createToastsClient } from "@lapp-studio/react-toast-engine";
|
|
44
|
-
|
|
50
|
+
import { createToastsClient } from "@lapp-studio/react-toast-engine/core";
|
|
51
|
+
|
|
52
|
+
// Import the native renderer only in your React Native app
|
|
53
|
+
import { PoolRenderer } from "@lapp-studio/react-toast-engine/native";
|
|
45
54
|
|
|
55
|
+
import {
|
|
56
|
+
MySuccessComponent,
|
|
57
|
+
MyErrorComponent,
|
|
58
|
+
MyInfoComponent,
|
|
59
|
+
} from "./components";
|
|
60
|
+
|
|
61
|
+
// Map your custom components to the engine's InfoTypes
|
|
46
62
|
const components = {
|
|
47
63
|
success: MySuccessComponent,
|
|
48
64
|
error: MyErrorComponent,
|
|
49
65
|
info: MyInfoComponent,
|
|
50
66
|
};
|
|
51
67
|
|
|
68
|
+
// Create and export the client tools
|
|
52
69
|
export const { store, utilities, renderer } = createToastsClient({
|
|
53
70
|
components,
|
|
54
71
|
PoolRenderer,
|
|
55
|
-
storeSettings: { poolLimit: 5 },
|
|
72
|
+
storeSettings: { poolLimit: 5 }, // Keep a maximum of 5 toasts in the DOM at once
|
|
56
73
|
});
|
|
57
74
|
```
|
|
58
75
|
|
|
59
76
|
### 2. Setup the Provider
|
|
60
77
|
|
|
61
|
-
Wrap your application root with the generated `Provider`.
|
|
78
|
+
Wrap your application's root component with the generated `Provider`.
|
|
62
79
|
|
|
63
80
|
```tsx
|
|
64
81
|
import { renderer } from "./lib/toasts";
|
|
@@ -74,45 +91,63 @@ export function App() {
|
|
|
74
91
|
|
|
75
92
|
### 3. Trigger Toasts
|
|
76
93
|
|
|
77
|
-
|
|
94
|
+
You can stack toasts from anywhere in your app—either via React hooks inside your components or via helper functions in standard TypeScript files.
|
|
95
|
+
|
|
96
|
+
**Inside a React Component (Using Hooks):**
|
|
78
97
|
|
|
79
98
|
```tsx
|
|
99
|
+
import { Button } from "react-native";
|
|
80
100
|
import { utilities } from "./lib/toasts";
|
|
81
101
|
|
|
82
|
-
|
|
83
|
-
const stack = utilities.hooks.useStackToast();
|
|
102
|
+
export const SaveButton = () => {
|
|
103
|
+
const stack = utilities.hooks.useStackToast();
|
|
84
104
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
});
|
|
92
|
-
|
|
105
|
+
const handlePress = () => {
|
|
106
|
+
stack({
|
|
107
|
+
title: "Success!",
|
|
108
|
+
description: "Profile updated.",
|
|
109
|
+
infoType: "success",
|
|
110
|
+
durationInMs: 3000,
|
|
111
|
+
});
|
|
112
|
+
};
|
|
93
113
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
114
|
+
return <Button title="Save" onPress={handlePress} />;
|
|
115
|
+
};
|
|
116
|
+
```
|
|
97
117
|
|
|
98
|
-
|
|
118
|
+
**Outside React (Using Helpers - Great for API Interceptors):**
|
|
99
119
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
120
|
+
```typescript
|
|
121
|
+
import { utilities } from "./lib/toasts";
|
|
122
|
+
import api from "./api";
|
|
123
|
+
|
|
124
|
+
api.interceptors.response.use(
|
|
125
|
+
(response) => response,
|
|
126
|
+
(error) => {
|
|
127
|
+
utilities.helpers.stack({
|
|
128
|
+
title: "Connection Error",
|
|
129
|
+
description: error.message,
|
|
130
|
+
infoType: "error",
|
|
131
|
+
durationInMs: 5000,
|
|
132
|
+
});
|
|
133
|
+
return Promise.reject(error);
|
|
134
|
+
},
|
|
135
|
+
);
|
|
136
|
+
```
|
|
103
137
|
|
|
104
138
|
---
|
|
105
139
|
|
|
106
|
-
## 📱 React Native
|
|
140
|
+
## 📱 React Native Architecture
|
|
107
141
|
|
|
108
|
-
The native
|
|
142
|
+
The native implementation uses **Shared Values** and **Worklets** to achieve native-level performance:
|
|
109
143
|
|
|
110
|
-
- **Swipe to Dismiss:** Fully interactive gestures to clear notifications.
|
|
111
|
-
- **
|
|
112
|
-
- **
|
|
144
|
+
- **Swipe to Dismiss:** Fully interactive, physics-based gestures to clear notifications. Swipe velocities are calculated in real-time.
|
|
145
|
+
- **UI Thread Operations:** Dismissing a toast uses `scheduleOnRN` to bypass the JS thread entirely, avoiding stutters during heavy computations.
|
|
146
|
+
- **Safe Area Aware:** Automatically shifts offsets using `react-native-safe-area-context` to prevent overlapping with notches or dynamic islands.
|
|
147
|
+
- **Dynamic Z-Index:** Smart stacking logic that recalculates layer priorities smoothly as new toasts arrive or leave.
|
|
113
148
|
|
|
114
149
|
---
|
|
115
150
|
|
|
116
151
|
## 📄 License
|
|
117
152
|
|
|
118
|
-
MIT ©
|
|
153
|
+
MIT © L'App Studio
|
package/dist/core.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as ToastsStore, c as NewToast, d as ToastActions, f as ToastInfoType, i as ToastsRendererContextProps, l as Toast, n as ToastsPoolRendererProps, o as ToastsStoreSettings, r as ToastsProviderProps, s as ToastComponentProps, t as ToastsComponentsByInfoType, u as ToastAction } from "./toasts-renderer-CoN_jkgy.cjs";
|
|
2
2
|
import * as zustand from "zustand";
|
|
3
|
-
import { ElementType } from "react";
|
|
4
3
|
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
|
+
import { ElementType } from "react";
|
|
5
5
|
|
|
6
6
|
//#region src/core/createToastsClient.d.ts
|
|
7
7
|
type Parameters = {
|
|
@@ -34,5 +34,5 @@ declare const createToastsClient: ({
|
|
|
34
34
|
};
|
|
35
35
|
};
|
|
36
36
|
//#endregion
|
|
37
|
-
export { NewToast, Toast, ToastAction, ToastActions, ToastInfoType, ToastsStore, ToastsStoreSettings, createToastsClient };
|
|
37
|
+
export { NewToast, Toast, ToastAction, ToastActions, ToastComponentProps, ToastInfoType, ToastsComponentsByInfoType, ToastsPoolRendererProps, ToastsProviderProps, ToastsRendererContextProps, ToastsStore, ToastsStoreSettings, createToastsClient };
|
|
38
38
|
//# sourceMappingURL=core.d.cts.map
|
package/dist/core.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as ToastsStore, c as NewToast, d as ToastActions, f as ToastInfoType, i as ToastsRendererContextProps, l as Toast, n as ToastsPoolRendererProps, o as ToastsStoreSettings, r as ToastsProviderProps, s as ToastComponentProps, t as ToastsComponentsByInfoType, u as ToastAction } from "./toasts-renderer-Ad20ipzA.js";
|
|
2
2
|
import { ElementType } from "react";
|
|
3
3
|
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
4
4
|
import * as zustand from "zustand";
|
|
@@ -34,5 +34,5 @@ declare const createToastsClient: ({
|
|
|
34
34
|
};
|
|
35
35
|
};
|
|
36
36
|
//#endregion
|
|
37
|
-
export { NewToast, Toast, ToastAction, ToastActions, ToastInfoType, ToastsStore, ToastsStoreSettings, createToastsClient };
|
|
37
|
+
export { NewToast, Toast, ToastAction, ToastActions, ToastComponentProps, ToastInfoType, ToastsComponentsByInfoType, ToastsPoolRendererProps, ToastsProviderProps, ToastsRendererContextProps, ToastsStore, ToastsStoreSettings, createToastsClient };
|
|
38
38
|
//# sourceMappingURL=core.d.ts.map
|
package/dist/native.d.cts
CHANGED
package/dist/native.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ElementType } from "react";
|
|
2
|
+
import { StoreApi, UseBoundStore } from "zustand";
|
|
2
3
|
|
|
3
4
|
//#region src/core/types/toast.d.ts
|
|
4
5
|
declare enum ToastInfoType {
|
|
@@ -42,6 +43,11 @@ type ToastsStoreSettings = {
|
|
|
42
43
|
//#endregion
|
|
43
44
|
//#region src/core/types/toasts-renderer.d.ts
|
|
44
45
|
type ToastsComponentsByInfoType = Record<ToastInfoType, ElementType<ToastComponentProps>>;
|
|
46
|
+
type ToastsRendererContextProps = {
|
|
47
|
+
children: React.ReactNode;
|
|
48
|
+
components: ToastsComponentsByInfoType;
|
|
49
|
+
store: UseBoundStore<StoreApi<ToastsStore>>;
|
|
50
|
+
};
|
|
45
51
|
type ToastsPoolRendererProps = {
|
|
46
52
|
children: React.ReactNode;
|
|
47
53
|
};
|
|
@@ -49,5 +55,5 @@ type ToastsProviderProps = {
|
|
|
49
55
|
children: React.ReactNode;
|
|
50
56
|
};
|
|
51
57
|
//#endregion
|
|
52
|
-
export {
|
|
53
|
-
//# sourceMappingURL=toasts-renderer-
|
|
58
|
+
export { ToastsStore as a, NewToast as c, ToastActions as d, ToastInfoType as f, ToastsRendererContextProps as i, Toast as l, ToastsPoolRendererProps as n, ToastsStoreSettings as o, ToastsProviderProps as r, ToastComponentProps as s, ToastsComponentsByInfoType as t, ToastAction as u };
|
|
59
|
+
//# sourceMappingURL=toasts-renderer-Ad20ipzA.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toasts-renderer-
|
|
1
|
+
{"version":3,"file":"toasts-renderer-Ad20ipzA.d.ts","names":[],"sources":["../src/core/types/toast.ts","../src/core/types/toast-component.ts","../src/core/types/toasts-store.ts","../src/core/types/toasts-renderer.ts"],"mappings":";;;;aAAY,aAAA;EACV,IAAA;EACA,KAAA;EACA,OAAA;AAAA;AAAA,KAGU,KAAA;EACV,EAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EACA,QAAA,KAAa,aAAA;AAAA;AAAA,KAGH,QAAA,GAAW,IAAA,CAAK,KAAA;AAAA,KAEhB,WAAA,IAAe,KAAA,EAAO,KAAA;AAAA,KAEtB,YAAA;EACV,SAAA,GAAY,WAAA;EACZ,OAAA,GAAU,WAAA;AAAA;;;KClBA,mBAAA;EACV,KAAA,EAAO,KAAA;EACP,OAAA,EAAS,YAAA;AAAA;;;KCFC,WAAA;EACV,IAAA,EAAM,KAAA;EACN,SAAA;EAEA,KAAA,GAAQ,KAAA,EAAO,QAAA;EACf,MAAA,GAAS,KAAA,EAAO,KAAA;EAChB,GAAA;EAEA,WAAA,GAAc,UAAA;EACd,cAAA,GAAiB,UAAA;AAAA;AAAA,KAGP,mBAAA;EACV,SAAA;AAAA;;;KCRU,0BAAA,GAA6B,MAAA,CACvC,aAAA,EACA,WAAA,CAAY,mBAAA;AAAA,KAGF,0BAAA;EACV,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,UAAA,EAAY,0BAAA;EACZ,KAAA,EAAO,aAAA,CAAc,QAAA,CAAS,WAAA;AAAA;AAAA,KAGpB,uBAAA;EACV,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA;AAAA,KAGN,mBAAA;EACV,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { StoreApi, UseBoundStore } from "zustand";
|
|
1
2
|
import { ElementType } from "react";
|
|
3
|
+
|
|
2
4
|
//#region src/core/types/toast.d.ts
|
|
3
5
|
declare enum ToastInfoType {
|
|
4
6
|
info = "info",
|
|
@@ -41,6 +43,11 @@ type ToastsStoreSettings = {
|
|
|
41
43
|
//#endregion
|
|
42
44
|
//#region src/core/types/toasts-renderer.d.ts
|
|
43
45
|
type ToastsComponentsByInfoType = Record<ToastInfoType, ElementType<ToastComponentProps>>;
|
|
46
|
+
type ToastsRendererContextProps = {
|
|
47
|
+
children: React.ReactNode;
|
|
48
|
+
components: ToastsComponentsByInfoType;
|
|
49
|
+
store: UseBoundStore<StoreApi<ToastsStore>>;
|
|
50
|
+
};
|
|
44
51
|
type ToastsPoolRendererProps = {
|
|
45
52
|
children: React.ReactNode;
|
|
46
53
|
};
|
|
@@ -48,5 +55,5 @@ type ToastsProviderProps = {
|
|
|
48
55
|
children: React.ReactNode;
|
|
49
56
|
};
|
|
50
57
|
//#endregion
|
|
51
|
-
export {
|
|
52
|
-
//# sourceMappingURL=toasts-renderer-
|
|
58
|
+
export { ToastsStore as a, NewToast as c, ToastActions as d, ToastInfoType as f, ToastsRendererContextProps as i, Toast as l, ToastsPoolRendererProps as n, ToastsStoreSettings as o, ToastsProviderProps as r, ToastComponentProps as s, ToastsComponentsByInfoType as t, ToastAction as u };
|
|
59
|
+
//# sourceMappingURL=toasts-renderer-CoN_jkgy.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toasts-renderer-CoN_jkgy.d.cts","names":[],"sources":["../src/core/types/toast.ts","../src/core/types/toast-component.ts","../src/core/types/toasts-store.ts","../src/core/types/toasts-renderer.ts"],"mappings":";;;;aAAY,aAAA;EACV,IAAA;EACA,KAAA;EACA,OAAA;AAAA;AAAA,KAGU,KAAA;EACV,EAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EACA,QAAA,KAAa,aAAA;AAAA;AAAA,KAGH,QAAA,GAAW,IAAA,CAAK,KAAA;AAAA,KAEhB,WAAA,IAAe,KAAA,EAAO,KAAA;AAAA,KAEtB,YAAA;EACV,SAAA,GAAY,WAAA;EACZ,OAAA,GAAU,WAAA;AAAA;;;KClBA,mBAAA;EACV,KAAA,EAAO,KAAA;EACP,OAAA,EAAS,YAAA;AAAA;;;KCFC,WAAA;EACV,IAAA,EAAM,KAAA;EACN,SAAA;EAEA,KAAA,GAAQ,KAAA,EAAO,QAAA;EACf,MAAA,GAAS,KAAA,EAAO,KAAA;EAChB,GAAA;EAEA,WAAA,GAAc,UAAA;EACd,cAAA,GAAiB,UAAA;AAAA;AAAA,KAGP,mBAAA;EACV,SAAA;AAAA;;;KCRU,0BAAA,GAA6B,MAAA,CACvC,aAAA,EACA,WAAA,CAAY,mBAAA;AAAA,KAGF,0BAAA;EACV,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,UAAA,EAAY,0BAAA;EACZ,KAAA,EAAO,aAAA,CAAc,QAAA,CAAS,WAAA;AAAA;AAAA,KAGpB,uBAAA;EACV,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA;AAAA,KAGN,mBAAA;EACV,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lapp-studio/react-toast-engine",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/core.js",
|
|
@@ -58,5 +58,19 @@
|
|
|
58
58
|
"maintainers": [
|
|
59
59
|
"giovanninp"
|
|
60
60
|
],
|
|
61
|
+
"keywords": [
|
|
62
|
+
"react",
|
|
63
|
+
"react-native",
|
|
64
|
+
"toast",
|
|
65
|
+
"notification",
|
|
66
|
+
"snackbar",
|
|
67
|
+
"alert",
|
|
68
|
+
"headless",
|
|
69
|
+
"zustand",
|
|
70
|
+
"reanimated",
|
|
71
|
+
"gesture-handler",
|
|
72
|
+
"ui",
|
|
73
|
+
"hybrid"
|
|
74
|
+
],
|
|
61
75
|
"license": "MIT"
|
|
62
76
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"toasts-renderer-vMIJr1FV.d.ts","names":[],"sources":["../src/core/types/toast.ts","../src/core/types/toast-component.ts","../src/core/types/toasts-store.ts","../src/core/types/toasts-renderer.ts"],"mappings":";;aAAY,aAAA;EACV,IAAA;EACA,KAAA;EACA,OAAA;AAAA;AAAA,KAGU,KAAA;EACV,EAAA;EACA,KAAA;EACA,WAAA;EACA,YAAA;EACA,QAAA,KAAa,aAAA;AAAA;AAAA,KAGH,QAAA,GAAW,IAAA,CAAK,KAAA;AAAA,KAEhB,WAAA,IAAe,KAAA,EAAO,KAAA;AAAA,KAEtB,YAAA;EACV,SAAA,GAAY,WAAA;EACZ,OAAA,GAAU,WAAA;AAAA;;;KClBA,mBAAA;EACV,KAAA,EAAO,KAAA;EACP,OAAA,EAAS,YAAA;AAAA;;;KCFC,WAAA;EACV,IAAA,EAAM,KAAA;EACN,SAAA;EAEA,KAAA,GAAQ,KAAA,EAAO,QAAA;EACf,MAAA,GAAS,KAAA,EAAO,KAAA;EAChB,GAAA;EAEA,WAAA,GAAc,UAAA;EACd,cAAA,GAAiB,UAAA;AAAA;AAAA,KAGP,mBAAA;EACV,SAAA;AAAA;;;KCRU,0BAAA,GAA6B,MAAA,CACvC,aAAA,EACA,WAAA,CAAY,mBAAA;AAAA,KASF,uBAAA;EACV,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA;AAAA,KAGN,mBAAA;EACV,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA"}
|