@fedify/redis 0.2.0-dev.10 → 0.3.0-dev.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -1
- package/esm/src/mq.js +42 -21
- package/package.json +2 -2
- package/script/src/mq.js +42 -21
- package/types/src/mq.d.ts +7 -7
- package/types/src/mq.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -62,10 +62,18 @@ bun add @fedify/redis
|
|
|
62
62
|
Changelog
|
|
63
63
|
---------
|
|
64
64
|
|
|
65
|
-
### Version 0.
|
|
65
|
+
### Version 0.3.0
|
|
66
66
|
|
|
67
67
|
To be released.
|
|
68
68
|
|
|
69
|
+
- Polling is now more efficient.
|
|
70
|
+
- Renamed `RedisMessageQueueOptions.loopInterval` option to `pollInterval`
|
|
71
|
+
option.
|
|
72
|
+
|
|
73
|
+
### Version 0.2.0
|
|
74
|
+
|
|
75
|
+
Released on September 26, 2024.
|
|
76
|
+
|
|
69
77
|
- Let `RedisMessageQueue` follow up the latest `MessageQueue` interface,
|
|
70
78
|
which was updated in Fedify 1.0.0.
|
|
71
79
|
- Added some example code.
|
package/esm/src/mq.js
CHANGED
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec,
|
|
12
|
+
var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_pollIntervalMs, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
|
|
13
13
|
// deno-lint-ignore-file no-explicit-any
|
|
14
14
|
import * as dntShim from "../_dnt.shims.js";
|
|
15
15
|
import { JsonCodec } from "./codec.js";
|
|
@@ -43,7 +43,7 @@ export class RedisMessageQueue {
|
|
|
43
43
|
_RedisMessageQueue_queueKey.set(this, void 0);
|
|
44
44
|
_RedisMessageQueue_lockKey.set(this, void 0);
|
|
45
45
|
_RedisMessageQueue_codec.set(this, void 0);
|
|
46
|
-
|
|
46
|
+
_RedisMessageQueue_pollIntervalMs.set(this, void 0);
|
|
47
47
|
_RedisMessageQueue_loopHandle.set(this, void 0);
|
|
48
48
|
__classPrivateFieldSet(this, _RedisMessageQueue_redis, redis(), "f");
|
|
49
49
|
__classPrivateFieldSet(this, _RedisMessageQueue_subRedis, redis(), "f");
|
|
@@ -52,7 +52,7 @@ export class RedisMessageQueue {
|
|
|
52
52
|
__classPrivateFieldSet(this, _RedisMessageQueue_queueKey, options.queueKey ?? "fedify_queue", "f");
|
|
53
53
|
__classPrivateFieldSet(this, _RedisMessageQueue_lockKey, options.lockKey ?? "fedify_lock", "f");
|
|
54
54
|
__classPrivateFieldSet(this, _RedisMessageQueue_codec, options.codec ?? new JsonCodec(), "f");
|
|
55
|
-
__classPrivateFieldSet(this,
|
|
55
|
+
__classPrivateFieldSet(this, _RedisMessageQueue_pollIntervalMs, dntShim.Temporal.Duration.from(options.pollInterval ?? { seconds: 5 }).total("millisecond"), "f");
|
|
56
56
|
}
|
|
57
57
|
async enqueue(message, options) {
|
|
58
58
|
const ts = options?.delay == null
|
|
@@ -63,41 +63,62 @@ export class RedisMessageQueue {
|
|
|
63
63
|
if (ts < 1)
|
|
64
64
|
__classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").publish(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), "");
|
|
65
65
|
}
|
|
66
|
-
listen(handler, options = {}) {
|
|
66
|
+
async listen(handler, options = {}) {
|
|
67
67
|
if (__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f") != null) {
|
|
68
68
|
throw new Error("Already listening");
|
|
69
69
|
}
|
|
70
70
|
const signal = options.signal;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
71
|
+
const poll = async () => {
|
|
72
|
+
while (!signal?.aborted) {
|
|
73
|
+
let message;
|
|
74
|
+
try {
|
|
75
|
+
message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
80
|
if (message === undefined)
|
|
81
81
|
return;
|
|
82
82
|
await handler(message);
|
|
83
|
-
}
|
|
84
|
-
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
|
|
86
|
+
__classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", poll);
|
|
85
87
|
signal?.addEventListener("abort", () => {
|
|
86
|
-
__classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message",
|
|
88
|
+
__classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", poll);
|
|
87
89
|
});
|
|
88
90
|
});
|
|
89
|
-
|
|
91
|
+
signal?.addEventListener("abort", () => {
|
|
92
|
+
for (const timeout of timeouts)
|
|
93
|
+
clearTimeout(timeout);
|
|
94
|
+
});
|
|
95
|
+
const timeouts = new Set();
|
|
96
|
+
while (!signal?.aborted) {
|
|
97
|
+
let timeout;
|
|
98
|
+
await new Promise((resolve) => {
|
|
99
|
+
signal?.addEventListener("abort", resolve);
|
|
100
|
+
timeout = setTimeout(() => {
|
|
101
|
+
signal?.removeEventListener("abort", resolve);
|
|
102
|
+
resolve(0);
|
|
103
|
+
}, __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f"));
|
|
104
|
+
timeouts.add(timeout);
|
|
105
|
+
});
|
|
106
|
+
if (timeout != null)
|
|
107
|
+
timeouts.delete(timeout);
|
|
108
|
+
await poll();
|
|
109
|
+
}
|
|
110
|
+
return await new Promise((resolve) => {
|
|
90
111
|
signal?.addEventListener("abort", () => {
|
|
91
|
-
|
|
92
|
-
promise.then(() => resolve());
|
|
112
|
+
promise.catch(() => resolve()).then(() => resolve());
|
|
93
113
|
});
|
|
114
|
+
promise.catch(() => resolve()).then(() => resolve());
|
|
94
115
|
});
|
|
95
116
|
}
|
|
96
|
-
[(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(),
|
|
117
|
+
[(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_pollIntervalMs = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
|
|
97
118
|
const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").setnx(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"));
|
|
98
119
|
if (result < 1)
|
|
99
120
|
return;
|
|
100
|
-
await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this,
|
|
121
|
+
await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f") / 1000 * 2);
|
|
101
122
|
const messages = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrangebyscoreBuffer(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), 0, dntShim.Temporal.Now.instant().epochMilliseconds);
|
|
102
123
|
try {
|
|
103
124
|
if (messages.length < 1)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fedify/redis",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0-dev.12+c328aa31",
|
|
4
4
|
"description": "Redis drivers for Fedify",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fedify",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"https://github.com/sponsors/dahlia"
|
|
60
60
|
],
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@fedify/fedify": "^1.0.0
|
|
62
|
+
"@fedify/fedify": "^1.0.0",
|
|
63
63
|
"ioredis": "^5.4.0",
|
|
64
64
|
"@deno/shim-deno": "~0.18.0",
|
|
65
65
|
"@js-temporal/polyfill": "^0.4.4"
|
package/script/src/mq.js
CHANGED
|
@@ -33,7 +33,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
33
33
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
34
34
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
35
35
|
};
|
|
36
|
-
var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec,
|
|
36
|
+
var _RedisMessageQueue_instances, _RedisMessageQueue_redis, _RedisMessageQueue_subRedis, _RedisMessageQueue_workerId, _RedisMessageQueue_channelKey, _RedisMessageQueue_queueKey, _RedisMessageQueue_lockKey, _RedisMessageQueue_codec, _RedisMessageQueue_pollIntervalMs, _RedisMessageQueue_loopHandle, _RedisMessageQueue_poll;
|
|
37
37
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
38
|
exports.RedisMessageQueue = void 0;
|
|
39
39
|
// deno-lint-ignore-file no-explicit-any
|
|
@@ -69,7 +69,7 @@ class RedisMessageQueue {
|
|
|
69
69
|
_RedisMessageQueue_queueKey.set(this, void 0);
|
|
70
70
|
_RedisMessageQueue_lockKey.set(this, void 0);
|
|
71
71
|
_RedisMessageQueue_codec.set(this, void 0);
|
|
72
|
-
|
|
72
|
+
_RedisMessageQueue_pollIntervalMs.set(this, void 0);
|
|
73
73
|
_RedisMessageQueue_loopHandle.set(this, void 0);
|
|
74
74
|
__classPrivateFieldSet(this, _RedisMessageQueue_redis, redis(), "f");
|
|
75
75
|
__classPrivateFieldSet(this, _RedisMessageQueue_subRedis, redis(), "f");
|
|
@@ -78,7 +78,7 @@ class RedisMessageQueue {
|
|
|
78
78
|
__classPrivateFieldSet(this, _RedisMessageQueue_queueKey, options.queueKey ?? "fedify_queue", "f");
|
|
79
79
|
__classPrivateFieldSet(this, _RedisMessageQueue_lockKey, options.lockKey ?? "fedify_lock", "f");
|
|
80
80
|
__classPrivateFieldSet(this, _RedisMessageQueue_codec, options.codec ?? new codec_js_1.JsonCodec(), "f");
|
|
81
|
-
__classPrivateFieldSet(this,
|
|
81
|
+
__classPrivateFieldSet(this, _RedisMessageQueue_pollIntervalMs, dntShim.Temporal.Duration.from(options.pollInterval ?? { seconds: 5 }).total("millisecond"), "f");
|
|
82
82
|
}
|
|
83
83
|
async enqueue(message, options) {
|
|
84
84
|
const ts = options?.delay == null
|
|
@@ -89,41 +89,62 @@ class RedisMessageQueue {
|
|
|
89
89
|
if (ts < 1)
|
|
90
90
|
__classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").publish(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), "");
|
|
91
91
|
}
|
|
92
|
-
listen(handler, options = {}) {
|
|
92
|
+
async listen(handler, options = {}) {
|
|
93
93
|
if (__classPrivateFieldGet(this, _RedisMessageQueue_loopHandle, "f") != null) {
|
|
94
94
|
throw new Error("Already listening");
|
|
95
95
|
}
|
|
96
96
|
const signal = options.signal;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
97
|
+
const poll = async () => {
|
|
98
|
+
while (!signal?.aborted) {
|
|
99
|
+
let message;
|
|
100
|
+
try {
|
|
101
|
+
message = await __classPrivateFieldGet(this, _RedisMessageQueue_instances, "m", _RedisMessageQueue_poll).call(this);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
106
|
if (message === undefined)
|
|
107
107
|
return;
|
|
108
108
|
await handler(message);
|
|
109
|
-
}
|
|
110
|
-
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const promise = __classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").subscribe(__classPrivateFieldGet(this, _RedisMessageQueue_channelKey, "f"), () => {
|
|
112
|
+
__classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").on("message", poll);
|
|
111
113
|
signal?.addEventListener("abort", () => {
|
|
112
|
-
__classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message",
|
|
114
|
+
__classPrivateFieldGet(this, _RedisMessageQueue_subRedis, "f").off("message", poll);
|
|
113
115
|
});
|
|
114
116
|
});
|
|
115
|
-
|
|
117
|
+
signal?.addEventListener("abort", () => {
|
|
118
|
+
for (const timeout of timeouts)
|
|
119
|
+
clearTimeout(timeout);
|
|
120
|
+
});
|
|
121
|
+
const timeouts = new Set();
|
|
122
|
+
while (!signal?.aborted) {
|
|
123
|
+
let timeout;
|
|
124
|
+
await new Promise((resolve) => {
|
|
125
|
+
signal?.addEventListener("abort", resolve);
|
|
126
|
+
timeout = setTimeout(() => {
|
|
127
|
+
signal?.removeEventListener("abort", resolve);
|
|
128
|
+
resolve(0);
|
|
129
|
+
}, __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f"));
|
|
130
|
+
timeouts.add(timeout);
|
|
131
|
+
});
|
|
132
|
+
if (timeout != null)
|
|
133
|
+
timeouts.delete(timeout);
|
|
134
|
+
await poll();
|
|
135
|
+
}
|
|
136
|
+
return await new Promise((resolve) => {
|
|
116
137
|
signal?.addEventListener("abort", () => {
|
|
117
|
-
|
|
118
|
-
promise.then(() => resolve());
|
|
138
|
+
promise.catch(() => resolve()).then(() => resolve());
|
|
119
139
|
});
|
|
140
|
+
promise.catch(() => resolve()).then(() => resolve());
|
|
120
141
|
});
|
|
121
142
|
}
|
|
122
|
-
[(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(),
|
|
143
|
+
[(_RedisMessageQueue_redis = new WeakMap(), _RedisMessageQueue_subRedis = new WeakMap(), _RedisMessageQueue_workerId = new WeakMap(), _RedisMessageQueue_channelKey = new WeakMap(), _RedisMessageQueue_queueKey = new WeakMap(), _RedisMessageQueue_lockKey = new WeakMap(), _RedisMessageQueue_codec = new WeakMap(), _RedisMessageQueue_pollIntervalMs = new WeakMap(), _RedisMessageQueue_loopHandle = new WeakMap(), _RedisMessageQueue_instances = new WeakSet(), _RedisMessageQueue_poll = async function _RedisMessageQueue_poll() {
|
|
123
144
|
const result = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").setnx(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_workerId, "f"));
|
|
124
145
|
if (result < 1)
|
|
125
146
|
return;
|
|
126
|
-
await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this,
|
|
147
|
+
await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").expire(__classPrivateFieldGet(this, _RedisMessageQueue_lockKey, "f"), __classPrivateFieldGet(this, _RedisMessageQueue_pollIntervalMs, "f") / 1000 * 2);
|
|
127
148
|
const messages = await __classPrivateFieldGet(this, _RedisMessageQueue_redis, "f").zrangebyscoreBuffer(__classPrivateFieldGet(this, _RedisMessageQueue_queueKey, "f"), 0, dntShim.Temporal.Now.instant().epochMilliseconds);
|
|
128
149
|
try {
|
|
129
150
|
if (messages.length < 1)
|
package/types/src/mq.d.ts
CHANGED
|
@@ -16,31 +16,31 @@ export interface RedisMessageQueueOptions {
|
|
|
16
16
|
/**
|
|
17
17
|
* The Pub/Sub channel key to use for the message queue. `"fedify_channel"`
|
|
18
18
|
* by default.
|
|
19
|
+
* @default `"fedify_channel"`
|
|
19
20
|
*/
|
|
20
21
|
channelKey?: RedisKey;
|
|
21
22
|
/**
|
|
22
23
|
* The Sorted Set key to use for the delayed message queue. `"fedify_queue"`
|
|
23
24
|
* by default.
|
|
25
|
+
* @default `"fedify_queue"`
|
|
24
26
|
*/
|
|
25
27
|
queueKey?: RedisKey;
|
|
26
28
|
/**
|
|
27
29
|
* The key to use for locking the message queue. `"fedify_lock"` by default.
|
|
30
|
+
* @default `"fedify_lock"`
|
|
28
31
|
*/
|
|
29
32
|
lockKey?: RedisKey;
|
|
30
33
|
/**
|
|
31
34
|
* The codec to use for encoding and decoding messages in the key-value store.
|
|
32
35
|
* Defaults to {@link JsonCodec}.
|
|
36
|
+
* @default {@link JsonCodec}
|
|
33
37
|
*/
|
|
34
38
|
codec?: Codec;
|
|
35
39
|
/**
|
|
36
|
-
* The interval
|
|
37
|
-
*
|
|
38
|
-
* server. If it is too long, it may cause messages to be delayed longer
|
|
39
|
-
* than expected.
|
|
40
|
-
*
|
|
41
|
-
* 5 seconds by default.
|
|
40
|
+
* The poll interval for the message queue. 5 seconds by default.
|
|
41
|
+
* @default `{ seconds: 5 }`
|
|
42
42
|
*/
|
|
43
|
-
|
|
43
|
+
pollInterval?: dntShim.Temporal.Duration | dntShim.Temporal.DurationLike;
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
46
|
* A message queue that uses Redis as the underlying storage.
|
package/types/src/mq.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/src/mq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB
|
|
1
|
+
{"version":3,"file":"mq.d.ts","sourceRoot":"","sources":["../../src/src/mq.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAE5C,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,yBAAyB,EAC1B,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,YAAY,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,UAAU,CAAC,EAAE,QAAQ,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;OAGG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;IAEnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;CAC1E;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,iBAAkB,YAAW,YAAY,EAAE,UAAU;;IAWhE;;;;OAIG;gBACS,KAAK,EAAE,MAAM,KAAK,EAAE,OAAO,GAAE,wBAA6B;IAahE,OAAO,CACX,OAAO,EAAE,GAAG,EACZ,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,IAAI,CAAC;IA+BV,MAAM,CACV,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAC/C,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,IAAI,CAAC;IAmDhB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI;CAKzB"}
|