@intactfile/engines 0.1.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.
- package/README.md +68 -0
- package/dist/archive/diagnose.d.ts +37 -0
- package/dist/archive/diagnose.d.ts.map +1 -0
- package/dist/archive/diagnose.js +165 -0
- package/dist/archive/diagnose.js.map +1 -0
- package/dist/archive/format.d.ts +52 -0
- package/dist/archive/format.d.ts.map +1 -0
- package/dist/archive/format.js +87 -0
- package/dist/archive/format.js.map +1 -0
- package/dist/archive/host.d.ts +83 -0
- package/dist/archive/host.d.ts.map +1 -0
- package/dist/archive/host.js +92 -0
- package/dist/archive/host.js.map +1 -0
- package/dist/archive/index.d.ts +22 -0
- package/dist/archive/index.d.ts.map +1 -0
- package/dist/archive/index.js +19 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/salvage.d.ts +73 -0
- package/dist/archive/salvage.d.ts.map +1 -0
- package/dist/archive/salvage.js +210 -0
- package/dist/archive/salvage.js.map +1 -0
- package/dist/byte-source.d.ts +19 -0
- package/dist/byte-source.d.ts.map +1 -0
- package/dist/byte-source.js +16 -0
- package/dist/byte-source.js.map +1 -0
- package/dist/bytesource/blob.d.ts +14 -0
- package/dist/bytesource/blob.d.ts.map +1 -0
- package/dist/bytesource/blob.js +23 -0
- package/dist/bytesource/blob.js.map +1 -0
- package/dist/crc32.d.ts +2 -0
- package/dist/crc32.d.ts.map +1 -0
- package/dist/crc32.js +18 -0
- package/dist/crc32.js.map +1 -0
- package/dist/detect/index.d.ts +16 -0
- package/dist/detect/index.d.ts.map +1 -0
- package/dist/detect/index.js +159 -0
- package/dist/detect/index.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/jpeg/browser-loader.d.ts +21 -0
- package/dist/jpeg/browser-loader.d.ts.map +1 -0
- package/dist/jpeg/browser-loader.js +28 -0
- package/dist/jpeg/browser-loader.js.map +1 -0
- package/dist/jpeg/diagnose.d.ts +50 -0
- package/dist/jpeg/diagnose.d.ts.map +1 -0
- package/dist/jpeg/diagnose.js +124 -0
- package/dist/jpeg/diagnose.js.map +1 -0
- package/dist/jpeg/exif.d.ts +11 -0
- package/dist/jpeg/exif.d.ts.map +1 -0
- package/dist/jpeg/exif.js +50 -0
- package/dist/jpeg/exif.js.map +1 -0
- package/dist/jpeg/format.d.ts +106 -0
- package/dist/jpeg/format.d.ts.map +1 -0
- package/dist/jpeg/format.js +248 -0
- package/dist/jpeg/format.js.map +1 -0
- package/dist/jpeg/index.d.ts +18 -0
- package/dist/jpeg/index.d.ts.map +1 -0
- package/dist/jpeg/index.js +14 -0
- package/dist/jpeg/index.js.map +1 -0
- package/dist/jpeg/mozjpeg-host.d.ts +60 -0
- package/dist/jpeg/mozjpeg-host.d.ts.map +1 -0
- package/dist/jpeg/mozjpeg-host.js +138 -0
- package/dist/jpeg/mozjpeg-host.js.map +1 -0
- package/dist/jpeg/repair.d.ts +89 -0
- package/dist/jpeg/repair.d.ts.map +1 -0
- package/dist/jpeg/repair.js +216 -0
- package/dist/jpeg/repair.js.map +1 -0
- package/dist/node.d.ts +11 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +29 -0
- package/dist/node.js.map +1 -0
- package/dist/pdf/browser-loader.d.ts +30 -0
- package/dist/pdf/browser-loader.d.ts.map +1 -0
- package/dist/pdf/browser-loader.js +21 -0
- package/dist/pdf/browser-loader.js.map +1 -0
- package/dist/pdf/diagnose.d.ts +23 -0
- package/dist/pdf/diagnose.d.ts.map +1 -0
- package/dist/pdf/diagnose.js +113 -0
- package/dist/pdf/diagnose.js.map +1 -0
- package/dist/pdf/format.d.ts +61 -0
- package/dist/pdf/format.d.ts.map +1 -0
- package/dist/pdf/format.js +150 -0
- package/dist/pdf/format.js.map +1 -0
- package/dist/pdf/index.d.ts +17 -0
- package/dist/pdf/index.d.ts.map +1 -0
- package/dist/pdf/index.js +12 -0
- package/dist/pdf/index.js.map +1 -0
- package/dist/pdf/qpdf-host.d.ts +66 -0
- package/dist/pdf/qpdf-host.d.ts.map +1 -0
- package/dist/pdf/qpdf-host.js +149 -0
- package/dist/pdf/qpdf-host.js.map +1 -0
- package/dist/pdf/rebuild.d.ts +32 -0
- package/dist/pdf/rebuild.d.ts.map +1 -0
- package/dist/pdf/rebuild.js +90 -0
- package/dist/pdf/rebuild.js.map +1 -0
- package/dist/pdf/repair.d.ts +61 -0
- package/dist/pdf/repair.d.ts.map +1 -0
- package/dist/pdf/repair.js +167 -0
- package/dist/pdf/repair.js.map +1 -0
- package/dist/png/diagnose.d.ts +50 -0
- package/dist/png/diagnose.d.ts.map +1 -0
- package/dist/png/diagnose.js +261 -0
- package/dist/png/diagnose.js.map +1 -0
- package/dist/png/format.d.ts +133 -0
- package/dist/png/format.d.ts.map +1 -0
- package/dist/png/format.js +350 -0
- package/dist/png/format.js.map +1 -0
- package/dist/png/index.d.ts +13 -0
- package/dist/png/index.d.ts.map +1 -0
- package/dist/png/index.js +10 -0
- package/dist/png/index.js.map +1 -0
- package/dist/png/repair.d.ts +31 -0
- package/dist/png/repair.d.ts.map +1 -0
- package/dist/png/repair.js +335 -0
- package/dist/png/repair.js.map +1 -0
- package/dist/sqlite/diagnose.d.ts +31 -0
- package/dist/sqlite/diagnose.d.ts.map +1 -0
- package/dist/sqlite/diagnose.js +169 -0
- package/dist/sqlite/diagnose.js.map +1 -0
- package/dist/sqlite/format.d.ts +103 -0
- package/dist/sqlite/format.d.ts.map +1 -0
- package/dist/sqlite/format.js +237 -0
- package/dist/sqlite/format.js.map +1 -0
- package/dist/sqlite/index.d.ts +24 -0
- package/dist/sqlite/index.d.ts.map +1 -0
- package/dist/sqlite/index.js +19 -0
- package/dist/sqlite/index.js.map +1 -0
- package/dist/sqlite/recover.d.ts +66 -0
- package/dist/sqlite/recover.d.ts.map +1 -0
- package/dist/sqlite/recover.js +305 -0
- package/dist/sqlite/recover.js.map +1 -0
- package/dist/sqlite/scan.d.ts +94 -0
- package/dist/sqlite/scan.d.ts.map +1 -0
- package/dist/sqlite/scan.js +356 -0
- package/dist/sqlite/scan.js.map +1 -0
- package/dist/sqlite/sqlite-host.d.ts +37 -0
- package/dist/sqlite/sqlite-host.d.ts.map +1 -0
- package/dist/sqlite/sqlite-host.js +80 -0
- package/dist/sqlite/sqlite-host.js.map +1 -0
- package/dist/sqlite/wal.d.ts +14 -0
- package/dist/sqlite/wal.d.ts.map +1 -0
- package/dist/sqlite/wal.js +79 -0
- package/dist/sqlite/wal.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/video/diagnose.d.ts +41 -0
- package/dist/video/diagnose.d.ts.map +1 -0
- package/dist/video/diagnose.js +188 -0
- package/dist/video/diagnose.js.map +1 -0
- package/dist/video/format.d.ts +87 -0
- package/dist/video/format.d.ts.map +1 -0
- package/dist/video/format.js +273 -0
- package/dist/video/format.js.map +1 -0
- package/dist/video/index.d.ts +21 -0
- package/dist/video/index.d.ts.map +1 -0
- package/dist/video/index.js +17 -0
- package/dist/video/index.js.map +1 -0
- package/dist/video/libav-host.d.ts +88 -0
- package/dist/video/libav-host.d.ts.map +1 -0
- package/dist/video/libav-host.js +66 -0
- package/dist/video/libav-host.js.map +1 -0
- package/dist/video/mp4-rebuild.d.ts +167 -0
- package/dist/video/mp4-rebuild.d.ts.map +1 -0
- package/dist/video/mp4-rebuild.js +270 -0
- package/dist/video/mp4-rebuild.js.map +1 -0
- package/dist/video/mp4box-host.d.ts +62 -0
- package/dist/video/mp4box-host.d.ts.map +1 -0
- package/dist/video/mp4box-host.js +209 -0
- package/dist/video/mp4box-host.js.map +1 -0
- package/dist/video/reconstruct.d.ts +97 -0
- package/dist/video/reconstruct.d.ts.map +1 -0
- package/dist/video/reconstruct.js +271 -0
- package/dist/video/reconstruct.js.map +1 -0
- package/dist/video/remux.d.ts +85 -0
- package/dist/video/remux.d.ts.map +1 -0
- package/dist/video/remux.js +350 -0
- package/dist/video/remux.js.map +1 -0
- package/dist/zip/diagnose.d.ts +22 -0
- package/dist/zip/diagnose.d.ts.map +1 -0
- package/dist/zip/diagnose.js +126 -0
- package/dist/zip/diagnose.js.map +1 -0
- package/dist/zip/format.d.ts +79 -0
- package/dist/zip/format.d.ts.map +1 -0
- package/dist/zip/format.js +129 -0
- package/dist/zip/format.js.map +1 -0
- package/dist/zip/repair.d.ts +32 -0
- package/dist/zip/repair.d.ts.map +1 -0
- package/dist/zip/repair.js +82 -0
- package/dist/zip/repair.js.map +1 -0
- package/dist/zip/salvage.d.ts +23 -0
- package/dist/zip/salvage.d.ts.map +1 -0
- package/dist/zip/salvage.js +140 -0
- package/dist/zip/salvage.js.map +1 -0
- package/dist/zip/scan.d.ts +64 -0
- package/dist/zip/scan.d.ts.map +1 -0
- package/dist/zip/scan.js +386 -0
- package/dist/zip/scan.js.map +1 -0
- package/dist/zip/writer.d.ts +14 -0
- package/dist/zip/writer.d.ts.map +1 -0
- package/dist/zip/writer.js +131 -0
- package/dist/zip/writer.js.map +1 -0
- package/package.json +71 -0
- package/src/archive/LICENSE-unrar.txt +53 -0
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/** The canonical 8-byte PNG signature (89 50 4E 47 0D 0A 1A 0A). */
|
|
2
|
+
export declare const PNG_SIGNATURE: Uint8Array<ArrayBuffer>;
|
|
3
|
+
export interface PngSafetyCaps {
|
|
4
|
+
maxWidth: number;
|
|
5
|
+
maxHeight: number;
|
|
6
|
+
/** Total pixels — the real bomb guard (width*height before allocation). */
|
|
7
|
+
maxPixels: number;
|
|
8
|
+
/** Hard ceiling on inflated bytes, independent of declared dimensions. */
|
|
9
|
+
maxInflatedBytes: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Conservative defaults. 100 MP covers any legitimate consumer photo while
|
|
13
|
+
* refusing the classic "tiny IDAT, gigantic IHDR" decompression bomb.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_PNG_CAPS: PngSafetyCaps;
|
|
16
|
+
export declare function readU32BE(bytes: Uint8Array, off: number): number;
|
|
17
|
+
export declare function writeU32BE(bytes: Uint8Array, off: number, value: number): void;
|
|
18
|
+
export declare function ascii4(bytes: Uint8Array, off: number): string;
|
|
19
|
+
/** True when the 8 canonical signature bytes sit exactly at `off`. */
|
|
20
|
+
export declare function hasSignatureAt(bytes: Uint8Array, off: number): boolean;
|
|
21
|
+
/** True when bytes 1..3 at `off` spell "PNG" (recognizable even if mangled). */
|
|
22
|
+
export declare function looksLikePngAt(bytes: Uint8Array, off: number): boolean;
|
|
23
|
+
/** Offset of a pristine signature within the first `maxScan` bytes, or -1. */
|
|
24
|
+
export declare function findSignature(bytes: Uint8Array, maxScan?: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Reverse FTP/ASCII-mode "Unix→DOS" newline mangling: a CR was inserted before
|
|
27
|
+
* every LF, so removing every CR that immediately precedes an LF restores the
|
|
28
|
+
* original bytes exactly (the transform is injective, so this is lossless for
|
|
29
|
+
* any binary payload — including a PNG's IDAT).
|
|
30
|
+
*/
|
|
31
|
+
export declare function unmangleNewlines(bytes: Uint8Array): Uint8Array;
|
|
32
|
+
/**
|
|
33
|
+
* Detect Unix→DOS newline mangling: the file does not begin with a valid
|
|
34
|
+
* signature, but un-mangling makes a valid signature appear at offset 0.
|
|
35
|
+
*/
|
|
36
|
+
export declare function looksNewlineMangled(bytes: Uint8Array): boolean;
|
|
37
|
+
/** Samples per pixel for a PNG colour type, or null when unknown. */
|
|
38
|
+
export declare function channelsForColorType(colorType: number): number | null;
|
|
39
|
+
/** Whether a (bitDepth, colorType) pair is a spec-legal combination. */
|
|
40
|
+
export declare function isValidColorConfig(bitDepth: number, colorType: number): boolean;
|
|
41
|
+
/** Bytes per (unfiltered) scanline, excluding the leading filter byte. */
|
|
42
|
+
export declare function bytesPerRow(width: number, channels: number, bitDepth: number): number;
|
|
43
|
+
/** Inflated stride of one scanline: filter byte + row bytes. */
|
|
44
|
+
export declare function scanlineStride(width: number, channels: number, bitDepth: number): number;
|
|
45
|
+
export interface PngChunk {
|
|
46
|
+
/** Offset of the 4-byte length field. */
|
|
47
|
+
offset: number;
|
|
48
|
+
/** Declared data length. */
|
|
49
|
+
length: number;
|
|
50
|
+
type: string;
|
|
51
|
+
dataOffset: number;
|
|
52
|
+
/** Offset of the stored 4-byte CRC (== dataOffset + length). */
|
|
53
|
+
crcOffset: number;
|
|
54
|
+
/** Bytes of chunk data actually present (< length when truncated). */
|
|
55
|
+
availableData: number;
|
|
56
|
+
/** Declared data + CRC run past the end of the buffer. */
|
|
57
|
+
truncated: boolean;
|
|
58
|
+
crcStored: number | null;
|
|
59
|
+
crcComputed: number | null;
|
|
60
|
+
/** null when the chunk is truncated (CRC cannot be verified). */
|
|
61
|
+
crcOk: boolean | null;
|
|
62
|
+
}
|
|
63
|
+
export interface ChunkWalk {
|
|
64
|
+
chunks: PngChunk[];
|
|
65
|
+
/** Offset just past the last fully-parsed chunk. */
|
|
66
|
+
endOffset: number;
|
|
67
|
+
sawIend: boolean;
|
|
68
|
+
/** A chunk's declared length/CRC ran past EOF. */
|
|
69
|
+
truncated: boolean;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Walk PNG chunks in memory from `start` (which must be just after the 8-byte
|
|
73
|
+
* signature). Verifies each chunk's CRC over type+data. Stops at IEND, at the
|
|
74
|
+
* first structurally impossible length, or when the buffer runs out.
|
|
75
|
+
*/
|
|
76
|
+
export declare function walkChunksInMemory(bytes: Uint8Array, start: number): ChunkWalk;
|
|
77
|
+
export interface IhdrFields {
|
|
78
|
+
width: number;
|
|
79
|
+
height: number;
|
|
80
|
+
bitDepth: number;
|
|
81
|
+
colorType: number;
|
|
82
|
+
compression: number;
|
|
83
|
+
filter: number;
|
|
84
|
+
interlace: number;
|
|
85
|
+
}
|
|
86
|
+
/** Parse the 13-byte IHDR data payload. Returns null if too short. */
|
|
87
|
+
export declare function parseIhdr(data: Uint8Array): IhdrFields | null;
|
|
88
|
+
/** Serialize IHDR fields back into a fresh 13-byte payload. */
|
|
89
|
+
export declare function serializeIhdr(f: IhdrFields): Uint8Array;
|
|
90
|
+
/** CRC over an IHDR chunk (type "IHDR" + 13-byte data), for CRC brute-force. */
|
|
91
|
+
export declare function ihdrCrc(data: Uint8Array): number;
|
|
92
|
+
export interface DimensionCandidate {
|
|
93
|
+
width: number;
|
|
94
|
+
height: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* All (width, height) pairs consistent with a known inflated IDAT size, for a
|
|
98
|
+
* non-interlaced image with the given channels/bitDepth:
|
|
99
|
+
* inflatedSize === height * (1 + ceil(width*channels*bitDepth/8))
|
|
100
|
+
*/
|
|
101
|
+
export declare function factorizeDimensions(inflatedSize: number, channels: number, bitDepth: number, caps?: PngSafetyCaps): DimensionCandidate[];
|
|
102
|
+
export interface ReconstructedDimensions extends DimensionCandidate {
|
|
103
|
+
/** true = disambiguated against the stored IHDR CRC (certain). */
|
|
104
|
+
exact: boolean;
|
|
105
|
+
/** Number of factorization candidates considered. */
|
|
106
|
+
candidates: number;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Recover width/height for an IHDR whose dimension bytes are corrupt.
|
|
110
|
+
* Strategy: factor the (trusted) inflated IDAT size, then disambiguate against
|
|
111
|
+
* the stored IHDR CRC when available. Falls back to the most "photo-like"
|
|
112
|
+
* candidate (aspect ratio closest to 4:3) when the CRC cannot decide.
|
|
113
|
+
*/
|
|
114
|
+
export declare function reconstructDimensions(args: {
|
|
115
|
+
tail: {
|
|
116
|
+
bitDepth: number;
|
|
117
|
+
colorType: number;
|
|
118
|
+
compression: number;
|
|
119
|
+
filter: number;
|
|
120
|
+
interlace: number;
|
|
121
|
+
};
|
|
122
|
+
inflatedSize: number;
|
|
123
|
+
storedCrc: number | null;
|
|
124
|
+
caps?: PngSafetyCaps;
|
|
125
|
+
}): ReconstructedDimensions | null;
|
|
126
|
+
/**
|
|
127
|
+
* Reverse PNG filters over `rows` complete 8-bit scanlines taken from the head
|
|
128
|
+
* of an inflated IDAT stream. Returns the raw sample bytes (no filter bytes),
|
|
129
|
+
* ready to hand to fast-png's encoder. Only 8-bit depth is handled here; the
|
|
130
|
+
* caller must gate on bitDepth === 8.
|
|
131
|
+
*/
|
|
132
|
+
export declare function unfilterScanlines8(raw: Uint8Array, rows: number, width: number, channels: number): Uint8Array;
|
|
133
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/png/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure PNG byte primitives: signature handling, chunk walking, CRC, dimension
|
|
3
|
+
* reconstruction and scanline unfiltering. No wasm, no I/O — everything here
|
|
4
|
+
* operates on plain byte arrays so it is safe in the browser root export and
|
|
5
|
+
* trivially unit-testable.
|
|
6
|
+
*
|
|
7
|
+
* Reference: PNG spec (W3C, 2003) and the pngcheck chunk model.
|
|
8
|
+
*/
|
|
9
|
+
import { crc32 } from '../crc32.js';
|
|
10
|
+
/** The canonical 8-byte PNG signature (89 50 4E 47 0D 0A 1A 0A). */
|
|
11
|
+
export const PNG_SIGNATURE = Uint8Array.of(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a);
|
|
12
|
+
/** Bytes 1..3 of the signature spell "PNG" — the recognizable fingerprint. */
|
|
13
|
+
const PNG_ASCII = Uint8Array.of(0x50, 0x4e, 0x47);
|
|
14
|
+
/**
|
|
15
|
+
* Conservative defaults. 100 MP covers any legitimate consumer photo while
|
|
16
|
+
* refusing the classic "tiny IDAT, gigantic IHDR" decompression bomb.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_PNG_CAPS = {
|
|
19
|
+
maxWidth: 100_000,
|
|
20
|
+
maxHeight: 100_000,
|
|
21
|
+
maxPixels: 100_000_000,
|
|
22
|
+
maxInflatedBytes: 512 * 1024 * 1024,
|
|
23
|
+
};
|
|
24
|
+
export function readU32BE(bytes, off) {
|
|
25
|
+
return (((bytes[off] << 24) | (bytes[off + 1] << 16) | (bytes[off + 2] << 8) | bytes[off + 3]) >>> 0);
|
|
26
|
+
}
|
|
27
|
+
export function writeU32BE(bytes, off, value) {
|
|
28
|
+
bytes[off] = (value >>> 24) & 0xff;
|
|
29
|
+
bytes[off + 1] = (value >>> 16) & 0xff;
|
|
30
|
+
bytes[off + 2] = (value >>> 8) & 0xff;
|
|
31
|
+
bytes[off + 3] = value & 0xff;
|
|
32
|
+
}
|
|
33
|
+
export function ascii4(bytes, off) {
|
|
34
|
+
return String.fromCharCode(bytes[off], bytes[off + 1], bytes[off + 2], bytes[off + 3]);
|
|
35
|
+
}
|
|
36
|
+
/** True when the 8 canonical signature bytes sit exactly at `off`. */
|
|
37
|
+
export function hasSignatureAt(bytes, off) {
|
|
38
|
+
if (off + 8 > bytes.length)
|
|
39
|
+
return false;
|
|
40
|
+
for (let i = 0; i < 8; i += 1)
|
|
41
|
+
if (bytes[off + i] !== PNG_SIGNATURE[i])
|
|
42
|
+
return false;
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
/** True when bytes 1..3 at `off` spell "PNG" (recognizable even if mangled). */
|
|
46
|
+
export function looksLikePngAt(bytes, off) {
|
|
47
|
+
return (bytes[off + 1] === PNG_ASCII[0] &&
|
|
48
|
+
bytes[off + 2] === PNG_ASCII[1] &&
|
|
49
|
+
bytes[off + 3] === PNG_ASCII[2]);
|
|
50
|
+
}
|
|
51
|
+
/** Offset of a pristine signature within the first `maxScan` bytes, or -1. */
|
|
52
|
+
export function findSignature(bytes, maxScan = 64 * 1024) {
|
|
53
|
+
const limit = Math.min(bytes.length - 8, maxScan);
|
|
54
|
+
for (let i = 0; i <= limit; i += 1) {
|
|
55
|
+
if (bytes[i] === 0x89 && bytes[i + 1] === 0x50 && hasSignatureAt(bytes, i))
|
|
56
|
+
return i;
|
|
57
|
+
}
|
|
58
|
+
return -1;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Reverse FTP/ASCII-mode "Unix→DOS" newline mangling: a CR was inserted before
|
|
62
|
+
* every LF, so removing every CR that immediately precedes an LF restores the
|
|
63
|
+
* original bytes exactly (the transform is injective, so this is lossless for
|
|
64
|
+
* any binary payload — including a PNG's IDAT).
|
|
65
|
+
*/
|
|
66
|
+
export function unmangleNewlines(bytes) {
|
|
67
|
+
const out = new Uint8Array(bytes.length);
|
|
68
|
+
let n = 0;
|
|
69
|
+
for (let i = 0; i < bytes.length; i += 1) {
|
|
70
|
+
if (bytes[i] === 0x0d && bytes[i + 1] === 0x0a)
|
|
71
|
+
continue;
|
|
72
|
+
out[n++] = bytes[i];
|
|
73
|
+
}
|
|
74
|
+
return out.subarray(0, n);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Detect Unix→DOS newline mangling: the file does not begin with a valid
|
|
78
|
+
* signature, but un-mangling makes a valid signature appear at offset 0.
|
|
79
|
+
*/
|
|
80
|
+
export function looksNewlineMangled(bytes) {
|
|
81
|
+
if (bytes.length < 10)
|
|
82
|
+
return false;
|
|
83
|
+
if (hasSignatureAt(bytes, 0))
|
|
84
|
+
return false;
|
|
85
|
+
// Fast pre-check on the head: mangled signature starts 89 50 4E 47 0D 0D 0A.
|
|
86
|
+
const head = unmangleNewlines(bytes.subarray(0, 16));
|
|
87
|
+
return hasSignatureAt(head, 0);
|
|
88
|
+
}
|
|
89
|
+
/** Samples per pixel for a PNG colour type, or null when unknown. */
|
|
90
|
+
export function channelsForColorType(colorType) {
|
|
91
|
+
switch (colorType) {
|
|
92
|
+
case 0:
|
|
93
|
+
return 1; // grayscale
|
|
94
|
+
case 2:
|
|
95
|
+
return 3; // truecolour
|
|
96
|
+
case 3:
|
|
97
|
+
return 1; // indexed (one palette index per pixel)
|
|
98
|
+
case 4:
|
|
99
|
+
return 2; // grayscale + alpha
|
|
100
|
+
case 6:
|
|
101
|
+
return 4; // truecolour + alpha
|
|
102
|
+
default:
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const VALID_BIT_DEPTHS = new Set([1, 2, 4, 8, 16]);
|
|
107
|
+
/** Whether a (bitDepth, colorType) pair is a spec-legal combination. */
|
|
108
|
+
export function isValidColorConfig(bitDepth, colorType) {
|
|
109
|
+
if (!VALID_BIT_DEPTHS.has(bitDepth))
|
|
110
|
+
return false;
|
|
111
|
+
switch (colorType) {
|
|
112
|
+
case 0:
|
|
113
|
+
return true; // 1/2/4/8/16
|
|
114
|
+
case 3:
|
|
115
|
+
return bitDepth <= 8; // palette: 1/2/4/8
|
|
116
|
+
case 2:
|
|
117
|
+
case 4:
|
|
118
|
+
case 6:
|
|
119
|
+
return bitDepth === 8 || bitDepth === 16;
|
|
120
|
+
default:
|
|
121
|
+
return false;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Bytes per (unfiltered) scanline, excluding the leading filter byte. */
|
|
125
|
+
export function bytesPerRow(width, channels, bitDepth) {
|
|
126
|
+
return Math.ceil((width * channels * bitDepth) / 8);
|
|
127
|
+
}
|
|
128
|
+
/** Inflated stride of one scanline: filter byte + row bytes. */
|
|
129
|
+
export function scanlineStride(width, channels, bitDepth) {
|
|
130
|
+
return 1 + bytesPerRow(width, channels, bitDepth);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Walk PNG chunks in memory from `start` (which must be just after the 8-byte
|
|
134
|
+
* signature). Verifies each chunk's CRC over type+data. Stops at IEND, at the
|
|
135
|
+
* first structurally impossible length, or when the buffer runs out.
|
|
136
|
+
*/
|
|
137
|
+
export function walkChunksInMemory(bytes, start) {
|
|
138
|
+
const chunks = [];
|
|
139
|
+
let pos = start;
|
|
140
|
+
let sawIend = false;
|
|
141
|
+
let truncated = false;
|
|
142
|
+
while (pos + 8 <= bytes.length) {
|
|
143
|
+
const length = readU32BE(bytes, pos);
|
|
144
|
+
const type = ascii4(bytes, pos + 4);
|
|
145
|
+
const dataOffset = pos + 8;
|
|
146
|
+
const crcOffset = dataOffset + length;
|
|
147
|
+
const bytesLeft = bytes.length - dataOffset;
|
|
148
|
+
// A length that overflows the remaining file means the chunk (and file)
|
|
149
|
+
// is truncated, or the length field itself is corrupt. Either way we can
|
|
150
|
+
// record what is present but cannot verify the CRC.
|
|
151
|
+
if (crcOffset + 4 > bytes.length) {
|
|
152
|
+
chunks.push({
|
|
153
|
+
offset: pos,
|
|
154
|
+
length,
|
|
155
|
+
type,
|
|
156
|
+
dataOffset,
|
|
157
|
+
crcOffset,
|
|
158
|
+
availableData: Math.max(0, Math.min(length, bytesLeft)),
|
|
159
|
+
truncated: true,
|
|
160
|
+
crcStored: null,
|
|
161
|
+
crcComputed: null,
|
|
162
|
+
crcOk: null,
|
|
163
|
+
});
|
|
164
|
+
truncated = true;
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
const crcStored = readU32BE(bytes, crcOffset);
|
|
168
|
+
const crcComputed = crc32(bytes.subarray(pos + 4, crcOffset));
|
|
169
|
+
chunks.push({
|
|
170
|
+
offset: pos,
|
|
171
|
+
length,
|
|
172
|
+
type,
|
|
173
|
+
dataOffset,
|
|
174
|
+
crcOffset,
|
|
175
|
+
availableData: length,
|
|
176
|
+
truncated: false,
|
|
177
|
+
crcStored,
|
|
178
|
+
crcComputed,
|
|
179
|
+
crcOk: crcStored === crcComputed,
|
|
180
|
+
});
|
|
181
|
+
pos = crcOffset + 4;
|
|
182
|
+
if (type === 'IEND') {
|
|
183
|
+
sawIend = true;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Leftover bytes too short to form another chunk header, with no IEND seen,
|
|
188
|
+
// mean the final chunk header itself was cut off.
|
|
189
|
+
if (!sawIend && pos < bytes.length)
|
|
190
|
+
truncated = true;
|
|
191
|
+
return { chunks, endOffset: pos, sawIend, truncated };
|
|
192
|
+
}
|
|
193
|
+
/** Parse the 13-byte IHDR data payload. Returns null if too short. */
|
|
194
|
+
export function parseIhdr(data) {
|
|
195
|
+
if (data.length < 13)
|
|
196
|
+
return null;
|
|
197
|
+
return {
|
|
198
|
+
width: readU32BE(data, 0),
|
|
199
|
+
height: readU32BE(data, 4),
|
|
200
|
+
bitDepth: data[8],
|
|
201
|
+
colorType: data[9],
|
|
202
|
+
compression: data[10],
|
|
203
|
+
filter: data[11],
|
|
204
|
+
interlace: data[12],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/** Serialize IHDR fields back into a fresh 13-byte payload. */
|
|
208
|
+
export function serializeIhdr(f) {
|
|
209
|
+
const data = new Uint8Array(13);
|
|
210
|
+
writeU32BE(data, 0, f.width);
|
|
211
|
+
writeU32BE(data, 4, f.height);
|
|
212
|
+
data[8] = f.bitDepth;
|
|
213
|
+
data[9] = f.colorType;
|
|
214
|
+
data[10] = f.compression;
|
|
215
|
+
data[11] = f.filter;
|
|
216
|
+
data[12] = f.interlace;
|
|
217
|
+
return data;
|
|
218
|
+
}
|
|
219
|
+
/** CRC over an IHDR chunk (type "IHDR" + 13-byte data), for CRC brute-force. */
|
|
220
|
+
export function ihdrCrc(data) {
|
|
221
|
+
return crc32(data, crc32(Uint8Array.of(0x49, 0x48, 0x44, 0x52)));
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* All (width, height) pairs consistent with a known inflated IDAT size, for a
|
|
225
|
+
* non-interlaced image with the given channels/bitDepth:
|
|
226
|
+
* inflatedSize === height * (1 + ceil(width*channels*bitDepth/8))
|
|
227
|
+
*/
|
|
228
|
+
export function factorizeDimensions(inflatedSize, channels, bitDepth, caps = DEFAULT_PNG_CAPS) {
|
|
229
|
+
const out = [];
|
|
230
|
+
if (inflatedSize <= 0)
|
|
231
|
+
return out;
|
|
232
|
+
const maxW = Math.min(caps.maxWidth, inflatedSize);
|
|
233
|
+
for (let width = 1; width <= maxW; width += 1) {
|
|
234
|
+
const stride = scanlineStride(width, channels, bitDepth);
|
|
235
|
+
if (inflatedSize % stride !== 0)
|
|
236
|
+
continue;
|
|
237
|
+
const height = inflatedSize / stride;
|
|
238
|
+
if (height >= 1 && height <= caps.maxHeight && width * height <= caps.maxPixels) {
|
|
239
|
+
out.push({ width, height });
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return out;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Recover width/height for an IHDR whose dimension bytes are corrupt.
|
|
246
|
+
* Strategy: factor the (trusted) inflated IDAT size, then disambiguate against
|
|
247
|
+
* the stored IHDR CRC when available. Falls back to the most "photo-like"
|
|
248
|
+
* candidate (aspect ratio closest to 4:3) when the CRC cannot decide.
|
|
249
|
+
*/
|
|
250
|
+
export function reconstructDimensions(args) {
|
|
251
|
+
const { tail, inflatedSize, storedCrc } = args;
|
|
252
|
+
const caps = args.caps ?? DEFAULT_PNG_CAPS;
|
|
253
|
+
const channels = channelsForColorType(tail.colorType);
|
|
254
|
+
if (channels === null)
|
|
255
|
+
return null;
|
|
256
|
+
const candidates = factorizeDimensions(inflatedSize, channels, tail.bitDepth, caps);
|
|
257
|
+
if (candidates.length === 0)
|
|
258
|
+
return null;
|
|
259
|
+
if (storedCrc !== null) {
|
|
260
|
+
for (const c of candidates) {
|
|
261
|
+
const data = serializeIhdr({
|
|
262
|
+
width: c.width,
|
|
263
|
+
height: c.height,
|
|
264
|
+
bitDepth: tail.bitDepth,
|
|
265
|
+
colorType: tail.colorType,
|
|
266
|
+
compression: tail.compression,
|
|
267
|
+
filter: tail.filter,
|
|
268
|
+
interlace: tail.interlace,
|
|
269
|
+
});
|
|
270
|
+
if (ihdrCrc(data) === storedCrc) {
|
|
271
|
+
return { ...c, exact: true, candidates: candidates.length };
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// No CRC match: pick the candidate whose aspect ratio is closest to 4:3.
|
|
276
|
+
const TARGET = 4 / 3;
|
|
277
|
+
let best = candidates[0];
|
|
278
|
+
let bestErr = Infinity;
|
|
279
|
+
for (const c of candidates) {
|
|
280
|
+
const err = Math.abs(c.width / c.height - TARGET);
|
|
281
|
+
if (err < bestErr) {
|
|
282
|
+
bestErr = err;
|
|
283
|
+
best = c;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return { ...best, exact: false, candidates: candidates.length };
|
|
287
|
+
}
|
|
288
|
+
// ---------------------------------------------------------------------------
|
|
289
|
+
// Scanline unfiltering (8-bit depth, 1..4 channels, non-interlaced)
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
function paeth(a, b, c) {
|
|
292
|
+
const p = a + b - c;
|
|
293
|
+
const pa = Math.abs(p - a);
|
|
294
|
+
const pb = Math.abs(p - b);
|
|
295
|
+
const pc = Math.abs(p - c);
|
|
296
|
+
if (pa <= pb && pa <= pc)
|
|
297
|
+
return a;
|
|
298
|
+
if (pb <= pc)
|
|
299
|
+
return b;
|
|
300
|
+
return c;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Reverse PNG filters over `rows` complete 8-bit scanlines taken from the head
|
|
304
|
+
* of an inflated IDAT stream. Returns the raw sample bytes (no filter bytes),
|
|
305
|
+
* ready to hand to fast-png's encoder. Only 8-bit depth is handled here; the
|
|
306
|
+
* caller must gate on bitDepth === 8.
|
|
307
|
+
*/
|
|
308
|
+
export function unfilterScanlines8(raw, rows, width, channels) {
|
|
309
|
+
const bpp = channels; // bytes per pixel at 8-bit depth
|
|
310
|
+
const rowBytes = width * channels;
|
|
311
|
+
const stride = 1 + rowBytes;
|
|
312
|
+
const out = new Uint8Array(rows * rowBytes);
|
|
313
|
+
for (let y = 0; y < rows; y += 1) {
|
|
314
|
+
const filterType = raw[y * stride];
|
|
315
|
+
const inStart = y * stride + 1;
|
|
316
|
+
const outStart = y * rowBytes;
|
|
317
|
+
const prevStart = outStart - rowBytes;
|
|
318
|
+
for (let x = 0; x < rowBytes; x += 1) {
|
|
319
|
+
const rawByte = raw[inStart + x];
|
|
320
|
+
const a = x >= bpp ? out[outStart + x - bpp] : 0;
|
|
321
|
+
const b = y > 0 ? out[prevStart + x] : 0;
|
|
322
|
+
const c = y > 0 && x >= bpp ? out[prevStart + x - bpp] : 0;
|
|
323
|
+
let value;
|
|
324
|
+
switch (filterType) {
|
|
325
|
+
case 0:
|
|
326
|
+
value = rawByte;
|
|
327
|
+
break;
|
|
328
|
+
case 1:
|
|
329
|
+
value = rawByte + a;
|
|
330
|
+
break;
|
|
331
|
+
case 2:
|
|
332
|
+
value = rawByte + b;
|
|
333
|
+
break;
|
|
334
|
+
case 3:
|
|
335
|
+
value = rawByte + ((a + b) >> 1);
|
|
336
|
+
break;
|
|
337
|
+
case 4:
|
|
338
|
+
value = rawByte + paeth(a, b, c);
|
|
339
|
+
break;
|
|
340
|
+
default:
|
|
341
|
+
// Unknown filter: pass the byte through rather than throwing, so a
|
|
342
|
+
// corrupted filter byte does not sink an otherwise-salvageable row.
|
|
343
|
+
value = rawByte;
|
|
344
|
+
}
|
|
345
|
+
out[outStart + x] = value & 0xff;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return out;
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/png/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PNG engine subpath export (`@intactfile/engines/png`). Pure TypeScript —
|
|
3
|
+
* pako (MIT) + fast-png (MIT), no wasm — so it is browser-safe. Kept on its own
|
|
4
|
+
* key (not the root barrel) purely to avoid touching src/index.ts; the parent
|
|
5
|
+
* integration can promote diagnosePng to the root if desired since it is pure.
|
|
6
|
+
*/
|
|
7
|
+
export { diagnosePng } from './diagnose.js';
|
|
8
|
+
export type { PngDiagnosis, PngDamageClass, PngChunkInfo } from './diagnose.js';
|
|
9
|
+
export { repairPng } from './repair.js';
|
|
10
|
+
export type { PngRepairReport, PngRepairOutcome, PngRepairOptions, PngRepairResult, } from './repair.js';
|
|
11
|
+
export { PNG_SIGNATURE, DEFAULT_PNG_CAPS, walkChunksInMemory, factorizeDimensions, reconstructDimensions, channelsForColorType, isValidColorConfig, bytesPerRow, scanlineStride, unfilterScanlines8, unmangleNewlines, looksNewlineMangled, findSignature, hasSignatureAt, parseIhdr, serializeIhdr, ihdrCrc, } from './format.js';
|
|
12
|
+
export type { PngChunk, ChunkWalk, IhdrFields, PngSafetyCaps, DimensionCandidate, ReconstructedDimensions, } from './format.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/png/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,SAAS,EACT,aAAa,EACb,OAAO,GACR,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,QAAQ,EACR,SAAS,EACT,UAAU,EACV,aAAa,EACb,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PNG engine subpath export (`@intactfile/engines/png`). Pure TypeScript —
|
|
3
|
+
* pako (MIT) + fast-png (MIT), no wasm — so it is browser-safe. Kept on its own
|
|
4
|
+
* key (not the root barrel) purely to avoid touching src/index.ts; the parent
|
|
5
|
+
* integration can promote diagnosePng to the root if desired since it is pure.
|
|
6
|
+
*/
|
|
7
|
+
export { diagnosePng } from './diagnose.js';
|
|
8
|
+
export { repairPng } from './repair.js';
|
|
9
|
+
export { PNG_SIGNATURE, DEFAULT_PNG_CAPS, walkChunksInMemory, factorizeDimensions, reconstructDimensions, channelsForColorType, isValidColorConfig, bytesPerRow, scanlineStride, unfilterScanlines8, unmangleNewlines, looksNewlineMangled, findSignature, hasSignatureAt, parseIhdr, serializeIhdr, ihdrCrc, } from './format.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/png/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOxC,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,SAAS,EACT,aAAa,EACb,OAAO,GACR,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ByteSource } from '../byte-source.js';
|
|
2
|
+
import { type PngDamageClass } from './diagnose.js';
|
|
3
|
+
import { type PngSafetyCaps } from './format.js';
|
|
4
|
+
export type PngRepairOutcome = 'success' | 'partial' | 'failed';
|
|
5
|
+
export interface PngRepairReport {
|
|
6
|
+
outcome: PngRepairOutcome;
|
|
7
|
+
damageClass: PngDamageClass;
|
|
8
|
+
/** Surgical actions performed, in order. */
|
|
9
|
+
actions: string[];
|
|
10
|
+
notes: string[];
|
|
11
|
+
bytesIn: number;
|
|
12
|
+
bytesOut: number;
|
|
13
|
+
/** Final geometry of the emitted PNG, when one was produced. */
|
|
14
|
+
width: number | null;
|
|
15
|
+
height: number | null;
|
|
16
|
+
/** Rows present in the output image. */
|
|
17
|
+
rowsRecovered: number | null;
|
|
18
|
+
/** Rows the original image should have had. */
|
|
19
|
+
rowsExpected: number | null;
|
|
20
|
+
/** The emitted PNG re-decodes cleanly with fast-png. */
|
|
21
|
+
verified: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface PngRepairOptions {
|
|
24
|
+
caps?: PngSafetyCaps;
|
|
25
|
+
}
|
|
26
|
+
export interface PngRepairResult {
|
|
27
|
+
image?: Uint8Array;
|
|
28
|
+
report: PngRepairReport;
|
|
29
|
+
}
|
|
30
|
+
export declare function repairPng(src: ByteSource, opts?: PngRepairOptions): Promise<PngRepairResult>;
|
|
31
|
+
//# sourceMappingURL=repair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repair.d.ts","sourceRoot":"","sources":["../../src/png/repair.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAIL,KAAK,aAAa,EAWnB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,cAAc,CAAC;IAC5B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,wCAAwC;IACxC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,+CAA+C;IAC/C,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,wDAAwD;IACxD,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC;CACzB;AAyHD,wBAAsB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiOlG"}
|