@oktis-works/cms 0.1.13 → 0.2.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 (65) hide show
  1. package/dist/assets.d.ts +94 -0
  2. package/dist/assets.d.ts.map +1 -0
  3. package/dist/assets.js +671 -0
  4. package/dist/assets.js.map +1 -0
  5. package/dist/bluegreen.d.ts +121 -0
  6. package/dist/bluegreen.d.ts.map +1 -0
  7. package/dist/bluegreen.js +393 -0
  8. package/dist/bluegreen.js.map +1 -0
  9. package/dist/commands.d.ts +6 -0
  10. package/dist/commands.d.ts.map +1 -1
  11. package/dist/commands.js +116 -61
  12. package/dist/commands.js.map +1 -1
  13. package/dist/config-wizard.d.ts +39 -0
  14. package/dist/config-wizard.d.ts.map +1 -0
  15. package/dist/config-wizard.js +308 -0
  16. package/dist/config-wizard.js.map +1 -0
  17. package/dist/docker.d.ts +148 -0
  18. package/dist/docker.d.ts.map +1 -0
  19. package/dist/docker.js +324 -0
  20. package/dist/docker.js.map +1 -0
  21. package/dist/doctor.d.ts +2 -0
  22. package/dist/doctor.d.ts.map +1 -1
  23. package/dist/doctor.js +51 -0
  24. package/dist/doctor.js.map +1 -1
  25. package/dist/env-file.d.ts +45 -0
  26. package/dist/env-file.d.ts.map +1 -0
  27. package/dist/env-file.js +200 -0
  28. package/dist/env-file.js.map +1 -0
  29. package/dist/env-schema.d.ts +28 -0
  30. package/dist/env-schema.d.ts.map +1 -0
  31. package/dist/env-schema.js +497 -0
  32. package/dist/env-schema.js.map +1 -0
  33. package/dist/guards.d.ts +40 -0
  34. package/dist/guards.d.ts.map +1 -0
  35. package/dist/guards.js +159 -0
  36. package/dist/guards.js.map +1 -0
  37. package/dist/parser.d.ts.map +1 -1
  38. package/dist/parser.js +12 -3
  39. package/dist/parser.js.map +1 -1
  40. package/dist/project-config.js +2 -2
  41. package/dist/prompt.d.ts +81 -0
  42. package/dist/prompt.d.ts.map +1 -0
  43. package/dist/prompt.js +379 -0
  44. package/dist/prompt.js.map +1 -0
  45. package/dist/redeploy.d.ts +109 -0
  46. package/dist/redeploy.d.ts.map +1 -0
  47. package/dist/redeploy.js +363 -0
  48. package/dist/redeploy.js.map +1 -0
  49. package/dist/scaffold-docs.d.ts +25 -6
  50. package/dist/scaffold-docs.d.ts.map +1 -1
  51. package/dist/scaffold-docs.js +711 -33
  52. package/dist/scaffold-docs.js.map +1 -1
  53. package/dist/scaffold.d.ts +17 -1
  54. package/dist/scaffold.d.ts.map +1 -1
  55. package/dist/scaffold.js +77 -14
  56. package/dist/scaffold.js.map +1 -1
  57. package/dist/theme-build.d.ts +35 -0
  58. package/dist/theme-build.d.ts.map +1 -0
  59. package/dist/theme-build.js +86 -0
  60. package/dist/theme-build.js.map +1 -0
  61. package/dist/update.d.ts +51 -0
  62. package/dist/update.d.ts.map +1 -0
  63. package/dist/update.js +210 -0
  64. package/dist/update.js.map +1 -0
  65. package/package.json +7 -7
package/dist/prompt.js ADDED
@@ -0,0 +1,379 @@
1
+ // @oktis-works/cms - Primitivas de prompt interativo (wizard TTY, zero deps)
2
+ //
3
+ // O parser da CLI não tem dependência de TUI nenhuma e não vamos adicionar:
4
+ // um `readline` próprio resolve select/confirm/input/mask com três garantias
5
+ // que biblioteca de terceiros não daria de graça aqui:
6
+ // 1. fallback determinístico em modo não-interativo (CI/pipes) → flags;
7
+ // 2. máscara de segredo SEM eco (raw mode só quando o stdin é TTY);
8
+ // 3. IO injetável → testável sem terminal real.
9
+ //
10
+ // Menu = numeração (1/2/3) e não setas: funciona em TTY, SSH, container e pipe
11
+ // com o MESMO código — setas exigiriam raw mode também na leitura normal e
12
+ // quebrariam qualquer entrada pipada.
13
+ export function defaultIO() {
14
+ const input = process.stdin;
15
+ const output = process.stdout;
16
+ return { input, output, isTTY: Boolean(input.isTTY && output.isTTY) };
17
+ }
18
+ // ---------------------------------------------------------------------------
19
+ // Estilo (ANSI condicional — sem cor quando NO_COLOR ou sem TTY)
20
+ // ---------------------------------------------------------------------------
21
+ const colorEnabled = () => !process.env['NO_COLOR'] && Boolean(process.stdout.isTTY);
22
+ function wrap(open, close) {
23
+ return (text) => colorEnabled() ? `\u001b[${open}m${text}\u001b[${close}m` : text;
24
+ }
25
+ export const style = {
26
+ bold: wrap(1, 22),
27
+ dim: wrap(2, 22),
28
+ red: wrap(31, 39),
29
+ green: wrap(32, 39),
30
+ yellow: wrap(33, 39),
31
+ blue: wrap(34, 39),
32
+ cyan: wrap(36, 39),
33
+ gray: wrap(90, 39),
34
+ };
35
+ /** Símbolos canônicos — mesmos glifos já usados pelos comandos da CLI. */
36
+ export const symbol = {
37
+ ask: '?',
38
+ ok: '✓',
39
+ fail: '✗',
40
+ arrow: '→',
41
+ bullet: '•',
42
+ warn: '⚠',
43
+ };
44
+ /** Ctrl+C — cancela a leitura de um segredo sem derrubar o processo. */
45
+ const ETX = '\u0003';
46
+ /** DEL/backspace. */
47
+ const DEL = '\u007f';
48
+ class BufferedInput {
49
+ stream;
50
+ echo;
51
+ buffer = '';
52
+ queue = [];
53
+ waiters = [];
54
+ ended = false;
55
+ // estado do modo raw (máscara de segredo)
56
+ raw = false;
57
+ rawValue = '';
58
+ rawWaiter = null;
59
+ constructor(stream, echo) {
60
+ this.stream = stream;
61
+ this.echo = echo;
62
+ stream.setEncoding('utf8');
63
+ stream.on('data', (chunk) => this.onData(String(chunk)));
64
+ const end = () => this.onEnd();
65
+ stream.on('end', end);
66
+ stream.on('close', end);
67
+ stream.on('error', end);
68
+ }
69
+ get canMask() {
70
+ return Boolean(this.stream.isTTY && this.stream.setRawMode);
71
+ }
72
+ onEnd() {
73
+ if (this.ended)
74
+ return;
75
+ this.ended = true;
76
+ const waiters = this.waiters.splice(0);
77
+ for (const waiter of waiters)
78
+ waiter(null);
79
+ if (this.rawWaiter) {
80
+ const waiter = this.rawWaiter;
81
+ this.rawWaiter = null;
82
+ this.raw = false;
83
+ waiter('');
84
+ }
85
+ }
86
+ onData(chunk) {
87
+ if (this.raw) {
88
+ this.onRawData(chunk);
89
+ return;
90
+ }
91
+ this.buffer += chunk;
92
+ this.drain();
93
+ }
94
+ drain() {
95
+ for (;;) {
96
+ const index = this.buffer.indexOf('\n');
97
+ if (index < 0)
98
+ break;
99
+ const line = this.buffer.slice(0, index).replace(/\r$/, '');
100
+ this.buffer = this.buffer.slice(index + 1);
101
+ const waiter = this.waiters.shift();
102
+ if (waiter)
103
+ waiter(line);
104
+ else
105
+ this.queue.push(line);
106
+ }
107
+ }
108
+ /** Volta ao modo normal e entrega o valor lido. */
109
+ finishRaw(value) {
110
+ this.rawValue = '';
111
+ this.raw = false;
112
+ this.setRawMode(false);
113
+ this.echo('\n');
114
+ const waiter = this.rawWaiter;
115
+ this.rawWaiter = null;
116
+ waiter?.(value);
117
+ }
118
+ onRawData(chunk) {
119
+ for (let i = 0; i < chunk.length; i++) {
120
+ const ch = chunk[i];
121
+ if (ch === '\r' || ch === '\n') {
122
+ const value = this.rawValue;
123
+ this.finishRaw(value);
124
+ // resto do chunk (raro em raw mode) volta para o leitor normal
125
+ const rest = chunk.slice(i + 1);
126
+ if (rest) {
127
+ this.buffer += rest;
128
+ this.drain();
129
+ }
130
+ return;
131
+ }
132
+ if (ch === ETX) {
133
+ this.finishRaw('');
134
+ return;
135
+ }
136
+ if (ch === DEL || ch === '\b') {
137
+ this.rawValue = this.rawValue.slice(0, -1);
138
+ this.echo('\b \b');
139
+ continue;
140
+ }
141
+ this.rawValue += ch;
142
+ this.echo('*');
143
+ }
144
+ }
145
+ setRawMode(enabled) {
146
+ try {
147
+ this.stream.setRawMode?.(enabled);
148
+ if (enabled)
149
+ this.stream.resume();
150
+ }
151
+ catch {
152
+ // stdin sem raw mode — a leitura seguinte cai no modo linha
153
+ }
154
+ }
155
+ /** Lê uma linha. Devolve `null` em EOF (pipe fechado). */
156
+ readLine() {
157
+ const queued = this.queue.shift();
158
+ if (queued !== undefined)
159
+ return Promise.resolve(queued);
160
+ if (this.ended)
161
+ return Promise.resolve(null);
162
+ return new Promise((resolve) => {
163
+ this.waiters.push(resolve);
164
+ });
165
+ }
166
+ /**
167
+ * Lê um segredo. Sem eco quando o stdin é TTY (raw mode + `*`); sem TTY a
168
+ * entrada É o pipe — `echo senha | okcms config` funciona de propósito, e o
169
+ * default cobre o caso de stdin fechado em CI.
170
+ */
171
+ async readSecret() {
172
+ const queued = this.queue.shift();
173
+ if (queued !== undefined)
174
+ return queued;
175
+ if (this.ended)
176
+ return '';
177
+ if (!this.canMask)
178
+ return (await this.readLine()) ?? '';
179
+ return new Promise((resolve) => {
180
+ this.rawValue = '';
181
+ this.raw = true;
182
+ this.rawWaiter = resolve;
183
+ this.setRawMode(true);
184
+ });
185
+ }
186
+ }
187
+ export class Prompt {
188
+ io;
189
+ input;
190
+ closed = false;
191
+ constructor(io) {
192
+ this.io = { ...defaultIO(), ...io };
193
+ this.input = new BufferedInput(this.io.input, (text) => {
194
+ this.io.output.write(text);
195
+ });
196
+ }
197
+ get interactive() {
198
+ return this.io.isTTY;
199
+ }
200
+ write(text) {
201
+ this.io.output.write(text);
202
+ }
203
+ /** Título de seção do wizard. */
204
+ heading(text) {
205
+ this.write(`\n${style.bold(text)}\n`);
206
+ }
207
+ info(text) {
208
+ this.write(` ${style.dim(`${symbol.arrow} ${text}`)}\n`);
209
+ }
210
+ success(text) {
211
+ this.write(` ${style.green(symbol.ok)} ${text}\n`);
212
+ }
213
+ warn(text) {
214
+ this.write(` ${style.yellow(symbol.warn)} ${text}\n`);
215
+ }
216
+ error(text) {
217
+ this.write(` ${style.red(symbol.fail)} ${text}\n`);
218
+ }
219
+ /**
220
+ * Menu numerado. Em modo não-interativo devolve `defaultValue`; sem default
221
+ * lança erro — assim um CI nunca aciona um deploy por acidente.
222
+ */
223
+ async select(title, choices, opts = {}) {
224
+ if (choices.length === 0) {
225
+ throw new Error(`select "${title}" sem opções`);
226
+ }
227
+ const defaultIndex = opts.defaultValue === undefined
228
+ ? -1
229
+ : Math.max(0, choices.findIndex((choice) => choice.value === opts.defaultValue));
230
+ if (!this.io.isTTY) {
231
+ if (opts.defaultValue !== undefined)
232
+ return opts.defaultValue;
233
+ throw new Error(opts.nonInteractiveError ??
234
+ `non-interactive: a opção "${title}" exige TTY ou a flag equivalente`);
235
+ }
236
+ this.write(`\n ${symbol.ask} ${style.bold(title)}\n`);
237
+ choices.forEach((choice, index) => {
238
+ const marker = index === defaultIndex ? style.cyan('>') : ' ';
239
+ const hint = choice.hint ? ` ${style.dim(choice.hint)}` : '';
240
+ const label = index === defaultIndex ? style.bold(choice.label) : choice.label;
241
+ this.write(` ${marker} ${style.dim(`${index + 1}`)}) ${label}${hint}\n`);
242
+ });
243
+ for (;;) {
244
+ const suffix = defaultIndex >= 0 ? style.dim(`[${defaultIndex + 1}]`) : '';
245
+ const raw = await this.askLine(`${symbol.ask} ${suffix}`);
246
+ if (raw === null) {
247
+ if (opts.defaultValue !== undefined)
248
+ return opts.defaultValue;
249
+ throw new Error(`entrada encerrada antes de responder "${title}"`);
250
+ }
251
+ const answer = raw.trim();
252
+ if (answer === '' && defaultIndex >= 0)
253
+ return choices[defaultIndex].value;
254
+ const asNumber = Number.parseInt(answer, 10);
255
+ if (Number.isInteger(asNumber) && asNumber >= 1 && asNumber <= choices.length) {
256
+ return choices[asNumber - 1].value;
257
+ }
258
+ const byValue = choices.find((choice) => String(choice.value) === answer);
259
+ if (byValue)
260
+ return byValue.value;
261
+ this.write(` ${style.red(symbol.fail)} opção inválida: digite 1..${choices.length}\n`);
262
+ }
263
+ }
264
+ /** Confirmação Y/n. Não-interativo → `defaultValue`. */
265
+ async confirm(title, opts = {}) {
266
+ const fallback = opts.defaultValue ?? false;
267
+ if (!this.io.isTTY)
268
+ return fallback;
269
+ const hint = opts.defaultValue === undefined ? '[y/n]' : opts.defaultValue ? '[Y/n]' : '[y/N]';
270
+ for (;;) {
271
+ const raw = await this.askLine(` ${symbol.ask} ${title} ${style.dim(hint)} `);
272
+ if (raw === null)
273
+ return fallback;
274
+ const answer = raw.trim().toLowerCase();
275
+ if (answer === '') {
276
+ if (opts.defaultValue !== undefined)
277
+ return opts.defaultValue;
278
+ continue;
279
+ }
280
+ if (['y', 'yes', 's', 'sim'].includes(answer))
281
+ return true;
282
+ if (['n', 'no', 'nao', 'não'].includes(answer))
283
+ return false;
284
+ this.write(` ${style.red(symbol.fail)} responda y ou n\n`);
285
+ }
286
+ }
287
+ /** Texto livre com validação, repetindo até aceitar. */
288
+ async ask(title, opts = {}) {
289
+ const fallback = opts.default ?? '';
290
+ if (!this.io.isTTY) {
291
+ if (opts.default !== undefined)
292
+ return opts.default;
293
+ throw new Error(`non-interactive: o valor "${title}" exige TTY ou --set`);
294
+ }
295
+ const current = opts.placeholder ?? opts.default;
296
+ const shown = current ? style.dim(` (${current})`) : '';
297
+ for (;;) {
298
+ const suffix = opts.default !== undefined && !opts.placeholder ? style.dim(`[${opts.default}]`) : '';
299
+ const raw = await this.askLine(` ${symbol.ask} ${title}${shown}${suffix} `);
300
+ const blank = raw === null || raw.trim() === '';
301
+ const value = blank ? fallback : raw.trim();
302
+ const problem = opts.validate?.(value);
303
+ if (problem) {
304
+ this.write(` ${style.red(symbol.fail)} ${problem}\n`);
305
+ continue;
306
+ }
307
+ return value;
308
+ }
309
+ }
310
+ /** Segredo: sem eco no TTY (mostra `*`), default via Enter. */
311
+ async secret(title, opts = {}) {
312
+ const fallback = opts.default ?? '';
313
+ if (!this.io.isTTY) {
314
+ // sem TTY o stdin É o pipe: `echo senha | okcms config` é fluxo real.
315
+ // Sem nada chegando, cai no default (stdin fechado em CI).
316
+ const piped = await this.input.readSecret();
317
+ const value = piped.trim() === '' ? fallback : piped.trim();
318
+ const problem = opts.validate?.(value);
319
+ if (problem)
320
+ throw new Error(problem);
321
+ return value;
322
+ }
323
+ const current = opts.placeholder ?? (opts.default !== undefined ? '••••••' : undefined);
324
+ const shown = current ? style.dim(` (${current})`) : '';
325
+ for (;;) {
326
+ const suffix = opts.default !== undefined ? style.dim('[enter = manter]') : '';
327
+ this.write(` ${symbol.ask} ${title}${shown}${suffix} `);
328
+ const value = await this.input.readSecret();
329
+ this.write('\n');
330
+ const problem = opts.validate?.(value);
331
+ if (problem) {
332
+ this.write(` ${style.red(symbol.fail)} ${problem}\n`);
333
+ continue;
334
+ }
335
+ return value === '' ? fallback : value;
336
+ }
337
+ }
338
+ /** Lê uma linha cruta (também usada pelos testes). */
339
+ async askLine(question) {
340
+ if (this.closed)
341
+ return null;
342
+ if (question)
343
+ this.io.output.write(question);
344
+ return this.input.readLine();
345
+ }
346
+ close() {
347
+ this.closed = true;
348
+ // solta o stdin: sem isso um `okcms update` terminaria com o canal preso
349
+ try {
350
+ this.io.input.setRawMode?.(false);
351
+ this.io.input.pause();
352
+ }
353
+ catch {
354
+ // stream já finalizado
355
+ }
356
+ }
357
+ }
358
+ // ---------------------------------------------------------------------------
359
+ // Helpers one-shot (um prompt e fecha)
360
+ // ---------------------------------------------------------------------------
361
+ export async function select(title, choices, opts = {}, io) {
362
+ const prompt = new Prompt(io);
363
+ try {
364
+ return await prompt.select(title, choices, opts);
365
+ }
366
+ finally {
367
+ prompt.close();
368
+ }
369
+ }
370
+ export async function confirm(title, opts = {}, io) {
371
+ const prompt = new Prompt(io);
372
+ try {
373
+ return await prompt.confirm(title, opts);
374
+ }
375
+ finally {
376
+ prompt.close();
377
+ }
378
+ }
379
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ import type { Runner } from './docker.js';
2
+ import { type ContainerProbe } from './guards.js';
3
+ import { Prompt } from './prompt.js';
4
+ /**
5
+ * Mesmo padrão de `parseMigrationName` (packages/database): qualquer `.sql`
6
+ * fora dele derruba `loadMigrationsFromDir` para TODAS as migrations do
7
+ * diretório — por isso nada fora do padrão é copiado para `migrations/`.
8
+ */
9
+ export declare const MIGRATION_FILENAME: RegExp;
10
+ export interface PluginMigrationEntry {
11
+ plugin: string;
12
+ /** Nome do arquivo (o mesmo nos dois lados — é a identidade da migration). */
13
+ file: string;
14
+ source: string;
15
+ target: string;
16
+ /**
17
+ * new não está em migrations/ → copiar;
18
+ * staged está idêntico → nada a fazer;
19
+ * conflict está mas com outro conteúdo → NÃO sobrescreve (a do projeto é
20
+ * do operador, e a versão já aplicada no banco tem checksum);
21
+ * invalid nome fora do padrão do runner → nunca copiar.
22
+ */
23
+ status: 'new' | 'staged' | 'conflict' | 'invalid';
24
+ }
25
+ export interface ThemeBuildEntry {
26
+ theme: string;
27
+ manifestPath: string | null;
28
+ engine: string;
29
+ output: string;
30
+ entry: string | null;
31
+ /** 'build' = tem entrada de estilo e será compilado. */
32
+ status: 'build' | 'no-entry' | 'missing-manifest' | 'invalid-manifest';
33
+ /** Erros do manifest (o runtime recusaria o tema de qualquer forma). */
34
+ problems: string[];
35
+ }
36
+ export interface RedeployPlan {
37
+ /** Todos os plugins instalados (mesmo sem migrations). */
38
+ plugins: string[];
39
+ /** Todos os temas instalados. */
40
+ themes: string[];
41
+ migrations: PluginMigrationEntry[];
42
+ themeBuilds: ThemeBuildEntry[];
43
+ /**
44
+ * `.sql` JÁ existente em `migrations/` fora do padrão do runner: bloqueia
45
+ * qualquer `db:migrate`, então é detectado aqui, antes do deploy.
46
+ */
47
+ invalidExisting: string[];
48
+ }
49
+ export interface RedeployPlanOptions {
50
+ cwd?: string;
51
+ /** Prepara só as migrations deste plugin (o rebuild é sempre global). */
52
+ plugin?: string;
53
+ /** Compila só este tema (o rebuild é sempre global). */
54
+ theme?: string;
55
+ /** Diretório de migrations do projeto (default: `<cwd>/migrations`). */
56
+ migrationsDir?: string;
57
+ }
58
+ /**
59
+ * Lê o estado de plugins/temas e devolve o que o redeploy faria. Só lê —
60
+ * nenhum byte é escrito aqui, o que torna `--dry-run` e os testes triviais.
61
+ */
62
+ export declare function planRedeploy(opts?: RedeployPlanOptions): RedeployPlan;
63
+ export interface StageResult {
64
+ copied: string[];
65
+ already: string[];
66
+ conflicts: string[];
67
+ invalid: string[];
68
+ }
69
+ /**
70
+ * Copia o SQL de plugin para `migrations/` (o único diretório que o runner
71
+ * lê). Idempotente: arquivo idêntico não é tocado, arquivo divergente é
72
+ * PRESERVADO — `migrations/` pertence ao operador e a versão aplicada no
73
+ * banco já tem checksum registrado.
74
+ */
75
+ export declare function stagePluginMigrations(plan: RedeployPlan): StageResult;
76
+ export interface RenderPlanOptions {
77
+ skipMigrations?: boolean;
78
+ skipThemeBuild?: boolean;
79
+ }
80
+ /** Linhas do resumo do redeploy — puras, para `--dry-run` e para os testes. */
81
+ export declare function renderPlan(plan: RedeployPlan, opts?: RenderPlanOptions): string[];
82
+ export interface RedeployOptions {
83
+ cwd?: string;
84
+ runner?: Runner;
85
+ prompt?: Prompt;
86
+ /** Só prepara as migrations deste plugin. */
87
+ plugin?: string;
88
+ /** Só compila este tema. */
89
+ theme?: string;
90
+ /** `--skip-migrations`: não copia SQL de plugin para `migrations/`. */
91
+ skipMigrations?: boolean;
92
+ /** `--skip-theme-build`: não compila estilos (útil só para rebuild de plugin). */
93
+ skipThemeBuild?: boolean;
94
+ /** `--dry-run`: mostra o plano e sai sem tocar em nada. */
95
+ dryRun?: boolean;
96
+ /** `--no-cache`: build limpo da imagem. */
97
+ noCache?: boolean;
98
+ /** `--remove-orphans` / `--keep-orphans`. */
99
+ removeOrphans?: boolean;
100
+ keepOrphans?: boolean;
101
+ /** `--yes`: nenhum prompt, tudo em default. */
102
+ yes?: boolean;
103
+ /** `--force`: permite rodar dentro de container (não recomendado). */
104
+ force?: boolean;
105
+ probe?: ContainerProbe;
106
+ log?: (message: string) => void;
107
+ }
108
+ export declare function runRedeploy(opts?: RedeployOptions): Promise<number>;
109
+ //# sourceMappingURL=redeploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redeploy.d.ts","sourceRoot":"","sources":["../src/redeploy.ts"],"names":[],"mappings":"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"}