spindb 0.44.1 → 0.45.1
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 +22 -10
- package/dist/cli/commands/create.js +6 -1
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/engines.js +46 -0
- package/dist/cli/commands/engines.js.map +1 -1
- package/dist/cli/commands/menu/backup-handlers.js +5 -0
- package/dist/cli/commands/menu/backup-handlers.js.map +1 -1
- package/dist/cli/commands/menu/settings-handlers.js +3 -0
- package/dist/cli/commands/menu/settings-handlers.js.map +1 -1
- package/dist/cli/commands/menu/shell-handlers.js +31 -1
- package/dist/cli/commands/menu/shell-handlers.js.map +1 -1
- package/dist/cli/constants.js +4 -0
- package/dist/cli/constants.js.map +1 -1
- package/dist/cli/helpers.js +53 -2
- package/dist/cli/helpers.js.map +1 -1
- package/dist/config/backup-formats.js +18 -0
- package/dist/config/backup-formats.js.map +1 -1
- package/dist/config/engine-defaults.js +13 -0
- package/dist/config/engine-defaults.js.map +1 -1
- package/dist/config/engines.json +18 -0
- package/dist/config/version.js +1 -1
- package/dist/core/config-manager.js +4 -1
- package/dist/core/config-manager.js.map +1 -1
- package/dist/core/credential-manager.js +2 -0
- package/dist/core/credential-manager.js.map +1 -1
- package/dist/core/database-capabilities.js +8 -0
- package/dist/core/database-capabilities.js.map +1 -1
- package/dist/core/dependency-manager.js +2 -0
- package/dist/core/dependency-manager.js.map +1 -1
- package/dist/core/docker-exporter.js +12 -0
- package/dist/core/docker-exporter.js.map +1 -1
- package/dist/core/remote-container.js +2 -0
- package/dist/core/remote-container.js.map +1 -1
- package/dist/engines/index.js +5 -1
- package/dist/engines/index.js.map +1 -1
- package/dist/engines/libsql/api-client.js +134 -0
- package/dist/engines/libsql/api-client.js.map +1 -0
- package/dist/engines/libsql/backup.js +151 -0
- package/dist/engines/libsql/backup.js.map +1 -0
- package/dist/engines/libsql/binary-manager.js +31 -0
- package/dist/engines/libsql/binary-manager.js.map +1 -0
- package/dist/engines/libsql/binary-urls.js +50 -0
- package/dist/engines/libsql/binary-urls.js.map +1 -0
- package/dist/engines/libsql/hostdb-releases.js +21 -0
- package/dist/engines/libsql/hostdb-releases.js.map +1 -0
- package/dist/engines/libsql/index.js +578 -0
- package/dist/engines/libsql/index.js.map +1 -0
- package/dist/engines/libsql/restore.js +219 -0
- package/dist/engines/libsql/restore.js.map +1 -0
- package/dist/engines/libsql/version-maps.js +63 -0
- package/dist/engines/libsql/version-maps.js.map +1 -0
- package/dist/engines/libsql/version-validator.js +111 -0
- package/dist/engines/libsql/version-validator.js.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* libSQL backup module
|
|
3
|
+
* Supports binary (file copy) and SQL dump backup formats
|
|
4
|
+
*/
|
|
5
|
+
import { mkdir, stat, cp } from 'fs/promises';
|
|
6
|
+
import { existsSync, statSync } from 'fs';
|
|
7
|
+
import { join, dirname } from 'path';
|
|
8
|
+
import { logDebug } from '../../core/error-handler.js';
|
|
9
|
+
import { paths } from '../../config/paths.js';
|
|
10
|
+
import { loadCredentials, getDefaultUsername, } from '../../core/credential-manager.js';
|
|
11
|
+
import { libsqlQuery } from './api-client.js';
|
|
12
|
+
import { Engine, } from '../../types/index.js';
|
|
13
|
+
import { writeFile } from 'fs/promises';
|
|
14
|
+
/**
|
|
15
|
+
* Create a backup of a libSQL database
|
|
16
|
+
*/
|
|
17
|
+
export async function createBackup(container, outputPath, options) {
|
|
18
|
+
const format = (options.format || 'binary');
|
|
19
|
+
// Ensure output directory exists
|
|
20
|
+
const outputDir = dirname(outputPath);
|
|
21
|
+
if (!existsSync(outputDir)) {
|
|
22
|
+
await mkdir(outputDir, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
if (format === 'binary') {
|
|
25
|
+
return createBinaryBackup(container, outputPath);
|
|
26
|
+
}
|
|
27
|
+
return createSqlBackup(container, outputPath);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Create a binary backup by copying the database directory.
|
|
31
|
+
* sqld's --db-path creates a directory tree (data.db/dbs/default/data is the
|
|
32
|
+
* actual SQLite file, plus WAL, metastore, etc.). We copy the whole directory
|
|
33
|
+
* to preserve all state needed for a clean restore.
|
|
34
|
+
*/
|
|
35
|
+
async function createBinaryBackup(container, outputPath) {
|
|
36
|
+
const containerDir = paths.getContainerPath(container.name, {
|
|
37
|
+
engine: 'libsql',
|
|
38
|
+
});
|
|
39
|
+
const dbDir = join(containerDir, 'data', 'data.db');
|
|
40
|
+
if (!existsSync(dbDir)) {
|
|
41
|
+
throw new Error(`Database directory not found: ${dbDir}. Is the container initialized?`);
|
|
42
|
+
}
|
|
43
|
+
logDebug(`Creating binary backup of libSQL database: ${dbDir}`);
|
|
44
|
+
// Copy the entire data.db directory tree
|
|
45
|
+
await cp(dbDir, outputPath, { recursive: true });
|
|
46
|
+
// Calculate total size of the backup
|
|
47
|
+
let totalSize = 0;
|
|
48
|
+
const isDir = statSync(outputPath).isDirectory();
|
|
49
|
+
if (isDir) {
|
|
50
|
+
const { readdir } = await import('fs/promises');
|
|
51
|
+
async function sumDir(dir) {
|
|
52
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
53
|
+
for (const entry of entries) {
|
|
54
|
+
const fullPath = join(dir, entry.name);
|
|
55
|
+
if (entry.isDirectory()) {
|
|
56
|
+
await sumDir(fullPath);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
totalSize += (await stat(fullPath)).size;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
await sumDir(outputPath);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
totalSize = (await stat(outputPath)).size;
|
|
67
|
+
}
|
|
68
|
+
return {
|
|
69
|
+
path: outputPath,
|
|
70
|
+
format: 'binary',
|
|
71
|
+
size: totalSize,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a SQL dump backup via the HTTP API
|
|
76
|
+
*/
|
|
77
|
+
async function createSqlBackup(container, outputPath) {
|
|
78
|
+
const { port, name } = container;
|
|
79
|
+
logDebug(`Creating SQL backup of libSQL database via HTTP API on port ${port}`);
|
|
80
|
+
// Load auth token if credentials are stored
|
|
81
|
+
const username = getDefaultUsername(Engine.LibSQL);
|
|
82
|
+
const creds = await loadCredentials(name, Engine.LibSQL, username);
|
|
83
|
+
const authToken = creds?.apiKey ?? undefined;
|
|
84
|
+
// Get all table names
|
|
85
|
+
const tablesResult = await libsqlQuery(port, "SELECT name, sql FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' AND name NOT LIKE '_litestream_%' ORDER BY name", { authToken });
|
|
86
|
+
const lines = [
|
|
87
|
+
'-- libSQL SQL dump',
|
|
88
|
+
`-- Server port: ${port}`,
|
|
89
|
+
`-- Date: ${new Date().toISOString()}`,
|
|
90
|
+
'',
|
|
91
|
+
'BEGIN TRANSACTION;',
|
|
92
|
+
'',
|
|
93
|
+
];
|
|
94
|
+
for (const row of tablesResult.rows) {
|
|
95
|
+
const tableName = String(row[0]?.type === 'text' ? row[0].value : row[0]);
|
|
96
|
+
const createSql = String(row[1]?.type === 'text' ? row[1].value : row[1]);
|
|
97
|
+
const escapedName = tableName.replace(/"/g, '""');
|
|
98
|
+
lines.push(`${createSql};`);
|
|
99
|
+
lines.push('');
|
|
100
|
+
// Dump all rows
|
|
101
|
+
const dataResult = await libsqlQuery(port, `SELECT * FROM "${escapedName}"`, { authToken });
|
|
102
|
+
for (const dataRow of dataResult.rows) {
|
|
103
|
+
const values = dataRow.map((val) => {
|
|
104
|
+
if (val.type === 'null')
|
|
105
|
+
return 'NULL';
|
|
106
|
+
if (val.type === 'integer')
|
|
107
|
+
return val.value;
|
|
108
|
+
if (val.type === 'float')
|
|
109
|
+
return String(val.value);
|
|
110
|
+
if (val.type === 'text')
|
|
111
|
+
return `'${String(val.value).replace(/'/g, "''")}'`;
|
|
112
|
+
if (val.type === 'blob')
|
|
113
|
+
return `X'${Buffer.from(val.base64, 'base64').toString('hex')}'`;
|
|
114
|
+
return 'NULL';
|
|
115
|
+
});
|
|
116
|
+
const columns = dataResult.cols.map((c) => `"${c.name.replace(/"/g, '""')}"`);
|
|
117
|
+
lines.push(`INSERT INTO "${escapedName}" (${columns.join(', ')}) VALUES (${values.join(', ')});`);
|
|
118
|
+
}
|
|
119
|
+
lines.push('');
|
|
120
|
+
}
|
|
121
|
+
// Get indexes
|
|
122
|
+
const indexResult = await libsqlQuery(port, "SELECT sql FROM sqlite_master WHERE type='index' AND sql IS NOT NULL ORDER BY name", { authToken });
|
|
123
|
+
for (const row of indexResult.rows) {
|
|
124
|
+
const sql = String(row[0]?.type === 'text' ? row[0].value : row[0]);
|
|
125
|
+
lines.push(`${sql};`);
|
|
126
|
+
}
|
|
127
|
+
// Get views
|
|
128
|
+
const viewResult = await libsqlQuery(port, "SELECT sql FROM sqlite_master WHERE type='view' ORDER BY name", { authToken });
|
|
129
|
+
for (const row of viewResult.rows) {
|
|
130
|
+
const sql = String(row[0]?.type === 'text' ? row[0].value : row[0]);
|
|
131
|
+
lines.push(`${sql};`);
|
|
132
|
+
}
|
|
133
|
+
// Get triggers
|
|
134
|
+
const triggerResult = await libsqlQuery(port, "SELECT sql FROM sqlite_master WHERE type='trigger' ORDER BY name", { authToken });
|
|
135
|
+
for (const row of triggerResult.rows) {
|
|
136
|
+
const sql = String(row[0]?.type === 'text' ? row[0].value : row[0]);
|
|
137
|
+
lines.push(`${sql};`);
|
|
138
|
+
}
|
|
139
|
+
lines.push('');
|
|
140
|
+
lines.push('COMMIT;');
|
|
141
|
+
lines.push('');
|
|
142
|
+
const content = lines.join('\n');
|
|
143
|
+
await writeFile(outputPath, content, 'utf-8');
|
|
144
|
+
const stats = await stat(outputPath);
|
|
145
|
+
return {
|
|
146
|
+
path: outputPath,
|
|
147
|
+
format: 'sql',
|
|
148
|
+
size: stats.size,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=backup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../engines/libsql/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* libSQL Binary Manager
|
|
3
|
+
*
|
|
4
|
+
* Handles downloading, extracting, and managing libSQL (sqld) binaries from hostdb.
|
|
5
|
+
* Extends BaseBinaryManager for shared download/extraction logic.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseBinaryManager, } from '../../core/base-binary-manager.js';
|
|
8
|
+
import { getBinaryUrl } from './binary-urls.js';
|
|
9
|
+
import { normalizeVersion } from './version-maps.js';
|
|
10
|
+
import { Engine } from '../../types/index.js';
|
|
11
|
+
class LibSQLBinaryManager extends BaseBinaryManager {
|
|
12
|
+
config = {
|
|
13
|
+
engine: Engine.LibSQL,
|
|
14
|
+
engineName: 'libsql',
|
|
15
|
+
displayName: 'libSQL',
|
|
16
|
+
serverBinary: 'sqld',
|
|
17
|
+
};
|
|
18
|
+
getBinaryUrlFromModule(version, platform, arch) {
|
|
19
|
+
return getBinaryUrl(version, platform, arch);
|
|
20
|
+
}
|
|
21
|
+
normalizeVersionFromModule(version) {
|
|
22
|
+
return normalizeVersion(version);
|
|
23
|
+
}
|
|
24
|
+
parseVersionFromOutput(stdout) {
|
|
25
|
+
// Extract version from output like "sqld 0.24.32" or "v0.24.32"
|
|
26
|
+
const match = stdout.match(/(?:sqld\s+)?v?(\d+\.\d+\.\d+)/);
|
|
27
|
+
return match?.[1] ?? null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export const libsqlBinaryManager = new LibSQLBinaryManager();
|
|
31
|
+
//# sourceMappingURL=binary-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary-manager.js","sourceRoot":"","sources":["../../../engines/libsql/binary-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,iBAAiB,GAElB,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,MAAM,EAA4B,MAAM,aAAa,CAAA;AAE9D,MAAM,mBAAoB,SAAQ,iBAAiB;IAC9B,MAAM,GAAwB;QAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU,EAAE,QAAQ;QACpB,WAAW,EAAE,QAAQ;QACrB,YAAY,EAAE,MAAM;KACrB,CAAA;IAES,sBAAsB,CAC9B,OAAe,EACf,QAAkB,EAClB,IAAU;QAEV,OAAO,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC9C,CAAC;IAES,0BAA0B,CAAC,OAAe;QAClD,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAClC,CAAC;IAES,sBAAsB,CAAC,MAAc;QAC7C,gEAAgE;QAChE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAA;QAC3D,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAA;IAC3B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,mBAAmB,EAAE,CAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { normalizeVersion } from './version-maps.js';
|
|
2
|
+
import { buildHostdbUrl } from '../../core/hostdb-client.js';
|
|
3
|
+
import { Engine } from '../../types/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Supported platform identifiers for hostdb downloads.
|
|
6
|
+
* libSQL (sqld) does not have Windows binaries.
|
|
7
|
+
*/
|
|
8
|
+
const SUPPORTED_PLATFORMS = new Set([
|
|
9
|
+
'darwin-arm64',
|
|
10
|
+
'darwin-x64',
|
|
11
|
+
'linux-arm64',
|
|
12
|
+
'linux-x64',
|
|
13
|
+
]);
|
|
14
|
+
/**
|
|
15
|
+
* Get the hostdb platform identifier
|
|
16
|
+
*
|
|
17
|
+
* @param platform - Node.js platform (e.g., 'darwin', 'linux')
|
|
18
|
+
* @param arch - Node.js architecture (e.g., 'arm64', 'x64')
|
|
19
|
+
* @returns hostdb platform identifier or null if unsupported
|
|
20
|
+
*/
|
|
21
|
+
export function getHostdbPlatform(platform, arch) {
|
|
22
|
+
const key = `${platform}-${arch}`;
|
|
23
|
+
return SUPPORTED_PLATFORMS.has(key) ? key : null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build the download URL for libSQL binaries from hostdb
|
|
27
|
+
*
|
|
28
|
+
* Format: https://registry.layerbase.host/libsql-{version}/libsql-{version}-{platform}-{arch}.tar.gz
|
|
29
|
+
*
|
|
30
|
+
* @param version - libSQL version (e.g., '0.24', '0.24.32')
|
|
31
|
+
* @param platform - Platform identifier (e.g., 'darwin', 'linux')
|
|
32
|
+
* @param arch - Architecture identifier (e.g., 'arm64', 'x64')
|
|
33
|
+
* @returns Download URL for the binary
|
|
34
|
+
*/
|
|
35
|
+
export function getBinaryUrl(version, platform, arch) {
|
|
36
|
+
const platformKey = `${platform}-${arch}`;
|
|
37
|
+
const hostdbPlatform = getHostdbPlatform(platform, arch);
|
|
38
|
+
if (!hostdbPlatform) {
|
|
39
|
+
const supported = Array.from(SUPPORTED_PLATFORMS).join(', ');
|
|
40
|
+
throw new Error(`Unsupported platform: ${platformKey}. Supported platforms: ${supported}`);
|
|
41
|
+
}
|
|
42
|
+
// Normalize version (handles major version lookup and X.Y -> X.Y.Z conversion)
|
|
43
|
+
const fullVersion = normalizeVersion(version);
|
|
44
|
+
return buildHostdbUrl(Engine.LibSQL, {
|
|
45
|
+
version: fullVersion,
|
|
46
|
+
hostdbPlatform,
|
|
47
|
+
extension: 'tar.gz',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=binary-urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"binary-urls.js","sourceRoot":"","sources":["../../../engines/libsql/binary-urls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,MAAM,EAA4B,MAAM,aAAa,CAAA;AAE9D;;;GAGG;AACH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,cAAc;IACd,YAAY;IACZ,aAAa;IACb,WAAW;CACZ,CAAC,CAAA;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAkB,EAClB,IAAU;IAEV,MAAM,GAAG,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAA;IACjC,OAAO,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAClD,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,QAAkB,EAClB,IAAU;IAEV,MAAM,WAAW,GAAG,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAA;IACzC,MAAM,cAAc,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACxD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,MAAM,IAAI,KAAK,CACb,yBAAyB,WAAW,0BAA0B,SAAS,EAAE,CAC1E,CAAA;IACH,CAAC;IAED,+EAA+E;IAC/E,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAA;IAE7C,OAAO,cAAc,CAAC,MAAM,CAAC,MAAM,EAAE;QACnC,OAAO,EAAE,WAAW;QACpB,cAAc;QACd,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hostdb Releases Module for libSQL
|
|
3
|
+
*
|
|
4
|
+
* Fetches libSQL binary information from the hostdb repository at
|
|
5
|
+
* https://github.com/robertjbass/hostdb
|
|
6
|
+
*/
|
|
7
|
+
import { createHostdbReleases } from '../../core/hostdb-releases-factory.js';
|
|
8
|
+
import { LIBSQL_VERSION_MAP, SUPPORTED_MAJOR_VERSIONS } from './version-maps.js';
|
|
9
|
+
import { libsqlBinaryManager } from './binary-manager.js';
|
|
10
|
+
import { Engine } from '../../types/index.js';
|
|
11
|
+
const hostdbReleases = createHostdbReleases({
|
|
12
|
+
engine: Engine.LibSQL,
|
|
13
|
+
displayName: 'libSQL',
|
|
14
|
+
versionMap: LIBSQL_VERSION_MAP,
|
|
15
|
+
supportedMajorVersions: SUPPORTED_MAJOR_VERSIONS,
|
|
16
|
+
groupingStrategy: 'xy-format',
|
|
17
|
+
listInstalled: () => libsqlBinaryManager.listInstalled(),
|
|
18
|
+
});
|
|
19
|
+
export const fetchAvailableVersions = hostdbReleases.fetchAvailableVersions;
|
|
20
|
+
export const getLatestVersion = hostdbReleases.getLatestVersion;
|
|
21
|
+
//# sourceMappingURL=hostdb-releases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hostdb-releases.js","sourceRoot":"","sources":["../../../engines/libsql/hostdb-releases.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,cAAc,GAAG,oBAAoB,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,kBAAkB;IAC9B,sBAAsB,EAAE,wBAAwB;IAChD,gBAAgB,EAAE,WAAW;IAC7B,aAAa,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,aAAa,EAAE;CACzD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,cAAc,CAAC,sBAAsB,CAAA;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,cAAc,CAAC,gBAAgB,CAAA"}
|