@adminide-stack/yantra-mobile 12.0.52-alpha.0 → 12.0.52-alpha.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.
Files changed (56) hide show
  1. package/lib/components/CustomDrawer.js +1 -38
  2. package/lib/components/CustomDrawer.js.map +1 -1
  3. package/lib/components/KeyboardComposerDock.js +4 -3
  4. package/lib/components/KeyboardComposerDock.js.map +1 -1
  5. package/lib/compute.js +58 -1
  6. package/lib/compute.js.map +1 -1
  7. package/lib/features/apps/AppsCatalog.js +9 -0
  8. package/lib/features/apps/AppsCatalog.js.map +1 -1
  9. package/lib/features/apps/mobileAppCatalog.js +10 -0
  10. package/lib/features/apps/mobileAppCatalog.js.map +1 -1
  11. package/lib/features/attachments/buildGatewayMedia.js +22 -15
  12. package/lib/features/attachments/buildGatewayMedia.js.map +1 -1
  13. package/lib/features/attachments/uploadChatAttachments.js +6 -4
  14. package/lib/features/attachments/uploadChatAttachments.js.map +1 -1
  15. package/lib/features/attachments/useImageAttachments.js +63 -17
  16. package/lib/features/attachments/useImageAttachments.js.map +1 -1
  17. package/lib/features/chat/AskUserCard.js +244 -121
  18. package/lib/features/chat/AskUserCard.js.map +1 -1
  19. package/lib/features/chat/ChatTranscript.js +206 -130
  20. package/lib/features/chat/ChatTranscript.js.map +1 -1
  21. package/lib/features/chat/askUser.js +111 -15
  22. package/lib/features/chat/askUser.js.map +1 -1
  23. package/lib/features/chat/streamingMarkdown.js +7 -0
  24. package/lib/features/chat/streamingMarkdown.js.map +1 -0
  25. package/lib/features/chat/transcriptGroups.js +29 -0
  26. package/lib/features/chat/transcriptGroups.js.map +1 -0
  27. package/lib/features/messaging/nativeChatRegistry.js +7 -0
  28. package/lib/features/messaging/nativeChatRegistry.js.map +1 -0
  29. package/lib/features/messaging/useChatViewer.js +32 -0
  30. package/lib/features/messaging/useChatViewer.js.map +1 -0
  31. package/lib/hooks/mintSurfaceSystemToken.js +28 -14
  32. package/lib/hooks/mintSurfaceSystemToken.js.map +1 -1
  33. package/lib/hooks/systemTokenJwt.js +75 -0
  34. package/lib/hooks/systemTokenJwt.js.map +1 -0
  35. package/lib/hooks/useCdecliAutoConnect.js +116 -138
  36. package/lib/hooks/useCdecliAutoConnect.js.map +1 -1
  37. package/lib/hooks/useChatApi.js +43 -17
  38. package/lib/hooks/useChatApi.js.map +1 -1
  39. package/lib/hooks/useChatStream.js +61 -13
  40. package/lib/hooks/useChatStream.js.map +1 -1
  41. package/lib/hooks/useObtainSystemToken.js +121 -36
  42. package/lib/hooks/useObtainSystemToken.js.map +1 -1
  43. package/lib/index.js +1 -1
  44. package/lib/index.js.map +1 -1
  45. package/lib/routes.json +53 -0
  46. package/lib/screens/Chat/index.js +25 -6
  47. package/lib/screens/Chat/index.js.map +1 -1
  48. package/lib/screens/ChatNative/index.js +69 -0
  49. package/lib/screens/ChatNative/index.js.map +1 -0
  50. package/lib/screens/Home/HomeScreen.js +21 -6
  51. package/lib/screens/Home/HomeScreen.js.map +1 -1
  52. package/lib/screens/Home/components/ChatHistoryLanding.js +46 -16
  53. package/lib/screens/Home/components/ChatHistoryLanding.js.map +1 -1
  54. package/lib/utils/authUserDisplay.js +37 -0
  55. package/lib/utils/authUserDisplay.js.map +1 -0
  56. package/package.json +3 -3
@@ -1,4 +1,4 @@
1
- import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useMemo,useCallback}from'react';import {View,StyleSheet,Text,Pressable,TextInput}from'react-native';import {formatAskUserAnswers}from'./askUser.js';var __defProp = Object.defineProperty;
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {memo,useState,useRef,useMemo,useEffect}from'react';import {View,StyleSheet,Text,Pressable,TextInput}from'react-native';import {formatAskUserAnswers}from'./askUser.js';var __defProp = Object.defineProperty;
2
2
  var __defProps = Object.defineProperties;
3
3
  var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
@@ -17,6 +17,19 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __restKey = (key) => typeof key === "symbol" ? key : key + "";
21
+ var __objRest = (source, exclude) => {
22
+ var target = {};
23
+ for (var prop in source)
24
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
25
+ target[prop] = source[prop];
26
+ if (source != null && __getOwnPropSymbols)
27
+ for (var prop of __getOwnPropSymbols(source)) {
28
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
29
+ target[prop] = source[prop];
30
+ }
31
+ return target;
32
+ };
20
33
  const ACCENT = "#2563eb";
21
34
  const AskUserCard = memo(function AskUserCard2({
22
35
  payload,
@@ -25,7 +38,17 @@ const AskUserCard = memo(function AskUserCard2({
25
38
  onAnswer,
26
39
  onDismiss
27
40
  }) {
41
+ var _a, _b, _c;
42
+ const questions = payload.questions;
43
+ const [index, setIndex] = useState(0);
28
44
  const [answers, setAnswers] = useState({});
45
+ const [textDraft, setTextDraft] = useState("");
46
+ const inputRef = useRef(null);
47
+ const total = questions.length;
48
+ const question = questions[Math.min(index, Math.max(total - 1, 0))];
49
+ const isLast = index >= total - 1;
50
+ const allowText = (question == null ? void 0 : question.allowText) !== false;
51
+ const multiSelect = (question == null ? void 0 : question.multiSelect) === true;
29
52
  const palette = useMemo(() => ({
30
53
  card: isDark ? "#111827" : "#ffffff",
31
54
  border: isDark ? "#1f2937" : "#e5e7eb",
@@ -33,109 +56,171 @@ const AskUserCard = memo(function AskUserCard2({
33
56
  muted: isDark ? "#94a3b8" : "#6b7280",
34
57
  optionBg: isDark ? "#0b1220" : "#f9fafb",
35
58
  optionBorder: isDark ? "#243045" : "#e5e7eb",
36
- inputBg: isDark ? "#0b1220" : "#f9fafb"
59
+ chip: isDark ? "#1e293b" : "#f3f4f6",
60
+ chipOn: ACCENT
37
61
  }), [isDark]);
38
- const selectedLabels = useCallback((q) => {
39
- var _a;
40
- const raw = (_a = answers[q.id]) != null ? _a : "";
62
+ const selectedLabels = useMemo(() => {
63
+ var _a2, _b2;
64
+ const raw = (_b2 = answers[(_a2 = question == null ? void 0 : question.id) != null ? _a2 : ""]) != null ? _b2 : "";
41
65
  if (!raw.trim()) return [];
42
- if (!q.multiSelect) return [raw];
66
+ if (!multiSelect) return [raw];
43
67
  return raw.split(",").map((v) => v.trim()).filter(Boolean);
44
- }, [answers]);
45
- const toggle = useCallback((q, label) => {
46
- if (disabled) return;
47
- setAnswers((prev) => {
48
- var _a;
49
- const current = (_a = prev[q.id]) != null ? _a : "";
50
- if (!q.multiSelect) {
51
- return __spreadProps(__spreadValues({}, prev), {
52
- [q.id]: current === label ? "" : label
53
- });
54
- }
55
- const parts = current.split(",").map((v) => v.trim()).filter(Boolean);
56
- const next = parts.includes(label) ? parts.filter((v) => v !== label) : [...parts, label];
57
- return __spreadProps(__spreadValues({}, prev), {
58
- [q.id]: next.join(", ")
59
- });
68
+ }, [answers, question, multiSelect]);
69
+ const lastQuestionIdRef = useRef(null);
70
+ useEffect(() => {
71
+ var _a2;
72
+ const q = questions[index];
73
+ if (!q || lastQuestionIdRef.current === q.id) return;
74
+ lastQuestionIdRef.current = q.id;
75
+ const existing = (_a2 = answers[q.id]) != null ? _a2 : "";
76
+ const parts = q.multiSelect ? existing.split(",").map((v) => v.trim()) : [existing];
77
+ const isOptionAnswer = existing !== "" && parts.every((part) => {
78
+ var _a3;
79
+ return (_a3 = q.options) == null ? void 0 : _a3.some((o) => o.label === part);
60
80
  });
61
- }, [disabled]);
62
- const setText = useCallback((q, value) => {
81
+ setTextDraft(isOptionAnswer ? "" : existing);
82
+ }, [index, questions]);
83
+ const record = (value, advance) => {
84
+ if (!question) return;
63
85
  setAnswers((prev) => __spreadProps(__spreadValues({}, prev), {
64
- [q.id]: value
86
+ [question.id]: value
65
87
  }));
66
- }, []);
67
- const formatted = formatAskUserAnswers(payload.questions, answers);
68
- const canSend = formatted.trim().length > 0 && !disabled;
88
+ if (!advance) return;
89
+ if (isLast) {
90
+ const formatted = formatAskUserAnswers(questions, __spreadProps(__spreadValues({}, answers), {
91
+ [question.id]: value
92
+ }));
93
+ if (formatted) onAnswer(formatted);
94
+ else onDismiss();
95
+ } else {
96
+ setIndex((i) => i + 1);
97
+ }
98
+ };
99
+ const chooseOption = (option) => {
100
+ var _a2;
101
+ if (!question || disabled) return;
102
+ if (option.other) {
103
+ (_a2 = inputRef.current) == null ? void 0 : _a2.focus();
104
+ return;
105
+ }
106
+ if (multiSelect) {
107
+ const next2 = selectedLabels.includes(option.label) ? selectedLabels.filter((l) => l !== option.label) : [...selectedLabels, option.label];
108
+ record(next2.join(", "), false);
109
+ return;
110
+ }
111
+ record(option.label, true);
112
+ };
113
+ const currentAnswer = textDraft.trim() || answers[(_a = question == null ? void 0 : question.id) != null ? _a : ""] || "";
114
+ const next = () => {
115
+ if (disabled || !currentAnswer) return;
116
+ record(currentAnswer, true);
117
+ };
118
+ const skip = () => {
119
+ var _a2;
120
+ if (disabled || !question) return;
121
+ setAnswers((prev) => {
122
+ var _a3;
123
+ const _b3 = prev, {
124
+ [_a3 = question.id]: _dropped
125
+ } = _b3, rest = __objRest(_b3, [
126
+ __restKey(_a3)
127
+ ]);
128
+ return rest;
129
+ });
130
+ if (isLast) {
131
+ const _b2 = answers, {
132
+ [_a2 = question.id]: _dropped
133
+ } = _b2, rest = __objRest(_b2, [
134
+ __restKey(_a2)
135
+ ]);
136
+ const formatted = formatAskUserAnswers(questions, rest);
137
+ if (formatted) onAnswer(formatted);
138
+ else onDismiss();
139
+ } else {
140
+ setIndex((i) => i + 1);
141
+ }
142
+ };
143
+ if (!question) return null;
69
144
  return /* @__PURE__ */ jsxs(View, { style: [styles.card, {
70
145
  backgroundColor: palette.card,
71
146
  borderColor: palette.border
72
147
  }], children: [
73
- payload.questions.map((q) => {
74
- var _a, _b, _c, _d;
75
- const chosen = selectedLabels(q);
76
- const optionLabels = new Set(((_a = q.options) != null ? _a : []).map((o) => o.label));
77
- const textValue = chosen.every((c) => optionLabels.has(c)) ? "" : (_b = answers[q.id]) != null ? _b : "";
78
- return /* @__PURE__ */ jsxs(View, { style: styles.question, children: [
79
- q.header ? /* @__PURE__ */ jsx(Text, { style: [styles.eyebrow, {
80
- color: palette.muted
81
- }], children: q.header.toUpperCase() }) : null,
82
- /* @__PURE__ */ jsx(Text, { style: [styles.title, {
83
- color: palette.title
84
- }], children: q.title }),
85
- q.multiSelect ? /* @__PURE__ */ jsx(Text, { style: [styles.hint, {
86
- color: palette.muted
87
- }], children: "Pick as many as apply." }) : null,
88
- ((_c = q.options) != null ? _c : []).map((o) => {
89
- const active = chosen.includes(o.label);
90
- return /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", accessibilityState: {
91
- selected: active,
92
- disabled
93
- }, accessibilityLabel: o.detail ? `${o.label}. ${o.detail}` : o.label, disabled, onPress: () => toggle(q, o.label), style: ({
94
- pressed
95
- }) => [styles.option, {
96
- backgroundColor: active ? `${ACCENT}14` : palette.optionBg,
97
- borderColor: active ? ACCENT : palette.optionBorder,
98
- opacity: pressed && !disabled ? 0.75 : 1
99
- }], children: [
100
- /* @__PURE__ */ jsxs(View, { style: styles.optionBody, children: [
101
- /* @__PURE__ */ jsx(Text, { style: [styles.optionLabel, {
102
- color: palette.title
103
- }], children: o.label }),
104
- o.detail ? /* @__PURE__ */ jsx(Text, { style: [styles.optionDetail, {
105
- color: palette.muted
106
- }], children: o.detail }) : null
107
- ] }),
108
- /* @__PURE__ */ jsx(View, { style: [styles.tick, {
109
- borderColor: active ? ACCENT : palette.optionBorder,
110
- backgroundColor: active ? ACCENT : "transparent"
111
- }], children: active ? /* @__PURE__ */ jsx(Text, { style: styles.tickMark, children: "\u2713" }) : null })
112
- ] }, o.id);
113
- }),
114
- q.allowText !== false ? /* @__PURE__ */ jsx(TextInput, { value: textValue, onChangeText: (v) => setText(q, v), editable: !disabled, placeholder: (_d = q.textPlaceholder) != null ? _d : "Or type your own answer\u2026", placeholderTextColor: palette.muted, style: [styles.input, {
115
- backgroundColor: palette.inputBg,
116
- borderColor: palette.optionBorder,
117
- color: palette.title
118
- }] }) : null
119
- ] }, q.id);
148
+ /* @__PURE__ */ jsxs(View, { style: styles.header, children: [
149
+ /* @__PURE__ */ jsxs(Text, { style: [styles.kicker, {
150
+ color: palette.muted
151
+ }], children: [
152
+ "Question ",
153
+ index + 1,
154
+ " of ",
155
+ total
156
+ ] }),
157
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityLabel: "Dismiss", hitSlop: 10, onPress: onDismiss, disabled, style: styles.dismiss, children: /* @__PURE__ */ jsx(Text, { style: [styles.dismissMark, {
158
+ color: palette.muted
159
+ }], children: "\xD7" }) })
160
+ ] }),
161
+ question.header ? /* @__PURE__ */ jsx(Text, { style: [styles.eyebrow, {
162
+ color: palette.muted
163
+ }], children: question.header.toUpperCase() }) : null,
164
+ /* @__PURE__ */ jsx(Text, { style: [styles.title, {
165
+ color: palette.title
166
+ }], children: question.title }),
167
+ multiSelect ? /* @__PURE__ */ jsx(Text, { style: [styles.hint, {
168
+ color: palette.muted
169
+ }], children: "Pick as many as apply." }) : null,
170
+ ((_b = question.options) != null ? _b : []).map((o, i) => {
171
+ const active = selectedLabels.includes(o.label);
172
+ return /* @__PURE__ */ jsxs(Pressable, { accessibilityRole: "button", accessibilityState: {
173
+ selected: active,
174
+ disabled
175
+ }, accessibilityLabel: o.detail ? `${o.label}. ${o.detail}` : o.label, disabled, onPress: () => chooseOption(o), style: ({
176
+ pressed
177
+ }) => [styles.option, {
178
+ backgroundColor: active ? `${ACCENT}14` : palette.optionBg,
179
+ borderColor: active ? ACCENT : palette.optionBorder,
180
+ opacity: pressed && !disabled ? 0.75 : 1
181
+ }], children: [
182
+ /* @__PURE__ */ jsx(View, { style: [styles.indexChip, {
183
+ backgroundColor: active ? ACCENT : palette.chip
184
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.indexChipText, {
185
+ color: active ? "#ffffff" : palette.muted
186
+ }], children: active && multiSelect ? "\u2713" : String(i + 1) }) }),
187
+ /* @__PURE__ */ jsxs(View, { style: styles.optionBody, children: [
188
+ /* @__PURE__ */ jsx(Text, { style: [styles.optionLabel, {
189
+ color: palette.title
190
+ }], children: o.label }),
191
+ o.detail ? /* @__PURE__ */ jsx(Text, { style: [styles.optionDetail, {
192
+ color: palette.muted
193
+ }], children: o.detail }) : null
194
+ ] })
195
+ ] }, o.id);
120
196
  }),
197
+ allowText ? /* @__PURE__ */ jsx(TextInput, { ref: inputRef, value: textDraft, onChangeText: setTextDraft, editable: !disabled, placeholder: (_c = question.textPlaceholder) != null ? _c : "Type your answer", placeholderTextColor: palette.muted, returnKeyType: isLast ? "send" : "next", onSubmitEditing: next, style: [styles.input, {
198
+ backgroundColor: palette.optionBg,
199
+ borderColor: palette.optionBorder,
200
+ color: palette.title
201
+ }] }) : null,
121
202
  /* @__PURE__ */ jsxs(View, { style: styles.actions, children: [
122
- /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: onDismiss, disabled, style: ({
123
- pressed
124
- }) => [styles.skip, {
125
- opacity: pressed ? 0.6 : 1
126
- }], children: /* @__PURE__ */ jsx(Text, { style: [styles.skipText, {
203
+ index > 0 ? /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: () => {
204
+ if (question && textDraft.trim()) record(textDraft.trim(), false);
205
+ setIndex((i) => i - 1);
206
+ }, disabled, style: styles.skip, children: /* @__PURE__ */ jsx(Text, { style: [styles.skipText, {
127
207
  color: palette.muted
128
- }], children: "Skip" }) }),
129
- /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityState: {
130
- disabled: !canSend
131
- }, onPress: () => canSend && onAnswer(formatted), disabled: !canSend, style: ({
132
- pressed
133
- }) => [styles.send, {
134
- backgroundColor: canSend ? ACCENT : palette.optionBorder,
135
- opacity: pressed ? 0.85 : 1
136
- }], children: /* @__PURE__ */ jsx(Text, { style: [styles.sendText, {
137
- color: canSend ? "#ffffff" : palette.muted
138
- }], children: "Send" }) })
208
+ }], children: "Previous" }) }) : /* @__PURE__ */ jsx(View, {}),
209
+ /* @__PURE__ */ jsx(View, { style: styles.dots, pointerEvents: "none", children: total > 1 ? questions.map((q, i) => /* @__PURE__ */ jsx(View, { style: [styles.dot, i === index ? styles.dotOn : {
210
+ backgroundColor: palette.optionBorder
211
+ }] }, q.id)) : null }),
212
+ /* @__PURE__ */ jsxs(View, { style: styles.actionRight, children: [
213
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", onPress: skip, disabled, style: styles.skip, children: /* @__PURE__ */ jsx(Text, { style: [styles.skipText, {
214
+ color: palette.muted
215
+ }], children: "Skip" }) }),
216
+ /* @__PURE__ */ jsx(Pressable, { accessibilityRole: "button", accessibilityState: {
217
+ disabled: disabled || !currentAnswer
218
+ }, onPress: next, disabled: disabled || !currentAnswer, style: [styles.send, {
219
+ backgroundColor: currentAnswer && !disabled ? ACCENT : palette.optionBorder
220
+ }], children: /* @__PURE__ */ jsx(Text, { style: [styles.sendText, {
221
+ color: currentAnswer && !disabled ? "#ffffff" : palette.muted
222
+ }], children: isLast ? "Send" : "Next" }) })
223
+ ] })
139
224
  ] })
140
225
  ] });
141
226
  });
@@ -146,21 +231,42 @@ const styles = StyleSheet.create({
146
231
  borderRadius: 16,
147
232
  padding: 14,
148
233
  marginTop: 4,
149
- marginBottom: 10
234
+ marginBottom: 8
235
+ },
236
+ header: {
237
+ flexDirection: "row",
238
+ alignItems: "center",
239
+ justifyContent: "space-between"
150
240
  },
151
- question: {
152
- marginBottom: 12
241
+ kicker: {
242
+ fontSize: 10.5,
243
+ fontWeight: "600",
244
+ letterSpacing: 1.2,
245
+ textTransform: "uppercase"
246
+ },
247
+ dismiss: {
248
+ padding: 4,
249
+ minWidth: 32,
250
+ minHeight: 32,
251
+ alignItems: "center",
252
+ justifyContent: "center"
253
+ },
254
+ dismissMark: {
255
+ fontSize: 22,
256
+ lineHeight: 24,
257
+ fontWeight: "400"
153
258
  },
154
259
  eyebrow: {
155
260
  fontSize: 11,
156
261
  fontWeight: "600",
157
262
  letterSpacing: 1,
158
- marginBottom: 4
263
+ marginTop: 6
159
264
  },
160
265
  title: {
161
- fontSize: 15,
266
+ fontSize: 15.5,
162
267
  fontWeight: "700",
163
268
  lineHeight: 21,
269
+ marginTop: 4,
164
270
  marginBottom: 4
165
271
  },
166
272
  hint: {
@@ -172,18 +278,28 @@ const styles = StyleSheet.create({
172
278
  alignItems: "center",
173
279
  borderWidth: 1,
174
280
  borderRadius: 12,
175
- paddingHorizontal: 12,
281
+ paddingHorizontal: 10,
176
282
  paddingVertical: 10,
177
283
  marginTop: 6,
178
- minHeight: 44
179
- // iOS minimum touch target
284
+ minHeight: 44,
285
+ gap: 10
286
+ },
287
+ indexChip: {
288
+ width: 24,
289
+ height: 24,
290
+ borderRadius: 6,
291
+ alignItems: "center",
292
+ justifyContent: "center"
293
+ },
294
+ indexChipText: {
295
+ fontSize: 11,
296
+ fontWeight: "700"
180
297
  },
181
298
  optionBody: {
182
- flex: 1,
183
- paddingRight: 10
299
+ flex: 1
184
300
  },
185
301
  optionLabel: {
186
- fontSize: 14,
302
+ fontSize: 13.5,
187
303
  fontWeight: "600"
188
304
  },
189
305
  optionDetail: {
@@ -191,47 +307,54 @@ const styles = StyleSheet.create({
191
307
  marginTop: 2,
192
308
  lineHeight: 16
193
309
  },
194
- tick: {
195
- width: 22,
196
- height: 22,
197
- borderRadius: 11,
198
- borderWidth: 1,
199
- alignItems: "center",
200
- justifyContent: "center"
201
- },
202
- tickMark: {
203
- color: "#ffffff",
204
- fontSize: 13,
205
- fontWeight: "700",
206
- lineHeight: 16
207
- },
208
310
  input: {
209
311
  borderWidth: 1,
210
312
  borderRadius: 12,
211
313
  paddingHorizontal: 12,
212
314
  paddingVertical: 10,
213
- marginTop: 8,
315
+ marginTop: 10,
214
316
  fontSize: 14,
215
317
  minHeight: 44
216
318
  },
217
319
  actions: {
218
320
  flexDirection: "row",
219
321
  alignItems: "center",
220
- justifyContent: "flex-end",
322
+ justifyContent: "space-between",
323
+ marginTop: 8,
221
324
  gap: 8
222
325
  },
326
+ dots: {
327
+ flexDirection: "row",
328
+ alignItems: "center",
329
+ gap: 5,
330
+ flex: 1,
331
+ justifyContent: "center"
332
+ },
333
+ dot: {
334
+ width: 6,
335
+ height: 6,
336
+ borderRadius: 3
337
+ },
338
+ dotOn: {
339
+ width: 16,
340
+ backgroundColor: ACCENT
341
+ },
342
+ actionRight: {
343
+ flexDirection: "row",
344
+ alignItems: "center"
345
+ },
223
346
  skip: {
224
- paddingHorizontal: 14,
347
+ paddingHorizontal: 12,
225
348
  paddingVertical: 10,
226
349
  minHeight: 44,
227
350
  justifyContent: "center"
228
351
  },
229
352
  skipText: {
230
- fontSize: 14,
353
+ fontSize: 13,
231
354
  fontWeight: "600"
232
355
  },
233
356
  send: {
234
- paddingHorizontal: 20,
357
+ paddingHorizontal: 16,
235
358
  paddingVertical: 10,
236
359
  borderRadius: 12,
237
360
  minHeight: 44,
@@ -1 +1 @@
1
- {"version":3,"file":"AskUserCard.js","sources":["../../../src/features/chat/AskUserCard.tsx"],"sourcesContent":["/**\n * <AskUserCard> — the `[ASK_USER]` clarifying question, as a touch card.\n *\n * Deliberately NOT a port of the web card. The web pages through questions with\n * a Next/Skip footer and keyboard shortcuts; on a phone the whole card sits\n * above the keyboard, so every question is laid out in one scrollable column and\n * options are full-width rows with a 44pt minimum target. One \"Send\" commits the\n * lot, matching how the answer travels anyway: a single formatted message.\n *\n * The reply goes out through the ordinary send path (onAnswer -> sendMessage),\n * which is what releases cdecli's parked turn.\n */\nimport React, { memo, useCallback, useMemo, useState } from 'react';\nimport { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { formatAskUserAnswers, type AskUserPayload, type AskUserQuestion } from './askUser';\n\nconst ACCENT = '#2563eb';\n\nexport const AskUserCard = memo(function AskUserCard({\n payload,\n isDark = false,\n disabled = false,\n onAnswer,\n onDismiss,\n}: {\n payload: AskUserPayload;\n isDark?: boolean;\n disabled?: boolean;\n onAnswer: (formatted: string) => void;\n onDismiss: () => void;\n}) {\n // One entry per question: an option label, comma-joined labels for a\n // multi-select, or free text. Same string either way, so formatting and\n // \"has the user answered anything?\" stay trivial.\n const [answers, setAnswers] = useState<Record<string, string>>({});\n\n const palette = useMemo(\n () => ({\n card: isDark ? '#111827' : '#ffffff',\n border: isDark ? '#1f2937' : '#e5e7eb',\n title: isDark ? '#f1f5f9' : '#111827',\n muted: isDark ? '#94a3b8' : '#6b7280',\n optionBg: isDark ? '#0b1220' : '#f9fafb',\n optionBorder: isDark ? '#243045' : '#e5e7eb',\n inputBg: isDark ? '#0b1220' : '#f9fafb',\n }),\n [isDark],\n );\n\n const selectedLabels = useCallback(\n (q: AskUserQuestion): string[] => {\n const raw = answers[q.id] ?? '';\n if (!raw.trim()) return [];\n if (!q.multiSelect) return [raw];\n return raw\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n },\n [answers],\n );\n\n const toggle = useCallback(\n (q: AskUserQuestion, label: string) => {\n if (disabled) return;\n setAnswers((prev) => {\n const current = prev[q.id] ?? '';\n if (!q.multiSelect) {\n // Tapping the chosen option again clears it, so a mis-tap is\n // recoverable without a separate \"clear\" affordance.\n return { ...prev, [q.id]: current === label ? '' : label };\n }\n const parts = current\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n const next = parts.includes(label) ? parts.filter((v) => v !== label) : [...parts, label];\n return { ...prev, [q.id]: next.join(', ') };\n });\n },\n [disabled],\n );\n\n const setText = useCallback((q: AskUserQuestion, value: string) => {\n setAnswers((prev) => ({ ...prev, [q.id]: value }));\n }, []);\n\n const formatted = formatAskUserAnswers(payload.questions, answers);\n const canSend = formatted.trim().length > 0 && !disabled;\n\n return (\n <View style={[styles.card, { backgroundColor: palette.card, borderColor: palette.border }]}>\n {payload.questions.map((q) => {\n const chosen = selectedLabels(q);\n const optionLabels = new Set((q.options ?? []).map((o) => o.label));\n // Free text is whatever is not one of the offered labels, so\n // switching between an option and typing does not lose the draft.\n const textValue = chosen.every((c) => optionLabels.has(c)) ? '' : (answers[q.id] ?? '');\n return (\n <View key={q.id} style={styles.question}>\n {q.header ? (\n <Text style={[styles.eyebrow, { color: palette.muted }]}>{q.header.toUpperCase()}</Text>\n ) : null}\n <Text style={[styles.title, { color: palette.title }]}>{q.title}</Text>\n {q.multiSelect ? (\n <Text style={[styles.hint, { color: palette.muted }]}>Pick as many as apply.</Text>\n ) : null}\n\n {(q.options ?? []).map((o) => {\n const active = chosen.includes(o.label);\n return (\n <Pressable\n key={o.id}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active, disabled }}\n accessibilityLabel={o.detail ? `${o.label}. ${o.detail}` : o.label}\n disabled={disabled}\n onPress={() => toggle(q, o.label)}\n style={({ pressed }) => [\n styles.option,\n {\n backgroundColor: active ? `${ACCENT}14` : palette.optionBg,\n borderColor: active ? ACCENT : palette.optionBorder,\n opacity: pressed && !disabled ? 0.75 : 1,\n },\n ]}\n >\n <View style={styles.optionBody}>\n <Text style={[styles.optionLabel, { color: palette.title }]}>{o.label}</Text>\n {o.detail ? (\n <Text style={[styles.optionDetail, { color: palette.muted }]}>\n {o.detail}\n </Text>\n ) : null}\n </View>\n <View\n style={[\n styles.tick,\n {\n borderColor: active ? ACCENT : palette.optionBorder,\n backgroundColor: active ? ACCENT : 'transparent',\n },\n ]}\n >\n {active ? <Text style={styles.tickMark}>✓</Text> : null}\n </View>\n </Pressable>\n );\n })}\n\n {q.allowText !== false ? (\n <TextInput\n value={textValue}\n onChangeText={(v) => setText(q, v)}\n editable={!disabled}\n placeholder={q.textPlaceholder ?? 'Or type your own answer…'}\n placeholderTextColor={palette.muted}\n style={[\n styles.input,\n {\n backgroundColor: palette.inputBg,\n borderColor: palette.optionBorder,\n color: palette.title,\n },\n ]}\n />\n ) : null}\n </View>\n );\n })}\n\n <View style={styles.actions}>\n <Pressable\n accessibilityRole=\"button\"\n onPress={onDismiss}\n disabled={disabled}\n style={({ pressed }) => [styles.skip, { opacity: pressed ? 0.6 : 1 }]}\n >\n <Text style={[styles.skipText, { color: palette.muted }]}>Skip</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: !canSend }}\n onPress={() => canSend && onAnswer(formatted)}\n disabled={!canSend}\n style={({ pressed }) => [\n styles.send,\n { backgroundColor: canSend ? ACCENT : palette.optionBorder, opacity: pressed ? 0.85 : 1 },\n ]}\n >\n <Text style={[styles.sendText, { color: canSend ? '#ffffff' : palette.muted }]}>Send</Text>\n </Pressable>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n card: {\n width: '100%',\n borderWidth: 1,\n borderRadius: 16,\n padding: 14,\n marginTop: 4,\n marginBottom: 10,\n },\n question: { marginBottom: 12 },\n eyebrow: { fontSize: 11, fontWeight: '600', letterSpacing: 1, marginBottom: 4 },\n title: { fontSize: 15, fontWeight: '700', lineHeight: 21, marginBottom: 4 },\n hint: { fontSize: 12, marginBottom: 6 },\n option: {\n flexDirection: 'row',\n alignItems: 'center',\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginTop: 6,\n minHeight: 44, // iOS minimum touch target\n },\n optionBody: { flex: 1, paddingRight: 10 },\n optionLabel: { fontSize: 14, fontWeight: '600' },\n optionDetail: { fontSize: 12, marginTop: 2, lineHeight: 16 },\n tick: {\n width: 22,\n height: 22,\n borderRadius: 11,\n borderWidth: 1,\n alignItems: 'center',\n justifyContent: 'center',\n },\n tickMark: { color: '#ffffff', fontSize: 13, fontWeight: '700', lineHeight: 16 },\n input: {\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginTop: 8,\n fontSize: 14,\n minHeight: 44,\n },\n actions: { flexDirection: 'row', alignItems: 'center', justifyContent: 'flex-end', gap: 8 },\n skip: { paddingHorizontal: 14, paddingVertical: 10, minHeight: 44, justifyContent: 'center' },\n skipText: { fontSize: 14, fontWeight: '600' },\n send: {\n paddingHorizontal: 20,\n paddingVertical: 10,\n borderRadius: 12,\n minHeight: 44,\n justifyContent: 'center',\n },\n sendText: { fontSize: 14, fontWeight: '700' },\n});\n"],"names":["AskUserCard"],"mappings":"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"}
1
+ {"version":3,"file":"AskUserCard.js","sources":["../../../src/features/chat/AskUserCard.tsx"],"sourcesContent":["/**\n * <AskUserCard> — the `[ASK_USER]` clarifying question, as a touch card.\n *\n * Phone twin of the web ResponsePromptCard: Question N of M, numbered options,\n * free-text row, Skip / Previous / Next / Send. Answers still travel as one\n * formatted `**Title:** answer` message so cdecli's parked turn is released.\n *\n * The reply goes out through the ordinary send path (onAnswer -> sendMessage),\n * which is what releases cdecli's parked turn.\n */\nimport React, { memo, useEffect, useMemo, useRef, useState } from 'react';\nimport { Pressable, StyleSheet, Text, TextInput, View } from 'react-native';\nimport { formatAskUserAnswers, type AskUserPayload } from './askUser';\n\nconst ACCENT = '#2563eb';\n\nexport const AskUserCard = memo(function AskUserCard({\n payload,\n isDark = false,\n disabled = false,\n onAnswer,\n onDismiss,\n}: {\n payload: AskUserPayload;\n isDark?: boolean;\n disabled?: boolean;\n onAnswer: (formatted: string) => void;\n onDismiss: () => void;\n}) {\n const questions = payload.questions;\n const [index, setIndex] = useState(0);\n const [answers, setAnswers] = useState<Record<string, string>>({});\n const [textDraft, setTextDraft] = useState('');\n const inputRef = useRef<TextInput>(null);\n\n const total = questions.length;\n const question = questions[Math.min(index, Math.max(total - 1, 0))];\n const isLast = index >= total - 1;\n const allowText = question?.allowText !== false;\n const multiSelect = question?.multiSelect === true;\n\n const palette = useMemo(\n () => ({\n card: isDark ? '#111827' : '#ffffff',\n border: isDark ? '#1f2937' : '#e5e7eb',\n title: isDark ? '#f1f5f9' : '#111827',\n muted: isDark ? '#94a3b8' : '#6b7280',\n optionBg: isDark ? '#0b1220' : '#f9fafb',\n optionBorder: isDark ? '#243045' : '#e5e7eb',\n chip: isDark ? '#1e293b' : '#f3f4f6',\n chipOn: ACCENT,\n }),\n [isDark],\n );\n\n const selectedLabels = useMemo(() => {\n const raw = answers[question?.id ?? ''] ?? '';\n if (!raw.trim()) return [] as string[];\n if (!multiSelect) return [raw];\n return raw\n .split(',')\n .map((v) => v.trim())\n .filter(Boolean);\n }, [answers, question, multiSelect]);\n\n const lastQuestionIdRef = useRef<string | null>(null);\n useEffect(() => {\n const q = questions[index];\n if (!q || lastQuestionIdRef.current === q.id) return;\n lastQuestionIdRef.current = q.id;\n const existing = answers[q.id] ?? '';\n const parts = q.multiSelect ? existing.split(',').map((v) => v.trim()) : [existing];\n const isOptionAnswer = existing !== '' && parts.every((part) => q.options?.some((o) => o.label === part));\n setTextDraft(isOptionAnswer ? '' : existing);\n // answers omitted: re-running on every keystroke would clobber the draft.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [index, questions]);\n\n const record = (value: string, advance: boolean) => {\n if (!question) return;\n setAnswers((prev) => ({ ...prev, [question.id]: value }));\n if (!advance) return;\n if (isLast) {\n const formatted = formatAskUserAnswers(questions, { ...answers, [question.id]: value });\n if (formatted) onAnswer(formatted);\n else onDismiss();\n } else {\n setIndex((i) => i + 1);\n }\n };\n\n const chooseOption = (option: { label: string; other?: boolean }) => {\n if (!question || disabled) return;\n if (option.other) {\n inputRef.current?.focus();\n return;\n }\n if (multiSelect) {\n const next = selectedLabels.includes(option.label)\n ? selectedLabels.filter((l) => l !== option.label)\n : [...selectedLabels, option.label];\n record(next.join(', '), false);\n return;\n }\n record(option.label, true);\n };\n\n const currentAnswer = textDraft.trim() || answers[question?.id ?? ''] || '';\n\n const next = () => {\n if (disabled || !currentAnswer) return;\n record(currentAnswer, true);\n };\n\n const skip = () => {\n if (disabled || !question) return;\n setAnswers((prev) => {\n const { [question.id]: _dropped, ...rest } = prev;\n return rest;\n });\n if (isLast) {\n const { [question.id]: _dropped, ...rest } = answers;\n const formatted = formatAskUserAnswers(questions, rest);\n if (formatted) onAnswer(formatted);\n else onDismiss();\n } else {\n setIndex((i) => i + 1);\n }\n };\n\n if (!question) return null;\n\n return (\n <View style={[styles.card, { backgroundColor: palette.card, borderColor: palette.border }]}>\n <View style={styles.header}>\n <Text style={[styles.kicker, { color: palette.muted }]}>\n Question {index + 1} of {total}\n </Text>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel=\"Dismiss\"\n hitSlop={10}\n onPress={onDismiss}\n disabled={disabled}\n style={styles.dismiss}\n >\n <Text style={[styles.dismissMark, { color: palette.muted }]}>×</Text>\n </Pressable>\n </View>\n\n {question.header ? (\n <Text style={[styles.eyebrow, { color: palette.muted }]}>{question.header.toUpperCase()}</Text>\n ) : null}\n <Text style={[styles.title, { color: palette.title }]}>{question.title}</Text>\n {multiSelect ? <Text style={[styles.hint, { color: palette.muted }]}>Pick as many as apply.</Text> : null}\n\n {(question.options ?? []).map((o, i) => {\n const active = selectedLabels.includes(o.label);\n return (\n <Pressable\n key={o.id}\n accessibilityRole=\"button\"\n accessibilityState={{ selected: active, disabled }}\n accessibilityLabel={o.detail ? `${o.label}. ${o.detail}` : o.label}\n disabled={disabled}\n onPress={() => chooseOption(o)}\n style={({ pressed }) => [\n styles.option,\n {\n backgroundColor: active ? `${ACCENT}14` : palette.optionBg,\n borderColor: active ? ACCENT : palette.optionBorder,\n opacity: pressed && !disabled ? 0.75 : 1,\n },\n ]}\n >\n <View style={[styles.indexChip, { backgroundColor: active ? ACCENT : palette.chip }]}>\n <Text style={[styles.indexChipText, { color: active ? '#ffffff' : palette.muted }]}>\n {active && multiSelect ? '✓' : String(i + 1)}\n </Text>\n </View>\n <View style={styles.optionBody}>\n <Text style={[styles.optionLabel, { color: palette.title }]}>{o.label}</Text>\n {o.detail ? (\n <Text style={[styles.optionDetail, { color: palette.muted }]}>{o.detail}</Text>\n ) : null}\n </View>\n </Pressable>\n );\n })}\n\n {allowText ? (\n <TextInput\n ref={inputRef}\n value={textDraft}\n onChangeText={setTextDraft}\n editable={!disabled}\n placeholder={question.textPlaceholder ?? 'Type your answer'}\n placeholderTextColor={palette.muted}\n returnKeyType={isLast ? 'send' : 'next'}\n onSubmitEditing={next}\n style={[\n styles.input,\n {\n backgroundColor: palette.optionBg,\n borderColor: palette.optionBorder,\n color: palette.title,\n },\n ]}\n />\n ) : null}\n\n <View style={styles.actions}>\n {index > 0 ? (\n <Pressable\n accessibilityRole=\"button\"\n onPress={() => {\n if (question && textDraft.trim()) record(textDraft.trim(), false);\n setIndex((i) => i - 1);\n }}\n disabled={disabled}\n style={styles.skip}\n >\n <Text style={[styles.skipText, { color: palette.muted }]}>Previous</Text>\n </Pressable>\n ) : (\n <View />\n )}\n <View style={styles.dots} pointerEvents=\"none\">\n {total > 1\n ? questions.map((q, i) => (\n <View\n key={q.id}\n style={[\n styles.dot,\n i === index ? styles.dotOn : { backgroundColor: palette.optionBorder },\n ]}\n />\n ))\n : null}\n </View>\n <View style={styles.actionRight}>\n <Pressable accessibilityRole=\"button\" onPress={skip} disabled={disabled} style={styles.skip}>\n <Text style={[styles.skipText, { color: palette.muted }]}>Skip</Text>\n </Pressable>\n <Pressable\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: disabled || !currentAnswer }}\n onPress={next}\n disabled={disabled || !currentAnswer}\n style={[\n styles.send,\n { backgroundColor: currentAnswer && !disabled ? ACCENT : palette.optionBorder },\n ]}\n >\n <Text\n style={[styles.sendText, { color: currentAnswer && !disabled ? '#ffffff' : palette.muted }]}\n >\n {isLast ? 'Send' : 'Next'}\n </Text>\n </Pressable>\n </View>\n </View>\n </View>\n );\n});\n\nconst styles = StyleSheet.create({\n card: {\n width: '100%',\n borderWidth: 1,\n borderRadius: 16,\n padding: 14,\n marginTop: 4,\n marginBottom: 8,\n },\n header: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' },\n kicker: { fontSize: 10.5, fontWeight: '600', letterSpacing: 1.2, textTransform: 'uppercase' },\n dismiss: { padding: 4, minWidth: 32, minHeight: 32, alignItems: 'center', justifyContent: 'center' },\n dismissMark: { fontSize: 22, lineHeight: 24, fontWeight: '400' },\n eyebrow: { fontSize: 11, fontWeight: '600', letterSpacing: 1, marginTop: 6 },\n title: { fontSize: 15.5, fontWeight: '700', lineHeight: 21, marginTop: 4, marginBottom: 4 },\n hint: { fontSize: 12, marginBottom: 6 },\n option: {\n flexDirection: 'row',\n alignItems: 'center',\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 10,\n paddingVertical: 10,\n marginTop: 6,\n minHeight: 44,\n gap: 10,\n },\n indexChip: {\n width: 24,\n height: 24,\n borderRadius: 6,\n alignItems: 'center',\n justifyContent: 'center',\n },\n indexChipText: { fontSize: 11, fontWeight: '700' },\n optionBody: { flex: 1 },\n optionLabel: { fontSize: 13.5, fontWeight: '600' },\n optionDetail: { fontSize: 12, marginTop: 2, lineHeight: 16 },\n input: {\n borderWidth: 1,\n borderRadius: 12,\n paddingHorizontal: 12,\n paddingVertical: 10,\n marginTop: 10,\n fontSize: 14,\n minHeight: 44,\n },\n actions: {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n marginTop: 8,\n gap: 8,\n },\n dots: { flexDirection: 'row', alignItems: 'center', gap: 5, flex: 1, justifyContent: 'center' },\n dot: { width: 6, height: 6, borderRadius: 3 },\n dotOn: { width: 16, backgroundColor: ACCENT },\n actionRight: { flexDirection: 'row', alignItems: 'center' },\n skip: { paddingHorizontal: 12, paddingVertical: 10, minHeight: 44, justifyContent: 'center' },\n skipText: { fontSize: 13, fontWeight: '600' },\n send: {\n paddingHorizontal: 16,\n paddingVertical: 10,\n borderRadius: 12,\n minHeight: 44,\n justifyContent: 'center',\n },\n sendText: { fontSize: 14, fontWeight: '700' },\n});\n"],"names":["AskUserCard","_a","_b","next"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,MAAM,MAAS,GAAA,SAAA;AACF,MAAA,WAAA,GAAc,IAAK,CAAA,SAASA,YAAY,CAAA;AAAA,EACnD,OAAA;AAAA,EACA,MAAS,GAAA,KAAA;AAAA,EACT,QAAW,GAAA,KAAA;AAAA,EACX,QAAA;AAAA,EACA;AACF,CAMG,EAAA;AA1BH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA2BE,EAAA,MAAM,YAAY,OAAQ,CAAA,SAAA;AAC1B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAS,CAAC,CAAA;AACpC,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAiC,EAAE,CAAA;AACjE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,EAAE,CAAA;AAC7C,EAAM,MAAA,QAAA,GAAW,OAAkB,IAAI,CAAA;AACvC,EAAA,MAAM,QAAQ,SAAU,CAAA,MAAA;AACxB,EAAM,MAAA,QAAA,GAAW,SAAU,CAAA,IAAA,CAAK,GAAI,CAAA,KAAA,EAAO,IAAK,CAAA,GAAA,CAAI,KAAQ,GAAA,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAClE,EAAM,MAAA,MAAA,GAAS,SAAS,KAAQ,GAAA,CAAA;AAChC,EAAM,MAAA,SAAA,GAAA,CAAY,qCAAU,SAAc,MAAA,KAAA;AAC1C,EAAM,MAAA,WAAA,GAAA,CAAc,qCAAU,WAAgB,MAAA,IAAA;AAC9C,EAAM,MAAA,OAAA,GAAU,QAAQ,OAAO;AAAA,IAC7B,IAAA,EAAM,SAAS,SAAY,GAAA,SAAA;AAAA,IAC3B,MAAA,EAAQ,SAAS,SAAY,GAAA,SAAA;AAAA,IAC7B,KAAA,EAAO,SAAS,SAAY,GAAA,SAAA;AAAA,IAC5B,KAAA,EAAO,SAAS,SAAY,GAAA,SAAA;AAAA,IAC5B,QAAA,EAAU,SAAS,SAAY,GAAA,SAAA;AAAA,IAC/B,YAAA,EAAc,SAAS,SAAY,GAAA,SAAA;AAAA,IACnC,IAAA,EAAM,SAAS,SAAY,GAAA,SAAA;AAAA,IAC3B,MAAQ,EAAA;AAAA,GACV,CAAA,EAAI,CAAC,MAAM,CAAC,CAAA;AACZ,EAAM,MAAA,cAAA,GAAiB,QAAQ,MAAM;AA/CvC,IAAA,IAAAC,GAAAC,EAAAA,GAAAA;AAgDI,IAAM,MAAA,GAAA,GAAA,CAAMA,GAAA,GAAA,OAAA,CAAA,CAAQD,GAAA,GAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAU,EAAV,KAAA,IAAA,GAAAA,GAAgB,GAAA,EAAE,CAA1B,KAAA,IAAA,GAAAC,GAA+B,GAAA,EAAA;AAC3C,IAAA,IAAI,CAAC,GAAA,CAAI,IAAK,EAAA,SAAU,EAAC;AACzB,IAAA,IAAI,CAAC,WAAA,EAAoB,OAAA,CAAC,GAAG,CAAA;AAC7B,IAAO,OAAA,GAAA,CAAI,KAAM,CAAA,GAAG,CAAE,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,IAAK,EAAC,CAAE,CAAA,MAAA,CAAO,OAAO,CAAA;AAAA,GACtD,EAAA,CAAC,OAAS,EAAA,QAAA,EAAU,WAAW,CAAC,CAAA;AACnC,EAAM,MAAA,iBAAA,GAAoB,OAAsB,IAAI,CAAA;AACpD,EAAA,SAAA,CAAU,MAAM;AAtDlB,IAAAD,IAAAA,GAAAA;AAuDI,IAAM,MAAA,CAAA,GAAI,UAAU,KAAK,CAAA;AACzB,IAAA,IAAI,CAAC,CAAA,IAAK,iBAAkB,CAAA,OAAA,KAAY,EAAE,EAAI,EAAA;AAC9C,IAAA,iBAAA,CAAkB,UAAU,CAAE,CAAA,EAAA;AAC9B,IAAA,MAAM,YAAWA,GAAA,GAAA,OAAA,CAAQ,EAAE,EAAE,CAAA,KAAZ,OAAAA,GAAiB,GAAA,EAAA;AAClC,IAAA,MAAM,KAAQ,GAAA,CAAA,CAAE,WAAc,GAAA,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,GAAI,CAAA,CAAA,CAAA,KAAK,CAAE,CAAA,IAAA,EAAM,CAAA,GAAI,CAAC,QAAQ,CAAA;AAChF,IAAA,MAAM,cAAiB,GAAA,QAAA,KAAa,EAAM,IAAA,KAAA,CAAM,MAAM,CAAK,IAAA,KAAA;AA5D/D,MAAAA,IAAAA,GAAAA;AA4DkE,MAAAA,OAAAA,CAAAA,GAAAA,GAAA,EAAE,OAAF,KAAA,IAAA,GAAA,MAAA,GAAAA,IAAW,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,KAAU,KAAA,IAAA,CAAA;AAAA,KAAK,CAAA;AACpG,IAAa,YAAA,CAAA,cAAA,GAAiB,KAAK,QAAQ,CAAA;AAAA,GAG1C,EAAA,CAAC,KAAO,EAAA,SAAS,CAAC,CAAA;AACrB,EAAM,MAAA,MAAA,GAAS,CAAC,KAAA,EAAe,OAAqB,KAAA;AAClD,IAAA,IAAI,CAAC,QAAU,EAAA;AACf,IAAW,UAAA,CAAA,CAAA,IAAA,KAAS,iCACf,IADe,CAAA,EAAA;AAAA,MAElB,CAAC,QAAS,CAAA,EAAE,GAAG;AAAA,KACf,CAAA,CAAA;AACF,IAAA,IAAI,CAAC,OAAS,EAAA;AACd,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,MAAM,SAAY,GAAA,oBAAA,CAAqB,SAAW,EAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EAC7C,OAD6C,CAAA,EAAA;AAAA,QAEhD,CAAC,QAAS,CAAA,EAAE,GAAG;AAAA,OAChB,CAAA,CAAA;AACD,MAAI,IAAA,SAAA,WAAoB,SAAS,CAAA;AAAA,WAAiB,SAAA,EAAA;AAAA,KAC7C,MAAA;AACL,MAAS,QAAA,CAAA,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AAAA;AACrB,GACF;AACA,EAAM,MAAA,YAAA,GAAe,CAAC,MAGhB,KAAA;AArFR,IAAAA,IAAAA,GAAAA;AAsFI,IAAI,IAAA,CAAC,YAAY,QAAU,EAAA;AAC3B,IAAA,IAAI,OAAO,KAAO,EAAA;AAChB,MAAA,CAAAA,GAAA,GAAA,QAAA,CAAS,OAAT,KAAA,IAAA,GAAA,MAAA,GAAAA,GAAkB,CAAA,KAAA,EAAA;AAClB,MAAA;AAAA;AAEF,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,MAAME,QAAO,cAAe,CAAA,QAAA,CAAS,MAAO,CAAA,KAAK,IAAI,cAAe,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,OAAO,KAAK,CAAA,GAAI,CAAC,GAAG,cAAA,EAAgB,OAAO,KAAK,CAAA;AACtI,MAAA,MAAA,CAAOA,KAAK,CAAA,IAAA,CAAK,IAAI,CAAA,EAAG,KAAK,CAAA;AAC7B,MAAA;AAAA;AAEF,IAAO,MAAA,CAAA,MAAA,CAAO,OAAO,IAAI,CAAA;AAAA,GAC3B;AACA,EAAM,MAAA,aAAA,GAAgB,UAAU,IAAK,EAAA,IAAK,SAAQ,EAAU,GAAA,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAA,EAAA,KAAV,IAAgB,GAAA,EAAA,GAAA,EAAE,CAAK,IAAA,EAAA;AACzE,EAAA,MAAM,OAAO,MAAM;AACjB,IAAI,IAAA,QAAA,IAAY,CAAC,aAAe,EAAA;AAChC,IAAA,MAAA,CAAO,eAAe,IAAI,CAAA;AAAA,GAC5B;AACA,EAAA,MAAM,OAAO,MAAM;AAvGrB,IAAAF,IAAAA,GAAAA;AAwGI,IAAI,IAAA,QAAA,IAAY,CAAC,QAAU,EAAA;AAC3B,IAAA,UAAA,CAAW,CAAQ,IAAA,KAAA;AAzGvB,MAAAA,IAAAA,GAAAA;AA0GM,MAAA,MAGIC,MAAA,IAFD,EAAA;AAAA,QA3GT,CA2GSD,GAAA,GAAA,QAAA,CAAS,EAAK,GAAA;AAAA,OA3GvB,GA6GUC,GADC,EAAA,IAAA,GAAA,SAAA,CACDA,GADC,EAAA;AAAA,QADF,SAAAD,CAAAA,GAAAA;AAAA,OAAA,CAAA;AAGH,MAAO,OAAA,IAAA;AAAA,KACR,CAAA;AACD,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,MAGIC,MAAA,OAFD,EAAA;AAAA,QAlHT,CAkHSD,GAAA,GAAA,QAAA,CAAS,EAAK,GAAA;AAAA,OAlHvB,GAoHUC,GADC,EAAA,IAAA,GAAA,SAAA,CACDA,GADC,EAAA;AAAA,QADF,SAAAD,CAAAA,GAAAA;AAAA,OAAA,CAAA;AAGH,MAAM,MAAA,SAAA,GAAY,oBAAqB,CAAA,SAAA,EAAW,IAAI,CAAA;AACtD,MAAI,IAAA,SAAA,WAAoB,SAAS,CAAA;AAAA,WAAiB,SAAA,EAAA;AAAA,KAC7C,MAAA;AACL,MAAS,QAAA,CAAA,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AAAA;AACrB,GACF;AACA,EAAI,IAAA,CAAC,UAAiB,OAAA,IAAA;AACtB,EAAA,uBAAQ,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,IAChC,iBAAiB,OAAQ,CAAA,IAAA;AAAA,IACzB,aAAa,OAAQ,CAAA;AAAA,GACtB,CACS,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,MAChB,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,MAAQ,EAAA;AAAA,QACrC,OAAO,OAAQ,CAAA;AAAA,OAChB,CAAG,EAAA,QAAA,EAAA;AAAA,QAAA,WAAA;AAAA,QACoB,KAAQ,GAAA,CAAA;AAAA,QAAE,MAAA;AAAA,QAAK;AAAA,OAC7B,EAAA,CAAA;AAAA,0BACC,SAAU,EAAA,EAAA,iBAAA,EAAkB,UAAS,kBAAmB,EAAA,SAAA,EAAU,SAAS,EAAI,EAAA,OAAA,EAAS,WAAW,QAAoB,EAAA,KAAA,EAAO,OAAO,OAClI,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,WAAa,EAAA;AAAA,QAC5C,OAAO,OAAQ,CAAA;AAAA,OAChB,CAAG,EAAA,QAAA,EAAA,MAAA,EAAC,CACG,EAAA;AAAA,KACJ,EAAA,CAAA;AAAA,IAEC,SAAS,MAAS,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,OAAS,EAAA;AAAA,MACvD,OAAO,OAAQ,CAAA;AAAA,KAChB,CAAI,EAAA,QAAA,EAAA,QAAA,CAAS,MAAO,CAAA,WAAA,IAAc,CAAU,GAAA,IAAA;AAAA,oBACpC,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,MAClC,OAAO,OAAQ,CAAA;AAAA,KAChB,CAAI,EAAA,QAAA,EAAA,QAAA,CAAS,KAAM,EAAA,CAAA;AAAA,IACX,8BAAe,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,IAAM,EAAA;AAAA,MAChD,OAAO,OAAQ,CAAA;AAAA,KAChB,CAAG,EAAA,QAAA,EAAA,wBAAA,EAAsB,CAAU,GAAA,IAAA;AAAA,IAE1B,CAAA,CAAA,EAAA,GAAA,QAAA,CAAS,YAAT,IAAoB,GAAA,EAAA,GAAA,IAAI,GAAI,CAAA,CAAC,GAAG,CAAM,KAAA;AAC9C,MAAA,MAAM,MAAS,GAAA,cAAA,CAAe,QAAS,CAAA,CAAA,CAAE,KAAK,CAAA;AAC9C,MAAA,uBAAQ,IAAA,CAAA,SAAA,EAAA,EAAqB,iBAAkB,EAAA,QAAA,EAAS,kBAAoB,EAAA;AAAA,QAC1E,QAAU,EAAA,MAAA;AAAA,QACV;AAAA,OACF,EAAG,oBAAoB,CAAE,CAAA,MAAA,GAAS,GAAG,CAAE,CAAA,KAAK,KAAK,CAAE,CAAA,MAAM,KAAK,CAAE,CAAA,KAAA,EAAO,UAAoB,OAAS,EAAA,MAAM,aAAa,CAAC,CAAA,EAAG,OAAO,CAAC;AAAA,QACjI;AAAA,OACF,KAAM,CAAC,MAAA,CAAO,MAAQ,EAAA;AAAA,QACpB,eAAiB,EAAA,MAAA,GAAS,CAAG,EAAA,MAAM,OAAO,OAAQ,CAAA,QAAA;AAAA,QAClD,WAAA,EAAa,MAAS,GAAA,MAAA,GAAS,OAAQ,CAAA,YAAA;AAAA,QACvC,OAAS,EAAA,OAAA,IAAW,CAAC,QAAA,GAAW,IAAO,GAAA;AAAA,OACxC,CACiB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,SAAW,EAAA;AAAA,UAC9C,eAAA,EAAiB,MAAS,GAAA,MAAA,GAAS,OAAQ,CAAA;AAAA,SAC5C,CACmB,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,aAAe,EAAA;AAAA,UACpD,KAAA,EAAO,MAAS,GAAA,SAAA,GAAY,OAAQ,CAAA;AAAA,SACrC,GACsB,QAAU,EAAA,MAAA,IAAA,WAAA,GAAc,WAAM,MAAO,CAAA,CAAA,GAAI,CAAC,CAAA,EAC/C,CACJ,EAAA,CAAA;AAAA,wBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,UAChB,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,WAAa,EAAA;AAAA,YAClD,OAAO,OAAQ,CAAA;AAAA,WAChB,CAAI,EAAA,QAAA,EAAA,CAAA,CAAE,KAAM,EAAA,CAAA;AAAA,UACM,EAAE,MAAS,mBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,YAAc,EAAA;AAAA,YAC/D,OAAO,OAAQ,CAAA;AAAA,WAChB,CAAA,EAAI,QAAE,EAAA,CAAA,CAAA,MAAA,EAAO,CAAU,GAAA;AAAA,SACV,EAAA;AAAA,OAAA,EAAA,EA1BK,EAAE,EA2BX,CAAA;AAAA,KACf,CAAA;AAAA,IAEQ,SAAY,mBAAA,GAAA,CAAC,SAAU,EAAA,EAAA,GAAA,EAAK,QAAU,EAAA,KAAA,EAAO,SAAW,EAAA,YAAA,EAAc,YAAc,EAAA,QAAA,EAAU,CAAC,QAAA,EAAU,WAAa,EAAA,CAAA,EAAA,GAAA,QAAA,CAAS,eAAT,KAAA,IAAA,GAAA,EAAA,GAA4B,kBAAoB,EAAA,oBAAA,EAAsB,OAAQ,CAAA,KAAA,EAAO,aAAe,EAAA,MAAA,GAAS,MAAS,GAAA,MAAA,EAAQ,eAAiB,EAAA,IAAA,EAAM,KAAO,EAAA,CAAC,OAAO,KAAO,EAAA;AAAA,MACxS,iBAAiB,OAAQ,CAAA,QAAA;AAAA,MACzB,aAAa,OAAQ,CAAA,YAAA;AAAA,MACrB,OAAO,OAAQ,CAAA;AAAA,KAChB,GAAG,CAAK,GAAA,IAAA;AAAA,oBAEA,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,OACf,EAAA,QAAA,EAAA;AAAA,MAAA,KAAA,GAAQ,oBAAK,GAAA,CAAA,SAAA,EAAA,EAAU,iBAAkB,EAAA,QAAA,EAAS,SAAS,MAAM;AAC1E,QAAI,IAAA,QAAA,IAAY,UAAU,IAAK,EAAA,SAAU,SAAU,CAAA,IAAA,IAAQ,KAAK,CAAA;AAChE,QAAS,QAAA,CAAA,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AAAA,OACrB,EAAG,QAAoB,EAAA,KAAA,EAAO,MAAO,CAAA,IAAA,EACnB,8BAAC,IAAK,EAAA,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,QAAU,EAAA;AAAA,QAC7C,OAAO,OAAQ,CAAA;AAAA,OAChB,CAAG,EAAA,QAAA,EAAA,UAAA,EAAQ,CACA,EAAA,CAAA,uBAAgB,IAAK,EAAA,EAAA,CAAA;AAAA,sBACzB,GAAA,CAAC,QAAK,KAAO,EAAA,MAAA,CAAO,MAAM,aAAc,EAAA,MAAA,EACnC,QAAQ,EAAA,KAAA,GAAA,CAAA,GAAI,SAAU,CAAA,GAAA,CAAI,CAAC,CAAG,EAAA,CAAA,qBAAO,GAAA,CAAA,IAAA,EAAA,EAAgB,KAAO,EAAA,CAAC,OAAO,GAAK,EAAA,CAAA,KAAM,KAAQ,GAAA,MAAA,CAAO,KAAQ,GAAA;AAAA,QACjH,iBAAiB,OAAQ,CAAA;AAAA,OAC1B,CAF2D,EAAA,EAAA,CAAA,CAAE,EAE1D,CAAE,IAAI,IACF,EAAA,CAAA;AAAA,sBACC,IAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,MAAA,CAAO,WAChB,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,SAAU,EAAA,EAAA,iBAAA,EAAkB,QAAS,EAAA,OAAA,EAAS,MAAM,QAAoB,EAAA,KAAA,EAAO,MAAO,CAAA,IAAA,EACnF,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,UAC3C,OAAO,OAAQ,CAAA;AAAA,SAChB,CAAG,EAAA,QAAA,EAAA,MAAA,EAAI,CACE,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,SAAA,EAAA,EAAU,iBAAkB,EAAA,QAAA,EAAS,kBAAoB,EAAA;AAAA,UACpE,QAAA,EAAU,YAAY,CAAC;AAAA,SACzB,EAAG,OAAS,EAAA,IAAA,EAAM,QAAU,EAAA,QAAA,IAAY,CAAC,aAAe,EAAA,KAAA,EAAO,CAAC,MAAA,CAAO,IAAM,EAAA;AAAA,UAC3E,eAAiB,EAAA,aAAA,IAAiB,CAAC,QAAA,GAAW,SAAS,OAAQ,CAAA;AAAA,SAChE,CACe,EAAA,QAAA,kBAAA,GAAA,CAAC,QAAK,KAAO,EAAA,CAAC,OAAO,QAAU,EAAA;AAAA,UAC3C,KAAO,EAAA,aAAA,IAAiB,CAAC,QAAA,GAAW,YAAY,OAAQ,CAAA;AAAA,SACzD,CAAA,EACkB,QAAS,EAAA,MAAA,GAAA,MAAA,GAAS,QACvB,CACJ,EAAA;AAAA,OACJ,EAAA;AAAA,KACJ,EAAA;AAAA,GACJ,EAAA,CAAA;AACR,CAAC;AACD,MAAM,MAAA,GAAS,WAAW,MAAO,CAAA;AAAA,EAC/B,IAAM,EAAA;AAAA,IACJ,KAAO,EAAA,MAAA;AAAA,IACP,WAAa,EAAA,CAAA;AAAA,IACb,YAAc,EAAA,EAAA;AAAA,IACd,OAAS,EAAA,EAAA;AAAA,IACT,SAAW,EAAA,CAAA;AAAA,IACX,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,aAAe,EAAA,GAAA;AAAA,IACf,aAAe,EAAA;AAAA,GACjB;AAAA,EACA,OAAS,EAAA;AAAA,IACP,OAAS,EAAA,CAAA;AAAA,IACT,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,EAAA;AAAA,IACX,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,EAAA;AAAA,IACZ,UAAY,EAAA;AAAA,GACd;AAAA,EACA,OAAS,EAAA;AAAA,IACP,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,aAAe,EAAA,CAAA;AAAA,IACf,SAAW,EAAA;AAAA,GACb;AAAA,EACA,KAAO,EAAA;AAAA,IACL,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAA,KAAA;AAAA,IACZ,UAAY,EAAA,EAAA;AAAA,IACZ,SAAW,EAAA,CAAA;AAAA,IACX,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA,EAAA;AAAA,IACV,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,WAAa,EAAA,CAAA;AAAA,IACb,YAAc,EAAA,EAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,SAAW,EAAA,CAAA;AAAA,IACX,SAAW,EAAA,EAAA;AAAA,IACX,GAAK,EAAA;AAAA,GACP;AAAA,EACA,SAAW,EAAA;AAAA,IACT,KAAO,EAAA,EAAA;AAAA,IACP,MAAQ,EAAA,EAAA;AAAA,IACR,YAAc,EAAA,CAAA;AAAA,IACd,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,aAAe,EAAA;AAAA,IACb,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,UAAY,EAAA;AAAA,IACV,IAAM,EAAA;AAAA,GACR;AAAA,EACA,WAAa,EAAA;AAAA,IACX,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA,CAAA;AAAA,IACX,UAAY,EAAA;AAAA,GACd;AAAA,EACA,KAAO,EAAA;AAAA,IACL,WAAa,EAAA,CAAA;AAAA,IACb,YAAc,EAAA,EAAA;AAAA,IACd,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,SAAW,EAAA,EAAA;AAAA,IACX,QAAU,EAAA,EAAA;AAAA,IACV,SAAW,EAAA;AAAA,GACb;AAAA,EACA,OAAS,EAAA;AAAA,IACP,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,eAAA;AAAA,IAChB,SAAW,EAAA,CAAA;AAAA,IACX,GAAK,EAAA;AAAA,GACP;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,GAAK,EAAA,CAAA;AAAA,IACL,IAAM,EAAA,CAAA;AAAA,IACN,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,GAAK,EAAA;AAAA,IACH,KAAO,EAAA,CAAA;AAAA,IACP,MAAQ,EAAA,CAAA;AAAA,IACR,YAAc,EAAA;AAAA,GAChB;AAAA,EACA,KAAO,EAAA;AAAA,IACL,KAAO,EAAA,EAAA;AAAA,IACP,eAAiB,EAAA;AAAA,GACnB;AAAA,EACA,WAAa,EAAA;AAAA,IACX,aAAe,EAAA,KAAA;AAAA,IACf,UAAY,EAAA;AAAA,GACd;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,SAAW,EAAA,EAAA;AAAA,IACX,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA,GACd;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,iBAAmB,EAAA,EAAA;AAAA,IACnB,eAAiB,EAAA,EAAA;AAAA,IACjB,YAAc,EAAA,EAAA;AAAA,IACd,SAAW,EAAA,EAAA;AAAA,IACX,cAAgB,EAAA;AAAA,GAClB;AAAA,EACA,QAAU,EAAA;AAAA,IACR,QAAU,EAAA,EAAA;AAAA,IACV,UAAY,EAAA;AAAA;AAEhB,CAAC,CAAA"}