diff --git a/README.md b/README.md index c940d034..2d5913af 100644 --- a/README.md +++ b/README.md @@ -55,9 +55,12 @@ import { createSession, loadFromPath, loadDirectory } from 'data-explorer-core/n ## Saving a file -`session.serializeSource(srcId)` answers a `.sldd` in the form it arrived in: -`{ kind: 'binary', bytes }` for a compressed-binary package, `{ kind: 'text', text }` -for a text dictionary. The other formats are read-only and answer `null`. +`session.serializeSource(srcId)` answers a file in the form it arrived in: a +`.sldd` as `{ kind: 'binary', bytes }` for a compressed-binary package and +`{ kind: 'text', text }` for a text dictionary, a `.mat` as +`{ kind: 'binary', sourceFormat: 'mat', bytes }`. Models and projects are +read-only and answer `null`. A save does not reset the source's `dirty` flag: +the host writes the bytes and registers the file again. A binary dictionary's save writes each entry nobody edited as the bytes it was read from, in its own place, and writes from the model only what was edited or @@ -105,6 +108,58 @@ save gate has to check for itself. `readEntryFragment(fragment, bytes it came from, so an entry rebuilt from text by an undo is still written as those bytes, and merged with them when it is edited again. +### A MAT-file + +A MAT-file is saved as the file it was read from, with what was edited written +fresh. That is a Level-5 file, as `-v6` and `-v7` write it; a `-v7.3` file (HDF5) +and a big-endian one are not opened. Every variable nobody edited is written as +the bytes it was read from, compressed or not as it was, in its own place, and so +are the file's objects (the unnamed record MATLAB keeps them in, last) and every +record the reader could not read; the header keeps its text. A variable only +renamed is its own bytes with the new name in them. One whose value was edited, +and one added, is written from the model, after the last variable and before the +objects, and compressed only if the file already holds a compressed record, so a +`-v6` file stays one. Written from the model, a variable is still the one it was +read as in every part it holds: a struct array of no element keeps its field +names, an empty its complexity, a zero its sign, and a variable saved as global +stays global. Before the bytes are handed back, every record written anew is +read again, and the file is held to the rules MATLAB loads a file by: a save that +breaks one the file as read did not break is refused, with a `MatWriteError` +naming the variable, and nothing is written. Both are asked where the save changed +the file, so a save costs what it changed, however large the rest of the file is; +a record written anew too large for the check to finish is refused as not +verified. + +What such a save cannot write, the editor does not offer. A host that honours the +editability core hands it (`getPropInfo(...).editable`, a row's `Name.editable`, +`_valueEditable` and `_descriptionEditable`, `nameEditable`, `valueEditable`, +`canAddChild`, `canRemoveChild`) offers no edit a save then refuses, and every +setter and `editProperty` refuse the same edits, naming the variable and why. +These take a rename and a delete and nothing else: + +- an object, of any class (a `Simulink.Parameter`, a bus, a signal, a class of + your own): none of its properties and none of the rows under it; +- a string, a function handle, and a value the reader could not decode; +- a plain variable holding any of these, or a cell or struct array the reader + read short (holding fewer elements than it declares, which a save would write + as empty), at any depth: neither its value nor any row under it; +- a plain variable stored in a form MATLAB does not load as it is (char data in + `miUINT8` or `miUTF32`, a numeric class in another class's type, a matrix its + parts do not fill), whose value as read is this package's guess at it; +- either of two variables of one name, until one is renamed: MATLAB loads only + one of them. + +A value typed in that would make a string (`"abc"`, `{1, "a"}`) is refused, and +Add is not offered on a struct array or on an element of one. A variable stored +after the objects, which MATLAB does not load, takes no edit, not even a rename, +and can be deleted. A file no save of which can be written is `readOnly` and takes +no edit, addition or delete at all: one whose records do not tile it, one opened +from a parse without its records (an older host's, through +`addMatSourceParsed`), one whose bytes the host has since handed away. +`addEntry` adds a variable named `var` (then `var1`, and so on) holding the +double `0`. What only a value's bytes can say is still checked by the save, and +refused in the same words. + ## Usage across a folder `session.findUsages(nodeId)` answers "what refers to this?" off the trees a diff --git a/dist/core/DataModel.d.ts.map b/dist/core/DataModel.d.ts.map index 0f8730b8..1899489d 100644 --- a/dist/core/DataModel.d.ts.map +++ b/dist/core/DataModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataModel.d.ts","sourceRoot":"","sources":["../../src/core/DataModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"DataModel.d.ts","sourceRoot":"","sources":["../../src/core/DataModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/core/DataModel.js b/dist/core/DataModel.js index 21683fea..48668e5e 100644 --- a/dist/core/DataModel.js +++ b/dist/core/DataModel.js @@ -9,6 +9,7 @@ import { parseModel } from '../datamodel/parser/ModelParser.js'; import { parseMat } from '../datamodel/parser/MatParser.js'; import { parseProject } from '../datamodel/parser/ProjectParser.js'; import { serializeBinarySldd } from '../datamodel/parser/BinarySlddSerializer.js'; +import { serializeMatFile } from '../datamodel/parser/MatFileWriter.js'; import { catalogFunctionRenames, catalogRenames, scJsonTextWithRenames } from '../datamodel/parser/ScCatalog.js'; // The name reductions and the expression reading, from the leaf modules that hold the // single copy of each. This file used to spell all three itself; the usage index needs @@ -19,7 +20,7 @@ import { blockKey, blockLabel, joinBlockPath } from '../datamodel/blockIdentity. import { maskDefining } from '../datamodel/maskScope.js'; import { normalizeRefNames } from '../datamodel/parser/SlddContent.js'; import RowCellPool from '../datamodel/node/RowCellPool.js'; -import { propNamed } from '../datamodel/node/BaseNode.js'; +import { propNamed, sourceEditRefusal } from '../datamodel/node/BaseNode.js'; import { holdersRestorer } from '../datamodel/node/childEdit.js'; // The session's own vocabulary — what a caller passes in and what these functions hand // back — and the compiler that turns one of those types, FindNodesQuery, into the tests @@ -1614,6 +1615,21 @@ export function createSession(opts = {}) { if (typeof newValue === 'string' && newValue === priorValue) { return true; } + // An edit the node's source would not write is refused before any setter is asked + // (BaseNode.sourceEditRefusal): a MAT-file's object, say, takes a rename and nothing else. + // Every setter asks the same rule (DataNode._refuseEncodedEdit); this is for one that does + // not, of a class a file can hold. + const prop = propNamed(node.getProperties(), propertyName); + const isName = propertyName === 'Name' || prop?.key === 'Name'; + const refused = sourceEditRefusal(node, isName ? 'Name' : prop?.key ?? propertyName); + if (refused) { + return { + error: true, + reason: refused, + invalidValue: String(newValue), + validValue: isName ? node.name : typeof priorValue === 'string' ? priorValue : node.displayValue, + }; + } // Unless the node can put the value back itself, which the undo then has it do: the text // it shows is not always its value (an empty's `[ ]` is a 0x0 double, whatever it was). const restore = propertyRestorer(node, propertyName); @@ -1669,13 +1685,17 @@ export function createSession(opts = {}) { // entry is named `entryName`, or the class's default name, with a counter appended if // that name is taken. Returns null, and adds nothing and records no undo step, when // there is no active dictionary, no section takes the class, or the name is not one - // MATLAB can load (see SectionNode.addEntry): the same rule a rename applies. + // MATLAB can load (see SectionNode.addEntry): the same rule a rename applies. A MAT-file + // takes a plain variable, the double 0 named `var` (MatNode.execAddEntry), and nothing its + // save could not write. function addEntry(sectionKey, className, entryName) { const slddNode = getActiveSlddNode(); if (!slddNode) { return null; } - let section = slddNode.getSection(sectionKey); + // A MAT-file has no sections: its variables are its own children, so it takes the entry + // itself, whatever `sectionKey` says (MatNode.execAddEntry: a plain variable, `0`). + let section = slddNode instanceof MatNode ? slddNode : slddNode.getSection(sectionKey); if (!section) { // When at root (sectionKey='sldd'), find the section that accepts this className for (const child of slddNode.children) { @@ -2049,16 +2069,18 @@ export function createSession(opts = {}) { * * Null for two distinct absences, deliberately given the same answer: a srcId the * session does not hold (the same answer getDataSource gives the same question), and - * a source whose format HAS no write path. `.slx`, `.mdl`, `.mat` and `.prj` are - * read-only in this package — only `.sldd` has a writer, and only that writer has a - * live MATLAB gate behind it. Null rather than a throw because a consumer enumerating - * every open source to find the saveable ones should not need a try/catch per source, - * and because there is nothing exceptional about a project file not being writable. + * a source whose format HAS no write path. `.slx`, `.mdl` and `.prj` are read-only in + * this package — `.sldd` and `.mat` have writers. Null rather than a throw because a + * consumer enumerating every open source to find the saveable ones should not need a + * try/catch per source, and because there is nothing exceptional about a project file + * not being writable. * * Throws for a value in it that no writer may write: one past the unbacked-bytes budget, as * a MatBudgetError naming the entry, the path in it and the budget (MatWriter.budgetFailure). * Nothing is returned then — no part of a file — and nothing in the session changes, so the - * save after the value is fixed or removed is the save there would have been. + * save after the value is fixed or removed is the save there would have been. A `.mat` save + * throws a MatWriteError the same way, naming the variable or the file, for anything it + * cannot write as what it is (MatFileWriter.serializeMatFile). * * The flavour follows the FILE, not a default: a `.sldd` that arrived as a * compressed-binary package is answered with zip bytes and one that arrived as JSON @@ -2071,6 +2093,13 @@ export function createSession(opts = {}) { if (!source) { return null; } + // A MAT-file is written as its own records, what was edited written fresh, and is + // binary whatever its records are, compressed (`-v7`) or not (`-v6`). An instanceof + // for the reason the dictionary's is below: serializeMatFile reaches for the records + // and the node bound to each, which only a MatNode built from a parse holds. + if (source instanceof MatNode) { + return { kind: 'binary', sourceFormat: source.sourceFormat, bytes: serializeMatFile(source) }; + } // An instanceof rather than a duck test on serializeJson: serializeBinarySldd // reaches for _zipMetadata and _dataSourceAttrs, so a lookalike that merely // answers the same method names would be handed to a writer built for the class. diff --git a/dist/core/DataModel.js.map b/dist/core/DataModel.js.map index ff943285..75d27049 100644 --- a/dist/core/DataModel.js.map +++ b/dist/core/DataModel.js.map @@ -1 +1 @@ -{"version":3,"file":"DataModel.js","sourceRoot":"","sources":["../../src/core/DataModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"DataModel.js","sourceRoot":"","sources":["../../src/core/DataModel.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/core/sessionTypes.d.ts b/dist/core/sessionTypes.d.ts index 1e380337..2cd99a07 100644 --- a/dist/core/sessionTypes.d.ts +++ b/dist/core/sessionTypes.d.ts @@ -16,8 +16,8 @@ export interface CreateSessionOptions { * * `sourceFormat` is the source node's OWN format string — the same vocabulary * SourceDTO.sourceFormat publishes ('json' for a textual `.sldd`, 'xml' for a - * compressed-binary one) — so a consumer can correlate the two without a mapping - * table of its own. + * compressed-binary one, 'mat' for a MAT-file, which is always `binary`) — so a + * consumer can correlate the two without a mapping table of its own. */ export type SerializedSource = { kind: 'binary'; diff --git a/dist/datamodel/node/BaseNode.d.ts b/dist/datamodel/node/BaseNode.d.ts index afa3c07a..f0617148 100644 --- a/dist/datamodel/node/BaseNode.d.ts +++ b/dist/datamodel/node/BaseNode.d.ts @@ -128,6 +128,22 @@ export type ElementSubscript = { * `_encoded`, so the walk stops at the first container and answers null for them. */ export declare function encodedHolderOf(node: BaseNode | null | undefined): BaseNode | null; +/** + * Why the source `node` is in refuses an edit of `key` at `node`, in words, or null where it + * takes it. `key` is 'Name' for the node's own name, and the property's key for anything else, + * 'Value' for a child added or removed. + * + * A source answers for itself, through the first container above the node, which an entry is a + * child of: a MAT-file, whose save writes only some edits (MatNode._editRefusal). A dictionary's + * section and a model's do not answer, and take every edit their nodes take. Asked by every + * editability getter below, by the structural gates (DataNode._encodedReadOnly), by the setters + * (DataNode._refuseEncodedEdit, the rename) and by the session's editProperty, so that what the + * table offers and what an edit is taken for are one answer. Duck-typed, as encodedHolderOf is: + * this class imports no container. + */ +export declare function sourceEditRefusal(node: BaseNode, key: string): string | null; +/** A source's answer to sourceEditRefusal, for `node`, which is `entry` or a node under it. */ +export type SourceEditRefusal = (entry: BaseNode, node: BaseNode, key: string) => string | null; /** * The prop in `props` that an edit naming `name` is an edit of: the one whose key or column is * `name`, which is how an edit committed in the 'Value' column reaches the atom that owns it (a diff --git a/dist/datamodel/node/BaseNode.d.ts.map b/dist/datamodel/node/BaseNode.d.ts.map index 3351da2a..6eb9fcc7 100644 --- a/dist/datamodel/node/BaseNode.d.ts.map +++ b/dist/datamodel/node/BaseNode.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"BaseNode.d.ts","sourceRoot":"","sources":["../../../src/datamodel/node/BaseNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"BaseNode.d.ts","sourceRoot":"","sources":["../../../src/datamodel/node/BaseNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/node/BaseNode.js b/dist/datamodel/node/BaseNode.js index e133961e..3178a046 100644 --- a/dist/datamodel/node/BaseNode.js +++ b/dist/datamodel/node/BaseNode.js @@ -28,6 +28,29 @@ export function encodedHolderOf(node) { } return null; } +/** + * Why the source `node` is in refuses an edit of `key` at `node`, in words, or null where it + * takes it. `key` is 'Name' for the node's own name, and the property's key for anything else, + * 'Value' for a child added or removed. + * + * A source answers for itself, through the first container above the node, which an entry is a + * child of: a MAT-file, whose save writes only some edits (MatNode._editRefusal). A dictionary's + * section and a model's do not answer, and take every edit their nodes take. Asked by every + * editability getter below, by the structural gates (DataNode._encodedReadOnly), by the setters + * (DataNode._refuseEncodedEdit, the rename) and by the session's editProperty, so that what the + * table offers and what an edit is taken for are one answer. Duck-typed, as encodedHolderOf is: + * this class imports no container. + */ +export function sourceEditRefusal(node, key) { + let entry = null; + let n = node; + while (n && !n.isContainer) { + entry = n; + n = n.parent; + } + const refuse = n?._editRefusal; + return entry && typeof refuse === 'function' ? refuse.call(n, entry, node, key) : null; +} /** * The prop in `props` that an edit naming `name` is an edit of: the one whose key or column is * `name`, which is how an edit committed in the 'Value' column reaches the atom that owns it (a @@ -133,7 +156,8 @@ export default class BaseNode { if (this.parent?.fixesChildNames) { return false; } - return true; + // Nor a name its source would not write (sourceEditRefusal). + return !sourceEditRefusal(this, 'Name'); } // Called on a node after a structural edit added or removed a child of `child` // — i.e. one of ITS children changed shape, not this node's own list. Every node @@ -232,6 +256,11 @@ export default class BaseNode { if (source.dirty !== undefined) { source.dirty = true; } + // And a source that keeps what it found of each of its entries is told which node changed, + // so that it forgets what it found of that node's entry, and of no other (MatNode._nodeEdited). + if (typeof source._nodeEdited === 'function') { + source._nodeEdited(this); + } // Every mutation reaches here, so this is where a rename — the edit that actually moves // a link — is caught. A value edit drops the index too, needlessly; the rebuild rides // the row build that edit was already going to cause. @@ -416,7 +445,8 @@ export default class BaseNode { if (v && v.charAt(0) === '<' && v.charAt(v.length - 1) === '>') { return false; } - return true; + // Nor a value its source would not write (sourceEditRefusal). + return !sourceEditRefusal(this, 'Value'); } // Whether a Description typed onto this row could be SAVED — the third member of the // nameEditable/valueEditable family, and one for the same reason: the Description @@ -433,7 +463,7 @@ export default class BaseNode { // Parameter whose value displays as a `<1x12 double>` summary takes no value editor // and can still be described. get descriptionEditable() { - return !encodedHolderOf(this); + return !encodedHolderOf(this) && !sourceEditRefusal(this, 'Description'); } getPropInfo(PropClassRef) { const key = PropClassRef.key; @@ -466,6 +496,12 @@ export default class BaseNode { if (key !== 'Name' && encodedHolderOf(this)) { editable = false; } + // And any its source would not write (sourceEditRefusal), the Name included: asked last, + // and only of a property every rule above leaves editable, as it is the one that walks to + // the source. + if (editable && sourceEditRefusal(this, key)) { + editable = false; + } return { key, displayName: PropClassRef.displayName, diff --git a/dist/datamodel/node/BaseNode.js.map b/dist/datamodel/node/BaseNode.js.map index c9476bb3..328d5b15 100644 --- a/dist/datamodel/node/BaseNode.js.map +++ b/dist/datamodel/node/BaseNode.js.map @@ -1 +1 @@ -{"version":3,"file":"BaseNode.js","sourceRoot":"","sources":["../../../src/datamodel/node/BaseNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"BaseNode.js","sourceRoot":"","sources":["../../../src/datamodel/node/BaseNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/node/DataNode.d.ts b/dist/datamodel/node/DataNode.d.ts index a3a75f9b..0c5dc3fd 100644 --- a/dist/datamodel/node/DataNode.d.ts +++ b/dist/datamodel/node/DataNode.d.ts @@ -125,6 +125,7 @@ export default class DataNode extends BaseNode { Description?: string; _rawInput?: unknown; _encoded?: EncodedValue; + _valueEdited?: boolean; rawXml?: string; classification?: string; constructor(name: string, parent: BaseNode | null, serial?: Record); @@ -165,7 +166,7 @@ export default class DataNode extends BaseNode { execAddChild(): ChildAddEdit | null; execRemoveChild(_child?: BaseNode): ChildUndoRedo | null; _renameField(from: string, to: string): void; - _markModified(): void; + _markModified(edit?: 'value' | 'name'): void; _stampLastModified(): void; /** * What puts this node back as it stands now: every own field but those in `leaves`, and its @@ -362,11 +363,19 @@ export default class DataNode extends BaseNode { */ _shapeAfterChildEdit(_op: 'add' | 'remove'): ValueShape | null; /** - * Is this node at or under one whose value is still an encoded stream? The structural - * gates (canAddChild, canRemoveChild) of every class that has them ask this, for the - * reason _refuseEncodedEdit gives: a child added or removed there could not reach the file. + * Is this node at or under one whose value is still an encoded stream, or one whose source + * would not write a change to it (BaseNode.sourceEditRefusal: a MAT-file's object, say)? The + * structural gates (canAddChild, canRemoveChild) of every class that has them ask this, for + * the reason _refuseEncodedEdit gives: a child added or removed there could not reach the file. */ get _encodedReadOnly(): boolean; + /** + * The refusal of an edit of `propName` at or under a value still in the encoded stream it was + * read from, but for the holder's own name, or of one this node's source would not write + * (BaseNode.sourceEditRefusal), in its words; null where the edit may go ahead. Asked first by + * the setter of every class that has one, so that no setter takes what the table offers no + * editor for. + */ _refuseEncodedEdit(propName: string, stringValue: string): SetPropertyResult | null; /** * Does this object's value hold its properties beside its class, with no element (SER-TE)? diff --git a/dist/datamodel/node/DataNode.d.ts.map b/dist/datamodel/node/DataNode.d.ts.map index 1efd44e4..4f191a93 100644 --- a/dist/datamodel/node/DataNode.d.ts.map +++ b/dist/datamodel/node/DataNode.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataNode.d.ts","sourceRoot":"","sources":["../../../src/datamodel/node/DataNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"DataNode.d.ts","sourceRoot":"","sources":["../../../src/datamodel/node/DataNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/node/DataNode.js b/dist/datamodel/node/DataNode.js index 34846077..2f1f544c 100644 --- a/dist/datamodel/node/DataNode.js +++ b/dist/datamodel/node/DataNode.js @@ -1,5 +1,5 @@ // Copyright 2026 The MathWorks, Inc. -import BaseNode, { encodedHolderOf, propNamed } from './BaseNode.js'; +import BaseNode, { encodedHolderOf, propNamed, sourceEditRefusal } from './BaseNode.js'; import { trySetSchemaProperty } from './schemaBridge.js'; import NodeRegistry from './NodeRegistry.js'; import { isMatCdata } from '../parser/CdataCodec.js'; @@ -397,10 +397,13 @@ export default class DataNode extends BaseNode { // something asks for it directly — renaming a Simulink.Parameter's `Value` row was // exactly that, accepted by the model and dropped by serialize, which writes the // key `Value` whatever the node is called. + // Said as the source says it, when it is the source that refuses (BaseNode.sourceEditRefusal: + // a MAT-file's variable stored after its subsystem), which _refuseEncodedEdit has asked + // already for every class whose setter comes here first. if (!this.nameEditable) { return { error: true, - reason: `'${this.displayName}' is not a name this entry can carry, so it cannot be renamed.`, + reason: sourceEditRefusal(this, 'Name') ?? `'${this.displayName}' is not a name this entry can carry, so it cannot be renamed.`, invalidValue: stringValue, validValue: this.displayName, }; @@ -422,14 +425,24 @@ export default class DataNode extends BaseNode { const duplicate = typeof nsHolds === 'function' ? stringValue !== this.name && nsHolds.call(this.parent, stringValue) > 0 : this.parent.children.some((sibling) => sibling !== this && sibling.name === stringValue); + // Said of where the names are one namespace: a dictionary's Design and Architectural + // Data, or a MAT-file, which names itself (MatNode._namespaceLabel). if (duplicate) { + const where = this.parent._namespaceLabel ?? 'Design or Architectural Data'; return { error: true, - reason: "'" + stringValue + "' already exists in Design or Architectural Data", + reason: "'" + stringValue + "' already exists in " + where, invalidValue: stringValue, validValue: this.name, }; } + // And a name the parent could not write: a MAT-file's variable whose record is not one + // whole element, whose name its save has nowhere to put (MatNode._renameRefusal). + const renameRefusal = this.parent._renameRefusal; + const refused = typeof renameRefusal === 'function' ? renameRefusal.call(this.parent, this) : null; + if (refused) { + return { error: true, reason: refused, invalidValue: stringValue, validValue: this.name }; + } } const oldName = this.name; this.name = stringValue; @@ -468,7 +481,7 @@ export default class DataNode extends BaseNode { // Class="double" element, which made MATLAB refuse to open the whole file. const encoded = this._encoded; const raw = this._rawInput; - this._markModified(); + this._markModified('name'); this._encoded = encoded; this._rawInput = raw; return true; @@ -657,7 +670,11 @@ export default class DataNode extends BaseNode { // edit below it on save. A value read from a stream is read-only (_refuseEncodedEdit and // BaseNode's editability), so nothing should reach here from inside one; this is the // second line, for whatever does. The rename that keeps it is DataNode.setProperty's. - _markModified() { + // + // `edit` is 'name' for that rename, and only for it. An entry's own rename leaves its value + // as it was, and every other edit marks the entry `_valueEdited`; so does the rename of + // anything under it, a struct's field, which changes the entry's value. + _markModified(edit = 'value') { const entry = this.owningEntry; for (let node = this; node && node !== entry; node = node.parent) { if (node._rawInput !== undefined) { @@ -669,6 +686,9 @@ export default class DataNode extends BaseNode { } if (entry) { entry.status = 'Modified'; + if (edit !== 'name' || entry !== this) { + entry._valueEdited = true; + } if (entry._rawInput !== undefined) { entry._rawInput = undefined; } @@ -1103,28 +1123,38 @@ export default class DataNode extends BaseNode { return null; } /** - * Is this node at or under one whose value is still an encoded stream? The structural - * gates (canAddChild, canRemoveChild) of every class that has them ask this, for the - * reason _refuseEncodedEdit gives: a child added or removed there could not reach the file. + * Is this node at or under one whose value is still an encoded stream, or one whose source + * would not write a change to it (BaseNode.sourceEditRefusal: a MAT-file's object, say)? The + * structural gates (canAddChild, canRemoveChild) of every class that has them ask this, for + * the reason _refuseEncodedEdit gives: a child added or removed there could not reach the file. */ get _encodedReadOnly() { - return !!encodedHolderOf(this); + return !!encodedHolderOf(this) || !!sourceEditRefusal(this, 'Value'); } + /** + * The refusal of an edit of `propName` at or under a value still in the encoded stream it was + * read from, but for the holder's own name, or of one this node's source would not write + * (BaseNode.sourceEditRefusal), in its words; null where the edit may go ahead. Asked first by + * the setter of every class that has one, so that no setter takes what the table offers no + * editor for. + */ _refuseEncodedEdit(propName, stringValue) { + const isName = this._resolveProperty(propName) === 'name'; const holder = encodedHolderOf(this); - if (!holder) { - return null; + if (holder && !(holder === this && isName)) { + return { + error: true, + reason: `'${holder.displayName}' is stored as an encoded MATLAB value that this editor can show but not write, ` + + 'so it is read-only.', + invalidValue: stringValue, + validValue: isName ? this.name : this.displayValue, + }; } - if (holder === this && this._resolveProperty(propName) === 'name') { - return null; + const refused = sourceEditRefusal(this, isName ? 'Name' : this._propFor(propName)?.key ?? propName); + if (refused) { + return { error: true, reason: refused, invalidValue: stringValue, validValue: isName ? this.name : this.displayValue }; } - return { - error: true, - reason: `'${holder.displayName}' is stored as an encoded MATLAB value that this editor can show but not write, ` + - 'so it is read-only.', - invalidValue: stringValue, - validValue: this._resolveProperty(propName) === 'name' ? this.name : this.displayValue, - }; + return null; } /** * Does this object's value hold its properties beside its class, with no element (SER-TE)? diff --git a/dist/datamodel/node/DataNode.js.map b/dist/datamodel/node/DataNode.js.map index 0e533aa0..8fa4d75b 100644 --- a/dist/datamodel/node/DataNode.js.map +++ b/dist/datamodel/node/DataNode.js.map @@ -1 +1 @@ -{"version":3,"file":"DataNode.js","sourceRoot":"","sources":["../../../src/datamodel/node/DataNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"DataNode.js","sourceRoot":"","sources":["../../../src/datamodel/node/DataNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/node/container/MatNode.d.ts b/dist/datamodel/node/container/MatNode.d.ts index 53571ce0..db3e3a0d 100644 --- a/dist/datamodel/node/container/MatNode.d.ts +++ b/dist/datamodel/node/container/MatNode.d.ts @@ -3,40 +3,136 @@ import type BaseNode from '../BaseNode.js'; import type { PropClass, PIGroupDef } from '../BaseNode.js'; import type { MatVariable } from '../data/MatlabVariableNode.js'; import type { ParseWarning } from '../../parser/ParseWarning.js'; +import type { MatRecord, ParsedMat } from '../../parser/MatParser.js'; +export type MatParse = Pick & Partial>; export default class MatNode extends ContainerNode { header: string; dirty: boolean; _anonymousElements: MatVariable[]; + headerBytes: Uint8Array | null; + records: MatRecord[] | null; + subsystemOffset: number; + framed: boolean; + unframed: { + at: number; + reason: string; + } | null; + _recordNodes: Map; + _nodeRecords: Map; + _fileVerdict: string | null | undefined; + _subsystem: MatRecord | null | undefined; + _valueVerdicts: WeakMap; + _nameCounts: Map | null; + _countedAt: number; + _entriesVersion: number; constructor(name: string); + /** + * The record `node` was read from, or null for a node no record became: a variable added + * since the file was read, or any node of a tree with no records (`records` null). + */ + recordOf(node: BaseNode): MatRecord | null; + /** + * The node `record` became, whether or not it is still in the tree (a deleted one's + * `parent` is not this), or null for a record that became no node: the subsystem or + * another unnamed element (`_anonymousElements`), and a record the reader dropped. + */ + nodeOf(record: MatRecord): BaseNode | null; get displayName(): string; get readOnly(): boolean; + _nodeEdited(node: BaseNode): void; + addChild(child: BaseNode, index?: number): BaseNode; + removeChild(child: BaseNode): void; + _entryRenamed(oldName: string, newName: string): void; + _entriesMoved(gone: string | null, came: string | null): void; + /** + * Why an edit of `key` at `node`, which is `entry` or a node under it, is refused, as a + * message naming the variable or the file, or null where a save of this file writes it. + * `key` is 'Name' for `node`'s own name, and a property's key for anything else: 'Value' + * for a value typed in, a child added or removed, and an element's or a field's edit. + * + * - every edit, of a file no save of which can be written (_fileRefusal), its variables' + * delete and the addition of one included (execRemoveEntry, execAddEntry); + * - every edit of a variable stored after the subsystem, its name included: MATLAB does + * not read it there, and moved, what MATLAB loads would change. It can be deleted; + * - a variable's own name: taken, and written as its record with the name replaced; + * - anything else, which writes the variable fresh: refused where the writer refuses that + * (freshRefusal: an object's typed node, a string, a function handle, a value not + * decoded, and a variable holding one at any depth), or where another variable of the + * file has its name; + * - and Add ('Add', MatlabVariableNode.canAddChild) on a struct that is not 1x1 or is an + * element of one, which is written, but not as the tree shows it. Add gives a struct a + * field row of its own: the rows of a struct array are its elements, so the row was an + * element of no fields the save did not write; a 0x0 struct's field was written with no + * element to hold it, which reads back as no field; and a field added to one element of + * a struct array is written into every element, as MATLAB adds one, `[]` in the others, + * which the tree did not show. + * + * Phase 2 of the MAT-file save widens the last of these, for the properties of an object it + * writes into the subsystem. + */ + _editRefusal(entry: BaseNode, node: BaseNode, key: string): string | null; + /** + * Why `value`, a node built of the text an edit typed in for `node`, of `entry`, cannot be + * written into this file, or null where it can: a string, which MatWriter has no MAT class + * for. Asked of the edit before it is made (MatlabVariableNode.setProperty), so that a value + * that would leave the variable one a save refuses (freshRefusal) is never taken. + */ + _valueRefusal(entry: BaseNode, node: BaseNode, value: BaseNode): string | null; + /** + * Why `node`, a variable of this file, cannot be renamed, or null where it can: its record is not + * one whole element whose name a save can replace (MatFileWriter.renameWhy), which only a damaged + * file holds. Asked by the rename itself (DataNode.setProperty) and not by the editability + * getters, as finding out inflates the record: a rename refused so is refused before it is made. + */ + _renameRefusal(node: BaseNode): string | null; + /** Why no edit of this file is taken, or null (unsavableRefusal, structureRefusal). */ + _fileRefusal(): string | null; + /** The subsystem's record (MatFileWriter.subsystemOf), found once: the records never change. */ + _subsystemRecord(): MatRecord | null; + /** + * How many variables of the file a save writes under `name`: the variables in the tree, and + * each record that became none (one the reader dropped) under its own name, as a save writes + * it (MatFileWriter.refuseDuplicates). A rename into a name another holds is refused for it + * (DataNode.setProperty), naming this file (_namespaceLabel). + * + * Counted when first asked, and moved with every variable added, removed or renamed after + * (_entriesMoved), so that a rename costs a lookup and not a count of every name: as a + * dictionary's are (SectionNode._namespaceHolds, F1-23). + * + * A record the reader dropped without a name, one that does not inflate or holds no matrix, + * is counted under none: what it would be called is not known, so an added or renamed + * variable is not held to it (MatFileWriter.refuseDuplicates, likewise). Every such record + * already breaks a rule MATLAB loads a file by (MatFileCheck: `compressed-wrapper`, + * `top-level-type`), and for all of them but one past the inflate ceiling that is a rule + * MATLAB fails the whole load on: no variable of the file is loaded beside it, whatever its name. + */ + _namespaceHolds(name: string): number; + /** Where a rename into a name already held is said to collide (DataNode.setProperty): this file. */ + get _namespaceLabel(): string; get sourceFormat(): string; get icon(): string; get NumberOfEntries(): number; getProperties(): PropClass[]; getPILayout(): PIGroupDef[]; getSection(): null; - execAddEntry(_className?: string, entryName?: string): { + execAddEntry(className?: string, entryName?: string): { node: BaseNode; undo: () => void; redo: () => void; - }; + } | null; _uniqueName(baseName: string): string; execRemoveEntry(node: BaseNode): { undo: () => void; redo: () => void; } | null; getVariables(): MatVariable[]; - static fromParsed(parsed: { - header: string; - variables: MatVariable[]; - warnings?: ParseWarning[]; - }, filename: string, options?: { + static fromParsed(parsed: MatParse, filename: string, options?: { nodeCeiling?: number; }): MatNode; + _bindRecord(child: BaseNode, record: MatRecord | undefined): void; static _addVariables(node: MatNode, parsed: { variables: MatVariable[]; warnings?: ParseWarning[]; - }): void; + }, recordOf?: ReadonlyMap | null): void; } //# sourceMappingURL=MatNode.d.ts.map \ No newline at end of file diff --git a/dist/datamodel/node/container/MatNode.d.ts.map b/dist/datamodel/node/container/MatNode.d.ts.map index 5d330c01..1352e604 100644 --- a/dist/datamodel/node/container/MatNode.d.ts.map +++ b/dist/datamodel/node/container/MatNode.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"MatNode.d.ts","sourceRoot":"","sources":["../../../../src/datamodel/node/container/MatNode.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAIhD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAOjE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,aAAa;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,WAAW,EAAE,CAAC;gBAEtB,IAAI,EAAE,MAAM;IAOxB,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAWD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,aAAa,IAAI,SAAS,EAAE;IAI5B,WAAW,IAAI,UAAU,EAAE;IAI3B,UAAU,IAAI,IAAI;IAIlB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE;IAkB7G,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAYrC,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI;IAmB9E,YAAY,IAAI,WAAW,EAAE;IA8B7B,MAAM,CAAC,UAAU,CACf,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;KAAE,EAC/E,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACrC,OAAO;IAuBV,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE;QAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;KAAE,GAAG,IAAI;CA2B3G"} \ No newline at end of file +{"version":3,"file":"MatNode.d.ts","sourceRoot":"","sources":["../../../../src/datamodel/node/container/MatNode.ts"],"names":[],"mappings":"AAEA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAIhD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAqBtE,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,WAAW,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,aAAa,GAAG,iBAAiB,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC;AAE/G,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,aAAa;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,kBAAkB,EAAE,WAAW,EAAE,CAAC;IAUlC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAKhD,YAAY,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvC,YAAY,EAAE,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAOvC,YAAY,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACxC,UAAU,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,CAAC;IACzC,cAAc,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxC,UAAU,EAAE,MAAM,CAAC;IAInB,eAAe,EAAE,MAAM,CAAC;gBAEZ,IAAI,EAAE,MAAM;IAkBxB;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI;IAI1C;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,IAAI;IAI1C,IAAI,WAAW,IAAI,MAAM,CAExB;IAKD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAQD,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAOjC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ;IAOnD,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAUlC,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAOrD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAiC7D;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAmCzE;;;;;OAKG;IACH,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI;IAS9E;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,IAAI;IAM7C,uFAAuF;IACvF,YAAY,IAAI,MAAM,GAAG,IAAI;IAW7B,gGAAgG;IAChG,gBAAgB,IAAI,SAAS,GAAG,IAAI;IAOpC;;;;;;;;;;;;;;;;OAgBG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAkBrC,oGAAoG;IACpG,IAAI,eAAe,IAAI,MAAM,CAE5B;IAWD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,aAAa,IAAI,SAAS,EAAE;IAI5B,WAAW,IAAI,UAAU,EAAE;IAI3B,UAAU,IAAI,IAAI;IASlB,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI;IAyBnH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAarC,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG;QAAE,IAAI,EAAE,MAAM,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI;IAmB9E,YAAY,IAAI,WAAW,EAAE;IAmC7B,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,OAAO;IAiCtG,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI;IAcjE,MAAM,CAAC,aAAa,CAClB,IAAI,EAAE,OAAO,EACb,MAAM,EAAE;QAAE,SAAS,EAAE,WAAW,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;KAAE,EAC/D,QAAQ,GAAE,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,GAAG,IAAW,GAC1D,IAAI;CAgCR"} \ No newline at end of file diff --git a/dist/datamodel/node/container/MatNode.js b/dist/datamodel/node/container/MatNode.js index 6c00f365..a56f4c8e 100644 --- a/dist/datamodel/node/container/MatNode.js +++ b/dist/datamodel/node/container/MatNode.js @@ -8,18 +8,254 @@ import { functionHandleOf } from '../../parser/MatParser.js'; import PropName from '../../prop/PropName.js'; import { MAT_NODE_CEILING } from '../../display/DisplayConvention.js'; import { buildUnderCeiling, buildUncut, chargeNodes } from '../data/matNodeCeiling.js'; +import { PAST_SUBSYSTEM, duplicateWhy, freshRefusal, renameWhy, structureRefusal, subsystemOf, unsavableRefusal, unwritableIn, } from '../../parser/MatFileWriter.js'; +import { validateMatlabName } from '../../matlabName.js'; +import { owningEntryOf } from '../DataNode.js'; +import { basenameOf } from '../../fileKinds.js'; export default class MatNode extends ContainerNode { constructor(name) { super(name, null); this.header = ''; this.dirty = false; + this._valueVerdicts = new WeakMap(); + this._nameCounts = null; + this._countedAt = -1; + this._entriesVersion = 0; this._anonymousElements = []; + this.headerBytes = null; + this.records = null; + this.subsystemOffset = 0; + this.framed = false; + this.unframed = null; + this._recordNodes = new Map(); + this._nodeRecords = new Map(); + } + /** + * The record `node` was read from, or null for a node no record became: a variable added + * since the file was read, or any node of a tree with no records (`records` null). + */ + recordOf(node) { + return this._nodeRecords.get(node) ?? null; + } + /** + * The node `record` became, whether or not it is still in the tree (a deleted one's + * `parent` is not this), or null for a record that became no node: the subsystem or + * another unnamed element (`_anonymousElements`), and a record the reader dropped. + */ + nodeOf(record) { + return this._recordNodes.get(record) ?? null; } get displayName() { return this.name; } + // Saved by serializeSource (MatFileWriter), so a file is read-only only when no save of it + // can be written: opened without its records, its bytes handed away since, its records not + // tiling it, or its subsystem not where its header says (_fileRefusal). get readOnly() { - return true; + return this._fileRefusal() !== null; + } + // An edit of `node`, which is a variable of this file or a node under one (BaseNode. + // _markSourceDirty): what the gate found of that variable's value is forgotten, and of no other, + // since nothing a save refuses of a value written fresh is about another variable + // (freshRefusal). Which names two of them share is counted apart (_namespaceHolds). Forgetting + // every variable's at every edit re-walked every variable a table showed after each, and each + // of N renames counted N names again. + _nodeEdited(node) { + const entry = owningEntryOf(node); + if (entry && entry.parent === this) { + this._valueVerdicts.delete(entry); + } + } + addChild(child, index) { + super.addChild(child, index); + this._valueVerdicts.delete(child); + this._entriesMoved(null, child.name); + return child; + } + removeChild(child) { + const before = this.children.length; + super.removeChild(child); + if (this.children.length < before) { + this._valueVerdicts.delete(child); + this._entriesMoved(child.name, null); + } + } + // One of my variables renamed (DataNode.setProperty): its name's count moves with it. + _entryRenamed(oldName, newName) { + this._entriesMoved(oldName, newName); + } + // A variable of this file stopped being called `gone`, and one started being called `came` + // (either null): one removed, added or renamed. The version moves, and the counts, when they + // are of the version before, move with it and go on holding. + _entriesMoved(gone, came) { + const held = this._nameCounts !== null && this._countedAt === this._entriesVersion; + this._entriesVersion++; + if (!held) { + return; + } + const counts = this._nameCounts; + if (gone !== null) { + const left = (counts.get(gone) ?? 0) - 1; + if (left > 0) { + counts.set(gone, left); + } + else { + counts.delete(gone); + } + } + if (came !== null) { + counts.set(came, (counts.get(came) ?? 0) + 1); + } + this._countedAt = this._entriesVersion; + } + // ---- The edits a save of this file can write ---------------------------------------------- + // + // The editor takes no edit a save of this file would then refuse (MatFileWriter), so that none + // is made that cannot be kept: the baseline is that no edit taken is one a save then refuses, + // or writes as something else. One rule, this one, asked by every path an edit takes + // (BaseNode.sourceEditRefusal): the editors of the table and of the Property Inspector + // (BaseNode.getPropInfo, nameEditable, valueEditable, descriptionEditable), the gates of a + // child added or removed (DataNode._encodedReadOnly), each class's setter + // (DataNode._refuseEncodedEdit, DataNode's rename), and the session's editProperty. Built of the + // writer's own refusals (unsavableRefusal, structureRefusal, freshRefusal, PAST_SUBSYSTEM, + // duplicateWhy), so that the two cannot come to disagree. + /** + * Why an edit of `key` at `node`, which is `entry` or a node under it, is refused, as a + * message naming the variable or the file, or null where a save of this file writes it. + * `key` is 'Name' for `node`'s own name, and a property's key for anything else: 'Value' + * for a value typed in, a child added or removed, and an element's or a field's edit. + * + * - every edit, of a file no save of which can be written (_fileRefusal), its variables' + * delete and the addition of one included (execRemoveEntry, execAddEntry); + * - every edit of a variable stored after the subsystem, its name included: MATLAB does + * not read it there, and moved, what MATLAB loads would change. It can be deleted; + * - a variable's own name: taken, and written as its record with the name replaced; + * - anything else, which writes the variable fresh: refused where the writer refuses that + * (freshRefusal: an object's typed node, a string, a function handle, a value not + * decoded, and a variable holding one at any depth), or where another variable of the + * file has its name; + * - and Add ('Add', MatlabVariableNode.canAddChild) on a struct that is not 1x1 or is an + * element of one, which is written, but not as the tree shows it. Add gives a struct a + * field row of its own: the rows of a struct array are its elements, so the row was an + * element of no fields the save did not write; a 0x0 struct's field was written with no + * element to hold it, which reads back as no field; and a field added to one element of + * a struct array is written into every element, as MATLAB adds one, `[]` in the others, + * which the tree did not show. + * + * Phase 2 of the MAT-file save widens the last of these, for the properties of an object it + * writes into the subsystem. + */ + _editRefusal(entry, node, key) { + const file = this._fileRefusal(); + if (file) { + return file; + } + const record = this.recordOf(entry); + const subsystem = this._subsystemRecord(); + if (record && subsystem && record.offset > subsystem.offset) { + return cannotEdit(entry.name, PAST_SUBSYSTEM); + } + if (node === entry && (key === 'Name' || key === 'name')) { + return null; + } + let verdict = this._valueVerdicts.get(entry); + if (verdict === undefined) { + const refused = freshRefusal(entry, record); + verdict = refused ? editRefusalOf(refused) : null; + this._valueVerdicts.set(entry, verdict); + } + if (!verdict && this._namespaceHolds(entry.name) > 1) { + verdict = cannotEdit(entry.name, duplicateWhy(entry.name)); + } + if (!verdict && key === 'Add') { + const array = [node, node.parent].find((n) => isStruct(n) && n._dims.reduce((a, b) => a * b, 1) !== 1); + if (array) { + return cannotEdit(entry.name, array.matlabPath + ' is a ' + array._dims.join('x') + ' struct, whose fields a save writes into every element of it or none, ' + + 'and Add gives one struct a field of its own'); + } + } + return verdict; + } + /** + * Why `value`, a node built of the text an edit typed in for `node`, of `entry`, cannot be + * written into this file, or null where it can: a string, which MatWriter has no MAT class + * for. Asked of the edit before it is made (MatlabVariableNode.setProperty), so that a value + * that would leave the variable one a save refuses (freshRefusal) is never taken. + */ + _valueRefusal(entry, node, value) { + const unwritable = unwritableIn(value); + if (!unwritable) { + return null; + } + const is = unwritable.path === value.matlabPath ? ' would be ' : ' would hold '; + return cannotEdit(entry.name, (node.matlabPath || entry.name) + is + unwritable.what + ', which this package cannot write into a MAT-file'); + } + /** + * Why `node`, a variable of this file, cannot be renamed, or null where it can: its record is not + * one whole element whose name a save can replace (MatFileWriter.renameWhy), which only a damaged + * file holds. Asked by the rename itself (DataNode.setProperty) and not by the editability + * getters, as finding out inflates the record: a rename refused so is refused before it is made. + */ + _renameRefusal(node) { + const record = this.recordOf(node); + const why = record ? renameWhy(record) : null; + return why ? cannotEdit(node.name, why) : null; + } + /** Why no edit of this file is taken, or null (unsavableRefusal, structureRefusal). */ + _fileRefusal() { + // A host that hands the bytes away empties every view of them at once, the header's + // first, so a verdict of none is asked again only once that happened. + const gone = this.headerBytes !== null && this.headerBytes.byteLength !== 128; + if (this._fileVerdict === undefined || (gone && this._fileVerdict === null)) { + const refused = unsavableRefusal(this) ?? structureRefusal(this, this.records, this._subsystemRecord()); + this._fileVerdict = refused ? editRefusalOf(refused) : null; + } + return this._fileVerdict; + } + /** The subsystem's record (MatFileWriter.subsystemOf), found once: the records never change. */ + _subsystemRecord() { + if (this._subsystem === undefined) { + this._subsystem = this.records ? subsystemOf(this, this.records) : null; + } + return this._subsystem; + } + /** + * How many variables of the file a save writes under `name`: the variables in the tree, and + * each record that became none (one the reader dropped) under its own name, as a save writes + * it (MatFileWriter.refuseDuplicates). A rename into a name another holds is refused for it + * (DataNode.setProperty), naming this file (_namespaceLabel). + * + * Counted when first asked, and moved with every variable added, removed or renamed after + * (_entriesMoved), so that a rename costs a lookup and not a count of every name: as a + * dictionary's are (SectionNode._namespaceHolds, F1-23). + * + * A record the reader dropped without a name, one that does not inflate or holds no matrix, + * is counted under none: what it would be called is not known, so an added or renamed + * variable is not held to it (MatFileWriter.refuseDuplicates, likewise). Every such record + * already breaks a rule MATLAB loads a file by (MatFileCheck: `compressed-wrapper`, + * `top-level-type`), and for all of them but one past the inflate ceiling that is a rule + * MATLAB fails the whole load on: no variable of the file is loaded beside it, whatever its name. + */ + _namespaceHolds(name) { + if (!this._nameCounts || this._countedAt !== this._entriesVersion) { + const counts = new Map(); + const add = (n) => counts.set(n, (counts.get(n) ?? 0) + 1); + for (const child of this.children) { + add(child.name); + } + for (const record of this.records ?? []) { + if (record.name && !this.nodeOf(record)) { + add(record.name); + } + } + this._nameCounts = counts; + this._countedAt = this._entriesVersion; + } + return this._nameCounts.get(name) ?? 0; + } + /** Where a rename into a name already held is said to collide (DataNode.setProperty): this file. */ + get _namespaceLabel() { + return basenameOf(this.name) || this.name; } // The format an out-of-process host is told this source is, since SourceDTO carries // this field and nothing else in the projection names the format. One value, unlike @@ -48,7 +284,18 @@ export default class MatNode extends ContainerNode { getSection() { return null; } - execAddEntry(_className, entryName) { + // A new variable is the double 0, named `entryName`, or `var` with a counter appended if that + // is taken. The only class it takes is a plain variable's: a save writes no object (freshRefusal). + // Null, adding nothing, for a file no save of which can be written (_fileRefusal), for any other + // class, and for a name that is no MATLAB name or one the file holds already, by the rule a rename + // is held to: a save would refuse each. + execAddEntry(className, entryName) { + if (this._fileRefusal() || (className && !PLAIN_VARIABLE_CLASSES.has(className))) { + return null; + } + if (entryName && (validateMatlabName(entryName) || this._namespaceHolds(entryName) > 0)) { + return null; + } const name = entryName || this._uniqueName('var'); const node = MatlabVariableNode.createDefault(name, this); this.addChild(node); @@ -65,20 +312,22 @@ export default class MatNode extends ContainerNode { }, }; } + // Not a name any variable of the file holds, a record the reader dropped included (_namespaceHolds). _uniqueName(baseName) { - const names = new Set(this.children.map((c) => c.name)); - if (!names.has(baseName)) { + if (this._namespaceHolds(baseName) === 0) { return baseName; } let i = 1; - while (names.has(baseName + i)) { + while (this._namespaceHolds(baseName + i) > 0) { i++; } return baseName + i; } + // A delete is written by any save, of any variable, one stored after the subsystem and an object + // included; refused only in a file no save of which can be written (_fileRefusal). execRemoveEntry(node) { const index = this.children.indexOf(node); - if (index < 0) { + if (index < 0 || this._fileRefusal()) { return null; } this.removeChild(node); @@ -123,37 +372,69 @@ export default class MatNode extends ContainerNode { // containers have no rows and names the first ('part-not-expanded'). A parse handed over with // no warnings array (an older host's) is given one for it, which is the array addMatSource // and addMatSourceParsed pass on: both read it after this returns. + // + // Each node built of a record is bound to it (recordOf, nodeOf), whatever node it is: a + // plain variable, an MCOS object's typed node, a function handle, one shown as not + // decoded. A parse with no records, or whose records do not cover its variables one for + // one, binds none and keeps none (`records` null). static fromParsed(parsed, filename, options = {}) { const node = new MatNode(filename); node.header = parsed.header; + const records = heldRecords(parsed); // A .mat file keeps the MCOS blob in an anonymous trailing element. Every opaque in // the file, nested or not, comes back carrying its own decode, and what the decoder // could not read of one is a warning on the file. const anonElement = parsed.variables.find((v) => v._anonymous); attachMcosDecoded(anonElement?._rawBytes, parsed.variables, parsed.warnings); const ceiling = options.nodeCeiling ?? MAT_NODE_CEILING; - const { cut, firstCut } = buildUnderCeiling(ceiling, () => MatNode._addVariables(node, parsed)); + const recordOf = records ? new Map(records.filter((r) => r.variable).map((r) => [r.variable, r])) : null; + const { cut, firstCut } = buildUnderCeiling(ceiling, () => MatNode._addVariables(node, parsed, recordOf)); if (cut > 0 && firstCut) { const warnings = parsed.warnings ?? (parsed.warnings = []); warnings.push(notExpandedWarning(firstCut.matlabPath, cut, ceiling)); } + if (records && bindsEveryRecord(node, records, parsed.variables)) { + node.headerBytes = parsed.headerBytes; + node.records = records; + node.subsystemOffset = parsed.subsystemOffset ?? 0; + node.framed = parsed.framed === true; + node.unframed = parsed.unframed ?? null; + } + else { + node._recordNodes.clear(); + node._nodeRecords.clear(); + } return node; } + _bindRecord(child, record) { + if (record) { + this._recordNodes.set(record, child); + this._nodeRecords.set(child, record); + } + } // Every variable as a row of `node`, in the file's order, under the ceiling fromParsed arms: // all of them counted first, and none refused (matNodeCeiling.chargeNodes), so that the rows // under them are what is left, and a tree is never more nodes than the ceiling or the // variables, whichever is more. - static _addVariables(node, parsed) { + // + // `recordOf` is each variable's record, by identity (MatRecord.variable), and every node + // made of a variable is bound to it here, the one place all four kinds are made. + static _addVariables(node, parsed, recordOf = null) { chargeNodes(parsed.variables.filter((v) => !v._anonymous).length); for (const variable of parsed.variables) { if (variable._anonymous) { node._anonymousElements.push(variable); continue; } + const record = recordOf?.get(variable); + const add = (child) => { + node.addChild(child); + node._bindRecord(child, record); + }; if (variable.isOpaque) { const mcosNode = buildUncut(() => modelOpaqueMcosVariable(variable, mcosDecodedFor(variable), node, parsed.warnings)); if (mcosNode) { - node.addChild(mcosNode); + add(mcosNode); continue; } } @@ -164,13 +445,52 @@ export default class MatNode extends ContainerNode { const handle = functionHandleOf(variable); if (handle) { const value = handle.text === null ? 'Matrix(' + variable.dimensions.join(',') + ')' : handle.text; - node.addChild(MatlabVariableNode.parse({ _type: 'function_handle', _value: value }, variable.name, node)); + add(MatlabVariableNode.parse({ _type: 'function_handle', _value: value }, variable.name, node)); continue; } - node.addChild(variableNodeOf(variable, node, parsed.warnings)); + add(variableNodeOf(variable, node, parsed.warnings)); } } } +// The classes a variable added to a file may be asked for as (execAddEntry): none, the one a +// dictionary's plain variable is added as, and a double's. +const PLAIN_VARIABLE_CLASSES = new Set(['MatlabVariable', 'double']); +// A refusal of the writer's, `Cannot save "f.mat": …. Nothing was written.`, as the editor says +// it of an edit it does not take: `Cannot edit "f.mat": ….` +function editRefusalOf(e) { + return e.message.replace(/^Cannot (?:save|write) /, 'Cannot edit ').replace(/ Nothing was written\.$/, ''); +} +function isStruct(node) { + return node instanceof MatlabVariableNode && node._kind === 'scalar' && node._scalarType === 'struct'; +} +function cannotEdit(name, why) { + return 'Cannot edit "' + name + '": ' + why + '.'; +} +// The records of `parsed` a save can splice, or null: none for a host's parse that carries +// none, and none for one whose header or records are not byte views as long as they say, +// which no reader of this package hands over. Views are told by ArrayBuffer.isView, which +// answers for one made in another realm (a worker's, structured-cloned here) as well. +function heldRecords(parsed) { + const { headerBytes, records } = parsed; + if (!Array.isArray(records) || !ArrayBuffer.isView(headerBytes) || headerBytes.byteLength !== 128) { + return null; + } + const whole = records.every((r) => r && ArrayBuffer.isView(r.bytes) && r.bytes.byteLength === r.length); + return whole ? records : null; +} +// Whether the tree `node` was built as is bound one for one: every variable the variable of +// exactly one record, and every node bound to the record of the variable it was made of (an +// unnamed element is made into no node, and is in `_anonymousElements`). A parse whose +// records were made apart from its variables, or whose variables a host changed since, +// binds short, and its records are not this tree's to splice. +function bindsEveryRecord(node, records, variables) { + const withVariable = records.filter((r) => r.variable); + const ofRecords = new Set(withVariable.map((r) => r.variable)); + return (ofRecords.size === withVariable.length && + ofRecords.size === variables.length && + variables.every((v) => ofRecords.has(v)) && + node._nodeRecords.size === node.children.length); +} // The file's one word about its node ceiling, which is not a loss, as `duplicate-id` is not // (ParseWarning): every value in it is read, and copied whole. `part` is the first container // built without its rows, in the order the tree is built, and the count is of the others. diff --git a/dist/datamodel/node/container/MatNode.js.map b/dist/datamodel/node/container/MatNode.js.map index 01fc28f4..13909456 100644 --- a/dist/datamodel/node/container/MatNode.js.map +++ b/dist/datamodel/node/container/MatNode.js.map @@ -1 +1 @@ -{"version":3,"file":"MatNode.js","sourceRoot":"","sources":["../../../../src/datamodel/node/container/MatNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"MatNode.js","sourceRoot":"","sources":["../../../../src/datamodel/node/container/MatNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/node/data/MatlabVariableNode.d.ts b/dist/datamodel/node/data/MatlabVariableNode.d.ts index 595eabc8..f01a8e93 100644 --- a/dist/datamodel/node/data/MatlabVariableNode.d.ts +++ b/dist/datamodel/node/data/MatlabVariableNode.d.ts @@ -34,6 +34,7 @@ export default class MatlabVariableNode extends DataNode { _elementType: string | null; _readFromStream?: true; _cutByCeiling?: number; + _emptyStructFields?: string[]; constructor(name: string, parent: BaseNode | null, serial?: Record); get Value(): unknown; set Value(v: unknown); @@ -198,6 +199,17 @@ export default class MatlabVariableNode extends DataNode { _streamHolder(): MatlabVariableNode | null; /** The refusal of a Value edit at or under a value read from a MAT stream, or null (_streamHolder). */ _refuseStreamEdit(stringValue: string): SetPropertyResult | null; + /** + * The refusal of `parsed`, typed in as this node's value, by a source that could not write + * what it makes of it, or null. A MAT-file's save writes no string, and writes a variable + * holding one only as it was read (MatNode._valueRefusal, MatFileWriter.freshRefusal), so a + * `"abc"` typed in, or a `{1, "abc"}`, would make a variable no save could write: it is refused + * here, before the edit, which a source that writes it (a dictionary) never asks. + * + * Judged of a node made of the text alone (_applyParsed, as the edit applies it), so that a + * refused edit leaves this one, its entry and its file as they were. + */ + _refuseUnwritableValue(parsed: ParsedValue, stringValue: string): SetPropertyResult | null; /** * The refusal of a Value edit by the value this one is part of, or null. Asked of the nearest * node above this one that is not a struct, so that a field of a struct, at any depth and in @@ -240,7 +252,7 @@ export default class MatlabVariableNode extends DataNode { _shapeAfter(parsed: ParsedValue): ValueShape; _isConstrainedChild(): boolean; _setConstrainedValue(stringValue: string): true | SetPropertyResult; - _markModified(): void; + _markModified(edit?: 'value' | 'name'): void; _syncElementFromChild(child: BaseNode): void; _applyParsed(parsed: { type: string; diff --git a/dist/datamodel/node/data/MatlabVariableNode.d.ts.map b/dist/datamodel/node/data/MatlabVariableNode.d.ts.map index 9a032db4..54e28487 100644 --- a/dist/datamodel/node/data/MatlabVariableNode.d.ts.map +++ b/dist/datamodel/node/data/MatlabVariableNode.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"MatlabVariableNode.d.ts","sourceRoot":"","sources":["../../../../src/datamodel/node/data/MatlabVariableNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"MatlabVariableNode.d.ts","sourceRoot":"","sources":["../../../../src/datamodel/node/data/MatlabVariableNode.ts"],"names":[],"mappings":"AAEA,OAAO,QAA0B,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAMnE,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAC5D,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAG9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAQrE,OAAO,EAAyE,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAIpI,OAAO,EASL,KAAK,YAAY,EAClB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAKL,cAAc,EACd,aAAa,EAMd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EASL,KAAK,UAAU,EAChB,MAAM,4BAA4B,CAAC;AA2GpC,YAAY,EAAE,WAAW,EAAE,CAAC;AA6H5B,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,QAAQ;IAatD,KAAK,EAAE,kBAAkB,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAG5B,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IAUnB,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAI3B,aAAa,EAAE,OAAO,CAAC;IAKvB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAChD,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAGjC,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAIlC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAKhC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAO/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAK5B,eAAe,CAAC,EAAE,IAAI,CAAC;IAMvB,aAAa,CAAC,EAAE,MAAM,CAAC;IAOvB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;gBAElB,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAgCnF,IAAI,KAAK,IAAI,OAAO,CAanB;IAED,IAAI,KAAK,CAAC,CAAC,EAAE,OAAO,EAInB;IAGD,IAAI,QAAQ,IAAI,OAAO,EAAE,CAExB;IAED;;;;;;OAMG;IACH,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;;;OAMG;IACH,aAAa,IAAI,OAAO,EAAE;IAS1B,IAAI,IAAI,IAAI,MAAM,EAAE,CAkBnB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,IAAI,IAAI,MAAM,CAkDjB;IAED,IAAI,SAAS,IAAI,MAAM,CAqBtB;IAOD,YAAY,IAAI,MAAM;IAWtB,IAAI,QAAQ,IAAI,MAAM,CASrB;IAOD,IAAI,IAAI,IAAI,MAAM,CAKjB;IAOD,IAAI,eAAe,IAAI,OAAO,CAE7B;IAED,IAAI,YAAY,IAAI,OAAO,CAiB1B;IAED,IAAI,aAAa,IAAI,OAAO,CA+C3B;IAQD,IAAI,eAAe,IAAI,OAAO,CAQ7B;IAED,IAAI,YAAY,IAAI,MAAM,CAwCzB;IAED;;;;OAIG;IACH,UAAU,IAAI,MAAM;IAepB,wFAAwF;IACxF,aAAa,CAAC,UAAU,UAAQ,GAAG,MAAM;IA2FzC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAOjC,YAAY,IAAI,MAAM;IAkDtB,iBAAiB,IAAI,MAAM;IAU3B,wFAAwF;IACxF,WAAW,CAAC,UAAU,UAAQ,GAAG,MAAM;IA6EvC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,UAAQ,GAAG,MAAM;IAiBhE;;;;;;;;;;;OAWG;IACH,kBAAkB,IAAI,OAAO;IAoB7B;;;;;;OAMG;IACH,uBAAuB,IAAI,OAAO;IAQlC,iGAAiG;IACjG,0BAA0B,IAAI,OAAO;IASrC,wFAAwF;IACxF,aAAa,CAAC,UAAU,UAAQ,GAAG,MAAM;IA8CzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,eAAe,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,IAAI;IAoDjE,IAAI,mBAAmB,IAAI,OAAO,CAEjC;IAED,aAAa,IAAI,SAAS,EAAE;IAI5B,WAAW;;;;IAeX,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB;IA4E5E;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI;IAOnD;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,aAAa,IAAI,kBAAkB,GAAG,IAAI;IAS1C,uGAAuG;IACvG,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAahE;;;;;;;;;OASG;IACH,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAmB1F;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IASvF;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO;IAIpE;;;OAGG;IACH,WAAW,IAAI,UAAU;IASzB;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI;IAgB7D,qGAAqG;IACrG,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU;IAoB5C,mBAAmB,IAAI,OAAO;IAY9B,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,iBAAiB;IA6InE,aAAa,CAAC,IAAI,GAAE,OAAO,GAAG,MAAgB,GAAG,IAAI;IA2BrD,qBAAqB,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAa5C,YAAY,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IA0G7E,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM;IAwBxF,mBAAmB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAoC/C,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,CAAC,kBAAkB;IAkB1B,oBAAoB,IAAI,IAAI;IAsB5B,kBAAkB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI;IAW/F,WAAW,IAAI,OAAO;IA0DtB,YAAY,IAAI,QAAQ,GAAG,IAAI;IAsB/B,OAAO,CAAC,aAAa;IAUrB,2BAA2B,IAAI,kBAAkB;IAQjD,eAAe,IAAI,kBAAkB;IASrC,cAAc,IAAI,kBAAkB;IAWpC,aAAa,IAAI,kBAAkB;IAWnC,eAAe,IAAI,kBAAkB;IASrC,cAAc,IAAI,OAAO;IAuBzB,eAAe,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAmBtC,uBAAuB,IAAI,IAAI;IAwC/B,sBAAsB,IAAI,IAAI;IAW9B,wBAAwB,IAAI,IAAI;IAkBhC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAwEtD,YAAY,IAAI,YAAY,GAAG,IAAI;IAkBnC,OAAO,CAAC,oBAAoB;IAwB5B,eAAe,CAAC,KAAK,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,IAAI;IAIvD,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,gBAAgB;IAexB,gBAAgB,IAAI,IAAI;IAcxB,cAAc,IAAI,OAAO;IAiHzB;;;;;;;;;;;;;OAaG;IACH,eAAe,IAAI,OAAO;IAyB1B;;;;;;;;;;;;;OAaG;IACH,aAAa,IAAI,MAAM;IAsBvB,eAAe,CAAC,MAAM,UAAQ,GAAG,OAAO,GAAG,IAAI;IAK/C;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,UAAU,CAAC,MAAM,UAAQ,GAAG,UAAU,GAAG,IAAI;IA2D7C;;;OAGG;IACH,cAAc,CAAC,CAAC,EAAE,aAAa,GAAG,aAAa;IAa/C;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,iBAAiB,IAAI,aAAa,GAAG,IAAI;IAqBzC;;;;OAIG;IACH,YAAY,IAAI,OAAO;IAUvB;;;;;;;;OAQG;IACH,iBAAiB,IAAI,OAAO;IAW5B,gFAAgF;IAChF;;;;;;OAMG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAc/B;;;;;;;;;;;;;OAaG;IACH,eAAe,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI;IAkB7C,gBAAgB,IAAI,OAAO;IA6D3B;;;;;;;;;;;;;;;OAeG;IACH,eAAe,IAAI,OAAO;IAQ1B,eAAe,IAAI,OAAO;IA8F1B,qBAAqB,IAAI,OAAO;IA2ChC,cAAc,IAAI,OAAO;IAgBzB,gBAAgB,IAAI,OAAO;IA4B3B,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAmGhG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IA8GvG,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IA+FtG,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAsCrG,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAwDvG,IAAI,IAAI,IAAI,WAAW,CAetB;IAED;;;;;;OAMG;IACH,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAU5C;;;;OAIG;IACH,aAAa,IAAI,IAAI;IASrB;;;;;;;;;;;OAWG;IACH,iBAAiB,IAAI,cAAc;IAcnC;;;;;;;;;;;;;OAaG;IACH,SAAS,IAAI,OAAO;IAWpB,gGAAgG;IAChG,gBAAgB,IAAI,cAAc;IAOlC;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,WAAW;IAiB9C,eAAe,IAAI,WAAW;IAwJ9B,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ;IA4E/F,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAiBtG,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAelI,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAYzG;;;;;;;;;OASG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAuBjH,MAAM,CAAC,gBAAgB,CACrB,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,GAAG,IAAI,EACvB,GAAG,GAAE,MAA2B,GAC/B,kBAAkB;IAWrB,MAAM,CAAC,qBAAqB,CAC1B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,cAAc,CAAC,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;KAC3C,EACD,MAAM,EAAE,QAAQ,GAAG,IAAI,EAEvB,IAAI,GAAE,MAAsB,GAC3B,kBAAkB;IAqBrB,OAAO,CAAC,mBAAmB;IAkB3B,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAqG9G,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAW3G,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAoF7G,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IA4B3G;;;;;;;;OAQG;IACH,gBAAgB,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,CAAC,GAAG,CAAC;IAgC9E,MAAM,KAAK,WAAW,IAAI,MAAM,CAE/B;IAED,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAI/E,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAS7G,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAyFxF,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAwC9F;;;;;;;OAOG;IACH,eAAe,IAAI,OAAO;IAK1B;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAUnH;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAUtH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAkCnH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ;IAmC3F;;;;;;;;OAQG;IACH,MAAM,CAAC,yBAAyB,CAC9B,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,GAAG,IAAI,EACvB,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,GACpB,kBAAkB;IAarB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,cAAc,IAAI,YAAY,GAAG,IAAI;IAIrC;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAgD9C;;;;OAIG;IACH,YAAY,IAAI,OAAO;IAUvB;;;;;;;OAOG;IACH,YAAY,IAAI,OAAO;IAWvB,wFAAwF;IACxF,aAAa,IAAI,OAAO;IASxB;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAWtH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,QAAQ;IA4CnG;;;;;;;;;OASG;IACH,MAAM,CAAC,uBAAuB,CAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,GACb,kBAAkB;IAYrB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,kBAAkB,CACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,WAAW,EACrB,gBAAgB,EAAE,UAAU,EAAE,EAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,GAAG,IAAI,GACtB,QAAQ,GAAG,IAAI;IAgClB;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IAchE,MAAM,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAWrH;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO;IA0B/D,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAsClH,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAmEnH;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAsB9G,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAmBnG,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAwClH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;IAiB5G,MAAM,CAAC,qBAAqB,CAC1B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,GAAG,IAAI,GACtB,kBAAkB;IAgBrB,MAAM,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI,GAAG,kBAAkB;CAW1G"} \ No newline at end of file diff --git a/dist/datamodel/node/data/MatlabVariableNode.js b/dist/datamodel/node/data/MatlabVariableNode.js index d343c897..95ff611e 100644 --- a/dist/datamodel/node/data/MatlabVariableNode.js +++ b/dist/datamodel/node/data/MatlabVariableNode.js @@ -1,6 +1,7 @@ // Copyright 2026 The MathWorks, Inc. import DataNode, { newFieldName } from '../DataNode.js'; import { matlabVariableKind } from '../../kindMap.js'; +import { encodedHolderOf, sourceEditRefusal } from '../BaseNode.js'; import { addChildUndoable, removeChildUndoable } from '../childEdit.js'; import * as NodeRegistry from '../NodeRegistry.js'; import { OBJECT_ICON } from '../icons.js'; @@ -350,14 +351,13 @@ export default class MatlabVariableNode extends DataNode { // The Class column says complex and sparse as MATLAB's Workspace browser does, // `int16 (complex)`, `double (sparse)` (DisplayConvention.classColumnText): className is // MATLAB's class(), which says neither. Complex is what the writers take it for - // (_isComplexValue), and for an empty, which has no element to say so, what it was read as - // (_elementType): a .mat's complex(zeros(1,0)), or a binary dictionary's IsComplex="1". + // (_isComplexValue), an empty's included: what it was read as, a .mat's complex(zeros(1,0)), + // or a binary dictionary's IsComplex="1". _classColumn() { if (this._isOpaque) { return super._classColumn(); } - const complexEmpty = this._kind === 'array' && this._elementType === 'complex' && this._liveElements().length === 0; - return classColumnText(this.className, { complex: this._isComplexValue() || complexEmpty, sparse: !!this._sparse }); + return classColumnText(this.className, { complex: this._isComplexValue(), sparse: !!this._sparse }); } // A primitive variable's data type ('double', 'string', 'cell', …) is a real // data type and belongs in the DataType column. An opaque MCOS variable's @@ -395,7 +395,8 @@ export default class MatlabVariableNode extends DataNode { get nameEditable() { // Inside a value still in its encoded stream, the names are part of the stream; the // node holding the stream keeps its own (BaseNode.nameEditable says the same). - if (this._encodedReadOnly && !this._encoded) { + const holder = encodedHolderOf(this); + if (holder && holder !== this) { return false; } if (this.parent && this.parent instanceof MatlabVariableNode) { @@ -405,7 +406,9 @@ export default class MatlabVariableNode extends DataNode { if (this.parent?.isObjectPropertyBag) { return false; } - return true; + // Nor a name its source would not write: a MAT-file's variable stored after its subsystem + // (BaseNode.sourceEditRefusal). + return !sourceEditRefusal(this, 'Name'); } get valueEditable() { if (this._isOpaque) { @@ -1031,6 +1034,12 @@ export default class MatlabVariableNode extends DataNode { if (holderRefusal) { return holderRefusal; } + // And the file it is in may have no way to write what the text makes: a MAT-file holds no + // string this package writes (_refuseUnwritableValue). + const unwritableRefusal = this._refuseUnwritableValue(parsed, stringValue); + if (unwritableRefusal) { + return unwritableRefusal; + } this._applyParsed(parsed); this._markModified(); // _applyParsed rebuilds this node's children from the text, so restating a @@ -1117,6 +1126,34 @@ export default class MatlabVariableNode extends DataNode { validValue: this.displayValue, }; } + /** + * The refusal of `parsed`, typed in as this node's value, by a source that could not write + * what it makes of it, or null. A MAT-file's save writes no string, and writes a variable + * holding one only as it was read (MatNode._valueRefusal, MatFileWriter.freshRefusal), so a + * `"abc"` typed in, or a `{1, "abc"}`, would make a variable no save could write: it is refused + * here, before the edit, which a source that writes it (a dictionary) never asks. + * + * Judged of a node made of the text alone (_applyParsed, as the edit applies it), so that a + * refused edit leaves this one, its entry and its file as they were. + */ + _refuseUnwritableValue(parsed, stringValue) { + let entry = this; + let source = this.parent; + while (source && !source.isContainer) { + entry = source; + source = source.parent; + } + const refuse = source + ?._valueRefusal; + if (typeof refuse !== 'function') { + return null; + } + const value = new MatlabVariableNode(this.name, null, {}); + value._scalarType = this._scalarType; + value._applyParsed(parsed); + const refused = refuse.call(source, entry, this, value); + return refused ? { error: true, reason: refused, invalidValue: stringValue, validValue: this.displayValue } : null; + } /** * The refusal of a Value edit by the value this one is part of, or null. Asked of the nearest * node above this one that is not a struct, so that a field of a struct, at any depth and in @@ -1358,7 +1395,7 @@ export default class MatlabVariableNode extends DataNode { // every MatlabVariableNode above it, because the save path reads `_var` from the // TOP-LEVEL variable: a struct field's edit has to make the STRUCT's snapshot // stale, not just the field's own. See the _var getter for why. - _markModified() { + _markModified(edit = 'value') { let node = this; while (node instanceof MatlabVariableNode) { node._varStale = true; @@ -1370,7 +1407,7 @@ export default class MatlabVariableNode extends DataNode { } node = node.parent; } - super._markModified(); + super._markModified(edit); } // Push an edited element's new value into this container's _elements slot. // _elements and the child nodes are two copies of the same data: the children @@ -1402,6 +1439,8 @@ export default class MatlabVariableNode extends DataNode { this._matVar = null; // A value typed in whole is built with all its rows, whatever the file's node ceiling did. delete this._cutByCeiling; + // Nor is it the empty struct array it may have been (_emptyStructFields). + delete this._emptyStructFields; this._rawInput = undefined; // Nor is it what a removal left of a complex array any more (_complexClass). this._collapsedClass = null; @@ -1667,9 +1706,11 @@ export default class MatlabVariableNode extends DataNode { return false; } // Nor where what holds the value refuses the one Add would leave: in a Simulink.Parameter's - // Value, MATLAB's rules for it (DataNode._structuralRefusal, the ruling A2). + // Value, MATLAB's rules for it (DataNode._structuralRefusal, the ruling A2). Nor where the + // file it is in would not write the row as it shows: a MAT-file's struct array + // (BaseNode.sourceEditRefusal, MatNode._editRefusal). if (this._kind === 'scalar' && this._scalarType === 'struct') { - return !this._structuralRefusal('add'); + return !this._structuralRefusal('add') && !sourceEditRefusal(this, 'Add'); } if (this._kind === 'scalar') { return false; @@ -1726,7 +1767,8 @@ export default class MatlabVariableNode extends DataNode { return child; } _addStructField() { - const uniqueName = newFieldName(this.children.map((c) => c.name)); + // Nor the name of a field a struct array of no element has without a row (_emptyStructFields). + const uniqueName = newFieldName([...(this._emptyStructFields ?? []), ...this.children.map((c) => c.name)]); const child = MatlabVariableNode._createScalar(0, 'double', uniqueName, this); this.addChild(child); this._markModified(); @@ -2107,6 +2149,12 @@ export default class MatlabVariableNode extends DataNode { // (_matStream), naming the entry and the reason, rather than written in the rank-2 form // below, which is not a form MATLAB writes there for it. Elsewhere it falls through as // before: a binary dictionary's XML spells it element by element. + // + // A complex array of no element too (_isComplexValue), whose stream says complex where + // `[]` cannot: MATLAB's own text dictionary spells one as the real empty, `[]` or + // `{"_type": "int16", "_value": "[]"}` (dispcat_text.sldd's dx_complex_0x0 and + // dx_complex_int16_1x0), so that a copy of one into it, or through it into a binary + // dictionary, whose spelling `IsComplex="1"` does say so (_serializeArrayXml), lost it. const nd = effectiveDims(this._dims).length > 2; if (this._sparse || nd || this._isComplexValue() || this._unexpandedStruct()) { const cdata = this._serializeCdata(nd && this._ownerFormat() === 'json'); @@ -2155,6 +2203,14 @@ export default class MatlabVariableNode extends DataNode { return false; } const elems = this._liveElements(); + // An array of no element has none to say so, and is complex when it was read as one + // (_elementType): a .mat's complex(zeros(1,0)), a binary dictionary's IsComplex="1". Asked + // of its elements, it was real, and once anything marked it edited it was written so + // (_buildVarObject): measured against MATLAB R2027a, a .mat save of complex(zeros(0,0)) + // loaded with isreal true. + if (elems.length === 0) { + return this._elementType === 'complex'; + } // ANY element, not the first: the element editor takes only a real number, so after // x(1) = 7 the first element is the number 7 and the rest are still complex, and // asking the first alone wrote [7+0i NaN+0i 3-4i] out as the real [7 0 3]. @@ -2604,6 +2660,16 @@ export default class MatlabVariableNode extends DataNode { // unchanged. _serializeStructValue() { const dims = effectiveDims(this._dims); + // A struct array of no element, with fields (_emptyStructFields): the bag the binary reader + // makes of MATLAB's own spelling of one, `

` + // (BinarySlddParser.structValue), with no element and its names in `_fields`, which is where + // StructNode writes them back from, as those ``s. Built of its rows like any other, it + // named no field: a copy of a .mat's struct('a', {}) went into a binary dictionary as a + // struct of none. + const named = elementCount(dims) === 0 && this.children.length === 0 ? this._emptyStructFields ?? [] : []; + if (named.length > 0) { + return { _array_type: 'Struct', _dimensions: dims, _elements: [], _fields: named.slice(), _mw_element_type: 'MATLABArray' }; + } // A .mat struct ARRAY hangs its ELEMENTS off this node (named 1..N, each a // struct-kind node whose own children are the fields); a 1x1 hangs the fields // directly. StructNode owns neither case on the .mat path, so both are here — @@ -2902,7 +2968,11 @@ export default class MatlabVariableNode extends DataNode { if (type === 'string' && this._rawInput?._emptyDims && two.length === 2 && elementCount(two) === 0) { return DataNode._stringXml(tagName, attrStr, [], two, indent); } - return (p + '<' + tagName + attrStr + ' Class="' + escapeXml(type || 'double') + '" Dimension="' + dimAttr + '"/>'); + // A complex empty says so, as MATLAB's own does: `Class="double" IsComplex="1" + // Dimension="0*0"/>` and `Class="int16" IsComplex="1" Dimension="1*0"/>` (dispcat_bin.sldd). + // Without it, it was read back real. + const complex = !this._sparse && this._isComplexValue() ? ' IsComplex="1"' : ''; + return (p + '<' + tagName + attrStr + ' Class="' + escapeXml(type || 'double') + '"' + complex + ' Dimension="' + dimAttr + '"/>'); } // A sparse array reaches here only with no stream to be the hex of (_sparseFallback); // past what this package lays out densely, all there is to write is its summary, @@ -3222,6 +3292,14 @@ export default class MatlabVariableNode extends DataNode { } } else { + // An array of no element is its field names, each with no element, as MatParser reads + // one (_emptyStructFields): rebuilt from its rows, of which it has none, it was a + // struct of no field. + if (elementCount(this._dims) === 0) { + for (const fname of this._emptyStructFields ?? []) { + setOwn(fields, fname, []); + } + } for (const child of this.children) { setOwn(fields, child.name, MatlabVariableNode._memberVar(child)); } @@ -3627,6 +3705,12 @@ export default class MatlabVariableNode extends DataNode { } const fieldNames = Object.keys(variable.fields); const count = elementCount(node._dims); + // A struct array of no element has no row, and its field names nowhere but here + // (_emptyStructFields). + if (count === 0) { + node._emptyStructFields = fieldNames; + return node; + } if (count <= 1) { // Its fields are its rows, all of them or none past a .mat file's node ceiling // (matNodeCeiling). diff --git a/dist/datamodel/node/data/MatlabVariableNode.js.map b/dist/datamodel/node/data/MatlabVariableNode.js.map index 125b4511..74d567c7 100644 --- a/dist/datamodel/node/data/MatlabVariableNode.js.map +++ b/dist/datamodel/node/data/MatlabVariableNode.js.map @@ -1 +1 @@ -{"version":3,"file":"MatlabVariableNode.js","sourceRoot":"","sources":["../../../../src/datamodel/node/data/MatlabVariableNode.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"MatlabVariableNode.js","sourceRoot":"","sources":["../../../../src/datamodel/node/data/MatlabVariableNode.ts"],"names":[],"mappings":"AAAA,qCAAqC;AAErC,OAAO,QAAQ,EAAE,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,SAAS,MAAM,yBAAyB,CAAC;AAChD,OAAO,YAAY,MAAM,4BAA4B,CAAC;AACtD,OAAO,eAAe,MAAM,+BAA+B,CAAC;AAC5D,OAAO,QAAQ,MAAM,wBAAwB,CAAC;AAC9C,OAAO,aAAa,MAAM,yBAAyB,CAAC;AACpD,OAAO,iBAAiB,EAAE,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAE/H,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACtI,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,2BAA2B,CAAC;AACpI,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,oBAAoB,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACxI,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EACL,YAAY,EACZ,aAAa,EACb,UAAU,EACV,QAAQ,EACR,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GAEpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EACL,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,kBAAkB,EAClB,aAAa,EACb,aAAa,GACd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,WAAW,EACX,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,eAAe,EACf,aAAa,GAEd,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,UAAU,EACV,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,WAAW,GACZ,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,eAAe,EACf,eAAe,EACf,YAAY,EACZ,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,0BAA0B,EAC1B,GAAG,IAAI,MAAM,EACb,gBAAgB,EAChB,SAAS,EACT,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAE/B,8BAA8B;AAC9B,iFAAiF;AACjF,+EAA+E;AAC/E,iFAAiF;AACjF,+EAA+E;AAC/E,kFAAkF;AAClF,mFAAmF;AAEnF,MAAM,aAAa,GAA2B;IAC5C,oBAAoB,EAAE,cAAc;IACpC,iBAAiB,EAAE,UAAU;IAC7B,cAAc,EAAE,OAAO;IACvB,oBAAoB,EAAE,SAAS;IAC/B,sBAAsB,EAAE,WAAW;IACnC,oBAAoB,EAAE,wBAAwB;IAC9C,uBAAuB,EAAE,wBAAwB;IACjD,kBAAkB,EAAE,WAAW;IAC/B,0BAA0B,EAAE,WAAW;IACvC,yBAAyB,EAAE,WAAW;IACtC,sBAAsB,EAAE,mBAAmB;IAC3C,+BAA+B,EAAE,4BAA4B;IAC7D,sBAAsB,EAAE,UAAU;IAClC,qBAAqB,EAAE,sBAAsB;IAC7C,oBAAoB,EAAE,SAAS;IAC/B,uFAAuF;IACvF,wFAAwF;IACxF,4DAA4D;IAC5D,MAAM,EAAE,UAAU;CACnB,CAAC;AAEF,2FAA2F;AAC3F,0FAA0F;AAC1F,+EAA+E;AAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAkBrF;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,QAAqB;IAC7C,MAAM,KAAK,GAAkB,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACvB,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAA+B,EAAE,CAAC;gBACrD,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,QAAqB;IAC5C,MAAM,KAAK,GAAkB,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,EAAG,CAAC;QACvB,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,KAA+B,EAAE,CAAC;gBACrD,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,QAAqB;IAC1C,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,gBAAgB,CAAC,IAAY,EAAE,KAAa,EAAE,KAAc,EAAE,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACtG,IAAI,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;QACxD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAwB,CAAC,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7G,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,8DAA8D;AAC9D,MAAM,aAAa,GAAG,wCAAwC,CAAC;AAE/D;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,MAA+B,EAAE,IAAY,EAAE,QAAmB;IAC7F,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,MAAM,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,OAAO;IACT,CAAC;IACD,8DAA8D;IAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjD,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YACjB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;YACzD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAC3C,OAAO,GAAG,OAAO,IAAI,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC;YAC3C,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClG,CAAC;QACD,EAAE,EAAE,CAAC;IACP,CAAC;AACH,CAAC;AAOD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,QAAQ;IAqFtD,YAAY,IAAY,EAAE,MAAuB,EAAE,MAAgC;QACjF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED,iDAAiD;IACjD,2EAA2E;IAC3E,+EAA+E;IAC/E,4EAA4E;IAC5E,iFAAiF;IACjF,+EAA+E;IAC/E,iDAAiD;IAEjD,IAAI,KAAK;QACP,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,uFAAuF;QACvF,gDAAgD;QAChD,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,CAAU;QAClB,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED;;;;;;OAMG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAC/B,CAAC;IAED;;;;;;OAMG;IACH,aAAa;QACX,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;YAClC,OAAQ,CAAwB,CAAC,YAAY,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI;QACN,8EAA8E;QAC9E,gFAAgF;QAChF,gFAAgF;QAChF,iFAAiF;QACjF,uDAAuD;QACvD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,KAAK,CAAC;QAC5C,CAAC;QACD,+EAA+E;QAC/E,+EAA+E;QAC/E,8EAA8E;QAC9E,iFAAiF;QACjF,kEAAkE;QAClE,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACxH,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,IAAI,IAAI;QACN,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,2EAA2E;YAC3E,6EAA6E;YAC7E,6DAA6D;YAC7D,EAAE;YACF,6EAA6E;YAC7E,wEAAwE;YACxE,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAiB,CAAC;YACnC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,WAAW,CAAC;QACzG,CAAC;QACD,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBACnC,OAAO,SAAS,CAAC;gBACnB,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;oBAChC,OAAO,aAAa,CAAC;gBACvB,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,QAAQ,CAAC;gBAClB,CAAC;gBACD,2EAA2E;gBAC3E,0EAA0E;gBAC1E,0EAA0E;gBAC1E,uEAAuE;gBACvE,yEAAyE;gBACzE,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,WAAW,CAAC;gBACrB,CAAC;gBACD,OAAO,WAAW,CAAC;YACrB,KAAK,OAAO;gBACV,4EAA4E;gBAC5E,6EAA6E;gBAC7E,4EAA4E;gBAC5E,6DAA6D;gBAC7D,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YAClE,KAAK,MAAM;gBACT,OAAO,YAAY,CAAC;YACtB,KAAK,QAAQ;gBACX,OAAO,UAAU,CAAC;QACtB,CAAC;IACH,CAAC;IAED,IAAI,SAAS;QACX,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,gBAAiB,CAAC;QAChC,CAAC;QACD,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,iFAAiF;gBACjF,iFAAiF;gBACjF,gFAAgF;gBAChF,0BAA0B;gBAC1B,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;oBACnC,OAAO,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAE,IAAI,CAAC,MAA6B,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjH,CAAC;gBACD,OAAO,IAAI,CAAC,WAAW,CAAC;YAC1B,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;YACtE,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAChB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAC;QACpB,CAAC;IACH,CAAC;IAED,+EAA+E;IAC/E,yFAAyF;IACzF,gFAAgF;IAChF,6FAA6F;IAC7F,0CAA0C;IAC1C,YAAY;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC,YAAY,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACtG,CAAC;IAED,6EAA6E;IAC7E,0EAA0E;IAC1E,+EAA+E;IAC/E,8DAA8D;IAC9D,IAAI,QAAQ;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,6EAA6E;YAC7E,yEAAyE;YACzE,8EAA8E;YAC9E,oDAAoD;YACpD,OAAO,IAAI,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,4EAA4E;IAC5E,gFAAgF;IAChF,iFAAiF;IACjF,+EAA+E;IAC/E,gCAAgC;IAChC,IAAI,IAAI;QACN,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;QACD,OAAO,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,qFAAqF;IACrF,uFAAuF;IACvF,mFAAmF;IACnF,iFAAiF;IACjF,2DAA2D;IAC3D,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,YAAY;QACd,oFAAoF;QACpF,+EAA+E;QAC/E,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,MAAM,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,YAAY,kBAAkB,EAAE,CAAC;YAC7D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,yEAAyE;QACzE,IAAI,IAAI,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,0FAA0F;QAC1F,gCAAgC;QAChC,OAAO,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,aAAa;QACf,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,+EAA+E;QAC/E,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,iFAAiF;QACjF,qFAAqF;QACrF,qFAAqF;QACrF,yCAAyC;QACzC,IAAI,IAAI,CAAC,MAAM,YAAY,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,iFAAiF;QACjF,IAAI,IAAI,CAAC,MAAM,YAAY,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,EAAE,CAAC;YAC9E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,oFAAoF;QACpF,IAAI,IAAI,CAAC,WAAW,KAAK,iBAAiB,EAAE,CAAC;YAC3C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,mEAAmE;QACnE,IAAI,IAAI,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;YACxC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,uFAAuF;QACvF,sFAAsF;QACtF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,iFAAiF;QACjF,0FAA0F;QAC1F,wBAAwB;QACxB,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,+EAA+E;QAC/E,6EAA6E;QAC7E,mEAAmE;QACnE,uEAAuE;QACvE,uCAAuC;QACvC,OAAO,KAAK,CAAC,aAAa,CAAC;IAC7B,CAAC;IAED,+EAA+E;IAC/E,+EAA+E;IAC/E,gFAAgF;IAChF,iFAAiF;IACjF,+EAA+E;IAC/E,iEAAiE;IACjE,IAAI,eAAe;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC;IACvG,CAAC;IAED,IAAI,YAAY;QACd,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,mFAAmF;YACnF,iFAAiF;YACjF,gFAAgF;YAChF,mFAAmF;YACnF,gFAAgF;YAChF,gEAAgE;YAChE,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9B,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC9D,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;oBAAE,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACxE,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;oBACrC,OAAO,IAAI,CAAC,UAAU;wBACpB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC;wBACnC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAAC,CAAC;gBACrF,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;oBACnC,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,EAAG,IAAI,CAAC,UAAwB,CAAC,MAAM,CAAC,CAAC;oBAChF,sEAAsE;oBACtE,sEAAsE;oBACtE,sDAAsD;oBACtD,OAAO,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;YACD,8EAA8E;YAC9E,gFAAgF;YAChF,yEAAyE;YACzE,OAAO,WAAW,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,IAAI,QAAQ,CAAC,CAAC;QACxF,CAAC;QACD,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9B,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YAC5B,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,UAAU;QACR,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B,CAAC;QACD,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAChC,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,wFAAwF;IACxF,aAAa,CAAC,UAAU,GAAG,KAAK;QAC9B,4EAA4E;QAC5E,+EAA+E;QAC/E,8EAA8E;QAC9E,2CAA2C;QAC3C,IAAI,IAAI,CAAC,YAAY,KAAK,aAAa,EAAE,CAAC;YACxC,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QACD,8FAA8F;QAC9F,0FAA0F;QAC1F,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3B,OAAO,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,YAAsB,CAAC,GAAG,GAAG,CAAC;QAC/D,CAAC;QACD,6EAA6E;QAC7E,+EAA+E;QAC/E,6EAA6E;QAC7E,gFAAgF;QAChF,+EAA+E;QAC/E,+EAA+E;QAC/E,kBAAkB;QAClB,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC/B,8EAA8E;YAC9E,+EAA+E;YAC/E,8EAA8E;YAC9E,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,4EAA4E;YAC5E,0EAA0E;YAC1E,8EAA8E;YAC9E,kDAAkD;YAClD,uFAAuF;YACvF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CACvC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACrF,8EAA8E;YAC9E,uFAAuF;YACvF,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,OAAO,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,6EAA6E;QAC7E,yDAAyD;QACzD,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,wEAAwE;YACxE,4EAA4E;YAC5E,2EAA2E;YAC3E,YAAY;YACZ,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,iBAAiB,EAAE,CAAC;YAC3C,kFAAkF;YAClF,mDAAmD;YACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC;QAClD,CAAC;QACD,sFAAsF;QACtF,sFAAsF;QACtF,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC5E,OAAO,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,gFAAgF;IAChF,mFAAmF;IACnF,+EAA+E;IAC/E,iFAAiF;IACjF,EAAE;IACF,gFAAgF;IAChF,mFAAmF;IACnF,oBAAoB;IACpB,SAAS,CAAC,IAAY;QACpB,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAED,YAAY;QACV,mFAAmF;QACnF,wFAAwF;QACxF,sFAAsF;QACtF,6DAA6D;QAC7D,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAClF,iFAAiF;QACjF,sFAAsF;QACtF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAClC,CAAC;QACD,8EAA8E;QAC9E,6EAA6E;QAC7E,4EAA4E;QAC5E,8EAA8E;QAC9E,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,SAAS,GACb,IAAI,CAAC,WAAW,KAAK,SAAS;YAC5B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;gBACnB,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9B,CAAC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE;gBACtB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,CAAC,CAAC,KAAK,CAAC;QACd,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACnE,4EAA4E;QAC5E,yEAAyE;QACzE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,CAAC;IAED,yFAAyF;IACzF,0FAA0F;IAC1F,wFAAwF;IACxF,mFAAmF;IACnF,oFAAoF;IACpF,kFAAkF;IAClF,2FAA2F;IAC3F,kFAAkF;IAClF,kFAAkF;IAClF,2FAA2F;IAC3F,4FAA4F;IAC5F,0FAA0F;IAC1F,4FAA4F;IAC5F,yEAAyE;IACzE,iBAAiB;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,KAAK,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,iBAAiB,CAAC;QAC/F,MAAM,UAAU,GAAG,CAAC,CAAE,IAAI,CAAC,SAAiD,EAAE,CAAC,gBAAgB,CAAC,CAAC;QACjG,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,8BAA8B,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5F,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,wFAAwF;IACxF,WAAW,CAAC,UAAU,GAAG,KAAK;QAC5B,2FAA2F;QAC3F,uFAAuF;QACvF,yFAAyF;QACzF,0FAA0F;QAC1F,wFAAwF;QACxF,yFAAyF;QACzF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YACzC,CAAC;YACD,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,yFAAyF;YACzF,wFAAwF;YACxF,8EAA8E;YAC9E,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9D,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACpF,CAAC;QACD,6EAA6E;QAC7E,2EAA2E;QAC3E,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,CAAC,QAAiB,EAAU,EAAE;YAC5C,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9B,wEAAwE;oBACxE,wEAAwE;oBACxE,iEAAiE;oBACjE,gEAAgE;oBAChE,yDAAyD;oBACzD,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;oBAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;gBAC/E,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACxC,CAAC,CAAC;QACF,4EAA4E;QAC5E,sEAAsE;QACtE,8EAA8E;QAC9E,mFAAmF;QACnF,gEAAgE;QAChE,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,UAAU,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,CAAC;IAED,6FAA6F;IAC7F,iGAAiG;IACjG,6FAA6F;IAC7F,oFAAoF;IACpF,+FAA+F;IAC/F,4FAA4F;IAC5F,+FAA+F;IAC/F,gGAAgG;IAChG,2FAA2F;IAC3F,6FAA6F;IAC7F,0FAA0F;IAC1F,EAAE;IACF,6FAA6F;IAC7F,+FAA+F;IAC/F,gGAAgG;IAChG,yFAAyF;IACzF,4FAA4F;IAC5F,oFAAoF;IACpF,EAAE;IACF,iFAAiF;IACjF,mBAAmB,CAAC,KAAe,EAAE,UAAU,GAAG,KAAK;QACrD,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,gBAAgB,IAAI,QAAQ,CAAC,CAAC;YACrE,CAAC;YACD,OAAO,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;QAC9D,CAAC;QACD,MAAM,MAAM,GAAG,KAAiB,CAAC;QACjC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;QACnC,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC,YAAY,CAAC;QAC5B,CAAC;QACD,2FAA2F;QAC3F,uEAAuE;QACvE,OAAO,WAAW,CAAE,MAA8B,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtF,CAAC;IAED;;;;;;;;;;;OAWG;IACH,kBAAkB;QAChB,uFAAuF;QACvF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACtE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,CAAC,CAAC,YAAY,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;gBAC3D,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,YAAY,kBAAkB,IAAI,CAAC,CAAC,uBAAuB,EAAE,EAAE,CAAC;gBACnE,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,CAAC,CAAC,CAAC,YAAY,kBAAkB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;QAC5F,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,uBAAuB;QACrB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YAC5E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,OAAO,KAAK,KAAK,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,iGAAiG;IACjG,0BAA0B;QACxB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,0BAA0B,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,kBAAkB,IAAI,CAAC,CAAC,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAClI,CAAC;IACJ,CAAC;IAED,wFAAwF;IACxF,aAAa,CAAC,UAAU,GAAG,KAAK;QAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrB,oFAAoF;QACpF,8DAA8D;QAC9D,MAAM,eAAe,GAAG,CAAC,EAAW,EAAU,EAAE,CAC9C,mBAAmB,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5D,2EAA2E;YAC3E,oCAAoC;YACpC,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,OAAO,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,sFAAsF;QACtF,yFAAyF;QACzF,uFAAuF;QACvF,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,OAAO,GAAG,CAAC,OAAgC,EAAU,EAAE;YAC3D,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9B,MAAM,IAAI,GAAa,EAAE,CAAC;gBAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9B,0EAA0E;oBAC1E,+CAA+C;oBAC/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnD,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACxC,CAAC,CAAC;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC1C,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjG,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,KAAK,EAAE,CAAC,CAAC,WAAW;gBACpB,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY;aAC5E,CAAC,CAAC,CAAC;QACN,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,gFAAgF;QAChF,4EAA4E;QAC5E,MAAM,KAAK,GAAiB,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC;QAClF,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,2EAA2E;QAC3E,+EAA+E;QAC/E,gFAAgF;QAChF,+EAA+E;QAC/E,0EAA0E;QAC1E,gFAAgF;QAChF,iCAAiC;QACjC,MAAM,OAAO,GACX,IAAI,CAAC,KAAK,KAAK,QAAQ;YACrB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,EAAE,CAAC;YAClC,CAAC,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1G,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,KAAK,QAAQ,CAAC;QAC5C,MAAM,GAAG,GAA4C,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,8EAA8E;YAC9E,mEAAmE;YACnE,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC;YACD,GAAG,CAAC,CAAC,CAAC,GAAG;gBACP,KAAK,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;gBACpD,KAAK,EAAE,OAAO,CAAC,YAAY;aAC5B,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,qDAAqD;IAErD,oFAAoF;IACpF,qFAAqF;IACrF,mFAAmF;IACnF,oFAAoF;IACpF,gDAAgD;IAChD,IAAI,mBAAmB;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa;QACX,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;IAC9D,CAAC;IAED,WAAW;QACT,2EAA2E;QAC3E,8EAA8E;QAC9E,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IACtH,CAAC;IAED,6EAA6E;IAC7E,+EAA+E;IAC/E,0EAA0E;IAC1E,+EAA+E;IAC/E,iFAAiF;IACjF,+EAA+E;IAC/E,+EAA+E;IAC/E,6EAA6E;IAE7E,WAAW,CAAC,QAAgB,EAAE,WAAmB;QAC/C,0EAA0E;QAC1E,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;YACnD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,mGAAmG;QACnG,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACtE,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,cAAc,CAAC;QACxB,CAAC;QACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,2FAA2F;YAC3F,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAC1D,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,KAAK,iBAAiB,EAAE,CAAC;gBAC3C,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,uDAAuD;oBAC/D,YAAY,EAAE,WAAW;oBACzB,UAAU,EAAE,IAAI,CAAC,YAAY;iBAC9B,CAAC;YACJ,CAAC;YACD,8EAA8E;YAC9E,iFAAiF;YACjF,kEAAkE;YAClE,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;gBACxD,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,IAAI,CAAC,0BAA0B,EAAE;wBACvC,CAAC,CAAC,8HAA8H;wBAChI,CAAC,CAAC,4FAA4F;oBAChG,YAAY,EAAE,WAAW;oBACzB,UAAU,EAAE,IAAI,CAAC,YAAY;iBAC9B,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;YAChD,CAAC;YACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;oBACL,KAAK,EAAE,IAAI;oBACX,MAAM,EAAE,2BAA2B;oBACnC,YAAY,EAAE,WAAW;oBACzB,UAAU,EAAE,IAAI,CAAC,YAAY;iBAC9B,CAAC;YACJ,CAAC;YACD,2FAA2F;YAC3F,4FAA4F;YAC5F,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YACpE,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,aAAa,CAAC;YACvB,CAAC;YACD,0FAA0F;YAC1F,uDAAuD;YACvD,MAAM,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC3E,IAAI,iBAAiB,EAAE,CAAC;gBACtB,OAAO,iBAAiB,CAAC;YAC3B,CAAC;YACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,2EAA2E;YAC3E,4EAA4E;YAC5E,8EAA8E;YAC9E,+EAA+E;YAC/E,gFAAgF;YAChF,4EAA4E;YAC5E,uDAAuD;YACvD,IAAI,CAAC,MAAM,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,YAAY,CAAC,QAAgB;QAC3B,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,aAAa;QACX,KAAK,IAAI,CAAC,GAAoB,IAAI,EAAE,CAAC,YAAY,kBAAkB,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAClF,IAAI,CAAC,CAAC,eAAe,EAAE,CAAC;gBACtB,OAAO,CAAC,CAAC,YAAY,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAChD,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uGAAuG;IACvG,iBAAiB,CAAC,WAAmB;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI,MAAM,CAAC,UAAU,gGAAgG;YAC7H,YAAY,EAAE,WAAW;YACzB,UAAU,EAAE,IAAI,CAAC,YAAY;SAC9B,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,sBAAsB,CAAC,MAAmB,EAAE,WAAmB;QAC7D,IAAI,KAAK,GAAa,IAAI,CAAC;QAC3B,IAAI,MAAM,GAAoB,IAAI,CAAC,MAAM,CAAC;QAC1C,OAAO,MAAM,IAAI,CAAE,MAA+C,CAAC,WAAW,EAAE,CAAC;YAC/E,KAAK,GAAG,MAAM,CAAC;YACf,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,MAAM,MAAM,GAAI,MAAoH;YAClI,EAAE,aAAa,CAAC;QAClB,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1D,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACrH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,mBAAmB,CAAC,MAAmB,EAAE,WAAmB;QAC1D,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QACzB,OAAO,MAAM,IAAI,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC/C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,CAAC;QACD,MAAM,MAAM,GAAI,MAA6B,EAAE,iBAAiB,CAAC;QACjE,OAAO,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,CAAC;IAED;;;;;;;;;;OAUG;IACH,sBAAsB,CAAC,MAAmB,EAAE,IAAc;QACxD,OAAO,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3B,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAoB;QACvC,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAChD,OAAO,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1H,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1E,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5E,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACzG,OAAO,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qGAAqG;IACrG,WAAW,CAAC,MAAmB;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpF,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,QAAQ;gBACX,OAAO,EAAE,GAAG,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC7F,KAAK,SAAS;gBACZ,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAC5D,KAAK,SAAS;gBACZ,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACxD,KAAK,QAAQ;gBACX,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACzD,KAAK,cAAc,CAAC;YACpB,KAAK,MAAM;gBACT,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAK,EAAE,CAAC;YACjG;gBACE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IAED,mBAAmB;QACjB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,YAAY,kBAAkB,CAAC,EAAE,CAAC;YACjE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC;IACzE,CAAC;IAED,6EAA6E;IAC7E,iFAAiF;IACjF,2EAA2E;IAC3E,iFAAiF;IACjF,iFAAiF;IACjF,oBAAoB,CAAC,WAAmB;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAA4B,CAAC;QACjD,sFAAsF;QACtF,sFAAsF;QACtF,sFAAsF;QACtF,oFAAoF;QACpF,gCAAgC;QAChC,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;YACrB,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,yBAAyB;gBACjC,YAAY,EAAE,WAAW;gBACzB,UAAU,EAAE,IAAI,CAAC,YAAY;aAC9B,CAAC;QACJ,CAAC;QACD,oFAAoF;QACpF,uFAAuF;QACvF,wFAAwF;QACxF,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,mDAAmD,GAAG,OAAO,GAAG,mCAAmC;gBAC3G,YAAY,EAAE,WAAW;gBACzB,UAAU,EAAE,IAAI,CAAC,YAAY;aAC9B,CAAC;QACJ,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC;QAChD,gFAAgF;QAChF,kFAAkF;QAClF,+EAA+E;QAC/E,iFAAiF;QACjF,kFAAkF;QAClF,kFAAkF;QAClF,mCAAmC;QACnC,MAAM,gBAAgB,GAAG,cAAc,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC;QAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpD,sFAAsF;QACtF,qFAAqF;QACrF,sFAAsF;QACtF,wFAAwF;QACxF,wFAAwF;QACxF,iDAAiD;QACjD,EAAE;QACF,qFAAqF;QACrF,wFAAwF;QACxF,qFAAqF;QACrF,qFAAqF;QACrF,sFAAsF;QACtF,0EAA0E;QAC1E,EAAE;QACF,mFAAmF;QACnF,sFAAsF;QACtF,gFAAgF;QAChF,qFAAqF;QACrF,+EAA+E;QAC/E,EAAE;QACF,gFAAgF;QAChF,qFAAqF;QACrF,oFAAoF;QACpF,uFAAuF;QACvF,IAAI,cAAc,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrF,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC;gBACrD,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,MAAM,EAAE,IAAI,KAAK,SAAS;oBAC1B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;oBACtB,CAAC,CAAC,IAAI,CAAC;YACX,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC7B,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBACjH,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBACnC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;gBAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;gBAC7C,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,IAAI,QAAiB,CAAC;QACtB,IAAI,gBAAgB,EAAE,CAAC;YACrB,QAAQ,GAAG,MAAM,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC;QACrH,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,QAAQ,GAAG,MAAM,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,6EAA6E;YAC7E,2EAA2E;YAC3E,4EAA4E;YAC5E,QAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC;QACpF,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,gBAAgB;oBACtB,CAAC,CAAC,8CAA8C;oBAChD,CAAC,CAAC,cAAc;wBACd,CAAC,CAAC,uCAAuC;wBACzC,CAAC,CAAC,oDAAoD;gBAC1D,YAAY,EAAE,WAAW;gBACzB,UAAU,EAAE,IAAI,CAAC,YAAY;aAC9B,CAAC;QACJ,CAAC;QACD,4EAA4E;QAC5E,+EAA+E;QAC/E,0EAA0E;QAC1E,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAChF,8EAA8E;QAC9E,8EAA8E;QAC9E,kFAAkF;QAClF,iCAAiC;QACjC,EAAE;QACF,iFAAiF;QACjF,oFAAoF;QACpF,uFAAuF;QACvF,iFAAiF;QACjF,IAAI,CAAC,YAAY,GAAG,gBAAgB;YAClC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC,CAAC,cAAc;gBACd,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;gBAC/C,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,6EAA6E;YAC7E,oEAAoE;YACpE,IAAI,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,KAAe,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,4FAA4F;QAC5F,mFAAmF;QACnF,6EAA6E;QAC7E,0DAA0D;QAC1D,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+EAA+E;IAC/E,6EAA6E;IAC7E,gFAAgF;IAChF,iFAAiF;IACjF,8EAA8E;IAC9E,gEAAgE;IAChE,aAAa,CAAC,OAAyB,OAAO;QAC5C,IAAI,IAAI,GAAoB,IAAI,CAAC;QACjC,OAAO,IAAI,YAAY,kBAAkB,EAAE,CAAC;YAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,qFAAqF;YACrF,oFAAoF;YACpF,yDAAyD;YACzD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,CAAC;YACD,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,2EAA2E;IAC3E,8EAA8E;IAC9E,6EAA6E;IAC7E,yEAAyE;IACzE,wEAAwE;IACxE,yCAAyC;IACzC,EAAE;IACF,sFAAsF;IACtF,wFAAwF;IACxF,uFAAuF;IACvF,0FAA0F;IAC1F,iDAAiD;IACjD,qBAAqB,CAAC,KAAe;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAG,KAA4B,CAAC,YAAY,CAAC,CAAC;YAC9E,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;aAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAI,KAA4B,CAAC,YAAY,CAAC;QACnE,CAAC;IACH,CAAC;IAED,YAAY,CAAC,MAAyD;QACpE,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,2FAA2F;QAC3F,OAAO,IAAI,CAAC,aAAa,CAAC;QAC1B,0EAA0E;QAC1E,OAAO,IAAI,CAAC,kBAAkB,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,6EAA6E;QAC7E,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,qFAAqF;QACrF,wCAAwC;QACxC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,qFAAqF;QACrF,4DAA4D;QAC5D,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,gFAAgF;QAChF,+EAA+E;QAC/E,kDAAkD;QAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC;QAClC,kFAAkF;QAClF,wFAAwF;QACxF,oFAAoF;QACpF,mFAAmF;QACnF,6EAA6E;QAC7E,oFAAoF;QACpF,sFAAsF;QACtF,iFAAiF;QACjF,qFAAqF;QACrF,4CAA4C;QAC5C,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzF,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACtD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YAC7E,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAK,CAAC;YAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC7B,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,qFAAqF;YACrF,oFAAoF;YACpF,mFAAmF;YACnF,sFAAsF;YACtF,iFAAiF;YACjF,mFAAmF;YACnF,mEAAmE;YACnE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAK,CAAC;YAC1B,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;gBACrB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC9B,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,KAAkB,CAAC;YAC3C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAK,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YAClE,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAK,CAAC;YAC1B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;YAC5B,IAAI,CAAC,MAAM,GAAG,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;YAC5E,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAkB,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACzD,kFAAkF;YAClF,mFAAmF;YACnF,gFAAgF;YAChF,iBAAiB;YACjB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC5G,gFAAgF;YAChF,6EAA6E;YAC7E,iFAAiF;YACjF,8EAA8E;YAC9E,wEAAwE;YACxE,4EAA4E;YAC5E,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,kFAAkF;IAClF,gFAAgF;IAChF,mFAAmF;IACnF,iFAAiF;IACjF,iFAAiF;IACjF,iDAAiD;IACjD,mFAAmF;IACnF,uFAAuF;IACvF,4DAA4D;IAC5D,kBAAkB,CAAC,IAAc,EAAE,QAA6B,EAAE,IAAa;QAC7E,OAAO,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,CAAC;IAClF,CAAC;IAED,gFAAgF;IAChF,mFAAmF;IACnF,iFAAiF;IACjF,kFAAkF;IAClF,iFAAiF;IACjF,+EAA+E;IAC/E,+EAA+E;IAC/E,kFAAkF;IAClF,cAAc;IACd,EAAE;IACF,mFAAmF;IACnF,mFAAmF;IACnF,kFAAkF;IAClF,6EAA6E;IAC7E,qEAAqE;IACrE,EAAE;IACF,kFAAkF;IAClF,gFAAgF;IAChF,oFAAoF;IACpF,8CAA8C;IAC9C,mBAAmB,CAAC,WAAoB;QACtC,6EAA6E;QAC7E,gFAAgF;QAChF,8EAA8E;QAC9E,MAAM,IAAI,GAAG,WAAW,IAAI,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;YAChF,OAAO;QACT,CAAC;QACD,sFAAsF;QACtF,mEAAmE;QACnE,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7F,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,wFAAwF;IACxF,uFAAuF;IACvF,yFAAyF;IACzF,mFAAmF;IACnF,yFAAyF;IACzF,EAAE;IACF,mFAAmF;IACnF,uFAAuF;IACvF,iEAAiE;IACjE,EAAE;IACF,sFAAsF;IACtF,iFAAiF;IACzE,oBAAoB,CAAC,IAAY;QACvC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAQ,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QACD,gFAAgF;QAChF,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,OAAO;QACT,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7F,KAAK,CAAC,UAAU,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACvE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,2EAA2E;IAC3E,gEAAgE;IAChE,0EAA0E;IAC1E,4EAA4E;IAC5E,0EAA0E;IAClE,kBAAkB,CAAC,IAAY,EAAE,KAAc;QACrD,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1E,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC;QACvB,KAAK,CAAC,SAAS,GAAG,CAAC,KAAe,CAAC,CAAC;QACpC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrB,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;QAC3B,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,gFAAgF;IAChF,kFAAkF;IAClF,iFAAiF;IACjF,kFAAkF;IAClF,gFAAgF;IAChF,kFAAkF;IAClF,mFAAmF;IACnF,sCAAsC;IACtC,oBAAoB;QAClB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,qBAAqB,EAAE,CAAC;YAChF,OAAO;QACT,CAAC;QACD,gFAAgF;QAChF,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5D,OAAO;QACT,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,0EAA0E;IAC1E,mFAAmF;IACnF,kFAAkF;IAClF,kFAAkF;IAClF,qFAAqF;IACrF,6EAA6E;IAC7E,qFAAqF;IACrF,+EAA+E;IAC/E,kBAAkB,CAAC,QAAmB,EAAE,MAAgD;QACtF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;gBAC1B,CAAC,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;gBAClF,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9D,yEAAyE;YACzE,YAAY,CAAC,KAAK,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,WAAW;QACT,8EAA8E;QAC9E,gFAAgF;QAChF,kFAAkF;QAClF,mFAAmF;QACnF,qFAAqF;QACrF,wFAAwF;QACxF,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC5C,OAAO,KAAK,CAAC;QACf,CAAC;QACD,uFAAuF;QACvF,wFAAwF;QACxF,oEAAoE;QACpE,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,iGAAiG;QACjG,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,kFAAkF;QAClF,6EAA6E;QAC7E,mFAAmF;QACnF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,sFAAsF;QACtF,wFAAwF;QACxF,qFAAqF;QACrF,gCAAgC;QAChC,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,4FAA4F;QAC5F,2FAA2F;QAC3F,+EAA+E;QAC/E,sDAAsD;QACtD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5E,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,oEAAoE;QACpE,0EAA0E;QAC1E,8DAA8D;QAC9D,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3H,OAAO,KAAK,CAAC;QACf,CAAC;QACD,0EAA0E;QAC1E,wEAAwE;QACxE,gBAAgB;QAChB,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1E,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,YAAY;QACV,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;QAChC,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oEAAoE;IACpE,sEAAsE;IACtE,oEAAoE;IAC5D,aAAa;QACnB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,2BAA2B;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe;QACb,+FAA+F;QAC/F,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3G,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACrC,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACrG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,aAAa;QACX,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACpG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAK,IAAI,CAAC,MAAkC,CAAC,WAAW,EAAE,CAAC;YACxD,IAAI,CAAC,MAAkC,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAe;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,cAAc;QACZ,mDAAmD;QACnD,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,kFAAkF;QAClF,iFAAiF;QACjF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,oEAAoE;QACpE,yEAAyE;QACzE,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3H,OAAO,KAAK,CAAC;QACf,CAAC;QACD,wFAAwF;QACxF,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACxE,CAAC;IAED,eAAe,CAAC,KAAe;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjC,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,uBAAuB;QACrB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,0EAA0E;gBAC1E,0EAA0E;gBAC1E,gEAAgE;gBAChE,sEAAsE;gBACtE,wEAAwE;gBACxE,2EAA2E;gBAC3E,EAAE;gBACF,iFAAiF;gBACjF,kFAAkF;gBAClF,6EAA6E;gBAC7E,mFAAmF;gBACnF,6EAA6E;gBAC7E,gFAAgF;gBAChF,kFAAkF;gBAClF,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC/C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC3C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;gBAClF,IAAI,eAAe,EAAE,CAAC;oBACpB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC;oBACxC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC/B,CAAC;gBACD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAA+C,CAAC;YACrE,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED,sBAAsB;QACpB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QACD,IAAK,IAAI,CAAC,MAAkC,CAAC,WAAW,EAAE,CAAC;YACxD,IAAI,CAAC,MAAkC,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;QACpE,CAAC;IACH,CAAC;IAED,wBAAwB;QACtB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,yEAAyE;gBACzE,sEAAsE;gBACtE,uEAAuE;gBACvE,+DAA+D;gBAC/D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED,gBAAgB,CAAC,KAAe,EAAE,KAAa;QAC7C,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,sEAAsE;YACtE,2EAA2E;YAC3E,4EAA4E;YAC5E,2DAA2D;YAC3D,EAAE;YACF,uEAAuE;YACvE,mFAAmF;YACnF,+EAA+E;YAC/E,oFAAoF;YACpF,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC;gBACzC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC9B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;gBAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC9B,CAAC;YACD,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YACpI,MAAM,QAAQ,GAAG,kBAAkB,CAAC,aAAa,CAC/C,IAAI,CAAC,YAAY,EACjB,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAC5D,GAAG,EACH,IAAI,CACL,CAAC;YACF,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,YAAsB,CAAC,CAAC;YAC/C,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;YAC9B,qFAAqF;YACrF,+EAA+E;YAC/E,gFAAgF;YAChF,6DAA6D;YAC7D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChG,0EAA0E;YAC1E,0EAA0E;YAC1E,uEAAuE;YACvE,0EAA0E;YAC1E,mCAAmC;YACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,QAAQ,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACtC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;QACpB,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,GAAG,GACN,KAA4B,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAG,KAA4B,CAAC,YAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;YAChH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAChD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACjC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAK,IAAI,CAAC,MAAkC,CAAC,WAAW,EAAE,CAAC;gBACxD,IAAI,CAAC,MAAkC,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;YACpE,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,4EAA4E;YAC5E,0EAA0E;YAC1E,0EAA0E;YAC1E,uEAAuE;YACvE,gEAAgE;YAChE,MAAM,QAAQ,GAAI,KAA4B,CAAC,YAAY,CAAC;YAC5D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,YAAY;QACV,+EAA+E;QAC/E,2EAA2E;QAC3E,qDAAqD;QACrD,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,CAAC;QACD,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,kFAAkF;IAClF,uEAAuE;IACvE,8EAA8E;IAC9E,+EAA+E;IAC/E,gFAAgF;IAChF,8EAA8E;IAC9E,gFAAgF;IAChF,gBAAgB;IACR,oBAAoB;QAC1B,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,IAAI;gBACF,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;gBACrB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;gBAC5B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC9B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;gBACpB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;gBACzB,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;YACD,IAAI;gBACF,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACrB,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;SACF,CAAC;IACJ,CAAC;IAED,eAAe,CAAC,KAAgB;QAC9B,OAAO,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAEO,mBAAmB,CAAC,KAAa;QACvC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,kFAAkF;IAClF,8EAA8E;IAC9E,0EAA0E;IAC1E,8EAA8E;IAC9E,kFAAkF;IAClF,+DAA+D;IACvD,gBAAgB;QACtB,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC;QAC3F,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;YACvD,IAAI,CAAC,MAAM,GAAG;gBACZ,KAAK,EAAE,UAAU;gBACjB,wEAAwE;gBACxE,iDAAiD;gBACjD,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAgC,EAAE,UAAU,CAAC;aAC/F,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAA+C,CAAC;QACrE,CAAC;IACH,CAAC;IAED,gBAAgB;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,uDAAuD;IACvD,iFAAiF;IACjF,+EAA+E;IAC/E,gFAAgF;IAChF,8EAA8E;IAC9E,6EAA6E;IAC7E,wCAAwC;IAExC,cAAc;QACZ,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,2FAA2F;QAC3F,mFAAmF;QACnF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,qFAAqF;QACrF,wFAAwF;QACxF,sFAAsF;QACtF,sBAAsB;QACtB,EAAE;QACF,yFAAyF;QACzF,2FAA2F;QAC3F,oFAAoF;QACpF,sFAAsF;QACtF,yFAAyF;QACzF,yFAAyF;QACzF,2FAA2F;QAC3F,mFAAmF;QACnF,MAAM,SAAS,GAAI,IAAI,CAAC,SAAiD,EAAE,UAAkC,CAAC;QAC9G,6FAA6F;QAC7F,2FAA2F;QAC3F,4FAA4F;QAC5F,mCAAmC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAoC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7H,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YACtH,sFAAsF;YACtF,sFAAsF;YACtF,kFAAkF;YAClF,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,yFAAyF;QACzF,iFAAiF;QACjF,2EAA2E;QAC3E,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC;QACD,6EAA6E;QAC7E,4EAA4E;QAC5E,4EAA4E;QAC5E,6EAA6E;QAC7E,8EAA8E;QAC9E,uEAAuE;QACvE,+BAA+B;QAC/B,EAAE;QACF,6EAA6E;QAC7E,4EAA4E;QAC5E,gFAAgF;QAChF,yEAAyE;QACzE,iFAAiF;QACjF,gFAAgF;QAChF,iFAAiF;QACjF,iFAAiF;QACjF,gCAAgC;QAChC,EAAE;QACF,0EAA0E;QAC1E,+EAA+E;QAC/E,+EAA+E;QAC/E,qEAAqE;QACrE,EAAE;QACF,oFAAoF;QACpF,wFAAwF;QACxF,sFAAsF;QACtF,qFAAqF;QACrF,8EAA8E;QAC9E,oFAAoF;QACpF,mDAAmD;QACnD,EAAE;QACF,0FAA0F;QAC1F,qFAAqF;QACrF,EAAE;QACF,2FAA2F;QAC3F,2FAA2F;QAC3F,wFAAwF;QACxF,uFAAuF;QACvF,kEAAkE;QAClE,EAAE;QACF,uFAAuF;QACvF,kFAAkF;QAClF,+EAA+E;QAC/E,oFAAoF;QACpF,wFAAwF;QACxF,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM,CAAC,CAAC;YACzE,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,wFAAwF;QACxF,iFAAiF;QACjF,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;QACD,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACjC,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;YAChC,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/B,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,eAAe;QACb,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;QAClC,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,oFAAoF;QACpF,2FAA2F;QAC3F,qFAAqF;QACrF,wFAAwF;QACxF,2BAA2B;QAC3B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC;QACzC,CAAC;QACD,oFAAoF;QACpF,iFAAiF;QACjF,2EAA2E;QAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,aAAa;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3B,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC;QACvD,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,MAAM,YAAY,GAAI,IAAI,CAAC,SAAiD,EAAE,MAAM,CAAC;QACrF,OAAO,CACL,eAAe,CAAC,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,IAAI,eAAe,CAAC,YAAY,CAAC,IAAI,QAAQ,CAC5H,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF,kFAAkF;IAClF,gFAAgF;IAChF,6DAA6D;IAC7D,EAAE;IACF,iFAAiF;IACjF,mFAAmF;IACnF,iFAAiF;IACjF,iFAAiF;IACjF,sFAAsF;IACtF,gFAAgF;IAChF,eAAe,CAAC,MAAM,GAAG,KAAK;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,UAAU,CAAC,MAAM,GAAG,KAAK;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAgD,CAAC;QAClE,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAgB,CAAC,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1D,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QACD,0FAA0F;QAC1F,2FAA2F;QAC3F,gFAAgF;QAChF,IAAI,IAAI,CAAC,iBAAiB,EAAE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/D,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,kFAAkF;YAClF,mFAAmF;YACnF,yFAAyF;YACzF,kFAAkF;YAClF,wFAAwF;YACxF,6FAA6F;YAC7F,2FAA2F;YAC3F,mFAAmF;YACnF,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;gBACzB,MAAM,eAAe,GAAG,CAAC,CAAW,EAAU,EAAE;oBAC9C,IAAI,CAAC,CAAC,CAAC,YAAY,kBAAkB,CAAC,EAAE,CAAC;wBACvC,OAAO,MAAM,CAAE,CAAuC,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;oBAC/E,CAAC;oBACD,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;oBAC1F,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;gBAC/F,CAAC,CAAC;gBACF,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBACnE,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,IAAI,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,gCAAgC,CAAC,CAAC;YACpG,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,cAAc,EAAE,CAAC;gBAChC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,IAAI,MAAM,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC;gBACzC,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,CAAgB;QAC7B,IAAI,IAAI,GAAa,IAAI,CAAC;QAC1B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC;QAClG,MAAM,IAAI,GAAG,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzF,OAAO,IAAI,aAAa,CACtB,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,MAAM,GAAG,IAAI;YAChE,6FAA6F,GAAG,CAAC,CAAC,OAAO,GAAG,wBAAwB,CACvI,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,iBAAiB;QACf,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC;QACzE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,MAAM,EAAE,CAAC;YAC3H,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,cAAc,EAAE,CAAC;oBAChC,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,YAAY,aAAa,EAAE,CAAC;oBAC/B,OAAO,CAAC,CAAC;gBACX,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACpE,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACvD,CAAC;QACD,iEAAiE;QACjE,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,kBAAkB,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;;;OAQG;IACH,iBAAiB;QACf,OAAO,CACL,IAAI,CAAC,KAAK,KAAK,QAAQ;YACvB,IAAI,CAAC,WAAW,KAAK,QAAQ;YAC7B,CAAC,IAAI,CAAC,UAAU;YAChB,CAAC,IAAI,CAAC,SAAS;YACf,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,qBAAqB;YAChD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAChE,CAAC;IACJ,CAAC;IAED,gFAAgF;IAChF;;;;;;OAMG;IACH,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,kBAAkB,CAAC;YACxB,SAAS,EAAE,SAAS;YACpB,UAAU,EAAE,IAAI,CAAC,KAAK;YACtB,SAAS,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW;YACtE,SAAS,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS;YACzC,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnF,IAAI,QAAQ,GAAG,kBAAkB,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,0EAA0E;QAC1E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC;YACH,aAAa,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,4CAA4C,GAAG,KAAK,GAAG,+BAA+B,CAAC,CAAC;QACjJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,YAAY,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YAChC,iFAAiF;YACjF,kFAAkF;YAClF,+EAA+E;YAC/E,wEAAwE;YACxE,EAAE;YACF,gFAAgF;YAChF,8EAA8E;YAC9E,8EAA8E;YAC9E,kFAAkF;YAClF,uBAAuB;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5G,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,IAAI,IAAI,KAAK,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACrE,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,yEAAyE;YACzE,oEAAoE;YACpE,sEAAsE;YACtE,wEAAwE;YACxE,yEAAyE;YACzE,OAAO,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACnC,8EAA8E;YAC9E,8EAA8E;YAC9E,wEAAwE;YACxE,wEAAwE;YACxE,oEAAoE;YACpE,uCAAuC;YACvC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;QACvD,CAAC;QACD,0EAA0E;QAC1E,oEAAoE;QACpE,8DAA8D;QAC9D,EAAE;QACF,4EAA4E;QAC5E,+EAA+E;QAC/E,gFAAgF;QAChF,2EAA2E;QAC3E,kFAAkF;QAClF,kEAAkE;QAClE,gFAAgF;QAChF,gFAAgF;QAChF,gFAAgF;QAChF,gFAAgF;QAChF,2EAA2E;QAC3E,6CAA6C;QAC7C,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YAC3D,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,gBAAgB,CAAC,IAAI,CAAC,YAAsB,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9G,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACH,eAAe;QACb,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7F,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,eAAe;QACb,IAAI,KAAgB,CAAC;QACrB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,qFAAqF;YACrF,iFAAiF;YACjF,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;YAC7B,CAAC;YACD,KAAK,GAAG,KAAK,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;YAChC,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,IAAI,CAAC,MAAM,CAAC;YACrB,CAAC;YACD,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,UAAU,GAAI,IAAI,CAAC,MAAkC,EAAE,KAAK,CAAC;QACnE,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,KAA4B,EAAE,UAAoB,CAAC;aAChG,CAAC;QACJ,CAAC;QACD,4EAA4E;QAC5E,oFAAoF;QACpF,qFAAqF;QACrF,sFAAsF;QACtF,iEAAiE;QACjE,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC;QACxF,CAAC;QACD,8EAA8E;QAC9E,+EAA+E;QAC/E,iEAAiE;QACjE,0EAA0E;QAC1E,4EAA4E;QAC5E,qEAAqE;QACrE,EAAE;QACF,8EAA8E;QAC9E,yEAAyE;QACzE,2EAA2E;QAC3E,4EAA4E;QAC5E,6EAA6E;QAC7E,2EAA2E;QAC3E,6EAA6E;QAC7E,4EAA4E;QAC5E,0EAA0E;QAC1E,+EAA+E;QAC/E,gFAAgF;QAChF,iFAAiF;QACjF,iDAAiD;QACjD,EAAE;QACF,mFAAmF;QACnF,+EAA+E;QAC/E,iCAAiC;QACjC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC;QAC3F,IAAI,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;YACpB,kFAAkF;YAClF,iFAAiF;YACjF,sCAAsC;YACtC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;gBAClC,OAAQ,CAAwB,CAAC,cAAc,EAAE,CAAC;YACpD,CAAC,CAAC,CAAC;QACL,CAAC;QACD,8EAA8E;QAC9E,mFAAmF;QACnF,oEAAoE;QACpE,EAAE;QACF,6EAA6E;QAC7E,mFAAmF;QACnF,2EAA2E;QAC3E,kFAAkF;QAClF,qFAAqF;QACrF,uEAAuE;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC;QAC3G,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,EAAE,KAA4B,EAAE,UAAU,CAAC,EAAE,CAAC;IAC7G,CAAC;IAED,iFAAiF;IACjF,0EAA0E;IAC1E,sEAAsE;IACtE,6EAA6E;IAC7E,aAAa;IACb,qBAAqB;QACnB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,4FAA4F;QAC5F,+FAA+F;QAC/F,6FAA6F;QAC7F,8FAA8F;QAC9F,wFAAwF;QACxF,kBAAkB;QAClB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1G,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC;QAC9H,CAAC;QACD,2EAA2E;QAC3E,8EAA8E;QAC9E,8EAA8E;QAC9E,4EAA4E;QAC5E,8DAA8D;QAC9D,MAAM,YAAY,GAAe,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAA8B,EAAE,CAAC;QAC/C,KAAK,MAAM,EAAE,IAAI,YAAY,EAAE,CAAC;YAC9B,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;gBAChC,MAAM,CAAC,GAAG,KAA2B,CAAC;gBACtC,8EAA8E;gBAC9E,gFAAgF;gBAChF,wBAAwB;gBACxB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;gBACxC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;QACD,OAAO;YACL,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,MAAM;YACf,gBAAgB,EAAE,aAAa;SAChC,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,KAAK;YAChD,OAAQ,KAA4B,CAAC,cAAc,EAAE,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,6FAA6F;QAC7F,IAAI,cAAc,EAAE,EAAE,CAAC;YACrB,oBAAoB,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,OAAO;YACL,WAAW,EAAE,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,KAAK;YACvB,SAAS,EAAE,QAAQ;YACnB,gBAAgB,EAAG,IAAI,CAAC,MAAkC,CAAC,gBAAgB,IAAI,aAAa;SAC7F,CAAC;IACJ,CAAC;IAED,gBAAgB;QACd,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,YAAY,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/F,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACtB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;gBAC3B,OAAQ,CAAwB,CAAC,cAAc,EAAE,CAAC;YACpD,CAAC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QACrB,IAAK,IAAI,CAAC,MAAkC,CAAC,WAAW,EAAE,CAAC;YACzD,OAAO;gBACL,WAAW,EAAE,QAAQ;gBACrB,WAAW,EAAE,IAAI,CAAC,KAAK;gBACvB,SAAS,EAAE,QAAQ;gBACnB,gBAAgB,EAAG,IAAI,CAAC,MAAkC,CAAC,gBAAgB,IAAI,aAAa;aAC7F,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,0DAA0D;IAC1D,2EAA2E;IAC3E,+EAA+E;IAC/E,8EAA8E;IAC9E,iFAAiF;IACjF,iDAAiD;IAEjD,YAAY,CAAC,OAAe,EAAE,KAAyC,EAAE,MAAc;QACrF,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACnE,CAAC;QACD,qFAAqF;QACrF,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACrF,CAAC;QACD,8FAA8F;QAC9F,qFAAqF;QACrF,IAAI,IAAI,CAAC,WAAW,KAAK,iBAAiB,EAAE,CAAC;YAC3C,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAC9H,CAAC;QACD,gGAAgG;QAChG,iGAAiG;QACjG,kGAAkG;QAClG,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3B,MAAM,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,oFAAoF;QACpF,mFAAmF;QACnF,qFAAqF;QACrF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QACxF,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACzC,wFAAwF;QACxF,sFAAsF;QACtF,mFAAmF;QACnF,uFAAuF;QACvF,iFAAiF;QACjF,8FAA8F;QAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,SAAgD,CAAC;QACnE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC5C,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7E,qFAAqF;YACrF,wFAAwF;YACxF,mFAAmF;YACnF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACvF,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,IAAI,GAAa,IAAI,CAAC;gBAC1B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;oBACnB,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;gBACrB,CAAC;gBACD,MAAM,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3I,CAAC;QACH,CAAC;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,iFAAiF;QACjF,mFAAmF;QACnF,oFAAoF;QACpF,oFAAoF;QACpF,kFAAkF;QAClF,sFAAsF;QACtF,gFAAgF;QAChF,0DAA0D;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,SAAgD,CAAC;QAClE,MAAM,OAAO,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACrD,sFAAsF;YACtF,oFAAoF;YACpF,wFAAwF;YACxF,sCAAsC;YACtC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,CAAC;YAClF,OAAO,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QACD,uFAAuF;QACvF,sFAAsF;QACtF,mFAAmF;QACnF,uFAAuF;QACvF,qFAAqF;QACrF,oFAAoF;QACpF,sFAAsF;QACtF,+EAA+E;QAC/E,EAAE;QACF,sFAAsF;QACtF,kCAAkC;QAClC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACnC,IAAI,GAAG,EAAE,CAAC;gBACR,OAAO,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QACD,qFAAqF;QACrF,0FAA0F;QAC1F,UAAU;QACV,IAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;QACD,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YACnB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAC1D,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACzD,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACxD,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED,mBAAmB,CAAC,OAAe,EAAE,KAAyC,EAAE,MAAc;QAC5F,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC;QAC9B,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACrD,CAAC;QAED,4FAA4F;QAC5F,qFAAqF;QACrF,wFAAwF;QACxF,mCAAmC;QACnC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,SAAS,GAAG,CAAC,GAAa,CAAC,CAAC;YACjC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAChE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,4EAA4E;YAC5E,2EAA2E;YAC3E,6EAA6E;YAC7E,4EAA4E;YAC5E,uEAAuE;YACvE,mEAAmE;YACnE,4DAA4D;YAC5D,8DAA8D;YAC9D,EAAE;YACF,2EAA2E;YAC3E,8EAA8E;YAC9E,6EAA6E;YAC7E,6EAA6E;YAC7E,wCAAwC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACzC,OAAQ,YAAY,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAc,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1G,CAAC;QACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;gBACpD,8EAA8E;gBAC9E,mEAAmE;gBACnE,sFAAsF;gBACtF,gEAAgE;gBAChE,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;gBACjC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtJ,OAAO,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,OAAO,GAAG,IAAI,CAAC;YACxE,CAAC;YACD,8EAA8E;YAC9E,gFAAgF;YAChF,+EAA+E;YAC/E,4EAA4E;YAC5E,kFAAkF;YAClF,+EAA+E;YAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAClC,qFAAqF;YACrF,qFAAqF;YACrF,uEAAuE;YACvE,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;YAC/G,CAAC;YACD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACjH,OAAO,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,OAAO,GAAG,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;QAChH,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,mBAAmB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;QACtG,CAAC;QACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,OAAO,CACL,CAAC;gBACD,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,UAAU;gBACV,GAAG;gBACH,kBAAkB;gBAClB,oBAAoB,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;gBACtC,IAAI;gBACJ,OAAO;gBACP,GAAG,CACJ,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,kBAAkB,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;QACjH,CAAC;QACD,sFAAsF;QACtF,oFAAoF;QACpF,OAAO,CACL,CAAC;YACD,GAAG;YACH,OAAO;YACP,OAAO;YACP,UAAU;YACV,SAAS,CAAC,IAAI,CAAC;YACf,IAAI;YACJ,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC;YAC3B,IAAI;YACJ,OAAO;YACP,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,kBAAkB,CAAC,OAAe,EAAE,KAAyC,EAAE,MAAc;QAC3F,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,gFAAgF;QAChF,gFAAgF;QAChF,+EAA+E;QAC/E,2CAA2C;QAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACrD,CAAC;QAED,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7G,wFAAwF;YACxF,2FAA2F;YAC3F,qFAAqF;YACrF,4FAA4F;YAC5F,4FAA4F;YAC5F,uFAAuF;YACvF,8EAA8E;YAC9E,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,IAAI,KAAK,QAAQ,IAAK,IAAI,CAAC,SAAiD,EAAE,UAAU,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5I,OAAO,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;YAChE,CAAC;YACD,+EAA+E;YAC/E,6FAA6F;YAC7F,qCAAqC;YACrC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;YAChF,OAAO,CACL,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC,IAAI,IAAI,QAAQ,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,cAAc,GAAG,OAAO,GAAG,KAAK,CAC1H,CAAC;QACJ,CAAC;QAED,sFAAsF;QACtF,iFAAiF;QACjF,6DAA6D;QAC7D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC3E,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;QACnI,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;gBACxC,mFAAmF;gBACnF,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC3F,OAAO,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,OAAO,CACL,CAAC;gBACD,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,UAAU;gBACV,GAAG;gBACH,6BAA6B;gBAC7B,OAAO;gBACP,IAAI;gBACJ,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;gBACnB,IAAI;gBACJ,OAAO;gBACP,GAAG,CACJ,CAAC;QACJ,CAAC;QAED,6EAA6E;QAC7E,8EAA8E;QAC9E,0DAA0D;QAC1D,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;YACxC,OAAO,gBAAgB,CAAC,CAAC,EAAE,IAAI,IAAI,QAAQ,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;QACpE,OAAO,CACL,CAAC;YACD,GAAG;YACH,OAAO;YACP,OAAO;YACP,UAAU;YACV,SAAS,CAAC,SAAS,CAAC;YACpB,eAAe;YACf,OAAO;YACP,IAAI;YACJ,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;YACnB,IAAI;YACJ,OAAO;YACP,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,iBAAiB,CAAC,OAAe,EAAE,KAAyC,EAAE,MAAc;QAC1F,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACrD,CAAC;QAED,4EAA4E;QAC5E,qFAAqF;QACrF,mFAAmF;QACnF,yFAAyF;QACzF,qFAAqF;QACrF,wEAAwE;QACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,2BAA2B,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACnH,CAAC;QAED,uEAAuE;QACvE,wFAAwF;QACxF,wFAAwF;QACxF,2EAA2E;QAC3E,yFAAyF;QACzF,4DAA4D;QAC5D,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAC9E,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACjD,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,OAAO,GAAG,OAAO,GAAG,eAAe,GAAG,OAAO,GAAG,KAAK,CAAC;QAC1E,oFAAoF;QACpF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,GAAG,IAAI,UAAU,CAAE,KAA4B,CAAC,YAAY,CAAC,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;QACnH,CAAC;QACD,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,OAAO,GAAG,GAAG,CAAC;QAChC,OAAO,GAAG,CAAC;IACb,CAAC;IAED,mBAAmB,CAAC,OAAe,EAAE,KAAyC,EAAE,MAAc;QAC5F,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACtB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;gBAC3B,OAAQ,CAAwB,CAAC,SAAS;oBACxC,CAAC,CAAE,CAAwB,CAAC,SAAS,CAAC,CAAC,CAAC;oBACxC,CAAC,CAAE,CAAwB,CAAC,YAAY,CAAC;YAC7C,CAAC,CAAC;YACJ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;QAErB,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACxB,OAAO,IAAI,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACrD,CAAC;QAED,qFAAqF;QACrF,oFAAoF;QACpF,qFAAqF;QACrF,iDAAiD;QACjD,OAAO,CACL,CAAC;YACD,GAAG;YACH,OAAO;YACP,OAAO;YACP,KAAK;YACL,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;YACzD,CAAC;YACD,IAAI;YACJ,OAAO;YACP,GAAG,CACJ,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,EAAE;IACF,2EAA2E;IAC3E,4CAA4C;IAC5C,EAAE;IACF,gFAAgF;IAChF,0EAA0E;IAC1E,+EAA+E;IAC/E,0EAA0E;IAC1E,+EAA+E;IAC/E,8EAA8E;IAC9E,+EAA+E;IAC/E,yBAAyB;IACzB,EAAE;IACF,4EAA4E;IAC5E,2EAA2E;IAC3E,8EAA8E;IAC9E,wDAAwD;IACxD,EAAE;IACF,gFAAgF;IAChF,+EAA+E;IAC/E,gFAAgF;IAChF,IAAI,IAAI;QACN,yFAAyF;QACzF,6FAA6F;QAC7F,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACzD,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpC,qFAAqF;YACrF,mEAAmE;YACnE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC9D,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;YACxD,CAAC;YACD,OAAO,IAAI,CAAC,OAAO,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,EAAE,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACH,kBAAkB,CAAC,MAAkB;QACnC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACvG,IAAI,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAChE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,wBAAwB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvF,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,IAAI,GAAG,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAC/G,CAAC;IAED;;;;;;;;;;;OAWG;IACH,iBAAiB;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;QACvB,IAAI,GAAG,GAAuB,CAAC,EAAE,SAAS,CAAC;QAC3C,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAC3C,GAAG,GAAG,mDAAmD,CAAC;QAC5D,CAAC;aAAM,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACpF,GAAG,GAAG,cAAc,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,+BAA+B,CAAC;QACnG,CAAC;QACD,8FAA8F;QAC9F,gGAAgG;QAChG,MAAM,IAAI,GAAG,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,GAAG,uBAAuB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5K,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,IAAI,GAAG,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAChH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,SAAS;QACP,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzG,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YAC1B,OAAO,KAAK,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACpI,CAAC;IAED,gGAAgG;IAChG,gBAAgB;QACd,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,iBAAiB,GAAG,KAAK,GAAG,yBAAyB,CAAC;QACxH,MAAM,IAAI,GAAG,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACjH,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,IAAI,GAAG,kBAAkB,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;IAChH,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,IAAc;QAC9B,IAAI,IAAI,YAAY,kBAAkB,EAAE,CAAC;YACvC,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAE,IAA0C,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC;QACrF,OAAO;YACL,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,GAAG;YACd,UAAU,EAAE,CAAE,IAAuC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;YAC7E,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,WAAW,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,gCAAgC;SACjE,CAAC;IACJ,CAAC;IAED,eAAe;QACb,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;QACjF,MAAM,CAAC,GAAgB;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAiB,CAAC,CAAC,CAAC,YAAY;YACjE,oFAAoF;YACpF,wFAAwF;YACxF,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YAC9B,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS;YACzC,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,sFAAsF;YACtF,wEAAwE;YACxE,SAAS,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS;YACrE,SAAS,EAAE,IAAI,CAAC,MAAM,KAAK,UAAU;SACtC,CAAC;QACF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAClC,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC;YACvB,oFAAoF;YACpF,sFAAsF;YACtF,wBAAwB;YACxB,MAAM,MAAM,GAAgD,EAAE,CAAC;YAC/D,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,iEAAiE;gBACjE,uEAAuE;gBACvE,iEAAiE;gBACjE,mEAAmE;gBACnE,mEAAmE;gBACnE,MAAM,UAAU,GAAa,EAAE,CAAC;gBAChC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACjC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAC9B,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;4BACnC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;wBAC1B,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;oBAC/B,MAAM,CAA8B,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,IAAI;wBACjF,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;4BACtC,OAAO,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC;wBAC1B,CAAC,CAAC,CAAC;wBACH,mEAAmE;wBACnE,+DAA+D;wBAC/D,mEAAmE;wBACnE,sEAAsE;wBACtE,gDAAgD;wBAChD,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBAC9D,CAAC,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,sFAAsF;gBACtF,kFAAkF;gBAClF,sBAAsB;gBACtB,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;oBACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,kBAAkB,IAAI,EAAE,EAAE,CAAC;wBAClD,MAAM,CAA8B,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBACzD,CAAC;gBACH,CAAC;gBACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClC,MAAM,CAA8B,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;YACD,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC;YAC5B,8FAA8F;YAC9F,8FAA8F;YAC9F,6FAA6F;YAC7F,4FAA4F;YAC5F,iDAAiD;YACjD,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC3B,CAAC,CAAC,WAAW,GAAG,uCAAuC,GAAG,YAAY,CAAC,IAAI,CAAC,YAAsB,CAAC,GAAG,uCAAuC,CAAC;YAChJ,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;gBAChC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;gBACrB,0EAA0E;gBAC1E,uDAAuD;gBACvD,yEAAyE;gBACzE,0EAA0E;gBAC1E,2EAA2E;gBAC3E,2EAA2E;gBAC3E,kEAAkE;gBAClE,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,YAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5G,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;gBACnC,gFAAgF;gBAChF,mEAAmE;gBACnE,iFAAiF;gBACjF,6CAA6C;gBAC7C,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;gBACnB,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;gBACrE,IAAI,IAAI,EAAE,CAAC;oBACT,CAAC,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClD,oFAAoF;YACpF,qFAAqF;YACrF,gEAAgE;YAChE,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,IAAI,CAAC;YACvC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC3B,8EAA8E;gBAC9E,+EAA+E;gBAC/E,iFAAiF;gBACjF,0BAA0B;gBAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;gBACjC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC;gBAClB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;gBACnB,CAAC,CAAC,KAAK,GAAI,KAAmB,CAAC,GAAG,CAAC,UAAU,CAAC;oBAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;wBAC7C,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;oBAC1B,CAAC;oBACD,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC7D,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAClD,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACjC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;YACrB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACnC,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC;YACrB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAY,CAAC,CAAC,CAAE,IAAI,CAAC,SAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAChH,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC;YACd,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,yDAAyD;IACzD,sEAAsE;IACtE,8EAA8E;IAC9E,+EAA+E;IAC/E,4EAA4E;IAC5E,iFAAiF;IACjF,kDAAkD;IAElD,mFAAmF;IACnF,oFAAoF;IACpF,0DAA0D;IAC1D,MAAM,CAAC,gBAAgB,CAAC,QAAqB,EAAE,IAAY,EAAE,MAAuB;QAClF,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,iFAAiF;YACjF,iFAAiF;YACjF,iFAAiF;YACjF,8EAA8E;YAC9E,yBAAyB;YACzB,EAAE;YACF,sFAAsF;YACtF,0FAA0F;YAC1F,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC/F,IAAI,IAAI,EAAE,CAAC;oBACT,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,kBAAkB,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC;QACD,0FAA0F;QAC1F,uFAAuF;QACvF,uFAAuF;QACvF,8EAA8E;QAC9E,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,kBAAkB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACtF,CAAC;QACD,+EAA+E;QAC/E,oFAAoF;QACpF,mFAAmF;QACnF,sFAAsF;QACtF,sFAAsF;QACtF,gDAAgD;QAChD,EAAE;QACF,gFAAgF;QAChF,kFAAkF;QAClF,+EAA+E;QAC/E,iFAAiF;QACjF,gFAAgF;QAChF,qEAAqE;QACrE,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,qFAAqF;QACrF,qFAAqF;QACrF,uFAAuF;QACvF,uBAAuB;QACvB,IAAI,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;YACrE,MAAM,IAAI,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACzE,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,IAAI,QAAQ,CAAC,GAAG,gBAAgB,CAAC;YAC9E,OAAO,IAAI,CAAC;QACd,CAAC;QACD,yFAAyF;QACzF,4FAA4F;QAC5F,8FAA8F;QAC9F,6FAA6F;QAC7F,6FAA6F;QAC7F,sFAAsF;QACtF,uFAAuF;QACvF,wFAAwF;QACxF,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YAC5D,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,kBAAkB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAClC,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,QAAQ,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;YAClC,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,kBAAkB,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,QAAqB,EAAE,IAAY,EAAE,MAAuB;QAC/E,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qFAAqF;IACrF,2FAA2F;IAC3F,2FAA2F;IAC3F,0FAA0F;IAC1F,2FAA2F;IAC3F,uFAAuF;IACvF,0FAA0F;IAC1F,kCAAkC;IAClC,MAAM,CAAC,oBAAoB,CAAC,QAAqB,EAAE,IAAmB,EAAE,IAAY,EAAE,MAAuB;QAC3G,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;QACrF,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACjG,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gFAAgF;IAChF,qFAAqF;IACrF,iFAAiF;IACjF,gFAAgF;IAChF,qFAAqF;IACrF,qFAAqF;IACrF,6BAA6B;IAC7B,MAAM,CAAC,gBAAgB,CAAC,QAAqB,EAAE,IAAY,EAAE,MAAuB;QAClF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAA4B,EAAE,IAAY,EAAE,MAAuB;QAC1F,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC;YACxB,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1H,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,wBAAwB,CAAC;QAC7C,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,2FAA2F;IAC3F,wFAAwF;IACxF,6FAA6F;IAC7F,4FAA4F;IAC5F,6FAA6F;IAC7F,uFAAuF;IACvF,oEAAoE;IACpE,MAAM,CAAC,gBAAgB,CACrB,QAAqB,EACrB,IAAY,EACZ,MAAuB,EACvB,MAAc,QAAQ,CAAC,SAAS;QAEhC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC;QACjC,MAAM,IAAI,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC9C,qFAAqF;QACrF,oBAAoB;QACpB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,qBAAqB,CAC1B,QAAqB,EACrB,OAKC,EACD,MAAuB;IACvB,mFAAmF;IACnF,OAAe,QAAQ,CAAC,IAAI;QAE5B,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC3C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAChC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC;QAC1C,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uFAAuF;IACvF,mFAAmF;IACnF,yFAAyF;IACzF,uFAAuF;IACvF,wFAAwF;IACxF,kFAAkF;IAC1E,mBAAmB,CAAC,IAAc,EAAE,QAA2B;QACrE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,sFAAsF;QACtF,iFAAiF;QACjF,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,sFAAsF;QACtF,sFAAsF;QACtF,oFAAoF;QACpF,IAAI,CAAC,MAAM,GAAG;YACZ,WAAW,EAAE,QAAQ;YACrB,WAAW,EAAE,IAAI,CAAC,KAAK,EAAE;YACzB,gBAAgB,EAAE,aAAa;SAChC,CAAC;QACF,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,qBAAqB,CAAC,QAAqB,EAAE,IAAY,EAAE,MAAuB;QACvF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAEtD,oFAAoF;QACpF,wFAAwF;QACxF,mFAAmF;QACnF,wFAAwF;QACxF,wFAAwF;QACxF,gDAAgD;QAChD,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM;gBAC5B,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC9B,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;YACjH,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0FAA0F;QAC1F,2FAA2F;QAC3F,0FAA0F;QAC1F,yFAAyF;QACzF,yFAAyF;QACzF,sFAAsF;QACtF,uFAAuF;QACvF,qFAAqF;QACrF,2FAA2F;QAC3F,sFAAsF;QACtF,mFAAmF;QACnF,qFAAqF;QACrF,EAAE;QACF,2FAA2F;QAC3F,0FAA0F;QAC1F,4FAA4F;QAC5F,8FAA8F;QAC9F,oFAAoF;QACpF,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,aAAa,GAAG,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACrF,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1H,CAAC;QAED,2FAA2F;QAC3F,2FAA2F;QAC3F,uFAAuF;QACvF,uCAAuC;QACvC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,SAAS,KAAK,SAAS,CAAC;QACzF,IAAI,QAAQ,CAAC,SAAS,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAChD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC9E,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;gBACtB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;gBAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAA+B,CAAC;gBAC/C,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;gBACrB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC1B,IAAI,CAAC,SAAS,GAAI,GAAoC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9F,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;YACtC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,qFAAqF;YACrF,wFAAwF;YACxF,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvE,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC3E,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACjF,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS;YACjC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;gBACpB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC,CAAC;YACJ,CAAC,CAAC,MAAM,CAAC;QAEX,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,QAAqB,EAAE,IAAY,EAAE,MAAuB;QACpF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAI,QAAQ,CAAC,KAAgB,IAAI,EAAE,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,oBAAoB,CAAC,QAAqB,EAAE,IAAY,EAAE,MAAuB;QACtF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAEzC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,gFAAgF;QAChF,wBAAwB;QACxB,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACf,+EAA+E;YAC/E,oBAAoB;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC5C,uEAAuE;gBACvE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAClE,IAAI,QAAQ,EAAE,CAAC;oBACb,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,sFAAsF;QACtF,uFAAuF;QACvF,wFAAwF;QACxF,yFAAyF;QACzF,uFAAuF;QACvF,yFAAyF;QACzF,gDAAgD;QAChD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,GAAG,qBAAqB,EAAE,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,6EAA6E;QAC7E,yEAAyE;QACzE,4EAA4E;QAC5E,uEAAuE;QACvE,sDAAsD;QACtD,EAAE;QACF,uFAAuF;QACvF,uFAAuF;QACvF,mFAAmF;QACnF,wFAAwF;QACxF,mFAAmF;QACnF,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC3F,uFAAuF;QACvF,sFAAsF;QACtF,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAClE,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC;YAC1B,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC;YAChC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC;YAC7B,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACxB,qDAAqD;YACrD,QAAQ,CAAC,UAAU,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC5F,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACnE,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACxF,CAAC;YACH,CAAC;YACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,QAAqB,EAAE,IAAY,EAAE,MAAuB;QACpF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,IAAI,IAAI,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,iFAAiF;QACjF,oBAAoB;QACpB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QACA,KAAgC,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC;YACzD,0EAA0E;YAC1E,yEAAyE;YACzE,yEAAyE;YACzE,4EAA4E;YAC5E,wEAAwE;YACxE,0EAA0E;YAC1E,4EAA4E;YAC5E,MAAM,KAAK,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,IAAI,IAAI,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9F,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,gBAAgB,CAAI,OAAgB,EAAE,GAAoC;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAQ,CAAC;QAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAc,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE;YACjE,IAAI,CAAC;gBACH,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAuB,CAAC;YACrG,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACZ,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,CAAC;YACH,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;gBACZ,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,iDAAiD;IACjD,iFAAiF;IACjF,0EAA0E;IAC1E,8EAA8E;IAC9E,gFAAgF;IAChF,+EAA+E;IAC/E,iFAAiF;IACjF,wDAAwD;IAExD,MAAM,KAAK,WAAW;QACpB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,IAAY,EAAE,MAAuB;QACxD,OAAO,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,KAAc,EAAE,IAAY,EAAE,IAAY,EAAE,MAAuB;QACtF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAe,EAAE,IAAY,EAAE,MAAuB;QACjE,gFAAgF;QAChF,2EAA2E;QAC3E,qFAAqF;QACrF,kEAAkE;QAClE,IAAI,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,kBAAkB,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAuB,CAAC;QACrF,CAAC;QACD,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YACzB,MAAkC,CAAC,KAAK;YACxC,MAAkC,CAAC,UAAU,EAC9C,CAAC;YACD,MAAM,EAAE,GAAG,MAAiC,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAA6B,CAAC,CAAC;YACjF,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,UAAsB,CAAC;YACvC,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,KAAe,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,MAAM;YACN,OAAO,MAAM,KAAK,QAAQ;YACzB,MAAkC,CAAC,KAAK;YACxC,MAAkC,CAAC,MAAM,KAAK,SAAS;YACxD,OAAQ,MAAkC,CAAC,MAAM,KAAK,QAAQ,EAC9D,CAAC;YACD,MAAM,EAAE,GAAG,MAAiC,CAAC;YAC7C,+EAA+E;YAC/E,iFAAiF;YACjF,kFAAkF;YAClF,eAAe;YACf,IAAI,EAAE,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,kBAAkB,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1D,CAAC;YACD,8EAA8E;YAC9E,gFAAgF;YAChF,wFAAwF;YACxF,uFAAuF;YACvF,yFAAyF;YACzF,0BAA0B;YAC1B,IAAI,EAAE,CAAC,KAAK,KAAK,iBAAiB,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;gBAClE,OAAO,kBAAkB,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAClE,CAAC;YACD,8EAA8E;YAC9E,0EAA0E;YAC1E,yEAAyE;YACzE,0EAA0E;YAC1E,2EAA2E;YAC3E,8EAA8E;YAC9E,mCAAmC;YACnC,IAAI,EAAE,CAAC,KAAK,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,MAAgB,CAAC,EAAE,CAAC;gBACnE,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/D,CAAC;YACD,2FAA2F;YAC3F,4FAA4F;YAC5F,qFAAqF;YACrF,IAAK,EAAE,CAAC,MAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAK,EAAE,CAAC,MAAiB,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrG,OAAO,kBAAkB,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9D,CAAC;YACD,IAAK,EAAE,CAAC,MAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAC5C,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/D,CAAC;YACD,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAK,MAAkC,CAAC,WAAW,KAAK,MAAM,EAAE,CAAC;YACvG,OAAO,kBAAkB,CAAC,SAAS,CAAC,MAAiC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACvF,CAAC;QACD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAK,MAAkC,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACzG,OAAO,kBAAkB,CAAC,qBAAqB,CAAC,MAAiC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACnG,CAAC;QACD,IACE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YACrB,MAAM,CAAC,MAAM,GAAG,CAAC;YACjB,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE;gBACvB,OAAO,OAAO,EAAE,KAAK,QAAQ,CAAC;YAChC,CAAC,CAAC,EACF,CAAC;YACD,OAAO,kBAAkB,CAAC,qBAAqB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,kBAAkB,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,kBAAkB,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,MAAe,EAAE,IAAY,EAAE,MAAuB;QACvE,0FAA0F;QAC1F,wFAAwF;QACxF,0FAA0F;QAC1F,0FAA0F;QAC1F,qFAAqF;QACrF,wFAAwF;QACxF,0FAA0F;QAC1F,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACvD,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC;YACzB,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC;YACtB,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;YACrB,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,KAAK,CAAC,WAAW,GAAG,QAAQ,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,IAAI,OAAO,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC9B,CAAC;aAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;YAC5B,IAAI,CAAC,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACtD,sFAAsF;YACtF,yCAAyC;YACzC,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;gBAC3B,mBAAmB,CAAC,IAAI,EAAE,MAAgB,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,eAAe;QACb,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC;IAChG,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC5F,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,mBAAmB,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC/F,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC5F,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC7B,qFAAqF;YACrF,uCAAuC;YACvC,OAAO,kBAAkB,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAuB,CAAC;QACnF,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAe,CAAC;QAC1C,MAAM,IAAI,GAAI,MAAM,CAAC,MAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,MAAM,CAAC;QACtD,CAAC;aAAM,IAAI,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,iFAAiF;YACjF,kFAAkF;YAClF,iFAAiF;YACjF,sEAAsE;YACtE,6EAA6E;YAC7E,uEAAuE;YACvE,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,CAAC;aAAM,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5C,sFAAsF;YACtF,yFAAyF;YACzF,0FAA0F;YAC1F,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAC3C,CAAC;QACD,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,MAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8BG;IACH,MAAM,CAAC,YAAY,CAAC,OAAqB,EAAE,IAAY,EAAE,MAAuB;QAC9E,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,kBAAkB,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAChB,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,OAAO,kBAAkB,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;QAC9B,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,kBAAkB,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC;YACH,oFAAoF;YACpF,yEAAyE;YACzE,MAAM,OAAO,GAAmB,EAAE,CAAC;YACnC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACpF,MAAM,IAAI,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACtE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC5B,IAAI,IAAI,YAAY,kBAAkB,EAAE,CAAC;gBACvC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,CAAC;YACD,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC9B,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,mBAAmB,CAAC,iCAAiC,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;YAC5G,OAAO,kBAAkB,CAAC,yBAAyB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,yBAAyB,CAC9B,OAAqB,EACrB,IAAY,EACZ,MAAuB,EACvB,IAAqB;QAErB,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QACvB,IAAI,CAAC,YAAY,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,gBAAgB,CAAC;QACzD,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,SAAS,CAAC,MAAc;QACtB,oFAAoF;QACpF,mFAAmF;QACnF,iFAAiF;QACjF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAgD,CAAC;QAClE,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC3C,8EAA8E;YAC9E,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;gBACjE,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAgB,CAAC,CAAC,CAAC;YAC9D,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,wFAAwF;QACxF,uFAAuF;QACvF,mCAAmC;QACnC,oFAAoF;QACpF,qFAAqF;QACrF,6EAA6E;QAC7E,qFAAqF;QACrF,6EAA6E;QAC7E,EAAE;QACF,4EAA4E;QAC5E,oFAAoF;QACpF,qFAAqF;QACrF,iCAAiC;QACjC,EAAE;QACF,mFAAmF;QACnF,gFAAgF;QAChF,gFAAgF;QAChF,qFAAqF;QACrF,8CAA8C;QAC9C,IACE,CAAC,IAAI,CAAC,OAAO;YACb,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACzB,CAAC,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,EAC/F,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,kBAAkB,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;;OAOG;IACH,YAAY;QACV,2DAA2D;QAC3D,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,KAAK,iBAAiB,EAAE,CAAC;YACjH,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC3D,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,kBAAkB,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACzF,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wFAAwF;IACxF,aAAa;QACX,IAAI,IAAI,CAAC,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC3D,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAE,CAAc,CAAC,QAAQ,IAAI,CAAC,CAAC,YAAY,kBAAkB,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,CAC5F,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,mBAAmB,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC/F,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC;QACnC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QACtF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAgB,CAAC;QACvC,IAAI,kBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/C,OAAO,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;YACjF,OAAO,kBAAkB,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC;YACH,oFAAoF;YACpF,mEAAmE;YACnE,6BAA6B;YAC7B,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACf,OAAO,kBAAkB,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACzF,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9B,MAAM,OAAO,GAAG,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;gBACtH,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;YACD,sFAAsF;YACtF,mFAAmF;YACnF,uDAAuD;YACvD,MAAM,IAAI,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAuB,CAAC;YAC/F,mEAAmE;YACnE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,4EAA4E;YAC5E,4EAA4E;YAC5E,sEAAsE;YACtE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,oFAAoF;YACpF,0EAA0E;YAC1E,MAAM,MAAM,GAAG,iCAAiC,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YACtG,OAAO,kBAAkB,CAAC,uBAAuB,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,MAAM,CAAC,uBAAuB,CAC5B,MAA+B,EAC/B,IAAY,EACZ,MAAuB,EACvB,MAAc;QAEd,mBAAmB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAgB,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,MAAM,CAAC,kBAAkB,CACvB,MAA+B,EAC/B,KAAiB,EACjB,QAAqB,EACrB,gBAA8B,EAC9B,IAAY,EACZ,MAAuB;QAEvB,IAAI,IAAc,CAAC;QACnB,4EAA4E;QAC5E,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,YAAY,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC/E,IAAI,GAAG,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,EAAE,EAAE,CAAC;YACZ,8EAA8E;YAC9E,YAAY,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,uFAAuF;QACvF,iFAAiF;QACjF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACzF,IAAqD,CAAC,cAAc,GAAG;YACtE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAQ,MAAM,CAAC,cAAc,CAAC,IAAI,CAAc,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,CAAC,CAAC;QACF,kFAAkF;QAClF,IAAI,IAAI,YAAY,kBAAkB,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,OAAO,EAAE,CAAC;YAC9B,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,eAAe,CAAC,MAA+B;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC;QAChC,OAAO,CACL,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YACjC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;YAC3B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACnB,IAAI,CAAC,MAAM,IAAI,CAAC;YAChB,YAAY,CAAC,IAAgB,CAAC,KAAK,CAAC,CACrC,CAAC;IACJ,CAAC;IAED,sFAAsF;IACtF,2FAA2F;IAC3F,4FAA4F;IAC5F,MAAM,CAAC,kBAAkB,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC9F,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC;QAC9D,IAAI,CAAC,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,WAAuB,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACpB,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,MAAM,CAAC,cAAc,CAAC,MAA+B;QACnD,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC;QACrB,IAAI,GAAG,GAAG,KAAK,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAClF,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACnC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,GAAG,GAAG,IAAI,CAAC;QACb,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,wFAAwF;IACxF,yFAAyF;IACzF,wFAAwF;IACxF,oFAAoF;IACpF,0FAA0F;IAC1F,sFAAsF;IACtF,0FAA0F;IAC1F,qFAAqF;IACrF,qFAAqF;IACrF,2FAA2F;IAC3F,gFAAgF;IAChF,MAAM,CAAC,eAAe,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC3F,MAAM,aAAa,GAAI,MAAM,CAAC,MAAiB;aAC5C,IAAI,EAAE;aACN,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,CAAC,UAAU,CAAC;YACd,OAAO,CAAC,CAAC,OAAO,CAAC,+BAA+B,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;QAChG,CAAC,CAAC,CAAC;QACL,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;YACtB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,iEAAiE;QACjE,yEAAyE;QACzE,kFAAkF;QAClF,6EAA6E;QAC7E,oEAAoE;QACpE,MAAM,IAAI,GAAG,aAAa,CAAE,MAAM,CAAC,WAAwB,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1F,MAAM,KAAK,GAAG,0BAA0B,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,uFAAuF;QACvF,8EAA8E;QAC9E,gFAAgF;QAChF,sFAAsF;QACtF,8BAA8B;QAC9B,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC;QAC9D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC5F,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAe,CAAC;QAC1C,MAAM,KAAK,GAAI,MAAM,CAAC,MAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC9E,wFAAwF;QACxF,4FAA4F;QAC5F,0FAA0F;QAC1F,0FAA0F;QAC1F,oFAAoF;QACpF,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;gBAC5B,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;YAC5C,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,6EAA6E;QAC7E,wFAAwF;QACxF,wFAAwF;QACxF,2EAA2E;QAC3E,0FAA0F;QAC1F,4CAA4C;QAC5C,IAAI,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7E,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC;gBACpC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC3C,gFAAgF;YAChF,+EAA+E;YAC/E,kFAAkF;YAClF,gFAAgF;YAChF,0CAA0C;YAC1C,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5C,iFAAiF;YACjF,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC7C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC7C,CAAC;QACD,6FAA6F;QAC7F,IAAI,iBAAiB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,gBAAgB,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,WAAW,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QACvF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,+EAA+E;YAC/E,gFAAgF;YAChF,sDAAsD;YACtD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;YACzC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,iFAAiF;QACjF,gEAAgE;QAChE,IAAI,CAAC,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,MAAiB,EAAE,IAAY,EAAE,MAAuB;QAC5E,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAA4C,CAAC,CAAC;QAChG,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;QAC1E,8EAA8E;QAC9E,gEAAgE;QAChE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,uEAAuE;QACvE,+EAA+E;QAC/E,oEAAoE;QACpE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QAC3F,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;YACrB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,MAAM,CAAC,KAAgB,CAAC;YACnF,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;QACrB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAC/B,2FAA2F;QAC3F,uDAAuD;QACvD,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1D,uFAAuF;QACvF,sFAAsF;QACtF,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;YAC5B,IAAI,CAAC,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACnE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,MAA+B,EAAE,IAAY,EAAE,MAAuB;QACrF,MAAM,MAAM,GAAG;YACb,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;SAC1C,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAiC,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC;QACpB,IAAI,CAAC,KAAK,GAAI,MAAM,CAAC,WAAwB,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAExD,IAAI,MAAM,CAAC,SAAS,IAAK,MAAM,CAAC,SAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAsB,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,qBAAqB,CAC1B,MAA+B,EAC/B,IAAY,EACZ,MAAuB;QAEvB,MAAM,MAAM,GAAG;YACb,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;SAC1C,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAiC,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,SAAS,GAAI,MAAM,CAAC,SAAuB,IAAI,EAAE,CAAC;QACvD,IAAI,CAAC,KAAK,GAAI,MAAM,CAAC,WAAwB,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5E,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,qBAAqB,CAAC,MAAgB,EAAE,IAAY,EAAE,MAAuB;QAClF,MAAM,MAAM,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAiC,CAAC,CAAC;QACrF,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;CACF"} \ No newline at end of file diff --git a/dist/datamodel/parser/MatFileCheck.d.ts b/dist/datamodel/parser/MatFileCheck.d.ts new file mode 100644 index 00000000..16a084aa --- /dev/null +++ b/dist/datamodel/parser/MatFileCheck.d.ts @@ -0,0 +1,151 @@ +/** + * What a MatViolation is about. Each is one rule MATLAB applies at `load`: + * + * - `short-file`: fewer than the 128 bytes of a header; + * - `not-level5`: the version (bytes 124-125) or the endian mark (126-127) is not a Level-5 + * file's, or the two disagree; + * - `level4-lookalike`: a 16-bit half of bytes 0-3 is zero, so MATLAB reads the file as Level 4; + * - `big-endian`: an 'MI' file, noted and not checked further (this package does not read one); + * - `framing`: the records do not tile the file from byte 128 to its end: one is cut short, one + * is not a whole number of 8-byte words, or bytes follow or pad them; + * - `top-level-type`: a record that is neither miMATRIX nor miCOMPRESSED; + * - `empty-matrix`: a record holding an miMATRIX of 0 bytes; + * - `compressed-wrapper`: a compressed record that is not one zlib stream of one miMATRIX; + * - `subsystem-offset`: header bytes 116-123 do not point at the subsystem's record, or are 0 + * with a subsystem in the file; + * - `subsystem-not-last`: a record after the subsystem, which MATLAB silently leaves out; + * - `anonymous-record`: an unnamed record that is not the subsystem, where MATLAB stops listing; + * - `name`: a variable name that is not valid UTF-8, not an identifier, or a keyword (an empty + * one is an `anonymous-record`); + * - `duplicate-name`: two records of one name; + * - `char-type`: char data in a type MATLAB does not read as text, or reads wrong; + * - `utf8-count`: miUTF8 char data whose UTF-16 length is not the array's element count; + * - `nbytes`: a matrix its sub-elements do not fill exactly; + * - `int-storage`: a numeric array of a class other than double, stored in a type other than + * its class's own; + * - `element`: a sub-element MATLAB cannot read where it stands: array flags, dimensions or a + * name of the wrong type, an unknown class or data type, a small tag of more than 4 bytes, a + * container member that is not a matrix; + * - `data-size`: a data sub-element holding more or fewer elements than the dimensions say; + * - `budget`: the check stopped here, and nothing from here on was checked. + */ +export type MatViolationCode = 'short-file' | 'not-level5' | 'level4-lookalike' | 'big-endian' | 'framing' | 'top-level-type' | 'empty-matrix' | 'compressed-wrapper' | 'subsystem-offset' | 'subsystem-not-last' | 'anonymous-record' | 'name' | 'duplicate-name' | 'char-type' | 'utf8-count' | 'nbytes' | 'int-storage' | 'element' | 'data-size' | 'budget'; +/** One rule a MAT-file breaks, and where. */ +export interface MatViolation { + code: MatViolationCode; + /** + * The byte of the file it is at. Inside a compressed record that is the record's own tag, + * since the bytes at fault exist only inflated; the message gives their place in the + * inflated payload. For a header field (`subsystem-offset`) it is the field. + */ + at: number; + /** What is wrong, and what MATLAB does with it, in a sentence a user can be shown. */ + message: string; + /** The variable it is in, when its record has a name that could be read. */ + variable?: string; +} +/** How much one check may spend. Past either budget it stops with a `budget` note. */ +export interface MatCheckOptions { + /** Matrices walked, top-level and nested together. Defaults to MAT_CHECK_ELEMENT_BUDGET. */ + maxElements?: number; + /** Bytes inflated from compressed records, over the whole file. Defaults to MAT_CHECK_INFLATE_BUDGET. */ + maxInflatedBytes?: number; +} +/** + * How many matrices one check walks, at most: 2^24. A matrix costs the check a few tag reads, + * and 2^24 of them is a struct array of 1.6 million elements and ten fields each. + */ +export declare const MAT_CHECK_ELEMENT_BUDGET: number; +/** + * How many bytes one check inflates, at most, over every compressed record of the file: 1 GiB. + * The check inflates one record at a time and drops it, so this bounds time more than memory; + * the largest record in the corpus `parseMat` is measured against inflates to 114 MB. + */ +export declare const MAT_CHECK_INFLATE_BUDGET: number; +/** + * Check a Level-5 MAT-file against the rules MATLAB loads one by (see the top of this file), + * and list every place it breaks one, in file order. An empty list means MATLAB loads the + * file, every variable in it, as stored. Pure and synchronous, and it never throws: bytes that + * are not a MAT-file at all are a violation too. + */ +export declare function checkMatFile(bytes: Uint8Array, options?: MatCheckOptions): MatViolation[]; +/** + * What one variable's miMATRIX element (its tag and body, as a record holds it inflated) breaks + * of the rules MATLAB reads a matrix by, at any depth: its char data, its storage, how its + * sub-elements fill it, its name. Not the rules of a file (its header, framing, compression, + * placement), which only a whole file has: those are checkMatFile's. Every `at` is 0, the + * element's own start, and each message says where in the element. Asked of a variable as it was + * read, whose element is in memory already, so nothing is inflated; and like checkMatFile it never + * throws, and stops at its budget with a `budget` note. + */ +export declare function checkMatElement(element: Uint8Array, options?: MatCheckOptions): MatViolation[]; +/** + * The violations of `after` that `before` does not have: what a rewrite of a file added to it. + * + * Matched by code and variable, never by offset or message, which an edit anywhere before a + * record moves; and counted, so a third violation of one kind in one variable is added where + * the original had two. `renamed` maps a variable's name in `after` to its name in `before`. + * A `budget` note in `after` is always added: a check that did not finish proves nothing about + * what it did not reach, whatever the original's check reached. + */ +export declare function violationsAdded(before: readonly MatViolation[], after: readonly MatViolation[], renamed?: ReadonlyMap): MatViolation[]; +/** A record of a file as read, for violationsAddedBySplice: its bytes, from its tag. */ +export interface MatReadRecord { + bytes: Uint8Array; + /** + * Its payload as `inflateZlib` inflated it, for a compressed record whose inflate the caller + * holds already (MatParser keeps it, MatVariable._rawBytes), so that it is not inflated again. + */ + inflated?: Uint8Array | null; +} +/** + * A record of a file written from another (violationsAddedBySplice): a record of that file kept + * as its own bytes (`kept`, its index), or bytes written in place of one of its records + * (`replaces`, its index: a variable renamed or written fresh, and the subsystem, when a save + * writes it anew) or of none (`replaces` null: a variable added). + */ +export type MatSplicedRecord = { + kept: number; +} | { + written: Uint8Array; + replaces: number | null; +}; +/** A Level-5 file as its 128-byte header and its records, back to back from byte 128. */ +export interface MatFileOfRecords { + header: Uint8Array; + records: readonly R[]; +} +/** + * What `written` adds to `read` by the rules MATLAB loads a file by, as + * `violationsAdded(checkMatFile(read), checkMatFile(written), renamed)` says it, where `written` + * is `read` with some of its records kept as their own bytes, the others deleted or written anew, + * and records added: worked out from what changed, rather than by checking both files whole. + * + * WHY IT IS THE SAME ANSWER. What a record breaks depends on its bytes alone (checkRecord, which + * checkMatFile walks every record with: `at` only places what is said). So a record kept as its + * own bytes breaks in `written` what it broke in `read`, under the same variable, and the two + * cancel, by rule and variable, as violationsAdded counts them. What is left to compare is the + * records written, the records they replace, the header, and the rules of where records stand + * (checkPlacement), which are asked of both files whole, from each record's name and whether it + * holds the subsystem: of a kept record, read without walking the rest of it (Check.headOnly). + * That holds where three things do, and where one does not both files are checked whole: + * + * - both files walk as their records are given: every record's tag declares exactly the bytes + * it is given, and opens with a nonzero byte, which the tag of a type that is a multiple of + * 256 does not, and which the walk then takes for padding; + * - no record of `read` is kept twice, or kept and replaced; + * - no kept record holds a name `renamed` maps, which violationsAdded would compare its + * violations under the other name of. + * + * A record deleted is one more in `read` than in `written`, which can only take from what is + * added: it is checked only when something is. + * + * THE BUDGET (MatCheckOptions) is spent on what is checked, the records written and the ones + * they replace, and not on the records kept, which are not walked: so a file past it is still + * checked where it changed, where checkMatFile of it would stop. A `budget` note on the written + * side is added, as violationsAdded adds every one; one on the read side only leaves less for a + * written record's violations to be matched with. A kept record whose name cannot be read within + * the budget is a `budget` note on the written side: where it stands cannot be judged. + */ +export declare function violationsAddedBySplice(read: MatFileOfRecords, written: MatFileOfRecords, renamed?: ReadonlyMap, options?: MatCheckOptions): MatViolation[]; +//# sourceMappingURL=MatFileCheck.d.ts.map \ No newline at end of file diff --git a/dist/datamodel/parser/MatFileCheck.d.ts.map b/dist/datamodel/parser/MatFileCheck.d.ts.map new file mode 100644 index 00000000..f8537d0f --- /dev/null +++ b/dist/datamodel/parser/MatFileCheck.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"MatFileCheck.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/MatFileCheck.ts"],"names":[],"mappings":"AAyEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,MAAM,gBAAgB,GACxB,YAAY,GACZ,YAAY,GACZ,kBAAkB,GAClB,YAAY,GACZ,SAAS,GACT,gBAAgB,GAChB,cAAc,GACd,oBAAoB,GACpB,kBAAkB,GAClB,oBAAoB,GACpB,kBAAkB,GAClB,MAAM,GACN,gBAAgB,GAChB,WAAW,GACX,YAAY,GACZ,QAAQ,GACR,aAAa,GACb,SAAS,GACT,WAAW,GACX,QAAQ,CAAC;AAEb,6CAA6C;AAC7C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sFAAsF;AACtF,MAAM,WAAW,eAAe;IAC9B,4FAA4F;IAC5F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAU,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAU,CAAC;AA6LhD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,eAAoB,GAAG,YAAY,EAAE,CAW7F;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,GAAE,eAAoB,GAAG,YAAY,EAAE,CAiBlG;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,SAAS,YAAY,EAAE,EAC/B,KAAK,EAAE,SAAS,YAAY,EAAE,EAC9B,OAAO,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GAC/C,YAAY,EAAE,CAkBhB;AAED,wFAAwF;AACxF,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,UAAU,CAAC;IAClB;;;OAGG;IACH,QAAQ,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEnG,yFAAyF;AACzF,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,gBAAgB,CAAC,aAAa,CAAC,EACrC,OAAO,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,EAC3C,OAAO,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,EAChD,OAAO,GAAE,eAAoB,GAC5B,YAAY,EAAE,CA+FhB"} \ No newline at end of file diff --git a/dist/datamodel/parser/MatFileCheck.js b/dist/datamodel/parser/MatFileCheck.js new file mode 100644 index 00000000..0bc17cc0 --- /dev/null +++ b/dist/datamodel/parser/MatFileCheck.js @@ -0,0 +1,1316 @@ +// src/datamodel/parser/MatFileCheck.ts +// Copyright 2026 The MathWorks, Inc. +// +// Whether MATLAB loads a Level-5 MAT-file, judged by the rules MATLAB loads one by, and not by +// this package's own reader. +// +// WHY A SECOND READER. `parseMat` is built to open whatever it can, which is right for a +// viewer and wrong for a judge. It clamps every declared length to the bytes present, takes a +// zero tag for the end of the variables, reads char data stored as miUTF32 or miUINT8, and +// lists a variable stored after the subsystem. MATLAB does none of that. Of the 36 files in the +// MATLAB-verdict corpus (test/fixtures/mat-check) that MATLAB does not load as stored, because +// the load fails or a variable comes back missing or changed, `parseMat` opens all 36, and 32 +// of them without a single warning (measured when this was written). So a `.mat` this package +// writes and then reads back proves only that the package agrees with itself. This module is +// the other judge: it reads no value, and it lists every place a file breaks a rule MATLAB +// applies at `load`, as a MatViolation. It shares no reading code with MatParser, so none of +// the reader's repairs can leak into a verdict. +// +// THE RULES. Each was measured against MATLAB R2027a (27.1 prerelease, maca64) with `S = +// load(f)` on copies of MATLAB-written files edited one byte range at a time +// (test/fixtures/mat-check/verdicts.json holds the files and MATLAB's verdict on each): +// +// * the header: bytes 124-125 are the version 0x0100 and 126-127 the endian mark 'IM' (0x0000 +// and 0x0200 fail, and 0x0200 makes MATLAB try HDF5); neither 16-bit half of bytes 0-3 is +// zero (a header of NULs fails: MATLAB takes the file for Level 4); +// * the records tile the file from byte 128 to its last byte. A plain record is its tag and +// its declared bytes, a multiple of 8 (one cut short, or missing its final pad, fails); a +// compressed one is its tag and exactly its zlib stream, with no padding after it (zero +// padding to 8 fails), and nothing follows the last record (3, 8 or 100 zero bytes fail); +// * a record is an miMATRIX, or an miCOMPRESSED whose RFC 1950 zlib stream inflates to one +// miMATRIX and nothing else (zlib levels 0, 1, 6 and 9 all load); +// * header bytes 116-123 are the offset of the subsystem's record (the objects' data), or 0 +// when there is none. MATLAB trusts the offset and never looks for the record: a stale, +// zeroed or space-filled one fails the whole load; +// * the subsystem is the last record and the only unnamed one. MATLAB stops listing variables +// at the first unnamed record, so a variable after it is silently missing from the load +// (the load succeeds, and `whos -file` still lists it); +// * a variable's name is a MATLAB identifier in valid UTF-8: '1abc' and 'café' fail `S = +// load(f)`, 'end' loads as 'end_', and a name that is not UTF-8 crashed MATLAB; +// * char data is miUTF8 holding as many UTF-16 units as the array's elements, or miUTF16, or +// miUINT16 below U+0100: miUTF32, miUINT8 and miINT8 fail, a surrogate in miUINT16 fails, +// and CJK in miUINT16 loads keeping only the low byte of each unit, with no warning; +// * every element is readable: one bad variable fails the whole-file load. +// +// Some rules were not probed, deliberately: what MATLAB writes is plain, and a file that breaks +// it is one no MATLAB was seen to write. Only a double is ever stored in a narrower type than +// its class (every other numeric class is stored in its own), every sub-element fills its +// matrix exactly, and every data sub-element holds as many elements as its dimensions say. +// They are checked as MATLAB writes them (`int-storage`, `nbytes`, `data-size`, `element`). +// +// WHERE IT IS STRICTER THAN MATLAB, on purpose, so the save path never writes a file that +// loads only by luck. Each is listed with its reason in test/matFileCheck.test.ts: a name +// stored twice (it loads, but `load f` keeps the last copy and `load f x` the first); bytes +// after the subsystem's record, which MATLAB's load never reads; a zlib stream whose Adler-32 +// trailer is not the record's last four bytes. +// +// WHAT IT IS FOR. The `.mat` save checks the file it writes, and refuses to return it if it has +// a violation the original did not. A violation is therefore said with the variable it is in, +// when that has a readable name, so two files can be compared by variable rather than by an +// offset an edit moved (violationsAdded). And since what a record breaks is a function of its +// own bytes, the save asks it only where it changed the file, with the same answer +// (violationsAddedBySplice). +// +// BOUNDED. A file's bytes say how much work reading them is, and a hostile one can say a lot: +// a few kilobytes of zlib inflate to gigabytes, and a cell can declare a billion elements. So +// the check spends a budget of inflated bytes and of matrices walked (MatCheckOptions), and +// stops when either runs out, with a `budget` note saying where. It never throws: whatever the +// bytes, the answer is a list. +import { InflateCeilingError, inflateZlib, MAT_RECORD_INFLATE_CEILING } from './Inflate.js'; +import { MAX_NESTING } from './MatParser.js'; +import { reasonOf } from './ParseWarning.js'; +/** + * How many matrices one check walks, at most: 2^24. A matrix costs the check a few tag reads, + * and 2^24 of them is a struct array of 1.6 million elements and ten fields each. + */ +export const MAT_CHECK_ELEMENT_BUDGET = 2 ** 24; +/** + * How many bytes one check inflates, at most, over every compressed record of the file: 1 GiB. + * The check inflates one record at a time and drops it, so this bounds time more than memory; + * the largest record in the corpus `parseMat` is measured against inflates to 114 MB. + */ +export const MAT_CHECK_INFLATE_BUDGET = 2 ** 30; +const MI_INT8 = 1; +const MI_UINT8 = 2; +const MI_INT16 = 3; +const MI_UINT16 = 4; +const MI_INT32 = 5; +const MI_UINT32 = 6; +const MI_SINGLE = 7; +const MI_DOUBLE = 9; +const MI_INT64 = 12; +const MI_UINT64 = 13; +const MI_MATRIX = 14; +const MI_COMPRESSED = 15; +const MI_UTF8 = 16; +const MI_UTF16 = 17; +const TYPE_NAMES = { + [MI_INT8]: 'miINT8', [MI_UINT8]: 'miUINT8', [MI_INT16]: 'miINT16', [MI_UINT16]: 'miUINT16', + [MI_INT32]: 'miINT32', [MI_UINT32]: 'miUINT32', [MI_SINGLE]: 'miSINGLE', [MI_DOUBLE]: 'miDOUBLE', + [MI_INT64]: 'miINT64', [MI_UINT64]: 'miUINT64', [MI_MATRIX]: 'miMATRIX', [MI_COMPRESSED]: 'miCOMPRESSED', + [MI_UTF8]: 'miUTF8', [MI_UTF16]: 'miUTF16', 18: 'miUTF32', +}; +/** The bytes one element of each numeric data type takes. */ +const WIDTH = { + [MI_INT8]: 1, [MI_UINT8]: 1, [MI_INT16]: 2, [MI_UINT16]: 2, [MI_INT32]: 4, [MI_UINT32]: 4, + [MI_SINGLE]: 4, [MI_DOUBLE]: 8, [MI_INT64]: 8, [MI_UINT64]: 8, +}; +const MX_CELL = 1; +const MX_STRUCT = 2; +const MX_OBJECT = 3; +const MX_CHAR = 4; +const MX_SPARSE = 5; +const MX_DOUBLE = 6; +const MX_SINGLE = 7; +const MX_UINT8 = 9; +const MX_FUNCTION = 16; +const MX_OPAQUE = 17; +const CLASS_NAMES = { + 1: 'cell', 2: 'struct', 3: 'object', 4: 'char', 5: 'sparse', 6: 'double', 7: 'single', + 8: 'int8', 9: 'uint8', 10: 'int16', 11: 'uint16', 12: 'int32', 13: 'uint32', 14: 'int64', + 15: 'uint64', 16: 'function_handle', 17: 'opaque', +}; +/** The one data type each numeric class but double is stored in. */ +const OWN_TYPE = { + 7: MI_SINGLE, 8: MI_INT8, 9: MI_UINT8, 10: MI_INT16, 11: MI_UINT16, 12: MI_INT32, + 13: MI_UINT32, 14: MI_INT64, 15: MI_UINT64, +}; +// The array flags' bits above the class byte. +const LOGICAL_BIT = 0x200; +const COMPLEX_BIT = 0x800; +const SPARSE_BIT = 0x1000; +// MATLAB's keywords (iskeyword), which a variable name may not be: the same list +// datamodel/matlabName.ts holds, restated because this folder imports nothing from there. +const KEYWORDS = new Set([ + 'break', 'case', 'catch', 'classdef', 'continue', 'else', 'elseif', 'end', 'for', 'function', + 'global', 'if', 'otherwise', 'parfor', 'persistent', 'return', 'spmd', 'switch', 'try', 'while', +]); +const IDENTIFIER = /^[A-Za-z][A-Za-z0-9_]*$/; +// Fatal, so bytes that are not UTF-8 are said to be, and keeping a BOM, so a name or a text +// that opens with one is not read as one without it. +const strictUtf8 = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }); +const looseUtf8 = new TextDecoder('utf-8', { ignoreBOM: true }); +// The MAT stream a subsystem's uint8 data opens with: the version 0x0100 and 'IM'. +const STREAM_MAGIC = [0x00, 0x01, 0x49, 0x4d]; +/** Thrown inside a check when a budget runs out, and turned into its `budget` note. */ +class OutOfBudget extends Error { + constructor(at, message) { + super(message); + this.at = at; + this.name = 'OutOfBudget'; + } +} +/** One top-level record's bytes, from its tag, as the record at byte `at` of its file. */ +function recordSpace(view, at) { + return { view, fileAt: (o) => at + o, where: (o) => `Byte ${at + o}` }; +} +function payloadSpace(view, record) { + return { + view, + fileAt: () => record, + where: (o) => `Byte ${o} of the compressed record at byte ${record}, inflated,`, + }; +} +class Check { + constructor(options) { + this.out = []; + /** The record being checked, for a `budget` note on a throw nobody expected. */ + this.cursor = 128; + /** Whether the walk is inside the subsystem's stream, which belongs to no variable. */ + this.inSubsystem = false; + /** + * Whether only what the placement rules need of a record is read (its name, and whether it + * holds the subsystem), and nothing past it: what a record kept as its own bytes is asked + * in a splice (violationsAddedBySplice), whose violations are the file's as read already. + */ + this.headOnly = false; + this.maxElements = options.maxElements ?? MAT_CHECK_ELEMENT_BUDGET; + this.maxInflated = options.maxInflatedBytes ?? MAT_CHECK_INFLATE_BUDGET; + this.elementsLeft = this.maxElements; + this.inflateLeft = this.maxInflated; + } + /** A violation of the file as a whole, or of one record seen from outside it. */ + file(code, at, message, variable) { + const v = { code, at, message }; + if (variable) + v.variable = variable; + this.out.push(v); + } + /** A violation inside a matrix, said with where it is and whose it is. */ + report(code, space, o, text) { + const whose = this.inSubsystem + ? ' (in the subsystem, the data of the objects in the file)' + : this.variable ? ` (in "${this.variable}")` : ''; + const v = { code, at: space.fileAt(o), message: `${space.where(o)}${whose}: ${text}.` }; + if (this.variable && !this.inSubsystem) + v.variable = this.variable; + this.out.push(v); + } + /** One more matrix walked, or the end of the check. */ + spend(space, o) { + if (--this.elementsLeft < 0) { + throw new OutOfBudget(space.fileAt(o), `more than the ${this.maxElements} matrices one check walks`); + } + } +} +/** + * Check a Level-5 MAT-file against the rules MATLAB loads one by (see the top of this file), + * and list every place it breaks one, in file order. An empty list means MATLAB loads the + * file, every variable in it, as stored. Pure and synchronous, and it never throws: bytes that + * are not a MAT-file at all are a violation too. + */ +export function checkMatFile(bytes, options = {}) { + const check = new Check(options); + try { + checkFile(check, bytes); + } + catch (err) { + // A budget run out, or, if this module has a defect, any other throw: either way the + // check did not finish, and that is said rather than thrown, at the record it was in. + check.file('budget', ...stoppedAt(err, check.cursor)); + } + // Stable, so the violations of one place keep the order they were found in. + return check.out.sort((a, b) => a.at - b.at); +} +/** + * What one variable's miMATRIX element (its tag and body, as a record holds it inflated) breaks + * of the rules MATLAB reads a matrix by, at any depth: its char data, its storage, how its + * sub-elements fill it, its name. Not the rules of a file (its header, framing, compression, + * placement), which only a whole file has: those are checkMatFile's. Every `at` is 0, the + * element's own start, and each message says where in the element. Asked of a variable as it was + * read, whose element is in memory already, so nothing is inflated; and like checkMatFile it never + * throws, and stops at its budget with a `budget` note. + */ +export function checkMatElement(element, options = {}) { + const check = new Check(options); + const view = new DataView(element.buffer, element.byteOffset, element.byteLength); + const space = { view, fileAt: () => 0, where: (o) => `Byte ${o} of its element` }; + try { + if (element.byteLength < 8) { + check.file('element', 0, `The element holds ${element.byteLength} byte(s), fewer than one element's tag.`); + } + else if (view.getUint32(0, true) !== MI_MATRIX) { + check.file('element', 0, `The element is a data element of ${typeName(view.getUint32(0, true))}, not a matrix.`); + } + else { + topMatrix(check, space, 0, 8, Math.min(8 + view.getUint32(4, true), element.byteLength)); + } + } + catch (err) { + const why = err instanceof OutOfBudget ? err.message : `an error in the check itself (${reasonOf(err)})`; + check.file('budget', 0, `The check of the element stopped at ${why}, so nothing from there on was checked.`, check.variable); + } + return check.out; +} +/** + * The violations of `after` that `before` does not have: what a rewrite of a file added to it. + * + * Matched by code and variable, never by offset or message, which an edit anywhere before a + * record moves; and counted, so a third violation of one kind in one variable is added where + * the original had two. `renamed` maps a variable's name in `after` to its name in `before`. + * A `budget` note in `after` is always added: a check that did not finish proves nothing about + * what it did not reach, whatever the original's check reached. + */ +export function violationsAdded(before, after, renamed = new Map()) { + const key = (code, variable) => `${code}\u0000${variable ?? ''}`; + const held = new Map(); + for (const v of before) { + const k = key(v.code, v.variable); + held.set(k, (held.get(k) ?? 0) + 1); + } + const added = []; + for (const v of after) { + const k = key(v.code, v.variable === undefined ? undefined : renamed.get(v.variable) ?? v.variable); + const left = held.get(k) ?? 0; + if (v.code === 'budget' || left === 0) { + added.push(v); + } + else { + held.set(k, left - 1); + } + } + return added; +} +/** + * What `written` adds to `read` by the rules MATLAB loads a file by, as + * `violationsAdded(checkMatFile(read), checkMatFile(written), renamed)` says it, where `written` + * is `read` with some of its records kept as their own bytes, the others deleted or written anew, + * and records added: worked out from what changed, rather than by checking both files whole. + * + * WHY IT IS THE SAME ANSWER. What a record breaks depends on its bytes alone (checkRecord, which + * checkMatFile walks every record with: `at` only places what is said). So a record kept as its + * own bytes breaks in `written` what it broke in `read`, under the same variable, and the two + * cancel, by rule and variable, as violationsAdded counts them. What is left to compare is the + * records written, the records they replace, the header, and the rules of where records stand + * (checkPlacement), which are asked of both files whole, from each record's name and whether it + * holds the subsystem: of a kept record, read without walking the rest of it (Check.headOnly). + * That holds where three things do, and where one does not both files are checked whole: + * + * - both files walk as their records are given: every record's tag declares exactly the bytes + * it is given, and opens with a nonzero byte, which the tag of a type that is a multiple of + * 256 does not, and which the walk then takes for padding; + * - no record of `read` is kept twice, or kept and replaced; + * - no kept record holds a name `renamed` maps, which violationsAdded would compare its + * violations under the other name of. + * + * A record deleted is one more in `read` than in `written`, which can only take from what is + * added: it is checked only when something is. + * + * THE BUDGET (MatCheckOptions) is spent on what is checked, the records written and the ones + * they replace, and not on the records kept, which are not walked: so a file past it is still + * checked where it changed, where checkMatFile of it would stop. A `budget` note on the written + * side is added, as violationsAdded adds every one; one on the read side only leaves less for a + * written record's violations to be matched with. A kept record whose name cannot be read within + * the budget is a `budget` note on the written side: where it stands cannot be judged. + */ +export function violationsAddedBySplice(read, written, renamed = new Map(), options = {}) { + const readBytes = read.records.map((r) => r.bytes); + const writtenBytes = written.records.map((r) => { + if ('kept' in r && !read.records[r.kept]) { + throw new RangeError(`A record kept as record ${r.kept} of a file of ${read.records.length}.`); + } + return 'kept' in r ? read.records[r.kept].bytes : r.written; + }); + const whole = () => violationsAdded(checkMatFile(joined(read.header, readBytes), options), checkMatFile(joined(written.header, writtenBytes), options), renamed); + const taken = new Set(); + for (const r of written.records) { + const from = 'kept' in r ? r.kept : r.replaces; + if (from !== null) { + if (taken.has(from)) { + return whole(); + } + taken.add(from); + } + } + if (read.header.byteLength !== 128 || written.header.byteLength !== 128 || ![...readBytes, ...writtenBytes].every(walksAsGiven)) { + return whole(); + } + const readHeader = headerOf(read.header); + const writtenHeader = headerOf(written.header); + if (readHeader.walked !== writtenHeader.walked) { + return whole(); + } + if (!writtenHeader.walked) { + // checkMatFile reads neither file past its header. + return violationsAdded(readHeader.violations, writtenHeader.violations, renamed); + } + const readAt = offsetsOf(readBytes); + const writtenAt = offsetsOf(writtenBytes); + const heads = read.records.map((r, i) => headOf(r, readAt[i], options)); + for (const r of written.records) { + const head = 'kept' in r ? heads[r.kept] : null; + if (head && !(head instanceof OutOfBudget) && head.name && renamed.has(head.name)) { + return whole(); + } + } + // The written side: its header, every record written, and where every record stands. + const after = new Check(options); + const writtenInfos = []; + let walked = true; + try { + written.records.forEach((r, i) => { + if (!('kept' in r)) { + writtenInfos.push(checkRecord(after, r.written, writtenAt[i])); + return; + } + const head = heads[r.kept]; + if (head instanceof OutOfBudget) { + throw new OutOfBudget(writtenAt[i], head.message); + } + writtenInfos.push(head && { ...head, at: writtenAt[i] }); + }); + } + catch (err) { + walked = false; + after.file('budget', ...stoppedAt(err, after.cursor)); + } + if (walked) { + checkPlacement(after, writtenInfos.filter((x) => x !== null), writtenHeader.offset, endOf(writtenAt, writtenBytes)); + } + const afterAll = [...writtenHeader.violations, ...after.out].sort((a, b) => a.at - b.at); + // The read side: its header, where every record stood, the records replaced, and the records + // deleted only when what is added so far could be matched with one of theirs. + const before = new Check(options); + const readInfos = heads.map((h, i) => (h instanceof OutOfBudget ? { at: readAt[i], name: null, subsystem: false } : h)); + checkPlacement(before, readInfos.filter((x) => x !== null), readHeader.offset, endOf(readAt, readBytes)); + const checkRead = (which) => { + try { + for (const i of which) { + checkRecord(before, read.records[i].bytes, readAt[i], read.records[i].inflated); + } + return true; + } + catch (err) { + before.file('budget', ...stoppedAt(err, before.cursor)); + return false; + } + }; + const replaced = written.records.flatMap((r) => ('kept' in r || r.replaces === null ? [] : [r.replaces])); + const readOn = checkRead(replaced); + let added = violationsAdded([...readHeader.violations, ...before.out], afterAll, renamed); + const deleted = read.records.map((_, i) => i).filter((i) => !taken.has(i)); + if (added.some((v) => v.code !== 'budget') && deleted.length > 0 && readOn) { + checkRead(deleted); + added = violationsAdded([...readHeader.violations, ...before.out], afterAll, renamed); + } + return added; +} +// Whether the walk of a file (walkRecords) reads `record` as the record it is given as: its tag +// declares exactly its bytes, and it does not open with a zero byte, which the walk reads as +// padding or as the end of the records. +function walksAsGiven(record) { + return record.byteLength >= 8 && record[0] !== 0 + && 8 + new DataView(record.buffer, record.byteOffset, 8).getUint32(4, true) === record.byteLength; +} +// What checkMatFile says of a header, whether it reads on past it, and the subsystem's offset it gives. +function headerOf(header) { + const check = new Check({}); + const walked = checkHeader(check, header); + const offset = subsystemOffset(new DataView(header.buffer, header.byteOffset, header.byteLength), header); + return { violations: check.out, walked, offset }; +} +// What the placement rules need of the record at byte `at`, read as checkRecord reads it but no +// further (Check.headOnly), or the budget that stopped it. A compressed record whose inflate is +// held is not inflated again, and spends none of the budget. +function headOf(record, at, options) { + const check = new Check(options); + check.headOnly = true; + if (record.inflated) { + check.inflateLeft = MAT_RECORD_INFLATE_CEILING; + } + try { + return checkRecord(check, record.bytes, at, record.inflated); + } + catch (err) { + return err instanceof OutOfBudget ? err : new OutOfBudget(at, `an error in the check itself (${reasonOf(err)})`); + } +} +// The place and the words of the `budget` note of a check stopped by `err` in the record at +// `cursor`: a budget run out (OutOfBudget, which says where), or a defect of the check's own. +function stoppedAt(err, cursor) { + const at = err instanceof OutOfBudget ? err.at : cursor; + const why = err instanceof OutOfBudget ? err.message : `an error in the check itself (${reasonOf(err)})`; + return [at, `The check stopped at byte ${at}, at ${why}, so nothing from there on was checked.`]; +} +// Where each of `records` starts, back to back after a 128-byte header. +function offsetsOf(records) { + const out = []; + let at = 128; + for (const r of records) { + out.push(at); + at += r.byteLength; + } + return out; +} +function endOf(offsets, records) { + return offsets.length === 0 ? 128 : offsets[offsets.length - 1] + records[records.length - 1].byteLength; +} +function joined(header, records) { + const out = new Uint8Array(header.byteLength + endOf(offsetsOf(records), records) - 128); + out.set(header, 0); + let at = header.byteLength; + for (const r of records) { + out.set(r, at); + at += r.byteLength; + } + return out; +} +function checkFile(check, bytes) { + if (bytes.byteLength < 128) { + check.file('short-file', 0, `The file holds ${bytes.byteLength} bytes, fewer than the 128 of a MAT-file's header.`); + return; + } + if (!checkHeader(check, bytes)) { + return; + } + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + const offset = subsystemOffset(view, bytes); + const records = walkRecords(check, view, bytes, offset); + checkPlacement(check, records, offset, bytes.byteLength); +} +/** Whether the rest of the file is a Level-5 one to check, having said what the header breaks. */ +function checkHeader(check, bytes) { + // MATLAB looks at the first four bytes before anything else, and a zero in either 16-bit + // half of them makes it read the file as Level 4: a header text that opens with NULs. + if ((bytes[0] | bytes[1]) === 0 || (bytes[2] | bytes[3]) === 0) { + check.file('level4-lookalike', 0, 'A 16-bit half of the header\'s first four bytes is zero, so MATLAB reads ' + + 'the file as a Level 4 MAT-file and fails the load. The header text must not open with NUL bytes.'); + } + const mark = String.fromCharCode(bytes[126], bytes[127]); + const version = `${hex2(bytes[124])} ${hex2(bytes[125])}`; + if (mark === 'MI' && bytes[124] === 0x01 && bytes[125] === 0x00) { + check.file('big-endian', 126, 'The file is big-endian (\'MI\'). MATLAB reads one, but this package does not, ' + + 'so nothing after the header was checked.'); + return false; + } + if (mark !== 'IM' && mark !== 'MI') { + check.file('not-level5', 126, `Header bytes 126-127 are ${hex2(bytes[126])} ${hex2(bytes[127])}, not the endian mark ` + + '\'IM\' of a Level-5 MAT-file, so MATLAB does not read it as one.'); + return false; + } + if (mark === 'IM' && !(bytes[124] === 0x00 && bytes[125] === 0x01)) { + check.file('not-level5', 124, bytes[124] === 0x00 && bytes[125] === 0x02 + ? 'Header bytes 124-125 are 00 02, the version 0x0200 of a -v7.3 (HDF5) file, which is not a Level-5 MAT-file.' + : `Header bytes 124-125 are ${version}, where a Level-5 MAT-file holds the version 0x0100 (bytes 00 01), ` + + 'so MATLAB fails the load.'); + return false; + } + if (mark === 'MI') { + check.file('not-level5', 124, `Header bytes 124-125 are ${version}, and a big-endian ('MI') file holds the version ` + + '0x0100 as bytes 01 00: the version and the endian mark disagree, so MATLAB fails the load.'); + return false; + } + return true; +} +function hex2(b) { + return b.toString(16).padStart(2, '0'); +} +/** Header bytes 116-123: the subsystem's offset, where eight spaces mean 0 as zeros do. */ +function subsystemOffset(view, bytes) { + if (bytes.subarray(116, 124).every((b) => b === 0x20)) { + return 0; + } + return view.getUint32(120, true) * 2 ** 32 + view.getUint32(116, true); +} +/** + * Every record from byte 128 to the end of the file, each checked, and what the placement + * rules need of each. The walk is MATLAB's: a record is its 8-byte tag and the bytes the tag + * declares, and the next one starts right after them, whatever the alignment. + */ +function walkRecords(check, view, bytes, offset) { + const records = []; + const length = bytes.byteLength; + let at = 128; + while (at < length) { + check.cursor = at; + check.variable = undefined; + if (bytes[at] === 0) { + // No record tag opens with a zero byte (a record's type is 14 or 15), so this is padding, + // or the bytes after the last record, or a tag of type 0. Said once, as what it is. + const zeros = zeroRun(bytes, at); + const last = records[records.length - 1]; + if (at + zeros === length && last !== undefined && last.at === offset && last.subsystem) { + // Measured: MATLAB loads a file with 8 zero bytes after its subsystem, because its + // load stops reading at the subsystem. They are no record all the same, and what + // MATLAB's own `save -append`, which reads past the subsystem, makes of them is not + // known, so they are said as the bytes that do not frame they are. + check.file('framing', at, `The file ends with ${zeros} zero byte(s) after the subsystem's record, which are no ` + + 'record: MATLAB\'s load does not read past the subsystem, but MATLAB writes nothing after it.'); + break; + } + if (at + zeros === length) { + const after = last === undefined ? 'its header' : 'its last record'; + check.file('framing', at, zeros < 8 + ? `The file ends with ${zeros} zero byte(s) after ${after}, fewer than a record's tag: ` + + 'MATLAB fails the load. Nothing may follow the last record.' + : `The file ends with ${zeros} zero bytes after ${after}, which MATLAB reads as a record of type 0, ` + + 'and fails the load. Nothing may follow the last record.'); + break; + } + if (zeros < 8 && at + zeros + 8 <= length && isRecordType(view.getUint32(at + zeros, true))) { + check.file('framing', at, `${zeros} zero byte(s) at byte ${at} pad the record before them: MATLAB reads the ` + + 'next record right where the last one\'s declared bytes end, and a compressed record is never padded, so ' + + 'it fails the load.'); + at += zeros; + continue; + } + const word = at + 4 <= length ? view.getUint32(at, true) : 0; + check.file('framing', at, `The bytes at ${at} are no record's tag (they read as ${typeName(word)}): MATLAB ` + + 'fails the load, and nothing after them was checked.'); + break; + } + if (length - at < 8) { + check.file('framing', at, `The file ends ${length - at} byte(s) into a record's tag: MATLAB fails the load.`); + break; + } + const n = view.getUint32(at + 4, true); + if (at + 8 + n > length) { + check.file('framing', at, `The record at byte ${at} declares ${n} bytes, and the file holds ${length - at - 8} ` + + 'after its tag: it is cut short, and MATLAB fails the load.'); + break; + } + const info = checkRecord(check, bytes.subarray(at, at + 8 + n), at); + if (info) { + records.push(info); + } + at += 8 + n; + } + return records; +} +/** + * One top-level record, its tag and the bytes it declares, as the record at byte `at` of its + * file: checked, and what the placement rules need of it, or null for a record they do not + * see, one that is no matrix. What it breaks depends on its bytes alone: `at` places what is + * said, and nothing else of the file is read. `inflated` is a compressed record's payload, + * inflated, when the caller holds that already (violationsAddedBySplice). + */ +function checkRecord(check, record, at, inflated) { + check.cursor = at; + check.variable = undefined; + const view = new DataView(record.buffer, record.byteOffset, record.byteLength); + const type = view.getUint32(0, true); + const n = view.getUint32(4, true); + if (type === MI_MATRIX) { + return plainRecord(check, recordSpace(view, at), at, n); + } + if (type === MI_COMPRESSED) { + return compressedRecord(check, record.subarray(8, 8 + n), at, inflated); + } + check.file('top-level-type', at, `The record at byte ${at} is a data element of ${typeName(type)}: a variable is ` + + 'stored as an miMATRIX or an miCOMPRESSED, and MATLAB fails the load on anything else.'); + return null; +} +function zeroRun(bytes, at) { + let end = at; + while (end < bytes.byteLength && bytes[end] === 0) + end++; + return end - at; +} +function isRecordType(word) { + return word === MI_MATRIX || word === MI_COMPRESSED; +} +function typeName(type) { + return TYPE_NAMES[type] ?? `type ${type}`; +} +// A plain record, in a space that holds it from its tag (recordSpace). +function plainRecord(check, space, at, n) { + if (n === 0) { + check.file('empty-matrix', at, `The record at byte ${at} is an miMATRIX of 0 bytes: MATLAB fails the load. ` + + 'Only a matrix inside another may be empty.'); + return { at, name: null, subsystem: false }; + } + const info = topMatrix(check, space, at, 8, 8 + n); + if (n % 8 !== 0) { + check.file('framing', at, `The record at byte ${at} declares ${n} bytes, not a whole number of 8-byte words: ` + + 'a plain record ends padded to 8 bytes, so this one is missing its final pad, and MATLAB fails the load.', info.name || undefined); + } + return info; +} +/** + * A compressed record: one zlib stream (RFC 1950) that inflates to one miMATRIX and nothing + * else, and ends at the record's last byte. Its matrix is then checked in the inflated bytes. + * + * `given`, when there is one, is what `inflateZlib` made of `payload` for the caller already (MatParser + * keeps it, MatVariable._rawBytes), taken for the inflate rather than inflating the payload + * again: the same function of the same bytes, so the same bytes, spent from the budget as an + * inflate of them is. Nothing else of what the caller read is taken. + */ +function compressedRecord(check, payload, at, given) { + const unread = { at, name: null, subsystem: false }; + // Said once the record's name is known, if it can be, and ahead of what its matrix breaks. + const faults = []; + const fault = (text) => { + faults.push(`The compressed record at byte ${at} ${text}.`); + }; + const first = check.out.length; + const done = (info) => { + const said = faults.map((message) => { + const v = { code: 'compressed-wrapper', at, message }; + if (info.name) + v.variable = info.name; + return v; + }); + check.out.splice(first, 0, ...said); + return info; + }; + const head = zlibHeaderFault(payload); + if (head) { + fault(`${head}: MATLAB inflates a record only as a zlib stream, and fails the load`); + return done(unread); + } + const ceiling = Math.min(check.inflateLeft, MAT_RECORD_INFLATE_CEILING); + let inflated; + try { + if (given && given.byteLength > ceiling) { + throw new InflateCeilingError(ceiling); + } + inflated = given ?? inflateZlib(payload, ceiling); + } + catch (err) { + if (err instanceof InflateCeilingError) { + if (ceiling < MAT_RECORD_INFLATE_CEILING) { + throw new OutOfBudget(at, `more than the ${check.maxInflated} bytes one check inflates`); + } + fault(`inflates to more than the ${MAT_RECORD_INFLATE_CEILING} bytes one record of a -v7 file can hold`); + return done(unread); + } + fault(`does not inflate (${reasonOf(err)}): MATLAB fails the load`); + return done(unread); + } + check.inflateLeft -= inflated.byteLength; + // The stream ends with the Adler-32 of what it inflates to, so a record whose last four + // bytes are that checksum ends where its stream does. Anything else is bytes after the + // stream, which MATLAB's record never has, or a checksum that is wrong. Not asked for a + // record's name alone (headOnly), which it does not change. + const trailer = new DataView(payload.buffer, payload.byteOffset + payload.byteLength - 4, 4).getUint32(0, false); + if (!check.headOnly && trailer !== adler32(inflated)) { + fault('does not end with its zlib stream\'s checksum: bytes follow the stream inside the record, or the ' + + 'checksum is wrong. MATLAB writes a record as exactly its stream'); + } + if (inflated.byteLength < 8) { + fault(`inflates to ${inflated.byteLength} byte(s), fewer than one element's tag: MATLAB fails the load`); + return done(unread); + } + const view = new DataView(inflated.buffer, inflated.byteOffset, inflated.byteLength); + const type = view.getUint32(0, true); + const n = view.getUint32(4, true); + if (type === MI_COMPRESSED) { + fault('inflates to another compressed record: MATLAB never nests one, and fails the load'); + return done(unread); + } + if (type !== MI_MATRIX) { + fault(`inflates to a data element of ${typeName(type)}, where a record holds a matrix: MATLAB fails the load`); + return done(unread); + } + if (n === 0) { + check.file('empty-matrix', at, `The compressed record at byte ${at} holds an miMATRIX of 0 bytes: MATLAB fails ` + + 'the load. Only a matrix inside another may be empty.'); + return done(unread); + } + const held = inflated.byteLength - 8; + if (n > held) { + fault(`holds a matrix that declares ${n} bytes, and it inflates to ${held} after the matrix's tag: ` + + 'the matrix is cut short, and MATLAB fails the load'); + } + else if (n < held) { + fault(`inflates to ${held - n} byte(s) after its matrix: MATLAB's record holds one matrix and nothing after it`); + } + return done(topMatrix(check, payloadSpace(view, at), at, 8, 8 + Math.min(n, held))); +} +/** + * Why `payload` is not a zlib stream by its first two bytes, or null when it opens like one: + * compression method 8 (deflate) with a window of at most 32 KiB, a header check that holds, + * and no preset dictionary, which MATLAB does not supply. + */ +function zlibHeaderFault(payload) { + if (payload.byteLength < 6) { + return `holds ${payload.byteLength} byte(s), fewer than the smallest zlib stream`; + } + const cmf = payload[0]; + const flg = payload[1]; + if (cmf === 0x1f && flg === 0x8b) { + return 'is a gzip stream, not a zlib one'; + } + if ((cmf & 0x0f) !== 8 || cmf >> 4 > 7 || ((cmf << 8) | flg) % 31 !== 0) { + return `does not open with a zlib header (it opens ${hex2(cmf)} ${hex2(flg)}; raw deflate has none)`; + } + if (flg & 0x20) { + return 'is a zlib stream that needs a preset dictionary'; + } + return null; +} +/** RFC 1950's checksum of `bytes`. */ +function adler32(bytes) { + let a = 1; + let b = 0; + const n = bytes.byteLength; + for (let i = 0; i < n;) { + // 5552 bytes is the most the sums take before they must be reduced to stay exact in 32 bits, + // and so certainly within a double. + const stop = Math.min(n, i + 5552); + for (; i < stop; i++) { + a += bytes[i]; + b += a; + } + a %= 65521; + b %= 65521; + } + return (b * 65536 + a) >>> 0; +} +/** + * The tag of the sub-element at `o`, which has to end by `end`, or null when it does not, or + * when its small form declares more than the 4 bytes it can hold. Both are said here, so a + * caller that gets null stops reading the matrix and adds nothing. + */ +function readTag(check, space, o, end, what) { + if (o + 8 > end) { + check.report('nbytes', space, o, `the matrix ends ${end - o} byte(s) into the tag of its ${what}, so its ` + + 'sub-elements do not fill it: MATLAB fails the load'); + return null; + } + const word = space.view.getUint32(o, true); + const small = word >>> 16; + if (small !== 0) { + // The small form: the count in the upper half of the first word, the data in the second. + if (small > 4) { + check.report('element', space, o, `the ${what} has a small tag declaring ${small} bytes, more than the 4 ` + + 'it holds: MATLAB fails the load'); + return null; + } + return { type: word & 0xffff, n: small, data: o + 4, next: o + 8 }; + } + const n = space.view.getUint32(o + 4, true); + // A matrix inside another is its tag and its declared bytes; a primitive is padded to 8. + const next = o + 8 + (word === MI_MATRIX ? n : align8(n)); + if (next > end) { + const size = word === MI_MATRIX || n % 8 === 0 ? `${n} bytes` : `${n} bytes, ${align8(n)} with its pad,`; + check.report('nbytes', space, o, `the ${what} declares ${size} and the matrix holding it has ` + + `${Math.max(0, end - o - 8)} left after its tag: MATLAB fails the load`); + return null; + } + return { type: word, n, data: o + 8, next }; +} +function align8(n) { + return n + ((8 - (n % 8)) % 8); +} +/** A top-level record's matrix: checked, and what the placement rules need of it. */ +function topMatrix(check, space, at, start, end) { + const info = { at, name: null, subsystem: false }; + check.spend(space, start); + const head = readHeader(check, space, start, end); + if (!head) { + return info; + } + info.name = recordName(check, at, head.name); + const stream = info.name === '' ? subsystemStream(space, head, end) : null; + info.subsystem = stream !== null; + if (check.headOnly) { + return info; + } + const p = classBody(check, space, head, end, 0); + if (p !== null) { + fillsExactly(check, space, p, end); + } + if (stream !== null) { + checkSubsystem(check, space, stream.start, stream.end); + } + return info; +} +/** + * A variable's name, having said what is wrong with it: '' for none, and for bytes that are + * not UTF-8 the name as far as it reads, so the violation can still say whose it is. + */ +function recordName(check, at, bytes) { + if (bytes.byteLength === 0) { + return ''; + } + let name; + try { + name = strictUtf8.decode(bytes); + } + catch { + name = looseUtf8.decode(bytes); + check.variable = name; + check.file('name', at, `The variable name at byte ${at} is not valid UTF-8 (bytes ${Array.from(bytes, hex2).join(' ')}): ` + + 'MATLAB crashes reading it, in `load` and in `whos -file` alike.', name); + return name; + } + check.variable = name; + if (!IDENTIFIER.test(name)) { + check.file('name', at, `The variable name "${name}" at byte ${at} is not a MATLAB identifier (a letter, then ` + + 'letters, digits and underscores): `S = load(f)` fails on it, and `load(f)` leaves it out.', name); + } + else if (KEYWORDS.has(name)) { + check.file('name', at, `The variable name "${name}" at byte ${at} is a MATLAB keyword: MATLAB loads it as ` + + `"${name}_", with a warning.`, name); + } + return name; +} +/** + * Everything before a matrix's class's own sub-elements: the array flags, the dimensions + * (which an opaque has none of), the name. Null, having said why, when they are not there to + * read as MATLAB reads them. + */ +function readHeader(check, space, start, end) { + const view = space.view; + const flagsTag = readTag(check, space, start, end, 'array flags'); + if (!flagsTag) { + return null; + } + if (flagsTag.type !== MI_UINT32 || flagsTag.n !== 8) { + check.report('element', space, start, `the matrix's array flags are ${flagsTag.n} byte(s) of ${typeName(flagsTag.type)}, ` + + 'where MATLAB writes and reads two miUINT32 words: it fails the load'); + return null; + } + const flags = view.getUint32(flagsTag.data, true); + const cls = flags & 0xff; + if (cls < MX_CELL || cls > MX_OPAQUE) { + check.report('element', space, start, `the matrix's array class is ${cls}, which is no class MATLAB reads: ` + + 'it fails the load'); + return null; + } + let p = flagsTag.next; + const dims = []; + let numel = 1; + if (cls !== MX_OPAQUE) { + const dimsTag = readTag(check, space, p, end, 'dimensions'); + if (!dimsTag) { + return null; + } + if (dimsTag.type !== MI_INT32 || dimsTag.n % 4 !== 0 || dimsTag.n < 8) { + check.report('element', space, p, `the matrix's dimensions are ${dimsTag.n} byte(s) of ${typeName(dimsTag.type)}, ` + + 'where MATLAB writes and reads two or more miINT32 extents: it fails the load'); + return null; + } + for (let i = 0; i < dimsTag.n; i += 4) { + const extent = view.getInt32(dimsTag.data + i, true); + if (extent < 0) { + check.report('element', space, p, `the matrix's dimension ${i / 4 + 1} is ${extent}, which is no size: ` + + 'MATLAB fails the load'); + return null; + } + dims.push(extent); + numel *= extent; + } + p = dimsTag.next; + } + const nameTag = readTag(check, space, p, end, 'name'); + if (!nameTag) { + return null; + } + if (nameTag.type !== MI_INT8 && nameTag.type !== MI_UINT8) { + check.report('element', space, p, `the matrix's name is ${typeName(nameTag.type)}, where MATLAB writes an ` + + 'miINT8 one: it fails the load'); + return null; + } + const name = new Uint8Array(view.buffer, view.byteOffset + nameTag.data, nameTag.n); + return { cls, flags, dims, numel, name, p: nameTag.next }; +} +/** A matrix inside another: a cell's member, a struct's field, an object's data. */ +function nestedMatrix(check, space, start, end, depth) { + check.spend(space, start); + if (depth > MAX_NESTING) { + throw new OutOfBudget(space.fileAt(start), `a matrix nested more than ${MAX_NESTING} levels deep`); + } + const head = readHeader(check, space, start, end); + if (!head) { + return; + } + const p = classBody(check, space, head, end, depth); + if (p !== null) { + fillsExactly(check, space, p, end); + } +} +/** A matrix whose class's sub-elements end at `p` holds nothing after them. */ +function fillsExactly(check, space, p, end) { + if (p !== end) { + check.report('nbytes', space, p, `${end - p} byte(s) follow the matrix's last sub-element inside it: MATLAB reads ` + + 'a matrix as its sub-elements back to back, and they must fill it exactly'); + } +} +/** + * The sub-elements a matrix of `head.cls` holds after its name, checked: where they end, or + * null when a fault already said means the rest cannot be read. + */ +function classBody(check, space, head, end, depth) { + const cls = head.cls; + switch (cls) { + case MX_CELL: + return members(check, space, head.p, end, head.numel, depth, 'cell member'); + case MX_STRUCT: + return structBody(check, space, head, head.p, end, depth); + case MX_OBJECT: { + const p = className(check, space, head.p, end); + return p === null ? null : structBody(check, space, head, p, end, depth); + } + case MX_CHAR: + return charBody(check, space, head, end); + case MX_SPARSE: + return sparseBody(check, space, head, end); + case MX_FUNCTION: + return members(check, space, head.p, end, head.numel, depth, 'function handle member'); + case MX_OPAQUE: { + const sub = className(check, space, head.p, end, 'subsystem name'); + const p = sub === null ? null : className(check, space, sub, end); + return p === null ? null : members(check, space, p, end, 1, depth, 'object data'); + } + default: + return head.flags & SPARSE_BIT ? sparseBody(check, space, head, end) : numericBody(check, space, head, end); + } +} +/** + * `count` matrices back to back from `p`, each checked: a cell's members, a struct's fields + * (element by element, field by field), a function handle's parts, an object's data. + */ +function members(check, space, p, end, count, depth, what) { + for (let i = 0; i < count; i++) { + if (p >= end) { + check.report('nbytes', space, p, `the matrix holds ${i} of the ${count} ${what}(s) it declares: MATLAB fails the load`); + return null; + } + const tag = readTag(check, space, p, end, `${what} ${i + 1}`); + if (!tag) { + return null; + } + if (tag.type !== MI_MATRIX) { + check.report('element', space, p, `${what} ${i + 1} is a data element of ${typeName(tag.type)}, where MATLAB ` + + 'reads only a matrix: it fails the load'); + return null; + } + // An empty matrix here is a member MATLAB reads as [], and has no sub-elements to check, + // but it is spent as one: a billion of them is still a billion reads. + if (tag.n > 0) { + nestedMatrix(check, space, tag.data, tag.next, depth + 1); + } + else { + check.spend(space, p); + } + p = tag.next; + } + return p; +} +/** An miINT8 name after a matrix's own: an object's class name, an opaque's subsystem name. */ +function className(check, space, p, end, what = 'class name') { + const tag = readTag(check, space, p, end, what); + if (!tag) { + return null; + } + if ((tag.type !== MI_INT8 && tag.type !== MI_UINT8) || tag.n === 0) { + check.report('element', space, p, `the object's ${what} is ${tag.n} byte(s) of ${typeName(tag.type)}, where MATLAB ` + + 'writes a name in miINT8: it fails the load'); + return null; + } + return tag.next; +} +/** A struct's (or an object's) field-name length, its field names, then every field's value. */ +function structBody(check, space, head, p, end, depth) { + const widthTag = readTag(check, space, p, end, 'field-name length'); + if (!widthTag) { + return null; + } + if (widthTag.type !== MI_INT32 || widthTag.n !== 4) { + check.report('element', space, p, `the struct's field-name length is ${widthTag.n} byte(s) of ${typeName(widthTag.type)}, ` + + 'where MATLAB writes one miINT32: it fails the load'); + return null; + } + const width = space.view.getInt32(widthTag.data, true); + const namesTag = readTag(check, space, widthTag.next, end, 'field names'); + if (!namesTag) { + return null; + } + if (namesTag.type !== MI_INT8 && namesTag.type !== MI_UINT8) { + check.report('element', space, widthTag.next, `the struct's field names are ${typeName(namesTag.type)}, where MATLAB ` + + 'writes miINT8: it fails the load'); + return null; + } + if (width <= 0 && namesTag.n > 0) { + check.report('element', space, p, `the struct's field-name length is ${width}, with ${namesTag.n} byte(s) of names: ` + + 'MATLAB fails the load'); + return null; + } + // MATLAB counts the fields as the names' bytes over the length, whole names only. + const fields = width > 0 ? Math.floor(namesTag.n / width) : 0; + return members(check, space, namesTag.next, end, head.numel * fields, depth, 'field value'); +} +/** + * A char array's data: miUTF8 holding as many UTF-16 units as the array's elements, miUTF16 + * of two bytes each, or miUINT16 below U+0100 (MATLAB keeps only the low byte of a unit above + * it, and fails on a surrogate). A complex char array MATLAB does not load at all. + */ +function charBody(check, space, head, end) { + const tag = readTag(check, space, head.p, end, 'char data'); + if (!tag) { + return null; + } + const numel = head.numel; + const view = space.view; + switch (tag.type) { + case MI_UTF8: { + let text = null; + try { + text = strictUtf8.decode(new Uint8Array(view.buffer, view.byteOffset + tag.data, tag.n)); + } + catch { + check.report('char-type', space, head.p, 'the char array\'s miUTF8 data is not valid UTF-8'); + } + if (text !== null && text.length !== numel) { + check.report('utf8-count', space, head.p, `the char array's miUTF8 data is ${text.length} UTF-16 unit(s) of text, ` + + `and the array has ${numel} element(s): MATLAB fails the load`); + } + break; + } + case MI_UTF16: + if (tag.n !== 2 * numel) { + check.report('data-size', space, head.p, `the char array's miUTF16 data is ${tag.n} byte(s), and the array has ` + + `${numel} element(s) of 2 bytes each`); + } + break; + case MI_UINT16: + if (tag.n !== 2 * numel) { + check.report('data-size', space, head.p, `the char array's miUINT16 data is ${tag.n} byte(s), and the array has ` + + `${numel} element(s) of 2 bytes each`); + } + for (let o = tag.data; o + 2 <= tag.data + tag.n; o += 2) { + const unit = view.getUint16(o, true); + if (unit > 0xff) { + check.report('char-type', space, head.p, `the char array's miUINT16 data holds U+${unit.toString(16).toUpperCase().padStart(4, '0')}: ` + + 'MATLAB reads miUINT16 text one byte a character, keeping only the low byte of a unit above U+00FF ' + + 'and failing on a surrogate. Text beyond U+00FF is stored as miUTF8 or miUTF16'); + break; + } + } + break; + default: + check.report('char-type', space, head.p, `the char array's data is ${typeName(tag.type)}: MATLAB reads char data ` + + 'only as miUTF8, miUTF16 or miUINT16, and fails the load'); + } + let p = tag.next; + if (head.flags & COMPLEX_BIT) { + check.report('char-type', space, head.p, 'the char array is marked complex, and MATLAB loads a complex char array ' + + 'as nothing'); + const imag = readTag(check, space, p, end, 'imaginary char data'); + if (!imag) { + return null; + } + p = imag.next; + } + return p; +} +/** + * A full numeric array's real part, and its imaginary part when it is complex. A double may be + * stored in any numeric type (MATLAB narrows integral doubles to the smallest that holds them); + * every other class only in its own. + */ +function numericBody(check, space, head, end) { + let p = head.p; + for (const part of head.flags & COMPLEX_BIT ? ['real part', 'imaginary part'] : ['data']) { + const tag = readTag(check, space, p, end, part); + if (!tag) { + return null; + } + checkNumbers(check, space, p, head, tag, part, head.numel); + p = tag.next; + } + return p; +} +/** One numeric part's type and size, against its array's class and `count` elements. */ +function checkNumbers(check, space, o, head, tag, part, count) { + const logical = head.flags & LOGICAL_BIT && head.cls === MX_UINT8; + const what = logical ? 'logical' : head.cls === MX_SPARSE ? 'sparse' : CLASS_NAMES[head.cls]; + const width = WIDTH[tag.type]; + const own = OWN_TYPE[head.cls]; + if (own !== undefined && tag.type !== own) { + check.report('int-storage', space, o, `the ${what} array's ${part} is stored as ${typeName(tag.type)}, and MATLAB ` + + `stores a ${what} array only as ${typeName(own)}: only a double is ever stored in a narrower type`); + return; + } + if (width === undefined) { + check.report('element', space, o, `the ${what} array's ${part} is ${typeName(tag.type)}, which MATLAB does not ` + + 'read as numbers: it fails the load'); + return; + } + if (tag.n % width !== 0 || tag.n / width !== count) { + check.report('data-size', space, o, `the ${what} array's ${part} is ${tag.n} byte(s) of ${typeName(tag.type)}, and it ` + + `has ${count} element(s) of ${width} byte(s) each`); + } +} +/** + * A sparse array: its row indices, its column starts (one per column and one more), its + * non-zeros, and their imaginary parts when it is complex. MATLAB has sparse arrays of double, + * single and logical class only. + */ +function sparseBody(check, space, head, end) { + const cls = head.cls; + const logical = (head.flags & LOGICAL_BIT) !== 0; + if (!(cls === MX_SPARSE || cls === MX_DOUBLE || cls === MX_SINGLE || (cls === MX_UINT8 && logical))) { + check.report('element', space, head.p, `the matrix is a sparse ${CLASS_NAMES[cls]} array, and MATLAB has sparse ` + + 'arrays of double, single and logical class only'); + } + if (head.dims.length !== 2) { + check.report('element', space, head.p, `the sparse array has ${head.dims.length} dimensions, and a sparse array has 2`); + } + const ir = readTag(check, space, head.p, end, 'row indices'); + if (!ir) { + return null; + } + const jc = readTag(check, space, ir.next, end, 'column starts'); + if (!jc) { + return null; + } + for (const [tag, o, part] of [[ir, head.p, 'row indices'], [jc, ir.next, 'column starts']]) { + if (tag.type !== MI_INT32) { + check.report('element', space, o, `the sparse array's ${part} are ${typeName(tag.type)}, where MATLAB writes ` + + 'miINT32'); + } + } + const nonZeros = ir.type === MI_INT32 ? ir.n / 4 : Math.floor(ir.n / (WIDTH[ir.type] ?? 1)); + if (jc.type === MI_INT32 && head.dims.length === 2 && jc.n !== 4 * (head.dims[1] + 1)) { + check.report('data-size', space, ir.next, `the sparse array's column starts are ${jc.n / 4} miINT32, and it has ` + + `${head.dims[1]} column(s), which take one more`); + } + let p = jc.next; + for (const part of head.flags & COMPLEX_BIT ? ['real non-zeros', 'imaginary non-zeros'] : ['non-zeros']) { + const tag = readTag(check, space, p, end, part); + if (!tag) { + return null; + } + checkNumbers(check, space, p, { ...head, cls: cls === MX_SPARSE && logical ? MX_UINT8 : cls }, tag, part, nonZeros); + p = tag.next; + } + return p; +} +/** + * Where the subsystem data an unnamed record holds is, or null when it holds none: the data of + * a real uint8 array, opening as a MAT stream does (00 01 49 4D). Read without a word said, + * since `classBody` checks the same sub-element as the array's data. + */ +function subsystemStream(space, head, end) { + const view = space.view; + if (head.cls !== MX_UINT8 || head.flags & (LOGICAL_BIT | COMPLEX_BIT | SPARSE_BIT) || head.p + 16 > end) { + return null; + } + const n = view.getUint32(head.p + 4, true); + const start = head.p + 8; + if (view.getUint32(head.p, true) !== MI_UINT8 || n < 8 || start + n > end) { + return null; + } + return STREAM_MAGIC.every((b, i) => view.getUint8(start + i) === b) ? { start, end: start + n } : null; +} +/** + * The subsystem's stream, checked as MATLAB reads it when it loads an object: its 8-byte + * preamble, then matrices back to back to its last byte. The second half of the preamble's + * reserved word says the stream's tags are 32-bit, as in every file MATLAB was seen writing; + * a stream that says otherwise is not walked. + */ +function checkSubsystem(check, space, start, end) { + if (space.view.getUint16(start + 4, true) !== 0) { + return; + } + check.inSubsystem = true; + try { + let o = start + 8; + while (o < end) { + const element = readTag(check, space, o, end, 'subsystem element'); + if (!element) { + return; + } + if (element.type !== MI_MATRIX) { + check.report('element', space, o, `the subsystem's stream holds a data element of ${typeName(element.type)}, ` + + 'where it holds only matrices'); + return; + } + if (element.n > 0) { + nestedMatrix(check, space, element.data, element.next, 1); + } + else { + check.spend(space, o); + } + o = element.next; + } + } + finally { + check.inSubsystem = false; + } +} +/** + * The rules about where records are: the header's offset points at the subsystem, the + * subsystem is last, no other record is unnamed, no name is stored twice. + */ +function checkPlacement(check, records, offset, length) { + let subsystem = -1; + if (offset !== 0) { + const i = records.findIndex((r) => r.at === offset); + const record = records[i]; + const field = `Header bytes 116-123 give the subsystem's offset as ${offset}`; + const fails = 'MATLAB reads the objects in the file only from there, and fails the load'; + if (!record) { + check.file('subsystem-offset', 116, offset < 128 || offset >= length + ? `${field}, outside the file's records: ${fails}.` + : `${field}, where no record starts: ${fails}.`); + } + else if (record.name === null) { + // The record there could not be read, which is said where it is. + } + else if (record.name !== '') { + check.file('subsystem-offset', 116, `${field}, which is variable "${record.name}", not the subsystem: ${fails}.`); + } + else if (!record.subsystem) { + check.file('subsystem-offset', 116, `${field}, an unnamed record that holds no subsystem data: ${fails}.`); + } + else { + subsystem = i; + } + } + else { + for (const r of records) { + if (r.subsystem) { + check.file('subsystem-offset', 116, `Header bytes 116-123 say the file has no subsystem, and the record at byte ` + + `${r.at} is one: MATLAB then reads none of the objects in the file, and fails the load.`); + } + } + } + if (subsystem >= 0) { + for (const r of records.slice(subsystem + 1)) { + const what = r.name ? `Variable "${r.name}"` : `The record at byte ${r.at}`; + check.file('subsystem-not-last', r.at, `${what} is stored after the subsystem (byte ${records[subsystem].at}): ` + + 'MATLAB stops reading variables at the subsystem, so `load` silently leaves it out.', r.name || undefined); + } + } + records.forEach((r, i) => { + if (r.name !== '' || i === subsystem) { + return; + } + const after = records.length - i - 1; + const what = r.subsystem + ? `The record at byte ${r.at} holds subsystem data, and the header's offset does not point at it` + : `The record at byte ${r.at} has no name`; + check.file('anonymous-record', r.at, `${what}: MATLAB stops reading variables at the first unnamed record, which ` + + 'is the subsystem\'s place' + + (after > 0 ? `, so \`load\` silently leaves out the ${after} record(s) after it.` : ', and leaves it out of `load`.')); + }); + const first = new Map(); + for (const r of records) { + if (!r.name) { + continue; + } + const seen = first.get(r.name); + if (seen === undefined) { + first.set(r.name, r.at); + } + else { + check.file('duplicate-name', r.at, `Variable "${r.name}" is stored again at byte ${r.at} (first at byte ${seen}): ` + + 'MATLAB loads both, `load(f)` keeping the last and `load(f, name)` the first.', r.name); + } + } +} +//# sourceMappingURL=MatFileCheck.js.map \ No newline at end of file diff --git a/dist/datamodel/parser/MatFileCheck.js.map b/dist/datamodel/parser/MatFileCheck.js.map new file mode 100644 index 00000000..349ee384 --- /dev/null +++ b/dist/datamodel/parser/MatFileCheck.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MatFileCheck.js","sourceRoot":"","sources":["../../../src/datamodel/parser/MatFileCheck.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,qCAAqC;AACrC,EAAE;AACF,+FAA+F;AAC/F,6BAA6B;AAC7B,EAAE;AACF,yFAAyF;AACzF,8FAA8F;AAC9F,2FAA2F;AAC3F,gGAAgG;AAChG,+FAA+F;AAC/F,8FAA8F;AAC9F,8FAA8F;AAC9F,6FAA6F;AAC7F,2FAA2F;AAC3F,6FAA6F;AAC7F,gDAAgD;AAChD,EAAE;AACF,yFAAyF;AACzF,6EAA6E;AAC7E,wFAAwF;AACxF,EAAE;AACF,gGAAgG;AAChG,8FAA8F;AAC9F,wEAAwE;AACxE,8FAA8F;AAC9F,8FAA8F;AAC9F,4FAA4F;AAC5F,8FAA8F;AAC9F,6FAA6F;AAC7F,sEAAsE;AACtE,8FAA8F;AAC9F,4FAA4F;AAC5F,uDAAuD;AACvD,gGAAgG;AAChG,4FAA4F;AAC5F,4DAA4D;AAC5D,2FAA2F;AAC3F,oFAAoF;AACpF,+FAA+F;AAC/F,8FAA8F;AAC9F,yFAAyF;AACzF,6EAA6E;AAC7E,EAAE;AACF,gGAAgG;AAChG,8FAA8F;AAC9F,0FAA0F;AAC1F,2FAA2F;AAC3F,4FAA4F;AAC5F,EAAE;AACF,0FAA0F;AAC1F,0FAA0F;AAC1F,4FAA4F;AAC5F,8FAA8F;AAC9F,+CAA+C;AAC/C,EAAE;AACF,gGAAgG;AAChG,8FAA8F;AAC9F,4FAA4F;AAC5F,8FAA8F;AAC9F,mFAAmF;AACnF,6BAA6B;AAC7B,EAAE;AACF,8FAA8F;AAC9F,8FAA8F;AAC9F,4FAA4F;AAC5F,+FAA+F;AAC/F,+BAA+B;AAE/B,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA8E7C;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAI,EAAE,CAAC;AAEhD;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,IAAI,EAAE,CAAC;AAEhD,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,SAAS,GAAG,EAAE,CAAC;AACrB,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,OAAO,GAAG,EAAE,CAAC;AACnB,MAAM,QAAQ,GAAG,EAAE,CAAC;AAEpB,MAAM,UAAU,GAA2B;IACzC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU;IAC1F,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU;IAChG,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,CAAC,aAAa,CAAC,EAAE,cAAc;IACxG,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,SAAS;CAC1D,CAAC;AAEF,6DAA6D;AAC7D,MAAM,KAAK,GAA2B;IACpC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;IACzF,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;CAC9D,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,SAAS,GAAG,CAAC,CAAC;AACpB,MAAM,QAAQ,GAAG,CAAC,CAAC;AACnB,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,SAAS,GAAG,EAAE,CAAC;AAErB,MAAM,WAAW,GAA2B;IAC1C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ;IACrF,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO;IACxF,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,QAAQ;CAClD,CAAC;AAEF,oEAAoE;AACpE,MAAM,QAAQ,GAA2B;IACvC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ;IAChF,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS;CAC3C,CAAC;AAEF,8CAA8C;AAC9C,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,WAAW,GAAG,KAAK,CAAC;AAC1B,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,iFAAiF;AACjF,0FAA0F;AAC1F,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU;IAC5F,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO;CAChG,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,yBAAyB,CAAC;AAE7C,4FAA4F;AAC5F,qDAAqD;AACrD,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9E,MAAM,SAAS,GAAG,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAEhE,mFAAmF;AACnF,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE9C,uFAAuF;AACvF,MAAM,WAAY,SAAQ,KAAK;IAC7B,YAAqB,EAAU,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADI,OAAE,GAAF,EAAE,CAAQ;QAE7B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAaD,0FAA0F;AAC1F,SAAS,WAAW,CAAC,IAAc,EAAE,EAAU;IAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,YAAY,CAAC,IAAc,EAAE,MAAc;IAClD,OAAO;QACL,IAAI;QACJ,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM;QACpB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,qCAAqC,MAAM,aAAa;KAChF,CAAC;AACJ,CAAC;AAiCD,MAAM,KAAK;IAmBT,YAAY,OAAwB;QAlB3B,QAAG,GAAmB,EAAE,CAAC;QAKlC,gFAAgF;QAChF,WAAM,GAAG,GAAG,CAAC;QAGb,uFAAuF;QACvF,gBAAW,GAAG,KAAK,CAAC;QACpB;;;;WAIG;QACH,aAAQ,GAAG,KAAK,CAAC;QAGf,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,wBAAwB,CAAC;QACnE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,gBAAgB,IAAI,wBAAwB,CAAC;QACxE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACtC,CAAC;IAED,iFAAiF;IACjF,IAAI,CAAC,IAAsB,EAAE,EAAU,EAAE,OAAe,EAAE,QAAiB;QACzE,MAAM,CAAC,GAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;QAC9C,IAAI,QAAQ;YAAE,CAAC,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,0EAA0E;IAC1E,MAAM,CAAC,IAAsB,EAAE,KAAY,EAAE,CAAS,EAAE,IAAY;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW;YAC5B,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,MAAM,CAAC,GAAiB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE,CAAC;QACtG,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IAED,uDAAuD;IACvD,KAAK,CAAC,KAAY,EAAE,CAAS;QAC3B,IAAI,EAAE,IAAI,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,IAAI,CAAC,WAAW,2BAA2B,CAAC,CAAC;QACvG,CAAC;IACH,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB,EAAE,UAA2B,EAAE;IAC3E,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,qFAAqF;QACrF,sFAAsF;QACtF,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,4EAA4E;IAC5E,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,OAAmB,EAAE,UAA2B,EAAE;IAChF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAClF,MAAM,KAAK,GAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IACzF,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,qBAAqB,OAAO,CAAC,UAAU,yCAAyC,CAAC,CAAC;QAC7G,CAAC;aAAM,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,oCAAoC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACnH,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QACzG,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,uCAAuC,GAAG,yCAAyC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC/H,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,MAA+B,EAC/B,KAA8B,EAC9B,UAAuC,IAAI,GAAG,EAAE;IAEhD,MAAM,GAAG,GAAG,CAAC,IAAsB,EAAE,QAA4B,EAAE,EAAE,CAAC,GAAG,IAAI,SAAS,QAAQ,IAAI,EAAE,EAAE,CAAC;IACvG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC;QACpG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AA0BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAqC,EACrC,OAA2C,EAC3C,UAAuC,IAAI,GAAG,EAAE,EAChD,UAA2B,EAAE;IAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,UAAU,CAAC,2BAA2B,CAAC,CAAC,IAAI,iBAAiB,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9D,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,eAAe,CACjC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,EACrD,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,EAC3D,OAAO,CACR,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/C,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,OAAO,KAAK,EAAE,CAAC;YACjB,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,EAAE,GAAG,YAAY,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QAChI,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;IACD,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAC/C,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAC1B,mDAAmD;QACnD,OAAO,eAAe,CAAC,UAAU,CAAC,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChD,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,YAAY,WAAW,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClF,OAAO,KAAK,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED,qFAAqF;IACrF,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,MAAM,YAAY,GAA0B,EAAE,CAAC;IAC/C,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC;gBACnB,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;gBAChC,MAAM,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpD,CAAC;YACD,YAAY,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,KAAK,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACvI,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzF,6FAA6F;IAC7F,8EAA8E;IAC9E,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,WAAW,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxH,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAC1H,MAAM,SAAS,GAAG,CAAC,KAAe,EAAW,EAAE;QAC7C,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACxD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,KAAK,GAAG,eAAe,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;QAC3E,SAAS,CAAC,OAAO,CAAC,CAAC;QACnB,KAAK,GAAG,eAAe,CAAC,CAAC,GAAG,UAAU,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gGAAgG;AAChG,6FAA6F;AAC7F,wCAAwC;AACxC,SAAS,YAAY,CAAC,MAAkB;IACtC,OAAO,MAAM,CAAC,UAAU,IAAI,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;WAC3C,CAAC,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,MAAM,CAAC,UAAU,CAAC;AACtG,CAAC;AAED,wGAAwG;AACxG,SAAS,QAAQ,CAAC,MAAkB;IAClC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1G,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AACnD,CAAC;AAED,gGAAgG;AAChG,gGAAgG;AAChG,6DAA6D;AAC7D,SAAS,MAAM,CAAC,MAAqB,EAAE,EAAU,EAAE,OAAwB;IACzE,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IACjC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,WAAW,GAAG,0BAA0B,CAAC;IACjD,CAAC;IACD,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,GAAG,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,EAAE,EAAE,iCAAiC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnH,CAAC;AACH,CAAC;AAED,4FAA4F;AAC5F,8FAA8F;AAC9F,SAAS,SAAS,CAAC,GAAY,EAAE,MAAc;IAC7C,MAAM,EAAE,GAAG,GAAG,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,GAAG,GAAG,GAAG,YAAY,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;IACzG,OAAO,CAAC,EAAE,EAAE,6BAA6B,EAAE,QAAQ,GAAG,yCAAyC,CAAC,CAAC;AACnG,CAAC;AAED,wEAAwE;AACxE,SAAS,SAAS,CAAC,OAA8B;IAC/C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,KAAK,CAAC,OAA0B,EAAE,OAA8B;IACvE,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC;AAC3G,CAAC;AAED,SAAS,MAAM,CAAC,MAAkB,EAAE,OAA8B;IAChE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;IACzF,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnB,IAAI,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACf,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,SAAS,CAAC,KAAY,EAAE,KAAiB;IAChD,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,kBAAkB,KAAK,CAAC,UAAU,oDAAoD,CAAC,CAAC;QACpH,OAAO;IACT,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO;IACT,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAC5E,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACxD,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;AAC3D,CAAC;AAED,kGAAkG;AAClG,SAAS,WAAW,CAAC,KAAY,EAAE,KAAiB;IAClD,yFAAyF;IACzF,sFAAsF;IACtF,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,EAAE,2EAA2E;cACzG,kGAAkG,CAAC,CAAC;IAC1G,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;IAC1D,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,gFAAgF;cAC1G,0CAA0C,CAAC,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,4BAA4B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,wBAAwB;cAClH,kEAAkE,CAAC,CAAC;QACxE,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI;YACtE,CAAC,CAAC,6GAA6G;YAC/G,CAAC,CAAC,4BAA4B,OAAO,qEAAqE;kBACtG,2BAA2B,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,4BAA4B,OAAO,mDAAmD;cAChH,4FAA4F,CAAC,CAAC;QAClG,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,2FAA2F;AAC3F,SAAS,eAAe,CAAC,IAAc,EAAE,KAAiB;IACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACzE,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,KAAY,EAAE,IAAc,EAAE,KAAiB,EAAE,MAAc;IAClF,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC;IAChC,IAAI,EAAE,GAAG,GAAG,CAAC;IACb,OAAO,EAAE,GAAG,MAAM,EAAE,CAAC;QACnB,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC3B,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,0FAA0F;YAC1F,oFAAoF;YACpF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,EAAE,GAAG,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxF,mFAAmF;gBACnF,iFAAiF;gBACjF,oFAAoF;gBACpF,mEAAmE;gBACnE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,sBAAsB,KAAK,2DAA2D;sBAC5G,8FAA8F,CAAC,CAAC;gBACpG,MAAM;YACR,CAAC;YACD,IAAI,EAAE,GAAG,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,CAAC;gBACpE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,KAAK,GAAG,CAAC;oBACjC,CAAC,CAAC,sBAAsB,KAAK,uBAAuB,KAAK,+BAA+B;0BACpF,4DAA4D;oBAChE,CAAC,CAAC,sBAAsB,KAAK,qBAAqB,KAAK,8CAA8C;0BACjG,yDAAyD,CAAC,CAAC;gBACjE,MAAM;YACR,CAAC;YACD,IAAI,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,IAAI,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC5F,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,KAAK,yBAAyB,EAAE,gDAAgD;sBACzG,0GAA0G;sBAC1G,oBAAoB,CAAC,CAAC;gBAC1B,EAAE,IAAI,KAAK,CAAC;gBACZ,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,sCAAsC,QAAQ,CAAC,IAAI,CAAC,YAAY;kBACxG,qDAAqD,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;QACD,IAAI,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,iBAAiB,MAAM,GAAG,EAAE,sDAAsD,CAAC,CAAC;YAC9G,MAAM;QACR,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,sBAAsB,EAAE,aAAa,CAAC,8BAA8B,MAAM,GAAG,EAAE,GAAG,CAAC,GAAG;kBAC5G,4DAA4D,CAAC,CAAC;YAClE,MAAM;QACR,CAAC;QACD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,WAAW,CAAC,KAAY,EAAE,MAAkB,EAAE,EAAU,EAAE,QAA4B;IAC7F,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO,gBAAgB,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC1E,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,EAAE,sBAAsB,EAAE,yBAAyB,QAAQ,CAAC,IAAI,CAAC,kBAAkB;UAC9G,uFAAuF,CAAC,CAAC;IAC7F,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,KAAiB,EAAE,EAAU;IAC5C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,OAAO,GAAG,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,CAAC;IACzD,OAAO,GAAG,GAAG,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,aAAa,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,uEAAuE;AACvE,SAAS,WAAW,CAAC,KAAY,EAAE,KAAY,EAAE,EAAU,EAAE,CAAS;IACpE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,sBAAsB,EAAE,qDAAqD;cACxG,4CAA4C,CAAC,CAAC;QAClD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACnD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,EAAE,sBAAsB,EAAE,aAAa,CAAC,8CAA8C;cAC1G,yGAAyG,EAC7G,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,gBAAgB,CAAC,KAAY,EAAE,OAAmB,EAAE,EAAU,EAAE,KAAyB;IAChG,MAAM,MAAM,GAAe,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAChE,2FAA2F;IAC3F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,CAAC,IAAY,EAAQ,EAAE;QACnC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,IAAgB,EAAc,EAAE;QAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,CAAC,GAAiB,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;YACpE,IAAI,IAAI,CAAC,IAAI;gBAAE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;YACtC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,GAAG,IAAI,sEAAsE,CAAC,CAAC;QACrF,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;IACxE,IAAI,QAAoB,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,KAAK,IAAI,KAAK,CAAC,UAAU,GAAG,OAAO,EAAE,CAAC;YACxC,MAAM,IAAI,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,QAAQ,GAAG,KAAK,IAAI,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,mBAAmB,EAAE,CAAC;YACvC,IAAI,OAAO,GAAG,0BAA0B,EAAE,CAAC;gBACzC,MAAM,IAAI,WAAW,CAAC,EAAE,EAAE,iBAAiB,KAAK,CAAC,WAAW,2BAA2B,CAAC,CAAC;YAC3F,CAAC;YACD,KAAK,CAAC,6BAA6B,0BAA0B,0CAA0C,CAAC,CAAC;YACzG,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;QACD,KAAK,CAAC,qBAAqB,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC;IACzC,wFAAwF;IACxF,uFAAuF;IACvF,wFAAwF;IACxF,4DAA4D;IAC5D,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACjH,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,KAAK,CAAC,mGAAmG;cACrG,iEAAiE,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,QAAQ,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,eAAe,QAAQ,CAAC,UAAU,+DAA+D,CAAC,CAAC;QACzG,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,mFAAmF,CAAC,CAAC;QAC3F,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,CAAC,iCAAiC,QAAQ,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QAC/G,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,EAAE,iCAAiC,EAAE,8CAA8C;cAC5G,sDAAsD,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QACb,KAAK,CAAC,gCAAgC,CAAC,8BAA8B,IAAI,2BAA2B;cAChG,oDAAoD,CAAC,CAAC;IAC5D,CAAC;SAAM,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC;QACpB,KAAK,CAAC,eAAe,IAAI,GAAG,CAAC,kFAAkF,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,OAAmB;IAC1C,IAAI,OAAO,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,SAAS,OAAO,CAAC,UAAU,+CAA+C,CAAC;IACpF,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjC,OAAO,kCAAkC,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,8CAA8C,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC;IACvG,CAAC;IACD,IAAI,GAAG,GAAG,IAAI,EAAE,CAAC;QACf,OAAO,iDAAiD,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sCAAsC;AACtC,SAAS,OAAO,CAAC,KAAiB;IAChC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC;QACvB,6FAA6F;QAC7F,oCAAoC;QACpC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YACrB,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACd,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;QACD,CAAC,IAAI,KAAK,CAAC;QACX,CAAC,IAAI,KAAK,CAAC;IACb,CAAC;IACD,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,KAAY,EAAE,KAAY,EAAE,CAAS,EAAE,GAAW,EAAE,IAAY;IAC/E,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,mBAAmB,GAAG,GAAG,CAAC,gCAAgC,IAAI,WAAW;cACtG,oDAAoD,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAC1B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;QAChB,yFAAyF;QACzF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,8BAA8B,KAAK,0BAA0B;kBACtG,iCAAiC,CAAC,CAAC;YACvC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IACrE,CAAC;IACD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5C,yFAAyF;IACzF,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,IAAI,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC;QACzG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,aAAa,IAAI,iCAAiC;cAC1F,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,4CAA4C,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,qFAAqF;AACrF,SAAS,SAAS,CAAC,KAAY,EAAE,KAAY,EAAE,EAAU,EAAE,KAAa,EAAE,GAAW;IACnF,MAAM,IAAI,GAAe,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9D,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,IAAI,CAAC,SAAS,GAAG,MAAM,KAAK,IAAI,CAAC;IACjC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACf,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,KAAY,EAAE,EAAU,EAAE,KAAiB;IAC7D,IAAI,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,6BAA6B,EAAE,8BAA8B,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;cACtH,iEAAiE,EAAE,IAAI,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC;IACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,sBAAsB,IAAI,aAAa,EAAE,8CAA8C;cAC1G,2FAA2F,EAAE,IAAI,CAAC,CAAC;IACzG,CAAC;SAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,sBAAsB,IAAI,aAAa,EAAE,2CAA2C;cACvG,IAAI,IAAI,qBAAqB,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAY,EAAE,KAAY,EAAE,KAAa,EAAE,GAAW;IACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAClE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,gCAAgC,QAAQ,CAAC,CAAC,eAAe,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI;cACtH,qEAAqE,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;IACzB,IAAI,GAAG,GAAG,OAAO,IAAI,GAAG,GAAG,SAAS,EAAE,CAAC;QACrC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,GAAG,oCAAoC;cACxG,mBAAmB,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC;IACtB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACtE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,+BAA+B,OAAO,CAAC,CAAC,eAAe,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;kBAC/G,8EAA8E,CAAC,CAAC;YACpF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;YACrD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;gBACf,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,MAAM,sBAAsB;sBACpG,uBAAuB,CAAC,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClB,KAAK,IAAI,MAAM,CAAC;QAClB,CAAC;QACD,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACtD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1D,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,wBAAwB,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,2BAA2B;cACvG,+BAA+B,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACpF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5D,CAAC;AAED,oFAAoF;AACpF,SAAS,YAAY,CAAC,KAAY,EAAE,KAAY,EAAE,KAAa,EAAE,GAAW,EAAE,KAAa;IACzF,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,WAAW,EAAE,CAAC;QACxB,MAAM,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,6BAA6B,WAAW,cAAc,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;IACT,CAAC;IACD,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACf,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,SAAS,YAAY,CAAC,KAAY,EAAE,KAAY,EAAE,CAAS,EAAE,GAAW;IACtE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QACd,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,wEAAwE;cAC/G,0EAA0E,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,KAAY,EAAE,KAAY,EAAE,IAAgB,EAAE,GAAW,EAAE,KAAa;IACzF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,OAAO;YACV,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QAC9E,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5D,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,CAAC,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/C,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QACD,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3C,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,KAAK,WAAW;YACd,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACzF,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;YACnE,MAAM,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAClE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;QACpF,CAAC;QACD;YACE,OAAO,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;IAChH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,KAAY,EAAE,KAAY,EAAE,CAAS,EAAE,GAAW,EAAE,KAAa,EAAE,KAAa,EAAE,IAAY;IAC7G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;YACb,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,oBAAoB,CAAC,WAAW,KAAK,IAAI,IAAI,wCAAwC,CAAC,CAAC;YACxH,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,yBAAyB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB;kBAC1G,wCAAwC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,yFAAyF;QACzF,sEAAsE;QACtE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;YACd,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;QACD,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,+FAA+F;AAC/F,SAAS,SAAS,CAAC,KAAY,EAAE,KAAY,EAAE,CAAS,EAAE,GAAW,EAAE,IAAI,GAAG,YAAY;IACxF,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,IAAI,OAAO,GAAG,CAAC,CAAC,eAAe,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB;cAChH,4CAA4C,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,gGAAgG;AAChG,SAAS,UAAU,CAAC,KAAY,EAAE,KAAY,EAAE,IAAgB,EAAE,CAAS,EAAE,GAAW,EAAE,KAAa;IACrG,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,qCAAqC,QAAQ,CAAC,CAAC,eAAe,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI;cACvH,oDAAoD,CAAC,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAC1E,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5D,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,gCAAgC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB;cAClH,kCAAkC,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,qCAAqC,KAAK,UAAU,QAAQ,CAAC,CAAC,qBAAqB;cACjH,uBAAuB,CAAC,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,kFAAkF;IAClF,MAAM,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC;AAC9F,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,KAAY,EAAE,KAAY,EAAE,IAAgB,EAAE,GAAW;IACzE,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IAC5D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,IAAI,IAAI,GAAkB,IAAI,CAAC;YAC/B,IAAI,CAAC;gBACH,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3F,CAAC;YAAC,MAAM,CAAC;gBACP,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,kDAAkD,CAAC,CAAC;YAC/F,CAAC;YACD,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBAC3C,KAAK,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,mCAAmC,IAAI,CAAC,MAAM,2BAA2B;sBAC/G,qBAAqB,KAAK,oCAAoC,CAAC,CAAC;YACtE,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,QAAQ;YACX,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC;gBACxB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,oCAAoC,GAAG,CAAC,CAAC,8BAA8B;sBAC5G,GAAG,KAAK,6BAA6B,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM;QACR,KAAK,SAAS;YACZ,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,CAAC;gBACxB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,qCAAqC,GAAG,CAAC,CAAC,8BAA8B;sBAC7G,GAAG,KAAK,6BAA6B,CAAC,CAAC;YAC7C,CAAC;YACD,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBACrC,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;oBAChB,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,0CAA0C,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI;0BACnI,oGAAoG;0BACpG,+EAA+E,CAAC,CAAC;oBACrF,MAAM;gBACR,CAAC;YACH,CAAC;YACD,MAAM;QACR;YACE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,4BAA4B,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,2BAA2B;kBAC9G,yDAAyD,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACjB,IAAI,IAAI,CAAC,KAAK,GAAG,WAAW,EAAE,CAAC;QAC7B,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,0EAA0E;cAC/G,YAAY,CAAC,CAAC;QAClB,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,KAAY,EAAE,KAAY,EAAE,IAAgB,EAAE,GAAW;IAC5E,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACzF,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,wFAAwF;AACxF,SAAS,YAAY,CAAC,KAAY,EAAE,KAAY,EAAE,CAAS,EAAE,IAAgB,EAAE,GAAQ,EAAE,IAAY,EAAE,KAAa;IAClH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,GAAG,WAAW,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC;IAClE,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;QAC1C,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,YAAY,IAAI,iBAAiB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe;cAC/G,YAAY,IAAI,kBAAkB,QAAQ,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACxG,OAAO;IACT,CAAC;IACD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,YAAY,IAAI,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B;cAC5G,oCAAoC,CAAC,CAAC;QAC1C,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,KAAK,KAAK,EAAE,CAAC;QACnD,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,IAAI,YAAY,IAAI,OAAO,GAAG,CAAC,CAAC,eAAe,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW;cACnH,OAAO,KAAK,kBAAkB,KAAK,eAAe,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAY,EAAE,KAAY,EAAE,IAAgB,EAAE,GAAW;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACrB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;QACpG,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,0BAA0B,WAAW,CAAC,GAAG,CAAC,gCAAgC;cAC7G,iDAAiD,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,wBAAwB,IAAI,CAAC,IAAI,CAAC,MAAM,uCAAuC,CAAC,CAAC;IAC1H,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC;IAC7D,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;IAChE,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,CAAU,EAAE,CAAC;QACpG,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,sBAAsB,IAAI,QAAQ,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB;kBAC1G,SAAS,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5F,IAAI,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACtF,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,wCAAwC,EAAE,CAAC,CAAC,GAAG,CAAC,uBAAuB;cAC7G,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;QACxG,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,IAAI,CAAC;QACd,CAAC;QACD,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpH,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC;IACf,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAY,EAAE,IAAgB,EAAE,GAAW;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,IAAI,IAAI,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,WAAW,GAAG,WAAW,GAAG,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;QACxG,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;QAC1E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACzG,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CAAC,KAAY,EAAE,KAAY,EAAE,KAAa,EAAE,GAAW;IAC5E,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO;IACT,CAAC;IACD,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAClB,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,mBAAmB,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC/B,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,kDAAkD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI;sBAC1G,8BAA8B,CAAC,CAAC;gBACpC,OAAO;YACT,CAAC;YACD,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACxB,CAAC;YACD,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC;IAC5B,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,KAAY,EAAE,OAAqB,EAAE,MAAc,EAAE,MAAc;IACzF,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IACnB,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,uDAAuD,MAAM,EAAE,CAAC;QAC9E,MAAM,KAAK,GAAG,0EAA0E,CAAC;QACzF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,IAAI,MAAM,IAAI,MAAM;gBAClE,CAAC,CAAC,GAAG,KAAK,iCAAiC,KAAK,GAAG;gBACnD,CAAC,CAAC,GAAG,KAAK,6BAA6B,KAAK,GAAG,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAChC,iEAAiE;QACnE,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,GAAG,KAAK,wBAAwB,MAAM,CAAC,IAAI,yBAAyB,KAAK,GAAG,CAAC,CAAC;QACpH,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,GAAG,KAAK,qDAAqD,KAAK,GAAG,CAAC,CAAC;QAC7G,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,6EAA6E;sBAC7G,GAAG,CAAC,CAAC,EAAE,iFAAiF,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,EAAE,EAAE,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,wCAAwC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK;kBAC5G,oFAAoF,EAAE,CAAC,CAAC,IAAI,IAAI,SAAS,CAAC,CAAC;QACjH,CAAC;IACH,CAAC;IACD,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS;YACtB,CAAC,CAAC,sBAAsB,CAAC,CAAC,EAAE,qEAAqE;YACjG,CAAC,CAAC,sBAAsB,CAAC,CAAC,EAAE,cAAc,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,sEAAsE;cAC9G,2BAA2B;cAC3B,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,yCAAyC,KAAK,sBAAsB,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC7H,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACZ,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC,IAAI,6BAA6B,CAAC,CAAC,EAAE,mBAAmB,IAAI,KAAK;kBAC/G,8EAA8E,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;AACH,CAAC"} \ No newline at end of file diff --git a/dist/datamodel/parser/MatFileWriter.d.ts b/dist/datamodel/parser/MatFileWriter.d.ts new file mode 100644 index 00000000..18d78e17 --- /dev/null +++ b/dist/datamodel/parser/MatFileWriter.d.ts @@ -0,0 +1,80 @@ +import type { MatRecord } from './MatParser.js'; +import { MatWriteError } from './MatWriter.js'; +import type { MatCheckOptions } from './MatFileCheck.js'; +import type BaseNode from '../node/BaseNode.js'; +import type MatNode from '../node/container/MatNode.js'; +/** + * The bytes of the MAT-file `matNode` is, as it stands now: what was edited written fresh, + * everything else as the bytes it was read from. Throws MatWriteError, naming the variable or + * the file and why, for anything it cannot write as what it is (see the file header), and + * never hands back bytes that did not read back as planned. + * + * `check` is the budget of the check of what was written (MatFileCheck), its own by default: + * for tests, which cannot make a file a gigabyte past it. + */ +export declare function serializeMatFile(matNode: MatNode, check?: MatCheckOptions): Uint8Array; +/** + * The refusal of every save of `matNode`, an unedited one included, or null: a tree opened + * without the records a save writes back, one whose bytes the host has since handed away, and + * a file whose records do not tile it. Asked first by serializeMatFile, and by the editor, which + * takes no edit of a file no save can write (MatNode._editRefusal). + */ +export declare function unsavableRefusal(matNode: MatNode): MatWriteError | null; +export declare function subsystemOf(matNode: MatNode, records: MatRecord[]): MatRecord | null; +/** Why the edit of a variable stored after the subsystem is refused (planOf, and the editor's gate). */ +export declare const PAST_SUBSYSTEM: string; +/** + * The refusal of a save of a file with an unnamed record that is not its subsystem, or whose + * header puts its subsystem where no unnamed record starts, or null: such a save cannot place + * what it writes where MATLAB reads it. Measured against MATLAB R2027a, MATLAB lists no variable + * past the first unnamed record, and a header offset that is not the subsystem's fails the whole + * load. Asked only of a save that changes the file: one that does not hands back the bytes it was + * read from. So the editor asks it of every edit (MatNode._editRefusal). + */ +export declare function structureRefusal(matNode: MatNode, records: MatRecord[], subsystem: MatRecord | null): MatWriteError | null; +/** Why a variable is not written under `name`, which another variable of the file has (refuseDuplicates, and the editor's gate). */ +export declare function duplicateWhy(name: string): string; +/** + * Why the variable read from `record` cannot be renamed, or null where it can: its record is not + * one whole element whose name can be replaced (elementOfRecord, MatWriter.elementNamed), which a + * record MATLAB writes always is. Asked by renamedOf, and by a rename before it is made + * (MatNode._renameRefusal), once a record: the records never change, and asking inflates one. + */ +export declare function renameWhy(record: MatRecord): string | null; +/** + * The refusal a save throws for writing `node` fresh, the variable `record` became or one added + * since (no record), or null where nothing about what it is refuses it: what an edit of anything + * of it but its own name asks of a save. A name that is no MATLAB name by the rule a rename is + * held to; a variable that was not a plain value, or whose node is a typed object's (freshOf); one + * holding what this writer cannot write at any depth (unwritableIn); one with no form at all, a + * container none of whose elements could be read (_heldNone) or a size that is no count + * (_refuseNoSize); one holding a container read short at any depth (shortIn); and one stored in + * a form MATLAB does not load as it is (storedRefusal). + * + * One rule for freshOf, which throws it, and for the editor, which takes no edit a save would + * refuse so (MatNode._editRefusal): the two cannot come to disagree. What it does not judge is + * what only the value's bytes say, MatWriter's budget among them, which freshElement meets. + */ +export declare function freshRefusal(node: BaseNode, record: MatRecord | null): MatWriteError | null; +/** + * The first node at or under `at` that MatWriter cannot write as what it is (the rule of + * MatlabVariableNode._matWritable), with its MATLAB path and what it is, or null for none. Asked + * by freshRefusal, and by the editor of a value about to be typed in (MatNode._valueRefusal). + * + * A container the node ceiling built without its rows (_cutByCeiling) is written as the variable + * it was read as (MatlabVariableNode._var), so that variable is what is asked of it, and not its + * rows, which _matWritable would find none of to refuse: a cell of function handles, cut, said + * nothing, and its edit was refused by MatWriter at the save. + */ +export declare function unwritableIn(at: BaseNode): { + path: string; + what: string; +} | null; +/** + * The miCOMPRESSED record of `stream`, the zlib stream of the variable `name`'s element: its tag + * and the stream. Refused for a stream of 4 GiB or more, whose length the tag's 32 bits cannot + * say: written, its length would wrap, and the record would declare a few bytes of a stream that + * goes on. Exported for test/matFileSave.test.ts, which holds it to that without a stream so big. + */ +export declare function compressedRecordOf(stream: Uint8Array, name: string): Uint8Array; +//# sourceMappingURL=MatFileWriter.d.ts.map \ No newline at end of file diff --git a/dist/datamodel/parser/MatFileWriter.d.ts.map b/dist/datamodel/parser/MatFileWriter.d.ts.map new file mode 100644 index 00000000..1866756b --- /dev/null +++ b/dist/datamodel/parser/MatFileWriter.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"MatFileWriter.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/MatFileWriter.ts"],"names":[],"mappings":"AA0DA,OAAO,KAAK,EAAE,SAAS,EAA0B,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAkB,aAAa,EAAgD,MAAM,gBAAgB,CAAC;AAE7G,OAAO,KAAK,EAAE,eAAe,EAAsC,MAAM,mBAAmB,CAAC;AAG7F,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAEhD,OAAO,KAAK,OAAO,MAAM,8BAA8B,CAAC;AAMxD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,GAAE,eAAoB,GAAG,UAAU,CAuB1F;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,GAAG,IAAI,CA6BvE;AAuBD,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,CAKpF;AAgED,wGAAwG;AACxG,eAAO,MAAM,cAAc,QAEmC,CAAC;AAE/D;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,CAmB1H;AAmBD,oIAAoI;AACpI,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjD;AAmCD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAQ1D;AA0BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,GAAG,aAAa,GAAG,IAAI,CAwC3F;AAsLD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAOhF;AAiGD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAO/E"} \ No newline at end of file diff --git a/dist/datamodel/parser/MatFileWriter.js b/dist/datamodel/parser/MatFileWriter.js new file mode 100644 index 00000000..97c4c72a --- /dev/null +++ b/dist/datamodel/parser/MatFileWriter.js @@ -0,0 +1,1051 @@ +// Copyright 2026 The MathWorks, Inc. +// +// A save of a Level-5 MAT-file (`-v6`, `-v7`): the file it was read from, with what was edited +// written fresh and everything else written as the bytes it was read from. +// +// WHY A SPLICE. A MAT-file is a header and a run of top-level records, each one variable, and +// the last one, unnamed, the subsystem that holds every object of the file. Nothing in a record +// points at another record, and nothing in the subsystem names a variable. So a record nobody +// edited can be written back as its own bytes, compressed as it was, which no re-encode +// reproduces: inflated and deflated again by fflate at level 6, 18 of the 78 compressed records +// of test/parity/artifacts/mat/cases.mat come back as they were. And the reader holds what it +// did not read (a record it could not inflate, a class it does not model) only as bytes. This +// is MATLAB's own update model too: measured against MATLAB R2027a, `save -append` copies every +// record it does not replace byte for byte, a compressed one included, keeps the header's text, +// and writes the subsystem last. +// +// What each record of the file becomes, in the file's order (plan): +// +// the node it became was deleted nothing +// unedited its own bytes +// only renamed its element with the name replaced (MatWriter. +// elementNamed), compressed again if it was +// its value edited, a plain value written fresh (MatlabVariableNode._matStream), +// named, compressed when the file holds any +// compressed record +// no node: the subsystem, a record the its own bytes +// reader dropped +// +// and a variable added since the read is written fresh, after the last variable and before the +// subsystem. The header keeps its 116 bytes of text and its version and byte-order mark, and +// bytes 116-123 say where the subsystem now starts, which MATLAB trusts without a scan +// (measured against MATLAB R2027a: a stale offset fails the whole load). +// +// "Unedited" is decided by the node's status, which every edit sets (DataNode._markModified), +// and never by whether a value still has the bytes it was read from: those stay on a variable +// after an edit. "Only renamed" is the status, a name that is not the record's, and no edit of +// the value (DataNode._valueEdited). +// +// EVERY DOUBT REFUSES THE SAVE. A save that cannot write a variable as what it is throws a +// MatWriteError naming it, and nothing is written: an object, a function handle or a value the +// reader did not decode, whose edit this writer cannot write; a variable stored in a form MATLAB +// does not load as it is, whose value as read is this reader's guess at it; a variable stored +// after the subsystem, where MATLAB does not read it; a file whose records do not tile it, or that was +// opened without them. And before the bytes are handed back, every record written anew is read +// again, and one that does not read back as planned refuses the save as well (selfCheck), as does +// a file that breaks a rule MATLAB loads a file by that the file it was read from did not break +// (MatFileCheck). Both are asked of what the save changed, and of where every record stands: a +// record written as its own bytes is the record it was read as, and breaks what that one broke. +// +// The editor takes none of the edits refused for what a variable is or where it stands: its gate +// (MatNode._editRefusal) is built of the refusals exported here (unsavableRefusal, +// structureRefusal, freshRefusal, renameWhy, PAST_SUBSYSTEM, duplicateWhy), so that an edit it takes +// is one a save writes, and the two cannot come to disagree. What is left to refuse at the save is +// what only a value's bytes say: MatWriter's budget, and the two checks of what was written. +import { zlibSync } from 'fflate'; +import { inflateZlib } from './Inflate.js'; +import { parseMat, functionHandleOf } from './MatParser.js'; +import { MatBudgetError, MatWriteError, classPhrase, elementNamed, encodeMatVariable } from './MatWriter.js'; +import { checkMatElement, violationsAddedBySplice } from './MatFileCheck.js'; +import { integerConversion } from './XmlUtils.js'; +import { validateMatlabName } from '../matlabName.js'; +const MI_MATRIX = 14; +const MI_COMPRESSED = 15; +/** + * The bytes of the MAT-file `matNode` is, as it stands now: what was edited written fresh, + * everything else as the bytes it was read from. Throws MatWriteError, naming the variable or + * the file and why, for anything it cannot write as what it is (see the file header), and + * never hands back bytes that did not read back as planned. + * + * `check` is the budget of the check of what was written (MatFileCheck), its own by default: + * for tests, which cannot make a file a gigabyte past it. + */ +export function serializeMatFile(matNode, check = {}) { + const file = matNode.name; + const unsavable = unsavableRefusal(matNode); + if (unsavable) { + throw unsavable; + } + const records = matNode.records; + const headerBytes = matNode.headerBytes; + const subsystem = subsystemOf(matNode, records); + const plan = planOf(matNode, records, subsystem); + // Nothing deleted, renamed, edited or added: the file, as it was read. + if (plan.length === records.length && plan.every((p, i) => p.kind === 'verbatim' && p.record === records[i])) { + return concat([headerBytes, ...records.map((r) => r.bytes)], fileTooBig(file)); + } + const structure = structureRefusal(matNode, records, subsystem); + if (structure) { + throw structure; + } + const assembled = assemble(file, headerBytes, plan, subsystem); + selfCheck(file, assembled, plan, headerBytes); + refuseWorse(file, assembled, plan, headerBytes, records, check); + return assembled.bytes; +} +/** + * The refusal of every save of `matNode`, an unedited one included, or null: a tree opened + * without the records a save writes back, one whose bytes the host has since handed away, and + * a file whose records do not tile it. Asked first by serializeMatFile, and by the editor, which + * takes no edit of a file no save can write (MatNode._editRefusal). + */ +export function unsavableRefusal(matNode) { + const file = matNode.name; + const { records, headerBytes } = matNode; + if (!records || !headerBytes) { + return new MatWriteError('Cannot save "' + file + '": it was opened without the records a save writes back, so a save would lose every one ' + + 'this package did not read. Nothing was written.'); + } + // The records are views of the bytes the file was read from, which a host that transfers + // them to a worker afterwards empties: what was not edited would be written as nothing. + const gone = headerBytes.byteLength !== 128 ? { offset: 0, length: 128, bytes: headerBytes } : records.find((r) => r.bytes.byteLength !== r.length); + if (gone) { + return new MatWriteError('Cannot save "' + file + '": the bytes it was read from are no longer held (the ' + (gone.offset === 0 ? 'header' : 'record at byte ' + gone.offset) + + ' holds ' + gone.bytes.byteLength + ' of its ' + gone.length + '), so what was not edited could not be written as it was. ' + + 'Nothing was written.'); + } + if (!matNode.framed) { + const at = matNode.unframed?.at ?? 128; + const unframedBytes = headerBytes.buffer.byteLength - headerBytes.byteOffset - at; + return new MatWriteError('Cannot save "' + file + '": this package could not frame ' + unframedBytes + ' byte(s) of it, from byte ' + at + + (matNode.unframed ? ' (' + matNode.unframed.reason + ')' : '') + + ', so a save could not keep them as they are. Nothing was written.'); + } + return null; +} +// The record `matNode`'s header says its subsystem starts at, or null when it says there is none, +// or names a byte where no unnamed record starts (structureRefusal). By offset, and not by which +// record has no name: a matrix too short for its own flags reads as unnamed too. And unnamed, +// because a variable the header points at is a variable, whose edit is written or refused as +// any other's, and not passed over as the subsystem it is not. +export function subsystemOf(matNode, records) { + if (matNode.subsystemOffset === 0) { + return null; + } + return records.find((r) => r.offset === matNode.subsystemOffset && r.anonymous) ?? null; +} +// The file's records, each as a save writes it, in the file's order, and every variable added +// since the read just before the subsystem, or at the end of a file with none, in the order they +// were added. A record that became no node (the subsystem, one the reader dropped) is its own +// bytes. One past the subsystem, which MATLAB does not read, is too, and its edit refuses the +// save: written where it is, MATLAB still would not read it, and moved, what MATLAB loads of the +// file would change. Deleting one changes nothing MATLAB loads, and is written. +function planOf(matNode, records, subsystem) { + const compress = records.some((r) => r.compressed); + const added = matNode.children.filter((c) => matNode.recordOf(c) === null); + const plan = []; + const addAdded = () => { + for (const node of added) { + plan.push(freshOf(node, null, compress)); + } + }; + let pastSubsystem = false; + for (const record of records) { + if (record === subsystem) { + addAdded(); + plan.push({ kind: 'verbatim', record }); + pastSubsystem = true; + continue; + } + const node = matNode.nodeOf(record); + if (!node) { + plan.push({ kind: 'verbatim', record }); + continue; + } + if (node.parent !== matNode) { + continue; + } + const edit = editOf(node, record); + if (edit === 'none') { + plan.push({ kind: 'verbatim', record }); + } + else if (pastSubsystem) { + throw refusal(node.name, PAST_SUBSYSTEM); + } + else if (edit === 'name') { + plan.push(renamedOf(node, record)); + } + else { + plan.push(freshOf(node, record, compress)); + } + } + if (!subsystem) { + addAdded(); + } + refuseDuplicates(plan); + return plan; +} +// What has happened to the variable `record` became, `node`: decided by its status, which every +// edit sets (DataNode._markModified), and by whether anything but its own rename set it +// (DataNode._valueEdited). A rename undone leaves the status set and the name the file's: it is +// unedited. Its name is asked whatever the status, so that a rename made around the API, which +// sets none, is still written as one. +function editOf(node, record) { + const { status, _valueEdited } = node; + if (status === 'New' || (status === 'Modified' && _valueEdited)) { + return 'value'; + } + return node.name !== record.name ? 'name' : 'none'; +} +/** Why the edit of a variable stored after the subsystem is refused (planOf, and the editor's gate). */ +export const PAST_SUBSYSTEM = "it is stored after the file's objects, where MATLAB does not read it, so it would not be read written there, " + + 'and moved, it would change what MATLAB loads of the file'; +/** + * The refusal of a save of a file with an unnamed record that is not its subsystem, or whose + * header puts its subsystem where no unnamed record starts, or null: such a save cannot place + * what it writes where MATLAB reads it. Measured against MATLAB R2027a, MATLAB lists no variable + * past the first unnamed record, and a header offset that is not the subsystem's fails the whole + * load. Asked only of a save that changes the file: one that does not hands back the bytes it was + * read from. So the editor asks it of every edit (MatNode._editRefusal). + */ +export function structureRefusal(matNode, records, subsystem) { + const file = matNode.name; + const offset = matNode.subsystemOffset; + if (offset !== 0 && !subsystem) { + return new MatWriteError('Cannot save "' + file + '": its header places the file\'s objects at byte ' + offset + ', where ' + + (records.some((r) => r.offset === offset) ? 'a variable is' : 'no record starts') + ', so a save cannot say where they are. ' + + 'Nothing was written.'); + } + const stray = records.find((r) => r.anonymous && r !== subsystem); + if (stray) { + return new MatWriteError('Cannot save "' + file + '": the record at byte ' + stray.offset + ' holds a value with no name that is not the ' + + 'file\'s objects, and MATLAB reads no variable past one, so a save cannot place an edit where MATLAB reads it. ' + + 'Nothing was written.'); + } + return null; +} +// Two records of one name: MATLAB loads one of them (measured against MATLAB R2027a: `load f` +// keeps the last, `load f x` the first). A file that holds two keeps them, as it was read; a +// rename or an addition that would make two is refused, naming the variable. A record the reader +// could not read a name out of is held to none (MatNode._namespaceHolds says why). +function refuseDuplicates(plan) { + const count = new Map(); + const nameOf = (p) => (p.kind === 'verbatim' ? p.record.name : p.name); + for (const p of plan) { + count.set(nameOf(p), (count.get(nameOf(p)) ?? 0) + 1); + } + for (const p of plan) { + if (p.kind !== 'verbatim' && count.get(p.name) > 1) { + throw refusal(p.name, duplicateWhy(p.name)); + } + } +} +/** Why a variable is not written under `name`, which another variable of the file has (refuseDuplicates, and the editor's gate). */ +export function duplicateWhy(name) { + return 'the file holds another variable named "' + name + '", and MATLAB loads only one of them'; +} +// The refusal of a save for variable `name`, worded as every refused write is (MatWriter's +// budgetFailure, DataNode's): the variable, why, and that nothing was written. +function refusal(name, why) { + return new MatWriteError('Cannot write "' + name + '": ' + why + '. Nothing was written.'); +} +// A name this writer puts in an element: a valid MATLAB name, by the rule a rename is held to +// (matlabName), which is stricter than MATLAB's and holds for older releases. A variable added +// by a caller that named it itself (MatNode.execAddEntry) has had no other check. +function refuseName(name) { + const error = validateMatlabName(name); + if (error) { + throw refusal(name, 'it is not a name MATLAB can load (' + error + ')'); + } +} +// ---- What a renamed or an edited record is written as ----------------------------------------- +// The record of a variable only renamed: its element as read, with the name subelement replaced +// (MatWriter.elementNamed) and every other byte copied, compressed again when it was. An object +// variable, a function handle and a value the reader did not decode are renamed so as well: +// nothing of them but their name is written. +function renamedOf(node, record) { + const name = node.name; + refuseName(name); + const why = renameWhy(record); + if (why) { + throw refusal(name, why); + } + const element = elementOfRecord(record); + return { kind: 'renamed', record, name, bytes: recordBytes(elementNamed(element, name), record.compressed, name), element }; +} +/** + * Why the variable read from `record` cannot be renamed, or null where it can: its record is not + * one whole element whose name can be replaced (elementOfRecord, MatWriter.elementNamed), which a + * record MATLAB writes always is. Asked by renamedOf, and by a rename before it is made + * (MatNode._renameRefusal), once a record: the records never change, and asking inflates one. + */ +export function renameWhy(record) { + let can = renamable.get(record); + if (can === undefined) { + const element = elementOfRecord(record); + can = !!element && elementNamed(element, '') !== null; + renamable.set(record, can); + } + return can ? null : 'the record it was read from, at byte ' + record.offset + ', is not a whole element whose name can be replaced, so it cannot be renamed'; +} +const renamable = new WeakMap(); +// The record of a value written fresh: `node`'s, an edited variable read from `record` or one +// added since, named, and compressed when the file holds any compressed record, so that a `-v6` +// file, which holds none and is readable by every MATLAB, stays one. +// +// Only a plain MATLAB value is written fresh. A variable that was an object, a string, a function +// handle or a value the reader did not decode is refused when anything but its name changed, as +// is a typed object's node, whatever it holds now: this writer has no encoder for an object, and +// the record's own bytes, which are the only thing it could write, are no longer the value. +function freshOf(node, record, compress) { + const name = node.name; + const refused = freshRefusal(node, record); + if (refused) { + throw refused; + } + const value = valueNodeOf(node); + const named = elementNamed(globalAsRead(freshElement(value), record), name); + if (!named) { + throw refusal(name, 'the element written for it has no name to replace'); + } + return { kind: 'fresh', record, node: value, name, bytes: recordBytes(named, compress, name) }; +} +/** + * The refusal a save throws for writing `node` fresh, the variable `record` became or one added + * since (no record), or null where nothing about what it is refuses it: what an edit of anything + * of it but its own name asks of a save. A name that is no MATLAB name by the rule a rename is + * held to; a variable that was not a plain value, or whose node is a typed object's (freshOf); one + * holding what this writer cannot write at any depth (unwritableIn); one with no form at all, a + * container none of whose elements could be read (_heldNone) or a size that is no count + * (_refuseNoSize); one holding a container read short at any depth (shortIn); and one stored in + * a form MATLAB does not load as it is (storedRefusal). + * + * One rule for freshOf, which throws it, and for the editor, which takes no edit a save would + * refuse so (MatNode._editRefusal): the two cannot come to disagree. What it does not judge is + * what only the value's bytes say, MatWriter's budget among them, which freshElement meets. + */ +export function freshRefusal(node, record) { + const name = node.name; + const nameError = validateMatlabName(name); + if (nameError) { + return refusal(name, 'it is not a name MATLAB can load (' + nameError + ')'); + } + const was = record?.variable ? notPlain(record.variable) : null; + const value = valueNodeOf(node); + if (was || !value) { + const what = was ?? classPhrase(String(node.className || 'object')); + return refusal(name, 'it is ' + what + ', which a MAT-file save writes only as it was read, or renamed, so its edit cannot be saved'); + } + const unwritable = unwritableIn(value); + if (unwritable) { + return refusal(name, unwritable.path + ' is ' + unwritable.what + ', which this package cannot write into a MAT-file'); + } + if (value._heldNone()) { + return value._heldNoneRefusal(); + } + try { + value._refuseNoSize(); + } + catch (e) { + if (e instanceof MatWriteError) { + return e; + } + throw e; + } + const short = shortIn(value); + if (short) { + return refusal(name, short.path + ' is ' + short.what + ', and a save would write the ones it does not hold as empty'); + } + // And one stored in a form MATLAB does not load as it is (storedRefusal). Last, so that a + // refusal that says more of the same damage (a container read short, a value not decoded) is + // the one given. + const stored = record ? storedRefusal(record) : null; + if (stored) { + return refusal(name, 'it is stored in a form MATLAB does not load as it is (' + stored + '), so there is no value of it a save ' + + 'can be held to: it is written only as it was read, or renamed'); + } + return null; +} +// The rules of MatFileCheck a variable's own element can break whose break says that what this +// package read of it is not a value MATLAB loads: char data MATLAB does not read as text, or +// reads otherwise (miUINT8 Latin-1 bytes, which this reader decodes as UTF-8, miUTF32, which it +// decodes as UTF-8 too, and CJK in miUINT16, of which MATLAB keeps the low byte of each unit), a +// char's UTF-8 that does not hold its count, a numeric class stored in another's type, a matrix +// its sub-elements do not fill, one MATLAB cannot read where it stands, a data part holding more +// or fewer elements than the dims say. Written fresh, each was this reader's guess at it, which +// MATLAB then loaded in its place: measured on MATLAB's verdict corpus (test/fixtures/mat-check), +// a 1x3 char stored as miUTF32 was written as the 1x12 of its bytes, and 'héllo' stored as miUINT8 +// as 'h\uFFFDllo'. Not a name (a fresh one is held to validateMatlabName), nor what only the file +// breaks around the element. +const VALUE_RULES = new Set(['char-type', 'utf8-count', 'int-storage', 'nbytes', 'element', 'data-size']); +// What `record`'s own element breaks of VALUE_RULES, as checkMatElement says it, or null. Of the +// element the reader read, which it holds whole (MatVariable._rawBytes), so nothing is inflated; +// once per record, whose bytes never change. +const storedVerdicts = new WeakMap(); +function storedRefusal(record) { + let verdict = storedVerdicts.get(record); + if (verdict === undefined) { + const element = record.variable?._rawBytes; + const broken = element ? checkMatElement(element).find((v) => VALUE_RULES.has(v.code)) : undefined; + verdict = broken ? broken.message.replace(/\.$/, '') : null; + storedVerdicts.set(record, verdict); + } + return verdict; +} +/** + * The first container at or under `at` that holds fewer elements than it declares, read short + * out of a damaged record (MatParser's "declares 3 cell(s) and only 1 could be read"), with its + * path and what it holds; null for none. MatWriter writes each element it does not hold as an + * empty double, a hole (cellBody, structBody), which is a value the file did not hold, and past + * its budget refuses the save: a 1x600000 cell holding one element was 599,999 of them. So such a + * variable is written only as it was read, or renamed. A container the node ceiling built without + * its rows is asked of the variable it was read as, which is what it is written as. + */ +function shortIn(at) { + const node = valueNodeOf(at); + if (!node) { + return null; + } + if (node._cutByCeiling && node._matVar) { + return shortVariableIn(node._matVar, node.matlabPath); + } + const declared = (node._dims || []).reduce((a, b) => a * b, 1); + const isStruct = node._kind === 'scalar' && node._scalarType === 'struct'; + if (node._kind !== 'cell' && !isStruct) { + return null; + } + // A struct array's rows are its elements, and one with no fields past the cap has none: it is + // written as the bytes it was read from (MatlabVariableNode._unexpandedStruct). + const holdsElements = node._kind === 'cell' || (declared !== 1 && !node._unexpandedStruct()); + if (holdsElements && node.children.length < declared) { + return { path: node.matlabPath, what: heldPhrase(node._dims, node._kind === 'cell' ? 'cell' : 'struct array', node.children.length) }; + } + for (const child of node.children) { + const below = shortIn(child); + if (below) { + return below; + } + } + return null; +} +// shortIn, of a variable as MatParser read it. +function shortVariableIn(v, path) { + if (!v) { + return null; + } + const dims = dimsOf(v); + const declared = dims.reduce((a, b) => a * b, 1); + if (v.className === 'cell') { + const members = flatValues(v.value); + const held = members.slice(0, declared).filter(Boolean).length; + if (held < declared) { + return { path, what: heldPhrase(dims, 'cell', held) }; + } + for (let i = 0; i < members.length; i++) { + const below = shortVariableIn(members[i], path + '{' + (i + 1) + '}'); + if (below) { + return below; + } + } + } + if (v.className === 'struct' && v.fields) { + for (const name of Object.keys(v.fields)) { + const held = v.fields[name]; + const elements = Array.isArray(held) ? held : [held]; + const present = elements.slice(0, declared).filter(Boolean).length; + if (present < declared) { + return { path, what: heldPhrase(dims, 'struct array', present) + ' in its field ' + name }; + } + for (let e = 0; e < elements.length; e++) { + const below = shortVariableIn(elements[e], path + (Array.isArray(held) ? '(' + (e + 1) + ')' : '') + '.' + name); + if (below) { + return below; + } + } + } + } + return null; +} +function heldPhrase(dims, what, held) { + return 'a ' + dims.join('x') + ' ' + what + ' holding ' + held + ' of the ' + dims.reduce((a, b) => a * b, 1) + ' elements it declares'; +} +// `node` as the node of a plain MATLAB value, or null for a node of another class: a typed +// object's (a ParameterNode, a BusNode). Asked of what the node does rather than of its class, +// which this layer does not import (test/moduleBoundaries): a MatlabVariableNode, and only it, +// writes its value as a MAT stream. +function valueNodeOf(node) { + const v = node; + return typeof v._matStream === 'function' && typeof v._matWritable === 'function' ? v : null; +} +// What a variable read as `v` is, in words, when it is not a plain MATLAB value; null when it is. +function notPlain(v) { + if (v.isOpaque) { + return classPhrase(v.className || 'object'); + } + if (functionHandleOf(v) || v.className === 'function_handle') { + return 'a function handle'; + } + if (v.className === 'unknown' || v.undecoded) { + return 'a value that was not decoded'; + } + return null; +} +// Where an element's array flags keep its flags byte: past the element's tag and the flags' own, +// which MATLAB and MatWriter both write in the long form (8 bytes of tag, then 8 of data), and +// the byte after the class; and its bit for global. +const FLAGS_BYTE = 17; +const GLOBAL_FLAG = 0x04; +// `element`, written fresh for the variable `record` holds, global when that one was +// (MatVariable.isGlobal). The flag is the workspace variable's and not its value's, so no writer +// of a value writes it, and written fresh a variable saved as global was not one: `load(f)` no +// longer declared it global. A rename splice keeps it with the rest of the element. Only the +// top-level element, the one MATLAB sets it on; and on a copy, since the element may be a view +// of the bytes the file was read from (_matStream's own, which then hold it already). +function globalAsRead(element, record) { + const longFlags = element.byteLength > FLAGS_BYTE && u32At(element, 8) === 6 && u32At(element, 12) === 8; + if (!record?.variable?.isGlobal || !longFlags || element[FLAGS_BYTE] & GLOBAL_FLAG) { + return element; + } + const out = element.slice(); + out[FLAGS_BYTE] |= GLOBAL_FLAG; + return out; +} +// The miMATRIX element `node`'s value is, with the empty name a stream's value has: the stream it +// is written as in a dictionary (_matStream), which writes a sparse array no element row edited +// and a struct array with no element rows as the bytes they were read from, and anything else as +// MatWriter writes it, once freshRefusal has found nothing in it this writer cannot write. Refused +// as a dictionary's save refuses it past MatWriter's budget, restated naming the variable +// (_budgetFailure), and for any other refusal of MatWriter's. +function freshElement(node) { + const stream = node._matStream(); + if (stream) { + return stream.subarray(8); + } + // _matStream answers null for a refusal of MatWriter's other than its budget's: asked again, + // for its reason. + try { + encodeMatVariable(node._var); + } + catch (e) { + if (e instanceof MatBudgetError) { + throw node._budgetFailure(e); + } + if (e instanceof MatWriteError) { + throw refusal(node.name, e.message); + } + throw e; + } + throw refusal(node.name, 'no MAT element could be written for it'); +} +/** + * The first node at or under `at` that MatWriter cannot write as what it is (the rule of + * MatlabVariableNode._matWritable), with its MATLAB path and what it is, or null for none. Asked + * by freshRefusal, and by the editor of a value about to be typed in (MatNode._valueRefusal). + * + * A container the node ceiling built without its rows (_cutByCeiling) is written as the variable + * it was read as (MatlabVariableNode._var), so that variable is what is asked of it, and not its + * rows, which _matWritable would find none of to refuse: a cell of function handles, cut, said + * nothing, and its edit was refused by MatWriter at the save. + */ +export function unwritableIn(at) { + const found = unwritableAt(at); + if (found) { + return found; + } + const node = valueNodeOf(at); + return node._matWritable() ? null : { path: node.matlabPath, what: 'a value MatWriter has no variable for' }; +} +function unwritableAt(at) { + const node = valueNodeOf(at); + if (!node) { + return { path: at.matlabPath, what: classPhrase(String(at.className || 'object')) }; + } + if (node._isOpaque) { + return { path: node.matlabPath, what: classPhrase(node._opaqueClassName || 'object') }; + } + if (node._undecoded) { + return { path: node.matlabPath, what: 'a value that was not decoded' }; + } + if (node._scalarType === 'string' || node._scalarType === 'function_handle') { + return { path: node.matlabPath, what: node._scalarType === 'string' ? 'a string' : 'a function handle' }; + } + if (node._cutByCeiling && node._matVar) { + return notPlainIn(node._matVar, node.matlabPath); + } + // Only a cell and a struct hold values of their own: an array's rows are its elements. + if (node._kind === 'cell' || node._scalarType === 'struct') { + for (const child of node.children) { + const below = unwritableAt(child); + if (below) { + return below; + } + } + } + return null; +} +// The first member at or under the variable `v`, at `path`, that is not a plain MATLAB value +// (notPlain), with its path, or null: the members of a cell and the fields of a struct, at any +// depth, as MatParser holds them. +function notPlainIn(v, path) { + if (!v) { + return null; + } + const what = notPlain(v); + if (what) { + return { path, what }; + } + if (v.className === 'cell') { + const members = flatValues(v.value); + for (let i = 0; i < members.length; i++) { + const below = notPlainIn(members[i], path + '{' + (i + 1) + '}'); + if (below) { + return below; + } + } + } + if (v.className === 'struct' && v.fields) { + for (const name of Object.keys(v.fields)) { + const held = v.fields[name]; + const elements = Array.isArray(held) ? held : [held]; + for (let e = 0; e < elements.length; e++) { + const below = notPlainIn(elements[e], path + (Array.isArray(held) ? '(' + (e + 1) + ')' : '') + '.' + name); + if (below) { + return below; + } + } + } + } + return null; +} +// The miMATRIX element a record holds: its own bytes for a plain one, its payload inflated for a +// compressed one. Null when there is no whole element, or bytes after it: a record that is not +// one MATLAB writes is not one to rename. +function elementOfRecord(record) { + const bytes = record.bytes; + if (bytes.byteLength < 8) { + return null; + } + const nbytes = u32At(bytes, 4); + if (!record.compressed) { + return u32At(bytes, 0) === MI_MATRIX && 8 + nbytes <= bytes.byteLength ? bytes.subarray(0, 8 + nbytes) : null; + } + let inflated; + try { + inflated = inflateZlib(bytes.subarray(8, 8 + nbytes)); + } + catch { + return null; + } + if (inflated.byteLength < 8 || u32At(inflated, 0) !== MI_MATRIX) { + return null; + } + return 8 + u32At(inflated, 4) === inflated.byteLength ? inflated : null; +} +// A top-level record of `element`, the variable `name`'s: the element itself, which MatWriter pads +// to 8 bytes as a plain record must be, or its zlib stream (RFC 1950, which MATLAB requires; level +// 6, MATLAB's default) in an miCOMPRESSED tag, with no padding after it, as MATLAB writes one. +function recordBytes(element, compress, name) { + return compress ? compressedRecordOf(zlibSync(element, { level: 6 }), name) : element; +} +/** + * The miCOMPRESSED record of `stream`, the zlib stream of the variable `name`'s element: its tag + * and the stream. Refused for a stream of 4 GiB or more, whose length the tag's 32 bits cannot + * say: written, its length would wrap, and the record would declare a few bytes of a stream that + * goes on. Exported for test/matFileSave.test.ts, which holds it to that without a stream so big. + */ +export function compressedRecordOf(stream, name) { + if (stream.byteLength > 0xffffffff) { + throw refusal(name, 'compressed, its element is a stream of ' + stream.byteLength + ' bytes, more than the 4 GiB a record can say it holds'); + } + return concat([u32le(MI_COMPRESSED), u32le(stream.byteLength), stream], (total) => refusal(name, 'its record would be ' + total + ' bytes, more than this runtime holds in one buffer')); +} +// The header and the planned records, back to back. The header is the file's own: its text +// (bytes 0-115, which MATLAB keeps on `-append` and never reads), and its version and byte-order +// mark (124-127). Bytes 116-123 are the subsystem's new offset, a little-endian uint64, or, in a +// file with no subsystem, the file's own: zeros or spaces, both of which MATLAB reads as none. +function assemble(file, headerBytes, plan, subsystem) { + const header = headerBytes.slice(); + const parts = [header]; + const offsets = []; + let subsystemAt = null; + let at = header.byteLength; + for (const p of plan) { + const bytes = bytesOf(p); + offsets.push(at); + if (p.kind === 'verbatim' && p.record === subsystem) { + subsystemAt = at; + } + parts.push(bytes); + at += bytes.byteLength; + } + if (subsystemAt !== null) { + new DataView(header.buffer, header.byteOffset, header.byteLength).setBigUint64(116, BigInt(subsystemAt), true); + } + return { bytes: concat(parts, fileTooBig(file)), offsets, subsystemAt }; +} +// The bytes a planned record is written as: a record of the file's own, or the ones written for it. +function bytesOf(p) { + return p.kind === 'verbatim' ? p.record.bytes : p.bytes; +} +// The refusal of a file of `total` bytes, more than one buffer here holds (concat). +function fileTooBig(file) { + return (total) => new MatWriteError('Cannot save "' + file + '": the file written for it would be ' + total + ' bytes, more than this runtime holds in one buffer. ' + + 'Nothing was written.'); +} +// ---- The self-check --------------------------------------------------------------------------- +// +// The bytes about to be handed back, against the plan: the header kept, and saying where the +// subsystem now is; the records the ones planned, back to back from byte 128 to the last byte, +// each at the offset planned and framed as the reader frames one; and every record written anew +// read again by this package's reader, alone: each renamed one named as planned and, but for its +// name, its element byte for byte; each written fresh named as planned and reading back as the +// value it was written from, its class, size and every element. Any difference refuses the save. +// +// A record written as its own bytes is not read again: it is the record the file was read as, +// whole (unsavableRefusal: not one byte of it handed away since), copied by assemble at the +// offset this checks. Reading it again would read the reader's own reading of the same bytes, at +// the cost of inflating every compressed record of the file at every save. +// +// This proves what was written is what was planned, and not that MATLAB loads it: this reader +// reads files MATLAB refuses. That is refuseWorse's to ask, of the other judge. +function selfCheck(file, assembled, plan, headerBytes) { + const fail = (why) => { + throw new MatWriteError('Cannot save "' + file + '": the file written for it did not read back as written: ' + why + '. Nothing was written.'); + }; + const { bytes, offsets } = assembled; + const head = bytes.subarray(0, 128); + if (!sameBytes(head.subarray(0, 116), headerBytes.subarray(0, 116)) || !sameBytes(head.subarray(124), headerBytes.subarray(124))) { + return fail('its header is not the one it was read with'); + } + const subsystemSaid = assembled.subsystemAt ?? 0; + const offsetSaid = head.subarray(116, 124).every((b) => b === 0x20) ? 0 : Number(new DataView(head.buffer, head.byteOffset + 116, 8).getBigUint64(0, true)); + if (offsetSaid !== subsystemSaid) { + return fail('its header places its objects at byte ' + offsetSaid + ', and they are at byte ' + subsystemSaid); + } + let end = 128; + plan.forEach((p, i) => { + const record = bytesOf(p); + if (offsets[i] !== end) { + fail('a record was written at byte ' + offsets[i] + ', where the one before it ends at byte ' + end); + } + if (p.kind === 'verbatim' && record.byteLength !== p.record.length) { + fail('the record at byte ' + end + ' holds ' + record.byteLength + ' of the ' + p.record.length + ' bytes it was read as'); + } + if (!framedAsRead(record) || u32At(bytes, end) !== u32At(record, 0) || u32At(bytes, end + 4) !== u32At(record, 4)) { + fail('the record at byte ' + end + ' is not framed as the record written there'); + } + end += record.byteLength; + }); + if (end !== bytes.byteLength) { + return fail('it is ' + bytes.byteLength + ' bytes, and its records end at byte ' + end); + } + plan.forEach((p, i) => { + if (p.kind === 'verbatim') { + return; + } + const at = offsets[i]; + const got = readAlone(file, head, bytes.subarray(at, at + p.bytes.byteLength)); + if (!got || got.status !== 'read' || got.anonymous || got.name !== p.name || got.variable?.name !== p.name) { + fail('the record at byte ' + at + ', written as "' + p.name + '", reads as ' + (got?.status === 'read' ? '"' + got.name + '"' : 'no variable')); + } + if (p.kind === 'renamed') { + const unnamed = (e) => (e && wholeElement(e) ? elementNamed(e, '') : null); + const was = unnamed(p.element); + const is = unnamed(got.variable._rawBytes); + if (!was || !is || !sameBytes(was, is)) { + fail('"' + p.name + '" is not, but for its name, the element it was read as'); + } + return; + } + const difference = differs(p.node._var, got.variable, p.name); + if (difference) { + fail(difference); + } + // Global as the variable it was written for was (globalAsRead), and a variable added since not. + if (!!p.record?.variable?.isGlobal !== !!got.variable?.isGlobal) { + const is = got.variable?.isGlobal ? 'global, where the variable it was written for was not' : 'not global, where the variable it was written for was'; + fail('"' + p.name + '" reads back ' + is); + } + }); +} +// Whether `record` is framed as MatParser frames a record of a file it calls framed: its tag's 8 +// bytes and exactly the bytes they declare, which for a plain record are a whole number of 8-byte +// words; and a tag that is neither the zero one the reader stops at nor a small element's. +function framedAsRead(record) { + if (record.byteLength < 8) { + return false; + } + const type = u32At(record, 0); + const n = u32At(record, 4); + if (8 + n !== record.byteLength) { + return false; + } + return type === MI_COMPRESSED || (n % 8 === 0 && !(type === 0 && n === 0) && !(type >>> 16 !== 0 && (type & 0xffff) !== 0)); +} +// The one record of a file of `header` and `record`, as this package's reader reads it, or null +// where it reads that file as anything else. +function readAlone(file, header, record) { + // The whole of a buffer of its own (concat), which the reader may take as it is. + const alone = concat([header, record], fileTooBig(file)); + let parsed; + try { + parsed = parseMat(alone.buffer); + } + catch { + return null; + } + return parsed.framed && parsed.records.length === 1 ? parsed.records[0] : null; +} +// Whether `element` is one miMATRIX element, its tag and exactly the bytes it declares. +function wholeElement(element) { + return element.byteLength >= 8 && u32At(element, 0) === MI_MATRIX && 8 + u32At(element, 4) === element.byteLength; +} +// The bytes about to be handed back, judged by the rules MATLAB loads a file by (MatFileCheck), +// which this package's reader does not hold a file to: the save is refused when they break a rule +// the file they were read from did not break. A file that was read breaking one (two variables of +// one name, say) may still be saved, edited elsewhere, as long as the save adds nothing to it. +// Compared by rule and variable, not by offset, which every edit before a record moves; a +// variable renamed is compared under the name the file it was read from gave it. +// +// Judged where the save changed the file (violationsAddedBySplice): every record written anew and +// the record it replaces, the header, and where every record stands. A record written as its own +// bytes breaks what it broke as read, and the two are the same answer; so a save costs what it +// changed, and a file too big for the check's budget whole can still be saved where its edits +// are small. Phase 2, which writes the subsystem anew, hands it in as a record written in place of +// the subsystem's (MatSplicedRecord `replaces`), and it is checked whole as every written one is. +function refuseWorse(file, assembled, plan, headerBytes, records, check) { + const index = new Map(records.map((r, i) => [r, i])); + const renamed = new Map(); + const written = plan.map((p, i) => { + if (p.kind === 'verbatim') { + return { kept: index.get(p.record) }; + } + if (p.record?.name && p.record.name !== p.name) { + renamed.set(p.name, p.record.name); + } + const at = assembled.offsets[i]; + return { written: assembled.bytes.subarray(at, at + p.bytes.byteLength), replaces: p.record ? index.get(p.record) : null }; + }); + const added = violationsAddedBySplice( + // A compressed record's inflate, as the reader holds it (MatVariable._rawBytes): inflateZlib's + // of the record's own bytes, so that the check does not inflate the file again. + { header: headerBytes, records: records.map((r) => ({ bytes: r.bytes, inflated: r.compressed ? r.variable?._rawBytes : null })) }, { header: assembled.bytes.subarray(0, 128), records: written }, renamed, check); + const broken = added.filter((v) => v.code !== 'budget'); + if (broken.length > 0) { + const more = broken.length - 1; + throw new MatWriteError('Cannot save "' + file + '": the file written for it breaks a rule MATLAB loads a file by, which the file it was read ' + + 'from does not: ' + broken[0].message + (more > 0 ? ' It breaks ' + more + ' more as well.' : '') + ' Nothing was written.'); + } + if (added.length > 0) { + // The check stopped before it had judged all of what the save wrote: nothing is known + // broken, and nothing is known to load. + throw new MatWriteError('Cannot save "' + file + '": the file written for it could not be verified within the check\'s budget against the rules ' + + 'MATLAB loads a file by (' + added[0].message.replace(/\.$/, '') + '), so it is not known to load. Nothing was written.'); + } +} +// Where the value read back, `read`, is not the value `model` it was written from, in words, or +// null where it is that value: the same class, complexity, storage and size, the same members of a +// cell, the same fields of a struct in the same order, and each element the same number as its +// class holds it. MatWriter's own rules are taken as the model's meaning, not its result: an +// integer element as MATLAB converts it to the class, a single's as a float32, a member a cell or +// a struct does not hold as the empty double written for it. +function differs(model, read, at) { + const m = model ?? EMPTY_DOUBLE; + const r = read ?? EMPTY_DOUBLE; + const cls = classOf(m); + const said = (what, was, is) => at + ': its ' + what + ' reads back as ' + is + ' where ' + was + ' was written'; + if (classOf(r) !== cls) { + return said('class', cls, classOf(r)); + } + const md = dimsOf(m); + if (md.join('x') !== r.dimensions.join('x')) { + return said('size', md.join('x'), r.dimensions.join('x')); + } + if (!!m.isComplex !== !!r.isComplex || !!m.isSparse !== !!r.isSparse) { + return said('storage', storageOf(m), storageOf(r)); + } + const n = md.reduce((a, b) => a * b, 1); + if (m.isSparse) { + return sparseDiffers(m, r, cls, at); + } + if (cls === 'cell') { + const mc = flatValues(m.value); + const rc = flatValues(r.value); + for (let i = 0; i < n; i++) { + const d = differs(mc[i], rc[i], at + '{' + (i + 1) + '}'); + if (d) { + return d; + } + } + return null; + } + if (cls === 'struct') { + const mf = m.fields ?? {}; + const rf = r.fields ?? {}; + const names = Object.keys(mf); + if (names.join(',') !== Object.keys(rf).join(',')) { + return said('fields', names.join(', ') || 'none', Object.keys(rf).join(', ') || 'none'); + } + for (let e = 0; e < n; e++) { + for (const name of names) { + const d = differs(memberOf(mf[name], e, n), memberOf(rf[name], e, n), at + (n === 1 ? '' : '(' + (e + 1) + ')') + '.' + name); + if (d) { + return d; + } + } + } + return null; + } + if (cls === 'char') { + const was = String(m.value ?? ''); + const is = String(r.value ?? ''); + return was === is ? null : said('text', JSON.stringify(was), JSON.stringify(is)); + } + const mv = flatValues(m.value); + const rv = flatValues(r.value); + if (mv.length !== n || rv.length !== n) { + return said('element count', String(mv.length), String(rv.length)); + } + const same = sameNumberFor(cls); + for (let i = 0; i < n; i++) { + for (const part of m.isComplex ? ['re', 'im'] : ['re']) { + const was = partOf(mv[i], part); + const is = partOf(rv[i], part); + if (!same(was, is)) { + return said('element ' + (i + 1) + (m.isComplex ? ' (' + (part === 're' ? 'real' : 'imaginary') + ' part)' : ''), String(was), String(is)); + } + } + } + return null; +} +// A sparse array's non-zeros, compared as a set of (row, column) to value: the order a writer +// puts them in is its own, and an explicit zero is not a non-zero MATLAB keeps. +function sparseDiffers(m, r, cls, at) { + const ms = m.sparse; + const rs = r.sparse; + if (!ms || !rs) { + return at + ': it holds no non-zeros to compare'; + } + const same = sameNumberFor(cls); + const entries = (s) => { + const out = new Map(); + for (let k = 0; k < s.row.length; k++) { + const re = s.re[k]; + const im = s.im ? s.im[k] : 0; + if (re !== 0 || im !== 0) { + out.set(s.row[k] + ',' + s.col[k], [re, im]); + } + } + return out; + }; + const was = entries(ms); + const is = entries(rs); + if (was.size !== is.size) { + return at + ': it reads back with ' + is.size + ' non-zero(s) where ' + was.size + ' were written'; + } + for (const [where, [re, im]] of was) { + const got = is.get(where); + if (!got || !same(re, got[0]) || !same(im, got[1])) { + const [row, col] = where.split(',').map(Number); + return at + ': its non-zero at (' + (row + 1) + ',' + (col + 1) + ') does not read back as written'; + } + } + return null; +} +const EMPTY_DOUBLE = { name: '', className: 'double', dimensions: [0, 0], isComplex: false, isLogical: false, value: null, fields: null }; +const INTEGER_CLASS = /^u?int(?:8|16|32|64)$/; +// MATLAB's class of `v`: a logical array is class uint8 with the logical flag, in a file and in +// the variable the node layer hands MatWriter. +function classOf(v) { + return v.isLogical || v.className === 'logical' ? 'logical' : v.className; +} +function storageOf(v) { + return (v.isSparse ? 'sparse' : 'full') + (v.isComplex ? ' complex' : ' real'); +} +// Whether two elements of class `cls` are the one number the class holds: an integer class's as +// MATLAB converts a value to it (integerConversion: rounded, saturated, NaN as 0), a logical's as a +// uint8, a single's as a float32, and a double's as itself, NaN equal to NaN and -0 not to 0. +function sameNumberFor(cls) { + if (INTEGER_CLASS.test(cls) || cls === 'logical') { + const to = integerConversion(cls === 'logical' ? 'uint8' : cls); + return (a, b) => String(to(a)) === String(to(b)); + } + if (cls === 'single') { + return (a, b) => Object.is(Math.fround(Number(a)), Math.fround(Number(b))); + } + return (a, b) => Object.is(Number(a), Number(b)); +} +// One part of a numeric element: a complex one is `{re, im}`, and a real one its real part, with +// an imaginary part of 0. +function partOf(x, part) { + if (x !== null && typeof x === 'object' && 're' in x) { + return x[part]; + } + return part === 're' ? x : 0; +} +// Element `e` of `n` of a struct field: a struct array holds one variable per element, a 1x1 +// struct the variable itself (MatVariable.fields). +function memberOf(held, e, n) { + return Array.isArray(held) ? held[e] : n === 1 ? held : undefined; +} +// A MAT element has at least two dimensions; a variable may say fewer (MatWriter.dimsOf). +function dimsOf(v) { + const d = (v.dimensions || []).slice(); + while (d.length < 2) { + d.push(1); + } + return d; +} +// The values of a variable as one list: MatParser leaves a 1x1 a bare value and an empty one null. +function flatValues(value) { + if (value === null || value === undefined) { + return []; + } + return Array.isArray(value) ? value : [value]; +} +// ---- Bytes ------------------------------------------------------------------------------------ +// `parts`, back to back in a buffer of their own; or, past the most bytes the runtime holds in one +// buffer, `tooBig`'s refusal of that many, rather than the RangeError the runtime throws, which +// says nothing of what was being written. +function concat(parts, tooBig) { + let total = 0; + for (const p of parts) { + total += p.byteLength; + } + let out; + try { + out = new Uint8Array(total); + } + catch (e) { + if (e instanceof RangeError) { + throw tooBig(total); + } + throw e; + } + let at = 0; + for (const p of parts) { + out.set(p, at); + at += p.byteLength; + } + return out; +} +function u32le(n) { + const out = new Uint8Array(4); + new DataView(out.buffer).setUint32(0, n >>> 0, true); + return out; +} +function u32At(bytes, at) { + return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(at, true); +} +function sameBytes(a, b) { + if (a.byteLength !== b.byteLength) { + return false; + } + for (let i = 0; i < a.byteLength; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; +} +//# sourceMappingURL=MatFileWriter.js.map \ No newline at end of file diff --git a/dist/datamodel/parser/MatFileWriter.js.map b/dist/datamodel/parser/MatFileWriter.js.map new file mode 100644 index 00000000..41ba1243 --- /dev/null +++ b/dist/datamodel/parser/MatFileWriter.js.map @@ -0,0 +1 @@ +{"version":3,"file":"MatFileWriter.js","sourceRoot":"","sources":["../../../src/datamodel/parser/MatFileWriter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/parser/MatParser.d.ts b/dist/datamodel/parser/MatParser.d.ts index 6aef7716..8930a01b 100644 --- a/dist/datamodel/parser/MatParser.d.ts +++ b/dist/datamodel/parser/MatParser.d.ts @@ -7,6 +7,7 @@ export interface MatVariable { isComplex: boolean; isLogical: boolean; isSparse?: boolean; + isGlobal?: boolean; sparse?: SparseData; value: unknown; fields: Record | null; @@ -25,6 +26,29 @@ export interface ParsedMat { header: string; variables: MatVariable[]; warnings: ParseWarning[]; + headerBytes: Uint8Array; + subsystemOffset: number; + records: MatRecord[]; + framed: boolean; + unframed: { + at: number; + reason: string; + } | null; +} +/** + * One top-level record of a MAT-file, in the file's own bytes: a variable, the subsystem + * that holds the file's objects, or a record this reader did not read. + */ +export interface MatRecord { + offset: number; + length: number; + bytes: Uint8Array; + compressed: boolean; + name: string | null; + anonymous: boolean; + status: 'read' | 'dropped'; + reason?: string; + variable: MatVariable | null; } export declare function undecodedValue(dimensions: number[], className: string): string; export declare const MAX_NESTING = 128; diff --git a/dist/datamodel/parser/MatParser.d.ts.map b/dist/datamodel/parser/MatParser.d.ts.map index d5e69fe7..f090bd2e 100644 --- a/dist/datamodel/parser/MatParser.d.ts.map +++ b/dist/datamodel/parser/MatParser.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"MatParser.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/MatParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"MatParser.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/MatParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/parser/MatParser.js b/dist/datamodel/parser/MatParser.js index 493e3460..947f3166 100644 --- a/dist/datamodel/parser/MatParser.js +++ b/dist/datamodel/parser/MatParser.js @@ -913,6 +913,9 @@ export function parseMatrix(view, baseOffset, length, depth = 0) { if (isSparse) { result.isSparse = true; } + if (flags & 0x04) { + result.isGlobal = true; + } // Past MAX_NESTING levels a matrix is recorded with its class, size and name, and nothing in // it is read. What holds it keeps its bytes, as for every value this reader does not decode: // a struct field always, and a cell element when it is not decoded. @@ -1232,7 +1235,14 @@ export function parseMatrix(view, baseOffset, length, depth = 0) { // elements had 10,000 empty rows, and a 104 KB file holding 1,000 of them ran a // 512 MB heap out while it opened. MATLAB writes every field of every element, so an // array it wrote has every list already. - if (totalElements > 1) { + // + // So is every field of an array of NO element, each with its empty list: its names + // are all there is of it, `struct('a', {})` being a 0x0 struct with a field `a`. It + // held `{}`, and a writer writes the names a variable holds, so a .mat save of one + // and a copy of one into a dictionary's stream wrote a struct of no field (measured + // against MATLAB R2027a: the 0x0 a .mat save wrote for it loaded with fieldnames {}, + // where the file's had {'a'}). + if (totalElements !== 1) { for (const fn of fieldNames) { if (!Object.prototype.hasOwnProperty.call(fields, fn)) { setOwn(fields, fn, []); @@ -1312,6 +1322,21 @@ export function parseMat(arrayBuffer) { // left holding no data is that one loss, said once (collectUndecoded). const readShort = new Set(); let offset = 128; + // The file's records as a save splices them (ParsedMat.records), and the first place + // they stop tiling the file, if they do. Kept beside the walk rather than by it: the + // walk steps 8 + nbytes past every record, as it always has, and that is MATLAB's step + // for every record but a plain one whose nbytes is not a multiple of 8, which MATLAB + // pads and the walk does not. No file MATLAB wrote under test/ holds one, an miMATRIX's + // nbytes counting its sub-elements' padding, so a file that does is left unframed + // rather than walked a second way. + const records = []; + let unframed = null; + const unframe = (at, reason) => { unframed ??= { at, reason }; }; + const dropped = (record, warning) => { + record.status = 'dropped'; + record.reason = warning.message; + warnings.push(warning); + }; // The name to blame a short record on — empty for the unnamed element every MCOS // file carries, which has no name to give. const nameFor = (variable) => (variable._anonymous ? '' : variable.name); @@ -1327,13 +1352,18 @@ export function parseMat(arrayBuffer) { message: `The file ends with ${buf.length - offset} byte(s) where a record header needs 8, ` + 'so anything stored after the last variable read was not read.', }); + unframe(offset, `the file ends ${buf.length - offset} byte(s) into a record's tag`); break; } const dataType = view.getUint32(offset, true); const numBytes = view.getUint32(offset + 4, true); // The format's own end-of-variables marker. NOT a warning: a file that ends - // where it says it ends has been read completely. + // where it says it ends has been read completely. Not a record either, and the + // file is not framed: measured against MATLAB R2027a, a file whose last variable is + // followed by 8 zero bytes fails to load, as one followed by 3 or 100 does. if (dataType === 0 && numBytes === 0) { + unframe(offset, `a zero tag at byte ${offset} is no record, and it and the ${buf.length - offset - 8} byte(s) ` + + 'after it are not read'); break; } // A record may declare more bytes than the file holds. Everything below clamps @@ -1343,7 +1373,42 @@ export function parseMat(arrayBuffer) { // until after the parse so the warning can name the variable it cost. const missing = offset + 8 + numBytes - buf.length; let shortened = ''; - if (dataType === MI_COMPRESSED) { + const isCompressed = dataType === MI_COMPRESSED; + const extent = 8 + (isCompressed ? numBytes : align8(numBytes)); + const length = Math.min(extent, buf.length - offset); + const record = { + offset, + length, + bytes: buf.subarray(offset, offset + length), + compressed: isCompressed, + name: null, + anonymous: false, + status: 'read', + variable: null, + }; + records.push(record); + if (length < extent) { + unframe(offset, `the record at byte ${offset} needs ${extent} bytes and the file holds ${length}`); + } + else if (!isCompressed && numBytes % 8 !== 0) { + unframe(offset, `the plain record at byte ${offset} declares ${numBytes} bytes, which is not a whole ` + + 'number of 8-byte words'); + } + else if ((dataType >>> 16) !== 0 && (dataType & 0xFFFF) !== 0) { + // Both halves of the type word set: a small data element's tag, the form a + // short sub-element is written in. This reader steps over it as 8 + its second + // word, which is not how that form is laid out, and MATLAB is not known to step + // over one at all at the top of a file. + unframe(offset, `the record at byte ${offset} has a small data element's tag`); + } + // The variable read out of this record, whose record it is (MatNode binds the + // node made of it to the record by it). + const readAs = (variable) => { + record.variable = variable; + record.name = variable._anonymous ? '' : variable.name; + record.anonymous = !!variable._anonymous; + }; + if (isCompressed) { const compressed = buf.slice(offset + 8, offset + 8 + numBytes); let pako; try { @@ -1357,7 +1422,7 @@ export function parseMat(arrayBuffer) { // one unreadable record is one variable, not the file. A record that would // inflate past the ceiling for one record (MAT_RECORD_INFLATE_CEILING) is // unreadable the same way, and is never read cut to the ceiling. - warnings.push({ + dropped(record, { code: 'part-unreadable', message: err instanceof InflateCeilingError ? `A compressed record at byte ${offset} inflates to more than the ${err.ceiling}-byte ceiling ` @@ -1378,7 +1443,7 @@ export function parseMat(arrayBuffer) { const innerType = tagged ? deView.getUint32(0, true) : 0; const innerBytes = tagged ? deView.getUint32(4, true) : 0; if (!tagged) { - warnings.push({ + dropped(record, { code: 'part-unreadable', message: `A compressed record at byte ${offset} inflates to ${deView.byteLength} bytes, fewer than the 8 ` + "of a data element's tag, so the variable it holds was not read.", @@ -1393,6 +1458,7 @@ export function parseMat(arrayBuffer) { else { variables.push({ name: '', className: '', dimensions: [], isComplex: false, isLogical: false, value: null, fields: null, _rawBytes: new Uint8Array(pako.buffer, pako.byteOffset, pako.byteLength), _anonymous: true }); } + readAs(variables[variables.length - 1]); shortened = nameFor(variables[variables.length - 1]); // The record's warning below, one level in. The matrix's own tag in the // payload may claim more bytes than the payload holds, as a record may claim @@ -1415,7 +1481,7 @@ export function parseMat(arrayBuffer) { } } else { - warnings.push({ + dropped(record, { code: 'part-unreadable', message: `A compressed record at byte ${offset} holds a data element of type ` + `${innerType} where a variable has to be a matrix, so it was not read.`, @@ -1431,12 +1497,13 @@ export function parseMat(arrayBuffer) { else { variables.push({ name: '', className: '', dimensions: [], isComplex: false, isLogical: false, value: null, fields: null, _rawBytes: buf.slice(offset, offset + 8 + numBytes), _anonymous: true }); } + readAs(variables[variables.length - 1]); shortened = nameFor(variables[variables.length - 1]); } else { // Only miCOMPRESSED and miMATRIX carry a variable at this level. Anything // else was skipped, and a whole variable's worth of file went with it. - warnings.push({ + dropped(record, { code: 'part-unreadable', message: `A data element of type ${dataType} at byte ${offset} is not a variable, ` + 'so it was not read.', @@ -1462,7 +1529,25 @@ export function parseMat(arrayBuffer) { for (const variable of variables) { collectUndecoded(variable, variable.name || '', warnings, readShort); } - return { header, variables, warnings }; + return { + header, + variables, + warnings, + headerBytes: buf.subarray(0, 128), + subsystemOffset: subsystemOffsetOf(buf, view), + records, + framed: unframed === null, + unframed, + }; +} +// Header bytes 116-123 as a number: a little-endian uint64, or 0 when they are 8 spaces, +// which MATLAB reads as no subsystem as it does 8 zero bytes. An offset past 2^53 is +// past any file this reads, and is kept as the nearest double, which no record starts at. +function subsystemOffsetOf(buf, view) { + if (buf.subarray(116, 124).every((b) => b === 0x20)) { + return 0; + } + return Number(view.getBigUint64(116, true)); } /** * What this reader says of an array holding fewer elements than it declares, a struct diff --git a/dist/datamodel/parser/MatParser.js.map b/dist/datamodel/parser/MatParser.js.map index c59548d3..088e3c0f 100644 --- a/dist/datamodel/parser/MatParser.js.map +++ b/dist/datamodel/parser/MatParser.js.map @@ -1 +1 @@ -{"version":3,"file":"MatParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/MatParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"MatParser.js","sourceRoot":"","sources":["../../../src/datamodel/parser/MatParser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/parser/MatWriter.d.ts b/dist/datamodel/parser/MatWriter.d.ts index 7a6dec15..a054a1e7 100644 --- a/dist/datamodel/parser/MatWriter.d.ts +++ b/dist/datamodel/parser/MatWriter.d.ts @@ -132,6 +132,23 @@ export declare function encodeMatStream(v: MatVariable): Uint8Array; * way, and its subsystem lives elsewhere in the file, so it is refused. */ export declare function matStreamOfElement(raw: Uint8Array): Uint8Array | null; +/** + * The miMATRIX element `raw` holds as read, named `name`: the inverse of ownElement, for a + * variable of a MAT-file, which carries its name in its element as a stream's value does not. + * Every byte but the name subelement's is copied, and the element's size restated, so a + * variable renamed and saved is the value it was, byte for byte, whatever this writer would + * write for it. Null when the bytes are not a whole element whose name this can find. + * + * An MCOS object's element (class 17) is renamed as well: its name comes straight after its + * array flags, with no dimensions before it, and then the type system's name and the object's + * class, which are kept. Measured against MATLAB R2027a: the file's subsystem holds no + * variable's name, so an object variable renamed this way loads as the same object, a + * Simulink.Parameter and a string alike. + * + * The name is written as MATLAB writes one, miINT8 with its UTF-8 bytes, in the small form + * when it is 1 to 4 bytes long (element). + */ +export declare function elementNamed(raw: Uint8Array, name: string): Uint8Array | null; /** * A complex value's plain-text form — `{_type: 'cdata', _value: '1+2i 5+6i 3+4i 7+8i', * _dimensions, _class?}`, what BinarySlddParser reads out of a binary dictionary and diff --git a/dist/datamodel/parser/MatWriter.d.ts.map b/dist/datamodel/parser/MatWriter.d.ts.map index f8b66770..9b073326 100644 --- a/dist/datamodel/parser/MatWriter.d.ts.map +++ b/dist/datamodel/parser/MatWriter.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"MatWriter.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/MatWriter.ts"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AA2BlD;;;;;GAKG;AACH,qBAAa,aAAc,SAAQ,KAAK;gBAC1B,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,cAAe,SAAQ,aAAa;IAC/C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;IAC1G,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBACd,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,GAAE,cAAc,CAAC,QAAQ,CAAY;CASnH;AAkMD;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AAatD,+CAA+C;AAC/C,wBAAgB,aAAa,IAAI,OAAO,CAEvC;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAU7C;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/D;AAiCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,CAe7F;AAQD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C;AA6WD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAsBvE;AAED,KAAK,kBAAkB,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;AAiDzH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,WAAW,GAAG,UAAU,CAgB5D;AAuFD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAOpE;AA4CD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAElD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,WAAW,GAAG,UAAU,CAE1D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAGrE;AAuDD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW,GAAG,IAAI,CA2BpE;AAwED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CA+BzD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,SAAK,GAAG,OAAO,CAE/D;AAsVD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAqBjG"} \ No newline at end of file +{"version":3,"file":"MatWriter.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/MatWriter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/parser/MatWriter.js b/dist/datamodel/parser/MatWriter.js index 39632266..edff652a 100644 --- a/dist/datamodel/parser/MatWriter.js +++ b/dist/datamodel/parser/MatWriter.js @@ -1006,12 +1006,41 @@ function ownElement(raw) { const body = concat([raw.slice(8, at.nameAt), emptyName(), raw.slice(at.nameAt + at.name, at.end)]); return concat([u32le(MI_MATRIX), u32le(body.length), body]); } +/** + * The miMATRIX element `raw` holds as read, named `name`: the inverse of ownElement, for a + * variable of a MAT-file, which carries its name in its element as a stream's value does not. + * Every byte but the name subelement's is copied, and the element's size restated, so a + * variable renamed and saved is the value it was, byte for byte, whatever this writer would + * write for it. Null when the bytes are not a whole element whose name this can find. + * + * An MCOS object's element (class 17) is renamed as well: its name comes straight after its + * array flags, with no dimensions before it, and then the type system's name and the object's + * class, which are kept. Measured against MATLAB R2027a: the file's subsystem holds no + * variable's name, so an object variable renamed this way loads as the same object, a + * Simulink.Parameter and a string alike. + * + * The name is written as MATLAB writes one, miINT8 with its UTF-8 bytes, in the small form + * when it is 1 to 4 bytes long (element). + */ +export function elementNamed(raw, name) { + const at = ownElementName(raw, true); + if (!at) { + return null; + } + const named = element(MI_INT8, new TextEncoder().encode(name)); + const body = concat([raw.slice(8, at.nameAt), named, raw.slice(at.nameAt + at.name, at.end)]); + return concat([u32le(MI_MATRIX), u32le(body.length), body]); +} /** * Where the name subelement of the miMATRIX element `raw` holds is, and where the element * ends; null when the bytes are not a whole one ownElement can re-frame. Read, not built, so * it can be asked of every member before a write (refuseDimsBelow). + * + * An MCOS object's element has no stream of its own (matStreamOfElement), so it is found only + * when `opaque` is set, for a variable's rename (elementNamed): its name is the subelement + * after its flags, where any other class has its dimensions. */ -function ownElementName(raw) { +function ownElementName(raw, opaque = false) { if (raw.length < 8) { return null; } @@ -1033,12 +1062,13 @@ function ownElementName(raw) { return 8 + n + ((8 - (n % 8)) % 8); }; const flags = subLength(8); - if (!flags || raw[16] === 17) { + const isOpaque = raw[16] === 17; + if (!flags || (isOpaque && !opaque)) { return null; } - const dims = subLength(8 + flags); + const dims = isOpaque ? 0 : subLength(8 + flags); const nameAt = 8 + flags + dims; - const name = dims ? subLength(nameAt) : 0; + const name = dims || isOpaque ? subLength(nameAt) : 0; if (!name || nameAt + name > end) { return null; } diff --git a/dist/datamodel/parser/MatWriter.js.map b/dist/datamodel/parser/MatWriter.js.map index b52b9a9b..dccd5892 100644 --- a/dist/datamodel/parser/MatWriter.js.map +++ b/dist/datamodel/parser/MatWriter.js.map @@ -1 +1 @@ -{"version":3,"file":"MatWriter.js","sourceRoot":"","sources":["../../../src/datamodel/parser/MatWriter.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"MatWriter.js","sourceRoot":"","sources":["../../../src/datamodel/parser/MatWriter.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/datamodel/parser/SparseData.d.ts b/dist/datamodel/parser/SparseData.d.ts index bcd2ea24..d1f9a962 100644 --- a/dist/datamodel/parser/SparseData.d.ts +++ b/dist/datamodel/parser/SparseData.d.ts @@ -57,9 +57,10 @@ export declare function backedColumnsOf(s: SparseData): number; export declare function unbackedColumns(s: SparseData, dims: number[]): string | null; /** * One complex element as the node layer holds it, `1+2i`, `3-4i`, `1NaNi`, `1+Infi`: - * XmlUtils.formatComplexNum's spelling. The one spelling of an element of a complex array - * read out of MAT bytes, full or sparse (MatlabVariableNode._createFromMatNumeric), so the - * two show a value the same way, and the same way a binary dictionary's text shows it. + * XmlUtils.formatComplexNum's spelling, a -0 part's sign kept. The one spelling of an element + * of a complex array read out of MAT bytes, full or sparse (MatlabVariableNode. + * _createFromMatNumeric), so the two show a value the same way, and the same way a binary + * dictionary's text shows it. * Through 1.40.0 each part was String()'d, so an infinite part read `Infinity`, which MATLAB * neither writes nor reads (`{1+Infinityi}` is "Unrecognized function or variable * 'Infinityi'", R2027a): a text dictionary's complex(1, Inf) showed `1+Infinityi` beside diff --git a/dist/datamodel/parser/SparseData.d.ts.map b/dist/datamodel/parser/SparseData.d.ts.map index 99934b76..dd903147 100644 --- a/dist/datamodel/parser/SparseData.d.ts.map +++ b/dist/datamodel/parser/SparseData.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"SparseData.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/SparseData.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,UAAU,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,CAMhF;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAMrD;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAM5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE/E;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAErE;AAkCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CASzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAqBjG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAOtD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,CAiBvF"} \ No newline at end of file +{"version":3,"file":"SparseData.d.ts","sourceRoot":"","sources":["../../../src/datamodel/parser/SparseData.ts"],"names":[],"mappings":"AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,UAAU,CAAC;IAChB,GAAG,EAAE,UAAU,CAAC;IAChB,EAAE,EAAE,YAAY,CAAC;IACjB,EAAE,EAAE,YAAY,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,UAAU,CAMhF;AAED,uEAAuE;AACvE,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAMrD;AAED,0FAA0F;AAC1F,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAM5E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAW/E;AAED,sFAAsF;AACtF,wBAAgB,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAErE;AAkCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CASzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAqBjG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAOtD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,CAiBvF"} \ No newline at end of file diff --git a/dist/datamodel/parser/SparseData.js b/dist/datamodel/parser/SparseData.js index c0f66c34..4cd7551e 100644 --- a/dist/datamodel/parser/SparseData.js +++ b/dist/datamodel/parser/SparseData.js @@ -16,7 +16,7 @@ // // Parser-layer, so it imports nothing from the display or the node layer: MatParser // produces one of these, MatWriter consumes one, and the node layer edits one. -import { formatComplexNum, parseComplexNum, parseMatlabNum } from './XmlUtils.js'; +import { formatComplexNum, formatMatlabNum, parseComplexNum, parseMatlabNum } from './XmlUtils.js'; /** * The most elements this package lays out densely for a sparse array: the writers' fallback, * for an array MatWriter has no sparse storage for (a class or a rank MATLAB never stores @@ -61,15 +61,25 @@ export function unbackedColumns(s, dims) { } /** * One complex element as the node layer holds it, `1+2i`, `3-4i`, `1NaNi`, `1+Infi`: - * XmlUtils.formatComplexNum's spelling. The one spelling of an element of a complex array - * read out of MAT bytes, full or sparse (MatlabVariableNode._createFromMatNumeric), so the - * two show a value the same way, and the same way a binary dictionary's text shows it. + * XmlUtils.formatComplexNum's spelling, a -0 part's sign kept. The one spelling of an element + * of a complex array read out of MAT bytes, full or sparse (MatlabVariableNode. + * _createFromMatNumeric), so the two show a value the same way, and the same way a binary + * dictionary's text shows it. * Through 1.40.0 each part was String()'d, so an infinite part read `Infinity`, which MATLAB * neither writes nor reads (`{1+Infinityi}` is "Unrecognized function or variable * 'Infinityi'", R2027a): a text dictionary's complex(1, Inf) showed `1+Infinityi` beside * its binary twin's `1+Infi`. parseComplexNum still reads that spelling back. */ export function complexElement(re, im) { + // A part of -0 keeps its sign, which formatComplexNum does not spell (String(-0) is `0`): the + // text is the value (MatlabVariableNode._buildVarObject writes the array from it), so a .mat's + // `-3i`, complex(-0, -3), written again was complex(0, -3). It reads `-0-3i`, as the same value + // out of a binary dictionary's `-0.0-3.0i` does, and an imaginary -0 shows with a `+` + // (XmlUtils.shownComplexText). + if (Object.is(re, -0) || Object.is(im, -0)) { + const part = (x) => (Object.is(x, -0) ? '-0' : formatMatlabNum(x)); + return part(re) + (Number(im) >= 0 && !Object.is(im, -0) ? '+' : '') + part(im) + 'i'; + } return formatComplexNum(re, im); } /** Entry k as the node layer holds an element: a number, or complexElement's text. */ diff --git a/dist/datamodel/parser/SparseData.js.map b/dist/datamodel/parser/SparseData.js.map index 3cd0cc03..f8876127 100644 --- a/dist/datamodel/parser/SparseData.js.map +++ b/dist/datamodel/parser/SparseData.js.map @@ -1 +1 @@ -{"version":3,"file":"SparseData.js","sourceRoot":"","sources":["../../../src/datamodel/parser/SparseData.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"SparseData.js","sourceRoot":"","sources":["../../../src/datamodel/parser/SparseData.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.d.ts b/dist/index.d.ts index 4363ae4a..cc6b0d94 100644 --- a/dist/index.d.ts +++ b/dist/index.d.ts @@ -36,6 +36,7 @@ export type { ProjectPage, ProjectPageRun, ProjectPageShortcut, ProjectPageLabel export type { ParsedSlx, BlockParamUsage } from './datamodel/parser/SlxParser.js'; export type { ParsedMdl } from './datamodel/parser/MdlParser.js'; export type { ParsedMat, MatVariable } from './datamodel/parser/MatParser.js'; +export type { MatRecord } from './datamodel/parser/MatParser.js'; export type { SparseData } from './datamodel/parser/SparseData.js'; export type { ParseWarning, ParseWarningCode } from './datamodel/parser/ParseWarning.js'; export { ingest } from './core/ingest.js'; diff --git a/dist/index.d.ts.map b/dist/index.d.ts.map index b4e609a1..830198b8 100644 --- a/dist/index.d.ts.map +++ b/dist/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index 24958c9b..ffd5cc79 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/core/DataModel.ts b/src/core/DataModel.ts index 1b9e9ce4..d58844ab 100644 --- a/src/core/DataModel.ts +++ b/src/core/DataModel.ts @@ -12,6 +12,7 @@ import { parseMat } from '../datamodel/parser/MatParser.js'; import type { ParsedMat } from '../datamodel/parser/MatParser.js'; import { parseProject } from '../datamodel/parser/ProjectParser.js'; import { serializeBinarySldd } from '../datamodel/parser/BinarySlddSerializer.js'; +import { serializeMatFile } from '../datamodel/parser/MatFileWriter.js'; import { catalogFunctionRenames, catalogRenames, scJsonTextWithRenames } from '../datamodel/parser/ScCatalog.js'; // The name reductions and the expression reading, from the leaf modules that hold the // single copy of each. This file used to spell all three itself; the usage index needs @@ -29,7 +30,7 @@ import type { ParseWarning } from '../datamodel/parser/ParseWarning.js'; // a field of NodeUsage breaks the one line that installs the resolver — see UsageResolver. import type { RowData, UsageResolver, TypeLinkResolver } from '../datamodel/node/BaseNode.js'; import RowCellPool from '../datamodel/node/RowCellPool.js'; -import { propNamed } from '../datamodel/node/BaseNode.js'; +import { propNamed, sourceEditRefusal } from '../datamodel/node/BaseNode.js'; import type BaseNode from '../datamodel/node/BaseNode.js'; import { holdersRestorer } from '../datamodel/node/childEdit.js'; @@ -1749,6 +1750,21 @@ function editProperty( if (typeof newValue === 'string' && newValue === priorValue) { return true; } + // An edit the node's source would not write is refused before any setter is asked + // (BaseNode.sourceEditRefusal): a MAT-file's object, say, takes a rename and nothing else. + // Every setter asks the same rule (DataNode._refuseEncodedEdit); this is for one that does + // not, of a class a file can hold. + const prop = propNamed(node.getProperties(), propertyName); + const isName = propertyName === 'Name' || prop?.key === 'Name'; + const refused = sourceEditRefusal(node as unknown as BaseNode, isName ? 'Name' : prop?.key ?? propertyName); + if (refused) { + return { + error: true, + reason: refused, + invalidValue: String(newValue), + validValue: isName ? node.name : typeof priorValue === 'string' ? priorValue : node.displayValue, + }; + } // Unless the node can put the value back itself, which the undo then has it do: the text // it shows is not always its value (an empty's `[ ]` is a 0x0 double, whatever it was). const restore = propertyRestorer(node, propertyName); @@ -1807,14 +1823,18 @@ function editProperty( // entry is named `entryName`, or the class's default name, with a counter appended if // that name is taken. Returns null, and adds nothing and records no undo step, when // there is no active dictionary, no section takes the class, or the name is not one -// MATLAB can load (see SectionNode.addEntry): the same rule a rename applies. +// MATLAB can load (see SectionNode.addEntry): the same rule a rename applies. A MAT-file +// takes a plain variable, the double 0 named `var` (MatNode.execAddEntry), and nothing its +// save could not write. function addEntry(sectionKey: string, className: string, entryName?: string): INode | null { const slddNode = getActiveSlddNode(); if (!slddNode) { return null; } - let section: IContainerNode | null = slddNode.getSection(sectionKey); + // A MAT-file has no sections: its variables are its own children, so it takes the entry + // itself, whatever `sectionKey` says (MatNode.execAddEntry: a plain variable, `0`). + let section: IContainerNode | null = slddNode instanceof MatNode ? slddNode : slddNode.getSection(sectionKey); if (!section) { // When at root (sectionKey='sldd'), find the section that accepts this className for (const child of slddNode.children) { @@ -2234,16 +2254,18 @@ function getActiveSlddNode(): ISourceNode | null { * * Null for two distinct absences, deliberately given the same answer: a srcId the * session does not hold (the same answer getDataSource gives the same question), and - * a source whose format HAS no write path. `.slx`, `.mdl`, `.mat` and `.prj` are - * read-only in this package — only `.sldd` has a writer, and only that writer has a - * live MATLAB gate behind it. Null rather than a throw because a consumer enumerating - * every open source to find the saveable ones should not need a try/catch per source, - * and because there is nothing exceptional about a project file not being writable. + * a source whose format HAS no write path. `.slx`, `.mdl` and `.prj` are read-only in + * this package — `.sldd` and `.mat` have writers. Null rather than a throw because a + * consumer enumerating every open source to find the saveable ones should not need a + * try/catch per source, and because there is nothing exceptional about a project file + * not being writable. * * Throws for a value in it that no writer may write: one past the unbacked-bytes budget, as * a MatBudgetError naming the entry, the path in it and the budget (MatWriter.budgetFailure). * Nothing is returned then — no part of a file — and nothing in the session changes, so the - * save after the value is fixed or removed is the save there would have been. + * save after the value is fixed or removed is the save there would have been. A `.mat` save + * throws a MatWriteError the same way, naming the variable or the file, for anything it + * cannot write as what it is (MatFileWriter.serializeMatFile). * * The flavour follows the FILE, not a default: a `.sldd` that arrived as a * compressed-binary package is answered with zip bytes and one that arrived as JSON @@ -2256,6 +2278,13 @@ function serializeSource(srcId: string): SerializedSource | null { if (!source) { return null; } + // A MAT-file is written as its own records, what was edited written fresh, and is + // binary whatever its records are, compressed (`-v7`) or not (`-v6`). An instanceof + // for the reason the dictionary's is below: serializeMatFile reaches for the records + // and the node bound to each, which only a MatNode built from a parse holds. + if (source instanceof MatNode) { + return { kind: 'binary', sourceFormat: source.sourceFormat, bytes: serializeMatFile(source) }; + } // An instanceof rather than a duck test on serializeJson: serializeBinarySldd // reaches for _zipMetadata and _dataSourceAttrs, so a lookalike that merely // answers the same method names would be handed to a writer built for the class. diff --git a/src/core/sessionTypes.ts b/src/core/sessionTypes.ts index 7f7cfa69..519de78c 100644 --- a/src/core/sessionTypes.ts +++ b/src/core/sessionTypes.ts @@ -52,8 +52,8 @@ export interface CreateSessionOptions { * * `sourceFormat` is the source node's OWN format string — the same vocabulary * SourceDTO.sourceFormat publishes ('json' for a textual `.sldd`, 'xml' for a - * compressed-binary one) — so a consumer can correlate the two without a mapping - * table of its own. + * compressed-binary one, 'mat' for a MAT-file, which is always `binary`) — so a + * consumer can correlate the two without a mapping table of its own. */ export type SerializedSource = | { kind: 'binary'; sourceFormat: string; bytes: Uint8Array } diff --git a/src/datamodel/node/BaseNode.ts b/src/datamodel/node/BaseNode.ts index 2df2cbf1..1b36b9be 100644 --- a/src/datamodel/node/BaseNode.ts +++ b/src/datamodel/node/BaseNode.ts @@ -187,6 +187,33 @@ export function encodedHolderOf(node: BaseNode | null | undefined): BaseNode | n return null; } +/** + * Why the source `node` is in refuses an edit of `key` at `node`, in words, or null where it + * takes it. `key` is 'Name' for the node's own name, and the property's key for anything else, + * 'Value' for a child added or removed. + * + * A source answers for itself, through the first container above the node, which an entry is a + * child of: a MAT-file, whose save writes only some edits (MatNode._editRefusal). A dictionary's + * section and a model's do not answer, and take every edit their nodes take. Asked by every + * editability getter below, by the structural gates (DataNode._encodedReadOnly), by the setters + * (DataNode._refuseEncodedEdit, the rename) and by the session's editProperty, so that what the + * table offers and what an edit is taken for are one answer. Duck-typed, as encodedHolderOf is: + * this class imports no container. + */ +export function sourceEditRefusal(node: BaseNode, key: string): string | null { + let entry: BaseNode | null = null; + let n: BaseNode | null = node; + while (n && !(n as unknown as { isContainer?: boolean }).isContainer) { + entry = n; + n = n.parent; + } + const refuse = (n as unknown as { _editRefusal?: SourceEditRefusal } | null)?._editRefusal; + return entry && typeof refuse === 'function' ? refuse.call(n, entry, node, key) : null; +} + +/** A source's answer to sourceEditRefusal, for `node`, which is `entry` or a node under it. */ +export type SourceEditRefusal = (entry: BaseNode, node: BaseNode, key: string) => string | null; + /** * The prop in `props` that an edit naming `name` is an edit of: the one whose key or column is * `name`, which is how an edit committed in the 'Value' column reaches the atom that owns it (a @@ -320,7 +347,8 @@ export default class BaseNode { if (this.parent?.fixesChildNames) { return false; } - return true; + // Nor a name its source would not write (sourceEditRefusal). + return !sourceEditRefusal(this, 'Name'); } // Called on a node after a structural edit added or removed a child of `child` @@ -423,10 +451,15 @@ export default class BaseNode { while (root.parent) { root = root.parent; } - const source = root as unknown as { dirty?: boolean }; + const source = root as unknown as { dirty?: boolean; _nodeEdited?: (node: BaseNode) => void }; if (source.dirty !== undefined) { source.dirty = true; } + // And a source that keeps what it found of each of its entries is told which node changed, + // so that it forgets what it found of that node's entry, and of no other (MatNode._nodeEdited). + if (typeof source._nodeEdited === 'function') { + source._nodeEdited(this); + } // Every mutation reaches here, so this is where a rename — the edit that actually moves // a link — is caught. A value edit drops the index too, needlessly; the rebuild rides // the row build that edit was already going to cause. @@ -627,7 +660,8 @@ export default class BaseNode { if (v && v.charAt(0) === '<' && v.charAt(v.length - 1) === '>') { return false; } - return true; + // Nor a value its source would not write (sourceEditRefusal). + return !sourceEditRefusal(this, 'Value'); } // Whether a Description typed onto this row could be SAVED — the third member of the @@ -645,7 +679,7 @@ export default class BaseNode { // Parameter whose value displays as a `<1x12 double>` summary takes no value editor // and can still be described. get descriptionEditable(): boolean { - return !encodedHolderOf(this); + return !encodedHolderOf(this) && !sourceEditRefusal(this, 'Description'); } getPropInfo(PropClassRef: PropClass): PropInfo { @@ -679,6 +713,12 @@ export default class BaseNode { if (key !== 'Name' && encodedHolderOf(this)) { editable = false; } + // And any its source would not write (sourceEditRefusal), the Name included: asked last, + // and only of a property every rule above leaves editable, as it is the one that walks to + // the source. + if (editable && sourceEditRefusal(this, key)) { + editable = false; + } return { key, diff --git a/src/datamodel/node/DataNode.ts b/src/datamodel/node/DataNode.ts index da45b847..0d2c28b1 100644 --- a/src/datamodel/node/DataNode.ts +++ b/src/datamodel/node/DataNode.ts @@ -1,6 +1,6 @@ // Copyright 2026 The MathWorks, Inc. -import BaseNode, { encodedHolderOf, propNamed } from './BaseNode.js'; +import BaseNode, { encodedHolderOf, propNamed, sourceEditRefusal } from './BaseNode.js'; import type { PropClass } from './BaseNode.js'; import type { ChildAddEdit, ChildUndoRedo } from './childEdit.js'; import { trySetSchemaProperty } from './schemaBridge.js'; @@ -308,6 +308,13 @@ export default class DataNode extends BaseNode { // long as it is still the value: see _adoptEncoded. Undefined on every node but the one // a binary dictionary's `Encoding="hex"` element decoded into. _encoded?: EncodedValue; + // Set on an entry by every edit under it but the entry's own rename (_markModified), and + // never cleared, an undo included. `status` is 'Modified' after either, so this is what + // tells an entry that was only renamed, whose value is still the bytes it was read from, + // from one whose value changed: a MAT-file save writes the first as those bytes with the + // new name in them, and the second fresh (MatFileWriter). Left set by an undo, it writes + // a value equal to the one read, fresh, which is the safe side. + _valueEdited?: boolean; rawXml?: string; // A semantic classification token (e.g. 'DataInterface', 'StructType') set at // parse time for entries the source classifies beyond their Class (currently @@ -491,10 +498,13 @@ export default class DataNode extends BaseNode { // something asks for it directly — renaming a Simulink.Parameter's `Value` row was // exactly that, accepted by the model and dropped by serialize, which writes the // key `Value` whatever the node is called. + // Said as the source says it, when it is the source that refuses (BaseNode.sourceEditRefusal: + // a MAT-file's variable stored after its subsystem), which _refuseEncodedEdit has asked + // already for every class whose setter comes here first. if (!this.nameEditable) { return { error: true, - reason: `'${this.displayName}' is not a name this entry can carry, so it cannot be renamed.`, + reason: sourceEditRefusal(this, 'Name') ?? `'${this.displayName}' is not a name this entry can carry, so it cannot be renamed.`, invalidValue: stringValue, validValue: this.displayName, }; @@ -517,14 +527,24 @@ export default class DataNode extends BaseNode { typeof nsHolds === 'function' ? stringValue !== this.name && nsHolds.call(this.parent, stringValue) > 0 : this.parent.children.some((sibling) => sibling !== this && sibling.name === stringValue); + // Said of where the names are one namespace: a dictionary's Design and Architectural + // Data, or a MAT-file, which names itself (MatNode._namespaceLabel). if (duplicate) { + const where = (this.parent as unknown as { _namespaceLabel?: string })._namespaceLabel ?? 'Design or Architectural Data'; return { error: true, - reason: "'" + stringValue + "' already exists in Design or Architectural Data", + reason: "'" + stringValue + "' already exists in " + where, invalidValue: stringValue, validValue: this.name, }; } + // And a name the parent could not write: a MAT-file's variable whose record is not one + // whole element, whose name its save has nowhere to put (MatNode._renameRefusal). + const renameRefusal = (this.parent as unknown as { _renameRefusal?: (node: BaseNode) => string | null })._renameRefusal; + const refused = typeof renameRefusal === 'function' ? renameRefusal.call(this.parent, this) : null; + if (refused) { + return { error: true, reason: refused, invalidValue: stringValue, validValue: this.name }; + } } const oldName = this.name; this.name = stringValue; @@ -563,7 +583,7 @@ export default class DataNode extends BaseNode { // Class="double" element, which made MATLAB refuse to open the whole file. const encoded = this._encoded; const raw = this._rawInput; - this._markModified(); + this._markModified('name'); this._encoded = encoded; this._rawInput = raw; return true; @@ -755,7 +775,11 @@ export default class DataNode extends BaseNode { // edit below it on save. A value read from a stream is read-only (_refuseEncodedEdit and // BaseNode's editability), so nothing should reach here from inside one; this is the // second line, for whatever does. The rename that keeps it is DataNode.setProperty's. - _markModified(): void { + // + // `edit` is 'name' for that rename, and only for it. An entry's own rename leaves its value + // as it was, and every other edit marks the entry `_valueEdited`; so does the rename of + // anything under it, a struct's field, which changes the entry's value. + _markModified(edit: 'value' | 'name' = 'value'): void { const entry = this.owningEntry; for (let node: BaseNode | null = this; node && node !== entry; node = node.parent) { if ((node as DataNode)._rawInput !== undefined) { @@ -767,6 +791,9 @@ export default class DataNode extends BaseNode { } if (entry) { entry.status = 'Modified'; + if (edit !== 'name' || entry !== this) { + entry._valueEdited = true; + } if (entry._rawInput !== undefined) { entry._rawInput = undefined; } @@ -1222,30 +1249,40 @@ export default class DataNode extends BaseNode { } /** - * Is this node at or under one whose value is still an encoded stream? The structural - * gates (canAddChild, canRemoveChild) of every class that has them ask this, for the - * reason _refuseEncodedEdit gives: a child added or removed there could not reach the file. + * Is this node at or under one whose value is still an encoded stream, or one whose source + * would not write a change to it (BaseNode.sourceEditRefusal: a MAT-file's object, say)? The + * structural gates (canAddChild, canRemoveChild) of every class that has them ask this, for + * the reason _refuseEncodedEdit gives: a child added or removed there could not reach the file. */ get _encodedReadOnly(): boolean { - return !!encodedHolderOf(this); + return !!encodedHolderOf(this) || !!sourceEditRefusal(this, 'Value'); } + /** + * The refusal of an edit of `propName` at or under a value still in the encoded stream it was + * read from, but for the holder's own name, or of one this node's source would not write + * (BaseNode.sourceEditRefusal), in its words; null where the edit may go ahead. Asked first by + * the setter of every class that has one, so that no setter takes what the table offers no + * editor for. + */ _refuseEncodedEdit(propName: string, stringValue: string): SetPropertyResult | null { + const isName = this._resolveProperty(propName) === 'name'; const holder = encodedHolderOf(this); - if (!holder) { - return null; + if (holder && !(holder === this && isName)) { + return { + error: true, + reason: + `'${holder.displayName}' is stored as an encoded MATLAB value that this editor can show but not write, ` + + 'so it is read-only.', + invalidValue: stringValue, + validValue: isName ? this.name : this.displayValue, + }; } - if (holder === this && this._resolveProperty(propName) === 'name') { - return null; + const refused = sourceEditRefusal(this, isName ? 'Name' : this._propFor(propName)?.key ?? propName); + if (refused) { + return { error: true, reason: refused, invalidValue: stringValue, validValue: isName ? this.name : this.displayValue }; } - return { - error: true, - reason: - `'${holder.displayName}' is stored as an encoded MATLAB value that this editor can show but not write, ` + - 'so it is read-only.', - invalidValue: stringValue, - validValue: this._resolveProperty(propName) === 'name' ? this.name : this.displayValue, - }; + return null; } /** diff --git a/src/datamodel/node/container/MatNode.ts b/src/datamodel/node/container/MatNode.ts index 56f9bb2a..e4d0ae2a 100644 --- a/src/datamodel/node/container/MatNode.ts +++ b/src/datamodel/node/container/MatNode.ts @@ -10,28 +10,332 @@ import type { MatVariable } from '../data/MatlabVariableNode.js'; import type { ParseWarning } from '../../parser/ParseWarning.js'; import { reasonOf } from '../../parser/ParseWarning.js'; import { functionHandleOf } from '../../parser/MatParser.js'; +import type { MatRecord, ParsedMat } from '../../parser/MatParser.js'; import PropName from '../../prop/PropName.js'; import { MAT_NODE_CEILING } from '../../display/DisplayConvention.js'; import { buildUnderCeiling, buildUncut, chargeNodes } from '../data/matNodeCeiling.js'; +import { + PAST_SUBSYSTEM, + duplicateWhy, + freshRefusal, + renameWhy, + structureRefusal, + subsystemOf, + unsavableRefusal, + unwritableIn, +} from '../../parser/MatFileWriter.js'; +import type { MatWriteError } from '../../parser/MatWriter.js'; +import { validateMatlabName } from '../../matlabName.js'; +import { owningEntryOf } from '../DataNode.js'; +import { basenameOf } from '../../fileKinds.js'; + +// What MatNode.fromParsed builds a tree from: a parse of this package's (ParsedMat), or a +// host's, whose parse may be an older one's, without the records a save splices. +export type MatParse = Pick & + Partial>; export default class MatNode extends ContainerNode { header: string; dirty: boolean; _anonymousElements: MatVariable[]; + // The file as a save splices it (ParsedMat's fields of the same names): its header's 128 + // bytes, every record in it, the subsystem's offset, and whether the records are the file. + // + // `records` is null, and so is `headerBytes`, when this tree was not built from records + // a save can trust: a host's parse that carries none (an older package's, handed to + // addMatSourceParsed), one whose records are not byte views, or one whose variables are + // not each the variable of one record. No save of such a tree is safe, and a writer + // that finds `records` null refuses it, rather than building one out of the variables + // alone, which loses every record the reader did not read. + headerBytes: Uint8Array | null; + records: MatRecord[] | null; + subsystemOffset: number; + framed: boolean; + unframed: { at: number; reason: string } | null; + // Which node each record became, and the other way round (nodeOf, recordOf). A node is + // the same object for as long as it is in the tree: an edit changes it in place, a + // delete takes it out (its `parent` is then no longer this), and its undo puts the same + // node back. So a record's node, in the tree or not, is what became of the record. + _recordNodes: Map; + _nodeRecords: Map; + // What the gate of the editor (_editRefusal) has found: the refusal of the file as a whole + // (undefined until asked) and the subsystem's record, which no edit changes; what a save would + // refuse of each variable's value written fresh, kept until an edit of that variable + // (_nodeEdited) or its leaving or joining the file (addChild, removeChild); and how many + // variables hold each name, moved with every variable added, removed or renamed, as of + // `_entriesVersion` (_namespaceHolds). + _fileVerdict: string | null | undefined; + _subsystem: MatRecord | null | undefined; + _valueVerdicts: WeakMap; + _nameCounts: Map | null; + _countedAt: number; + // Moved by every change to which variables this file holds and what they are called, as a + // dictionary's section's is (SectionNode._entriesVersion): BaseNode._replaceWith moves it too, + // so that a slot that changes hands has its names counted again. + _entriesVersion: number; constructor(name: string) { super(name, null); this.header = ''; this.dirty = false; + this._valueVerdicts = new WeakMap(); + this._nameCounts = null; + this._countedAt = -1; + this._entriesVersion = 0; this._anonymousElements = []; + this.headerBytes = null; + this.records = null; + this.subsystemOffset = 0; + this.framed = false; + this.unframed = null; + this._recordNodes = new Map(); + this._nodeRecords = new Map(); + } + + /** + * The record `node` was read from, or null for a node no record became: a variable added + * since the file was read, or any node of a tree with no records (`records` null). + */ + recordOf(node: BaseNode): MatRecord | null { + return this._nodeRecords.get(node) ?? null; + } + + /** + * The node `record` became, whether or not it is still in the tree (a deleted one's + * `parent` is not this), or null for a record that became no node: the subsystem or + * another unnamed element (`_anonymousElements`), and a record the reader dropped. + */ + nodeOf(record: MatRecord): BaseNode | null { + return this._recordNodes.get(record) ?? null; } get displayName(): string { return this.name; } + // Saved by serializeSource (MatFileWriter), so a file is read-only only when no save of it + // can be written: opened without its records, its bytes handed away since, its records not + // tiling it, or its subsystem not where its header says (_fileRefusal). get readOnly(): boolean { - return true; + return this._fileRefusal() !== null; + } + + // An edit of `node`, which is a variable of this file or a node under one (BaseNode. + // _markSourceDirty): what the gate found of that variable's value is forgotten, and of no other, + // since nothing a save refuses of a value written fresh is about another variable + // (freshRefusal). Which names two of them share is counted apart (_namespaceHolds). Forgetting + // every variable's at every edit re-walked every variable a table showed after each, and each + // of N renames counted N names again. + _nodeEdited(node: BaseNode): void { + const entry = owningEntryOf(node); + if (entry && entry.parent === this) { + this._valueVerdicts.delete(entry); + } + } + + addChild(child: BaseNode, index?: number): BaseNode { + super.addChild(child, index); + this._valueVerdicts.delete(child); + this._entriesMoved(null, child.name); + return child; + } + + removeChild(child: BaseNode): void { + const before = this.children.length; + super.removeChild(child); + if (this.children.length < before) { + this._valueVerdicts.delete(child); + this._entriesMoved(child.name, null); + } + } + + // One of my variables renamed (DataNode.setProperty): its name's count moves with it. + _entryRenamed(oldName: string, newName: string): void { + this._entriesMoved(oldName, newName); + } + + // A variable of this file stopped being called `gone`, and one started being called `came` + // (either null): one removed, added or renamed. The version moves, and the counts, when they + // are of the version before, move with it and go on holding. + _entriesMoved(gone: string | null, came: string | null): void { + const held = this._nameCounts !== null && this._countedAt === this._entriesVersion; + this._entriesVersion++; + if (!held) { + return; + } + const counts = this._nameCounts!; + if (gone !== null) { + const left = (counts.get(gone) ?? 0) - 1; + if (left > 0) { + counts.set(gone, left); + } else { + counts.delete(gone); + } + } + if (came !== null) { + counts.set(came, (counts.get(came) ?? 0) + 1); + } + this._countedAt = this._entriesVersion; + } + + // ---- The edits a save of this file can write ---------------------------------------------- + // + // The editor takes no edit a save of this file would then refuse (MatFileWriter), so that none + // is made that cannot be kept: the baseline is that no edit taken is one a save then refuses, + // or writes as something else. One rule, this one, asked by every path an edit takes + // (BaseNode.sourceEditRefusal): the editors of the table and of the Property Inspector + // (BaseNode.getPropInfo, nameEditable, valueEditable, descriptionEditable), the gates of a + // child added or removed (DataNode._encodedReadOnly), each class's setter + // (DataNode._refuseEncodedEdit, DataNode's rename), and the session's editProperty. Built of the + // writer's own refusals (unsavableRefusal, structureRefusal, freshRefusal, PAST_SUBSYSTEM, + // duplicateWhy), so that the two cannot come to disagree. + + /** + * Why an edit of `key` at `node`, which is `entry` or a node under it, is refused, as a + * message naming the variable or the file, or null where a save of this file writes it. + * `key` is 'Name' for `node`'s own name, and a property's key for anything else: 'Value' + * for a value typed in, a child added or removed, and an element's or a field's edit. + * + * - every edit, of a file no save of which can be written (_fileRefusal), its variables' + * delete and the addition of one included (execRemoveEntry, execAddEntry); + * - every edit of a variable stored after the subsystem, its name included: MATLAB does + * not read it there, and moved, what MATLAB loads would change. It can be deleted; + * - a variable's own name: taken, and written as its record with the name replaced; + * - anything else, which writes the variable fresh: refused where the writer refuses that + * (freshRefusal: an object's typed node, a string, a function handle, a value not + * decoded, and a variable holding one at any depth), or where another variable of the + * file has its name; + * - and Add ('Add', MatlabVariableNode.canAddChild) on a struct that is not 1x1 or is an + * element of one, which is written, but not as the tree shows it. Add gives a struct a + * field row of its own: the rows of a struct array are its elements, so the row was an + * element of no fields the save did not write; a 0x0 struct's field was written with no + * element to hold it, which reads back as no field; and a field added to one element of + * a struct array is written into every element, as MATLAB adds one, `[]` in the others, + * which the tree did not show. + * + * Phase 2 of the MAT-file save widens the last of these, for the properties of an object it + * writes into the subsystem. + */ + _editRefusal(entry: BaseNode, node: BaseNode, key: string): string | null { + const file = this._fileRefusal(); + if (file) { + return file; + } + const record = this.recordOf(entry); + const subsystem = this._subsystemRecord(); + if (record && subsystem && record.offset > subsystem.offset) { + return cannotEdit(entry.name, PAST_SUBSYSTEM); + } + if (node === entry && (key === 'Name' || key === 'name')) { + return null; + } + let verdict = this._valueVerdicts.get(entry); + if (verdict === undefined) { + const refused = freshRefusal(entry, record); + verdict = refused ? editRefusalOf(refused) : null; + this._valueVerdicts.set(entry, verdict); + } + if (!verdict && this._namespaceHolds(entry.name) > 1) { + verdict = cannotEdit(entry.name, duplicateWhy(entry.name)); + } + if (!verdict && key === 'Add') { + const array = [node, node.parent].find((n) => isStruct(n) && n._dims.reduce((a, b) => a * b, 1) !== 1) as MatlabVariableNode | undefined; + if (array) { + return cannotEdit( + entry.name, + array.matlabPath + ' is a ' + array._dims.join('x') + ' struct, whose fields a save writes into every element of it or none, ' + + 'and Add gives one struct a field of its own', + ); + } + } + return verdict; + } + + /** + * Why `value`, a node built of the text an edit typed in for `node`, of `entry`, cannot be + * written into this file, or null where it can: a string, which MatWriter has no MAT class + * for. Asked of the edit before it is made (MatlabVariableNode.setProperty), so that a value + * that would leave the variable one a save refuses (freshRefusal) is never taken. + */ + _valueRefusal(entry: BaseNode, node: BaseNode, value: BaseNode): string | null { + const unwritable = unwritableIn(value); + if (!unwritable) { + return null; + } + const is = unwritable.path === value.matlabPath ? ' would be ' : ' would hold '; + return cannotEdit(entry.name, (node.matlabPath || entry.name) + is + unwritable.what + ', which this package cannot write into a MAT-file'); + } + + /** + * Why `node`, a variable of this file, cannot be renamed, or null where it can: its record is not + * one whole element whose name a save can replace (MatFileWriter.renameWhy), which only a damaged + * file holds. Asked by the rename itself (DataNode.setProperty) and not by the editability + * getters, as finding out inflates the record: a rename refused so is refused before it is made. + */ + _renameRefusal(node: BaseNode): string | null { + const record = this.recordOf(node); + const why = record ? renameWhy(record) : null; + return why ? cannotEdit(node.name, why) : null; + } + + /** Why no edit of this file is taken, or null (unsavableRefusal, structureRefusal). */ + _fileRefusal(): string | null { + // A host that hands the bytes away empties every view of them at once, the header's + // first, so a verdict of none is asked again only once that happened. + const gone = this.headerBytes !== null && this.headerBytes.byteLength !== 128; + if (this._fileVerdict === undefined || (gone && this._fileVerdict === null)) { + const refused = unsavableRefusal(this) ?? structureRefusal(this, this.records!, this._subsystemRecord()); + this._fileVerdict = refused ? editRefusalOf(refused) : null; + } + return this._fileVerdict; + } + + /** The subsystem's record (MatFileWriter.subsystemOf), found once: the records never change. */ + _subsystemRecord(): MatRecord | null { + if (this._subsystem === undefined) { + this._subsystem = this.records ? subsystemOf(this, this.records) : null; + } + return this._subsystem; + } + + /** + * How many variables of the file a save writes under `name`: the variables in the tree, and + * each record that became none (one the reader dropped) under its own name, as a save writes + * it (MatFileWriter.refuseDuplicates). A rename into a name another holds is refused for it + * (DataNode.setProperty), naming this file (_namespaceLabel). + * + * Counted when first asked, and moved with every variable added, removed or renamed after + * (_entriesMoved), so that a rename costs a lookup and not a count of every name: as a + * dictionary's are (SectionNode._namespaceHolds, F1-23). + * + * A record the reader dropped without a name, one that does not inflate or holds no matrix, + * is counted under none: what it would be called is not known, so an added or renamed + * variable is not held to it (MatFileWriter.refuseDuplicates, likewise). Every such record + * already breaks a rule MATLAB loads a file by (MatFileCheck: `compressed-wrapper`, + * `top-level-type`), and for all of them but one past the inflate ceiling that is a rule + * MATLAB fails the whole load on: no variable of the file is loaded beside it, whatever its name. + */ + _namespaceHolds(name: string): number { + if (!this._nameCounts || this._countedAt !== this._entriesVersion) { + const counts = new Map(); + const add = (n: string) => counts.set(n, (counts.get(n) ?? 0) + 1); + for (const child of this.children) { + add(child.name); + } + for (const record of this.records ?? []) { + if (record.name && !this.nodeOf(record)) { + add(record.name); + } + } + this._nameCounts = counts; + this._countedAt = this._entriesVersion; + } + return this._nameCounts.get(name) ?? 0; + } + + /** Where a rename into a name already held is said to collide (DataNode.setProperty): this file. */ + get _namespaceLabel(): string { + return basenameOf(this.name) || this.name; } // The format an out-of-process host is told this source is, since SourceDTO carries @@ -67,7 +371,18 @@ export default class MatNode extends ContainerNode { return null; } - execAddEntry(_className?: string, entryName?: string): { node: BaseNode; undo: () => void; redo: () => void } { + // A new variable is the double 0, named `entryName`, or `var` with a counter appended if that + // is taken. The only class it takes is a plain variable's: a save writes no object (freshRefusal). + // Null, adding nothing, for a file no save of which can be written (_fileRefusal), for any other + // class, and for a name that is no MATLAB name or one the file holds already, by the rule a rename + // is held to: a save would refuse each. + execAddEntry(className?: string, entryName?: string): { node: BaseNode; undo: () => void; redo: () => void } | null { + if (this._fileRefusal() || (className && !PLAIN_VARIABLE_CLASSES.has(className))) { + return null; + } + if (entryName && (validateMatlabName(entryName) || this._namespaceHolds(entryName) > 0)) { + return null; + } const name = entryName || this._uniqueName('var'); const node = MatlabVariableNode.createDefault(name, this); this.addChild(node); @@ -85,21 +400,23 @@ export default class MatNode extends ContainerNode { }; } + // Not a name any variable of the file holds, a record the reader dropped included (_namespaceHolds). _uniqueName(baseName: string): string { - const names = new Set(this.children.map((c) => c.name)); - if (!names.has(baseName)) { + if (this._namespaceHolds(baseName) === 0) { return baseName; } let i = 1; - while (names.has(baseName + i)) { + while (this._namespaceHolds(baseName + i) > 0) { i++; } return baseName + i; } + // A delete is written by any save, of any variable, one stored after the subsystem and an object + // included; refused only in a file no save of which can be written (_fileRefusal). execRemoveEntry(node: BaseNode): { undo: () => void; redo: () => void } | null { const index = this.children.indexOf(node); - if (index < 0) { + if (index < 0 || this._fileRefusal()) { return null; } this.removeChild(node); @@ -146,13 +463,15 @@ export default class MatNode extends ContainerNode { // containers have no rows and names the first ('part-not-expanded'). A parse handed over with // no warnings array (an older host's) is given one for it, which is the array addMatSource // and addMatSourceParsed pass on: both read it after this returns. - static fromParsed( - parsed: { header: string; variables: MatVariable[]; warnings?: ParseWarning[] }, - filename: string, - options: { nodeCeiling?: number } = {}, - ): MatNode { + // + // Each node built of a record is bound to it (recordOf, nodeOf), whatever node it is: a + // plain variable, an MCOS object's typed node, a function handle, one shown as not + // decoded. A parse with no records, or whose records do not cover its variables one for + // one, binds none and keeps none (`records` null). + static fromParsed(parsed: MatParse, filename: string, options: { nodeCeiling?: number } = {}): MatNode { const node = new MatNode(filename); node.header = parsed.header; + const records = heldRecords(parsed); // A .mat file keeps the MCOS blob in an anonymous trailing element. Every opaque in // the file, nested or not, comes back carrying its own decode, and what the decoder @@ -161,29 +480,61 @@ export default class MatNode extends ContainerNode { attachMcosDecoded(anonElement?._rawBytes, parsed.variables, parsed.warnings); const ceiling = options.nodeCeiling ?? MAT_NODE_CEILING; - const { cut, firstCut } = buildUnderCeiling(ceiling, () => MatNode._addVariables(node, parsed)); + const recordOf = records ? new Map(records.filter((r) => r.variable).map((r) => [r.variable!, r])) : null; + const { cut, firstCut } = buildUnderCeiling(ceiling, () => + MatNode._addVariables(node, parsed, recordOf), + ); if (cut > 0 && firstCut) { const warnings = parsed.warnings ?? (parsed.warnings = []); warnings.push(notExpandedWarning(firstCut.matlabPath, cut, ceiling)); } + if (records && bindsEveryRecord(node, records, parsed.variables)) { + node.headerBytes = parsed.headerBytes!; + node.records = records; + node.subsystemOffset = parsed.subsystemOffset ?? 0; + node.framed = parsed.framed === true; + node.unframed = parsed.unframed ?? null; + } else { + node._recordNodes.clear(); + node._nodeRecords.clear(); + } return node; } + _bindRecord(child: BaseNode, record: MatRecord | undefined): void { + if (record) { + this._recordNodes.set(record, child); + this._nodeRecords.set(child, record); + } + } + // Every variable as a row of `node`, in the file's order, under the ceiling fromParsed arms: // all of them counted first, and none refused (matNodeCeiling.chargeNodes), so that the rows // under them are what is left, and a tree is never more nodes than the ceiling or the // variables, whichever is more. - static _addVariables(node: MatNode, parsed: { variables: MatVariable[]; warnings?: ParseWarning[] }): void { + // + // `recordOf` is each variable's record, by identity (MatRecord.variable), and every node + // made of a variable is bound to it here, the one place all four kinds are made. + static _addVariables( + node: MatNode, + parsed: { variables: MatVariable[]; warnings?: ParseWarning[] }, + recordOf: ReadonlyMap | null = null, + ): void { chargeNodes(parsed.variables.filter((v) => !v._anonymous).length); for (const variable of parsed.variables) { if ((variable as unknown as { _anonymous?: boolean })._anonymous) { node._anonymousElements.push(variable); continue; } + const record = recordOf?.get(variable); + const add = (child: BaseNode) => { + node.addChild(child); + node._bindRecord(child, record); + }; if (variable.isOpaque) { const mcosNode = buildUncut(() => modelOpaqueMcosVariable(variable, mcosDecodedFor(variable), node, parsed.warnings)); if (mcosNode) { - node.addChild(mcosNode); + add(mcosNode); continue; } } @@ -194,14 +545,61 @@ export default class MatNode extends ContainerNode { const handle = functionHandleOf(variable); if (handle) { const value = handle.text === null ? 'Matrix(' + variable.dimensions.join(',') + ')' : handle.text; - node.addChild(MatlabVariableNode.parse({ _type: 'function_handle', _value: value }, variable.name, node)); + add(MatlabVariableNode.parse({ _type: 'function_handle', _value: value }, variable.name, node)); continue; } - node.addChild(variableNodeOf(variable, node, parsed.warnings)); + add(variableNodeOf(variable, node, parsed.warnings)); } } } +// The classes a variable added to a file may be asked for as (execAddEntry): none, the one a +// dictionary's plain variable is added as, and a double's. +const PLAIN_VARIABLE_CLASSES = new Set(['MatlabVariable', 'double']); + +// A refusal of the writer's, `Cannot save "f.mat": …. Nothing was written.`, as the editor says +// it of an edit it does not take: `Cannot edit "f.mat": ….` +function editRefusalOf(e: MatWriteError): string { + return e.message.replace(/^Cannot (?:save|write) /, 'Cannot edit ').replace(/ Nothing was written\.$/, ''); +} + +function isStruct(node: BaseNode | null): node is MatlabVariableNode { + return node instanceof MatlabVariableNode && node._kind === 'scalar' && node._scalarType === 'struct'; +} + +function cannotEdit(name: string, why: string): string { + return 'Cannot edit "' + name + '": ' + why + '.'; +} + +// The records of `parsed` a save can splice, or null: none for a host's parse that carries +// none, and none for one whose header or records are not byte views as long as they say, +// which no reader of this package hands over. Views are told by ArrayBuffer.isView, which +// answers for one made in another realm (a worker's, structured-cloned here) as well. +function heldRecords(parsed: MatParse): MatRecord[] | null { + const { headerBytes, records } = parsed; + if (!Array.isArray(records) || !ArrayBuffer.isView(headerBytes) || headerBytes.byteLength !== 128) { + return null; + } + const whole = records.every((r) => r && ArrayBuffer.isView(r.bytes) && r.bytes.byteLength === r.length); + return whole ? records : null; +} + +// Whether the tree `node` was built as is bound one for one: every variable the variable of +// exactly one record, and every node bound to the record of the variable it was made of (an +// unnamed element is made into no node, and is in `_anonymousElements`). A parse whose +// records were made apart from its variables, or whose variables a host changed since, +// binds short, and its records are not this tree's to splice. +function bindsEveryRecord(node: MatNode, records: MatRecord[], variables: MatVariable[]): boolean { + const withVariable = records.filter((r) => r.variable); + const ofRecords = new Set(withVariable.map((r) => r.variable)); + return ( + ofRecords.size === withVariable.length && + ofRecords.size === variables.length && + variables.every((v) => ofRecords.has(v)) && + node._nodeRecords.size === node.children.length + ); +} + // The file's one word about its node ceiling, which is not a loss, as `duplicate-id` is not // (ParseWarning): every value in it is read, and copied whole. `part` is the first container // built without its rows, in the order the tree is built, and the count is of the others. diff --git a/src/datamodel/node/data/MatlabVariableNode.ts b/src/datamodel/node/data/MatlabVariableNode.ts index 3d0b2b93..1f70d33c 100644 --- a/src/datamodel/node/data/MatlabVariableNode.ts +++ b/src/datamodel/node/data/MatlabVariableNode.ts @@ -5,6 +5,7 @@ import type { SetPropertyResult, ValueShape } from '../DataNode.js'; import { matlabVariableKind } from '../../kindMap.js'; import type { PropClass, MatlabVariableKind } from '../BaseNode.js'; import type BaseNode from '../BaseNode.js'; +import { encodedHolderOf, sourceEditRefusal } from '../BaseNode.js'; import { addChildUndoable, removeChildUndoable } from '../childEdit.js'; import type { ChildAddEdit, ChildUndoRedo } from '../childEdit.js'; import * as NodeRegistry from '../NodeRegistry.js'; @@ -373,6 +374,13 @@ export default class MatlabVariableNode extends DataNode { // subtree rebuilt from that for the asking (_withCeilingTwin). Cleared by a Value typed over it // (_applyParsed), which gives it rows of its own. Absent on every other node. _cutByCeiling?: number; + // The field names of a struct array of NO element, `struct('a', {})`, in the file's order: it + // has no element row to hold them, and they are all there is of it. Set by + // _createFromMatStruct from the variable read (MatParser keeps them, each with an empty list), + // and read by what writes the struct from its rows (_buildVarObject, _serializeStructValue), so + // that it is not written as a struct of no field once something under or beside it is edited. + // Cleared by a Value typed over it (_applyParsed). Absent on every other node. + _emptyStructFields?: string[]; constructor(name: string, parent: BaseNode | null, serial?: Record) { super(name, parent, serial); @@ -561,14 +569,13 @@ export default class MatlabVariableNode extends DataNode { // The Class column says complex and sparse as MATLAB's Workspace browser does, // `int16 (complex)`, `double (sparse)` (DisplayConvention.classColumnText): className is // MATLAB's class(), which says neither. Complex is what the writers take it for - // (_isComplexValue), and for an empty, which has no element to say so, what it was read as - // (_elementType): a .mat's complex(zeros(1,0)), or a binary dictionary's IsComplex="1". + // (_isComplexValue), an empty's included: what it was read as, a .mat's complex(zeros(1,0)), + // or a binary dictionary's IsComplex="1". _classColumn(): string { if (this._isOpaque) { return super._classColumn(); } - const complexEmpty = this._kind === 'array' && this._elementType === 'complex' && this._liveElements().length === 0; - return classColumnText(this.className, { complex: this._isComplexValue() || complexEmpty, sparse: !!this._sparse }); + return classColumnText(this.className, { complex: this._isComplexValue(), sparse: !!this._sparse }); } // A primitive variable's data type ('double', 'string', 'cell', …) is a real @@ -610,7 +617,8 @@ export default class MatlabVariableNode extends DataNode { get nameEditable(): boolean { // Inside a value still in its encoded stream, the names are part of the stream; the // node holding the stream keeps its own (BaseNode.nameEditable says the same). - if (this._encodedReadOnly && !this._encoded) { + const holder = encodedHolderOf(this); + if (holder && holder !== this) { return false; } if (this.parent && this.parent instanceof MatlabVariableNode) { @@ -620,7 +628,9 @@ export default class MatlabVariableNode extends DataNode { if (this.parent?.isObjectPropertyBag) { return false; } - return true; + // Nor a name its source would not write: a MAT-file's variable stored after its subsystem + // (BaseNode.sourceEditRefusal). + return !sourceEditRefusal(this, 'Name'); } get valueEditable(): boolean { @@ -1271,6 +1281,12 @@ export default class MatlabVariableNode extends DataNode { if (holderRefusal) { return holderRefusal; } + // And the file it is in may have no way to write what the text makes: a MAT-file holds no + // string this package writes (_refuseUnwritableValue). + const unwritableRefusal = this._refuseUnwritableValue(parsed, stringValue); + if (unwritableRefusal) { + return unwritableRefusal; + } this._applyParsed(parsed); this._markModified(); // _applyParsed rebuilds this node's children from the text, so restating a @@ -1361,6 +1377,35 @@ export default class MatlabVariableNode extends DataNode { }; } + /** + * The refusal of `parsed`, typed in as this node's value, by a source that could not write + * what it makes of it, or null. A MAT-file's save writes no string, and writes a variable + * holding one only as it was read (MatNode._valueRefusal, MatFileWriter.freshRefusal), so a + * `"abc"` typed in, or a `{1, "abc"}`, would make a variable no save could write: it is refused + * here, before the edit, which a source that writes it (a dictionary) never asks. + * + * Judged of a node made of the text alone (_applyParsed, as the edit applies it), so that a + * refused edit leaves this one, its entry and its file as they were. + */ + _refuseUnwritableValue(parsed: ParsedValue, stringValue: string): SetPropertyResult | null { + let entry: BaseNode = this; + let source: BaseNode | null = this.parent; + while (source && !(source as unknown as { isContainer?: boolean }).isContainer) { + entry = source; + source = source.parent; + } + const refuse = (source as unknown as { _valueRefusal?: (entry: BaseNode, node: BaseNode, value: BaseNode) => string | null } | null) + ?._valueRefusal; + if (typeof refuse !== 'function') { + return null; + } + const value = new MatlabVariableNode(this.name, null, {}); + value._scalarType = this._scalarType; + value._applyParsed(parsed); + const refused = refuse.call(source, entry, this, value); + return refused ? { error: true, reason: refused, invalidValue: stringValue, validValue: this.displayValue } : null; + } + /** * The refusal of a Value edit by the value this one is part of, or null. Asked of the nearest * node above this one that is not a struct, so that a field of a struct, at any depth and in @@ -1607,7 +1652,7 @@ export default class MatlabVariableNode extends DataNode { // every MatlabVariableNode above it, because the save path reads `_var` from the // TOP-LEVEL variable: a struct field's edit has to make the STRUCT's snapshot // stale, not just the field's own. See the _var getter for why. - _markModified(): void { + _markModified(edit: 'value' | 'name' = 'value'): void { let node: BaseNode | null = this; while (node instanceof MatlabVariableNode) { node._varStale = true; @@ -1619,7 +1664,7 @@ export default class MatlabVariableNode extends DataNode { } node = node.parent; } - super._markModified(); + super._markModified(edit); } // Push an edited element's new value into this container's _elements slot. @@ -1652,6 +1697,8 @@ export default class MatlabVariableNode extends DataNode { this._matVar = null; // A value typed in whole is built with all its rows, whatever the file's node ceiling did. delete this._cutByCeiling; + // Nor is it the empty struct array it may have been (_emptyStructFields). + delete this._emptyStructFields; this._rawInput = undefined; // Nor is it what a removal left of a complex array any more (_complexClass). this._collapsedClass = null; @@ -1918,9 +1965,11 @@ export default class MatlabVariableNode extends DataNode { return false; } // Nor where what holds the value refuses the one Add would leave: in a Simulink.Parameter's - // Value, MATLAB's rules for it (DataNode._structuralRefusal, the ruling A2). + // Value, MATLAB's rules for it (DataNode._structuralRefusal, the ruling A2). Nor where the + // file it is in would not write the row as it shows: a MAT-file's struct array + // (BaseNode.sourceEditRefusal, MatNode._editRefusal). if (this._kind === 'scalar' && this._scalarType === 'struct') { - return !this._structuralRefusal('add'); + return !this._structuralRefusal('add') && !sourceEditRefusal(this, 'Add'); } if (this._kind === 'scalar') { return false; @@ -1981,7 +2030,8 @@ export default class MatlabVariableNode extends DataNode { } _addStructField(): MatlabVariableNode { - const uniqueName = newFieldName(this.children.map((c) => c.name)); + // Nor the name of a field a struct array of no element has without a row (_emptyStructFields). + const uniqueName = newFieldName([...(this._emptyStructFields ?? []), ...this.children.map((c) => c.name)]); const child = MatlabVariableNode._createScalar(0, 'double', uniqueName, this); this.addChild(child); this._markModified(); @@ -2375,6 +2425,12 @@ export default class MatlabVariableNode extends DataNode { // (_matStream), naming the entry and the reason, rather than written in the rank-2 form // below, which is not a form MATLAB writes there for it. Elsewhere it falls through as // before: a binary dictionary's XML spells it element by element. + // + // A complex array of no element too (_isComplexValue), whose stream says complex where + // `[]` cannot: MATLAB's own text dictionary spells one as the real empty, `[]` or + // `{"_type": "int16", "_value": "[]"}` (dispcat_text.sldd's dx_complex_0x0 and + // dx_complex_int16_1x0), so that a copy of one into it, or through it into a binary + // dictionary, whose spelling `IsComplex="1"` does say so (_serializeArrayXml), lost it. const nd = effectiveDims(this._dims).length > 2; if (this._sparse || nd || this._isComplexValue() || this._unexpandedStruct()) { const cdata = this._serializeCdata(nd && this._ownerFormat() === 'json'); @@ -2424,6 +2480,14 @@ export default class MatlabVariableNode extends DataNode { return false; } const elems = this._liveElements(); + // An array of no element has none to say so, and is complex when it was read as one + // (_elementType): a .mat's complex(zeros(1,0)), a binary dictionary's IsComplex="1". Asked + // of its elements, it was real, and once anything marked it edited it was written so + // (_buildVarObject): measured against MATLAB R2027a, a .mat save of complex(zeros(0,0)) + // loaded with isreal true. + if (elems.length === 0) { + return this._elementType === 'complex'; + } // ANY element, not the first: the element editor takes only a real number, so after // x(1) = 7 the first element is the number 7 and the rest are still complex, and // asking the first alone wrote [7+0i NaN+0i 3-4i] out as the real [7 0 3]. @@ -2888,6 +2952,16 @@ export default class MatlabVariableNode extends DataNode { // unchanged. _serializeStructValue(): unknown { const dims = effectiveDims(this._dims); + // A struct array of no element, with fields (_emptyStructFields): the bag the binary reader + // makes of MATLAB's own spelling of one, `

` + // (BinarySlddParser.structValue), with no element and its names in `_fields`, which is where + // StructNode writes them back from, as those ``s. Built of its rows like any other, it + // named no field: a copy of a .mat's struct('a', {}) went into a binary dictionary as a + // struct of none. + const named = elementCount(dims) === 0 && this.children.length === 0 ? this._emptyStructFields ?? [] : []; + if (named.length > 0) { + return { _array_type: 'Struct', _dimensions: dims, _elements: [], _fields: named.slice(), _mw_element_type: 'MATLABArray' }; + } // A .mat struct ARRAY hangs its ELEMENTS off this node (named 1..N, each a // struct-kind node whose own children are the fields); a 1x1 hangs the fields // directly. StructNode owns neither case on the .mat path, so both are here — @@ -3200,8 +3274,12 @@ export default class MatlabVariableNode extends DataNode { if (type === 'string' && (this._rawInput as Record | undefined)?._emptyDims && two.length === 2 && elementCount(two) === 0) { return DataNode._stringXml(tagName, attrStr, [], two, indent); } + // A complex empty says so, as MATLAB's own does: `Class="double" IsComplex="1" + // Dimension="0*0"/>` and `Class="int16" IsComplex="1" Dimension="1*0"/>` (dispcat_bin.sldd). + // Without it, it was read back real. + const complex = !this._sparse && this._isComplexValue() ? ' IsComplex="1"' : ''; return ( - p + '<' + tagName + attrStr + ' Class="' + escapeXml(type || 'double') + '" Dimension="' + dimAttr + '"/>' + p + '<' + tagName + attrStr + ' Class="' + escapeXml(type || 'double') + '"' + complex + ' Dimension="' + dimAttr + '"/>' ); } @@ -3545,6 +3623,14 @@ export default class MatlabVariableNode extends DataNode { })); } } else { + // An array of no element is its field names, each with no element, as MatParser reads + // one (_emptyStructFields): rebuilt from its rows, of which it has none, it was a + // struct of no field. + if (elementCount(this._dims) === 0) { + for (const fname of this._emptyStructFields ?? []) { + setOwn(fields, fname, []); + } + } for (const child of this.children) { setOwn(fields, child.name, MatlabVariableNode._memberVar(child)); } @@ -3977,6 +4063,12 @@ export default class MatlabVariableNode extends DataNode { } const fieldNames = Object.keys(variable.fields); const count = elementCount(node._dims); + // A struct array of no element has no row, and its field names nowhere but here + // (_emptyStructFields). + if (count === 0) { + node._emptyStructFields = fieldNames; + return node; + } if (count <= 1) { // Its fields are its rows, all of them or none past a .mat file's node ceiling // (matNodeCeiling). diff --git a/src/datamodel/parser/MatFileCheck.ts b/src/datamodel/parser/MatFileCheck.ts new file mode 100644 index 00000000..ea807906 --- /dev/null +++ b/src/datamodel/parser/MatFileCheck.ts @@ -0,0 +1,1516 @@ +// src/datamodel/parser/MatFileCheck.ts +// Copyright 2026 The MathWorks, Inc. +// +// Whether MATLAB loads a Level-5 MAT-file, judged by the rules MATLAB loads one by, and not by +// this package's own reader. +// +// WHY A SECOND READER. `parseMat` is built to open whatever it can, which is right for a +// viewer and wrong for a judge. It clamps every declared length to the bytes present, takes a +// zero tag for the end of the variables, reads char data stored as miUTF32 or miUINT8, and +// lists a variable stored after the subsystem. MATLAB does none of that. Of the 36 files in the +// MATLAB-verdict corpus (test/fixtures/mat-check) that MATLAB does not load as stored, because +// the load fails or a variable comes back missing or changed, `parseMat` opens all 36, and 32 +// of them without a single warning (measured when this was written). So a `.mat` this package +// writes and then reads back proves only that the package agrees with itself. This module is +// the other judge: it reads no value, and it lists every place a file breaks a rule MATLAB +// applies at `load`, as a MatViolation. It shares no reading code with MatParser, so none of +// the reader's repairs can leak into a verdict. +// +// THE RULES. Each was measured against MATLAB R2027a (27.1 prerelease, maca64) with `S = +// load(f)` on copies of MATLAB-written files edited one byte range at a time +// (test/fixtures/mat-check/verdicts.json holds the files and MATLAB's verdict on each): +// +// * the header: bytes 124-125 are the version 0x0100 and 126-127 the endian mark 'IM' (0x0000 +// and 0x0200 fail, and 0x0200 makes MATLAB try HDF5); neither 16-bit half of bytes 0-3 is +// zero (a header of NULs fails: MATLAB takes the file for Level 4); +// * the records tile the file from byte 128 to its last byte. A plain record is its tag and +// its declared bytes, a multiple of 8 (one cut short, or missing its final pad, fails); a +// compressed one is its tag and exactly its zlib stream, with no padding after it (zero +// padding to 8 fails), and nothing follows the last record (3, 8 or 100 zero bytes fail); +// * a record is an miMATRIX, or an miCOMPRESSED whose RFC 1950 zlib stream inflates to one +// miMATRIX and nothing else (zlib levels 0, 1, 6 and 9 all load); +// * header bytes 116-123 are the offset of the subsystem's record (the objects' data), or 0 +// when there is none. MATLAB trusts the offset and never looks for the record: a stale, +// zeroed or space-filled one fails the whole load; +// * the subsystem is the last record and the only unnamed one. MATLAB stops listing variables +// at the first unnamed record, so a variable after it is silently missing from the load +// (the load succeeds, and `whos -file` still lists it); +// * a variable's name is a MATLAB identifier in valid UTF-8: '1abc' and 'café' fail `S = +// load(f)`, 'end' loads as 'end_', and a name that is not UTF-8 crashed MATLAB; +// * char data is miUTF8 holding as many UTF-16 units as the array's elements, or miUTF16, or +// miUINT16 below U+0100: miUTF32, miUINT8 and miINT8 fail, a surrogate in miUINT16 fails, +// and CJK in miUINT16 loads keeping only the low byte of each unit, with no warning; +// * every element is readable: one bad variable fails the whole-file load. +// +// Some rules were not probed, deliberately: what MATLAB writes is plain, and a file that breaks +// it is one no MATLAB was seen to write. Only a double is ever stored in a narrower type than +// its class (every other numeric class is stored in its own), every sub-element fills its +// matrix exactly, and every data sub-element holds as many elements as its dimensions say. +// They are checked as MATLAB writes them (`int-storage`, `nbytes`, `data-size`, `element`). +// +// WHERE IT IS STRICTER THAN MATLAB, on purpose, so the save path never writes a file that +// loads only by luck. Each is listed with its reason in test/matFileCheck.test.ts: a name +// stored twice (it loads, but `load f` keeps the last copy and `load f x` the first); bytes +// after the subsystem's record, which MATLAB's load never reads; a zlib stream whose Adler-32 +// trailer is not the record's last four bytes. +// +// WHAT IT IS FOR. The `.mat` save checks the file it writes, and refuses to return it if it has +// a violation the original did not. A violation is therefore said with the variable it is in, +// when that has a readable name, so two files can be compared by variable rather than by an +// offset an edit moved (violationsAdded). And since what a record breaks is a function of its +// own bytes, the save asks it only where it changed the file, with the same answer +// (violationsAddedBySplice). +// +// BOUNDED. A file's bytes say how much work reading them is, and a hostile one can say a lot: +// a few kilobytes of zlib inflate to gigabytes, and a cell can declare a billion elements. So +// the check spends a budget of inflated bytes and of matrices walked (MatCheckOptions), and +// stops when either runs out, with a `budget` note saying where. It never throws: whatever the +// bytes, the answer is a list. + +import { InflateCeilingError, inflateZlib, MAT_RECORD_INFLATE_CEILING } from './Inflate.js'; +import { MAX_NESTING } from './MatParser.js'; +import { reasonOf } from './ParseWarning.js'; + +/** + * What a MatViolation is about. Each is one rule MATLAB applies at `load`: + * + * - `short-file`: fewer than the 128 bytes of a header; + * - `not-level5`: the version (bytes 124-125) or the endian mark (126-127) is not a Level-5 + * file's, or the two disagree; + * - `level4-lookalike`: a 16-bit half of bytes 0-3 is zero, so MATLAB reads the file as Level 4; + * - `big-endian`: an 'MI' file, noted and not checked further (this package does not read one); + * - `framing`: the records do not tile the file from byte 128 to its end: one is cut short, one + * is not a whole number of 8-byte words, or bytes follow or pad them; + * - `top-level-type`: a record that is neither miMATRIX nor miCOMPRESSED; + * - `empty-matrix`: a record holding an miMATRIX of 0 bytes; + * - `compressed-wrapper`: a compressed record that is not one zlib stream of one miMATRIX; + * - `subsystem-offset`: header bytes 116-123 do not point at the subsystem's record, or are 0 + * with a subsystem in the file; + * - `subsystem-not-last`: a record after the subsystem, which MATLAB silently leaves out; + * - `anonymous-record`: an unnamed record that is not the subsystem, where MATLAB stops listing; + * - `name`: a variable name that is not valid UTF-8, not an identifier, or a keyword (an empty + * one is an `anonymous-record`); + * - `duplicate-name`: two records of one name; + * - `char-type`: char data in a type MATLAB does not read as text, or reads wrong; + * - `utf8-count`: miUTF8 char data whose UTF-16 length is not the array's element count; + * - `nbytes`: a matrix its sub-elements do not fill exactly; + * - `int-storage`: a numeric array of a class other than double, stored in a type other than + * its class's own; + * - `element`: a sub-element MATLAB cannot read where it stands: array flags, dimensions or a + * name of the wrong type, an unknown class or data type, a small tag of more than 4 bytes, a + * container member that is not a matrix; + * - `data-size`: a data sub-element holding more or fewer elements than the dimensions say; + * - `budget`: the check stopped here, and nothing from here on was checked. + */ +export type MatViolationCode = + | 'short-file' + | 'not-level5' + | 'level4-lookalike' + | 'big-endian' + | 'framing' + | 'top-level-type' + | 'empty-matrix' + | 'compressed-wrapper' + | 'subsystem-offset' + | 'subsystem-not-last' + | 'anonymous-record' + | 'name' + | 'duplicate-name' + | 'char-type' + | 'utf8-count' + | 'nbytes' + | 'int-storage' + | 'element' + | 'data-size' + | 'budget'; + +/** One rule a MAT-file breaks, and where. */ +export interface MatViolation { + code: MatViolationCode; + /** + * The byte of the file it is at. Inside a compressed record that is the record's own tag, + * since the bytes at fault exist only inflated; the message gives their place in the + * inflated payload. For a header field (`subsystem-offset`) it is the field. + */ + at: number; + /** What is wrong, and what MATLAB does with it, in a sentence a user can be shown. */ + message: string; + /** The variable it is in, when its record has a name that could be read. */ + variable?: string; +} + +/** How much one check may spend. Past either budget it stops with a `budget` note. */ +export interface MatCheckOptions { + /** Matrices walked, top-level and nested together. Defaults to MAT_CHECK_ELEMENT_BUDGET. */ + maxElements?: number; + /** Bytes inflated from compressed records, over the whole file. Defaults to MAT_CHECK_INFLATE_BUDGET. */ + maxInflatedBytes?: number; +} + +/** + * How many matrices one check walks, at most: 2^24. A matrix costs the check a few tag reads, + * and 2^24 of them is a struct array of 1.6 million elements and ten fields each. + */ +export const MAT_CHECK_ELEMENT_BUDGET = 2 ** 24; + +/** + * How many bytes one check inflates, at most, over every compressed record of the file: 1 GiB. + * The check inflates one record at a time and drops it, so this bounds time more than memory; + * the largest record in the corpus `parseMat` is measured against inflates to 114 MB. + */ +export const MAT_CHECK_INFLATE_BUDGET = 2 ** 30; + +const MI_INT8 = 1; +const MI_UINT8 = 2; +const MI_INT16 = 3; +const MI_UINT16 = 4; +const MI_INT32 = 5; +const MI_UINT32 = 6; +const MI_SINGLE = 7; +const MI_DOUBLE = 9; +const MI_INT64 = 12; +const MI_UINT64 = 13; +const MI_MATRIX = 14; +const MI_COMPRESSED = 15; +const MI_UTF8 = 16; +const MI_UTF16 = 17; + +const TYPE_NAMES: Record = { + [MI_INT8]: 'miINT8', [MI_UINT8]: 'miUINT8', [MI_INT16]: 'miINT16', [MI_UINT16]: 'miUINT16', + [MI_INT32]: 'miINT32', [MI_UINT32]: 'miUINT32', [MI_SINGLE]: 'miSINGLE', [MI_DOUBLE]: 'miDOUBLE', + [MI_INT64]: 'miINT64', [MI_UINT64]: 'miUINT64', [MI_MATRIX]: 'miMATRIX', [MI_COMPRESSED]: 'miCOMPRESSED', + [MI_UTF8]: 'miUTF8', [MI_UTF16]: 'miUTF16', 18: 'miUTF32', +}; + +/** The bytes one element of each numeric data type takes. */ +const WIDTH: Record = { + [MI_INT8]: 1, [MI_UINT8]: 1, [MI_INT16]: 2, [MI_UINT16]: 2, [MI_INT32]: 4, [MI_UINT32]: 4, + [MI_SINGLE]: 4, [MI_DOUBLE]: 8, [MI_INT64]: 8, [MI_UINT64]: 8, +}; + +const MX_CELL = 1; +const MX_STRUCT = 2; +const MX_OBJECT = 3; +const MX_CHAR = 4; +const MX_SPARSE = 5; +const MX_DOUBLE = 6; +const MX_SINGLE = 7; +const MX_UINT8 = 9; +const MX_FUNCTION = 16; +const MX_OPAQUE = 17; + +const CLASS_NAMES: Record = { + 1: 'cell', 2: 'struct', 3: 'object', 4: 'char', 5: 'sparse', 6: 'double', 7: 'single', + 8: 'int8', 9: 'uint8', 10: 'int16', 11: 'uint16', 12: 'int32', 13: 'uint32', 14: 'int64', + 15: 'uint64', 16: 'function_handle', 17: 'opaque', +}; + +/** The one data type each numeric class but double is stored in. */ +const OWN_TYPE: Record = { + 7: MI_SINGLE, 8: MI_INT8, 9: MI_UINT8, 10: MI_INT16, 11: MI_UINT16, 12: MI_INT32, + 13: MI_UINT32, 14: MI_INT64, 15: MI_UINT64, +}; + +// The array flags' bits above the class byte. +const LOGICAL_BIT = 0x200; +const COMPLEX_BIT = 0x800; +const SPARSE_BIT = 0x1000; + +// MATLAB's keywords (iskeyword), which a variable name may not be: the same list +// datamodel/matlabName.ts holds, restated because this folder imports nothing from there. +const KEYWORDS = new Set([ + 'break', 'case', 'catch', 'classdef', 'continue', 'else', 'elseif', 'end', 'for', 'function', + 'global', 'if', 'otherwise', 'parfor', 'persistent', 'return', 'spmd', 'switch', 'try', 'while', +]); + +const IDENTIFIER = /^[A-Za-z][A-Za-z0-9_]*$/; + +// Fatal, so bytes that are not UTF-8 are said to be, and keeping a BOM, so a name or a text +// that opens with one is not read as one without it. +const strictUtf8 = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }); +const looseUtf8 = new TextDecoder('utf-8', { ignoreBOM: true }); + +// The MAT stream a subsystem's uint8 data opens with: the version 0x0100 and 'IM'. +const STREAM_MAGIC = [0x00, 0x01, 0x49, 0x4d]; + +/** Thrown inside a check when a budget runs out, and turned into its `budget` note. */ +class OutOfBudget extends Error { + constructor(readonly at: number, message: string) { + super(message); + this.name = 'OutOfBudget'; + } +} + +/** + * The bytes a matrix is read out of: a plain record's own (recordSpace), or a compressed + * record's payload, inflated. `fileAt` is the file offset a violation at `o` is reported at, + * and `where` says where `o` is, in words. + */ +interface Space { + view: DataView; + fileAt(o: number): number; + where(o: number): string; +} + +/** One top-level record's bytes, from its tag, as the record at byte `at` of its file. */ +function recordSpace(view: DataView, at: number): Space { + return { view, fileAt: (o) => at + o, where: (o) => `Byte ${at + o}` }; +} + +function payloadSpace(view: DataView, record: number): Space { + return { + view, + fileAt: () => record, + where: (o) => `Byte ${o} of the compressed record at byte ${record}, inflated,`, + }; +} + +/** What the placement rules need of one top-level record. */ +interface RecordInfo { + at: number; + /** Its variable's name; '' for an unnamed one, null when the name could not be read. */ + name: string | null; + /** It is unnamed and holds subsystem data: uint8 bytes that open as a MAT stream. */ + subsystem: boolean; +} + +/** A sub-element's tag, in either of the format's two spellings. */ +interface Tag { + type: number; + /** The payload bytes it declares. */ + n: number; + /** Where its payload starts. */ + data: number; + /** Where the next sub-element starts: past the payload and its pad to 8 bytes. */ + next: number; +} + +/** What `readHeader` reads of a matrix: everything before its class's own sub-elements. */ +interface MatrixHead { + cls: number; + flags: number; + dims: number[]; + numel: number; + name: Uint8Array; + /** Where the class's own sub-elements start. */ + p: number; +} + +class Check { + readonly out: MatViolation[] = []; + readonly maxElements: number; + readonly maxInflated: number; + elementsLeft: number; + inflateLeft: number; + /** The record being checked, for a `budget` note on a throw nobody expected. */ + cursor = 128; + /** The variable whose record is being checked, once its name is read. */ + variable: string | undefined; + /** Whether the walk is inside the subsystem's stream, which belongs to no variable. */ + inSubsystem = false; + /** + * Whether only what the placement rules need of a record is read (its name, and whether it + * holds the subsystem), and nothing past it: what a record kept as its own bytes is asked + * in a splice (violationsAddedBySplice), whose violations are the file's as read already. + */ + headOnly = false; + + constructor(options: MatCheckOptions) { + this.maxElements = options.maxElements ?? MAT_CHECK_ELEMENT_BUDGET; + this.maxInflated = options.maxInflatedBytes ?? MAT_CHECK_INFLATE_BUDGET; + this.elementsLeft = this.maxElements; + this.inflateLeft = this.maxInflated; + } + + /** A violation of the file as a whole, or of one record seen from outside it. */ + file(code: MatViolationCode, at: number, message: string, variable?: string): void { + const v: MatViolation = { code, at, message }; + if (variable) v.variable = variable; + this.out.push(v); + } + + /** A violation inside a matrix, said with where it is and whose it is. */ + report(code: MatViolationCode, space: Space, o: number, text: string): void { + const whose = this.inSubsystem + ? ' (in the subsystem, the data of the objects in the file)' + : this.variable ? ` (in "${this.variable}")` : ''; + const v: MatViolation = { code, at: space.fileAt(o), message: `${space.where(o)}${whose}: ${text}.` }; + if (this.variable && !this.inSubsystem) v.variable = this.variable; + this.out.push(v); + } + + /** One more matrix walked, or the end of the check. */ + spend(space: Space, o: number): void { + if (--this.elementsLeft < 0) { + throw new OutOfBudget(space.fileAt(o), `more than the ${this.maxElements} matrices one check walks`); + } + } +} + +/** + * Check a Level-5 MAT-file against the rules MATLAB loads one by (see the top of this file), + * and list every place it breaks one, in file order. An empty list means MATLAB loads the + * file, every variable in it, as stored. Pure and synchronous, and it never throws: bytes that + * are not a MAT-file at all are a violation too. + */ +export function checkMatFile(bytes: Uint8Array, options: MatCheckOptions = {}): MatViolation[] { + const check = new Check(options); + try { + checkFile(check, bytes); + } catch (err) { + // A budget run out, or, if this module has a defect, any other throw: either way the + // check did not finish, and that is said rather than thrown, at the record it was in. + check.file('budget', ...stoppedAt(err, check.cursor)); + } + // Stable, so the violations of one place keep the order they were found in. + return check.out.sort((a, b) => a.at - b.at); +} + +/** + * What one variable's miMATRIX element (its tag and body, as a record holds it inflated) breaks + * of the rules MATLAB reads a matrix by, at any depth: its char data, its storage, how its + * sub-elements fill it, its name. Not the rules of a file (its header, framing, compression, + * placement), which only a whole file has: those are checkMatFile's. Every `at` is 0, the + * element's own start, and each message says where in the element. Asked of a variable as it was + * read, whose element is in memory already, so nothing is inflated; and like checkMatFile it never + * throws, and stops at its budget with a `budget` note. + */ +export function checkMatElement(element: Uint8Array, options: MatCheckOptions = {}): MatViolation[] { + const check = new Check(options); + const view = new DataView(element.buffer, element.byteOffset, element.byteLength); + const space: Space = { view, fileAt: () => 0, where: (o) => `Byte ${o} of its element` }; + try { + if (element.byteLength < 8) { + check.file('element', 0, `The element holds ${element.byteLength} byte(s), fewer than one element's tag.`); + } else if (view.getUint32(0, true) !== MI_MATRIX) { + check.file('element', 0, `The element is a data element of ${typeName(view.getUint32(0, true))}, not a matrix.`); + } else { + topMatrix(check, space, 0, 8, Math.min(8 + view.getUint32(4, true), element.byteLength)); + } + } catch (err) { + const why = err instanceof OutOfBudget ? err.message : `an error in the check itself (${reasonOf(err)})`; + check.file('budget', 0, `The check of the element stopped at ${why}, so nothing from there on was checked.`, check.variable); + } + return check.out; +} + +/** + * The violations of `after` that `before` does not have: what a rewrite of a file added to it. + * + * Matched by code and variable, never by offset or message, which an edit anywhere before a + * record moves; and counted, so a third violation of one kind in one variable is added where + * the original had two. `renamed` maps a variable's name in `after` to its name in `before`. + * A `budget` note in `after` is always added: a check that did not finish proves nothing about + * what it did not reach, whatever the original's check reached. + */ +export function violationsAdded( + before: readonly MatViolation[], + after: readonly MatViolation[], + renamed: ReadonlyMap = new Map(), +): MatViolation[] { + const key = (code: MatViolationCode, variable: string | undefined) => `${code}\u0000${variable ?? ''}`; + const held = new Map(); + for (const v of before) { + const k = key(v.code, v.variable); + held.set(k, (held.get(k) ?? 0) + 1); + } + const added: MatViolation[] = []; + for (const v of after) { + const k = key(v.code, v.variable === undefined ? undefined : renamed.get(v.variable) ?? v.variable); + const left = held.get(k) ?? 0; + if (v.code === 'budget' || left === 0) { + added.push(v); + } else { + held.set(k, left - 1); + } + } + return added; +} + +/** A record of a file as read, for violationsAddedBySplice: its bytes, from its tag. */ +export interface MatReadRecord { + bytes: Uint8Array; + /** + * Its payload as `inflateZlib` inflated it, for a compressed record whose inflate the caller + * holds already (MatParser keeps it, MatVariable._rawBytes), so that it is not inflated again. + */ + inflated?: Uint8Array | null; +} + +/** + * A record of a file written from another (violationsAddedBySplice): a record of that file kept + * as its own bytes (`kept`, its index), or bytes written in place of one of its records + * (`replaces`, its index: a variable renamed or written fresh, and the subsystem, when a save + * writes it anew) or of none (`replaces` null: a variable added). + */ +export type MatSplicedRecord = { kept: number } | { written: Uint8Array; replaces: number | null }; + +/** A Level-5 file as its 128-byte header and its records, back to back from byte 128. */ +export interface MatFileOfRecords { + header: Uint8Array; + records: readonly R[]; +} + +/** + * What `written` adds to `read` by the rules MATLAB loads a file by, as + * `violationsAdded(checkMatFile(read), checkMatFile(written), renamed)` says it, where `written` + * is `read` with some of its records kept as their own bytes, the others deleted or written anew, + * and records added: worked out from what changed, rather than by checking both files whole. + * + * WHY IT IS THE SAME ANSWER. What a record breaks depends on its bytes alone (checkRecord, which + * checkMatFile walks every record with: `at` only places what is said). So a record kept as its + * own bytes breaks in `written` what it broke in `read`, under the same variable, and the two + * cancel, by rule and variable, as violationsAdded counts them. What is left to compare is the + * records written, the records they replace, the header, and the rules of where records stand + * (checkPlacement), which are asked of both files whole, from each record's name and whether it + * holds the subsystem: of a kept record, read without walking the rest of it (Check.headOnly). + * That holds where three things do, and where one does not both files are checked whole: + * + * - both files walk as their records are given: every record's tag declares exactly the bytes + * it is given, and opens with a nonzero byte, which the tag of a type that is a multiple of + * 256 does not, and which the walk then takes for padding; + * - no record of `read` is kept twice, or kept and replaced; + * - no kept record holds a name `renamed` maps, which violationsAdded would compare its + * violations under the other name of. + * + * A record deleted is one more in `read` than in `written`, which can only take from what is + * added: it is checked only when something is. + * + * THE BUDGET (MatCheckOptions) is spent on what is checked, the records written and the ones + * they replace, and not on the records kept, which are not walked: so a file past it is still + * checked where it changed, where checkMatFile of it would stop. A `budget` note on the written + * side is added, as violationsAdded adds every one; one on the read side only leaves less for a + * written record's violations to be matched with. A kept record whose name cannot be read within + * the budget is a `budget` note on the written side: where it stands cannot be judged. + */ +export function violationsAddedBySplice( + read: MatFileOfRecords, + written: MatFileOfRecords, + renamed: ReadonlyMap = new Map(), + options: MatCheckOptions = {}, +): MatViolation[] { + const readBytes = read.records.map((r) => r.bytes); + const writtenBytes = written.records.map((r) => { + if ('kept' in r && !read.records[r.kept]) { + throw new RangeError(`A record kept as record ${r.kept} of a file of ${read.records.length}.`); + } + return 'kept' in r ? read.records[r.kept].bytes : r.written; + }); + const whole = () => violationsAdded( + checkMatFile(joined(read.header, readBytes), options), + checkMatFile(joined(written.header, writtenBytes), options), + renamed, + ); + const taken = new Set(); + for (const r of written.records) { + const from = 'kept' in r ? r.kept : r.replaces; + if (from !== null) { + if (taken.has(from)) { + return whole(); + } + taken.add(from); + } + } + if (read.header.byteLength !== 128 || written.header.byteLength !== 128 || ![...readBytes, ...writtenBytes].every(walksAsGiven)) { + return whole(); + } + const readHeader = headerOf(read.header); + const writtenHeader = headerOf(written.header); + if (readHeader.walked !== writtenHeader.walked) { + return whole(); + } + if (!writtenHeader.walked) { + // checkMatFile reads neither file past its header. + return violationsAdded(readHeader.violations, writtenHeader.violations, renamed); + } + const readAt = offsetsOf(readBytes); + const writtenAt = offsetsOf(writtenBytes); + const heads = read.records.map((r, i) => headOf(r, readAt[i], options)); + for (const r of written.records) { + const head = 'kept' in r ? heads[r.kept] : null; + if (head && !(head instanceof OutOfBudget) && head.name && renamed.has(head.name)) { + return whole(); + } + } + + // The written side: its header, every record written, and where every record stands. + const after = new Check(options); + const writtenInfos: (RecordInfo | null)[] = []; + let walked = true; + try { + written.records.forEach((r, i) => { + if (!('kept' in r)) { + writtenInfos.push(checkRecord(after, r.written, writtenAt[i])); + return; + } + const head = heads[r.kept]; + if (head instanceof OutOfBudget) { + throw new OutOfBudget(writtenAt[i], head.message); + } + writtenInfos.push(head && { ...head, at: writtenAt[i] }); + }); + } catch (err) { + walked = false; + after.file('budget', ...stoppedAt(err, after.cursor)); + } + if (walked) { + checkPlacement(after, writtenInfos.filter((x): x is RecordInfo => x !== null), writtenHeader.offset, endOf(writtenAt, writtenBytes)); + } + const afterAll = [...writtenHeader.violations, ...after.out].sort((a, b) => a.at - b.at); + + // The read side: its header, where every record stood, the records replaced, and the records + // deleted only when what is added so far could be matched with one of theirs. + const before = new Check(options); + const readInfos = heads.map((h, i) => (h instanceof OutOfBudget ? { at: readAt[i], name: null, subsystem: false } : h)); + checkPlacement(before, readInfos.filter((x): x is RecordInfo => x !== null), readHeader.offset, endOf(readAt, readBytes)); + const checkRead = (which: number[]): boolean => { + try { + for (const i of which) { + checkRecord(before, read.records[i].bytes, readAt[i], read.records[i].inflated); + } + return true; + } catch (err) { + before.file('budget', ...stoppedAt(err, before.cursor)); + return false; + } + }; + const replaced = written.records.flatMap((r) => ('kept' in r || r.replaces === null ? [] : [r.replaces])); + const readOn = checkRead(replaced); + let added = violationsAdded([...readHeader.violations, ...before.out], afterAll, renamed); + const deleted = read.records.map((_, i) => i).filter((i) => !taken.has(i)); + if (added.some((v) => v.code !== 'budget') && deleted.length > 0 && readOn) { + checkRead(deleted); + added = violationsAdded([...readHeader.violations, ...before.out], afterAll, renamed); + } + return added; +} + +// Whether the walk of a file (walkRecords) reads `record` as the record it is given as: its tag +// declares exactly its bytes, and it does not open with a zero byte, which the walk reads as +// padding or as the end of the records. +function walksAsGiven(record: Uint8Array): boolean { + return record.byteLength >= 8 && record[0] !== 0 + && 8 + new DataView(record.buffer, record.byteOffset, 8).getUint32(4, true) === record.byteLength; +} + +// What checkMatFile says of a header, whether it reads on past it, and the subsystem's offset it gives. +function headerOf(header: Uint8Array): { violations: MatViolation[]; walked: boolean; offset: number } { + const check = new Check({}); + const walked = checkHeader(check, header); + const offset = subsystemOffset(new DataView(header.buffer, header.byteOffset, header.byteLength), header); + return { violations: check.out, walked, offset }; +} + +// What the placement rules need of the record at byte `at`, read as checkRecord reads it but no +// further (Check.headOnly), or the budget that stopped it. A compressed record whose inflate is +// held is not inflated again, and spends none of the budget. +function headOf(record: MatReadRecord, at: number, options: MatCheckOptions): RecordInfo | null | OutOfBudget { + const check = new Check(options); + check.headOnly = true; + if (record.inflated) { + check.inflateLeft = MAT_RECORD_INFLATE_CEILING; + } + try { + return checkRecord(check, record.bytes, at, record.inflated); + } catch (err) { + return err instanceof OutOfBudget ? err : new OutOfBudget(at, `an error in the check itself (${reasonOf(err)})`); + } +} + +// The place and the words of the `budget` note of a check stopped by `err` in the record at +// `cursor`: a budget run out (OutOfBudget, which says where), or a defect of the check's own. +function stoppedAt(err: unknown, cursor: number): [number, string] { + const at = err instanceof OutOfBudget ? err.at : cursor; + const why = err instanceof OutOfBudget ? err.message : `an error in the check itself (${reasonOf(err)})`; + return [at, `The check stopped at byte ${at}, at ${why}, so nothing from there on was checked.`]; +} + +// Where each of `records` starts, back to back after a 128-byte header. +function offsetsOf(records: readonly Uint8Array[]): number[] { + const out: number[] = []; + let at = 128; + for (const r of records) { + out.push(at); + at += r.byteLength; + } + return out; +} + +function endOf(offsets: readonly number[], records: readonly Uint8Array[]): number { + return offsets.length === 0 ? 128 : offsets[offsets.length - 1] + records[records.length - 1].byteLength; +} + +function joined(header: Uint8Array, records: readonly Uint8Array[]): Uint8Array { + const out = new Uint8Array(header.byteLength + endOf(offsetsOf(records), records) - 128); + out.set(header, 0); + let at = header.byteLength; + for (const r of records) { + out.set(r, at); + at += r.byteLength; + } + return out; +} + +function checkFile(check: Check, bytes: Uint8Array): void { + if (bytes.byteLength < 128) { + check.file('short-file', 0, `The file holds ${bytes.byteLength} bytes, fewer than the 128 of a MAT-file's header.`); + return; + } + if (!checkHeader(check, bytes)) { + return; + } + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + const offset = subsystemOffset(view, bytes); + const records = walkRecords(check, view, bytes, offset); + checkPlacement(check, records, offset, bytes.byteLength); +} + +/** Whether the rest of the file is a Level-5 one to check, having said what the header breaks. */ +function checkHeader(check: Check, bytes: Uint8Array): boolean { + // MATLAB looks at the first four bytes before anything else, and a zero in either 16-bit + // half of them makes it read the file as Level 4: a header text that opens with NULs. + if ((bytes[0] | bytes[1]) === 0 || (bytes[2] | bytes[3]) === 0) { + check.file('level4-lookalike', 0, 'A 16-bit half of the header\'s first four bytes is zero, so MATLAB reads ' + + 'the file as a Level 4 MAT-file and fails the load. The header text must not open with NUL bytes.'); + } + const mark = String.fromCharCode(bytes[126], bytes[127]); + const version = `${hex2(bytes[124])} ${hex2(bytes[125])}`; + if (mark === 'MI' && bytes[124] === 0x01 && bytes[125] === 0x00) { + check.file('big-endian', 126, 'The file is big-endian (\'MI\'). MATLAB reads one, but this package does not, ' + + 'so nothing after the header was checked.'); + return false; + } + if (mark !== 'IM' && mark !== 'MI') { + check.file('not-level5', 126, `Header bytes 126-127 are ${hex2(bytes[126])} ${hex2(bytes[127])}, not the endian mark ` + + '\'IM\' of a Level-5 MAT-file, so MATLAB does not read it as one.'); + return false; + } + if (mark === 'IM' && !(bytes[124] === 0x00 && bytes[125] === 0x01)) { + check.file('not-level5', 124, bytes[124] === 0x00 && bytes[125] === 0x02 + ? 'Header bytes 124-125 are 00 02, the version 0x0200 of a -v7.3 (HDF5) file, which is not a Level-5 MAT-file.' + : `Header bytes 124-125 are ${version}, where a Level-5 MAT-file holds the version 0x0100 (bytes 00 01), ` + + 'so MATLAB fails the load.'); + return false; + } + if (mark === 'MI') { + check.file('not-level5', 124, `Header bytes 124-125 are ${version}, and a big-endian ('MI') file holds the version ` + + '0x0100 as bytes 01 00: the version and the endian mark disagree, so MATLAB fails the load.'); + return false; + } + return true; +} + +function hex2(b: number): string { + return b.toString(16).padStart(2, '0'); +} + +/** Header bytes 116-123: the subsystem's offset, where eight spaces mean 0 as zeros do. */ +function subsystemOffset(view: DataView, bytes: Uint8Array): number { + if (bytes.subarray(116, 124).every((b) => b === 0x20)) { + return 0; + } + return view.getUint32(120, true) * 2 ** 32 + view.getUint32(116, true); +} + +/** + * Every record from byte 128 to the end of the file, each checked, and what the placement + * rules need of each. The walk is MATLAB's: a record is its 8-byte tag and the bytes the tag + * declares, and the next one starts right after them, whatever the alignment. + */ +function walkRecords(check: Check, view: DataView, bytes: Uint8Array, offset: number): RecordInfo[] { + const records: RecordInfo[] = []; + const length = bytes.byteLength; + let at = 128; + while (at < length) { + check.cursor = at; + check.variable = undefined; + if (bytes[at] === 0) { + // No record tag opens with a zero byte (a record's type is 14 or 15), so this is padding, + // or the bytes after the last record, or a tag of type 0. Said once, as what it is. + const zeros = zeroRun(bytes, at); + const last = records[records.length - 1]; + if (at + zeros === length && last !== undefined && last.at === offset && last.subsystem) { + // Measured: MATLAB loads a file with 8 zero bytes after its subsystem, because its + // load stops reading at the subsystem. They are no record all the same, and what + // MATLAB's own `save -append`, which reads past the subsystem, makes of them is not + // known, so they are said as the bytes that do not frame they are. + check.file('framing', at, `The file ends with ${zeros} zero byte(s) after the subsystem's record, which are no ` + + 'record: MATLAB\'s load does not read past the subsystem, but MATLAB writes nothing after it.'); + break; + } + if (at + zeros === length) { + const after = last === undefined ? 'its header' : 'its last record'; + check.file('framing', at, zeros < 8 + ? `The file ends with ${zeros} zero byte(s) after ${after}, fewer than a record's tag: ` + + 'MATLAB fails the load. Nothing may follow the last record.' + : `The file ends with ${zeros} zero bytes after ${after}, which MATLAB reads as a record of type 0, ` + + 'and fails the load. Nothing may follow the last record.'); + break; + } + if (zeros < 8 && at + zeros + 8 <= length && isRecordType(view.getUint32(at + zeros, true))) { + check.file('framing', at, `${zeros} zero byte(s) at byte ${at} pad the record before them: MATLAB reads the ` + + 'next record right where the last one\'s declared bytes end, and a compressed record is never padded, so ' + + 'it fails the load.'); + at += zeros; + continue; + } + const word = at + 4 <= length ? view.getUint32(at, true) : 0; + check.file('framing', at, `The bytes at ${at} are no record's tag (they read as ${typeName(word)}): MATLAB ` + + 'fails the load, and nothing after them was checked.'); + break; + } + if (length - at < 8) { + check.file('framing', at, `The file ends ${length - at} byte(s) into a record's tag: MATLAB fails the load.`); + break; + } + const n = view.getUint32(at + 4, true); + if (at + 8 + n > length) { + check.file('framing', at, `The record at byte ${at} declares ${n} bytes, and the file holds ${length - at - 8} ` + + 'after its tag: it is cut short, and MATLAB fails the load.'); + break; + } + const info = checkRecord(check, bytes.subarray(at, at + 8 + n), at); + if (info) { + records.push(info); + } + at += 8 + n; + } + return records; +} + +/** + * One top-level record, its tag and the bytes it declares, as the record at byte `at` of its + * file: checked, and what the placement rules need of it, or null for a record they do not + * see, one that is no matrix. What it breaks depends on its bytes alone: `at` places what is + * said, and nothing else of the file is read. `inflated` is a compressed record's payload, + * inflated, when the caller holds that already (violationsAddedBySplice). + */ +function checkRecord(check: Check, record: Uint8Array, at: number, inflated?: Uint8Array | null): RecordInfo | null { + check.cursor = at; + check.variable = undefined; + const view = new DataView(record.buffer, record.byteOffset, record.byteLength); + const type = view.getUint32(0, true); + const n = view.getUint32(4, true); + if (type === MI_MATRIX) { + return plainRecord(check, recordSpace(view, at), at, n); + } + if (type === MI_COMPRESSED) { + return compressedRecord(check, record.subarray(8, 8 + n), at, inflated); + } + check.file('top-level-type', at, `The record at byte ${at} is a data element of ${typeName(type)}: a variable is ` + + 'stored as an miMATRIX or an miCOMPRESSED, and MATLAB fails the load on anything else.'); + return null; +} + +function zeroRun(bytes: Uint8Array, at: number): number { + let end = at; + while (end < bytes.byteLength && bytes[end] === 0) end++; + return end - at; +} + +function isRecordType(word: number): boolean { + return word === MI_MATRIX || word === MI_COMPRESSED; +} + +function typeName(type: number): string { + return TYPE_NAMES[type] ?? `type ${type}`; +} + +// A plain record, in a space that holds it from its tag (recordSpace). +function plainRecord(check: Check, space: Space, at: number, n: number): RecordInfo { + if (n === 0) { + check.file('empty-matrix', at, `The record at byte ${at} is an miMATRIX of 0 bytes: MATLAB fails the load. ` + + 'Only a matrix inside another may be empty.'); + return { at, name: null, subsystem: false }; + } + const info = topMatrix(check, space, at, 8, 8 + n); + if (n % 8 !== 0) { + check.file('framing', at, `The record at byte ${at} declares ${n} bytes, not a whole number of 8-byte words: ` + + 'a plain record ends padded to 8 bytes, so this one is missing its final pad, and MATLAB fails the load.', + info.name || undefined); + } + return info; +} + +/** + * A compressed record: one zlib stream (RFC 1950) that inflates to one miMATRIX and nothing + * else, and ends at the record's last byte. Its matrix is then checked in the inflated bytes. + * + * `given`, when there is one, is what `inflateZlib` made of `payload` for the caller already (MatParser + * keeps it, MatVariable._rawBytes), taken for the inflate rather than inflating the payload + * again: the same function of the same bytes, so the same bytes, spent from the budget as an + * inflate of them is. Nothing else of what the caller read is taken. + */ +function compressedRecord(check: Check, payload: Uint8Array, at: number, given?: Uint8Array | null): RecordInfo { + const unread: RecordInfo = { at, name: null, subsystem: false }; + // Said once the record's name is known, if it can be, and ahead of what its matrix breaks. + const faults: string[] = []; + const fault = (text: string): void => { + faults.push(`The compressed record at byte ${at} ${text}.`); + }; + const first = check.out.length; + const done = (info: RecordInfo): RecordInfo => { + const said = faults.map((message) => { + const v: MatViolation = { code: 'compressed-wrapper', at, message }; + if (info.name) v.variable = info.name; + return v; + }); + check.out.splice(first, 0, ...said); + return info; + }; + const head = zlibHeaderFault(payload); + if (head) { + fault(`${head}: MATLAB inflates a record only as a zlib stream, and fails the load`); + return done(unread); + } + const ceiling = Math.min(check.inflateLeft, MAT_RECORD_INFLATE_CEILING); + let inflated: Uint8Array; + try { + if (given && given.byteLength > ceiling) { + throw new InflateCeilingError(ceiling); + } + inflated = given ?? inflateZlib(payload, ceiling); + } catch (err) { + if (err instanceof InflateCeilingError) { + if (ceiling < MAT_RECORD_INFLATE_CEILING) { + throw new OutOfBudget(at, `more than the ${check.maxInflated} bytes one check inflates`); + } + fault(`inflates to more than the ${MAT_RECORD_INFLATE_CEILING} bytes one record of a -v7 file can hold`); + return done(unread); + } + fault(`does not inflate (${reasonOf(err)}): MATLAB fails the load`); + return done(unread); + } + check.inflateLeft -= inflated.byteLength; + // The stream ends with the Adler-32 of what it inflates to, so a record whose last four + // bytes are that checksum ends where its stream does. Anything else is bytes after the + // stream, which MATLAB's record never has, or a checksum that is wrong. Not asked for a + // record's name alone (headOnly), which it does not change. + const trailer = new DataView(payload.buffer, payload.byteOffset + payload.byteLength - 4, 4).getUint32(0, false); + if (!check.headOnly && trailer !== adler32(inflated)) { + fault('does not end with its zlib stream\'s checksum: bytes follow the stream inside the record, or the ' + + 'checksum is wrong. MATLAB writes a record as exactly its stream'); + } + if (inflated.byteLength < 8) { + fault(`inflates to ${inflated.byteLength} byte(s), fewer than one element's tag: MATLAB fails the load`); + return done(unread); + } + const view = new DataView(inflated.buffer, inflated.byteOffset, inflated.byteLength); + const type = view.getUint32(0, true); + const n = view.getUint32(4, true); + if (type === MI_COMPRESSED) { + fault('inflates to another compressed record: MATLAB never nests one, and fails the load'); + return done(unread); + } + if (type !== MI_MATRIX) { + fault(`inflates to a data element of ${typeName(type)}, where a record holds a matrix: MATLAB fails the load`); + return done(unread); + } + if (n === 0) { + check.file('empty-matrix', at, `The compressed record at byte ${at} holds an miMATRIX of 0 bytes: MATLAB fails ` + + 'the load. Only a matrix inside another may be empty.'); + return done(unread); + } + const held = inflated.byteLength - 8; + if (n > held) { + fault(`holds a matrix that declares ${n} bytes, and it inflates to ${held} after the matrix's tag: ` + + 'the matrix is cut short, and MATLAB fails the load'); + } else if (n < held) { + fault(`inflates to ${held - n} byte(s) after its matrix: MATLAB's record holds one matrix and nothing after it`); + } + return done(topMatrix(check, payloadSpace(view, at), at, 8, 8 + Math.min(n, held))); +} + +/** + * Why `payload` is not a zlib stream by its first two bytes, or null when it opens like one: + * compression method 8 (deflate) with a window of at most 32 KiB, a header check that holds, + * and no preset dictionary, which MATLAB does not supply. + */ +function zlibHeaderFault(payload: Uint8Array): string | null { + if (payload.byteLength < 6) { + return `holds ${payload.byteLength} byte(s), fewer than the smallest zlib stream`; + } + const cmf = payload[0]; + const flg = payload[1]; + if (cmf === 0x1f && flg === 0x8b) { + return 'is a gzip stream, not a zlib one'; + } + if ((cmf & 0x0f) !== 8 || cmf >> 4 > 7 || ((cmf << 8) | flg) % 31 !== 0) { + return `does not open with a zlib header (it opens ${hex2(cmf)} ${hex2(flg)}; raw deflate has none)`; + } + if (flg & 0x20) { + return 'is a zlib stream that needs a preset dictionary'; + } + return null; +} + +/** RFC 1950's checksum of `bytes`. */ +function adler32(bytes: Uint8Array): number { + let a = 1; + let b = 0; + const n = bytes.byteLength; + for (let i = 0; i < n;) { + // 5552 bytes is the most the sums take before they must be reduced to stay exact in 32 bits, + // and so certainly within a double. + const stop = Math.min(n, i + 5552); + for (; i < stop; i++) { + a += bytes[i]; + b += a; + } + a %= 65521; + b %= 65521; + } + return (b * 65536 + a) >>> 0; +} + +/** + * The tag of the sub-element at `o`, which has to end by `end`, or null when it does not, or + * when its small form declares more than the 4 bytes it can hold. Both are said here, so a + * caller that gets null stops reading the matrix and adds nothing. + */ +function readTag(check: Check, space: Space, o: number, end: number, what: string): Tag | null { + if (o + 8 > end) { + check.report('nbytes', space, o, `the matrix ends ${end - o} byte(s) into the tag of its ${what}, so its ` + + 'sub-elements do not fill it: MATLAB fails the load'); + return null; + } + const word = space.view.getUint32(o, true); + const small = word >>> 16; + if (small !== 0) { + // The small form: the count in the upper half of the first word, the data in the second. + if (small > 4) { + check.report('element', space, o, `the ${what} has a small tag declaring ${small} bytes, more than the 4 ` + + 'it holds: MATLAB fails the load'); + return null; + } + return { type: word & 0xffff, n: small, data: o + 4, next: o + 8 }; + } + const n = space.view.getUint32(o + 4, true); + // A matrix inside another is its tag and its declared bytes; a primitive is padded to 8. + const next = o + 8 + (word === MI_MATRIX ? n : align8(n)); + if (next > end) { + const size = word === MI_MATRIX || n % 8 === 0 ? `${n} bytes` : `${n} bytes, ${align8(n)} with its pad,`; + check.report('nbytes', space, o, `the ${what} declares ${size} and the matrix holding it has ` + + `${Math.max(0, end - o - 8)} left after its tag: MATLAB fails the load`); + return null; + } + return { type: word, n, data: o + 8, next }; +} + +function align8(n: number): number { + return n + ((8 - (n % 8)) % 8); +} + +/** A top-level record's matrix: checked, and what the placement rules need of it. */ +function topMatrix(check: Check, space: Space, at: number, start: number, end: number): RecordInfo { + const info: RecordInfo = { at, name: null, subsystem: false }; + check.spend(space, start); + const head = readHeader(check, space, start, end); + if (!head) { + return info; + } + info.name = recordName(check, at, head.name); + const stream = info.name === '' ? subsystemStream(space, head, end) : null; + info.subsystem = stream !== null; + if (check.headOnly) { + return info; + } + const p = classBody(check, space, head, end, 0); + if (p !== null) { + fillsExactly(check, space, p, end); + } + if (stream !== null) { + checkSubsystem(check, space, stream.start, stream.end); + } + return info; +} + +/** + * A variable's name, having said what is wrong with it: '' for none, and for bytes that are + * not UTF-8 the name as far as it reads, so the violation can still say whose it is. + */ +function recordName(check: Check, at: number, bytes: Uint8Array): string { + if (bytes.byteLength === 0) { + return ''; + } + let name: string; + try { + name = strictUtf8.decode(bytes); + } catch { + name = looseUtf8.decode(bytes); + check.variable = name; + check.file('name', at, `The variable name at byte ${at} is not valid UTF-8 (bytes ${Array.from(bytes, hex2).join(' ')}): ` + + 'MATLAB crashes reading it, in `load` and in `whos -file` alike.', name); + return name; + } + check.variable = name; + if (!IDENTIFIER.test(name)) { + check.file('name', at, `The variable name "${name}" at byte ${at} is not a MATLAB identifier (a letter, then ` + + 'letters, digits and underscores): `S = load(f)` fails on it, and `load(f)` leaves it out.', name); + } else if (KEYWORDS.has(name)) { + check.file('name', at, `The variable name "${name}" at byte ${at} is a MATLAB keyword: MATLAB loads it as ` + + `"${name}_", with a warning.`, name); + } + return name; +} + +/** + * Everything before a matrix's class's own sub-elements: the array flags, the dimensions + * (which an opaque has none of), the name. Null, having said why, when they are not there to + * read as MATLAB reads them. + */ +function readHeader(check: Check, space: Space, start: number, end: number): MatrixHead | null { + const view = space.view; + const flagsTag = readTag(check, space, start, end, 'array flags'); + if (!flagsTag) { + return null; + } + if (flagsTag.type !== MI_UINT32 || flagsTag.n !== 8) { + check.report('element', space, start, `the matrix's array flags are ${flagsTag.n} byte(s) of ${typeName(flagsTag.type)}, ` + + 'where MATLAB writes and reads two miUINT32 words: it fails the load'); + return null; + } + const flags = view.getUint32(flagsTag.data, true); + const cls = flags & 0xff; + if (cls < MX_CELL || cls > MX_OPAQUE) { + check.report('element', space, start, `the matrix's array class is ${cls}, which is no class MATLAB reads: ` + + 'it fails the load'); + return null; + } + let p = flagsTag.next; + const dims: number[] = []; + let numel = 1; + if (cls !== MX_OPAQUE) { + const dimsTag = readTag(check, space, p, end, 'dimensions'); + if (!dimsTag) { + return null; + } + if (dimsTag.type !== MI_INT32 || dimsTag.n % 4 !== 0 || dimsTag.n < 8) { + check.report('element', space, p, `the matrix's dimensions are ${dimsTag.n} byte(s) of ${typeName(dimsTag.type)}, ` + + 'where MATLAB writes and reads two or more miINT32 extents: it fails the load'); + return null; + } + for (let i = 0; i < dimsTag.n; i += 4) { + const extent = view.getInt32(dimsTag.data + i, true); + if (extent < 0) { + check.report('element', space, p, `the matrix's dimension ${i / 4 + 1} is ${extent}, which is no size: ` + + 'MATLAB fails the load'); + return null; + } + dims.push(extent); + numel *= extent; + } + p = dimsTag.next; + } + const nameTag = readTag(check, space, p, end, 'name'); + if (!nameTag) { + return null; + } + if (nameTag.type !== MI_INT8 && nameTag.type !== MI_UINT8) { + check.report('element', space, p, `the matrix's name is ${typeName(nameTag.type)}, where MATLAB writes an ` + + 'miINT8 one: it fails the load'); + return null; + } + const name = new Uint8Array(view.buffer, view.byteOffset + nameTag.data, nameTag.n); + return { cls, flags, dims, numel, name, p: nameTag.next }; +} + +/** A matrix inside another: a cell's member, a struct's field, an object's data. */ +function nestedMatrix(check: Check, space: Space, start: number, end: number, depth: number): void { + check.spend(space, start); + if (depth > MAX_NESTING) { + throw new OutOfBudget(space.fileAt(start), `a matrix nested more than ${MAX_NESTING} levels deep`); + } + const head = readHeader(check, space, start, end); + if (!head) { + return; + } + const p = classBody(check, space, head, end, depth); + if (p !== null) { + fillsExactly(check, space, p, end); + } +} + +/** A matrix whose class's sub-elements end at `p` holds nothing after them. */ +function fillsExactly(check: Check, space: Space, p: number, end: number): void { + if (p !== end) { + check.report('nbytes', space, p, `${end - p} byte(s) follow the matrix's last sub-element inside it: MATLAB reads ` + + 'a matrix as its sub-elements back to back, and they must fill it exactly'); + } +} + +/** + * The sub-elements a matrix of `head.cls` holds after its name, checked: where they end, or + * null when a fault already said means the rest cannot be read. + */ +function classBody(check: Check, space: Space, head: MatrixHead, end: number, depth: number): number | null { + const cls = head.cls; + switch (cls) { + case MX_CELL: + return members(check, space, head.p, end, head.numel, depth, 'cell member'); + case MX_STRUCT: + return structBody(check, space, head, head.p, end, depth); + case MX_OBJECT: { + const p = className(check, space, head.p, end); + return p === null ? null : structBody(check, space, head, p, end, depth); + } + case MX_CHAR: + return charBody(check, space, head, end); + case MX_SPARSE: + return sparseBody(check, space, head, end); + case MX_FUNCTION: + return members(check, space, head.p, end, head.numel, depth, 'function handle member'); + case MX_OPAQUE: { + const sub = className(check, space, head.p, end, 'subsystem name'); + const p = sub === null ? null : className(check, space, sub, end); + return p === null ? null : members(check, space, p, end, 1, depth, 'object data'); + } + default: + return head.flags & SPARSE_BIT ? sparseBody(check, space, head, end) : numericBody(check, space, head, end); + } +} + +/** + * `count` matrices back to back from `p`, each checked: a cell's members, a struct's fields + * (element by element, field by field), a function handle's parts, an object's data. + */ +function members(check: Check, space: Space, p: number, end: number, count: number, depth: number, what: string): number | null { + for (let i = 0; i < count; i++) { + if (p >= end) { + check.report('nbytes', space, p, `the matrix holds ${i} of the ${count} ${what}(s) it declares: MATLAB fails the load`); + return null; + } + const tag = readTag(check, space, p, end, `${what} ${i + 1}`); + if (!tag) { + return null; + } + if (tag.type !== MI_MATRIX) { + check.report('element', space, p, `${what} ${i + 1} is a data element of ${typeName(tag.type)}, where MATLAB ` + + 'reads only a matrix: it fails the load'); + return null; + } + // An empty matrix here is a member MATLAB reads as [], and has no sub-elements to check, + // but it is spent as one: a billion of them is still a billion reads. + if (tag.n > 0) { + nestedMatrix(check, space, tag.data, tag.next, depth + 1); + } else { + check.spend(space, p); + } + p = tag.next; + } + return p; +} + +/** An miINT8 name after a matrix's own: an object's class name, an opaque's subsystem name. */ +function className(check: Check, space: Space, p: number, end: number, what = 'class name'): number | null { + const tag = readTag(check, space, p, end, what); + if (!tag) { + return null; + } + if ((tag.type !== MI_INT8 && tag.type !== MI_UINT8) || tag.n === 0) { + check.report('element', space, p, `the object's ${what} is ${tag.n} byte(s) of ${typeName(tag.type)}, where MATLAB ` + + 'writes a name in miINT8: it fails the load'); + return null; + } + return tag.next; +} + +/** A struct's (or an object's) field-name length, its field names, then every field's value. */ +function structBody(check: Check, space: Space, head: MatrixHead, p: number, end: number, depth: number): number | null { + const widthTag = readTag(check, space, p, end, 'field-name length'); + if (!widthTag) { + return null; + } + if (widthTag.type !== MI_INT32 || widthTag.n !== 4) { + check.report('element', space, p, `the struct's field-name length is ${widthTag.n} byte(s) of ${typeName(widthTag.type)}, ` + + 'where MATLAB writes one miINT32: it fails the load'); + return null; + } + const width = space.view.getInt32(widthTag.data, true); + const namesTag = readTag(check, space, widthTag.next, end, 'field names'); + if (!namesTag) { + return null; + } + if (namesTag.type !== MI_INT8 && namesTag.type !== MI_UINT8) { + check.report('element', space, widthTag.next, `the struct's field names are ${typeName(namesTag.type)}, where MATLAB ` + + 'writes miINT8: it fails the load'); + return null; + } + if (width <= 0 && namesTag.n > 0) { + check.report('element', space, p, `the struct's field-name length is ${width}, with ${namesTag.n} byte(s) of names: ` + + 'MATLAB fails the load'); + return null; + } + // MATLAB counts the fields as the names' bytes over the length, whole names only. + const fields = width > 0 ? Math.floor(namesTag.n / width) : 0; + return members(check, space, namesTag.next, end, head.numel * fields, depth, 'field value'); +} + +/** + * A char array's data: miUTF8 holding as many UTF-16 units as the array's elements, miUTF16 + * of two bytes each, or miUINT16 below U+0100 (MATLAB keeps only the low byte of a unit above + * it, and fails on a surrogate). A complex char array MATLAB does not load at all. + */ +function charBody(check: Check, space: Space, head: MatrixHead, end: number): number | null { + const tag = readTag(check, space, head.p, end, 'char data'); + if (!tag) { + return null; + } + const numel = head.numel; + const view = space.view; + switch (tag.type) { + case MI_UTF8: { + let text: string | null = null; + try { + text = strictUtf8.decode(new Uint8Array(view.buffer, view.byteOffset + tag.data, tag.n)); + } catch { + check.report('char-type', space, head.p, 'the char array\'s miUTF8 data is not valid UTF-8'); + } + if (text !== null && text.length !== numel) { + check.report('utf8-count', space, head.p, `the char array's miUTF8 data is ${text.length} UTF-16 unit(s) of text, ` + + `and the array has ${numel} element(s): MATLAB fails the load`); + } + break; + } + case MI_UTF16: + if (tag.n !== 2 * numel) { + check.report('data-size', space, head.p, `the char array's miUTF16 data is ${tag.n} byte(s), and the array has ` + + `${numel} element(s) of 2 bytes each`); + } + break; + case MI_UINT16: + if (tag.n !== 2 * numel) { + check.report('data-size', space, head.p, `the char array's miUINT16 data is ${tag.n} byte(s), and the array has ` + + `${numel} element(s) of 2 bytes each`); + } + for (let o = tag.data; o + 2 <= tag.data + tag.n; o += 2) { + const unit = view.getUint16(o, true); + if (unit > 0xff) { + check.report('char-type', space, head.p, `the char array's miUINT16 data holds U+${unit.toString(16).toUpperCase().padStart(4, '0')}: ` + + 'MATLAB reads miUINT16 text one byte a character, keeping only the low byte of a unit above U+00FF ' + + 'and failing on a surrogate. Text beyond U+00FF is stored as miUTF8 or miUTF16'); + break; + } + } + break; + default: + check.report('char-type', space, head.p, `the char array's data is ${typeName(tag.type)}: MATLAB reads char data ` + + 'only as miUTF8, miUTF16 or miUINT16, and fails the load'); + } + let p = tag.next; + if (head.flags & COMPLEX_BIT) { + check.report('char-type', space, head.p, 'the char array is marked complex, and MATLAB loads a complex char array ' + + 'as nothing'); + const imag = readTag(check, space, p, end, 'imaginary char data'); + if (!imag) { + return null; + } + p = imag.next; + } + return p; +} + +/** + * A full numeric array's real part, and its imaginary part when it is complex. A double may be + * stored in any numeric type (MATLAB narrows integral doubles to the smallest that holds them); + * every other class only in its own. + */ +function numericBody(check: Check, space: Space, head: MatrixHead, end: number): number | null { + let p = head.p; + for (const part of head.flags & COMPLEX_BIT ? ['real part', 'imaginary part'] : ['data']) { + const tag = readTag(check, space, p, end, part); + if (!tag) { + return null; + } + checkNumbers(check, space, p, head, tag, part, head.numel); + p = tag.next; + } + return p; +} + +/** One numeric part's type and size, against its array's class and `count` elements. */ +function checkNumbers(check: Check, space: Space, o: number, head: MatrixHead, tag: Tag, part: string, count: number): void { + const logical = head.flags & LOGICAL_BIT && head.cls === MX_UINT8; + const what = logical ? 'logical' : head.cls === MX_SPARSE ? 'sparse' : CLASS_NAMES[head.cls]; + const width = WIDTH[tag.type]; + const own = OWN_TYPE[head.cls]; + if (own !== undefined && tag.type !== own) { + check.report('int-storage', space, o, `the ${what} array's ${part} is stored as ${typeName(tag.type)}, and MATLAB ` + + `stores a ${what} array only as ${typeName(own)}: only a double is ever stored in a narrower type`); + return; + } + if (width === undefined) { + check.report('element', space, o, `the ${what} array's ${part} is ${typeName(tag.type)}, which MATLAB does not ` + + 'read as numbers: it fails the load'); + return; + } + if (tag.n % width !== 0 || tag.n / width !== count) { + check.report('data-size', space, o, `the ${what} array's ${part} is ${tag.n} byte(s) of ${typeName(tag.type)}, and it ` + + `has ${count} element(s) of ${width} byte(s) each`); + } +} + +/** + * A sparse array: its row indices, its column starts (one per column and one more), its + * non-zeros, and their imaginary parts when it is complex. MATLAB has sparse arrays of double, + * single and logical class only. + */ +function sparseBody(check: Check, space: Space, head: MatrixHead, end: number): number | null { + const cls = head.cls; + const logical = (head.flags & LOGICAL_BIT) !== 0; + if (!(cls === MX_SPARSE || cls === MX_DOUBLE || cls === MX_SINGLE || (cls === MX_UINT8 && logical))) { + check.report('element', space, head.p, `the matrix is a sparse ${CLASS_NAMES[cls]} array, and MATLAB has sparse ` + + 'arrays of double, single and logical class only'); + } + if (head.dims.length !== 2) { + check.report('element', space, head.p, `the sparse array has ${head.dims.length} dimensions, and a sparse array has 2`); + } + const ir = readTag(check, space, head.p, end, 'row indices'); + if (!ir) { + return null; + } + const jc = readTag(check, space, ir.next, end, 'column starts'); + if (!jc) { + return null; + } + for (const [tag, o, part] of [[ir, head.p, 'row indices'], [jc, ir.next, 'column starts']] as const) { + if (tag.type !== MI_INT32) { + check.report('element', space, o, `the sparse array's ${part} are ${typeName(tag.type)}, where MATLAB writes ` + + 'miINT32'); + } + } + const nonZeros = ir.type === MI_INT32 ? ir.n / 4 : Math.floor(ir.n / (WIDTH[ir.type] ?? 1)); + if (jc.type === MI_INT32 && head.dims.length === 2 && jc.n !== 4 * (head.dims[1] + 1)) { + check.report('data-size', space, ir.next, `the sparse array's column starts are ${jc.n / 4} miINT32, and it has ` + + `${head.dims[1]} column(s), which take one more`); + } + let p = jc.next; + for (const part of head.flags & COMPLEX_BIT ? ['real non-zeros', 'imaginary non-zeros'] : ['non-zeros']) { + const tag = readTag(check, space, p, end, part); + if (!tag) { + return null; + } + checkNumbers(check, space, p, { ...head, cls: cls === MX_SPARSE && logical ? MX_UINT8 : cls }, tag, part, nonZeros); + p = tag.next; + } + return p; +} + +/** + * Where the subsystem data an unnamed record holds is, or null when it holds none: the data of + * a real uint8 array, opening as a MAT stream does (00 01 49 4D). Read without a word said, + * since `classBody` checks the same sub-element as the array's data. + */ +function subsystemStream(space: Space, head: MatrixHead, end: number): { start: number; end: number } | null { + const view = space.view; + if (head.cls !== MX_UINT8 || head.flags & (LOGICAL_BIT | COMPLEX_BIT | SPARSE_BIT) || head.p + 16 > end) { + return null; + } + const n = view.getUint32(head.p + 4, true); + const start = head.p + 8; + if (view.getUint32(head.p, true) !== MI_UINT8 || n < 8 || start + n > end) { + return null; + } + return STREAM_MAGIC.every((b, i) => view.getUint8(start + i) === b) ? { start, end: start + n } : null; +} + +/** + * The subsystem's stream, checked as MATLAB reads it when it loads an object: its 8-byte + * preamble, then matrices back to back to its last byte. The second half of the preamble's + * reserved word says the stream's tags are 32-bit, as in every file MATLAB was seen writing; + * a stream that says otherwise is not walked. + */ +function checkSubsystem(check: Check, space: Space, start: number, end: number): void { + if (space.view.getUint16(start + 4, true) !== 0) { + return; + } + check.inSubsystem = true; + try { + let o = start + 8; + while (o < end) { + const element = readTag(check, space, o, end, 'subsystem element'); + if (!element) { + return; + } + if (element.type !== MI_MATRIX) { + check.report('element', space, o, `the subsystem's stream holds a data element of ${typeName(element.type)}, ` + + 'where it holds only matrices'); + return; + } + if (element.n > 0) { + nestedMatrix(check, space, element.data, element.next, 1); + } else { + check.spend(space, o); + } + o = element.next; + } + } finally { + check.inSubsystem = false; + } +} + +/** + * The rules about where records are: the header's offset points at the subsystem, the + * subsystem is last, no other record is unnamed, no name is stored twice. + */ +function checkPlacement(check: Check, records: RecordInfo[], offset: number, length: number): void { + let subsystem = -1; + if (offset !== 0) { + const i = records.findIndex((r) => r.at === offset); + const record = records[i]; + const field = `Header bytes 116-123 give the subsystem's offset as ${offset}`; + const fails = 'MATLAB reads the objects in the file only from there, and fails the load'; + if (!record) { + check.file('subsystem-offset', 116, offset < 128 || offset >= length + ? `${field}, outside the file's records: ${fails}.` + : `${field}, where no record starts: ${fails}.`); + } else if (record.name === null) { + // The record there could not be read, which is said where it is. + } else if (record.name !== '') { + check.file('subsystem-offset', 116, `${field}, which is variable "${record.name}", not the subsystem: ${fails}.`); + } else if (!record.subsystem) { + check.file('subsystem-offset', 116, `${field}, an unnamed record that holds no subsystem data: ${fails}.`); + } else { + subsystem = i; + } + } else { + for (const r of records) { + if (r.subsystem) { + check.file('subsystem-offset', 116, `Header bytes 116-123 say the file has no subsystem, and the record at byte ` + + `${r.at} is one: MATLAB then reads none of the objects in the file, and fails the load.`); + } + } + } + if (subsystem >= 0) { + for (const r of records.slice(subsystem + 1)) { + const what = r.name ? `Variable "${r.name}"` : `The record at byte ${r.at}`; + check.file('subsystem-not-last', r.at, `${what} is stored after the subsystem (byte ${records[subsystem].at}): ` + + 'MATLAB stops reading variables at the subsystem, so `load` silently leaves it out.', r.name || undefined); + } + } + records.forEach((r, i) => { + if (r.name !== '' || i === subsystem) { + return; + } + const after = records.length - i - 1; + const what = r.subsystem + ? `The record at byte ${r.at} holds subsystem data, and the header's offset does not point at it` + : `The record at byte ${r.at} has no name`; + check.file('anonymous-record', r.at, `${what}: MATLAB stops reading variables at the first unnamed record, which ` + + 'is the subsystem\'s place' + + (after > 0 ? `, so \`load\` silently leaves out the ${after} record(s) after it.` : ', and leaves it out of `load`.')); + }); + const first = new Map(); + for (const r of records) { + if (!r.name) { + continue; + } + const seen = first.get(r.name); + if (seen === undefined) { + first.set(r.name, r.at); + } else { + check.file('duplicate-name', r.at, `Variable "${r.name}" is stored again at byte ${r.at} (first at byte ${seen}): ` + + 'MATLAB loads both, `load(f)` keeping the last and `load(f, name)` the first.', r.name); + } + } +} diff --git a/src/datamodel/parser/MatFileWriter.ts b/src/datamodel/parser/MatFileWriter.ts new file mode 100644 index 00000000..95301355 --- /dev/null +++ b/src/datamodel/parser/MatFileWriter.ts @@ -0,0 +1,1157 @@ +// Copyright 2026 The MathWorks, Inc. +// +// A save of a Level-5 MAT-file (`-v6`, `-v7`): the file it was read from, with what was edited +// written fresh and everything else written as the bytes it was read from. +// +// WHY A SPLICE. A MAT-file is a header and a run of top-level records, each one variable, and +// the last one, unnamed, the subsystem that holds every object of the file. Nothing in a record +// points at another record, and nothing in the subsystem names a variable. So a record nobody +// edited can be written back as its own bytes, compressed as it was, which no re-encode +// reproduces: inflated and deflated again by fflate at level 6, 18 of the 78 compressed records +// of test/parity/artifacts/mat/cases.mat come back as they were. And the reader holds what it +// did not read (a record it could not inflate, a class it does not model) only as bytes. This +// is MATLAB's own update model too: measured against MATLAB R2027a, `save -append` copies every +// record it does not replace byte for byte, a compressed one included, keeps the header's text, +// and writes the subsystem last. +// +// What each record of the file becomes, in the file's order (plan): +// +// the node it became was deleted nothing +// unedited its own bytes +// only renamed its element with the name replaced (MatWriter. +// elementNamed), compressed again if it was +// its value edited, a plain value written fresh (MatlabVariableNode._matStream), +// named, compressed when the file holds any +// compressed record +// no node: the subsystem, a record the its own bytes +// reader dropped +// +// and a variable added since the read is written fresh, after the last variable and before the +// subsystem. The header keeps its 116 bytes of text and its version and byte-order mark, and +// bytes 116-123 say where the subsystem now starts, which MATLAB trusts without a scan +// (measured against MATLAB R2027a: a stale offset fails the whole load). +// +// "Unedited" is decided by the node's status, which every edit sets (DataNode._markModified), +// and never by whether a value still has the bytes it was read from: those stay on a variable +// after an edit. "Only renamed" is the status, a name that is not the record's, and no edit of +// the value (DataNode._valueEdited). +// +// EVERY DOUBT REFUSES THE SAVE. A save that cannot write a variable as what it is throws a +// MatWriteError naming it, and nothing is written: an object, a function handle or a value the +// reader did not decode, whose edit this writer cannot write; a variable stored in a form MATLAB +// does not load as it is, whose value as read is this reader's guess at it; a variable stored +// after the subsystem, where MATLAB does not read it; a file whose records do not tile it, or that was +// opened without them. And before the bytes are handed back, every record written anew is read +// again, and one that does not read back as planned refuses the save as well (selfCheck), as does +// a file that breaks a rule MATLAB loads a file by that the file it was read from did not break +// (MatFileCheck). Both are asked of what the save changed, and of where every record stands: a +// record written as its own bytes is the record it was read as, and breaks what that one broke. +// +// The editor takes none of the edits refused for what a variable is or where it stands: its gate +// (MatNode._editRefusal) is built of the refusals exported here (unsavableRefusal, +// structureRefusal, freshRefusal, renameWhy, PAST_SUBSYSTEM, duplicateWhy), so that an edit it takes +// is one a save writes, and the two cannot come to disagree. What is left to refuse at the save is +// what only a value's bytes say: MatWriter's budget, and the two checks of what was written. + +import { zlibSync } from 'fflate'; +import { inflateZlib } from './Inflate.js'; +import { parseMat, functionHandleOf } from './MatParser.js'; +import type { MatRecord, MatVariable, ParsedMat } from './MatParser.js'; +import { MatBudgetError, MatWriteError, classPhrase, elementNamed, encodeMatVariable } from './MatWriter.js'; +import { checkMatElement, violationsAddedBySplice } from './MatFileCheck.js'; +import type { MatCheckOptions, MatSplicedRecord, MatViolationCode } from './MatFileCheck.js'; +import { integerConversion } from './XmlUtils.js'; +import { validateMatlabName } from '../matlabName.js'; +import type BaseNode from '../node/BaseNode.js'; +import type DataNode from '../node/DataNode.js'; +import type MatNode from '../node/container/MatNode.js'; +import type MatlabVariableNode from '../node/data/MatlabVariableNode.js'; + +const MI_MATRIX = 14; +const MI_COMPRESSED = 15; + +/** + * The bytes of the MAT-file `matNode` is, as it stands now: what was edited written fresh, + * everything else as the bytes it was read from. Throws MatWriteError, naming the variable or + * the file and why, for anything it cannot write as what it is (see the file header), and + * never hands back bytes that did not read back as planned. + * + * `check` is the budget of the check of what was written (MatFileCheck), its own by default: + * for tests, which cannot make a file a gigabyte past it. + */ +export function serializeMatFile(matNode: MatNode, check: MatCheckOptions = {}): Uint8Array { + const file = matNode.name; + const unsavable = unsavableRefusal(matNode); + if (unsavable) { + throw unsavable; + } + const records = matNode.records!; + const headerBytes = matNode.headerBytes!; + + const subsystem = subsystemOf(matNode, records); + const plan = planOf(matNode, records, subsystem); + // Nothing deleted, renamed, edited or added: the file, as it was read. + if (plan.length === records.length && plan.every((p, i) => p.kind === 'verbatim' && p.record === records[i])) { + return concat([headerBytes, ...records.map((r) => r.bytes)], fileTooBig(file)); + } + const structure = structureRefusal(matNode, records, subsystem); + if (structure) { + throw structure; + } + const assembled = assemble(file, headerBytes, plan, subsystem); + selfCheck(file, assembled, plan, headerBytes); + refuseWorse(file, assembled, plan, headerBytes, records, check); + return assembled.bytes; +} + +/** + * The refusal of every save of `matNode`, an unedited one included, or null: a tree opened + * without the records a save writes back, one whose bytes the host has since handed away, and + * a file whose records do not tile it. Asked first by serializeMatFile, and by the editor, which + * takes no edit of a file no save can write (MatNode._editRefusal). + */ +export function unsavableRefusal(matNode: MatNode): MatWriteError | null { + const file = matNode.name; + const { records, headerBytes } = matNode; + if (!records || !headerBytes) { + return new MatWriteError( + 'Cannot save "' + file + '": it was opened without the records a save writes back, so a save would lose every one ' + + 'this package did not read. Nothing was written.', + ); + } + // The records are views of the bytes the file was read from, which a host that transfers + // them to a worker afterwards empties: what was not edited would be written as nothing. + const gone = headerBytes.byteLength !== 128 ? { offset: 0, length: 128, bytes: headerBytes } : records.find((r) => r.bytes.byteLength !== r.length); + if (gone) { + return new MatWriteError( + 'Cannot save "' + file + '": the bytes it was read from are no longer held (the ' + (gone.offset === 0 ? 'header' : 'record at byte ' + gone.offset) + + ' holds ' + gone.bytes.byteLength + ' of its ' + gone.length + '), so what was not edited could not be written as it was. ' + + 'Nothing was written.', + ); + } + if (!matNode.framed) { + const at = matNode.unframed?.at ?? 128; + const unframedBytes = headerBytes.buffer.byteLength - headerBytes.byteOffset - at; + return new MatWriteError( + 'Cannot save "' + file + '": this package could not frame ' + unframedBytes + ' byte(s) of it, from byte ' + at + + (matNode.unframed ? ' (' + matNode.unframed.reason + ')' : '') + + ', so a save could not keep them as they are. Nothing was written.', + ); + } + return null; +} + +// ---- The plan: what each record of the file becomes ----------------------------------------- + +/** One record of the file a save writes, and where its bytes come from. */ +type Planned = + // A record of the file, as its own bytes. + | { kind: 'verbatim'; record: MatRecord } + // A record of the file whose variable was only renamed: its element, named `name`, and the + // element it was read as (elementOfRecord), which the self-check holds it to. + | { kind: 'renamed'; record: MatRecord; name: string; bytes: Uint8Array; element: Uint8Array } + // A value written fresh, named `name`: an edited variable's, read from `record`, or one + // added since the read, with no record. + | { kind: 'fresh'; record: MatRecord | null; node: MatlabVariableNode; name: string; bytes: Uint8Array }; + +/** What has happened to the variable a record became, as a save writes it. */ +type Edit = 'none' | 'name' | 'value'; + +// The record `matNode`'s header says its subsystem starts at, or null when it says there is none, +// or names a byte where no unnamed record starts (structureRefusal). By offset, and not by which +// record has no name: a matrix too short for its own flags reads as unnamed too. And unnamed, +// because a variable the header points at is a variable, whose edit is written or refused as +// any other's, and not passed over as the subsystem it is not. +export function subsystemOf(matNode: MatNode, records: MatRecord[]): MatRecord | null { + if (matNode.subsystemOffset === 0) { + return null; + } + return records.find((r) => r.offset === matNode.subsystemOffset && r.anonymous) ?? null; +} + +// The file's records, each as a save writes it, in the file's order, and every variable added +// since the read just before the subsystem, or at the end of a file with none, in the order they +// were added. A record that became no node (the subsystem, one the reader dropped) is its own +// bytes. One past the subsystem, which MATLAB does not read, is too, and its edit refuses the +// save: written where it is, MATLAB still would not read it, and moved, what MATLAB loads of the +// file would change. Deleting one changes nothing MATLAB loads, and is written. +function planOf(matNode: MatNode, records: MatRecord[], subsystem: MatRecord | null): Planned[] { + const compress = records.some((r) => r.compressed); + const added = matNode.children.filter((c) => matNode.recordOf(c) === null); + const plan: Planned[] = []; + const addAdded = () => { + for (const node of added) { + plan.push(freshOf(node, null, compress)); + } + }; + let pastSubsystem = false; + for (const record of records) { + if (record === subsystem) { + addAdded(); + plan.push({ kind: 'verbatim', record }); + pastSubsystem = true; + continue; + } + const node = matNode.nodeOf(record); + if (!node) { + plan.push({ kind: 'verbatim', record }); + continue; + } + if (node.parent !== matNode) { + continue; + } + const edit = editOf(node, record); + if (edit === 'none') { + plan.push({ kind: 'verbatim', record }); + } else if (pastSubsystem) { + throw refusal(node.name, PAST_SUBSYSTEM); + } else if (edit === 'name') { + plan.push(renamedOf(node, record)); + } else { + plan.push(freshOf(node, record, compress)); + } + } + if (!subsystem) { + addAdded(); + } + refuseDuplicates(plan); + return plan; +} + +// What has happened to the variable `record` became, `node`: decided by its status, which every +// edit sets (DataNode._markModified), and by whether anything but its own rename set it +// (DataNode._valueEdited). A rename undone leaves the status set and the name the file's: it is +// unedited. Its name is asked whatever the status, so that a rename made around the API, which +// sets none, is still written as one. +function editOf(node: BaseNode, record: MatRecord): Edit { + const { status, _valueEdited } = node as DataNode; + if (status === 'New' || (status === 'Modified' && _valueEdited)) { + return 'value'; + } + return node.name !== record.name ? 'name' : 'none'; +} + +/** Why the edit of a variable stored after the subsystem is refused (planOf, and the editor's gate). */ +export const PAST_SUBSYSTEM = + "it is stored after the file's objects, where MATLAB does not read it, so it would not be read written there, " + + 'and moved, it would change what MATLAB loads of the file'; + +/** + * The refusal of a save of a file with an unnamed record that is not its subsystem, or whose + * header puts its subsystem where no unnamed record starts, or null: such a save cannot place + * what it writes where MATLAB reads it. Measured against MATLAB R2027a, MATLAB lists no variable + * past the first unnamed record, and a header offset that is not the subsystem's fails the whole + * load. Asked only of a save that changes the file: one that does not hands back the bytes it was + * read from. So the editor asks it of every edit (MatNode._editRefusal). + */ +export function structureRefusal(matNode: MatNode, records: MatRecord[], subsystem: MatRecord | null): MatWriteError | null { + const file = matNode.name; + const offset = matNode.subsystemOffset; + if (offset !== 0 && !subsystem) { + return new MatWriteError( + 'Cannot save "' + file + '": its header places the file\'s objects at byte ' + offset + ', where ' + + (records.some((r) => r.offset === offset) ? 'a variable is' : 'no record starts') + ', so a save cannot say where they are. ' + + 'Nothing was written.', + ); + } + const stray = records.find((r) => r.anonymous && r !== subsystem); + if (stray) { + return new MatWriteError( + 'Cannot save "' + file + '": the record at byte ' + stray.offset + ' holds a value with no name that is not the ' + + 'file\'s objects, and MATLAB reads no variable past one, so a save cannot place an edit where MATLAB reads it. ' + + 'Nothing was written.', + ); + } + return null; +} + +// Two records of one name: MATLAB loads one of them (measured against MATLAB R2027a: `load f` +// keeps the last, `load f x` the first). A file that holds two keeps them, as it was read; a +// rename or an addition that would make two is refused, naming the variable. A record the reader +// could not read a name out of is held to none (MatNode._namespaceHolds says why). +function refuseDuplicates(plan: Planned[]): void { + const count = new Map(); + const nameOf = (p: Planned) => (p.kind === 'verbatim' ? p.record.name : p.name); + for (const p of plan) { + count.set(nameOf(p), (count.get(nameOf(p)) ?? 0) + 1); + } + for (const p of plan) { + if (p.kind !== 'verbatim' && count.get(p.name)! > 1) { + throw refusal(p.name, duplicateWhy(p.name)); + } + } +} + +/** Why a variable is not written under `name`, which another variable of the file has (refuseDuplicates, and the editor's gate). */ +export function duplicateWhy(name: string): string { + return 'the file holds another variable named "' + name + '", and MATLAB loads only one of them'; +} + +// The refusal of a save for variable `name`, worded as every refused write is (MatWriter's +// budgetFailure, DataNode's): the variable, why, and that nothing was written. +function refusal(name: string, why: string): MatWriteError { + return new MatWriteError('Cannot write "' + name + '": ' + why + '. Nothing was written.'); +} + +// A name this writer puts in an element: a valid MATLAB name, by the rule a rename is held to +// (matlabName), which is stricter than MATLAB's and holds for older releases. A variable added +// by a caller that named it itself (MatNode.execAddEntry) has had no other check. +function refuseName(name: string): void { + const error = validateMatlabName(name); + if (error) { + throw refusal(name, 'it is not a name MATLAB can load (' + error + ')'); + } +} + +// ---- What a renamed or an edited record is written as ----------------------------------------- + +// The record of a variable only renamed: its element as read, with the name subelement replaced +// (MatWriter.elementNamed) and every other byte copied, compressed again when it was. An object +// variable, a function handle and a value the reader did not decode are renamed so as well: +// nothing of them but their name is written. +function renamedOf(node: BaseNode, record: MatRecord): Planned { + const name = node.name; + refuseName(name); + const why = renameWhy(record); + if (why) { + throw refusal(name, why); + } + const element = elementOfRecord(record)!; + return { kind: 'renamed', record, name, bytes: recordBytes(elementNamed(element, name)!, record.compressed, name), element }; +} + +/** + * Why the variable read from `record` cannot be renamed, or null where it can: its record is not + * one whole element whose name can be replaced (elementOfRecord, MatWriter.elementNamed), which a + * record MATLAB writes always is. Asked by renamedOf, and by a rename before it is made + * (MatNode._renameRefusal), once a record: the records never change, and asking inflates one. + */ +export function renameWhy(record: MatRecord): string | null { + let can = renamable.get(record); + if (can === undefined) { + const element = elementOfRecord(record); + can = !!element && elementNamed(element, '') !== null; + renamable.set(record, can); + } + return can ? null : 'the record it was read from, at byte ' + record.offset + ', is not a whole element whose name can be replaced, so it cannot be renamed'; +} + +const renamable = new WeakMap(); + +// The record of a value written fresh: `node`'s, an edited variable read from `record` or one +// added since, named, and compressed when the file holds any compressed record, so that a `-v6` +// file, which holds none and is readable by every MATLAB, stays one. +// +// Only a plain MATLAB value is written fresh. A variable that was an object, a string, a function +// handle or a value the reader did not decode is refused when anything but its name changed, as +// is a typed object's node, whatever it holds now: this writer has no encoder for an object, and +// the record's own bytes, which are the only thing it could write, are no longer the value. +function freshOf(node: BaseNode, record: MatRecord | null, compress: boolean): Planned { + const name = node.name; + const refused = freshRefusal(node, record); + if (refused) { + throw refused; + } + const value = valueNodeOf(node)!; + const named = elementNamed(globalAsRead(freshElement(value), record), name); + if (!named) { + throw refusal(name, 'the element written for it has no name to replace'); + } + return { kind: 'fresh', record, node: value, name, bytes: recordBytes(named, compress, name) }; +} + +/** + * The refusal a save throws for writing `node` fresh, the variable `record` became or one added + * since (no record), or null where nothing about what it is refuses it: what an edit of anything + * of it but its own name asks of a save. A name that is no MATLAB name by the rule a rename is + * held to; a variable that was not a plain value, or whose node is a typed object's (freshOf); one + * holding what this writer cannot write at any depth (unwritableIn); one with no form at all, a + * container none of whose elements could be read (_heldNone) or a size that is no count + * (_refuseNoSize); one holding a container read short at any depth (shortIn); and one stored in + * a form MATLAB does not load as it is (storedRefusal). + * + * One rule for freshOf, which throws it, and for the editor, which takes no edit a save would + * refuse so (MatNode._editRefusal): the two cannot come to disagree. What it does not judge is + * what only the value's bytes say, MatWriter's budget among them, which freshElement meets. + */ +export function freshRefusal(node: BaseNode, record: MatRecord | null): MatWriteError | null { + const name = node.name; + const nameError = validateMatlabName(name); + if (nameError) { + return refusal(name, 'it is not a name MATLAB can load (' + nameError + ')'); + } + const was = record?.variable ? notPlain(record.variable) : null; + const value = valueNodeOf(node); + if (was || !value) { + const what = was ?? classPhrase(String((node as DataNode).className || 'object')); + return refusal(name, 'it is ' + what + ', which a MAT-file save writes only as it was read, or renamed, so its edit cannot be saved'); + } + const unwritable = unwritableIn(value); + if (unwritable) { + return refusal(name, unwritable.path + ' is ' + unwritable.what + ', which this package cannot write into a MAT-file'); + } + if (value._heldNone()) { + return value._heldNoneRefusal(); + } + try { + value._refuseNoSize(); + } catch (e) { + if (e instanceof MatWriteError) { + return e; + } + throw e; + } + const short = shortIn(value); + if (short) { + return refusal(name, short.path + ' is ' + short.what + ', and a save would write the ones it does not hold as empty'); + } + // And one stored in a form MATLAB does not load as it is (storedRefusal). Last, so that a + // refusal that says more of the same damage (a container read short, a value not decoded) is + // the one given. + const stored = record ? storedRefusal(record) : null; + if (stored) { + return refusal(name, 'it is stored in a form MATLAB does not load as it is (' + stored + '), so there is no value of it a save ' + + 'can be held to: it is written only as it was read, or renamed'); + } + return null; +} + +// The rules of MatFileCheck a variable's own element can break whose break says that what this +// package read of it is not a value MATLAB loads: char data MATLAB does not read as text, or +// reads otherwise (miUINT8 Latin-1 bytes, which this reader decodes as UTF-8, miUTF32, which it +// decodes as UTF-8 too, and CJK in miUINT16, of which MATLAB keeps the low byte of each unit), a +// char's UTF-8 that does not hold its count, a numeric class stored in another's type, a matrix +// its sub-elements do not fill, one MATLAB cannot read where it stands, a data part holding more +// or fewer elements than the dims say. Written fresh, each was this reader's guess at it, which +// MATLAB then loaded in its place: measured on MATLAB's verdict corpus (test/fixtures/mat-check), +// a 1x3 char stored as miUTF32 was written as the 1x12 of its bytes, and 'héllo' stored as miUINT8 +// as 'h\uFFFDllo'. Not a name (a fresh one is held to validateMatlabName), nor what only the file +// breaks around the element. +const VALUE_RULES: ReadonlySet = new Set(['char-type', 'utf8-count', 'int-storage', 'nbytes', 'element', 'data-size']); + +// What `record`'s own element breaks of VALUE_RULES, as checkMatElement says it, or null. Of the +// element the reader read, which it holds whole (MatVariable._rawBytes), so nothing is inflated; +// once per record, whose bytes never change. +const storedVerdicts = new WeakMap(); +function storedRefusal(record: MatRecord): string | null { + let verdict = storedVerdicts.get(record); + if (verdict === undefined) { + const element = record.variable?._rawBytes; + const broken = element ? checkMatElement(element).find((v) => VALUE_RULES.has(v.code)) : undefined; + verdict = broken ? broken.message.replace(/\.$/, '') : null; + storedVerdicts.set(record, verdict); + } + return verdict; +} + +/** + * The first container at or under `at` that holds fewer elements than it declares, read short + * out of a damaged record (MatParser's "declares 3 cell(s) and only 1 could be read"), with its + * path and what it holds; null for none. MatWriter writes each element it does not hold as an + * empty double, a hole (cellBody, structBody), which is a value the file did not hold, and past + * its budget refuses the save: a 1x600000 cell holding one element was 599,999 of them. So such a + * variable is written only as it was read, or renamed. A container the node ceiling built without + * its rows is asked of the variable it was read as, which is what it is written as. + */ +function shortIn(at: BaseNode): { path: string; what: string } | null { + const node = valueNodeOf(at); + if (!node) { + return null; + } + if (node._cutByCeiling && node._matVar) { + return shortVariableIn(node._matVar, node.matlabPath); + } + const declared = (node._dims || []).reduce((a, b) => a * b, 1); + const isStruct = node._kind === 'scalar' && node._scalarType === 'struct'; + if (node._kind !== 'cell' && !isStruct) { + return null; + } + // A struct array's rows are its elements, and one with no fields past the cap has none: it is + // written as the bytes it was read from (MatlabVariableNode._unexpandedStruct). + const holdsElements = node._kind === 'cell' || (declared !== 1 && !node._unexpandedStruct()); + if (holdsElements && node.children.length < declared) { + return { path: node.matlabPath, what: heldPhrase(node._dims, node._kind === 'cell' ? 'cell' : 'struct array', node.children.length) }; + } + for (const child of node.children) { + const below = shortIn(child); + if (below) { + return below; + } + } + return null; +} + +// shortIn, of a variable as MatParser read it. +function shortVariableIn(v: MatVariable | null | undefined, path: string): { path: string; what: string } | null { + if (!v) { + return null; + } + const dims = dimsOf(v); + const declared = dims.reduce((a, b) => a * b, 1); + if (v.className === 'cell') { + const members = flatValues(v.value) as (MatVariable | null)[]; + const held = members.slice(0, declared).filter(Boolean).length; + if (held < declared) { + return { path, what: heldPhrase(dims, 'cell', held) }; + } + for (let i = 0; i < members.length; i++) { + const below = shortVariableIn(members[i], path + '{' + (i + 1) + '}'); + if (below) { + return below; + } + } + } + if (v.className === 'struct' && v.fields) { + for (const name of Object.keys(v.fields)) { + const held = v.fields[name]; + const elements = Array.isArray(held) ? held : [held]; + const present = elements.slice(0, declared).filter(Boolean).length; + if (present < declared) { + return { path, what: heldPhrase(dims, 'struct array', present) + ' in its field ' + name }; + } + for (let e = 0; e < elements.length; e++) { + const below = shortVariableIn(elements[e], path + (Array.isArray(held) ? '(' + (e + 1) + ')' : '') + '.' + name); + if (below) { + return below; + } + } + } + } + return null; +} + +function heldPhrase(dims: number[], what: string, held: number): string { + return 'a ' + dims.join('x') + ' ' + what + ' holding ' + held + ' of the ' + dims.reduce((a, b) => a * b, 1) + ' elements it declares'; +} + +// `node` as the node of a plain MATLAB value, or null for a node of another class: a typed +// object's (a ParameterNode, a BusNode). Asked of what the node does rather than of its class, +// which this layer does not import (test/moduleBoundaries): a MatlabVariableNode, and only it, +// writes its value as a MAT stream. +function valueNodeOf(node: BaseNode): MatlabVariableNode | null { + const v = node as unknown as Partial; + return typeof v._matStream === 'function' && typeof v._matWritable === 'function' ? (v as MatlabVariableNode) : null; +} + +// What a variable read as `v` is, in words, when it is not a plain MATLAB value; null when it is. +function notPlain(v: MatVariable): string | null { + if (v.isOpaque) { + return classPhrase(v.className || 'object'); + } + if (functionHandleOf(v) || v.className === 'function_handle') { + return 'a function handle'; + } + if (v.className === 'unknown' || v.undecoded) { + return 'a value that was not decoded'; + } + return null; +} + +// Where an element's array flags keep its flags byte: past the element's tag and the flags' own, +// which MATLAB and MatWriter both write in the long form (8 bytes of tag, then 8 of data), and +// the byte after the class; and its bit for global. +const FLAGS_BYTE = 17; +const GLOBAL_FLAG = 0x04; + +// `element`, written fresh for the variable `record` holds, global when that one was +// (MatVariable.isGlobal). The flag is the workspace variable's and not its value's, so no writer +// of a value writes it, and written fresh a variable saved as global was not one: `load(f)` no +// longer declared it global. A rename splice keeps it with the rest of the element. Only the +// top-level element, the one MATLAB sets it on; and on a copy, since the element may be a view +// of the bytes the file was read from (_matStream's own, which then hold it already). +function globalAsRead(element: Uint8Array, record: MatRecord | null): Uint8Array { + const longFlags = element.byteLength > FLAGS_BYTE && u32At(element, 8) === 6 && u32At(element, 12) === 8; + if (!record?.variable?.isGlobal || !longFlags || element[FLAGS_BYTE] & GLOBAL_FLAG) { + return element; + } + const out = element.slice(); + out[FLAGS_BYTE] |= GLOBAL_FLAG; + return out; +} + +// The miMATRIX element `node`'s value is, with the empty name a stream's value has: the stream it +// is written as in a dictionary (_matStream), which writes a sparse array no element row edited +// and a struct array with no element rows as the bytes they were read from, and anything else as +// MatWriter writes it, once freshRefusal has found nothing in it this writer cannot write. Refused +// as a dictionary's save refuses it past MatWriter's budget, restated naming the variable +// (_budgetFailure), and for any other refusal of MatWriter's. +function freshElement(node: MatlabVariableNode): Uint8Array { + const stream = node._matStream(); + if (stream) { + return stream.subarray(8); + } + // _matStream answers null for a refusal of MatWriter's other than its budget's: asked again, + // for its reason. + try { + encodeMatVariable(node._var); + } catch (e) { + if (e instanceof MatBudgetError) { + throw node._budgetFailure(e); + } + if (e instanceof MatWriteError) { + throw refusal(node.name, e.message); + } + throw e; + } + throw refusal(node.name, 'no MAT element could be written for it'); +} + +/** + * The first node at or under `at` that MatWriter cannot write as what it is (the rule of + * MatlabVariableNode._matWritable), with its MATLAB path and what it is, or null for none. Asked + * by freshRefusal, and by the editor of a value about to be typed in (MatNode._valueRefusal). + * + * A container the node ceiling built without its rows (_cutByCeiling) is written as the variable + * it was read as (MatlabVariableNode._var), so that variable is what is asked of it, and not its + * rows, which _matWritable would find none of to refuse: a cell of function handles, cut, said + * nothing, and its edit was refused by MatWriter at the save. + */ +export function unwritableIn(at: BaseNode): { path: string; what: string } | null { + const found = unwritableAt(at); + if (found) { + return found; + } + const node = valueNodeOf(at)!; + return node._matWritable() ? null : { path: node.matlabPath, what: 'a value MatWriter has no variable for' }; +} + +function unwritableAt(at: BaseNode): { path: string; what: string } | null { + const node = valueNodeOf(at); + if (!node) { + return { path: at.matlabPath, what: classPhrase(String((at as DataNode).className || 'object')) }; + } + if (node._isOpaque) { + return { path: node.matlabPath, what: classPhrase(node._opaqueClassName || 'object') }; + } + if (node._undecoded) { + return { path: node.matlabPath, what: 'a value that was not decoded' }; + } + if (node._scalarType === 'string' || node._scalarType === 'function_handle') { + return { path: node.matlabPath, what: node._scalarType === 'string' ? 'a string' : 'a function handle' }; + } + if (node._cutByCeiling && node._matVar) { + return notPlainIn(node._matVar, node.matlabPath); + } + // Only a cell and a struct hold values of their own: an array's rows are its elements. + if (node._kind === 'cell' || node._scalarType === 'struct') { + for (const child of node.children) { + const below = unwritableAt(child); + if (below) { + return below; + } + } + } + return null; +} + +// The first member at or under the variable `v`, at `path`, that is not a plain MATLAB value +// (notPlain), with its path, or null: the members of a cell and the fields of a struct, at any +// depth, as MatParser holds them. +function notPlainIn(v: MatVariable | null | undefined, path: string): { path: string; what: string } | null { + if (!v) { + return null; + } + const what = notPlain(v); + if (what) { + return { path, what }; + } + if (v.className === 'cell') { + const members = flatValues(v.value) as (MatVariable | null)[]; + for (let i = 0; i < members.length; i++) { + const below = notPlainIn(members[i], path + '{' + (i + 1) + '}'); + if (below) { + return below; + } + } + } + if (v.className === 'struct' && v.fields) { + for (const name of Object.keys(v.fields)) { + const held = v.fields[name]; + const elements = Array.isArray(held) ? held : [held]; + for (let e = 0; e < elements.length; e++) { + const below = notPlainIn(elements[e], path + (Array.isArray(held) ? '(' + (e + 1) + ')' : '') + '.' + name); + if (below) { + return below; + } + } + } + } + return null; +} + +// The miMATRIX element a record holds: its own bytes for a plain one, its payload inflated for a +// compressed one. Null when there is no whole element, or bytes after it: a record that is not +// one MATLAB writes is not one to rename. +function elementOfRecord(record: MatRecord): Uint8Array | null { + const bytes = record.bytes; + if (bytes.byteLength < 8) { + return null; + } + const nbytes = u32At(bytes, 4); + if (!record.compressed) { + return u32At(bytes, 0) === MI_MATRIX && 8 + nbytes <= bytes.byteLength ? bytes.subarray(0, 8 + nbytes) : null; + } + let inflated: Uint8Array; + try { + inflated = inflateZlib(bytes.subarray(8, 8 + nbytes)); + } catch { + return null; + } + if (inflated.byteLength < 8 || u32At(inflated, 0) !== MI_MATRIX) { + return null; + } + return 8 + u32At(inflated, 4) === inflated.byteLength ? inflated : null; +} + +// A top-level record of `element`, the variable `name`'s: the element itself, which MatWriter pads +// to 8 bytes as a plain record must be, or its zlib stream (RFC 1950, which MATLAB requires; level +// 6, MATLAB's default) in an miCOMPRESSED tag, with no padding after it, as MATLAB writes one. +function recordBytes(element: Uint8Array, compress: boolean, name: string): Uint8Array { + return compress ? compressedRecordOf(zlibSync(element, { level: 6 }), name) : element; +} + +/** + * The miCOMPRESSED record of `stream`, the zlib stream of the variable `name`'s element: its tag + * and the stream. Refused for a stream of 4 GiB or more, whose length the tag's 32 bits cannot + * say: written, its length would wrap, and the record would declare a few bytes of a stream that + * goes on. Exported for test/matFileSave.test.ts, which holds it to that without a stream so big. + */ +export function compressedRecordOf(stream: Uint8Array, name: string): Uint8Array { + if (stream.byteLength > 0xffffffff) { + throw refusal(name, 'compressed, its element is a stream of ' + stream.byteLength + ' bytes, more than the 4 GiB a record can say it holds'); + } + return concat([u32le(MI_COMPRESSED), u32le(stream.byteLength), stream], (total) => + refusal(name, 'its record would be ' + total + ' bytes, more than this runtime holds in one buffer'), + ); +} + +// ---- Assembly --------------------------------------------------------------------------------- + +/** The bytes of the plan, each planned record's offset in them, and the subsystem's, or null. */ +interface Assembled { + bytes: Uint8Array; + offsets: number[]; + subsystemAt: number | null; +} + +// The header and the planned records, back to back. The header is the file's own: its text +// (bytes 0-115, which MATLAB keeps on `-append` and never reads), and its version and byte-order +// mark (124-127). Bytes 116-123 are the subsystem's new offset, a little-endian uint64, or, in a +// file with no subsystem, the file's own: zeros or spaces, both of which MATLAB reads as none. +function assemble(file: string, headerBytes: Uint8Array, plan: Planned[], subsystem: MatRecord | null): Assembled { + const header = headerBytes.slice(); + const parts: Uint8Array[] = [header]; + const offsets: number[] = []; + let subsystemAt: number | null = null; + let at = header.byteLength; + for (const p of plan) { + const bytes = bytesOf(p); + offsets.push(at); + if (p.kind === 'verbatim' && p.record === subsystem) { + subsystemAt = at; + } + parts.push(bytes); + at += bytes.byteLength; + } + if (subsystemAt !== null) { + new DataView(header.buffer, header.byteOffset, header.byteLength).setBigUint64(116, BigInt(subsystemAt), true); + } + return { bytes: concat(parts, fileTooBig(file)), offsets, subsystemAt }; +} + +// The bytes a planned record is written as: a record of the file's own, or the ones written for it. +function bytesOf(p: Planned): Uint8Array { + return p.kind === 'verbatim' ? p.record.bytes : p.bytes; +} + +// The refusal of a file of `total` bytes, more than one buffer here holds (concat). +function fileTooBig(file: string): (total: number) => MatWriteError { + return (total) => new MatWriteError( + 'Cannot save "' + file + '": the file written for it would be ' + total + ' bytes, more than this runtime holds in one buffer. ' + + 'Nothing was written.', + ); +} + +// ---- The self-check --------------------------------------------------------------------------- +// +// The bytes about to be handed back, against the plan: the header kept, and saying where the +// subsystem now is; the records the ones planned, back to back from byte 128 to the last byte, +// each at the offset planned and framed as the reader frames one; and every record written anew +// read again by this package's reader, alone: each renamed one named as planned and, but for its +// name, its element byte for byte; each written fresh named as planned and reading back as the +// value it was written from, its class, size and every element. Any difference refuses the save. +// +// A record written as its own bytes is not read again: it is the record the file was read as, +// whole (unsavableRefusal: not one byte of it handed away since), copied by assemble at the +// offset this checks. Reading it again would read the reader's own reading of the same bytes, at +// the cost of inflating every compressed record of the file at every save. +// +// This proves what was written is what was planned, and not that MATLAB loads it: this reader +// reads files MATLAB refuses. That is refuseWorse's to ask, of the other judge. + +function selfCheck(file: string, assembled: Assembled, plan: Planned[], headerBytes: Uint8Array): void { + const fail = (why: string): never => { + throw new MatWriteError('Cannot save "' + file + '": the file written for it did not read back as written: ' + why + '. Nothing was written.'); + }; + const { bytes, offsets } = assembled; + const head = bytes.subarray(0, 128); + if (!sameBytes(head.subarray(0, 116), headerBytes.subarray(0, 116)) || !sameBytes(head.subarray(124), headerBytes.subarray(124))) { + return fail('its header is not the one it was read with'); + } + const subsystemSaid = assembled.subsystemAt ?? 0; + const offsetSaid = head.subarray(116, 124).every((b) => b === 0x20) ? 0 : Number(new DataView(head.buffer, head.byteOffset + 116, 8).getBigUint64(0, true)); + if (offsetSaid !== subsystemSaid) { + return fail('its header places its objects at byte ' + offsetSaid + ', and they are at byte ' + subsystemSaid); + } + let end = 128; + plan.forEach((p, i) => { + const record = bytesOf(p); + if (offsets[i] !== end) { + fail('a record was written at byte ' + offsets[i] + ', where the one before it ends at byte ' + end); + } + if (p.kind === 'verbatim' && record.byteLength !== p.record.length) { + fail('the record at byte ' + end + ' holds ' + record.byteLength + ' of the ' + p.record.length + ' bytes it was read as'); + } + if (!framedAsRead(record) || u32At(bytes, end) !== u32At(record, 0) || u32At(bytes, end + 4) !== u32At(record, 4)) { + fail('the record at byte ' + end + ' is not framed as the record written there'); + } + end += record.byteLength; + }); + if (end !== bytes.byteLength) { + return fail('it is ' + bytes.byteLength + ' bytes, and its records end at byte ' + end); + } + plan.forEach((p, i) => { + if (p.kind === 'verbatim') { + return; + } + const at = offsets[i]; + const got = readAlone(file, head, bytes.subarray(at, at + p.bytes.byteLength)); + if (!got || got.status !== 'read' || got.anonymous || got.name !== p.name || got.variable?.name !== p.name) { + fail('the record at byte ' + at + ', written as "' + p.name + '", reads as ' + (got?.status === 'read' ? '"' + got.name + '"' : 'no variable')); + } + if (p.kind === 'renamed') { + const unnamed = (e: Uint8Array | null | undefined) => (e && wholeElement(e) ? elementNamed(e, '') : null); + const was = unnamed(p.element); + const is = unnamed(got!.variable!._rawBytes); + if (!was || !is || !sameBytes(was, is)) { + fail('"' + p.name + '" is not, but for its name, the element it was read as'); + } + return; + } + const difference = differs(p.node._var, got!.variable, p.name); + if (difference) { + fail(difference); + } + // Global as the variable it was written for was (globalAsRead), and a variable added since not. + if (!!p.record?.variable?.isGlobal !== !!got!.variable?.isGlobal) { + const is = got!.variable?.isGlobal ? 'global, where the variable it was written for was not' : 'not global, where the variable it was written for was'; + fail('"' + p.name + '" reads back ' + is); + } + }); +} + +// Whether `record` is framed as MatParser frames a record of a file it calls framed: its tag's 8 +// bytes and exactly the bytes they declare, which for a plain record are a whole number of 8-byte +// words; and a tag that is neither the zero one the reader stops at nor a small element's. +function framedAsRead(record: Uint8Array): boolean { + if (record.byteLength < 8) { + return false; + } + const type = u32At(record, 0); + const n = u32At(record, 4); + if (8 + n !== record.byteLength) { + return false; + } + return type === MI_COMPRESSED || (n % 8 === 0 && !(type === 0 && n === 0) && !(type >>> 16 !== 0 && (type & 0xffff) !== 0)); +} + +// The one record of a file of `header` and `record`, as this package's reader reads it, or null +// where it reads that file as anything else. +function readAlone(file: string, header: Uint8Array, record: Uint8Array): MatRecord | null { + // The whole of a buffer of its own (concat), which the reader may take as it is. + const alone = concat([header, record], fileTooBig(file)); + let parsed: ParsedMat; + try { + parsed = parseMat(alone.buffer as ArrayBuffer); + } catch { + return null; + } + return parsed.framed && parsed.records.length === 1 ? parsed.records[0] : null; +} + +// Whether `element` is one miMATRIX element, its tag and exactly the bytes it declares. +function wholeElement(element: Uint8Array): boolean { + return element.byteLength >= 8 && u32At(element, 0) === MI_MATRIX && 8 + u32At(element, 4) === element.byteLength; +} + +// The bytes about to be handed back, judged by the rules MATLAB loads a file by (MatFileCheck), +// which this package's reader does not hold a file to: the save is refused when they break a rule +// the file they were read from did not break. A file that was read breaking one (two variables of +// one name, say) may still be saved, edited elsewhere, as long as the save adds nothing to it. +// Compared by rule and variable, not by offset, which every edit before a record moves; a +// variable renamed is compared under the name the file it was read from gave it. +// +// Judged where the save changed the file (violationsAddedBySplice): every record written anew and +// the record it replaces, the header, and where every record stands. A record written as its own +// bytes breaks what it broke as read, and the two are the same answer; so a save costs what it +// changed, and a file too big for the check's budget whole can still be saved where its edits +// are small. Phase 2, which writes the subsystem anew, hands it in as a record written in place of +// the subsystem's (MatSplicedRecord `replaces`), and it is checked whole as every written one is. +function refuseWorse(file: string, assembled: Assembled, plan: Planned[], headerBytes: Uint8Array, records: MatRecord[], check: MatCheckOptions): void { + const index = new Map(records.map((r, i) => [r, i] as const)); + const renamed = new Map(); + const written: MatSplicedRecord[] = plan.map((p, i) => { + if (p.kind === 'verbatim') { + return { kept: index.get(p.record)! }; + } + if (p.record?.name && p.record.name !== p.name) { + renamed.set(p.name, p.record.name); + } + const at = assembled.offsets[i]; + return { written: assembled.bytes.subarray(at, at + p.bytes.byteLength), replaces: p.record ? index.get(p.record)! : null }; + }); + const added = violationsAddedBySplice( + // A compressed record's inflate, as the reader holds it (MatVariable._rawBytes): inflateZlib's + // of the record's own bytes, so that the check does not inflate the file again. + { header: headerBytes, records: records.map((r) => ({ bytes: r.bytes, inflated: r.compressed ? r.variable?._rawBytes : null })) }, + { header: assembled.bytes.subarray(0, 128), records: written }, + renamed, + check, + ); + const broken = added.filter((v) => v.code !== 'budget'); + if (broken.length > 0) { + const more = broken.length - 1; + throw new MatWriteError( + 'Cannot save "' + file + '": the file written for it breaks a rule MATLAB loads a file by, which the file it was read ' + + 'from does not: ' + broken[0].message + (more > 0 ? ' It breaks ' + more + ' more as well.' : '') + ' Nothing was written.', + ); + } + if (added.length > 0) { + // The check stopped before it had judged all of what the save wrote: nothing is known + // broken, and nothing is known to load. + throw new MatWriteError( + 'Cannot save "' + file + '": the file written for it could not be verified within the check\'s budget against the rules ' + + 'MATLAB loads a file by (' + added[0].message.replace(/\.$/, '') + '), so it is not known to load. Nothing was written.', + ); + } +} + +// Where the value read back, `read`, is not the value `model` it was written from, in words, or +// null where it is that value: the same class, complexity, storage and size, the same members of a +// cell, the same fields of a struct in the same order, and each element the same number as its +// class holds it. MatWriter's own rules are taken as the model's meaning, not its result: an +// integer element as MATLAB converts it to the class, a single's as a float32, a member a cell or +// a struct does not hold as the empty double written for it. +function differs(model: MatVariable | null | undefined, read: MatVariable | null | undefined, at: string): string | null { + const m = model ?? EMPTY_DOUBLE; + const r = read ?? EMPTY_DOUBLE; + const cls = classOf(m); + const said = (what: string, was: string, is: string) => at + ': its ' + what + ' reads back as ' + is + ' where ' + was + ' was written'; + if (classOf(r) !== cls) { + return said('class', cls, classOf(r)); + } + const md = dimsOf(m); + if (md.join('x') !== r.dimensions.join('x')) { + return said('size', md.join('x'), r.dimensions.join('x')); + } + if (!!m.isComplex !== !!r.isComplex || !!m.isSparse !== !!r.isSparse) { + return said('storage', storageOf(m), storageOf(r)); + } + const n = md.reduce((a, b) => a * b, 1); + if (m.isSparse) { + return sparseDiffers(m, r, cls, at); + } + if (cls === 'cell') { + const mc = flatValues(m.value) as (MatVariable | null)[]; + const rc = flatValues(r.value) as (MatVariable | null)[]; + for (let i = 0; i < n; i++) { + const d = differs(mc[i], rc[i], at + '{' + (i + 1) + '}'); + if (d) { + return d; + } + } + return null; + } + if (cls === 'struct') { + const mf = m.fields ?? {}; + const rf = r.fields ?? {}; + const names = Object.keys(mf); + if (names.join(',') !== Object.keys(rf).join(',')) { + return said('fields', names.join(', ') || 'none', Object.keys(rf).join(', ') || 'none'); + } + for (let e = 0; e < n; e++) { + for (const name of names) { + const d = differs(memberOf(mf[name], e, n), memberOf(rf[name], e, n), at + (n === 1 ? '' : '(' + (e + 1) + ')') + '.' + name); + if (d) { + return d; + } + } + } + return null; + } + if (cls === 'char') { + const was = String(m.value ?? ''); + const is = String(r.value ?? ''); + return was === is ? null : said('text', JSON.stringify(was), JSON.stringify(is)); + } + const mv = flatValues(m.value); + const rv = flatValues(r.value); + if (mv.length !== n || rv.length !== n) { + return said('element count', String(mv.length), String(rv.length)); + } + const same = sameNumberFor(cls); + for (let i = 0; i < n; i++) { + for (const part of m.isComplex ? (['re', 'im'] as const) : (['re'] as const)) { + const was = partOf(mv[i], part); + const is = partOf(rv[i], part); + if (!same(was, is)) { + return said('element ' + (i + 1) + (m.isComplex ? ' (' + (part === 're' ? 'real' : 'imaginary') + ' part)' : ''), String(was), String(is)); + } + } + } + return null; +} + +// A sparse array's non-zeros, compared as a set of (row, column) to value: the order a writer +// puts them in is its own, and an explicit zero is not a non-zero MATLAB keeps. +function sparseDiffers(m: MatVariable, r: MatVariable, cls: string, at: string): string | null { + const ms = m.sparse; + const rs = r.sparse; + if (!ms || !rs) { + return at + ': it holds no non-zeros to compare'; + } + const same = sameNumberFor(cls); + const entries = (s: NonNullable) => { + const out = new Map(); + for (let k = 0; k < s.row.length; k++) { + const re = s.re[k]; + const im = s.im ? s.im[k] : 0; + if (re !== 0 || im !== 0) { + out.set(s.row[k] + ',' + s.col[k], [re, im]); + } + } + return out; + }; + const was = entries(ms); + const is = entries(rs); + if (was.size !== is.size) { + return at + ': it reads back with ' + is.size + ' non-zero(s) where ' + was.size + ' were written'; + } + for (const [where, [re, im]] of was) { + const got = is.get(where); + if (!got || !same(re, got[0]) || !same(im, got[1])) { + const [row, col] = where.split(',').map(Number); + return at + ': its non-zero at (' + (row + 1) + ',' + (col + 1) + ') does not read back as written'; + } + } + return null; +} + +const EMPTY_DOUBLE: MatVariable = { name: '', className: 'double', dimensions: [0, 0], isComplex: false, isLogical: false, value: null, fields: null }; + +const INTEGER_CLASS = /^u?int(?:8|16|32|64)$/; + +// MATLAB's class of `v`: a logical array is class uint8 with the logical flag, in a file and in +// the variable the node layer hands MatWriter. +function classOf(v: MatVariable): string { + return v.isLogical || v.className === 'logical' ? 'logical' : v.className; +} + +function storageOf(v: MatVariable): string { + return (v.isSparse ? 'sparse' : 'full') + (v.isComplex ? ' complex' : ' real'); +} + +// Whether two elements of class `cls` are the one number the class holds: an integer class's as +// MATLAB converts a value to it (integerConversion: rounded, saturated, NaN as 0), a logical's as a +// uint8, a single's as a float32, and a double's as itself, NaN equal to NaN and -0 not to 0. +function sameNumberFor(cls: string): (a: unknown, b: unknown) => boolean { + if (INTEGER_CLASS.test(cls) || cls === 'logical') { + const to = integerConversion(cls === 'logical' ? 'uint8' : cls); + return (a, b) => String(to(a)) === String(to(b)); + } + if (cls === 'single') { + return (a, b) => Object.is(Math.fround(Number(a)), Math.fround(Number(b))); + } + return (a, b) => Object.is(Number(a), Number(b)); +} + +// One part of a numeric element: a complex one is `{re, im}`, and a real one its real part, with +// an imaginary part of 0. +function partOf(x: unknown, part: 're' | 'im'): unknown { + if (x !== null && typeof x === 'object' && 're' in (x as Record)) { + return (x as Record)[part]; + } + return part === 're' ? x : 0; +} + +// Element `e` of `n` of a struct field: a struct array holds one variable per element, a 1x1 +// struct the variable itself (MatVariable.fields). +function memberOf(held: MatVariable | MatVariable[] | undefined, e: number, n: number): MatVariable | undefined { + return Array.isArray(held) ? held[e] : n === 1 ? held : undefined; +} + +// A MAT element has at least two dimensions; a variable may say fewer (MatWriter.dimsOf). +function dimsOf(v: MatVariable): number[] { + const d = (v.dimensions || []).slice(); + while (d.length < 2) { + d.push(1); + } + return d; +} + +// The values of a variable as one list: MatParser leaves a 1x1 a bare value and an empty one null. +function flatValues(value: unknown): unknown[] { + if (value === null || value === undefined) { + return []; + } + return Array.isArray(value) ? value : [value]; +} + +// ---- Bytes ------------------------------------------------------------------------------------ + +// `parts`, back to back in a buffer of their own; or, past the most bytes the runtime holds in one +// buffer, `tooBig`'s refusal of that many, rather than the RangeError the runtime throws, which +// says nothing of what was being written. +function concat(parts: Uint8Array[], tooBig: (total: number) => MatWriteError): Uint8Array { + let total = 0; + for (const p of parts) { + total += p.byteLength; + } + let out: Uint8Array; + try { + out = new Uint8Array(total); + } catch (e) { + if (e instanceof RangeError) { + throw tooBig(total); + } + throw e; + } + let at = 0; + for (const p of parts) { + out.set(p, at); + at += p.byteLength; + } + return out; +} + +function u32le(n: number): Uint8Array { + const out = new Uint8Array(4); + new DataView(out.buffer).setUint32(0, n >>> 0, true); + return out; +} + +function u32At(bytes: Uint8Array, at: number): number { + return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(at, true); +} + +function sameBytes(a: Uint8Array, b: Uint8Array): boolean { + if (a.byteLength !== b.byteLength) { + return false; + } + for (let i = 0; i < a.byteLength; i++) { + if (a[i] !== b[i]) { + return false; + } + } + return true; +} diff --git a/src/datamodel/parser/MatParser.ts b/src/datamodel/parser/MatParser.ts index 62085225..4b78c275 100644 --- a/src/datamodel/parser/MatParser.ts +++ b/src/datamodel/parser/MatParser.ts @@ -52,6 +52,13 @@ export interface MatVariable { // them. It is what MatWriter writes sparse storage on (encodeSparse), since writing the // array full would change the variable's storage in the file. Absent on everything else. isSparse?: boolean; + // The array flags' global bit (0x04 of the flags byte): `save` sets it on a variable declared + // global, on its top-level element and on no element nested in it (measured against MATLAB + // R2027a, test/fixtures/global/make_global_fixtures.m), and `load(f)` declares such a + // variable global again. It is the workspace variable's, not its value's, so no writer of a + // value writes it: the MAT-file save sets it on the element it writes for the variable that + // had it (MatFileWriter). Absent when the bit is clear. + isGlobal?: boolean; // A sparse array's non-zeros, which are all of it: a sparse array is never held as a // dense list, so what it costs is what it holds. Its `value` is its summary, // `<10000000x2 sparse double>`, which a host that renders values without knowing this @@ -117,6 +124,62 @@ export interface ParsedMat { // back without it — see test/parseWarnings.test.ts, which pins the near-misses as // firmly as the warnings. warnings: ParseWarning[]; + // What a save of this file splices (MatNode keeps them all): the header's 128 bytes, + // every record in it, and whether those records are the file, byte for byte. + // + // A view of the input, as every record's bytes are, so nothing is copied: what a save + // writes for a variable nobody edited is the bytes it was read from, and for a + // compressed one that is the only way to write it byte-identical. MATLAB deflates in + // a way a recompression does not reproduce: inflated and deflated again by fflate at + // level 6, 18 of the 78 records of test/parity/artifacts/mat/cases.mat came back as + // they were. + headerBytes: Uint8Array; + // Header bytes 116-123: the absolute offset of the subsystem record's tag, which MATLAB + // trusts without a scan (measured against MATLAB R2027a: a stale offset fails the + // whole load). 0 when the file has no subsystem, which 8 spaces also mean. + subsystemOffset: number; + // Every top-level record, in file order, the ones this reader read and the ones it + // could not or would not (`status`). A save that writes only the variables it holds + // drops the rest without a word, and a record that will not inflate here may still + // be one MATLAB reads. + records: MatRecord[]; + // Whether the records tile [128, end of file) exactly as MATLAB frames them: a + // compressed record is its 8-byte tag and payload, with no padding after it, and a + // plain one is padded out to an 8-byte boundary (MatRecord.length). False for a + // record the file cuts short, for bytes after the last record, and for a stop at a + // zero tag with bytes left; `unframed` says where and why. Only bytes that are + // framed can be spliced: past the first byte that is not, the reader and MATLAB may + // not agree on what the records are. + framed: boolean; + unframed: { at: number; reason: string } | null; +} + +/** + * One top-level record of a MAT-file, in the file's own bytes: a variable, the subsystem + * that holds the file's objects, or a record this reader did not read. + */ +export interface MatRecord { + // Where its tag starts, and how many bytes it covers: its tag and payload, and for a + // plain record its padding to the next 8-byte boundary, as far as the file holds them. + offset: number; + length: number; + // Those bytes, a view of the input. + bytes: Uint8Array; + // An miCOMPRESSED record, whose payload is a zlib stream of one miMATRIX. + compressed: boolean; + // The element's name, '' for an unnamed one (`anonymous`), and null when no element + // could be read out of the record. + name: string | null; + // An element with no name: the subsystem, which MATLAB writes unnamed and last, or + // one this reader read too little of to find its name. + anonymous: boolean; + // 'read' when the reader made a variable of it (`variable`); 'dropped' when it did + // not, with the warning's text for why. + status: 'read' | 'dropped'; + reason?: string; + // The variable the reader made of it, the one in `ParsedMat.variables`, by identity: + // what MatNode looks a node's record up by. Null for a dropped record. + variable: MatVariable | null; } interface SubElement { @@ -1021,6 +1084,9 @@ export function parseMatrix(view: DataView, baseOffset: number, length: number, if (isSparse) { result.isSparse = true; } + if (flags & 0x04) { + result.isGlobal = true; + } // Past MAX_NESTING levels a matrix is recorded with its class, size and name, and nothing in // it is read. What holds it keeps its bytes, as for every value this reader does not decode: @@ -1332,7 +1398,14 @@ export function parseMatrix(view: DataView, baseOffset: number, length: number, // elements had 10,000 empty rows, and a 104 KB file holding 1,000 of them ran a // 512 MB heap out while it opened. MATLAB writes every field of every element, so an // array it wrote has every list already. - if (totalElements > 1) { + // + // So is every field of an array of NO element, each with its empty list: its names + // are all there is of it, `struct('a', {})` being a 0x0 struct with a field `a`. It + // held `{}`, and a writer writes the names a variable holds, so a .mat save of one + // and a copy of one into a dictionary's stream wrote a struct of no field (measured + // against MATLAB R2027a: the 0x0 a .mat save wrote for it loaded with fieldnames {}, + // where the file's had {'a'}). + if (totalElements !== 1) { for (const fn of fieldNames) { if (!Object.prototype.hasOwnProperty.call(fields, fn)) { setOwn(fields, fn, []); @@ -1418,6 +1491,22 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { const readShort = new Set(); let offset = 128; + // The file's records as a save splices them (ParsedMat.records), and the first place + // they stop tiling the file, if they do. Kept beside the walk rather than by it: the + // walk steps 8 + nbytes past every record, as it always has, and that is MATLAB's step + // for every record but a plain one whose nbytes is not a multiple of 8, which MATLAB + // pads and the walk does not. No file MATLAB wrote under test/ holds one, an miMATRIX's + // nbytes counting its sub-elements' padding, so a file that does is left unframed + // rather than walked a second way. + const records: MatRecord[] = []; + let unframed: { at: number; reason: string } | null = null; + const unframe = (at: number, reason: string) => { unframed ??= { at, reason }; }; + const dropped = (record: MatRecord, warning: ParseWarning) => { + record.status = 'dropped'; + record.reason = warning.message; + warnings.push(warning); + }; + // The name to blame a short record on — empty for the unnamed element every MCOS // file carries, which has no name to give. const nameFor = (variable: MatVariable) => (variable._anonymous ? '' : variable.name); @@ -1434,14 +1523,21 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { message: `The file ends with ${buf.length - offset} byte(s) where a record header needs 8, ` + 'so anything stored after the last variable read was not read.', }); + unframe(offset, `the file ends ${buf.length - offset} byte(s) into a record's tag`); break; } const dataType = view.getUint32(offset, true); const numBytes = view.getUint32(offset + 4, true); // The format's own end-of-variables marker. NOT a warning: a file that ends - // where it says it ends has been read completely. - if (dataType === 0 && numBytes === 0) { break; } + // where it says it ends has been read completely. Not a record either, and the + // file is not framed: measured against MATLAB R2027a, a file whose last variable is + // followed by 8 zero bytes fails to load, as one followed by 3 or 100 does. + if (dataType === 0 && numBytes === 0) { + unframe(offset, `a zero tag at byte ${offset} is no record, and it and the ${buf.length - offset - 8} byte(s) ` + + 'after it are not read'); + break; + } // A record may declare more bytes than the file holds. Everything below clamps // rather than throwing (see readSubelement), so the variable still opens — @@ -1451,7 +1547,41 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { const missing = offset + 8 + numBytes - buf.length; let shortened = ''; - if (dataType === MI_COMPRESSED) { + const isCompressed = dataType === MI_COMPRESSED; + const extent = 8 + (isCompressed ? numBytes : align8(numBytes)); + const length = Math.min(extent, buf.length - offset); + const record: MatRecord = { + offset, + length, + bytes: buf.subarray(offset, offset + length), + compressed: isCompressed, + name: null, + anonymous: false, + status: 'read', + variable: null, + }; + records.push(record); + if (length < extent) { + unframe(offset, `the record at byte ${offset} needs ${extent} bytes and the file holds ${length}`); + } else if (!isCompressed && numBytes % 8 !== 0) { + unframe(offset, `the plain record at byte ${offset} declares ${numBytes} bytes, which is not a whole ` + + 'number of 8-byte words'); + } else if ((dataType >>> 16) !== 0 && (dataType & 0xFFFF) !== 0) { + // Both halves of the type word set: a small data element's tag, the form a + // short sub-element is written in. This reader steps over it as 8 + its second + // word, which is not how that form is laid out, and MATLAB is not known to step + // over one at all at the top of a file. + unframe(offset, `the record at byte ${offset} has a small data element's tag`); + } + // The variable read out of this record, whose record it is (MatNode binds the + // node made of it to the record by it). + const readAs = (variable: MatVariable) => { + record.variable = variable; + record.name = variable._anonymous ? '' : variable.name; + record.anonymous = !!variable._anonymous; + }; + + if (isCompressed) { const compressed = buf.slice(offset + 8, offset + 8 + numBytes); let pako: Uint8Array; try { @@ -1464,7 +1594,7 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { // one unreadable record is one variable, not the file. A record that would // inflate past the ceiling for one record (MAT_RECORD_INFLATE_CEILING) is // unreadable the same way, and is never read cut to the ceiling. - warnings.push({ + dropped(record, { code: 'part-unreadable', message: err instanceof InflateCeilingError ? `A compressed record at byte ${offset} inflates to more than the ${err.ceiling}-byte ceiling ` @@ -1485,7 +1615,7 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { const innerType = tagged ? deView.getUint32(0, true) : 0; const innerBytes = tagged ? deView.getUint32(4, true) : 0; if (!tagged) { - warnings.push({ + dropped(record, { code: 'part-unreadable', message: `A compressed record at byte ${offset} inflates to ${deView.byteLength} bytes, fewer than the 8 ` + "of a data element's tag, so the variable it holds was not read.", @@ -1498,6 +1628,7 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { } else { variables.push({ name: '', className: '', dimensions: [], isComplex: false, isLogical: false, value: null, fields: null, _rawBytes: new Uint8Array(pako.buffer, pako.byteOffset, pako.byteLength), _anonymous: true }); } + readAs(variables[variables.length - 1]); shortened = nameFor(variables[variables.length - 1]); // The record's warning below, one level in. The matrix's own tag in the // payload may claim more bytes than the payload holds, as a record may claim @@ -1519,7 +1650,7 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { warnings.push(short); } } else { - warnings.push({ + dropped(record, { code: 'part-unreadable', message: `A compressed record at byte ${offset} holds a data element of type ` + `${innerType} where a variable has to be a matrix, so it was not read.`, @@ -1533,11 +1664,12 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { } else { variables.push({ name: '', className: '', dimensions: [], isComplex: false, isLogical: false, value: null, fields: null, _rawBytes: buf.slice(offset, offset + 8 + numBytes), _anonymous: true }); } + readAs(variables[variables.length - 1]); shortened = nameFor(variables[variables.length - 1]); } else { // Only miCOMPRESSED and miMATRIX carry a variable at this level. Anything // else was skipped, and a whole variable's worth of file went with it. - warnings.push({ + dropped(record, { code: 'part-unreadable', message: `A data element of type ${dataType} at byte ${offset} is not a variable, ` + 'so it was not read.', @@ -1567,7 +1699,26 @@ export function parseMat(arrayBuffer: ArrayBuffer): ParsedMat { collectUndecoded(variable, variable.name || '', warnings, readShort); } - return { header, variables, warnings }; + return { + header, + variables, + warnings, + headerBytes: buf.subarray(0, 128), + subsystemOffset: subsystemOffsetOf(buf, view), + records, + framed: unframed === null, + unframed, + }; +} + +// Header bytes 116-123 as a number: a little-endian uint64, or 0 when they are 8 spaces, +// which MATLAB reads as no subsystem as it does 8 zero bytes. An offset past 2^53 is +// past any file this reads, and is kept as the nearest double, which no record starts at. +function subsystemOffsetOf(buf: Uint8Array, view: DataView): number { + if (buf.subarray(116, 124).every((b) => b === 0x20)) { + return 0; + } + return Number(view.getBigUint64(116, true)); } /** diff --git a/src/datamodel/parser/MatWriter.ts b/src/datamodel/parser/MatWriter.ts index 2dda6271..ca739969 100644 --- a/src/datamodel/parser/MatWriter.ts +++ b/src/datamodel/parser/MatWriter.ts @@ -1099,12 +1099,42 @@ function ownElement(raw: Uint8Array): Uint8Array | null { return concat([u32le(MI_MATRIX), u32le(body.length), body]); } +/** + * The miMATRIX element `raw` holds as read, named `name`: the inverse of ownElement, for a + * variable of a MAT-file, which carries its name in its element as a stream's value does not. + * Every byte but the name subelement's is copied, and the element's size restated, so a + * variable renamed and saved is the value it was, byte for byte, whatever this writer would + * write for it. Null when the bytes are not a whole element whose name this can find. + * + * An MCOS object's element (class 17) is renamed as well: its name comes straight after its + * array flags, with no dimensions before it, and then the type system's name and the object's + * class, which are kept. Measured against MATLAB R2027a: the file's subsystem holds no + * variable's name, so an object variable renamed this way loads as the same object, a + * Simulink.Parameter and a string alike. + * + * The name is written as MATLAB writes one, miINT8 with its UTF-8 bytes, in the small form + * when it is 1 to 4 bytes long (element). + */ +export function elementNamed(raw: Uint8Array, name: string): Uint8Array | null { + const at = ownElementName(raw, true); + if (!at) { + return null; + } + const named = element(MI_INT8, new TextEncoder().encode(name)); + const body = concat([raw.slice(8, at.nameAt), named, raw.slice(at.nameAt + at.name, at.end)]); + return concat([u32le(MI_MATRIX), u32le(body.length), body]); +} + /** * Where the name subelement of the miMATRIX element `raw` holds is, and where the element * ends; null when the bytes are not a whole one ownElement can re-frame. Read, not built, so * it can be asked of every member before a write (refuseDimsBelow). + * + * An MCOS object's element has no stream of its own (matStreamOfElement), so it is found only + * when `opaque` is set, for a variable's rename (elementNamed): its name is the subelement + * after its flags, where any other class has its dimensions. */ -function ownElementName(raw: Uint8Array): { nameAt: number; name: number; end: number } | null { +function ownElementName(raw: Uint8Array, opaque = false): { nameAt: number; name: number; end: number } | null { if (raw.length < 8) { return null; } @@ -1126,12 +1156,13 @@ function ownElementName(raw: Uint8Array): { nameAt: number; name: number; end: n return 8 + n + ((8 - (n % 8)) % 8); }; const flags = subLength(8); - if (!flags || raw[16] === 17) { + const isOpaque = raw[16] === 17; + if (!flags || (isOpaque && !opaque)) { return null; } - const dims = subLength(8 + flags); + const dims = isOpaque ? 0 : subLength(8 + flags); const nameAt = 8 + flags + dims; - const name = dims ? subLength(nameAt) : 0; + const name = dims || isOpaque ? subLength(nameAt) : 0; if (!name || nameAt + name > end) { return null; } diff --git a/src/datamodel/parser/SparseData.ts b/src/datamodel/parser/SparseData.ts index bdd0e374..3888cb92 100644 --- a/src/datamodel/parser/SparseData.ts +++ b/src/datamodel/parser/SparseData.ts @@ -17,7 +17,7 @@ // Parser-layer, so it imports nothing from the display or the node layer: MatParser // produces one of these, MatWriter consumes one, and the node layer edits one. -import { formatComplexNum, parseComplexNum, parseMatlabNum } from './XmlUtils.js'; +import { formatComplexNum, formatMatlabNum, parseComplexNum, parseMatlabNum } from './XmlUtils.js'; /** * The non-zeros of a sparse array: entry k is at 0-based (row[k], col[k]) and holds re[k] @@ -104,15 +104,25 @@ export function unbackedColumns(s: SparseData, dims: number[]): string | null { /** * One complex element as the node layer holds it, `1+2i`, `3-4i`, `1NaNi`, `1+Infi`: - * XmlUtils.formatComplexNum's spelling. The one spelling of an element of a complex array - * read out of MAT bytes, full or sparse (MatlabVariableNode._createFromMatNumeric), so the - * two show a value the same way, and the same way a binary dictionary's text shows it. + * XmlUtils.formatComplexNum's spelling, a -0 part's sign kept. The one spelling of an element + * of a complex array read out of MAT bytes, full or sparse (MatlabVariableNode. + * _createFromMatNumeric), so the two show a value the same way, and the same way a binary + * dictionary's text shows it. * Through 1.40.0 each part was String()'d, so an infinite part read `Infinity`, which MATLAB * neither writes nor reads (`{1+Infinityi}` is "Unrecognized function or variable * 'Infinityi'", R2027a): a text dictionary's complex(1, Inf) showed `1+Infinityi` beside * its binary twin's `1+Infi`. parseComplexNum still reads that spelling back. */ export function complexElement(re: number | string, im: number | string): string { + // A part of -0 keeps its sign, which formatComplexNum does not spell (String(-0) is `0`): the + // text is the value (MatlabVariableNode._buildVarObject writes the array from it), so a .mat's + // `-3i`, complex(-0, -3), written again was complex(0, -3). It reads `-0-3i`, as the same value + // out of a binary dictionary's `-0.0-3.0i` does, and an imaginary -0 shows with a `+` + // (XmlUtils.shownComplexText). + if (Object.is(re, -0) || Object.is(im, -0)) { + const part = (x: number | string) => (Object.is(x, -0) ? '-0' : formatMatlabNum(x)); + return part(re) + (Number(im) >= 0 && !Object.is(im, -0) ? '+' : '') + part(im) + 'i'; + } return formatComplexNum(re, im); } diff --git a/src/index.ts b/src/index.ts index ff294665..ef368959 100644 --- a/src/index.ts +++ b/src/index.ts @@ -148,6 +148,8 @@ export type { export type { ParsedSlx, BlockParamUsage } from './datamodel/parser/SlxParser.js'; export type { ParsedMdl } from './datamodel/parser/MdlParser.js'; export type { ParsedMat, MatVariable } from './datamodel/parser/MatParser.js'; +// One record of a MAT-file as ParsedMat.records holds it, and as MatNode keeps it for a save. +export type { MatRecord } from './datamodel/parser/MatParser.js'; // A sparse array's non-zeros, which is how MatVariable holds one (`sparse`): named for // the same reason, since a consumer reading a sparse variable reads this. export type { SparseData } from './datamodel/parser/SparseData.js'; diff --git a/test/budgetFailsClosed.test.ts b/test/budgetFailsClosed.test.ts index c2afa256..69ca64c7 100644 --- a/test/budgetFailsClosed.test.ts +++ b/test/budgetFailsClosed.test.ts @@ -130,9 +130,16 @@ describe('past the budget, a paste, a copy and a save fail, and nothing is writt // Unedited, each member is the bytes it was read from and costs nothing; edited, it is // encoded from its non-zeros, and 999 of its columns no data backs, 3,996 bytes apiece. const member = sparseVar({ name: '', dimensions: [1000, 1000], ir: [0], jc: [0, 1], real: [5], nzmax: 1, sparseFlag: true }); - const c: any = createSession().addMatSource('c.mat', matFile([cellVar('c', Array.from({ length: 4199 }, () => member))])).children[0]; + const mat: any = createSession().addMatSource('c.mat', matFile([cellVar('c', Array.from({ length: 4199 }, () => member))])); + const c: any = mat.children[0]; expect(thrownBy(() => copyOf(c))[0]).toBeNull(); + // Taken out of the .mat to be edited: a member's column index is short of its columns, which + // MATLAB does not load, so the file takes no edit of it (MatFileWriter.freshRefusal); on its + // own, the node takes it, and is put back to be copied. + expect(c.children[0].children[0].setProperty('Value', '7')).toMatchObject({ error: true }); + mat.removeChild(c); for (const m of c.children) expect(m.children[0].setProperty('Value', '7')).toBe(true); + mat.addChild(c); const [thrown, ms] = thrownBy(() => copyOf(c)); expect([thrown?.name, thrown?.message, ms < 5000]).toEqual([ 'MatBudgetError', diff --git a/test/complexMcosFixtures.test.ts b/test/complexMcosFixtures.test.ts index 7f1f793c..595262a3 100644 --- a/test/complexMcosFixtures.test.ts +++ b/test/complexMcosFixtures.test.ts @@ -416,9 +416,37 @@ const editableIn = (p: unknown): unknown[] => { return seen; }; const withoutEditable = (p: unknown): unknown => JSON.parse(JSON.stringify(p, (k, v) => (EDITABLE_KEYS.has(k) ? undefined : v))); +// And the way the .mat's own may: its save writes an object only as it was read, so every row of +// an object there, and of a variable holding one, is shown and not edited (MatNode._editRefusal), +// where a model workspace and a binary dictionary edit it. So at such a path, and only there, the +// .mat's side alone is taken as the file would present it without that rule (its gate answering +// nothing, `ungated`), which the other venue is held to, editors and all, as it was before the +// gate; and what the .mat presents is held to that with every editor taken out of both: the +// flags, the Name and Value cells' own, and an editable column's cell (BaseNode.toRow), which is +// its text when it takes none. +const EDITABILITY_KEYS = new Set(['valueEditable', '_valueEditable', '_descriptionEditable']); +const withoutEditability = (p: unknown): unknown => + JSON.parse( + JSON.stringify(p, (k, v) => { + if (EDITABILITY_KEYS.has(k)) { + return undefined; + } + if (v && typeof v === 'object' && !Array.isArray(v) && 'editable' in v) { + return k === 'Name' || k === 'Value' ? { ...v, editable: undefined } : v.text; + } + return v; + }), + ); describe('every value presents the same in the .mat as in each other venue that holds it', () => { const mat = MAT.variables(); + const ungated = MAT.variables(); + ungated._editRefusal = () => null; + // Whether the variable `path` is in, or under, is an object or holds one, by MATLAB's record. + const holdsObject = (path: string) => { + const root = path.split(/[.({]/)[0]; + return Object.entries(MAT.truth.paths).some(([p, t]) => t.isobject && (p === root || /^[.({]/.test(p.slice(root.length)) && p.startsWith(root))); + }; for (const fx of FIXTURES.slice(1)) { const variables = fx.variables(); const shared = Object.keys(fx.truth.paths).filter((p) => { @@ -427,6 +455,9 @@ describe('every value presents the same in the .mat as in each other venue that }); it(`${fx.file} shares values with the .mat`, () => { expect(shared.length).toBeGreaterThan(0); + // Of objects, compared with the .mat as it would present them ungated, and plain values, + // compared with the .mat as it is. + expect([shared.some(holdsObject), shared.some((p) => !holdsObject(p))]).toEqual([true, true]); }); for (const path of shared) { const pins = [pinnedAt(MAT.file, path), pinnedAt(fx.file, path)]; @@ -447,14 +478,22 @@ describe('every value presents the same in the .mat as in each other venue that if (text) { expect(editableIn(presentation(b, b.displayName)), `${path}: a MAT stream, display-only`).not.toContain(true); } + // What the other venue is held to: the .mat as it presents, or at an object's path as it + // would without its save's rule, of which the .mat's own differs only by its editors. + let mine = a; + if (holdsObject(path)) { + mine = nodeAt(ungated, path); + expect(withoutEditability(shown(a)), `${path}: the .mat, but for its editors`).toEqual(withoutEditability(shown(mine))); + expect(editableIn(presentation(a, a.displayName)), `${path}: the .mat's value of an object, display-only`).not.toContain(true); + } if (pins.some(Boolean)) { // A pinned venue is held to its pin, and an unpinned one has been graded against // MATLAB above; what is left to say is that the pin is still needed. [a, b].forEach((n, i) => pins[i] && expect(n.displayValue, path).toBe(pins[i]![2])); - expect(shown(b), `${path}: pinned, and no longer different`).not.toEqual(shown(a)); + expect(shown(b), `${path}: pinned, and no longer different`).not.toEqual(shown(mine)); return; } - expect(shown(b)).toEqual(shown(a)); + expect(shown(b)).toEqual(shown(mine)); }); } } diff --git a/test/complexTextWriteBack.test.ts b/test/complexTextWriteBack.test.ts index f43a7862..462fb5f3 100644 --- a/test/complexTextWriteBack.test.ts +++ b/test/complexTextWriteBack.test.ts @@ -146,9 +146,14 @@ describe('an edited complex value keeps its class and its NaN parts', () => { const txt: any = ingest(session, fixture('complex.sldd'), { filename: 'complex.sldd' }); const design = txt.getSection('design'); // Edited before the copy: in the text dictionary the copied Value is a MAT stream, which - // is shown and not edited there (the C-012 ruling, 2026-10-15). + // is shown and not edited there (the C-012 ruling, 2026-10-15). And taken out of the .mat + // to be edited: its save writes an object only as it was read, so the file takes no edit of + // its properties (MatNode._editRefusal); on its own, the node takes it, and is put back to be copied. const source = mat.children.find((e: any) => e.name === name); + expect(source.children[0].children[k].setProperty('Value', typed)).toMatchObject({ error: true }); + mat.removeChild(source); expect(source.children[0].children[k].setProperty('Value', typed)).toBe(true); + mat.addChild(source); const payload: any = JSON.parse(JSON.stringify(source.serialize())); payload.name = name + '_edited'; payload.metadata = { ...design.children[0].metadata, uuid: '00000000-0000-4000-8000-0000000000ff' }; diff --git a/test/emptyCopiesReadback.test.ts b/test/emptyCopiesReadback.test.ts new file mode 100644 index 00000000..deaab1aa --- /dev/null +++ b/test/emptyCopiesReadback.test.ts @@ -0,0 +1,54 @@ +// Copyright 2026 The MathWorks, Inc. +// +// A copy of a struct array of no element with fields, and of a complex empty, pasted into a text +// and a binary dictionary, as MATLAB reads it back: as `load` reads the .mat variable it was +// copied from, its field names and its complexity kept, as an entry's value, a struct field and a +// cell's element, copied as read and once marked edited. +// +// parity/matlab/empty_copies_readback.mjs makes the saves through core's API from MATLAB's own +// variables (fixtures/display/dispcat.mat), into sparse_text.sldd and sparse_binary.sldd; +// parity/matlab/probe_empty_copies_readback.m had MATLAB R2027a reopen them and wrote what it read, +// beside what `load` reads of each variable, to parity/matlab/empty_copies_readback.truth.json. +// This test makes the same saves from the package's source and asks that each value is still +// written as MATLAB read it, so that a change to the spelling fails here until MATLAB is asked +// again. test/emptyNamesAndComplexityCopy.test.ts holds the spellings and the other venues. +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { createSession, ingest } from '../src/index.js'; +import { emptyCopiesReadback, PLACES, VARIABLES } from './parity/matlab/empty_copies_readback.mjs'; +import './../src/datamodel/node/data/NodeClassMap.js'; + +type Shape = { class: string; size: number[]; isreal: boolean; fields: string[] }; +type Case = { file: string; format: string; variable: string; edited: boolean; place: string; entry: string; fragment: string; matlab: Shape | { error: string }; loaded: Shape }; + +const at = (rel: string) => fileURLToPath(new URL(rel, import.meta.url)); +const TRUTH: { version: string; release: string; cases: Case[] } = JSON.parse(readFileSync(at('./parity/matlab/empty_copies_readback.truth.json'), 'utf8')); +const read = (rel: string) => new Uint8Array(readFileSync(at('./fixtures/' + rel))); + +describe('a copy of an empty struct with fields, and of a complex empty, pasted into a dictionary, as MATLAB reads it back', () => { + const { cases } = emptyCopiesReadback({ createSession, ingest }, read); + + it('MATLAB read every place of every save as load reads the variable', () => { + expect(TRUTH.release).toBe('2027a'); + expect(TRUTH.cases.length).toBe(2 * VARIABLES.length * 2 * PLACES.length); + for (const c of TRUTH.cases) { + expect(c.matlab, `${c.file} ${c.entry} ${c.variable} ${c.place}`).toEqual(c.loaded); + } + // What load reads: field names for each struct, and complexity for each numeric empty. + const loaded = new Map(TRUTH.cases.map((c) => [c.variable, c.loaded])); + expect([...loaded.entries()].map(([v, s]) => [v, s.class, s.size, s.fields, s.class === 'struct' || s.isreal])).toEqual([ + ['dx_struct_0x0_fields', 'struct', [0, 0], ['a'], true], + ['dx_struct_1x0', 'struct', [1, 0], ['a'], true], + ['dx_complex_0x0', 'double', [0, 0], [], false], + ['dx_complex_1x0', 'double', [1, 0], [], false], + ['dx_complex_int16_1x0', 'int16', [1, 0], [], false], + ['e_single_complex_1x0', 'single', [1, 0], [], false], + ]); + }); + + it('and core still writes the values MATLAB read', () => { + const asked = TRUTH.cases.map(({ file, format, variable, edited, place, entry, fragment }) => ({ file, format, variable, edited, place, entry, fragment })); + expect(cases).toEqual(asked); + }); +}); diff --git a/test/emptyNamesAndComplexityCopy.test.ts b/test/emptyNamesAndComplexityCopy.test.ts new file mode 100644 index 00000000..63fe0440 --- /dev/null +++ b/test/emptyNamesAndComplexityCopy.test.ts @@ -0,0 +1,226 @@ +// Copyright 2026 The MathWorks, Inc. +// +// A struct array of no element keeps its field names, and an empty array its complexity, +// wherever a value read out of MAT bytes goes: copied into a text or a binary dictionary, at +// rank 2 and N-D, alone and as a member of a cell or a struct, edited or not, and written again +// as a text dictionary's own stream. +// +// `struct('a', {})` is a 0x0 struct with a field `a`, and its names are all there is of it. +// MatParser held `fields: {}` for a struct array of no element, so every writer wrote a struct +// of no field: a .mat save (MATLAB R2027a loaded it with fieldnames {}, the live gate's +// sibling_struct_field), a copy's MAT stream (cdata in a text dictionary), and a copy's bag, +// which named its fields from its element rows, of which it has none (`

` in a binary dictionary). And a complex empty is complex only by what it was +// read as (MatlabVariableNode._elementType), which the writers did not ask: an edited N-D one's +// stream was real, and a copy of a rank-2 one was the literal `[]`, which a binary dictionary +// wrote as `Class="double" Dimension="0*0"`, losing its complexity, and a single's class and its +// 0x3 with it. +// +// Where MATLAB has a spelling that keeps them, the copy is held to MATLAB's own bytes: a binary +// dictionary's `` of an empty struct and `IsComplex="1"` of an empty +// (dispcat_bin.sldd, written by MATLAB from the variables of dispcat.mat). MATLAB's own text +// dictionary spells both as what loses them (`{"_type": "struct", "_value": "[]"}`, `[]`; +// dispcat_text.sldd), so there a struct's copy is the bag of its names and an empty's its MAT +// stream, which hold them. MATLAB R2027a reads each back, in both, as `load` reads the .mat +// variable (test/emptyCopiesReadback.test.ts, parity/matlab/probe_empty_copies_readback.m). +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { strFromU8, strToU8, unzipSync } from 'fflate'; +import { createSession } from '../src/index.js'; +import { ingest } from '../src/core/ingest.js'; +import { uudecode } from '../src/datamodel/parser/CdataCodec.js'; +import { CLASS, cellVar, matFile, numericVar, sparseVar, structVar } from './tools/matBytes.js'; +import { elementValue, type ElementValue } from './tools/matElements.js'; +import { BINARY, TEXT, copyOf, sparseFixture } from './tools/pasteVenues.js'; +import '../src/datamodel/node/data/NodeClassMap.js'; + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +const fixture = (rel: string) => new Uint8Array(readFileSync(fileURLToPath(new URL('./fixtures/' + rel, import.meta.url)))); +const arrayBufferOf = (u8: Uint8Array) => u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength) as ArrayBuffer; + +const es = (dims: number[]) => structVar('', ['a', 'bb'], [], dims); +const cx = (dims: number[], cls: number = CLASS.DOUBLE) => numericVar({ name: '', cls, dimensions: dims, real: [], imag: [] }); +const one = numericVar({ name: '', cls: CLASS.DOUBLE, dimensions: [1, 1], real: [1] }); +const sp = sparseVar({ name: '', dimensions: [1, 1], ir: [0], jc: [0, 1], real: [5] }); + +// Every place a struct of no element and a complex empty can stand in a .mat. +const FILE = matFile([ + structVar('es00', ['a', 'bb'], [], [0, 0]), + structVar('es10', ['a', 'bb'], [], [1, 0]), + structVar('esNd', ['a', 'bb'], [], [0, 0, 2]), + numericVar({ name: 'cx00', cls: CLASS.DOUBLE, dimensions: [0, 0], real: [], imag: [] }), + numericVar({ name: 'cx03s', cls: CLASS.SINGLE, dimensions: [0, 3], real: [], imag: [] }), + numericVar({ name: 'cxNd', cls: CLASS.DOUBLE, dimensions: [0, 0, 2], real: [], imag: [] }), + cellVar('cNd', [es([0, 0]), cx([1, 0])], [1, 1, 2]), + cellVar('cSp', [es([0, 0]), cx([1, 0]), sp], [1, 3]), + structVar('s', ['es', 'cx', 'x', 'sp'], [{ es: es([0, 0]), cx: cx([0, 0]), x: one, sp }]), + structVar('sNd', ['es', 'cx'], [{ es: es([0, 0]), cx: cx([0, 0]) }, { es: es([1, 0]), cx: cx([0, 0], CLASS.INT16) }], [1, 1, 2]), +]); + +/** The variable `name` of FILE, opened as a host opens it, marked edited first when `edited`. */ +function variable(name: string, edited = false): any { + const root: any = createSession().addMatSource('v.mat', FILE); + const node = root.children.find((c: any) => c.name === name); + if (edited) { + // The mark an edit and its undo leave (DataNode._valueEdited): the value rebuilt from its rows. + node._markModified(); + } + return node; +} + +/** What a MAT stream (a cdata `_value`) holds, read by the test's own walker. */ +const streamOf = (cdata: { _value: string }): ElementValue => elementValue(uudecode(cdata._value).subarray(8)); + +let seq = 0; + +/** + * `value` pasted into a fresh `file`, saved and opened again: the entry's value as written (the + * JSON of a text dictionary's entry; a binary one's `

` block, whitespace + * folded) and the entry reopened. + */ +function pasteSaved(file: string, value: unknown): { written: any; entry: any } { + const session = createSession(); + const root: any = ingest(session, sparseFixture(file), { filename: file }); + root.getSection('design').parseEntry({ name: 'pasted', metadata: { uuid: `00000000-0000-4000-e900-${String(++seq).padStart(12, '0')}` }, value }); + const out = session.serializeSource(root.name)!; + const bytes = out.kind === 'text' ? strToU8(out.text!) : out.bytes!; + let written: any; + if (out.kind === 'text') { + const find = (x: any): any => (x && typeof x === 'object' ? (x.name === 'pasted' && 'value' in x ? x : Object.values(x).map(find).find(Boolean)) : null); + written = find(JSON.parse(out.text!)).value; + } else { + written = valueBlock(strFromU8(unzipSync(bytes)['data/chunk0.xml']), 'pasted'); + } + const reopened: any = ingest(createSession(), arrayBufferOf(bytes), { filename: file }); + return { written, entry: reopened.getSection('design').children.find((e: any) => e.name === 'pasted') }; +} + +/** An entry's `

` block in a binary dictionary's chunk, whitespace folded. */ +function valueBlock(xml: string, entry: string): string { + const at = xml.indexOf('

' + entry + '

'); + expect(at, entry).toBeGreaterThan(-1); + const from = xml.indexOf('

', from)).replace(/\s+/g, ' ').trim(); +} + +describe("a .mat's struct array of no element and complex empty, copied into a text dictionary", () => { + for (const edited of [false, true]) { + const as = edited ? ', edited' : ''; + + it(`a rank-2 struct of no element is the bag of its field names${as}`, () => { + for (const [name, dims] of [['es00', [0, 0]], ['es10', [1, 0]]] as const) { + const copy = copyOf(variable(name, edited)); + // The bag the binary reader makes of MATLAB's `` (BinarySlddParser.structValue). + expect(copy, name).toEqual({ _array_type: 'Struct', _dimensions: dims, _elements: [], _fields: ['a', 'bb'], _mw_element_type: 'MATLABArray' }); + const { written, entry } = pasteSaved(TEXT, copy); + expect(written, name).toEqual(copy); + expect([entry.className, entry.dims, entry.serial._fields, entry.children.length], name).toEqual(['struct', dims, ['a', 'bb'], 0]); + } + }); + + it(`an N-D one, and one in an N-D cell or struct, is a stream holding its names${as}`, () => { + const esNd = copyOf(variable('esNd', edited)) as any; + expect(streamOf(esNd)).toMatchObject({ cls: CLASS.STRUCT, dims: [0, 0, 2], fields: ['a', 'bb'], members: [] }); + const cNd = streamOf(copyOf(variable('cNd', edited)) as any); + expect(cNd.members!.map((m) => [m.cls, m.dims, m.fields, m.complex])).toEqual([ + [CLASS.STRUCT, [0, 0], ['a', 'bb'], false], + [CLASS.DOUBLE, [1, 0], undefined, true], + ]); + const sNd = streamOf(copyOf(variable('sNd', edited)) as any); + expect(sNd.fields).toEqual(['es', 'cx']); + expect(sNd.members!.map((m) => [m.cls, m.dims, m.fields, m.complex])).toEqual([ + [CLASS.STRUCT, [0, 0], ['a', 'bb'], false], + [CLASS.DOUBLE, [0, 0], undefined, true], + [CLASS.STRUCT, [1, 0], ['a', 'bb'], false], + [CLASS.INT16, [0, 0], undefined, true], + ]); + // Written as pasted, and read back so. + const { written, entry } = pasteSaved(TEXT, esNd); + expect(written).toEqual(esNd); + expect([entry.className, entry.dims, entry._emptyStructFields]).toEqual(['struct', [0, 0, 2], ['a', 'bb']]); + }); + + it(`a complex empty is a stream that says complex, at every rank and class${as}`, () => { + for (const [name, cls, dims, column] of [ + ['cx00', CLASS.DOUBLE, [0, 0], 'double (complex)'], + ['cx03s', CLASS.SINGLE, [0, 3], 'single (complex)'], + ['cxNd', CLASS.DOUBLE, [0, 0, 2], 'double (complex)'], + ] as const) { + const copy = copyOf(variable(name, edited)) as any; + expect(copy._type, name).toBe('cdata'); + expect(streamOf(copy), name).toMatchObject({ cls, dims, complex: true, re: [], im: [] }); + const { written, entry } = pasteSaved(TEXT, copy); + expect(written, name).toEqual(copy); + expect([entry.className, entry.dims, entry._classColumn()], name).toEqual([cls === CLASS.SINGLE ? 'single' : 'double', dims, column]); + } + }); + + it(`and as a member of a rank-2 cell or struct, each as itself${as}`, () => { + const cSp = copyOf(variable('cSp', edited)) as any; + expect(cSp._elements[0]).toEqual({ _array_type: 'Struct', _dimensions: [0, 0], _elements: [], _fields: ['a', 'bb'], _mw_element_type: 'MATLABArray' }); + expect(streamOf(cSp._elements[1])).toMatchObject({ cls: CLASS.DOUBLE, dims: [1, 0], complex: true }); + const s = copyOf(variable('s', edited)) as any; + expect(s._elements[0].es._fields).toEqual(['a', 'bb']); + expect(streamOf(s._elements[0].cx)).toMatchObject({ cls: CLASS.DOUBLE, dims: [0, 0], complex: true }); + }); + } +}); + +describe('copied into a binary dictionary, as MATLAB spells each there', () => { + // MATLAB's own spelling of dispcat.mat's variables, in the binary dictionary it wrote of them. + const matlab = strFromU8(unzipSync(fixture('display/dispcat_bin.sldd'))['data/chunk0.xml']); + const dispcat = () => createSession().addMatSource('dispcat.mat', arrayBufferOf(fixture('display/dispcat.mat'))) as any; + + for (const edited of [false, true]) { + it(`each of dispcat.mat's empties is the Value block MATLAB wrote for it${edited ? ', edited' : ''}`, () => { + for (const name of ['dx_struct_0x0', 'dx_struct_0x0_fields', 'dx_struct_1x0', 'dx_complex_0x0', 'dx_complex_1x0', 'dx_complex_int16_1x0', 'e_single_complex_1x0']) { + const node = dispcat().children.find((c: any) => c.name === name); + if (edited) { + node._markModified(); + } + const { written } = pasteSaved(BINARY, copyOf(node)); + expect(written, name).toBe(valueBlock(matlab, name)); + } + }); + } + + it('and the empties a cell or a struct holds, read back as they were', () => { + const { written: cell, entry: c } = pasteSaved(BINARY, copyOf(variable('cSp', true))); + expect(cell).toContain(' '); + expect(cell).toContain(''); + expect([c.children[0].className, c.children[0].dims, c.children[0].serial._fields]).toEqual(['struct', [0, 0], ['a', 'bb']]); + expect([c.children[1].dims, c.children[1]._classColumn()]).toEqual([[1, 0], 'double (complex)']); + + const { written: struct, entry: s } = pasteSaved(BINARY, copyOf(variable('s', true))); + expect(struct).toContain('

'); + expect(struct).toContain('

'); + const field = (n: string) => s.children.find((f: any) => f.name === n); + expect([field('es').serial._fields, field('cx')._classColumn()]).toEqual([['a', 'bb'], 'double (complex)']); + + const { written: nd } = pasteSaved(BINARY, copyOf(variable('sNd', true))); + expect(nd).toContain('

'); + expect(nd).toContain('

'); + }); +}); + +describe("a text dictionary's own stream of them, written again", () => { + it('keeps the names and the complexity, unedited and once rebuilt from its rows', () => { + // A text dictionary holding cNd as the stream a copy writes for it, as one saved before. + const { entry } = pasteSaved(TEXT, copyOf(variable('cNd'))); + const raw = entry._rawInput; + expect(entry._readFromStream).toBe(true); + // Unedited, it is written as the stream it was read from. + expect(entry.serializeValue()).toBe(raw); + // Rebuilt from its rows (what a value edit leaves, though the editor takes none here: a text + // dictionary's stream is shown and not edited), the stream MatWriter writes holds them too. + entry._markModified(); + const again = entry.serializeValue() as any; + expect(again).not.toBe(raw); + expect(streamOf(again).members!.map((m) => [m.cls, m.dims, m.fields, m.complex])).toEqual([ + [CLASS.STRUCT, [0, 0], ['a', 'bb'], false], + [CLASS.DOUBLE, [1, 0], undefined, true], + ]); + }); +}); diff --git a/test/fixtures/global/global_v6.mat b/test/fixtures/global/global_v6.mat new file mode 100644 index 00000000..df6a69fa Binary files /dev/null and b/test/fixtures/global/global_v6.mat differ diff --git a/test/fixtures/global/global_v7.mat b/test/fixtures/global/global_v7.mat new file mode 100644 index 00000000..8c581876 Binary files /dev/null and b/test/fixtures/global/global_v7.mat differ diff --git a/test/fixtures/global/make_global_fixtures.m b/test/fixtures/global/make_global_fixtures.m new file mode 100644 index 00000000..b13cae77 --- /dev/null +++ b/test/fixtures/global/make_global_fixtures.m @@ -0,0 +1,99 @@ +function make_global_fixtures(outDir) + % Copyright 2026 The MathWorks, Inc. + % Authors global_v7.mat and global_v6.mat: variables declared global, saved by MATLAB's own + % `save`, beside one that is not. test/matGlobal.test.ts and the MAT-file gate + % (test/parity/matlab/probe_mat_writeback) read them. Run: + % + % mw -using Bmain matlab -nodesktop -batch "make_global_fixtures('/tmp/globals')" + % + % with this folder on the path, then copy the two files here. `outDir` must be a temp folder: + % the function cds there before it writes anything. + % + % WHAT IT MEASURES. `save` marks a variable declared global by bit 0x04 of its array flags' + % flags byte (the flags word 0x0406 for a global double), on the top-level element alone; it + % prints the -v6 file's every element's flags as it finds them (FLAGS lines: depth, class, + % flags byte; the -v7 file's records are compressed, and test/matGlobal.test.ts reads them), + % and what MATLAB reads back of both: `whos -file`'s global attribute, and the globals a + % `load` inside a function declares (GLOBAL lines). Measured on R2027a: 04 on every global + % top-level element, 00 on every element nested in one. + cd(outDir); + clear global + global gD gS gC gI %#ok + gD = [1 2 3]; + gS = struct('a', 1, 'b', {{2, 'x'}}); + gC = {4, int8(5), struct('q', 6)}; + gI = int16(-7); + plain = 9; %#ok + save('global_v7.mat', 'gD', 'gS', 'gC', 'gI', 'plain', '-v7'); + save('global_v6.mat', 'gD', 'gS', 'gC', 'gI', 'plain', '-v6'); + clear global + for f = {'global_v7.mat', 'global_v6.mat'} + w = whos('-file', f{1}); + fprintf('GLOBAL whos %s %s\n', f{1}, strjoin(arrayfun(@(x) sprintf('%s=%d', x.name, x.global), w, 'UniformOutput', false), ' ')); + fprintf('GLOBAL load %s %s\n', f{1}, strjoin(globalsLoaded(f{1}), ' ')); + end + fprintf('FLAGS global_v6.mat %s\n', strjoin(flagsOf('global_v6.mat'), ' ')); + fprintf('MAKE_GLOBAL_FIXTURES_DONE %s\n', version); +end + +% The globals `load` declares inside a function: every variable the file marks global. +function names = globalsLoaded(fixtureFile__) + clear global + load(fixtureFile__); %#ok + w__ = whos('global'); + names = sort({w__.name}); + clear global +end + +% The flags byte of every miMATRIX element of an uncompressed (-v6) file, nested ones included, +% as `d/c:` in file order. +function out = flagsOf(f) + out = {}; + fid = fopen(f, 'r'); + b = fread(fid, Inf, '*uint8')'; + fclose(fid); + at = 129; + while at + 7 <= numel(b) + n = double(typecast(b(at+4:at+7), 'uint32')); + out = [out, walk(b(at:at+7+n), 1, 0)]; %#ok + at = at + 8 + n + mod(8 - mod(n, 8), 8); + end +end + +function out = walk(el, at, depth) + out = {}; + n = double(typecast(el(at+4:at+7), 'uint32')); + flags = el(at+17); + cls = el(at+16); + out{end+1} = sprintf('d%d/c%d:%02x', depth, cls, flags); + % Members: past flags (16), dims, name; a cell's members follow, a struct's after its two + % name sub-elements. + p = at + 8 + 16; + for k = 1:2 + [len, small] = subLen(el, p); + if small, p = p + 8; else, p = p + 8 + len + mod(8 - mod(len, 8), 8); end + end + if cls == 2 + for k = 1:2 + [len, small] = subLen(el, p); + if small, p = p + 8; else, p = p + 8 + len + mod(8 - mod(len, 8), 8); end + end + end + if cls == 1 || cls == 2 + stop = at + 8 + n; + while p < stop + out = [out, walk(el, p, depth + 1)]; %#ok + p = p + 8 + double(typecast(el(p+4:p+7), 'uint32')); + end + end +end + +function [len, small] = subLen(el, p) + w = typecast(el(p:p+3), 'uint32'); + small = bitshift(w, -16) ~= 0; + if small + len = double(bitshift(w, -16)); + else + len = double(typecast(el(p+4:p+7), 'uint32')); + end +end diff --git a/test/fixtures/mat-check/added-variable-after-subsystem.mat b/test/fixtures/mat-check/added-variable-after-subsystem.mat new file mode 100644 index 00000000..ae69acfd Binary files /dev/null and b/test/fixtures/mat-check/added-variable-after-subsystem.mat differ diff --git a/test/fixtures/mat-check/added-variable-before-subsystem.mat b/test/fixtures/mat-check/added-variable-before-subsystem.mat new file mode 100644 index 00000000..62375efe Binary files /dev/null and b/test/fixtures/mat-check/added-variable-before-subsystem.mat differ diff --git a/test/fixtures/mat-check/added-variable-no-subsystem.mat b/test/fixtures/mat-check/added-variable-no-subsystem.mat new file mode 100644 index 00000000..a51af8ec Binary files /dev/null and b/test/fixtures/mat-check/added-variable-no-subsystem.mat differ diff --git a/test/fixtures/mat-check/added-variable-stale-offset.mat b/test/fixtures/mat-check/added-variable-stale-offset.mat new file mode 100644 index 00000000..046abd7e Binary files /dev/null and b/test/fixtures/mat-check/added-variable-stale-offset.mat differ diff --git a/test/fixtures/mat-check/char-ascii-int8.mat b/test/fixtures/mat-check/char-ascii-int8.mat new file mode 100644 index 00000000..efdc0771 Binary files /dev/null and b/test/fixtures/mat-check/char-ascii-int8.mat differ diff --git a/test/fixtures/mat-check/char-ascii-uint16.mat b/test/fixtures/mat-check/char-ascii-uint16.mat new file mode 100644 index 00000000..10a5faec Binary files /dev/null and b/test/fixtures/mat-check/char-ascii-uint16.mat differ diff --git a/test/fixtures/mat-check/char-ascii-uint8.mat b/test/fixtures/mat-check/char-ascii-uint8.mat new file mode 100644 index 00000000..89b92a17 Binary files /dev/null and b/test/fixtures/mat-check/char-ascii-uint8.mat differ diff --git a/test/fixtures/mat-check/char-ascii-utf16.mat b/test/fixtures/mat-check/char-ascii-utf16.mat new file mode 100644 index 00000000..b6487178 Binary files /dev/null and b/test/fixtures/mat-check/char-ascii-utf16.mat differ diff --git a/test/fixtures/mat-check/char-ascii-utf32.mat b/test/fixtures/mat-check/char-ascii-utf32.mat new file mode 100644 index 00000000..239edbc0 Binary files /dev/null and b/test/fixtures/mat-check/char-ascii-utf32.mat differ diff --git a/test/fixtures/mat-check/char-ascii-utf8.mat b/test/fixtures/mat-check/char-ascii-utf8.mat new file mode 100644 index 00000000..ecbfb10e Binary files /dev/null and b/test/fixtures/mat-check/char-ascii-utf8.mat differ diff --git a/test/fixtures/mat-check/char-cjk-uint16.mat b/test/fixtures/mat-check/char-cjk-uint16.mat new file mode 100644 index 00000000..fe41cdc9 Binary files /dev/null and b/test/fixtures/mat-check/char-cjk-uint16.mat differ diff --git a/test/fixtures/mat-check/char-cjk-utf16.mat b/test/fixtures/mat-check/char-cjk-utf16.mat new file mode 100644 index 00000000..617363fb Binary files /dev/null and b/test/fixtures/mat-check/char-cjk-utf16.mat differ diff --git a/test/fixtures/mat-check/char-cjk-utf32.mat b/test/fixtures/mat-check/char-cjk-utf32.mat new file mode 100644 index 00000000..8f08f71e Binary files /dev/null and b/test/fixtures/mat-check/char-cjk-utf32.mat differ diff --git a/test/fixtures/mat-check/char-cjk-utf8.mat b/test/fixtures/mat-check/char-cjk-utf8.mat new file mode 100644 index 00000000..f1371460 Binary files /dev/null and b/test/fixtures/mat-check/char-cjk-utf8.mat differ diff --git a/test/fixtures/mat-check/char-emoji-uint16.mat b/test/fixtures/mat-check/char-emoji-uint16.mat new file mode 100644 index 00000000..1de35d96 Binary files /dev/null and b/test/fixtures/mat-check/char-emoji-uint16.mat differ diff --git a/test/fixtures/mat-check/char-emoji-utf16.mat b/test/fixtures/mat-check/char-emoji-utf16.mat new file mode 100644 index 00000000..0b80f37d Binary files /dev/null and b/test/fixtures/mat-check/char-emoji-utf16.mat differ diff --git a/test/fixtures/mat-check/char-emoji-utf32.mat b/test/fixtures/mat-check/char-emoji-utf32.mat new file mode 100644 index 00000000..2d414731 Binary files /dev/null and b/test/fixtures/mat-check/char-emoji-utf32.mat differ diff --git a/test/fixtures/mat-check/char-emoji-utf8.mat b/test/fixtures/mat-check/char-emoji-utf8.mat new file mode 100644 index 00000000..c96a124a Binary files /dev/null and b/test/fixtures/mat-check/char-emoji-utf8.mat differ diff --git a/test/fixtures/mat-check/char-every-encoding.mat b/test/fixtures/mat-check/char-every-encoding.mat new file mode 100644 index 00000000..0e3df26a Binary files /dev/null and b/test/fixtures/mat-check/char-every-encoding.mat differ diff --git a/test/fixtures/mat-check/char-latin1-int8.mat b/test/fixtures/mat-check/char-latin1-int8.mat new file mode 100644 index 00000000..bfcba4df Binary files /dev/null and b/test/fixtures/mat-check/char-latin1-int8.mat differ diff --git a/test/fixtures/mat-check/char-latin1-uint16.mat b/test/fixtures/mat-check/char-latin1-uint16.mat new file mode 100644 index 00000000..f78f1d8e Binary files /dev/null and b/test/fixtures/mat-check/char-latin1-uint16.mat differ diff --git a/test/fixtures/mat-check/char-latin1-uint8.mat b/test/fixtures/mat-check/char-latin1-uint8.mat new file mode 100644 index 00000000..98b22c5c Binary files /dev/null and b/test/fixtures/mat-check/char-latin1-uint8.mat differ diff --git a/test/fixtures/mat-check/char-latin1-utf16.mat b/test/fixtures/mat-check/char-latin1-utf16.mat new file mode 100644 index 00000000..2ac77ea1 Binary files /dev/null and b/test/fixtures/mat-check/char-latin1-utf16.mat differ diff --git a/test/fixtures/mat-check/char-latin1-utf32.mat b/test/fixtures/mat-check/char-latin1-utf32.mat new file mode 100644 index 00000000..526ae4b7 Binary files /dev/null and b/test/fixtures/mat-check/char-latin1-utf32.mat differ diff --git a/test/fixtures/mat-check/char-latin1-utf8.mat b/test/fixtures/mat-check/char-latin1-utf8.mat new file mode 100644 index 00000000..c1d42cad Binary files /dev/null and b/test/fixtures/mat-check/char-latin1-utf8.mat differ diff --git a/test/fixtures/mat-check/deleted-every-object-variable.mat b/test/fixtures/mat-check/deleted-every-object-variable.mat new file mode 100644 index 00000000..a30241b6 Binary files /dev/null and b/test/fixtures/mat-check/deleted-every-object-variable.mat differ diff --git a/test/fixtures/mat-check/deleted-object-orphan.mat b/test/fixtures/mat-check/deleted-object-orphan.mat new file mode 100644 index 00000000..8cf3b461 Binary files /dev/null and b/test/fixtures/mat-check/deleted-object-orphan.mat differ diff --git a/test/fixtures/mat-check/deleted-objects-and-subsystem.mat b/test/fixtures/mat-check/deleted-objects-and-subsystem.mat new file mode 100644 index 00000000..a8905f5a Binary files /dev/null and b/test/fixtures/mat-check/deleted-objects-and-subsystem.mat differ diff --git a/test/fixtures/mat-check/deleted-one-of-two-handles.mat b/test/fixtures/mat-check/deleted-one-of-two-handles.mat new file mode 100644 index 00000000..a2640859 Binary files /dev/null and b/test/fixtures/mat-check/deleted-one-of-two-handles.mat differ diff --git a/test/fixtures/mat-check/deleted-one-string.mat b/test/fixtures/mat-check/deleted-one-string.mat new file mode 100644 index 00000000..174d5139 Binary files /dev/null and b/test/fixtures/mat-check/deleted-one-string.mat differ diff --git a/test/fixtures/mat-check/deleted-shared-handle-copy.mat b/test/fixtures/mat-check/deleted-shared-handle-copy.mat new file mode 100644 index 00000000..3cd5511c Binary files /dev/null and b/test/fixtures/mat-check/deleted-shared-handle-copy.mat differ diff --git a/test/fixtures/mat-check/deleted-variable-offset-recomputed.mat b/test/fixtures/mat-check/deleted-variable-offset-recomputed.mat new file mode 100644 index 00000000..f5dcd6b9 Binary files /dev/null and b/test/fixtures/mat-check/deleted-variable-offset-recomputed.mat differ diff --git a/test/fixtures/mat-check/double-integer-storage-types-compressed.mat b/test/fixtures/mat-check/double-integer-storage-types-compressed.mat new file mode 100644 index 00000000..c0175aff Binary files /dev/null and b/test/fixtures/mat-check/double-integer-storage-types-compressed.mat differ diff --git a/test/fixtures/mat-check/double-integer-storage-types.mat b/test/fixtures/mat-check/double-integer-storage-types.mat new file mode 100644 index 00000000..55927277 Binary files /dev/null and b/test/fixtures/mat-check/double-integer-storage-types.mat differ diff --git a/test/fixtures/mat-check/duplicate-name-earlier-copy.mat b/test/fixtures/mat-check/duplicate-name-earlier-copy.mat new file mode 100644 index 00000000..bace6879 Binary files /dev/null and b/test/fixtures/mat-check/duplicate-name-earlier-copy.mat differ diff --git a/test/fixtures/mat-check/duplicate-name-later-copy.mat b/test/fixtures/mat-check/duplicate-name-later-copy.mat new file mode 100644 index 00000000..96decfd6 Binary files /dev/null and b/test/fixtures/mat-check/duplicate-name-later-copy.mat differ diff --git a/test/fixtures/mat-check/duplicate-object-names.mat b/test/fixtures/mat-check/duplicate-object-names.mat new file mode 100644 index 00000000..50f4baa2 Binary files /dev/null and b/test/fixtures/mat-check/duplicate-object-names.mat differ diff --git a/test/fixtures/mat-check/final-pad-cut-size-fixed.mat b/test/fixtures/mat-check/final-pad-cut-size-fixed.mat new file mode 100644 index 00000000..7e20e0a3 Binary files /dev/null and b/test/fixtures/mat-check/final-pad-cut-size-fixed.mat differ diff --git a/test/fixtures/mat-check/final-pad-cut.mat b/test/fixtures/mat-check/final-pad-cut.mat new file mode 100644 index 00000000..999c99c5 Binary files /dev/null and b/test/fixtures/mat-check/final-pad-cut.mat differ diff --git a/test/fixtures/mat-check/header-only-offset-spaces.mat b/test/fixtures/mat-check/header-only-offset-spaces.mat new file mode 100644 index 00000000..7de280e9 Binary files /dev/null and b/test/fixtures/mat-check/header-only-offset-spaces.mat differ diff --git a/test/fixtures/mat-check/header-only.mat b/test/fixtures/mat-check/header-only.mat new file mode 100644 index 00000000..b7ae3c39 Binary files /dev/null and b/test/fixtures/mat-check/header-only.mat differ diff --git a/test/fixtures/mat-check/header-text-all-nul.mat b/test/fixtures/mat-check/header-text-all-nul.mat new file mode 100644 index 00000000..fdeb6d7f Binary files /dev/null and b/test/fixtures/mat-check/header-text-all-nul.mat differ diff --git a/test/fixtures/mat-check/header-text-no-matlab-prefix.mat b/test/fixtures/mat-check/header-text-no-matlab-prefix.mat new file mode 100644 index 00000000..a7b9260c Binary files /dev/null and b/test/fixtures/mat-check/header-text-no-matlab-prefix.mat differ diff --git a/test/fixtures/mat-check/header-text-nul-padded.mat b/test/fixtures/mat-check/header-text-nul-padded.mat new file mode 100644 index 00000000..7cb91b34 Binary files /dev/null and b/test/fixtures/mat-check/header-text-nul-padded.mat differ diff --git a/test/fixtures/mat-check/header-text-other-writer.mat b/test/fixtures/mat-check/header-text-other-writer.mat new file mode 100644 index 00000000..481efaf2 Binary files /dev/null and b/test/fixtures/mat-check/header-text-other-writer.mat differ diff --git a/test/fixtures/mat-check/matlab-append-objects-replaced.mat b/test/fixtures/mat-check/matlab-append-objects-replaced.mat new file mode 100644 index 00000000..98d1b7b9 Binary files /dev/null and b/test/fixtures/mat-check/matlab-append-objects-replaced.mat differ diff --git a/test/fixtures/mat-check/matlab-append-onto-orphans.mat b/test/fixtures/mat-check/matlab-append-onto-orphans.mat new file mode 100644 index 00000000..16c69e6e Binary files /dev/null and b/test/fixtures/mat-check/matlab-append-onto-orphans.mat differ diff --git a/test/fixtures/mat-check/matlab-append-onto-uncompressed.mat b/test/fixtures/mat-check/matlab-append-onto-uncompressed.mat new file mode 100644 index 00000000..ef92bd75 Binary files /dev/null and b/test/fixtures/mat-check/matlab-append-onto-uncompressed.mat differ diff --git a/test/fixtures/mat-check/matlab-append-replacing-variable.mat b/test/fixtures/mat-check/matlab-append-replacing-variable.mat new file mode 100644 index 00000000..f6214748 Binary files /dev/null and b/test/fixtures/mat-check/matlab-append-replacing-variable.mat differ diff --git a/test/fixtures/mat-check/matlab-append-revives-hidden-variable.mat b/test/fixtures/mat-check/matlab-append-revives-hidden-variable.mat new file mode 100644 index 00000000..b9792512 Binary files /dev/null and b/test/fixtures/mat-check/matlab-append-revives-hidden-variable.mat differ diff --git a/test/fixtures/mat-check/matlab-append-v6-onto-v7.mat b/test/fixtures/mat-check/matlab-append-v6-onto-v7.mat new file mode 100644 index 00000000..0757a3d3 Binary files /dev/null and b/test/fixtures/mat-check/matlab-append-v6-onto-v7.mat differ diff --git a/test/fixtures/mat-check/matlab-objects.mat b/test/fixtures/mat-check/matlab-objects.mat new file mode 100644 index 00000000..974b50c9 Binary files /dev/null and b/test/fixtures/mat-check/matlab-objects.mat differ diff --git a/test/fixtures/mat-check/matlab-one-double.mat b/test/fixtures/mat-check/matlab-one-double.mat new file mode 100644 index 00000000..1ec1e807 Binary files /dev/null and b/test/fixtures/mat-check/matlab-one-double.mat differ diff --git a/test/fixtures/mat-check/matlab-plain.mat b/test/fixtures/mat-check/matlab-plain.mat new file mode 100644 index 00000000..cc99e6a9 Binary files /dev/null and b/test/fixtures/mat-check/matlab-plain.mat differ diff --git a/test/fixtures/mat-check/matlab-shared-handle.mat b/test/fixtures/mat-check/matlab-shared-handle.mat new file mode 100644 index 00000000..87bb8870 Binary files /dev/null and b/test/fixtures/mat-check/matlab-shared-handle.mat differ diff --git a/test/fixtures/mat-check/matlab-strings.mat b/test/fixtures/mat-check/matlab-strings.mat new file mode 100644 index 00000000..eb216599 Binary files /dev/null and b/test/fixtures/mat-check/matlab-strings.mat differ diff --git a/test/fixtures/mat-check/matlab-two-handles.mat b/test/fixtures/mat-check/matlab-two-handles.mat new file mode 100644 index 00000000..2d2435bc Binary files /dev/null and b/test/fixtures/mat-check/matlab-two-handles.mat differ diff --git a/test/fixtures/mat-check/name-63-chars.mat b/test/fixtures/mat-check/name-63-chars.mat new file mode 100644 index 00000000..a9e7c662 Binary files /dev/null and b/test/fixtures/mat-check/name-63-chars.mat differ diff --git a/test/fixtures/mat-check/name-70-chars.mat b/test/fixtures/mat-check/name-70-chars.mat new file mode 100644 index 00000000..47370ee0 Binary files /dev/null and b/test/fixtures/mat-check/name-70-chars.mat differ diff --git a/test/fixtures/mat-check/name-empty.mat b/test/fixtures/mat-check/name-empty.mat new file mode 100644 index 00000000..6d54610a Binary files /dev/null and b/test/fixtures/mat-check/name-empty.mat differ diff --git a/test/fixtures/mat-check/name-keyword.mat b/test/fixtures/mat-check/name-keyword.mat new file mode 100644 index 00000000..699e9f24 Binary files /dev/null and b/test/fixtures/mat-check/name-keyword.mat differ diff --git a/test/fixtures/mat-check/name-leading-digit.mat b/test/fixtures/mat-check/name-leading-digit.mat new file mode 100644 index 00000000..d00befa7 Binary files /dev/null and b/test/fixtures/mat-check/name-leading-digit.mat differ diff --git a/test/fixtures/mat-check/name-non-ascii-utf8.mat b/test/fixtures/mat-check/name-non-ascii-utf8.mat new file mode 100644 index 00000000..170ad9e0 Binary files /dev/null and b/test/fixtures/mat-check/name-non-ascii-utf8.mat differ diff --git a/test/fixtures/mat-check/name-with-space.mat b/test/fixtures/mat-check/name-with-space.mat new file mode 100644 index 00000000..6eec9b37 Binary files /dev/null and b/test/fixtures/mat-check/name-with-space.mat differ diff --git a/test/fixtures/mat-check/non-utf8-name.mat b/test/fixtures/mat-check/non-utf8-name.mat new file mode 100644 index 00000000..2913f441 Binary files /dev/null and b/test/fixtures/mat-check/non-utf8-name.mat differ diff --git a/test/fixtures/mat-check/objects-compressed-zero-padded.mat b/test/fixtures/mat-check/objects-compressed-zero-padded.mat new file mode 100644 index 00000000..33bd2a9a Binary files /dev/null and b/test/fixtures/mat-check/objects-compressed-zero-padded.mat differ diff --git a/test/fixtures/mat-check/objects-first-reordered.mat b/test/fixtures/mat-check/objects-first-reordered.mat new file mode 100644 index 00000000..160e81a6 Binary files /dev/null and b/test/fixtures/mat-check/objects-first-reordered.mat differ diff --git a/test/fixtures/mat-check/objects-mixed-compression.mat b/test/fixtures/mat-check/objects-mixed-compression.mat new file mode 100644 index 00000000..3222531e Binary files /dev/null and b/test/fixtures/mat-check/objects-mixed-compression.mat differ diff --git a/test/fixtures/mat-check/objects-plain-subsystem.mat b/test/fixtures/mat-check/objects-plain-subsystem.mat new file mode 100644 index 00000000..483cc028 Binary files /dev/null and b/test/fixtures/mat-check/objects-plain-subsystem.mat differ diff --git a/test/fixtures/mat-check/objects-plain-variables.mat b/test/fixtures/mat-check/objects-plain-variables.mat new file mode 100644 index 00000000..695a6191 Binary files /dev/null and b/test/fixtures/mat-check/objects-plain-variables.mat differ diff --git a/test/fixtures/mat-check/objects-uncompressed.mat b/test/fixtures/mat-check/objects-uncompressed.mat new file mode 100644 index 00000000..d4330190 Binary files /dev/null and b/test/fixtures/mat-check/objects-uncompressed.mat differ diff --git a/test/fixtures/mat-check/objects-zlib-level9.mat b/test/fixtures/mat-check/objects-zlib-level9.mat new file mode 100644 index 00000000..134b3872 Binary files /dev/null and b/test/fixtures/mat-check/objects-zlib-level9.mat differ diff --git a/test/fixtures/mat-check/plain-compressed-zero-padded.mat b/test/fixtures/mat-check/plain-compressed-zero-padded.mat new file mode 100644 index 00000000..ab97c2a4 Binary files /dev/null and b/test/fixtures/mat-check/plain-compressed-zero-padded.mat differ diff --git a/test/fixtures/mat-check/plain-mixed-compression-unaligned.mat b/test/fixtures/mat-check/plain-mixed-compression-unaligned.mat new file mode 100644 index 00000000..9b45a7ca Binary files /dev/null and b/test/fixtures/mat-check/plain-mixed-compression-unaligned.mat differ diff --git a/test/fixtures/mat-check/plain-uncompressed.mat b/test/fixtures/mat-check/plain-uncompressed.mat new file mode 100644 index 00000000..d4f55fe6 Binary files /dev/null and b/test/fixtures/mat-check/plain-uncompressed.mat differ diff --git a/test/fixtures/mat-check/plain-zlib-level0.mat b/test/fixtures/mat-check/plain-zlib-level0.mat new file mode 100644 index 00000000..f72cade0 Binary files /dev/null and b/test/fixtures/mat-check/plain-zlib-level0.mat differ diff --git a/test/fixtures/mat-check/plain-zlib-level1.mat b/test/fixtures/mat-check/plain-zlib-level1.mat new file mode 100644 index 00000000..f2b709b1 Binary files /dev/null and b/test/fixtures/mat-check/plain-zlib-level1.mat differ diff --git a/test/fixtures/mat-check/plain-zlib-level9.mat b/test/fixtures/mat-check/plain-zlib-level9.mat new file mode 100644 index 00000000..95c8fab8 Binary files /dev/null and b/test/fixtures/mat-check/plain-zlib-level9.mat differ diff --git a/test/fixtures/mat-check/renamed-object-variable.mat b/test/fixtures/mat-check/renamed-object-variable.mat new file mode 100644 index 00000000..da49d79a Binary files /dev/null and b/test/fixtures/mat-check/renamed-object-variable.mat differ diff --git a/test/fixtures/mat-check/renamed-parameter.mat b/test/fixtures/mat-check/renamed-parameter.mat new file mode 100644 index 00000000..5cb462b6 Binary files /dev/null and b/test/fixtures/mat-check/renamed-parameter.mat differ diff --git a/test/fixtures/mat-check/renamed-plain-variable.mat b/test/fixtures/mat-check/renamed-plain-variable.mat new file mode 100644 index 00000000..9aa035e4 Binary files /dev/null and b/test/fixtures/mat-check/renamed-plain-variable.mat differ diff --git a/test/fixtures/mat-check/renamed-uncompressed-object-variable.mat b/test/fixtures/mat-check/renamed-uncompressed-object-variable.mat new file mode 100644 index 00000000..bf446d34 Binary files /dev/null and b/test/fixtures/mat-check/renamed-uncompressed-object-variable.mat differ diff --git a/test/fixtures/mat-check/reordered-variables.mat b/test/fixtures/mat-check/reordered-variables.mat new file mode 100644 index 00000000..5c0a0301 Binary files /dev/null and b/test/fixtures/mat-check/reordered-variables.mat differ diff --git a/test/fixtures/mat-check/small-tags.mat b/test/fixtures/mat-check/small-tags.mat new file mode 100644 index 00000000..a7738f42 Binary files /dev/null and b/test/fixtures/mat-check/small-tags.mat differ diff --git a/test/fixtures/mat-check/spaces-subsystem-offset.mat b/test/fixtures/mat-check/spaces-subsystem-offset.mat new file mode 100644 index 00000000..190d1c98 Binary files /dev/null and b/test/fixtures/mat-check/spaces-subsystem-offset.mat differ diff --git a/test/fixtures/mat-check/sparse-without-sparse-flag.mat b/test/fixtures/mat-check/sparse-without-sparse-flag.mat new file mode 100644 index 00000000..32b8deee Binary files /dev/null and b/test/fixtures/mat-check/sparse-without-sparse-flag.mat differ diff --git a/test/fixtures/mat-check/stale-subsystem-offset.mat b/test/fixtures/mat-check/stale-subsystem-offset.mat new file mode 100644 index 00000000..979f4899 Binary files /dev/null and b/test/fixtures/mat-check/stale-subsystem-offset.mat differ diff --git a/test/fixtures/mat-check/struct-field-name-length-too-small.mat b/test/fixtures/mat-check/struct-field-name-length-too-small.mat new file mode 100644 index 00000000..d2ea48e1 Binary files /dev/null and b/test/fixtures/mat-check/struct-field-name-length-too-small.mat differ diff --git a/test/fixtures/mat-check/struct-wide-field-names.mat b/test/fixtures/mat-check/struct-wide-field-names.mat new file mode 100644 index 00000000..833d5fe8 Binary files /dev/null and b/test/fixtures/mat-check/struct-wide-field-names.mat differ diff --git a/test/fixtures/mat-check/subsystem-first.mat b/test/fixtures/mat-check/subsystem-first.mat new file mode 100644 index 00000000..8a1884ef Binary files /dev/null and b/test/fixtures/mat-check/subsystem-first.mat differ diff --git a/test/fixtures/mat-check/subsystem-in-middle.mat b/test/fixtures/mat-check/subsystem-in-middle.mat new file mode 100644 index 00000000..b527179d Binary files /dev/null and b/test/fixtures/mat-check/subsystem-in-middle.mat differ diff --git a/test/fixtures/mat-check/subsystem-offset-at-first-variable.mat b/test/fixtures/mat-check/subsystem-offset-at-first-variable.mat new file mode 100644 index 00000000..4ca212ff Binary files /dev/null and b/test/fixtures/mat-check/subsystem-offset-at-first-variable.mat differ diff --git a/test/fixtures/mat-check/trailing-3-zeros.mat b/test/fixtures/mat-check/trailing-3-zeros.mat new file mode 100644 index 00000000..04aa754c Binary files /dev/null and b/test/fixtures/mat-check/trailing-3-zeros.mat differ diff --git a/test/fixtures/mat-check/trailing-8-zeros.mat b/test/fixtures/mat-check/trailing-8-zeros.mat new file mode 100644 index 00000000..6b152e77 Binary files /dev/null and b/test/fixtures/mat-check/trailing-8-zeros.mat differ diff --git a/test/fixtures/mat-check/trailing-zeros-after-subsystem.mat b/test/fixtures/mat-check/trailing-zeros-after-subsystem.mat new file mode 100644 index 00000000..62413c27 Binary files /dev/null and b/test/fixtures/mat-check/trailing-zeros-after-subsystem.mat differ diff --git a/test/fixtures/mat-check/uncompressed-trailing-8-zeros.mat b/test/fixtures/mat-check/uncompressed-trailing-8-zeros.mat new file mode 100644 index 00000000..cf4f6e68 Binary files /dev/null and b/test/fixtures/mat-check/uncompressed-trailing-8-zeros.mat differ diff --git a/test/fixtures/mat-check/variable-after-subsystem.mat b/test/fixtures/mat-check/variable-after-subsystem.mat new file mode 100644 index 00000000..4c38c70e Binary files /dev/null and b/test/fixtures/mat-check/variable-after-subsystem.mat differ diff --git a/test/fixtures/mat-check/verdicts.json b/test/fixtures/mat-check/verdicts.json new file mode 100644 index 00000000..9429d32b --- /dev/null +++ b/test/fixtures/mat-check/verdicts.json @@ -0,0 +1,833 @@ +[ + { + "file": "matlab-plain.mat", + "probe": "base_plain", + "matlab": "loads", + "what": "MATLAB -v7 save of 17 plain variables: numeric, logical, complex, char, empty, struct, struct array, cell, sparse", + "codes": [] + }, + { + "file": "matlab-objects.mat", + "probe": "base_obj", + "matlab": "loads", + "what": "MATLAB -v7 save of four plain variables and four objects (string, containers.Map, a handle class, Simulink.Parameter), then the subsystem", + "codes": [] + }, + { + "file": "matlab-two-handles.mat", + "probe": "base_twoobj", + "matlab": "loads", + "what": "MATLAB -v7 save of two handle objects and two doubles", + "codes": [] + }, + { + "file": "matlab-shared-handle.mat", + "probe": "base_shared", + "matlab": "loads", + "what": "MATLAB -v7 save of two variables holding one handle, and a double", + "codes": [] + }, + { + "file": "matlab-strings.mat", + "probe": "base_strings", + "matlab": "loads", + "what": "MATLAB -v7 save of two strings and two plain variables", + "codes": [] + }, + { + "file": "matlab-one-double.mat", + "probe": "base_none", + "matlab": "loads", + "what": "MATLAB -v7 save of one double, no subsystem", + "codes": [] + }, + { + "file": "matlab-append-objects-replaced.mat", + "probe": "step05", + "matlab": "loads", + "what": "MATLAB save -append run five times, replacing objects: orphaned objects in the subsystem", + "codes": [] + }, + { + "file": "matlab-append-v6-onto-v7.mat", + "probe": "step13", + "matlab": "loads", + "what": "MATLAB save -append -v6 onto a -v7 file: plain records at unaligned offsets after compressed ones", + "codes": [] + }, + { + "file": "matlab-append-onto-uncompressed.mat", + "probe": "C_dex_raw_appended", + "matlab": "loads", + "what": "MATLAB save -append of a new variable onto a file of uncompressed records", + "codes": [] + }, + { + "file": "matlab-append-replacing-variable.mat", + "probe": "C_dex_raw_replace_d_int", + "matlab": "loads", + "what": "MATLAB save -append replacing a variable in a file of uncompressed records", + "codes": [] + }, + { + "file": "matlab-append-revives-hidden-variable.mat", + "probe": "C_hidden_after_subsys_appended", + "matlab": "loads", + "what": "MATLAB save -append onto a file holding a variable after its subsystem: MATLAB moves it before the new subsystem", + "codes": [] + }, + { + "file": "matlab-append-onto-orphans.mat", + "probe": "C_orphan_appended", + "matlab": "loads", + "what": "MATLAB save -append onto a file whose subsystem holds an orphaned object", + "codes": [] + }, + { + "file": "plain-uncompressed.mat", + "probe": "B1_base_plain_allraw", + "matlab": "loads", + "what": "matlab-plain.mat with every record inflated to a plain miMATRIX", + "codes": [] + }, + { + "file": "objects-uncompressed.mat", + "probe": "B1_base_obj_allraw", + "matlab": "loads", + "what": "matlab-objects.mat with every record inflated, the subsystem too, its offset recomputed", + "codes": [] + }, + { + "file": "plain-mixed-compression-unaligned.mat", + "probe": "B2a_plain_alternate", + "matlab": "loads", + "what": "matlab-plain.mat with records alternately compressed and plain, so plain ones sit at unaligned offsets", + "codes": [] + }, + { + "file": "objects-mixed-compression.mat", + "probe": "B2b_obj_alternate_subsys_z", + "matlab": "loads", + "what": "matlab-objects.mat with variables alternately plain and compressed, the subsystem compressed", + "codes": [] + }, + { + "file": "objects-plain-subsystem.mat", + "probe": "B2c_obj_vars_z_subsys_raw", + "matlab": "loads", + "what": "matlab-objects.mat with the subsystem inflated to a plain record", + "codes": [] + }, + { + "file": "objects-plain-variables.mat", + "probe": "B2d_obj_vars_raw_subsys_z", + "matlab": "loads", + "what": "matlab-objects.mat with every variable plain and the subsystem compressed", + "codes": [] + }, + { + "file": "plain-compressed-zero-padded.mat", + "probe": "B2e_plain_z_padded8", + "matlab": "fails", + "what": "matlab-plain.mat with each compressed record zero-padded to 8 bytes", + "matlabSays": "Unable to open MAT-file. File might be corrupt. (MATLAB:load:unableToReadMatFile)", + "codes": [ + "framing" + ] + }, + { + "file": "objects-compressed-zero-padded.mat", + "probe": "B2f_obj_z_padded8", + "matlab": "fails", + "what": "matlab-objects.mat with each compressed record zero-padded to 8 bytes, the offset recomputed", + "matlabSays": "Unable to open MAT-file. File might be corrupt. (MATLAB:load:unableToReadMatFile)", + "codes": [ + "framing" + ] + }, + { + "file": "plain-zlib-level0.mat", + "probe": "B3_base_plain_z0", + "matlab": "loads", + "what": "matlab-plain.mat recompressed at zlib level 0 (stored blocks)", + "codes": [] + }, + { + "file": "plain-zlib-level1.mat", + "probe": "B3_base_plain_z1", + "matlab": "loads", + "what": "matlab-plain.mat recompressed at zlib level 1", + "codes": [] + }, + { + "file": "plain-zlib-level9.mat", + "probe": "B3_base_plain_z9", + "matlab": "loads", + "what": "matlab-plain.mat recompressed at zlib level 9", + "codes": [] + }, + { + "file": "objects-zlib-level9.mat", + "probe": "B3_base_obj_z9", + "matlab": "loads", + "what": "matlab-objects.mat recompressed at zlib level 9", + "codes": [] + }, + { + "file": "header-text-other-writer.mat", + "probe": "B4a_text_dex", + "matlab": "loads", + "what": "matlab-objects.mat with header text \"MATLAB 5.0 MAT-file, written by data-explorer-core\"", + "codes": [] + }, + { + "file": "header-text-no-matlab-prefix.mat", + "probe": "B4b_text_noprefix", + "matlab": "loads", + "what": "header text not opening with \"MATLAB\"", + "codes": [] + }, + { + "file": "header-text-nul-padded.mat", + "probe": "B4d_text_nulpad", + "matlab": "loads", + "what": "header text padded with NUL bytes instead of spaces", + "codes": [] + }, + { + "file": "header-text-all-nul.mat", + "probe": "B4e_text_allnul", + "matlab": "fails", + "what": "header text all NUL bytes", + "matlabSays": "Unable to open MAT-file. File might be corrupt. (MATLAB:load:unableToReadMatFile)", + "codes": [ + "level4-lookalike" + ] + }, + { + "file": "deleted-variable-offset-recomputed.mat", + "probe": "B5_recompute", + "matlab": "loads", + "what": "matlab-objects.mat minus a plain variable, the subsystem offset recomputed", + "codes": [] + }, + { + "file": "stale-subsystem-offset.mat", + "probe": "B5_stale", + "matlab": "fails", + "what": "the same, with the subsystem offset left stale", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "anonymous-record", + "subsystem-offset" + ] + }, + { + "file": "zero-subsystem-offset.mat", + "probe": "B5_zero", + "matlab": "fails", + "what": "the same, with the subsystem offset zeroed", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "anonymous-record", + "subsystem-offset" + ] + }, + { + "file": "spaces-subsystem-offset.mat", + "probe": "B5_spaces", + "matlab": "fails", + "what": "the same, with the subsystem offset eight spaces", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "anonymous-record", + "subsystem-offset" + ] + }, + { + "file": "subsystem-offset-at-first-variable.mat", + "probe": "B5_off128", + "matlab": "fails", + "what": "the same, with the subsystem offset pointing at the first variable", + "matlabSays": "Unable to read file (MATLAB:load:notBinaryFile)", + "codes": [ + "anonymous-record", + "subsystem-offset" + ] + }, + { + "file": "deleted-object-orphan.mat", + "probe": "B6_base_obj_minus_ph", + "matlab": "loads", + "what": "matlab-objects.mat minus one object variable, the subsystem verbatim (an orphan)", + "codes": [] + }, + { + "file": "deleted-every-object-variable.mat", + "probe": "B6_base_obj_minus_s1_mp_ph_sparam", + "matlab": "loads", + "what": "matlab-objects.mat minus all four object variables, the subsystem verbatim", + "codes": [] + }, + { + "file": "deleted-one-of-two-handles.mat", + "probe": "B6_base_twoobj_minus_o1", + "matlab": "loads", + "what": "matlab-two-handles.mat minus one handle", + "codes": [] + }, + { + "file": "deleted-shared-handle-copy.mat", + "probe": "B6_base_shared_minus_q1", + "matlab": "loads", + "what": "matlab-shared-handle.mat minus one of the two variables holding the handle", + "codes": [] + }, + { + "file": "deleted-one-string.mat", + "probe": "B6_base_strings_minus_s1", + "matlab": "loads", + "what": "matlab-strings.mat minus one string", + "codes": [] + }, + { + "file": "deleted-objects-and-subsystem.mat", + "probe": "B6_base_obj_plain_only_nosubsys", + "matlab": "loads", + "what": "matlab-objects.mat minus every object and the subsystem, the offset zeroed", + "codes": [] + }, + { + "file": "renamed-plain-variable.mat", + "probe": "B7_rename_d_int", + "matlab": "loads", + "what": "a plain variable renamed by rewriting only its name, recompressed", + "codes": [] + }, + { + "file": "renamed-object-variable.mat", + "probe": "B7_rename_ph", + "matlab": "loads", + "what": "an object variable renamed by rewriting only its name, recompressed", + "codes": [] + }, + { + "file": "renamed-parameter.mat", + "probe": "B7_rename_sparam", + "matlab": "loads", + "what": "a Simulink.Parameter variable renamed to a one-letter name", + "codes": [] + }, + { + "file": "renamed-uncompressed-object-variable.mat", + "probe": "B7_rename_twoobj_o1", + "matlab": "loads", + "what": "a handle variable renamed and written as a plain record", + "codes": [] + }, + { + "file": "reordered-variables.mat", + "probe": "B8a_reversed", + "matlab": "loads", + "what": "matlab-objects.mat with its variables reversed, the subsystem last", + "codes": [] + }, + { + "file": "variable-after-subsystem.mat", + "probe": "B8b_plain_after_subsys", + "matlab": "drops", + "what": "a plain variable moved after the subsystem, the offset recomputed", + "matlabSays": "loads; d_scalar silently missing (whos -file still lists it)", + "codes": [ + "subsystem-not-last" + ] + }, + { + "file": "subsystem-first.mat", + "probe": "B8c_subsys_first", + "matlab": "drops", + "what": "the subsystem moved first, the offset 128", + "matlabSays": "loads no variables, with no error", + "codes": [ + "subsystem-not-last" + ] + }, + { + "file": "objects-first-reordered.mat", + "probe": "B8d_objects_first_reversed", + "matlab": "loads", + "what": "object variables first, then plain ones, the subsystem last", + "codes": [] + }, + { + "file": "subsystem-in-middle.mat", + "probe": "B8e_subsys_middle", + "matlab": "drops", + "what": "the subsystem moved after three plain variables, the offset recomputed", + "matlabSays": "loads only the three variables before the subsystem", + "codes": [ + "subsystem-not-last" + ] + }, + { + "file": "added-variable-after-subsystem.mat", + "probe": "B9a_append_after_subsys", + "matlab": "drops", + "what": "a new plain variable appended after the subsystem", + "matlabSays": "loads; \"added\" silently missing", + "codes": [ + "subsystem-not-last" + ] + }, + { + "file": "added-variable-before-subsystem.mat", + "probe": "B9b_insert_before_subsys", + "matlab": "loads", + "what": "a new plain variable inserted before the subsystem, the offset recomputed", + "codes": [] + }, + { + "file": "added-variable-stale-offset.mat", + "probe": "B9c_insert_before_subsys_stale", + "matlab": "fails", + "what": "a new plain variable inserted before the subsystem, the offset left stale", + "matlabSays": "Unable to read file (MATLAB:load:notBinaryFile)", + "codes": [ + "anonymous-record", + "subsystem-offset" + ] + }, + { + "file": "added-variable-no-subsystem.mat", + "probe": "B9d_append_to_plain", + "matlab": "loads", + "what": "a new plain variable appended to a file with no subsystem", + "codes": [] + }, + { + "file": "duplicate-name-later-copy.mat", + "probe": "B10a_dup_last", + "matlab": "loads", + "what": "a second d_scalar (99) appended after the first (3.5)", + "matlabSays": "loads d_scalar = 99: load(f) keeps the last copy", + "codes": [ + "duplicate-name" + ], + "deliberate": "ambiguous: load(f) keeps the last copy and load(f, name) the first" + }, + { + "file": "duplicate-name-earlier-copy.mat", + "probe": "B10b_dup_first", + "matlab": "loads", + "what": "a second d_scalar (99) placed before the first (3.5)", + "matlabSays": "loads d_scalar = 3.5: load(f) keeps the last copy", + "codes": [ + "duplicate-name" + ], + "deliberate": "ambiguous: load(f) keeps the last copy and load(f, name) the first" + }, + { + "file": "duplicate-object-names.mat", + "probe": "B10c_dup_object_names", + "matlab": "loads", + "what": "two string variables of one name", + "matlabSays": "loads the later one", + "codes": [ + "duplicate-name" + ], + "deliberate": "ambiguous: load(f) keeps the last copy and load(f, name) the first" + }, + { + "file": "name-63-chars.mat", + "probe": "B11a_name63", + "matlab": "loads", + "what": "a variable name of 63 characters", + "codes": [] + }, + { + "file": "name-70-chars.mat", + "probe": "B11c_name70", + "matlab": "loads", + "what": "a variable name of 70 characters (namelengthmax is 2048 in this MATLAB)", + "codes": [] + }, + { + "file": "name-leading-digit.mat", + "probe": "B11d_name_digit", + "matlab": "fails", + "what": "a variable named '1abc'", + "matlabSays": "S = load(f): Invalid field name: '1abc'. (MATLAB:AddField:InvalidFieldName); load(f) skips it", + "codes": [ + "name" + ] + }, + { + "file": "name-with-space.mat", + "probe": "B11e_name_space", + "matlab": "fails", + "what": "a variable named 'has space'", + "matlabSays": "S = load(f): Invalid field name: 'has space'. (MATLAB:AddField:InvalidFieldName)", + "codes": [ + "name" + ] + }, + { + "file": "name-non-ascii-utf8.mat", + "probe": "F1_name_utf8", + "matlab": "fails", + "what": "a variable named 'café' in UTF-8", + "matlabSays": "S = load(f): Invalid field name: 'café'. (MATLAB:AddField:InvalidFieldName)", + "codes": [ + "name" + ] + }, + { + "file": "name-empty.mat", + "probe": "B11f_name_empty", + "matlab": "drops", + "what": "a plain variable with an empty name, after a named one", + "matlabSays": "loads only the named variable; whos -file omits the unnamed one", + "codes": [ + "anonymous-record" + ] + }, + { + "file": "name-keyword.mat", + "probe": "B11g_name_keyword", + "matlab": "alters", + "what": "a variable named 'end'", + "matlabSays": "loads it as end_, warning MATLAB:load:loadingKeywordVariable", + "codes": [ + "name" + ] + }, + { + "file": "non-utf8-name.mat", + "probe": "B11h_name_latin1", + "matlab": "fails", + "what": "a variable named 'caf' and the Latin-1 byte e9: not UTF-8", + "matlabSays": "MATLAB crashes (an assertion on a non-UTF-8 string), in S = load(f) and in whos -file", + "codes": [ + "name" + ] + }, + { + "file": "double-integer-storage-types.mat", + "probe": "B12_numeric_types", + "matlab": "loads", + "what": "doubles stored as miDOUBLE, miINT32, miINT16 and miUINT8, plain records", + "codes": [] + }, + { + "file": "double-integer-storage-types-compressed.mat", + "probe": "B12z_numeric_types", + "matlab": "loads", + "what": "the same, compressed", + "codes": [] + }, + { + "file": "struct-wide-field-names.mat", + "probe": "B13_struct_fnlen", + "matlab": "loads", + "what": "a struct with field-name length 3, 8, 32, 64 and 128", + "codes": [] + }, + { + "file": "struct-field-name-length-too-small.mat", + "probe": "B13b_struct_fnlen_too_small", + "matlab": "loads", + "what": "a struct with field-name length 2, leaving no room for the NUL after \"bb\"", + "codes": [] + }, + { + "file": "char-ascii-utf8.mat", + "probe": "B14_ch_utf8", + "matlab": "loads", + "what": "'abc' as miUTF8", + "codes": [] + }, + { + "file": "char-ascii-uint16.mat", + "probe": "B14_ch_u16", + "matlab": "loads", + "what": "'abc' as miUINT16", + "codes": [] + }, + { + "file": "char-ascii-utf16.mat", + "probe": "B14_ch_utf16", + "matlab": "loads", + "what": "'abc' as miUTF16", + "codes": [] + }, + { + "file": "char-ascii-utf32.mat", + "probe": "B14_ch_utf32", + "matlab": "fails", + "what": "'abc' as miUTF32", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "char-latin1-utf8.mat", + "probe": "B14_ch_na_utf8", + "matlab": "loads", + "what": "'héllo' as miUTF8", + "codes": [] + }, + { + "file": "char-latin1-uint16.mat", + "probe": "B14_ch_na_u16", + "matlab": "loads", + "what": "'héllo' as miUINT16", + "codes": [] + }, + { + "file": "char-latin1-utf16.mat", + "probe": "B14_ch_na_utf16", + "matlab": "loads", + "what": "'héllo' as miUTF16", + "codes": [] + }, + { + "file": "char-latin1-utf32.mat", + "probe": "B14_ch_na_utf32", + "matlab": "fails", + "what": "'héllo' as miUTF32", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "char-cjk-utf8.mat", + "probe": "B14_ch_cjk_utf8", + "matlab": "loads", + "what": "three CJK characters as miUTF8", + "codes": [] + }, + { + "file": "char-cjk-uint16.mat", + "probe": "B14_ch_cjk_u16", + "matlab": "alters", + "what": "three CJK characters as miUINT16", + "matlabSays": "loads char codes [229 44 158], the low byte of each unit, with no warning", + "codes": [ + "char-type" + ] + }, + { + "file": "char-cjk-utf16.mat", + "probe": "B14_ch_cjk_utf16", + "matlab": "loads", + "what": "three CJK characters as miUTF16", + "codes": [] + }, + { + "file": "char-cjk-utf32.mat", + "probe": "B14_ch_cjk_utf32", + "matlab": "fails", + "what": "three CJK characters as miUTF32", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "char-emoji-utf8.mat", + "probe": "B14_ch_emoji_utf8", + "matlab": "loads", + "what": "'a', U+1F600, 'b' as miUTF8 (dims [1 4], in UTF-16 units)", + "codes": [] + }, + { + "file": "char-emoji-uint16.mat", + "probe": "B14_ch_emoji_u16", + "matlab": "fails", + "what": "'a', U+1F600, 'b' as miUINT16 (a surrogate pair)", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "char-emoji-utf16.mat", + "probe": "B14_ch_emoji_utf16", + "matlab": "loads", + "what": "'a', U+1F600, 'b' as miUTF16", + "codes": [] + }, + { + "file": "char-emoji-utf32.mat", + "probe": "B14_ch_emoji_utf32", + "matlab": "fails", + "what": "'a', U+1F600, 'b' as miUTF32", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "char-every-encoding.mat", + "probe": "B14_char_encodings", + "matlab": "fails", + "what": "the 16 char variables above in one file", + "matlabSays": "S = load(f) and load(f) fail; load(f, \"ch_utf8\") works: one bad variable fails the whole-file load", + "codes": [ + "char-type" + ] + }, + { + "file": "char-latin1-uint8.mat", + "probe": "F4_char_u8", + "matlab": "fails", + "what": "'héllo' as miUINT8 Latin-1 bytes", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "char-latin1-int8.mat", + "probe": "F4_char_i8", + "matlab": "fails", + "what": "'héllo' as miINT8 Latin-1 bytes", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "char-ascii-uint8.mat", + "probe": "F4_char_u8ascii", + "matlab": "fails", + "what": "'hello' as miUINT8", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "char-ascii-int8.mat", + "probe": "F4_char_i8ascii", + "matlab": "fails", + "what": "'hello' as miINT8", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "char-type" + ] + }, + { + "file": "header-only.mat", + "probe": "B15a_header_only_zero", + "matlab": "loads", + "what": "a 128-byte header and no records", + "matlabSays": "loads a struct with no fields", + "codes": [] + }, + { + "file": "header-only-offset-spaces.mat", + "probe": "B15b_header_only_spaces", + "matlab": "loads", + "what": "a header only, its subsystem offset eight spaces", + "matlabSays": "loads a struct with no fields", + "codes": [] + }, + { + "file": "trailing-3-zeros.mat", + "probe": "B16a_trailing3", + "matlab": "fails", + "what": "matlab-plain.mat and 3 zero bytes", + "matlabSays": "Unable to open MAT-file. File might be corrupt. (MATLAB:load:unableToReadMatFile)", + "codes": [ + "framing" + ] + }, + { + "file": "trailing-8-zeros.mat", + "probe": "B16a_trailing8", + "matlab": "fails", + "what": "matlab-plain.mat and 8 zero bytes", + "matlabSays": "Unable to open MAT-file. File might be corrupt. (MATLAB:load:unableToReadMatFile)", + "codes": [ + "framing" + ] + }, + { + "file": "uncompressed-trailing-8-zeros.mat", + "probe": "F5_raw_trailing8", + "matlab": "fails", + "what": "plain-uncompressed.mat and 8 zero bytes", + "matlabSays": "Unable to open MAT-file. File might be corrupt. (MATLAB:load:unableToReadMatFile)", + "codes": [ + "framing" + ] + }, + { + "file": "trailing-zeros-after-subsystem.mat", + "probe": "B16b_obj_trailing8", + "matlab": "loads", + "what": "matlab-objects.mat and 8 zero bytes after the subsystem", + "codes": [ + "framing" + ], + "deliberate": "bytes that are no record, after the subsystem: MATLAB's load stops at the subsystem and never reads them, but MATLAB writes nothing there" + }, + { + "file": "final-pad-cut.mat", + "probe": "B16c_trunc_pad_keep_size", + "matlab": "fails", + "what": "a last plain record with its final 4 pad bytes cut off, its size unchanged", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "framing" + ] + }, + { + "file": "final-pad-cut-size-fixed.mat", + "probe": "B16d_trunc_pad_fix_size", + "matlab": "fails", + "what": "the same, its size reduced by 4 to match", + "matlabSays": "Unable to open file (MATLAB:load:cantReadFile)", + "codes": [ + "framing", + "nbytes" + ] + }, + { + "file": "small-tags.mat", + "probe": "B17_small_tags", + "matlab": "loads", + "what": "a variable whose name and data both use the small (4-byte) tag", + "codes": [] + }, + { + "file": "version-0x0000.mat", + "probe": "F11_v0000", + "matlab": "fails", + "what": "header version 0x0000", + "matlabSays": "Unable to read file (MATLAB:load:notBinaryFile)", + "codes": [ + "not-level5" + ] + }, + { + "file": "version-0x0200.mat", + "probe": "F11_v0200", + "matlab": "fails", + "what": "header version 0x0200, on a Level-5 file", + "matlabSays": "Unable to read file (MATLAB:load:notBinaryFile), after an HDF5 error", + "codes": [ + "not-level5" + ] + }, + { + "file": "sparse-without-sparse-flag.mat", + "probe": "F12_sparse_no1000", + "matlab": "loads", + "what": "a sparse array without the 0x1000 flag bit", + "codes": [] + } +] diff --git a/test/fixtures/mat-check/version-0x0000.mat b/test/fixtures/mat-check/version-0x0000.mat new file mode 100644 index 00000000..86f5f0cc Binary files /dev/null and b/test/fixtures/mat-check/version-0x0000.mat differ diff --git a/test/fixtures/mat-check/version-0x0200.mat b/test/fixtures/mat-check/version-0x0200.mat new file mode 100644 index 00000000..99f93920 Binary files /dev/null and b/test/fixtures/mat-check/version-0x0200.mat differ diff --git a/test/fixtures/mat-check/zero-subsystem-offset.mat b/test/fixtures/mat-check/zero-subsystem-offset.mat new file mode 100644 index 00000000..cc247e9b Binary files /dev/null and b/test/fixtures/mat-check/zero-subsystem-offset.mat differ diff --git a/test/matEditGate.test.ts b/test/matEditGate.test.ts new file mode 100644 index 00000000..56bf3f10 --- /dev/null +++ b/test/matEditGate.test.ts @@ -0,0 +1,715 @@ +// Copyright 2026 The MathWorks, Inc. +// +// The edits a `.mat` takes are the edits its save writes (MatNode._editRefusal, the one rule +// BaseNode.sourceEditRefusal asks for every path an edit takes). Swept over every Level-5 fixture +// and MATLAB's verdict corpus, both ways: +// +// - the gate is the writer: for every variable, an edit forced around the gate (its value, its +// name) is refused by the save exactly where the gate refuses it; +// - every cell the editor offers takes an edit, and the save of that edit is written and reads +// back as the tree shows it; every child Add or Delete it offers saves too; +// - every cell it does not offer for the save's sake has no editor anywhere a host looks (the +// table row, the Property Inspector, the DTO, the getters), and its setter refuses it, as do +// the session's editProperty and the structural gates, leaving the file unchanged. +// +// Then each refusal by itself, in its own words, and what a MAT-file's save adds to the session: +// readOnly, addEntry, the rename's duplicate message. + +import { describe, it, expect } from 'vitest'; +import { readFileSync, readdirSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { MatWriteError } from '../src/datamodel/parser/MatWriter.js'; +import { parseMat } from '../src/datamodel/parser/MatParser.js'; +import { checkMatFile, violationsAdded } from '../src/datamodel/parser/MatFileCheck.js'; +import { sourceEditRefusal } from '../src/datamodel/node/BaseNode.js'; +import MatNode from '../src/datamodel/node/container/MatNode.js'; +import MatlabVariableNode from '../src/datamodel/node/data/MatlabVariableNode.js'; +import { toDTO } from '../src/core/dto.js'; +import { createSession } from '../src/index.js'; +import { zlibSync } from 'fflate'; +import { CLASS, cellVar, matFile, numericVar, structVar, u32le } from './tools/matBytes.js'; + +const TEST_ROOT = fileURLToPath(new URL('.', import.meta.url)); +const MAT_CHECK = join(TEST_ROOT, 'fixtures', 'mat-check'); + +function matFilesUnder(dir: string): string[] { + const out: string[] = []; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const abs = join(dir, entry.name); + if (entry.isDirectory()) { + if (abs !== MAT_CHECK) { + out.push(...matFilesUnder(abs)); + } + } else if (entry.isFile() && entry.name.endsWith('.mat') && entry.name !== 'strings_v73.mat') { + out.push(abs); + } + } + return out.sort(); +} + +const FIXTURES = matFilesUnder(TEST_ROOT); +const shown = (abs: string) => abs.slice(TEST_ROOT.length); + +function arrayBufferOf(bytes: Uint8Array): ArrayBuffer { + return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; +} + +const fileBytes = (abs: string) => arrayBufferOf(new Uint8Array(readFileSync(abs))); +const sameBytes = (a: Uint8Array, b: Uint8Array) => a.byteLength === b.byteLength && a.every((x, i) => x === b[i]); +const scalar = (name: string, value: number) => numericVar({ name, cls: CLASS.DOUBLE, dimensions: [1, 1], real: [value] }); + +/** A MatNode opened through the session, as a host opens one, and what a host does to it. */ +function opened(bytes: ArrayBuffer, name = 'f.mat') { + const session = createSession(); + const root: any = session.addMatSource(name, bytes); + const by = (n: string) => root.children.find((c: any) => c.name === n); + const edit = (node: any, prop: string, value: string) => { + session.setActive(root, node); + return session.editProperty(node.id, prop, value); + }; + const save = (): Uint8Array => (session.serializeSource(name) as { bytes: Uint8Array }).bytes; + return { session, root, by, edit, save }; +} + +/** Every node under `node`, depth first, with its path of child indices from the file. */ +function nodesWithPaths(root: any): { node: any; path: number[] }[] { + const out: { node: any; path: number[] }[] = []; + const walk = (n: any, path: number[]) => { + n.children.forEach((c: any, i: number) => { + out.push({ node: c, path: [...path, i] }); + walk(c, [...path, i]); + }); + }; + walk(root, []); + return out; +} + +const at = (root: any, path: number[]) => path.reduce((n, i) => n?.children[i], root); + +/** + * `nodes` thinned to what a sweep can afford: of the elements of one array, which are one class + * and take one edit, the first two and the last; and of a tree still past 2,500 nodes (the shared + * object graphs, of 30,000), an even stride through it. + */ +function sampled(nodes: T[]): T[] { + const kept = nodes.filter(({ node }) => { + const parent = node.parent; + if (!parent || (parent._kind !== 'array' && parent._kind !== 'string')) { + return true; + } + const i = parent.children.indexOf(node); + return i < 2 || i === parent.children.length - 1; + }); + if (kept.length <= 2500) { + return kept; + } + const stride = Math.ceil(kept.length / 2500); + return kept.filter((_, i) => i % stride === 0); +} + +/** + * What a variable shows, everywhere a value is: each node's label, value and class, by path. Two + * things a save writes as they are and the tree shows otherwise until the file is read again are + * left out of it. A complex part `+0i`: an element of a complex array added or set to a real + * number shows as that number, and reads back as the same element with the imaginary part 0 + * MATLAB gives it (`x(3) = 0` of a complex `x` is `0+0i`). And a sparse array's row set to 0: it + * keeps its row, so that the row still names it (MatlabVariableNode._syncElementFromChild), and a + * zero is no non-zero once read again; the rows of a sparse array are said by their subscripts. + */ +function shownAs(node: any): string[] { + const out: string[] = []; + const walk = (n: any, path: string) => { + out.push(`${path} ${n.displayName} = ${String(n.displayValue).replace(/(\d|Inf|NaN)\+0i/g, '$1')} (${n.className})`); + n.children.forEach((c: any, i: number) => { + if (n._sparse && /^(0|false|0\+0i)$/.test(c.displayValue)) { + return; + } + walk(c, path + '/' + (n._sparse ? c.displayName : i)); + }); + }; + walk(node, ''); + return out; +} + +/** The bytes of a save, read again, and the variable at `entry` there, as it shows. */ +function readBack(bytes: Uint8Array, entry: number): string[] { + const { root } = opened(arrayBufferOf(bytes), 'saved.mat'); + return shownAs(root.children[entry]); +} + +/** The thrown error of `fn`, or null. */ +function thrownBy(fn: () => unknown): Error | null { + try { + fn(); + } catch (e) { + return e as Error; + } + return null; +} + +/** An edit `node` takes for its Value, by what it is, and whether it took it. */ +function valueEdit(edit: (prop: string, value: string) => unknown, node: any): string | null { + const parent = node.parent; + const inArray = parent && parent._kind === 'array'; + const candidates = + inArray && parent._scalarType === 'logical' + ? ['false', 'true'] + : inArray + ? ['7', '8'] + : node.className === 'char' + ? ["'zz'", '7'] + : node._kind === 'cell' + ? ['{7, 8}', '7'] + : node.className === 'logical' + ? ['false', 'true', '7'] + : ['7', '8', "'zz'", '[1 2 3]', '{7}', 'true']; + for (const value of candidates) { + if (value === node.displayValue) { + continue; + } + if (edit('Value', value) === true) { + return value; + } + } + return null; +} + +/** + * Every top-level variable of `bytes`, each with an edit of its value and of its name forced + * around the gate: the save refuses the first exactly where the gate refuses a value edit, and + * the second exactly where it refuses a rename. Answers how many of each were written. + */ +function gateIsWriter(bytes: ArrayBuffer, file: string): { values: number; names: number } { + let values = 0; + let names = 0; + const count = opened(bytes).root.children.length; + for (let i = 0; i < count; i++) { + for (const what of ['value', 'name'] as const) { + const { root, save } = opened(bytes); + const node = root.children[i]; + // A rename is asked of the record too, as the rename itself asks it (MatNode._renameRefusal). + const refused = what === 'name' ? sourceEditRefusal(node, 'Name') ?? root._renameRefusal(node) : sourceEditRefusal(node, 'Value'); + const label = `${file}: ${node.name} (${what})`; + if (what === 'name') { + // A name no variable of the file holds, made around the session's rename. + node.name = 'gateRenamed' + i; + node._markModified('name'); + } else { + node._markModified(); + } + const thrown = thrownBy(save); + if (refused) { + expect(thrown, label + ': the gate refuses it, ' + refused).toBeInstanceOf(MatWriteError); + } else { + expect(thrown?.message, label).toBeUndefined(); + expect(readBack(save(), i), label).toEqual(shownAs(node)); + what === 'name' ? names++ : values++; + } + } + } + return { values, names }; +} + +describe('the gate is the writer: an edit forced around it is refused by the save exactly where it is refused', () => { + const totals = { values: 0, names: 0 }; + for (const file of FIXTURES) { + it(shown(file), { timeout: 60_000 }, () => { + const { values, names } = gateIsWriter(fileBytes(file), shown(file)); + totals.values += values; + totals.names += names; + }); + } + + it("MATLAB's verdict corpus (test/fixtures/mat-check), the files it loads and the ones it does not", { timeout: 60_000 }, () => { + const verdicts: { file: string }[] = JSON.parse(readFileSync(join(MAT_CHECK, 'verdicts.json'), 'utf8')); + let opened = 0; + for (const { file } of verdicts) { + let bytes: ArrayBuffer; + try { + bytes = fileBytes(join(MAT_CHECK, file)); + parseMat(bytes); + } catch { + continue; + } + gateIsWriter(bytes, file); + opened++; + } + expect(opened).toBeGreaterThanOrEqual(60); + }); + + it('writes most variables of the fixtures, fresh and renamed: the gate refuses only what it must', () => { + expect(totals.values).toBeGreaterThanOrEqual(150); + expect(totals.names).toBeGreaterThanOrEqual(300); + }); +}); + +describe('every cell the editor offers takes an edit, and its save reads back as the tree shows it', () => { + for (const file of FIXTURES) { + it(shown(file), { timeout: 60_000 }, () => { + const bytes = fileBytes(file); + const { root: probe } = opened(bytes); + let edits = 0; + for (const { node: seen, path } of sampled(nodesWithPaths(probe))) { + const offered = seen.getProperties().filter((p: any) => seen.getPropInfo(p).editable).map((p: any) => p.key); + for (const key of offered) { + const { root, edit, save } = opened(bytes); + const node = at(root, path); + const label = `${shown(file)}: ${node.matlabPath} ${key}`; + let made: string | null; + if (key === 'Name') { + made = 'cellRenamed' + edits; + expect(edit(node, 'Name', made), label).toBe(true); + } else { + made = valueEdit((prop, value) => edit(node, prop, value), node); + expect(made, label + ': no edit taken').not.toBeNull(); + } + const saved = thrownBy(save); + expect(saved?.message, label + ' = ' + made).toBeUndefined(); + expect(readBack(save(), path[0]), label + ' = ' + made).toEqual(shownAs(root.children[path[0]])); + edits++; + } + for (const op of ['add', 'remove'] as const) { + if (op === 'add' ? !seen.canAddChild() : !(seen.canRemoveChild?.() && seen.children.length > 0)) { + continue; + } + const { session, root, save } = opened(bytes); + const node = at(root, path); + const label = `${shown(file)}: ${node.matlabPath} ${op}`; + if (op === 'add') { + expect(session.addChildTo(node.id), label).not.toBeNull(); + } else { + const last = node.children[node.children.length - 1]; + session.setActive(root, last); + expect(session.deleteNodeById(last.id), label).toBe(true); + } + expect(thrownBy(save)?.message, label).toBeUndefined(); + expect(readBack(save(), path[0]), label).toEqual(shownAs(root.children[path[0]])); + edits++; + } + } + // Every variable can be deleted, and the file saves without it. + for (let i = 0; i < probe.children.length; i++) { + const { session, root, save } = opened(bytes); + const node = root.children[i]; + session.setActive(root, node); + expect(session.deleteNodeById(node.id), node.name).toBe(true); + expect(thrownBy(save)?.message, node.name).toBeUndefined(); + } + if (probe.children.some((c: any) => !sourceEditRefusal(c, 'Value'))) { + expect(edits).toBeGreaterThan(0); + } + }); + } +}); + +describe('every cell the save would refuse has no editor anywhere a host looks, and every path refuses its edit', () => { + for (const file of FIXTURES) { + it(shown(file), { timeout: 60_000 }, () => { + const bytes = fileBytes(file); + const original = new Uint8Array(bytes); + const { session, root, edit, save } = opened(bytes); + let refused = 0; + for (const { node } of sampled(nodesWithPaths(root))) { + const label = `${shown(file)}: ${node.matlabPath}`; + const row = node.toRow(); + const dto = toDTO(node); + // What a host reads is one answer, the getters' and getPropInfo's. + expect(row.Name.editable, label).toBe(node.getPropInfo(node.getProperties().find((p: any) => p.key === 'Name')).editable); + expect(row._valueEditable, label).toBe(node.getProperties().some((p: any) => p.key === 'Value') ? node.getPropInfo(node.getProperties().find((p: any) => p.key === 'Value')).editable : node.valueEditable); + expect(row._descriptionEditable, label).toBe(node.descriptionEditable); + dto.props.forEach((p: any, k: number) => expect(p.editable, label + ' ' + p.key).toBe(node.getPropInfo(node.getProperties()[k]).editable)); + const frozenValue = sourceEditRefusal(node, 'Value'); + const frozenName = sourceEditRefusal(node, 'Name'); + if (frozenName) { + expect([node.nameEditable, row.Name.editable], label).toEqual([false, false]); + const answer: any = edit(node, 'Name', 'refusedName'); + expect(answer, label).toMatchObject({ error: true, reason: frozenName }); + expect(node.setProperty('Name', 'refusedName'), label).toMatchObject({ error: true }); + refused++; + } + if (frozenValue) { + for (const p of node.getProperties()) { + if (p.key !== 'Name') { + expect(node.getPropInfo(p).editable, label + ' ' + p.key).toBe(false); + } + } + expect([node.valueEditable, row._valueEditable, node.descriptionEditable], label).toEqual([false, false, false]); + expect([node.canAddChild(), node.canRemoveChild?.() ?? false], label).toEqual([false, false]); + expect(session.addChildTo(node.id), label).toBeNull(); + for (const value of ['7', "'zz'", '{1}']) { + if (value === node.displayValue) { + continue; + } + expect(edit(node, 'Value', value), label + ' = ' + value).toMatchObject({ error: true }); + expect(node.setProperty('Value', value), label + ' = ' + value).toMatchObject({ error: true }); + } + if (node.parent !== root) { + session.setActive(root, node); + expect(session.deleteNodeById(node.id), label).toBe(false); + } + refused++; + } + } + // Nothing it refused changed the file. + expect(root.dirty).toBe(false); + expect(sameBytes(save(), original)).toBe(true); + if (refused === 0) { + expect(root.children.every((c: any) => !sourceEditRefusal(c, 'Value'))).toBe(true); + } + }); + } +}); + +const CASES = join(TEST_ROOT, 'parity/artifacts/mat/cases.mat'); +const fixture = (rel: string) => fileBytes(join(TEST_ROOT, rel)); + +describe('what each kind of variable of a .mat takes', () => { + const editRefused = (name: string, what: string) => + `Cannot edit "${name}": it is ${what}, which a MAT-file save writes only as it was read, or renamed, so its edit cannot be saved.`; + + it("an object's typed node: renamed and deleted, and nothing else, at any depth", () => { + // ParamMat.mat's Simulink.Parameter holds a 2x3 matrix: a Value row, and a row per element. + const deep = opened(fixture('fixtures/mcos/ParamMat.mat')).root.children[0]; + expect(deep.flatten().length).toBe(8); + for (const node of deep.flatten()) { + const offered = node.getProperties().filter((p: any) => node.getPropInfo(p).editable).map((p: any) => p.key); + expect([offered, node.canAddChild(), node.canRemoveChild?.() ?? false], node.matlabPath).toEqual([node === deep ? ['Name'] : [], false, false]); + } + const { session, root, by, edit, save } = opened(fileBytes(CASES), 'cases.mat'); + const param = by('aParam'); + expect(param.constructor.name).toBe('ParameterNode'); + const under = param.flatten(); + expect(param.nameEditable).toBe(true); + for (const node of under) { + expect(node.getProperties().filter((p: any) => node.getPropInfo(p).editable).map((p: any) => p.key), node.matlabPath).toEqual( + node === param ? ['Name'] : [], + ); + } + // Every property, refused in the save's own words, by the session and by the node. + for (const prop of ['Value', 'Description', 'DataType', 'Min', 'Unit']) { + expect(edit(param, prop, '3'), prop).toEqual({ error: true, reason: editRefused('aParam', 'a Simulink.Parameter'), invalidValue: '3', validValue: expect.any(String) }); + expect(param.setProperty(prop, '3'), prop).toMatchObject({ error: true, reason: editRefused('aParam', 'a Simulink.Parameter') }); + } + expect([param.status, root.dirty]).toEqual(['', false]); + expect(edit(param, 'Name', 'renamedParam')).toBe(true); + expect(readBack(save(), root.children.indexOf(param))).toEqual(shownAs(param)); + session.setActive(root, param); + expect(session.deleteNodeById(param.id)).toBe(true); + expect(opened(arrayBufferOf(save())).by('renamedParam')).toBeUndefined(); + }); + + it('a string, a function handle, a value not decoded: renamed and deleted, their values not edited', () => { + const z = numericVar({ name: 'z', cls: CLASS.DOUBLE, dimensions: [1, 1], real: [3], imag: [4] }); + z[16] = 0xff; + const cases: [ArrayBuffer, string, string][] = [ + [fileBytes(CASES), 'strScalar', 'a string'], + [fixture('fixtures/display/dispcat_opaque.mat'), 'fh_sin', 'a function handle'], + [matFile([scalar('a', 1), z]), 'z', 'a value that was not decoded'], + ]; + for (const [bytes, name, what] of cases) { + const { root, by, edit, save } = opened(bytes); + const node = by(name); + expect([node.nameEditable, node.valueEditable, node.toRow()._valueEditable], name).toEqual([true, false, false]); + expect(edit(node, 'Value', '5'), name).toMatchObject({ error: true }); + expect(node.setProperty('Value', '5'), name).toMatchObject({ error: true }); + expect(sourceEditRefusal(node, 'Value'), name).toBe(editRefused(name, what)); + expect(root.dirty, name).toBe(false); + expect(edit(node, 'Name', name + 'R'), name).toBe(true); + const index = root.children.indexOf(node); + expect(readBack(save(), index), name).toEqual(shownAs(node)); + } + }); + + it('a plain variable holding an object, at any depth: renamed and deleted, nothing in it edited', () => { + const { root, by, edit, save } = opened(fixture('fixtures/mcos/complex_objects.mat')); + const s = by('s'); + const z = s.children.find((c: any) => c.name === 'z'); + const why = 'Cannot edit "s": s.p is a Simulink.Parameter, which this package cannot write into a MAT-file.'; + expect([s.valueEditable, z.valueEditable, z.nameEditable, s.canAddChild()]).toEqual([false, false, false, false]); + expect(edit(z, 'Value', '5')).toMatchObject({ error: true, reason: why }); + expect(sourceEditRefusal(z, 'Value')).toBe(why); + expect(root.dirty).toBe(false); + expect(edit(s, 'Name', 'sR')).toBe(true); + expect(readBack(save(), root.children.indexOf(s))).toEqual(shownAs(s)); + }); + + it('a plain variable: every cell, and Add and Delete of its rows, as the table offers them', () => { + const { by } = opened(fileBytes(CASES), 'cases.mat'); + expect([by('kp').nameEditable, by('kp').valueEditable]).toEqual([true, true]); + expect(by('mat2x3').children.every((c: any) => c.valueEditable)).toBe(true); + expect([by('cellFlat').canAddChild(), by('structScalar').canAddChild(), by('rowVec').canAddChild()]).toEqual([true, true, true]); + }); + + it('a struct array, and each element of one, takes no Add: a save writes a field into every element or none', () => { + const { session, root, by, save } = opened(fileBytes(CASES), 'cases.mat'); + const array = by('struct1x3'); + const original = new Uint8Array(fileBytes(CASES)); + for (const node of [array, array.children[0]]) { + expect(node.canAddChild(), node.matlabPath).toBe(false); + expect(session.addChildTo(node.id), node.matlabPath).toBeNull(); + expect(sourceEditRefusal(node, 'Add')).toBe( + 'Cannot edit "struct1x3": struct1x3 is a 1x3 struct, whose fields a save writes into every element of it or none, and Add gives one struct a field of its own.', + ); + } + // Its elements' fields take their edits, as before. + expect(array.children[0].children[0].valueEditable).toBe(true); + expect([root.dirty, sameBytes(save(), original)]).toEqual([false, true]); + }); + + it("a value typed in that a save cannot write, a string, is refused before it is made", () => { + const { root, by, edit, save } = opened(fileBytes(CASES), 'cases.mat'); + const original = new Uint8Array(fileBytes(CASES)); + for (const [node, typed, why] of [ + [by('kp'), '"abc"', 'Cannot edit "kp": kp would be a string, which this package cannot write into a MAT-file.'], + [by('kp'), '["a" "b"]', 'Cannot edit "kp": kp would be a string, which this package cannot write into a MAT-file.'], + [by('cellFlat').children[0], '{1, "a"}', 'Cannot edit "cellFlat": cellFlat{1} would hold a string, which this package cannot write into a MAT-file.'], + [by('structScalar').children[0], '"x"', 'Cannot edit "structScalar": structScalar.a would be a string, which this package cannot write into a MAT-file.'], + ] as [any, string, string][]) { + const was = shownAs(node); + expect(edit(node, 'Value', typed), typed).toEqual({ error: true, reason: why, invalidValue: typed, validValue: node.displayValue }); + expect(shownAs(node), typed).toEqual(was); + } + // Nothing was edited: the file is not dirty, and saves as itself. + expect([root.dirty, by('kp').status, sameBytes(save(), original)]).toEqual([false, '', true]); + // A char is a value a save writes. + expect(edit(by('kp'), 'Value', "'abc'")).toBe(true); + expect(readBack(save(), root.children.indexOf(by('kp')))).toEqual(shownAs(by('kp'))); + }); + + it('a variable holding a container read short, at any depth: renamed and deleted, nothing in it edited', () => { + // A save would write the elements the reader could not read as empty doubles, which the file + // did not hold (MatFileWriter.shortIn). + const short = cellVar('', [scalar('', 1)], [1, 3]); + const { root, by, edit, save } = opened(matFile([cellVar('c', [scalar('', 1)], [1, 3]), structVar('s', ['a', 'b'], [{ a: short, b: scalar('', 2) }]), scalar('ok', 3)])); + const why = { + c: 'Cannot edit "c": c is a 1x3 cell holding 1 of the 3 elements it declares, and a save would write the ones it does not hold as empty.', + s: 'Cannot edit "s": s.a is a 1x3 cell holding 1 of the 3 elements it declares, and a save would write the ones it does not hold as empty.', + }; + expect(edit(by('c').children[0], 'Value', '5')).toMatchObject({ error: true, reason: why.c }); + expect(edit(by('s').children[1], 'Value', '5')).toMatchObject({ error: true, reason: why.s }); + expect([by('c').canAddChild(), by('s').canAddChild(), by('ok').valueEditable]).toEqual([false, false, true]); + expect(root.dirty).toBe(false); + expect(edit(by('c'), 'Name', 'c2')).toBe(true); + expect(edit(by('ok'), 'Value', '4')).toBe(true); + expect(parseMat(arrayBufferOf(save())).records.map((r) => r.name)).toEqual(['c2', 's', 'ok']); + }); + + it('a container the node ceiling built without its rows is judged by what it was read as', () => { + // nested_handles.mat's c_fh is a cell of function handles. Built with no rows, it showed no + // handle to refuse, and took an edit the save then refused. + const bytes = fixture('fixtures/display/nested_handles.mat'); + const cut: any = MatNode.fromParsed(parseMat(bytes), 'f.mat', { nodeCeiling: 0 }); + const cFh = cut.children.find((c: any) => c.name === 'c_fh'); + expect([cFh._cutByCeiling > 0, cFh.children.length]).toEqual([true, 0]); + expect(sourceEditRefusal(cFh, 'Value')).toBe('Cannot edit "c_fh": c_fh{1} is a function handle, which this package cannot write into a MAT-file.'); + expect(cFh.valueEditable).toBe(false); + }); +}); + +describe('what a file, or where a variable stands in it, refuses of every edit', () => { + it('a variable stored after the subsystem: neither renamed nor edited, and deleted', () => { + const late = arrayBufferOf(new Uint8Array([...new Uint8Array(fixture('fixtures/mcos/Param.mat')), ...scalar('late', 4)])); + const { session, root, by, edit, save } = opened(late); + const node = by('late'); + const why = + 'Cannot edit "late": it is stored after the file\'s objects, where MATLAB does not read it, so it would not be read written there, ' + + 'and moved, it would change what MATLAB loads of the file.'; + expect([node.nameEditable, node.valueEditable, node.toRow().Name.editable]).toEqual([false, false, false]); + expect(edit(node, 'Name', 'late2')).toMatchObject({ error: true, reason: why }); + expect(edit(node, 'Value', '5')).toMatchObject({ error: true, reason: why }); + expect(node.setProperty('Name', 'late2')).toMatchObject({ error: true, reason: why }); + // And by the rename's own refusal of a name the node does not take (nameEditable), for a setter + // that does not ask the source first: as the source says it, not as a name the entry cannot carry. + const asked = node._refuseEncodedEdit; + node._refuseEncodedEdit = () => null; + expect(node.setProperty('Name', 'late2')).toMatchObject({ error: true, reason: why }); + node._refuseEncodedEdit = asked; + expect(root.dirty).toBe(false); + // The variable before the subsystem is as any other. + expect(by('Param').nameEditable).toBe(true); + session.setActive(root, node); + expect(session.deleteNodeById(node.id)).toBe(true); + expect(parseMat(arrayBufferOf(save())).records.map((r) => r.name)).toEqual(['Param', '']); + }); + + it('two variables of one name: neither value edited until one is renamed away', () => { + const { root, edit, save } = opened(matFile([scalar('a', 1), scalar('a', 2), scalar('b', 3)])); + const [first, second] = root.children; + const why = 'Cannot edit "a": the file holds another variable named "a", and MATLAB loads only one of them.'; + // The session takes no edit of either, by an id two nodes answer to (DataModel.idIsShared); + // the nodes' own setters are asked here. + for (const node of [first, second]) { + expect([node.valueEditable, sourceEditRefusal(node, 'Value')]).toEqual([false, why]); + expect(edit(node, 'Value', '5')).toBe(false); + expect(node.setProperty('Value', '5')).toMatchObject({ error: true, reason: why }); + } + expect(second.setProperty('Name', 'a2')).toBe(true); + expect([first.valueEditable, second.valueEditable]).toEqual([true, true]); + expect(edit(first, 'Value', '5')).toBe(true); + expect(parseMat(arrayBufferOf(save())).variables.map((v) => [v.name, v.value])).toEqual([['a', 5], ['a2', 2], ['b', 3]]); + }); + + it('what the gate found is forgotten for the variable an edit changed, and the names are counted as they move', () => { + const { session, root, by, edit } = opened(matFile([scalar('a', 1), scalar('a', 2), scalar('b', 3), cellVar('c', [scalar('', 4)])])); + const verdictKept = (n: any) => root._valueVerdicts.has(n); + const [a1, a2, b, c] = root.children; + root.children.forEach((n: any) => n.valueEditable); + expect(root.children.map(verdictKept)).toEqual([true, true, true, true]); + // An edit under `c` forgets what was found of `c`, and of nothing else. + expect(edit(c.children[0], 'Value', '5')).toBe(true); + expect(root.children.map(verdictKept)).toEqual([true, true, true, false]); + // A name moved by a rename, its undo and its redo, an addition and a delete, and their undo: + // what the gate says of the two `a`s, and what the file is said to hold, follow each. + const holds = (...names: string[]) => names.map((n) => root._namespaceHolds(n)); + expect([a1.valueEditable, a2.valueEditable]).toEqual([false, false]); + expect(a2.setProperty('Name', 'z')).toBe(true); + expect([a1.valueEditable, a2.valueEditable, holds('a', 'z')]).toEqual([true, true, [1, 1]]); + expect(edit(b, 'Name', 'y')).toBe(true); + expect(holds('b', 'y')).toEqual([0, 1]); + session.undo(); + expect(holds('b', 'y')).toEqual([1, 0]); + session.redo(); + expect(holds('b', 'y')).toEqual([0, 1]); + expect(root.execAddEntry(undefined, 'a')).toBeNull(); + const added = root.execAddEntry(undefined, 'n'); + expect([holds('n'), root.execAddEntry(undefined, 'n')]).toEqual([[1], null]); + expect(root.execRemoveEntry(by('n'))).not.toBeNull(); + expect(holds('n')).toEqual([0]); + added.redo(); + expect(holds('n')).toEqual([1]); + added.undo(); + expect(holds('n')).toEqual([0]); + // A variable whose slot changes hands (BaseNode._replaceWith) has the names counted again. + expect(a1._replaceWith(MatlabVariableNode.createDefault('q', root))).toBe(true); + expect(holds('a', 'q', 'z')).toEqual([0, 1, 1]); + }); + + it('a name the file holds as a record the reader dropped is taken: no rename or addition into it', () => { + // A record that is not a matrix (an miINT32 at the top level) is dropped by the reader, and + // kept by every save as its bytes; its name is still the file's. + const { root, edit } = opened(matFile([scalar('a', 1), scalar('b', 2)])); + expect(root._namespaceHolds('a')).toBe(1); + expect(edit(root.children[1], 'Name', 'a')).toEqual({ error: true, reason: "'a' already exists in f.mat", invalidValue: 'a', validValue: 'b' }); + }); + + it('a record the reader dropped with no name read out of it holds none: an addition and a rename into any name are taken', () => { + // A compressed record whose payload is no zlib stream: the reader drops it, and no name is + // read out of it. MATLAB fails the whole load on it (`compressed-wrapper`), so no name an + // addition or a rename takes is one MATLAB loads beside it, and the save breaks only that. + const broken = new Uint8Array([...u32le(15), ...u32le(8), 1, 2, 3, 4, 5, 6, 7, 8]); + const input = matFile([scalar('a', 1), broken]); + const before = checkMatFile(new Uint8Array(input)); + expect(before.map((v) => v.code)).toEqual(['compressed-wrapper']); + const { root, edit, save } = opened(input); + expect([root.records[1].status, root.records[1].name, root.readOnly]).toEqual(['dropped', null, false]); + expect(root.execAddEntry(undefined, 'x')).not.toBeNull(); + expect(edit(root.children[0], 'Name', 'y')).toBe(true); + const saved = save(); + expect(parseMat(arrayBufferOf(saved)).variables.map((v) => v.name)).toEqual(['y', 'x']); + expect(violationsAdded(before, checkMatFile(saved), new Map([['y', 'a']]))).toEqual([]); + }); + + it('a variable whose record holds bytes past its element: no rename, refused as it is made; its value is written fresh', () => { + // A compressed record whose stream inflates to the element and 8 bytes more: the reader reads + // the element, and a save has no element of the record's own to put a new name in. + const stream = zlibSync(new Uint8Array([...scalar('a', 1), ...new Uint8Array(8)])); + const record = new Uint8Array([...u32le(15), ...u32le(stream.length), ...stream]); + const { root, by, edit, save } = opened(matFile([record, scalar('b', 2)])); + const node = by('a'); + expect([root.framed, node.nameEditable]).toEqual([true, true]); + const why = `Cannot edit "a": the record it was read from, at byte 128, is not a whole element whose name can be replaced, so it cannot be renamed.`; + expect(edit(node, 'Name', 'a2')).toEqual({ error: true, reason: why, invalidValue: 'a2', validValue: 'a' }); + expect([node.name, root.dirty]).toEqual(['a', false]); + expect(edit(node, 'Value', '5')).toBe(true); + expect(parseMat(arrayBufferOf(save())).variables.map((v) => [v.name, v.value])).toEqual([['a', 5], ['b', 2]]); + }); + + it('a file no save of which can be written is read-only, and takes no edit, addition or delete', () => { + const z = new Uint8Array(8); + const files: [string, () => any, RegExp][] = [ + ['unframed', () => opened(matFile([scalar('a', 1), scalar('b', 2)], { trailing: z })), /^Cannot edit "f\.mat": this package could not frame 8 byte\(s\) of it/], + ['an unnamed record that is not the subsystem', () => opened(matFile([scalar('a', 1), scalar('', 2), scalar('b', 3)])), /^Cannot edit "f\.mat": the record at byte \d+ holds a value with no name/], + [ + "a host's parse that carries no records", + () => { + const session = createSession(); + const { header, variables } = parseMat(fileBytes(CASES)); + const root: any = session.addMatSourceParsed('f.mat', { header, variables }); + return { + session, + root, + edit: (node: any, prop: string, value: string) => { + session.setActive(root, node); + return session.editProperty(node.id, prop, value); + }, + }; + }, + /^Cannot edit "f\.mat": it was opened without the records a save writes back/, + ], + ]; + for (const [what, open, why] of files) { + const { session, root, edit } = open(); + expect(root.readOnly, what).toBe(true); + const node = root.children[0]; + expect([node.nameEditable, node.valueEditable], what).toEqual([false, false]); + expect(edit(node, 'Value', '5').reason, what).toMatch(why); + expect(edit(node, 'Name', 'renamed').reason, what).toMatch(why); + session.setActive(root, node); + expect(session.deleteNodeById(node.id), what).toBe(false); + expect(session.addEntry('', 'MatlabVariable'), what).toBeNull(); + expect([root.children[0], root.dirty], what).toEqual([node, false]); + } + }); + + it('a file whose bytes the host has since handed away becomes read-only', () => { + const input = fileBytes(CASES); + const { root, by } = opened(input, 'cases.mat'); + expect([root.readOnly, by('kp').valueEditable]).toEqual([false, true]); + structuredClone(input, { transfer: [input] }); + expect([root.readOnly, by('kp').valueEditable, by('kp').nameEditable]).toEqual([true, false, false]); + }); +}); + +describe('the session, on a .mat', () => { + it('a file a save can write is not read-only', () => { + for (const file of FIXTURES) { + expect(opened(fileBytes(file)).root.readOnly, shown(file)).toBe(false); + } + }); + + it('addEntry adds the double 0, named var, before the subsystem, and its undo and redo are saved', () => { + const { session, root, save } = opened(fileBytes(CASES), 'cases.mat'); + session.setActiveContext(root); + const added: any = session.addEntry('', 'MatlabVariable'); + expect([added.name, added.displayValue, added.className, added.parent]).toEqual(['var', '0', 'double', root]); + expect(session.getEntryNode()).toBe(added); + const again: any = session.addEntry('', 'MatlabVariable'); + expect(again.name).toBe('var1'); + let parsed = parseMat(arrayBufferOf(save())); + expect(parsed.records.slice(-3).map((r) => r.name)).toEqual(['var', 'var1', '']); + expect(parsed.variables.find((v) => v.name === 'var')).toMatchObject({ className: 'double', dimensions: [1, 1], value: 0 }); + session.undo(); + session.undo(); + expect(root.children.includes(added)).toBe(false); + expect(parseMat(arrayBufferOf(save())).records.map((r) => r.name)).not.toContain('var'); + session.redo(); + parsed = parseMat(arrayBufferOf(save())); + expect(parsed.records.slice(-2).map((r) => r.name)).toEqual(['var', '']); + // An entry named by the caller, and what a save could not write. + expect(session.addEntry('', 'MatlabVariable', 'myVar').name).toBe('myVar'); + expect(session.addEntry('', 'MatlabVariable', 'kp')).toBeNull(); + expect(session.addEntry('', 'MatlabVariable', '1bad')).toBeNull(); + expect(session.addEntry('', 'Simulink.Parameter')).toBeNull(); + expect(parseMat(arrayBufferOf(save())).records.slice(-3).map((r) => r.name)).toEqual(['var', 'myVar', '']); + }); + + it("a rename into a name the file holds names the file; a dictionary's keeps its wording", () => { + const { by, edit } = opened(fileBytes(CASES), 'cases.mat'); + expect(edit(by('kp'), 'Name', 'scalarD')).toEqual({ error: true, reason: "'scalarD' already exists in cases.mat", invalidValue: 'scalarD', validValue: 'kp' }); + // A host's srcId that is a path names the file by its basename. + const session = createSession(); + const root: any = session.addMatSource('/some/where/cases.mat', fileBytes(CASES)); + expect(root.children.find((c: any) => c.name === 'kp').setProperty('Name', 'scalarD').reason).toBe("'scalarD' already exists in cases.mat"); + }); +}); diff --git a/test/matFileCheck.test.ts b/test/matFileCheck.test.ts new file mode 100644 index 00000000..0df958b1 --- /dev/null +++ b/test/matFileCheck.test.ts @@ -0,0 +1,660 @@ +// Copyright 2026 The MathWorks, Inc. +// The contract of the strict MAT-file checker (src/datamodel/parser/MatFileCheck.ts). +// +// `checkMatFile` claims to say whether MATLAB loads a file, and the claim is only as good as +// the ground truth it is held to. So the first block holds it to MATLAB's own verdicts: the +// files in test/fixtures/mat-check are copies of files MATLAB R2027a wrote, most of them +// edited one byte range at a time, and verdicts.json records what `S = load(f)` did with +// each (loads; fails; loads with a variable silently missing; loads with a value or a name +// changed) and the violation codes the checker gives it. Every file MATLAB did not load as +// stored must have a violation, and every file it did load must have none, except the short +// list of deliberate differences below, each with its reason. There is no MATLAB failure in +// the corpus the checker does not see. +// +// The second block runs it over every Level-5 `.mat` already in this repo. MATLAB wrote all +// of them, so a violation there is a false positive, or a finding about the fixture. +// +// The rest is one rule at a time on bytes built here (test/tools/matBytes.ts), including the +// ones no probe broke, and the two promises the save path leans on: the check never throws, +// and its work is bounded however the bytes lie. + +import { describe, it, expect, afterEach } from 'vitest'; +import { readdirSync, readFileSync, statSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { deflateSync, gzipSync, zlibSync } from 'fflate'; +import { checkMatFile, violationsAdded, type MatViolation, type MatViolationCode } from '../src/datamodel/parser/MatFileCheck.js'; +import { setNativeInflate } from '../src/datamodel/parser/Inflate.js'; +import { + CLASS, + MI, + arrayFlags, + cellVar, + charVar, + dims, + element, + matFile, + matrix, + numericVar, + sparseVar, + structVar, + u32le, + varName, +} from './tools/matBytes.js'; + +const TEST = fileURLToPath(new URL('.', import.meta.url)); +const CORPUS = join(TEST, 'fixtures', 'mat-check'); + +interface Verdict { + file: string; + probe: string; + matlab: 'loads' | 'fails' | 'drops' | 'alters'; + what: string; + matlabSays?: string; + codes: MatViolationCode[]; + deliberate?: string; +} + +const verdicts = JSON.parse(readFileSync(join(CORPUS, 'verdicts.json'), 'utf8')) as Verdict[]; + +const read = (path: string): Uint8Array => new Uint8Array(readFileSync(path)); +const codesOf = (violations: MatViolation[]): MatViolationCode[] => [...new Set(violations.map((v) => v.code))].sort(); +const codes = (bytes: Uint8Array): MatViolationCode[] => codesOf(checkMatFile(bytes)); + +afterEach(() => { + setNativeInflate(undefined); +}); + +/** + * The files MATLAB loads that the checker flags anyway, and why. They are the whole list: a + * file that loads and is flagged without being named here fails the corpus test. + */ +const DELIBERATE: Record = { + // MATLAB loads a name stored twice without a word, and which copy a caller gets depends on + // how it asks: `load(f)` keeps the last, `load(f, name)` the first. A save that wrote one + // would be writing that ambiguity, so it is a violation. + 'duplicate-name-later-copy.mat': 'duplicate-name', + 'duplicate-name-earlier-copy.mat': 'duplicate-name', + 'duplicate-object-names.mat': 'duplicate-name', + // Eight zero bytes after the subsystem load, because MATLAB's load stops reading at the + // subsystem. They are no record all the same, MATLAB writes nothing after the subsystem, and + // its `save -append` reads past it (it revived a variable stored there), so they are a + // `framing` violation like zero bytes anywhere else. + 'trailing-zeros-after-subsystem.mat': 'framing', +}; + +describe('the MATLAB-verdict corpus', () => { + it('is what verdicts.json says it is', () => { + const files = readdirSync(CORPUS).filter((f) => f.endsWith('.mat')).sort(); + expect(files).toEqual(verdicts.map((v) => v.file).sort()); + expect(verdicts.filter((v) => v.matlab !== 'loads').length).toBeGreaterThanOrEqual(36); + expect(Object.keys(DELIBERATE).sort()).toEqual(verdicts.filter((v) => v.deliberate).map((v) => v.file).sort()); + }); + + for (const engine of ['the detected inflate engine', 'fflate'] as const) { + describe(`with ${engine}`, () => { + for (const v of verdicts) { + it(`${v.file}: MATLAB ${v.matlab}`, () => { + if (engine === 'fflate') setNativeInflate(null); + const found = checkMatFile(read(join(CORPUS, v.file))); + expect(codesOf(found)).toEqual(v.codes); + if (v.matlab !== 'loads') { + expect(found.length).toBeGreaterThan(0); + } else if (DELIBERATE[v.file]) { + expect(codesOf(found)).toEqual([DELIBERATE[v.file]]); + } else { + expect(found).toEqual([]); + } + }); + } + }); + } + + it('names the variable each per-variable violation is in', () => { + const after = checkMatFile(read(join(CORPUS, 'variable-after-subsystem.mat'))); + expect(after).toEqual([expect.objectContaining({ code: 'subsystem-not-last', variable: 'd_scalar' })]); + const chars = checkMatFile(read(join(CORPUS, 'char-every-encoding.mat'))); + expect(chars.map((v) => v.variable)).toEqual(['ch_utf32', 'ch_na_utf32', 'ch_cjk_u16', 'ch_cjk_utf32', 'ch_emoji_u16', 'ch_emoji_utf32']); + const crash = checkMatFile(read(join(CORPUS, 'non-utf8-name.mat'))); + expect(crash).toEqual([expect.objectContaining({ code: 'name', message: expect.stringContaining('crashes') })]); + }); +}); + +/** Every `.mat` under test/ but the corpus above, which has verdicts of its own. */ +function repoMatFiles(dir: string, out: string[] = []): string[] { + for (const name of readdirSync(dir)) { + const path = join(dir, name); + if (statSync(path).isDirectory()) { + if (path !== CORPUS) repoMatFiles(path, out); + } else if (name.endsWith('.mat')) { + out.push(path); + } + } + return out.sort(); +} + +describe('the MATLAB-written .mat fixtures in this repo', () => { + const files = repoMatFiles(TEST); + // A Level-5 file holds version 0x0100 (bytes 00 01); the one -v7.3 fixture holds 00 02. + const level5 = files.filter((f) => { + const b = read(f); + return b[124] === 0x00 && b[125] === 0x01; + }); + + it('are found', () => { + expect(level5.length).toBeGreaterThanOrEqual(35); + expect(files.length - level5.length).toBe(1); + }); + + for (const file of level5) { + it(`${file.slice(TEST.length)} has no violation`, () => { + expect(checkMatFile(read(file))).toEqual([]); + }); + } + + it('says a -v7.3 file is no Level-5 one', () => { + const v73 = files.find((f) => !level5.includes(f))!; + expect(checkMatFile(read(v73))).toEqual([expect.objectContaining({ code: 'not-level5', message: expect.stringContaining('-v7.3') })]); + }); +}); + +// ---- Bytes built here ------------------------------------------------------------------- + +function concat(parts: Uint8Array[]): Uint8Array { + const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0)); + let at = 0; + for (const p of parts) { + out.set(p, at); + at += p.length; + } + return out; +} + +/** A record holding `el` compressed, as `save -v7` writes one: `wrap` is the stream's framing. */ +function compressed(el: Uint8Array, wrap: (b: Uint8Array) => Uint8Array = zlibSync): Uint8Array { + const z = wrap(el); + return concat([u32le(MI.COMPRESSED), u32le(z.length), z]); +} + +/** A record of raw bytes under a tag of `type`, with `n` declared (its length by default). */ +function rawRecord(type: number, body: Uint8Array, n = body.length): Uint8Array { + return concat([u32le(type), u32le(n), body]); +} + +/** A subsystem record: an unnamed uint8 [1 N] array whose bytes are a MAT stream of `elements`. */ +function subsystem(elements: Uint8Array[] = [numericVar({ name: '', cls: CLASS.DOUBLE, dimensions: [1, 1], real: [1] })]): Uint8Array { + const stream = concat([new Uint8Array([0x00, 0x01, 0x49, 0x4d, 0, 0, 0, 0]), ...elements]); + return matrix([arrayFlags(CLASS.UINT8), dims([1, stream.length]), varName(''), element(MI.UINT8, stream)]); +} + +/** + * A MAT-file of `records`, its header's subsystem offset pointing at `records[subsystemAt]`, or + * holding `offset` when that is a number, or 0. + */ +function file(records: Uint8Array[], subsystemAt?: number, offset?: number): Uint8Array { + const bytes = new Uint8Array(matFile(records)); + const at = subsystemAt === undefined ? offset ?? 0 : 128 + records.slice(0, subsystemAt).reduce((n, r) => n + r.length, 0); + new DataView(bytes.buffer).setUint32(116, at, true); + return bytes; +} + +const x = (name = 'x', real = [1, 2, 3]): Uint8Array => numericVar({ name, cls: CLASS.DOUBLE, dimensions: [1, real.length], real }); + +/** The one violation `bytes` has, which has to be one. */ +function only(bytes: Uint8Array): MatViolation { + const found = checkMatFile(bytes); + expect(found).toHaveLength(1); + return found[0]; +} + +describe('bytes this test builds', () => { + it('are read where they are, in a view into a larger buffer', () => { + const bytes = file([x(), compressed(charVar('t', 'abc', 18))]); + const larger = new Uint8Array(bytes.length + 64); + larger.set(bytes, 32); + expect(checkMatFile(larger.subarray(32, 32 + bytes.length))).toEqual(checkMatFile(bytes)); + expect(codes(bytes)).toEqual(['char-type']); + }); + + it('are clean when they follow every rule', () => { + const s = structVar('s', ['a', 'bb'], [{ a: x(''), bb: charVar('', 'héllo', MI.UTF16) }]); + const c = cellVar('c', [x(''), charVar('', 'a\u{1F600}b', MI.UTF8, [1, 4]), matrix([])]); + const sp = sparseVar({ name: 'sp', dimensions: [2, 2], ir: [0, 1], jc: [0, 1, 2], real: [1, 2] }); + const i8 = numericVar({ name: 'i8', cls: CLASS.INT8, dimensions: [1, 2], real: [-5, 7] }); + const narrowed = numericVar({ name: 'd', cls: CLASS.DOUBLE, dimensions: [1, 3], dataType: MI.UINT8, real: [1, 2, 3] }); + expect(checkMatFile(file([x(), s, compressed(c), sp, i8, narrowed, compressed(subsystem())], 6))).toEqual([]); + expect(checkMatFile(file([]))).toEqual([]); + }); +}); + +describe('the header', () => { + it('short-file: fewer than 128 bytes', () => { + expect(only(new Uint8Array(100))).toMatchObject({ code: 'short-file', at: 0 }); + }); + + it('not-level5: a version or an endian mark that is not a Level-5 file\'s', () => { + const v = (b124: number, b125: number, b126 = 0x49, b127 = 0x4d) => { + const bytes = file([x()]); + bytes.set([b124, b125, b126, b127], 124); + return only(bytes); + }; + expect(v(0x00, 0x00)).toMatchObject({ code: 'not-level5', at: 124 }); + expect(v(0x00, 0x02).message).toContain('-v7.3'); + expect(v(0x00, 0x01, 0x58, 0x58)).toMatchObject({ code: 'not-level5', at: 126 }); + // 'MI' wants the version as 01 00: 00 01 with 'MI' is a version and a mark that disagree. + expect(v(0x00, 0x01, 0x4d, 0x49).message).toContain('disagree'); + }); + + it('big-endian: noted, and nothing after the header checked', () => { + const bytes = file([rawRecord(MI.DOUBLE, new Uint8Array(8))]); + bytes.set([0x01, 0x00, 0x4d, 0x49], 124); + expect(only(bytes)).toMatchObject({ code: 'big-endian', at: 126 }); + }); + + it('level4-lookalike: a zero 16-bit half in the first four bytes', () => { + for (const lead of [[0, 0, 0x41, 0x41], [0x41, 0x41, 0, 0]]) { + const bytes = file([x()]); + bytes.set(lead, 0); + expect(only(bytes)).toMatchObject({ code: 'level4-lookalike', at: 0 }); + } + const one = file([x()]); + one.set([0, 0x41, 0x41, 0], 0); + expect(checkMatFile(one)).toEqual([]); + }); +}); + +describe('framing', () => { + it('a record cut short', () => { + const bytes = file([x(), x('y')]); + expect(only(bytes.subarray(0, bytes.length - 8))).toMatchObject({ code: 'framing', at: 128 + x().length }); + }); + + it('bytes after the last record: 1-7 of anything, or zeros MATLAB reads as a type-0 tag', () => { + for (const tail of [new Uint8Array([1, 2, 3]), new Uint8Array(5), new Uint8Array(8), new Uint8Array(100)]) { + const at = 128 + x().length; + expect(only(concat([file([x()]), tail]))).toMatchObject({ code: 'framing', at }); + } + }); + + it('zero padding after a compressed record, which is never padded', () => { + const z = compressed(x()); + const pad = new Uint8Array((8 - (z.length % 8)) % 8 || 8); + const found = checkMatFile(file([z, pad, compressed(x('y'))])); + expect(found).toEqual([expect.objectContaining({ code: 'framing', at: 128 + z.length })]); + }); + + it('a plain record missing its final pad', () => { + // A 1x1 uint8 whose data takes the small tag ends on a word boundary anyway, so take one + // whose data is 3 bytes, padded to 8, and cut the pad. + const el = numericVar({ name: 'u', cls: CLASS.UINT8, dimensions: [1, 3], real: [1, 2, 3] }); + const cut = el.subarray(0, el.length - 5); + new DataView(cut.buffer, cut.byteOffset).setUint32(4, cut.length - 8, true); + expect(codes(file([cut]))).toEqual(['framing', 'nbytes']); + }); + + it('bytes after the subsystem\'s record, which MATLAB\'s load never reads', () => { + const found = checkMatFile(concat([file([x(), subsystem()], 1), new Uint8Array(8)])); + expect(found).toEqual([expect.objectContaining({ code: 'framing', message: expect.stringContaining('after the subsystem') })]); + }); +}); + +describe('records', () => { + it('top-level-type: a record that is neither miMATRIX nor miCOMPRESSED', () => { + const found = checkMatFile(file([rawRecord(MI.DOUBLE, new Uint8Array(8)), x()])); + expect(found).toEqual([expect.objectContaining({ code: 'top-level-type', at: 128 })]); + }); + + it('empty-matrix: an miMATRIX of 0 bytes, plain or compressed', () => { + expect(only(file([rawRecord(MI.MATRIX, new Uint8Array(0)), x()]))).toMatchObject({ code: 'empty-matrix', at: 128 }); + expect(only(file([compressed(rawRecord(MI.MATRIX, new Uint8Array(0)))]))).toMatchObject({ code: 'empty-matrix', at: 128 }); + // A matrix inside another may be empty: MATLAB reads it as []. + expect(checkMatFile(file([cellVar('c', [matrix([])])]))).toEqual([]); + }); + + it('compressed-wrapper: raw deflate, gzip, or no zlib header', () => { + for (const wrap of [deflateSync, gzipSync, (b: Uint8Array) => concat([new Uint8Array([0x78, 0x00]), deflateSync(b)])]) { + expect(only(file([compressed(x(), wrap)]))).toMatchObject({ code: 'compressed-wrapper', at: 128 }); + } + }); + + it('compressed-wrapper: a stream cut short, or bytes after it in the record', () => { + const z = zlibSync(x()); + expect(only(file([rawRecord(MI.COMPRESSED, z.subarray(0, z.length - 6))])).message).toContain('does not inflate'); + const after = only(file([rawRecord(MI.COMPRESSED, concat([z, new Uint8Array(4)]))])); + expect(after.message).toContain('checksum'); + // The stream inflated, so the variable it holds is known, and said. + expect(after.variable).toBe('x'); + }); + + it('compressed-wrapper: a payload that is not one matrix and nothing else', () => { + const el = x(); + expect(only(file([compressed(concat([el, new Uint8Array(8)]))])).message).toContain('after its matrix'); + expect(only(file([compressed(rawRecord(MI.DOUBLE, new Uint8Array(8)))])).message).toContain('miDOUBLE'); + expect(only(file([compressed(compressed(el))])).message).toContain('another compressed record'); + // Cut short, the matrix is said to be, and so is the sub-element it ends inside. + const cut = checkMatFile(file([compressed(el.subarray(0, el.length - 8))])); + expect(codesOf(cut)).toEqual(['compressed-wrapper', 'nbytes']); + expect(cut[0].message).toContain('cut short'); + expect(only(file([compressed(new Uint8Array(4))])).message).toContain('fewer than one element'); + }); +}); + +describe('where records are', () => { + it('subsystem-offset: pointing where no record starts, past the file, or at a variable', () => { + const records = [x(), x('y'), subsystem()]; + for (const offset of [129, 64, 1 << 20]) { + const found = checkMatFile(file(records, undefined, offset)); + expect(codesOf(found)).toEqual(['anonymous-record', 'subsystem-offset']); + expect(found[0]).toMatchObject({ code: 'subsystem-offset', at: 116 }); + } + const atVariable = checkMatFile(file(records, 1)); + expect(atVariable[0].message).toContain('variable "y"'); + }); + + it('subsystem-offset: pointing at an unnamed record that holds no subsystem data', () => { + // MATLAB reads the record there as the objects' data, and stops listing variables at it. + expect(codes(file([x(), x('')], 1))).toEqual(['anonymous-record', 'subsystem-offset']); + }); + + it('subsystem-offset: 0, with a subsystem in the file (and 8 spaces are 0)', () => { + const bytes = file([x(), subsystem()]); + expect(codes(bytes)).toEqual(['anonymous-record', 'subsystem-offset']); + bytes.fill(0x20, 116, 124); + expect(codes(bytes)).toEqual(['anonymous-record', 'subsystem-offset']); + }); + + it('subsystem-not-last: each variable after the subsystem, named', () => { + const found = checkMatFile(file([x(), subsystem(), x('late'), compressed(x('later'))], 1)); + expect(found.map((v) => [v.code, v.variable])).toEqual([['subsystem-not-last', 'late'], ['subsystem-not-last', 'later']]); + expect(found[0].message).toContain('silently'); + }); + + it('anonymous-record: an unnamed record where no subsystem is, and what it hides', () => { + const found = checkMatFile(file([x(), x(''), x('y'), x('z')])); + expect(found).toEqual([expect.objectContaining({ code: 'anonymous-record', at: 128 + x().length })]); + expect(found[0].message).toContain('the 2 record(s) after it'); + }); + + it('duplicate-name: a name stored twice, at the later copy', () => { + const found = checkMatFile(file([x(), x('y'), compressed(x())])); + expect(found).toEqual([expect.objectContaining({ code: 'duplicate-name', variable: 'x', at: 128 + 2 * x().length })]); + }); +}); + +describe('names', () => { + it('name: not an identifier, a keyword, or not UTF-8', () => { + for (const bad of ['1abc', 'has space', '_x', 'café', 'x-y']) { + expect(only(file([x(bad)]))).toMatchObject({ code: 'name', variable: bad }); + } + expect(only(file([x('end')])).message).toContain('"end_"'); + const latin1 = matrix([arrayFlags(CLASS.DOUBLE), dims([1, 1]), element(MI.INT8, new Uint8Array([0x63, 0x61, 0x66, 0xe9])), element(MI.DOUBLE, new Uint8Array(8))]); + expect(only(file([latin1])).message).toContain('crashes'); + }); + + it('takes any identifier, however long', () => { + expect(checkMatFile(file([x('a'), x('A_1'), x('n'.repeat(70)), x('endx')]))).toEqual([]); + }); +}); + +describe('char data', () => { + it('char-type: miUTF32, miUINT8, miINT8, or no text type at all', () => { + for (const type of [18, MI.UINT8, MI.INT8, MI.DOUBLE]) { + expect(only(file([charVar('t', 'abc', type)]))).toMatchObject({ code: 'char-type', variable: 't' }); + } + }); + + it('char-type: miUINT16 above U+00FF, which MATLAB keeps the low byte of, or fails on', () => { + expect(checkMatFile(file([charVar('t', 'héllo', MI.UINT16)]))).toEqual([]); + expect(only(file([charVar('t', '日本語', MI.UINT16)])).message).toContain('U+65E5'); + expect(only(file([charVar('t', 'a\u{1F600}b', MI.UINT16, [1, 4])])).message).toContain('U+D83D'); + }); + + it('char-type: miUTF8 that is not UTF-8, and a complex char array', () => { + const notUtf8 = matrix([arrayFlags(CLASS.CHAR), dims([1, 2]), varName('t'), element(MI.UTF8, new Uint8Array([0xc3, 0x28]))]); + expect(only(file([notUtf8])).message).toContain('not valid UTF-8'); + const twoParts = matrix([arrayFlags(CLASS.CHAR, { complex: true }), dims([1, 1]), varName('t'), element(MI.UTF16, new Uint8Array(2)), element(MI.UTF16, new Uint8Array(2))]); + expect(only(file([twoParts])).message).toContain('complex'); + }); + + it('utf8-count: miUTF8 whose UTF-16 length is not the element count', () => { + expect(only(file([charVar('t', 'héllo', MI.UTF8, [1, 6])]))).toMatchObject({ code: 'utf8-count' }); + // An emoji is two UTF-16 units: dims [1 3] for 'a', U+1F600, 'b' is one short. + expect(only(file([charVar('t', 'a\u{1F600}b', MI.UTF8, [1, 3])]))).toMatchObject({ code: 'utf8-count' }); + expect(checkMatFile(file([charVar('t', 'a\u{1F600}b', MI.UTF8, [1, 4])]))).toEqual([]); + }); + + it('data-size: miUTF16 or miUINT16 of another length than the element count', () => { + expect(only(file([charVar('t', 'abc', MI.UTF16, [1, 4])]))).toMatchObject({ code: 'data-size' }); + expect(only(file([charVar('t', 'abc', MI.UINT16, [1, 2])]))).toMatchObject({ code: 'data-size' }); + }); + + it('applies at any depth, and says whose it is', () => { + const deep = structVar('s', ['c'], [{ c: cellVar('', [x(''), charVar('', 'abc', 18)]) }]); + expect(only(file([compressed(deep)]))).toMatchObject({ code: 'char-type', variable: 's', at: 128 }); + }); +}); + +describe('numeric data', () => { + it('int-storage: every class but double in its own type only', () => { + const cases: [number, number, { logical?: boolean }][] = [ + [CLASS.INT8, MI.UINT8, {}], + [CLASS.UINT8, MI.INT8, {}], + [CLASS.INT32, MI.INT16, {}], + [CLASS.UINT64, MI.DOUBLE, {}], + [CLASS.SINGLE, MI.DOUBLE, {}], + [CLASS.UINT8, MI.DOUBLE, { logical: true }], + ]; + for (const [cls, dataType, opts] of cases) { + const v = numericVar({ name: 'v', cls, dimensions: [1, 2], dataType, real: [1, 2], ...opts }); + expect(only(file([v]))).toMatchObject({ code: 'int-storage', variable: 'v' }); + } + const imag = numericVar({ name: 'v', cls: CLASS.INT16, dimensions: [1, 1], real: [1], imag: [2] }); + expect(checkMatFile(file([imag]))).toEqual([]); + }); + + it('takes a double in any numeric type', () => { + for (const dataType of [MI.INT8, MI.UINT8, MI.INT16, MI.UINT16, MI.INT32, MI.UINT32, MI.SINGLE, MI.INT64, MI.UINT64]) { + const v = numericVar({ name: 'v', cls: CLASS.DOUBLE, dimensions: [1, 2], dataType, real: [1, 2], imag: [3, 4] }); + expect(checkMatFile(file([v]))).toEqual([]); + } + }); + + it('data-size: more or fewer elements than the dimensions say', () => { + expect(only(file([numericVar({ name: 'v', cls: CLASS.DOUBLE, dimensions: [1, 3], real: [1, 2] })]))).toMatchObject({ code: 'data-size' }); + expect(only(file([numericVar({ name: 'v', cls: CLASS.INT8, dimensions: [1, 1], real: [1, 2] })]))).toMatchObject({ code: 'data-size' }); + const ragged = numericVar({ name: 'v', cls: CLASS.INT16, dimensions: [1, 1], rawReal: new Uint8Array(3), real: [] }); + expect(only(file([ragged]))).toMatchObject({ code: 'data-size' }); + }); + + it('element: a double whose data is no numeric type', () => { + const v = numericVar({ name: 'v', cls: CLASS.DOUBLE, dimensions: [1, 1], dataType: MI.UTF8, rawReal: new Uint8Array(8), real: [] }); + expect(only(file([v]))).toMatchObject({ code: 'element' }); + }); + + it('sparse: column starts one per column and one more, non-zeros as many as row indices', () => { + expect(only(file([sparseVar({ name: 'sp', dimensions: [2, 2], ir: [0, 1], jc: [0, 2], real: [1, 2] })]))).toMatchObject({ code: 'data-size' }); + expect(only(file([sparseVar({ name: 'sp', dimensions: [2, 2], ir: [0, 1], jc: [0, 1, 2], real: [1] })]))).toMatchObject({ code: 'data-size' }); + const logical = sparseVar({ name: 'sp', dimensions: [2, 2], ir: [0], jc: [0, 1, 1], real: [1], logical: true }); + expect(only(file([logical]))).toMatchObject({ code: 'int-storage' }); + const single = sparseVar({ name: 'sp', dimensions: [2, 2], ir: [0], jc: [0, 1, 1], real: [1], cls: CLASS.SINGLE, sparseFlag: true, dataType: MI.SINGLE }); + expect(checkMatFile(file([single]))).toEqual([]); + const int8 = sparseVar({ name: 'sp', dimensions: [2, 2], ir: [0], jc: [0, 1, 1], real: [1], cls: CLASS.INT8, sparseFlag: true, dataType: MI.INT8 }); + expect(only(file([int8])).message).toContain('double, single and logical'); + }); +}); + +describe('the shape of a matrix', () => { + const body = (subs: Uint8Array[]) => file([matrix(subs)]); + const flags = arrayFlags(CLASS.DOUBLE); + const d11 = dims([1, 1]); + const one = element(MI.DOUBLE, new Uint8Array(8)); + + it('nbytes: bytes after the last sub-element, or a sub-element past the matrix\'s end', () => { + expect(only(body([flags, d11, varName('v'), one, new Uint8Array(8)]))).toMatchObject({ code: 'nbytes', variable: 'v' }); + const over = matrix([flags, d11, varName('v'), one]); + new DataView(over.buffer).setUint32(over.length - 12, 16, true); + expect(only(file([over]))).toMatchObject({ code: 'nbytes' }); + }); + + it('nbytes: a container holding fewer members than it declares', () => { + expect(only(file([cellVar('c', [x(''), x('')], [1, 3])])).message).toContain('2 of the 3'); + const short = structVar('s', ['a', 'b'], [{ a: x(''), b: x('') }], [1, 2]); + expect(only(file([short])).message).toContain('2 of the 4'); + }); + + it('element: array flags, dimensions or a name of the wrong type', () => { + expect(only(body([element(MI.INT32, new Uint8Array(8)), d11, varName('v'), one]))).toMatchObject({ code: 'element' }); + expect(only(body([flags, element(MI.UINT32, new Uint8Array(8)), varName('v'), one]))).toMatchObject({ code: 'element' }); + expect(only(body([flags, dims([3]), varName('v'), one]))).toMatchObject({ code: 'element' }); + expect(only(body([flags, dims([1, -1]), varName('v'), one]))).toMatchObject({ code: 'element' }); + expect(only(body([flags, d11, element(MI.UTF8, new TextEncoder().encode('v')), one]))).toMatchObject({ code: 'element' }); + }); + + it('element: an array class MATLAB has none of', () => { + for (const cls of [0, 18, 255]) { + const f = new Uint8Array(16); + f.set(arrayFlags(CLASS.DOUBLE)); + f[8] = cls; + expect(only(body([f, d11, varName('v'), one])).message).toContain(`class is ${cls}`); + } + }); + + it('element: a small tag declaring more than its 4 bytes', () => { + const small = new Uint8Array(8); + new DataView(small.buffer).setUint32(0, (5 << 16) | MI.DOUBLE, true); + expect(only(body([flags, d11, varName('v'), small]))).toMatchObject({ code: 'element' }); + // MATLAB's own small tags read as they should. + const tiny = new Uint8Array(8); + new DataView(tiny.buffer).setUint32(0, (1 << 16) | MI.UINT8, true); + tiny[4] = 7; + const name = new Uint8Array(8); + new DataView(name.buffer).setUint32(0, (2 << 16) | MI.INT8, true); + name.set([0x61, 0x62], 4); + expect(checkMatFile(body([flags, d11, name, tiny]))).toEqual([]); + }); + + it('element: a cell member, struct field or object part that is not a matrix', () => { + expect(only(file([cellVar('c', [one])]))).toMatchObject({ code: 'element' }); + // Padded to 8, so the struct around it is a whole number of words, as a plain record is. + const z = compressed(x('')); + const member = concat([z, new Uint8Array((8 - (z.length % 8)) % 8)]); + expect(only(file([structVar('s', ['a'], [{ a: member }])]))).toMatchObject({ code: 'element' }); + }); + + it('element: a struct with field names and a field-name length of 0', () => { + const s = matrix([arrayFlags(CLASS.STRUCT), d11, varName('s'), element(MI.INT32, new Uint8Array(4)), element(MI.INT8, new TextEncoder().encode('a'))]); + expect(only(file([s]))).toMatchObject({ code: 'element' }); + }); + + it('reads an opaque as MATLAB writes one: no dimensions, then two names and one matrix', () => { + const name = (s: string) => element(MI.INT8, new TextEncoder().encode(s)); + const handle = numericVar({ name: '', cls: CLASS.UINT32, dimensions: [6, 1], real: [0xdd000000, 2, 1, 1, 1, 1] }); + const opaque = (parts: Uint8Array[]) => matrix([arrayFlags(CLASS.OPAQUE), varName('o'), ...parts]); + expect(checkMatFile(file([opaque([name('MCOS'), name('string'), handle]), subsystem()], 1))).toEqual([]); + expect(only(file([opaque([name('MCOS'), element(MI.INT8, new Uint8Array(0)), handle]), subsystem()], 1))).toMatchObject({ code: 'element' }); + expect(only(file([opaque([name('MCOS'), name('string')]), subsystem()], 1)).message).toContain('0 of the 1'); + }); + + it('checks the subsystem\'s stream too, for no variable', () => { + const found = checkMatFile(file([x(), compressed(subsystem([charVar('', 'abc', 18)]))], 1)); + expect(found).toEqual([expect.objectContaining({ code: 'char-type', at: 128 + x().length })]); + expect(found[0].variable).toBeUndefined(); + expect(found[0].message).toContain('in the subsystem'); + }); +}); + +describe('bounded, and never a throw', () => { + it('budget: past the matrices it may walk, a note where it stopped and nothing after', () => { + const c = cellVar('c', Array.from({ length: 10 }, () => x(''))); + const bad = charVar('t', 'abc', 18); + expect(checkMatFile(file([c, bad]))).toEqual([expect.objectContaining({ code: 'char-type' })]); + const found = checkMatFile(file([c, bad]), { maxElements: 5 }); + expect(found).toEqual([expect.objectContaining({ code: 'budget' })]); + // At the member it stopped at, inside the cell's record, and before the char array. + expect(found[0].at).toBeGreaterThan(128); + expect(found[0].at).toBeLessThan(128 + c.length); + expect(found[0].message).toContain('5 matrices'); + }); + + it('budget: past the bytes it may inflate', () => { + const big = compressed(numericVar({ name: 'z', cls: CLASS.DOUBLE, dimensions: [1, 4096], real: new Array(4096).fill(0) })); + expect(checkMatFile(file([x(), big]))).toEqual([]); + const found = checkMatFile(file([x(), big]), { maxInflatedBytes: 1000 }); + expect(found).toEqual([expect.objectContaining({ code: 'budget', at: 128 + x().length })]); + }); + + it('budget: past the nesting it reads', () => { + let deep = x(''); + for (let i = 0; i < 200; i++) deep = cellVar('', [deep]); + const top = cellVar('c', [deep]); + expect(codes(file([top]))).toEqual(['budget']); + }); + + it('spends a member that is an empty matrix, so a billion of them stops', () => { + const empties = cellVar('c', Array.from({ length: 1000 }, () => matrix([]))); + expect(checkMatFile(file([empties]))).toEqual([]); + expect(codesOf(checkMatFile(file([empties]), { maxElements: 100 }))).toEqual(['budget']); + }); + + it('never throws on a file cut at any length', () => { + for (const name of ['matlab-objects.mat', 'plain-uncompressed.mat', 'matlab-append-v6-onto-v7.mat']) { + const whole = read(join(CORPUS, name)); + for (let n = 0; n <= whole.length; n++) { + const found = checkMatFile(whole.subarray(0, n)); + expect(found.some((v) => v.message.includes('an error in the check itself'))).toBe(false); + // A file of objects cut anywhere is broken: before its subsystem the header's offset + // points past its end, and in it the subsystem's record is cut short. A file without + // one is whole again when it is cut between two records. + if (name === 'matlab-objects.mat' && n < whole.length) expect(found.length).toBeGreaterThan(0); + } + } + }); + + it('never throws on a file with any byte changed', () => { + // A fixed seed, so a failure reproduces. + let seed = 0x2f6b1d; + const random = () => { + seed = (seed * 1103515245 + 12345) & 0x7fffffff; + return seed / 0x80000000; + }; + for (const name of ['plain-uncompressed.mat', 'objects-uncompressed.mat', 'matlab-plain.mat']) { + const whole = read(join(CORPUS, name)); + for (let trial = 0; trial < 400; trial++) { + const bytes = whole.slice(); + for (let k = 0; k < 1 + Math.floor(random() * 4); k++) { + bytes[128 + Math.floor(random() * (bytes.length - 128))] = Math.floor(random() * 256); + } + const found = checkMatFile(bytes); + expect(found.some((v) => v.message.includes('an error in the check itself'))).toBe(false); + } + } + }); +}); + +describe('violationsAdded: what a rewrite added', () => { + const bad = (name: string) => charVar(name, 'abc', 18); + + it('matches by code and variable, wherever the record moved', () => { + const before = checkMatFile(file([x(), bad('t')])); + const after = checkMatFile(file([x('a_longer_name'), x('y'), compressed(bad('t'))])); + expect(after[0].at).not.toBe(before[0].at); + expect(violationsAdded(before, after)).toEqual([]); + expect(violationsAdded(before, checkMatFile(file([x()])))).toEqual([]); + }); + + it('counts, and follows a rename', () => { + const before = checkMatFile(file([x(), bad('t')])); + const twice = checkMatFile(file([x(), bad('t'), x('y'), bad('u')])); + expect(violationsAdded(before, twice)).toEqual([expect.objectContaining({ code: 'char-type', variable: 'u' })]); + const renamed = checkMatFile(file([x(), bad('t2')])); + expect(violationsAdded(before, renamed)).toHaveLength(1); + expect(violationsAdded(before, renamed, new Map([['t2', 't']]))).toEqual([]); + }); + + it('always adds a budget note', () => { + const c = cellVar('c', Array.from({ length: 10 }, () => x(''))); + const before = checkMatFile(file([c]), { maxElements: 5 }); + const after = checkMatFile(file([c]), { maxElements: 5 }); + expect(violationsAdded(before, after)).toEqual([expect.objectContaining({ code: 'budget' })]); + }); +}); diff --git a/test/matFileSave.test.ts b/test/matFileSave.test.ts new file mode 100644 index 00000000..fd221c8c --- /dev/null +++ b/test/matFileSave.test.ts @@ -0,0 +1,896 @@ +// Copyright 2026 The MathWorks, Inc. +// +// A save of a `.mat` (session.serializeSource on a MatNode, MatFileWriter.serializeMatFile): +// the file it was read from, with what was edited written fresh and every record nobody touched +// written as the bytes it was read from. +// +// The first sweep holds every Level-5 fixture to the strictest form of that: saved with no edit, +// a file is itself, byte for byte. Then each kind of edit, on cases.mat and on files of objects +// and function handles, read back: the edited value is what the save wrote, every other record is +// its own bytes, in its own order, and the subsystem is last, where the header says it is. A +// `-v6` file, which holds no compressed record, stays one. Then every refusal: a save that cannot +// write a variable as what it is throws, naming it, and hands back nothing. + +import { describe, it, expect } from 'vitest'; +import { readFileSync, readdirSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { parseMat } from '../src/datamodel/parser/MatParser.js'; +import type { MatRecord, ParsedMat } from '../src/datamodel/parser/MatParser.js'; +import { encodeMatStream, MatBudgetError, MatWriteError } from '../src/datamodel/parser/MatWriter.js'; +import { compressedRecordOf, serializeMatFile } from '../src/datamodel/parser/MatFileWriter.js'; +import { checkMatFile, violationsAdded } from '../src/datamodel/parser/MatFileCheck.js'; +import { createSession } from '../src/index.js'; +import { CLASS, MI, cellVar, matFile, numericVar, u32le } from './tools/matBytes.js'; + +const TEST_ROOT = fileURLToPath(new URL('.', import.meta.url)); + +// Every `.mat` under test/, recursively, so a fixture added later is swept by default. But not +// test/fixtures/mat-check, MATLAB's verdict corpus, of files edited to break its load rules on +// purpose (test/matFileCheck.test.ts), which has a sweep of its own below. +const MAT_CHECK = join(TEST_ROOT, 'fixtures', 'mat-check'); +function matFilesUnder(dir: string): string[] { + const out: string[] = []; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const abs = join(dir, entry.name); + if (entry.isDirectory()) { + if (abs !== MAT_CHECK) { + out.push(...matFilesUnder(abs)); + } + } else if (entry.isFile() && entry.name.endsWith('.mat')) { + out.push(abs); + } + } + return out.sort(); +} + +// The one file of the corpus the reader refuses: a `-v7.3` file is HDF5, not Level 5. +const REFUSED = new Set(['strings_v73.mat']); + +const shown = (abs: string) => abs.slice(TEST_ROOT.length); +const basename = (abs: string) => abs.slice(abs.lastIndexOf('/') + 1); + +function arrayBufferOf(bytes: Uint8Array): ArrayBuffer { + return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; +} + +function concat(parts: Uint8Array[]): Uint8Array { + const out = new Uint8Array(parts.reduce((n, p) => n + p.byteLength, 0)); + let at = 0; + for (const p of parts) { + out.set(p, at); + at += p.byteLength; + } + return out; +} + +const sameBytes = (a: Uint8Array, b: Uint8Array) => a.byteLength === b.byteLength && a.every((x, i) => x === b[i]); + +const fixture = (rel: string) => arrayBufferOf(new Uint8Array(readFileSync(join(TEST_ROOT, rel)))); +const CASES = 'parity/artifacts/mat/cases.mat'; + +const scalar = (name: string, value: number) => numericVar({ name, cls: CLASS.DOUBLE, dimensions: [1, 1], real: [value] }); + +/** A MatNode opened from `bytes` through the session, as a host opens one, and its edits. */ +function opened(bytes: ArrayBuffer, name = 'f.mat') { + const session = createSession(); + const root: any = session.addMatSource(name, bytes); + const by = (n: string) => root.children.find((c: any) => c.name === n); + const edit = (node: any, prop: string, value: string) => { + session.setActive(root, node); + return session.editProperty(node.id, prop, value); + }; + const remove = (node: any) => { + session.setActive(root, node); + return session.deleteNodeById(node.id); + }; + // What session.serializeSource hands back for it, which for a MAT-file is always bytes, and + // which by the rules MATLAB loads a file by (MatFileCheck) is no worse than the file it was + // read from: as clean as every fixture here is, and adding nothing to one that is not. + const save = (): Uint8Array => { + const out = session.serializeSource(name)!; + expect([out.kind, out.sourceFormat]).toEqual(['binary', 'mat']); + const saved = (out as { bytes: Uint8Array }).bytes; + const before = checkMatFile(new Uint8Array(bytes)); + const after = checkMatFile(saved); + expect(before.length === 0 ? after : violationsAdded(before, after)).toEqual([]); + return saved; + }; + return { session, root, by, edit, remove, save }; +} + +/** `bytes`, read again: the parse, and a tree of it, as a host reopening the saved file has. */ +function reopened(bytes: Uint8Array) { + const parsed = parseMat(arrayBufferOf(bytes)); + const { root, by } = opened(arrayBufferOf(bytes), 'saved.mat'); + return { parsed, root, by }; +} + +/** What a variable of `bytes` reads back as, by the reader itself: its class, size and value. */ +const variableOf = (parsed: ParsedMat, name: string) => { + const v = parsed.variables.find((x) => x.name === name); + expect(v, name).toBeDefined(); + return v!; +}; + +/** + * Every record of `original` but the ones named `was` is in `saved`, in the same order, as the + * bytes it was read from; `is` names the records of `saved` that are not (edited, renamed, + * added). + */ +function expectKept(original: ParsedMat, saved: ParsedMat, { was = [] as string[], is = [] as string[] } = {}) { + const before = original.records.filter((r) => !was.includes(r.name!)); + const after = saved.records.filter((r) => !is.includes(r.name!)); + expect(after.map((r) => r.name)).toEqual(before.map((r) => r.name)); + after.forEach((r, i) => expect(sameBytes(r.bytes, before[i].bytes), String(r.name)).toBe(true)); +} + +/** The subsystem is the file's last record, unnamed, and where its header says it is. */ +function expectSubsystemLast(saved: ParsedMat) { + const last: MatRecord = saved.records[saved.records.length - 1]; + expect([last.anonymous, last.name, saved.subsystemOffset]).toEqual([true, '', last.offset]); + expect(saved.records.filter((r) => r.anonymous)).toEqual([last]); +} + +/** The thrown error of `fn`, which must throw. */ +function thrownBy(fn: () => unknown): Error { + try { + fn(); + } catch (e) { + return e as Error; + } + throw new Error('did not throw'); +} + +describe('a file saved with no edit is the file, byte for byte', () => { + const files = matFilesUnder(TEST_ROOT).filter((f) => !REFUSED.has(basename(f))); + + it('sweeps the whole corpus', () => { + // Lower bounds, so that a mis-filtered list cannot pass the sweep below vacuously. + expect(files.length).toBeGreaterThanOrEqual(30); + expect(files.map(basename)).toEqual(expect.arrayContaining(['cases.mat', 'Param.mat', 'strings.mat', 'nested_handles.mat'])); + }); + + for (const file of files) { + it(shown(file), () => { + const input = fixture(shown(file)); + const { save } = opened(input, basename(file)); + const bytes = save(); + expect(sameBytes(bytes, new Uint8Array(input))).toBe(true); + // A copy, not a view of what the file was read from: a host may write it anywhere. + expect(bytes.buffer).not.toBe(input); + }); + } + + it('a rename undone, the file as it was', () => { + const input = fixture(CASES); + const { session, by, edit, save } = opened(input, 'cases.mat'); + expect(edit(by('kp'), 'Name', 'kp2')).toBe(true); + session.undo(); + expect([by('kp').name, by('kp').status]).toEqual(['kp', 'Modified']); + expect(sameBytes(save(), new Uint8Array(input))).toBe(true); + }); + + it('a variable deleted and its delete undone, the file as it was', () => { + const input = fixture(CASES); + const { session, by, remove, save } = opened(input, 'cases.mat'); + expect(remove(by('aParam'))).toBe(true); + session.undo(); + expect(sameBytes(save(), new Uint8Array(input))).toBe(true); + }); +}); + +describe('every variable of every fixture, renamed or written fresh, reads back as itself', () => { + const files = matFilesUnder(TEST_ROOT).filter((f) => !REFUSED.has(basename(f))); + // What a host is shown of a file: each variable's name, node class, class, size and value. + const shownAs = (root: any) => root.children.map((c: any) => [c.name, c.constructor.name, c.className, c.displayValue]); + + for (const file of files) { + it(`${shown(file)}: every variable renamed, in one save`, () => { + const { root, edit, save } = opened(fixture(shown(file)), basename(file)); + const before = shownAs(root); + root.children.forEach((node: any, i: number) => expect(edit(node, 'Name', 'renamed' + i)).toBe(true)); + const { root: again } = reopened(save()); + expect(shownAs(again)).toEqual(before.map(([, ...rest]: any[], i: number) => ['renamed' + i, ...rest])); + }); + + it(`${shown(file)}: every plain variable written fresh, in one save`, () => { + const { root, save } = opened(fixture(shown(file)), basename(file)); + const before = shownAs(root); + // An edit that leaves the value as it was, as an undone one does: written fresh all the + // same (DataNode._valueEdited). Of what MatWriter can write as what it is: an object, a + // string, a function handle refuse the save (below). + const plain = root.children.filter((n: any) => n._matWritable?.() === true && !root.recordOf(n).variable.isOpaque); + plain.forEach((node: any) => node._markModified()); + const bytes = save(); + const { parsed, root: again } = reopened(bytes); + expect(shownAs(again)).toEqual(before); + const original = parseMat(fixture(shown(file))); + const names = plain.map((n: any) => n.name); + expectKept(original, parsed, { was: names, is: names }); + }); + } +}); + +describe('cases.mat: an edit is written, and every record it did not touch is its own bytes', () => { + const original = parseMat(fixture(CASES)); + const casesMat = () => opened(fixture(CASES), 'cases.mat'); + + it('a value edit', () => { + const { by, edit, save } = casesMat(); + expect(edit(by('kp'), 'Value', '9')).toBe(true); + const { parsed, by: again } = reopened(save()); + expect(variableOf(parsed, 'kp')).toMatchObject({ className: 'double', dimensions: [1, 1], value: 9 }); + expect(again('kp').displayValue).toBe('9'); + expectKept(original, parsed, { was: ['kp'], is: ['kp'] }); + expectSubsystemLast(parsed); + // Written where it was, compressed, as every record of a `-v7` file is. + expect(parsed.records.map((r) => r.name)).toEqual(original.records.map((r) => r.name)); + expect(parsed.records.find((r) => r.name === 'kp')!.compressed).toBe(true); + }); + + const childEdits: [string, string, (by: (n: string) => any) => any, (v: any) => void][] = [ + ['a matrix element', 'mat2x3', (by) => by('mat2x3').children[0], (v) => expect(v.value).toEqual([9, 2, 3, 4, 5, 6])], + ['a struct field', 'structScalar', (by) => by('structScalar').children[0], (v) => expect(v.fields.a.value).toBe(9)], + ['a cell member', 'cellFlat', (by) => by('cellFlat').children[0], (v) => expect(v.value[0].value).toBe(9)], + [ + "a struct array element's field", + 'struct1x3', + (by) => by('struct1x3').children[1].children[0], + (v) => expect(v.fields.a.map((f: any) => f.value)).toEqual([1, 9, 3]), + ], + ]; + for (const [what, name, target, check] of childEdits) { + it(what, () => { + const { by, edit, save } = casesMat(); + expect(edit(target(by), 'Value', '9')).toBe(true); + const { parsed } = reopened(save()); + check(variableOf(parsed, name)); + expectKept(original, parsed, { was: [name], is: [name] }); + expectSubsystemLast(parsed); + }); + } + + it('a reshape', () => { + const { by, edit, save } = casesMat(); + expect(edit(by('rowVec'), 'Value', '[1 2; 3 4]')).toBe(true); + const { parsed, by: again } = reopened(save()); + expect(variableOf(parsed, 'rowVec')).toMatchObject({ className: 'double', dimensions: [2, 2], value: [1, 2, 3, 4] }); + expect(again('rowVec').displayValue).toBe('[1 2; 3 4]'); + expectKept(original, parsed, { was: ['rowVec'], is: ['rowVec'] }); + }); + + it('a class change', () => { + const { by, edit, save } = casesMat(); + expect(edit(by('charStr'), 'Value', '[1 2]')).toBe(true); + const { parsed } = reopened(save()); + expect(variableOf(parsed, 'charStr')).toMatchObject({ className: 'double', dimensions: [1, 2], value: [1, 2] }); + expectKept(original, parsed, { was: ['charStr'], is: ['charStr'] }); + }); + + it('a field added to a struct', () => { + const { session, root, by, save } = casesMat(); + session.setActive(root, by('structScalar')); + expect(session.addChildTo(by('structScalar').id)).not.toBeNull(); + const { parsed } = reopened(save()); + expect(Object.keys(variableOf(parsed, 'structScalar').fields!)).toEqual(Object.keys(by('structScalar')._var.fields)); + expect(Object.keys(variableOf(parsed, 'structScalar').fields!).length).toBe(3); + expectKept(original, parsed, { was: ['structScalar'], is: ['structScalar'] }); + }); + + it('a rename: the element as it was read, named anew, and compressed again', () => { + const { by, edit, save } = casesMat(); + expect(edit(by('kp'), 'Name', 'kp2')).toBe(true); + const { parsed, by: again } = reopened(save()); + expect(parsed.records.map((r) => r.name)).toEqual(original.records.map((r) => (r.name === 'kp' ? 'kp2' : r.name))); + expect(variableOf(parsed, 'kp2')).toMatchObject({ className: 'double', value: 1.5 }); + expect(again('kp2').displayValue).toBe('1.5'); + expect(parsed.records.find((r) => r.name === 'kp2')!.compressed).toBe(true); + // The value's bytes are the ones read: the name subelement, the small element at bytes 40-47 + // after the tag, the flags and the dims, is all that changed. Both names fit in it. + const was = variableOf(original, 'kp')._rawBytes!; + const is = variableOf(parsed, 'kp2')._rawBytes!; + expect(is.byteLength).toBe(was.byteLength); + expect([sameBytes(is.subarray(0, 40), was.subarray(0, 40)), sameBytes(is.subarray(40, 48), was.subarray(40, 48))]).toEqual([true, false]); + expect(sameBytes(is.subarray(48), was.subarray(48))).toBe(true); + expectKept(original, parsed, { was: ['kp'], is: ['kp2'] }); + expectSubsystemLast(parsed); + }); + + it("an object variable's rename: the same object, its subsystem as it was", () => { + const { by, edit, save } = casesMat(); + const value = by('aParam').getPropInfo(by('aParam').getProperties().find((p: any) => p.key === 'Value' || p.name === 'Value')).displayValue; + expect(edit(by('aParam'), 'Name', 'renamedParam')).toBe(true); + const { parsed, by: again } = reopened(save()); + const node = again('renamedParam'); + expect([node.constructor.name, node.className]).toEqual(['ParameterNode', 'Simulink.Parameter']); + expect(node.getPropInfo(node.getProperties().find((p: any) => p.key === 'Value' || p.name === 'Value')).displayValue).toBe(value); + expect(again('aParam')).toBeUndefined(); + expectKept(original, parsed, { was: ['aParam'], is: ['renamedParam'] }); + expectSubsystemLast(parsed); + }); + + it("a string's rename", () => { + const { by, edit, save } = casesMat(); + const shownAs = by('strScalar').displayValue; + expect(edit(by('strScalar'), 'Name', 'str2')).toBe(true); + const { parsed, by: again } = reopened(save()); + expect([again('str2').className, again('str2').displayValue]).toEqual(['string', shownAs]); + expectKept(original, parsed, { was: ['strScalar'], is: ['str2'] }); + }); + + it('a delete, of a plain variable and of an object variable', () => { + const { by, remove, save } = casesMat(); + expect(remove(by('kp'))).toBe(true); + expect(remove(by('aParam'))).toBe(true); + const { parsed, root } = reopened(save()); + expect(parsed.records.map((r) => r.name)).toEqual(original.records.map((r) => r.name).filter((n) => n !== 'kp' && n !== 'aParam')); + expect(root.children.length).toBe(original.records.length - 3); + expectKept(original, parsed, { was: ['kp', 'aParam'] }); + // The subsystem, as it was, at its new offset: an object no variable holds any more is + // one MATLAB writes itself. + expectSubsystemLast(parsed); + expect(parsed.subsystemOffset).toBeLessThan(original.subsystemOffset); + }); + + it('an edit undone: the value read, written fresh', () => { + const { session, by, edit, save } = casesMat(); + expect(edit(by('mat2x3').children[0], 'Value', '9')).toBe(true); + session.undo(); + expect(by('mat2x3')._valueEdited).toBe(true); + const { parsed } = reopened(save()); + expect(variableOf(parsed, 'mat2x3')).toMatchObject({ dimensions: [2, 3], value: [1, 2, 3, 4, 5, 6] }); + expectKept(original, parsed, { was: ['mat2x3'], is: ['mat2x3'] }); + }); + + it('a variable added, after the last one and before the subsystem', () => { + const { root, save } = casesMat(); + root.execAddEntry(); + root.execAddEntry(undefined, 'second'); + const { parsed, by: again } = reopened(save()); + const names = parsed.records.map((r) => r.name); + expect(names.slice(-3)).toEqual(['var', 'second', '']); + expect(again('var').displayValue).toBe(root.children.find((c: any) => c.name === 'var').displayValue); + expect(parsed.records.find((r) => r.name === 'var')!.compressed).toBe(true); + expectKept(original, parsed, { is: ['var', 'second'] }); + expectSubsystemLast(parsed); + }); + + it('several edits at once', () => { + const { root, by, edit, remove, save } = casesMat(); + expect(edit(by('kp'), 'Value', '[7 8]')).toBe(true); + expect(edit(by('scalarD'), 'Name', 'renamedD')).toBe(true); + expect(edit(by('cellFlat').children[2], 'Value', "'x'")).toBe(true); + expect(edit(by('aSignal'), 'Name', 'sig2')).toBe(true); + expect(remove(by('negD'))).toBe(true); + expect(remove(by('objRow'))).toBe(true); + root.execAddEntry(undefined, 'added'); + const { parsed } = reopened(save()); + expect(variableOf(parsed, 'kp')).toMatchObject({ dimensions: [1, 2], value: [7, 8] }); + expect(variableOf(parsed, 'renamedD').value).toBe(variableOf(original, 'scalarD').value); + expect(variableOf(parsed, 'cellFlat').value).toMatchObject([{ value: 1 }, { value: 'two' }, { className: 'char', value: 'x' }]); + expect(parsed.records.map((r) => r.name)).toEqual([ + ...original.records + .map((r) => ({ scalarD: 'renamedD', aSignal: 'sig2' } as Record)[r.name!] ?? r.name) + .filter((n) => n !== 'negD' && n !== 'objRow' && n !== ''), + 'added', + '', + ]); + expectKept(original, parsed, { was: ['kp', 'scalarD', 'cellFlat', 'aSignal', 'negD', 'objRow'], is: ['kp', 'renamedD', 'cellFlat', 'sig2', 'added'] }); + expectSubsystemLast(parsed); + }); +}); + +describe('a rename into a name of another length restates the element and the record', () => { + for (const [from, to] of [ + ['kp', 'kpWithAMuchLongerName'], + ['structNest', 'sN'], + ['aParam', 'p'], + ]) { + it(`${from} -> ${to}`, () => { + const original = parseMat(fixture(CASES)); + const { by, edit, save } = opened(fixture(CASES), 'cases.mat'); + const before = by(from).displayValue; + expect(edit(by(from), 'Name', to)).toBe(true); + const { parsed, by: again } = reopened(save()); + expect(again(to).displayValue).toBe(before); + expect(again(to).constructor.name).toBe(by(to).constructor.name); + expectKept(original, parsed, { was: [from], is: [to] }); + expectSubsystemLast(parsed); + }); + } +}); + +describe('function handles and the objects of a file: written as read, renamed, deleted', () => { + const FH = 'fixtures/display/dispcat_opaque.mat'; + + it('a function handle renamed, another deleted', () => { + const original = parseMat(fixture(FH)); + const { by, edit, remove, save } = opened(fixture(FH), 'dispcat_opaque.mat'); + expect(edit(by('fh_sin'), 'Name', 'sinHandle')).toBe(true); + expect(remove(by('fh_anon'))).toBe(true); + const { parsed, by: again } = reopened(save()); + expect([again('sinHandle').className, again('sinHandle').displayValue]).toEqual(['function_handle', '@sin']); + expect(again('fh_anon')).toBeUndefined(); + expectKept(original, parsed, { was: ['fh_sin', 'fh_anon'], is: ['sinHandle'] }); + expectSubsystemLast(parsed); + }); + + it('every object variable of a file renamed reads back as the same object', () => { + const FILE = 'fixtures/mcos/nested_objects.mat'; + const { root, edit, save } = opened(fixture(FILE), 'nested_objects.mat'); + const shownAs = (r: any) => r.children.map((c: any) => [c.constructor.name, c.className, c.displayValue]); + const before = shownAs(root); + for (const node of [...root.children]) { + expect(edit(node, 'Name', node.name + 'R')).toBe(true); + } + const { root: again } = reopened(save()); + expect(again.children.map((c: any) => c.name)).toEqual(root.children.map((c: any) => c.name)); + expect(shownAs(again)).toEqual(before); + }); +}); + +describe('a -v6 file, which holds no compressed record, stays one', () => { + it('nested_handles.mat: a variable added is written plain', () => { + const FILE = 'fixtures/display/nested_handles.mat'; + const original = parseMat(fixture(FILE)); + expect(original.records.some((r) => r.compressed)).toBe(false); + const { root, save } = opened(fixture(FILE), 'nested_handles.mat'); + root.execAddEntry(); + const { parsed } = reopened(save()); + expect(parsed.records.map((r) => r.compressed)).toEqual(parsed.records.map(() => false)); + expect(parsed.records.map((r) => r.name).slice(-2)).toEqual(['var', '']); + // A plain record is 8-byte aligned, its tag's nbytes a whole number of words. + const added = parsed.records.find((r) => r.name === 'var')!; + expect([added.offset % 8, added.length % 8]).toEqual([0, 0]); + expectKept(original, parsed, { is: ['var'] }); + expectSubsystemLast(parsed); + }); + + it('hexobj_values.mat: a plain variable edited is written plain', () => { + const FILE = 'fixtures/sparse/hexobj_values.mat'; + const original = parseMat(fixture(FILE)); + const { by, edit, save } = opened(fixture(FILE), 'hexobj_values.mat'); + expect(edit(by('control'), 'Value', '[1 2 3]')).toBe(true); + const { parsed } = reopened(save()); + expect(parsed.records.every((r) => !r.compressed)).toBe(true); + expect(variableOf(parsed, 'control')).toMatchObject({ dimensions: [1, 3], value: [1, 2, 3] }); + expectKept(original, parsed, { was: ['control'], is: ['control'] }); + expectSubsystemLast(parsed); + }); + + it('a file with no subsystem keeps its header bytes 116-123 as they were', () => { + const spaces = new Uint8Array(matFile([scalar('a', 1), scalar('b', 2)])); + spaces.fill(0x20, 116, 124); + const { root, by, edit, save } = opened(arrayBufferOf(spaces)); + expect(root.subsystemOffset).toBe(0); + expect(edit(by('a'), 'Value', '5')).toBe(true); + root.execAddEntry(); + const bytes = save(); + expect(sameBytes(bytes.subarray(0, 128), spaces.subarray(0, 128))).toBe(true); + const { parsed } = reopened(bytes); + expect(parsed.records.map((r) => [r.name, r.compressed])).toEqual([['a', false], ['b', false], ['var', false]]); + expect(variableOf(parsed, 'a').value).toBe(5); + }); +}); + +describe('the marker that tells a rename from a value edit (DataNode._valueEdited)', () => { + const casesMat = () => opened(fixture(CASES), 'cases.mat'); + + it("is not set by an entry's own rename, of a plain variable or an object", () => { + const { by, edit } = casesMat(); + expect(edit(by('kp'), 'Name', 'kp2')).toBe(true); + expect(edit(by('aParam'), 'Name', 'p2')).toBe(true); + expect([by('kp2').status, by('kp2')._valueEdited, by('p2').status, by('p2')._valueEdited]).toEqual(['Modified', undefined, 'Modified', undefined]); + }); + + it("is set by a value edit, an element's, and an object's property edit, which the editor takes none of", () => { + const { by, edit } = casesMat(); + expect(edit(by('kp'), 'Value', '2')).toBe(true); + expect(edit(by('mat2x3').children[3], 'Value', '2')).toBe(true); + // A MAT-file takes no edit of an object's properties (MatNode._editRefusal, test/matEditGate.test.ts), + // and one refused marks nothing. Made around the editor, it marks the object. + expect(edit(by('aParam'), 'Value', '3')).toMatchObject({ error: true }); + expect(by('aParam')._valueEdited).toBeUndefined(); + by('aParam')._markModified(); + expect(['kp', 'mat2x3', 'aParam'].map((n) => by(n)._valueEdited)).toEqual([true, true, true]); + // On the entry only. + expect(by('mat2x3').children[3]._valueEdited).toBeUndefined(); + }); + + it("is set by the rename of anything under the entry, a bus element's, which changes the entry's value", () => { + const { by, edit, save } = casesMat(); + const element = by('aBus').children[0]; + // Refused by the editor, as every edit of an object of a MAT-file but its own rename is; made + // around it, as DataNode.setProperty's rename makes one. + expect(edit(element, 'Name', 'renamedElement')).toMatchObject({ error: true }); + element.name = 'renamedElement'; + element._markModified('name'); + expect([by('aBus').status, by('aBus')._valueEdited]).toEqual(['Modified', true]); + // And a bus is an object, whose edit this writer cannot write. + expect(thrownBy(save).message).toBe( + 'Cannot write "aBus": it is a Simulink.Bus, which a MAT-file save writes only as it was read, or renamed, so its edit cannot be saved. Nothing was written.', + ); + }); +}); + +// The editor takes none of the edits below (MatNode._editRefusal, test/matEditGate.test.ts): each is +// made around it, by the marks every edit leaves (DataNode._markModified), so that the writer's own +// refusal, which the editor's is built from, is held to as well. +describe('a save that cannot write a variable as what it is is refused, naming it, and nothing is written', () => { + const editRefused = (name: string, what: string) => + `Cannot write "${name}": it is ${what}, which a MAT-file save writes only as it was read, or renamed, so its edit cannot be saved. Nothing was written.`; + + it("an object's property edited; the variable deleted, the file saves", () => { + const { by, edit, remove, save } = opened(fixture(CASES), 'cases.mat'); + expect(edit(by('aParam'), 'Value', '7')).toMatchObject({ error: true }); + by('aParam')._markModified(); + const thrown = thrownBy(save); + expect([thrown instanceof MatWriteError, thrown.message]).toEqual([true, editRefused('aParam', 'a Simulink.Parameter')]); + expect(remove(by('aParam'))).toBe(true); + expect(reopened(save()).by('aParam')).toBeUndefined(); + }); + + it('a string edited', () => { + const { by, edit, save } = opened(fixture(CASES), 'cases.mat'); + expect(edit(by('strScalar'), 'Value', '"xyz"')).toMatchObject({ error: true }); + by('strScalar')._markModified(); + expect(thrownBy(save).message).toBe(editRefused('strScalar', 'a string')); + }); + + it('a struct holding an object, edited at another field', () => { + const { by, edit, save } = opened(fixture('fixtures/mcos/complex_objects.mat'), 'complex_objects.mat'); + const z = by('s').children.find((c: any) => c.name === 'z'); + expect(edit(z, 'Value', '5')).toMatchObject({ error: true }); + z._markModified(); + expect(thrownBy(save).message).toBe( + 'Cannot write "s": s.p is a Simulink.Parameter, which this package cannot write into a MAT-file. Nothing was written.', + ); + }); + + it('a function handle edited, which the table does not offer, around it', () => { + const { by, edit, save } = opened(fixture('fixtures/display/dispcat_opaque.mat'), 'dispcat_opaque.mat'); + expect(edit(by('fh_sin'), 'Value', '@cos')).toMatchObject({ error: true }); + by('fh_sin')._markModified(); + expect(thrownBy(save).message).toBe(editRefused('fh_sin', 'a function handle')); + }); + + it('a value the reader did not decode, edited around the table', () => { + const z = numericVar({ name: 'z', cls: CLASS.DOUBLE, dimensions: [1, 1], real: [3], imag: [4] }); + // Byte 16 of the matrix is its array-flags data: class 255, and the complex flag kept. + z[16] = 0xff; + const { by, save } = opened(matFile([scalar('a', 1), z])); + expect(by('z').displayValue).toContain('not decoded'); + by('z')._markModified(); + expect(thrownBy(save).message).toBe(editRefused('z', 'a value that was not decoded')); + }); + + describe('a variable stored after the subsystem, which MATLAB does not read', () => { + // Param.mat, and after its subsystem a plain double: a file MATLAB lists `late` in with + // `whos -file` and does not load. + const late = () => { + const param = new Uint8Array(fixture('fixtures/mcos/Param.mat')); + return arrayBufferOf(concat([param, scalar('late', 4)])); + }; + + it('renamed or edited, refuses the save', () => { + for (const [prop, value] of [['Name', 'late2'], ['Value', '5']]) { + const { by, edit, save } = opened(late()); + const node = by('late'); + expect(edit(node, prop, value)).toMatchObject({ error: true }); + if (prop === 'Name') { + node.name = value; + } + node._markModified(prop === 'Name' ? 'name' : 'value'); + expect(thrownBy(save).message).toBe( + `Cannot write "${by(prop === 'Name' ? 'late2' : 'late').name}": it is stored after the file's objects, where MATLAB does not read it, ` + + 'so it would not be read written there, and moved, it would change what MATLAB loads of the file. Nothing was written.', + ); + } + }); + + it('unedited, is written where it was; deleted, is gone', () => { + const original = parseMat(late()); + { + const { by, edit, save } = opened(late()); + expect(edit(by('Param'), 'Name', 'P')).toBe(true); + const { parsed } = reopened(save()); + expect(parsed.records.map((r) => r.name)).toEqual(['P', '', 'late']); + expect(parsed.subsystemOffset).toBe(parsed.records[1].offset); + expectKept(original, parsed, { was: ['Param'], is: ['P'] }); + } + { + const { by, remove, root, save } = opened(late()); + expect(remove(by('late'))).toBe(true); + root.execAddEntry(); + const { parsed } = reopened(save()); + expect(parsed.records.map((r) => r.name)).toEqual(['Param', 'var', '']); + expectSubsystemLast(parsed); + } + }); + }); + + it('a file whose records do not tile it', () => { + const bytes = matFile([scalar('a', 1), scalar('b', 2)], { trailing: new Uint8Array(8) }); + const { root, by, edit, save } = opened(bytes); + expect(root.framed).toBe(false); + // Unedited too: the bytes past the records are not records to write back. + const at = root.unframed.at; + const refusal = `Cannot save "f.mat": this package could not frame 8 byte(s) of it, from byte ${at} (${root.unframed.reason}), ` + + 'so a save could not keep them as they are. Nothing was written.'; + expect(thrownBy(save).message).toBe(refusal); + expect(edit(by('a'), 'Value', '3')).toMatchObject({ error: true }); + by('a')._markModified(); + expect(thrownBy(save).message).toBe(refusal); + }); + + it("a file opened from a host's parse that carries no records", () => { + const session = createSession(); + const { header, variables } = parseMat(fixture(CASES)); + session.addMatSourceParsed('older.mat', { header, variables }); + expect(() => session.serializeSource('older.mat')).toThrow( + 'Cannot save "older.mat": it was opened without the records a save writes back, so a save would lose every one this package did not read. Nothing was written.', + ); + }); + + it('a file whose bytes the host has since handed away', () => { + const input = fixture(CASES); + const { by, edit, save } = opened(input, 'cases.mat'); + expect(edit(by('kp'), 'Value', '3')).toBe(true); + // Transferred, as a host posting it to a worker does: every view of it is now empty. + structuredClone(input, { transfer: [input] }); + expect(thrownBy(save).message).toBe( + 'Cannot save "cases.mat": the bytes it was read from are no longer held (the header holds 0 of its 128), so what was not edited ' + + 'could not be written as it was. Nothing was written.', + ); + }); + + it("a header that places the subsystem where there is none, edited; unedited, it is the file", () => { + const bytes = new Uint8Array(fixture(CASES)); + new DataView(bytes.buffer).setBigUint64(116, 200n, true); + const { by, edit, save } = opened(arrayBufferOf(bytes), 'cases.mat'); + expect(sameBytes(save(), bytes)).toBe(true); + expect(edit(by('kp'), 'Value', '3')).toMatchObject({ error: true }); + by('kp')._markModified(); + expect(thrownBy(save).message).toBe( + 'Cannot save "cases.mat": its header places the file\'s objects at byte 200, where no record starts, so a save cannot say where they are. Nothing was written.', + ); + }); + + it("a header that places the subsystem at a variable: the variable's edit is refused, not passed over", () => { + const bytes = new Uint8Array(matFile([scalar('a', 1), scalar('b', 2)])); + const { root, by, edit, save } = opened(arrayBufferOf(bytes)); + const at = root.records[1].offset; + new DataView(bytes.buffer).setBigUint64(116, BigInt(at), true); + const again = opened(arrayBufferOf(bytes)); + expect(sameBytes(again.save(), bytes)).toBe(true); + expect(again.edit(again.by('b'), 'Value', '5')).toMatchObject({ error: true }); + again.by('b')._markModified(); + expect(thrownBy(again.save).message).toBe( + `Cannot save "f.mat": its header places the file's objects at byte ${at}, where a variable is, so a save cannot say where they are. ` + + 'Nothing was written.', + ); + // The file as it was, with its header saying none, saves the edit. + expect(edit(by('b'), 'Value', '5')).toBe(true); + expect(variableOf(reopened(save()).parsed, 'b').value).toBe(5); + }); + + it('an unnamed record that is not the subsystem', () => { + const { root, by, edit, save } = opened(matFile([scalar('a', 1), scalar('', 2), scalar('b', 3)])); + expect(edit(by('a'), 'Value', '5')).toMatchObject({ error: true }); + by('a')._markModified(); + expect(thrownBy(save).message).toBe( + `Cannot save "f.mat": the record at byte ${root.records[1].offset} holds a value with no name that is not the file's objects, ` + + 'and MATLAB reads no variable past one, so a save cannot place an edit where MATLAB reads it. Nothing was written.', + ); + }); + + it('a value read short, whose holes are a value the file did not hold, and past the budget no save', () => { + // A cell declaring 1x600000 and holding one element: written fresh, the 599,999 it does not + // hold would each be the empty double MatWriter writes for a hole, past the unbacked-bytes + // budget. So it is written only as it was read (freshRefusal, shortIn), whatever its size. + for (const declared of [600000, 3]) { + const { by, edit, save } = opened(matFile([cellVar('big', [scalar('', 1)], [1, declared])])); + expect(edit(by('big').children[0], 'Value', '2'), String(declared)).toMatchObject({ error: true }); + by('big').children[0]._markModified(); + expect(thrownBy(save).message, String(declared)).toBe( + `Cannot write "big": big is a 1x${declared} cell holding 1 of the ${declared} elements it declares, and a save would write the ones it does not hold as empty. Nothing was written.`, + ); + } + // Unbacked, MatWriter refuses it for its budget, restated naming the variable, as a dictionary's save does. + const { by } = opened(matFile([cellVar('big', [scalar('', 1)], [1, 600000])])); + const thrown = thrownBy(() => by('big')._matStream()) as MatBudgetError; + expect([thrown instanceof MatBudgetError, thrown.entry, thrown.reason]).toEqual([true, 'big', 'budget']); + expect(thrown.message).toMatch(/^Cannot write "big": big is a 1x600000 cell holding 1 of its 600000 elements, /); + // And met writing a variable a save writes fresh, it is the save's refusal, as MatWriter threw + // it: the stream of an edited variable stands in for one past the budget. + const edited = opened(fixture(CASES), 'cases.mat'); + expect(edited.edit(edited.by('kp'), 'Value', '9')).toBe(true); + edited.by('kp')._matStream = () => { + throw thrown; + }; + expect(thrownBy(() => serializeMatFile(edited.root))).toBe(thrown); + }); + + it('a file of more bytes than the runtime holds in one buffer, refused naming it, and not as its RangeError', () => { + for (const add of [false, true]) { + const { root } = opened(matFile([scalar('a', 1)])); + // A record standing in for one of 2^53 bytes, which no typed array is: the copy of the + // file unedited, and the file assembled around an addition, are each refused for it. + Object.assign(root.records[0], { length: 2 ** 53, bytes: { byteLength: 2 ** 53 } }); + if (add) { + root.execAddEntry(); + } + const thrown = thrownBy(() => serializeMatFile(root)); + expect(thrown, String(add)).toBeInstanceOf(MatWriteError); + expect(thrown.message, String(add)).toMatch( + /^Cannot save "f\.mat": the file written for it would be \d{16} bytes, more than this runtime holds in one buffer\. Nothing was written\.$/, + ); + } + }); + + it('a compressed stream of 4 GiB or more, whose length its record cannot say, is refused', () => { + // A stream standing in for one of 2^32 bytes: the record's tag says its length in 32 bits, + // and written, it would say 0. + const thrown = thrownBy(() => compressedRecordOf({ byteLength: 2 ** 32 } as Uint8Array, 'big')); + expect([thrown instanceof MatWriteError, thrown.message]).toEqual([ + true, + 'Cannot write "big": compressed, its element is a stream of 4294967296 bytes, more than the 4 GiB a record can say it holds. Nothing was written.', + ]); + // One that a tag can say is written as its tag and itself. + expect(Array.from(compressedRecordOf(new Uint8Array([7, 8]), 'small'))).toEqual([15, 0, 0, 0, 2, 0, 0, 0, 7, 8]); + }); + + it('a variable added under a name that is no MATLAB name, or one the file holds already', () => { + for (const [name, why] of [ + ['1bad', 'it is not a name MATLAB can load (Invalid MATLAB name. Must start with a letter and contain only letters, digits, and underscores)'], + ['end', "it is not a name MATLAB can load ('end' is a reserved MATLAB keyword)"], + ['kp', 'the file holds another variable named "kp", and MATLAB loads only one of them'], + ]) { + const { root, save } = opened(fixture(CASES), 'cases.mat'); + // Refused by the editor (MatNode.execAddEntry); added around it, under its own name. + expect(root.execAddEntry(undefined, name), name).toBeNull(); + root.execAddEntry().node.name = name; + expect(thrownBy(save).message, name).toBe(`Cannot write "${name}": ${why}. Nothing was written.`); + } + }); + + it('a file that holds two variables of one name keeps both, as read', () => { + const { by, root, save } = opened(matFile([scalar('a', 1), scalar('a', 2), scalar('b', 3)])); + expect(root.children.map((c: any) => c.name)).toEqual(['a', 'a', 'b']); + root.execAddEntry(); + expect(by('b')).toBeDefined(); + const { parsed } = reopened(save()); + expect(parsed.variables.map((v) => [v.name, v.value])).toEqual([['a', 1], ['a', 2], ['b', 3], ['var', 0]]); + }); + + it('a record that does not read back as the value it was written from (the self-check)', () => { + const { by, edit, save } = opened(fixture(CASES), 'cases.mat'); + expect(edit(by('kp'), 'Value', '9')).toBe(true); + // The stream written for it, standing in for a writer that wrote another value. + by('kp')._matStream = () => encodeMatStream({ ...by('kp')._var, value: 10 }); + expect(thrownBy(save).message).toBe( + 'Cannot save "cases.mat": the file written for it did not read back as written: kp: its element 1 reads back as 10 where 9 was written. Nothing was written.', + ); + }); +}); + +describe("MATLAB's verdict corpus (test/fixtures/mat-check): a save adds nothing MATLAB refuses, or is refused", () => { + // Copies of MATLAB-written files, most edited one byte range at a time to break a rule MATLAB + // loads a file by, with MATLAB's verdict on each. Whatever a file breaks as read, a save of it + // either breaks no rule it did not break (MatFileCheck.violationsAdded, by rule and variable, + // a renamed variable by its old name), or throws, naming why, and hands back nothing. + const verdicts: { file: string; matlab: string }[] = JSON.parse(readFileSync(join(MAT_CHECK, 'verdicts.json'), 'utf8')); + const edits: [string, (o: ReturnType) => Map][] = [ + ['no edit', () => new Map()], + [ + 'every variable renamed', + (o) => { + const renamed = new Map(); + o.root.children.forEach((node: any, i: number) => { + const was = node.name; + if (o.edit(node, 'Name', 'renamed' + i) === true) { + renamed.set('renamed' + i, was); + } + }); + return renamed; + }, + ], + [ + 'every plain variable written fresh', + (o) => { + for (const node of o.root.children.filter((n: any) => n._matWritable?.() === true && !o.root.recordOf(n)?.variable?.isOpaque)) { + node._markModified(); + } + return new Map(); + }, + ], + [ + 'a variable added', + (o) => { + o.root.execAddEntry(); + return new Map(); + }, + ], + ]; + + for (const [what, edit] of edits) { + it(what, () => { + let saved = 0; + for (const { file, matlab } of verdicts) { + const input = arrayBufferOf(new Uint8Array(readFileSync(join(MAT_CHECK, file)))); + const before = checkMatFile(new Uint8Array(input)); + const o = opened(input, file); + const renamed = edit(o); + let bytes: Uint8Array; + try { + bytes = serializeMatFile(o.root); + } catch (e) { + expect(e, file).toBeInstanceOf(MatWriteError); + expect((e as Error).message, file).toMatch(/^Cannot (save|write) "/); + continue; + } + expect(violationsAdded(before, checkMatFile(bytes), renamed), file).toEqual([]); + if (what === 'no edit') { + expect(sameBytes(bytes, new Uint8Array(input)), file).toBe(true); + } + if (matlab === 'loads') { + saved++; + } + } + // Not vacuous: of the 64 files MATLAB loads, all but a few are saved. The ones refused are + // refused for what they hold: 8 zero bytes after the subsystem, which this package does not + // frame; a name of 70 characters, longer than the 63 a rename is held to; two variables of + // one name, one of them edited. + expect(saved, what).toBeGreaterThanOrEqual(verdicts.filter((v) => v.matlab === 'loads').length - 4); + }); + } +}); + +describe('the strict check, of the bytes about to be handed back (MatFileCheck)', () => { + it("a file that breaks a rule as read is saved renamed, its variable's violation matched under the old name", () => { + // char-latin1-uint8.mat holds a char stored as miUINT8, which MATLAB fails to load + // (`char-type`). Renamed, the record is its own bytes but for the name, so the violation is + // the one the file had: matched as the variable's under the name the file gave it (the map + // violationsAdded takes runs from the new name to the old), the save is not refused. + const FILE = join(MAT_CHECK, 'char-latin1-uint8.mat'); + const input = arrayBufferOf(new Uint8Array(readFileSync(FILE))); + const before = checkMatFile(new Uint8Array(input)); + expect(before.map((v) => v.code)).toEqual(['char-type']); + const { root, edit } = opened(input, 'char-latin1-uint8.mat'); + const [node] = root.children; + const was = node.name; + expect(edit(node, 'Name', 'renamedChar')).toBe(true); + const after = checkMatFile(serializeMatFile(root)); + expect(after.map((v) => [v.code, v.variable])).toEqual([['char-type', 'renamedChar']]); + expect(violationsAdded(before, after, new Map([['renamedChar', was]]))).toEqual([]); + expect(violationsAdded(before, after).map((v) => v.code)).toEqual(['char-type']); + }); + + it('refuses a save whose bytes break a rule the file read did not, though they read back as written', () => { + const { by, edit, save } = opened(fixture(CASES), 'cases.mat'); + expect(edit(by('charStr'), 'Value', "'中文'")).toBe(true); + // The stream written for it, standing in for a writer that stored the text as miUINT16, which + // this package's reader reads back as written and MATLAB reads as the low byte of each unit. + const stream = (text: string) => { + const units = new Uint8Array(text.length * 2); + for (let i = 0; i < text.length; i++) { + new DataView(units.buffer).setUint16(2 * i, text.charCodeAt(i), true); + } + const tag = (type: number, n: number) => concat([u32le(type), u32le(n)]); + const body = concat([ + tag(MI.UINT32, 8), u32le(CLASS.CHAR), u32le(0), + tag(MI.INT32, 8), u32le(1), u32le(text.length), + tag(MI.INT8, 0), + tag(MI.UINT16, units.length), units, new Uint8Array((8 - (units.length % 8)) % 8), + ]); + return concat([new Uint8Array([0, 1, 0x49, 0x4d, 0, 0, 0, 0]), tag(MI.MATRIX, body.length), body]); + }; + by('charStr')._matStream = () => stream('中文'); + const thrown = thrownBy(save); + expect(thrown).toBeInstanceOf(MatWriteError); + expect(thrown.message).toMatch( + /^Cannot save "cases\.mat": the file written for it breaks a rule MATLAB loads a file by, which the file it was read from does not: .*charStr.* Nothing was written\.$/, + ); + }); +}); diff --git a/test/matFreshFidelity.test.ts b/test/matFreshFidelity.test.ts new file mode 100644 index 00000000..40c5b188 --- /dev/null +++ b/test/matFreshFidelity.test.ts @@ -0,0 +1,255 @@ +// Copyright 2026 The MathWorks, Inc. +// +// Every plain variable of every Level-5 .mat here, written fresh by a save, is the variable the +// file held: compared with the file's own element, not with what the package's model of it says. +// +// The save's own self-check (MatFileWriter.selfCheck) holds what it wrote to the node's variable +// (MatlabVariableNode._var), and the live MATLAB gate (test/parity/matlab/probe_mat_writeback) +// found two losses that check could not see, because the model carried them too: a complex empty +// rebuilt as a real one once its node was marked edited, and a struct array of no element read +// with no field names, so written with none. MATLAB loaded both as another value. So here each +// variable the writer can write is marked edited without being changed (the mark an edit and its +// undo leave, DataNode._valueEdited), the file is saved, and the record the save wrote for it is +// compared with the record the file held: +// - by an element walker of the test's own (test/tools/matElements), which reads class, the +// complex, global, logical and sparse bits, dims, every field name of every struct (of no +// element too) in order, every member of every cell and struct, every element's value as +// its class holds it, double and single by their bits (-0 apart from 0), int64 and uint64 +// exactly, a char's code units; +// - and by the package's reader, the original parse beside the parse of the save: the class, +// size, complexity, sparsity, field names and order, members and values it reads. +// A NaN's payload is not compared (matElements says why). Any other difference is a value the +// writer changed, and fails here: what the writer cannot write as it was read, it must refuse. +// +// The candidates are what an edit can make the save write fresh: the variables whose edit the +// save takes (MatFileWriter.freshRefusal, the rule the editor offers edits by). A file whose +// save refuses a variable for what only its bytes can say (MatWriter's budget) is saved again +// without it, and the refusal is held to name it. +import { describe, it, expect } from 'vitest'; +import { readdirSync, readFileSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { unzlibSync } from 'fflate'; +import { parseMat, type MatRecord, type MatVariable } from '../src/datamodel/parser/MatParser.js'; +import { freshRefusal } from '../src/datamodel/parser/MatFileWriter.js'; +import { MatWriteError } from '../src/datamodel/parser/MatWriter.js'; +import { createSession } from '../src/index.js'; +import { elementDifference, elementValue } from './tools/matElements.js'; +import { CLASS, cellVar, matFile, numericVar, structVar } from './tools/matBytes.js'; + +const TEST_ROOT = fileURLToPath(new URL('.', import.meta.url)); +const MAT_CHECK = join(TEST_ROOT, 'fixtures', 'mat-check'); +// The one .mat here the reader refuses: a `-v7.3` file is HDF5, not Level 5. +const REFUSED = new Set(['strings_v73.mat']); + +function matFilesUnder(dir: string): string[] { + const out: string[] = []; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const abs = join(dir, entry.name); + if (entry.isDirectory()) { + if (abs !== MAT_CHECK) { + out.push(...matFilesUnder(abs)); + } + } else if (entry.isFile() && entry.name.endsWith('.mat') && !REFUSED.has(entry.name)) { + out.push(abs); + } + } + return out.sort(); +} + +const arrayBufferOf = (bytes: Uint8Array): ArrayBuffer => bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; + +/** A record's miMATRIX element, its tag included, inflated when the record is compressed. */ +function elementOf(record: MatRecord): Uint8Array { + const view = new DataView(record.bytes.buffer, record.bytes.byteOffset, record.bytes.byteLength); + return view.getUint32(0, true) === 15 ? unzlibSync(record.bytes.subarray(8, 8 + view.getUint32(4, true))) : record.bytes; +} + +// The parts of a parsed variable that are where it came from rather than what it is. +const NOT_THE_VALUE = new Set(['name', '_rawBytes', '_modified', 'mcosHandle']); + +/** The first difference between two variables the reader made, or null. NaN equals NaN; -0 is not 0. */ +function parsedDifference(was: unknown, is: unknown, at: string): string | null { + const shown = (x: unknown) => (Object.is(x, -0) ? '-0' : String(x)); + if (typeof was === 'number' && typeof is === 'number') { + return (Number.isNaN(was) && Number.isNaN(is)) || Object.is(was, is) ? null : at + ': ' + shown(was) + ' read, ' + shown(is) + ' written'; + } + if (was === null || is === null || typeof was !== 'object' || typeof is !== 'object') { + return was === is ? null : at + ': ' + shown(was) + ' read, ' + shown(is) + ' written'; + } + if (ArrayBuffer.isView(was) || ArrayBuffer.isView(is)) { + const a = Array.from(was as ArrayLike); + const b = Array.from(is as ArrayLike); + return parsedDifference(a, b, at); + } + const keys = (o: object) => Object.keys(o).filter((k) => !NOT_THE_VALUE.has(k) && (o as Record)[k] !== undefined); + const a = keys(was); + const b = keys(is); + // A struct's field names, in order, are its keys. + if (a.join(',') !== b.join(',')) { + return at + ': keys ' + a.join(',') + ' read, ' + b.join(',') + ' written'; + } + for (const k of a) { + const d = parsedDifference((was as Record)[k], (is as Record)[k], at + '.' + k); + if (d) { + return d; + } + } + return null; +} + +interface Swept { + written: string[]; + refused: string[]; + differences: string[]; + unwalked: string[]; +} + +/** `bytes` opened, its every writable variable marked edited, saved, and each compared with its own record. */ +function sweep(file: string, bytes: Uint8Array, refusedBefore: string[] = []): Swept | { saveRefused: string } { + const session = createSession(); + const root: any = session.addMatSource(file, arrayBufferOf(bytes)); + const candidates = root.children.filter((node: any) => { + const record = root.recordOf(node); + return record && !refusedBefore.includes(node.name) && freshRefusal(node, record) === null; + }); + candidates.forEach((node: any) => node._markModified()); + let saved: Uint8Array; + try { + saved = (session.serializeSource(file) as { bytes: Uint8Array }).bytes; + } catch (e) { + if (!(e instanceof MatWriteError)) { + throw e; + } + // Refused for a variable's bytes (MatWriter's budget): saved again without it. Anything else + // refuses the file, which the caller judges. + const named = candidates.find((node: any) => e.message.startsWith('Cannot write "' + node.name + '"') || e.message.includes('"' + node.name + '"')); + if (named && refusedBefore.length < candidates.length + refusedBefore.length) { + return sweep(file, bytes, [...refusedBefore, named.name]); + } + return { saveRefused: e.message }; + } + const before = parseMat(arrayBufferOf(bytes)); + const after = parseMat(arrayBufferOf(saved)); + const out: Swept = { written: [], refused: refusedBefore, differences: [], unwalked: [] }; + for (const node of candidates) { + const name = node.name; + const was = before.records.find((r) => r.name === name)!; + const is = after.records.find((r) => r.name === name)!; + out.written.push(name); + let walked: string | null = null; + try { + walked = elementDifference(elementValue(elementOf(was)), elementValue(elementOf(is)), name); + } catch (e) { + // The file's element is one the walker cannot read (a damaged corpus file): the reader's + // comparison below still holds it. + out.unwalked.push(name + ': ' + (e as Error).message); + } + if (walked) { + out.differences.push(walked); + } + const parsed = parsedDifference(was.variable as MatVariable, is.variable as MatVariable, name); + if (parsed) { + out.differences.push(parsed); + } + } + return out; +} + +const fixtureFiles = matFilesUnder(TEST_ROOT); + +describe('every plain variable of every .mat, written fresh, is the variable its file held', () => { + it('sweeps every Level-5 fixture', () => { + expect(fixtureFiles.length).toBeGreaterThanOrEqual(35); + }); + + let total = 0; + for (const abs of fixtureFiles) { + const rel = abs.slice(TEST_ROOT.length); + it(rel, () => { + const result = sweep(rel.slice(rel.lastIndexOf('/') + 1), new Uint8Array(readFileSync(abs))); + expect('saveRefused' in result ? result.saveRefused : null, rel).toBeNull(); + const swept = result as Swept; + expect(swept.differences, rel).toEqual([]); + expect(swept.unwalked, rel).toEqual([]); + total += swept.written.length; + if (process.env.DEX_SWEEP_COUNTS) console.log(rel, 'written', swept.written.length, 'refused', swept.refused); + }); + } + + it('and writes over 150 variables fresh doing so', () => { + expect(total).toBeGreaterThanOrEqual(150); + }); +}); + +describe("and of every file of MATLAB's verdict corpus core opens (test/fixtures/mat-check)", () => { + const verdicts: { file: string; matlab: string }[] = JSON.parse(readFileSync(join(MAT_CHECK, 'verdicts.json'), 'utf8')); + + it('each variable written fresh is the one the file held, or its save is refused', () => { + let written = 0; + const differences: string[] = []; + for (const { file, matlab } of verdicts) { + const bytes = new Uint8Array(readFileSync(join(MAT_CHECK, file))); + let result: ReturnType; + try { + result = sweep(file, bytes); + } catch (e) { + // A file core does not open. + expect((e as Error).message, file).toBeTruthy(); + continue; + } + if ('saveRefused' in result) { + expect(result.saveRefused, file).toMatch(/^Cannot (save|write) "/); + continue; + } + written += result.written.length; + // A file MATLAB loads is held to every part of its elements; one it refuses was damaged on + // purpose, and its damaged part may be one the walker does not read. + if (matlab === 'loads') { + expect(result.unwalked, file).toEqual([]); + } + differences.push(...result.differences.map((d) => file + ': ' + d)); + } + expect(differences).toEqual([]); + if (process.env.DEX_SWEEP_COUNTS) console.log('corpus written', written); + expect(written).toBeGreaterThanOrEqual(150); + }); +}); + +describe('and of the values no fixture holds, built byte by byte', () => { + // A variable `save` marks global (its array flags' bit 0x04): the flag is the variable's, and + // nothing but the record's bytes holds it. + const global = (element: Uint8Array) => { + const out = element.slice(); + out[17] |= 0x04; + return out; + }; + const es = (dims: number[]) => structVar('', ['a', 'bb'], [], dims); + const cx = (dims: number[], cls: number = CLASS.DOUBLE) => numericVar({ name: '', cls, dimensions: dims, real: [], imag: [] }); + const one = numericVar({ name: '', cls: CLASS.DOUBLE, dimensions: [1, 1], real: [1] }); + const file = new Uint8Array( + matFile([ + global(numericVar({ name: 'g', cls: CLASS.DOUBLE, dimensions: [1, 2], real: [1, 2] })), + global(structVar('gs', ['es'], [{ es: es([0, 0]) }])), + numericVar({ name: 'negZero', cls: CLASS.DOUBLE, dimensions: [1, 3], real: [-0, 0, -0], imag: [-0, -0, 3] }), + numericVar({ name: 'negZeroScalar', cls: CLASS.DOUBLE, dimensions: [1, 1], real: [-0], imag: [-0] }), + numericVar({ name: 'negZeroSingle', cls: CLASS.SINGLE, dimensions: [1, 2], real: [-0, 1], imag: [2, -0] }), + numericVar({ name: 'realNegZero', cls: CLASS.DOUBLE, dimensions: [1, 2], real: [-0, 1] }), + numericVar({ name: 'cx03s', cls: CLASS.SINGLE, dimensions: [0, 3], real: [], imag: [] }), + numericVar({ name: 'cxNd', cls: CLASS.INT16, dimensions: [0, 2, 2], real: [], imag: [] }), + structVar('esNd', ['a', 'bb'], [], [0, 0, 2]), + cellVar('c', [es([0, 0]), cx([1, 0]), es([2, 0]), cx([0, 3], CLASS.SINGLE)], [1, 4]), + structVar('sa', ['es', 'x'], [{ es: es([0, 0]), x: one }, { es: es([1, 0]), x: one }], [1, 2]), + structVar('nested', ['inner'], [{ inner: structVar('', ['deep'], [{ deep: es([0, 1]) }]) }]), + ]), + ); + + it('each is written fresh as the variable the file held: global, -0 parts, empties with fields and complexity', () => { + const result = sweep('built.mat', file); + expect('saveRefused' in result ? result.saveRefused : null).toBeNull(); + const swept = result as Swept; + expect(swept.written.length).toBe(12); + expect(swept.differences).toEqual([]); + expect(swept.unwalked).toEqual([]); + }); +}); diff --git a/test/matGlobal.test.ts b/test/matGlobal.test.ts new file mode 100644 index 00000000..6b7e2f8f --- /dev/null +++ b/test/matGlobal.test.ts @@ -0,0 +1,132 @@ +// Copyright 2026 The MathWorks, Inc. +// +// A variable saved as global stays global when a save writes it again. +// +// `save` marks a variable declared global by bit 0x04 of its array flags' flags byte (the flags +// word 0x0406 for a global double), on its top-level element and on no element nested in it, and +// `load(f)` declares it global again: measured against MATLAB R2027a by +// fixtures/global/make_global_fixtures.m, which wrote global_v7.mat and global_v6.mat (gD, gS, +// gC, gI global; plain not) and read each back by `whos -file` and by a `load` inside a function. +// The flag is the workspace variable's, not its value's. No reader layer held it, so a value edit, +// which writes the variable fresh, wrote it as not global, and `load(f)` no longer declared it +// (MATLAB's verdict on the save, the MAT-file gate's global_* cases); a rename, which writes the +// element it was read as, kept it. The reader now holds it (MatVariable.isGlobal), and the save +// sets it on the element it writes for a variable that had it (MatFileWriter.globalAsRead). +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { unzlibSync } from 'fflate'; +import { parseMat, type MatRecord, type MatVariable } from '../src/datamodel/parser/MatParser.js'; +import { createSession } from '../src/index.js'; +import { elementValue } from './tools/matElements.js'; + +/* eslint-disable @typescript-eslint/no-explicit-any */ + +const arrayBufferOf = (u8: Uint8Array) => u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength) as ArrayBuffer; +const fixture = (name: string) => arrayBufferOf(new Uint8Array(readFileSync(fileURLToPath(new URL('./fixtures/global/' + name, import.meta.url))))); +const GLOBALS = ['gC', 'gD', 'gI', 'gS']; + +function elementOf(record: MatRecord): Uint8Array { + const view = new DataView(record.bytes.buffer, record.bytes.byteOffset, record.bytes.byteLength); + return view.getUint32(0, true) === 15 ? unzlibSync(record.bytes.subarray(8, 8 + view.getUint32(4, true))) : record.bytes; +} + +/** Each record's name and whether its element is global, by the bytes and by the reader. */ +const globalsOf = (bytes: ArrayBuffer | Uint8Array) => { + const parsed = parseMat(bytes instanceof Uint8Array ? arrayBufferOf(bytes) : bytes); + return parsed.records.map((r) => [r.name, elementValue(elementOf(r)).global, !!r.variable?.isGlobal]); +}; + +/** Every variable nested in `v`, at any depth. */ +function nested(v: MatVariable): MatVariable[] { + const out: MatVariable[] = []; + const walk = (x: MatVariable) => { + for (const held of Object.values(x.fields ?? {})) { + for (const one of Array.isArray(held) ? held : [held]) { + out.push(one); + walk(one); + } + } + if (x.className === 'cell' && Array.isArray(x.value)) { + for (const one of x.value as MatVariable[]) { + out.push(one); + walk(one); + } + } + }; + walk(v); + return out; +} + +function opened(name: string) { + const session = createSession(); + const root: any = session.addMatSource(name, fixture(name)); + const at = (...labels: string[]) => { + let node = root.children.find((c: any) => c.name === labels[0]); + for (const label of labels.slice(1)) node = node.children.find((c: any) => c.displayName === label); + return node; + }; + const edit = (node: any, prop: string, value: string) => { + session.setActive(root, node); + expect(session.editProperty(node.id, prop, value), prop + ' ' + value).toBe(true); + }; + const save = () => (session.serializeSource(name) as { bytes: Uint8Array }).bytes; + return { session, root, at, edit, save }; +} + +describe.each(['global_v7.mat', 'global_v6.mat'])('%s, as MATLAB saved it', (file) => { + it('the reader holds the global flag of each variable that has it, and of nothing nested in one', () => { + expect(globalsOf(fixture(file))).toEqual([ + ['gD', true, true], + ['gS', true, true], + ['gC', true, true], + ['gI', true, true], + ['plain', false, false], + ]); + for (const v of parseMat(fixture(file)).variables) { + expect(nested(v).filter((x) => x.isGlobal).map((x) => v.name), v.name).toEqual([]); + } + }); + + it('each global edited is written fresh, global, and the rest as it was', () => { + const { at, edit, save } = opened(file); + edit(at('gD', 'gD(2)'), 'Value', '20'); + edit(at('gS', 'a'), 'Value', '5'); + edit(at('gC', 'gC{1}'), 'Value', '40'); + edit(at('gI'), 'Value', '-8'); + edit(at('plain'), 'Value', '10'); + const saved = save(); + expect(globalsOf(saved)).toEqual(globalsOf(fixture(file))); + const parsed = parseMat(arrayBufferOf(saved)); + const v = (n: string) => parsed.variables.find((x) => x.name === n)!; + expect([v('gD').value, (v('gS').fields!.a as MatVariable).value, (v('gC').value as MatVariable[])[0].value, v('gI').className, v('gI').value, v('plain').value]).toEqual([ + [1, 20, 3], + 5, + 40, + 'int16', + -8, + 10, + ]); + // Nothing nested in a global written fresh is global, as in MATLAB's own element. + for (const name of GLOBALS) { + expect(nested(v(name)).filter((x) => x.isGlobal), name).toEqual([]); + } + // A -v6 file stays one: no record compressed. + expect(parsed.records.some((r) => r.compressed)).toBe(file === 'global_v7.mat'); + }); + + it('a global renamed stays global, one deleted is gone, and one added is not global', () => { + const { root, at, edit, save, session } = opened(file); + edit(at('gD'), 'Name', 'gD2'); + session.setActive(root, at('gI')); + expect(session.deleteNodeById(at('gI').id)).toBe(true); + root.execAddEntry(undefined, 'added'); + expect(globalsOf(save())).toEqual([ + ['gD2', true, true], + ['gS', true, true], + ['gC', true, true], + ['plain', false, false], + ['added', false, false], + ]); + }); +}); diff --git a/test/matNoPayload.test.ts b/test/matNoPayload.test.ts index 91e18bd6..beb146fb 100644 --- a/test/matNoPayload.test.ts +++ b/test/matNoPayload.test.ts @@ -87,7 +87,10 @@ describe('a numeric MAT value with no data is shown as not decoded, with no edit notDecoded('b1', '1x1', 'logical'), notDecoded('i32', '3x2', 'int16'), ]); - expect(rows[7]).toEqual(['e0', '[ ]', 'double', true, []]); + // Shown as [], as before, and taking no edit: a matrix whose sub-elements end before its data + // is one MATLAB does not load, so a save writes it only as it was read, or renamed + // (MatFileWriter.freshRefusal). + expect(rows[7]).toEqual(['e0', '[ ]', 'double', false, []]); expect([rows[0], ...rows.slice(8)]).toEqual(control.children.map(row)); // Before: no warning at all. expect(mat.warnings).toEqual([ @@ -122,8 +125,10 @@ describe('a numeric MAT value with no data is shown as not decoded, with no edit const c = cellVar('c', [noPayload('', CLASS.INT8, [1, 1]), one(5)]); const mat = opened('nested.mat', [ok(), s, c]); const [, sNode, cNode] = mat.children; - expect(sNode.children.map(row)).toEqual([notDecoded('a', '1x3', 'double'), ['b', '2', 'double', true, []]]); - expect(cNode.children.map(row)).toEqual([notDecoded('1', '1x1', 'int8'), ['2', '5', 'double', true, []]]); + // The value beside each takes no edit: a save writes s and c fresh or not at all, and has + // nothing to write the one with no data from (MatNode._editRefusal). + expect(sNode.children.map(row)).toEqual([notDecoded('a', '1x3', 'double'), ['b', '2', 'double', false, []]]); + expect(cNode.children.map(row)).toEqual([notDecoded('1', '1x1', 'int8'), ['2', '5', 'double', false, []]]); expect(mat.warnings).toEqual([holdsNoData('s.a', 3), holdsNoData('c{1}', 1)]); for (const n of [sNode, cNode]) { expect(() => n.toRow()).not.toThrow(); @@ -141,7 +146,9 @@ describe('a numeric MAT value with no data is shown as not decoded, with no edit const cutAt = 128 + ok().length + noPayload('x', CLASS.DOUBLE, [1, 3]).length; const whole = new Uint8Array(matFile([ok(), x])); const cut: any = createSession().addMatSource('cut.mat', arrayBufferOf(whole.slice(0, cutAt))); - expect(cut.children.map(row)).toEqual([['ok', '7', 'double', true, []], notDecoded('x', '1x3', 'double')]); + // `ok` as read, and taking no edit: its records do not tile the file, so no save of it can be + // written (MatNode._fileRefusal). + expect(cut.children.map(row)).toEqual([['ok', '7', 'double', false, []], notDecoded('x', '1x3', 'double')]); expect(cut.warnings).toEqual([ { code: 'part-unreadable', diff --git a/test/matNode.test.ts b/test/matNode.test.ts index 39c6091d..92dcedaa 100644 --- a/test/matNode.test.ts +++ b/test/matNode.test.ts @@ -29,9 +29,10 @@ describe('MatNode — presentation', () => { expect(mat.icon).toBe('matlabWorkspaceFile'); }); - it('is read-only', () => { - // A .mat carries no schema, so the UI never offers property edits on the root. - expect(matSource('Param.mat').readOnly).toBe(true); + it('is not read-only: a save writes it (MatFileWriter)', () => { + // Read-only only when no save of it can be written: opened without its records, its records + // not tiling it (test/matEditGate.test.ts). + expect(matSource('Param.mat').readOnly).toBe(false); }); it('counts its variables as entries', () => { diff --git a/test/matNodeCeiling.test.ts b/test/matNodeCeiling.test.ts index 6e73b3e2..2c2de184 100644 --- a/test/matNodeCeiling.test.ts +++ b/test/matNodeCeiling.test.ts @@ -298,11 +298,15 @@ describe('a .mat file past its node ceiling', () => { // objects and shared object graphs this file builds no example of. const root = fileURLToPath(new URL('.', import.meta.url)); const files: string[] = []; + // test/fixtures/mat-check holds files edited to break MATLAB's load rules (a name stored + // twice, a variable after the subsystem), each with MATLAB's verdict on it + // (test/matFileCheck.test.ts), and is not what this grades. const walk = (dir: string): void => { for (const e of readdirSync(dir, { withFileTypes: true })) { const abs = join(dir, e.name); - if (e.isDirectory()) walk(abs); - else if (e.name.endsWith('.mat') && e.name !== 'strings_v73.mat') files.push(abs); + if (e.isDirectory()) { + if (e.name !== 'mat-check') walk(abs); + } else if (e.name.endsWith('.mat') && e.name !== 'strings_v73.mat') files.push(abs); } }; walk(join(root, 'fixtures')); diff --git a/test/matParser.test.ts b/test/matParser.test.ts index f6792fe0..da9dc0f9 100644 --- a/test/matParser.test.ts +++ b/test/matParser.test.ts @@ -1386,9 +1386,11 @@ describe('parseMat — old-style (class 3) objects', () => { // A sparse matrix was the other user of the same channel, past a million elements, // until it came to be held as its non-zeros: it is its summary and its rows now, as // every sparse matrix is. This input's jc is short (three starts for 2000 columns), so - // it is a damaged array: read as far as its index goes, and reported. Its row is - // editable: the index its dims declare past the two columns it held is 8 KB, which one - // write's budget of 16 MiB covers. + // it is a damaged array: read as far as its index goes, and reported. Its row takes no edit + // in the .mat: a column index short of its columns is a matrix MATLAB does not load, so a + // save writes it only as it was read (MatFileWriter.freshRefusal). Out of a .mat, it would: + // the index its dims declare past the two columns it held is 8 KB, which one write's budget + // of 16 MiB covers. const session = createSession(); const mat = session.addMatSource( 'big.mat', @@ -1402,7 +1404,9 @@ describe('parseMat — old-style (class 3) objects', () => { ]); expect(node.valueEditable).toBe(false); expect([node.className, node.dataType]).toEqual(['double', 'double']); - expect([mat.warnings.map((w: any) => w.part), node.children[0].valueEditable]).toEqual([['big'], true]); + expect([mat.warnings.map((w: any) => w.part), node.children[0].valueEditable]).toEqual([['big'], false]); + mat.removeChild(node); + expect(node.children[0].valueEditable).toBe(true); // Its full-jc twin, the shape MATLAB writes: the same, with nothing to report and its // row editable. const real = session.addMatSource( diff --git a/test/matRecords.test.ts b/test/matRecords.test.ts new file mode 100644 index 00000000..63affc11 --- /dev/null +++ b/test/matRecords.test.ts @@ -0,0 +1,533 @@ +// Copyright 2026 The MathWorks, Inc. +// +// What a save of a `.mat` splices: the file's own header, every top-level record in it, +// and which node each record became (MatParser's ParsedMat.records, MatNode.recordOf and +// nodeOf). A save that writes an unedited variable as the bytes it was read from is only as +// good as those bytes, so the first sweep holds every Level-5 fixture to the strictest form +// of it: the header and the records, end to end, ARE the file, byte for byte. +// +// Then the files whose records do not tile the file as MATLAB frames them (`framed` false): +// each is built here out of a framed one, and each still opens as it did, since nothing in +// this channel changes what is shown. And then the binding: every node of the tree, of +// whatever kind (a plain variable, a typed MCOS node, a function handle, a value shown as +// not decoded), is bound to the record it was read from and to no other. + +import { describe, it, expect, afterEach } from 'vitest'; +import { readFileSync, readdirSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { zlibSync } from 'fflate'; +import { parseMat } from '../src/datamodel/parser/MatParser.js'; +import type { MatRecord, ParsedMat } from '../src/datamodel/parser/MatParser.js'; +import { setMatRecordInflateCeiling } from '../src/datamodel/parser/Inflate.js'; +import { createSession } from '../src/index.js'; +import { CLASS, MI, charVar, element, matFile, numericVar, u32le } from './tools/matBytes.js'; + +const TEST_ROOT = fileURLToPath(new URL('.', import.meta.url)); + +// Every `.mat` under test/, recursively, so a fixture added later is swept by default. But not +// test/fixtures/mat-check: copies of MATLAB-written files edited to break MATLAB's load rules on +// purpose, each with MATLAB's verdict (test/matFileCheck.test.ts), many of them not framed. +function matFilesUnder(dir: string): string[] { + const out: string[] = []; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const abs = join(dir, entry.name); + if (entry.isDirectory()) { + if (entry.name !== 'mat-check') { + out.push(...matFilesUnder(abs)); + } + } else if (entry.isFile() && entry.name.endsWith('.mat')) { + out.push(abs); + } + } + return out.sort(); +} + +// The one file of the corpus the reader refuses: a `-v7.3` file is HDF5, not Level 5. +const REFUSED = new Map([['strings_v73.mat', 'MAT-file version 7.3 (HDF5) is not supported']]); + +const shown = (abs: string) => abs.slice(TEST_ROOT.length); +const basename = (abs: string) => abs.slice(abs.lastIndexOf('/') + 1); + +function arrayBufferOf(bytes: Uint8Array): ArrayBuffer { + return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; +} + +function concat(parts: Uint8Array[]): Uint8Array { + const out = new Uint8Array(parts.reduce((n, p) => n + p.byteLength, 0)); + let at = 0; + for (const p of parts) { + out.set(p, at); + at += p.byteLength; + } + return out; +} + +const sameBytes = (a: Uint8Array, b: Uint8Array) => a.byteLength === b.byteLength && a.every((x, i) => x === b[i]); + +const align8 = (n: number) => n + ((8 - (n % 8)) % 8); + +const scalar = (name: string, value: number) => numericVar({ name, cls: CLASS.DOUBLE, dimensions: [1, 1], real: [value] }); + +/** A top-level miCOMPRESSED record of `payload`: tag and zlib stream, unpadded, as MATLAB writes it. */ +const compressedRecord = (payload: Uint8Array) => { + const stream = zlibSync(payload); + return concat([u32le(MI.COMPRESSED), u32le(stream.length), stream]); +}; + +/** A MatNode opened from `bytes` through the session, as a host opens one. */ +function opened(bytes: ArrayBuffer, name = 'f.mat') { + const session = createSession(); + const root: any = session.addMatSource(name, bytes); + return { session, root, by: (n: string) => root.children.find((c: any) => c.name === n) }; +} + +const fixture = (rel: string) => arrayBufferOf(new Uint8Array(readFileSync(join(TEST_ROOT, rel)))); + +describe('every Level-5 fixture is its header and its records, byte for byte', () => { + const files = matFilesUnder(TEST_ROOT); + + it('sweeps the whole corpus', () => { + // Lower bounds, so that a mis-filtered list cannot pass the sweep below vacuously. + expect(files.length).toBeGreaterThanOrEqual(30); + expect(files.map(basename)).toEqual(expect.arrayContaining(['cases.mat', 'Param.mat', 'strings.mat', 'nested_handles.mat'])); + }); + + for (const file of files) { + const refusal = REFUSED.get(basename(file)); + if (refusal) { + it(`${shown(file)} is refused, and has no records to sweep`, () => { + expect(() => parseMat(fixture(shown(file)))).toThrow(refusal); + }); + continue; + } + + it(shown(file), () => { + const input = fixture(shown(file)); + const bytes = new Uint8Array(input); + const parsed = parseMat(input); + + expect([parsed.framed, parsed.unframed]).toEqual([true, null]); + expect(sameBytes(concat([parsed.headerBytes, ...parsed.records.map((r) => r.bytes)]), bytes)).toBe(true); + // Views of the input, not copies: a file's records cost nothing more to keep. + expect(parsed.headerBytes.buffer).toBe(input); + expect(parsed.records.every((r) => r.bytes.buffer === input)).toBe(true); + + // Each record framed as MATLAB frames it, one after another from byte 128. + const view = new DataView(input); + let at = 128; + for (const record of parsed.records) { + const type = view.getUint32(record.offset, true); + const nbytes = view.getUint32(record.offset + 4, true); + expect(record.offset).toBe(at); + expect(record.compressed).toBe(type === MI.COMPRESSED); + expect(record.length).toBe(record.compressed ? 8 + nbytes : 8 + align8(nbytes)); + expect(record.bytes.byteLength).toBe(record.length); + at += record.length; + } + expect(at).toBe(bytes.byteLength); + + // Every record read, each the record of one variable, in the file's order, and named + // as that variable is. + expect(parsed.records.map((r) => r.status)).toEqual(parsed.variables.map(() => 'read')); + expect(parsed.records.map((r) => r.variable)).toEqual(parsed.variables); + parsed.records.forEach((r, i) => expect(r.variable).toBe(parsed.variables[i])); + expect(parsed.records.map((r) => r.name)).toEqual(parsed.variables.map((v) => (v._anonymous ? '' : v.name))); + + // The subsystem is the one unnamed record, the last, and where the header says it is. + const unnamed = parsed.records.filter((r) => r.anonymous); + if (parsed.subsystemOffset === 0) { + expect(unnamed).toEqual([]); + } else { + expect(unnamed.map((r) => r.offset)).toEqual([parsed.subsystemOffset]); + expect(parsed.records[parsed.records.length - 1]).toBe(unnamed[0]); + } + }); + } + + it('holds files with a subsystem and without one, compressed and plain', () => { + const parsed = files.filter((f) => !REFUSED.has(basename(f))).map((f) => parseMat(fixture(shown(f)))); + expect(parsed.some((p) => p.subsystemOffset !== 0)).toBe(true); + expect(parsed.some((p) => p.subsystemOffset === 0 && p.records.length > 0)).toBe(true); + // nested_handles.mat and hexobj_values.mat are -v6: plain records, 8-byte aligned. + expect(parsed.some((p) => p.records.some((r) => !r.compressed))).toBe(true); + expect(parsed.some((p) => p.records.some((r) => r.compressed))).toBe(true); + }); + + for (const file of files.filter((f) => !REFUSED.has(basename(f)))) { + it(`${shown(file)}: every node opened is bound to its record, and to no other`, () => { + const { root } = opened(fixture(shown(file)), basename(file)); + const parsed = parseMat(fixture(shown(file))); + expect(root.framed).toBe(true); + expect(root.subsystemOffset).toBe(parsed.subsystemOffset); + expect(sameBytes(root.headerBytes, parsed.headerBytes)).toBe(true); + const records: MatRecord[] = root.records; + expect(records.map((r) => [r.offset, r.length, r.name])).toEqual(parsed.records.map((r) => [r.offset, r.length, r.name])); + + // A node per named record, in the file's order; none for the subsystem. + const named = records.filter((r) => !r.anonymous); + expect(root.children.length).toBe(named.length); + named.forEach((record, i) => { + const node = root.children[i]; + expect(root.recordOf(node)).toBe(record); + expect(root.nodeOf(record)).toBe(node); + expect(record.name).toBe(node.name); + }); + for (const record of records.filter((r) => r.anonymous)) { + expect(root.nodeOf(record)).toBeNull(); + } + }); + } +}); + +describe('a node of every kind is bound to its record', () => { + it('cases.mat: plain values, strings, and the typed nodes of Simulink objects', () => { + const { root, by } = opened(fixture('parity/artifacts/mat/cases.mat'), 'cases.mat'); + const kinds: [string, string, string][] = [ + ['kp', 'MatlabVariableNode', 'double'], + ['structNest', 'MatlabVariableNode', 'struct'], + ['cellNest', 'MatlabVariableNode', 'cell'], + ['strScalar', 'MatlabVariableNode', 'string'], + ['aParam', 'ParameterNode', 'Simulink.Parameter'], + ['aSignal', 'SignalNode', 'Simulink.Signal'], + ['aBus', 'BusNode', 'Simulink.Bus'], + ['objRow', 'ObjectNode', 'Simulink.Parameter'], + ]; + for (const [name, nodeClass, className] of kinds) { + const node = by(name); + expect([node.constructor.name, node.className], name).toEqual([nodeClass, className]); + const record = root.recordOf(node); + expect([record.name, record.status, record.compressed], name).toEqual([name, 'read', true]); + expect(root.nodeOf(record), name).toBe(node); + } + // A typed node holds no variable (MatNode.getVariables skips it), and is bound all the same. + expect(by('aParam')._var).toBeUndefined(); + expect(root.recordOf(by('aParam')).variable.isOpaque).toBe(true); + }); + + it('Param.mat: a Simulink.Parameter, and the subsystem bound to no node', () => { + const { root } = opened(fixture('fixtures/mcos/Param.mat'), 'Param.mat'); + const [param, subsystem] = root.records as MatRecord[]; + expect(root.children.map((c: any) => c.constructor.name)).toEqual(['ParameterNode']); + expect(root.recordOf(root.children[0])).toBe(param); + expect([subsystem.anonymous, subsystem.name, subsystem.offset, root.nodeOf(subsystem)]).toEqual([true, '', root.subsystemOffset, null]); + expect(root._anonymousElements.length).toBe(1); + expect(root._anonymousElements[0]).toBe(subsystem.variable); + }); + + it('dispcat_opaque.mat: function handles, built from a literal, are bound as well', () => { + const { root, by } = opened(fixture('fixtures/display/dispcat_opaque.mat'), 'dispcat_opaque.mat'); + for (const name of ['fh_sin', 'fh_anon', 'e_func_handle_none']) { + const node = by(name); + expect(node.className, name).toBe('function_handle'); + expect(root.recordOf(node).name).toBe(name); + expect(root.nodeOf(root.recordOf(node))).toBe(node); + } + }); + + it('strings.mat: every string array', () => { + const { root } = opened(fixture('fixtures/strings.mat'), 'strings.mat'); + expect(root.children.length).toBe(11); + for (const node of root.children) { + expect([node.className, root.recordOf(node).name]).toEqual(['string', node.name]); + } + }); + + it('a value shown as not decoded, its flags word overwritten with a class the reader does not model', () => { + const z = numericVar({ name: 'z', cls: CLASS.DOUBLE, dimensions: [1, 1], real: [3], imag: [4] }); + // Byte 16 of the matrix is its array-flags data: class 255, and the complex flag kept. + z[16] = 0xff; + const { root, by } = opened(matFile([scalar('a', 1), z])); + expect(by('z').displayValue).toContain('not decoded'); + expect(root.children.map((c: any) => root.recordOf(c).name)).toEqual(['a', 'z']); + expect(root.framed).toBe(true); + }); +}); + +describe('records that do not tile the file are not framed, and the file opens as it did', () => { + const a = scalar('a', 1); + const b = scalar('b', 2); + const base = new Uint8Array(matFile([a, b])); + + // How a file opens, as a host is shown it: each variable's name and value, and the warnings. + const shownAs = (bytes: ArrayBuffer) => { + const { root } = opened(bytes); + return { rows: root.children.map((c: any) => [c.name, c.displayValue]), warnings: parseMat(bytes).warnings }; + }; + + it('the synthesized base is framed: two plain records', () => { + const parsed = parseMat(arrayBufferOf(base)); + expect([parsed.framed, parsed.records.map((r) => [r.offset, r.compressed])]).toEqual([true, [[128, false], [128 + a.length, false]]]); + expect(shownAs(arrayBufferOf(base))).toEqual({ rows: [['a', '1'], ['b', '2']], warnings: [] }); + }); + + for (const zeros of [8, 16]) { + it(`${zeros} trailing zero bytes: a zero tag, which is no record`, () => { + const bytes = arrayBufferOf(concat([base, new Uint8Array(zeros)])); + const parsed = parseMat(bytes); + expect(parsed.framed).toBe(false); + expect(parsed.unframed!.at).toBe(base.length); + expect(parsed.records.length).toBe(2); + expect(shownAs(bytes)).toEqual(shownAs(arrayBufferOf(base))); + }); + } + + it('3 trailing bytes: the file ends inside a tag', () => { + const bytes = arrayBufferOf(concat([base, new Uint8Array([1, 2, 3])])); + const parsed = parseMat(bytes); + expect([parsed.framed, parsed.unframed!.at, parsed.records.length]).toEqual([false, base.length, 2]); + expect(shownAs(bytes).rows).toEqual([['a', '1'], ['b', '2']]); + expect(parsed.warnings.map((w) => w.message)).toEqual([ + 'The file ends with 3 byte(s) where a record header needs 8, so anything stored after the last variable read was not read.', + ]); + }); + + it('a truncated last record: its view holds what the file does', () => { + const cut = base.subarray(0, base.length - 5); + const parsed = parseMat(arrayBufferOf(cut)); + const last = parsed.records[1]; + expect([parsed.framed, parsed.unframed!.at]).toEqual([false, 128 + a.length]); + expect([last.length, last.bytes.byteLength, last.status, last.name]).toEqual([b.length - 5, b.length - 5, 'read', 'b']); + // The reader reads it short and says so, as it did. + expect(parsed.warnings.map((w) => w.part)).toEqual(['b']); + expect(shownAs(arrayBufferOf(cut)).rows.map((r: unknown[]) => r[0])).toEqual(['a', 'b']); + }); + + // A char 'abc' is an miUTF8 element of 3 bytes and 5 of padding, its last sub-element: a + // record whose nbytes leaves that padding out declares 5 bytes fewer than its matrix holds. + const c = charVar('c', 'abc', MI.UTF8); + const unpadded = (withPad: boolean) => + concat([u32le(MI.MATRIX), u32le(c.length - 8 - 5), c.subarray(8, withPad ? c.length : c.length - 5)]); + + it('a plain record missing its final padding', () => { + const bytes = arrayBufferOf(concat([new Uint8Array(matFile([a])), unpadded(false)])); + const parsed = parseMat(bytes); + expect([parsed.framed, parsed.unframed!.at]).toEqual([false, 128 + a.length]); + expect(parsed.unframed!.reason).toContain(`needs ${c.length} bytes and the file holds ${c.length - 5}`); + expect(shownAs(bytes)).toEqual({ rows: [['a', '1'], ['c', "'abc'"]], warnings: [] }); + }); + + it('a plain record whose nbytes is not a multiple of 8, even with its padding there', () => { + // The reader steps over it without the padding, and reads the next tag out of it. + const parsed = parseMat(arrayBufferOf(concat([new Uint8Array(matFile([a])), unpadded(true)]))); + expect([parsed.framed, parsed.unframed!.at]).toEqual([false, 128 + a.length]); + expect(parsed.unframed!.reason).toContain('not a whole number of 8-byte words'); + expect(parsed.records.map((r) => r.name)).toEqual(['a', 'c']); + }); + + it('zero padding after a compressed record', () => { + // MATLAB writes a compressed record unpadded, and fails a file padded after one + // (research R5); the reader steps 8 + nbytes, onto the padding. + let record = compressedRecord(scalar('a', 1)); + let value = 1; + while (record.length % 8 === 0) { + record = compressedRecord(scalar('a', ++value)); + } + const bytes = arrayBufferOf(concat([new Uint8Array(matFile([record])), new Uint8Array(8 - (record.length % 8))])); + const parsed = parseMat(bytes); + expect([parsed.framed, parsed.unframed!.at, parsed.records.length]).toEqual([false, 128 + record.length, 1]); + expect(shownAs(bytes).rows).toEqual([['a', String(value)]]); + }); + + it('a zero tag with a variable after it: the reader stops there, as it did', () => { + const bytes = arrayBufferOf(new Uint8Array(matFile([a, new Uint8Array(8), b]))); + const parsed = parseMat(bytes); + expect([parsed.framed, parsed.unframed!.at, parsed.records.map((r) => r.name)]).toEqual([false, 128 + a.length, ['a']]); + expect(shownAs(bytes)).toEqual({ rows: [['a', '1']], warnings: [] }); + }); + + it("a small data element's tag at the top of the file", () => { + // An int32 0 in the small form, whose payload word the reader takes for its nbytes. + const small = concat([u32le((4 << 16) | MI.INT32), u32le(0)]); + const bytes = arrayBufferOf(new Uint8Array(matFile([a, small, b]))); + const parsed = parseMat(bytes); + expect([parsed.framed, parsed.unframed!.at]).toEqual([false, 128 + a.length]); + expect(shownAs(bytes).rows).toEqual([['a', '1'], ['b', '2']]); + }); + + it('a header and nothing after it is framed, and holds no records', () => { + const parsed = parseMat(matFile([])); + expect([parsed.framed, parsed.records, parsed.subsystemOffset]).toEqual([true, [], 0]); + }); +}); + +describe('a record the reader drops is still a record', () => { + afterEach(() => setMatRecordInflateCeiling(undefined)); + + const a = scalar('a', 1); + const b = scalar('b', 2); + + // The file `[a, middle, b]`, the dropped middle record, and the one warning it gave. + function dropping(middle: Uint8Array) { + const input = matFile([a, middle, b]); + const parsed = parseMat(input); + expect(parsed.framed).toBe(true); + expect(sameBytes(concat([parsed.headerBytes, ...parsed.records.map((r) => r.bytes)]), new Uint8Array(input))).toBe(true); + const [, dropped] = parsed.records; + expect([dropped.offset, dropped.length, dropped.status, dropped.name, dropped.variable, dropped.anonymous]) + .toEqual([128 + a.length, middle.length, 'dropped', null, null, false]); + expect(parsed.warnings.map((w) => w.message)).toEqual([dropped.reason]); + // The variables around it open and are bound; it has no node. + const { root } = opened(input); + expect(root.children.map((n: any) => root.recordOf(n).name)).toEqual(['a', 'b']); + expect(root.nodeOf(root.records[1])).toBeNull(); + return dropped; + } + + it('one that does not inflate', () => { + const junk = new Uint8Array([0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88]); + const dropped = dropping(concat([u32le(MI.COMPRESSED), u32le(junk.length), junk])); + expect([dropped.compressed, dropped.reason]).toEqual([true, expect.stringContaining('could not be decompressed')]); + }); + + it('one that inflates past the ceiling for one record', () => { + setMatRecordInflateCeiling(1024); + const big = numericVar({ name: 'big', cls: CLASS.UINT8, dimensions: [4096, 1], real: new Array(4096).fill(0) }); + expect(dropping(compressedRecord(big)).reason).toContain('inflates to more than the 1024-byte ceiling'); + }); + + it('one that inflates to fewer bytes than a tag', () => { + expect(dropping(compressedRecord(new Uint8Array(4))).reason).toContain('fewer than the 8'); + }); + + it('one that inflates to an element that is not a matrix', () => { + expect(dropping(compressedRecord(element(MI.INT32, new Uint8Array(8)))).reason).toContain('where a variable has to be a matrix'); + }); + + it('a plain record of a type that is not a variable', () => { + const dropped = dropping(element(MI.INT32, new Uint8Array(8))); + expect([dropped.compressed, dropped.reason]).toEqual([false, expect.stringContaining('is not a variable')]); + }); +}); + +describe("the header's subsystem offset", () => { + const withOffset = (bytes: number[]) => { + const input = new Uint8Array(matFile([scalar('a', 1)])); + input.set(bytes, 116); + return parseMat(arrayBufferOf(input)).subsystemOffset; + }; + + it('is the little-endian uint64 in bytes 116-123', () => { + expect(withOffset([0x34, 0x12, 0, 0, 0, 0, 0, 0])).toBe(0x1234); + expect(withOffset([0, 0, 0, 0, 1, 0, 0, 0])).toBe(2 ** 32); + }); + + it('is 0 for 8 zero bytes, and for 8 spaces', () => { + expect(withOffset([0, 0, 0, 0, 0, 0, 0, 0])).toBe(0); + expect(withOffset(new Array(8).fill(0x20))).toBe(0); + }); +}); + +describe("a host's parse", () => { + const input = () => fixture('fixtures/mcos/object_props.mat'); + + function openedParsed(parsed: unknown) { + const session = createSession(); + return session.addMatSourceParsed('object_props.mat', parsed) as any; + } + + it('with no records, as an older package hands one over: no records, nothing bound, and the tree as before', () => { + const { header, variables, warnings } = parseMat(input()); + const root = openedParsed({ header, variables, warnings }); + expect([root.records, root.headerBytes, root.framed, root.subsystemOffset]).toEqual([null, null, false, 0]); + expect(root.children.map((c: any) => root.recordOf(c))).toEqual([null, null, null]); + expect(root.children.map((c: any) => c.name)).toEqual(opened(input()).root.children.map((c: any) => c.name)); + }); + + it('structured-cloned off a worker: each record is still its variable, and the nodes are bound', () => { + const root = openedParsed(structuredClone(parseMat(input()))); + expect([root.framed, root.records.length]).toEqual([true, 4]); + expect(root.children.map((c: any) => root.recordOf(c)?.name)).toEqual(root.children.map((c: any) => c.name)); + }); + + it('whose variables a host changed since: nothing bound', () => { + const parsed: ParsedMat = parseMat(input()); + const root = openedParsed({ ...parsed, variables: parsed.variables.slice(1) }); + expect(root.records).toBeNull(); + expect(root.children.map((c: any) => root.recordOf(c))).toEqual(root.children.map(() => null)); + }); + + it('whose records hold no bytes: nothing bound', () => { + const parsed: ParsedMat = parseMat(input()); + const root = openedParsed({ ...parsed, records: parsed.records.map((r) => ({ ...r, bytes: Array.from(r.bytes) })) }); + expect(root.records).toBeNull(); + }); +}); + +// What a save decides on, pinned here so that it is not changed from under the writer: the +// top-level node's status says whether anything under it was edited, and a node keeps its +// record through every edit, a delete and its undo. +describe('an edit and its record', () => { + const casesMat = () => { + const { session, root, by } = opened(fixture('parity/artifacts/mat/cases.mat'), 'cases.mat'); + const edit = (node: any, prop: string, value: string) => { + session.setActive(root, node); + return session.editProperty(node.id, prop, value); + }; + return { session, root, by, edit }; + }; + + const childEdits: [string, (by: (n: string) => any) => any][] = [ + ['a matrix element', (by) => by('mat2x3').children[0]], + ['a struct field', (by) => by('structScalar').children[0]], + ["a struct array element's field", (by) => by('struct1x3').children[0].children[0]], + ['a cell member', (by) => by('cellFlat').children[0]], + ]; + for (const [what, target] of childEdits) { + it(`${what}'s edit makes the variable it is in Modified`, () => { + const { by, edit } = casesMat(); + const node = target(by); + let top = node; + while (top.parent.parent) { + top = top.parent; + } + expect(top.status).toBe(''); + expect(edit(node, 'Value', '9')).toBe(true); + expect(top.status).toBe('Modified'); + }); + } + + it('an added field makes the struct Modified', () => { + const { session, root, by } = casesMat(); + const struct = by('structScalar'); + session.setActive(root, struct); + expect(session.addChildTo(struct.id)).not.toBeNull(); + expect(struct.status).toBe('Modified'); + }); + + it("an object's property edit is refused, and leaves its typed node as it was; one made around the editor makes it Modified", () => { + // A MAT-file's save writes an object only as it was read, or renamed (MatNode._editRefusal). + const { by, edit } = casesMat(); + expect(edit(by('aParam'), 'Value', '[1 2 3]')).toMatchObject({ error: true }); + expect(by('aParam').status).toBe(''); + by('aParam')._markModified(); + expect(by('aParam').status).toBe('Modified'); + }); + + it('a rename shows on the node, and the record keeps the name the file holds', () => { + const { root, by, edit } = casesMat(); + const node = by('kp'); + expect(edit(node, 'Name', 'kp2')).toBe(true); + expect([node.name, node.status, root.recordOf(node).name]).toEqual(['kp2', 'Modified', 'kp']); + }); + + it('a deleted node is out of the tree and still its record\'s, and its undo puts that node back', () => { + const { session, root, by } = casesMat(); + const node = by('kp'); + const record = root.recordOf(node); + session.setActive(root, node); + expect(session.deleteNodeById(node.id)).toBe(true); + expect(node.parent).toBeNull(); + expect(root.nodeOf(record)).toBe(node); + session.undo(); + expect(node.parent).toBe(root); + expect(root.children[0]).toBe(node); + expect(root.recordOf(node)).toBe(record); + }); + + it('a variable added since the file was read has no record, and no status to say it is new', () => { + const { root } = casesMat(); + const { node } = root.execAddEntry(); + expect([root.recordOf(node), node.status]).toEqual([null, '']); + }); +}); diff --git a/test/matSpliceVerdict.test.ts b/test/matSpliceVerdict.test.ts new file mode 100644 index 00000000..2b0a2fe7 --- /dev/null +++ b/test/matSpliceVerdict.test.ts @@ -0,0 +1,353 @@ +// Copyright 2026 The MathWorks, Inc. +// +// The `.mat` save judges what it wrote by MATLAB's load rules where it changed the file +// (MatFileCheck.violationsAddedBySplice), and no longer by checking the file it read and the +// file it wrote whole, which inflated every compressed record of both at every save and could +// not save a file past the check's budget at all. The answer has to be the one the whole-file +// check gave: `violationsAdded(checkMatFile(read), checkMatFile(written), renamed)`. +// +// * Over every .mat under test/, MATLAB's verdict corpus included, and a set of saves of each +// (every variable renamed, every plain one written fresh, every other one deleted, one +// added, all four at once, and one written as bytes MATLAB fails on), the splice's verdict +// is the whole-file one, rule by rule and variable by variable, for every save that reached +// the check. +// * Where it may not take the short way, it takes the long one, and says the same. +// * A file past the check's budget whole saves where it changed little, and the budget is +// spent on what changed. +import { describe, it, expect, vi } from 'vitest'; +import { readFileSync, readdirSync } from 'node:fs'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { zlibSync } from 'fflate'; +import { checkMatFile, violationsAdded, violationsAddedBySplice } from '../src/datamodel/parser/MatFileCheck.js'; +import type { MatFileOfRecords, MatReadRecord, MatSplicedRecord, MatViolation } from '../src/datamodel/parser/MatFileCheck.js'; +import { serializeMatFile } from '../src/datamodel/parser/MatFileWriter.js'; +import { MatWriteError } from '../src/datamodel/parser/MatWriter.js'; +import { parseMat } from '../src/datamodel/parser/MatParser.js'; +import { createSession } from '../src/index.js'; +import { CLASS, MI, charVar, matFile, numericVar, u32le } from './tools/matBytes.js'; + +// Every call the writer makes of the splice's verdict, with what it answered. +const calls = vi.hoisted(() => [] as { read: any; written: any; renamed: ReadonlyMap; added: MatViolation[] }[]); +vi.mock('../src/datamodel/parser/MatFileCheck.js', async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + violationsAddedBySplice: (read: any, written: any, renamed: ReadonlyMap = new Map(), options = {}) => { + const added = actual.violationsAddedBySplice(read, written, renamed, options); + calls.push({ read, written, renamed, added }); + return added; + }, + }; +}); + +const TEST_ROOT = fileURLToPath(new URL('.', import.meta.url)); + +function matFilesUnder(dir: string): string[] { + const out: string[] = []; + for (const entry of readdirSync(dir, { withFileTypes: true })) { + const abs = join(dir, entry.name); + if (entry.isDirectory()) { + out.push(...matFilesUnder(abs)); + } else if (entry.isFile() && entry.name.endsWith('.mat')) { + out.push(abs); + } + } + return out.sort(); +} + +// The one file under test/ the reader refuses: a `-v7.3` file is HDF5, not Level 5. +const FILES = matFilesUnder(TEST_ROOT).filter((f) => !f.endsWith('strings_v73.mat')); + +function arrayBufferOf(bytes: Uint8Array): ArrayBuffer { + return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; +} + +function joined(header: Uint8Array, records: readonly Uint8Array[]): Uint8Array { + const out = new Uint8Array(header.byteLength + records.reduce((n, r) => n + r.byteLength, 0)); + out.set(header, 0); + let at = header.byteLength; + for (const r of records) { + out.set(r, at); + at += r.byteLength; + } + return out; +} + +const readFile = (read: MatFileOfRecords) => joined(read.header, read.records.map((r) => r.bytes)); +const writtenFile = (read: MatFileOfRecords, written: MatFileOfRecords) => + joined(written.header, written.records.map((r) => ('kept' in r ? read.records[r.kept].bytes : r.written))); + +// A verdict as violationsAdded counts it: by rule, and by variable under its name as read. +const keyed = (added: readonly MatViolation[], renamed: ReadonlyMap) => + added.map((v) => v.code + ' ' + (v.variable === undefined ? '' : renamed.get(v.variable) ?? v.variable)).sort(); + +/** A MatNode opened from `bytes` through the session, as a host opens one, and its edits. */ +function opened(bytes: ArrayBuffer, name: string) { + const session = createSession(); + const root: any = session.addMatSource(name, bytes); + const edit = (node: any, prop: string, value: string) => { + session.setActive(root, node); + return session.editProperty(node.id, prop, value); + }; + const remove = (node: any) => { + session.setActive(root, node); + return session.deleteNodeById(node.id); + }; + return { root, edit, remove }; +} + +const plainOf = (root: any) => root.children.filter((n: any) => n._matWritable?.() === true && !root.recordOf(n)?.variable?.isOpaque); + +// The stream of a char array stored as miUINT16, which this package's reader reads back as +// written and MATLAB reads as the low byte of each unit (`char-type`): what a writer that broke +// a rule would write, standing in for one. +function uint16CharStream(text: string): Uint8Array { + const units = new Uint8Array(text.length * 2); + for (let i = 0; i < text.length; i++) { + new DataView(units.buffer).setUint16(2 * i, text.charCodeAt(i), true); + } + const tag = (type: number, n: number) => joined(u32le(type), [u32le(n)]); + const body = joined(new Uint8Array(0), [ + tag(MI.UINT32, 8), u32le(CLASS.CHAR), u32le(0), + tag(MI.INT32, 8), u32le(1), u32le(text.length), + tag(MI.INT8, 0), + tag(MI.UINT16, units.length), units, new Uint8Array((8 - (units.length % 8)) % 8), + ]); + return joined(new Uint8Array([0, 1, 0x49, 0x4d, 0, 0, 0, 0]), [tag(MI.MATRIX, body.length), body]); +} + +// Each kind of save, and at least how many of the files reach the check with it (measured when +// this was written: 120, 74, 121, 123, 115 and 123), and whether it is written to break a rule. +const SAVES: [string, (o: ReturnType) => void, number, boolean][] = [ + ['every variable renamed', (o) => o.root.children.slice().forEach((n: any, i: number) => o.edit(n, 'Name', 'renamed' + i)), 110, false], + ['every plain variable written fresh', (o) => plainOf(o.root).forEach((n: any) => n._markModified()), 65, false], + ['every other variable deleted', (o) => o.root.children.filter((_: any, i: number) => i % 2 === 0).forEach((n: any) => o.remove(n)), 110, false], + ['a variable added', (o) => o.root.execAddEntry(), 110, false], + [ + 'renamed, written fresh, deleted and added at once', + (o) => { + const [first, second, third] = o.root.children; + first && o.edit(first, 'Name', 'renamedFirst'); + second && plainOf(o.root).includes(second) && second._markModified(); + third && o.remove(third); + o.root.execAddEntry(); + }, + 105, + false, + ], + [ + 'a variable added as bytes that break a rule', + (o) => { + const added = o.root.execAddEntry()?.node; + if (added && o.edit(added, 'Value', "'中文'") === true) { + added._matStream = () => uint16CharStream('中文'); + } + }, + 110, + true, + ], +]; + +describe('the verdict of a save, judged where it changed the file, is the verdict of both files judged whole', () => { + for (const [what, edit, least, breaks] of SAVES) { + it(what, () => { + let compared = 0; + let refusedByIt = 0; + const notRefused: MatViolation[][] = []; + for (const file of FILES) { + const input = new Uint8Array(readFileSync(file)); + const o = opened(arrayBufferOf(input), file.slice(file.lastIndexOf('/') + 1)); + edit(o); + calls.length = 0; + try { + serializeMatFile(o.root); + } catch (e) { + expect(e, file).toBeInstanceOf(MatWriteError); + } + for (const { read, written, renamed, added } of calls) { + // The read side is the file, byte for byte. + const before = readFile(read); + expect(before.byteLength === input.byteLength && before.every((b, i) => b === input[i]), file).toBe(true); + const whole = violationsAdded(checkMatFile(before), checkMatFile(writtenFile(read, written)), renamed); + expect(keyed(added, renamed), `${file}: ${what}`).toEqual(keyed(whole, renamed)); + compared++; + refusedByIt += added.length > 0 ? 1 : 0; + if (added.length === 0) { + notRefused.push(checkMatFile(before)); + } + } + } + // Not vacuous: most of the 137 files reach the check with each kind of save (fewer with + // a plain variable to write fresh: the corpus holds many of objects alone), and none but + // the one written to break a rule is refused by either. + expect(compared, what).toBeGreaterThanOrEqual(least); + if (breaks) { + // Refused by both wherever the check reads past the header, which it does not of a file + // whose header is not a Level-5 one (version-0x0000.mat, version-0x0200.mat): MATLAB + // loads nothing of it, before the save or after. + expect(refusedByIt, what).toBeGreaterThanOrEqual(least); + for (const violations of notRefused) { + expect(violations.map((v) => v.code), what).toContain('not-level5'); + } + } else { + expect(refusedByIt, what).toBe(0); + } + }); + } +}); + +// ---- Files made to break each rule ------------------------------------------------------------ + +const scalar = (name: string, value: number) => numericVar({ name, cls: CLASS.DOUBLE, dimensions: [1, 1], real: [value] }); + +// A compressed record of `element`, as MATLAB writes one: its zlib stream in an miCOMPRESSED tag. +const compressed = (element: Uint8Array) => { + const stream = zlibSync(element, { level: 6 }); + return joined(u32le(MI.COMPRESSED), [u32le(stream.byteLength), stream]); +}; + +// The file of `records`, as a splice's read side. +function readOf(records: Uint8Array[]): MatFileOfRecords { + const bytes = new Uint8Array(matFile(records)); + return { header: bytes.subarray(0, 128), records: parseMat(arrayBufferOf(bytes)).records.map((r) => ({ bytes: r.bytes })) }; +} + +const both = (read: MatFileOfRecords, written: MatFileOfRecords, renamed = new Map()) => { + const whole = violationsAdded(checkMatFile(readFile(read)), checkMatFile(writtenFile(read, written)), renamed); + return [keyed(violationsAddedBySplice(read, written, renamed), renamed), keyed(whole, renamed)]; +}; + +describe('the short way says what the long way says of the rules of where records stand', () => { + // `b` is a char stored as miUINT8, which MATLAB fails on (`char-type`). + const read = readOf([scalar('a', 1), charVar('b', 'xy', MI.UINT8), scalar('c', 3)]); + const header = (offset: bigint) => { + const h = read.header.slice(); + new DataView(h.buffer).setBigUint64(116, offset, true); + return h; + }; + const cases: [string, MatFileOfRecords, Map, string[]][] = [ + ['a variable added under a name the file holds', { header: read.header, records: [{ kept: 0 }, { kept: 1 }, { kept: 2 }, { written: scalar('a', 2), replaces: null }] }, new Map(), ['duplicate-name a']], + ['an unnamed record added before the last', { header: read.header, records: [{ kept: 0 }, { written: scalar('', 2), replaces: null }, { kept: 2 }] }, new Map(), ['anonymous-record ']], + ['a header that places the subsystem where none is', { header: header(136n), records: [{ kept: 0 }, { kept: 1 }, { kept: 2 }] }, new Map(), ['subsystem-offset ']], + ['a variable renamed, its violation with it', { header: read.header, records: [{ kept: 0 }, { written: charVar('bb', 'xy', MI.UINT8), replaces: 1 }, { kept: 2 }] }, new Map([['bb', 'b']]), []], + ['a variable renamed, its violation said under its new name alone', { header: read.header, records: [{ kept: 0 }, { written: charVar('bb', 'xy', MI.UINT8), replaces: 1 }, { kept: 2 }] }, new Map(), ['char-type bb']], + ['a variable written as bytes that break a rule', { header: read.header, records: [{ written: charVar('a', 'xy', MI.UINT8), replaces: 0 }, { kept: 1 }, { kept: 2 }] }, new Map(), ['char-type a']], + ['the variable that broke one deleted, and another written so', { header: read.header, records: [{ written: charVar('a', 'xy', MI.UINT8), replaces: 0 }, { kept: 2 }] }, new Map(), ['char-type a']], + ]; + for (const [what, written, renamed, expected] of cases) { + it(what, () => { + const [splice, whole] = both(read, written, renamed); + expect(splice).toEqual(whole); + expect(splice).toEqual(expected); + }); + } + + it('a deleted record is checked when what is added could be matched with one of its violations', () => { + // `end` deleted and `end` added: the added one's `name` violation is the deleted one's. + const read = readOf([scalar('a', 1), scalar('end', 2)]); + const [splice, whole] = both(read, { header: read.header, records: [{ kept: 0 }, { written: scalar('end', 3), replaces: null }] }); + expect(splice).toEqual(whole); + expect(splice).toEqual([]); + }); +}); + +describe('where the short way does not hold, the splice checks both files whole, or as far as the whole check reads them', () => { + it('a record kept twice: its violation is counted twice, as the whole check counts it', () => { + const read = readOf([scalar('a', 1), scalar('end', 2)]); + const [splice, whole] = both(read, { header: read.header, records: [{ kept: 0 }, { kept: 1 }, { kept: 1 }] }); + expect(splice).toEqual(whole); + expect(splice).toEqual(['duplicate-name end', 'name end']); + }); + + it('a record kept and replaced', () => { + const read = readOf([scalar('a', 1), scalar('end', 2)]); + const [splice, whole] = both(read, { header: read.header, records: [{ kept: 1 }, { written: scalar('end', 3), replaces: 1 }] }); + expect(splice).toEqual(whole); + expect(splice).toEqual(['duplicate-name end', 'name end']); + }); + + it('a kept record holding a name the renames map: its violation is compared under the other name, as the whole check compares it', () => { + // 'end' breaks `name`; renaming `a` to it maps 'end' to 'a', and the kept record's violation + // with it. + const read = readOf([scalar('a', 1), scalar('end', 2)]); + const renamed = new Map([['end', 'a']]); + const [splice, whole] = both(read, { header: read.header, records: [{ written: scalar('end', 1), replaces: 0 }, { kept: 1 }] }, renamed); + expect(splice).toEqual(whole); + expect(splice.length).toBeGreaterThan(0); + }); + + it('a record whose tag the walk reads as padding: a top-level type above 255', () => { + const odd = joined(u32le(0x100), [u32le(8), new Uint8Array(8)]); + const read = readOf([scalar('a', 1), odd]); + const [splice, whole] = both(read, { header: read.header, records: [{ kept: 1 }, { written: scalar('end', 1), replaces: null }] }); + expect(splice).toEqual(whole); + // The walk stops at the padding it takes the record for, so the record after it is not seen. + expect(splice).toEqual([]); + }); + + it('a header the check reads no further than, on both sides', () => { + const read = readOf([scalar('a', 1)]); + const header = read.header.slice(); + header[125] = 0x02; + const off = { header, records: read.records }; + const [splice, whole] = both(off, { header, records: [{ written: scalar('end', 1), replaces: 0 }] }); + expect(splice).toEqual(whole); + expect(splice).toEqual([]); + }); + +}); + +// ---- The budget ------------------------------------------------------------------------------- + +describe('a file past the check\'s budget whole is checked, and saved, where it changed', () => { + // Three compressed records, two of them a MiB of zeros each, under a budget of 1.5 MiB of + // inflated bytes: checked whole, the file stops at the budget; the splice spends it on what + // changed, the records written and the ones they replace. + const MIB = 2 ** 20; + const big = (name: string) => numericVar({ name, cls: CLASS.UINT8, dimensions: [1, MIB], real: [], rawReal: new Uint8Array(MIB) }); + const input = matFile([compressed(scalar('a', 1)), compressed(big('big1')), compressed(big('big2'))]); + const budget = { maxInflatedBytes: 1.5 * MIB }; + + it('is past the budget, whole', () => { + expect(checkMatFile(new Uint8Array(input), budget).map((v) => v.code)).toEqual(['budget']); + expect(checkMatFile(new Uint8Array(input))).toEqual([]); + }); + + it('saves a rename of a small variable, and of a big one the budget holds', () => { + for (const name of ['a', 'big1']) { + const o = opened(input, 'big.mat'); + const node = o.root.children.find((c: any) => c.name === name); + expect(o.edit(node, 'Name', name + 'Renamed'), name).toBe(true); + const saved = serializeMatFile(o.root, budget); + expect(parseMat(arrayBufferOf(saved)).variables.map((v) => v.name), name).toEqual( + ['a', 'big1', 'big2'].map((n) => (n === name ? name + 'Renamed' : n)), + ); + // Checked whole without a budget, it adds nothing. + expect(violationsAdded(checkMatFile(new Uint8Array(input)), checkMatFile(saved), new Map([[name + 'Renamed', name]])), name).toEqual([]); + } + }); + + it('saves an edit of the small variable, and a delete of a big one', () => { + const o = opened(input, 'big.mat'); + expect(o.edit(o.root.children[0], 'Value', '7')).toBe(true); + expect(o.remove(o.root.children[2])).toBe(true); + const parsed = parseMat(arrayBufferOf(serializeMatFile(o.root, budget))); + expect(parsed.variables.map((v) => [v.name, v.name === 'a' ? v.value : v.dimensions])).toEqual([['a', 7], ['big1', [1, MIB]]]); + }); + + it('refuses, saying it could not verify it, a rename of a variable past the budget itself', () => { + const o = opened(input, 'big.mat'); + expect(o.edit(o.root.children[1], 'Name', 'big1Renamed')).toBe(true); + let thrown: unknown; + try { + serializeMatFile(o.root, { maxInflatedBytes: MIB / 2 }); + } catch (e) { + thrown = e; + } + expect(thrown).toBeInstanceOf(MatWriteError); + expect((thrown as Error).message).toMatch( + /^Cannot save "big\.mat": the file written for it could not be verified within the check's budget against the rules MATLAB loads a file by \(The check stopped at byte \d+, at more than the 524288 bytes one check inflates, so nothing from there on was checked\), so it is not known to load\. Nothing was written\.$/, + ); + }); +}); diff --git a/test/matStructArray.test.ts b/test/matStructArray.test.ts index db925c82..ddb43ada 100644 --- a/test/matStructArray.test.ts +++ b/test/matStructArray.test.ts @@ -355,6 +355,9 @@ describe('a MAT struct array with no fields, past the row cap', () => { expect(opened(fieldless('s', [3, 4])).map(shown)).toEqual([['s', '<3x4 struct>', 12]]); expect(opened(fieldless('s', [1, MAX])).map(shown)).toEqual([['s', `<1x${MAX} struct>`, MAX]]); expect(opened(fieldless('s', [1, MAX + 1])).map(shown)).toEqual([['s', `<1x${MAX + 1} struct>`, 0]]); + // And the one rule every writer asks of it (MatlabVariableNode._unexpandedStruct: written as the + // bytes it was read from), on either side of the cap. + expect([opened(fieldless('s', [1, MAX]))[0]._unexpandedStruct(), opened(fieldless('s', [1, MAX + 1]))[0]._unexpandedStruct()]).toEqual([false, true]); // The size that ran the heap out, at top level, in a struct field and in a cell. Asked // last, so that a reader without the cap fails on the case above instead of here. const [s, t, c] = opened(fieldless('s', BIG), structVar('t', ['f'], [{ f: fieldless('', BIG) }]), cellVar('c', [fieldless('', BIG)])); @@ -557,10 +560,11 @@ describe('a MAT struct array with no fields, past the row cap', () => { }); // Add Child gives a struct one `field` row of its own, and past the cap that row held the // only copy of the edit: the save, which writes such an array from the bytes it was read - // from, dropped it. So it is refused, as a sparse array's is. Up to the cap it is offered as - // before. + // from, dropped it. So it is refused, as a sparse array's is. In a .mat it is refused up to the + // cap as well: the row Add makes is an element of no fields, which its save does not write + // (MatNode._editRefusal). it('takes no Add Child past the cap, where the save would drop the row it adds', () => { - expect(opened(fieldless('s', [1, MAX]))[0].canAddChild()).toBe(true); + expect(opened(fieldless('s', [1, MAX]))[0].canAddChild()).toBe(false); for (const d of [[1, MAX + 1], BIG]) { const [s] = opened(fieldless('s', d)); expect([s.canAddChild(), s.execAddChild(), s.children.length], String(d)).toEqual([false, null, 0]); @@ -761,9 +765,11 @@ describe('a MAT 1x1 struct with a field slot that is not a matrix', () => { const mat = opened('s.mat', before, damaged, after); const [b, s, a] = mat.children; expect([s.name, s.displayValue, s.children.length]).toEqual(['s', '<1x1 struct>', 2]); + // The field beside it takes no edit either: a save writes the struct fresh, or not at all, and + // has nothing to write the field it did not decode from (MatNode._editRefusal). expect(s.children.map(row)).toEqual([ ['a', '', 'unknown', 0, false], - ['b', '2', 'double', 0, true], + ['b', '2', 'double', 0, false], ]); expect(mat.warnings).toEqual([{ code: 'part-unreadable', message: `"s.a" was not decoded: ${reason}.`, part: 's.a' }]); // Nothing to write it from: its copy, and the struct's, are refused at it, naming it. The field diff --git a/test/mcosShortValues.test.ts b/test/mcosShortValues.test.ts index 328c0b6d..0974117a 100644 --- a/test/mcosShortValues.test.ts +++ b/test/mcosShortValues.test.ts @@ -125,6 +125,9 @@ function slotsOpened(d: number[], first: number[], second = secondCellTag()): { const holder = src.children.find((x: any) => x.name === 'holder'); return { c: holder.children.find((x: any) => x.name === 'C'), warnings: src.warnings ?? [] }; } +// In a .mat every row under an object takes no edit, a slot read as well as one that was not: its +// save writes the object only as it was read (MatNode._editRefusal). What tells the two apart is +// their values, and the copy of the one not decoded, which is refused (copyRefused). const slotRows = (c: any) => c.children.map((e: any) => [e.displayName, e.displayValue, e.valueEditable]); // What a host meets copying the slot: the refusal of a value that was not decoded (F1-10), naming it. function copyRefused(node: any): unknown[] { @@ -142,23 +145,24 @@ describe('a cell slot under a decoded object that could not be read', () => { // the node layer built as the double 0: holder.C showed `{0, [3+4i 5+6i]}`, editable, said nothing, // and a copy of the slot was the 0. At the top of a .mat the same cell says it holds one cell of // its two (MatParser.collectUndecoded). Under an object it now says so in those words, and the slot - // shows as not decoded (theme 1: show what was read), with no editor and a refused copy. + // shows as not decoded (theme 1: show what was read), with no editor and a refused copy. (No row + // under the object takes an edit in a .mat, whose save writes the object as it was read.) it('one that is not a matrix: shown as not decoded, in its own place, and counted as not read', () => { const { c, warnings } = slotsOpened([1, 2], firstCell(2)); expect(warnings).toEqual([cellsSaid('holder.C', 2, 1)]); - expect(slotRows(c)).toEqual([['C{1}', '', false], ['C{2}', '[3+4i 5+6i]', true]]); + expect(slotRows(c)).toEqual([['C{1}', '', false], ['C{2}', '[3+4i 5+6i]', false]]); expect(c.displayValue).toBe('{, [3+4i 5+6i]}'); expect(copyRefused(c.children[0])).toEqual(refusedAs('a 1x1 unknown')); // The second slot, the first read: nothing slides into the hole. const second = slotsOpened([1, 2], firstCell(), secondCellTag(2)); expect(second.warnings).toEqual([cellsSaid('holder.C', 2, 1)]); - expect(slotRows(second.c)).toEqual([['C{1}', '1+2i', true], ['C{2}', '', false]]); + expect(slotRows(second.c)).toEqual([['C{1}', '1+2i', false], ['C{2}', '', false]]); }); it('one of a class the reader does not model: the same, under the class the file names', () => { const { c, warnings } = slotsOpened([1, 2], firstCell(14, 99)); expect(warnings).toEqual([cellsSaid('holder.C', 2, 1)]); - expect(slotRows(c)).toEqual([['C{1}', '<1x1 unknown, not decoded>', false], ['C{2}', '[3+4i 5+6i]', true]]); + expect(slotRows(c)).toEqual([['C{1}', '<1x1 unknown, not decoded>', false], ['C{2}', '[3+4i 5+6i]', false]]); expect(copyRefused(c.children[0])).toEqual(refusedAs('a 1x1 unknown', 'its MAT array class is not one this reader models')); }); @@ -166,20 +170,20 @@ describe('a cell slot under a decoded object that could not be read', () => { const { c, warnings } = slotsOpened([1, 2], firstCell(14, 6, [1, 100_000_000])); const why = 'declares 100000000 elements, more than the 32 bytes left in it can hold'; expect(warnings).toEqual([{ code: 'part-unreadable', message: `"holder.C{1}" was not decoded: ${why}.`, part: 'holder.C{1}' }]); - expect(slotRows(c)).toEqual([['C{1}', '<1x100000000 double, not decoded>', false], ['C{2}', '[3+4i 5+6i]', true]]); + expect(slotRows(c)).toEqual([['C{1}', '<1x100000000 double, not decoded>', false], ['C{2}', '[3+4i 5+6i]', false]]); expect(copyRefused(c.children[0])).toEqual(refusedAs('a 1x100000000 double', why)); }); it('in a cell that also holds fewer cells than it declares: one warning, counting both', () => { const { c, warnings } = slotsOpened([1, 3], firstCell(2)); expect(warnings).toEqual([cellsSaid('holder.C', 3, 1)]); - expect(slotRows(c)).toEqual([['C{1}', '', false], ['C{2}', '[3+4i 5+6i]', true]]); + expect(slotRows(c)).toEqual([['C{1}', '', false], ['C{2}', '[3+4i 5+6i]', false]]); }); it('control: the respelling is the identity on the pristine bytes, and the slots read', () => { const { c, warnings } = slotsOpened([1, 2], firstCell()); expect(warnings).toEqual([]); - expect(slotRows(c)).toEqual([['C{1}', '1+2i', true], ['C{2}', '[3+4i 5+6i]', true]]); + expect(slotRows(c)).toEqual([['C{1}', '1+2i', false], ['C{2}', '[3+4i 5+6i]', false]]); }); }); diff --git a/test/moduleBoundaries.test.ts b/test/moduleBoundaries.test.ts index 42bc2581..5ee1019c 100644 --- a/test/moduleBoundaries.test.ts +++ b/test/moduleBoundaries.test.ts @@ -161,8 +161,8 @@ describe('the seams that are already clean stay clean', () => { expect(describeEdges(outboundFrom('datamodel/display'))).toEqual([]); }); - it('keeps datamodel/parser/ reaching for nothing but blockIdentity and fileKinds', () => { - // TWO allowed modules, and both are the same kind of thing: a table of rules about + it('keeps datamodel/parser/ reaching for nothing but blockIdentity, fileKinds and matlabName', () => { + // THREE allowed modules, and all are the same kind of thing: a table of rules about // names that the parsers share with code outside this folder. // // `datamodel/blockIdentity.ts` came first — `MdlParser` and `SlxParser` both have @@ -174,19 +174,23 @@ describe('the seams that are already clean stay clean', () => { // `endsWith('.sldd')` that disagreed on case — is that a rule like that lives in one // place. Re-spelling `'matlab.toml'` inside the parser folder to keep this test at // one allowed module would be the exact defect that module was written to end. + // `datamodel/matlabName.ts` was added with the MAT-file writer (MatFileWriter), which + // writes variable names into a file: the rule for a name MATLAB can load is the one a + // rename and a new entry are held to, and a second spelling of it here could let a + // save write a name no edit could have made. // - // Both widen the seam by nothing measurable: neither imports anything at all, so + // All three widen the seam by nothing measurable: none imports anything at all, so // each travels alone. And this adds no folder-level edge — `datamodel/parser -> // datamodel` already exists, via `blockIdentity`. - const allowed = ['datamodel/blockIdentity.ts', 'datamodel/fileKinds.ts']; + const allowed = ['datamodel/blockIdentity.ts', 'datamodel/fileKinds.ts', 'datamodel/matlabName.ts']; const strays = outboundFrom('datamodel/parser').filter((e) => !allowed.includes(e.to)); expect(describeEdges(strays)).toEqual([]); // Not a count of them — a check that each exemption is still USED, so the test // cannot start passing because the seam quietly stopped existing. Per module, not in - // total: one of the two going unreached is exactly how an allowance outlives the + // total: one of them going unreached is exactly how an allowance outlives the // reason for it. const reached = new Set(outboundFrom('datamodel/parser').map((e) => e.to)); - expect([...reached].sort(), 'and both allowed modules are still reached').toEqual(allowed); + expect([...reached].sort(), 'and every allowed module is still reached').toEqual(allowed); }); }); diff --git a/test/parity/matlab/README.md b/test/parity/matlab/README.md index eb8e0c69..3493f334 100644 --- a/test/parity/matlab/README.md +++ b/test/parity/matlab/README.md @@ -127,12 +127,14 @@ directory, because `Simulink.data.dictionary.open` rejects a relative one with | `probe_non_data_params.m` | which FREE-TEXT block parameters never name data, however much their values look like variables? | `tempdir` (one child model, deleted) | — | | `probe_writeback.mjs` + `.m` | **the acceptance gate for the TEXT dictionary**: does MATLAB read back the JSON `_value` our writer emits? | `$PROBE_OUT` | — | | `probe_writeback_bin.mjs` + `.m` | **the acceptance gate for the BINARY dictionary**: does MATLAB read back the XML chunk our writer emits? (defects 27-30) | `$PROBE_OUT` | — | +| `probe_mat_writeback.mjs` + `.m` | **the acceptance gate for the `.mat` save**: does MATLAB `load` what `session.serializeSource` writes for a MAT-file, as the edit the session made, with no warning? See [The MAT-file gate](#the-mat-file-gate) | `$PROBE_OUT` | — | | `probe_parameter_value.m` | which values does a `Simulink.Parameter` refuse as its `Value`, at the top level and as a field of a struct Value, and with which message? And which structural edits inside it (removing or adding a field or an array element) leave a Value it refuses? (C-160, C-042, A2: core mirrors the answers at edit time) | `$PARAM_VALUE_OUT` or `tempdir/paramvalue` | `parameter_value_truth.json` (written by `27.1.0.3400455 (R2027a) Prerelease`) | | `probe_parameter_shape.m` + `parameter_shape.mjs` | what are a `Simulink.Parameter`'s Dimensions and Complexity after each edit of its Value that core makes (an element removed or added, an element set, a Value typed in) on `../../fixtures/mcos/complex_binary.sldd`'s pRow, pCol, pInt16Row, pScalar and pStruct, and what does MATLAB read of core's saves of the same edits? They are the Value's size and complexity, except that a symbolic Dimensions is kept, an empty Value keeps both, and a struct Value keeps its Complexity; MATLAB refuses a numeric Dimensions or a Complexity set by hand. MAKE (`PARAM_SHAPE_MAKE=1`) saves a copy of the fixture with pRow's Dimensions `'[1,N]'` and records how its chunk spells that (`symbolicDimensionsTag`), which `parameter_shape.mjs` puts into its own copy of the fixture (MATLAB's save is not kept: it respells every entry and names the user who saved it); READ opens the `core_*.sldd` in `$PARAM_SHAPE_OUT`. Core's edit for each row is `parameter_shape.steps.json`. Graded by `../../parameterShape.test.ts` (B-25). Ends `PARAMETER_SHAPE OK` | `$PARAM_SHAPE_OUT` or `tempdir/paramshape` | `parameter_shape.truth.json` (here), written by `27.1.0.3409468 (R2027a) Prerelease` | | `probe_save_readbacks.m` + `save_readbacks.mjs` | does MATLAB reopen what core SAVES as what it was: a config set regenerated and pasted into text (M1, D15), enumeration values and empty ones (M2), an emptied and a new bus and the two spellings older saves gave one (M3)? The `.mjs` makes the saves through core's API; graded by `../readbacks.truth.test.ts`. M1 needs two corpus files (`DEX_READBACKS_CORPUS`). Ends `SAVE_READBACKS OK` | `$SAVE_READBACKS_OUT` | `save_readbacks.truth.json` (here), written by `27.1.0.3409468 (R2027a) Prerelease` | | `probe_m9_merged_reopen.m` + `m9_merged_saves.mjs` | does MATLAB reopen S2's merged saves of a binary dictionary (an edited entry saved as its bytes, with only what the edit changed written from the model) and read every entry as it should (M9)? In every compressed-binary fixture under `test/fixtures` and `test/parity/artifacts`, and in a copy of each as an earlier core save left it (1x1 cells spelled `Dimension="1*1"`, so that the merge differs from writing the entry whole), one entry of each kind is renamed, has its Description set, and where it is cheap a bus element's Description or a struct field edited, each through `session.editProperty` and saved by `serializeSource` into a file of its own. MATLAB opens each save and a copy of its original: every unedited entry must read as in the original (class, `isequaln`, `fullsig`), the edited one as the original with the same edit made in MATLAB, with no error or warning. Opens only the copies and the saves in `$M9_OUT`; graded by `../m9MergedSaves.truth.test.ts`. Ends `M9_MERGED_REOPEN OK` | `$M9_OUT` | `m9_merged_saves.truth.json` (here), written by `27.1.0.3409468 (R2027a) Prerelease` | | `probe_old_saves_readback.m` + `old_saves.mjs` | what does MATLAB read of a binary dictionary core saved before two of its fixes, and of what core copies now from a binary dictionary into a text one (M4, M7, D15)? `../oldsaves/` holds untouched saves, by core built at `50549bd^`, `69664b0^` and `90caf06^`, of every binary fixture holding a dynamic property or a struct entry of no element, and of `old_saves_r2027a_binary.sldd` (`make_old_saves_r2027a.m`: an AUTOSAR config set, a config set holding an `SSC.SimscapeCC`, a `dexdata.DerivedSignal` beside a `Simulink.Signal`, and empty structs of five shapes); the `.mjs` makes them once per build (`save`), and the pastes into the text twin with this checkout (`cases`). MATLAB opens each save and paste and a copy of its original: every entry as in the original, each dynamic property by `get_param`, each empty struct's shape. Opens only the files in `$OLD_SAVES_OUT`; graded by `../oldSaves.truth.test.ts`. Ends `OLD_SAVES_READBACK OK` | `$OLD_SAVES_OUT` | `old_saves_readback.truth.json` (here), written by `27.1.0.3409468 (R2027a) Prerelease` | | `probe_fieldless_struct_readback.m` + `fieldless_struct_readback.mjs` | does MATLAB read back core's one-stream spelling of a field-less `repmat(struct(),1e4,1e4)` (a 132-byte cdata in text, a 72-byte hex stream in binary), as an entry, a struct field and a cell's element, where its own spelling is 1e8 elements? (F1-9; graded by `../../fieldlessStructReadback.test.ts`). Ends `FIELDLESS_STRUCT_READBACK OK` | `$FIELDLESS_OUT` | `fieldless_struct_readback.truth.json` (here), from `../../fixtures/mcos/fieldless_1e4x1e4.mat` (MATLAB's `save`), written by `27.1.0.3409468 (R2027a) Prerelease` | +| `probe_empty_copies_readback.m` + `empty_copies_readback.mjs` | does MATLAB read back core's copy of a struct array of no element with fields (`struct('a', {})`, 0x0 and 1x0) and of a complex empty (double 0x0 and 1x0, int16 and single 1x0), dispcat.mat's own, pasted into a text and a binary dictionary as an entry, a struct field and a cell's element, as read and once marked edited, as `load` reads the variable? Yes for all 72: field names, size, class and complexity kept (a text dictionary's bag `{"_elements": [], "_fields": ["a"]}` and a complex empty's MAT stream; a binary one's `` and `IsComplex="1"`, MATLAB's own spelling). Graded by `../../emptyCopiesReadback.test.ts`. Opens only the files the `.mjs` writes. Ends `EMPTY_COPIES_READBACK OK` | `$EMPTY_COPIES_OUT` | `empty_copies_readback.truth.json` (here), written by `27.1.0.3409468 (R2027a) Prerelease` | | `probe_nd_undecoded_copy_readback.m` + `nd_undecoded_copy_readback.mjs` | does MATLAB read back, as `load` reads the `.mat` variable, the MAT stream a 1x1x2 cell or struct holding a sparse array core did not decode (values absent, of no width, or 2 of 4) used to copy as, pasted into a text and a binary dictionary? Not for a struct whose member's values are absent (a 1x0 double in text, an error in binary), so the copy stays refused (B-11; graded by `../../undecodedCopy.test.ts`). Opens only the files the `.mjs` writes. Ends `ND_UNDECODED_COPY_READBACK OK` | `$ND_UNDECODED_OUT` | `nd_undecoded_copy_readback.truth.json` (here), written by `27.1.0.3409468 (R2027a) Prerelease` | | `probe_short_array_copy_readback.m` + `short_array_copy_readback.mjs` | does MATLAB read back, as the padded value core shows, the copy of a `.mat` struct array or cell whose bytes hold fewer elements than it declares (some held, none held, rank 2 and N-D, a struct cut inside an element; one holding every element as the control), pasted into a text and a binary dictionary? Yes for each holding some, and for an N-D one holding none; not for a rank-2 struct array holding none (a struct with no fields), nor a rank-2 cell holding none in a binary dictionary (a 0x0 cell), so those copies are refused (B-26; graded by `../../shortArrayCopy.test.ts`). `load` refuses every damaged file. Opens only the files the `.mjs` writes. Ends `SHORT_ARRAY_COPY_READBACK OK` | `$SHORT_COPY_OUT` | `short_array_copy_readback.truth.json` (here), written by `27.1.0.3409468 (R2027a) Prerelease` | | `probe_text_empty_readback.m` | how does MATLAB read back a classed or shaped EMPTY out of a text dictionary, at an entry, a cell, a struct field, a Parameter's Value and an object's property, in each candidate spelling; and how does it spell one there itself? (1A-TEXT, CELL-EMPTIES-87, D8; graded by `test/textEmptyReadback.test.ts`). Ends `TEXT_EMPTY_READBACK OK` | `$TEXT_EMPTY_OUT` or `tempdir/textempty` | `text_empty_readback.truth.json` (here) and `../../fixtures/text_empty_readback_binary.sldd`, written by `27.1.0.3409468 (R2027a) Prerelease` | @@ -266,6 +268,71 @@ Both gates need every node in the subtree marked modified, not just the root: `_markModified` walks UP the chain and an unmodified node replays its `_rawInput`, so marking a container leaves the writer untested on every field and element beneath it. +### The MAT-file gate + +`probe_mat_writeback.mjs` opens MATLAB's own `.mat` files through the session API, as a host +does, makes each case's edits there (`editProperty`, `deleteNodeById`, `addChildTo`, an added +variable, `undo`), saves with `session.serializeSource`, and writes into the manifest beside +each saved file **the same edit as MATLAB statements** on a struct `S` loaded from the original +(`S.kp = 7;`, `S.mat2x3(1,2) = 99;`, `S = renameStructField(S, 'kp', 'kpRenamed');`, +`S = rmfield(S, 'infP');`, `S.var = 0;`). After each edit it checks that the node shows what +the statements make of it, so the two halves describe one edit. `probe_mat_writeback.m` then +loads the original, makes the edit in MATLAB, loads the save, and compares: + +- the same variables in the same order (load's, and `whos -file`'s class, size and global flag + of each, the globals renamed and deleted as the statements do, and the globals a `load` inside + a function declares); +- each variable to the leaf: class, size, sparsity, complexity, `isequaln` on every value and + the bits of every double and single (the sign of a zero, which `isequaln` does not see; a + NaN's payload apart), + field names in order, every element of a cell or a struct array, every readable property + of an object, a function handle's text and an anonymous one's workspace, and handle + sharing (one object held twice is still one object); +- no warning and nothing printed by `load`, except a warning the original gives itself, word + for word (`dispcat_opaque.mat` holds an anonymous handle made in a file that no longer + exists); +- a save with no edit is the original, byte for byte, and one of a `-v6` file holds no + compressed record (both also asserted by the JS half, with the strict checker); +- MATLAB's own re-save of what it loaded loads the same, with no warning. + +```bash +npm run build +env PROBE_OUT=/tmp/matwb node test/parity/matlab/probe_mat_writeback.mjs +env PROBE_OUT=/tmp/matwb mw -using Bmain matlab -nodesktop \ + -batch "run('$PWD/test/parity/matlab/probe_mat_writeback.m')" +``` + +Its last line is `PROBE_MAT_WRITEBACK DONE pass=N fail=M`, with one +`RESULT PASS|FAIL ` per case before it. `fail=0` is the only acceptable result. +The fixtures are `cases.mat`, `dispcat.mat`, `dispcat_opaque.mat` (function handles, +enumerations, `fi`, `categorical`, `table`), `nested_objects.mat`, `strings.mat`, +`strings_mixed.mat`, `sparse_values.mat`, `sparse_cases.mat`, `complex_inf.mat` (no subsystem), +`dag4.mat` (a handle DAG), the two `-v6` files `nested_handles.mat` and `hexobj_values.mat`, +`global_v7.mat` and `global_v6.mat` (variables MATLAB saved as global, beside one it did not; +`../../fixtures/global/make_global_fixtures.m`), and two files the JS half assembles: one of `dispcat.mat`'s own elements, an empty complex array and +an empty struct array with a field held in a struct and a cell beside a value to edit; and one +built by hand as MATLAB writes each part, of what no fixture holds: a struct of no element with two +fields in a cell, `complex(zeros(0,3,'single'))` alone and in a struct, empty structs with a field +in each element of a struct array, a variable saved as global, and a complex row whose zero parts +are -0, each beside a value to edit. The MATLAB +half puts the classes those need on the path (`../../fixtures/display`, `../../fixtures/sparse`, +`../../fixtures/mcos/shared`, and `DispColor` by `Simulink.defineIntEnumType`). + +Thirteen cases are **negative controls**: MATLAB's half makes one change more than the save does +(a value, a class, complexity, a Parameter's `Value` and its `CoderInfo.StorageClass`, a +string, the variables' order, a struct's field order, handle sharing, an anonymous handle's +text, an enumeration member, a `categorical`, a complex zero's -0 parts made +0), and each +passes only when the comparison reports that difference. They are what makes a PASS mean the +comparison looked. + +`matWriteback.live.test.ts` runs both halves (Tier 2, below). `matWritebackDefects.test.ts` +holds, without MATLAB, the two losses the first run found, fixed: a complex empty written fresh +loaded real, and an empty struct array written fresh loaded with no field, which an edit of a +field or a cell member beside it was enough to cause. Neither was visible to core, whose reader +carried the same loss; `../../matFreshFidelity.test.ts` now holds every plain variable of every +fixture, written fresh, to the file's own element, read by a walker of its own +(`../../tools/matElements.ts`). + ## The catalog 77 names, in `gen_truth.m`'s `C` (73) and `OBJARR` (4), landing in `truth.json` @@ -858,7 +925,8 @@ catches a value written back in its truncated display form. **Tier 2 — live MATLAB, dev-only, never in CI.** `writeback.live.test.ts` (edit -> serialize -> MATLAB reopens -> assert value, `size()` and `class()`, for both -`.sldd` formats), `drift.mjs`, and the older per-node assertions in +`.sldd` formats), `matWriteback.live.test.ts` (the same for a `.mat`, through +[the MAT-file gate](#the-mat-file-gate)), `drift.mjs`, and the older per-node assertions in `test/parity/fidelity/*` and `test/fidelitySmoke.test.ts`. A fixture cannot stand in for any of them: proving MATLAB reads what *we* wrote requires MATLAB. diff --git a/test/parity/matlab/empty_copies_readback.mjs b/test/parity/matlab/empty_copies_readback.mjs new file mode 100644 index 00000000..96ebc9e7 --- /dev/null +++ b/test/parity/matlab/empty_copies_readback.mjs @@ -0,0 +1,130 @@ +// Copyright 2026 The MathWorks, Inc. +// +// The core half of probe_empty_copies_readback.m: does MATLAB read back, as `load` reads the .mat +// variable, a copy of a struct array of no element with fields, and of a complex empty, pasted +// through core's API into a text and a binary dictionary, as an entry's value, a struct field and +// a cell's element? +// +// The values are MATLAB's own, dispcat.mat's: struct('a', {}) as a 0x0 and a 1x0, and +// complex(zeros(0,0)), complex(zeros(1,0)), a complex int16 1x0 and a complex single 1x0. Each is +// copied as a host copies it (serialize().value), as read and once marked edited (the mark an +// edit and its undo leave, which writes the value from its rows). Core spells them: +// - in a binary dictionary, as MATLAB's own binary dictionary of the same variables does +// (dispcat_bin.sldd): `` inside a struct of no element, `IsComplex="1"` on +// an empty; +// - in a text dictionary, where MATLAB's own spelling of each loses it (`{"_type": "struct", +// "_value": "[]"}`, `[]`; dispcat_text.sldd), a struct of no element as the bag +// `{"_elements": [], "_fields": ["a"]}` and a complex empty as its MAT stream (cdata). +// +// emptyCopiesReadback(core, read) returns { files, cases }: the saved dictionaries by name, and +// one row per place, its `fragment` the value as written there (a text dictionary's JSON, a binary +// one's `

` or `` span). test/emptyCopiesReadback.test.ts calls it with the +// package's source and compares each fragment with the one MATLAB read back. +// +// Run: node test/parity/matlab/empty_copies_readback.mjs /tmp/emptycopies +// with dist built; then probe_empty_copies_readback.m with EMPTY_COPIES_OUT set to the same directory. +import { strFromU8, unzipSync } from 'fflate'; + +const ab = (u8) => u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength); +export const HOSTS = ['sparse/sparse_text.sldd', 'sparse/sparse_binary.sldd']; +export const VARIABLES = ['dx_struct_0x0_fields', 'dx_struct_1x0', 'dx_complex_0x0', 'dx_complex_1x0', 'dx_complex_int16_1x0', 'e_single_complex_1x0']; +export const PLACES = ['entry', 'field', 'cell']; + +/** The `

` or `` starting at `from` in `xml`, through its close (or its own `/>`). */ +function spanFrom(xml, from) { + const tag = xml.startsWith('', from); + if (xml[end - 1] === '/') { + return xml.slice(from, end + 1); + } + const close = ''; + return xml.slice(from, xml.indexOf(close, from) + close.length).replace(/\s+/g, ' '); +} + +/** The value at `place` of the entry named `name` in a saved dictionary. */ +function fragmentAt(saved, name, place) { + if (saved.kind === 'text') { + const entries = JSON.parse(saved.text).__MW_TEXT_PARTS__['__MW_TEXT_PART__/data/chunk0'].__MW_TEXT_content.entries; + const value = entries.find((e) => e.name === name).value; + return JSON.stringify(place === 'entry' ? value : place === 'field' ? value._elements[0].f : value._elements[0]); + } + const xml = strFromU8(unzipSync(saved.bytes)['data/chunk0.xml']); + const at = xml.indexOf('

' + name + '

'); + const value = xml.indexOf('

{ + const mat = createSession().addMatSource('dispcat.mat', ab(read('display/dispcat.mat'))); + const node = mat.children.find((c) => c.name === name); + if (edited) { + node._markModified(); + } + return JSON.parse(JSON.stringify(node.serialize().value)); + }; + const files = {}; + const cases = []; + HOSTS.forEach((host, h) => { + const base = host.split('/').pop(); + const s = createSession(); + const root = ingest(s, ab(read(host)), { filename: base }); + const design = root.getSection('design'); + let k = 0; + // The section's own metadata, as a host's paste gives it: an entry with no namespace makes a + // dictionary MATLAB refuses to open at all. + const meta = () => ({ ...design.children[0].metadata, uuid: '00000000-0000-4000-e9fa-' + String(h * 100 + ++k).padStart(12, '0') }); + const rows = []; + VARIABLES.forEach((variable, v) => { + for (const edited of [false, true]) { + const value = copyOf(variable, edited); + for (const place of PLACES) { + const entry = 'e' + v + (edited ? 'm' : 'u') + place[0]; + const held = + place === 'entry' + ? value + : place === 'field' + ? { _array_type: 'Struct', _dimensions: [1, 1], _elements: [{ f: value }], _mw_element_type: 'MATLABArray' } + : { _array_type: 'Cell', _dimensions: [1, 1], _elements: [value], _mw_element_type: 'MATLABArray' }; + design.parseEntry({ name: entry, metadata: meta(), value: held }); + rows.push({ variable, edited, place, entry }); + } + } + }); + const saved = s.serializeSource(root.name); + const file = 'empty_copies_' + base; + files[file] = saved.kind === 'text' ? saved.text : saved.bytes; + for (const row of rows) { + cases.push({ file, format: saved.kind, ...row, fragment: fragmentAt(saved, row.entry, row.place) }); + } + }); + return { files, cases }; +} + +// As a script: the saves, dispcat.mat (the values MATLAB compares them with) and cases.json into a +// directory, from the built package. +if (process.argv[1] && import.meta.url === new URL('file://' + process.argv[1]).href) { + const { mkdirSync, readFileSync, writeFileSync } = await import('node:fs'); + const { join } = await import('node:path'); + const { fileURLToPath } = await import('node:url'); + const [outDir] = process.argv.slice(2); + if (!outDir) { + throw new Error('usage: node empty_copies_readback.mjs '); + } + const here = fileURLToPath(new URL('.', import.meta.url)); + const core = await import(join(here, '..', '..', '..', 'dist', 'index.js')); + const read = (rel) => new Uint8Array(readFileSync(join(here, '..', '..', 'fixtures', rel))); + const { files, cases } = emptyCopiesReadback(core, read); + mkdirSync(outDir, { recursive: true }); + for (const [name, bytes] of Object.entries(files)) { + writeFileSync(join(outDir, name), bytes); + } + writeFileSync(join(outDir, 'dispcat.mat'), read('display/dispcat.mat')); + writeFileSync(join(outDir, 'cases.json'), JSON.stringify(cases, null, 2) + '\n'); + console.log('wrote', Object.keys(files).length, 'saves and', cases.length, 'cases to', outDir); +} diff --git a/test/parity/matlab/empty_copies_readback.truth.json b/test/parity/matlab/empty_copies_readback.truth.json new file mode 100644 index 00000000..d0de1968 --- /dev/null +++ b/test/parity/matlab/empty_copies_readback.truth.json @@ -0,0 +1,2047 @@ +{ + "version": "27.1.0.3409468 (R2027a) Prerelease", + "release": "2027a", + "date": "2026-10-20", + "cases": [ + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_0x0_fields", + "edited": false, + "place": "entry", + "entry": "e0ue", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[0,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_0x0_fields", + "edited": false, + "place": "field", + "entry": "e0uf", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[0,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_0x0_fields", + "edited": false, + "place": "cell", + "entry": "e0uc", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[0,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_0x0_fields", + "edited": true, + "place": "entry", + "entry": "e0me", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[0,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_0x0_fields", + "edited": true, + "place": "field", + "entry": "e0mf", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[0,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_0x0_fields", + "edited": true, + "place": "cell", + "entry": "e0mc", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[0,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_1x0", + "edited": false, + "place": "entry", + "entry": "e1ue", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[1,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_1x0", + "edited": false, + "place": "field", + "entry": "e1uf", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[1,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_1x0", + "edited": false, + "place": "cell", + "entry": "e1uc", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[1,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_1x0", + "edited": true, + "place": "entry", + "entry": "e1me", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[1,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_1x0", + "edited": true, + "place": "field", + "entry": "e1mf", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[1,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_struct_1x0", + "edited": true, + "place": "cell", + "entry": "e1mc", + "fragment": "{\"_array_type\":\"Struct\",\"_dimensions\":[1,0],\"_elements\":[],\"_fields\":[\"a\"],\"_mw_element_type\":\"MATLABArray\"}", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_0x0", + "edited": false, + "place": "entry", + "entry": "e2ue", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_0x0", + "edited": false, + "place": "field", + "entry": "e2uf", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_0x0", + "edited": false, + "place": "cell", + "entry": "e2uc", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_0x0", + "edited": true, + "place": "entry", + "entry": "e2me", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_0x0", + "edited": true, + "place": "field", + "entry": "e2mf", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_0x0", + "edited": true, + "place": "cell", + "entry": "e2mc", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_1x0", + "edited": false, + "place": "entry", + "entry": "e3ue", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" $ 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_1x0", + "edited": false, + "place": "field", + "entry": "e3uf", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" $ 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_1x0", + "edited": false, + "place": "cell", + "entry": "e3uc", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" $ 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_1x0", + "edited": true, + "place": "entry", + "entry": "e3me", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" $ 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_1x0", + "edited": true, + "place": "field", + "entry": "e3mf", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" $ 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_1x0", + "edited": true, + "place": "cell", + "entry": "e3mc", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !@@ % \\\" $ 0 ) D \\u0000\"}", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_int16_1x0", + "edited": false, + "place": "entry", + "entry": "e4ue", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( \\\"@@ % \\\" $ 0 # , \\u0000\"}", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_int16_1x0", + "edited": false, + "place": "field", + "entry": "e4uf", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( \\\"@@ % \\\" $ 0 # , \\u0000\"}", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_int16_1x0", + "edited": false, + "place": "cell", + "entry": "e4uc", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( \\\"@@ % \\\" $ 0 # , \\u0000\"}", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_int16_1x0", + "edited": true, + "place": "entry", + "entry": "e4me", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( \\\"@@ % \\\" $ 0 # , \\u0000\"}", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_int16_1x0", + "edited": true, + "place": "field", + "entry": "e4mf", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( \\\"@@ % \\\" $ 0 # , \\u0000\"}", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "dx_complex_int16_1x0", + "edited": true, + "place": "cell", + "entry": "e4mc", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( \\\"@@ % \\\" $ 0 # , \\u0000\"}", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "e_single_complex_1x0", + "edited": false, + "place": "entry", + "entry": "e5ue", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !P@ % \\\" $ 0 ' < \\u0000\"}", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "e_single_complex_1x0", + "edited": false, + "place": "field", + "entry": "e5uf", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !P@ % \\\" $ 0 ' < \\u0000\"}", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "e_single_complex_1x0", + "edited": false, + "place": "cell", + "entry": "e5uc", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !P@ % \\\" $ 0 ' < \\u0000\"}", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "e_single_complex_1x0", + "edited": true, + "place": "entry", + "entry": "e5me", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !P@ % \\\" $ 0 ' < \\u0000\"}", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "e_single_complex_1x0", + "edited": true, + "place": "field", + "entry": "e5mf", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !P@ % \\\" $ 0 ' < \\u0000\"}", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_text.sldd", + "format": "text", + "variable": "e_single_complex_1x0", + "edited": true, + "place": "cell", + "entry": "e5mc", + "fragment": "{\"_type\":\"cdata\",\"_value\":\" %)30 . . 8 ( !P@ % \\\" $ 0 ' < \\u0000\"}", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_0x0_fields", + "edited": false, + "place": "entry", + "entry": "e0ue", + "fragment": "

", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_0x0_fields", + "edited": false, + "place": "field", + "entry": "e0uf", + "fragment": "

", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_0x0_fields", + "edited": false, + "place": "cell", + "entry": "e0uc", + "fragment": " ", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_0x0_fields", + "edited": true, + "place": "entry", + "entry": "e0me", + "fragment": "

", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_0x0_fields", + "edited": true, + "place": "field", + "entry": "e0mf", + "fragment": "

", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_0x0_fields", + "edited": true, + "place": "cell", + "entry": "e0mc", + "fragment": " ", + "matlab": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_1x0", + "edited": false, + "place": "entry", + "entry": "e1ue", + "fragment": "

", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_1x0", + "edited": false, + "place": "field", + "entry": "e1uf", + "fragment": "

", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_1x0", + "edited": false, + "place": "cell", + "entry": "e1uc", + "fragment": " ", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_1x0", + "edited": true, + "place": "entry", + "entry": "e1me", + "fragment": "

", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_1x0", + "edited": true, + "place": "field", + "entry": "e1mf", + "fragment": "

", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_struct_1x0", + "edited": true, + "place": "cell", + "entry": "e1mc", + "fragment": " ", + "matlab": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + }, + "loaded": { + "class": "struct", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [ + "a" + ] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_0x0", + "edited": false, + "place": "entry", + "entry": "e2ue", + "fragment": "

", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_0x0", + "edited": false, + "place": "field", + "entry": "e2uf", + "fragment": "

", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_0x0", + "edited": false, + "place": "cell", + "entry": "e2uc", + "fragment": "", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_0x0", + "edited": true, + "place": "entry", + "entry": "e2me", + "fragment": "

", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_0x0", + "edited": true, + "place": "field", + "entry": "e2mf", + "fragment": "

", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_0x0", + "edited": true, + "place": "cell", + "entry": "e2mc", + "fragment": "", + "matlab": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 0, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_1x0", + "edited": false, + "place": "entry", + "entry": "e3ue", + "fragment": "

", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_1x0", + "edited": false, + "place": "field", + "entry": "e3uf", + "fragment": "

", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_1x0", + "edited": false, + "place": "cell", + "entry": "e3uc", + "fragment": "", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_1x0", + "edited": true, + "place": "entry", + "entry": "e3me", + "fragment": "

", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_1x0", + "edited": true, + "place": "field", + "entry": "e3mf", + "fragment": "

", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_1x0", + "edited": true, + "place": "cell", + "entry": "e3mc", + "fragment": "", + "matlab": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "double", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_int16_1x0", + "edited": false, + "place": "entry", + "entry": "e4ue", + "fragment": "

", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_int16_1x0", + "edited": false, + "place": "field", + "entry": "e4uf", + "fragment": "

", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_int16_1x0", + "edited": false, + "place": "cell", + "entry": "e4uc", + "fragment": "", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_int16_1x0", + "edited": true, + "place": "entry", + "entry": "e4me", + "fragment": "

", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_int16_1x0", + "edited": true, + "place": "field", + "entry": "e4mf", + "fragment": "

", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "dx_complex_int16_1x0", + "edited": true, + "place": "cell", + "entry": "e4mc", + "fragment": "", + "matlab": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "int16", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "e_single_complex_1x0", + "edited": false, + "place": "entry", + "entry": "e5ue", + "fragment": "

", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "e_single_complex_1x0", + "edited": false, + "place": "field", + "entry": "e5uf", + "fragment": "

", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "e_single_complex_1x0", + "edited": false, + "place": "cell", + "entry": "e5uc", + "fragment": "", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "e_single_complex_1x0", + "edited": true, + "place": "entry", + "entry": "e5me", + "fragment": "

", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "e_single_complex_1x0", + "edited": true, + "place": "field", + "entry": "e5mf", + "fragment": "

", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + }, + { + "file": "empty_copies_sparse_binary.sldd", + "format": "binary", + "variable": "e_single_complex_1x0", + "edited": true, + "place": "cell", + "entry": "e5mc", + "fragment": "", + "matlab": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + }, + "loaded": { + "class": "single", + "size": [ + 1, + 0 + ], + "isreal": false, + "fields": [] + } + } + ] +} diff --git a/test/parity/matlab/matWriteback.live.test.ts b/test/parity/matlab/matWriteback.live.test.ts new file mode 100644 index 00000000..3c6816cd --- /dev/null +++ b/test/parity/matlab/matWriteback.live.test.ts @@ -0,0 +1,71 @@ +// Copyright 2026 The MathWorks, Inc. +// +// The MAT-file save, loaded by MATLAB: probe_mat_writeback.mjs opens MATLAB's own `.mat` files +// through the session, edits them as a host does (values, elements, fields, cell members, +// reshapes, class changes, renames and deletes of plain variables, objects, strings and +// function handles, added variables and fields, several at once, `-v6` files), saves each with +// session.serializeSource, and writes the same edit as MATLAB statements beside it; +// probe_mat_writeback.m loads each original, makes the edit in MATLAB, loads the save, and +// compares the two to the leaf, with no warning allowed and MATLAB's own re-save of the save +// loading the same. Twelve of the cases are negative controls, which pass only when the +// comparison reports a difference planted in MATLAB's half. See the two scripts. +// +// Tier 2: skipped wholesale when DEX_MATLAB_CMD is unset, as writeback.live.test.ts is, so CI +// and external contributors stay green. Set it to the launcher plus its fixed args, and +// DEX_MATLAB_CWD to where the launcher must run from: +// env DEX_MATLAB_CMD="mw -using Bmain matlab" npx vitest run test/parity/matlab/matWriteback.live.test.ts +// +// The JS half reads the BUILT package (dist/), so build first: a stale dist/ is a stale verdict. +import { describe, it, expect, beforeAll } from 'vitest'; +import { execFileSync } from 'node:child_process'; +import { existsSync, mkdtempSync, readFileSync } from 'node:fs'; +import { tmpdir } from 'node:os'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { matlabAvailable } from '../fidelity/roundTripHarness.js'; + +const HERE = fileURLToPath(new URL('.', import.meta.url)); + +// One launch for every case. A cold launch has taken up to 10 minutes on a network sandbox +// (writeback.live.test.ts measured 276s on one), and the cases take about a minute more. +const MATLAB_TIMEOUT = 900_000; + +describe('live MAT-file write-back', () => { + if (!matlabAvailable()) { + it.skip('DEX_MATLAB_CMD unset — live gate skipped', () => {}); + return; + } + + let manifest: Array<{ id: string; js: string; refused: string }> = []; + let out = ''; + beforeAll(() => { + // A directory of its own under /tmp: the MATLAB half cds there before it writes anything. + const dir = mkdtempSync(join(existsSync('/tmp') ? '/tmp' : tmpdir(), 'dex-matwb-')); + execFileSync(process.execPath, [join(HERE, 'probe_mat_writeback.mjs')], { + env: { ...process.env, PROBE_OUT: dir }, + encoding: 'utf8', + }); + manifest = JSON.parse(readFileSync(join(dir, 'manifest.json'), 'utf8')); + const [bin, ...args] = (process.env.DEX_MATLAB_CMD as string).split(' '); + out = execFileSync(bin, [...args, '-nodesktop', '-batch', `PROBE_OUT='${dir}'; run('${join(HERE, 'probe_mat_writeback.m')}')`], { + cwd: process.env.DEX_MATLAB_CWD || undefined, + env: { ...process.env, PROBE_OUT: dir }, + encoding: 'utf8', + maxBuffer: 64 * 1024 * 1024, + timeout: MATLAB_TIMEOUT, + }); + }, MATLAB_TIMEOUT); + + it('core saves every case, and each save passes the JS half', () => { + expect(manifest.length).toBeGreaterThanOrEqual(90); + expect(manifest.filter((r) => r.js || r.refused).map((r) => [r.id, r.js || r.refused])).toEqual([]); + }); + + it('MATLAB loads every save as the session edited it, with no warning', () => { + const results = [...out.matchAll(/^RESULT (\S+) (PASS|FAIL)(.*)$/gm)]; + // One verdict per case, in order: a case the MATLAB half never reached is not a pass. + expect(results.map((m) => m[1])).toEqual(manifest.map((r) => r.id)); + expect(results.filter((m) => m[2] === 'FAIL').map((m) => m[1] + m[3])).toEqual([]); + expect(out).toContain(`PROBE_MAT_WRITEBACK DONE pass=${manifest.length} fail=0`); + }); +}); diff --git a/test/parity/matlab/matWritebackDefects.test.ts b/test/parity/matlab/matWritebackDefects.test.ts new file mode 100644 index 00000000..904385bf --- /dev/null +++ b/test/parity/matlab/matWritebackDefects.test.ts @@ -0,0 +1,147 @@ +// Copyright 2026 The MathWorks, Inc. +// +// Two losses of the MAT-file save that the live gate (probe_mat_writeback.{mjs,m}) found, held +// here without MATLAB, fixed. Neither was visible to core: its reader carried neither thing +// either, so the save's own re-parse (MatFileWriter's self-check) agreed with what it wrote, and +// the strict checker broke no load rule. Only MATLAB, loading the save beside the original, read +// a different value. test/matFreshFidelity.test.ts now holds every variable of every fixture to +// the file's own element, by a walker that does not use the package's reader. +// +// Measured against MATLAB R2027a (27.1.0.3409468), before the fix: +// A. complex(zeros(0,0)) and the other complex empties of dispcat.mat, written fresh, loaded +// real: isreal was true where the original's is false. The node rebuilt its variable from +// its elements, and an empty has none to be complex (MatlabVariableNode._isComplexValue). +// B. a 0x0 or 1x0 struct array with a field `a`, written fresh, loaded with no field: +// fieldnames was {} where the original's is {'a'}. The reader held `fields: {}` for a +// struct array of no element (MatParser), and a struct field or a cell member edited +// beside one wrote it fresh, so an ordinary edit lost the names. +// Each test asks for MATLAB's own element: what the save writes for each is the element MATLAB +// wrote, byte for byte but for the storage type of an empty double's two parts (MATLAB's +// miUINT8, MatWriter's miDOUBLE, which MATLAB loads as the same complex empty: the gate's +// sibling cases). +import { describe, it, expect } from 'vitest'; +import { readFileSync } from 'node:fs'; +import { unzlibSync } from 'fflate'; +import { parseMat } from '../../../src/datamodel/parser/MatParser.js'; +import { createSession } from '../../../src/index.js'; +import { CLASS, matFile, numericVar, structVar } from '../../tools/matBytes.js'; + +const arrayBufferOf = (bytes: Uint8Array) => bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength) as ArrayBuffer; +const DISPCAT = arrayBufferOf(new Uint8Array(readFileSync(new URL('../../fixtures/display/dispcat.mat', import.meta.url)))); + +/** The miMATRIX element (tag and body) of the top-level variable `name`, inflated. */ +function elementOf(file: Uint8Array | ArrayBuffer, name: string): Uint8Array { + const rec = parseMat(file instanceof Uint8Array ? arrayBufferOf(file) : file).records.find((r) => r.name === name)!; + const view = new DataView(rec.bytes.buffer, rec.bytes.byteOffset, rec.bytes.byteLength); + return view.getUint32(0, true) === 15 ? unzlibSync(rec.bytes.subarray(8, 8 + view.getUint32(4, true))) : rec.bytes; +} + +/** The sub-elements of an miMATRIX element, in order: each one's type and data. */ +function subElementsOf(el: Uint8Array): { type: number; data: Uint8Array }[] { + const view = new DataView(el.buffer, el.byteOffset, el.byteLength); + const out: { type: number; data: Uint8Array }[] = []; + const end = 8 + view.getUint32(4, true); + for (let at = 8; at < end; ) { + const word = view.getUint32(at, true); + if (word >>> 16) { + out.push({ type: word & 0xffff, data: el.subarray(at + 4, at + 4 + (word >>> 16)) }); + at += 8; + } else { + const n = view.getUint32(at + 4, true); + out.push({ type: word, data: el.subarray(at + 8, at + 8 + n) }); + at += 8 + Math.ceil(n / 8) * 8; + } + } + return out; +} + +/** A struct element's field names, read from its own field-name table. */ +function fieldNamesOf(el: Uint8Array): string[] { + const [, , , length, names] = subElementsOf(el); + const len = new DataView(length.data.buffer, length.data.byteOffset, 4).getInt32(0, true); + const out: string[] = []; + for (let at = 0; at < names.data.byteLength; at += len) { + out.push(new TextDecoder().decode(names.data.subarray(at, at + len)).replace(/\0+$/, '')); + } + return out; +} + +/** The element of a struct's `index`th field (of its first element), with its own tag. */ +function fieldElement(structElement: Uint8Array, index: number): Uint8Array { + const { type, data } = subElementsOf(structElement)[5 + index]; + expect(type).toBe(14); + const out = new Uint8Array(8 + data.byteLength); + out.set(new Uint8Array(new Uint32Array([14, data.byteLength]).buffer)); + out.set(data, 8); + return out; +} + +/** An element's complex bit: byte 1 of its array-flags data. */ +const complexOf = (el: Uint8Array) => (subElementsOf(el)[0].data[1] & 0x08) !== 0; + +describe('the losses of the MAT-file save the live gate found, fixed', () => { + it('A: a complex empty, its node marked edited, is written complex', () => { + const session = createSession(); + const root: any = session.addMatSource('dispcat.mat', DISPCAT); + const names = ['dx_complex_0x0', 'dx_complex_1x0', 'dx_complex_int16_1x0', 'e_single_complex_1x0']; + // The state an edit leaves a node in (DataNode._valueEdited, MatlabVariableNode's stale + // _var), which MatFileWriter writes fresh. + for (const name of names) { + const node = root.children.find((c: any) => c.name === name); + expect(complexOf(elementOf(DISPCAT, name)), name).toBe(true); + node._markModified(); + expect([name, node._var.isComplex, node._classColumn()]).toEqual([name, true, expect.stringContaining('(complex)')]); + } + const saved = (session.serializeSource('dispcat.mat') as { bytes: Uint8Array }).bytes; + for (const name of names) { + // Its class, flags, dims and name as MATLAB wrote them, and its two parts, empty. + const [was, is] = [subElementsOf(elementOf(DISPCAT, name)), subElementsOf(elementOf(saved, name))]; + expect(is.slice(0, 3), name).toEqual(was.slice(0, 3)); + expect(is.slice(3).map((p) => p.data.byteLength), name).toEqual([0, 0]); + expect(complexOf(elementOf(saved, name)), name).toBe(true); + } + // The int16 and the single ones are MATLAB's bytes exactly: MATLAB stores their parts in their + // own class's type, as MatWriter does. + for (const name of ['dx_complex_int16_1x0', 'e_single_complex_1x0']) { + expect(elementOf(saved, name), name).toEqual(elementOf(DISPCAT, name)); + } + }); + + it("B: an empty struct array with a field, written fresh, keeps its field names, as MATLAB's own element has them", () => { + // Written fresh itself: MATLAB's own element, byte for byte. + const session = createSession(); + const root: any = session.addMatSource('dispcat.mat', DISPCAT); + for (const name of ['dx_struct_0x0_fields', 'dx_struct_1x0']) { + root.children.find((c: any) => c.name === name)._markModified(); + } + const fresh = (session.serializeSource('dispcat.mat') as { bytes: Uint8Array }).bytes; + for (const name of ['dx_struct_0x0_fields', 'dx_struct_1x0']) { + expect(fieldNamesOf(elementOf(DISPCAT, name)), name).toEqual(['a']); + expect(elementOf(fresh, name), name).toEqual(elementOf(DISPCAT, name)); + } + + // And written fresh beside an edited field, as the gate's sibling_struct_field case writes it. + const empty = structVar('', ['inner'], [], [0, 0]); + const x = numericVar({ name: '', cls: CLASS.DOUBLE, dimensions: [1, 1], real: [1] }); + const file = matFile([structVar('s', ['es', 'x'], [{ es: empty, x }])]); + const edited = createSession(); + const top: any = edited.addMatSource('f.mat', file); + const field = top.children[0].children.find((c: any) => c.name === 'x'); + edited.setActive(top, field); + expect(edited.editProperty(field.id, 'Value', '2')).toBe(true); + const saved = (edited.serializeSource('f.mat') as { bytes: Uint8Array }).bytes; + + // es as the file holds it, and as the save writes it: a 0x0 struct with the field `inner` + // both times. + const esOf = (file_: Uint8Array | ArrayBuffer) => { + const s = elementOf(file_, 's'); + expect(fieldNamesOf(s)).toEqual(['es', 'x']); + return fieldElement(s, 0); + }; + expect([fieldNamesOf(esOf(file)), subElementsOf(esOf(file))[1].data]).toEqual([['inner'], new Uint8Array(8)]); + expect([fieldNamesOf(esOf(saved)), subElementsOf(esOf(saved))[1].data]).toEqual([['inner'], new Uint8Array(8)]); + // And the reader reads the names back, as it reads them out of the file. + const es = parseMat(arrayBufferOf(saved)).variables[0].fields!.es as { fields: Record }; + expect(Object.keys(es.fields)).toEqual(['inner']); + }); +}); diff --git a/test/parity/matlab/probe_empty_copies_readback.m b/test/parity/matlab/probe_empty_copies_readback.m new file mode 100644 index 00000000..8aa71bf2 --- /dev/null +++ b/test/parity/matlab/probe_empty_copies_readback.m @@ -0,0 +1,65 @@ +% Copyright 2026 The MathWorks, Inc. +% +% Does MATLAB read back core's copy of a struct array of no element with fields, and of a complex +% empty, pasted into a text and a binary dictionary, as `load` reads the .mat variable it was +% copied from? The values are dispcat.mat's: struct('a', {}) as a 0x0 and a 1x0, and +% complex(zeros(0,0)), complex(zeros(1,0)), a complex int16 1x0 and a complex single 1x0. The +% saves are core's, made by empty_copies_readback.mjs beside this file, each value as an entry's +% value, a struct field and a cell's element, copied as read and once marked edited: +% +% node test/parity/matlab/empty_copies_readback.mjs /tmp/emptycopies +% env EMPTY_COPIES_OUT=/tmp/emptycopies mw -using Bmain matlab -nodesktop \ +% -batch "run('$PWD/test/parity/matlab/probe_empty_copies_readback.m')" +% cp /tmp/emptycopies/empty_copies_readback.truth.json test/parity/matlab/ +% +% Prints EMPTY_COPIES_READBACK OK on its last line. Output: empty_copies_readback.truth.json, +% {version, release, date, cases}: each row of cases.json, as it was, with `matlab`, what MATLAB +% read at that place, {class, size, isreal, fields}, or {error}, and `loaded`, the same of the +% variable `load` reads from dispcat.mat. test/emptyCopiesReadback.test.ts reads it. +% +% Opens only the files in EMPTY_COPIES_OUT, and writes nothing else there. + +outdir = getenv('EMPTY_COPIES_OUT'); +if isempty(outdir) && exist('EMPTY_COPIES_OUT', 'var'), outdir = EMPTY_COPIES_OUT; end %#ok +if isempty(outdir), error('set EMPTY_COPIES_OUT to the directory empty_copies_readback.mjs wrote'); end +cd(outdir); +Simulink.data.dictionary.closeAll('-discard'); +fprintf('VERSION %s\n', version); +S = load(fullfile(outdir, 'dispcat.mat')); +cases = jsondecode(fileread(fullfile(outdir, 'cases.json'))); +if isstruct(cases), cases = num2cell(cases); end +for i = 1:numel(cases) + c = cases{i}; + try + dd = Simulink.data.dictionary.open(fullfile(outdir, c.file)); + v = getValue(getEntry(getSection(dd, 'Design Data'), c.entry)); + switch c.place + case 'field', v = v.f; + case 'cell', v = v{1}; + end + m = shapeOf(v); + close(dd); + catch e + m = struct('error', strrep(e.message, newline, ' ')); + end + Simulink.data.dictionary.closeAll('-discard'); + c.matlab = m; + c.loaded = shapeOf(S.(c.variable)); + cases{i} = c; + fprintf('%-32s %-6s %-22s %s\n', c.file, c.place, c.variable, jsonencode(m)); +end +truth = struct('version', version, 'release', version('-release'), 'date', char(datetime('now', 'Format', 'yyyy-MM-dd')), 'cases', {cases}); +fid = fopen(fullfile(outdir, 'empty_copies_readback.truth.json'), 'w', 'n', 'UTF-8'); +fprintf(fid, '%s\n', jsonencode(truth, 'PrettyPrint', true)); +fclose(fid); +fprintf('EMPTY_COPIES_READBACK OK\n'); + +% A value's class, size, complexity, and its field names (none for anything but a struct), each +% as a list so that JSON keeps one of one as a list. +function m = shapeOf(v) +fields = {}; +if isstruct(v) + fields = fieldnames(v)'; +end +m = struct('class', class(v), 'size', size(v), 'isreal', isreal(v), 'fields', {fields}); +end diff --git a/test/parity/matlab/probe_mat_writeback.m b/test/parity/matlab/probe_mat_writeback.m new file mode 100644 index 00000000..c38b67dd --- /dev/null +++ b/test/parity/matlab/probe_mat_writeback.m @@ -0,0 +1,563 @@ +% Copyright 2026 The MathWorks, Inc. +% +% The MATLAB half of the MAT-file save gate: load every file probe_mat_writeback.mjs saved +% through the session, and compare it, to the leaf, with the original loaded and edited by +% MATLAB itself. +% +% Run the JS half first, with the SAME absolute PROBE_OUT (and `npm run build` before it: +% the JS half reads dist/, so a stale build is a stale verdict): +% env PROBE_OUT=/tmp/matwb node test/parity/matlab/probe_mat_writeback.mjs +% env PROBE_OUT=/tmp/matwb mw -using Bmain matlab -nodesktop \ +% -batch "run('$PWD/test/parity/matlab/probe_mat_writeback.m')" +% PROBE_OUT may instead be set as a variable before the run: "PROBE_OUT='/tmp/matwb'; run(...)". +% +% For each case of the manifest: +% 1. S0 = load(original), which must load with no warning and print nothing: a class the +% fixtures need and this MATLAB lacks would otherwise read as our failure; +% 2. S = load(original) with the case's MATLAB statements applied, which must differ from +% S0 for a case that edits and equal it for one that does not; +% 3. T = load(saved), which must load with no warning and print nothing; +% 4. T must be S: the same variables in the same order (load's, and whos -file's class, +% size and global flag of each), and each variable the same to the leaf (dcmp below: class, +% size, sparsity, complexity, isequaln on every value and the bits of every double and +% single but a NaN's payload, field names in order, every element of +% a cell or struct array, every readable property of an object, a function handle's text +% and an anonymous one's workspace), and its handles shared as S's are (the same object +% held twice is still one object); +% 5. a save with no edit is the original, byte for byte; +% 6. T saved again by MATLAB loads as T, with no warning. +% A case whose `expect` is 'control' is a NEGATIVE control: its statements make one change +% more than the save does, and it passes only when step 4 reports it (`differs`). +% +% Prints `RESULT PASS` or `RESULT FAIL ` per case, and last +% `PROBE_MAT_WRITEBACK DONE pass=N fail=M`. fail=0 is the only acceptable result: a FAIL here +% means MATLAB loads something other than what the session showed, or loads it with a warning. +if exist('PROBE_OUT', 'var') && ~isempty(PROBE_OUT) %#ok + outdir = PROBE_OUT; +else + outdir = getenv('PROBE_OUT'); +end +if isempty(outdir) || outdir(1) ~= '/' + error('PROBE_OUT is not set to an ABSOLUTE path. It must be the one the .mjs half wrote to.'); +end +here = fileparts(mfilename('fullpath')); +fixtures = fullfile(here, '..', '..', 'fixtures'); +% Everything this script writes (MATLAB's re-saves) goes to outdir, a temp directory, never +% to the folder MATLAB was launched from. +cd(outdir); +warning('off', 'backtrace'); + +% The classes the fixtures hold that MATLAB does not ship: the display enumerations, the +% dexsparse classes of hexobj_values.mat, and the DagNode of dag4.mat. +addpath(fullfile(fixtures, 'display')); +addpath(fullfile(fixtures, 'sparse')); +addpath(fullfile(fixtures, 'mcos', 'shared')); +try + % As probe_display.m defines it for dispcat_opaque.mat. + Simulink.defineIntEnumType('DispColor', {'Red', 'Green', 'Blue'}, [1 2 3]); +catch err + fprintf('ENV DispColor: %s\n', err.message); +end + +fprintf('VERSION %s\n', version); +m = jsondecode(fileread(fullfile(outdir, 'manifest.json'))); +if iscell(m) + m = [m{:}]; +end +npass = 0; +nfail = 0; +for k = 1:numel(m) + e = m(k); + fprintf('CASE %s: %s\n', e.id, e.why); + try + why = runCase(e, outdir); + catch err + why = {sprintf('the probe itself threw: %s (%s)', err.message, err.identifier)}; + end + if isempty(why) + fprintf('RESULT %s PASS\n', e.id); + npass = npass + 1; + else + if numel(why) > 12 + why = [why(1:12), {sprintf('... and %d more', numel(why) - 12)}]; + end + fprintf('RESULT %s FAIL %s\n', e.id, strjoin(why, ' | ')); + nfail = nfail + 1; + end +end +fprintf('PROBE_MAT_WRITEBACK DONE pass=%d fail=%d\n', npass, nfail); + +% ---- one case ------------------------------------------------------------------------ +function why = runCase(e, outdir) +why = {}; +if ~isempty(e.js) + why{end + 1} = ['the JS half: ' e.js]; +end +if ~isempty(e.refused) + why{end + 1} = ['core refused the save: ' e.refused]; +end +if isempty(e.saved) + return +end + +[S0, w0, err0] = loadQuietly(e.original); +if ~isempty(err0) + why{end + 1} = ['the ORIGINAL does not load here, so nothing can be judged: ' err0]; + return +end +if ~isempty(w0) + % A warning the original gives itself is the fixture's, not the save's: dispcat_opaque.mat + % holds an anonymous handle made in a file that no longer exists, and every load of it + % says so. A save of it may give that warning again, word for word, and nothing else. + fprintf(' INFO the original warns: %s\n', w0); +end + +S = load(e.original); +stmts = e.statements; +if ischar(stmts) + stmts = {stmts}; +elseif isempty(stmts) + stmts = {}; +end +for i = 1:numel(stmts) + eval(stmts{i}); +end +edited = cmpVars(S0, S); +edits = any(strcmp(e.expect, {'changed', 'control'})); +if edits && isempty(edited) + why{end + 1} = 'the MATLAB statements change nothing, so a PASS would be vacuous'; +elseif ~edits && ~isempty(edited) + why{end + 1} = ['the MATLAB statements change what this case says is unchanged: ' strjoin(edited, '; ')]; +end + +[T, wT, errT] = loadQuietly(e.saved); +if ~isempty(errT) + why{end + 1} = ['load fails: ' errT]; + return +end +if ~isempty(wT) && ~strcmp(wT, w0) + why{end + 1} = ['load warns: ' wT]; +end + +diffs = cmpVars(S, T); +if strcmp(e.expect, 'control') + % A negative control: S holds one change the save does not, and the comparison must say + % so, in so many words. + if ~contains(strjoin(diffs, ' | '), e.differs) + why{end + 1} = sprintf('the control''s planted difference "%s" was not reported; got: %s', e.differs, strjoin(diffs, ' | ')); + else + fprintf(' CONTROL saw %s\n', strjoin(diffs, ' | ')); + end +else + why = [why, diffs]; +end + +% whos -file, which reads the file's own record of each variable without loading it. +w = whos('-file', e.saved); +wn = {w.name}; +tn = fieldnames(T); +if ~isequal(sort(wn(:)), sort(tn(:))) + why{end + 1} = sprintf('whos -file lists [%s], load gives [%s]', strjoin(wn, ','), strjoin(tn', ',')); +else + for i = 1:numel(w) + v = T.(w(i).name); + if ~strcmp(w(i).class, class(v)) || ~isequal(w(i).size, size(v)) + why{end + 1} = sprintf('whos -file says %s is %s %s, load gives %s %s', w(i).name, ... + w(i).class, mat2str(w(i).size), class(v), mat2str(size(v))); %#ok + end + end +end +% And global as the original's variables were, renamed and deleted as the statements rename and +% delete them: `save` marks a variable declared global, which is the variable's and not its +% value's, so load's struct does not show it. Asked of whos -file, and of what a `load` inside a +% function declares global. +wo = whos('-file', e.original); +row = @(c) reshape(sort(c), 1, []); +expected = row({wo([wo.global]).name}); +if ~isempty(expected) || any([w.global]) + for i = 1:numel(stmts) + r = regexp(stmts{i}, 'renameStructField\(S, ''(\w+)'', ''(\w+)''\)', 'tokens', 'once'); + if ~isempty(r) + expected(strcmp(expected, r{1})) = r(2); + end + r = regexp(stmts{i}, 'rmfield\(S, ''(\w+)''\)', 'tokens', 'once'); + if ~isempty(r) + expected(strcmp(expected, r{1})) = []; + end + end + expected = row(expected); + said = row({w([w.global]).name}); + if ~isequal(said, expected) + why{end + 1} = sprintf('whos -file says [%s] are global, where [%s] should be', strjoin(said, ','), strjoin(expected, ',')); + end + declared = globalsLoaded(e.saved); + if ~isequal(declared, expected) + why{end + 1} = sprintf('load inside a function declares [%s] global, where [%s] should be', strjoin(declared, ','), strjoin(expected, ',')); + end +end + +if strcmp(e.expect, 'identical') && ~isequal(bytesOf(e.original), bytesOf(e.saved)) + why{end + 1} = 'a save with no edit is not the original, byte for byte'; +end + +% MATLAB's own save of what it loaded, loaded again. +if ~isempty(fieldnames(T)) + resaved = fullfile(outdir, ['resave_' e.id '.mat']); + lastwarn(''); + txt = evalc('save(resaved, ''-struct'', ''T'');'); + [ws, wsid] = lastwarn; + if ~isempty(ws) || ~isempty(strtrim(txt)) + why{end + 1} = sprintf('MATLAB''s re-save warns: %s (%s) %s', ws, wsid, strtrim(txt)); + end + [T2, w2, err2] = loadQuietly(resaved); + if ~isempty(err2) || (~isempty(w2) && ~strcmp(w2, w0)) + why{end + 1} = ['MATLAB''s re-save does not load cleanly: ' err2 w2]; + else + again = cmpVars(T, T2); + if ~isempty(again) + why{end + 1} = ['MATLAB''s re-save loads differently: ' strjoin(again, '; ')]; + end + end +end +end + +% The variables a `load` inside a function declares global, sorted; the global workspace cleared +% before and after, so that no case sees another's. +function names = globalsLoaded(fileLoaded__) +clear global +evalc('load(fileLoaded__);'); +w__ = whos('global'); +names = reshape(sort({w__.name}), 1, []); +clear global +end + +% load, with what it warns or prints, and its error, instead of letting either escape. +function [V, w, err] = loadQuietly(path) +V = struct(); +w = ''; +err = ''; +lastwarn(''); +try + txt = evalc('V = load(path);'); +catch ex + err = sprintf('%s (%s)', ex.message, ex.identifier); + return +end +[msg, id] = lastwarn; +if ~isempty(msg) + w = sprintf('%s (%s)', msg, id); +end +txt = strtrim(txt); +if ~isempty(txt) + w = strtrim([w ' printed: ' txt]); +end +end + +function b = bytesOf(path) +fid = fopen(path, 'r'); +b = fread(fid, Inf, '*uint8'); +fclose(fid); +end + +% ---- the comparison -------------------------------------------------------------------- +% Two loaded files: the same variables, in the same order, each the same to the leaf, and +% their handles shared alike. +function d = cmpVars(A, B) +d = {}; +na = fieldnames(A); +nb = fieldnames(B); +if ~isequal(na, nb) + d{end + 1} = sprintf('variables [%s] vs [%s]', strjoin(na', ','), strjoin(nb', ',')); +end +common = intersect(na, nb, 'stable'); +for i = 1:numel(common) + d = [d, dcmp(A.(common{i}), B.(common{i}), common{i}, 0)]; %#ok +end +[ha, pa] = handlesOf(A); +[hb, pb] = handlesOf(B); +if ~isequal(pa, pb) + d{end + 1} = sprintf('handle sharing differs: %d handles reached vs %d', numel(pa), numel(pb)); +elseif ~isequal(aliasesOf(ha), aliasesOf(hb)) + sa = aliasesOf(ha); + sb = aliasesOf(hb); + k = find(sa ~= sb, 1); + d{end + 1} = sprintf('handle sharing differs at %s: one object with #%d vs #%d', pa{k}, sa(k), sb(k)); +end +end + +function d = dcmp(a, b, path, depth) +d = {}; +if depth > 24 + return +end +if ~strcmp(class(a), class(b)) + d{end + 1} = sprintf('%s: class %s vs %s', path, class(a), class(b)); + return +end +if ~isequal(size(a), size(b)) + d{end + 1} = sprintf('%s: size %s vs %s', path, mat2str(size(a)), mat2str(size(b))); + return +end +if (isnumeric(a) || islogical(a)) && ~isobject(a) + if issparse(a) ~= issparse(b) + d{end + 1} = sprintf('%s: sparse %d vs %d', path, issparse(a), issparse(b)); + return + end + if isreal(a) ~= isreal(b) + d{end + 1} = sprintf('%s: real %d vs %d', path, isreal(a), isreal(b)); + return + end +end +if isstruct(a) + fa = fieldnames(a); + fb = fieldnames(b); + if ~isequal(fa, fb) + d{end + 1} = sprintf('%s: fields [%s] vs [%s]', path, strjoin(fa', ','), strjoin(fb', ',')); + return + end + for i = 1:numel(a) + for j = 1:numel(fa) + d = [d, dcmp(a(i).(fa{j}), b(i).(fa{j}), sprintf('%s(%d).%s', path, i, fa{j}), depth + 1)]; %#ok + end + end +elseif iscell(a) + for i = 1:numel(a) + d = [d, dcmp(a{i}, b{i}, sprintf('%s{%d}', path, i), depth + 1)]; %#ok + end +elseif isa(a, 'function_handle') + if isempty(a) + return + end + if ~strcmp(func2str(a), func2str(b)) + d{end + 1} = sprintf('%s: %s vs %s', path, func2str(a), func2str(b)); + return + end + fa = functions(a); + fb = functions(b); + if isfield(fa, 'workspace') ~= isfield(fb, 'workspace') + d{end + 1} = sprintf('%s: a workspace on one side only', path); + elseif isfield(fa, 'workspace') + d = [d, dcmp(fa.workspace, fb.workspace, [path ''], depth + 1)]; + end +elseif isenum(a) + if ~isequal(a, b) + d{end + 1} = sprintf('%s: %s vs %s', path, show(a), show(b)); + end +elseif isstring(a) + if ~isequaln(a, b) + d{end + 1} = sprintf('%s: %s vs %s', path, show(a), show(b)); + end +elseif isobject(a) || isa(a, 'handle') + % By its properties, each to the leaf. Not by isequaln, which is numeric (it finds a + % property retyped single equal to its double), and false between two loads of one file + % for a handle (its identity) and for a value object holding an anonymous function handle + % (hexobj_values.mat's FhAlias), however equal the contents. + [dd, gotone] = dprops(a, b, path, depth); + d = [d, dd]; + if ~gotone + % Nothing readable (a categorical's properties are not public; a + % Simulink.VariantVariable's throw on get): a value object by isequaln after all, and + % either by its own display, as wbcompare.m does, so that it is not compared on its + % class and size alone. + if ~isa(a, 'handle') && ~isequaln(a, b) + d{end + 1} = sprintf('%s: isequaln false', path); + end + if builtin('numel', a) == 1 + ta = displayOf(a); + tb = displayOf(b); + if ~strcmp(ta, tb) + d{end + 1} = sprintf('%s: displays %s vs %s', path, trunc(ta), trunc(tb)); + end + end + end +elseif ~isequaln(a, b) + d{end + 1} = sprintf('%s: %s vs %s', path, show(a), show(b)); +elseif (isa(a, 'double') || isa(a, 'single')) && ~issparse(a) && ~sameBits(a, b) + % isequaln holds -0 and 0 equal; the bits of a double or a single do not. + d{end + 1} = sprintf('%s: equal, but not bit for bit (the sign of a zero): %s vs %s', path, bitsShown(a), bitsShown(b)); +end +end + +% Whether two doubles or singles of one size hold the same bits, part by part: the sign of a +% zero included, a NaN's payload not (MATLAB's own NaN and the one a JavaScript writer stores +% differ in it, and nothing MATLAB computes on a NaN reads it). +function same = sameBits(a, b) +cls = 'uint64'; +if isa(a, 'single') + cls = 'uint32'; +end +same = true; +parts = {@real, @imag}; +for i = 1:2 + pa = parts{i}(a(:)); + pb = parts{i}(b(:)); + keep = ~isnan(pa) & ~isnan(pb); + if any(keep) + same = same && isequal(typecast(pa(keep), cls), typecast(pb(keep), cls)); + end +end +end + +function s = bitsShown(v) +s = mat2str(1 ./ [real(v(:)); imag(v(:))]'); +end + +% Every readable property of every element, and whether there was one. The elements are the +% object's own, builtin('numel'): a table or a categorical is one object whatever size it +% says it is, and t(i) is an error for a table. +function [d, gotone] = dprops(a, b, path, depth) +d = {}; +p = properties(a); +gotone = false; +n = builtin('numel', a); +if builtin('numel', b) ~= n + d{end + 1} = sprintf('%s: %d objects vs %d', path, n, builtin('numel', b)); + return +end +for i = 1:n + if n == 1 + ai = a; + bi = b; + else + ai = a(i); + bi = b(i); + end + for j = 1:numel(p) + [va, ea] = getProp(ai, p{j}); + [vb, eb] = getProp(bi, p{j}); + where = sprintf('%s(%d).%s', path, i, p{j}); + if ~strcmp(ea, eb) + d{end + 1} = sprintf('%s: get throws <%s> vs <%s>', where, ea, eb); %#ok + elseif isempty(ea) + gotone = true; + d = [d, dcmp(va, vb, where, depth + 1)]; %#ok + end + end +end +end + +function [v, eid] = getProp(o, name) +v = []; +eid = ''; +try + v = o.(name); +catch ex + eid = ex.identifier; + if isempty(eid) + eid = ex.message; + end +end +end + +function s = displayOf(v) +try + s = strtrim(regexprep(char(formattedDisplayText(v, 'SuppressMarkup', true)), '\s+', ' ')); +catch + s = ''; +end +end + +% Every handle object reachable from the variables, in a fixed walk, with its path. A handle +% met again is listed again but not walked again, so a DAG costs its size, not its paths. +function [hs, ps] = handlesOf(V) +hs = {}; +ps = {}; +names = fieldnames(V); +for i = 1:numel(names) + [hs, ps] = walkHandles(V.(names{i}), names{i}, hs, ps, 0); +end +end + +function [hs, ps] = walkHandles(v, path, hs, ps, depth) +if depth > 12 || numel(hs) >= 400 + return +end +if isstruct(v) + fn = fieldnames(v); + for i = 1:numel(v) + for j = 1:numel(fn) + [hs, ps] = walkHandles(v(i).(fn{j}), sprintf('%s(%d).%s', path, i, fn{j}), hs, ps, depth + 1); + end + end +elseif iscell(v) + for i = 1:numel(v) + [hs, ps] = walkHandles(v{i}, sprintf('%s{%d}', path, i), hs, ps, depth + 1); + end +elseif isobject(v) && ~isstring(v) && ~isenum(v) + isHandle = isa(v, 'handle'); + p = properties(v); + n = builtin('numel', v); + for i = 1:n + if n == 1 + h = v; + else + h = v(i); + end + walk = true; + if isHandle + for k = 1:numel(hs) + if sameHandle(hs{k}, h) + walk = false; + break + end + end + hs{end + 1} = h; %#ok + ps{end + 1} = sprintf('%s(%d)', path, i); %#ok + end + if walk + for j = 1:numel(p) + [x, ex] = getProp(h, p{j}); + if isempty(ex) + [hs, ps] = walkHandles(x, sprintf('%s(%d).%s', path, i, p{j}), hs, ps, depth + 1); + end + end + end + end +end +end + +% For each handle, the number of the first earlier one that is the same object, or 0. +function s = aliasesOf(hs) +s = zeros(1, numel(hs)); +for k = 1:numel(hs) + for j = 1:k - 1 + if sameHandle(hs{j}, hs{k}) + s(k) = j; + break + end + end +end +end + +function tf = sameHandle(a, b) +try + tf = strcmp(class(a), class(b)) && isequal(size(a), size(b)) && all(a == b, 'all'); +catch + tf = false; +end +end + +function s = show(v) +try + if ischar(v) + s = ['''' reshape(v, 1, []) '''']; + elseif isstring(v) + s = ['"' char(strjoin(reshape(v, 1, []), '","')) '"']; + elseif isenum(v) + s = strjoin(arrayfun(@char, reshape(v, 1, []), 'UniformOutput', false), ','); + elseif isnumeric(v) || islogical(v) + s = mat2str(full(v), 17); + else + s = ['<' class(v) '>']; + end +catch + s = ['<' class(v) '>']; +end +s = trunc(s); +end + +function s = trunc(s) +if numel(s) > 200 + s = [s(1:200) sprintf(' ...(%d chars)', numel(s))]; +end +end diff --git a/test/parity/matlab/probe_mat_writeback.mjs b/test/parity/matlab/probe_mat_writeback.mjs new file mode 100644 index 00000000..57919239 --- /dev/null +++ b/test/parity/matlab/probe_mat_writeback.mjs @@ -0,0 +1,1039 @@ +// Copyright 2026 The MathWorks, Inc. +// +// THE acceptance gate for the MAT-file save: does MATLAB `load` what +// session.serializeSource writes for a `.mat`, as the edit the session made? +// +// test/matFileSave.test.ts reads every save back with core's own reader, and core's reader is +// more lenient than MATLAB's: it opens files MATLAB refuses. The strict checker +// (MatFileCheck) states the load rules MATLAB was measured to enforce, which is closer, but +// still a model of MATLAB. Only MATLAB can say that a file it is handed loads, loads without a +// warning, and loads as the values the session showed after its edit. +// +// So each case opens a fixture MATLAB wrote through the session API, as a host does, makes +// its edits there (editProperty, deleteNodeById, addChildTo, an added variable, undo), saves +// it with serializeSource, and records beside the saved file THE SAME EDIT as MATLAB +// statements on a struct `S` loaded from the original (`S.kp = 7;`, `S.rowVec(2) = 99;`, +// `S = renameStructField(S, 'negD', 'negD2');`, `S = rmfield(S, 'infP');`, `S.var = 0;`). +// probe_mat_writeback.m loads the original, makes the edit in MATLAB, loads the save, and +// compares the two to the leaf. +// +// Two halves, one manifest between them (PROBE_OUT must be the same ABSOLUTE path in each): +// +// npm run build +// env PROBE_OUT=/tmp/matwb node test/parity/matlab/probe_mat_writeback.mjs +// env PROBE_OUT=/tmp/matwb mw -using Bmain matlab -nodesktop \ +// -batch "run('$PWD/test/parity/matlab/probe_mat_writeback.m')" +// +// It reads the BUILT package, as probe_writeback.mjs does and for its reason, so a stale +// `dist/` is a stale verdict. The fixtures are found from this file's own folder, so node can +// be launched from anywhere. +// +// What this half asserts itself, before MATLAB is asked anything, and records in the +// manifest as `js` (anything but '' fails the case in the MATLAB half too): +// - every edit the case makes is accepted, and leaves the node showing what the case's +// MATLAB statements make of it (`shows`), so the two halves describe one edit; +// - the save answers `{ kind: 'binary', sourceFormat: 'mat' }`; +// - a save with no edit is the file, byte for byte, and a save with one is not; +// - a save of a file that holds no compressed record (`-v6`) holds none either; +// - the strict checker finds no violation in the save that it does not find in the file. +// +// A save core refuses is written to the manifest as `refused`, with core's message, and +// counts as a failure: every case here is an edit phase 1 claims to save. +import { readFileSync, writeFileSync, mkdirSync, copyFileSync } from 'node:fs'; +import { fileURLToPath } from 'node:url'; +import { unzlibSync } from 'fflate'; +import { createSession } from '../../../dist/index.js'; +import { parseMat } from '../../../dist/datamodel/parser/MatParser.js'; +import { checkMatFile, violationsAdded } from '../../../dist/datamodel/parser/MatFileCheck.js'; + +const REPO = fileURLToPath(new URL('../../../', import.meta.url)); +const OUT = process.env.PROBE_OUT || '/tmp/mat_writeback_probe'; +if (!OUT.startsWith('/')) { + throw new Error('PROBE_OUT must be an ABSOLUTE path, the same one the MATLAB half is given; got ' + OUT); +} +mkdirSync(OUT, { recursive: true }); + +// The fixtures, each MATLAB's own `save`. Between them: every plain class and shape the +// corpus has (cases, dispcat, sparse_values, complex_inf, sparse_cases), objects and strings +// held in the subsystem (cases, nested_objects, strings_mixed, strings), function handles, +// enumerations, fi, categorical and table (dispcat_opaque), a handle DAG of one object held +// twice at every level (dag4), and two `-v6` files, which hold no compressed record +// (nested_handles, hexobj_values). complex_inf and sparse_cases hold no subsystem. +const CASES_MAT = 'test/parity/artifacts/mat/cases.mat'; +const DISPCAT = 'test/fixtures/display/dispcat.mat'; +const OPAQUE = 'test/fixtures/display/dispcat_opaque.mat'; +const NESTED = 'test/fixtures/mcos/nested_objects.mat'; +const STR_MIXED = 'test/fixtures/strings_mixed.mat'; +const STRINGS = 'test/fixtures/strings.mat'; +const SPARSE = 'test/fixtures/sparse/sparse_values.mat'; +const SPARSE_CASES = 'test/fixtures/sparse_cases.mat'; +const COMPLEX_INF = 'test/fixtures/complex_inf/complex_inf.mat'; +const DAG = 'test/fixtures/mcos/shared/dag4.mat'; +const V6_HANDLES = 'test/fixtures/display/nested_handles.mat'; +const V6_HEXOBJ = 'test/fixtures/sparse/hexobj_values.mat'; +// MATLAB's own `save` of variables declared global (gD, gS, gC, gI) beside one that is not +// (plain), -v7 and -v6 (test/fixtures/global/make_global_fixtures.m). +const GLOBAL_V7 = 'test/fixtures/global/global_v7.mat'; +const GLOBAL_V6 = 'test/fixtures/global/global_v6.mat'; + +const LONG_NAME = 'a' + 'b'.repeat(61) + 'c'; // 63 characters, the longest name core writes + +const basename = (rel) => rel.slice(rel.lastIndexOf('/') + 1); +const sameBytes = (a, b) => a.byteLength === b.byteLength && a.every((x, i) => x === b[i]); + +// A fixture is a path under the repo, or (CRAFTED below) one this half writes into OUT. +const crafted = new Map(); +function bytesOf(rel) { + const u8 = crafted.get(rel) ?? new Uint8Array(readFileSync(REPO + rel)); + return u8.buffer.slice(u8.byteOffset, u8.byteOffset + u8.byteLength); +} + +// ---- one fixture this half assembles: MATLAB's own elements, held one level down ------ +// +// No fixture MATLAB wrote holds an empty complex array or an empty struct array with fields +// INSIDE a struct or a cell, beside a value a user can edit, which is what makes a save +// write them fresh without touching them. dispcat.mat holds both at the top level. So this +// takes MATLAB's own elements for `dx_complex_0x0` (complex(zeros(0,0))) and +// `dx_struct_0x0_fields` (a 0x0 struct with a field `a`), drops their names, and puts them +// in a struct `s` and a cell `c`, each beside the double 1, in a `-v6`-style file of plain +// records. The MATLAB half loads it, as it does every original, before judging anything +// saved from it. +const u32 = (n) => new Uint8Array(new Uint32Array([n]).buffer); +const concat = (parts) => { + const out = new Uint8Array(parts.reduce((n, p) => n + p.byteLength, 0)); + let at = 0; + for (const p of parts) { + out.set(p, at); + at += p.byteLength; + } + return out; +}; +const pad8 = (b) => concat([b, new Uint8Array((8 - (b.byteLength % 8)) % 8)]); +const sub = (type, data) => pad8(concat([u32(type), u32(data.byteLength), data])); +const EMPTY_NAME = sub(1, new Uint8Array(0)); +const miMatrix = (body) => concat([u32(14), u32(body.byteLength), body]); + +/** The element of `rec`, inflated when compressed: its miMATRIX tag and body. */ +function elementOf(rec) { + const dv = new DataView(rec.bytes.buffer, rec.bytes.byteOffset, rec.bytes.byteLength); + return dv.getUint32(0, true) === 15 ? unzlibSync(rec.bytes.subarray(8, 8 + dv.getUint32(4, true))) : rec.bytes.subarray(0, 8 + dv.getUint32(4, true)); +} + +/** `el` with its name sub-element (the third, after the flags and the dims) made empty. */ +function nameless(el) { + const dv = new DataView(el.buffer, el.byteOffset, el.byteLength); + const skip = (at) => { + const word = dv.getUint32(at, true); + return word >>> 16 ? at + 8 : at + 8 + Math.ceil(dv.getUint32(at + 4, true) / 8) * 8; + }; + const nameAt = skip(skip(8)); + return miMatrix(concat([el.subarray(8, nameAt), EMPTY_NAME, el.subarray(skip(nameAt), 8 + dv.getUint32(4, true))])); +} + +const NAME = (n) => sub(1, new TextEncoder().encode(n)); +const FLAGS = (cls) => sub(6, concat([u32(cls), u32(0)])); +const DIMS = (d) => sub(5, concat(d.map(u32))); +const doubleScalar = (v) => miMatrix(concat([FLAGS(6), DIMS([1, 1]), EMPTY_NAME, sub(9, new Uint8Array(new Float64Array([v]).buffer))])); + +function structVar(name, fields) { + const len = 32; + const names = new Uint8Array(len * fields.length); + fields.forEach(([f], i) => names.set(new TextEncoder().encode(f), i * len)); + return miMatrix(concat([FLAGS(2), DIMS([1, 1]), NAME(name), concat([u32(5 | (4 << 16)), u32(len)]), sub(1, names), ...fields.map(([, el]) => el)])); +} +const cellVar = (name, els) => miMatrix(concat([FLAGS(1), DIMS([1, els.length]), NAME(name), ...els])); + +function nestedEmpties() { + const dispcat = parseMat(bytesOf(DISPCAT)); + const el = (n) => nameless(elementOf(dispcat.records.find((r) => r.name === n))); + const header = new Uint8Array(128).fill(0x20); + header.set(new TextEncoder().encode('MATLAB 5.0 MAT-file, assembled by probe_mat_writeback.mjs from the elements of dispcat.mat')); + header.set([0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x01, 0x49, 0x4d], 116); + return concat([ + header, + structVar('s', [ + ['ec', el('dx_complex_0x0')], + ['es', el('dx_struct_0x0_fields')], + ['x', doubleScalar(1)], + ]), + cellVar('c', [el('dx_complex_0x0'), el('dx_struct_0x0_fields'), doubleScalar(1)]), + ]); +} +const NESTED_EMPTIES = 'crafted/nested_empties.mat'; + +// ---- and one of the shapes the fix of those two losses has to hold, byte by byte -------- +// +// What no fixture MATLAB wrote holds, built by hand the way MATLAB writes each (a field-name +// stride of 32, as MATLAB's own older saves have it; an empty part as an empty sub-element of +// its class's type, as dispcat.mat's e_single_complex_1x0 has it): +// c2 a cell {struct('a', {}, 'b', {}), 1}: a struct of no element with two fields, beside a +// member to edit; +// z03 complex(zeros(0, 3, 'single')), and sz, a struct holding one beside a field to edit; +// sa a 1x2 struct array whose elements each hold an empty struct with a field (a 0x0 and a +// 1x0) beside a field to edit; +// g a variable `save` marks global (bit 0x04 of its array flags), and h beside it, not; +// nz [-3i, 1+2i, complex(-0, -0)], whose zero parts are -0 (MATLAB's `-3i` is complex(-0, +// -3)), beside an element to edit. +const flagsOf = (cls, bits = 0) => sub(6, concat([u32(cls | (bits << 8)), u32(0)])); +const emptyStruct = (dims, fields) => { + const len = 32; + const names = new Uint8Array(len * fields.length); + fields.forEach((f, i) => names.set(new TextEncoder().encode(f), i * len)); + return miMatrix(concat([flagsOf(2), DIMS(dims), EMPTY_NAME, concat([u32(5 | (4 << 16)), u32(len)]), sub(1, names)])); +}; +const singleComplexEmpty = (name) => miMatrix(concat([flagsOf(7, 0x08), DIMS([0, 3]), name ? NAME(name) : EMPTY_NAME, sub(7, new Uint8Array(0)), sub(7, new Uint8Array(0))])); +const doubles = (values) => new Uint8Array(new Float64Array(values).buffer); +function structArray(name, dims, fields, elements) { + const len = 32; + const names = new Uint8Array(len * fields.length); + fields.forEach((f, i) => names.set(new TextEncoder().encode(f), i * len)); + return miMatrix(concat([flagsOf(2), DIMS(dims), NAME(name), concat([u32(5 | (4 << 16)), u32(len)]), sub(1, names), ...elements.flat()])); +} +function emptiesMore() { + const header = new Uint8Array(128).fill(0x20); + header.set(new TextEncoder().encode('MATLAB 5.0 MAT-file, assembled by probe_mat_writeback.mjs')); + header.set([0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x01, 0x49, 0x4d], 116); + return concat([ + header, + cellVar('c2', [emptyStruct([0, 0], ['a', 'b']), doubleScalar(1)]), + singleComplexEmpty('z03'), + structVar('sz', [ + ['z', singleComplexEmpty('')], + ['x', doubleScalar(1)], + ]), + structArray('sa', [1, 2], ['es', 'x'], [ + [emptyStruct([0, 0], ['q']), doubleScalar(1)], + [emptyStruct([1, 0], ['q']), doubleScalar(2)], + ]), + miMatrix(concat([flagsOf(6, 0x04), DIMS([1, 2]), NAME('g'), sub(9, doubles([1, 2]))])), + miMatrix(concat([flagsOf(6), DIMS([1, 2]), NAME('h'), sub(9, doubles([3, 4]))])), + miMatrix(concat([flagsOf(6, 0x08), DIMS([1, 3]), NAME('nz'), sub(9, doubles([-0, 1, -0])), sub(9, doubles([-3, 2, -0]))])), + ]); +} +const EMPTIES_MORE = 'crafted/empties_more.mat'; + +/** + * A fixture opened through the session, as a host opens one, and the edits a host makes on + * it. Each edit throws when the session refuses it, or when the node does not then show what + * the case says, so a case whose two halves describe different edits never reaches MATLAB. + */ +function opened(rel) { + const session = createSession(); + const name = basename(rel); + const root = session.addMatSource(name, bytesOf(rel)); + const notes = []; + + // `labels`: the variable's name, then the displayName of each child down to the node, as + // the tree shows them (`'mat2x3', 'mat2x3(1,2)'`; `'struct1x3', 'struct1x3(2)', 'a'`). + const at = (...labels) => { + let node = root.children.find((c) => c.name === labels[0]); + for (const label of labels.slice(1)) { + node = node?.children?.find((c) => c.displayName === label); + } + if (!node) { + throw new Error('no node ' + labels.join(' > ') + ' in ' + name); + } + return node; + }; + const accepted = (what, ok) => { + if (ok !== true) { + throw new Error(what + ' was refused: ' + JSON.stringify(ok)); + } + }; + const shows = (node, className, displayValue) => { + const got = [node.className, node.displayValue]; + if (got[0] !== className || (displayValue !== undefined && got[1] !== displayValue)) { + throw new Error( + node.displayName + ' shows ' + JSON.stringify(got) + ', not ' + JSON.stringify([className, displayValue]), + ); + } + }; + + return { + session, + root, + name, + notes, + at, + /** Set the Value of the node at `labels`; then it must show `className` (and `display`). */ + set(labels, value, className, display) { + const node = at(...labels); + session.setActive(root, node); + accepted('Value ' + value + ' of ' + labels.join(' > '), session.editProperty(node.id, 'Value', value)); + shows(node, className, display); + return node; + }, + rename(from, to) { + const node = at(from); + session.setActive(root, node); + accepted('rename ' + from + ' -> ' + to, session.editProperty(node.id, 'Name', to)); + if (node.name !== to) { + throw new Error('rename ' + from + ' -> ' + to + ' left the name ' + node.name); + } + }, + remove(name_) { + const node = at(name_); + session.setActive(root, node); + accepted('delete ' + name_, session.deleteNodeById(node.id)); + }, + /** A struct field added to the struct at `labels`; it must be `field`, a double 0. */ + addField(labels, field) { + const node = at(...labels); + session.setActive(root, node); + const added = session.addChildTo(node.id); + if (!added) { + throw new Error('addChildTo ' + labels.join(' > ') + ' was refused'); + } + if (added.name !== field) { + throw new Error('the field added to ' + labels.join(' > ') + ' is ' + added.name + ', not ' + field); + } + shows(added, 'double', '0'); + }, + /** + * A variable added, as a host adds one: by session.addEntry where it answers for a + * MAT-file, else by MatNode.execAddEntry, which is all session.addEntry does for a + * dictionary's section. It must be `name`, a double 0, as the design says a new variable + * is. + */ + add(name_) { + session.setActive(root, root); + let node = session.addEntry?.('', 'double', name_) ?? null; + if (node) { + notes.push('added by session.addEntry'); + } else { + node = root.execAddEntry(undefined, name_).node; + notes.push('added by MatNode.execAddEntry (session.addEntry answered null)'); + } + if (node.name !== name_) { + throw new Error('the variable added is ' + node.name + ', not ' + name_); + } + shows(node, 'double', '0'); + return node; + }, + undo() { + session.undo(); + }, + /** + * Every variable MatWriter can write as what it is, marked edited: the state an edit and + * its undo leave (DataNode._valueEdited), which writes the variable fresh, holding the + * value it was read as. This is the MATLAB half's question for the fresh encoder, value by + * value: every class, shape, empty and non-finite these fixtures hold, written by core. + */ + freshAll() { + const plain = root.children.filter((n) => n._matWritable?.() === true && !root.recordOf(n)?.variable?.isOpaque); + if (plain.length === 0) { + throw new Error('no plain variable in ' + name); + } + plain.forEach((n) => n._markModified()); + notes.push(plain.length + ' variables written fresh'); + }, + }; +} + +// The cases. Each one: an id (the saved file's name), the fixture, what it asks, the edits +// through the session (`edit`), the same edits in MATLAB (`matlab`), and what the MATLAB half +// must then find: +// identical no edit: the save is the file, byte for byte, and MATLAB loads it as itself +// unchanged written anew, but holding the same values: MATLAB loads it as the original +// changed MATLAB loads it as the original with `matlab` applied, which must differ +// control a NEGATIVE control: `matlab` is the edit plus one more change the save does not +// make, and the case passes only when the comparison names it (`differs`, a +// piece of the difference it must report). Without these a PASS could be a +// comparison that never looks where it says it does. +const CASES = []; +function add(id, file, why, edit, matlab, expect = 'changed', differs = '') { + CASES.push({ id, file, why, edit, matlab, expect, differs }); +} +const zero = (id, file, why) => add(id, file, why, () => {}, [], 'identical'); +const control = (id, file, why, edit, matlab, differs) => add(id, file, why, edit, matlab, 'control', differs); + +// ---- no edit: the file, byte for byte, for every fixture the gate uses ------------------ +for (const [id, file] of [ + ['zero_cases', CASES_MAT], + ['zero_dispcat', DISPCAT], + ['zero_opaque', OPAQUE], + ['zero_nested_objects', NESTED], + ['zero_strings_mixed', STR_MIXED], + ['zero_strings', STRINGS], + ['zero_sparse', SPARSE], + ['zero_sparse_cases', SPARSE_CASES], + ['zero_complex_inf', COMPLEX_INF], + ['zero_dag', DAG], + ['zero_v6_handles', V6_HANDLES], + ['zero_v6_hexobj', V6_HEXOBJ], +]) { + zero(id, file, 'a save with no edit is the file'); +} + +// ---- cases.mat: a value of every kind phase 1 writes fresh --------------------------- +add('scalar_value', CASES_MAT, 'a double scalar', (f) => f.set(['kp'], '7', 'double', '7'), ['S.kp = 7;']); +add('typed_scalar', CASES_MAT, 'an int16 scalar typed into keeps its class', (f) => f.set(['s_int16'], '9', 'int16', '9'), [ + 'S.s_int16 = int16(9);', +]); +add('single_scalar', CASES_MAT, 'a single keeps its class', (f) => f.set(['scalarS'], '2.5', 'single', '2.5'), [ + 'S.scalarS = single(2.5);', +]); +add( + 'uint64_exact', + CASES_MAT, + 'a uint64 past 2^53, exactly', + (f) => f.set(['maxU64'], '18446744073709551614', 'uint64', '18446744073709551614'), + ["S.maxU64 = intmax('uint64') - 1;"], +); +add( + 'int64_exact', + CASES_MAT, + 'an int64 past 2^53, exactly', + (f) => f.set(['i64Unsafe'], '9007199254740995', 'int64', '9007199254740995'), + ['S.i64Unsafe = int64(9007199254740992) + 3;'], +); +add('logical_scalar', CASES_MAT, 'a logical', (f) => f.set(['boolT'], 'false', 'logical', 'false'), ['S.boolT = false;']); +add('char_value', CASES_MAT, 'a char row', (f) => f.set(['charStr'], "'new text'", 'char', "'new text'"), [ + "S.charStr = 'new text';", +]); +add('matrix_element', CASES_MAT, 'one element of a 2x3', (f) => f.set(['mat2x3', 'mat2x3(1,2)'], '99', 'double', '99'), [ + 'S.mat2x3(1,2) = 99;', +]); +add( + 'int16_elements', + CASES_MAT, + 'elements of an int16 vector stay int16, a fraction rounded as MATLAB rounds it', + (f) => { + f.set(['i16Vec', 'i16Vec(2)'], '99', 'int16', '99'); + f.set(['i16Vec', 'i16Vec(3)'], '1.5', 'int16', '2'); + }, + ['S.i16Vec(2) = 99;', 'S.i16Vec(3) = 1.5;'], +); +add('logical_element', CASES_MAT, 'an element of a logical vector', (f) => f.set(['boolVec', 'boolVec(2)'], 'true', 'logical', 'true'), [ + 'S.boolVec(2) = true;', +]); +add('nd_element', CASES_MAT, 'an element of a 2x3x2', (f) => f.set(['nd2x3x2', 'nd2x3x2(2,1,2)'], '99', 'double', '99'), [ + 'S.nd2x3x2(2,1,2) = 99;', +]); +add('nonfinite_element', CASES_MAT, 'a non-finite typed into a vector', (f) => f.set(['nonFinVec', 'nonFinVec(1)'], '-Inf', 'double', '-Inf'), [ + 'S.nonFinVec(1) = -Inf;', +]); +add('reshape', CASES_MAT, 'a row typed as a 2x2', (f) => f.set(['rowVec'], '[1 2; 3 4]', 'double', '[1 2; 3 4]'), [ + 'S.rowVec = [1 2; 3 4];', +]); +add('column_to_row', CASES_MAT, 'a column typed as a row', (f) => f.set(['colVec'], '[7 8 9]', 'double', '[7 8 9]'), [ + 'S.colVec = [7 8 9];', +]); +add('to_empty', CASES_MAT, 'a scalar typed as []', (f) => f.set(['negD'], '[]', 'double', '[ ]'), ['S.negD = [];']); +add('struct_field', CASES_MAT, 'a field of a struct', (f) => f.set(['structScalar', 'a'], '9', 'double', '9'), [ + 'S.structScalar.a = 9;', +]); +add('nested_struct_field', CASES_MAT, 'a field of a struct in a struct', (f) => f.set(['structNest', 'a', 'b'], '20', 'double', '20'), [ + 'S.structNest.a.b = 20;', +]); +add( + 'struct_array_field', + CASES_MAT, + "a field of a 1x3 struct array's second element", + (f) => f.set(['struct1x3', 'struct1x3(2)', 'a'], '9', 'double', '9'), + ['S.struct1x3(2).a = 9;'], +); +add( + 'struct_2d_field', + CASES_MAT, + "a field of a 2x3 struct array's (1,2) element", + (f) => f.set(['struct2x3', 'struct2x3(1,2)', 'a'], '33', 'double', '33'), + ['S.struct2x3(1,2).a = 33;'], +); +add( + 'struct_nd_field', + CASES_MAT, + "a field of a 2x3x2 struct array's (1,2,1) element", + (f) => f.set(['structNd', 'structNd(1,2,1)', 'a'], '33', 'double', '33'), + ['S.structNd(1,2,1).a = 33;'], +); +add('cell_member', CASES_MAT, 'a member of a cell', (f) => f.set(['cellFlat', 'cellFlat{1}'], '9', 'double', '9'), [ + 'S.cellFlat{1} = 9;', +]); +add('cell_member_class', CASES_MAT, "a cell's char member typed as a double row", (f) => f.set(['cellFlat', 'cellFlat{2}'], '[1 2]', 'double', '[1 2]'), [ + 'S.cellFlat{2} = [1 2];', +]); +add( + 'cell_nested_member', + CASES_MAT, + 'a member of a cell in a cell in a cell', + (f) => f.set(['cellNest', 'cellNest{2}', 'cellNest{2}{2}', 'cellNest{2}{2}{1}'], '30', 'double', '30'), + ['S.cellNest{2}{2}{1} = 30;'], +); +add('cell_nd_member', CASES_MAT, 'a member of a 2x3x2 cell', (f) => f.set(['cellNd', 'cellNd{1,2,1}'], '33', 'double', '33'), [ + 'S.cellNd{1,2,1} = 33;', +]); +add('add_struct_field', CASES_MAT, 'a field added to a struct, last', (f) => f.addField(['structScalar'], 'field'), [ + 'S.structScalar.field = 0;', +]); +add('class_double_to_char', CASES_MAT, 'a double typed as text', (f) => f.set(['kp'], "'abc'", 'char', "'abc'"), ["S.kp = 'abc';"]); +add('class_char_to_double', CASES_MAT, 'text typed as numbers', (f) => f.set(['charStr'], '[1 2]', 'double', '[1 2]'), [ + 'S.charStr = [1 2];', +]); +add('class_to_cell', CASES_MAT, 'a double typed as a cell', (f) => f.set(['infN'], "{1, 'a'}", 'cell', "{1, 'a'}"), [ + "S.infN = {1, 'a'};", +]); +add('complex_scalar', CASES_MAT, 'a complex scalar', (f) => f.set(['cplxScalar'], '1-2i', 'double', '1-2i'), ['S.cplxScalar = 1-2i;']); +add( + 'complex_element', + CASES_MAT, + 'a real typed into a complex vector, which stays complex', + (f) => { + f.set(['cplxVec', 'cplxVec(1)'], '5', 'double', '5'); + if (f.at('cplxVec').displayValue !== '[5 3-4i]') { + throw new Error('cplxVec shows ' + f.at('cplxVec').displayValue); + } + }, + ['S.cplxVec(1) = 5;'], +); +add('real_to_complex', CASES_MAT, 'a real scalar typed as a complex one', (f) => f.set(['scalarD'], '2+3i', 'double', '2+3i'), [ + 'S.scalarD = 2+3i;', +]); + +// ---- cases.mat: renames, deletes and adds ------------------------------------------- +add('rename_plain', CASES_MAT, 'a plain variable renamed', (f) => f.rename('kp', 'kpRenamed'), [ + "S = renameStructField(S, 'kp', 'kpRenamed');", +]); +add('rename_long', CASES_MAT, 'a struct renamed to 63 characters', (f) => f.rename('structNest', LONG_NAME), [ + `S = renameStructField(S, 'structNest', '${LONG_NAME}');`, +]); +add( + 'rename_swap', + CASES_MAT, + 'two variables trading names through a third', + (f) => { + f.rename('kp', 'tmpName'); + f.rename('scalarD', 'kp'); + f.rename('tmpName', 'scalarD'); + }, + ["S = renameStructField(S, 'kp', 'tmpName');", "S = renameStructField(S, 'scalarD', 'kp');", "S = renameStructField(S, 'tmpName', 'scalarD');"], +); +add('rename_param', CASES_MAT, 'a Simulink.Parameter renamed', (f) => f.rename('aParam', 'renamedParam'), [ + "S = renameStructField(S, 'aParam', 'renamedParam');", +]); +add('rename_string', CASES_MAT, 'a string renamed', (f) => f.rename('strScalar', 'str2'), ["S = renameStructField(S, 'strScalar', 'str2');"]); +const CASES_OBJECTS = ['strScalar', 'strArray', 'strMat', 'aParam', 'aSignal', 'aBus', 'aLookup', 'aVariant', 'objRow', 'objCol', 'obj2x3', 'obj2x3x2']; +add( + 'rename_objects_all', + CASES_MAT, + 'every variable the subsystem holds renamed: strings, a Parameter, Signal, Bus, LookupTable, VariantVariable and Parameter arrays', + (f) => CASES_OBJECTS.forEach((n) => f.rename(n, n + 'R')), + CASES_OBJECTS.map((n) => `S = renameStructField(S, '${n}', '${n}R');`), +); +add('delete_plain', CASES_MAT, 'a plain variable deleted', (f) => f.remove('infP'), ["S = rmfield(S, 'infP');"]); +add('delete_param', CASES_MAT, 'a Simulink.Parameter deleted: its object stays in the subsystem, held by nothing', (f) => f.remove('aParam'), [ + "S = rmfield(S, 'aParam');", +]); +add( + 'delete_objects_all', + CASES_MAT, + 'every variable the subsystem holds deleted: the subsystem stays, held by nothing', + (f) => CASES_OBJECTS.forEach((n) => f.remove(n)), + [`S = rmfield(S, {${CASES_OBJECTS.map((n) => `'${n}'`).join(', ')}});`], +); +add( + 'delete_all', + CASES_MAT, + 'every variable deleted: the file holds only the subsystem', + (f) => [...f.root.children].forEach((n) => f.remove(n.name)), + ['S = struct();'], +); +add('add_variable', CASES_MAT, 'a variable added, before the subsystem', (f) => f.add('var'), ['S.var = 0;']); +add( + 'add_and_edit', + CASES_MAT, + 'a variable added, then its value typed', + (f) => { + f.add('added'); + f.set(['added'], '[1 2 3]', 'double', '[1 2 3]'); + }, + ['S.added = [1 2 3];'], +); +add( + 'several_at_once', + CASES_MAT, + 'a value, a cell member, two renames (one an object), two deletes (one an object) and an add, in one save', + (f) => { + f.set(['kp'], '[7 8]', 'double', '[7 8]'); + f.rename('scalarD', 'renamedD'); + f.set(['cellFlat', 'cellFlat{3}'], "'x'", 'char', "'x'"); + f.rename('aSignal', 'sig2'); + f.remove('negD'); + f.remove('objRow'); + f.add('added'); + }, + [ + 'S.kp = [7 8];', + "S = renameStructField(S, 'scalarD', 'renamedD');", + "S.cellFlat{3} = 'x';", + "S = renameStructField(S, 'aSignal', 'sig2');", + "S = rmfield(S, {'negD', 'objRow'});", + 'S.added = 0;', + ], +); +add( + 'edit_undone', + CASES_MAT, + 'an element edited and the edit undone: written fresh, holding the value read', + (f) => { + f.set(['mat2x3', 'mat2x3(1,1)'], '9', 'double', '9'); + f.undo(); + }, + [], + 'unchanged', +); +add( + 'rename_undone', + CASES_MAT, + 'a rename undone: the file as it was', + (f) => { + f.rename('kp', 'kp2'); + f.undo(); + }, + [], + 'identical', +); + +// ---- every plain variable written fresh, holding what it was read as ----------------- +for (const [id, file] of [ + ['fresh_cases', CASES_MAT], + ['fresh_dispcat', DISPCAT], + ['fresh_sparse', SPARSE], + ['fresh_sparse_cases', SPARSE_CASES], + ['fresh_complex_inf', COMPLEX_INF], +]) { + add(id, file, 'every plain variable written fresh by core', (f) => f.freshAll(), [], 'unchanged'); +} + +// ---- sparse --------------------------------------------------------------------------- +add('sparse_element', SPARSE, 'a non-zero of a sparse double', (f) => f.set(['spDiag', 'spDiag(3,3)'], '99', 'double', '99'), [ + 'S.spDiag(3,3) = 99;', +]); +add( + 'sparse_complex_element', + SPARSE, + 'a real typed into a complex sparse, which stays complex', + (f) => f.set(['spComplex', 'spComplex(1,1)'], '5', 'double', '5'), + ['S.spComplex(1,1) = 5;'], +); +add('sparse_in_struct', SPARSE, 'a non-zero of a sparse in a struct field', (f) => f.set(['st', 'sp', 'sp(2,1)'], '1', 'double', '1'), [ + 'S.st.sp(2,1) = 1;', +]); +add('sparse_in_cell', SPARSE, 'a non-zero of a sparse in a cell', (f) => f.set(['c', 'c{1}', 'c{1}(1,3)'], '10', 'double', '10'), [ + 'S.c{1}(1,3) = 10;', +]); +add('sparse_rename_delete_add', SPARSE, 'a sparse renamed, a sparse Parameter deleted, a variable added', (f) => { + f.rename('spTall', 'spTallR'); + f.remove('pSp'); + f.add('var'); +}, ["S = renameStructField(S, 'spTall', 'spTallR');", "S = rmfield(S, 'pSp');", 'S.var = 0;']); + +// ---- a file with no subsystem --------------------------------------------------------- +add( + 'nosubsystem_edit_add', + COMPLEX_INF, + 'a file with no subsystem: an element edited, a variable renamed, one added after the last', + (f) => { + f.set(['zInfRow', 'zInfRow(2)'], 'Inf', 'double', 'Inf'); + f.rename('zInf', 'zInfR'); + f.add('var'); + }, + ['S.zInfRow(2) = Inf;', "S = renameStructField(S, 'zInf', 'zInfR');", 'S.var = 0;'], +); + +// ---- an edit beside an empty, which the save writes fresh without its being touched --- +crafted.set(NESTED_EMPTIES, nestedEmpties()); +zero('zero_nested_empties', NESTED_EMPTIES, 'a save with no edit is the file (and MATLAB loads the assembled file)'); +add( + 'sibling_struct_field', + NESTED_EMPTIES, + 'a struct field edited beside an empty complex and an empty struct with a field, both written fresh with it', + (f) => f.set(['s', 'x'], '2', 'double', '2'), + ['S.s.x = 2;'], +); +add( + 'sibling_cell_member', + NESTED_EMPTIES, + 'a cell member edited beside an empty complex and an empty struct with a field, both written fresh with it', + (f) => f.set(['c', 'c{3}'], '9', 'double', '9'), + ['S.c{3} = 9;'], +); + +crafted.set(EMPTIES_MORE, emptiesMore()); +zero('zero_empties_more', EMPTIES_MORE, 'a save with no edit is the file (and MATLAB loads the assembled file)'); +add( + 'sibling_cell_two_fields', + EMPTIES_MORE, + 'a cell member edited beside a struct of no element with two fields, written fresh with it', + (f) => f.set(['c2', 'c2{2}'], '9', 'double', '9'), + ['S.c2{2} = 9;'], +); +add('fresh_complex_single_0x3', EMPTIES_MORE, 'every plain variable written fresh: complex(zeros(0,3,\'single\')), and the rest of the file', (f) => f.freshAll(), [], 'unchanged'); +add( + 'sibling_complex_single_0x3', + EMPTIES_MORE, + "a struct field edited beside complex(zeros(0,3,'single')), written fresh with it", + (f) => f.set(['sz', 'x'], '2', 'double', '2'), + ['S.sz.x = 2;'], +); +add( + 'struct_array_nested_empty', + EMPTIES_MORE, + "a field of a struct array's element edited beside an empty struct with a field in each element", + (f) => f.set(['sa', 'sa(2)', 'x'], '5', 'double', '5'), + ['S.sa(2).x = 5;'], +); +add('global_element', EMPTIES_MORE, 'an element of a variable saved as global: written fresh, and still global', (f) => f.set(['g', 'g(2)'], '7', 'double', '7'), [ + 'S.g(2) = 7;', +]); +add( + 'negative_zero_parts', + EMPTIES_MORE, + 'an element of a complex row edited beside elements whose zero parts are -0, which keep their sign', + (f) => f.set(['nz', 'nz(2)'], '5', 'double', '5'), + ['S.nz(2) = 5;'], +); + +// ---- variables saved as global: written fresh, still global ----------------------------- +zero('zero_global_v7', GLOBAL_V7, 'a save with no edit is the file'); +zero('zero_global_v6', GLOBAL_V6, 'a save with no edit is the file'); +add('global_v7_element', GLOBAL_V7, 'an element of a global double: written fresh, and still global', (f) => f.set(['gD', 'gD(2)'], '20', 'double', '20'), [ + 'S.gD(2) = 20;', +]); +add( + 'global_v7_struct_field', + GLOBAL_V7, + 'a field of a global struct: the struct written fresh, global, and nothing nested in it global', + (f) => f.set(['gS', 'a'], '5', 'double', '5'), + ['S.gS.a = 5;'], +); +add('global_v6_cell_member', GLOBAL_V6, 'a member of a global cell in a -v6 file: still global, still uncompressed', (f) => f.set(['gC', 'gC{1}'], '40', 'double', '40'), [ + 'S.gC{1} = 40;', +]); +add('global_v6_int16', GLOBAL_V6, 'a global int16 typed into, which keeps its class and stays global', (f) => f.set(['gI'], '-8', 'int16', '-8'), [ + 'S.gI = int16(-8);', +]); +add('fresh_global_v7', GLOBAL_V7, 'every plain variable written fresh: the globals stay global, the other stays not', (f) => f.freshAll(), [], 'unchanged'); +add( + 'global_rename_delete_add', + GLOBAL_V7, + 'a global renamed (its bytes, renamed), another deleted, a field of a third edited, a variable added (not global)', + (f) => { + f.rename('gD', 'gD2'); + f.remove('gI'); + f.set(['gS', 'a'], '6', 'double', '6'); + f.add('var'); + }, + ["S = renameStructField(S, 'gD', 'gD2');", "S = rmfield(S, 'gI');", 'S.gS.a = 6;', 'S.var = 0;'], +); + +// ---- function handles, enumerations, fi, categorical, table ------------------------- +add( + 'rename_fhandles', + OPAQUE, + 'a named and an anonymous function handle renamed', + (f) => { + f.rename('fh_sin', 'sinHandle'); + f.rename('fh_anon', 'anonHandle'); + }, + ["S = renameStructField(S, 'fh_sin', 'sinHandle');", "S = renameStructField(S, 'fh_anon', 'anonHandle');"], +); +add( + 'delete_fhandles', + OPAQUE, + 'an anonymous and an empty function handle deleted', + (f) => { + f.remove('fh_anon'); + f.remove('e_func_handle_none'); + }, + ["S = rmfield(S, {'fh_anon', 'e_func_handle_none'});"], +); +add( + 'rename_opaque_objects', + OPAQUE, + 'an enumeration, a Parameter holding one, a fi, a categorical and a table renamed', + (f) => ['en_on', 'p_enum', 'fi_vec', 'cat_ab', 'tbl_2x2'].forEach((n) => f.rename(n, n + 'R')), + ['en_on', 'p_enum', 'fi_vec', 'cat_ab', 'tbl_2x2'].map((n) => `S = renameStructField(S, '${n}', '${n}R');`), +); +add( + 'delete_opaque_objects_add', + OPAQUE, + 'an enumeration vector, a categorical and a table deleted, a variable added', + (f) => { + f.remove('en_sl_vec'); + f.remove('cat_ab'); + f.remove('tbl_2x2'); + f.add('var'); + }, + ["S = rmfield(S, {'en_sl_vec', 'cat_ab', 'tbl_2x2'});", 'S.var = 0;'], +); + +// ---- objects and strings held in the subsystem --------------------------------------- +add( + 'nested_objects_rename', + NESTED, + 'Parameters, strings, a missing string and structs and cells holding objects, renamed', + (f) => ['s', 'c', 'pTop', 'strTop', 'missTop', 'busTop', 'cArr'].forEach((n) => f.rename(n, n + 'R')), + ['s', 'c', 'pTop', 'strTop', 'missTop', 'busTop', 'cArr'].map((n) => `S = renameStructField(S, '${n}', '${n}R');`), +); +add( + 'nested_objects_delete_add', + NESTED, + 'a Parameter, a Bus, a string matrix and a cell of objects deleted, a variable added', + (f) => { + ['qTop', 'busTop', 'strsTop', 'cArr'].forEach((n) => f.remove(n)); + f.add('var'); + }, + ["S = rmfield(S, {'qTop', 'busTop', 'strsTop', 'cArr'});", 'S.var = 0;'], +); +add( + 'strings_mixed_rename', + STR_MIXED, + 'a string and a Parameter beside it renamed', + (f) => { + f.rename('mixStr', 'mixStr2'); + f.rename('mixParam', 'mixParam2'); + }, + ["S = renameStructField(S, 'mixStr', 'mixStr2');", "S = renameStructField(S, 'mixParam', 'mixParam2');"], +); +add('strings_mixed_delete', STR_MIXED, 'the Parameter before a string deleted', (f) => f.remove('mixParam'), [ + "S = rmfield(S, 'mixParam');", +]); +add( + 'strings_rename_delete', + STRINGS, + 'strings of astral and non-ASCII text renamed, another deleted', + (f) => { + f.rename('sAstral', 'sAstralR'); + f.rename('sUnicode', 'sUnicodeR'); + f.remove('sScalar'); + }, + ["S = renameStructField(S, 'sAstral', 'sAstralR');", "S = renameStructField(S, 'sUnicode', 'sUnicodeR');", "S = rmfield(S, 'sScalar');"], +); +add( + 'dag_rename_add', + DAG, + 'a handle DAG, one object held twice at every level, renamed; a variable added', + (f) => { + f.rename('root', 'rootR'); + f.add('var'); + }, + ["S = renameStructField(S, 'root', 'rootR');", 'S.var = 0;'], +); + +// ---- -v6 files: no compressed record, before or after --------------------------------- +add( + 'v6_handles_edit', + V6_HANDLES, + 'a -v6 file of function handles: one renamed, one deleted, a variable added', + (f) => { + f.rename('s_fh', 's_fh2'); + f.remove('c_fh'); + f.add('var'); + }, + ["S = renameStructField(S, 's_fh', 's_fh2');", "S = rmfield(S, 'c_fh');", 'S.var = 0;'], +); +add( + 'v6_hexobj_edit', + V6_HEXOBJ, + 'a -v6 file of objects: a value and a cell member beside a 10000000x2 sparse edited, an object renamed, another deleted, a variable added', + (f) => { + f.set(['control'], '[1 2 3]', 'double', '[1 2 3]'); + f.set(['cTall', 'cTall{2}'], '3', 'double', '3'); + f.rename('anonAlias', 'anonAliasR'); + f.remove('holder'); + f.add('var'); + }, + [ + 'S.control = [1 2 3];', + 'S.cTall{2} = 3;', + "S = renameStructField(S, 'anonAlias', 'anonAliasR');", + "S = rmfield(S, 'holder');", + 'S.var = 0;', + ], +); + +// ---- negative controls: the comparison must see each of these ------------------------ +control('control_value', CASES_MAT, 'a value the save did not write', (f) => f.set(['kp'], '7', 'double', '7'), ['S.kp = 8;'], 'kp: 8 vs 7'); +control('control_class', CASES_MAT, 'the same number in another class', (f) => f.set(['s_int16'], '9', 'int16', '9'), ['S.s_int16 = 9;'], 's_int16: class double vs int16'); +control('control_complexity', CASES_MAT, 'the same number, complex', (f) => f.set(['scalarD'], '2', 'double', '2'), ['S.scalarD = complex(2, 0);'], 'scalarD: real 0 vs 1'); +control( + 'control_object_property', + CASES_MAT, + "a Parameter's Value, two levels into the comparison", + (f) => f.rename('aParam', 'renamedParam'), + ["S = renameStructField(S, 'aParam', 'renamedParam');", 'S.renamedParam.Value = 6;'], + 'renamedParam(1).Value', +); +control( + 'control_nested_property', + CASES_MAT, + "a Parameter's CoderInfo.StorageClass, three levels in", + (f) => f.rename('aParam', 'renamedParam'), + ["S = renameStructField(S, 'aParam', 'renamedParam');", "S.renamedParam.CoderInfo.StorageClass = 'ExportedGlobal';"], + 'renamedParam(1).CoderInfo(1).StorageClass', +); +control( + 'control_string', + CASES_MAT, + 'a string the save did not write', + (f) => f.rename('strScalar', 'str2'), + ["S = renameStructField(S, 'strScalar', 'str2');", 'S.str2 = "other";'], + 'str2: "other" vs "world"', +); +control( + 'control_order', + CASES_MAT, + 'the variables in another order', + (f) => f.rename('kp', 'kpR'), + ["S = renameStructField(S, 'kp', 'kpR');", 'S = orderfields(S);'], + 'variables [', +); +control( + 'control_field_order', + CASES_MAT, + "a struct's fields in another order", + (f) => f.addField(['structScalar'], 'field'), + ['S.structScalar.field = 0;', 'S.structScalar = orderfields(S.structScalar, [3 1 2]);'], + 'structScalar: fields [field,a,b] vs [a,b,field]', +); +control( + 'control_handle_sharing', + DAG, + "one object held twice made two equal objects: the values agree, the sharing does not", + (f) => f.rename('root', 'rootR'), + ["S = renameStructField(S, 'root', 'rootR');", 'k = S.rootR.Kids(1); n = DagNode; n.Tag = k.Tag; n.Kids = k.Kids; S.rootR.Kids = [k n];'], + 'handle sharing differs', +); +control( + 'control_anonymous_handle', + OPAQUE, + "an anonymous function handle's text", + (f) => f.rename('fh_anon', 'anonHandle'), + ["S = renameStructField(S, 'fh_anon', 'anonHandle');", 'S.anonHandle = @(x)x.^2+2;'], + 'anonHandle: @(x)x.^2+2 vs @(x)x.^2+1', +); +control( + 'control_enum', + OPAQUE, + 'an enumeration member', + (f) => f.rename('en_on', 'en_onR'), + ["S = renameStructField(S, 'en_on', 'en_onR');", 'S.en_onR = matlab.lang.OnOffSwitchState.off;'], + 'en_onR: off vs on', +); +control( + 'control_negative_zero', + EMPTIES_MORE, + "a complex zero's -0 parts made +0, which isequaln does not see and the bits do", + (f) => f.set(['nz', 'nz(2)'], '5', 'double', '5'), + ['S.nz(2) = 5;', 'S.nz(3) = complex(0, 0);'], + 'nz: equal, but not bit for bit', +); +control( + 'control_categorical', + OPAQUE, + 'a categorical, which has no public property, so only isequaln sees it', + (f) => f.rename('cat_ab', 'cat_abR'), + ["S = renameStructField(S, 'cat_ab', 'cat_abR');", 'S.cat_abR(1) = S.cat_abR(2);'], + 'cat_abR: isequaln false', +); + +// ---- run ------------------------------------------------------------------------------ +const originals = new Map(); +function original(rel) { + let dest = originals.get(rel); + if (!dest) { + // A copy, so nothing MATLAB does can touch a tracked fixture. + dest = OUT + '/orig_' + rel.replace(/[\\/]/g, '_'); + if (crafted.has(rel)) { + writeFileSync(dest, crafted.get(rel)); + } else { + copyFileSync(REPO + rel, dest); + } + originals.set(rel, dest); + } + return dest; +} + +const manifest = []; +let saved = 0; +let refused = 0; +let jsFailed = 0; +for (const c of CASES) { + const rec = { + id: c.id, + fixture: c.file, + original: original(c.file), + saved: '', + statements: c.matlab, + expect: c.expect, + differs: c.differs, + plain: false, + why: c.why, + refused: '', + js: '', + notes: '', + }; + manifest.push(rec); + const input = new Uint8Array(bytesOf(c.file)); + const plainBefore = parseMat(input.buffer.slice(0)).records.every((r) => !r.compressed); + rec.plain = plainBefore; + let f; + try { + // So that "stays uncompressed" below is asked of the files it is about. + if ((c.file === V6_HANDLES || c.file === V6_HEXOBJ) && !plainBefore) { + throw new Error(c.file + ' holds a compressed record: it is not the -v6 file this case needs'); + } + f = opened(c.file); + c.edit(f); + } catch (e) { + rec.js = 'the edit: ' + e.message; + jsFailed++; + continue; + } + let out; + try { + out = f.session.serializeSource(f.name); + } catch (e) { + rec.refused = e.message; + refused++; + continue; + } + const problems = []; + if (!out || out.kind !== 'binary' || out.sourceFormat !== 'mat') { + rec.js = 'serializeSource answered ' + JSON.stringify(out && { kind: out.kind, sourceFormat: out.sourceFormat }); + jsFailed++; + continue; + } + const bytes = out.bytes; + rec.saved = OUT + '/saved_' + c.id + '.mat'; + writeFileSync(rec.saved, bytes); + saved++; + if (c.expect === 'identical' && !sameBytes(bytes, input)) { + problems.push('a save with no edit is not the file, byte for byte'); + } + if (c.expect !== 'identical' && sameBytes(bytes, input)) { + problems.push('a save with an edit is the file, byte for byte'); + } + const after = parseMat(bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)); + if (plainBefore && !after.records.every((r) => !r.compressed)) { + problems.push('a file of no compressed record saved with one: ' + after.records.filter((r) => r.compressed).map((r) => r.name).join(',')); + } + const before = checkMatFile(input); + const added = before.length === 0 ? checkMatFile(bytes) : violationsAdded(before, checkMatFile(bytes)); + if (added.length > 0) { + problems.push('the checker finds what the file did not have: ' + added.map((v) => v.code + ' ' + v.message).join('; ')); + } + rec.js = problems.join('; '); + if (problems.length > 0) { + jsFailed++; + } + rec.notes = [...f.notes, bytes.byteLength + ' bytes (' + input.byteLength + ' read)'].join('; '); +} + +writeFileSync(OUT + '/manifest.json', JSON.stringify(manifest, null, 2)); +for (const r of manifest) { + const verdict = r.js ? 'JSFAIL ' + r.js : r.refused ? 'REFUSED ' + r.refused : 'saved'; + console.log(r.id.padEnd(28) + ' ' + verdict); +} +console.log(`PROBE_MAT_WRITEBACK_JS cases=${manifest.length} saved=${saved} refused=${refused} jsfail=${jsFailed} out=${OUT}`); diff --git a/test/parseWarnings.test.ts b/test/parseWarnings.test.ts index e6440cfa..9bc05604 100644 --- a/test/parseWarnings.test.ts +++ b/test/parseWarnings.test.ts @@ -67,6 +67,9 @@ import { const TEST_ROOT = fileURLToPath(new URL('./', import.meta.url)); const ARTIFACTS = join(TEST_ROOT, 'parity', 'artifacts'); const FIXTURES = join(TEST_ROOT, 'fixtures'); +// Copies of MATLAB-written files edited to break MATLAB's load rules on purpose, each with +// MATLAB's verdict (test/matFileCheck.test.ts): no corpus of complete files, so not swept here. +const MAT_CHECK = join(FIXTURES, 'mat-check'); function bytesAt(abs: string): ArrayBuffer { const u8 = new Uint8Array(readFileSync(abs)); @@ -133,7 +136,7 @@ describe('the whole fixture corpus parses with no warnings at all', () => { // the whole channel worthless. It is asserted over the enumerated corpus rather // than a hand-listed sample so that a new fixture is covered by default. const files = [...filesUnder(ARTIFACTS), ...filesUnder(FIXTURES)] - .filter((f) => /\.(slx|mdl|mat)$/i.test(f)) + .filter((f) => /\.(slx|mdl|mat)$/i.test(f) && !f.startsWith(MAT_CHECK)) .sort(); // An empty or mis-filtered list would pass the assertion below vacuously. These diff --git a/test/sessionSerializeSource.test.ts b/test/sessionSerializeSource.test.ts index 45384cd1..6a377bcf 100644 --- a/test/sessionSerializeSource.test.ts +++ b/test/sessionSerializeSource.test.ts @@ -128,20 +128,31 @@ describe('session.serializeSource', () => { }); it('returns null for a read-only format instead of throwing', () => { - // .slx / .mdl / .mat / .prj have no write path at all (see docs/TODO.md, "Not - // gaps"). A consumer enumerating every open source must not need a try/catch per - // source to find that out, and must never be handed bytes that only look like a - // file — ModelNode.serialize(), for one, returns a summary object, not a model. + // .slx / .mdl / .prj have no write path at all (see docs/TODO.md, "Not gaps"). A + // consumer enumerating every open source must not need a try/catch per source to + // find that out, and must never be handed bytes that only look like a file — + // ModelNode.serialize(), for one, returns a summary object, not a model. const s = createSession(); s.addModelSource('model_with_refs.slx', bytes('model_with_refs.slx')); - s.addMatSource('strings.mat', bytes('strings.mat')); s.addProjectSource('MyProj.prj', PRJ_STORE); expect(s.serializeSource('model_with_refs.slx')).toBeNull(); - expect(s.serializeSource('strings.mat')).toBeNull(); expect(s.serializeSource('MyProj.prj')).toBeNull(); }); + it('answers a MAT-file with its bytes, which unedited are the file it was read from', () => { + // A `.mat` is written as its own records, what was edited written fresh + // (test/matFileSave.test.ts holds every edit to that), so with nothing edited it is + // the file, byte for byte. + const s = createSession(); + const input = bytes('strings.mat'); + s.addMatSource('strings.mat', input); + + const out = s.serializeSource('strings.mat')!; + expect([out.kind, out.sourceFormat]).toEqual(['binary', 'mat']); + expect(out.kind === 'binary' ? [...out.bytes] : null).toEqual([...new Uint8Array(input)]); + }); + it('returns null for a srcId the session does not hold', () => { // Same answer as getDataSource for the same question, so a caller has one rule. const s = createSession(); diff --git a/test/sparseDamaged.test.ts b/test/sparseDamaged.test.ts index da222238..8dc51b26 100644 --- a/test/sparseDamaged.test.ts +++ b/test/sparseDamaged.test.ts @@ -152,8 +152,11 @@ describe('a damaged column count in an MCOS-held sparse array opens, as what its ['Value(9999999,2)', '8', false], ], ]); - // Not hex: the rows are read-only for this array's own sake, and say why. - expect(value.children[0].setProperty('Value', '9')).toMatchObject({ error: true, reason: expect.stringMatching(/cannot be written once edited/) }); + // Not hex: the rows are read-only for this array's own sake (_sparseRefusal), and in a .mat for + // its object's too, which the file's save writes as it was read: the file says so first + // (MatNode._editRefusal). + expect(value._sparseRefusal()).toEqual(expect.any(String)); + expect(value.children[0].setProperty('Value', '9')).toMatchObject({ error: true, reason: expect.stringMatching(/^Cannot edit "pTall": it is a Simulink\.Parameter/) }); expect(mat.warnings?.map((w: any) => w.part)).toEqual(['pTall.Value']); // A copy into a dictionary: its Value is the element it was read from. const copied = JSON.parse(JSON.stringify(pTall.serializeValue()))._elements[0]._properties.Value; @@ -245,10 +248,13 @@ describe('a sparse MCOS property of a class nothing writes sparse shows what its ['Value(9999999,2)', '8', false], ], ]); - // Not hex: read-only because nothing could write an edit of an int8 sparse array. + // Not hex: read-only because nothing could write an edit of an int8 sparse array + // (_sparseRefusal), and in a .mat because its save writes the object as it was read, which + // the refusal says first (MatNode._editRefusal). + expect(pTall._valueNode._sparseRefusal()).toBe('no sparse MAT class for "int8"'); expect(pTall._valueNode.children[0].setProperty('Value', '9')).toMatchObject({ error: true, - reason: expect.stringMatching(/no sparse MAT class for "int8"/), + reason: expect.stringMatching(/^Cannot edit "pTall": it is a Simulink\.Parameter/), }); const copied = JSON.parse(JSON.stringify(pTall.serializeValue()))._elements[0]._properties.Value; expect(copied._type).toBe('cdata'); diff --git a/test/sparseFixtures.test.ts b/test/sparseFixtures.test.ts index 6bcb6f84..6c7dc3cc 100644 --- a/test/sparseFixtures.test.ts +++ b/test/sparseFixtures.test.ts @@ -36,6 +36,7 @@ import { fileURLToPath } from 'node:url'; import { loadFile } from './parity/loadFile.js'; import { nodeAt } from './tools/matlabPath.js'; import { parseComplexNum } from '../src/datamodel/parser/XmlUtils.js'; +import { parseMat } from '../src/datamodel/parser/MatParser.js'; import { uudecode } from '../src/datamodel/parser/CdataCodec.js'; import { matStreamPrefix } from '../src/datamodel/parser/EncodedValue.js'; import { readMxArrayRecords } from '../src/datamodel/parser/MxArrayParser.js'; @@ -128,9 +129,21 @@ function columnMajor(node: any, size: number[]): unknown[] { const numberText = (n: number): string => (Number.isNaN(n) ? 'NaN' : n === Infinity ? 'Inf' : n === -Infinity ? '-Inf' : String(n)); +/** + * `re` with the sign of its zero, which a truth's JSON cannot carry (numberOf), as MATLAB's own + * bytes hold it: the non-zero `k` of `path` in sparse_values.mat, which MATLAB wrote. Its `-3i` + * is complex(-0, -3), and its real part reads `-0`, as a binary dictionary's `-0.0-3.0i` reads. + */ +const MATLAB_MAT = parseMat(new Uint8Array(readFileSync(fileURLToPath(new URL('./fixtures/sparse/sparse_values.mat', import.meta.url)))).buffer as ArrayBuffer); +function signedZero(path: string, k: number, re: number): number { + const v = MATLAB_MAT.variables.find((x) => x.name === path); + return re === 0 && v?.sparse && Object.is(v.sparse.re[k], -0) ? -0 : re; +} + function elementText(t: ValueTruth, re: number, im: number): string { if (t.class === 'logical') return re ? 'true' : 'false'; - if (!t.isreal) return numberText(re) + (im >= 0 ? '+' : '') + numberText(im) + 'i'; + // A real part of -0 is shown as it is (XmlUtils.shownComplexText), an imaginary one with a `+`. + if (!t.isreal) return (Object.is(re, -0) ? '-0' : numberText(re)) + (im >= 0 ? '+' : '') + numberText(im) + 'i'; return numberText(re); } @@ -202,7 +215,7 @@ function expectNonzeroRows(node: any, t: ValueTruth, label: string): void { // a complex one's `re+imi`, in this package's spelling of the numbers MATLAB recorded. expect([c.className, c.displayValue], `${label} row ${k + 1} shown`).toEqual([ t.class, - elementText(t, numberOf(nz.real[k]), numberOf(nz.imag[k])), + elementText(t, signedZero(label.slice(label.indexOf(' ') + 1), k, numberOf(nz.real[k])), numberOf(nz.imag[k])), ]); }); expect(node.children.length, `${label} nnz`).toBe(t.nnz); @@ -217,14 +230,13 @@ const isValueTruth = (t: PathTruth): boolean => 'real' in t || 'fullOmitted' in const OMITTED_AT_DEFAULT = new Set(['text numAlias.K']); // Where two venues spell one value differently on screen, and why. Not ours to change -// here: both are about how a FULL value is written, which this suite holds only as the -// dense control beside each sparse one. +// here: it is about how a FULL value is written, which this suite holds only as the dense +// control beside each sparse one. +// +// No longer dComplex's complex(-0, -3): the binary dictionary's text `-0.0-3.0i` reads `-0-3i`, +// and the same -0 read out of MAT bytes, the .mat's and the text dictionary's stream, keeps its +// sign too (SparseData.complexElement), where it printed as 0 and was written again as 0. const SPELLED_DIFFERENTLY: Record = { - // MATLAB's binary dictionary writes the element complex(-0, -3) as `-0.0-3.0i`, and this - // package's complex text keeps the sign; the .mat and the text dictionary's cdata hold - // the same -0 as a double, which prints as 0. The numbers are equal (the per-venue check - // above says so); the spelling of the zero is not. - dComplex: 'binary -0-3i, elsewhere 0-3i', // OMITTED_AT_DEFAULT: the text dictionary has no K. numAlias: 'text has no K', }; @@ -698,8 +710,10 @@ describe('a sparse array\'s rows are its non-zeros, and it has no Variable Edito expect([node.canAddChild(), node.canRemoveChild(), node.valueEditable], path).toEqual([false, false, false]); for (const row of node.children) { // Hex-backed values are read-only through and through, and so are a text dictionary's - // MAT streams (the C-012 ruling, 2026-10-15); the rest edit as before. - expect(row.valueEditable, `${path} ${row.displayName}`).toBe(venue.name !== 'binary' && venue.name !== 'text'); + // MAT streams (the C-012 ruling, 2026-10-15), and a .mat's object, which its save writes + // as it was read (MatNode._editRefusal); the rest edit as before. + const inMatObject = venue.name === 'mat' && !(row.owningEntry instanceof MatlabVariableNode); + expect(row.valueEditable, `${path} ${row.displayName}`).toBe(venue.name !== 'binary' && venue.name !== 'text' && !inMatObject); } } }); diff --git a/test/sparseMemberBytes.test.ts b/test/sparseMemberBytes.test.ts index 16c4e0d2..da3df48e 100644 --- a/test/sparseMemberBytes.test.ts +++ b/test/sparseMemberBytes.test.ts @@ -35,9 +35,15 @@ const HEAVY_TIMEOUT = 60_000; describe('a sparse member nothing has edited is written as the bytes it was read from', () => { it('in a cell out of a .mat, and an edited member alone is encoded again', () => { const members = [real(), bare(), real()]; - const c: any = createSession().addMatSource('c.mat', matFile([cellVar('c', members)])).children[0]; + const mat: any = createSession().addMatSource('c.mat', matFile([cellVar('c', members)])); + const c: any = mat.children[0]; expect(encodeMatStream(c._var)).toEqual(new Uint8Array(streamOf(cellVar('', members)))); // An element row of the first edited: that member is its non-zeros, the others their bytes. + // Taken out of the .mat to be edited: the damaged member is stored as MATLAB does not load + // it, so the file takes no edit of the cell (MatFileWriter.freshRefusal); on its own, the node + // takes it. + expect(c.children[0].children[1].setProperty('Value', '9')).toMatchObject({ error: true }); + mat.removeChild(c); expect(c.children[0].children[1].setProperty('Value', '9')).toBe(true); const edited = encodeMatStream(c._var); const back = decodeMatStream(edited); diff --git a/test/tools/matElements.ts b/test/tools/matElements.ts new file mode 100644 index 00000000..8f492ecd --- /dev/null +++ b/test/tools/matElements.ts @@ -0,0 +1,305 @@ +// Copyright 2026 The MathWorks, Inc. +// +// What a Level-5 miMATRIX element holds, read straight off its bytes by a walker of its own, +// with no help from the package's reader (MatParser) or writer (MatWriter). A test that compares +// the variable a save wrote with the one the file held through the package's own reader sees +// only what that reader keeps: a struct array of no element read as `fields: {}`, so a save +// that wrote its field-name table empty read back as the variable it was read as, and MATLAB +// loaded a struct of no field (test/parity/matlab/matWritebackDefects.test.ts). This reads every +// part of the element MATLAB's `load` reads for a plain value, so that two elements are the same +// value exactly when what it gives them is the same. +// +// What it keeps of an element, `ElementValue`: +// - the array class and the flags byte's complex, global, logical and sparse bits, and the +// dims; +// - a struct's (or a class-3 object's) field names, in order, from its field-name table, +// whatever its stride, and an object's class name; +// - the members of a cell, and of a struct, element by element and field by field, each the +// same way; +// - a numeric array's elements, as its class holds them whatever type the file stored them +// in (MATLAB narrows a double's storage to the smallest integer type that holds it): +// a double or a single as the bits of its IEEE value, so -0 is not 0, and NaN as `NaN` +// whatever its payload (see `nan`); an integer as its exact decimal, int64 and uint64 +// included; complex parts apart; +// - a char's UTF-16 code units, however the file stored them (miUTF8, miUTF16, miUINT16, +// miUINT8); +// - a sparse array's row index, column starts and non-zeros, nzmax apart (the capacity +// MATLAB reserves, not the value). +// A class-17 (MCOS opaque) element is kept as its bytes: no save writes one fresh. + +export interface ElementValue { + cls: number; + complex: boolean; + global: boolean; + logical: boolean; + sparse: boolean; + dims: number[]; + name: string; + className?: string; + fields?: string[]; + members?: ElementValue[]; + re?: string[]; + im?: string[]; + text?: number[]; + ir?: number[]; + jc?: number[]; + opaque?: number[]; +} + +const MI_INT8 = 1; +const MI_UINT8 = 2; +const MI_INT16 = 3; +const MI_UINT16 = 4; +const MI_INT32 = 5; +const MI_UINT32 = 6; +const MI_SINGLE = 7; +const MI_DOUBLE = 9; +const MI_INT64 = 12; +const MI_UINT64 = 13; +const MI_MATRIX = 14; +const MI_UTF8 = 16; +const MI_UTF16 = 17; + +const CELL = 1; +const STRUCT = 2; +const OBJECT = 3; +const CHAR = 4; +const SPARSE = 5; +const DOUBLE = 6; +const SINGLE = 7; +const INT64 = 14; +const UINT64 = 15; +const OPAQUE = 17; + +interface Sub { + type: number; + data: Uint8Array; + next: number; +} + +// One data element at `at`: its type, its data, and where the next one starts. The small form +// packs type and length into one word and its data into the next; the long one pads to 8. +function subAt(view: DataView, bytes: Uint8Array, at: number): Sub { + const word = view.getUint32(at, true); + if (word >>> 16) { + const n = word >>> 16; + return { type: word & 0xffff, data: bytes.subarray(at + 4, at + 4 + n), next: at + 8 }; + } + const n = view.getUint32(at + 4, true); + return { type: word, data: bytes.subarray(at + 8, at + 8 + n), next: at + 8 + Math.ceil(n / 8) * 8 }; +} + +// What NaN is kept as. A NaN's payload is not compared: this package's reader holds a double as +// a JavaScript number, and V8 does not promise a NaN's payload through one (it may hand back +// the canonical NaN), so a payload is not something a save of a value read here can be held to. +// MATLAB's own arithmetic makes the canonical NaN; a file holding another is MATLAB's own write +// of a value someone built bit by bit. +const nan = 'NaN'; + +function bitsOf64(x: number): string { + if (Number.isNaN(x)) { + return nan; + } + const b = new DataView(new ArrayBuffer(8)); + b.setFloat64(0, x, true); + return b.getBigUint64(0, true).toString(16); +} + +function bitsOf32(x: number): string { + if (Number.isNaN(x)) { + return nan; + } + const b = new DataView(new ArrayBuffer(4)); + b.setFloat32(0, x, true); + return b.getUint32(0, true).toString(16); +} + +// The elements a data element holds, as numbers, or as bigints for the 64-bit integer types. +function numbersOf(sub: Sub): (number | bigint)[] { + const v = new DataView(sub.data.buffer, sub.data.byteOffset, sub.data.byteLength); + const out: (number | bigint)[] = []; + const each = (size: number, read: (at: number) => number | bigint) => { + for (let at = 0; at + size <= sub.data.byteLength; at += size) { + out.push(read(at)); + } + }; + switch (sub.type) { + case MI_INT8: + each(1, (at) => v.getInt8(at)); + break; + case MI_UINT8: + case MI_UTF8: + each(1, (at) => v.getUint8(at)); + break; + case MI_INT16: + each(2, (at) => v.getInt16(at, true)); + break; + case MI_UINT16: + case MI_UTF16: + each(2, (at) => v.getUint16(at, true)); + break; + case MI_INT32: + each(4, (at) => v.getInt32(at, true)); + break; + case MI_UINT32: + each(4, (at) => v.getUint32(at, true)); + break; + case MI_SINGLE: + each(4, (at) => v.getFloat32(at, true)); + break; + case MI_DOUBLE: + each(8, (at) => v.getFloat64(at, true)); + break; + case MI_INT64: + each(8, (at) => v.getBigInt64(at, true)); + break; + case MI_UINT64: + each(8, (at) => v.getBigUint64(at, true)); + break; + default: + throw new Error('a numeric part of data type ' + sub.type); + } + return out; +} + +// A numeric part's elements as its class holds them (see the file header). +function partOf(sub: Sub, cls: number): string[] { + return numbersOf(sub).map((x) => { + if (cls === DOUBLE) { + return bitsOf64(Number(x)); + } + if (cls === SINGLE) { + return bitsOf32(Number(x)); + } + return typeof x === 'bigint' ? x.toString() : cls === INT64 || cls === UINT64 ? BigInt(x).toString() : String(x); + }); +} + +// A char's UTF-16 code units: miUTF8 decoded, every other type one unit per element. +function codeUnitsOf(sub: Sub): number[] { + if (sub.type === MI_UTF8) { + const text = new TextDecoder().decode(sub.data); + return Array.from({ length: text.length }, (_, i) => text.charCodeAt(i)); + } + return numbersOf(sub).map(Number); +} + +const textOf = (data: Uint8Array) => new TextDecoder().decode(data).replace(/\0+$/, ''); + +/** What the miMATRIX element whose tag is at `at` of `bytes` holds (see the file header). */ +export function elementValue(bytes: Uint8Array, at = 0): ElementValue { + const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); + const tag = subAt(view, bytes, at); + if (tag.type !== MI_MATRIX) { + throw new Error('not a matrix element (data type ' + tag.type + ')'); + } + const end = at + 8 + tag.data.byteLength; + let o = at + 8; + const next = () => { + const s = subAt(view, bytes, o); + o = s.next; + return s; + }; + const flags = next(); + const cls = flags.data[0]; + const out: ElementValue = { + cls, + complex: (flags.data[1] & 0x08) !== 0, + global: (flags.data[1] & 0x04) !== 0, + logical: (flags.data[1] & 0x02) !== 0, + // Class 5, or the sparse bit, which is all a sparse single has (MatWriter.encodeSparse). + sparse: cls === SPARSE || (flags.data[1] & 0x10) !== 0, + dims: [], + name: '', + }; + if (cls === OPAQUE) { + out.opaque = Array.from(bytes.subarray(at, end)); + return out; + } + const dims = next(); + const dv = new DataView(dims.data.buffer, dims.data.byteOffset, dims.data.byteLength); + for (let i = 0; i + 4 <= dims.data.byteLength; i += 4) { + out.dims.push(dv.getInt32(i, true)); + } + out.name = textOf(next().data); + const n = out.dims.reduce((a, b) => a * b, 1); + const members = (count: number) => { + const list: ElementValue[] = []; + for (let i = 0; i < count && o < end; i++) { + list.push(elementValue(bytes, o)); + o = subAt(view, bytes, o).next; + } + return list; + }; + if (cls === CELL) { + out.members = members(n); + } else if (cls === STRUCT || cls === OBJECT) { + if (cls === OBJECT) { + out.className = textOf(next().data); + } + const stride = next(); + const len = new DataView(stride.data.buffer, stride.data.byteOffset, 4).getInt32(0, true); + const names = next(); + out.fields = []; + for (let i = 0; len > 0 && i < names.data.byteLength; i += len) { + out.fields.push(textOf(names.data.subarray(i, i + len))); + } + out.members = members(n * out.fields.length); + } else if (cls === CHAR) { + out.text = o < end ? codeUnitsOf(next()) : []; + } else if (out.sparse) { + out.ir = numbersOf(next()).map(Number); + out.jc = numbersOf(next()).map(Number); + // A logical's non-zeros as the numbers they are, a double's and a single's as their bits. + const sparseCls = out.logical ? 9 : cls === SPARSE ? DOUBLE : cls; + out.re = o < end ? partOf(next(), sparseCls) : []; + if (out.complex) { + out.im = o < end ? partOf(next(), sparseCls) : []; + } + } else { + out.re = o < end ? partOf(next(), cls) : []; + if (out.complex) { + out.im = o < end ? partOf(next(), cls) : []; + } + } + return out; +} + +/** + * The first difference between two element values, as a path and what differs, or null when + * they are the same value. The element's own name is not compared: a top-level variable's is its + * record's, which the caller asks after; every member's is empty. + */ +export function elementDifference(was: ElementValue, is: ElementValue, at = ''): string | null { + const said = (what: string, a: unknown, b: unknown) => (at || 'the value') + ': ' + what + ' ' + JSON.stringify(a) + ' read, ' + JSON.stringify(b) + ' written'; + for (const key of ['cls', 'complex', 'global', 'logical', 'sparse', 'className'] as const) { + if (was[key] !== is[key]) { + return said(key, was[key], is[key]); + } + } + if (was.dims.join('x') !== is.dims.join('x')) { + return said('dims', was.dims, is.dims); + } + for (const key of ['fields', 're', 'im', 'text', 'ir', 'jc', 'opaque'] as const) { + if (JSON.stringify(was[key]) !== JSON.stringify(is[key])) { + return said(key, was[key], is[key]); + } + } + const a = was.members ?? []; + const b = is.members ?? []; + if (a.length !== b.length) { + return said('member count', a.length, b.length); + } + const fields = was.fields; + const n = was.dims.reduce((x, y) => x * y, 1); + for (let i = 0; i < a.length; i++) { + const where = fields + ? at + (n === 1 ? '' : '(' + (Math.floor(i / fields.length) + 1) + ')') + '.' + fields[i % fields.length] + : at + '{' + (i + 1) + '}'; + const d = elementDifference(a[i], b[i], where); + if (d) { + return d; + } + } + return null; +} diff --git a/test/unbackedBudgetVenues.test.ts b/test/unbackedBudgetVenues.test.ts index bb05bd0a..2d1be9c6 100644 --- a/test/unbackedBudgetVenues.test.ts +++ b/test/unbackedBudgetVenues.test.ts @@ -25,11 +25,13 @@ const HEAVY_TIMEOUT = 60_000; describe('within the budget, a sparse array stays sparse wherever it goes', () => { it('a host\'s 1x2e6 with three entries, 8 MB of index no data backs', { timeout: HEAVY_TIMEOUT }, () => { + // Each row its non-zero. None takes an edit: a host's parse carries no records, and a file + // opened without them is one no save can write (MatNode._fileRefusal). const h = hostMat(sparseHost([1, 2e6], [0, 0, 0], [0, 1e6, 2e6 - 1], [1, 2, 3])); expect(h.children.map((c: any) => [c.displayName, c.valueEditable])).toEqual([ - ['h(1,1)', true], - ['h(1,1000001)', true], - ['h(1,2000000)', true], + ['h(1,1)', false], + ['h(1,1000001)', false], + ['h(1,2000000)', false], ]); const [copied, ms] = timed(() => copyOf(h) as any); expect([copied._type, ms < 3000]).toEqual(['cdata', true]); diff --git a/test/unmodelledClassVariable.test.ts b/test/unmodelledClassVariable.test.ts index 2643f862..e44576ed 100644 --- a/test/unmodelledClassVariable.test.ts +++ b/test/unmodelledClassVariable.test.ts @@ -309,9 +309,12 @@ describe('a real value of a class the reader does not model is shown as not deco const s = structVar('s', ['a', 'b'], [{ a: damagedReal('', 0x12), b: five() }]); const mat = openedMat('nested.mat', [ok(), c, s, tail()]); // Before: c was `{null, 5}` with an editor, and c{1} and s.a each `null`, editable, of class unknown. + // The 5 beside each is as read, and takes no edit: a save of the file writes c and s fresh or + // not at all, and has nothing to write the element it did not decode from (MatNode._editRefusal). const [, cRow, sRow] = mat.children.map(row); - expect(cRow).toEqual(['c', '{<1x1 unknown, not decoded>, 5}', 'cell', false, [notDecoded('1', '1x1', 'unknown'), fiveRow('2')]]); - expect(sRow).toEqual(['s', '<1x1 struct>', 'struct', false, [notDecoded('a', '1x1', 'unknown'), fiveRow('b')]]); + const readOnlyFive = (name: string) => [name, '5', 'double', false, []]; + expect(cRow).toEqual(['c', '{<1x1 unknown, not decoded>, 5}', 'cell', false, [notDecoded('1', '1x1', 'unknown'), readOnlyFive('2')]]); + expect(sRow).toEqual(['s', '<1x1 struct>', 'struct', false, [notDecoded('a', '1x1', 'unknown'), readOnlyFive('b')]]); // The reader's warning names the element; it is the only one. expect(mat.warnings).toEqual([notModelled('c{1}'), notModelled('s.a')]); const [, cNode, sNode] = mat.children;