@minecraft-docker/mcctl 1.6.0 → 1.6.2
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/application/index.d.ts +2 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +5 -0
- package/dist/application/index.js.map +1 -0
- package/dist/commands/backup.d.ts +16 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +182 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/ban.d.ts +14 -0
- package/dist/commands/ban.d.ts.map +1 -0
- package/dist/commands/ban.js +418 -0
- package/dist/commands/ban.js.map +1 -0
- package/dist/commands/config.d.ts +18 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +106 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/console/api.d.ts +19 -0
- package/dist/commands/console/api.d.ts.map +1 -0
- package/dist/commands/console/api.js +399 -0
- package/dist/commands/console/api.js.map +1 -0
- package/dist/commands/console/index.d.ts +10 -0
- package/dist/commands/console/index.d.ts.map +1 -0
- package/dist/commands/console/index.js +12 -0
- package/dist/commands/console/index.js.map +1 -0
- package/dist/commands/console/init.d.ts +47 -0
- package/dist/commands/console/init.d.ts.map +1 -0
- package/dist/commands/console/init.js +491 -0
- package/dist/commands/console/init.js.map +1 -0
- package/dist/commands/console/remove.d.ts +25 -0
- package/dist/commands/console/remove.d.ts.map +1 -0
- package/dist/commands/console/remove.js +189 -0
- package/dist/commands/console/remove.js.map +1 -0
- package/dist/commands/console/service.d.ts +40 -0
- package/dist/commands/console/service.d.ts.map +1 -0
- package/dist/commands/console/service.js +321 -0
- package/dist/commands/console/service.js.map +1 -0
- package/dist/commands/console/user.d.ts +17 -0
- package/dist/commands/console/user.d.ts.map +1 -0
- package/dist/commands/console/user.js +431 -0
- package/dist/commands/console/user.js.map +1 -0
- package/dist/commands/create.d.ts +22 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +86 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +17 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +74 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/exec.d.ts +10 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +29 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/index.d.ts +21 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +23 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +218 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/kick.d.ts +12 -0
- package/dist/commands/kick.d.ts.map +1 -0
- package/dist/commands/kick.js +71 -0
- package/dist/commands/kick.js.map +1 -0
- package/dist/commands/migrate.d.ts +18 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +470 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/mod.d.ts +19 -0
- package/dist/commands/mod.d.ts.map +1 -0
- package/dist/commands/mod.js +441 -0
- package/dist/commands/mod.js.map +1 -0
- package/dist/commands/msg.d.ts +12 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +273 -0
- package/dist/commands/msg.js.map +1 -0
- package/dist/commands/op.d.ts +12 -0
- package/dist/commands/op.d.ts.map +1 -0
- package/dist/commands/op.js +220 -0
- package/dist/commands/op.js.map +1 -0
- package/dist/commands/player-online.d.ts +11 -0
- package/dist/commands/player-online.d.ts.map +1 -0
- package/dist/commands/player-online.js +153 -0
- package/dist/commands/player-online.js.map +1 -0
- package/dist/commands/player.d.ts +18 -0
- package/dist/commands/player.d.ts.map +1 -0
- package/dist/commands/player.js +352 -0
- package/dist/commands/player.js.map +1 -0
- package/dist/commands/server-backup.d.ts +36 -0
- package/dist/commands/server-backup.d.ts.map +1 -0
- package/dist/commands/server-backup.js +320 -0
- package/dist/commands/server-backup.js.map +1 -0
- package/dist/commands/server-restore.d.ts +13 -0
- package/dist/commands/server-restore.d.ts.map +1 -0
- package/dist/commands/server-restore.js +294 -0
- package/dist/commands/server-restore.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +325 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whitelist.d.ts +12 -0
- package/dist/commands/whitelist.d.ts.map +1 -0
- package/dist/commands/whitelist.js +316 -0
- package/dist/commands/whitelist.js.map +1 -0
- package/dist/commands/world.d.ts +18 -0
- package/dist/commands/world.d.ts.map +1 -0
- package/dist/commands/world.js +238 -0
- package/dist/commands/world.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +766 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +30 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js +430 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts +78 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js +391 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/index.d.ts +4 -0
- package/dist/infrastructure/adapters/index.d.ts.map +1 -0
- package/dist/infrastructure/adapters/index.js +6 -0
- package/dist/infrastructure/adapters/index.js.map +1 -0
- package/dist/infrastructure/di/container.d.ts +47 -0
- package/dist/infrastructure/di/container.d.ts.map +1 -0
- package/dist/infrastructure/di/container.js +140 -0
- package/dist/infrastructure/di/container.js.map +1 -0
- package/dist/infrastructure/di/index.d.ts +2 -0
- package/dist/infrastructure/di/index.d.ts.map +1 -0
- package/dist/infrastructure/di/index.js +2 -0
- package/dist/infrastructure/di/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +5 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +8 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/lib/admin-config.d.ts +66 -0
- package/dist/lib/admin-config.d.ts.map +1 -0
- package/dist/lib/admin-config.js +130 -0
- package/dist/lib/admin-config.js.map +1 -0
- package/dist/lib/mojang-api.d.ts +51 -0
- package/dist/lib/mojang-api.d.ts.map +1 -0
- package/dist/lib/mojang-api.js +136 -0
- package/dist/lib/mojang-api.js.map +1 -0
- package/dist/lib/player-cache.d.ts +79 -0
- package/dist/lib/player-cache.d.ts.map +1 -0
- package/dist/lib/player-cache.js +302 -0
- package/dist/lib/player-cache.js.map +1 -0
- package/dist/lib/player-json.d.ts +69 -0
- package/dist/lib/player-json.d.ts.map +1 -0
- package/dist/lib/player-json.js +96 -0
- package/dist/lib/player-json.js.map +1 -0
- package/dist/lib/pm2-utils.d.ts +71 -0
- package/dist/lib/pm2-utils.d.ts.map +1 -0
- package/dist/lib/pm2-utils.js +155 -0
- package/dist/lib/pm2-utils.js.map +1 -0
- package/dist/lib/prompts/action-select.d.ts +23 -0
- package/dist/lib/prompts/action-select.d.ts.map +1 -0
- package/dist/lib/prompts/action-select.js +124 -0
- package/dist/lib/prompts/action-select.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +7 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +7 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/ip-select.d.ts +25 -0
- package/dist/lib/prompts/ip-select.d.ts.map +1 -0
- package/dist/lib/prompts/ip-select.js +255 -0
- package/dist/lib/prompts/ip-select.js.map +1 -0
- package/dist/lib/prompts/player-select.d.ts +25 -0
- package/dist/lib/prompts/player-select.d.ts.map +1 -0
- package/dist/lib/prompts/player-select.js +122 -0
- package/dist/lib/prompts/player-select.js.map +1 -0
- package/dist/lib/prompts/server-select.d.ts +26 -0
- package/dist/lib/prompts/server-select.d.ts.map +1 -0
- package/dist/lib/prompts/server-select.js +99 -0
- package/dist/lib/prompts/server-select.js.map +1 -0
- package/dist/lib/rcon.d.ts +53 -0
- package/dist/lib/rcon.d.ts.map +1 -0
- package/dist/lib/rcon.js +131 -0
- package/dist/lib/rcon.js.map +1 -0
- package/dist/lib/shell.d.ts +111 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +321 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/sudo-utils.d.ts +14 -0
- package/dist/lib/sudo-utils.d.ts.map +1 -0
- package/dist/lib/sudo-utils.js +53 -0
- package/dist/lib/sudo-utils.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Player Cache System
|
|
3
|
+
* Encrypted local cache for Mojang API responses to minimize rate limiting
|
|
4
|
+
*/
|
|
5
|
+
import { createCipheriv, createDecipheriv, randomBytes, createHash, pbkdf2Sync } from 'node:crypto';
|
|
6
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync, statSync } from 'node:fs';
|
|
7
|
+
import { join, dirname } from 'node:path';
|
|
8
|
+
import { homedir, hostname, platform, userInfo } from 'node:os';
|
|
9
|
+
import { getMojangApiClient, getOfflinePlayerInfo, } from './mojang-api.js';
|
|
10
|
+
const CACHE_VERSION = 1;
|
|
11
|
+
const CACHE_FILENAME = '.player-cache';
|
|
12
|
+
const ENCRYPTION_ALGORITHM = 'aes-256-gcm';
|
|
13
|
+
// Cache duration constants (in milliseconds)
|
|
14
|
+
const CACHE_DURATION = {
|
|
15
|
+
UUID: Infinity, // UUID never changes
|
|
16
|
+
USERNAME: 30 * 24 * 60 * 60 * 1000, // 30 days (name changes allowed)
|
|
17
|
+
SKIN: 24 * 60 * 60 * 1000, // 1 day (changes frequently)
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Player cache with AES-256-GCM encryption
|
|
21
|
+
*/
|
|
22
|
+
export class PlayerCache {
|
|
23
|
+
cachePath;
|
|
24
|
+
cache = null;
|
|
25
|
+
encryptionKey = null;
|
|
26
|
+
constructor(cacheDir) {
|
|
27
|
+
const baseDir = cacheDir ?? join(homedir(), '.mcctl');
|
|
28
|
+
this.cachePath = join(baseDir, CACHE_FILENAME);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Look up a player by username
|
|
32
|
+
* First checks cache, then Mojang API
|
|
33
|
+
*/
|
|
34
|
+
async lookup(username, options = {}) {
|
|
35
|
+
// Offline mode uses calculated UUID
|
|
36
|
+
if (options.offline) {
|
|
37
|
+
return getOfflinePlayerInfo(username);
|
|
38
|
+
}
|
|
39
|
+
const lowerUsername = username.toLowerCase();
|
|
40
|
+
// Check cache first (unless force refresh)
|
|
41
|
+
if (!options.forceRefresh) {
|
|
42
|
+
const cached = await this.getFromCache(lowerUsername);
|
|
43
|
+
if (cached) {
|
|
44
|
+
return {
|
|
45
|
+
name: cached.name,
|
|
46
|
+
uuid: cached.uuid,
|
|
47
|
+
uuidNoDashes: cached.uuidNoDashes,
|
|
48
|
+
skinUrl: cached.skinUrl,
|
|
49
|
+
source: 'cache',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Fetch from Mojang API
|
|
54
|
+
const client = getMojangApiClient();
|
|
55
|
+
const info = await client.lookupByUsername(username);
|
|
56
|
+
if (info) {
|
|
57
|
+
// Save to cache
|
|
58
|
+
await this.saveToCache(info);
|
|
59
|
+
}
|
|
60
|
+
return info;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Look up a player with full profile (including skin URL)
|
|
64
|
+
*/
|
|
65
|
+
async lookupWithProfile(username, options = {}) {
|
|
66
|
+
const basic = await this.lookup(username, options);
|
|
67
|
+
if (!basic) {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
// Check if we need to fetch skin URL
|
|
71
|
+
const lowerUsername = username.toLowerCase();
|
|
72
|
+
const cached = await this.getFromCache(lowerUsername);
|
|
73
|
+
// Check if skin cache is still valid
|
|
74
|
+
const skinValid = cached?.skinUpdatedAt &&
|
|
75
|
+
(Date.now() - cached.skinUpdatedAt) < CACHE_DURATION.SKIN;
|
|
76
|
+
if (!options.forceRefresh && skinValid && cached?.skinUrl) {
|
|
77
|
+
return {
|
|
78
|
+
...basic,
|
|
79
|
+
skinUrl: cached.skinUrl,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Fetch full profile from Mojang
|
|
83
|
+
const client = getMojangApiClient();
|
|
84
|
+
const profile = await client.getProfile(basic.uuid);
|
|
85
|
+
if (profile?.skinUrl) {
|
|
86
|
+
// Update cache with skin URL
|
|
87
|
+
await this.updateSkinInCache(lowerUsername, profile.skinUrl);
|
|
88
|
+
return {
|
|
89
|
+
...basic,
|
|
90
|
+
skinUrl: profile.skinUrl,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
return basic;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get player from cache if valid
|
|
97
|
+
*/
|
|
98
|
+
async getFromCache(lowerUsername) {
|
|
99
|
+
await this.loadCache();
|
|
100
|
+
if (!this.cache) {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
const cached = this.cache.players[lowerUsername];
|
|
104
|
+
if (!cached) {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
// Check if name cache is still valid
|
|
108
|
+
const nameAge = Date.now() - cached.nameUpdatedAt;
|
|
109
|
+
if (nameAge > CACHE_DURATION.USERNAME) {
|
|
110
|
+
// Name cache expired, but UUID is still valid
|
|
111
|
+
// Return null to trigger API call, but UUID will be updated in place
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
return cached;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Save player info to cache
|
|
118
|
+
*/
|
|
119
|
+
async saveToCache(info) {
|
|
120
|
+
await this.loadCache();
|
|
121
|
+
if (!this.cache) {
|
|
122
|
+
this.cache = { version: CACHE_VERSION, players: {} };
|
|
123
|
+
}
|
|
124
|
+
const lowerUsername = info.name.toLowerCase();
|
|
125
|
+
const now = Date.now();
|
|
126
|
+
this.cache.players[lowerUsername] = {
|
|
127
|
+
name: info.name,
|
|
128
|
+
uuid: info.uuid,
|
|
129
|
+
uuidNoDashes: info.uuidNoDashes,
|
|
130
|
+
skinUrl: info.skinUrl,
|
|
131
|
+
source: info.source === 'cache' ? 'mojang' : info.source,
|
|
132
|
+
cachedAt: now,
|
|
133
|
+
nameUpdatedAt: now,
|
|
134
|
+
skinUpdatedAt: info.skinUrl ? now : undefined,
|
|
135
|
+
};
|
|
136
|
+
await this.persistCache();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Update skin URL in cache
|
|
140
|
+
*/
|
|
141
|
+
async updateSkinInCache(lowerUsername, skinUrl) {
|
|
142
|
+
await this.loadCache();
|
|
143
|
+
if (!this.cache || !this.cache.players[lowerUsername]) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
this.cache.players[lowerUsername].skinUrl = skinUrl;
|
|
147
|
+
this.cache.players[lowerUsername].skinUpdatedAt = Date.now();
|
|
148
|
+
await this.persistCache();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Load cache from encrypted file
|
|
152
|
+
*/
|
|
153
|
+
async loadCache() {
|
|
154
|
+
if (this.cache !== null) {
|
|
155
|
+
return; // Already loaded
|
|
156
|
+
}
|
|
157
|
+
if (!existsSync(this.cachePath)) {
|
|
158
|
+
this.cache = { version: CACHE_VERSION, players: {} };
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
const encrypted = JSON.parse(readFileSync(this.cachePath, 'utf-8'));
|
|
163
|
+
const decrypted = await this.decrypt(encrypted);
|
|
164
|
+
this.cache = JSON.parse(decrypted);
|
|
165
|
+
// Migrate old cache versions if needed
|
|
166
|
+
if (this.cache.version !== CACHE_VERSION) {
|
|
167
|
+
this.cache = { version: CACHE_VERSION, players: {} };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// If decryption fails, start fresh
|
|
172
|
+
this.cache = { version: CACHE_VERSION, players: {} };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Persist cache to encrypted file
|
|
177
|
+
*/
|
|
178
|
+
async persistCache() {
|
|
179
|
+
if (!this.cache) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Ensure directory exists
|
|
183
|
+
const dir = dirname(this.cachePath);
|
|
184
|
+
if (!existsSync(dir)) {
|
|
185
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
186
|
+
}
|
|
187
|
+
const data = JSON.stringify(this.cache);
|
|
188
|
+
const encrypted = await this.encrypt(data);
|
|
189
|
+
writeFileSync(this.cachePath, JSON.stringify(encrypted), { mode: 0o600 });
|
|
190
|
+
// Ensure file permissions are correct (owner read/write only)
|
|
191
|
+
try {
|
|
192
|
+
chmodSync(this.cachePath, 0o600);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Ignore permission errors on some systems
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get or derive encryption key
|
|
200
|
+
*/
|
|
201
|
+
getEncryptionKey(salt) {
|
|
202
|
+
if (this.encryptionKey) {
|
|
203
|
+
return this.encryptionKey;
|
|
204
|
+
}
|
|
205
|
+
// Derive key from machine-specific identifiers
|
|
206
|
+
const machineId = this.getMachineIdentifier();
|
|
207
|
+
this.encryptionKey = pbkdf2Sync(machineId, salt, 100000, 32, 'sha256');
|
|
208
|
+
return this.encryptionKey;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get machine-specific identifier for key derivation
|
|
212
|
+
*/
|
|
213
|
+
getMachineIdentifier() {
|
|
214
|
+
// Combine multiple machine-specific values
|
|
215
|
+
const parts = [
|
|
216
|
+
hostname(),
|
|
217
|
+
platform(),
|
|
218
|
+
userInfo().username,
|
|
219
|
+
homedir(),
|
|
220
|
+
// Add more entropy from environment
|
|
221
|
+
process.env.USER || process.env.USERNAME || '',
|
|
222
|
+
];
|
|
223
|
+
// Hash for consistent length
|
|
224
|
+
return createHash('sha256').update(parts.join('|')).digest('hex');
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Encrypt data using AES-256-GCM
|
|
228
|
+
*/
|
|
229
|
+
async encrypt(data) {
|
|
230
|
+
const salt = randomBytes(16);
|
|
231
|
+
const key = this.getEncryptionKey(salt);
|
|
232
|
+
const iv = randomBytes(12);
|
|
233
|
+
const cipher = createCipheriv(ENCRYPTION_ALGORITHM, key, iv);
|
|
234
|
+
const encrypted = Buffer.concat([
|
|
235
|
+
cipher.update(data, 'utf-8'),
|
|
236
|
+
cipher.final(),
|
|
237
|
+
]);
|
|
238
|
+
const tag = cipher.getAuthTag();
|
|
239
|
+
return {
|
|
240
|
+
iv: iv.toString('base64'),
|
|
241
|
+
tag: tag.toString('base64'),
|
|
242
|
+
data: encrypted.toString('base64'),
|
|
243
|
+
salt: salt.toString('base64'),
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Decrypt data using AES-256-GCM
|
|
248
|
+
*/
|
|
249
|
+
async decrypt(encrypted) {
|
|
250
|
+
const salt = Buffer.from(encrypted.salt, 'base64');
|
|
251
|
+
const key = this.getEncryptionKey(salt);
|
|
252
|
+
const iv = Buffer.from(encrypted.iv, 'base64');
|
|
253
|
+
const tag = Buffer.from(encrypted.tag, 'base64');
|
|
254
|
+
const data = Buffer.from(encrypted.data, 'base64');
|
|
255
|
+
const decipher = createDecipheriv(ENCRYPTION_ALGORITHM, key, iv);
|
|
256
|
+
decipher.setAuthTag(tag);
|
|
257
|
+
const decrypted = Buffer.concat([
|
|
258
|
+
decipher.update(data),
|
|
259
|
+
decipher.final(),
|
|
260
|
+
]);
|
|
261
|
+
return decrypted.toString('utf-8');
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Clear all cached data
|
|
265
|
+
*/
|
|
266
|
+
async clear() {
|
|
267
|
+
this.cache = { version: CACHE_VERSION, players: {} };
|
|
268
|
+
await this.persistCache();
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Get cache statistics
|
|
272
|
+
*/
|
|
273
|
+
async getStats() {
|
|
274
|
+
await this.loadCache();
|
|
275
|
+
const players = Object.values(this.cache?.players ?? {});
|
|
276
|
+
const timestamps = players.map(p => p.cachedAt);
|
|
277
|
+
let cacheSize = 0;
|
|
278
|
+
try {
|
|
279
|
+
if (existsSync(this.cachePath)) {
|
|
280
|
+
cacheSize = statSync(this.cachePath).size;
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
catch {
|
|
284
|
+
// Ignore stat errors
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
playerCount: players.length,
|
|
288
|
+
oldestEntry: timestamps.length > 0 ? Math.min(...timestamps) : null,
|
|
289
|
+
newestEntry: timestamps.length > 0 ? Math.max(...timestamps) : null,
|
|
290
|
+
cacheSize,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// Singleton instance
|
|
295
|
+
let playerCache = null;
|
|
296
|
+
export function getPlayerCache(cacheDir) {
|
|
297
|
+
if (!playerCache) {
|
|
298
|
+
playerCache = new PlayerCache(cacheDir);
|
|
299
|
+
}
|
|
300
|
+
return playerCache;
|
|
301
|
+
}
|
|
302
|
+
//# sourceMappingURL=player-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-cache.js","sourceRoot":"","sources":["../../src/lib/player-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Player entry in Minecraft JSON files (whitelist.json, ops.json, etc.)
|
|
3
|
+
*/
|
|
4
|
+
export interface PlayerEntry {
|
|
5
|
+
uuid: string;
|
|
6
|
+
name: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Banned player entry
|
|
10
|
+
*/
|
|
11
|
+
export interface BannedPlayerEntry {
|
|
12
|
+
uuid: string;
|
|
13
|
+
name: string;
|
|
14
|
+
created: string;
|
|
15
|
+
source: string;
|
|
16
|
+
expires: string;
|
|
17
|
+
reason: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Banned IP entry
|
|
21
|
+
*/
|
|
22
|
+
export interface BannedIpEntry {
|
|
23
|
+
ip: string;
|
|
24
|
+
created: string;
|
|
25
|
+
source: string;
|
|
26
|
+
expires: string;
|
|
27
|
+
reason: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Read player JSON file (whitelist.json, ops.json)
|
|
31
|
+
*/
|
|
32
|
+
export declare function readPlayerJson(path: string): Promise<PlayerEntry[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Write player JSON file
|
|
35
|
+
*/
|
|
36
|
+
export declare function writePlayerJson(path: string, entries: PlayerEntry[]): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Read banned players JSON file
|
|
39
|
+
*/
|
|
40
|
+
export declare function readBannedPlayersJson(path: string): Promise<BannedPlayerEntry[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Write banned players JSON file
|
|
43
|
+
*/
|
|
44
|
+
export declare function writeBannedPlayersJson(path: string, entries: BannedPlayerEntry[]): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Read banned IPs JSON file
|
|
47
|
+
*/
|
|
48
|
+
export declare function readBannedIpsJson(path: string): Promise<BannedIpEntry[]>;
|
|
49
|
+
/**
|
|
50
|
+
* Write banned IPs JSON file
|
|
51
|
+
*/
|
|
52
|
+
export declare function writeBannedIpsJson(path: string, entries: BannedIpEntry[]): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Find player by name in entries (case-insensitive)
|
|
55
|
+
*/
|
|
56
|
+
export declare function findPlayerByName(entries: PlayerEntry[], name: string): PlayerEntry | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Find banned player by name (case-insensitive)
|
|
59
|
+
*/
|
|
60
|
+
export declare function findBannedPlayerByName(entries: BannedPlayerEntry[], name: string): BannedPlayerEntry | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Find banned IP
|
|
63
|
+
*/
|
|
64
|
+
export declare function findBannedIp(entries: BannedIpEntry[], ip: string): BannedIpEntry | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Create ISO timestamp string
|
|
67
|
+
*/
|
|
68
|
+
export declare function createTimestamp(): string;
|
|
69
|
+
//# sourceMappingURL=player-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-json.d.ts","sourceRoot":"","sources":["../../src/lib/player-json.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAYzE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAGzF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAYtF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,iBAAiB,EAAE,GAC3B,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAY9E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAE9F;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAAE,EAC5B,IAAI,EAAE,MAAM,GACX,iBAAiB,GAAG,SAAS,CAE/B;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE5F;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
/**
|
|
4
|
+
* Read player JSON file (whitelist.json, ops.json)
|
|
5
|
+
*/
|
|
6
|
+
export async function readPlayerJson(path) {
|
|
7
|
+
if (!existsSync(path)) {
|
|
8
|
+
return [];
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const content = await readFile(path, 'utf-8');
|
|
12
|
+
const data = JSON.parse(content);
|
|
13
|
+
return Array.isArray(data) ? data : [];
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Write player JSON file
|
|
21
|
+
*/
|
|
22
|
+
export async function writePlayerJson(path, entries) {
|
|
23
|
+
const content = JSON.stringify(entries, null, 2);
|
|
24
|
+
await writeFile(path, content, 'utf-8');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Read banned players JSON file
|
|
28
|
+
*/
|
|
29
|
+
export async function readBannedPlayersJson(path) {
|
|
30
|
+
if (!existsSync(path)) {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const content = await readFile(path, 'utf-8');
|
|
35
|
+
const data = JSON.parse(content);
|
|
36
|
+
return Array.isArray(data) ? data : [];
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Write banned players JSON file
|
|
44
|
+
*/
|
|
45
|
+
export async function writeBannedPlayersJson(path, entries) {
|
|
46
|
+
const content = JSON.stringify(entries, null, 2);
|
|
47
|
+
await writeFile(path, content, 'utf-8');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Read banned IPs JSON file
|
|
51
|
+
*/
|
|
52
|
+
export async function readBannedIpsJson(path) {
|
|
53
|
+
if (!existsSync(path)) {
|
|
54
|
+
return [];
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const content = await readFile(path, 'utf-8');
|
|
58
|
+
const data = JSON.parse(content);
|
|
59
|
+
return Array.isArray(data) ? data : [];
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Write banned IPs JSON file
|
|
67
|
+
*/
|
|
68
|
+
export async function writeBannedIpsJson(path, entries) {
|
|
69
|
+
const content = JSON.stringify(entries, null, 2);
|
|
70
|
+
await writeFile(path, content, 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Find player by name in entries (case-insensitive)
|
|
74
|
+
*/
|
|
75
|
+
export function findPlayerByName(entries, name) {
|
|
76
|
+
return entries.find((entry) => entry.name.toLowerCase() === name.toLowerCase());
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Find banned player by name (case-insensitive)
|
|
80
|
+
*/
|
|
81
|
+
export function findBannedPlayerByName(entries, name) {
|
|
82
|
+
return entries.find((entry) => entry.name.toLowerCase() === name.toLowerCase());
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Find banned IP
|
|
86
|
+
*/
|
|
87
|
+
export function findBannedIp(entries, ip) {
|
|
88
|
+
return entries.find((entry) => entry.ip === ip);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create ISO timestamp string
|
|
92
|
+
*/
|
|
93
|
+
export function createTimestamp() {
|
|
94
|
+
return new Date().toISOString().replace('T', ' ').replace('Z', ' +0000');
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=player-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-json.js","sourceRoot":"","sources":["../../src/lib/player-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAiCrC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,OAAsB;IACxE,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,IAAY;IACtD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAY,EACZ,OAA4B;IAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAY,EAAE,OAAwB;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAsB,EAAE,IAAY;IACnE,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACpC,OAA4B,EAC5B,IAAY;IAEZ,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAwB,EAAE,EAAU;IAC/D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC3E,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PM2 Utility Functions
|
|
3
|
+
*
|
|
4
|
+
* Helper functions for PM2 operations including:
|
|
5
|
+
* - PM2 installation check
|
|
6
|
+
* - PM2 connection management
|
|
7
|
+
* - Ecosystem config path resolution
|
|
8
|
+
*/
|
|
9
|
+
import { Paths } from '@minecraft-docker/shared';
|
|
10
|
+
/**
|
|
11
|
+
* Default ecosystem config filename
|
|
12
|
+
*/
|
|
13
|
+
export declare const ECOSYSTEM_CONFIG_FILE = "ecosystem.config.cjs";
|
|
14
|
+
/**
|
|
15
|
+
* PM2 service names
|
|
16
|
+
*/
|
|
17
|
+
export declare const PM2_SERVICE_NAMES: {
|
|
18
|
+
readonly API: "mcctl-api";
|
|
19
|
+
readonly CONSOLE: "mcctl-console";
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Check if PM2 is installed (globally or as a dependency)
|
|
23
|
+
* @returns Object with installation status and version
|
|
24
|
+
*/
|
|
25
|
+
export declare function checkPm2Installation(): {
|
|
26
|
+
installed: boolean;
|
|
27
|
+
path?: string;
|
|
28
|
+
version?: string;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Get the ecosystem config path for the given platform
|
|
32
|
+
* @param paths - Paths instance
|
|
33
|
+
* @returns Absolute path to ecosystem.config.cjs
|
|
34
|
+
*/
|
|
35
|
+
export declare function getEcosystemConfigPath(paths: Paths): string;
|
|
36
|
+
/**
|
|
37
|
+
* Check if ecosystem config exists
|
|
38
|
+
* @param paths - Paths instance
|
|
39
|
+
* @returns true if config exists
|
|
40
|
+
*/
|
|
41
|
+
export declare function ecosystemConfigExists(paths: Paths): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get PM2 log file paths for a service
|
|
44
|
+
* @param paths - Paths instance
|
|
45
|
+
* @param serviceName - Service name
|
|
46
|
+
* @returns Object with output and error log paths
|
|
47
|
+
*/
|
|
48
|
+
export declare function getPm2LogPaths(paths: Paths, serviceName: string): {
|
|
49
|
+
output: string;
|
|
50
|
+
error: string;
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Read log file content
|
|
54
|
+
* @param logPath - Path to log file
|
|
55
|
+
* @param lines - Number of lines to read (default: 100)
|
|
56
|
+
* @returns Log content
|
|
57
|
+
*/
|
|
58
|
+
export declare function readLogFile(logPath: string, lines?: number): string;
|
|
59
|
+
/**
|
|
60
|
+
* Format PM2 error for user-friendly display
|
|
61
|
+
* @param error - Error object
|
|
62
|
+
* @returns Formatted error message
|
|
63
|
+
*/
|
|
64
|
+
export declare function formatPm2Error(error: unknown): string;
|
|
65
|
+
/**
|
|
66
|
+
* Parse PM2 status to our ServiceStatusEnum
|
|
67
|
+
* @param pm2Status - PM2 process status string
|
|
68
|
+
* @returns Normalized status string
|
|
69
|
+
*/
|
|
70
|
+
export declare function normalizePm2Status(pm2Status: string): string;
|
|
71
|
+
//# sourceMappingURL=pm2-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2-utils.d.ts","sourceRoot":"","sources":["../../src/lib/pm2-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,qBAAqB,yBAAyB,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;CAGpB,CAAC;AAEX;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAmC9F;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,MAAM,GAClB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAMnC;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,MAAM,CAaxE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAerD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAmB5D"}
|