@iann29/rastro 0.10.8 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/agent/integration.md +45 -0
- package/agent/manifest.json +4 -4
- package/dist/client/federation.d.ts +82 -9
- package/dist/client/federation.d.ts.map +1 -1
- package/dist/client/federation.js +40 -2
- package/dist/client/federation.js.map +1 -1
- package/dist/client/index.d.ts +464 -8
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +259 -7
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/api.d.ts +10 -0
- package/dist/component/_generated/api.d.ts.map +1 -1
- package/dist/component/_generated/api.js.map +1 -1
- package/dist/component/_generated/component.d.ts +273 -21
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/_generated/server.d.ts +2 -0
- package/dist/component/_generated/server.d.ts.map +1 -1
- package/dist/component/_generated/server.js.map +1 -1
- package/dist/component/constants.d.ts +31 -0
- package/dist/component/constants.d.ts.map +1 -1
- package/dist/component/constants.js +31 -0
- package/dist/component/constants.js.map +1 -1
- package/dist/component/convex.config.d.ts +2 -0
- package/dist/component/convex.config.js +7 -0
- package/dist/component/convex.config.js.map +1 -1
- package/dist/component/errors.d.ts +1 -1
- package/dist/component/errors.d.ts.map +1 -1
- package/dist/component/errors.js.map +1 -1
- package/dist/component/http.d.ts.map +1 -1
- package/dist/component/http.js +64 -0
- package/dist/component/http.js.map +1 -1
- package/dist/component/leadAdsValidators.d.ts +1092 -0
- package/dist/component/leadAdsValidators.d.ts.map +1 -0
- package/dist/component/leadAdsValidators.js +304 -0
- package/dist/component/leadAdsValidators.js.map +1 -0
- package/dist/component/leadFormRules.d.ts +60 -0
- package/dist/component/leadFormRules.d.ts.map +1 -0
- package/dist/component/leadFormRules.js +140 -0
- package/dist/component/leadFormRules.js.map +1 -0
- package/dist/component/leadFormStore.d.ts +16 -0
- package/dist/component/leadFormStore.d.ts.map +1 -0
- package/dist/component/leadFormStore.js +92 -0
- package/dist/component/leadFormStore.js.map +1 -0
- package/dist/component/leadgenToken.d.ts +56 -0
- package/dist/component/leadgenToken.d.ts.map +1 -0
- package/dist/component/leadgenToken.js +262 -0
- package/dist/component/leadgenToken.js.map +1 -0
- package/dist/component/leads.d.ts +76 -7
- package/dist/component/leads.d.ts.map +1 -1
- package/dist/component/leads.js +112 -78
- package/dist/component/leads.js.map +1 -1
- package/dist/component/meta.d.ts.map +1 -1
- package/dist/component/meta.js +21 -1
- package/dist/component/meta.js.map +1 -1
- package/dist/component/metaCapi.d.ts.map +1 -1
- package/dist/component/metaCapi.js +10 -0
- package/dist/component/metaCapi.js.map +1 -1
- package/dist/component/metaFake.d.ts +44 -0
- package/dist/component/metaFake.d.ts.map +1 -1
- package/dist/component/metaFake.js +400 -1
- package/dist/component/metaFake.js.map +1 -1
- package/dist/component/metaGraph.d.ts +91 -0
- package/dist/component/metaGraph.d.ts.map +1 -1
- package/dist/component/metaGraph.js +217 -0
- package/dist/component/metaGraph.js.map +1 -1
- package/dist/component/metaLeads.d.ts +681 -0
- package/dist/component/metaLeads.d.ts.map +1 -0
- package/dist/component/metaLeads.js +2634 -0
- package/dist/component/metaLeads.js.map +1 -0
- package/dist/component/schema.d.ts +414 -5
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +169 -1
- package/dist/component/schema.js.map +1 -1
- package/dist/component/validators.d.ts +235 -11
- package/dist/component/validators.d.ts.map +1 -1
- package/dist/component/validators.js +14 -1
- package/dist/component/validators.js.map +1 -1
- package/dist/tracker/generated.d.ts +1 -1
- package/dist/tracker/generated.js +1 -1
- package/dist/ui/campaigns/CampaignsView.d.ts +5 -1
- package/dist/ui/campaigns/CampaignsView.d.ts.map +1 -1
- package/dist/ui/campaigns/CampaignsView.js.map +1 -1
- package/dist/ui/campaigns/Drawer.d.ts.map +1 -1
- package/dist/ui/campaigns/Drawer.js +8 -26
- package/dist/ui/campaigns/Drawer.js.map +1 -1
- package/dist/ui/campaigns/labels.d.ts +29 -1
- package/dist/ui/campaigns/labels.d.ts.map +1 -1
- package/dist/ui/campaigns/labels.js +77 -2
- package/dist/ui/campaigns/labels.js.map +1 -1
- package/dist/ui/campaigns/model.js +2 -2
- package/dist/ui/campaigns/model.js.map +1 -1
- package/dist/ui/forms/FirstContact.d.ts +19 -0
- package/dist/ui/forms/FirstContact.d.ts.map +1 -0
- package/dist/ui/forms/FirstContact.js +81 -0
- package/dist/ui/forms/FirstContact.js.map +1 -0
- package/dist/ui/forms/FormLead.d.ts +28 -0
- package/dist/ui/forms/FormLead.d.ts.map +1 -0
- package/dist/ui/forms/FormLead.js +199 -0
- package/dist/ui/forms/FormLead.js.map +1 -0
- package/dist/ui/forms/FormRulesDrawer.d.ts +49 -0
- package/dist/ui/forms/FormRulesDrawer.d.ts.map +1 -0
- package/dist/ui/forms/FormRulesDrawer.js +149 -0
- package/dist/ui/forms/FormRulesDrawer.js.map +1 -0
- package/dist/ui/forms/FormsView.d.ts +10 -0
- package/dist/ui/forms/FormsView.d.ts.map +1 -0
- package/dist/ui/forms/FormsView.js +215 -0
- package/dist/ui/forms/FormsView.js.map +1 -0
- package/dist/ui/forms/Icons.d.ts +46 -0
- package/dist/ui/forms/Icons.d.ts.map +1 -0
- package/dist/ui/forms/Icons.js +45 -0
- package/dist/ui/forms/Icons.js.map +1 -0
- package/dist/ui/forms/RuleRow.d.ts +37 -0
- package/dist/ui/forms/RuleRow.d.ts.map +1 -0
- package/dist/ui/forms/RuleRow.js +80 -0
- package/dist/ui/forms/RuleRow.js.map +1 -0
- package/dist/ui/forms/WhatsAppButtonGuide.d.ts +33 -0
- package/dist/ui/forms/WhatsAppButtonGuide.d.ts.map +1 -0
- package/dist/ui/forms/WhatsAppButtonGuide.js +90 -0
- package/dist/ui/forms/WhatsAppButtonGuide.js.map +1 -0
- package/dist/ui/forms/index.d.ts +11 -0
- package/dist/ui/forms/index.d.ts.map +1 -0
- package/dist/ui/forms/index.js +7 -0
- package/dist/ui/forms/index.js.map +1 -0
- package/dist/ui/forms/journey.d.ts +19 -0
- package/dist/ui/forms/journey.d.ts.map +1 -0
- package/dist/ui/forms/journey.js +54 -0
- package/dist/ui/forms/journey.js.map +1 -0
- package/dist/ui/forms/model.d.ts +239 -0
- package/dist/ui/forms/model.d.ts.map +1 -0
- package/dist/ui/forms/model.js +556 -0
- package/dist/ui/forms/model.js.map +1 -0
- package/dist/ui/forms/sample.d.ts +36 -0
- package/dist/ui/forms/sample.d.ts.map +1 -0
- package/dist/ui/forms/sample.js +444 -0
- package/dist/ui/forms/sample.js.map +1 -0
- package/dist/ui/forms/types.d.ts +454 -0
- package/dist/ui/forms/types.d.ts.map +1 -0
- package/dist/ui/forms/types.js +2 -0
- package/dist/ui/forms/types.js.map +1 -0
- package/dist/ui/index.d.ts +2 -0
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +4 -0
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/integrations/Overlay.d.ts +3 -1
- package/dist/ui/integrations/Overlay.d.ts.map +1 -1
- package/dist/ui/integrations/Overlay.js +2 -2
- package/dist/ui/integrations/Overlay.js.map +1 -1
- package/dist/ui/portfolio/PortfolioView.d.ts +4 -1
- package/dist/ui/portfolio/PortfolioView.d.ts.map +1 -1
- package/dist/ui/portfolio/PortfolioView.js.map +1 -1
- package/dist/ui/sample.d.ts +3 -1
- package/dist/ui/sample.d.ts.map +1 -1
- package/dist/ui/sample.js +2 -0
- package/dist/ui/sample.js.map +1 -1
- package/dist/ui/seed.d.ts +1 -1
- package/dist/ui/ui.css +2301 -0
- package/docs/federation.md +19 -0
- package/docs/meta-ads.md +713 -7
- package/docs/upgrading.md +75 -0
- package/llms.txt +1 -0
- package/package.json +1 -1
- package/src/component/_generated/api.ts +10 -0
- package/src/component/_generated/component.ts +289 -20
- package/src/component/_generated/server.ts +2 -0
- package/src/component/constants.ts +33 -0
- package/src/component/convex.config.ts +7 -0
- package/src/component/errors.ts +3 -1
- package/src/component/http.ts +75 -0
- package/src/component/leadAdsValidators.ts +365 -0
- package/src/component/leadFormRules.ts +202 -0
- package/src/component/leadFormStore.ts +129 -0
- package/src/component/leadgenToken.ts +348 -0
- package/src/component/leads.ts +136 -84
- package/src/component/meta.ts +21 -1
- package/src/component/metaCapi.ts +13 -1
- package/src/component/metaFake.ts +485 -1
- package/src/component/metaGraph.ts +327 -0
- package/src/component/metaLeads.ts +3101 -0
- package/src/component/schema.ts +187 -1
- package/src/component/validators.ts +17 -1
- package/src/tracker/generated.ts +1 -1
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
const MINUTE_MS = 60_000;
|
|
2
|
+
const HOUR_MS = 60 * MINUTE_MS;
|
|
3
|
+
const DAY_MS = 24 * HOUR_MS;
|
|
4
|
+
const ZONE = "America/Sao_Paulo";
|
|
5
|
+
/** Rules a form holds at most: more than this is a funnel, not a form. */
|
|
6
|
+
export const MAX_FORM_RULES = 20;
|
|
7
|
+
/** Answers one rule names at most, as the host's `setFormRules` takes. */
|
|
8
|
+
export const MAX_RULE_ANSWERS = 30;
|
|
9
|
+
/** The text a discard reason fits in, on the card. */
|
|
10
|
+
export const MAX_DISCARD_REASON = 80;
|
|
11
|
+
/** The suggested first message's length. */
|
|
12
|
+
export const MAX_FIRST_CONTACT_TEXT = 500;
|
|
13
|
+
/** "novo na Meta": created in the last week and never given rules. */
|
|
14
|
+
const NEW_FORM_MS = 7 * DAY_MS;
|
|
15
|
+
/** The first name's variable in the suggested text. */
|
|
16
|
+
export const FIRST_NAME_VARIABLE = "{primeiro_nome}";
|
|
17
|
+
/** The brakes the automatic send starts with (the design's D7). */
|
|
18
|
+
export const DEFAULT_BRAKES = {
|
|
19
|
+
waitMinutes: 15,
|
|
20
|
+
maxPerHour: 10,
|
|
21
|
+
businessHoursOnly: true,
|
|
22
|
+
};
|
|
23
|
+
/** Waiting for the lead to write first never goes under this. */
|
|
24
|
+
export const MIN_WAIT_MINUTES = 15;
|
|
25
|
+
export const WAIT_CHOICES = [15, 30, 60, 120];
|
|
26
|
+
export const PER_HOUR_CHOICES = [5, 10, 20, 30];
|
|
27
|
+
/**
|
|
28
|
+
* The pause between two automatic sends: fixed by the host, shown so the
|
|
29
|
+
* company knows it is there (the contract's brakes have no field for it).
|
|
30
|
+
*/
|
|
31
|
+
export const RANDOM_INTERVAL_LABEL = "entre 45 s e 3 min";
|
|
32
|
+
const clock = new Intl.DateTimeFormat("pt-BR", {
|
|
33
|
+
hour: "numeric",
|
|
34
|
+
minute: "2-digit",
|
|
35
|
+
timeZone: ZONE,
|
|
36
|
+
});
|
|
37
|
+
const dayMonth = new Intl.DateTimeFormat("pt-BR", {
|
|
38
|
+
day: "2-digit",
|
|
39
|
+
month: "2-digit",
|
|
40
|
+
timeZone: ZONE,
|
|
41
|
+
});
|
|
42
|
+
/** "9:02", "14:51", in Brasília time like the rest of the screens. */
|
|
43
|
+
export const clockLabel = (at) => clock.format(at);
|
|
44
|
+
/** "hoje, 14:51", "ontem, 19:10", "12/09". */
|
|
45
|
+
export function dayLabel(at, now, { time = true } = {}) {
|
|
46
|
+
const day = dayMonth.format(at);
|
|
47
|
+
if (day === dayMonth.format(now))
|
|
48
|
+
return `hoje, ${clock.format(at)}`;
|
|
49
|
+
if (day === dayMonth.format(now - DAY_MS))
|
|
50
|
+
return time ? `ontem, ${clock.format(at)}` : "ontem";
|
|
51
|
+
return day;
|
|
52
|
+
}
|
|
53
|
+
/** The form's newest lead: "último há 4 min", "hoje, 9:02", "12/09". */
|
|
54
|
+
export function lastLeadLabel(at, now) {
|
|
55
|
+
if (at == null)
|
|
56
|
+
return null;
|
|
57
|
+
const delta = Math.max(0, now - at);
|
|
58
|
+
if (delta < MINUTE_MS)
|
|
59
|
+
return "último agora";
|
|
60
|
+
if (delta < HOUR_MS)
|
|
61
|
+
return `último há ${Math.floor(delta / MINUTE_MS)} min`;
|
|
62
|
+
return dayLabel(at, now);
|
|
63
|
+
}
|
|
64
|
+
/** "há 3 min", "há 1 h", "há 2 d"; "agora" under a minute. */
|
|
65
|
+
export function waitLabel(since, now) {
|
|
66
|
+
const minutes = Math.max(0, Math.floor((now - since) / MINUTE_MS));
|
|
67
|
+
if (minutes < 1)
|
|
68
|
+
return "agora";
|
|
69
|
+
if (minutes < 60)
|
|
70
|
+
return `há ${minutes} min`;
|
|
71
|
+
const hours = Math.floor(minutes / 60);
|
|
72
|
+
if (hours < 24)
|
|
73
|
+
return `há ${hours} h`;
|
|
74
|
+
return `há ${Math.floor(hours / 24)} d`;
|
|
75
|
+
}
|
|
76
|
+
/** "1 regra", "3 regras". */
|
|
77
|
+
export const plural = (count, one, many) => `${count.toLocaleString("pt-BR")} ${count === 1 ? one : many}`;
|
|
78
|
+
/** The questions a rule can read: the ones with options to choose from. */
|
|
79
|
+
export const choiceQuestions = (form) => form.questions.filter((question) => (question.options?.length ?? 0) > 0);
|
|
80
|
+
const STATUS_LABELS = {
|
|
81
|
+
ACTIVE: "Ativo",
|
|
82
|
+
ARCHIVED: "Arquivado na Meta",
|
|
83
|
+
DELETED: "Apagado na Meta",
|
|
84
|
+
DRAFT: "Rascunho na Meta",
|
|
85
|
+
};
|
|
86
|
+
/** "Ativo", "Arquivado na Meta"; an unknown status stays raw. */
|
|
87
|
+
export const formStatusLabel = (status) => STATUS_LABELS[status] ?? status;
|
|
88
|
+
export const isArchived = (form) => form.status === "ARCHIVED" || form.status === "DELETED";
|
|
89
|
+
/** A board column by key. */
|
|
90
|
+
export const columnOf = (board, key) => key ? board?.columns.find((column) => column.key === key) : undefined;
|
|
91
|
+
/** The columns a rule or the entry can pick: all but the discard column. */
|
|
92
|
+
export const pickableColumns = (board) => (board?.columns ?? []).filter((column) => column.key !== board?.discardColumn);
|
|
93
|
+
/** The neutral dot for a column without color, and the discard's. */
|
|
94
|
+
export const NO_COLOR = "var(--rastro-muted-fg)";
|
|
95
|
+
export const DISCARD_COLOR = "var(--rastro-forms-discard)";
|
|
96
|
+
/**
|
|
97
|
+
* Where a lead goes when no rule matches: the form's entry column, or the
|
|
98
|
+
* board's own door. `door` says it is the board's porta de entrada.
|
|
99
|
+
*/
|
|
100
|
+
export function entryOf(board, entryColumn) {
|
|
101
|
+
const key = entryColumn ?? board?.entryColumn ?? null;
|
|
102
|
+
const column = columnOf(board, key);
|
|
103
|
+
return {
|
|
104
|
+
key,
|
|
105
|
+
name: column?.name ?? "Porta de entrada",
|
|
106
|
+
color: column?.color ?? NO_COLOR,
|
|
107
|
+
door: key === null || key === (board?.entryColumn ?? null),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/** The discard as the board names it: "Descartado" by default. */
|
|
111
|
+
export function discardOf(board) {
|
|
112
|
+
const column = columnOf(board, board?.discardColumn ?? null);
|
|
113
|
+
return {
|
|
114
|
+
name: column?.name ?? "Descartado",
|
|
115
|
+
color: column?.color ?? DISCARD_COLOR,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* What the list shows of a form's rules: the full rules when read (the open
|
|
120
|
+
* drawer's), else the summary `metaForms` carries; undefined while loading,
|
|
121
|
+
* null when unreadable.
|
|
122
|
+
*/
|
|
123
|
+
export function rulesSummaryOf(form, rules) {
|
|
124
|
+
if (rules)
|
|
125
|
+
return {
|
|
126
|
+
configured: rules.configured,
|
|
127
|
+
count: rules.rules.length,
|
|
128
|
+
entryColumn: rules.entryColumn,
|
|
129
|
+
...(rules.own === undefined ? {} : { own: rules.own }),
|
|
130
|
+
};
|
|
131
|
+
return form.rules ?? rules;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* `new` only when the host says the form was never configured; rules still
|
|
135
|
+
* loading (undefined) or unreadable (null) are not read as "no rules".
|
|
136
|
+
*/
|
|
137
|
+
export function formState(form, rules) {
|
|
138
|
+
if (isArchived(form))
|
|
139
|
+
return "archived";
|
|
140
|
+
return rules?.configured === false ? "new" : "active";
|
|
141
|
+
}
|
|
142
|
+
export function buttonState(form, confirmed) {
|
|
143
|
+
if (form.whatsappButton === true)
|
|
144
|
+
return "on";
|
|
145
|
+
if (form.whatsappButton === false)
|
|
146
|
+
return "off";
|
|
147
|
+
return confirmed === true ? "confirmed" : "unknown";
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* The host's `metaForms` (a site's Pages, each with its forms) as the flat
|
|
151
|
+
* rows the screens read: the Page's id on each form, `createdTime` as
|
|
152
|
+
* `createdAt`. Concatenate the sites' answers before passing them.
|
|
153
|
+
*/
|
|
154
|
+
export function metaFormsRows(pages) {
|
|
155
|
+
if (!pages)
|
|
156
|
+
return undefined;
|
|
157
|
+
return pages.flatMap((page) => page.forms.map((form) => ({
|
|
158
|
+
pageId: page.pageId,
|
|
159
|
+
formId: form.formId,
|
|
160
|
+
name: form.name,
|
|
161
|
+
status: form.status,
|
|
162
|
+
questions: form.questions,
|
|
163
|
+
whatsappButton: form.whatsappButton,
|
|
164
|
+
whatsappButtonConfirmed: form.whatsappButtonConfirmed,
|
|
165
|
+
syncedAt: form.syncedAt,
|
|
166
|
+
createdAt: form.createdTime,
|
|
167
|
+
leads30d: form.leads30d,
|
|
168
|
+
daily: form.daily,
|
|
169
|
+
lastLeadAt: form.lastLeadAt,
|
|
170
|
+
rules: form.rules,
|
|
171
|
+
})));
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* A Page's `lastError` as its code: `META_TOKEN_INVALID`, `HANDLER_MISSING`…
|
|
175
|
+
* The component writes the code alone, or the code and a note after a colon
|
|
176
|
+
* (older hosts); either reads the same.
|
|
177
|
+
*/
|
|
178
|
+
export function pageErrorCode(lastError) {
|
|
179
|
+
const text = lastError?.trim();
|
|
180
|
+
if (!text)
|
|
181
|
+
return null;
|
|
182
|
+
return /^([A-Z][A-Z0-9_]*)(?::|$)/u.exec(text)?.[1] ?? "UNKNOWN";
|
|
183
|
+
}
|
|
184
|
+
// META_PERMISSION_MISSING covers both a Page whose leads Meta did not grant
|
|
185
|
+
// and a Page the login no longer lists, so the text asks for both.
|
|
186
|
+
const RECONNECT_TEXT = {
|
|
187
|
+
META_TOKEN_INVALID: "A Meta recusou o acesso a esta Página: os leads novos esperam até reconectar a Meta.",
|
|
188
|
+
META_PERMISSION_MISSING: "A Meta não liberou esta Página: reconecte a Meta marcando a Página e a permissão de leads.",
|
|
189
|
+
};
|
|
190
|
+
const HOST_TEXT = {
|
|
191
|
+
HANDLER_MISSING: "O sistema deste site ainda não tem onde receber leads de formulário: os novos esperam até ele ficar pronto.",
|
|
192
|
+
HANDLER_FAILED: "O sistema deste site recusou um lead de formulário: ele é entregue de novo sozinho.",
|
|
193
|
+
HANDLER_GAVE_UP: "O sistema deste site recusou leads de formulário várias vezes: eles não entraram.",
|
|
194
|
+
SECRETS_KEY_MISSING: "O sistema deste site ainda não guarda a chave da Meta: os leads novos esperam até ele ficar pronto.",
|
|
195
|
+
};
|
|
196
|
+
// Each delay code of the component's `META_PAGE_ERROR_CODES` says what
|
|
197
|
+
// happened in its own words (decision D6); `META_UNAVAILABLE` and an unknown
|
|
198
|
+
// code read the generic text below.
|
|
199
|
+
const DELAY_TEXT = {
|
|
200
|
+
META_TRUNCATED: "Muitos leads chegaram juntos nesta Página: o resto entra na próxima leitura.",
|
|
201
|
+
META_RATE_LIMITED: "A Meta pediu uma pausa nas leituras desta Página: a próxima sai em até uma hora.",
|
|
202
|
+
RUN_TIMEOUT: "A última leitura desta Página não terminou: a próxima continua de onde parou.",
|
|
203
|
+
};
|
|
204
|
+
// Why the dashboard cannot forward a Page's leads at once (`routeIssue`):
|
|
205
|
+
// they still come in with the host's reconciliation.
|
|
206
|
+
const ROUTE_TEXT = {
|
|
207
|
+
HOST_NOT_READY: "O sistema deste site ainda não verifica os leads encaminhados: eles entram a cada 15 minutos.",
|
|
208
|
+
ISSUER_MISMATCH: "O sistema deste site confia em outro painel: os leads entram a cada 15 minutos.",
|
|
209
|
+
AUDIENCE_MISMATCH: "O sistema deste site confia em outro painel: os leads entram a cada 15 minutos.",
|
|
210
|
+
HOST_SITE_URL_MISSING: "Confira a URL HTTP desta conexão: os leads entram a cada 15 minutos.",
|
|
211
|
+
HOST_SITE_URL_UNTRUSTED: "Confira a URL HTTP desta conexão: os leads entram a cada 15 minutos.",
|
|
212
|
+
CONFLICT: "Outra conexão também liga esta Página: os leads entram a cada 15 minutos.",
|
|
213
|
+
HOST_REFUSED: "O sistema deste site recusou o último lead encaminhado: eles entram a cada 15 minutos.",
|
|
214
|
+
};
|
|
215
|
+
/** Whether the dashboard forwards none of the linked Pages' leads at once. */
|
|
216
|
+
export function routeDelayed(pages) {
|
|
217
|
+
return pages.some((page) => page.linkedSiteId !== null && !!page.routeIssue);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* The note a linked Page shows under its name, or null when all is well. A
|
|
221
|
+
* host that says its handler is not ready reads as `HANDLER_MISSING` even
|
|
222
|
+
* before the first reconciliation writes it. The host's own codes come
|
|
223
|
+
* first; a Page whose leads the dashboard cannot forward at once
|
|
224
|
+
* (`routeIssue`) reads as a delay.
|
|
225
|
+
*/
|
|
226
|
+
export function pageIssue(page, productName = "Rastro") {
|
|
227
|
+
const code = pageErrorCode(page.lastError) ??
|
|
228
|
+
(page.handlerReady === false ? "HANDLER_MISSING" : null);
|
|
229
|
+
if (!code) {
|
|
230
|
+
if (!page.routeIssue)
|
|
231
|
+
return null;
|
|
232
|
+
return {
|
|
233
|
+
kind: "delay",
|
|
234
|
+
code: page.routeIssue,
|
|
235
|
+
text: ROUTE_TEXT[page.routeIssue] ??
|
|
236
|
+
`O ${productName} ainda não encaminha os leads deste sistema na hora: eles entram a cada 15 minutos.`,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
const reconnect = RECONNECT_TEXT[code];
|
|
240
|
+
if (reconnect)
|
|
241
|
+
return { kind: "reconnect", code, text: reconnect };
|
|
242
|
+
const host = HOST_TEXT[code];
|
|
243
|
+
if (host)
|
|
244
|
+
return { kind: "host", code, text: host };
|
|
245
|
+
return {
|
|
246
|
+
kind: "delay",
|
|
247
|
+
code,
|
|
248
|
+
text: DELAY_TEXT[code] ??
|
|
249
|
+
`A Meta está lenta para entregar os leads desta Página: o ${productName} tenta de novo sozinho.`,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* The connection's Pages with what the host's `metaForms` says of each linked
|
|
254
|
+
* one: `handlerReady`, and its `lastError` when the Pages read has none. A
|
|
255
|
+
* Pages read that already carries both keeps its own. A Page another owner
|
|
256
|
+
* linked takes no `lastError` from `metaForms`: its link and token are that
|
|
257
|
+
* owner's, and reconnecting this one's Meta fixes nothing (the Pages read
|
|
258
|
+
* hides it for the same reason).
|
|
259
|
+
*/
|
|
260
|
+
export function pagesWithStatus(pages, formsPages) {
|
|
261
|
+
if (!pages)
|
|
262
|
+
return undefined;
|
|
263
|
+
const status = new Map((formsPages ?? []).map((page) => [page.pageId, page]));
|
|
264
|
+
return pages.map((page) => {
|
|
265
|
+
const linked = status.get(page.pageId);
|
|
266
|
+
if (!linked)
|
|
267
|
+
return page;
|
|
268
|
+
return {
|
|
269
|
+
...page,
|
|
270
|
+
lastError: page.lastError ??
|
|
271
|
+
(page.own === false || linked.own === false ? null : linked.lastError),
|
|
272
|
+
handlerReady: page.handlerReady ?? linked.handlerReady,
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
/** The key `formsReport` rows are unique by: the site and the form. */
|
|
277
|
+
export const reportKey = (siteId, formId) => `${siteId}:${formId}`;
|
|
278
|
+
/** A form's row in the report, for the site its Page feeds. */
|
|
279
|
+
export function reportRowOf(report, siteId, formId) {
|
|
280
|
+
if (!siteId)
|
|
281
|
+
return null;
|
|
282
|
+
return (report?.forms.find((row) => row.siteId === siteId && row.formId === formId) ?? null);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Pages in the order Meta lists them, the readable ones first, each with its
|
|
286
|
+
* forms: active ones by leads, then archived ones.
|
|
287
|
+
*/
|
|
288
|
+
export function pageGroups({ sites, pages, forms, report, rules, now, }) {
|
|
289
|
+
// The report counts per (site, form): a Page moved between two sites on
|
|
290
|
+
// screen brings the same form twice. Each row reads its current site's.
|
|
291
|
+
const reportOf = new Map((report?.forms ?? []).map((row) => [
|
|
292
|
+
reportKey(row.siteId, row.formId),
|
|
293
|
+
row,
|
|
294
|
+
]));
|
|
295
|
+
const groups = pages.map((page) => {
|
|
296
|
+
const site = page.linkedOutsideScope
|
|
297
|
+
? null
|
|
298
|
+
: (sites.find((entry) => entry.siteId === page.linkedSiteId) ?? null);
|
|
299
|
+
const rows = forms
|
|
300
|
+
.filter((form) => form.pageId === page.pageId)
|
|
301
|
+
.map((form) => {
|
|
302
|
+
const formRules = rules?.[form.formId];
|
|
303
|
+
const summary = rulesSummaryOf(form, formRules);
|
|
304
|
+
const state = formState(form, summary);
|
|
305
|
+
return {
|
|
306
|
+
form,
|
|
307
|
+
report: site
|
|
308
|
+
? (reportOf.get(reportKey(site.siteId, form.formId)) ?? null)
|
|
309
|
+
: null,
|
|
310
|
+
rules: formRules,
|
|
311
|
+
summary,
|
|
312
|
+
state,
|
|
313
|
+
isNew: state === "new" &&
|
|
314
|
+
form.createdAt != null &&
|
|
315
|
+
now - form.createdAt < NEW_FORM_MS,
|
|
316
|
+
button: buttonState(form, formRules?.whatsappButtonConfirmed ?? form.whatsappButtonConfirmed),
|
|
317
|
+
};
|
|
318
|
+
})
|
|
319
|
+
.sort((a, b) => Number(a.state === "archived") - Number(b.state === "archived") ||
|
|
320
|
+
formLeads(b) - formLeads(a) ||
|
|
321
|
+
a.form.name.localeCompare(b.form.name, "pt-BR"));
|
|
322
|
+
return {
|
|
323
|
+
page,
|
|
324
|
+
site,
|
|
325
|
+
// Taken: by a visible site's neighbour the reader cannot see, or by a
|
|
326
|
+
// site outside the grant the host does not name. Never offered free.
|
|
327
|
+
elsewhere: page.linkedOutsideScope === true ||
|
|
328
|
+
(page.linkedSiteId !== null && site === null),
|
|
329
|
+
rows,
|
|
330
|
+
};
|
|
331
|
+
});
|
|
332
|
+
return groups.sort((a, b) => Number(!a.page.leadsAllowed) - Number(!b.page.leadsAllowed) ||
|
|
333
|
+
Number(!a.site) - Number(!b.site));
|
|
334
|
+
}
|
|
335
|
+
/** A form's leads in 30 days: the report's count, or the host's own. */
|
|
336
|
+
export const formLeads = (row) => row.report?.leads ?? row.form.leads30d ?? 0;
|
|
337
|
+
/** "30 dias: 86 leads · 14 descartados". */
|
|
338
|
+
export function formsSummary(report, forms = []) {
|
|
339
|
+
if (!report)
|
|
340
|
+
return null;
|
|
341
|
+
let leads = 0;
|
|
342
|
+
let discarded = 0;
|
|
343
|
+
let lastLeadAt = null;
|
|
344
|
+
for (const row of report.forms) {
|
|
345
|
+
leads += row.leads;
|
|
346
|
+
for (const entry of row.discarded)
|
|
347
|
+
discarded += entry.leads;
|
|
348
|
+
}
|
|
349
|
+
for (const form of forms)
|
|
350
|
+
if (form.lastLeadAt != null)
|
|
351
|
+
lastLeadAt = Math.max(lastLeadAt ?? 0, form.lastLeadAt);
|
|
352
|
+
return { leads, discarded, lastLeadAt, partial: report.partial };
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* The simulation as the bar draws it: the entry first, then the columns the
|
|
356
|
+
* rules send to (in rule order), the other columns in board order, then the
|
|
357
|
+
* discard (every reason together); empty ones left out.
|
|
358
|
+
*/
|
|
359
|
+
export function simulationSegments(simulation, board, entryColumn, rules = []) {
|
|
360
|
+
const entry = entryOf(board, entryColumn);
|
|
361
|
+
const counts = new Map();
|
|
362
|
+
let placed = 0;
|
|
363
|
+
for (const { column, leads } of simulation.columns) {
|
|
364
|
+
counts.set(column, (counts.get(column) ?? 0) + leads);
|
|
365
|
+
placed += leads;
|
|
366
|
+
}
|
|
367
|
+
for (const { leads } of simulation.discarded)
|
|
368
|
+
placed += leads;
|
|
369
|
+
// The component already counts a named entry column's leads under
|
|
370
|
+
// `columns`; only the leads no column holds (the host's own entry, when
|
|
371
|
+
// the form names none) are added here, so the entry is never counted twice.
|
|
372
|
+
const entryKey = entry.key ?? "__entry";
|
|
373
|
+
const unplaced = Math.max(0, simulation.total - placed);
|
|
374
|
+
if (unplaced > 0)
|
|
375
|
+
counts.set(entryKey, (counts.get(entryKey) ?? 0) + unplaced);
|
|
376
|
+
const order = [
|
|
377
|
+
entryKey,
|
|
378
|
+
...rules.flatMap((rule) => ("column" in rule.to ? [rule.to.column] : [])),
|
|
379
|
+
...(board?.columns ?? []).map((column) => column.key),
|
|
380
|
+
...counts.keys(),
|
|
381
|
+
];
|
|
382
|
+
const segments = [];
|
|
383
|
+
for (const key of new Set(order)) {
|
|
384
|
+
const count = counts.get(key) ?? 0;
|
|
385
|
+
if (count <= 0)
|
|
386
|
+
continue;
|
|
387
|
+
const column = columnOf(board, key === "__entry" ? null : key);
|
|
388
|
+
segments.push({
|
|
389
|
+
key,
|
|
390
|
+
label: key === entryKey ? entry.name : (column?.name ?? key),
|
|
391
|
+
color: key === entryKey ? entry.color : (column?.color ?? NO_COLOR),
|
|
392
|
+
count,
|
|
393
|
+
discard: false,
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
const discarded = simulation.discarded.reduce((sum, entry) => sum + entry.leads, 0);
|
|
397
|
+
if (discarded > 0) {
|
|
398
|
+
const discard = discardOf(board);
|
|
399
|
+
segments.push({
|
|
400
|
+
key: "__discard",
|
|
401
|
+
label: discard.name,
|
|
402
|
+
color: discard.color,
|
|
403
|
+
count: discarded,
|
|
404
|
+
discard: true,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
return segments;
|
|
408
|
+
}
|
|
409
|
+
/** The suggested first message for a form that has none yet. */
|
|
410
|
+
export function defaultFirstContactText(siteName, formName) {
|
|
411
|
+
return `Oi, ${FIRST_NAME_VARIABLE}! Aqui é a ${siteName}. Recebemos seu pedido no formulário ${formName}. Podemos conversar por aqui?`;
|
|
412
|
+
}
|
|
413
|
+
/** The text in pieces: plain runs and the first name's variable. */
|
|
414
|
+
export function templateParts(text) {
|
|
415
|
+
const parts = [];
|
|
416
|
+
for (const [index, piece] of text.split(FIRST_NAME_VARIABLE).entries()) {
|
|
417
|
+
if (index > 0)
|
|
418
|
+
parts.push({ kind: "first_name", text: "primeiro nome" });
|
|
419
|
+
if (piece)
|
|
420
|
+
parts.push({ kind: "text", text: piece });
|
|
421
|
+
}
|
|
422
|
+
return parts;
|
|
423
|
+
}
|
|
424
|
+
/** The text a lead receives: the variable filled with the first name. */
|
|
425
|
+
export const fillTemplate = (text, firstName) => text.split(FIRST_NAME_VARIABLE).join(firstName);
|
|
426
|
+
let draftSeq = 0;
|
|
427
|
+
export const nextRuleId = () => `rule-${(draftSeq += 1)}`;
|
|
428
|
+
/** The drawer's starting point: the stored rules, or a fresh form's. */
|
|
429
|
+
export function draftOf(rules, form, site) {
|
|
430
|
+
const confirmed = rules?.whatsappButtonConfirmed ?? form.whatsappButtonConfirmed ?? false;
|
|
431
|
+
// A form never configured starts from what its end screen allows; the
|
|
432
|
+
// host's default first contact says nothing about this form yet.
|
|
433
|
+
const firstContact = rules?.configured && rules.firstContact
|
|
434
|
+
? rules.firstContact
|
|
435
|
+
: {
|
|
436
|
+
...rules?.firstContact,
|
|
437
|
+
mode: form.whatsappButton === true || confirmed
|
|
438
|
+
? "lead_starts"
|
|
439
|
+
: "one_click",
|
|
440
|
+
};
|
|
441
|
+
return {
|
|
442
|
+
whatsappButtonConfirmed: confirmed,
|
|
443
|
+
entryColumn: rules?.entryColumn ?? null,
|
|
444
|
+
rules: (rules?.rules ?? []).map((rule) => ({
|
|
445
|
+
questionKey: rule.questionKey,
|
|
446
|
+
answers: [...rule.answers],
|
|
447
|
+
to: rule.to,
|
|
448
|
+
id: nextRuleId(),
|
|
449
|
+
monthCount: rule.monthCount,
|
|
450
|
+
fresh: false,
|
|
451
|
+
})),
|
|
452
|
+
firstContact: {
|
|
453
|
+
...firstContact,
|
|
454
|
+
text: firstContact.text ?? defaultFirstContactText(site.name, form.name),
|
|
455
|
+
},
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
/** What `setFormRules` takes from a draft. */
|
|
459
|
+
export function choiceOf(draft) {
|
|
460
|
+
const { mode, text, brakes } = draft.firstContact;
|
|
461
|
+
return {
|
|
462
|
+
entryColumn: draft.entryColumn,
|
|
463
|
+
rules: draft.rules.map(({ questionKey, answers, to }) => ({
|
|
464
|
+
questionKey,
|
|
465
|
+
answers,
|
|
466
|
+
to: "discard" in to ? { discard: to.discard.trim() } : to,
|
|
467
|
+
})),
|
|
468
|
+
firstContact: {
|
|
469
|
+
mode,
|
|
470
|
+
...(text?.trim() ? { text: text.trim() } : {}),
|
|
471
|
+
...(mode === "automatic"
|
|
472
|
+
? { brakes: { ...DEFAULT_BRAKES, ...brakes } }
|
|
473
|
+
: {}),
|
|
474
|
+
},
|
|
475
|
+
whatsappButtonConfirmed: draft.whatsappButtonConfirmed,
|
|
476
|
+
};
|
|
477
|
+
}
|
|
478
|
+
/**
|
|
479
|
+
* What the simulation reads from a draft: the entry and the complete rules
|
|
480
|
+
* (a rule still being written decides nothing yet). The first contact stays
|
|
481
|
+
* out, so editing its text never asks for another 30-day scan.
|
|
482
|
+
*/
|
|
483
|
+
export function simulationDraftOf(draft, questions, board) {
|
|
484
|
+
return {
|
|
485
|
+
entryColumn: draft.entryColumn,
|
|
486
|
+
rules: draft.rules
|
|
487
|
+
.filter((rule) => !ruleProblem(rule, questions, board))
|
|
488
|
+
.map(({ questionKey, answers, to }) => ({
|
|
489
|
+
questionKey,
|
|
490
|
+
answers,
|
|
491
|
+
to: "discard" in to ? { discard: to.discard.trim() } : to,
|
|
492
|
+
})),
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
/** Why a rule cannot be saved yet, in pt-BR; null when it can. */
|
|
496
|
+
export function ruleProblem(rule, questions, board) {
|
|
497
|
+
const question = questions.find((entry) => entry.key === rule.questionKey);
|
|
498
|
+
if (!question)
|
|
499
|
+
return "Escolha a pergunta.";
|
|
500
|
+
if (rule.answers.length === 0)
|
|
501
|
+
return "Escolha ao menos uma resposta.";
|
|
502
|
+
if (rule.answers.length > MAX_RULE_ANSWERS)
|
|
503
|
+
return `No máximo ${MAX_RULE_ANSWERS} respostas por regra.`;
|
|
504
|
+
if ("discard" in rule.to) {
|
|
505
|
+
const reason = rule.to.discard.trim();
|
|
506
|
+
if (!reason)
|
|
507
|
+
return "Escreva o motivo do descarte.";
|
|
508
|
+
if (reason.length > MAX_DISCARD_REASON)
|
|
509
|
+
return "Motivo longo demais.";
|
|
510
|
+
}
|
|
511
|
+
else if (!columnOf(board, rule.to.column)) {
|
|
512
|
+
return "Escolha a coluna.";
|
|
513
|
+
}
|
|
514
|
+
return null;
|
|
515
|
+
}
|
|
516
|
+
/** Whether the draft can go to `setFormRules`. */
|
|
517
|
+
export function draftProblem(draft, form, board) {
|
|
518
|
+
if (draft.rules.length > MAX_FORM_RULES)
|
|
519
|
+
return `No máximo ${MAX_FORM_RULES} regras por formulário.`;
|
|
520
|
+
const questions = choiceQuestions(form);
|
|
521
|
+
for (const rule of draft.rules) {
|
|
522
|
+
if (rule.answers.length > MAX_RULE_ANSWERS)
|
|
523
|
+
return `No máximo ${MAX_RULE_ANSWERS} respostas por regra.`;
|
|
524
|
+
if (ruleProblem(rule, questions, board))
|
|
525
|
+
return "Complete as regras.";
|
|
526
|
+
}
|
|
527
|
+
if ((draft.firstContact.text ?? "").length > MAX_FIRST_CONTACT_TEXT)
|
|
528
|
+
return "O texto do primeiro contato está longo demais.";
|
|
529
|
+
// The host refuses a one-click first contact without its text.
|
|
530
|
+
if (draft.firstContact.mode === "one_click" &&
|
|
531
|
+
!(draft.firstContact.text ?? "").trim())
|
|
532
|
+
return "Escreva o texto do primeiro contato.";
|
|
533
|
+
const brakes = draft.firstContact.brakes;
|
|
534
|
+
if (draft.firstContact.mode === "automatic" &&
|
|
535
|
+
brakes &&
|
|
536
|
+
brakes.waitMinutes < MIN_WAIT_MINUTES)
|
|
537
|
+
return `Espere ao menos ${MIN_WAIT_MINUTES} min antes de enviar.`;
|
|
538
|
+
return null;
|
|
539
|
+
}
|
|
540
|
+
/** The option labels a rule picked, in the question's order. */
|
|
541
|
+
export function answerLabels(question, answers) {
|
|
542
|
+
if (!question?.options)
|
|
543
|
+
return [...answers];
|
|
544
|
+
return question.options
|
|
545
|
+
.filter((option) => answers.includes(option.key))
|
|
546
|
+
.map((option) => option.value);
|
|
547
|
+
}
|
|
548
|
+
/** Meta's page for the Page's forms (Meta Business Suite's forms library). */
|
|
549
|
+
export const metaFormsUrl = (form) => `https://business.facebook.com/latest/instant_forms?asset_id=${encodeURIComponent(form.pageId)}`;
|
|
550
|
+
/** The column a lead's decision names, for a card or a path. */
|
|
551
|
+
export function columnName(board, key) {
|
|
552
|
+
return columnOf(board, key)?.name ?? key;
|
|
553
|
+
}
|
|
554
|
+
/** A column's color, or the neutral dot. */
|
|
555
|
+
export const colorOf = (column) => column?.color ?? NO_COLOR;
|
|
556
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/ui/forms/model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { FormBoard, FormLead, FormRules, FormRulesSimulation, FormsReport, GuideCheck, MetaForm, MetaPage } from "./types.js";
|
|
2
|
+
/** The Formulários screens on Clínica Sorriso, as the approved demo draws them. */
|
|
3
|
+
export declare const sampleForms: {
|
|
4
|
+
/** The company: Clínica Sorriso alone. */
|
|
5
|
+
sites: {
|
|
6
|
+
siteId: string;
|
|
7
|
+
name: string;
|
|
8
|
+
segment: string;
|
|
9
|
+
}[];
|
|
10
|
+
pages: MetaPage[];
|
|
11
|
+
forms: MetaForm[];
|
|
12
|
+
report: FormsReport;
|
|
13
|
+
/** `formRules` per form: "Lente de contato dental" never had rules. */
|
|
14
|
+
rules: Record<string, FormRules | null>;
|
|
15
|
+
boards: Record<string, FormBoard>;
|
|
16
|
+
/** "Avaliação gratuita" under its stored rules: 64 leads in 30 days. */
|
|
17
|
+
simulation: FormRulesSimulation;
|
|
18
|
+
/** The demo's two leads, for the host's card and contact panel. */
|
|
19
|
+
leads: {
|
|
20
|
+
mariana: FormLead;
|
|
21
|
+
pedro: FormLead;
|
|
22
|
+
};
|
|
23
|
+
formIds: {
|
|
24
|
+
avaliacao: string;
|
|
25
|
+
clareamento: string;
|
|
26
|
+
lente: string;
|
|
27
|
+
promo: string;
|
|
28
|
+
};
|
|
29
|
+
senderLabel: string;
|
|
30
|
+
whatsappNumber: string;
|
|
31
|
+
businessHoursLabel: string;
|
|
32
|
+
/** The host's own check (uze.ai knows its WhatsApp numbers). */
|
|
33
|
+
guideChecks: GuideCheck[];
|
|
34
|
+
now: number;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=sample.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sample.d.ts","sourceRoot":"","sources":["../../../src/ui/forms/sample.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,mBAAmB,EACnB,WAAW,EACX,UAAU,EACV,QAAQ,EAER,QAAQ,EACT,MAAM,YAAY,CAAC;AAmZpB,mFAAmF;AACnF,eAAO,MAAM,WAAW;IACtB,0CAA0C;IAC1C,KAAK;;;;;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,uEAAuE;IACvE,KAAK,EAqBA,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACrC,MAAM,EAAyC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;IACxE,wEAAwE;IACxE,UAAU,EAUL,mBAAmB;IACxB,mEAAmE;IACnE,KAAK;QAAI,OAAO;QAAW,KAAK;;IAChC,OAAO;QACL,SAAS;QACT,WAAW;QACX,KAAK;QACL,KAAK;;IAEP,WAAW;IACX,cAAc;IACd,kBAAkB;IAClB,gEAAgE;IAChE,WAAW,EAEN,UAAU,EAAE;IACjB,GAAG;CACJ,CAAC"}
|