@joshuanode/n8n-nodes-addigy 0.0.1

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 (41) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +313 -0
  3. package/dist/credentials/AddigyApi.credentials.d.ts +10 -0
  4. package/dist/credentials/AddigyApi.credentials.d.ts.map +1 -0
  5. package/dist/credentials/AddigyApi.credentials.js +54 -0
  6. package/dist/credentials/AddigyApi.credentials.js.map +1 -0
  7. package/dist/nodes/Addigy/Addigy.node.d.ts +13 -0
  8. package/dist/nodes/Addigy/Addigy.node.d.ts.map +1 -0
  9. package/dist/nodes/Addigy/Addigy.node.js +559 -0
  10. package/dist/nodes/Addigy/Addigy.node.js.map +1 -0
  11. package/dist/nodes/Addigy/GenericFunctions.d.ts +13 -0
  12. package/dist/nodes/Addigy/GenericFunctions.d.ts.map +1 -0
  13. package/dist/nodes/Addigy/GenericFunctions.js +225 -0
  14. package/dist/nodes/Addigy/GenericFunctions.js.map +1 -0
  15. package/dist/nodes/Addigy/addigy.svg +22 -0
  16. package/dist/nodes/Addigy/descriptions/AlertDescription.d.ts +4 -0
  17. package/dist/nodes/Addigy/descriptions/AlertDescription.d.ts.map +1 -0
  18. package/dist/nodes/Addigy/descriptions/AlertDescription.js +210 -0
  19. package/dist/nodes/Addigy/descriptions/AlertDescription.js.map +1 -0
  20. package/dist/nodes/Addigy/descriptions/ApplicationDescription.d.ts +4 -0
  21. package/dist/nodes/Addigy/descriptions/ApplicationDescription.d.ts.map +1 -0
  22. package/dist/nodes/Addigy/descriptions/ApplicationDescription.js +234 -0
  23. package/dist/nodes/Addigy/descriptions/ApplicationDescription.js.map +1 -0
  24. package/dist/nodes/Addigy/descriptions/DeviceDescription.d.ts +4 -0
  25. package/dist/nodes/Addigy/descriptions/DeviceDescription.d.ts.map +1 -0
  26. package/dist/nodes/Addigy/descriptions/DeviceDescription.js +292 -0
  27. package/dist/nodes/Addigy/descriptions/DeviceDescription.js.map +1 -0
  28. package/dist/nodes/Addigy/descriptions/FactDescription.d.ts +4 -0
  29. package/dist/nodes/Addigy/descriptions/FactDescription.d.ts.map +1 -0
  30. package/dist/nodes/Addigy/descriptions/FactDescription.js +282 -0
  31. package/dist/nodes/Addigy/descriptions/FactDescription.js.map +1 -0
  32. package/dist/nodes/Addigy/descriptions/InstructionDescription.d.ts +4 -0
  33. package/dist/nodes/Addigy/descriptions/InstructionDescription.d.ts.map +1 -0
  34. package/dist/nodes/Addigy/descriptions/InstructionDescription.js +328 -0
  35. package/dist/nodes/Addigy/descriptions/InstructionDescription.js.map +1 -0
  36. package/dist/nodes/Addigy/descriptions/PolicyDescription.d.ts +4 -0
  37. package/dist/nodes/Addigy/descriptions/PolicyDescription.d.ts.map +1 -0
  38. package/dist/nodes/Addigy/descriptions/PolicyDescription.js +226 -0
  39. package/dist/nodes/Addigy/descriptions/PolicyDescription.js.map +1 -0
  40. package/index.js +2 -0
  41. package/package.json +64 -0
package/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Joshua Smith
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,313 @@
1
+ # n8n-nodes-addigy
2
+
3
+ ![Banner](https://addigy.com/wp-content/uploads/2022/11/Addigy-Logo-Horizontal.png)
4
+
5
+ This is an n8n community node that lets you interact with [Addigy](https://addigy.com/) - a full-featured Apple MDM (Mobile Device Management) platform.
6
+
7
+ [n8n](https://n8n.io/) is a [fair-code licensed](https://docs.n8n.io/reference/license/) workflow automation platform.
8
+
9
+ ## Table of Contents
10
+
11
+ - [Installation](#installation)
12
+ - [Prerequisites](#prerequisites)
13
+ - [Credentials](#credentials)
14
+ - [Compatibility](#compatibility)
15
+ - [Features](#features)
16
+ - [Resources](#resources)
17
+ - [Usage](#usage)
18
+ - [Example Workflows](#example-workflows)
19
+ - [Operations](#operations)
20
+ - [Known Issues](#known-issues)
21
+ - [Contributing](#contributing)
22
+ - [License](#license)
23
+
24
+ ## Installation
25
+
26
+ Follow the [installation guide](https://docs.n8n.io/integrations/community-nodes/installation/) in the n8n community nodes documentation.
27
+
28
+ ### GUI
29
+
30
+ 1. Go to **Settings > Community Nodes**
31
+ 2. Select **Install**
32
+ 3. Enter `@joshuanode/n8n-nodes-addigy` in **Enter npm package name**
33
+ 4. Agree to the [risks](https://docs.n8n.io/integrations/community-nodes/risks/) of using community nodes
34
+ 5. Select **Install**
35
+
36
+ ### Manual Installation
37
+
38
+ To get started install the package in your n8n root directory:
39
+
40
+ ```bash
41
+ npm install @joshuanode/n8n-nodes-addigy
42
+ ```
43
+
44
+ For Docker-based deployments add the following line before the font installation command in your [n8n Dockerfile](https://github.com/n8n-io/n8n/blob/master/docker/images/n8n/Dockerfile):
45
+
46
+ ```docker
47
+ RUN cd /usr/local/lib/node_modules/n8n && npm install @joshuanode/n8n-nodes-addigy
48
+ ```
49
+
50
+ ## Prerequisites
51
+
52
+ - n8n installed (version 0.220.0 or above)
53
+ - An active Addigy account
54
+ - Addigy API v2 credentials
55
+
56
+ ## Credentials
57
+
58
+ To use this node, you'll need to configure your Addigy API credentials in n8n.
59
+
60
+ ### Generating API v2 Credentials
61
+
62
+ 1. Log in to your Addigy account
63
+ 2. Navigate to **Account > API Tokens**
64
+ 3. Click **Create New Token**
65
+ 4. Give your token a descriptive name (e.g., "n8n Integration")
66
+ 5. Select the appropriate permissions for your use case:
67
+ - **Devices**: Read, Write (if you need to update devices or run commands)
68
+ - **Policies**: Read, Write (if you need to manage policies)
69
+ - **Alerts**: Read, Write (if you need to manage alerts)
70
+ - **Applications**: Read, Write (if you need to deploy/remove applications)
71
+ - **Facts**: Read, Write (if you need to manage custom facts)
72
+ - **Instructions**: Read, Write (if you need to create/execute instructions)
73
+ 6. Click **Create Token**
74
+ 7. Copy the generated token immediately (you won't be able to see it again)
75
+
76
+ ### Configuring Credentials in n8n
77
+
78
+ 1. In your n8n workflow, add an Addigy node
79
+ 2. Click on **Create New Credential**
80
+ 3. Enter your API Token
81
+ 4. Enter your Organization ID
82
+ 5. Enter your Addigy base URL (default: `https://api.addigy.com`)
83
+ 6. Click **Save**
84
+
85
+ The credential will automatically test the connection by attempting to fetch devices.
86
+
87
+ ## Compatibility
88
+
89
+ - Tested with n8n version 1.0.0+
90
+ - Works with Addigy API v2
91
+ - Compatible with self-hosted and cloud n8n instances
92
+
93
+ ## Features
94
+
95
+ This node provides comprehensive access to the Addigy API, allowing you to automate Apple device management tasks.
96
+
97
+ ### Resources
98
+
99
+ The Addigy node supports the following resources:
100
+
101
+ #### 🖥️ Device
102
+ Manage and monitor Apple devices in your organization.
103
+ - Get device information by ID
104
+ - List all devices with filtering options
105
+ - Get device facts (system information, hardware details, installed software)
106
+ - Update device properties (name, policy assignment, notes)
107
+ - Run commands on devices (restart, shutdown, lock, clear passcode, refresh facts)
108
+
109
+ #### 📋 Policy
110
+ Organize devices into policies with specific configurations.
111
+ - Create new policies
112
+ - Get policy details
113
+ - List all policies
114
+ - Update policy information
115
+ - Delete policies
116
+
117
+ #### 🚨 Alert
118
+ Monitor and respond to alerts from your device fleet.
119
+ - Get alert details
120
+ - List alerts with filters (device, policy, status, severity, date range)
121
+ - Resolve alerts with optional notes
122
+
123
+ #### 📦 Application
124
+ Deploy and manage applications across your device fleet.
125
+ - Get application information
126
+ - List available applications (public and custom software)
127
+ - Deploy applications to devices or policies
128
+ - Remove applications from devices or policies
129
+ - Configure auto-update and installation timing
130
+
131
+ #### 📊 Fact
132
+ Create and manage custom facts to collect device information.
133
+ - Create custom facts with shell scripts
134
+ - Get fact definitions
135
+ - List all custom facts
136
+ - Update fact collection scripts and frequency
137
+ - Delete custom facts
138
+
139
+ #### ⚙️ Instruction
140
+ Create and execute custom scripts on devices.
141
+ - Create reusable instruction scripts
142
+ - Get instruction details
143
+ - List all instructions
144
+ - Update instruction scripts and metadata
145
+ - Delete instructions
146
+ - Execute instructions on specific devices or policies
147
+
148
+ ## Usage
149
+
150
+ ### Basic Example: Get All Devices
151
+
152
+ 1. Add an Addigy node to your workflow
153
+ 2. Select **Device** as the resource
154
+ 3. Select **Get Many** as the operation
155
+ 4. Configure filters if needed (policy, status, device type)
156
+ 5. Execute the workflow
157
+
158
+ ### Advanced Example: Automated Alert Response
159
+
160
+ Create a workflow that monitors for critical alerts and automatically resolves them after running a remediation instruction:
161
+
162
+ 1. **Schedule Trigger**: Run every 5 minutes
163
+ 2. **Addigy Node (Get Alerts)**:
164
+ - Resource: Alert
165
+ - Operation: Get Many
166
+ - Filters: Status = Open, Severity = Critical
167
+ 3. **IF Node**: Check if alerts exist
168
+ 4. **Addigy Node (Execute Instruction)**:
169
+ - Resource: Instruction
170
+ - Operation: Execute
171
+ - Select remediation instruction
172
+ - Target: Device (from alert data)
173
+ 5. **Addigy Node (Resolve Alert)**:
174
+ - Resource: Alert
175
+ - Operation: Resolve
176
+ - Alert ID: From alert data
177
+ - Notes: "Automatically resolved via n8n workflow"
178
+
179
+ ### Example Workflows
180
+
181
+ #### 1. Device Onboarding Automation
182
+ Automatically assign new devices to the correct policy based on device type:
183
+ ```
184
+ Webhook Trigger → Addigy (Get Device) → Switch (by device type) → Addigy (Update Device - assign policy) → Slack (notify team)
185
+ ```
186
+
187
+ #### 2. Software Deployment Campaign
188
+ Deploy an application to all devices in a specific policy:
189
+ ```
190
+ Manual Trigger → Addigy (Get Policy) → Addigy (Deploy Application) → Email (send deployment report)
191
+ ```
192
+
193
+ #### 3. Custom Fact Collection and Reporting
194
+ Collect custom facts from devices and generate a report:
195
+ ```
196
+ Schedule Trigger → Addigy (Get Many Devices) → Addigy (Get Facts) → Google Sheets (append data) → Slack (send summary)
197
+ ```
198
+
199
+ #### 4. Compliance Monitoring
200
+ Monitor devices for compliance issues and create tickets:
201
+ ```
202
+ Schedule Trigger → Addigy (Get Alerts) → Filter (compliance alerts) → Jira (create issue) → Addigy (add alert notes)
203
+ ```
204
+
205
+ ## Operations
206
+
207
+ ### Device Operations
208
+ | Operation | Description |
209
+ |-----------|-------------|
210
+ | Get | Retrieve a device by ID |
211
+ | Get Many | List devices with optional filters |
212
+ | Get Facts | Retrieve all facts for a specific device |
213
+ | Update | Update device properties |
214
+ | Run Command | Execute commands (restart, shutdown, lock, etc.) |
215
+
216
+ ### Policy Operations
217
+ | Operation | Description |
218
+ |-----------|-------------|
219
+ | Create | Create a new policy |
220
+ | Get | Retrieve a policy by ID |
221
+ | Get Many | List all policies |
222
+ | Update | Update policy properties |
223
+ | Delete | Delete a policy |
224
+
225
+ ### Alert Operations
226
+ | Operation | Description |
227
+ |-----------|-------------|
228
+ | Get | Retrieve an alert by ID |
229
+ | Get Many | List alerts with filters |
230
+ | Resolve | Mark an alert as resolved |
231
+
232
+ ### Application Operations
233
+ | Operation | Description |
234
+ |-----------|-------------|
235
+ | Get | Retrieve an application by ID |
236
+ | Get Many | List available applications |
237
+ | Deploy | Deploy an application to devices/policies |
238
+ | Remove | Remove an application from devices/policies |
239
+
240
+ ### Fact Operations
241
+ | Operation | Description |
242
+ |-----------|-------------|
243
+ | Create | Create a custom fact |
244
+ | Get | Retrieve a custom fact by name |
245
+ | Get Many | List all custom facts |
246
+ | Update | Update a custom fact |
247
+ | Delete | Delete a custom fact |
248
+
249
+ ### Instruction Operations
250
+ | Operation | Description |
251
+ |-----------|-------------|
252
+ | Create | Create a new instruction |
253
+ | Get | Retrieve an instruction by ID |
254
+ | Get Many | List all instructions |
255
+ | Update | Update an instruction |
256
+ | Delete | Delete an instruction |
257
+ | Execute | Run an instruction on devices/policies |
258
+
259
+ ## Known Issues
260
+
261
+ - **Rate Limiting**: The Addigy API has a rate limit of 1,000 requests per 10 seconds. If exceeded, requests will be rejected for 24 hours. The node does not currently implement automatic rate limiting.
262
+ - **Pagination**: When fetching large datasets, be mindful of performance. Use the "Return All" option carefully.
263
+ - **Logo**: The current node icon is a placeholder. Replace with the official Addigy logo from their [media kit](https://addigy.com/media-kit/) for production use.
264
+
265
+ ## Version History
266
+
267
+ ### 1.0.0 (Initial Release)
268
+ - Support for 6 main resources: Device, Policy, Alert, Application, Fact, and Instruction
269
+ - API v2 authentication
270
+ - Comprehensive filtering and pagination
271
+ - Dynamic dropdowns for devices, policies, and applications
272
+ - Full CRUD operations where applicable
273
+
274
+ ## Resources
275
+
276
+ - [Addigy API v2 Documentation](https://api.addigy.com/api/v2/documentation/)
277
+ - [Addigy Support](https://support.addigy.com/)
278
+ - [n8n Community Forum](https://community.n8n.io/)
279
+ - [n8n Documentation](https://docs.n8n.io/)
280
+
281
+ ## Contributing
282
+
283
+ Contributions are welcome! Please feel free to submit a Pull Request.
284
+
285
+ 1. Fork the repository
286
+ 2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
287
+ 3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
288
+ 4. Push to the branch (`git push origin feature/AmazingFeature`)
289
+ 5. Open a Pull Request
290
+
291
+ ## Support
292
+
293
+ If you encounter any issues or have questions:
294
+ - Open an issue in the [GitHub repository](https://github.com/ajoshuasmith/n8n-nodes-addigy/issues)
295
+ - Ask in the [n8n Community Forum](https://community.n8n.io/)
296
+
297
+ ## License
298
+
299
+ [MIT](LICENSE.md)
300
+
301
+ ---
302
+
303
+ ## About Addigy
304
+
305
+ Addigy is a full-featured Apple MDM (Mobile Device Management) platform that helps organizations manage Mac, iPhone, iPad, and Apple TV devices. Learn more at [addigy.com](https://addigy.com/).
306
+
307
+ ## Disclaimer
308
+
309
+ This is an unofficial community node and is not affiliated with or endorsed by Addigy. Use at your own risk.
310
+
311
+ ---
312
+
313
+ Made with ❤️ for the n8n community
@@ -0,0 +1,10 @@
1
+ import { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class AddigyApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ properties: INodeProperties[];
7
+ authenticate: IAuthenticateGeneric;
8
+ test: ICredentialTestRequest;
9
+ }
10
+ //# sourceMappingURL=AddigyApi.credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddigyApi.credentials.d.ts","sourceRoot":"","sources":["../../credentials/AddigyApi.credentials.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,MAAM,cAAc,CAAC;AAEtB,qBAAa,SAAU,YAAW,eAAe;IAChD,IAAI,SAAe;IAEnB,WAAW,SAAgB;IAE3B,gBAAgB,SAAkD;IAElE,UAAU,EAAE,eAAe,EAAE,CAyB3B;IAEF,YAAY,EAAE,oBAAoB,CAOhC;IAEF,IAAI,EAAE,sBAAsB,CAS1B;CACF"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddigyApi = void 0;
4
+ class AddigyApi {
5
+ name = 'addigyApi';
6
+ displayName = 'Addigy API';
7
+ documentationUrl = 'https://api.addigy.com/api/v2/documentation/';
8
+ properties = [
9
+ {
10
+ displayName: 'API Token',
11
+ name: 'apiToken',
12
+ type: 'string',
13
+ typeOptions: { password: true },
14
+ default: '',
15
+ required: true,
16
+ description: 'Addigy v2 API token (x-api-key)',
17
+ },
18
+ {
19
+ displayName: 'Organization ID',
20
+ name: 'organizationId',
21
+ type: 'string',
22
+ default: '',
23
+ required: true,
24
+ description: 'Organization ID used by organization-scoped API endpoints',
25
+ },
26
+ {
27
+ displayName: 'Base URL',
28
+ name: 'baseUrl',
29
+ type: 'string',
30
+ default: 'https://api.addigy.com',
31
+ description: 'The base URL for your Addigy instance',
32
+ },
33
+ ];
34
+ authenticate = {
35
+ type: 'generic',
36
+ properties: {
37
+ headers: {
38
+ 'x-api-key': '={{$credentials.apiToken}}',
39
+ },
40
+ },
41
+ };
42
+ test = {
43
+ request: {
44
+ baseURL: '={{$credentials.baseUrl}}',
45
+ url: '/api/v2/configuration/permissions',
46
+ method: 'GET',
47
+ headers: {
48
+ 'x-api-key': '={{$credentials.apiToken}}',
49
+ },
50
+ },
51
+ };
52
+ }
53
+ exports.AddigyApi = AddigyApi;
54
+ //# sourceMappingURL=AddigyApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddigyApi.credentials.js","sourceRoot":"","sources":["../../credentials/AddigyApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,SAAS;IACrB,IAAI,GAAG,WAAW,CAAC;IAEnB,WAAW,GAAG,YAAY,CAAC;IAE3B,gBAAgB,GAAG,8CAA8C,CAAC;IAElE,UAAU,GAAsB;QAC/B;YACC,WAAW,EAAE,WAAW;YACxB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC/B,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,iCAAiC;SAC9C;QACD;YACC,WAAW,EAAE,iBAAiB;YAC9B,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,2DAA2D;SACxE;QACD;YACC,WAAW,EAAE,UAAU;YACvB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,wBAAwB;YACjC,WAAW,EAAE,uCAAuC;SACpD;KACD,CAAC;IAEF,YAAY,GAAyB;QACpC,IAAI,EAAE,SAAS;QACf,UAAU,EAAE;YACX,OAAO,EAAE;gBACR,WAAW,EAAE,4BAA4B;aACzC;SACD;KACD,CAAC;IAEF,IAAI,GAA2B;QAC9B,OAAO,EAAE;YACR,OAAO,EAAE,2BAA2B;YACpC,GAAG,EAAE,mCAAmC;YACxC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACR,WAAW,EAAE,4BAA4B;aACzC;SACD;KACD,CAAC;CACF;AArDD,8BAqDC"}
@@ -0,0 +1,13 @@
1
+ import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription, ILoadOptionsFunctions, INodePropertyOptions } from 'n8n-workflow';
2
+ export declare class Addigy implements INodeType {
3
+ description: INodeTypeDescription;
4
+ methods: {
5
+ loadOptions: {
6
+ getDevices(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
7
+ getPolicies(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
8
+ getApplications(this: ILoadOptionsFunctions): Promise<INodePropertyOptions[]>;
9
+ };
10
+ };
11
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
12
+ }
13
+ //# sourceMappingURL=Addigy.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Addigy.node.d.ts","sourceRoot":"","sources":["../../../nodes/Addigy/Addigy.node.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EAEpB,MAAM,cAAc,CAAC;AAkBtB,qBAAa,MAAO,YAAW,SAAS;IACvC,WAAW,EAAE,oBAAoB,CAyE/B;IAEF,OAAO;;6BAEkB,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;8BAGtD,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;kCAGnD,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;;MAInF;IAEI,OAAO,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;CA6rBvE"}