n8n-nodes-digisac 1.0.1 → 1.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 CHANGED
@@ -9,9 +9,9 @@ O projeto segue o mesmo padrão usado no `n8n-nodes-clinicorp`: um node de açã
9
9
  ## Funcionalidades
10
10
 
11
11
  - **Cobertura completa da documentação**: 298 chamadas da coleção pública Postman da Digisac, organizadas em 51 recursos no n8n.
12
- - **Node único e intuitivo**: selecione **Resource -> Operation**, preencha os parâmetros obrigatórios e execute.
12
+ - **Node único e intuitivo**: selecione **Resource -> Operation**, preencha campos simples de path, query e body, e execute.
13
13
  - **Credencial centralizada**: Base URL e Bearer Token ficam salvos uma única vez na credencial `Digisac API`.
14
- - **Pronto para AI Agent**: o node tem `usableAsTool: true` e descrições pensadas para LLMs entenderem método, caminho, parâmetros, IDs, filtros e body JSON.
14
+ - **Pronto para AI Agent**: o node tem `usableAsTool` com descrição específica de ferramenta e textos pensados para LLMs entenderem método, caminho, efeito da operação, parâmetros, regra de IDs, filtros, campos de body e quando usar JSON avançado.
15
15
  - **Sem dependências runtime**: usa `httpRequestWithAuthentication` do próprio n8n.
16
16
  - **Catálogo rastreável**: `nodes/Digisac/generated/endpoints.ts` é gerado da documentação Postman; `docs/api-calls.md` lista todas as chamadas em português.
17
17
  - **Publicação segura**: GitHub Actions publica no npm com provenance.
@@ -54,9 +54,15 @@ GET /api/v1/me
54
54
  2. Escolha o **Resource**. O resource corresponde a uma pasta da documentação, como `Contatos`, `Mensagens`, `Chamados`, `Campanhas`, `Tags`, `Usuários`, `Webhooks`.
55
55
  3. Escolha a **Operation**. Cada operation corresponde a uma chamada real da API.
56
56
  4. Preencha os campos obrigatórios de path, como `contactId`, `ticketId`, `serviceId`, `messageId`, `userId`, `campaignId`.
57
- 5. Use **Additional Query Parameters JSON** para filtros, paginação e queries complexas.
58
- 6. Use **Request Body JSON** para chamadas `POST`, `PUT` e `PATCH`.
59
- 7. Em exports CSV/TXT/PDF, se a resposta não vier como JSON, use **Options -> Response Format -> Text**.
57
+ 5. Preencha os campos de query que aparecerem, como `Per Page`, `Number`, `Service Id`, `Start Period`, `End Period`, `Status`.
58
+ 6. Em chamadas `POST`, `PUT` e `PATCH`, use **Campos do Body**. O node gera esses campos a partir do body documentado pela Digisac.
59
+ 7. Use **Body JSON Avançado** somente quando a operação exigir array, objeto livre ou uma estrutura que não coube nos campos gerados.
60
+ 8. Use **Options -> Query Avançada JSON** somente para filtros muito específicos não representados por campos.
61
+ 9. Em exports CSV/TXT/PDF, se a resposta não vier como JSON, use **Options -> Response Format -> Text**.
62
+
63
+ Resources marcados como **Popular** são atalhos herdados da coleção Postman para operações frequentes. Resources **General** contêm o catálogo mais completo. Se a mesma chamada existir nos dois, use **Popular** para fluxos comuns e **General** quando precisar de uma operação que não aparece em Popular.
64
+
65
+ Regra para AI Tools e automações: qualquer campo terminado em `Id` ou `Ids` deve vir de busca/listagem anterior, entrada confirmada do usuário ou valor sentinela documentado, como `all`. Nunca copie placeholders como `{{contactId}}`, `{{serviceId}}` ou `{{all/open/close}}`.
60
66
 
61
67
  ## Campos principais do node
62
68
 
@@ -65,10 +71,11 @@ GET /api/v1/me
65
71
  | **Resource** | Área funcional da API Digisac, gerada a partir das pastas Postman. |
66
72
  | **Operation** | Chamada exata da API. A descrição mostra método, endpoint, origem na documentação e placeholders. |
67
73
  | **Path Parameters** | Campos obrigatórios extraídos de placeholders como `{{contactId}}`. |
68
- | **Query: ...** | Campos opcionais extraídos de placeholders de query, como `serviceId`, `departmentId`, `from`, `to`. |
69
- | **Additional Query Parameters JSON** | Objeto JSON livre mesclado na query string. Use para `perPage`, `query`, `where[...]`, filtros e includes. |
70
- | **Request Body JSON** | Body enviado para operações de escrita. Aceita objeto ou array JSON. |
71
- | **Options** | Controla inclusão da query documentada, formato de resposta e comportamento de placeholders não preenchidos. |
74
+ | **Campos de query** | Campos simples gerados a partir da URL documentada. Exemplos: `Per Page`, `Number`, `Service Id`, `From`, `To`, `Type`. |
75
+ | **Campos do Body** | Coleção de campos gerada a partir do body documentado para operações de escrita. Use antes de qualquer JSON manual. |
76
+ | **Use Body JSON Avançado** | Toggle para liberar um editor JSON quando a chamada precisa de array, objeto livre ou payload muito específico. |
77
+ | **Options -> Query Avançada JSON** | Objeto JSON livre mesclado na query string. Chaves iguais substituem campos gerados; use apenas quando a chamada precisar de filtro não representado por campo. |
78
+ | **Options -> Response Format** | Use `Text` para exportações CSV/TXT/PDF ou respostas que não retornam JSON. |
72
79
 
73
80
  ## Exemplos práticos
74
81
 
@@ -77,11 +84,9 @@ GET /api/v1/me
77
84
  Resource: **Contatos (General)**
78
85
  Operation: **Listar todos os contatos**
79
86
 
80
- ```json
81
- {
82
- "perPage": 40
83
- }
84
- ```
87
+ Preencha:
88
+
89
+ - `Per Page`: `40`
85
90
 
86
91
  ### Buscar contato por número em uma conexão
87
92
 
@@ -90,50 +95,34 @@ Operation: **Buscar contato por numero de uma conexao especifica**
90
95
 
91
96
  Preencha:
92
97
 
93
- - `Query: Number`: número ou parte do número
94
- - `Query: Service Id`: ID da conexão
95
-
96
- Também é possível passar manualmente:
97
-
98
- ```json
99
- {
100
- "where[data.number][$iLike]": "%5511999999999%",
101
- "where[serviceId]": "SERVICE_ID"
102
- }
103
- ```
98
+ - `Number`: número ou parte do número
99
+ - `Service Id`: ID da conexão
104
100
 
105
101
  ### Enviar mensagem
106
102
 
107
103
  Resource: **Mensagens (General)**
108
104
  Operation: **Enviar mensagem**
109
105
 
110
- ```json
111
- {
112
- "text": "Olá, tudo bem?",
113
- "type": "chat",
114
- "contactId": "CONTACT_ID",
115
- "userId": "USER_ID",
116
- "origin": "bot"
117
- }
118
- ```
106
+ Em **Campos do Body**, preencha:
107
+
108
+ - `Text`: `Olá, tudo bem?`
109
+ - `Type`: `chat`
110
+ - `Contact Id`: `CONTACT_ID`
111
+ - `User Id`: `USER_ID`
112
+ - `Origin`: `bot`
119
113
 
120
114
  ### Enviar arquivo por mensagem
121
115
 
122
116
  Resource: **Mensagens (General)**
123
117
  Operation: **Enviar imagem**, **Enviar PDF** ou **Enviar áudio**
124
118
 
125
- Exemplo de body:
119
+ Use **Campos do Body** para `Text`, `Number` e `Service Id`. No campo `File`, informe somente o objeto do arquivo, não o body inteiro:
126
120
 
127
121
  ```json
128
122
  {
129
- "type": "file",
130
- "contactId": "CONTACT_ID",
131
- "serviceId": "SERVICE_ID",
132
- "file": {
133
- "base64": "BASE64_DO_ARQUIVO",
134
- "mimetype": "application/pdf",
135
- "name": "documento.pdf"
136
- }
123
+ "base64": "BASE64_DO_ARQUIVO",
124
+ "mimetype": "application/pdf",
125
+ "name": "documento.pdf"
137
126
  }
138
127
  ```
139
128
 
@@ -142,12 +131,9 @@ Exemplo de body:
142
131
  Resource: **Chamados (General)**
143
132
  Operation: **Buscar chamados do contato**
144
133
 
145
- ```json
146
- {
147
- "where[contactId]": "CONTACT_ID",
148
- "perPage": 40
149
- }
150
- ```
134
+ Preencha:
135
+
136
+ - `Contact Id`: `CONTACT_ID`
151
137
 
152
138
  ### Transferir chamado
153
139
 
@@ -160,24 +146,19 @@ Path:
160
146
 
161
147
  Body:
162
148
 
163
- ```json
164
- {
165
- "departmentId": "DEPARTMENT_ID",
166
- "userId": "USER_ID",
167
- "comments": "Transferido pelo fluxo do n8n"
168
- }
169
- ```
149
+ - `Department Id`: `DEPARTMENT_ID`
150
+ - `User Id`: `USER_ID`
151
+ - `Comments`: `Transferido pelo fluxo do n8n`
170
152
 
171
153
  ### Fechar chamado com assunto
172
154
 
173
155
  Resource: **Chamados (General)**
174
156
  Operation: **Fechar um chamado com assunto**
175
157
 
158
+ Em **Campos do Body**, preencha `Ticket Topic Ids` com:
159
+
176
160
  ```json
177
- {
178
- "ticketTopicIds": ["TICKET_TOPIC_ID"],
179
- "comments": "Atendimento finalizado pelo fluxo"
180
- }
161
+ ["TICKET_TOPIC_ID"]
181
162
  ```
182
163
 
183
164
  ### Buscar estatísticas de atendimento
@@ -185,30 +166,24 @@ Operation: **Fechar um chamado com assunto**
185
166
  Resource: **Estatísticas de atendimento (General)**
186
167
  Operation: **Buscar estatísticas com todos os filtros ativos**
187
168
 
188
- ```json
189
- {
190
- "startPeriod": "2026-07-01T00:00:00.000Z",
191
- "endPeriod": "2026-07-31T23:59:59.999Z",
192
- "departmentId": "all",
193
- "userId": "all",
194
- "periodType": "openDate",
195
- "status": "all"
196
- }
197
- ```
169
+ Preencha os campos de query:
170
+
171
+ - `Start Period`: `2026-07-01T00:00:00.000Z`
172
+ - `End Period`: `2026-07-31T23:59:59.999Z`
173
+ - `Department Id`: `all`
174
+ - `User Id`: `all`
175
+ - `Period Type`: `open` ou `close`
176
+ - `Status`: `all`, `open` ou `close`
198
177
 
199
178
  ### Criar webhook
200
179
 
201
180
  Resource: **Webhooks (General)**
202
181
  Operation: **Criar webhook**
203
182
 
183
+ Em **Campos do Body**, preencha `Active`, `Name`, `Url`, `Events` e `Type`. Para `Events`, use array JSON:
184
+
204
185
  ```json
205
- {
206
- "active": true,
207
- "name": "Webhook n8n",
208
- "url": "https://seu-n8n/webhook/digisac",
209
- "events": ["message.created", "ticket.closed"],
210
- "type": "http"
211
- }
186
+ ["message.created", "ticket.closed"]
212
187
  ```
213
188
 
214
189
  ## Todas as chamadas da API
@@ -285,8 +260,11 @@ O node pode ser conectado ao **AI Agent** do n8n como uma tool. A prática recom
285
260
 
286
261
  ```text
287
262
  Você pode usar as tools Digisac somente quando o usuário pedir para consultar, criar ou alterar dados na Digisac.
288
- Nunca invente IDs. Se faltar contactId, ticketId, departmentId, serviceId, userId, messageId, tagId, campaignId ou templateId, primeiro use uma operação de listagem ou busca.
263
+ Nunca invente IDs. Qualquer campo terminado em Id ou Ids deve vir de busca/listagem anterior, entrada confirmada do usuário ou valor sentinela documentado como all.
264
+ Não copie placeholders da documentação, como {{contactId}}, {{serviceId}} ou {{all/open/close}}. Substitua por valor real ou escolha uma opção válida.
289
265
  Para operações POST, PUT e PATCH, envie um body JSON mínimo, somente com os campos necessários.
266
+ Quando a tool expuser Campos do Body, preencha os campos dedicados em vez de gerar um JSON manual.
267
+ Use Body JSON Avançado ou Query Avançada JSON apenas quando não existir campo dedicado suficiente para a chamada.
290
268
  Para filtros de data/hora, use ISO-8601 quando o endpoint esperar timestamp.
291
269
  Para exportações CSV, TXT ou PDF, use Response Format = Text se a resposta não for JSON.
292
270
  Antes de criar, editar, excluir, arquivar, bloquear, fechar chamado ou enviar mensagem, confirme que a intenção do usuário está clara.
@@ -312,10 +290,10 @@ Filtro de período:
312
290
  {{ $fromAI('startPeriod', 'Início do período em ISO-8601, por exemplo 2026-07-01T00:00:00.000Z.', 'string') }}
313
291
  ```
314
292
 
315
- Body JSON:
293
+ Campo de body estruturado:
316
294
 
317
295
  ```javascript
318
- {{ $fromAI('body', 'Objeto JSON válido com os campos exigidos pela operação Digisac selecionada.', 'json') }}
296
+ {{ $fromAI('file', 'Objeto JSON do arquivo com base64, mimetype e name quando a operação Digisac enviar mídia.', 'json') }}
319
297
  ```
320
298
 
321
299
  ### Boas práticas para LLMs
@@ -326,7 +304,7 @@ Body JSON:
326
304
  - Use credenciais dedicadas por ambiente/cliente.
327
305
  - Para operações destrutivas (`DELETE`, arquivar, bloquear, fechar chamado), coloque etapa humana de confirmação quando o fluxo for sensível.
328
306
  - Em mensagens enviadas ao cliente, gere o texto em etapa anterior e passe o texto final para a tool.
329
- - Para bodies grandes, use JSON explícito e valide campos obrigatórios no workflow antes da chamada.
307
+ - Use campos dedicados sempre que existirem. Para bodies grandes ou arrays de múltiplos itens, use JSON explícito e valide campos obrigatórios no workflow antes da chamada.
330
308
 
331
309
  ## Desenvolvimento
332
310
 
@@ -401,6 +379,8 @@ npm publish --provenance --access public
401
379
 
402
380
  ## Versões
403
381
 
382
+ - **1.0.3** — Descrições de AI Tool reforçadas: regra genérica para campos `Id/Ids`, alertas para placeholders, orientação Popular vs General, avisos por tipo de campo de body/query e exemplo de arquivo corrigido.
383
+ - **1.0.2** — Interface simplificada: query e body agora usam campos dedicados gerados da documentação. JSON fica escondido em opções avançadas ou aparece apenas nas chamadas em que não há forma segura de gerar campos. Ícone atualizado a partir de `icon.webp`.
404
384
  - **1.0.1** — Documentação reescrita em PT-BR, com exemplos práticos, instruções de AI Tool e catálogo completo de chamadas em `docs/api-calls.md`.
405
385
  - **1.0.0** — Primeira versão publicada. Node único `Digisac`, credencial Bearer, catálogo com 298 chamadas da documentação Postman, suporte a AI Agent e publicação npm via GitHub Actions.
406
386
 
@@ -3,8 +3,8 @@ export declare class DigisacApi implements ICredentialType {
3
3
  name: string;
4
4
  displayName: string;
5
5
  icon: {
6
- readonly light: "file:digisac.svg";
7
- readonly dark: "file:digisac.dark.svg";
6
+ readonly light: "file:digisac.png";
7
+ readonly dark: "file:digisac.dark.png";
8
8
  };
9
9
  documentationUrl: string;
10
10
  properties: INodeProperties[];
@@ -5,7 +5,7 @@ class DigisacApi {
5
5
  constructor() {
6
6
  this.name = 'digisacApi';
7
7
  this.displayName = 'Digisac API';
8
- this.icon = { light: 'file:digisac.svg', dark: 'file:digisac.dark.svg' };
8
+ this.icon = { light: 'file:digisac.png', dark: 'file:digisac.dark.png' };
9
9
  this.documentationUrl = 'https://documenter.getpostman.com/view/53282970/2sBXihpXmF';
10
10
  this.properties = [
11
11
  {
Binary file
@@ -8,17 +8,21 @@ class Digisac {
8
8
  this.description = {
9
9
  displayName: 'Digisac',
10
10
  name: 'digisac',
11
- icon: { light: 'file:digisac.svg', dark: 'file:digisac.dark.svg' },
11
+ icon: { light: 'file:digisac.png', dark: 'file:digisac.dark.png' },
12
12
  group: ['transform'],
13
13
  version: 1,
14
14
  subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
15
- description: 'Use every documented Digisac API request from the public Postman documentation. Choose a resource folder and operation, fill required path parameters, add query JSON/body JSON when needed, and the node sends the authenticated Bearer request to the Base URL stored in the credential. Built for AI Agents: operation descriptions include method, path, source folder, required path variables, query placeholders and body guidance so the LLM can choose the correct endpoint and avoid inventing IDs.',
15
+ description: 'Use every documented Digisac API request from the public Postman documentation. Choose a resource folder and operation, fill required path parameters and use the generated query/body fields first. Advanced JSON fields are available only when an operation needs a custom payload or unsupported filter. Built for AI Agents: operation descriptions include method, path, source folder, required path variables, query guidance, body fields and explicit reminders to use IDs returned by Digisac instead of inventing values.',
16
16
  defaults: {
17
17
  name: 'Digisac',
18
18
  },
19
19
  inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
20
20
  outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
21
- usableAsTool: true,
21
+ usableAsTool: {
22
+ replacements: {
23
+ description: 'Ferramenta para executar chamadas documentadas da API Digisac dentro do n8n. Use somente para tarefas de Digisac, como consultar, criar ou alterar contatos, chamados, mensagens, campanhas, conexoes, departamentos, usuarios, tags, templates, webhooks, relatorios e estatisticas. Primeiro escolha Resource e Operation; a Operation informa metodo HTTP, endpoint, origem na documentacao, parametros obrigatorios, query e body. Nunca invente IDs: qualquer campo terminado em Id ou Ids deve vir de busca/listagem anterior, entrada confirmada do usuario ou valor sentinela documentado como all. Preencha campos dedicados de path, query e Campos do Body; deixe campos vazios quando nao souber. Nao copie placeholders da documentacao como {{contactId}} ou {{all/open/close}}; substitua por valor real ou escolha uma opcao valida. Use Query Avancada JSON ou Body JSON Avancado apenas quando nao existir campo dedicado suficiente. Antes de enviar mensagem, excluir, arquivar, bloquear, fechar chamado, transferir chamado ou alterar dados, confirme que a intencao do usuario esta explicita.',
24
+ },
25
+ },
22
26
  credentials: [
23
27
  {
24
28
  name: 'digisacApi',
@@ -33,7 +37,7 @@ class Digisac {
33
37
  noDataExpression: true,
34
38
  options: actions_1.resourceOptions,
35
39
  default: actions_1.resourceOptions[0]?.value ?? '',
36
- description: 'Digisac API area, grouped from the Postman documentation. Pick the folder that matches the task: contacts, tickets, messages, campaigns, services, dashboards, webhooks, and more.',
40
+ description: 'Area da API Digisac agrupada pela documentacao Postman. Resources Popular sao atalhos para operacoes frequentes; resources General contem o catalogo mais completo. Se a mesma chamada existir em Popular e General, prefira Popular para fluxos comuns e General quando precisar de uma chamada que nao existe no Popular.',
37
41
  },
38
42
  ...actions_1.resourceProperties,
39
43
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"Digisac.node.js","sourceRoot":"","sources":["../../../nodes/Digisac/Digisac.node.ts"],"names":[],"mappings":";;;AAOA,+CAAuE;AAEvE,uCAAiF;AAEjF,MAAa,OAAO;IAApB;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,uBAAuB,EAAE;YAClE,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,8DAA8D;YACxE,WAAW,EACV,+eAA+e;YAChf,QAAQ,EAAE;gBACT,IAAI,EAAE,SAAS;aACf;YACD,MAAM,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YAClC,OAAO,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YACnC,YAAY,EAAE,IAAI;YAClB,WAAW,EAAE;gBACZ;oBACC,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,IAAI;iBACd;aACD;YACD,UAAU,EAAE;gBACX;oBACC,WAAW,EAAE,UAAU;oBACvB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,SAAS;oBACf,gBAAgB,EAAE,IAAI;oBACtB,OAAO,EAAE,yBAAe;oBACxB,OAAO,EAAE,yBAAe,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;oBACxC,WAAW,EACV,oLAAoL;iBACrL;gBACD,GAAG,4BAAkB;aACrB;SACD,CAAC;IA+BH,CAAC;IA7BA,KAAK,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAW,CAAC;gBAClE,MAAM,YAAY,GAAG,MAAM,yBAAe,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAE5E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAC5D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAwB,CAAC,EACtD,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACzB,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE;wBACzC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;qBACvB,CAAC,CAAC;oBACH,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAc,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACF,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,CAAC;IACrB,CAAC;CACD;AAlED,0BAkEC"}
1
+ {"version":3,"file":"Digisac.node.js","sourceRoot":"","sources":["../../../nodes/Digisac/Digisac.node.ts"],"names":[],"mappings":";;;AAOA,+CAAuE;AAEvE,uCAAiF;AAEjF,MAAa,OAAO;IAApB;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,uBAAuB,EAAE;YAClE,KAAK,EAAE,CAAC,WAAW,CAAC;YACpB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,8DAA8D;YACxE,WAAW,EACV,ugBAAugB;YACxgB,QAAQ,EAAE;gBACT,IAAI,EAAE,SAAS;aACf;YACD,MAAM,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YAClC,OAAO,EAAE,CAAC,kCAAmB,CAAC,IAAI,CAAC;YACnC,YAAY,EAAE;gBACb,YAAY,EAAE;oBACb,WAAW,EACV,wjCAAwjC;iBACzjC;aACD;YACD,WAAW,EAAE;gBACZ;oBACC,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,IAAI;iBACd;aACD;YACD,UAAU,EAAE;gBACX;oBACC,WAAW,EAAE,UAAU;oBACvB,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,SAAS;oBACf,gBAAgB,EAAE,IAAI;oBACtB,OAAO,EAAE,yBAAe;oBACxB,OAAO,EAAE,yBAAe,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE;oBACxC,WAAW,EACV,6TAA6T;iBAC9T;gBACD,GAAG,4BAAkB;aACrB;SACD,CAAC;IA+BH,CAAC;IA7BA,KAAK,CAAC,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,UAAU,GAAyB,EAAE,CAAC;QAE5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,CAAW,CAAC;gBAClE,MAAM,YAAY,GAAG,MAAM,yBAAe,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;gBACpE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;gBAE5E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAC5D,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAwB,CAAC,EACtD,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CACzB,CAAC;gBACF,UAAU,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE;wBACzC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;qBACvB,CAAC,CAAC;oBACH,SAAS;gBACV,CAAC;gBACD,MAAM,IAAI,iCAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAc,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;YAChF,CAAC;QACF,CAAC;QAED,OAAO,CAAC,UAAU,CAAC,CAAC;IACrB,CAAC;CACD;AAvED,0BAuEC"}