@renaiss-shipflow/cli 0.27.7 → 0.27.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,22 +14,80 @@ export declare function buildShipFlowHeader(project: string, issueNumber?: numbe
14
14
  /** What `pr sync --keep-conflicts` prints as the resolution recipe. NEVER
15
15
  * `git add -A`: the UNMERGED index state is the ONLY thing that makes git
16
16
  * refuse to commit a file still containing `<<<<<<<`, and `add -A` clears
17
- * exactly that. Stage the paths you actually resolved, then re-gate. */
18
- export declare const RESOLUTION_RECIPE: readonly string[];
17
+ * exactly that. Stage the paths you actually resolved, then re-gate.
18
+ *
19
+ * A FUNCTION of the base (issue #412, finding 3): the printed gate command has
20
+ * to carry `--base`, because the moment `git rebase --continue` commits the
21
+ * markers a bare `pr conflict-check` has nothing left to enumerate and reports
22
+ * clean. This is also what step 5 of `references/conflict-resolution.md` tells
23
+ * the agent to run, so the two now say the same thing.
24
+ *
25
+ * `root` anchors the printed `git add` (see `anchoredGit`) so it runs from a
26
+ * subdirectory too — the paths the operator substitutes come from the gate, and
27
+ * those are repo-root-relative. Injected, not probed, so the recipe stays pure. */
28
+ export declare function resolutionRecipe(baseRef: string, root?: string | null): readonly string[];
29
+ /** The ONE place the gate's re-check invocation is spelled (PR #434 review).
30
+ *
31
+ * `pr sync` printed a base-less `pr conflict-check` on both of its refusal
32
+ * paths while `resolutionRecipe` — three lines away, in the same
33
+ * command — threaded the base. That is the vacuous form this PR exists to stop
34
+ * recommending: it makes the operator re-resolve a base the caller already
35
+ * knows, and auto-resolution can land on a DIFFERENT ref than the one `pr sync`
36
+ * actually rebased onto, so the re-check would certify a tree against the wrong
37
+ * base. Every printed invocation now goes through here, so the base-less form
38
+ * can't reappear in one message while the others are correct. Where no concrete
39
+ * ref is in scope, pass the `origin/<base>` placeholder — never nothing. */
40
+ export declare function recheckCommand(baseRef: string): string;
41
+ /** A git command the operator can paste into ANY shell, at ANY depth in the
42
+ * worktree (PR #434 review, finding 2).
43
+ *
44
+ * The gate reports **repo-root-relative** paths — `gitPaths` pins its CWD to
45
+ * `repoToplevel()` so enumeration and grep share one frame of reference — so a
46
+ * printed `git add -- sub/app.ts` pasted from `sub/` resolves `sub/sub/app.ts`
47
+ * and dies with `could not open directory 'sub/sub/'`. `-C <root>` puts the
48
+ * printed command in the same frame the printed path is expressed in, which is
49
+ * the only way one string can be correct from every CWD. (Under the default
50
+ * `diff.relative=false` the un-anchored form was already wrong from a subdir;
51
+ * anchoring makes every printed path-bearing command runnable, not just this
52
+ * one.)
53
+ *
54
+ * Root unknown → print the plain form. A `git -C '' …` would be worse than no
55
+ * anchor, and a gate that cannot locate its own toplevel is already failing
56
+ * loudly for that reason. */
57
+ export declare function anchoredGit(root: string | null, args: string): string;
58
+ /** The repo root to anchor a PRINTED command to, or `null` when it can't be
59
+ * located. `repoToplevel()` throws by design (a gate that cannot find its tree
60
+ * has proved nothing); a *hint string* must never be the thing that crashes the
61
+ * process, so this degrades to the un-anchored form instead. */
62
+ export declare function printedRoot(): string | null;
19
63
  /** One conflict-marker line found in a tracked file. */
20
64
  export interface ConflictMarkerHit {
21
65
  path: string;
22
66
  line: number;
23
67
  text: string;
24
68
  }
69
+ /** What a `git grep -z -n` stream parse recovered.
70
+ *
71
+ * `hits` are the marker lines of files that carry a REAL conflict. `paths` is
72
+ * every path the parse read a well-formed record for — INCLUDING files whose
73
+ * only match was a bare `=======`. The two are deliberately different sets, and
74
+ * `paths` (never `hits`) is the parser's coverage claim: it is what the
75
+ * authoritative files-with-matches pass is checked against in
76
+ * `scanConflictMarkers`. Checking against `hits` instead would hard-block every
77
+ * push over any file containing a lone 7-equals line — the parser is *designed*
78
+ * not to trip on those, and `git grep -l` cannot tell one from a real conflict. */
79
+ export interface ConflictMarkerParse {
80
+ hits: ConflictMarkerHit[];
81
+ paths: string[];
82
+ }
25
83
  /** The `git grep -E` pattern for the four marker families git can leave behind
26
84
  * (`<<<<<<<`, `|||||||` in diff3 mode, `=======`, `>>>>>>>`). */
27
85
  export declare const CONFLICT_MARKER_PATTERN = "^(<{7}|\\|{7}|={7}|>{7})( |$)";
28
86
  /**
29
- * Parse `git grep -z -n` output into marker hits: a file counts as conflicted when
30
- * it has a `<<<<<<<` start **OR** a `>>>>>>>` end. A bare `=======` (or a lone
31
- * diff3 `|||||||`) never trips the gate on its own — that's the only line a
32
- * changelog or a rule of prose plausibly starts with.
87
+ * Parse `git grep -z -n` output: a file counts as conflicted when it has a
88
+ * `<<<<<<<` start **OR** a `>>>>>>>` end. A bare `=======` (or a lone diff3
89
+ * `|||||||`) never trips the gate on its own — that's the only line a changelog
90
+ * or a rule of prose plausibly starts with.
33
91
  *
34
92
  * This used to require BOTH arms (the "triad rule"), which let a half-resolved
35
93
  * file through: delete one arm, leave `<<<<<<< HEAD` behind, and since `git add`
@@ -49,8 +107,23 @@ export declare const CONFLICT_MARKER_PATTERN = "^(<{7}|\\|{7}|={7}|>{7})( |$)";
49
107
  * (PR #394 review). git prints colons in paths unquoted, so no colon-based
50
108
  * parse can be correct; NUL is the only unambiguous delimiter.
51
109
  *
110
+ * The walk is POSITIONAL, not a `split("\0")` field walk (issue #412, finding 1).
111
+ * A `split` treats fields as fixed pairs, so ONE extra NUL anywhere in the stream
112
+ * shifts parity for everything after it. A matched LINE can legitimately contain
113
+ * a NUL: git's binary heuristic only inspects the first 8000 bytes, so a >8 KB
114
+ * text file with an embedded NUL further in is scanned as text and printed
115
+ * verbatim. Measured: a `======= \0Y` line in a 9.9 KB file desynced the walk and
116
+ * dropped EVERY later file in sorted-path order — a victim with three live
117
+ * markers reported CLEAN. `--text` does not fix this; the NUL is still inside the
118
+ * matched line. Reading each field to its own terminator does: a path cannot
119
+ * contain a NUL (POSIX), so field 1 ends at the 1st NUL and field 2 at the 2nd,
120
+ * and a grep match is exactly one line, so the text ends at the next LF —
121
+ * whatever bytes it contains.
122
+ *
52
123
  * Pure + testable (`pr sync` shells out to gh+git and has no harness).
53
124
  */
125
+ export declare function parseConflictMarkerRecords(out: string): ConflictMarkerParse;
126
+ /** The marker hits alone — see `parseConflictMarkerRecords` for the coverage set. */
54
127
  export declare function parseConflictMarkerGrep(out: string): ConflictMarkerHit[];
55
128
  /** The outcome of enumerating paths for the gate. `ok: false` means the git
56
129
  * command FAILED — which is emphatically NOT the same as "nothing changed".
@@ -67,29 +140,137 @@ export interface PathEnumeration {
67
140
  * pathspecs — which would silently drop that file from the marker scan.
68
141
  * Failure is REPORTED (`ok: false`), never flattened into an empty result:
69
142
  * `scanConflictMarkers([])` is `[]`, so a swallowed error would have read as a
70
- * clean tree and let the push through (PR #394 review). */
143
+ * clean tree and let the push through (PR #394 review).
144
+ *
145
+ * Runs from `repoToplevel()`, and that is LOAD-BEARING (issue #412, finding 4 —
146
+ * PR #434 review). Enumeration and grep are a PAIR and must share one frame of
147
+ * reference: `git grep` always runs from the root (see `grepConflictMarkers`),
148
+ * so the paths handed to it must be root-relative too. `git diff --name-only`
149
+ * honours `diff.relative` — set to true (config, or a `--relative` in the
150
+ * command) it emits CWD-relative paths AND drops everything outside the CWD.
151
+ * Run the gate from `sub/` and `sub/app.ts` was enumerated as `app.ts`, which
152
+ * the root-anchored grep matched nothing for: exit 1 ("no match") read as a
153
+ * CLEAN tree over three live markers. Pinning the CWD here fixes it at the
154
+ * source, for every call site, and needs no `--no-relative` flag (git ≥2.30):
155
+ * at the toplevel, relative and absolute are the same thing.
156
+ *
157
+ * A root that cannot be located degrades to `ok: false` rather than throwing —
158
+ * callers rely on this never throwing (`pr sync`'s best-effort listing), and a
159
+ * gate that cannot find its tree has enumerated nothing, which is exactly what
160
+ * `ok: false` means. */
71
161
  export declare function gitPaths(cmd: string): PathEnumeration;
72
162
  /** Files this branch changed relative to `baseRef` — the only place a rebase
73
163
  * can have left markers, so the gate never scans (or trips on) unrelated files. */
74
164
  export declare function changedPaths(baseRef: string): PathEnumeration;
75
- /** Scan the working tree for leftover conflict markers in `paths`. `git grep`
76
- * exits 1 on "no match" (clean) any OTHER failure is rethrown so the gate
77
- * fails CLOSED rather than silently reporting a clean tree.
78
- *
79
- * `--literal-pathspecs` is load-bearing: `shellQuote` stops the SHELL, but git
80
- * still parses each argument as a PATHSPEC. A tracked file whose name begins
81
- * with `:` is read as pathspec magic and matches nothing `git grep` then
82
- * exits 1 ("no match") and the file is silently UNSCANNED rather than erroring
83
- * (PR #394 review). Note the flag is a main-git option, so it must precede the
84
- * subcommand: `git grep --literal-pathspecs` is rejected as an unknown option.
85
- *
86
- * `-z` is load-bearing too: it makes git delimit `path\0line\0text`, so a path
87
- * containing `:<digits>:` can't be mis-split by the parser and silently dropped
88
- * from the results (PR #394 review see `parseConflictMarkerGrep`). */
89
- export declare function scanConflictMarkers(paths: string[]): ConflictMarkerHit[];
165
+ /** The repository root, as the CWD every gate git command runs FROM BOTH the
166
+ * `git diff` that enumerates (`gitPaths`) and the `git grep` that scans
167
+ * (`grepConflictMarkers`).
168
+ *
169
+ * Load-bearing (issue #412, finding 4): `git grep` resolves pathspecs relative
170
+ * to the CWD, so paths enumerated in one frame and grepped in another match
171
+ * nothing `git grep` exits 1 ("no match"), which the gate reads as CLEAN over
172
+ * live markers. Anchoring only one half is worse than anchoring neither: under
173
+ * `diff.relative=true` the two halves then disagree where before they at least
174
+ * agreed (PR #434 review). It must be a toplevel CWD and NOT a `:(top)`
175
+ * pathspec prefix: `--literal-pathspecs`, which the `:leading.ts` regression
176
+ * requires, disables pathspec magic outright. Failure to locate the root throws
177
+ * a gate that cannot find the tree it is certifying has proved nothing.
178
+ * (`gitPaths` catches that throw and degrades to `ok: false`, its own way of
179
+ * saying the same thing.) */
180
+ export declare function repoToplevel(): string;
181
+ /** Split paths into `git grep`-sized batches, budgeting the QUOTED byte length
182
+ * actually spent on the command line. A single path over budget still gets its
183
+ * own chunk rather than looping forever. Pure, so the budgeting is testable
184
+ * without building a 100 KB fixture. */
185
+ export declare function chunkPathspecs(paths: string[], maxFiles?: number, maxBytes?: number): string[][];
186
+ /**
187
+ * Scan the working tree for leftover conflict markers in `paths`.
188
+ *
189
+ * Two passes per chunk, and the split is the point (issue #412, finding 1):
190
+ *
191
+ * 1. `-l` — the AUTHORITY on WHICH files match. `-z -l` emits NUL-terminated
192
+ * paths, so `split("\0")` is exact and no parse can lose a file.
193
+ * 2. `-n` — the line/text DETAIL, positionally parsed.
194
+ *
195
+ * Then fail CLOSED if the `-l` set is not covered by the paths the `-n` parse
196
+ * recovered: the detail pass lost a file the authority saw, so this scan cannot
197
+ * certify anything. The comparison is against `parse.paths` — every path a
198
+ * record was read for — and emphatically NOT against the filtered `hits`. `-l`
199
+ * cannot distinguish a bare `=======` from a real conflict and the parser
200
+ * deliberately does not trip on one, so checking `hits` would make any file
201
+ * containing a lone 7-equals line permanently unpushable.
202
+ */
203
+ export declare function scanConflictMarkers(paths: string[], budget?: {
204
+ maxFiles?: number;
205
+ maxBytes?: number;
206
+ }): ConflictMarkerHit[];
207
+ /** Files the `-l` authority matched that the `-n` parse recovered no record for.
208
+ * Non-empty ⇒ the scan lost coverage and must fail closed.
209
+ *
210
+ * ⚠️ `recovered` is `ConflictMarkerParse.paths` — every path a record was read
211
+ * for — and NEVER the filtered hits. `git grep -l` matches a bare `=======` the
212
+ * same as a real `<<<<<<<`, while the parser deliberately does not trip on a
213
+ * lone separator. Comparing against hits would therefore report every file
214
+ * containing a single 7-equals line as "lost", hard-blocking its push forever:
215
+ * a repo-wide denial of service on the gate, invisible today only because this
216
+ * repo happens to contain zero such lines. */
217
+ export declare function unrecoveredMatches(matched: string[], recovered: string[]): string[];
90
218
  /** Which rebase state git has left in this worktree, if any. Reads the
91
219
  * worktree's own git dir, so it is correct inside `git worktree` checkouts. */
92
220
  export declare function rebaseInProgress(): "rebase-merge" | "rebase-apply" | null;
221
+ /** The commit an in-flight rebase is replaying ONTO, read from the rebase state
222
+ * git itself wrote (`.git/rebase-merge/onto` or `.git/rebase-apply/onto`).
223
+ * `rebaseInProgress()` already names the directory, so this is a file read. */
224
+ export declare function rebaseOnto(): string | null;
225
+ /** The remote's default branch, from `refs/remotes/origin/HEAD`. */
226
+ export declare function originHeadRef(): string | null;
227
+ /** Last-ditch default branch when `origin/HEAD` was never set (a plain `git
228
+ * clone --depth` or a hand-added remote leaves it unset). */
229
+ export declare function defaultBranchRef(): string | null;
230
+ /** Which ref `conflict-check` diffs against, and where that ref came from. */
231
+ export type BaseSource = "rebase-onto" | "origin-head" | "default-branch" | "explicit";
232
+ export interface ResolvedBase {
233
+ base: string;
234
+ source: BaseSource;
235
+ }
236
+ /**
237
+ * Resolve the base `conflict-check` scans against (issue #412, finding 3).
238
+ *
239
+ * Without a base the check is VACUOUS at exactly the moment it matters. Once
240
+ * `git rebase --continue` has COMMITTED the markers, nothing is unmerged and
241
+ * nothing differs from HEAD, so both of the local enumeration sources are empty
242
+ * and the gate prints `{"clean":true,"scanned":0}` and exits 0 — over a tree
243
+ * whose HEAD blob literally contains `<<<<<<< HEAD`. The same tree with
244
+ * `--base main` yields 3 hits and exit 8.
245
+ *
246
+ * Precedence, most-specific first:
247
+ * 1. `rebase-onto` — mid-rebase, the commit git is actually replaying onto is
248
+ * the true base, whatever anyone typed.
249
+ * 2. `origin-head` / 3. `default-branch` — the repo's own default branch.
250
+ * 4. `explicit` — the operator's `--base`.
251
+ *
252
+ * NOT `@{upstream}`: that resolves to `origin/<same-branch>`, which is the
253
+ * branch's own remote copy and not the PR base at all — diffing a branch against
254
+ * itself is a vacuous scan wearing a base's clothes — and it is unset on any
255
+ * freshly created branch anyway.
256
+ *
257
+ * Ranking `explicit` LAST is deliberate and must stay that way: a stale `--base`
258
+ * flag must not override the commit git is actually replaying onto mid-rebase,
259
+ * and ranking it up would change which single ref `base` reports as covered.
260
+ *
261
+ * `--base` keeps its documented ADDITIVE contract at the call site: an explicit
262
+ * ref the precedence didn't pick is still scanned, it just isn't what gets
263
+ * reported as the resolved base — the caller reports the FULL set it diffed
264
+ * against as `bases`, so nothing scanned goes unnamed (PR #434 review). Pure
265
+ * (probes are injected) so the precedence is unit-testable without a rebase
266
+ * fixture.
267
+ */
268
+ export declare function resolveScanBase(i: {
269
+ onto: string | null;
270
+ originHead: string | null;
271
+ defaultBranch: string | null;
272
+ explicit?: string;
273
+ }): ResolvedBase | null;
93
274
  export type SyncEntryVerdict = {
94
275
  ok: true;
95
276
  } | {
@@ -103,11 +284,24 @@ export type SyncEntryVerdict = {
103
284
  * misleading `On branch "HEAD" but PR #N is "x"` and every later loop git op
104
285
  * failed. Each refusal names the state AND the exact command that clears it.
105
286
  * Pure (state is injected) so it's unit-testable without a git fixture.
287
+ *
288
+ * `base` is the ref the printed re-check names, and it must be CONCRETE (PR #434
289
+ * review, finding 1). This branch fires only when a rebase IS in progress, so
290
+ * the caller always has one — the rebase's own `onto`, else `origin/<the PR's
291
+ * base>` — and the `origin/<base>` placeholder printed here before was a command
292
+ * the operator could not run: `conflict-check --base 'origin/<base>'` fails to
293
+ * resolve the ref and exits 8 via `enumerationFailed`, i.e. the recovery hint
294
+ * itself reported "the gate proved nothing". The placeholder survives only as
295
+ * the last resort for a caller that truly has neither source.
296
+ *
297
+ * `root` anchors the printed `git add` for a subdirectory shell (`anchoredGit`).
106
298
  */
107
299
  export declare function syncEntryGuard(i: {
108
300
  rebase: "rebase-merge" | "rebase-apply" | null;
109
301
  currentBranch: string;
110
302
  head: string;
111
303
  number: number;
304
+ base?: string | null;
305
+ root?: string | null;
112
306
  }): SyncEntryVerdict;
113
307
  //# sourceMappingURL=pr.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmDzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6fxD;AA+BD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;kFAGkF;AAClF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD;;;kFAGkF;AAClF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,MAAM,CAOxI;AAID;;;yEAGyE;AACzE,eAAO,MAAM,iBAAiB,EAAE,SAAS,MAAM,EAK9C,CAAC;AAEF,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAE/E;kEACkE;AAClE,eAAO,MAAM,uBAAuB,kCAAkC,CAAC;AAKvE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CA2BxE;AAED;;4EAE4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,EAAE,EAAE,OAAO,CAAC;IACZ,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;4DAK4D;AAC5D,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAOrD;AAED;oFACoF;AACpF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED;;;;;;;;;;;;;yEAayE;AACzE,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAaxE;AAED;gFACgF;AAChF,wBAAgB,gBAAgB,IAAI,cAAc,GAAG,cAAc,GAAG,IAAI,CAUzE;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAChC,MAAM,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,gBAAgB,CAiBnB"}
1
+ {"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmDzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0jBxD;AA+BD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxE;AAED;;;kFAGkF;AAClF,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjD;;;kFAGkF;AAClF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,MAAM,CAOxI;AAID;;;;;;;;;;;;;oFAaoF;AACpF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,GAAG,IAAW,GAAG,SAAS,MAAM,EAAE,CAO/F;AAED;;;;;;;;;;6EAU6E;AAC7E,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;;;;;;;;;;;;8BAe8B;AAC9B,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAErE;AAED;;;iEAGiE;AACjE,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAM3C;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAE/E;;;;;;;;;oFASoF;AACpF,MAAM,WAAW,mBAAmB;IAAG,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE;AAEnF;kEACkE;AAClE,eAAO,MAAM,uBAAuB,kCAAkC,CAAC;AAKvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CA4B3E;AAED,qFAAqF;AACrF,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAExE;AAED;;4EAE4E;AAC5E,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,mEAAmE;IACnE,EAAE,EAAE,OAAO,CAAC;IACZ,4DAA4D;IAC5D,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;;;;;;;;;;;;yBAsByB;AACzB,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAOrD;AAED;oFACoF;AACpF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAE7D;AAED;;;;;;;;;;;;;;8BAc8B;AAC9B,wBAAgB,YAAY,IAAI,MAAM,CASrC;AAUD;;;yCAGyC;AACzC,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,SAAuB,EAAE,QAAQ,SAAuB,GAAG,MAAM,EAAE,EAAE,CAgB5H;AAmCD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,iBAAiB,EAAE,CAqB3H;AAED;;;;;;;;;+CAS+C;AAC/C,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAGnF;AAED;gFACgF;AAChF,wBAAgB,gBAAgB,IAAI,cAAc,GAAG,cAAc,GAAG,IAAI,CAUzE;AAcD;;gFAEgF;AAChF,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAU1C;AAED,oEAAoE;AACpE,wBAAgB,aAAa,IAAI,MAAM,GAAG,IAAI,CAO7C;AAED;8DAC8D;AAC9D,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAKhD;AAED,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,aAAa,GAAG,aAAa,GAAG,gBAAgB,GAAG,UAAU,CAAC;AACvF,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE;IACjC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,YAAY,GAAG,IAAI,CAMtB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAChC,MAAM,EAAE,cAAc,GAAG,cAAc,GAAG,IAAI,CAAC;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GAAG,gBAAgB,CAkBnB"}