@orgloop/connector-openclaw 0.1.7 → 0.1.9
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/package.json +2 -2
- package/dist/__tests__/detector.test.d.ts +0 -2
- package/dist/__tests__/detector.test.d.ts.map +0 -1
- package/dist/__tests__/detector.test.js +0 -62
- package/dist/__tests__/detector.test.js.map +0 -1
- package/dist/__tests__/target.test.d.ts +0 -2
- package/dist/__tests__/target.test.d.ts.map +0 -1
- package/dist/__tests__/target.test.js +0 -161
- package/dist/__tests__/target.test.js.map +0 -1
- package/dist/__tests__/validator.test.d.ts +0 -2
- package/dist/__tests__/validator.test.d.ts.map +0 -1
- package/dist/__tests__/validator.test.js +0 -72
- package/dist/__tests__/validator.test.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@orgloop/connector-openclaw",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "OrgLoop OpenClaw connector — webhook target for agent waking",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"dependencies": {
|
|
9
|
-
"@orgloop/sdk": "0.1.
|
|
9
|
+
"@orgloop/sdk": "0.1.9"
|
|
10
10
|
},
|
|
11
11
|
"orgloop": {
|
|
12
12
|
"type": "connector",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detector.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/detector.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { OpenClawServiceDetector } from '../detector.js';
|
|
3
|
-
describe('OpenClawServiceDetector', () => {
|
|
4
|
-
let detector;
|
|
5
|
-
let fetchMock;
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
detector = new OpenClawServiceDetector('http://localhost:18789');
|
|
8
|
-
fetchMock = vi.fn();
|
|
9
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
10
|
-
});
|
|
11
|
-
afterEach(() => {
|
|
12
|
-
vi.restoreAllMocks();
|
|
13
|
-
});
|
|
14
|
-
it('returns running when service responds', async () => {
|
|
15
|
-
fetchMock.mockResolvedValueOnce({
|
|
16
|
-
ok: true,
|
|
17
|
-
status: 200,
|
|
18
|
-
headers: new Headers({ server: 'openclaw/1.2.3' }),
|
|
19
|
-
});
|
|
20
|
-
const result = await detector.detect();
|
|
21
|
-
expect(result.running).toBe(true);
|
|
22
|
-
expect(result.endpoint).toBe('http://localhost:18789');
|
|
23
|
-
expect(result.details?.status).toBe(200);
|
|
24
|
-
expect(result.details?.server).toBe('openclaw/1.2.3');
|
|
25
|
-
});
|
|
26
|
-
it('returns running even on 404 (service is there)', async () => {
|
|
27
|
-
fetchMock.mockResolvedValueOnce({
|
|
28
|
-
ok: false,
|
|
29
|
-
status: 404,
|
|
30
|
-
headers: new Headers({}),
|
|
31
|
-
});
|
|
32
|
-
const result = await detector.detect();
|
|
33
|
-
expect(result.running).toBe(true);
|
|
34
|
-
expect(result.details?.status).toBe(404);
|
|
35
|
-
});
|
|
36
|
-
it('returns not running on connection refused', async () => {
|
|
37
|
-
fetchMock.mockRejectedValueOnce(new Error('connect ECONNREFUSED 127.0.0.1:18789'));
|
|
38
|
-
const result = await detector.detect();
|
|
39
|
-
expect(result.running).toBe(false);
|
|
40
|
-
expect(result.endpoint).toBe('http://localhost:18789');
|
|
41
|
-
expect(result.details?.error).toContain('ECONNREFUSED');
|
|
42
|
-
});
|
|
43
|
-
it('returns not running on timeout', async () => {
|
|
44
|
-
const abortError = new DOMException('The operation was aborted', 'AbortError');
|
|
45
|
-
fetchMock.mockRejectedValueOnce(abortError);
|
|
46
|
-
const result = await detector.detect();
|
|
47
|
-
expect(result.running).toBe(false);
|
|
48
|
-
expect(result.details?.error).toContain('timed out');
|
|
49
|
-
});
|
|
50
|
-
it('uses default base URL', () => {
|
|
51
|
-
const defaultDetector = new OpenClawServiceDetector();
|
|
52
|
-
// The constructor sets the URL; we verify by calling detect
|
|
53
|
-
fetchMock.mockResolvedValueOnce({
|
|
54
|
-
ok: true,
|
|
55
|
-
status: 200,
|
|
56
|
-
headers: new Headers({}),
|
|
57
|
-
});
|
|
58
|
-
defaultDetector.detect();
|
|
59
|
-
expect(fetchMock).toHaveBeenCalledWith('http://127.0.0.1:18789', expect.anything());
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
//# sourceMappingURL=detector.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"detector.test.js","sourceRoot":"","sources":["../../src/__tests__/detector.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"target.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/target.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { createTestEvent } from '@orgloop/sdk';
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import { OpenClawTarget } from '../target.js';
|
|
4
|
-
describe('OpenClawTarget', () => {
|
|
5
|
-
let target;
|
|
6
|
-
let fetchMock;
|
|
7
|
-
beforeEach(async () => {
|
|
8
|
-
target = new OpenClawTarget();
|
|
9
|
-
await target.init({
|
|
10
|
-
id: 'openclaw-engineering-agent',
|
|
11
|
-
connector: '@orgloop/connector-openclaw',
|
|
12
|
-
config: {
|
|
13
|
-
base_url: 'http://localhost:18789',
|
|
14
|
-
agent_id: 'test-agent',
|
|
15
|
-
},
|
|
16
|
-
});
|
|
17
|
-
fetchMock = vi.fn().mockResolvedValue({
|
|
18
|
-
ok: true,
|
|
19
|
-
status: 200,
|
|
20
|
-
statusText: 'OK',
|
|
21
|
-
});
|
|
22
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
23
|
-
});
|
|
24
|
-
afterEach(() => {
|
|
25
|
-
vi.restoreAllMocks();
|
|
26
|
-
});
|
|
27
|
-
it('sends correct OpenClaw payload shape', async () => {
|
|
28
|
-
const event = createTestEvent({
|
|
29
|
-
source: 'github',
|
|
30
|
-
type: 'resource.changed',
|
|
31
|
-
provenance: {
|
|
32
|
-
platform: 'github',
|
|
33
|
-
platform_event: 'pull_request.review_submitted',
|
|
34
|
-
author: 'alice',
|
|
35
|
-
author_type: 'team_member',
|
|
36
|
-
},
|
|
37
|
-
payload: { pr_number: 42 },
|
|
38
|
-
});
|
|
39
|
-
const routeConfig = {
|
|
40
|
-
session_key: 'hook:github:pr-review:engineering',
|
|
41
|
-
wake_mode: 'now',
|
|
42
|
-
deliver: true,
|
|
43
|
-
launch_prompt: 'Review this PR',
|
|
44
|
-
};
|
|
45
|
-
const result = await target.deliver(event, routeConfig);
|
|
46
|
-
expect(result.status).toBe('delivered');
|
|
47
|
-
expect(fetchMock).toHaveBeenCalledOnce();
|
|
48
|
-
const [url, opts] = fetchMock.mock.calls[0];
|
|
49
|
-
expect(url).toBe('http://localhost:18789/hooks/agent');
|
|
50
|
-
const body = JSON.parse(opts.body);
|
|
51
|
-
// Assert correct fields present
|
|
52
|
-
expect(body).toHaveProperty('message');
|
|
53
|
-
expect(body).toHaveProperty('sessionKey', 'hook:github:pr-review:engineering');
|
|
54
|
-
expect(body).toHaveProperty('agentId', 'test-agent');
|
|
55
|
-
expect(body).toHaveProperty('wakeMode', 'now');
|
|
56
|
-
expect(body).toHaveProperty('deliver', true);
|
|
57
|
-
// Assert old fields are NOT present
|
|
58
|
-
expect(body).not.toHaveProperty('event');
|
|
59
|
-
expect(body).not.toHaveProperty('launch_prompt');
|
|
60
|
-
expect(body).not.toHaveProperty('agent_id');
|
|
61
|
-
// Assert message contains event context and payload values
|
|
62
|
-
expect(body.message).toContain('github');
|
|
63
|
-
expect(body.message).toContain('resource.changed');
|
|
64
|
-
expect(body.message).toContain('Review this PR');
|
|
65
|
-
expect(body.message).toContain('pr_number: 42');
|
|
66
|
-
expect(body.message).toContain('Instructions:');
|
|
67
|
-
});
|
|
68
|
-
it('generates fallback sessionKey from event', async () => {
|
|
69
|
-
const event = createTestEvent({
|
|
70
|
-
source: 'linear',
|
|
71
|
-
type: 'resource.changed',
|
|
72
|
-
});
|
|
73
|
-
const routeConfig = {};
|
|
74
|
-
await target.deliver(event, routeConfig);
|
|
75
|
-
const body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
76
|
-
expect(body.sessionKey).toBe('orgloop:linear:resource.changed');
|
|
77
|
-
});
|
|
78
|
-
it('includes platform_event and author in message', async () => {
|
|
79
|
-
const event = createTestEvent({
|
|
80
|
-
source: 'github',
|
|
81
|
-
type: 'resource.changed',
|
|
82
|
-
provenance: {
|
|
83
|
-
platform: 'github',
|
|
84
|
-
platform_event: 'pull_request.merged',
|
|
85
|
-
author: 'bob',
|
|
86
|
-
author_type: 'team_member',
|
|
87
|
-
},
|
|
88
|
-
});
|
|
89
|
-
await target.deliver(event, {});
|
|
90
|
-
const body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
91
|
-
expect(body.message).toContain('pull_request.merged');
|
|
92
|
-
expect(body.message).toContain('bob');
|
|
93
|
-
});
|
|
94
|
-
it('includes full payload values and provenance context in message', async () => {
|
|
95
|
-
const event = createTestEvent({
|
|
96
|
-
source: 'linear',
|
|
97
|
-
type: 'resource.changed',
|
|
98
|
-
provenance: {
|
|
99
|
-
platform: 'linear',
|
|
100
|
-
platform_event: 'comment.created',
|
|
101
|
-
author: 'Alice',
|
|
102
|
-
author_type: 'team_member',
|
|
103
|
-
issue_id: 'ENG-42',
|
|
104
|
-
url: 'https://linear.app/team/issue/ENG-42#comment-abc',
|
|
105
|
-
},
|
|
106
|
-
payload: {
|
|
107
|
-
action: 'comment_created',
|
|
108
|
-
issue_id: 'ENG-42',
|
|
109
|
-
issue_title: 'Fix the widget',
|
|
110
|
-
comment_body: 'This needs a different approach — see the RFC.',
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
await target.deliver(event, { launch_prompt: 'Handle this Linear activity' });
|
|
114
|
-
const body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
115
|
-
const msg = body.message;
|
|
116
|
-
// Header
|
|
117
|
-
expect(msg).toContain('[linear] resource.changed (comment.created) by Alice');
|
|
118
|
-
// Provenance context (url, issue_id — not platform/author which are in header)
|
|
119
|
-
expect(msg).toContain('issue_id: ENG-42');
|
|
120
|
-
expect(msg).toContain('url: https://linear.app/team/issue/ENG-42#comment-abc');
|
|
121
|
-
// Payload values — the actual data the LLM needs
|
|
122
|
-
expect(msg).toContain('issue_title: Fix the widget');
|
|
123
|
-
expect(msg).toContain('comment_body: This needs a different approach — see the RFC.');
|
|
124
|
-
// Instructions
|
|
125
|
-
expect(msg).toContain('Handle this Linear activity');
|
|
126
|
-
});
|
|
127
|
-
it('defaults wakeMode to "now"', async () => {
|
|
128
|
-
const event = createTestEvent();
|
|
129
|
-
await target.deliver(event, {});
|
|
130
|
-
const body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
131
|
-
expect(body.wakeMode).toBe('now');
|
|
132
|
-
});
|
|
133
|
-
it('defaults deliver to false', async () => {
|
|
134
|
-
const event = createTestEvent();
|
|
135
|
-
await target.deliver(event, {});
|
|
136
|
-
const body = JSON.parse(fetchMock.mock.calls[0][1].body);
|
|
137
|
-
expect(body.deliver).toBe(false);
|
|
138
|
-
});
|
|
139
|
-
it('handles 429 rate limit', async () => {
|
|
140
|
-
fetchMock.mockResolvedValueOnce({
|
|
141
|
-
ok: false,
|
|
142
|
-
status: 429,
|
|
143
|
-
statusText: 'Too Many Requests',
|
|
144
|
-
});
|
|
145
|
-
const event = createTestEvent();
|
|
146
|
-
const result = await target.deliver(event, {});
|
|
147
|
-
expect(result.status).toBe('error');
|
|
148
|
-
expect(result.error?.message).toContain('429');
|
|
149
|
-
});
|
|
150
|
-
it('handles 4xx rejection', async () => {
|
|
151
|
-
fetchMock.mockResolvedValueOnce({
|
|
152
|
-
ok: false,
|
|
153
|
-
status: 400,
|
|
154
|
-
statusText: 'Bad Request',
|
|
155
|
-
});
|
|
156
|
-
const event = createTestEvent();
|
|
157
|
-
const result = await target.deliver(event, {});
|
|
158
|
-
expect(result.status).toBe('rejected');
|
|
159
|
-
});
|
|
160
|
-
});
|
|
161
|
-
//# sourceMappingURL=target.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"target.test.js","sourceRoot":"","sources":["../../src/__tests__/target.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/validator.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { OpenClawCredentialValidator } from '../validator.js';
|
|
3
|
-
describe('OpenClawCredentialValidator', () => {
|
|
4
|
-
let validator;
|
|
5
|
-
let fetchMock;
|
|
6
|
-
beforeEach(() => {
|
|
7
|
-
validator = new OpenClawCredentialValidator('http://localhost:18789');
|
|
8
|
-
fetchMock = vi.fn();
|
|
9
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
10
|
-
});
|
|
11
|
-
afterEach(() => {
|
|
12
|
-
vi.restoreAllMocks();
|
|
13
|
-
});
|
|
14
|
-
it('returns valid on successful response', async () => {
|
|
15
|
-
fetchMock.mockResolvedValueOnce({
|
|
16
|
-
ok: true,
|
|
17
|
-
status: 200,
|
|
18
|
-
});
|
|
19
|
-
const result = await validator.validate('test-token');
|
|
20
|
-
expect(result.valid).toBe(true);
|
|
21
|
-
expect(fetchMock).toHaveBeenCalledWith('http://localhost:18789/hooks/agent', expect.objectContaining({
|
|
22
|
-
method: 'POST',
|
|
23
|
-
headers: expect.objectContaining({
|
|
24
|
-
Authorization: 'Bearer test-token',
|
|
25
|
-
}),
|
|
26
|
-
}));
|
|
27
|
-
});
|
|
28
|
-
it('returns invalid on 401', async () => {
|
|
29
|
-
fetchMock.mockResolvedValueOnce({
|
|
30
|
-
ok: false,
|
|
31
|
-
status: 401,
|
|
32
|
-
statusText: 'Unauthorized',
|
|
33
|
-
});
|
|
34
|
-
const result = await validator.validate('bad-token');
|
|
35
|
-
expect(result.valid).toBe(false);
|
|
36
|
-
expect(result.error).toContain('401');
|
|
37
|
-
});
|
|
38
|
-
it('returns invalid on 403', async () => {
|
|
39
|
-
fetchMock.mockResolvedValueOnce({
|
|
40
|
-
ok: false,
|
|
41
|
-
status: 403,
|
|
42
|
-
statusText: 'Forbidden',
|
|
43
|
-
});
|
|
44
|
-
const result = await validator.validate('bad-token');
|
|
45
|
-
expect(result.valid).toBe(false);
|
|
46
|
-
expect(result.error).toContain('403');
|
|
47
|
-
});
|
|
48
|
-
it('returns valid on other errors (token accepted but other issue)', async () => {
|
|
49
|
-
fetchMock.mockResolvedValueOnce({
|
|
50
|
-
ok: false,
|
|
51
|
-
status: 400,
|
|
52
|
-
statusText: 'Bad Request',
|
|
53
|
-
});
|
|
54
|
-
const result = await validator.validate('good-token');
|
|
55
|
-
// Not a 401/403, so the token was accepted
|
|
56
|
-
expect(result.valid).toBe(true);
|
|
57
|
-
});
|
|
58
|
-
it('fails open on network error', async () => {
|
|
59
|
-
fetchMock.mockRejectedValueOnce(new Error('connect ECONNREFUSED'));
|
|
60
|
-
const result = await validator.validate('any-token');
|
|
61
|
-
expect(result.valid).toBe(true);
|
|
62
|
-
expect(result.error).toContain('Could not reach OpenClaw');
|
|
63
|
-
});
|
|
64
|
-
it('fails open on timeout', async () => {
|
|
65
|
-
const abortError = new DOMException('The operation was aborted', 'AbortError');
|
|
66
|
-
fetchMock.mockRejectedValueOnce(abortError);
|
|
67
|
-
const result = await validator.validate('any-token');
|
|
68
|
-
expect(result.valid).toBe(true);
|
|
69
|
-
expect(result.error).toContain('timed out');
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
//# sourceMappingURL=validator.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validator.test.js","sourceRoot":"","sources":["../../src/__tests__/validator.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAE9D,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC5C,IAAI,SAAsC,CAAC;IAC3C,IAAI,SAAmC,CAAC;IAExC,UAAU,CAAC,GAAG,EAAE;QACf,SAAS,GAAG,IAAI,2BAA2B,CAAC,wBAAwB,CAAC,CAAC;QACtE,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACpB,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,eAAe,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;QACrD,SAAS,CAAC,qBAAqB,CAAC;YAC/B,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,GAAG;SACX,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEtD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACrC,oCAAoC,EACpC,MAAM,CAAC,gBAAgB,CAAC;YACvB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC;gBAChC,aAAa,EAAE,mBAAmB;aAClC,CAAC;SACF,CAAC,CACF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACvC,SAAS,CAAC,qBAAqB,CAAC;YAC/B,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,cAAc;SAC1B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAErD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACvC,SAAS,CAAC,qBAAqB,CAAC;YAC/B,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,WAAW;SACvB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAErD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC/E,SAAS,CAAC,qBAAqB,CAAC;YAC/B,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,aAAa;SACzB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAEtD,2CAA2C;QAC3C,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC5C,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAEnE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAErD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,2BAA2B,EAAE,YAAY,CAAC,CAAC;QAC/E,SAAS,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAErD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|