@selvajs/platform 0.15.0-beta.4 → 0.16.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/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/interface.d.ts +61 -2
- package/dist/auth/interface.d.ts.map +1 -1
- package/dist/definitions/schemas.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/organizations/schemas.d.ts +2 -2
- package/dist/shareLinks/schemas.d.ts +1 -1
- package/dist/storage/image.js.map +1 -1
- package/dist/testing/suites/storageProviderSuite.d.ts.map +1 -1
- package/dist/testing/suites/storageProviderSuite.js +9 -4
- package/dist/testing/suites/storageProviderSuite.js.map +1 -1
- package/package.json +4 -4
- package/dist/auth.d.ts +0 -59
- package/dist/auth.d.ts.map +0 -1
- package/dist/auth.js +0 -12
- package/dist/auth.js.map +0 -1
- package/dist/compute.d.ts +0 -47
- package/dist/compute.d.ts.map +0 -1
- package/dist/compute.js +0 -11
- package/dist/compute.js.map +0 -1
- package/dist/definitions/service.d.ts +0 -63
- package/dist/definitions/service.d.ts.map +0 -1
- package/dist/definitions/service.js +0 -162
- package/dist/definitions/service.js.map +0 -1
- package/dist/definitions.d.ts +0 -135
- package/dist/definitions.d.ts.map +0 -1
- package/dist/definitions.js +0 -23
- package/dist/definitions.js.map +0 -1
- package/dist/invites/schemas.d.ts +0 -24
- package/dist/invites/schemas.d.ts.map +0 -1
- package/dist/invites/schemas.js +0 -17
- package/dist/invites/schemas.js.map +0 -1
- package/dist/organizations.d.ts +0 -93
- package/dist/organizations.d.ts.map +0 -1
- package/dist/organizations.js +0 -14
- package/dist/organizations.js.map +0 -1
- package/dist/testing/adapterSuite.d.ts +0 -33
- package/dist/testing/adapterSuite.d.ts.map +0 -1
- package/dist/testing/adapterSuite.js +0 -166
- package/dist/testing/adapterSuite.js.map +0 -1
- package/dist/testing/orgStoreSuite.d.ts +0 -32
- package/dist/testing/orgStoreSuite.d.ts.map +0 -1
- package/dist/testing/orgStoreSuite.js +0 -363
- package/dist/testing/orgStoreSuite.js.map +0 -1
- package/dist/testing/storageProviderSuite.d.ts +0 -30
- package/dist/testing/storageProviderSuite.d.ts.map +0 -1
- package/dist/testing/storageProviderSuite.js +0 -122
- package/dist/testing/storageProviderSuite.js.map +0 -1
- package/dist/testing/suites/runner.d.ts +0 -21
- package/dist/testing/suites/runner.d.ts.map +0 -1
- package/dist/testing/suites/runner.js +0 -7
- package/dist/testing/suites/runner.js.map +0 -1
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapter conformance suite for IDefinitionStore.
|
|
3
|
-
*
|
|
4
|
-
* The goal is to prove every adapter behaves identically from the consuming
|
|
5
|
-
* app's perspective — `ctx` scoping, `pending` filtering, `listStalePending`
|
|
6
|
-
* cutoff, history mutations, and error shapes.
|
|
7
|
-
*
|
|
8
|
-
* Runner-agnostic: callers inject a `{ describe, it, expect }` trio so this
|
|
9
|
-
* package stays test-framework free. For vitest or jest, pass the globals
|
|
10
|
-
* directly; for node:test, wrap them.
|
|
11
|
-
*/
|
|
12
|
-
import { SYSTEM_CONTEXT } from '../context.js';
|
|
13
|
-
function ctx(userId, permissions = ['platform_admin']) {
|
|
14
|
-
return { userId, permissions };
|
|
15
|
-
}
|
|
16
|
-
function record(overrides = {}) {
|
|
17
|
-
const now = new Date().toISOString();
|
|
18
|
-
return {
|
|
19
|
-
guid: overrides.guid ?? cryptoRandom(),
|
|
20
|
-
projectId: overrides.projectId ?? 'project-1',
|
|
21
|
-
ownerId: overrides.ownerId ?? 'user-1',
|
|
22
|
-
fileExt: overrides.fileExt ?? 'gh',
|
|
23
|
-
meta: overrides.meta ?? { displayName: 'Test' },
|
|
24
|
-
history: overrides.history ?? [],
|
|
25
|
-
maxHistory: overrides.maxHistory ?? 10,
|
|
26
|
-
status: overrides.status ?? 'ready',
|
|
27
|
-
createdAt: overrides.createdAt ?? now,
|
|
28
|
-
updatedAt: overrides.updatedAt ?? now,
|
|
29
|
-
...overrides
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
// Minimal UUID-ish helper — good enough for tests, no crypto import needed.
|
|
33
|
-
function cryptoRandom() {
|
|
34
|
-
return `test-${Math.random().toString(36).slice(2, 10)}`;
|
|
35
|
-
}
|
|
36
|
-
export function runDefinitionStoreConformance(opts) {
|
|
37
|
-
const { name, createStore, runner } = opts;
|
|
38
|
-
const { describe, it, expect } = runner;
|
|
39
|
-
describe(`IDefinitionStore conformance: ${name}`, () => {
|
|
40
|
-
it('create + get returns the record', async () => {
|
|
41
|
-
const store = await createStore();
|
|
42
|
-
const rec = record({ guid: 'g1' });
|
|
43
|
-
await store.create(ctx('u1'), rec);
|
|
44
|
-
const got = await store.get(ctx('u1'), 'g1');
|
|
45
|
-
expect(got?.guid).toBe('g1');
|
|
46
|
-
});
|
|
47
|
-
it('get returns null for missing guid', async () => {
|
|
48
|
-
const store = await createStore();
|
|
49
|
-
const got = await store.get(ctx('u1'), 'does-not-exist');
|
|
50
|
-
expect(got).toBeNull();
|
|
51
|
-
});
|
|
52
|
-
it('list filters pending by default', async () => {
|
|
53
|
-
const store = await createStore();
|
|
54
|
-
await store.create(ctx('u1'), record({ guid: 'r1', status: 'ready' }));
|
|
55
|
-
await store.create(ctx('u1'), record({ guid: 'p1', status: 'pending' }));
|
|
56
|
-
const page = await store.list(ctx('u1'));
|
|
57
|
-
const guids = page.items.map((r) => r.guid);
|
|
58
|
-
expect(guids).toContain('r1');
|
|
59
|
-
expect(guids.includes('p1')).toBe(false);
|
|
60
|
-
});
|
|
61
|
-
it('list with includePending returns pending too', async () => {
|
|
62
|
-
const store = await createStore();
|
|
63
|
-
await store.create(ctx('u1'), record({ guid: 'r1', status: 'ready' }));
|
|
64
|
-
await store.create(ctx('u1'), record({ guid: 'p1', status: 'pending' }));
|
|
65
|
-
const page = await store.list(ctx('u1'), { includePending: true });
|
|
66
|
-
const guids = page.items.map((r) => r.guid);
|
|
67
|
-
expect(guids).toContain('r1');
|
|
68
|
-
expect(guids).toContain('p1');
|
|
69
|
-
});
|
|
70
|
-
it('listByProject filters by projectId', async () => {
|
|
71
|
-
const store = await createStore();
|
|
72
|
-
await store.create(ctx('u1'), record({ guid: 'a', projectId: 'proj-a' }));
|
|
73
|
-
await store.create(ctx('u1'), record({ guid: 'b', projectId: 'proj-b' }));
|
|
74
|
-
const page = await store.listByProject(ctx('u1'), 'proj-a');
|
|
75
|
-
const guids = page.items.map((r) => r.guid);
|
|
76
|
-
expect(guids).toEqual(['a']);
|
|
77
|
-
});
|
|
78
|
-
it('update applies patch and bumps updatedAt', async () => {
|
|
79
|
-
const store = await createStore();
|
|
80
|
-
const created = record({ guid: 'u1', meta: { displayName: 'Old' } });
|
|
81
|
-
await store.create(ctx('u1'), created);
|
|
82
|
-
await store.update(ctx('u1'), 'u1', { meta: { displayName: 'New' } });
|
|
83
|
-
const got = await store.get(ctx('u1'), 'u1');
|
|
84
|
-
expect(got?.meta.displayName).toBe('New');
|
|
85
|
-
expect(got.updatedAt >= created.updatedAt).toBe(true);
|
|
86
|
-
});
|
|
87
|
-
it('update on missing guid throws ProviderError with status 404', async () => {
|
|
88
|
-
const store = await createStore();
|
|
89
|
-
let thrown;
|
|
90
|
-
try {
|
|
91
|
-
await store.update(ctx('u1'), 'nope', { meta: { displayName: 'X' } });
|
|
92
|
-
}
|
|
93
|
-
catch (err) {
|
|
94
|
-
thrown = err;
|
|
95
|
-
}
|
|
96
|
-
expect(thrown).toBeTruthy();
|
|
97
|
-
const e = thrown;
|
|
98
|
-
expect(e.statusCode).toBe(404);
|
|
99
|
-
});
|
|
100
|
-
it('status flip pending → ready via update', async () => {
|
|
101
|
-
const store = await createStore();
|
|
102
|
-
await store.create(ctx('u1'), record({ guid: 'x', status: 'pending' }));
|
|
103
|
-
const beforeFlip = await store.list(ctx('u1'));
|
|
104
|
-
expect(beforeFlip.items.map((r) => r.guid).includes('x')).toBe(false);
|
|
105
|
-
await store.update(ctx('u1'), 'x', { status: 'ready' });
|
|
106
|
-
const afterFlip = await store.list(ctx('u1'));
|
|
107
|
-
expect(afterFlip.items.map((r) => r.guid)).toContain('x');
|
|
108
|
-
});
|
|
109
|
-
it('addHistoryEntry prepends entries (newest first)', async () => {
|
|
110
|
-
const store = await createStore();
|
|
111
|
-
await store.create(ctx('u1'), record({ guid: 'h', maxHistory: 0 }));
|
|
112
|
-
const e1 = { ref: 'r1', originalName: 'a.gh', archivedAt: '2024-01-01' };
|
|
113
|
-
const e2 = { ref: 'r2', originalName: 'b.gh', archivedAt: '2024-01-02' };
|
|
114
|
-
await store.addHistoryEntry(ctx('u1'), 'h', e1);
|
|
115
|
-
await store.addHistoryEntry(ctx('u1'), 'h', e2);
|
|
116
|
-
const got = await store.get(ctx('u1'), 'h');
|
|
117
|
-
expect(got.history.map((h) => h.ref)).toEqual(['r2', 'r1']);
|
|
118
|
-
});
|
|
119
|
-
it('removeHistoryEntry removes the matching ref', async () => {
|
|
120
|
-
const store = await createStore();
|
|
121
|
-
const entry = { ref: 'keep', originalName: 'a.gh', archivedAt: '2024-01-01' };
|
|
122
|
-
const drop = { ref: 'drop', originalName: 'b.gh', archivedAt: '2024-01-02' };
|
|
123
|
-
await store.create(ctx('u1'), record({ guid: 'h', history: [drop, entry] }));
|
|
124
|
-
await store.removeHistoryEntry(ctx('u1'), 'h', 'drop');
|
|
125
|
-
const got = await store.get(ctx('u1'), 'h');
|
|
126
|
-
expect(got.history.map((h) => h.ref)).toEqual(['keep']);
|
|
127
|
-
});
|
|
128
|
-
it('delete removes the record', async () => {
|
|
129
|
-
const store = await createStore();
|
|
130
|
-
await store.create(ctx('u1'), record({ guid: 'd' }));
|
|
131
|
-
await store.delete(ctx('u1'), 'd');
|
|
132
|
-
const got = await store.get(ctx('u1'), 'd');
|
|
133
|
-
expect(got).toBeNull();
|
|
134
|
-
});
|
|
135
|
-
it('listStalePending returns only pending + older than cutoff', async () => {
|
|
136
|
-
const store = await createStore();
|
|
137
|
-
const old = '2024-01-01T00:00:00.000Z';
|
|
138
|
-
const recent = new Date().toISOString();
|
|
139
|
-
await store.create(ctx('u1'), record({ guid: 'old-pending', status: 'pending', createdAt: old }));
|
|
140
|
-
await store.create(ctx('u1'), record({ guid: 'new-pending', status: 'pending', createdAt: recent }));
|
|
141
|
-
await store.create(ctx('u1'), record({ guid: 'old-ready', status: 'ready', createdAt: old }));
|
|
142
|
-
const cutoff = '2024-06-01T00:00:00.000Z';
|
|
143
|
-
const stale = await store.listStalePending(SYSTEM_CONTEXT, cutoff);
|
|
144
|
-
const guids = stale.map((r) => r.guid);
|
|
145
|
-
expect(guids).toContain('old-pending');
|
|
146
|
-
expect(guids.includes('new-pending')).toBe(false);
|
|
147
|
-
expect(guids.includes('old-ready')).toBe(false);
|
|
148
|
-
});
|
|
149
|
-
it('pagination respects limit and nextCursor', async () => {
|
|
150
|
-
const store = await createStore();
|
|
151
|
-
for (let i = 0; i < 5; i++) {
|
|
152
|
-
await store.create(ctx('u1'), record({ guid: `p${i}`, meta: { displayName: `N${i}` } }));
|
|
153
|
-
}
|
|
154
|
-
const first = await store.list(ctx('u1'), { limit: 2 });
|
|
155
|
-
expect(first.items.length).toBe(2);
|
|
156
|
-
expect(first.nextCursor).toBeTruthy();
|
|
157
|
-
const second = await store.list(ctx('u1'), { limit: 2, cursor: first.nextCursor });
|
|
158
|
-
expect(second.items.length).toBe(2);
|
|
159
|
-
const firstGuids = new Set(first.items.map((r) => r.guid));
|
|
160
|
-
for (const item of second.items) {
|
|
161
|
-
expect(firstGuids.has(item.guid)).toBe(false);
|
|
162
|
-
}
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=adapterSuite.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"adapterSuite.js","sourceRoot":"","sources":["../../src/testing/adapterSuite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapter conformance suite for IOrgStore.
|
|
3
|
-
*
|
|
4
|
-
* Tests organization and project CRUD, membership management, pagination,
|
|
5
|
-
* and error handling to ensure all adapters behave identically.
|
|
6
|
-
*
|
|
7
|
-
* Runner-agnostic: callers inject a `{ describe, it, expect }` trio.
|
|
8
|
-
*/
|
|
9
|
-
import type { IOrgStore } from '../data/interface.js';
|
|
10
|
-
export interface ConformanceRunner {
|
|
11
|
-
describe: (name: string, fn: () => void) => void;
|
|
12
|
-
it: (name: string, fn: () => Promise<void> | void) => void;
|
|
13
|
-
expect: <T>(actual: T) => {
|
|
14
|
-
toBe: (expected: T) => void;
|
|
15
|
-
toEqual: (expected: unknown) => void;
|
|
16
|
-
toBeNull: () => void;
|
|
17
|
-
toBeTruthy: () => void;
|
|
18
|
-
toContain: (expected: unknown) => void;
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
export interface OrgStoreConformanceOptions {
|
|
22
|
-
/** Name to show in test output (e.g. "local-provider"). */
|
|
23
|
-
name: string;
|
|
24
|
-
/** Factory that returns a fresh, empty store per test. */
|
|
25
|
-
createStore: () => Promise<IOrgStore> | IOrgStore;
|
|
26
|
-
/** Test runner globals. */
|
|
27
|
-
runner: ConformanceRunner;
|
|
28
|
-
/** If true, only test the default org (e.g. for single-org providers like LocalOrganizationProvider). */
|
|
29
|
-
singleOrgMode?: boolean;
|
|
30
|
-
}
|
|
31
|
-
export declare function runOrgStoreConformance(opts: OrgStoreConformanceOptions): void;
|
|
32
|
-
//# sourceMappingURL=orgStoreSuite.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orgStoreSuite.d.ts","sourceRoot":"","sources":["../../src/testing/orgStoreSuite.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAItD,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;IACjD,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK;QACzB,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;QAC5B,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;QACrC,QAAQ,EAAE,MAAM,IAAI,CAAC;QACrB,UAAU,EAAE,MAAM,IAAI,CAAC;QACvB,SAAS,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;KACvC,CAAC;CACF;AAED,MAAM,WAAW,0BAA0B;IAC1C,2DAA2D;IAC3D,IAAI,EAAE,MAAM,CAAC;IACb,0DAA0D;IAC1D,WAAW,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IAClD,2BAA2B;IAC3B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,yGAAyG;IACzG,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAsCD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,0BAA0B,GAAG,IAAI,CA+V7E"}
|
|
@@ -1,363 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapter conformance suite for IOrgStore.
|
|
3
|
-
*
|
|
4
|
-
* Tests organization and project CRUD, membership management, pagination,
|
|
5
|
-
* and error handling to ensure all adapters behave identically.
|
|
6
|
-
*
|
|
7
|
-
* Runner-agnostic: callers inject a `{ describe, it, expect }` trio.
|
|
8
|
-
*/
|
|
9
|
-
function ctx(userId, permissions = ['platform_admin']) {
|
|
10
|
-
return { userId, permissions };
|
|
11
|
-
}
|
|
12
|
-
function org(overrides = {}) {
|
|
13
|
-
const now = new Date().toISOString();
|
|
14
|
-
return {
|
|
15
|
-
id: overrides.id ?? uuid(),
|
|
16
|
-
name: overrides.name ?? 'Test Org',
|
|
17
|
-
slug: overrides.slug ?? `test-${Math.random().toString(36).slice(2, 8)}`,
|
|
18
|
-
ownerId: overrides.ownerId ?? 'user-1',
|
|
19
|
-
createdAt: overrides.createdAt ?? now,
|
|
20
|
-
updatedAt: overrides.updatedAt ?? now,
|
|
21
|
-
...overrides
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
function project(overrides = {}) {
|
|
25
|
-
const now = new Date().toISOString();
|
|
26
|
-
return {
|
|
27
|
-
id: overrides.id ?? uuid(),
|
|
28
|
-
orgId: overrides.orgId ?? 'org-1',
|
|
29
|
-
name: overrides.name ?? 'Test Project',
|
|
30
|
-
slug: overrides.slug ?? `test-${Math.random().toString(36).slice(2, 8)}`,
|
|
31
|
-
visibility: overrides.visibility ?? 'private',
|
|
32
|
-
ownerId: overrides.ownerId ?? 'user-1',
|
|
33
|
-
createdAt: overrides.createdAt ?? now,
|
|
34
|
-
updatedAt: overrides.updatedAt ?? now,
|
|
35
|
-
...overrides
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
function uuid() {
|
|
39
|
-
return `${Math.random().toString(36).slice(2, 10)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
40
|
-
}
|
|
41
|
-
export function runOrgStoreConformance(opts) {
|
|
42
|
-
const { name, createStore, runner, singleOrgMode = false } = opts;
|
|
43
|
-
const { describe, it, expect } = runner;
|
|
44
|
-
describe(`IOrgStore conformance: ${name}`, () => {
|
|
45
|
-
// ============================================================================
|
|
46
|
-
// Organizations
|
|
47
|
-
// ============================================================================
|
|
48
|
-
if (!singleOrgMode) {
|
|
49
|
-
it('createOrg + getOrg returns the organization', async () => {
|
|
50
|
-
const store = await createStore();
|
|
51
|
-
const o = org({ id: 'o1', slug: 'acme' });
|
|
52
|
-
await store.createOrg(ctx('u1'), o);
|
|
53
|
-
const got = await store.getOrg(ctx('u1'), 'o1');
|
|
54
|
-
expect(got?.name).toBe('Test Org');
|
|
55
|
-
expect(got?.slug).toBe('acme');
|
|
56
|
-
});
|
|
57
|
-
it('getOrg returns null for missing id', async () => {
|
|
58
|
-
const store = await createStore();
|
|
59
|
-
const got = await store.getOrg(ctx('u1'), 'nonexistent');
|
|
60
|
-
expect(got).toBeNull();
|
|
61
|
-
});
|
|
62
|
-
it('getOrgBySlug finds org by slug', async () => {
|
|
63
|
-
const store = await createStore();
|
|
64
|
-
await store.createOrg(ctx('u1'), org({ id: 'o1', slug: 'acme-corp' }));
|
|
65
|
-
const got = await store.getOrgBySlug(ctx('u1'), 'acme-corp');
|
|
66
|
-
expect(got?.id).toBe('o1');
|
|
67
|
-
});
|
|
68
|
-
it('getOrgBySlug returns null for missing slug', async () => {
|
|
69
|
-
const store = await createStore();
|
|
70
|
-
const got = await store.getOrgBySlug(ctx('u1'), 'nonexistent');
|
|
71
|
-
expect(got).toBeNull();
|
|
72
|
-
});
|
|
73
|
-
it('updateOrg modifies name and slug', async () => {
|
|
74
|
-
const store = await createStore();
|
|
75
|
-
await store.createOrg(ctx('u1'), org({ id: 'o1', slug: 'old-slug' }));
|
|
76
|
-
await store.updateOrg(ctx('u1'), 'o1', { name: 'New Name', slug: 'new-slug' });
|
|
77
|
-
const got = await store.getOrg(ctx('u1'), 'o1');
|
|
78
|
-
expect(got?.name).toBe('New Name');
|
|
79
|
-
expect(got?.slug).toBe('new-slug');
|
|
80
|
-
});
|
|
81
|
-
it('deleteOrg removes the organization', async () => {
|
|
82
|
-
const store = await createStore();
|
|
83
|
-
await store.createOrg(ctx('u1'), org({ id: 'o1' }));
|
|
84
|
-
await store.deleteOrg(ctx('u1'), 'o1');
|
|
85
|
-
const got = await store.getOrg(ctx('u1'), 'o1');
|
|
86
|
-
expect(got).toBeNull();
|
|
87
|
-
});
|
|
88
|
-
it('listOrgs returns all organizations with pagination', async () => {
|
|
89
|
-
const store = await createStore();
|
|
90
|
-
for (let i = 0; i < 3; i++) {
|
|
91
|
-
await store.createOrg(ctx('u1'), org({ id: `o${i}` }));
|
|
92
|
-
}
|
|
93
|
-
const page = await store.listOrgs(ctx('u1'), { limit: 2 });
|
|
94
|
-
expect(page.items.length).toBe(2);
|
|
95
|
-
expect(page.nextCursor).toBeTruthy();
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
it('getOrg returns the default organization', async () => {
|
|
100
|
-
const store = await createStore();
|
|
101
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
102
|
-
expect(orgs.items.length > 0).toBe(true);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
// ============================================================================
|
|
106
|
-
// Org Members
|
|
107
|
-
// ============================================================================
|
|
108
|
-
it('addOrgMember + getOrgMember returns the member', async () => {
|
|
109
|
-
const store = await createStore();
|
|
110
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
111
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
112
|
-
if (!singleOrgMode) {
|
|
113
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
114
|
-
}
|
|
115
|
-
const member = {
|
|
116
|
-
orgId,
|
|
117
|
-
userId: 'u2',
|
|
118
|
-
role: 'member',
|
|
119
|
-
joinedAt: new Date().toISOString()
|
|
120
|
-
};
|
|
121
|
-
await store.addOrgMember(ctx('u1'), member);
|
|
122
|
-
const got = await store.getOrgMember(ctx('u1'), orgId, 'u2');
|
|
123
|
-
expect(got?.role).toBe('member');
|
|
124
|
-
});
|
|
125
|
-
it('getOrgMember returns null for missing member', async () => {
|
|
126
|
-
const store = await createStore();
|
|
127
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
128
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
129
|
-
if (!singleOrgMode) {
|
|
130
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
131
|
-
}
|
|
132
|
-
const got = await store.getOrgMember(ctx('u1'), orgId, 'nonexistent');
|
|
133
|
-
expect(got).toBeNull();
|
|
134
|
-
});
|
|
135
|
-
it('updateOrgMemberRole changes role', async () => {
|
|
136
|
-
const store = await createStore();
|
|
137
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
138
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
139
|
-
if (!singleOrgMode) {
|
|
140
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
141
|
-
}
|
|
142
|
-
const member = {
|
|
143
|
-
orgId,
|
|
144
|
-
userId: 'u2',
|
|
145
|
-
role: 'member',
|
|
146
|
-
joinedAt: new Date().toISOString()
|
|
147
|
-
};
|
|
148
|
-
await store.addOrgMember(ctx('u1'), member);
|
|
149
|
-
await store.updateOrgMemberRole(ctx('u1'), orgId, 'u2', 'admin');
|
|
150
|
-
const got = await store.getOrgMember(ctx('u1'), orgId, 'u2');
|
|
151
|
-
expect(got?.role).toBe('admin');
|
|
152
|
-
});
|
|
153
|
-
it('removeOrgMember deletes the member', async () => {
|
|
154
|
-
const store = await createStore();
|
|
155
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
156
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
157
|
-
if (!singleOrgMode) {
|
|
158
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
159
|
-
}
|
|
160
|
-
const member = {
|
|
161
|
-
orgId,
|
|
162
|
-
userId: 'u2',
|
|
163
|
-
role: 'member',
|
|
164
|
-
joinedAt: new Date().toISOString()
|
|
165
|
-
};
|
|
166
|
-
await store.addOrgMember(ctx('u1'), member);
|
|
167
|
-
await store.removeOrgMember(ctx('u1'), orgId, 'u2');
|
|
168
|
-
const got = await store.getOrgMember(ctx('u1'), orgId, 'u2');
|
|
169
|
-
expect(got).toBeNull();
|
|
170
|
-
});
|
|
171
|
-
it('listOrgMembers returns members with pagination', async () => {
|
|
172
|
-
const store = await createStore();
|
|
173
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
174
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
175
|
-
if (!singleOrgMode) {
|
|
176
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
177
|
-
}
|
|
178
|
-
for (let i = 0; i < 3; i++) {
|
|
179
|
-
await store.addOrgMember(ctx('u1'), {
|
|
180
|
-
orgId,
|
|
181
|
-
userId: `u${i}`,
|
|
182
|
-
role: 'member',
|
|
183
|
-
joinedAt: new Date().toISOString()
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
const page = await store.listOrgMembers(ctx('u1'), orgId, { limit: 2 });
|
|
187
|
-
expect(page.items.length).toBe(2);
|
|
188
|
-
});
|
|
189
|
-
// ============================================================================
|
|
190
|
-
// Projects
|
|
191
|
-
// ============================================================================
|
|
192
|
-
it('createProject + getProject returns the project', async () => {
|
|
193
|
-
const store = await createStore();
|
|
194
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
195
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
196
|
-
if (!singleOrgMode) {
|
|
197
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
198
|
-
}
|
|
199
|
-
const p = project({ id: 'p1', orgId });
|
|
200
|
-
await store.createProject(ctx('u1'), p);
|
|
201
|
-
const got = await store.getProject(ctx('u1'), 'p1');
|
|
202
|
-
expect(got?.name).toBe('Test Project');
|
|
203
|
-
});
|
|
204
|
-
it('getProject returns null for missing id', async () => {
|
|
205
|
-
const store = await createStore();
|
|
206
|
-
const got = await store.getProject(ctx('u1'), 'nonexistent');
|
|
207
|
-
expect(got).toBeNull();
|
|
208
|
-
});
|
|
209
|
-
it('getProjectBySlug finds project by slug within org', async () => {
|
|
210
|
-
const store = await createStore();
|
|
211
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
212
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
213
|
-
if (!singleOrgMode) {
|
|
214
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
215
|
-
}
|
|
216
|
-
await store.createProject(ctx('u1'), project({ id: 'p1', orgId, slug: 'my-proj' }));
|
|
217
|
-
const got = await store.getProjectBySlug(ctx('u1'), orgId, 'my-proj');
|
|
218
|
-
expect(got?.id).toBe('p1');
|
|
219
|
-
});
|
|
220
|
-
it('getProjectBySlug returns null for missing slug', async () => {
|
|
221
|
-
const store = await createStore();
|
|
222
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
223
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
224
|
-
const got = await store.getProjectBySlug(ctx('u1'), orgId, 'nonexistent');
|
|
225
|
-
expect(got).toBeNull();
|
|
226
|
-
});
|
|
227
|
-
it('updateProject modifies name, slug, description, visibility', async () => {
|
|
228
|
-
const store = await createStore();
|
|
229
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
230
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
231
|
-
if (!singleOrgMode) {
|
|
232
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
233
|
-
}
|
|
234
|
-
await store.createProject(ctx('u1'), project({ id: 'p1', orgId, slug: 'old', visibility: 'private' }));
|
|
235
|
-
await store.updateProject(ctx('u1'), 'p1', {
|
|
236
|
-
name: 'New Name',
|
|
237
|
-
slug: 'new-slug',
|
|
238
|
-
description: 'New desc',
|
|
239
|
-
visibility: 'org'
|
|
240
|
-
});
|
|
241
|
-
const got = await store.getProject(ctx('u1'), 'p1');
|
|
242
|
-
expect(got?.name).toBe('New Name');
|
|
243
|
-
expect(got?.slug).toBe('new-slug');
|
|
244
|
-
expect(got?.description).toBe('New desc');
|
|
245
|
-
expect(got?.visibility).toBe('org');
|
|
246
|
-
});
|
|
247
|
-
it('deleteProject removes the project', async () => {
|
|
248
|
-
const store = await createStore();
|
|
249
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
250
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
251
|
-
if (!singleOrgMode) {
|
|
252
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
253
|
-
}
|
|
254
|
-
await store.createProject(ctx('u1'), project({ id: 'p1', orgId }));
|
|
255
|
-
await store.deleteProject(ctx('u1'), 'p1');
|
|
256
|
-
const got = await store.getProject(ctx('u1'), 'p1');
|
|
257
|
-
expect(got).toBeNull();
|
|
258
|
-
});
|
|
259
|
-
it('listProjects returns projects for org with pagination', async () => {
|
|
260
|
-
const store = await createStore();
|
|
261
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
262
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
263
|
-
if (!singleOrgMode) {
|
|
264
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
265
|
-
}
|
|
266
|
-
for (let i = 0; i < 3; i++) {
|
|
267
|
-
await store.createProject(ctx('u1'), project({ id: `p${i}`, orgId }));
|
|
268
|
-
}
|
|
269
|
-
const page = await store.listProjects(ctx('u1'), orgId, { limit: 2 });
|
|
270
|
-
expect(page.items.length).toBe(2);
|
|
271
|
-
});
|
|
272
|
-
// ============================================================================
|
|
273
|
-
// Project Members
|
|
274
|
-
// ============================================================================
|
|
275
|
-
it('addProjectMember + getProjectMember returns the member', async () => {
|
|
276
|
-
const store = await createStore();
|
|
277
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
278
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
279
|
-
if (!singleOrgMode) {
|
|
280
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
281
|
-
}
|
|
282
|
-
await store.createProject(ctx('u1'), project({ id: 'p1', orgId }));
|
|
283
|
-
const member = {
|
|
284
|
-
projectId: 'p1',
|
|
285
|
-
userId: 'u2',
|
|
286
|
-
role: 'editor',
|
|
287
|
-
joinedAt: new Date().toISOString()
|
|
288
|
-
};
|
|
289
|
-
await store.addProjectMember(ctx('u1'), member);
|
|
290
|
-
const got = await store.getProjectMember(ctx('u1'), 'p1', 'u2');
|
|
291
|
-
expect(got?.role).toBe('editor');
|
|
292
|
-
});
|
|
293
|
-
it('getProjectMember returns null for missing member', async () => {
|
|
294
|
-
const store = await createStore();
|
|
295
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
296
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
297
|
-
if (!singleOrgMode) {
|
|
298
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
299
|
-
}
|
|
300
|
-
await store.createProject(ctx('u1'), project({ id: 'p1', orgId }));
|
|
301
|
-
const got = await store.getProjectMember(ctx('u1'), 'p1', 'nonexistent');
|
|
302
|
-
expect(got).toBeNull();
|
|
303
|
-
});
|
|
304
|
-
it('updateProjectMemberRole changes role', async () => {
|
|
305
|
-
const store = await createStore();
|
|
306
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
307
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
308
|
-
if (!singleOrgMode) {
|
|
309
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
310
|
-
}
|
|
311
|
-
await store.createProject(ctx('u1'), project({ id: 'p1', orgId }));
|
|
312
|
-
const member = {
|
|
313
|
-
projectId: 'p1',
|
|
314
|
-
userId: 'u2',
|
|
315
|
-
role: 'viewer',
|
|
316
|
-
joinedAt: new Date().toISOString()
|
|
317
|
-
};
|
|
318
|
-
await store.addProjectMember(ctx('u1'), member);
|
|
319
|
-
await store.updateProjectMemberRole(ctx('u1'), 'p1', 'u2', 'editor');
|
|
320
|
-
const got = await store.getProjectMember(ctx('u1'), 'p1', 'u2');
|
|
321
|
-
expect(got?.role).toBe('editor');
|
|
322
|
-
});
|
|
323
|
-
it('removeProjectMember deletes the member', async () => {
|
|
324
|
-
const store = await createStore();
|
|
325
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
326
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
327
|
-
if (!singleOrgMode) {
|
|
328
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
329
|
-
}
|
|
330
|
-
await store.createProject(ctx('u1'), project({ id: 'p1', orgId }));
|
|
331
|
-
const member = {
|
|
332
|
-
projectId: 'p1',
|
|
333
|
-
userId: 'u2',
|
|
334
|
-
role: 'editor',
|
|
335
|
-
joinedAt: new Date().toISOString()
|
|
336
|
-
};
|
|
337
|
-
await store.addProjectMember(ctx('u1'), member);
|
|
338
|
-
await store.removeProjectMember(ctx('u1'), 'p1', 'u2');
|
|
339
|
-
const got = await store.getProjectMember(ctx('u1'), 'p1', 'u2');
|
|
340
|
-
expect(got).toBeNull();
|
|
341
|
-
});
|
|
342
|
-
it('listProjectMembers returns members with pagination', async () => {
|
|
343
|
-
const store = await createStore();
|
|
344
|
-
const orgs = await store.listOrgs(ctx('u1'));
|
|
345
|
-
const orgId = singleOrgMode ? orgs.items[0].id : 'o1';
|
|
346
|
-
if (!singleOrgMode) {
|
|
347
|
-
await store.createOrg(ctx('u1'), org({ id: orgId }));
|
|
348
|
-
}
|
|
349
|
-
await store.createProject(ctx('u1'), project({ id: 'p1', orgId }));
|
|
350
|
-
for (let i = 0; i < 3; i++) {
|
|
351
|
-
await store.addProjectMember(ctx('u1'), {
|
|
352
|
-
projectId: 'p1',
|
|
353
|
-
userId: `u${i}`,
|
|
354
|
-
role: 'viewer',
|
|
355
|
-
joinedAt: new Date().toISOString()
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
const page = await store.listProjectMembers(ctx('u1'), 'p1', { limit: 2 });
|
|
359
|
-
expect(page.items.length).toBe(2);
|
|
360
|
-
});
|
|
361
|
-
});
|
|
362
|
-
}
|
|
363
|
-
//# sourceMappingURL=orgStoreSuite.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orgStoreSuite.js","sourceRoot":"","sources":["../../src/testing/orgStoreSuite.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6BH,SAAS,GAAG,CAAC,MAAc,EAAE,cAA6C,CAAC,gBAAgB,CAAC;IAC3F,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,GAAG,CAAC,YAAmC,EAAE;IACjD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACN,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI,EAAE;QAC1B,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,UAAU;QAClC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACxE,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,QAAQ;QACtC,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,GAAG;QACrC,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,GAAG;QACrC,GAAG,SAAS;KACZ,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,YAA8B,EAAE;IAChD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO;QACN,EAAE,EAAE,SAAS,CAAC,EAAE,IAAI,IAAI,EAAE;QAC1B,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,OAAO;QACjC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,cAAc;QACtC,IAAI,EAAE,SAAS,CAAC,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QACxE,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,SAAS;QAC7C,OAAO,EAAE,SAAS,CAAC,OAAO,IAAI,QAAQ;QACtC,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,GAAG;QACrC,SAAS,EAAE,SAAS,CAAC,SAAS,IAAI,GAAG;QACrC,GAAG,SAAS;KACZ,CAAC;AACH,CAAC;AAED,SAAS,IAAI;IACZ,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAgC;IACtE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,GAAG,KAAK,EAAE,GAAG,IAAI,CAAC;IAClE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAExC,QAAQ,CAAC,0BAA0B,IAAI,EAAE,EAAE,GAAG,EAAE;QAC/C,+EAA+E;QAC/E,gBAAgB;QAChB,+EAA+E;QAE/E,IAAI,CAAC,aAAa,EAAE,CAAC;YACpB,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;gBAC5D,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC1C,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACnC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;gBACnD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;gBACzD,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;gBAC/C,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBACvE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,CAAC;gBAC7D,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;gBAC3D,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;gBAC/D,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;gBACjD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;gBACtE,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;gBAC/E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACnC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;gBACnD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACpD,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBACvC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;gBAChD,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;gBACnE,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBACxD,CAAC;gBACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC3D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,EAAE,CAAC;YACtC,CAAC,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;gBACxD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;gBAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACJ,CAAC;QAED,+EAA+E;QAC/E,cAAc;QACd,+EAA+E;QAE/E,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,MAAM,GAAc;gBACzB,KAAK;gBACL,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;YACF,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;YACtE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,MAAM,GAAc;gBACzB,KAAK;gBACL,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;YACF,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,MAAM,GAAc;gBACzB,KAAK;gBACL,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;YACF,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACnC,KAAK;oBACL,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAClC,CAAC,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,+EAA+E;QAC/E,WAAW;QACX,+EAA+E;QAE/E,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC,CAAC;YAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACpF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;YACtE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;YAC1E,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,aAAa,CACxB,GAAG,CAAC,IAAI,CAAC,EACT,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAChE,CAAC;YACF,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE;gBAC1C,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,UAAU;gBAChB,WAAW,EAAE,UAAU;gBACvB,UAAU,EAAE,KAAK;aACjB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YAClD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACtE,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACtE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,+EAA+E;QAC/E,kBAAkB;QAClB,+EAA+E;QAE/E,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAkB;gBAC7B,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;YACF,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,CAAC;YACzE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAkB;gBAC7B,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;YACF,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,KAAK,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;YACrE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACnE,MAAM,MAAM,GAAkB;gBAC7B,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,IAAI;gBACZ,IAAI,EAAE,QAAQ;gBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAClC,CAAC;YACF,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YAChD,MAAM,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,KAAK,GAAG,MAAM,WAAW,EAAE,CAAC;YAClC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACtD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACpB,MAAM,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACvC,SAAS,EAAE,IAAI;oBACf,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAClC,CAAC,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YAC3E,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
|