@omujs/chat 0.2.0 → 0.3.4
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/CHANGELOG.md +54 -0
- package/built/dts/chat.d.ts +7 -1
- package/built/dts/chat.d.ts.map +1 -1
- package/built/dts/event/event-types.d.ts +10 -0
- package/built/dts/event/event-types.d.ts.map +1 -0
- package/built/dts/event/event.d.ts +32 -24
- package/built/dts/event/event.d.ts.map +1 -1
- package/built/dts/event/index.d.ts +2 -2
- package/built/dts/event/index.d.ts.map +1 -1
- package/built/dts/index.d.ts +1 -0
- package/built/dts/index.d.ts.map +1 -1
- package/built/dts/models/content.d.ts +9 -0
- package/built/dts/models/content.d.ts.map +1 -1
- package/built/dts/models/index.d.ts +2 -0
- package/built/dts/models/index.d.ts.map +1 -1
- package/built/dts/models/reaction.d.ts +23 -0
- package/built/dts/models/reaction.d.ts.map +1 -0
- package/built/dts/models/room.d.ts +5 -3
- package/built/dts/models/room.d.ts.map +1 -1
- package/built/dts/models/vote.d.ts +36 -0
- package/built/dts/models/vote.d.ts.map +1 -0
- package/built/dts/permissions.d.ts +1 -0
- package/built/dts/permissions.d.ts.map +1 -1
- package/built/esm/chat.js +26 -1
- package/built/esm/chat.js.map +1 -1
- package/built/esm/event/event-types.js +10 -0
- package/built/esm/event/event-types.js.map +1 -0
- package/built/esm/event/event.js +68 -34
- package/built/esm/event/event.js.map +1 -1
- package/built/esm/event/index.js +2 -2
- package/built/esm/event/index.js.map +1 -1
- package/built/esm/index.js +1 -0
- package/built/esm/index.js.map +1 -1
- package/built/esm/models/content.js +19 -5
- package/built/esm/models/content.js.map +1 -1
- package/built/esm/models/index.js +2 -0
- package/built/esm/models/index.js.map +1 -1
- package/built/esm/models/reaction.js +22 -0
- package/built/esm/models/reaction.js.map +1 -0
- package/built/esm/models/room.js.map +1 -1
- package/built/esm/models/vote.js +41 -0
- package/built/esm/models/vote.js.map +1 -0
- package/built/esm/permissions.js +1 -0
- package/built/esm/permissions.js.map +1 -1
- package/package.json +50 -51
- package/src/chat.ts +35 -7
- package/src/event/event-types.ts +10 -0
- package/src/event/event.ts +96 -0
- package/src/event/index.ts +2 -0
- package/src/index.ts +1 -0
- package/src/models/content.ts +27 -8
- package/src/models/index.ts +2 -1
- package/src/models/reaction.ts +40 -0
- package/src/models/room.ts +5 -3
- package/src/models/vote.ts +69 -0
- package/src/permissions.ts +1 -0
- package/built/dts/client.d.ts +0 -24
- package/built/dts/client.d.ts.map +0 -1
- package/built/dts/event/event-registry.d.ts +0 -12
- package/built/dts/event/event-registry.d.ts.map +0 -1
- package/built/esm/client.js +0 -44
- package/built/esm/client.js.map +0 -1
- package/built/esm/event/event-registry.js +0 -35
- package/built/esm/event/event-registry.js.map +0 -1
package/src/models/room.ts
CHANGED
|
@@ -11,6 +11,8 @@ export type MetadataJson = {
|
|
|
11
11
|
created_at?: string;
|
|
12
12
|
started_at?: string;
|
|
13
13
|
ended_at?: string;
|
|
14
|
+
first_message_id?: string;
|
|
15
|
+
last_message_id?: string;
|
|
14
16
|
};
|
|
15
17
|
|
|
16
18
|
export type Status = 'online' | 'reserved' | 'offline';
|
|
@@ -20,7 +22,7 @@ export type RoomJson = {
|
|
|
20
22
|
provider_id: string;
|
|
21
23
|
connected: boolean;
|
|
22
24
|
status: Status;
|
|
23
|
-
metadata
|
|
25
|
+
metadata: MetadataJson;
|
|
24
26
|
channel_id?: string;
|
|
25
27
|
created_at: string; // ISO 8601 date string
|
|
26
28
|
};
|
|
@@ -30,7 +32,7 @@ export class Room implements Model<RoomJson>, Keyable, Timestamped {
|
|
|
30
32
|
public providerId: Identifier;
|
|
31
33
|
public connected: boolean;
|
|
32
34
|
public status: Status;
|
|
33
|
-
public metadata
|
|
35
|
+
public metadata: MetadataJson;
|
|
34
36
|
public channelId?: string;
|
|
35
37
|
public createdAt: Date;
|
|
36
38
|
|
|
@@ -39,7 +41,7 @@ export class Room implements Model<RoomJson>, Keyable, Timestamped {
|
|
|
39
41
|
providerId: Identifier;
|
|
40
42
|
connected: boolean;
|
|
41
43
|
status: Status;
|
|
42
|
-
metadata
|
|
44
|
+
metadata: MetadataJson;
|
|
43
45
|
channelId?: string;
|
|
44
46
|
createdAt: Date;
|
|
45
47
|
}) {
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Identifier } from '@omujs/omu';
|
|
2
|
+
import type { Keyable } from '@omujs/omu/interface.js';
|
|
3
|
+
import type { Model } from '@omujs/omu/model.js';
|
|
4
|
+
|
|
5
|
+
export type Choice = {
|
|
6
|
+
text: string;
|
|
7
|
+
ratio: number;
|
|
8
|
+
count?: number;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export type VoteJson = {
|
|
12
|
+
id: string;
|
|
13
|
+
room_id: string;
|
|
14
|
+
title: string;
|
|
15
|
+
choices: Choice[];
|
|
16
|
+
ended: boolean;
|
|
17
|
+
total: number | null;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export class Vote implements Keyable, Model<VoteJson> {
|
|
21
|
+
public readonly id: Identifier;
|
|
22
|
+
public readonly roomId: Identifier;
|
|
23
|
+
public title: string;
|
|
24
|
+
public choices: Choice[];
|
|
25
|
+
public ended: boolean;
|
|
26
|
+
public total: number | null;
|
|
27
|
+
|
|
28
|
+
constructor(options: {
|
|
29
|
+
id: Identifier;
|
|
30
|
+
roomId: Identifier;
|
|
31
|
+
title: string;
|
|
32
|
+
choices: Choice[];
|
|
33
|
+
ended: boolean;
|
|
34
|
+
total: number | null;
|
|
35
|
+
}) {
|
|
36
|
+
this.id = options.id;
|
|
37
|
+
this.roomId = options.roomId;
|
|
38
|
+
this.title = options.title;
|
|
39
|
+
this.choices = options.choices;
|
|
40
|
+
this.ended = options.ended;
|
|
41
|
+
this.total = options.total;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public static fromJson(options: VoteJson): Vote {
|
|
45
|
+
return new Vote({
|
|
46
|
+
id: Identifier.fromKey(options.id),
|
|
47
|
+
roomId: Identifier.fromKey(options.room_id),
|
|
48
|
+
title: options.title,
|
|
49
|
+
choices: options.choices,
|
|
50
|
+
ended: options.ended,
|
|
51
|
+
total: options.total,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public toJson(): VoteJson {
|
|
56
|
+
return {
|
|
57
|
+
id: this.id.key(),
|
|
58
|
+
room_id: this.roomId.key(),
|
|
59
|
+
title: this.title,
|
|
60
|
+
choices: this.choices,
|
|
61
|
+
ended: this.ended,
|
|
62
|
+
total: this.total,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
public key(): string {
|
|
67
|
+
return this.id.key();
|
|
68
|
+
}
|
|
69
|
+
}
|
package/src/permissions.ts
CHANGED
|
@@ -5,3 +5,4 @@ export const CHAT_READ_PERMISSION_ID = IDENTIFIER.join('chat', 'read');
|
|
|
5
5
|
export const CHAT_WRITE_PERMISSION_ID = IDENTIFIER.join('chat', 'write');
|
|
6
6
|
export const CHAT_SEND_PERMISSION_ID = IDENTIFIER.join('chat', 'send');
|
|
7
7
|
export const CHAT_CHANNEL_TREE_PERMISSION_ID = IDENTIFIER.join('create_channel_tree');
|
|
8
|
+
export const CHAT_REACTION_PERMISSION_ID = CHAT_PERMISSION_ID.join('reaction');
|
package/built/dts/client.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import * as omu from '@omuchatjs/omu';
|
|
2
|
-
import type { TokenProvider } from '@omuchatjs/omu/client/token.js';
|
|
3
|
-
import type { Address } from '@omuchatjs/omu/network/index.js';
|
|
4
|
-
import { Chat } from './chat.js';
|
|
5
|
-
import type { EventHandler, EventKey } from './event/index.js';
|
|
6
|
-
export declare class Client extends omu.OmuClient {
|
|
7
|
-
private readonly eventRegistry;
|
|
8
|
-
readonly chat: Chat;
|
|
9
|
-
constructor({ app, address, token, }: {
|
|
10
|
-
app: omu.App;
|
|
11
|
-
address?: Address;
|
|
12
|
-
client?: omu.Client;
|
|
13
|
-
token?: TokenProvider;
|
|
14
|
-
});
|
|
15
|
-
on<T extends unknown[]>(event: EventKey<T>, handler: EventHandler<T>): void;
|
|
16
|
-
}
|
|
17
|
-
export declare class BrowserTokenProvider implements TokenProvider {
|
|
18
|
-
private readonly key;
|
|
19
|
-
constructor(key: string);
|
|
20
|
-
private getKey;
|
|
21
|
-
set(serverAddress: Address, app: omu.App, token: string): Promise<void>;
|
|
22
|
-
get(serverAddress: Address, app: omu.App): Promise<string | undefined>;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG/D,qBAAa,MAAO,SAAQ,GAAG,CAAC,SAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,SAAgB,IAAI,EAAE,IAAI,CAAC;gBAEf,EACR,GAAG,EACH,OAAO,EACP,KAAK,GACR,EAAE;QACC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;QACpB,KAAK,CAAC,EAAE,aAAa,CAAC;KACzB;IAcD,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;CAG9E;AAED,qBAAa,oBAAqB,YAAW,aAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,EAAE,MAAM;IAExC,OAAO,CAAC,MAAM;IAID,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvE,GAAG,CAAC,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAKtF"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { Unlisten } from '@omuchatjs/omu/event-emitter.js';
|
|
2
|
-
import type { Client } from '../client.js';
|
|
3
|
-
import type { EventKey } from './event.js';
|
|
4
|
-
export type EventHandler<T extends unknown[]> = (...event: T) => void;
|
|
5
|
-
export declare class EventRegistry {
|
|
6
|
-
private readonly client;
|
|
7
|
-
private readonly handlers;
|
|
8
|
-
constructor(client: Client);
|
|
9
|
-
on<T extends unknown[]>(event: EventKey<T>, handler: EventHandler<T>): Unlisten;
|
|
10
|
-
emit<T extends unknown[]>(event: EventKey<T>, ...data: T): void;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=event-registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-registry.d.ts","sourceRoot":"","sources":["../../../src/event/event-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,EAAE,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAEtE,qBAAa,aAAa;IAGV,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+C;gBAE3C,MAAM,EAAE,MAAM;IAEpC,EAAE,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,QAAQ;IAoB/E,IAAI,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI;CAQzE"}
|
package/built/esm/client.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import * as omu from '@omuchatjs/omu';
|
|
2
|
-
import { Chat } from './chat.js';
|
|
3
|
-
import { EventRegistry } from './event/index.js';
|
|
4
|
-
export class Client extends omu.OmuClient {
|
|
5
|
-
eventRegistry;
|
|
6
|
-
chat;
|
|
7
|
-
constructor({ app, address, token, }) {
|
|
8
|
-
super({
|
|
9
|
-
app,
|
|
10
|
-
address: address || {
|
|
11
|
-
host: '127.0.0.1',
|
|
12
|
-
port: 26423,
|
|
13
|
-
secure: false,
|
|
14
|
-
},
|
|
15
|
-
token: token ?? new BrowserTokenProvider('omu-token'),
|
|
16
|
-
});
|
|
17
|
-
this.eventRegistry = new EventRegistry(this);
|
|
18
|
-
this.chat = new Chat(this);
|
|
19
|
-
}
|
|
20
|
-
on(event, handler) {
|
|
21
|
-
this.eventRegistry.on(event, handler);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
export class BrowserTokenProvider {
|
|
25
|
-
key;
|
|
26
|
-
constructor(key) {
|
|
27
|
-
this.key = key;
|
|
28
|
-
}
|
|
29
|
-
getKey(serverAddress, app) {
|
|
30
|
-
return JSON.stringify([serverAddress.host, serverAddress.port, app.key()]);
|
|
31
|
-
}
|
|
32
|
-
async set(serverAddress, app, token) {
|
|
33
|
-
const tokens = JSON.parse(localStorage.getItem(this.key) || '{}');
|
|
34
|
-
const key = this.getKey(serverAddress, app);
|
|
35
|
-
tokens[key] = token;
|
|
36
|
-
localStorage.setItem(this.key, JSON.stringify(tokens));
|
|
37
|
-
}
|
|
38
|
-
async get(serverAddress, app) {
|
|
39
|
-
const tokens = JSON.parse(localStorage.getItem(this.key) || '{}');
|
|
40
|
-
const key = this.getKey(serverAddress, app);
|
|
41
|
-
return Promise.resolve(tokens[key] || null);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
//# sourceMappingURL=client.js.map
|
package/built/esm/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,gBAAgB,CAAC;AAItC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,OAAO,MAAO,SAAQ,GAAG,CAAC,SAAS;IACpB,aAAa,CAAgB;IAC9B,IAAI,CAAO;IAE3B,YAAY,EACR,GAAG,EACH,OAAO,EACP,KAAK,GAMR;QACG,KAAK,CAAC;YACF,GAAG;YACH,OAAO,EAAE,OAAO,IAAI;gBAChB,IAAI,EAAE,WAAW;gBACjB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,KAAK;aAChB;YACD,KAAK,EAAE,KAAK,IAAI,IAAI,oBAAoB,CAAC,WAAW,CAAC;SACxD,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,EAAE,CAAsB,KAAkB,EAAE,OAAwB;QAChE,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC1C,CAAC;CACJ;AAED,MAAM,OAAO,oBAAoB;IACA;IAA7B,YAA6B,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;IAAG,CAAC;IAEpC,MAAM,CAAC,aAAsB,EAAE,GAAY;QAC/C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC/E,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,aAAsB,EAAE,GAAY,EAAE,KAAa;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACpB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,CAAC;IAEM,KAAK,CAAC,GAAG,CAAC,aAAsB,EAAE,GAAY;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC5C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;IAChD,CAAC;CACJ"}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export class EventRegistry {
|
|
2
|
-
client;
|
|
3
|
-
handlers = new Map();
|
|
4
|
-
constructor(client) {
|
|
5
|
-
this.client = client;
|
|
6
|
-
}
|
|
7
|
-
on(event, handler) {
|
|
8
|
-
if (!this.handlers.has(event.name)) {
|
|
9
|
-
event.create(this.client, (...data) => {
|
|
10
|
-
this.emit(event, ...data);
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
const handlers = this.handlers.get(event.name) || new Array();
|
|
14
|
-
handlers.push(handler);
|
|
15
|
-
this.handlers.set(event.name, handlers);
|
|
16
|
-
return () => {
|
|
17
|
-
const handlers = this.handlers.get(event.name);
|
|
18
|
-
if (handlers) {
|
|
19
|
-
const index = handlers.indexOf(handler);
|
|
20
|
-
if (index !== -1) {
|
|
21
|
-
handlers.splice(index, 1);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
emit(event, ...data) {
|
|
27
|
-
const handlers = this.handlers.get(event.name);
|
|
28
|
-
if (handlers) {
|
|
29
|
-
for (const handler of handlers) {
|
|
30
|
-
handler(...data);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=event-registry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"event-registry.js","sourceRoot":"","sources":["../../../src/event/event-registry.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,aAAa;IAGO;IAFZ,QAAQ,GAAqC,IAAI,GAAG,EAAE,CAAC;IAExE,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAI,CAAC;IAEzC,EAAE,CAAsB,KAAkB,EAAE,OAAwB;QACvE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;gBAClC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;YAC9B,CAAC,CAAC,CAAC;QACP,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,EAAmB,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE;YACR,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC/C,IAAI,QAAQ,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;oBACf,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC9B,CAAC;YACL,CAAC;QACL,CAAC,CAAC;IACN,CAAC;IAEM,IAAI,CAAsB,KAAkB,EAAE,GAAG,IAAO;QAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,QAAQ,EAAE,CAAC;YACX,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;YACrB,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
|