yukimu 2.0.8 → 3.0.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.
Files changed (97) hide show
  1. package/dist/BitrateOptimizer.d.ts +52 -0
  2. package/dist/BitrateOptimizer.d.ts.map +1 -0
  3. package/dist/BitrateOptimizer.js +115 -0
  4. package/dist/BitrateOptimizer.js.map +1 -0
  5. package/dist/ConnectionPool.d.ts +84 -0
  6. package/dist/ConnectionPool.d.ts.map +1 -0
  7. package/dist/ConnectionPool.js +203 -0
  8. package/dist/ConnectionPool.js.map +1 -0
  9. package/dist/Constants.d.ts +47 -0
  10. package/dist/Constants.d.ts.map +1 -0
  11. package/dist/Constants.js +170 -0
  12. package/dist/Constants.js.map +1 -0
  13. package/dist/Logger.d.ts +22 -0
  14. package/dist/Logger.d.ts.map +1 -0
  15. package/dist/Logger.js +74 -0
  16. package/dist/Logger.js.map +1 -0
  17. package/dist/Node.d.ts +61 -0
  18. package/dist/Node.d.ts.map +1 -0
  19. package/dist/Node.js +446 -0
  20. package/dist/Node.js.map +1 -0
  21. package/dist/Player.d.ts +143 -0
  22. package/dist/Player.d.ts.map +1 -0
  23. package/dist/Player.js +574 -0
  24. package/dist/Player.js.map +1 -0
  25. package/dist/Plugin.d.ts +25 -0
  26. package/dist/Plugin.d.ts.map +1 -0
  27. package/dist/Plugin.js +15 -0
  28. package/dist/Plugin.js.map +1 -0
  29. package/dist/Queue.d.ts +89 -0
  30. package/dist/Queue.d.ts.map +1 -0
  31. package/dist/Queue.js +188 -0
  32. package/dist/Queue.js.map +1 -0
  33. package/dist/Resolver.d.ts +68 -0
  34. package/dist/Resolver.d.ts.map +1 -0
  35. package/dist/Resolver.js +361 -0
  36. package/dist/Resolver.js.map +1 -0
  37. package/dist/Rest.d.ts +46 -0
  38. package/dist/Rest.d.ts.map +1 -0
  39. package/dist/Rest.js +247 -0
  40. package/dist/Rest.js.map +1 -0
  41. package/dist/TrackCache.d.ts +41 -0
  42. package/dist/TrackCache.d.ts.map +1 -0
  43. package/dist/TrackCache.js +144 -0
  44. package/dist/TrackCache.js.map +1 -0
  45. package/dist/WsQueue.d.ts +41 -0
  46. package/dist/WsQueue.d.ts.map +1 -0
  47. package/dist/WsQueue.js +116 -0
  48. package/dist/WsQueue.js.map +1 -0
  49. package/dist/Yukimu.d.ts +84 -0
  50. package/dist/Yukimu.d.ts.map +1 -0
  51. package/dist/Yukimu.js +290 -0
  52. package/dist/Yukimu.js.map +1 -0
  53. package/dist/connector/Connector.d.ts +34 -0
  54. package/dist/connector/Connector.d.ts.map +1 -0
  55. package/dist/connector/Connector.js +39 -0
  56. package/dist/connector/Connector.js.map +1 -0
  57. package/dist/connector/DiscordJS.d.ts +27 -0
  58. package/dist/connector/DiscordJS.d.ts.map +1 -0
  59. package/dist/connector/DiscordJS.js +69 -0
  60. package/dist/connector/DiscordJS.js.map +1 -0
  61. package/dist/connector/Eris.d.ts +19 -0
  62. package/dist/connector/Eris.d.ts.map +1 -0
  63. package/dist/connector/Eris.js +62 -0
  64. package/dist/connector/Eris.js.map +1 -0
  65. package/dist/connector/Oceanic.d.ts +19 -0
  66. package/dist/connector/Oceanic.d.ts.map +1 -0
  67. package/dist/connector/Oceanic.js +60 -0
  68. package/dist/connector/Oceanic.js.map +1 -0
  69. package/dist/errors/YukimuError.d.ts +51 -0
  70. package/dist/errors/YukimuError.d.ts.map +1 -0
  71. package/dist/errors/YukimuError.js +105 -0
  72. package/dist/errors/YukimuError.js.map +1 -0
  73. package/dist/index.d.ts +29 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +70 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/plugins/AutoResume.d.ts +25 -0
  78. package/dist/plugins/AutoResume.d.ts.map +1 -0
  79. package/dist/plugins/AutoResume.js +132 -0
  80. package/dist/plugins/AutoResume.js.map +1 -0
  81. package/dist/plugins/AutoplayPlugin.d.ts +35 -0
  82. package/dist/plugins/AutoplayPlugin.d.ts.map +1 -0
  83. package/dist/plugins/AutoplayPlugin.js +111 -0
  84. package/dist/plugins/AutoplayPlugin.js.map +1 -0
  85. package/dist/plugins/InactivityPlugin.d.ts +30 -0
  86. package/dist/plugins/InactivityPlugin.d.ts.map +1 -0
  87. package/dist/plugins/InactivityPlugin.js +86 -0
  88. package/dist/plugins/InactivityPlugin.js.map +1 -0
  89. package/dist/plugins/PlayerMoved.d.ts +29 -0
  90. package/dist/plugins/PlayerMoved.d.ts.map +1 -0
  91. package/dist/plugins/PlayerMoved.js +75 -0
  92. package/dist/plugins/PlayerMoved.js.map +1 -0
  93. package/dist/types.d.ts +309 -0
  94. package/dist/types.d.ts.map +1 -0
  95. package/dist/types.js +4 -0
  96. package/dist/types.js.map +1 -0
  97. package/package.json +4 -4
@@ -0,0 +1,361 @@
1
+ "use strict";
2
+ /** Yukimu v2.0.0 — Track Resolver with Retry, Caching & Fallback */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.Resolver = void 0;
5
+ const Constants_1 = require("./Constants");
6
+ /** Maximum time (ms) a single resolve() call is allowed to take before aborting */
7
+ const SEARCH_TIMEOUT = 8_000;
8
+ /** Maximum time (ms) for Spotify playlist/album batch resolution */
9
+ const SPOTIFY_BATCH_TIMEOUT = 30_000;
10
+ /** Number of Spotify tracks to resolve concurrently */
11
+ const SPOTIFY_CONCURRENCY = 5;
12
+ /**
13
+ * Resolves search queries and URLs into playable tracks.
14
+ *
15
+ * Improvements from v1:
16
+ * - Accepts optional `node` parameter (loads on the correct node for a player)
17
+ * - Search retry with fallback sources
18
+ * - Search result caching
19
+ * - Spotify playlist/album resolution
20
+ * - Spotify token refresh with retry and timeout
21
+ * - Rate limit handling for Spotify API
22
+ */
23
+ class Resolver {
24
+ manager;
25
+ spotifyToken = null;
26
+ spotifyExpiry = 0;
27
+ spotifyRefreshing = false;
28
+ constructor(manager) {
29
+ this.manager = manager;
30
+ }
31
+ /**
32
+ * Resolve a query (URL or search term) into tracks.
33
+ *
34
+ * @param query - A URL or search query string
35
+ * @param source - The search source to use (ignored for URLs)
36
+ * @param requester - Optional requester metadata to attach to tracks
37
+ * @param node - Optional specific node to use for loading
38
+ */
39
+ async resolve(query, source, requester, node) {
40
+ const isUrl = /^https?:\/\//.test(query);
41
+ const prefix = Constants_1.SOURCE_PREFIXES[source];
42
+ const identifier = isUrl ? query : `${prefix ?? "ytsearch"}:${query}`;
43
+ // Check search cache first
44
+ const cached = this.manager.trackCache.getSearch(identifier);
45
+ if (cached) {
46
+ this.manager.logger.debug(`Search cache hit for: ${identifier.slice(0, 80)}`);
47
+ // Clone and attach requester
48
+ const result = { ...cached, tracks: [...cached.tracks] };
49
+ if (requester)
50
+ this.attachRequester(result.tracks, requester);
51
+ return result;
52
+ }
53
+ // Wrap the entire search in a timeout to prevent indefinite blocking
54
+ const result = await this.resolveWithTimeout(identifier, node, isUrl, query, source, requester);
55
+ return result;
56
+ }
57
+ /**
58
+ * Internal resolve with an overall timeout and node failover.
59
+ * If the primary node fails or times out, tries a different connected node.
60
+ */
61
+ async resolveWithTimeout(identifier, node, isUrl, query, source, requester) {
62
+ const targetNode = node ?? this.getLoadNode();
63
+ // Race the search against a timeout
64
+ const searchPromise = this.tryLoadWithRetries(targetNode, identifier);
65
+ let result = await this.raceTimeout(searchPromise, SEARCH_TIMEOUT);
66
+ // If primary node failed or timed out, try failover to a different node
67
+ if (!result || result.loadType === "error") {
68
+ const fallbackNode = this.getFallbackNode(targetNode);
69
+ if (fallbackNode) {
70
+ this.manager.logger.debug(`Failing over search from "${targetNode.options.name}" to "${fallbackNode.options.name}" for: ${identifier.slice(0, 80)}`);
71
+ const fallbackPromise = this.tryLoadWithRetries(fallbackNode, identifier);
72
+ const fallbackResult = await this.raceTimeout(fallbackPromise, SEARCH_TIMEOUT);
73
+ if (fallbackResult && fallbackResult.loadType !== "error") {
74
+ result = fallbackResult;
75
+ }
76
+ }
77
+ }
78
+ if (!result) {
79
+ this.manager.logger.warn(`All loadTracks attempts failed for: ${identifier.slice(0, 80)}`);
80
+ return { loadType: "error", tracks: [], exception: { severity: "common", cause: "Search timed out", message: "Search timed out on all available nodes" } };
81
+ }
82
+ if (!result.tracks)
83
+ result.tracks = [];
84
+ // Attach requester
85
+ if (requester && result.tracks.length > 0) {
86
+ this.attachRequester(result.tracks, requester);
87
+ }
88
+ // Spotify fallback — if LavaSrc is not installed, try to resolve via metadata
89
+ // Only attempt if the original query was a Spotify URL (prevents recursive loops)
90
+ if ((result.loadType === "error" || result.loadType === "empty") && isUrl && /spotify\.com/.test(query)) {
91
+ const spotifyFallback = await this.raceTimeout(this.trySpotifyFallback(query, source, requester), SPOTIFY_BATCH_TIMEOUT);
92
+ if (spotifyFallback)
93
+ return spotifyFallback;
94
+ }
95
+ // Cache successful results
96
+ if (result.tracks.length > 0) {
97
+ this.manager.trackCache.setSearch(identifier, result);
98
+ // Also cache individual tracks
99
+ for (const track of result.tracks) {
100
+ if (track?.encoded) {
101
+ this.manager.trackCache.set(track.encoded, track);
102
+ }
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ /**
108
+ * Try loading tracks with retries on a specific node.
109
+ * Separated so we can run this against different nodes for failover.
110
+ */
111
+ async tryLoadWithRetries(targetNode, identifier) {
112
+ let result = null;
113
+ let lastError = null;
114
+ for (let attempt = 0; attempt <= Constants_1.DEFAULTS.MAX_SEARCH_RETRIES; attempt++) {
115
+ try {
116
+ result = await targetNode.loadTracks(identifier);
117
+ if (result && result.loadType !== "error")
118
+ break;
119
+ lastError = result?.exception;
120
+ }
121
+ catch (err) {
122
+ lastError = err;
123
+ this.manager.logger.debug(`loadTracks attempt ${attempt + 1} failed on "${targetNode.options.name}" for "${identifier.slice(0, 80)}": ${err}`);
124
+ }
125
+ }
126
+ if (!result && lastError) {
127
+ return { loadType: "error", tracks: [], exception: { severity: "common", cause: String(lastError), message: String(lastError) } };
128
+ }
129
+ return result;
130
+ }
131
+ /**
132
+ * Race a promise against a timeout. Returns null if the timeout fires first.
133
+ */
134
+ raceTimeout(promise, timeoutMs) {
135
+ return Promise.race([
136
+ promise.catch(() => null),
137
+ new Promise((resolve) => {
138
+ const timer = setTimeout(() => resolve(null), timeoutMs);
139
+ // Don't keep the process alive for this timer
140
+ if (timer.unref)
141
+ timer.unref();
142
+ }),
143
+ ]);
144
+ }
145
+ /**
146
+ * Detect the source platform from a URL.
147
+ */
148
+ detectSource(url) {
149
+ for (const [source, patterns] of Object.entries(Constants_1.URL_PATTERNS)) {
150
+ if (patterns.some((p) => p.test(url)))
151
+ return source;
152
+ }
153
+ return null;
154
+ }
155
+ // ─── Spotify Fallback ─────────────────────────────────────────────────
156
+ async trySpotifyFallback(query, _source, requester) {
157
+ // Single track
158
+ const trackMatch = query.match(/spotify\.com\/track\/([a-zA-Z0-9]+)/);
159
+ if (trackMatch?.[1]) {
160
+ const meta = await this.resolveSpotifyMeta(trackMatch[1]);
161
+ if (meta) {
162
+ return this.resolve(`${meta.title} ${meta.artist}`, "youtube", requester);
163
+ }
164
+ }
165
+ // Playlist
166
+ const playlistMatch = query.match(/spotify\.com\/playlist\/([a-zA-Z0-9]+)/);
167
+ if (playlistMatch?.[1]) {
168
+ const tracks = await this.resolveSpotifyPlaylist(playlistMatch[1]);
169
+ if (tracks.length > 0) {
170
+ // Resolve first 50 tracks via YouTube search — in concurrent batches to avoid hanging
171
+ const resolved = await this.resolveSpotifyBatch(tracks.slice(0, 50), requester);
172
+ if (resolved.length > 0) {
173
+ return { loadType: "playlist", tracks: resolved, playlistInfo: { name: "Spotify Playlist", selectedTrack: 0 } };
174
+ }
175
+ }
176
+ }
177
+ // Album
178
+ const albumMatch = query.match(/spotify\.com\/album\/([a-zA-Z0-9]+)/);
179
+ if (albumMatch?.[1]) {
180
+ const tracks = await this.resolveSpotifyAlbum(albumMatch[1]);
181
+ if (tracks.length > 0) {
182
+ const resolved = await this.resolveSpotifyBatch(tracks.slice(0, 50), requester);
183
+ if (resolved.length > 0) {
184
+ return { loadType: "playlist", tracks: resolved, playlistInfo: { name: "Spotify Album", selectedTrack: 0 } };
185
+ }
186
+ }
187
+ }
188
+ return null;
189
+ }
190
+ // ─── Spotify API ──────────────────────────────────────────────────────
191
+ async getSpotifyToken() {
192
+ const opts = this.manager.options.spotify;
193
+ if (!opts)
194
+ return null;
195
+ // Return cached token if still valid
196
+ if (this.spotifyToken && Date.now() < this.spotifyExpiry) {
197
+ return this.spotifyToken;
198
+ }
199
+ // Prevent concurrent refresh
200
+ if (this.spotifyRefreshing) {
201
+ await this.sleep(1000);
202
+ return this.spotifyToken;
203
+ }
204
+ this.spotifyRefreshing = true;
205
+ try {
206
+ const controller = new AbortController();
207
+ const timeout = setTimeout(() => controller.abort(), 10_000);
208
+ const res = await fetch("https://accounts.spotify.com/api/token", {
209
+ method: "POST",
210
+ headers: {
211
+ "Content-Type": "application/x-www-form-urlencoded",
212
+ Authorization: `Basic ${Buffer.from(`${opts.clientId}:${opts.clientSecret}`).toString("base64")}`,
213
+ },
214
+ body: "grant_type=client_credentials",
215
+ signal: controller.signal,
216
+ });
217
+ clearTimeout(timeout);
218
+ if (!res.ok) {
219
+ this.manager.logger.warn(`Spotify token request failed: ${res.status}`);
220
+ return null;
221
+ }
222
+ const data = (await res.json());
223
+ this.spotifyToken = data.access_token;
224
+ this.spotifyExpiry = Date.now() + data.expires_in * 1000 - Constants_1.DEFAULTS.SPOTIFY_TOKEN_REFRESH_BUFFER;
225
+ return this.spotifyToken;
226
+ }
227
+ catch (err) {
228
+ this.manager.logger.warn(`Spotify token refresh failed: ${err}`);
229
+ return null;
230
+ }
231
+ finally {
232
+ this.spotifyRefreshing = false;
233
+ }
234
+ }
235
+ async resolveSpotifyMeta(trackId) {
236
+ const token = await this.getSpotifyToken();
237
+ if (!token)
238
+ return null;
239
+ try {
240
+ const controller = new AbortController();
241
+ const timeout = setTimeout(() => controller.abort(), 10_000);
242
+ const res = await fetch(`https://api.spotify.com/v1/tracks/${encodeURIComponent(trackId)}`, {
243
+ headers: { Authorization: `Bearer ${token}` },
244
+ signal: controller.signal,
245
+ });
246
+ clearTimeout(timeout);
247
+ if (!res.ok)
248
+ return null;
249
+ const data = (await res.json());
250
+ return {
251
+ title: data.name,
252
+ artist: data.artists?.[0]?.name ?? "Unknown",
253
+ };
254
+ }
255
+ catch {
256
+ return null;
257
+ }
258
+ }
259
+ async resolveSpotifyPlaylist(playlistId) {
260
+ const token = await this.getSpotifyToken();
261
+ if (!token)
262
+ return [];
263
+ try {
264
+ const controller = new AbortController();
265
+ const timeout = setTimeout(() => controller.abort(), 15_000);
266
+ const res = await fetch(`https://api.spotify.com/v1/playlists/${encodeURIComponent(playlistId)}/tracks?limit=50`, {
267
+ headers: { Authorization: `Bearer ${token}` },
268
+ signal: controller.signal,
269
+ });
270
+ clearTimeout(timeout);
271
+ if (!res.ok)
272
+ return [];
273
+ const data = (await res.json());
274
+ return data.items
275
+ .filter((item) => item.track)
276
+ .map((item) => ({
277
+ title: item.track.name,
278
+ artist: item.track.artists?.[0]?.name ?? "Unknown",
279
+ }));
280
+ }
281
+ catch {
282
+ return [];
283
+ }
284
+ }
285
+ async resolveSpotifyAlbum(albumId) {
286
+ const token = await this.getSpotifyToken();
287
+ if (!token)
288
+ return [];
289
+ try {
290
+ const controller = new AbortController();
291
+ const timeout = setTimeout(() => controller.abort(), 15_000);
292
+ const res = await fetch(`https://api.spotify.com/v1/albums/${encodeURIComponent(albumId)}/tracks?limit=50`, {
293
+ headers: { Authorization: `Bearer ${token}` },
294
+ signal: controller.signal,
295
+ });
296
+ clearTimeout(timeout);
297
+ if (!res.ok)
298
+ return [];
299
+ const data = (await res.json());
300
+ return data.items.map((item) => ({
301
+ title: item.name,
302
+ artist: item.artists?.[0]?.name ?? "Unknown",
303
+ }));
304
+ }
305
+ catch {
306
+ return [];
307
+ }
308
+ }
309
+ // ─── Helpers ──────────────────────────────────────────────────────────
310
+ /**
311
+ * Resolve a batch of Spotify track metadata concurrently with a concurrency
312
+ * limit. Prevents the sequential N × 15s timeout that caused player freezes.
313
+ */
314
+ async resolveSpotifyBatch(metas, requester) {
315
+ const resolved = [];
316
+ // Process in batches of SPOTIFY_CONCURRENCY
317
+ for (let i = 0; i < metas.length; i += SPOTIFY_CONCURRENCY) {
318
+ const batch = metas.slice(i, i + SPOTIFY_CONCURRENCY);
319
+ const promises = batch.map(async (meta) => {
320
+ try {
321
+ const result = await this.resolve(`${meta.title} ${meta.artist}`, "youtube", requester);
322
+ return result.tracks[0] ?? null;
323
+ }
324
+ catch {
325
+ return null;
326
+ }
327
+ });
328
+ const results = await Promise.allSettled(promises);
329
+ for (const r of results) {
330
+ if (r.status === "fulfilled" && r.value) {
331
+ resolved.push(r.value);
332
+ }
333
+ }
334
+ }
335
+ return resolved;
336
+ }
337
+ getLoadNode() {
338
+ return this.manager.getBestNode();
339
+ }
340
+ /**
341
+ * Get a fallback node that is different from the given node.
342
+ * Used when the primary node fails or times out during search.
343
+ */
344
+ getFallbackNode(exclude) {
345
+ const connected = [...this.manager.nodes.values()].filter((n) => n.connected && n !== exclude);
346
+ if (connected.length === 0)
347
+ return null;
348
+ // Pick the one with lowest penalties
349
+ return connected.sort((a, b) => a.calculatePenalties() - b.calculatePenalties())[0] ?? null;
350
+ }
351
+ attachRequester(tracks, requester) {
352
+ for (const t of tracks) {
353
+ t["requester"] = requester;
354
+ }
355
+ }
356
+ sleep(ms) {
357
+ return new Promise((resolve) => setTimeout(resolve, ms));
358
+ }
359
+ }
360
+ exports.Resolver = Resolver;
361
+ //# sourceMappingURL=Resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Resolver.js","sourceRoot":"","sources":["../src/Resolver.ts"],"names":[],"mappings":"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"}
package/dist/Rest.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ /** Yukimu v2.0.0 — REST Client with Retry, Rate Limiting & Circuit Breaker */
2
+ import type { Node } from "./Node";
3
+ import type { SearchResult, Track, NodeStats, NodeInfo } from "./types";
4
+ /**
5
+ * REST client for communicating with a Lavalink node's HTTP API.
6
+ *
7
+ * Improvements from v1:
8
+ * - Automatic retry with exponential backoff for 429/5xx errors
9
+ * - Rate limit tracking (respects Retry-After headers)
10
+ * - Request timeout with proper AbortController cleanup
11
+ * - Uses VERSION constant for Client-Name header
12
+ * - Fixed v4.2+ data normalization bug (single track vs array)
13
+ * - Per-path rate limit awareness
14
+ * - Circuit breaker: after N consecutive failures, stop sending requests temporarily
15
+ */
16
+ export declare class Rest {
17
+ private readonly node;
18
+ private rateLimit;
19
+ private consecutiveFailures;
20
+ private circuitOpenUntil;
21
+ private static readonly MAX_CONSECUTIVE_FAILURES;
22
+ private static readonly CIRCUIT_OPEN_DURATION;
23
+ constructor(node: Node);
24
+ get baseUrl(): string;
25
+ get prefix(): string;
26
+ get headers(): Record<string, string>;
27
+ request<T = unknown>(method: string, path: string, body?: unknown, retries?: number, timeoutMs?: number): Promise<T>;
28
+ loadTracks(identifier: string): Promise<SearchResult>;
29
+ decodeTrack(encoded: string): Promise<Track>;
30
+ decodeTracks(encoded: string[]): Promise<Track[]>;
31
+ getInfo(): Promise<NodeInfo>;
32
+ getStats(): Promise<NodeStats>;
33
+ updatePlayer(guildId: string, body: unknown, noReplace?: boolean): Promise<unknown>;
34
+ destroyPlayer(guildId: string): Promise<void>;
35
+ updateSession(body: {
36
+ resuming?: boolean;
37
+ timeout?: number;
38
+ }): Promise<unknown>;
39
+ private normalizeV4;
40
+ private normalizeV3;
41
+ private updateRateLimit;
42
+ private parseRetryAfter;
43
+ private getRetryDelay;
44
+ private sleep;
45
+ }
46
+ //# sourceMappingURL=Rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rest.d.ts","sourceRoot":"","sources":["../src/Rest.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAI9E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAY,MAAM,SAAS,CAAC;AASlF;;;;;;;;;;;GAWG;AACH,qBAAa,IAAI;IACf,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;IAC5B,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAE7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAK;IACrD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAAU;gBAE3C,IAAI,EAAE,IAAI;IAItB,IAAI,OAAO,IAAI,MAAM,CAGpB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQpC;IAIY,OAAO,CAAC,CAAC,GAAG,OAAO,EAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,MAAkC,EAC3C,SAAS,GAAE,MAA8B,GACxC,OAAO,CAAC,CAAC,CAAC;IA4GA,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAarD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAI5C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAIjD,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;IAI5B,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC;IAI9B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAOjF,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,aAAa,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAO5F,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAyCnB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,aAAa;IASrB,OAAO,CAAC,KAAK;CAGd"}