From cea20b4e472862e30c7428e69186805171b5fca6 Mon Sep 17 00:00:00 2001 From: DKalinov Date: Wed, 26 Aug 2026 13:24:00 +0300 Subject: [PATCH 1/2] Enhance Ignite UI documentation tools - Updated the `list_components` constant to provide clearer descriptions and usage instructions. - Added a new `render-components.ts` file for improved component rendering functionality. - Created new test fixtures for filtering, flat listing, grouped indexing, single group retrieval, and handling unknown groups in the documentation. - Included expected output files for various scenarios to ensure accurate documentation generation. --- .../actions/build-framework-docs/action.yml | 27 + .github/workflows/build-docs-db.yml | 38 +- eslint.config.mjs | 2 + packages/igniteui-mcp/.gitattributes | 2 + .../docs-backend/ComponentRenderer.cs | 134 +++++ .../Controllers/DocsController.cs | 156 +++++- .../docs-backend/igniteui-docs.db | Bin 25661440 -> 26046464 bytes .../tests-docs-backend/DocsControllerTests.cs | 39 +- .../tests-docs-backend/ListFixtureTests.cs | 116 ++++ .../tests-docs-backend.csproj | 6 + .../igniteui-doc-mcp/CHANGELOG.md | 8 + .../igniteui-mcp/igniteui-doc-mcp/CLAUDE.md | 30 +- .../data/group-summaries/angular.json | 317 +++++++++++ .../data/group-summaries/blazor.json | 245 +++++++++ .../data/group-summaries/react.json | 254 +++++++++ .../data/group-summaries/webcomponents.json | 254 +++++++++ .../igniteui-doc-mcp/db/igniteui-docs.db | Bin 25661440 -> 26046464 bytes .../igniteui-doc-mcp/docs/knowledgebase.md | 24 + .../igniteui-doc-mcp/package.json | 23 +- .../igniteui-doc-mcp/scripts/build-db.ts | 502 +++++++++++++----- .../scripts/build-group-summaries.ts | 217 ++++++++ .../scripts/export-angular-docs.ts | 50 +- .../scripts/export-blazor-docs.ts | 62 +-- .../scripts/export-react-docs.ts | 65 +-- .../scripts/export-wc-docs.ts | 62 +-- .../scripts/lib/frontmatter.ts | 33 ++ .../scripts/lib/list-fixtures.ts | 69 +++ .../igniteui-doc-mcp/scripts/lib/toc-index.ts | 147 +++++ .../scripts/lib/toc-sidecar.ts | 149 ++++++ .../scripts/report-toc-coverage.ts | 105 ++++ .../scripts/restore-docs-final.ts | 58 ++ .../scripts/validate-package.ts | 67 +++ .../providers/LocalDocsProvider.list.test.ts | 222 ++++++++ .../providers/RemoteDocsProvider.test.ts | 21 +- .../src/__tests__/scripts/build-db.test.ts | 341 ++++++++++++ .../src/__tests__/scripts/toc-index.test.ts | 221 ++++++++ .../src/__tests__/scripts/toc-sidecar.test.ts | 151 ++++++ .../__tests__/shared/list-fixtures.test.ts | 46 ++ .../src/__tests__/shared/list-fixtures.ts | 62 +++ .../__tests__/tools/render-components.test.ts | 154 ++++++ .../igniteui-doc-mcp/src/index.ts | 28 +- .../src/providers/DocsProvider.ts | 11 +- .../src/providers/LocalDocsProvider.ts | 168 ++++-- .../src/providers/RemoteDocsProvider.ts | 8 +- .../igniteui-doc-mcp/src/tools/constants.ts | 11 +- .../src/tools/render-components.ts | Bin 0 -> 5707 bytes .../list-components/filtered/expected.txt | 11 + .../list-components/filtered/input.json | 217 ++++++++ .../list-components/flat/expected.txt | 16 + .../list-components/flat/input.json | 217 ++++++++ .../grouped-index/expected.txt | 28 + .../list-components/grouped-index/input.json | 216 ++++++++ .../list-components/single-group/expected.txt | 11 + .../list-components/single-group/input.json | 217 ++++++++ .../unknown-group/expected.txt | 8 + .../list-components/unknown-group/input.json | 217 ++++++++ 56 files changed, 5487 insertions(+), 376 deletions(-) create mode 100644 packages/igniteui-mcp/.gitattributes create mode 100644 packages/igniteui-mcp/docs-backend/docs-backend/ComponentRenderer.cs create mode 100644 packages/igniteui-mcp/docs-backend/tests-docs-backend/ListFixtureTests.cs create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/angular.json create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/blazor.json create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/react.json create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/webcomponents.json create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/scripts/build-group-summaries.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/frontmatter.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/list-fixtures.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/toc-index.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/toc-sidecar.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/scripts/report-toc-coverage.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/providers/LocalDocsProvider.list.test.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/build-db.test.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/toc-index.test.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/toc-sidecar.test.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/shared/list-fixtures.test.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/shared/list-fixtures.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/tools/render-components.test.ts create mode 100644 packages/igniteui-mcp/igniteui-doc-mcp/src/tools/render-components.ts create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/filtered/expected.txt create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/filtered/input.json create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/flat/expected.txt create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/flat/input.json create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/grouped-index/expected.txt create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/grouped-index/input.json create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/single-group/expected.txt create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/single-group/input.json create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/unknown-group/expected.txt create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/unknown-group/input.json diff --git a/.github/actions/build-framework-docs/action.yml b/.github/actions/build-framework-docs/action.yml index 9c5f60bfe..95815e357 100644 --- a/.github/actions/build-framework-docs/action.yml +++ b/.github/actions/build-framework-docs/action.yml @@ -172,6 +172,14 @@ runs: fi echo "$FW: $OUT of $IN documents compressed" + # The composite action inlines the pipeline rather than calling pipeline:*, so + # the summaries step has to be listed here too. Cached groups make no API call; + # credentials are already written by "Configure OpenAI credentials". + - name: Build group summaries + shell: bash + working-directory: packages/igniteui-mcp/igniteui-doc-mcp + run: npm run build:group-summaries -- --framework "${{ inputs.framework }}" + # Always runs, so a framework that skipped compression still reports why. - name: Report build summary if: always() @@ -203,3 +211,22 @@ runs: name: docs-baseline-${{ inputs.framework }} path: packages/igniteui-mcp/igniteui-doc-mcp/docs_baseline/${{ inputs.framework }} retention-days: 5 + + # build-db's preflight requires a sidecar per framework. A silently absent one + # would surface hours later as an abort in assemble, with nothing pointing at + # the job that produced nothing — hence if-no-files-found: error. + - name: Upload TOC index + uses: actions/upload-artifact@v7 + with: + name: toc-index-${{ inputs.framework }} + path: packages/igniteui-mcp/igniteui-doc-mcp/dist/toc-index/${{ inputs.framework }}.json + if-no-files-found: error + retention-days: 5 + + - name: Upload group summaries + uses: actions/upload-artifact@v7 + with: + name: group-summaries-${{ inputs.framework }} + path: packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/${{ inputs.framework }}.json + if-no-files-found: error + retention-days: 5 diff --git a/.github/workflows/build-docs-db.yml b/.github/workflows/build-docs-db.yml index 3c0802b32..19193720c 100644 --- a/.github/workflows/build-docs-db.yml +++ b/.github/workflows/build-docs-db.yml @@ -118,6 +118,14 @@ jobs: with: pattern: docs-baseline-* path: packages/igniteui-mcp/igniteui-doc-mcp/docs_baseline + - uses: actions/download-artifact@v8 + with: + pattern: toc-index-* + path: packages/igniteui-mcp/igniteui-doc-mcp/dist/toc-index + - uses: actions/download-artifact@v8 + with: + pattern: group-summaries-* + path: packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries # download-artifact nests each artifact under its own name; flatten to the # framework directories that build-db expects. @@ -132,7 +140,19 @@ jobs: [ -d "$src" ] && rm -rf "$dir/$fw" && mv "$src" "$dir/$fw" || true done done - ls -la dist/docs_final + + # These two artifacts are single files, not directories, so they need + # their own unwrapping. Overwriting the checkout's committed summaries + # for a rebuilt framework is deliberate — the regenerated ones must win. + for kind in toc-index:dist/toc-index group-summaries:data/group-summaries; do + prefix="${kind%%:*}"; dir="${kind##*:}" + for fw in angular react blazor webcomponents; do + src="$dir/$prefix-$fw/$fw.json" + [ -f "$src" ] && mv -f "$src" "$dir/$fw.json" && rm -rf "$dir/$prefix-$fw" || true + done + done + + ls -la dist/docs_final dist/toc-index data/group-summaries || true # Any framework missing from this run keeps the copy already committed, so the # database is always assembled from a complete set. --toc-stubs also emits the @@ -161,7 +181,7 @@ jobs: - name: Build database working-directory: packages/igniteui-mcp/igniteui-doc-mcp - run: npm run build:db + run: npm run release:db - name: Verify document counts run: | @@ -174,6 +194,7 @@ jobs: path: | packages/igniteui-mcp/igniteui-doc-mcp/db/igniteui-docs.db packages/igniteui-mcp/igniteui-doc-mcp/docs_baseline + packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries retention-days: 5 # The only job that writes to the repository. It opens a PR for review — nothing is @@ -205,9 +226,10 @@ jobs: # of compression, so it must not fail on a path guess. DB=$(find artifact -type f -name igniteui-docs.db | head -1) BASELINE=$(find artifact -type d -name docs_baseline | head -1) + SUMMARIES=$(find artifact -type d -name group-summaries | head -1) - if [ -z "$DB" ] || [ -z "$BASELINE" ]; then - echo "::error::Could not locate the database or baselines in the artifact." + if [ -z "$DB" ] || [ -z "$BASELINE" ] || [ -z "$SUMMARIES" ]; then + echo "::error::Could not locate the database, baselines or group summaries in the artifact." find artifact exit 1 fi @@ -219,6 +241,11 @@ jobs: cp "$DB" packages/igniteui-mcp/docs-backend/docs-backend/igniteui-docs.db rm -rf packages/igniteui-mcp/igniteui-doc-mcp/docs_baseline cp -r "$BASELINE" packages/igniteui-mcp/igniteui-doc-mcp/docs_baseline + # Without this the run regenerates summaries, builds them into the shipped + # DB, then throws the sources away — the committed cache would drift + # permanently from the committed database. + rm -rf packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries + cp -r "$SUMMARIES" packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries rm -rf artifact - name: Commit and open pull request @@ -235,7 +262,8 @@ jobs: # submodules out fresh, so recording them here would only add noise. git add packages/igniteui-mcp/igniteui-doc-mcp/db/igniteui-docs.db \ packages/igniteui-mcp/docs-backend/docs-backend/igniteui-docs.db \ - packages/igniteui-mcp/igniteui-doc-mcp/docs_baseline + packages/igniteui-mcp/igniteui-doc-mcp/docs_baseline \ + packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries if git diff --cached --quiet; then echo "No changes to publish — the documentation is already up to date." diff --git a/eslint.config.mjs b/eslint.config.mjs index d1174dfe3..e96b6c857 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -156,6 +156,8 @@ export default [ '**/files/**/*', 'packages/igniteui-mcp/**/dist/**/*', 'packages/igniteui-mcp/**/*.test.ts', + // Excluded from the package's tsconfig, so typed linting has no project for them. + 'packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/**/*', 'packages/igniteui-mcp/igniteui-doc-mcp/scripts/**/*', 'packages/igniteui-mcp/igniteui-doc-mcp/vitest.config.ts', ] diff --git a/packages/igniteui-mcp/.gitattributes b/packages/igniteui-mcp/.gitattributes new file mode 100644 index 000000000..98d7e91c4 --- /dev/null +++ b/packages/igniteui-mcp/.gitattributes @@ -0,0 +1,2 @@ +shared-fixtures/**/*.txt text eol=lf +shared-fixtures/**/*.json text eol=lf diff --git a/packages/igniteui-mcp/docs-backend/docs-backend/ComponentRenderer.cs b/packages/igniteui-mcp/docs-backend/docs-backend/ComponentRenderer.cs new file mode 100644 index 000000000..24d6620bd --- /dev/null +++ b/packages/igniteui-mcp/docs-backend/docs-backend/ComponentRenderer.cs @@ -0,0 +1,134 @@ +using System.Text; + +namespace docs_backend; + +/// +/// Port of the MCP server's src/tools/render-components.ts. The two must +/// produce byte-identical text for the same rows — the shared fixtures under +/// packages/igniteui-mcp/shared-fixtures/list-components/ are what pins +/// that. Newlines are written as "\n" explicitly: StringBuilder.AppendLine uses +/// Environment.NewLine, which is CRLF on Windows and would diverge on every line. +/// +public static class ComponentRenderer +{ + /// Docs beyond this many lose their per-doc summaries, to keep a filtered response small. + public const int SummaryThreshold = 25; + + public sealed record DocRow(string Filename, string? TocName, string? Summary, bool Premium); + + public sealed record GroupedDocRow(string Filename, string? TocName, string? Summary, bool Premium, string GroupKey, long Ord); + + public sealed record GroupRow(string GroupKey, string? Summary); + + private static string DocName(string filename) => + filename.EndsWith(".md", StringComparison.Ordinal) ? filename[..^3] : filename; + + private static string DocEntry(string filename, string? tocName, string? summary, bool premium) + { + var name = DocName(filename); + var sb = new StringBuilder(); + sb.Append("- **").Append(string.IsNullOrEmpty(tocName) ? name : tocName).Append("** (`").Append(name).Append("`)"); + if (!string.IsNullOrEmpty(summary)) sb.Append("\n ").Append(summary); + if (premium) sb.Append("\n ⭐ Premium"); + return sb.ToString(); + } + + /// + /// A doc reachable from two TOC paths that land in the same group appears + /// twice; keep the earliest. A doc cross-listed in two different groups is + /// kept in each — that is editorial intent, not duplication. + /// + private static List Dedupe(IEnumerable rows) + { + var best = new Dictionary(StringComparer.Ordinal); + foreach (var row in rows) + { + var key = row.GroupKey + " " + row.Filename; + if (!best.TryGetValue(key, out var existing) || row.Ord < existing.Ord) best[key] = row; + } + return best.Values.OrderBy(r => r.Ord).ToList(); + } + + public static string RenderFlat(string framework, IReadOnlyList rows, string? filter) + { + var matching = string.IsNullOrEmpty(filter) ? "" : $" matching \"{filter}\""; + if (rows.Count == 0) return $"No components found for framework \"{framework}\"{matching}."; + + var entries = rows.Select(r => DocEntry(r.Filename, r.TocName, r.Summary, r.Premium)); + return $"Found {rows.Count} components for **{framework}**{matching}:\n\n" + string.Join("\n", entries); + } + + public static string RenderGroupedIndex( + string framework, + IReadOnlyList groups, + IReadOnlyList rows, + string? filter) + { + var matching = string.IsNullOrEmpty(filter) ? "" : $" matching \"{filter}\""; + var deduped = Dedupe(rows); + if (deduped.Count == 0) return $"No components found for framework \"{framework}\"{matching}."; + + var byGroup = new Dictionary>(StringComparer.Ordinal); + foreach (var row in deduped) + { + if (!byGroup.TryGetValue(row.GroupKey, out var list)) + { + list = []; + byGroup[row.GroupKey] = list; + } + list.Add(row); + } + + var total = deduped.Select(r => r.Filename).Distinct(StringComparer.Ordinal).Count(); + var withSummaries = total <= SummaryThreshold; + + var blocks = new List(); + foreach (var group in groups) + { + if (!byGroup.TryGetValue(group.GroupKey, out var members) || members.Count == 0) continue; + + var block = new StringBuilder(); + block.Append("## ").Append(group.GroupKey).Append(" (").Append(members.Count).Append(')'); + if (!string.IsNullOrEmpty(group.Summary)) block.Append('\n').Append(group.Summary); + block.Append('\n'); + + block.Append(withSummaries + ? string.Join("\n", members.Select(m => DocEntry(m.Filename, m.TocName, m.Summary, m.Premium))) + : string.Join(", ", members.Select(m => DocName(m.Filename) + (m.Premium ? " ⭐" : "")))); + + blocks.Add(block.ToString()); + } + + var header = + $"Found {total} component doc(s) for **{framework}**{matching} in {blocks.Count} group(s). " + + "Pass `group` with any heading below to get that group's docs with summaries" + + (withSummaries ? "" : "; ⭐ marks premium docs") + "."; + + return header + "\n\n" + string.Join("\n\n", blocks); + } + + public static string RenderGroup( + string framework, + GroupRow group, + IReadOnlyList rows, + string? filter) + { + var matching = string.IsNullOrEmpty(filter) ? "" : $" matching \"{filter}\""; + var members = Dedupe(rows).Where(r => string.Equals(r.GroupKey, group.GroupKey, StringComparison.Ordinal)).ToList(); + if (members.Count == 0) + return $"No components found in group \"{group.GroupKey}\" for framework \"{framework}\"{matching}."; + + var header = $"Found {members.Count} component doc(s) in **{framework}** > {group.GroupKey}{matching}:"; + var summary = string.IsNullOrEmpty(group.Summary) ? "" : "\n" + group.Summary + "\n"; + var entries = string.Join("\n", members.Select(m => DocEntry(m.Filename, m.TocName, m.Summary, m.Premium))); + + return header + "\n" + summary + "\n" + entries; + } + + public static string RenderUnknownGroup(string framework, string group, IReadOnlyList groups) + { + var keys = string.Join("\n", groups.Select(g => "- " + g.GroupKey)); + return $"No group \"{group}\" in **{framework}**. Valid groups:\n\n{keys}\n\n" + + "Omit `group` for the full grouped index, or pass `filter` to search across groups."; + } +} diff --git a/packages/igniteui-mcp/docs-backend/docs-backend/Controllers/DocsController.cs b/packages/igniteui-mcp/docs-backend/docs-backend/Controllers/DocsController.cs index 1d70de8a7..b952161e8 100644 --- a/packages/igniteui-mcp/docs-backend/docs-backend/Controllers/DocsController.cs +++ b/packages/igniteui-mcp/docs-backend/docs-backend/Controllers/DocsController.cs @@ -24,40 +24,160 @@ private static bool IsValidFramework(string framework, out string normalized) return ValidFrameworks.TryGetValue(framework.ToLowerInvariant(), out normalized!); } - [HttpGet] - public IActionResult List([FromQuery] string framework, [FromQuery] string? filter) + private static string? Str(SqliteDataReader r, string column) { - if (!IsValidFramework(framework, out var fw)) - return BadRequest($"Invalid framework \"{framework}\". Valid values: {string.Join(", ", ValidFrameworks.Keys)}"); + var i = r.GetOrdinal(column); + return r.IsDBNull(i) ? null : r.GetString(i); + } - framework = fw; - var sql = "SELECT framework, filename, component, toc_name, premium, summary FROM docs WHERE framework = @fw"; + /// + /// The MCP package ships a prebuilt database and the committed copy can be + /// updated independently, so this must tolerate a DB with no grouping tables, + /// and one where only some frameworks have been migrated. + /// + private bool HasGroups(string framework) + { + var probe = db.CreateCommand(); + probe.CommandText = + "SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name IN ('doc_toc', 'doc_groups')"; + if (Convert.ToInt64(probe.ExecuteScalar()) != 2) return false; + + var rows = db.CreateCommand(); + rows.CommandText = "SELECT COUNT(*) FROM doc_toc WHERE framework = @fw"; + rows.Parameters.AddWithValue("@fw", framework); + return Convert.ToInt64(rows.ExecuteScalar()) > 0; + } + + private List ReadGroups(string framework) + { + var cmd = db.CreateCommand(); + cmd.CommandText = "SELECT group_key, summary FROM doc_groups WHERE framework = @fw ORDER BY ord"; + cmd.Parameters.AddWithValue("@fw", framework); + + var groups = new List(); + using var reader = cmd.ExecuteReader(); + while (reader.Read()) + groups.Add(new ComponentRenderer.GroupRow(reader.GetString(0), Str(reader, "summary"))); + return groups; + } + + /// + /// Grouped mode also matches doc_toc.group_key, so a filter can select whole + /// sections. Flat mode deliberately does not — see . + /// + private List ReadGroupedRows(string framework, string? filter, string? group) + { var cmd = db.CreateCommand(); + var where = new List { "t.framework = @fw" }; cmd.Parameters.AddWithValue("@fw", framework); + if (group != null) + { + where.Add("t.group_key = @g"); + cmd.Parameters.AddWithValue("@g", group); + } if (!string.IsNullOrWhiteSpace(filter)) { - sql += " AND (filename LIKE @f OR toc_name LIKE @f OR component LIKE @f OR keywords LIKE @f OR summary LIKE @f)"; + where.Add("(d.filename LIKE @f OR d.component LIKE @f OR d.toc_name LIKE @f " + + "OR d.keywords LIKE @f OR d.summary LIKE @f OR t.group_key LIKE @f)"); cmd.Parameters.AddWithValue("@f", $"%{filter}%"); } - sql += " ORDER BY filename"; - cmd.CommandText = sql; + cmd.CommandText = + "SELECT d.filename, d.toc_name, d.premium, d.summary, t.group_key, t.ord " + + "FROM doc_toc t JOIN docs d ON d.framework = t.framework AND d.filename = t.filename " + + $"WHERE {string.Join(" AND ", where)} ORDER BY t.ord"; - var sb = new StringBuilder(); + var rows = new List(); using var reader = cmd.ExecuteReader(); while (reader.Read()) { - var filename = reader.GetString(reader.GetOrdinal("filename")); - var name = filename.EndsWith(".md") ? filename[..^3] : filename; - var component = reader.IsDBNull(reader.GetOrdinal("component")) ? null : reader.GetString(reader.GetOrdinal("component")); - var comp = !string.IsNullOrEmpty(component) ? $" [{component}]" : ""; - if (sb.Length > 0) sb.AppendLine(); - sb.Append($"{name}{comp}"); + rows.Add(new ComponentRenderer.GroupedDocRow( + reader.GetString(reader.GetOrdinal("filename")), + Str(reader, "toc_name"), + Str(reader, "summary"), + !reader.IsDBNull(reader.GetOrdinal("premium")) && reader.GetInt64(reader.GetOrdinal("premium")) != 0, + reader.GetString(reader.GetOrdinal("group_key")), + reader.GetInt64(reader.GetOrdinal("ord")))); } + return rows; + } - var text = sb.Length > 0 ? sb.ToString() : "No docs found."; - return Content(text, "text/plain"); + /// + /// Flat mode never reads through doc_toc: the join multiplies cross-listed + /// docs and reorders by TOC position. Where narrows + /// a flat listing, membership is resolved separately. + /// + private List ReadFlat(string framework, string? filter, string? group) + { + var cmd = db.CreateCommand(); + var sql = "SELECT filename, component, toc_name, premium, keywords, summary FROM docs WHERE framework = @fw"; + cmd.Parameters.AddWithValue("@fw", framework); + + if (!string.IsNullOrWhiteSpace(filter)) + { + sql += " AND (filename LIKE @f OR component LIKE @f OR toc_name LIKE @f OR keywords LIKE @f OR summary LIKE @f)"; + cmd.Parameters.AddWithValue("@f", $"%{filter}%"); + } + cmd.CommandText = sql + " ORDER BY toc_name"; + + var rows = new List(); + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + rows.Add(new ComponentRenderer.DocRow( + reader.GetString(reader.GetOrdinal("filename")), + Str(reader, "toc_name"), + Str(reader, "summary"), + !reader.IsDBNull(reader.GetOrdinal("premium")) && reader.GetInt64(reader.GetOrdinal("premium")) != 0)); + } + } + + if (group != null && HasGroups(framework)) + { + var members = new HashSet(StringComparer.Ordinal); + var cmd2 = db.CreateCommand(); + cmd2.CommandText = "SELECT DISTINCT filename FROM doc_toc WHERE framework = @fw AND group_key = @g"; + cmd2.Parameters.AddWithValue("@fw", framework); + cmd2.Parameters.AddWithValue("@g", group); + using var reader2 = cmd2.ExecuteReader(); + while (reader2.Read()) members.Add(reader2.GetString(0)); + rows = rows.Where(r => members.Contains(r.Filename)).ToList(); + } + + return rows; + } + + [HttpGet] + public IActionResult List( + [FromQuery] string framework, + [FromQuery] string? filter, + [FromQuery] string? detail = null, + [FromQuery] string? group = null) + { + if (!IsValidFramework(framework, out var fw)) + return BadRequest($"Invalid framework \"{framework}\". Valid values: {string.Join(", ", ValidFrameworks.Keys)}"); + + framework = fw; + + if (detail == "docs" || !HasGroups(framework)) + return Content(ComponentRenderer.RenderFlat(framework, ReadFlat(framework, filter, group), filter), "text/plain"); + + var groups = ReadGroups(framework); + + if (group != null) + { + var match = groups.FirstOrDefault(g => string.Equals(g.GroupKey, group, StringComparison.Ordinal)); + var text = match is null + ? ComponentRenderer.RenderUnknownGroup(framework, group, groups) + : ComponentRenderer.RenderGroup(framework, match, ReadGroupedRows(framework, filter, group), filter); + return Content(text, "text/plain"); + } + + return Content( + ComponentRenderer.RenderGroupedIndex(framework, groups, ReadGroupedRows(framework, filter, null), filter), + "text/plain"); } [HttpGet("{framework}/{name}")] diff --git a/packages/igniteui-mcp/docs-backend/docs-backend/igniteui-docs.db b/packages/igniteui-mcp/docs-backend/docs-backend/igniteui-docs.db index 910bf53b083a455524de8ffc320bf62efa56a2ad..b094e624090de9397698194e7ca22761aadcaad8 100644 GIT binary patch delta 390052 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%0A7oj7mcZRoF&1Th)`FL{mRAzRiZPIq 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 aWncTq!I76g^x{Wj)m%#AQ$LRMkNO`3v+Y0t delta 115517 zcmY(r2YeL88$Nz>w|gyjJ9}xDa>?DL_q!zYnovSQy-=kl0RjX<8lelxUO`ZSV1QSt z!G@?n5X0DjpojtrK~b?16dNiec17j)4*L84{(nC3?B3q)?Cd_z%slTqb2N6gnHpR6 zn3|$3n^dZZm8$>uCvHndZu}-y*2ddrI!+a2+@qpL=@j#Anq)p;c9~L4T|v(WjWX^z zX>p_xn^B{r1vNiqep)@>*jyBpM1q=Yg7S%>`MIDBV#IxG^RGc}qH9hzr4c=Tj%Z$J z^5Nc1(*TWOg|<1mhgYV z(O0BULWJf^G)We*+In8~X=<%CF_AR))5Q`^^E6#A-6-dj z!rjXMV`dJIYa>yos`qM3Hj-5J0J3*8?hH6ox{=5xUOJ(FA{xFwYLcx&gW=jbEq?lJ zoq+hkIt}9Gbp-L9b^NT3Km+32fwhR|18Wdp58R9RS^!_L;nlzj#8ZLgi0y%8h$jL| z5nl<^BOVJZL3}j7F>pj6$pmj6_@%C_GDDFaR+>&=0X+pf6&tKp({PKyO4_pa)`bAREyXXmH_1 z2xKDZcLM2%w*zU2zXnnfZw68jzYQcIeicYS{5%kkcs1Zeyb^FAUJk?}UJAq@z7dE< zJROKYd^KQ2JP`;-JRS%`d?65u*cJ#uJQ4^-d?p|xyZWaB65^8qRFnR(fC+J5AP8}H zz=-%rz<{_tfTGlI3Fr_v1yDx%2Ll4){Q*>reqBI~=nJ53^s57?8~t)WYDHh`N3H0q z{HqY>`B5?Y8GclWezG5xp&#q7RW+#eBm5{3{V+cYM4#tJf#?VMD-iqpQ5pKa{`rVK z{HPDT+mHItC;I0iI{jsc5q{K!KHQIL(1-d_4fvx?BEnh+q1V`Uc%6e&kzs#g9zu-t!~Vx(+`wtvlx*j`)UuDB`Prw&kF4t!_>phjTtD)yEA=Dax>Pn>*5>y$g$4u zM~-ziKXR;#^drZ*aK9EY*e@bdKXR-y`H^Ft!H*p41V3`DBR*7*_Kpwx2JLMh@~!>d zhkR>)@~uYf_95Te?|mx}zx5&O+OK@|h*y2cz4jAdE#im1h8oDtde5eWSW*=%od%y1<#DEVqq4oJDBPza0{0Y|hP$1e>J`{*{r4OZ{UFO5iL0j)b zfoSV|qY-O-qYxMRP%GM*KGceKx^EcbJwDWjcCs%YaiT8|vA{PNahMNPq8;QLfY{g9 z7qN#ATfa8lhg#7l`*IQEeL1Lqt<8rr(OP{d6K$9e1)`-s6o^*uLuF{yzEqV;{M(1h z5dZX{GQ{6~s0{H(Um{|+5A`8_?~6zL*5^dL?z1Ca^`T0{D?U_-c+rRY5YPEg8RBa` zREBuchsqFN_F=EkARhCfK*U2n6o~k^54#0%w@*gg;lo}*-0DNIh#P$<7IA|w2+{9D z#fU3>s2FjH549pL_Mu9|3LmOOoaG~k)4iw(ahex3Ar^a46XIAeszDs(MKy>cyvq>_ zyr>DWVYqiGZiabL8sbndN<+-|)*nCwM;h*mFZ zLX^Fz1JUF~9SDDW%MgF_&P4ptI|K1+FDgLj^iDK1MFj}ViwY2qdQkzwGhS4Hu-}W^3p>3v&+5Vv@TBX0B}_rgjq_6qYK`8QwmKQ@zN&FvW}ggfPV(Cb3%?L`F$ zZZC2#WO~yO6TPSaAjL#6>w@4#z6G@x`4)&5`vc8C zUSwVKs~1_<{NhE{H9vcibxpSyN!Q%)2BZEpSG>r#=CT)=)?D%;yPAt$J>mr~va5N+ zi|lGnc#&7l3kpB~sDkWjo>P!l%@Ji4;z0%3)jXjfyPC%ozXM_3F0JW7UD<+S=SUO*w!^e735npP`L-OpMtDwdMU`dCRah$HQ5T1 zuE|m+p#C+<3UaTBQ;>U2sNzAiD9E}-RIuHvZ!5^U`gdgn;;#yFukKcmd-V?rwtn?D z3MxQ-T|ot?uPXV77ZmIR)Nd#Q5noeK4eApLszLp-f;vz$1$Cf4s$fr`eoR3%s2g@E zIk?%bpaRsJ6jXrvekBvpub=|dYZX+0dZ~g6P%ltW0qU7bJmNhHvaX(}I1tAw$h~@` z5{o!Uu_5Lv$h|sEu_7ib$h109!RD<_P=XQdiUl!7p@_ByMZ!(Eg50YG1zS1!T|otq zpA=L8xuu{2$Tx}>@v0&qexj%mKTuE&>7mAs0wmwHNs1%48l+t z8OS=BhNP28$T^vaWRp?IH5rCXlL1IE>5HwK z^hTN+NG8%uQm}=SgpmkNN0DGvYX-vp24q?FIMS=yi|nel zCm}Q?Ago84RlG-6H6XpJH8BV)kzCa>#z{@oA`BOiV!^%j(k%P0WIGYnEAaMp!QjJ zCf{2N7jq(eKj#jTiT0=|FHUHX-{6)?KEo}Q{JI}2EuZGbNYH(c@& zZn)$_ek4Y2ILLjM{Hz}dlArM-L-NypY@8d>HZt>&u$$PmSllO2tChz8UOy1>3D&?Krj>$W?9g`p7c1(Vl+c6m$xF3_Z z`&J=t|2ib5cg*C79aN4auauG@@DSPN9rtf?E%$G74fk(y758uQVjuSAawWHK@*>{^ z#D%``h!xz*$qRfQ#QDB){I$&Ej!rJ;j!vG-9i2RfJ34tbcXV=@4_m!l%6*+Y%U6In z(>EM(2KRXKbnfxwX}%$dQ@PWV@A2g!PT@{Zp6tU;K%T_?o;;EJJ$Zt!KjL^_Kg446 zehn(wnYINH|(aU{2cauN4|av}GD@(3Tc0=a;@L3ucLgYqyR z_80O{?g`}~zBI&q?hNHT?hNI@+!@M)xHFUoa%U(H;LcF)&z)g|+|S1q-j{bLavz@q zu{XDgaxZQZ<(}Lo$~}Bs=egW0$~iu+^K5PzWjD8svdhPHp2dx$oXL%&oWXsgoX< zoW^~loa*B;PvP!SPWEw`CvgucHzaZsDJO6fDLc7|lpWkY%61>uc`P@PvdzbJ9_Y4uS zMLE;kUX(Na(>n+84{kl_@7#LQ-@GVf`l}a(On>pBkm=9f22?WriMvtyBX^^;+lzXp zUEGt>TV7N(y~&*^{ee4E`aO51^gC`$=?yQcntsdeDgB1qQ~I?RRZYL*CY654O)9<4 zO)98BB;`7}3(&xDIrANFD#8&Qq>0vL*nI7UUm>%?^oawXN3pdbbxEZET zb2Cg2a5GGw@}i#Uer}2BliU*1C%7f1k9$$i^f52$neOwVo@t90l}z_~QOR@<_sDd& z7lllBc~Qu8C-=*AhZp5cAK|WaHf-~vs_9m*2C>HHk+638ytmDPpx!f>^~(I9<$5IIUE;*cT~W>o!f6>d;k1;Sa9W~ph0jvB!e??rPG@jKPNyqe;nNhZ z@TuIK(|eRc#3|gO)5+YT(@ET-(}~=o(+SE@{(8rAk4}rZN2eZzD}0xM(xXO)OewLJ3Q^ z8c@R0O;oV-0}5FBem25)WeDGvB7B3gmA*#RN?)O9r7uye(sk6T^aV;)`W%%iT|=Qt zos$r*PDJ<&6)Sy;f|Wi&y-FXWT&0gttD!q?NmEIeP{7aWnsM5Qr zQ|TR)sdNcdDs`YprHiOh>B3Niw^5+dTlom*^AOIVI;FEHPU%h5rt}6%Q#ymnlwL<+ zN~ckm(rYM7=~YyvbP7c&wWB7blPF2)1S(QGj)Ih4K|M+hFQXo%mr#zx5fq`+iW-y-qXeZx@dyV|hSIZ6glABM($lCx=>SSl zdI}XN?MDGhPon;$C!!D@M-57kp#-Hzt;oByFC3u-RVeL65lVYdgVJu4ptQ?^uoDF+ z?Vt#cp!}qVQGF7i_@wQqJ!zW}VXFb*Arzjp1r?_Xi`}$Rr3(Jz0lbfV{yuyi@;Tpp zR3XlX{E8S+PjAy-4Jmr7Hqj{N39;(F#G~rBB|j?G8)DL{iCXRStMn?3#;%#!r&qQk zC%1P_kG^E@(K3&Y&}*95-hKNxa-kOZ8=xl7 zsC7NF`(jDGdiUyeJrggM}meMJ7EFDe<(w;Pf z#?vTjp?c|#^sDrPbY1%Rzo{*7xTTHFA6H2YdX>?s7u1C4RfgFAcJ$Hz?dT%@+tG&o zw<8Aswc2gm^}ii$ z=zlw+<-Z+4`fo=Q^xuwJfA>~`O1yh3L8aCTdP0KY?rx0syBmY;?nWPZccTlxyU~W+ z-H7ttjbKi^yVYR)jn}JnqM$brLEwDx1|ZOHcmr5@)Kn9r!HL4OB_%|C^!_FB8l06p zv~0vcqPEx$TMWu5jVgku<(Nm!24y7ftJQMUKe%6n`vRVGzidzn?;f|r{B1BOBXD2S zoU?o?VgX}Nh`91jg8cX~IJSX?x^Wz^4GAKEB_a(>scsv{TaV~Ske!M%4 zeKf?N#PK8QkofI*7botEYT0(!WKbNqk9UuJEZCsfabKsl#Qv-|D6#x_bL>hhK2ooh zKAaPMX=Mr4Bx=K z$B0Af=uq%NiY-KWJxB3l<_`@2QG{n)h_6EVGrIiYGR9>s>yni%+DAf%oXzWR~7ZuGopaO;F!uIFRiJlnx6r+2j+#shDV07vshkrNI+(p!;`?6E2R^ zi161KjR9Px8W(up?W2Y7hH2`c>mQ>T+J|dAu;G|FoQ=uW9Fs^c6Y_W=JwWMi4}r~n z@Zxc$8v4KMeg(%2!NAqs?CLB7hr-VXNAC189{Bs$kH;dY+`BE+7 zaH;A8*UG~pn5{|kH6?wUyKg4J#eJGk*xRPj!>wDd8kwg>bJR}yL-&_L7PM-5WP;;n zP&&K6U9*ys0Z`nFL_o)FO&=IN1bKEpCRkZRhh|qI8N_VAYQ8XtIE1SP!`?YP<6zKb zjkYaA_<)i;d=&z|iXl+;vOWgPU`S`9-2$ToQ(ZOARB#O!OssF7aE_8;Oz;T!VjVqLdl9cKhT@n(p->VRuV)U2_=TNJfJ=g*96DEvI#!b>Hd8VY zu5AjL1SkKTIubl3A@iYRUI>;^EdDH!NpPervq7E|5&@1sr{?{8x#MR%`R$--`Twspz|uBDXDN+=yd9Dj+Ka^<|NE$eHRHt~ zxL}@^_iuSEbFpqS%EkRgG8x83OdAfZ&jpW$nvtPl(7ADf0lFfl4g3Edn-?s>=8571 z&^|3R8fxAeXNCb$)10hdop{zPOevbb0xtG=%?hpS#MSJPMsXn}_dx#bPzSUhpjx>4 zBJG5h2SpQPHHJLL-rOSgm&jDeZ<8yadSR%MEpHJgr<3XI!g(=U5YcL?W-y_Hzu%c~ zZlsjSvOC3hD47M8uRZC^)g@lGlTu_ri)WOA9--O=4(?UJaeHzoocPo(v&<&#`;=5b{!_a`n6*Xwy`3zA{N6%7jJvMw$yT*% zH&9chqprNBu6#*(Rs9lheoz|8QaZHibh3n{-_~{!QpIe4Yrjy73-R97P;1uNVQO?| zP+OMnJxXfe(sAQ{_Kd7Uhf)iN!*%7*nyLE+E{5oI>>j7?8Hvu>s47X%ht7UM zVX!M*7s;C4x*9vFhmMB~ku1ie`+Ts7UB7AtTT`m~+G7sA1`|Z!EZ4?E`Ns+oosFs47XjzO<2Z5W%U)+Rj@XGn3Xx)1{{)_fmEE$hL-a}_;z(64pyg! z1hI-d!wyQeVsB!=g115K_|X~6U20G=39#oj8pf!_Em+#a(B0cOij8YBJWt6ZU^$yO z8aqM5QA&1TN6#9A10W$zp4!b zM`Nf7I>ml^sQE5chLanFbhx<4Xl6Sc#tKRvg-iN@#jyG1XeZ2?VAMfpl~IIaE6f&f zXSoe*m)kg>lE+ZDMw&*RV4(|*--)E%f9xf)8y&_-YCO0ivtmwlm1DILJm-z!usVA%7H~xX*v**HDTx-xZN?t|=_}MSu*(c!IAX7Hn zJg_quDi@#EvvIh>jgpgaO>IhHvGdN)AW(Y3Gzv;TH5u8b#FQkFb{J?Y_k-iZ!9&57 zY|?>a)p;AcDVr=V@i>^Par?(kKfzFtcsqLy6tasE({;K zt3RtI<|ave8*9@6<9<9J1~6n-80?Ro*Nauk=B?C}?apvy=cGFD3>7mu%s;4)0%D(Mg;i_c3Sk=t znU@etO<>8_(V}d%-?2`_u<-C1F;3w zn30DMpg)-7S#qQK6RN*bU4>nuV*3e{bbcyfb zJwAr_+RfPX+Re99$fs=dx8|c-^3ky_GphV5bWhB&Lenp1q0KJg(BBEg!O}{$MwWt8 z$mgu7k5sKApB>ASG_vu!qoTfian_^>`QXe6aK<_v@5+^;0T%~!im+>`u}g_rZDr~Y1{rC(%o0^ywZswNb{qT&rEJ$Csk~Pfd?!m zC>(;F>-T?qTx?~lbU!8EfwG=9LFtqb0bbcUZOp%eeZ$w18EUp+fgR5_M=|}Y(rq*O z9%_e*bx>MJb=%*Q>}*$uG~cedS-k|B1RBPoyQFU@xdr>$#*Ku*-;bXQ8-5rc2aVf` zb!{Kh6iT|##AqEXL8hN)k{_9F5dEEqKj1_E1kU4f2>kid)Nq!WM{(5q8Gf}+cd|qe z#TNSu+A)ev;aAv~>2bpcZNUe@F<_h?ZoVo#3!c+b5NoNWb7INwP&`-6VS+=xL)Gef zxHMIcfX->M5w5yqw90PzT`Fj5Dl4EVRkmZ1TPbJ@#wS4OAL1Zz&$kG0_&a$F$eO+a zY%Y`EfvfKai`#Q$2^Qzb&qC`b)3NI~-dhXL2A5DgF2mqlIgwo$BKI^C0ct014TDXO zp6&sSF*9Uv?}`A2XhbPO;Xpnb616G~HLJ-gtMvj>Y9&k{X!texP1&ve>YDEemH zGvN4koDoV_P8b56Q_#T=+#;Wmhyga3EiSmnXtA=9E%J+$7;$LAha^GJa9SS13fkot zU7`*Pl(0+YUr;EMEi0gN^y{H*O%{C5GEBWTBNk>&?}3l-lm%~mM|MNwY)j>~8WiM% zU(A>SHEEuiY@@|emnCAB3In_RKcq_ZwHEZXp^!bzf-c2lL6;H+wQ}%uXu5aCHfYMx zOW@fmr9fxCrI@WQv#gge-Xk~V82E0iWdf_Ou{_`sF&~B_zyrT*i-V?Rk{w$9+@@z^ zS}eyXiGqD3coDS3Of<85TP^od5)E5!ZH<7&*X8-p9iNWE}Rox&m;Wf+c3=uOmBo?yuhWlVp@I)tcO~{d;DtMv`8rGS$ z(6ZQSfuSz;odmj+~}Sd1?}OoYup1c$Sl*5GEUO|L9lSzZU( zw`LW=`dc$4R@xr?7{#cwRShH9sE*+0T_Pqni3?s14ykOb2|<#0#2JF@XTy=1;tW>m z2*E2b{OlVN2b*6#qi0#}5bO(cp>ckR74}>@lLD{LFG*wz@4g-LVXYuKPlQ*`%6~ zr(GoLSWCzqyVwV7*B@mQ90r5l4z|I{^jTK8_%?FY`*E58c{9g}@QO~G$IiEhR65B( z*5~t(H_SYM#9&hB;tw(yww!_JHhUW5sJgi5IB_-ih+PT6a#^wXq7?( z$rv%-KRff`L3d?XTw78Yx>+7DhT+YN;bCXk9FXS>NCZb*SQLBG5jK;O@o@0w^aPLC(U=VZ{1;06vN66S6Cw0?G$ar3{iv)gTu@$FE8w*i;O;26E;*s zCbMBn!cLmV6ecu=p(&k;!Eo4Z7rEzH2YwW%V})n2v7r}^5Z2ZmR+^3>RCrAIw`y@F zep3eB{p(Ssj>`k}@Zghn6RUBAqlRW%VZwM&yy0Q&^~Uf)lq_IE6Bb4) zuy%aA5c@5@U4({?Z!4ke!JvHTx)h$o7IlR0w4c;=29r~wQMnvBld7Wod;3GlFX1Pk zJ7-fmd+FEk;RZ7Qc`H6|)iDQdM4UDuOJK`y7&y-w<}t%8jn&K=^Q=CKaZz{PsBkEa zwL0P13Tr&LR=0^b^hAZjfQ8oB?F+5F;iTcLfqyDw_G0UGi7bU{=Og36GK+9%qvF?}1N~l%S$!uDS^#CQS;F7&}6m&(7L)-t_1t%P4)>KyAYHf0f7^0Ci zQ2eL0g+1PBo$eBG7Kt=M{x6cBbtw^@1YA{7{lW8RWEqsaV(kML-i(l0i$6k7plhBx z2;A$VjL_)D2kg9_8U%l*N2Nl=QoU(=YQ!tNf)gMwJW7Vcdl&SFhS_^4O9_v7+Cc*B z-ChxPk$Blp{Uc0*h;tgm2eq@u|Hf|TMd&F8dx9t8_Be4Jez5_HAFqf8cQp={p)W+l zvx1h07hPoiv5p8dY8x>$?!B5dbVi`}-2{ibA}|i^iqK||hnT|_iAlC5CdcAdd=Sgp z0*(vTlhApsSjW!gMMf2o?d;19k!b?i#^g=>?B-)lkytE%rN6ZZ?kpK;fIV}mj?HX| zeA155TIrb%%)qrrq9xn`U7AZ1|7A_MRK(;GJ8KSD%B;eLzHCRJJuxVxPha(d#E+?t}Xy|@f=j0ih7z?Iu;s#$MalL zL^8YcQ{SmHp=HH~LqU3I*jRSe6P;iu&qLXugfu8!7rg-PEKiMMtu@gTsG%)x&;Zxmie-bK zwkg%k1~f*ahdu_USVBKGs3{sv+)=#Mi|}pLpgwTojpz_Iu06W-Zh%K#fzr%`ICx+} zxC}KPrActOMlC~W6D9~tyP|PGI}X>HV#B~QDhKQH=?Fb+{yRDZ_8xXbLsQSxD3H~* zG|0QsTZEF|g0uiHgeJn&5wApDnP~9FdnEU3JUK~wt*+dXV_neC<6y;_Hs zysiH%_TIZUg$s?g3>bVmNzd?JT@nvp$r+gba7F|3HQ5?5hGjFFhA$&*)jrz>N%!XP zs=56f+0fW(i^r6^?L+%st$P}24OaH#ticldW~LgvJ$)AMv0V6MKx7Q;wj}A`PNEq)PkJXDHYUAefwxwtg|LB_Y_Ce>^<$kj)bTmI|Jz{E7W9F}`_s_y5u2s0 zGN#!jzJ=d(z$tf3PiTEFHjIsR$Fxy$3H1F79I!t>rV2V1$7DjykeEtn>V<)0`|yGw z=q!vu>oz=QHuUXZFc$8lm_wlH^$}^%QkE&gM?a3thK~LPvD-$81{mC$kPPMl1uwAG zLu1yP$UAT;3p3g7g)tIzO~Z25PK&W(hQ_Ib6A#3g_%RD>^u*w(@h&D*3j0D!;{5{b z7?q3Z^kKGewzxFr5xdY^rR~iu9#^K;s2t5uRQQ^DF9FxOm=p*tj`09-Ge&WVSMXM!!L`2<9nj@Y zOkyMD*b~X5lNtKN{;Cr{#c!`c?e+KssEH4cgu~NEEQZ$97#)065^I8w_SlRdFV40= zMEKu!4M^AxbRrK%=+iYq9OhqER&Pd!2MRb3>~MOA{*+7ZMT!_P@Er~1yvRs zPX4?U5{(lovDh%bgjs82V_{5VY!J(AjKv7@E9hQYh_0b27K75SAvUFY0-MqjJ3N(q z%XXiQovk%sxJ_;>SyH|Px;uJ=MVR+QOfa-gD$;{%VW9*iSCF2T4yP7MpX+B~-<`6b z(FXmYY?2iNYHUO%yz-{K2Mju$WMHvp?bo#8&sdp1!8t`gfwd0J#C|!mwa~<#e9u0^ zs3y1JnNRFEo3Nx`0aP!|)Uq9&_61ZVf7O>~!6i?@aA>_gas;##k4ypg0K3TAyX-@# zn*0sj2?fi*@w2@HQzXOn7&na!hMOgs!LTN?e=uCE!+tL>VuYTx636&hJ-JiwSX^FS z4|`KG`>|mT$4QEzxZrl6vBM|cli3#<{`qD;dpyrkf^+YnJYkH4nuO(A7^N#RvP_TT zeX7w^)jeqw`~z7T1ZWBL>0RbwyTYYju82F>)@B z9Fz#1?_gU#ys_vWkpG&Yg~sJ-fgNslPUJE4rH|9YVAR7!)1lPeBLwoEOvm15s7ucd zbvP&Skh*qERv4VB<3d?+ZrloyIM}&9aXoc>YF6#U@H;UC zj8De}!?>`xaA@s~CqI4pu|oD>Ufgm!iHF(&K}q0=jMG8dfjAlRCg>>hl*S!)k+@?` zamgB}d=U@3bK^`fb4Q#NF0HN&VT+sN9?B4t@D8a!i{dK49T}JW{|W#sz{rlb$K8`i zGFbRmaa%-^&Yt=%Zi+xsj&;SMm&|Mv;*o?b7Xk3CTt|F|on&vfj78;r5uePe^WwMi@cL5b9y{1)7wBNq zi8wvW@xb$m>cFSaN&(ClnK?Wl_oF*o2PwR=avYIXvKg zB9_H>#dlIN5USM)vG5?#MM245*hEE4q|1IjnC>0!{)KV&mm^E`m2tB*eg&Hxfob zH5-`@o|6et>|lGsRJ(S+N>{7i&sDlp9eiMr63ZV*SsHIprg&@LGB=-WiGptCazLjm z(F$EbXkGGN9Tf?kkx4pup7wL|Em()VGO zyoa;&#*2LvJGOvq?|kT$l9&ovyU?uNIg{HLPWpO;vNI`(eRbk!d|w_IH#RX6no>q- zx6jGMY2=jAXi=Xn2#37lL^rgg7DU0FzY=kNGB@#cXh}{^W_z;}=Srj)`-?<;-0^Vf zv7vULY1tGUJM~)FJjkhKgFK1&Ix#8WNsMB#rHS9zg#jvI0DtlvAxL4#iUX^csSJhw zek^=-XP5+~U5UYLlRvRGNF0YXn+)WAhZEdtn;BaFvIRlA)+RyA$8!x(b2O2H;m4jq ztg0z-8zocV(%+#m(B*ux2OQdRBN+O{J!yjTlCGAakE){fFc>uNV;X=f7OGl-M0I@7>uOez3( z_6RNWbR-_7WIB%j?lkE9J{l7vH&Y_OJ<*N5Mxek99f$FqK6zwRCU{aJLbq!Y^epyT z;+GPc0oh-okNZ?iGQqdE@F_}T-I!i`IXW04g~TWAxcE|2i8G-1o~npZIkj4e=awxK zR#=iU?s{4Fq9y4u66F|yOTN(fS1w&#g|(ZdJiJS)GsJ^%&VxZ$2k`DY$ki~d>I!pU;y&(A3QtHfC0U8!1%?Ho3 zdi|4SNfc)Nb+=%Z3i7XON5c=F#~*+JH_+78WM`XMY;DqYX^Y3CR+q!*exvOyzA*_q zhKB|>wh-sH-g!m-1A8vsWHnVT}bLCy17{Qg^MxC z)GT9O@D;6<&FDzlZ`W4deL>JUKRXmN_eq!*UCcbqHl}7TtCI`OqzbZsafY)fIr&>V zsez^s9z?mjlfSe>cbB6Sy5b7l;P%^cp<_EH086$E8VC)S2b#eCB+g4uE>1ouVJ^t? z`GcYG$S3b&3;o%FNK8mEa@ukHaS7HM=4``c(e ztEoxem`;|le|9DlL9E4xSPmC&?zh6HEZfu!liv1Y_Qszk_3Z)OV+n}QVzSsl~|ERP##PvfSLn2*k0Tz*j^Oo zd}GW8HQP8OWtkbL>yJF1gIQru$_v!!TaYp=e`5ahIWytfn%E@pUmbHVJ6xLLaq-lS zdL88T$i>uYQwpX|?_>Ipb36pX){eEnf=_a6Oxc&>mDKAUU^$!;&Z1jWuv^~%U5||I z$@;dZT+YO)dg*3LHz9#zT`4@}(GLR6&q;l=oZl-vU~C zM&2#J1{WXt5LaGl4!GE7LYgy31iWq!bl0Xuu)%WLDT*1s4@H>KD=n7yFMGirlNJW; zG4nK_JjZsIDxv@R0zjPjtU^u$LUwH{*!*3}|-?yJJJB28&%WuAiSR(!#>)-<%-2f#AVh6_g8)83`H%;MBruHoSB zS&+!8I?}e;aT&!}%|~c^y3(+H9E4|U3vRUCOb@eb4v!lHmQxv4aFnITz^9iBN};nc zvleH9ov|QaE?5a&sjVEbVm9F9xZvwm^uXU&+06Wr;j+#@ik1LK=9`!+Zs zW=#QQEArAG;EA}yAH{42_wp(e+v`a$b%}@YiQAy;0lNR7m7nz8@8|8`ceBQmxI zKI{Lkk@eq_emaXU(NMn#H7qS2E?i4r0j;m3m9jhS=>jD$VHRfuUjmulc{g{bJ`T0_ zokg$Z{|HkW*z;|3d>;hwY#w22+nrHi*EZmPDWh#*mW~BWw5%*C<1KZ_$+r`fe!MMY zyKvR6#kz-hKaNoqzA)IU@Z&i15clxf9Ruo~@9{Jm=^9DefMAdnyZ$PJ#N)Lu{% z7!k)la%ZGcatexPM^F3rg||$@rK(r+G8}^qm`gY?8(Hsb8E;ACE!YBfT)xtkag1Wlt*nrj{@NG;`Y$fr)^;*;XbQQ^ zG^v@P0=dW{GBdwci*I7pJ0SnQe%SH4GmlcurLsz})c4D0Bl0p|p_nl%n}v?QE6kPj zzZ?PTtEDU!mkbY&#_84%vaGDLEc02yew~tO)??!Ac-`=v|K$fTY2SHuLKK*cA z)MQ+&)!3ftvtu@H?USZ(miJ2fGBs=ZJadVee1cg4eydMmOI1P`G&Q>7+XiG|g8MTl z%aTU2v2xZCm-rFBVa&ei;+i35U6GFM$;&FIxK>5*WZj{{7xT+gp!=sBT!?kNP=p7s zVOXAbzuf{IolXa|6b0#_<<&7dwy89$)+KggS(r*2=I8~t1`Y^ko~Ep$RR8r{$MjNM zj=62`z3I(eKZU{C#HSFtPP5o_Y(mOmR=a>^>&Qt0t!hLD#-4oba|~>rr`t+P@n z9F~6OsWp7ah<`1F3?f$;$f@ns*C)1tktEJg=baz zXL&IAsNQ&}P#J;!)hMMu?0M6b4L>ti%>O^aw8AIhH-cEfS=WnNzF0;5Cv3TrYu$bl z1Df`}sS+F9;d;X^C@S?5$m=+n&j;LIp~|D2JagE!ijsT?Z* zx0rQ5Vkq47c408<_|fGui+|wRf4AA(*D16=qmJM{;vXm;s|jH)*?oy(l4{i5gLjzC z!B475x%*k80;R}(ihb&K$K$~qTrDkMPYu26CzvhI{ncFq5uw(oQR;4#x~8mdF4X># zTES{c-OUu&$+*K4LqUEl5m!>oI4HoIOGn8t>#@Xi7-q`1!RBYj#wjFdFBPUO87t+th9QV$C*+z(2l@tl?SGBmjs%vyId$>J&k)1^0f_#24CME~RV3z)u zY?0Zzve9|jpt~Cv;&=7yj}0qv3|4>lP+i-ooEPl4s^`>m$l99TnL37!|4WKXcAS+t zY2do?odKdgN?r)@Dfsh;S8jY~VQ1Vqn3KmqX3-cQv`or~V0-g&=2C(`#Zbn)4YO}0 z2eU6cIX0ITSMg{P7K2C0Nrv_`9LZZYV}4lfjrF?Qh5g@7&jzKIv!T4xOJye-bB0rr z2xX_nAk|GdNOcmsG&1E5fqzb$Q(4BNIUmKG)aK13eT5(eQk3!7Du?<;LB{EvEcjGO znGH47WAO(mf7|Ua*qeeASwGt?Y~t%V<sctWYYHO^(4Rs%%scocIghYRs?b;s_i6>GpuKz!Ty$4uSSKBr08K%)@h9aPp89)V;Dk9Pc5k+YOXy`CQQIIwi!2&WA z6+1TW6bqW-lf;5X*ijRO#3Z&T_9R9fO`?fL#S~3qqTf3De9!y*?|=Q*pX-WDIkV3` z=j?W`d#$yN;}O@7qeuPV1Rb?VsBd@(tbYRq6C6F>xm-$NoS(8 z>DucXPMZD^LNc88HKW8czLQC@bT8H+$?jNO94VAhRhV%yJ@fj?oMvn~W66A@1JC(# zetr7D=SuVOC@83^svN33T6YR7rJnZ#_fXZ5z*pGVb%B?BMH6tqB*b8Wc)B6rOylh0 zV0;!{NCAhZ+moW^RR}XDT=L^FMw2K~`%ge3e7l)BKeXFYr9pW zY3Y#wGkYO^t?!?JAqdKm!3kfE=91X?-zW6&2w>Y^6B)z0y z6LRo=&i$cAysQYirv%FK_VnqKfB23923RCg?xZvaABc z2X)Y0xk*Z8BpKF?v13k}AT;h&R6Gb500wSekOvvdgXXbreNdrXJQLE#!Vk{gS#nPteLpv1sg~^(R(a6n+2?xc*=w;V*jk3C=iIW_+2p#JQ9qiL%Swg)1E)X z>GWRLL`PbiEwN%pIw!^|fhRrs&U68(MqrK@TVp%rKYVjX^7+{;iqGGK(UH$hr?Nx) zCQg@eB^3I0BwBUHio?u^yES<@QyC{>C09oJHMUs3 z4ow7ZPyxo^2v02JL4QzL1tZ1cIPw%zcsmkD{XdU5Lfs3%=GdEOf0)JC27fe8RE`VK zQ&KF@zz=5xJFw~M;66W56+W${l<~H%w7WG0ik5>iTT*j!f0W?iplTC!F8;D#6E zqLn6C`@Iuv&BhsmzmkJGl;U6;LH$8DgedpZ4l2tL*Jg2j-=oV!BNzIKnVGQxyXW%|D;7T1m@z1whmNJH>cw|+RrjHRh3E%O3<=xXUCPdj1zyz*jNrx%RC3ThIT zmuY21n&UN7COhP9HugGL2aiJ;vl5`Rt?J6pJghP*B zYZ3L12?3#QHRaoeB-6^I1QlI-Iw^ylQiMzb!w6j85EQTi1*{|etPm8S2|)qt>CvG? zNR$$StjSOpvX*_M4Tg^9UG?UeoSY)1q&*rUVV<2KSNyn*ef=RIEdXXQd7Ym5 zgz_q+5U~27{TK?t^V{4j41MZn^%}n427$5f^a|aa;#sK)6!3;Hnx*)M?(q|C#g{v% zr!N!`f;P0m{bjzlr!rJbx4#LsqBq(?t*JW#5sbz~CSgz8LWLIG_P);0KW(^o*k5mk ziY%mWp^Tm2(b2invuuIBg#ump7jdRxE-y!H_5B;Jv}!NP==msg77ZN@RnV9BZ~XVS zKd~?*rTO8#QywN}UIU@u$be=XeIwM4uD-L*l(`Rv8kOApBCG^TrWlOvCBtc;VO>Sc82+olY6*3`9y?&N}7av z5ldYkw$BovMDzjQAgXvHOv2RNVV}x5M*9w_W7+hcF!WHM5hjO7wQSUgO$J0e{>HEi za=~E?3?G5ybauZO7d#a9jT|hZ3ajwxq*>)9K}_W&>iWXVzE>ZP!T)30-fqC?tO)^Txi_G#>pu!wnx`iGs+{|TxP>OrmZpU}k=kUqh|SQ3 zA5@wj1JYFSlB7=EZ}&OS6~6=aEW!|uDB?53qkLhXQ}q~=_elGh(2WgthrcqKJIy>k z4@YM3By%_({=0}f4%9sS5hwZ-RX9PeF;19k2E#GeoI=|Rf11pF*{6<}HjX>b;>seJ zkQ?mNNA$ZR;2qcyfnqMP{hJ~Z&A1DF-4TUB+;vuTDdLWh`O=V7xBJRkzZ+nH2sQ5Lk8zPbPzClAz zY=+b7%;8e%>}v#zVrw!8C5I#BEYCmkZMndh3}SA?7YlVf3?bS!llncJEBt!aa_@d=YVA>mL$HEMe$Ccb|>hv4Uvo0dPM^NlmTV7fO z; zywGFcpTb;fJ{9Q#VQZveEO)Q(Y2?13Fcd6JW7l(aWK>O;BYzOJy0 zUksg+#7sf(AJwbm9+Fj$St@(QKWevJFjPS)##^3U`N4owCq+qUZFJOdNTs7zdP0D4 zuO!M=!aeBIM~PKJ(J)TLN=Elr zN14+%s_*L9wRKT$GVa&D?x+p6+!MC(Kvb1ER2ZR}@20T0{wPfOe`388^-L}>`3s<^ zMH^dYj9P?uPpNuzdmu%OYDbE_`MWpio?E*!o9f!0DdM$Kv+4el@3LRMI^xlu_wvn-Xa9@}v=f>9Q#7-Rd=+X}=BZF$_A@v68;bp5wIw`9q-D9v2H~Ol zmY=}nd7obWFE{C|R%b+8uIbdXUOkHLT~V9Tvp3b&?CE;-Yn-B3uP?4q)tA=J(_yX_ zirA|g)pN{6CU`Aoif%R1Yh}mOrjn^um}jx{QuOd2-FrvPXWWERrs&7}4eI+Z-kLJS zAl@o+eZl;OB#BoL;wTIof9DJbP-iBFx?FupuF%!EMJB~&%nbJ{n1=(*DLOuLIIaCq zZH5IG>J~kuJ}U2et`?iUOx58S3tHDV+KmRk^F|=uBoI<}NW58Za`ZmT)nhpR^uvZR zg(CVF$g(U1LK*G$ibl>y6+OZm0A+AO^l=kjZXvXyfx}qrs_%p;*(;jp-C&P&ow378 zW?Hl*4c(oHxH%`fg7m9xMdbf&f{<;~Mi(hLTP8F_qrVO(<;Ljo6hA?j&Q^Cu*UKTo z=v*2N1#NfqMY+(vuDFPNH%2=`QWt&C2f>}}dNf8In3V{@7x*oDHGTB8)D&Ey=u$o? z%X=D)A$KVH@MKQKM1hkdM4XbvOq%?WgmdmwPc~6=qiEeRik z;3D)uSU4Fq@+9u`86_F zzIMl?jp9OC^|6@ErracqtueStXy1i=C=!DKEsWNgn*>q!xfrl>ULP&O3Nq#cxmkE| z5p-ikyv|Ym#bvu*_bEm{=ntwVnJ3ev`YG1`OWD~yR%XUt^`BDqLfo#Ng6c%mqk~Dl zRGU0yG)vb^*~P0As`EgNiquXyu4H0;X{;$Q42M>KG<(NPN?1O{h3adkDB1euQ!2!K zEF+Ai&SU2syBfY0)9yRxK|1N2a{5I)Ba9=}z?9Lnx!3Vs5`QuU^2Pos!+C;4b+uzO zl|FX#Cgm24z|DhGmMNuYhsosTUDC5WXf+_U{voh+0!|tcgoKkxTUyI8XRo5 zy6!_WGP|(bj@kb`1-amOCVw_%h~q;kVFD#)IF0Caj=jxCQ7P-4FeNBrF(o9C;;h#Y zsXbi(U+Fo6YiyegVV0HD-<_%^_lTIcf9w?{mqPxgVl-w=EYdltWOejwC7HR6^`k%E z{t)RLx3O7WzB3%yU2W_LB{!4hzm{-I1g>7xxT!WPh3R@QQ7CQ6JOpSq?ueOp&H=c&!5NI zm~v@-gR#$*;tX7Cwu-n9MmujRcMc|FCQ@)c47h2et@B7a`djRN$fOEH|11B*7Cnj` zsgioNPQrPjYH6$0RPX;vhk091Mf&il>r@N6vA@HdAJuZ%5}T##jkV{G%|~v=6Kt)C&Ra>nZK@e1r6LItd3>xr$CTrz-n67= zQ=RRh853%YYrM#HnzJXHs-AiXEQ*DWFG|pnl{|I~^@~)#bTY> zJr(QJIn?rWDw;yiRIqA6pAgQa>Ji9yeyRSZnynm~TIVM!#itddRZqK4?^ukt0bc^S zIET;UT$sP>H27sy(zy%1F=&P3CR6t|o?|Yo1ooaj!;w_0y=+N!rwY;1EB6$1))dH= zB5;P7nw%3xk!q?7IFJL*QkEMqZHF%(MhdIx=I@h`>FD#7Q1VezDI2Gqc2y}(7$#jV zNZ_GMwSWb+P74>C)t;Ht8o_s}S=87uZ5#<5>>PM%swunPG0j!Nt679~q&V)HaAHC>{*QQy~ny;7lkobpW8J%(qbYmN~Pt(h|dQ#5# zF@%O5EVpMfd#3GGa)>|&rk5+$I;?D=O}ihvI^g^MV7v2qy= zZmJqbe;@Szk!|JTie;cD=$3n5r0&B=A%lY^=}J~g`>f(jl;XvznKi}5wDqJi7WD17 zUb%U5u?h}Ppuk|78QijCICEFWA&NKfxho9fnm7#NE%f?kVOk9)v-2~=NF29cs+kp-z{1M^GhiDMuwP{7~HhqSA8 zGI9W`hr0qs_W6oE8;BFRfT}Q1>;z5Moj4DsF~)r$=T^{-AS6zn6~+Q({&R*U`Ak%e zWYt4)>tQJzk);ZI{-Yz?!cCtoGg$>@-ux`pSmv*oe%4Rkfg80} zHK(`|NIQR(x=laXKp`<53W-i~)dAQt7Eezkt>~_hG~bT4BK4f<(a4TZ@A2Z+v#N#D zJ4K>3C}RUviQLB1!_~fZwDsdR$5H1R-x3zlGW~OzU}G)muDQZjAcD;rcH3?NcQDU33w*cfzx#zm?5y?x|xa1 zj9FrCGs_$?;~lZ+b)0$&1@y(vhAKD7oD2>~C}$Z5~L5OnZ=6Mk*jG1ZJHIk%Pe zt#nT%?Q%dt`TjHBl5^YW+}i=5KB{JbIWrTa;Q#v*E4EZUqe&^)j*j{9C}cbBMIMxV z);*bjF4JF9bu}$MnbfmkNBs(Ih&EHeMS&1`~`&b{?jH9jugyDvjn@~rqhfv z(%O%SWV`hz^PUC2A@{a;D14O_H?Cj8tV5PVcyRL{U`EwPB&0Cg~ zwI%}d4Qh#}OuKkL5WJ`UclPEtyZ8!$*{;)zTlt(u2z8dbck^wumGp^|ZxTQuovu!$F6N2OVlZX}65VB2FKFPboY#OmgbQf6(9QWmvFw0u)b)fZ-ffj#*ZGg|d{8erP>_-Dz&yY7Tkh#kv$HU3SBs0X#} zrIug8uo^6j8%4(1$sLDUN7r*CK+{mI*1bfa}z1A z?yizg@;I{GbMZT5JbWNLNY!5Ru~Ia~qkA2qbHQUiWFHO1PlL|{si%w?PG@#pkwH!W zv1zY=!UY~m=$<*ojutxw6tTsMgbt;6(lE>EFWI5qQsy}+K_Rj|((?AmRt>5Z735*s z8rYWJ`f1?HYH1@9?BV4y)s*3}Rtb0$3*k{Z*E(h%8Eg|`C}Kj8A3a~E@&lK7Y6>fh zPI#4ftZ=h;c7mvPPAZZO#+~h0ji2kaHX%c3E)@AFg@v4j0s?yvLE0fPXibfU7@2+dF1xsAlB|vdc+lyiAU+IvAW8NApVeW=>daJvg-~7L5U3I_4+Tsb??QW??^FOwNck>xW7gir7Cbl4%Wz+x$dlQO;$G zK0Y>-9{!jZ2v+3OXi~;`+R*bg;{(aqq!*I*VJw^=0;U2?{m)x{)VP5EdTaPf355(x z98GKE-V%4YBxQh>muSj-_9tGp1k=DU$JpF`(6p@M@yqGw{9JGX#m6IJwdpzEk)WHE#I{N2W5gG4zxze+S z*s*j(1=+=JV`9N5K6SK;`ses)kVJHW#x2#{imnY@lQ5|`>4_=tr6K&5tUhosh=4HVv6O4;5CC zQFgFp!lcVG)JYG$xSK3)ZW0rTucCgpbhJ-sGn$RnCw&b}h(-T6-kziUS3nf*Uu20; zyK0&QY`yWt?6sDpxiap1svc`Mioj%$Kunc{2;c|0`5MU7ycz`r=6Lfi(?Ga>bthen z;C^KC>q$eL;xm23#iN4l+NIqrh!K~+IQksmrOS(T&1IW`h zbs}|7TQY*R4<$9rE$->+N+R4!O6Qa$WfHe0UDfNCjMM&1`_yR|Iuyz1Jojn9B{_+u zs*?Bdh|f7)G8md_t02~_P6m=RL;;z}(6YTzfYe<GNdP}v8Kg54Vuor zQ6OO``<4$+l@R_$R)5V@Qg2>{C+*#lY)U`pWjL~`&g6|et0Cp5lth}~t(Ziidy+3w z<=*7=r0z*RNPeT%Nf?fwX(@TEs+?C|9!7~blGCU&CqqIzZzTJWdPi~z`?Dum>?isa z=lK&)&+L_;PX7Uu7K=>E6+)kdv z!iSPSmkWeXNw?VgO)~v8$*T85%?y0YF1g&lSVFDw0K@$ZL=)1ph#< z!SG;0)k`!O$C@-YP)HZpfH0)_ObMLL!|jc1mfx+x+D1&e1x3Rt%>7gdZRKB;1iz8a zj`V1d#gbCX23Z*E{$3;Is8g$nA?1RUr=&UAXu;N=*VI`e#jpD#3C=0EHCdGZOR57~ zZqzK~wMJ!}4Lr0gbrvjeNHfUGjG`^AZRlQ*gE_emiI$}D+wNMudNJwAvgkDf;4!voVt(V8>8-jw0_fh}YDlmy;}kvq{C zP5QrNTS+f&Lk|0;UB%0$#n*WP^)E=d#gN!~#o2r~Z|{R8JK!)%8M77Z_3jj`*X^j~ zSjtU$2<)2%$0eIn#b+r{jBiP|XD<6vGTZ?MHC#-YCxJiX{i`VmCmh&~Ybh#$)E0Fd z0f$!Vu}`(b+?s+80-gIPjT=1>q`FXNtU*W*H>ShI&;iqd_b!7Yp!8H*);W|?%L7hU z9~#1Y)v2EQK+OAS>GXLy9X@cu>nnzGn?;*vMJ_P-Nn9%5SH z|CJOwiqxiB(t|G!h?%c86?l~!JKmQ1J=WE=sUsNjpsAC13|`X_HL>3u2n!i&tl$cwh0 z0bVy_y4ak`8d6d5FMIu2zA+Uo5z6H_>rEtI$oDI8n~bh5NlO7aFl8|@qyeJ~A*)pigpI~D zgpHwe^FbOS#i2AnM`3i++_Va*P}yku$KvQYR?5wMT?S`LL!|W_e#R5B?qAYA<>>iO zDHaU&F9SZ@q(1e`=lRh0bk78CIh_KIJ2+5cRH}ro$KszGyR4JgeB;cOu#!Y~sEvkr zS8X$hJoC^@BrxM}8HtpCJjkCqe|SYid*$hJ7H52g`SF?`k)~^0Ivfua>03tucXA0z zPZS`@Uml#kLCPy{L}?VT2+}`$bvmpAXHm)@nbmZ3j?SDJwCQbfcrpf5q(_kZy(BkQ zs88?a^*1+1WJQq5XNj2pZpc=!bVE9@#0P@vurP`z2$eB@e8KswlbkliJ>f%vHQg;y~+SR78;p zGr$^*mYE-TaCPj%^vr2eUaKLRN8JlEQ)oqPrUjK>*Qc=k+RPNWN&TD}it}CXO!rgg zn=@a1=2w2=k=UJ5GLnyUWD@h1mee*=`7rySmJo8>nK_2u2}p-2-hQ2k&E1)~k+av; z)TyE?E34{sILm_FC2dm6VfIi4nZKJkiXtl4M^WbITV;@R!AnRoUN(a5em65!%;PGe zg-q6y`HP&Y&SjeN#w(&lOxDkT(7z+y3{aV1^m|rU<&( zq0BvGNnAx+;#~h2d&ic?2n9RB#vRo< zRTkDbt(4N4UP(Q|B~EOOf7U!X%s^7+ro;Vht4>Tq%4RwF1ZSDkgoioSw05tdnug|O z!xHN~ogFi(v&JZePQ#>5{N1&dnzuZRYBR o=e5&Lvqc{N1%8)dx7G>QT0kEh@=s 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 yk*-E)YSxb-Ki889C!PboQDFDECwu4$o +/// Renders the fixtures under packages/igniteui-mcp/shared-fixtures/ through this +/// backend and compares to the same expected.txt the MCP server's vitest suite +/// compares against. A change to either renderer that is not mirrored in the +/// other fails here or there. Comparison is ordinal with no line-ending +/// normalisation — the fixtures are pinned to LF by .gitattributes. +/// +public class ListFixtureTests +{ + private static string FixturesDir => + Path.Combine(AppContext.BaseDirectory, "shared-fixtures", "list-components"); + + public static IEnumerable FixtureNames() + { + if (!Directory.Exists(FixturesDir)) yield break; + foreach (var dir in Directory.GetDirectories(FixturesDir).OrderBy(d => d, StringComparer.Ordinal)) + yield return Path.GetFileName(dir); + } + + private static string? Text(JsonElement e, string name) => + e.TryGetProperty(name, out var v) && v.ValueKind != JsonValueKind.Null ? v.GetString() : null; + + private static long Num(JsonElement e, string name) => + e.TryGetProperty(name, out var v) && v.ValueKind == JsonValueKind.Number ? v.GetInt64() : 0; + + private static SqliteConnection BuildDb(JsonElement input) + { + var db = new SqliteConnection("Data Source=:memory:"); + db.Open(); + + void Exec(string sql, params (string, object?)[] ps) + { + var cmd = db.CreateCommand(); + cmd.CommandText = sql; + foreach (var (k, v) in ps) cmd.Parameters.AddWithValue(k, v ?? DBNull.Value); + cmd.ExecuteNonQuery(); + } + + Exec(@"CREATE TABLE docs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, framework TEXT NOT NULL, filename TEXT NOT NULL, + component TEXT NOT NULL, toc_name TEXT, premium INTEGER DEFAULT 0, keywords TEXT, + summary TEXT, content TEXT NOT NULL, UNIQUE(framework, filename))"); + Exec(@"CREATE TABLE doc_toc (framework TEXT NOT NULL, filename TEXT NOT NULL, + group_key TEXT NOT NULL, section TEXT NOT NULL, group_label TEXT NOT NULL DEFAULT '', + path TEXT NOT NULL, ord INTEGER NOT NULL, landing INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (framework, filename, path))"); + Exec(@"CREATE TABLE doc_groups (framework TEXT NOT NULL, group_key TEXT NOT NULL, + section TEXT NOT NULL, group_label TEXT NOT NULL DEFAULT '', summary TEXT, + doc_count INTEGER NOT NULL, ord INTEGER NOT NULL, PRIMARY KEY (framework, group_key))"); + + foreach (var d in input.GetProperty("docs").EnumerateArray()) + { + Exec(@"INSERT INTO docs (framework, filename, component, toc_name, premium, keywords, summary, content) + VALUES (@fw, @file, @comp, @toc, @prem, @kw, @sum, 'body')", + ("@fw", Text(d, "framework")), ("@file", Text(d, "filename")), + ("@comp", Text(d, "component")), ("@toc", Text(d, "toc_name")), + ("@prem", Num(d, "premium")), ("@kw", Text(d, "keywords") ?? ""), + ("@sum", Text(d, "summary") ?? "")); + } + + foreach (var t in input.GetProperty("docToc").EnumerateArray()) + { + Exec(@"INSERT INTO doc_toc (framework, filename, group_key, section, group_label, path, ord, landing) + VALUES (@fw, @file, @key, @sec, @label, @path, @ord, @landing)", + ("@fw", Text(t, "framework")), ("@file", Text(t, "filename")), + ("@key", Text(t, "group_key")), ("@sec", Text(t, "section")), + ("@label", Text(t, "group_label")), ("@path", Text(t, "path")), + ("@ord", Num(t, "ord")), ("@landing", Num(t, "landing"))); + } + + foreach (var g in input.GetProperty("docGroups").EnumerateArray()) + { + Exec(@"INSERT INTO doc_groups (framework, group_key, section, group_label, summary, doc_count, ord) + VALUES (@fw, @key, @sec, @label, @sum, @count, @ord)", + ("@fw", Text(g, "framework")), ("@key", Text(g, "group_key")), + ("@sec", Text(g, "section")), ("@label", Text(g, "group_label")), + ("@sum", Text(g, "summary")), ("@count", Num(g, "doc_count")), ("@ord", Num(g, "ord"))); + } + + return db; + } + + [Test] + public void FixturesArePresent() + { + Assert.That(FixtureNames().ToList(), Is.Not.Empty, + $"No shared fixtures found under {FixturesDir}. Check the Content include in the csproj."); + } + + [TestCaseSource(nameof(FixtureNames))] + public void RendersFixtureExactlyAsRecorded(string name) + { + var dir = Path.Combine(FixturesDir, name); + using var doc = JsonDocument.Parse(File.ReadAllText(Path.Combine(dir, "input.json"))); + var input = doc.RootElement; + + using var db = BuildDb(input); + var controller = new DocsController(db); + var result = controller.List( + input.GetProperty("framework").GetString()!, + Text(input, "filter"), + Text(input, "detail"), + Text(input, "group")) as ContentResult; + + Assert.That(result, Is.Not.Null); + var expected = File.ReadAllText(Path.Combine(dir, "expected.txt")); + Assert.That(result!.Content, Is.EqualTo(expected).Using(StringComparer.Ordinal)); + } +} diff --git a/packages/igniteui-mcp/docs-backend/tests-docs-backend/tests-docs-backend.csproj b/packages/igniteui-mcp/docs-backend/tests-docs-backend/tests-docs-backend.csproj index 0c53ad252..ec4398c8a 100644 --- a/packages/igniteui-mcp/docs-backend/tests-docs-backend/tests-docs-backend.csproj +++ b/packages/igniteui-mcp/docs-backend/tests-docs-backend/tests-docs-backend.csproj @@ -25,4 +25,10 @@ + + + + + diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/CHANGELOG.md b/packages/igniteui-mcp/igniteui-doc-mcp/CHANGELOG.md index 0d3e580b1..56e6e0c57 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/CHANGELOG.md +++ b/packages/igniteui-mcp/igniteui-doc-mcp/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## Unreleased + +### What's Changed +* **feat(mcp):** `list_components` now returns a grouped index built from the published documentation TOC, cutting an unfiltered call from ~17–24k tokens to well under 4k. New `group` argument drills into one group with per-doc summaries; an unknown value answers with the valid group names. `detail: "docs"` returns the previous flat list unchanged. +* **feat(mcp):** the documentation database gains additive `doc_toc` and `doc_groups` tables. The `docs` table and its FTS index are untouched. A server running against a database without them — or one where only some frameworks have been migrated — renders flat per framework, exactly as before. +* **feat(mcp):** `build:db` now builds into a temporary file, wraps every mutation and its validation gates in one transaction, and publishes `dist/` → backend → `db/` only after the staged database passes. `npm run release:db` adds the whole-database gates a release requires. +* **feat(mcp):** new `npm run report:toc-coverage` reports TOC coverage per framework, and `validate:package` refuses to ship a partially grouped database or one with missing group summaries. + ## 15.5.0 (2026-07-15) ### What's Changed diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/CLAUDE.md b/packages/igniteui-mcp/igniteui-doc-mcp/CLAUDE.md index 6be21764f..c45671dd8 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/CLAUDE.md +++ b/packages/igniteui-mcp/igniteui-doc-mcp/CLAUDE.md @@ -16,6 +16,11 @@ This is the **Ignite UI Documentation MCP Server** — a Model Context Protocol │ └── LocalDocsProvider.ts # Local mode — sql.js WASM SQLite with FTS4 ├── scripts/ │ ├── build-db.ts # Build SQLite DB from compressed docs (better-sqlite3) +│ ├── build-group-summaries.ts # LLM summaries per TOC group → data/group-summaries/.json +│ ├── report-toc-coverage.ts # Per-framework TOC coverage report (regression check) +│ ├── lib/toc-index.ts # Shared TOC walker — sections, groups, ordering +│ ├── lib/toc-sidecar.ts # dist/toc-index/.json writer + filename collision resolver +│ ├── lib/frontmatter.ts # Shared docs_final frontmatter parser │ ├── export-angular-docs.ts # Export Angular docs from docfx (toc-driven, template expansion, include resolution, API URL resolution) │ ├── inject-angular-docs.ts # Inject sample code into docs (replaces with component source) │ ├── compress-angular-docs.ts # LLM-based compression of docs (~50% size reduction, supports --batch mode) @@ -34,7 +39,7 @@ This is the **Ignite UI Documentation MCP Server** — a Model Context Protocol │ ├── export-wc-api.ts # Build Web Components API docs from blazor/api-docs submodule → docs/webcomponents-api/ │ └── export-blazor-api.ts # Build Blazor API docs from blazor/api-docs submodule → docs/blazor-api/ ├── docs/ -│ ├── knowledgebase.md # Lessons learned and issues for cross-platform reference (32 entries) +│ ├── knowledgebase.md # Lessons learned and issues for cross-platform reference (35 entries) │ ├── db.md # SQLite + FTS4 database integration (IMPLEMENTED) │ ├── batch-compression.md # OpenAI Batch API for compression (IMPLEMENTED) │ ├── incremental-processing.md # Plan: Incremental processing with diff-based pipeline (NOT YET IMPLEMENTED) @@ -125,9 +130,21 @@ Local mode requires `dist/igniteui-docs.db` to exist. Run the pipeline and `npm ```bash npm run build:db # full rebuild for all frameworks npm run build:db -- --framework react # rebuild only react rows +npm run release:db # full rebuild + whole-DB release gates +npm run report:toc-coverage # per-framework TOC coverage report ``` -The `build:db` step reads `dist/docs_final//` and `dist/docs_prepeared//`, and produces `dist/igniteui-docs.db`. It must run after compression and before starting the MCP server. +The `build:db` step reads `dist/docs_final//`, `dist/docs_prepeared//` and `dist/toc-index/.json`, and produces `dist/igniteui-docs.db`. It must run after compression and before starting the MCP server. + +It builds into `dist/igniteui-docs.db.tmp` and publishes `dist/` → backend → `db/` last, so a failure anywhere leaves the authoritative `db/igniteui-docs.db` byte-for-byte intact. A full rebuild preflights **all four** frameworks and aborts if any is missing compressed docs, prepared docs, or a TOC sidecar — deriving the set from what happens to be on disk used to drop a framework silently. + +Group summaries are generated separately and cached in the tracked `data/group-summaries/.json`: + +```bash +npm run build:group-summaries # all frameworks, cached groups make no API call +npm run group-summaries:angular # one framework +npm run build:group-summaries -- --force # ignore the cache +``` ## Angular Documentation Pipeline @@ -228,14 +245,19 @@ npm run pipeline:blazor # run all steps: clear → build → export - GitHub API tools use `octokit` (requires `GITHUB_TOKEN` env var) - CLI scaffolding tools use `igniteui-cli` via `npx` - Six registered tools: - - `list_components` — list/filter docs by `framework` (required) and optional `filter` keyword + - `list_components` — TOC-grouped doc index by `framework` (required), narrowed with `filter`, `group`, or `detail: "docs"` for the flat per-doc list - `get_doc` — retrieve full markdown content by `framework` (required) + `name` (required, without `.md`) - `search_docs` — full-text search by `framework` (required) + `query` (required), top 20 results with snippets - `search_api` — discover API entries by keyword or partial component name - `get_api_reference` — retrieve full API details for an exact component or class name - `get_project_setup_guide` — return setup guides for creating a new Ignite UI project (CLI docs for Angular/React/WC, dotnet + NuGet guides for Blazor) -**Build DB** (`scripts/build-db.ts`): Reads compressed docs from `dist/docs_final//`, looks up `_tocName` from `dist/docs_prepeared//`, and produces `dist/igniteui-docs.db` using `better-sqlite3`. Supports full rebuild or per-framework rebuild via `--framework` flag. DB schema: `docs` table + `docs_fts` FTS4 virtual table with external content, porter tokenizer, and prefix indexes. +**Build DB** (`scripts/build-db.ts`): Reads compressed docs from `dist/docs_final//`, looks up `_tocName` from `dist/docs_prepeared//`, and produces `dist/igniteui-docs.db` using `better-sqlite3`. Supports full rebuild or per-framework rebuild via `--framework` flag. DB schema: `docs` table + `docs_fts` FTS4 virtual table with external content, porter tokenizer, and prefix indexes, plus two additive grouping tables: + +- `doc_toc` — one row per TOC membership, keyed `(framework, filename, path)` so a cross-listed doc keeps both. Carries `group_key`, `section`, `group_label`, `ord` (TOC order) and `landing`. +- `doc_groups` — one row per `(framework, group_key)` with the generated group `summary`, `doc_count` and `ord`. + +Both are derived from `dist/toc-index/.json`, written by the export scripts via the shared walker in `scripts/lib/toc-index.ts`. `docs` and `docs_fts` are unchanged by grouping — no reindex, no content churn. A database without these tables, or one where a framework has no `doc_toc` rows, makes `list_components` render the flat list for that framework. ## Key Dependencies diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/angular.json b/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/angular.json new file mode 100644 index 000000000..dc68d8c9e --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/angular.json @@ -0,0 +1,317 @@ +[ + { + "groupKey": "AI-Assisted Development", + "section": "AI-Assisted Development", + "groupLabel": "", + "summary": "Configure Agent Skills and MCP servers to scaffold projects, generate components, palettes, themes, answer API questions, and validate complex tasks", + "hash": "57230cd42f0205711cd7da3001172115", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Charts", + "section": "Charts", + "groupLabel": "", + "summary": "Configure area, bar, bubble, column, line, pie, scatter, stock, treemap, polar, radial, spline, step, and sparkline charts with axes, series, and styling.", + "hash": "d332aff3648797a31d64891a5fd48a70", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Charts > Chart Features", + "section": "Charts", + "groupLabel": "Chart Features", + "summary": "Configure chart axes, annotations, animations, tooltips, legends, selections, highlights, overlays, trendlines, navigation, synchronization, filtering, and performance optimization.", + "hash": "a8ac95d1ed416f80b0c3ba1bbea94d09", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Dashboards", + "section": "Dashboards", + "groupLabel": "", + "summary": "Covers Dashboard Tile installation, module setup, data binding, automatic visualization selection, and toolbar customization for dashboard tiles.", + "hash": "de7ac08dd493db9a5ba92241292d60a6", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display", + "section": "Data Entry & Display", + "groupLabel": "", + "summary": "Configure selection, autocompletion, buttons, inputs, validation, keyboard navigation, styling, progress indicators, virtualization, and pagination", + "hash": "3e00a42a88975006e913d65f6eee524c", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display > Drop Down", + "section": "Data Entry & Display", + "groupLabel": "Drop Down", + "summary": "Covers drop-down selection, grouping, menus, multi-level navigation, keyboard input, theming, virtualization, remote loading, and hierarchical multi-selection", + "hash": "036ac177645b9882565d7d1ce45277dd", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display > Icon", + "section": "Data Entry & Display", + "groupLabel": "Icon", + "summary": "Covers font and SVG icon families, Material Symbols and Material Icons Extended, registration, references, retrieval, sizing, colors, themes, and service APIs.", + "hash": "8c7c4bed37e44b066e2a71b9d655b5ce", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display > Query Builder", + "section": "Data Entry & Display", + "groupLabel": "Query Builder", + "summary": "Build visual filtering queries with entities, fields, conditions, groups, AND/OR logic, expression trees, subqueries, SQL, serialization, and grid binding.", + "hash": "4917f20cbcf9ff53060a7b9251628e0c", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Frameworks > Excel Library", + "section": "Frameworks", + "groupLabel": "Excel Library", + "summary": "Create, load, save, and manipulate workbooks, worksheets, cells, tables, formulas, charts, and sparklines, with styling, filtering, protection, and XLSX export.", + "hash": "b2220c7e5785de1bdb2f951960eec885", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Gauges", + "section": "Gauges", + "groupLabel": "", + "summary": "Covers bullet graphs and linear/radial gauges with scales, ranges, needles, tick marks, labels, backings, orientation, highlighting, and animation.", + "hash": "3ace95749d2af12cc352b71081e0f9e0", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General", + "section": "General", + "groupLabel": "", + "summary": "Covers installation, licensing, localization, updates, SSR, code splitting, data binding, grid and chart configuration, data analysis, theming, and release changes.", + "hash": "b6d720cf98832e7134f83c2f89fa813f", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > Angular Schematics & Ignite UI CLI", + "section": "General", + "groupLabel": "Angular Schematics & Ignite UI CLI", + "summary": "Scaffold projects, select templates and themes, generate component views, run applications, and configure CLI, Schematics, MCP, AI assistants, and authentication", + "hash": "6123db64120e15d29048c87115b98c97", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > How to", + "section": "General", + "groupLabel": "How to", + "summary": "Build SignalR live-data streams, validate reactive forms, connect CRUD grids, customize Sass themes, use standalone components, and scaffold apps with MCP workflows.", + "hash": "bed468734bb6438a07d015812edc907d", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > WPF to Angular guide", + "section": "General", + "groupLabel": "WPF to Angular guide", + "summary": "Create Angular apps and components, use one-way and two-way binding, events, pipes, structural directives, and recreate WPF layouts with Flexbox and Grid", + "hash": "ee09a9543e67cfa37fc9a27b43ead878", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists", + "section": "Grids & Lists", + "groupLabel": "", + "summary": "Covers grids, trees, and lists with virtualization, editing, filtering, sorting, grouping, selection, hierarchical navigation, templating, and export.", + "hash": "645d51febe4d19982d7e519783830668", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Combo", + "section": "Grids & Lists", + "groupLabel": "Combo", + "summary": "Editable and simple combo boxes support data and value binding, filtering, custom values, grouping, remote data, virtualization, templates, forms, and navigation.", + "hash": "a14f70a64b331f4402a598dd757d6dd2", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "groupLabel": "Data Grid", + "summary": "Configure Data Grid columns, editing, filtering, sorting, grouping, selection, virtualization, remote data, exporting, navigation, layouts, and state persistence.", + "hash": "20d34a03c6db66e3266a3e387e4089be", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Grid Lite", + "section": "Grids & Lists", + "groupLabel": "Grid Lite", + "summary": "Configure Grid Lite columns, data binding, cell and header templates, virtualization, keyboard navigation, filtering, sorting, and custom themes with palettes and typography", + "hash": "9a9539097948cf43b5688eb88f831117", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Hierarchical Grid", + "section": "Grids & Lists", + "groupLabel": "Hierarchical Grid", + "summary": "Configure hierarchical and load-on-demand data, editing, validation, filtering, sorting, paging, selection, virtualization, layout, styling, state, and export", + "hash": "3d673516b02c56cb178becc117290813", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Pivot Grid", + "section": "Grids & Lists", + "groupLabel": "Pivot Grid", + "summary": "Configure Pivot Grid dimensions, values, aggregations, filters, sorting, layouts, selection, resizing, remote data, Excel/PDF export, and state persistence.", + "hash": "5800f4992cd35af659bb41d5a6a7c1b4", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Spreadsheet", + "section": "Grids & Lists", + "groupLabel": "Spreadsheet", + "summary": "Covers workbook editing, loading and saving, activation, charts, clipboard, conditional formatting, data validation, hyperlinks, commands, and configuration.", + "hash": "c44e054bf7398d19f7b90ca0c5b6f057", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Tree Grid", + "section": "Grids & Lists", + "groupLabel": "Tree Grid", + "summary": "Configure hierarchical Tree Grids with editing, selection, filtering, sorting, grouping, paging, virtualization, load-on-demand, styling, state, and export.", + "hash": "5c110307191a990878909bc86612b644", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactions", + "section": "Interactions", + "groupLabel": "", + "summary": "Build interactive interfaces with chat, dialogs, sliders, ripples, toggles, tooltips, drag-and-drop, zoom controls, and contextual action strips.", + "hash": "f9fedbf1290228fbf2f439ab61a23088", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactions > Overlay", + "section": "Interactions", + "groupLabel": "Overlay", + "summary": "Covers rendering overlay content, attaching and detaching, positioning strategies and offsets, scroll strategies, modal behavior, and global or scoped styling.", + "hash": "fa41bbdbbea7af01f1e8ac04b6835401", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactivity", + "section": "Interactivity", + "groupLabel": "", + "summary": "Covers right-to-left (RTL) direction, application-level and component-level directionality, plus Section 508, WCAG, WAI-ARIA, and accessibility caveats.", + "hash": "d9294cd8bf90ea8bd32a52368e3e8dda", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Layouts", + "section": "Layouts", + "groupLabel": "", + "summary": "Create responsive and fluid layouts with direction, ordering, spacing, alignment, and wrapping, alongside tabs, cards, accordions, splitters, steppers, and tiles", + "hash": "6db4a6fa0f56567ff0d8fe645d727422", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Maps", + "section": "Maps", + "groupLabel": "", + "summary": "Cover navigation, coordinate conversion, data binding, styling, tooltips, and geographic scatter, bubble, symbol, density, contour, polygon, and polyline series", + "hash": "ccd384121c7d2fbfef5a7773536b4356", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Maps > Geographic Map Features", + "section": "Maps", + "groupLabel": "Geographic Map Features", + "summary": "Display and navigate geographic maps with shapefiles, CSV, JSON, and custom models; overlay symbols, routes, shapes, imagery, heat maps, styling, and geographic utilities.", + "hash": "7059374523d1e3ada45f564c3e86afe8", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Menus", + "section": "Menus", + "groupLabel": "", + "summary": "Covers toolbar chart integration, tool actions, icons, orientation and color editing; navigation drawer routing, modes and variants; and navbar headers with menu, icon and back actions.", + "hash": "a4a2f9d648dadbdb7e686b859b1f0b66", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Notifications", + "section": "Notifications", + "groupLabel": "", + "summary": "Covers persistent banners, brief snackbars, and auto-hiding toasts, with actions, positioning, customization, animations, events, state handling, and theming", + "hash": "8f184a91511105107c37f7f74c8e63fd", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Scheduling", + "section": "Scheduling", + "groupLabel": "", + "summary": "Covers date-time editing, calendar selection, date, date-range, month, and time pickers, with formatting, validation, localization, and keyboard navigation.", + "hash": "925f2859fb7fe10e0ceac4c97d30681a", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Services", + "section": "Services", + "groupLabel": "", + "summary": "Export raw and grid data to CSV, TSV, TAB, Excel, or PDF with format options, row and column filtering, export events, fonts, and Unicode support.", + "hash": "2ffe7381fe47c0e852f49c9c44730d98", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Services > Transaction Service", + "section": "Services", + "groupLabel": "Transaction Service", + "summary": "Covers data changes, ADD/UPDATE/DELETE staging, pending transactions, commits, clearing, undo/redo, transaction pipes, and flat or hierarchical services.", + "hash": "32d92c85e585486aba4df8ee6581bc26", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Styling & Themes", + "section": "Styling & Themes", + "groupLabel": "", + "summary": "Customize themes with CSS variables or Sass, including palettes, elevations, typography, roundness, spacing, display density, scoping, and component-specific styling.", + "hash": "20310cc68675a654dd89f4fcb537209a", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Styling & Themes > Sass", + "section": "Styling & Themes", + "groupLabel": "Sass", + "summary": "Configure Sass themes with palettes, schemas, typography, elevations, roundness, animations, scoped component themes, presets, utilities, printing, and integrations", + "hash": "e5e713f955c15874ab22771e2dbc08d2", + "model": "gpt-5.6-luna", + "promptVersion": 1 + } +] diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/blazor.json b/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/blazor.json new file mode 100644 index 000000000..23ca03371 --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/blazor.json @@ -0,0 +1,245 @@ +[ + { + "groupKey": "AI-Assisted Development", + "section": "AI-Assisted Development", + "groupLabel": "", + "summary": "Configure Agent Skills and MCP servers for scaffolding, component generation, documentation and API answers, palettes, themes, typography, CSS, Sass, design-token overrides, and step plans", + "hash": "d4d13f572a1100d09d2d131407de6f9a", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Charts", + "section": "Charts", + "groupLabel": "", + "summary": "Build area, bar, bubble, column, line, pie, donut, scatter, polar, radial, stock, treemap, and sparkline charts with series, data binding, axes, styling, and legends.", + "hash": "cf160d0edb6e45999dd967316a49338e", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Charts > Chart Features", + "section": "Charts", + "groupLabel": "Chart Features", + "summary": "Configure chart axes, annotations, animations, highlighting, markers, navigation, overlays, performance, tooltips, trendlines, filtering, and aggregation.", + "hash": "ec4b08d4c381c4f817ae8b68a6d7aaff", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Dashboards", + "section": "Dashboards", + "groupLabel": "", + "summary": "Configure dashboard tiles with automatic visualization selection, data binding, supported visualizations, and toolbar tools for changing and configuring views.", + "hash": "196a4f1cda43d6eda9a5a5711d252c52", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display", + "section": "Data Entry & Display", + "groupLabel": "", + "summary": "Handles inputs, masked and date-time entry, selection, buttons, dropdowns, badges, chips, icons, ratings, switches, progress indicators, validation, styling", + "hash": "50c3746d1085383d17cd2579e20fabd9", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display > Combo Box", + "section": "Data Entry & Display", + "groupLabel": "Combo Box", + "summary": "Covers ComboBox data binding, single selection, quick filtering, grouping, sorting, validation, keyboard navigation, styling, disabled states, and templates.", + "hash": "1086484e5a5921630dd8e27d104602d0", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Frameworks > Excel Library", + "section": "Frameworks", + "groupLabel": "Excel Library", + "summary": "Create, load, edit, format, protect, and export Excel workbooks with cells, tables, worksheets, charts, and sparklines, including formulas and filtering.", + "hash": "88e000a5d3eca053caa6d49488df3a83", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Gauges", + "section": "Gauges", + "groupLabel": "", + "summary": "Configure bullet graphs and linear or radial gauges with scales, needles, ranges, tick marks, labels, backing, highlights, animation, and dragging.", + "hash": "a74e8a92a3cc941fb6339b8dabe3de47", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General", + "section": "General", + "groupLabel": "", + "summary": "Covers open-source versus Premium licensing, available controls, grid upgrades, and release notes for new components, API changes, breaking changes, and bug fixes.", + "hash": "3554387b18a229c563d250548c138c51", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > Getting Started", + "section": "General", + "groupLabel": "Getting Started", + "summary": "Create server, WebAssembly, Web App, and hybrid applications; install and register packages, configure styles and scripts, and render components", + "hash": "6e0698d58dd94293606c83a9fe70afba", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > Installation", + "section": "General", + "groupLabel": "Installation", + "summary": "Configure private NuGet feeds and install packages using Visual Studio, the .NET CLI, or Package Manager, with licensed and trial sources covered", + "hash": "19434fd8865f3735021242c27ad43fa2", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists", + "section": "Grids & Lists", + "groupLabel": "", + "summary": "Display text/contact and hierarchical data with headers, slots, avatars, buttons, static or data-bound items, expansion, selection, keyboard navigation, and styling", + "hash": "ad5ac512f0820f197a2871a02d9ddf2a", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Grid", + "section": "Grids & Lists", + "groupLabel": "Grid", + "summary": "Configure Grid data binding, columns, filtering, sorting, editing, selection, grouping, paging, exporting, clipboard, virtualization, styling, and state saving.", + "hash": "e421ad1e356d5e713a1ca7b482fb3c1a", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Grid Lite", + "section": "Grids & Lists", + "groupLabel": "Grid Lite", + "summary": "Configure data binding, column configuration, filtering, sorting, virtualization, keyboard navigation, theming with CSS custom properties, and data-source updates.", + "hash": "7f6453974d0904788bee78d18ac7c233", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Hierarchical Grid", + "section": "Grids & Lists", + "groupLabel": "Hierarchical Grid", + "summary": "Configure hierarchical grids with nested data, row islands, load-on-demand, editing, filtering, sorting, selection, export, state, and virtualization.", + "hash": "a422873e40f0bcad5dbd77afc9619165", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Pivot Grid", + "section": "Grids & Lists", + "groupLabel": "Pivot Grid", + "summary": "Configure Pivot Grid rows, columns, values, filters, and aggregations; persist state and manage dimensions with sorting, resizing, selection, and compact mode.", + "hash": "d9f5e6092f70bd97cde111f7e50b76c0", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Tree Grid", + "section": "Grids & Lists", + "groupLabel": "Tree Grid", + "summary": "Covers hierarchical data binding, expandable rows, editing, filtering, sorting, selection, exporting, virtualization, state persistence, sizing, and live data.", + "hash": "fe7486681ad402e571e2b83a0cf7a50a", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactions", + "section": "Interactions", + "groupLabel": "", + "summary": "Covers ripple animations and color customization, tooltips with anchors, placement, triggers, and accessibility, plus sliders with ranges, ticks, labels, and events.", + "hash": "a313de8ca9e21b98bb3f33ffc37a1ff7", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactivity", + "section": "Interactivity", + "groupLabel": "", + "summary": "Covers accessibility support against Section 508 and WCAG guidelines, including compliance matrices, legends, and WAI-ARIA guidance.", + "hash": "75d7c9b2a6f38a71d3392e5d95469421", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Layouts", + "section": "Layouts", + "groupLabel": "", + "summary": "Build expandable panels, cards, carousels, tabs, steppers, avatars, dividers, and tile layouts with navigation, customization, styling, and accessibility", + "hash": "af39442cd5ca84aac1ec12a914eabb28", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Layouts > Dock Manager", + "section": "Layouts", + "groupLabel": "Dock Manager", + "summary": "Configure split panes, document hosts, tab groups, pinned/floating panes; update content and embed charts, gauges, and maps with iframes, plus styling", + "hash": "34a7905d3d0e753c2bd3366d1878a296", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Maps", + "section": "Maps", + "groupLabel": "", + "summary": "Maps include scatter area, contour, density, bubble, and symbol series; polygons and polylines, shapefiles, data binding, scales, and coordinate conversion", + "hash": "d2abb1ff3906a258eb52b202dde98499", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Maps > Geographic Map Features", + "section": "Maps", + "groupLabel": "Geographic Map Features", + "summary": "Display geographic data on imagery maps, bind CSV, JSON, models, and Shapefiles, overlay geographic series and imagery, navigate, and use map utilities", + "hash": "0ef2ef33b93278d0693b96117cc09d0a", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Menus", + "section": "Menus", + "groupLabel": "", + "summary": "Covers toolbars with chart components, custom actions, commands, icons, orientation, navbars, and expandable navigation drawers with mini mode and styling", + "hash": "9ef15ab69f98a67d4376a7e185cc69be", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Notifications", + "section": "Notifications", + "groupLabel": "", + "summary": "Display banners, snackbars, toasts, and dialogs with custom content, actions, timing, positioning, events, modal prompts, forms, behavior, and styling.", + "hash": "0322ccba726baaa05fd26d2c486f6465", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Scheduling", + "section": "Scheduling", + "groupLabel": "", + "summary": "Covers calendar date selection, disabled and special dates, keyboard navigation, date picker input and formatting, and date range binding and validation", + "hash": "d6f85e2e65c55a8c041a92f25528bf9d", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Styling & Themes", + "section": "Styling & Themes", + "groupLabel": "", + "summary": "Load and configure bundled themes, switch light and dark stylesheet paths, and customize type scales, font families, and individual styles with CSS variables.", + "hash": "e4d81ce2fc6175a01174e0792020bc8d", + "model": "gpt-5.6-luna", + "promptVersion": 1 + } +] diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/react.json b/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/react.json new file mode 100644 index 000000000..6feb2f05b --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/react.json @@ -0,0 +1,254 @@ +[ + { + "groupKey": "AI-Assisted Development", + "section": "AI-Assisted Development", + "groupLabel": "", + "summary": "Configure AI coding assistants with MCP tools for project scaffolding, component APIs, documentation, design tokens, themes, and validated executable plans.", + "hash": "a72059eec4fa4219a2dd50881eb88320", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Charts", + "section": "Charts", + "groupLabel": "", + "summary": "Create area, bar, column, line, pie, donut, scatter, polar, radial, stock, treemap, and sparkline charts with axes, series, legends, styling, and interaction.", + "hash": "89cf5307d7cd3da883729065fd78a252", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Charts > Chart Features", + "section": "Charts", + "groupLabel": "Chart Features", + "summary": "Configure chart axes, annotations, animation, highlighting, navigation, overlays, tooltips, trendlines, selection, synchronization, and performance.", + "hash": "52d64ad56f47c3c6f59dab53dc35790c", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Dashboards", + "section": "Dashboards", + "groupLabel": "", + "summary": "Covers dashboard tile module registration, data binding, automatic visualization selection, toolbar tools, and supported visualization types.", + "hash": "79bebf5c77ce3313046b8cd7998eac9f", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display", + "section": "Data Entry & Display", + "groupLabel": "", + "summary": "Covers buttons, chips, badges, icons, inputs, masked date-time fields, selects, dropdowns, checkboxes, radios, switches, ratings, color editing, and progress", + "hash": "57160be47ed167f3b23823f8e1d6441b", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display > Combo Box", + "section": "Data Entry & Display", + "groupLabel": "Combo Box", + "summary": "Cover virtualized lists, data binding, filtering, grouping, single selection, validation, keyboard navigation, styling, and content templates", + "hash": "3a66d8ed59161103b64cd134d504916a", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Frameworks > Excel Library", + "section": "Frameworks", + "groupLabel": "Excel Library", + "summary": "Create, load, save, and manipulate Excel workbooks, worksheets, cells, tables, charts, and sparklines with formulas, formatting, filtering, protection, and export.", + "hash": "8a5396b87f508648b94fa2094959fb72", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Gauges", + "section": "Gauges", + "groupLabel": "", + "summary": "Compare values and targets against scales with bullet, linear, and radial gauges using needles, ranges, labels, tick marks, backings, and animation.", + "hash": "19ecaa289fd76d5a49aa72174cad882c", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General", + "section": "General", + "groupLabel": "", + "summary": "Install and scaffold applications, render grids, localize components, manage licensing, compare component tiers, use client/server patterns, and track updates.", + "hash": "57d54f41eaf1d226b3d15c002cfe65ba", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > How to", + "section": "General", + "groupLabel": "How to", + "summary": "Follow an end-to-end workflow to scaffold an app, connect MCP servers, add features, query documentation, and apply custom themes.", + "hash": "188f25174be9aa6e708242e9911e75ff", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > Ignite UI CLI", + "section": "General", + "groupLabel": "Ignite UI CLI", + "summary": "Scaffold projects and component views, configure templates, themes, Vite development commands, AI tooling, and MCP integration through an interactive wizard.", + "hash": "c0ce5432ddce0a726fc42d4f99364bc3", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists", + "section": "Grids & Lists", + "groupLabel": "", + "summary": "Display text and templated items with headers, slots, avatars, and buttons, or show hierarchical data with expansion, selection, keyboard navigation, and styling.", + "hash": "1c97b115f7d1c7f6f6e729d59924b2e8", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Grid", + "section": "Grids & Lists", + "groupLabel": "Grid", + "summary": "Configure data, columns, editing, filtering, sorting, paging, grouping, selection, virtualization, exporting, clipboard, pinning, theming, and state persistence", + "hash": "e9e29648a31d1627981fbbd97230129d", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Grid Lite", + "section": "Grids & Lists", + "groupLabel": "Grid Lite", + "summary": "Configure data binding, declarative or generated columns, cell and header templates, filtering, sorting, runtime data replacement, and custom light/dark themes", + "hash": "6e1948fcce0b22c227b20d3dc936095d", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Hierarchical Grid", + "section": "Grids & Lists", + "groupLabel": "Hierarchical Grid", + "summary": "Covers nested binding, row islands, editing, filtering, sorting, selection, column management, exporting, remote operations, state, summaries, and virtualization", + "hash": "de2a6acdba170dd4f0fb036a19213ec9", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Pivot Grid", + "section": "Grids & Lists", + "groupLabel": "Pivot Grid", + "summary": "Configure pivot grids for multidimensional data analysis with dimensions, values, aggregations, filtering, selection, sorting, resizing, and state persistence", + "hash": "03615af8fbb7d329e5bc4bfc022b52b8", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Spreadsheet", + "section": "Grids & Lists", + "groupLabel": "Spreadsheet", + "summary": "Manage Excel-like workbooks with editing, navigation, clipboard, charts, conditional formatting, data validation, hyperlinks, commands, and file import/export", + "hash": "912e7f4afe961351c3ac6225a2b408f5", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Tree Grid", + "section": "Grids & Lists", + "groupLabel": "Tree Grid", + "summary": "Covers hierarchical data, expandable rows, editing, filtering, sorting, selection, exporting, summaries, state persistence, and virtualization.", + "hash": "86e17329e1ce10a2123936f37fbccbc6", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactions", + "section": "Interactions", + "groupLabel": "", + "summary": "Build chats with attachments and Markdown, add ripples and tooltips, configure sliders and zoom navigation, and create query builders with expression trees.", + "hash": "63aac80606e4276a58671d3fbfe4c50c", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactivity", + "section": "Interactivity", + "groupLabel": "", + "summary": "Covers accessibility compliance, including Section 508, WCAG, and WAI-ARIA support, compliance matrices, legends, and implementation considerations.", + "hash": "3964f9c3c24a65f6a0feecfcd503844b", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Layouts", + "section": "Layouts", + "groupLabel": "", + "summary": "Build expandable panels, cards, carousels, tabs, steppers, split panes, dividers, avatars, and tile layouts with navigation, customization, and styling.", + "hash": "4015e445f009167366f29656e88565e4", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Layouts > Dock Manager", + "section": "Layouts", + "groupLabel": "Dock Manager", + "summary": "Configure split, tab, document, content, and floating panes with docking, persistence, events, styling, keyboard navigation, pane updates, and iframe embedding.", + "hash": "14e5f1a55833fe209aecb0c544156846", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Maps", + "section": "Maps", + "groupLabel": "", + "summary": "Configure maps with scatter area, contour, density, bubble, symbol, polygon, and polyline series, covering binding, scales, styling, tooltips, and navigation", + "hash": "6d2b32054774f756fa069be9a601cb3d", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Maps > Geographic Map Features", + "section": "Maps", + "groupLabel": "Geographic Map Features", + "summary": "Covers geographic maps with imagery tiles, CSV, JSON, model, and shapefile data; overlays series, styles shapes, adds heat maps, and supports map navigation.", + "hash": "d7464d539c8e03d1b475661d8a1cbdf8", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Menus", + "section": "Menus", + "groupLabel": "", + "summary": "Covers Toolbar actions, chart integration, icons, and color editing; Navbar titles, content, and icons; and Navigation Drawer items, toggling, selection, and styling", + "hash": "7da18519e479d8ca654e6e5ec7ebd42b", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Notifications", + "section": "Notifications", + "groupLabel": "", + "summary": "Display banners, snackbars, toasts, and modal dialogs with customized content, actions, timing, visibility duration, closing behavior, forms, slots, and styling.", + "hash": "1045610aec7af9b68f0d8ea727656e61", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Scheduling", + "section": "Scheduling", + "groupLabel": "", + "summary": "Configure calendars and date pickers for date selection, ranges, entry, formatting, validation, localization, disabled dates, events, keyboard navigation, and styling", + "hash": "ac1f5b60b7cb6769d26fbdd7bf554f85", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Styling & Themes", + "section": "Styling & Themes", + "groupLabel": "", + "summary": "Load and configure bundled Bootstrap, Material, Fluent, and Indigo themes, with light and dark theme paths and the ConfigureTheme API.", + "hash": "86ffc94fd61992d17ffa33b747cd05f1", + "model": "gpt-5.6-luna", + "promptVersion": 1 + } +] diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/webcomponents.json b/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/webcomponents.json new file mode 100644 index 000000000..02c4ab338 --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/data/group-summaries/webcomponents.json @@ -0,0 +1,254 @@ +[ + { + "groupKey": "AI-Assisted Development", + "section": "AI-Assisted Development", + "groupLabel": "", + "summary": "Configure Agent Skills and MCP servers to scaffold projects, generate components, answer API questions, create themes, and orchestrate validated AI workflows.", + "hash": "9a5f628e6c1f82c312fa2639ea4b80a9", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Charts", + "section": "Charts", + "groupLabel": "", + "summary": "Create area, bar, line, pie, polar, radial, scatter, stock, treemap, sparkline, stacked, combo, and step charts with data binding, styling, interaction, and APIs", + "hash": "f5884031a310933714342205e9eaf7ee", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Charts > Chart Features", + "section": "Charts", + "groupLabel": "Chart Features", + "summary": "Configure axes, annotations, animations, navigation, overlays, tooltips, trendlines, selection, highlighting, legends, filtering, and performance.", + "hash": "50d06c6a42ecafdc6f8efe9a1b2325eb", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Dashboards", + "section": "Dashboards", + "groupLabel": "", + "summary": "Dashboard tiles automatically select visualizations from data sources, with toolbar tools to change visualization types and configure data and display settings.", + "hash": "db4226a2f7b1a044c6b021ddea6b0364", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display", + "section": "Data Entry & Display", + "groupLabel": "", + "summary": "Covers badges, buttons, chips, dropdowns, selects, checkboxes, radios, switches, ratings, progress indicators, and text, date, file, mask, and color inputs.", + "hash": "8d12074a43b06a03d43006c5d4340aaa", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Data Entry & Display > Combo Box", + "section": "Data Entry & Display", + "groupLabel": "Combo Box", + "summary": "Covers ComboBox setup, data binding, filtering, grouping, selection, validation, keyboard navigation, disabled states, styling, templates, and content slots.", + "hash": "661eb86e82e97a493401dcb4c927f8ce", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Frameworks > Excel Library", + "section": "Frameworks", + "groupLabel": "Excel Library", + "summary": "Create, load, save, and configure Excel workbooks and worksheets, manipulate cells and tables, add charts and sparklines, and load or save XLSX files.", + "hash": "a2b6726c0e871b112e9f230ae779f9fe", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Gauges", + "section": "Gauges", + "groupLabel": "", + "summary": "Configure bullet graphs, linear gauges, and radial gauges with measures, scales, needles, ranges, labels, tick marks, backing, highlights, and animation.", + "hash": "cf3304e266884ee2d2f997fe925c64e9", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General", + "section": "General", + "groupLabel": "", + "summary": "Install and configure components via CLI or npm, localize dates and numbers, manage licensing and npm feeds, compare editions, and review release changes.", + "hash": "6eb3a8465fae9c45a8b9bd0bb5d5ef3c", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > How to", + "section": "General", + "groupLabel": "How to", + "summary": "Follow an end-to-end workflow for scaffolding, extending, documenting, and theming an app through AI chat, with CLI MCP and Theming MCP working together.", + "hash": "26552f71a235dd677afbe29054b7e448", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "General > Ignite UI CLI", + "section": "General", + "groupLabel": "Ignite UI CLI", + "summary": "Install and use the CLI to scaffold projects, select templates and themes, add component views, run applications, and configure AI assistants through MCP.", + "hash": "fbcd06c425c2430282aad43ac9cac904", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists", + "section": "Grids & Lists", + "groupLabel": "", + "summary": "Display templated lists and hierarchical trees with headers, slots, actions, selection, keyboard navigation, load on demand, virtualization, and styling.", + "hash": "3fe064142806e729470555cf8b08ea85", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Grid", + "section": "Grids & Lists", + "groupLabel": "Grid", + "summary": "Configure data grids with editing, filtering, sorting, grouping, selection, navigation, column and row management, clipboard, export, virtualization, sizing, and theming.", + "hash": "0b208accce47ce3798464bace8ba3865", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Grid Lite", + "section": "Grids & Lists", + "groupLabel": "Grid Lite", + "summary": "Covers installation, data binding, column configuration, cell and header templates, filtering, sorting, theming, performance, customization, and licensing", + "hash": "8b9160b57eba0b0e533a97b2f447dd9b", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Hierarchical Grid", + "section": "Grids & Lists", + "groupLabel": "Hierarchical Grid", + "summary": "Configure hierarchical data binding, load-on-demand, editing, selection, filtering, sorting, exporting, styling, sizing, virtualization, and state persistence.", + "hash": "8d2e90a7751b224573653dd745d192f0", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Pivot Grid", + "section": "Grids & Lists", + "groupLabel": "Pivot Grid", + "summary": "Configure pivot grids with dimensions, values, aggregations, hierarchies, pivot calculation keys, state persistence, and remote grouping, filtering, and sorting", + "hash": "9bd8b0a755af4c1f9889341775358198", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Spreadsheet", + "section": "Grids & Lists", + "groupLabel": "Spreadsheet", + "summary": "Configure spreadsheets, load and save Excel workbooks, edit and format cells, use formulas, validation, hyperlinks, charts, clipboard, and commands.", + "hash": "df2e062c7166ac319be2d1acf00a55be", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Grids & Lists > Tree Grid", + "section": "Grids & Lists", + "groupLabel": "Tree Grid", + "summary": "Build hierarchical and flat Tree Grids with editing, filtering, sorting, selection, paging, virtualization, exporting, state persistence, and load-on-demand", + "hash": "dd715f303e6bbdb624c91b29fe07faa4", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactions", + "section": "Interactions", + "groupLabel": "", + "summary": "Build chat experiences, touch and click ripples, tooltips, sliders, chart zooming, and query-builder filtering with expressions, events, accessibility, and styling.", + "hash": "885e11a79583d7c1ea208523ba2b74ca", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Interactivity", + "section": "Interactivity", + "groupLabel": "", + "summary": "Covers accessibility compliance through Section 508, WCAG, and WAI-ARIA support, with coverage matrices for grids and UI components.", + "hash": "60dabe59ac2d6555ba2e06100c27623c", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Layouts", + "section": "Layouts", + "groupLabel": "", + "summary": "Build expandable panels, cards, carousels, tabs, steppers, split panes, and tile layouts with avatars, dividers, resizing, navigation, and styling.", + "hash": "d34b49973e85b78d69216646bc166351", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Layouts > Dock Manager", + "section": "Layouts", + "groupLabel": "Dock Manager", + "summary": "Configure content, split, tab group, document, and floating panes with runtime docking, persistence, customization, localization, and Electron window dragging", + "hash": "68a2e9be1884303f50aa8e7d6002a45c", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Maps", + "section": "Maps", + "groupLabel": "", + "summary": "Configure maps with symbol, bubble, density, contour, area, polygon, and polyline series, including coordinate binding, triangulation, scales, shapefiles, and navigation", + "hash": "cf8a7c969c5b9d65eb923fac75babbfb", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Maps > Geographic Map Features", + "section": "Maps", + "groupLabel": "Geographic Map Features", + "summary": "Display and bind geographic data from CSV, JSON, models, and shape files; overlay map series, imagery, navigation, shape styling, and world-data utilities.", + "hash": "45b576c449a12fc3351dfd34a609b816", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Menus", + "section": "Menus", + "groupLabel": "", + "summary": "Toolbars cover built-in/custom actions, icons, orientation, color editing; navbars cover navigation, while drawers cover items, mini mode, positioning, styling.", + "hash": "7aee27018ba3bfd01b239015d00da53f", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Notifications", + "section": "Notifications", + "groupLabel": "", + "summary": "Display banners, snackbars, toast notifications, and modal dialogs with custom content, actions, events, visibility controls, forms, and styling.", + "hash": "4087b3a0196f983f3dfce3ffc14c334b", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Scheduling", + "section": "Scheduling", + "groupLabel": "", + "summary": "Covers calendar, date picker, and date range picker setup, selection, formatting, localization, validation, ranges, keyboard navigation, events, and styling.", + "hash": "98309a8283b0c7608d7c7176e566c549", + "model": "gpt-5.6-luna", + "promptVersion": 1 + }, + { + "groupKey": "Styling & Themes", + "section": "Styling & Themes", + "groupLabel": "", + "summary": "Load and switch Bootstrap, Material, Fluent, and Indigo themes; customize palettes, typography, elevation, roundness, size, spacing, CSS parts, and Tailwind utilities", + "hash": "4a7c77749dbab952d29ae356be467b20", + "model": "gpt-5.6-luna", + "promptVersion": 1 + } +] diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/db/igniteui-docs.db b/packages/igniteui-mcp/igniteui-doc-mcp/db/igniteui-docs.db index 910bf53b083a455524de8ffc320bf62efa56a2ad..b094e624090de9397698194e7ca22761aadcaad8 100644 GIT binary patch delta 390052 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%0A7oj7mcZRoF&1Th)`FL{mRAzRiZPIq zg074wVf*%Lh3$I+E7G_Ao=A>w&uCTmBPX+(lGdxFd?LV2;S9S`YF29iN-1t-*vPV0 zI4Dd*B)T^Wy|39Bjat{$^hJ8VoqAN$-zZ_9?6b3oWPjb>s!)^D(S4OQ4Qx|wYgQsT zwY{?y#78sRui`(qwELa-D-lZ?6d;9|a6&o&qz|fb$6M{DFJs|@-yc2S`P@jNP1y~Kv z*^z`cH}24(nsF!;n=y&m;@T5C5}A3xb1~Y!^5jT%Z089uN?U^ZbxsaO%T@+}sH5w| z#}QI3q4<>fhSFl8g^ZFtH`P)G*WS2!D4seQA<6>tZO$BvT|}MSL6f=cH_XXj7;+i= zsp4d)h{11X%Tc=GWH>rkeY=Q_@jD6DXxY%pC*kyCKx^V3gh`on@;z)Sxc!rseAGJQ z& zJ?T+sez;C6D$(`@dv@$P{NMpJ`{IQD1B;V4*Q#G+B>SH-jET2G}U zl6SRtovI2V?_<~gbn0$7zQro;N15x}hqaApyPzSrA-@Y}hH&>ybZ!h>{>n1jN1_Qs z+r#+lY)x>-P*k=QWDr}%9Mzzj-|G~pi)jmB!~EMm8Bf-290U-GhE2;(ZFkWW!_IzhU5hs~Ft=BaO}P6m_We<9d(< z(ru|I*c+VV}Kh+Uu5ez!(+AP4M|PW0VpKz^czVwC;G0U7(jg!Y&SxSB>TIRe$m zZing|Mi=io*dLXxX^TaPrw{2-=eT_$w!Ex;djxp|U7OwnRaJo5Ve7ghgOT6-2B8|A z4|j-A?Z;;{DC5$pAT&FQRkN)RpVCvP=BqtYwB?7ki)iVdeIVIM=vc^RKhO@RuLiWH z>(qKw_9wd=Z5iE>08*cil;~Vz+j{n;y7uAy$tITkZ#(osBm4bx?J6k)S6{_3v?l9J z20OR2y(I!}xgcohe4|6l_Pg5tX$0AVOuyGf?0TY2j*Bsk-NJO3DO5Xu55p!&JF?*{ z)p$yWu2!?x*~C*Fu)3GVep+IV+Xt|NYuQT?&w-af;We0MyU-rFoY@CLC44wS}zX^1*U5VJzQ1K-4 zKUb$i+1f-AN{{Q9fog&}bZBuV$@`?704j8ddwU>3A(Sm8*V_Q2WOR;I3;yF||5g)2+I$j4`I5zX(Fz+|#Hm=MyRFx*1j?o4sf#N;sD$LlKIOX7tB~GeKNi zve1?vMv^bFNtZfal`_u*#|tR)N=FLXuWg4D+NW^g&Is-BLrJHO!il-2V<1YI3qr%% z*@Go0>7x!XV4Jfi82RluGX_B!ha&w)9k8oG8VmELq96GRs=2dcNn7^m{fW%WK>Z@B zOW!|`9g=kVO)!!}Tke@v#FkAs4WgIV(Vw$VL&IjA?n;z(0_a=dx@sCy1s((g`|S`n zdGn6b&!8bla~;=^YkrjM$PG#MDoq{bEjX?l9$<6FP%=3GVcKXd*}*% zY$R&=afbxW-hLP?!@EwmMJPT12P?Uy<>lB>=l0oWX16Ulb0(JjnAOIe`45~m*n@-5 zETNhAfxs1H8oNIQZCSBL&ZZ@uY1e?!UFXVui6~-DQxxhlx4~6gaR{z9)0zTUebSlB z6q`Tk%)Y+VCwg>tVhfltZa?+_dOyFqFRDHMx)og?c_^RlmviRRaPl)`n#e{XzsK9P z=)+WYA~Ftc)1voBpE<*(o6ek4lb@r^x0B&@pyte*iOi=^m@m=xeHX#y!MQV^YsjyV zLE09GHue3F49%NVAGhn-HWmI-u-Tnw4r<7+QC(xd0911DPz*b^>&(-MonrEkb8Vaq2xwp~O1fKvDUCy3Q$JoZ^4d98lSV}3@tXebd&DGAX;`a`-N&SFEU z|4~m;rJC~^izY$crk&Tx6e@5BMpL}ri?L>IAzcneHXPh#=B^S?##(7HcR_|E7Qrwx&kfdPHM!@SLTH1+FBMz?Ss zkKuRI+W}rNLIHzwn+-2aHn-W-FI*8YX0%r%KR^Pv-taU@{XB=!O)~II)IVI3dWF|u z$M@?o_)j^EE^7@2*P*fmtG`!pEx26A4zIwK+vI%ko}EYiKAX{{EJYXmt$JTUf;?;S z=4eJYXok>`1<+dHnUO0r80fh*9v{roQL8sbGCGK>#=9}(QMvL1rceHS1z*33(Zx)1 z!_4o7BY3%@UK`Ko64P9exWEr^bMnB14#S1lLt$+&)GK^((fMfy1N-}`8c2w8S5hxS ze~lOr}EC&sBbF7x?GSoar61?6syiF5;-2>5Qk#w>se4maQ*{Jm|ucbF~EJyc(~iA z-YsEt%QvCO1Z$En(m2wfg!;-pT6Cy3!AG~l@;KEN;f=B`W_0P?f~rHur&={$>BIP% z!i6xvi`VCy#5#jX%hy)#ml))0WT>6^KrizF+^8?@tEvtq4Y7J}U|3ph1LET~jILk< z&n>0-%`mS8gtoHmmp5IG78X0q->Wxe&vlg1Q2oxB&cp zaGl7Z-aq$E@AC#if!S9Bs2H!U;Ygyshk*!wl^m4Rqu=yCaYO9bwyBcS#Ry@l_wti53LTBQty?Dby+4EU&PKihZ*$hwRo8?X3=g94SqtMn)#YjUvs23 zulF&WaFsD`T7Eh9(@R}06zkG$6Bbatk9z1@#~Q`q+s5Q4>%_Xn5ayEWVU4ab$ZMrx z3AfKPh)7hITM{6lzJM7zY8@)|w}$(QNqBMJj6ig@W`JTMb;)D%#*Y5L7o+ErXxk43 z0Xp?8x0|A7e`|=(&DwrQdJAhJMH2G}O{qquz5^n>W++)@jN)}gu0kQ-BM*_?FAJA8 zNk>VZk<1gnE-nFwB$cASM0bh$(vQ-EsJ+w(@+mTtcmqf{{%tga7vd?y<3vHZ5RK2I zuZtSvzSiMymo$$A=mnex4afyk9kAXE4udB_;0y!MOq13|{wta|+@>n7#0-vNM*z)v zKvQk44V&*$CZPx}X}-&eqd|fHG9iX*Y`GbH!X^Uke4y-X^L2BuweNynpe`J#v?b=Dj;*0C*c!ID7l`u*uiz4MvYj?} z$wnDBhX*h11qS@tEXX7_C&_f_&@{#N(SCl{>VLOo;)9$z&_tLMWx5$a8YU7d(eCa4 zuf}2e?NhX>fFkn{$2c@-t)X5|E-vkZKU@-o^%VX%ANl&sGbhM&F;Lv$wwB0)*I?K& z3%M}H@W)At#GN=W)gksoUwr(F&4b}Q0`9+;LOX;GyEiJ{7AC;MkFbkVVJILX-<}(y z(xjUQK}&+46NL z+v68O7-cM*!h)@Gh-PM|=`9sEnkzV@q~kCiS$r6eTMBbP0tb$?m8KwbyiB(cINQfm z0p^JYU4J;#SZt^ L_Zm14;3DRcE{sqX76!C{x3EK`U5W+Ox{>H5CJbd z!=Q`9i+Z}lB^S(R+IEKWv9-;th_{zsZ89VZQzd?$HcQfHK` zmt;u>OBnG7Vpd!uE)-7`hcQ1g7nnoLMrJMus{KVji!O6s81JE;2XXcu%0iVS%e z5Gn+GD}GHrM;;(Ik*mlB_;kyUkQ-syZr0JXoDzT;EkQh6P?ryF3ISW_9`{q z9qbiqntRgA)KvGR3)B?%q?f44?ny6FliZVDpo|myGulx?$-H}yC%&Tc{vPN{D);Y! zzMyh~7;TsnJ0tjPC$3Se+>&wXRjSZS>UY#iFR9;B1zu9Wp;mZF{hG>mq#7%QN)uMf z;7GQoeoke3N&Spk?j`k8YFQ|wjT3y}yKDmBCU*#>@-xV1Z16n+pH4pAV{jwh*2$-O3=iN_$@BjNd;Bl%lT zz&4Zr>j~H<@>e^U(R29Q+ixTJiyf{TunpwTJpo%!{^SMBh&|ckCBV+Ln*7lVoCnx# zlrMYyzB|@8+b=Yhddfsk>E&x4ZDCkM3r<(L;1BiNn z9Z2yoJ1~@6bVPL{c=olcDR3_WQ%teuY?*Ezu&%JN?nG67H-dG9owe<;V6v&ddAUrN z1>CU&kE?igc9rHva0eYHSN)7hrYQ3=nJyEUW2r62y!Of)>Knlvbesg{{A0sJ;Jwt1 z_tnw$H-xvN;`}>As%eaQiCk9*^)^Xt6~A}7HS|VQTu?PpPkTHNU8trkY>3+_3pX+Tw7{AiIP^OE6R}R~2TX_N8 z&l9*9okNO^USCRFRuTN+k^pS*H~g6dwri!ups}c*kqc6faXIE&?a!OM2)=S91o zN3S){lj%~R5AcJ~%l_5~k8by zJTlvyCDX-2EvDHYSU4^=1z;C?LUCQv@CTn@jJ2PRaRO$-Q5mtsJcoaio8->Ji&iW* z41I9$#vuRZ_2x|Oc~yj8KhefM*06u2RN$=g=b{ii9L8t{ufqU48b1|~;jOBWe3#;O z-$jM@IEqLYwi2*#+WlJ7ahA{E6lU)lZ3BX0XGb67&dj8 zGzijclSScLyVTqxL1+p*5^RKqW}DOO1CCSSPIsa4k6RDxc_*(j-@@z2WI{Xb109*U z|AwfO7I)H0^DLPz0pG9Ta-cy`&dJrYat)QBrHNH4$}8#7$zUWi0woWy1{>`l zb3kznZofRlC@5R}aDggB=r)vl(#*ig0{lo<_`;G(Z}5;Tz>gRN7Bk5}--x56l@;cD z0WZuKfNxGp1`4aC__HO+I$9Vf$O-KC(rajTN zD&T17YYX$&*+xeo3<6HOPd~BrHhKrBOoPh`6gI0lw1^9G57`jFzOcZ+S@Xa$yDq<+ zHui@R880+p2^ZfU=sCfIk~O_KmeEBH5`Y|2)CMKYHhR-g7(Js+wP^9p)1d-yC!Tp>747scG^8}djBVe|T zqtKpnCqf+4BCE_$z8ViY0cspKcWmY6;+K1luPiQIz!>X1H!4;d%Djxg_h7eW?9^$Snu-d8+Xd?eN z-h&9Pu%e7|9!&5%3w9RhNBcR2eh`+Rn0x`RGQYU2$WWP&yOTp7;)Xug20%XmB?_M+ z;1!mXRpA-M;rId044gneJPu}RCWWr7Z3^VF;&B!%eENx1m6fpmJp@xZE?po}Y^YeB z;6f=Hz(Mps^MlUwXvi?0JS~ky+Ab$Ue}1*R@<84FN;+l=6=qwzkC4_ z)|Z#i{?oyTVF7B5f&mZHE!nna;|pMZMS{}=&8n=1p;7>QGQQAp{gf_DU;5ZUD4wlX zD@$RshvLmHtt?zo2#Yi4F9qH|aXMWOLq2+(P|AuD7^J)n#O%_suHach9(@?f6*13- zQB;`6O(y4OduS_kRq}q2kv<4>CDOKI;Avi2SO!IL1IDu*GUx-aQb*W|U0zsLR)mM4 z8}J-1ovs@NgT=OP;ozSMhVpy^fO8H`r<7EdSL@MBko|wl!Zw4^ zr7lNx(cq;8+b0c!2I*#?+OABz0E%XKBVfP|M4S6tb={6}&Qgh{I6Eu~eK5T(zFTmt zx+ljj_hYb%$@aZ-BJ`8#GC2%>-Dp7Es8~^k^W8Ty|&3 zau`dz@J63DDTAtWHetdG1PoK35+YtaAfQukkA<1G&^Cux7Zw$9>nvsxIbNSykPoM) zEH0VazX)tU3kA@!!nLK9h%{7(4tKAM<9QIzBM+1BKVbnLm5N#hSi_@yqf&ox>mP-( zpKb0t*f$)on3`{>tb$`HbsbQWm!tdf$rV>%241OG!vS<^xuH0JU1|Ah>HvPy&=SuP znoRW(P-tAFd|dIDVyyfw*{iYy>3x!~Bx&M@m=Br3qK8BTy@KkXLdh+}bKsJByV^9| zyk5?UwN3tTZ!zV7LqmMFx)Fj-=cAc=8N8TO;};YD!GvRsmzf*E7@kXnRcfgz)O;J< zVSy`Fj^(&U41HU9Be?2dpx6xMmY4>b*Mask@WtXtj<4pXw*zkkUl`&Z19UO8_FA{r z9y_)AMzyve3|wRiG*^L=JJcE*-Ep;6{cuTkBWew%n*2>+p~=r&34&B$iUp}0)6N$z zNp1vFu;&J*`L~)9%@uO)eTI9dz&!01^f!Xb8{r1A4&#S}V2YGw>T53HAC#~>+cr4o zdH0ausXOelPxYu9;6=+>FgXWmU+h|YyPJd?F*^kIg4i+>=0lNOmy72EX={A!Y~e<* z#*c^~)>LPhlFX~Y&;*!b3kPlyikNEE-XNaX!da7UN-?jJ>kPP}T3`w~2uU}BpEvgm zn%SmN=0dq{F=lQ*NMH;18&Lu;2J-4OnB6N~W_SM^!5U_@{V02jDcoGZzZB!c1hjW3 zYME-iA<7WI*KWZ(%QV2ef}c-DVQ|5Gx>1V>IIVCT{_(UHzGi|xM!rlp%V~&nvl@F( zxe+bzQ4Zb?c!p_^IZw`Mq;S(4wmThaS#P}|3JON&w%~Rbp)sb*sdtGAl7R@fnvI$) z%|H#Qep}t5wrCEMktCyDMXo02lH;hSsnJw4r6hkMKLFnc>!?iieDy^25Ot_ptomN{ zf$Bxo9cSb7d*AfwCYl zUHVG;mb6uR4;U|vmxf5bmt2t4OSVWBNp6y;#a8iC;yvQE;tcUXv55JA=>QRa5i^xB zCNOf*=b~psbzogJQWWGWtB0>J5L-~fZOU1)LCWZZKJ%pXfnbnw+VBLyCGiej;hvm~ z?Reg%%iYs)@+Eo=h+}5hsBltEkkmYR@PbxLyhWG!$}|#h(xu)AenfBdmVAZY;4Qg} zUhggWL%P~q@(1*7F>qtVh2`Y-4q@$N5VPB)zr_3WIvW_4?)!jxk6zmYsLOPfx01YT zq$}xf2q{)`j(`UcTl={S;7EV^m=45U_WazH`FT}XMo0S5jXrWT^idxh$MlU zk+YO^5#Nz2`iPM0B~wY)`_5F*hka+t=|clR++nK%f3TV9c!0JGEQu{N#JM6KAcdjq zas+|{w;j+(hea{k;ew7hCqmPZ5^9TQqL?zeCk`bUYBMBu+w6VlCU-myNmKAH;Let! zHh3nI)OzD|1Q><#`pv!&G1lqa7n;*rog254%W$c#cZ# z0n~q~3ErWM@NniJ_AHg+9n1yl8ESkFpq{42^#IEF6g9R7VCShZJ%Bn#jqU-|S!$F6 z%2?^EVV|T%I>3BFJwc7=0o3Ev%|4)v&dvWAHQWc7Gt?RCrXE0@riS$Zs>4VP?Ex4| zCHDZTol5EfR2!A(1m$>X2X z(dt~LCDB5~dnPth13VLtQ*q9TM(!z_Xrf}BQ~AVWRE%e0Bh}wC@hBDTnb<%@c_tpA zB3%;k{I4MDDZNW7mw1?p@Ju{J_47v-(qFt?;CbxK`QKT^% z@MZj3&B3Y2%{WQwloUj6@^!w^5^vBYzB6B^i+yLlMi=?cyhyM1o!LpR@}2oAUFbXW z6?&!b%$Ml`-GL{A_()3p zm(KP`dzN1Ak@gI|%p>h-dZ|a+Q}hy#wDa_0NHe-JK1VO|06a@Cgi|?KnDYg+pV+Yn z5)IYld06sxR@zEOdj<3`MI6#_%Xdn&O{RfMSi5@Tgk(co5i1t z&Eg5nYm9{%ryL+U0=iSF(oM1;={ebHS&rNw7eOSAWr_&-dz!~IIU1e%4YjdM@uj?3 zYc(_=84i`%^oj_d{wThOB{OHS)mn54cqr~5dkBXOyWz5q|H4`m` zAh3j!Q)RH`$uG&{+y`da5B|_>lZ13?cO>{>i04Kp^!spybtjCRCAR5#WdHtcT@(#!Z}O5jk0J)!QCZ9zl+ z22p4UYH%i0zmP)u@r(L~`o=+9LbnG>shj43g>5l~em}RcUx+Vg^y&+NT4@E9yZ|gS zOVN_CR(*GrORLUm$5O*?Vzh~4gbw2xbcOH;3f<;|6EzT2jpC+3bQNo0jQf=pPwVQk z(t>hB*~)6ViSzmi)%>1~>-Jrq^N36L0riJbr6@bf8s69E^$$33junT{(Qu55NZ<=^ zSPLGaTvf1Axg=_NjWU1;Ek+rmtwGFmn=VXvLU#=8;zn8x{(n>8#eDN9HlkY;yQGj- z2|k_w7iEq2@E2^q#X>dgT(~ODO$<`gev?5VE=$-N(7CPFz=7SBQ;>wwG6SPquo^2| z1fV6+f1@(NIp3v4ynk{|M+5ua?OuI>i*d|5-=%3#wwSgFGwYwyUE%C6F;G4CM=Cm$ z*L307CqX!(q1{muux)l>w3Jt4?$+Ko%ZmXvrAxCZ2-)qO5(ng~hI^3#GJo z4)xbW&Q18$NH1=}?NETh>mkztP@6Fj1|$-~6g?hkm5u1GK(3NqUZP4XZeeue7V{Lk zBCYZv-BG|2Vd15P4xA5&FlQpI5hJ_9aph_oILevO8cTV$EoQ5v+fm^BzC;Ht0Ue)p zJm$t*tx6A1sm{&hJQOe$`!^ltRPPL^w};P4XEGSo){nt(1WZT}W=bW*peP3A%3QpJ zIj>w88#3q#Tz}f;)wKoIfNtj%|Ef)gb8dMl6#n{YZMT{>_(7WP%P%fh60PALdM3`b za8y2oA7y|M02ee)Z>+m6%;Nmv(^@zx*|mLf&7s2H(C9&Mo(P)8ua7yLP9i`~hJH)4 z=@4RUPQNDs$+lX9yIrEOHsL7RKZ((Tb|)vq%BdCXw%fDf(OBpKT2S4C;?Y?z}Q8O36pXn zmqG0U&Y;A}7uApl3aFHzmp6_Bf)uJ6&Rd|I&B0)8KTqCR$4@9{5bUg3aArwj<_)mv z1@Vea3qU1kMN#QGaubv<#zrp};+KFPC)SL2oPbhosnoJ`aJI0N=Z*Bk?(M5_c18$A zxr;YVh)A z0-dZBW2Hq4CNU{-5nz18U(6h>R>93XJi?tVJ8(n6^x+!KCBu8FGdTR_=kkWlmS8Yo zNr@9hU<(#QB&a-gzY6|yPEL#F`i+(#u(E?%Vl5qx8(#E#vtG`7MD=D%AXhs_zKf*t-y2i?r&NyU=s)0GEs&^%uX;aNz{lE|F0}p? z6V7RR;98T~;twy)zytJF__2tvu6J*8!i%}4$`oPo0~IRZ#HmpI7G)ja;f~jP>v&If zu08zrINt_UnsgS8TsI4I1icWUayaVa!rq-;POLfAS5?J&iyEvjfiZSGd;(5?hTiKq zM@`E&SyZ40C$PbnhMZnxW4~jpF-a{-erjQ(Qkcp8N_vxzH~->gCb2~U?xCS>csrwF*k6zkpm1XyS7ZgLIOF@Se*kTtaiLnrf3}2U4_982{+f|WCWRZXZDX_!} zq#R3p$@0A&yOgCz{VcE)&ho2Gltqla=f*`Ww{c7wGgZtvC+@v1S76G!*jNQT88@ET zRKeK0>yW^cw`?dh1z1Ef-2$kmePwqV$)zPQ?ND~KHK;dNdVJeguQY)in4d#<=jZwq zU-~_a-o5vp_f)sJD^!(}r4^V$EfjV<9T$OBueyu$zwSQj|c zkKW{gEky$Jq1_03y9wJBHumVvBa^djNM5no$e++spicf#)-VrCa_^ntJ=M93ayObc z!w#4l7m0U3Yz*1ii}=>9v7+2E3BgTo~er(=qP0^SJayVdS71()NyPCRih zp}9l-oqB=lSyiU;9p!RRRhuJ!TRvX)sBEJ2xO9l56`n307gvY}GH)@vAP8fis8eJS zjR*VjX1at#<~0}Z`poCN~aBY3;pb7{7M{1wLqAcL4Y^HR>2ByCa@l4@Z$q710d>BED*^h9%u}= z(^zRRdRWD}({NbG619^o5U53{G{2^Jw|sY};cNv@>`%2oEEb_M$e(Nt5~M3`Sk8v= z#J&^@L{xDpy*KlCHxf>!^2FX03j|7Wqfp2h%wrt`*gc(*`QLcTl>&^=gnPzVASy}> zG-0x>2|Z2dovCnB*46=!jI%)e6JeC`t%th@1UHMj;eU&x2Y1i1K$H_)gESj^Z+7;s z1wh$9F(Dbm!zmUBU*b~xywZ{?cXt7)HXCneWIzMc`m)lBLh!`FWe~ekEf7@1Wyt4pvV1o| zmj{_59BhxL@nEV2qKCN9$f?RPg8Z&~BF-{C;(;+12p8hg>7JrKw^G=}e#Fjk7KjMq z(&?kUi0j<&9ils8N2UcLe;Z6kBhOY2gMwg5p@!{s~ z#6mdEmlP29nEWj`PzM}Si-Fg(j}uuyin%Hk%4OB?h*?G_rQ|96kt*o zXbtlaNp-8EAWJwZO`FOf&Dz=RMV} zQEe;7?Nyd=LGWwa&=G#&>rL@5{~$=1)>!(&HUg~*X9w)n4sBn~fwCz~wpC2zTmGFk6HQf(f0=)Iein+k9O&)-uygyIX)YN(YjUTSaJ5|BwB8aT%v9$Rz-uS^=F(}+4JpJ%97ibv z^uRPPXm)EdL8I(l^-*=Xy1(ix)sw2bRr6I^auY9uX z3)x+=2&q+CCtWCwWc`yCU6zPPFxq5ruGD%{p4Q3L5eShDB^5YUdWNASzlh2Q9j1g_ z{uwg=w%q)pgsRHIB2Y$jKiR-waq<=qUsEu&ejX1^1xy7x2JdvHCfOV(VAno89v`Kw z+Wu{$Q*|@YNk!*JSOfY)5$rA(JTR$}m5g?26^0B%+fEEnp|1CGRegOUfWh*b(&s`X zRAn}!omXr}4DKGM>vbgrtFBlCp56;EPAK~Dq*8TLcYO5oDq!!|<7eTDmHGLV6;%1H zj5aNwM{gNnRSxSRdQNHS>I!Pj97a2BImV7o>H*?h102pPsIm-3J7p=)GwDc*Bu&!${sY67&ft*-9ncpAuk&!1pA_J&R-Ge7m9o(*Uv932`#Eje%K|A zwgf!a3QM3h1(FriP#D128`|a_%eDCqY}eZ{rE^kd@p>)B40zQyzAZwae+Fgor38f1 z@`QYl*_UD^6s}KWd4$q(&S1B+oZ13waAdlGP*j*uoQs`Rampk9K>L;%*zFE!oDSU% ziY2NO%Xn9b12CP!^4u!yqtNCok=g{44O}jA<1%+8=k|)@8o{+gVHss~nzo=Z434)- zZ?hE*PuodC8pUli+0TBw( z=5ecG;YJb%yDpqxmYN;woMJwM@9#uZ5G%1Ufnabfxo#Ic$ zCyJLKoZn7Gfntn8Ex%#}Gg$;?vP7+F8?RPl-QIccNx zK53aWOBw?z8!t#6krYc(B>v)$#ckrP;)UWt%%9AwOdV6fOkuPT9pEw1ePkSLnFMh& z6PHF&>+*AQaTk|>v!M#^7RGz+iq%iPxsN9V*LYmJloscdVuysJM$|!IcRjA8e6O3t zbYY zjig${_6$%ZY9GkNfsv+5pKuiQq*B!8$b{tu42Zcworb+43iiWB;vzNEJ=UQu;-Ukb zxKRNYA*cv04&gQ8;{OW)7mW^!WY36;|1ShwGzxtpYcg0ECxLx3O|cwCo>1KPp<^Fx%v~$qFcS@;_4E|MGJgqHi_o@&O9cX=R31eG#4_BLOZzE z^r$GyH)?}uj_=GPqDdOe1%Q5!(K+DBU&JIrETcw(rb?qBP%`2Sm5{%q$`5 zM6-P661Ae4zBBiWX86wBCz?JO20ZDyWpGBe!6N#E&peuL^_fS}ErWoj%nQvRx*2Cl zy<{2bo9#)I#|x)+1u$ALh2+mwoF(LsRIzK?U@(vTfhuxMgtYIe)jkeo z!Ne!jQlEJrQ%ij2eMBwxnRkU+ETYThY5U)|Qu=Yt5 zv5n9?rCF?gU!AM^LRF#sMOm%5swk6xD$kaEB+HS$FP$rSL$XZ#k$4sJHB$*82ueZU zo~5&>pQ(qbvE=*YJ~E!z2KpwGRPf>hVbmtg2pWUmm0k|BMoOG-03!Us`4VzT9tqo= z@VKU*lr_AbQT#Dq=FYTUh)mt z2?o2nc1(q*#CdI36aQUef#_rl00Vd;QU_AVly^e4Y8#*cT$dgk*ay4|l@ZS_vOq+! zd4Mp@2|3Zca3 z=35}DRTcoJ+9=P~S=H{8%S?|1YKXHY#&RpD*NxG||pVL;vhL46OUI}aC|CYgx`}B zD66)hHyQEH%qxh;Hdr8B)o@^wYa62|GEVGdSH*F4YanlF9!EucLPmc1iqdkB%jV`2 zXR0g^zDlSTKPPfIBVp_`zQ|CGJv?LTOTC;uIj$A|j5qc+kI53Jt1S@G%GPlk7wpve zx(@wc*f;`A5FHg32y2x9ExOp&qPbiRiy>}8ez~oJl@;0c2D05||1X@=c&Y@u$%4aO z0o!~VTU00M6I8?#?G;|r3ky~j!GGA*Jkbs_4Z>atGmY=corbBpDZRoF>3=yFtRdP= zqy<7#)^^A64S-yYhV!;xckOFno=&m&Gk6G9X$p$VO*Tpkv^uP7{nI5^Ou(}kJ$ zuO}YoVL(Hi038pAk(CNvhxg(SXsf=Lh6eUCpe9;3Ss+dpUPXr z78vdjHp^wW=W_F!YeujSEk&C13+0n~p%9$kg`f(ed4mO_YPl}X=VO-!`f{Vdv*!Nq zwqScqe|v(Hiw@#=wFLrf+15z?2lw~t=9XGwbLv4fRamC-jOIb#-I83RTiOfF=InZd zIJV9Lk+$$$UI;8s466xS-g_(rXB|Z2I?H4SlSe+;)=LWp=R(9LCOx{rGKrtRa1!9> zFRJ-ctu^#seXy1Tf9z<;vrOb?6;>wQ*1BEW3+obbWQ--%O;t0On>+kjn6HTQ{~g0K z!#IPemorZjgNRCkd0ti}kCdI3pOhnrHWMUQI4W^ zlZZ?vUL`8Yuc&nT5qc)|BU8!5h~A*Tg!d`EbOd-x-7A?a{#3kAygjMu)7Vi0nutk(WAI*Ct+U2?s0;Pj@_@X?Uq5@q8&NAkKH1lZFgwPiQm{zR(W z*p`lO5>ZeLddYC`PdY>3?)}Q8rVX5r3VRWAtsyBcsyfgl_#3y3-STjf0hHpoS9$LB zse(GqIh?Q&F>G8F>JjxrAY#|^ga*WMPbAcnP`d>)paMbM70p%)d^J0yn2&heN6gpA@_W6W?V~T*%NtK3F*$yi+g1L`}}6P;tP4 zkWoGm9K0|pZ{tdxaq&-rBZ&H{8i&NMG1QAfi$hq@Q0*j$x|J(Tj};ClP7VzL+aou$ zsO=6z?<`<+OJQZxUw=3T?f1UHTVtFMU{3%A6;Okrj%72tL+r(hV={bbM%;Q1FVG$VQI$2Nhvl| zaTcKV>EKZy{gByH=IYZ@=gqJY!bFb3`aWe7M8ebUj?y`pyHBPB@$LvIbqI!HY5~VF ze5A|d^W-KJHVYyeLM$N6svg#)8KoR{zm(Dnd|h-f^dyj8mS2*PRa#Y^n-4nqIpv1( zLeNrb%mE@BD0KDv-NB%$WOdzLBB8q`7lNIVp&EBadRCf#MllXkSWU0WgE&f1Q9z7w zS@UVUSez&h(MsvU6|lP)1>$D|3;a9*lcQe@k z_Jmpc?yQ+8bs^Z-sVv;BDXlawzlhF*2FzN6Q3kqzAoeTTrq*8Pt z%&nr%&^Eau4eDpQ^fU@BkK7$6vv(~jnHa3Sg*uESqLIWoLbFtTRvoR{puDIYs4&Yv zl24Z%lKDwjNuHM^h`$z}5U&@HVcuaDiCzagycwcC^qchk^a47HxHx);Y3voxXPqw^LB4IU&w}RR36yS+vWl+mdgq0Hue3NkG{8OHsHY4$Q z(N-|xO#qHqCJ7t^mcT@HP<1b|Bd3S_h|i{5z-)K8R*QwlTr^W77kAY0Kj7gIJK^xr z5Z9FWbf^VPaw7mO-ga4Vjc)3W4<=K@CpTHZx;7G!2HB7tHVbxyeihtLU~98I_;|7f z3}Xj{g>kl)Ct|EYHkC->u;MtgV0$OKKm3nITfpKq67Ujj{PNtDB0VTf<{^kHH(Az$ z(G(!tYglOysG3&_dMqBOFit9nuF)0HZYb0rnooi!mS}U zyTS@zT)(?0LlYmEXbZ#)OB)pygJ;C*2y1M%1KL?}R7mxb1Z164F&8%tQ{w%N7KjWs z1GwNT^@Iqp&iMCSoHSpF_m*2A2-qNC0EV^v2`;Z&eOsdt{IbNMNdb5stzl5!x#yEj=XoJIy0kwI``>Wbuon@7Ae(ozm{2G}OpYUb|y(G?%s zpZ5ewyglBs1}?UM3I@u2qZn-7xQ4-s;ELzqYj@d2Trz1b5YB2Ayfa}5C)^-iH(no4 zR#-vPxhED`MHTw;fc+(VRfp}93f!-P$J&%j34|;fq z=jl1!Ux_!s1Ooy{r2s{2L8K40M!0OQK8WE6;m+4v;&qeWQUo&!=u`t8k6W$}I=0Ji z5b+v36GB+05kO#rt=o{tHMbiw`1Y$IE`qb8RWRpxGCmGlKB!=IT<>QvqSF*GQ?vzwDB%V&@)UxR$3d+-GWh%!M7&~(wLoB`ES?NMx{>#D zS$D+naV>~=+0@^%LZ-_EVo)mwG1pUDcXaS!PD5NUg;*e75q{#WfVzDh+OsF#{?OjG zgPY^bNxTGJMe^XdB2e2KW)1T=BKjzkGeyVAk$4dXMK0fHc-jEP_?`^%xlZM?A1sL% zu=P%ubPS2M|?gsUk%FGWaw~mVF{SCd-w{ zL5#IgItCl<{3!u{)4GKJe_T0zUh=tUY}51`QsSoxs0AQ%NGLND!0iWLue?ei1V60QbDTF(3Po*wLhRN$6Y1#dbD z_!`Zx@YH`fSF{u|>Fc6=$t|#dVkz|uFGxXZYi*b>c>sj;h9{bY$@!Ir!XoM^5C|mZ zBTb++MC+sIoc*hWI?qcr62NrV`_&&Cal^P1tg`8N9)9-U!3$QB^Z?%PZE2tvzqee= zVES}_-iPV-K&z*NWIGg;!Y*Q?<9I0%XV~oFwAmSjvs9MSF*86K1GWy>=sL-3lL!^% zrm3(B(6OAyUkas3Ykf+guunT9^)yVNI9nXz0z7sKAtpO_Gxt7pCRKs^hhi|jdk@A4@CdDg? z`EX;uQywha4KE6JNv=xnkqj1}6K69&Gq;29oRgvq`divUj|HEhh?+_Mk8CClq>gwA z$Zek(s$8%Yyg3X9&k{3W2if1SD|CWGRnXfn=o}c@`Fdw-F4Aw-R`BEy4^+lc(w&*< zfllUM-4Wp}yGYHHt>B^|8qn>YZM;Sg@IlHJQGis>+zL(@BEZLm(Q$9^YT0JfVdNe= zTt0C9I22MfeJglb2nTBRQdO41@(9bg3x>B3BOg%!h|R?)q;mFF@S+e6w4j0b14%^* zI0fRp*?ObE6L84^YFPpjshGJHJSO0(+H0EQrCfmLXriamhG%eJnpP&~?fC5+f;_u{8?r!9dquN_^P|r37e1 zU&Nf#xd!AANa?h#;PwEQ(cT^9g=J-&X`VBRQe3)bQaBA3Bx! zw?Q-pP&b8waWZGe|Kf2WAX|?evXJ8CTfs9y1mJ=?nb1`03M)D9*A5)+7dEHM;_^sl z`Bv~R;DS{SJ7BK1*?Ly`1UMh4CckGla2DEd@~~BAB^Y-m6k_8}PwZj9l3NNK7N8_quoVpO zQhbklthfbws)y8(?n;h`oY{h*Aay>y7iI&R2o_TY!Gv_|D?AYFIm7VwdY&~EPhe1oFLT88#)3EiuC~L+XZBu46?pOz{ULPLZMyn#pA2lEn42s8G3-|b?A&u@5c8v7Q$aNil;oK+^Srn9Ho>fDi!NHCR+pl;b8R_ifTE_SpQYsmyQ zToj2~KbUL*rgM_Incp-S5BIpE%pnjmSRW(v?gr1jEpoNwV|I%s<5Kxvy=PnQ#iK8K zm^_~#^39L~o^rAe#GmS7Mm>3=54E)%c8<|x?`Cp0@rZWfmubz&;^j>C;%be(qLYC# z--YMJS+FKjj>vL^(%ikJu>X(rF8r&X2N@0jcXC=1;(K|c~X$+z>{11lgZ@A$Y#g+?~+|W4C?>;z+NJ< z)BnH2pFx#dqQ6aOp)WvlJxBC6woRWa?%h+nkHe2Q`{ao4$ z0;R->_lna*-#}=3cj2po-vy-t5q}N86}<_Z72c=Xk(MuFS0pw7`Y> zA!2nW$UGB-u32RAMCFT2l4kgA%>-@s!X~++E0_7H^?dzcu{s7AVZ?rx(O-*9;upw> z^BD`!@%4km>fXQz$AAcGeaa0jsXp1N8K7XZ0yKN!tVB)yFZ~zm2Xc**#c>Ooit}me z4e0Rh*%;Y*-1%ke2Z+^SP^2Ni1bTpfibIBGK^@*bory0T^7@O_iI6RhXb{x;v^!EQ zJ?+yhLQ%7tlR$bL z@B}z`pee7MdcJPMhAwc^3H80j>LHM`c`&)5x7|*8KUasuuC?-3T75734tdH8N!ywv z&(|UG08Pv+#1=T$N&22*bz2a;3slL%Z3le@{?85SQl#%8R`&x9ERIRBWsIqP2dnB4 z2SaZ80lEzv8%?elsgD(_6R<}IWTEO)>w)IYGPQ~_d+Is<0V>#Pa2~2Mm=d~+)o~Gi zJ|z~)H$pnOMq7RSRD;1nSd?#mc6fk{xMwU!eMqNva_Mk=H>h@dIaEZg%#vF(IfiFv zWC8|bUY11HLElxPp4ih*t&?+tbnb7HVMtaUw)%m8D?o*rUpspTf;hZ}lUedzp;|81 z=)1uD0lD|IlydT`$COFW&p|Xp-xN< z0W2s7u36+{FJRU6SWUsX`#S!C@?l>WOS1OaG2Qb*1>^J`xyHw_GT6osgvRgUNNSZs z)x;l{ujA=sV4?2WQ;ws~loy%;Sr7{A|GZP`liPb@nNfPj_?0nFclKtf!4jq+4h9kB5NU=H)l8zTU^3%@F z2B1c$FDn<0)(>{gSpa{gN@Wx1l==vz}z^*Au#?zjm6{wI|_3cf^my0it2Tw*)r?68=a!m)b*2;1wx? z3HfrRPn@-9V*f{m9X+t_QtQT^HyDFf92c5W8AcP@Jh{4Qt`54A2h148T=VI7^!k zkwW1+m_IUAb6`xsX%)Ql6NaefnwwA?$=4;rm3^pY5YKGMZdz$gpNHqCPlxPFrmH|> zZx(x6F|n3u9PIInVlAL2X69xW=c2|0Pfs+-wN}z63m-d*HP9ue zTSO=X!%w<4Qv4Sye#y1^mNa3EcdkHEY*zcd0;0X zg}NBHiwQv;mUgn#x4jb7))BansVa6jXxY+ps&5srXyyq=Hi> z4*8B^QunAlIrn38!(`&COViV*<)DAaMd*E z85rUtT!o#i!da#{X4zP`uo>W|tPMwxUx#&n${RBTC2V)%@(5Q!S+cWWY;aWtq3Ch8 zDh}KjI-d*gsICjZDF9T((th?LW3gG$v-2`?ilLn5=qxI1-GmVdJs5gexN16H!i(mE zoNO>#V1wGOuXQQuse+g)^Ru8%*&4zRxRF6{Esg@i3C$H5mk??XzL;4jY?? zhd1!T-5A?tk5V4ju zlftkC@p{6Tz*7lZK)ixrSu(NbGVb_*w-s*gnp}P2CgM6o_6!W}44*YQFy5>k;;Jqd zFdXohjcXz=C*O2!-{NezmTB!}nXDYRfw3Pj_lNZrhM(AJ9BQd3Q=@_U014RG?(oCx zijH4_xEN?wm6JXnJC?J;p_?HehxP?8U$81=Ph(-N#o)yo37`+K?_BC3HqRz4?=`uh zv*A{zC;GF~>Y4qNx+H*Z03-U+v6f<4iJKVs&7+PpvV(k<8`UV^tHj$A3T0McbJYll z8#D6@(VB^`c%wtTj=B0;DwOpLFxPb<-oI**>h5bE$(eJYm9&u*A=FL9*beHzrNgYV zW0M1-b1-!4TUJtZt7etEx3x>!wM$|CTjFLIq0?15bW zec!z#djZ>#aVz9x&&g!_cVycPT{<8_KqRo1MQb6@m+iH+?*c0EoctnAZG=U_V-cT~ z;l~`b>Cg^U2N-&IxM+)@tKhDTrQsl^p`+yD@rp+!p2kq}ksX03zO9H(!_z!Wg6#AX zNu}v#0IWokItqrFWvOXWnS-<8(k3jz;2@I2O5<<@YW5YCjtTOi;J}V@+I$p)sG5^* zwu+Q<6^Z*c2#jj>Nx$MEZ1qF$EL$y@glR0xC^so+BLxr#WDG!4z|n7MVoNoH zrE-uIKiFi!Pw3S84P8)pM}H}*zS3Ue$9Z;!<7t2k=?tx!ldYKs@Xsh^+5g{CkYrm#%ah+;UFsPN5SZnenfuKc2Xu5SgPxRF~0XtVEI@{(k5b%LeQaw#XA zn=*3PVL420nqwlt!-v`tP#)-9F8z0ZEI>cxVj z+;%k_-_=aeYGGl>fu#=~@I^>&_MJI@8t#?p;8SGro$86E65TvSFut((TGaXRn{B)> zZW5fTY}+foh{uyjQOx`MI-%$<_XRWK%l5q&Mam?`>V2oYNSTs3b7^0cNFamFz03s> zS*wFl+Vn~#TKLs5G1I4E-=RQK){0rT`Z|Je2kHtXTANtmf)=}{xH2cmif(dJ=Ei(p zaBv2R(#B3*gc|28n1mWoMJtr-T_Iv7xmCO`BW3PP`ugje!N+vcXdmXQ;EMhcq|DWr zT(Q=TlzB7jGAarnkNJ@o>e=4gy&KPz9lFzh(HK??1YzM9Fuq2BGp}H^j&% zVEh+T{#_M5)XDBHPVWNEZpW%}-l~J|-5pZk+v}%S<-jCV0gNF_bUCKU$!b1f5 zW8<3ENPB9(mf29gKO5>Y+}OYpM#JY$s9K}&*touO9BOo_D^$EEWgObH#!cf`x1vIn2v~mC>=m~XP+0d4h^=9txt@M@%W!)jCK6xnq=s4&F z$Hpm`F4dK%pf%!Ay|Su36W&mH5$F<7P^Zzqpy*TY)6CzEm3(;B7bT=sk44pwD+Q=1 zRvC&;v?}vP6Sk_POv8zB3n(se7+rNPOdyK`E(6fi0cC0?EV}9vkPk#L-&Lld(g}yA zFuUWclHk=KQt;Bp3{s66mWDxH4qJEliU)j1G&2&0@^^@E6%^*5GQkuIcc7<#z1 z${RHrtK68VvZ^ytq-?0Mn*Ef7f^Js@qemC2L>q@!3Q<7HghW)H<0?j_4HLYO-8t!cp~a;y@JLzA^}vO*;TdZ&Zjj@(&A9;5Yta=KF>!4<(U; zTt|-lawSpPcSXH4UMxyjNlP2v=tKI^Vj4(!5KMv%Nf?|(F-wSHK zL8sN#V&>Q6YPnK8E^|&ctDr$?N7s3x_k3JiGx2HF2bIKlv~AY?0H#z_9ZaI+_IFab zuKzf-T8_?iaGlI3wbeh%$O$>H?nD6S1;=h~dg6gyr<*4qviBYIpP%)kB6Lodf584vx%oo2_4-)gI0Qoc&B&_t_ z>tAyxj-LU~Gnmcl1IsDK(6450xGWRiz`75c*uvgu&Bv2Mm`F`ceH4Etyw71a|1_y5 z#l&r|IV2-;(Yj4FYnk=sH5w(6ho(Mmm4ZGq)`T&o)iukML_R82xcM=Gbv1XDgodFT zY91?z0<>-o)O~pCN;%rs#ZAt{HP%!|5wne|1HXq7^O!$|9B3qnIn1}i4tUU#BH%f< z7%Tk{vCFL!(<}MF(LiE83OatICn~Ex7{sJ$4r~u37NWmbObKNo$_`vq5{nSA{(uMi zVf++t+G&DtYR# zWy8=;{lQT5lk|=ox-qv3T*2B@xuKHbSG*Xh;o#3gVui8n;4L>|4Rd?@L14ccoqO+K zB$2_8?;j*2#A~Rk&G8@i1Re63i*$P}kPPzZhb}qKgDKUqip*qt6+#s4xt~T+^)LX-b}W-HUzQyjsuXNuQTox_JJQCW_^%E@3x9Eq&%Cqs z&~zoS8SR|k*PZb$KlEK7@eWkSAxR{$jZr>21U0#3&*8^$#CBu+;m3i*d&acGlne0@ zLu(F0RecO|{NcZ%_#c9tpD}bfyp!y}p-xmW>Tn4PDwen-`h2<{)2sUMQ6=#?(mh`8 zjkX?47owzNuu&g=Grbi$aWGwmzMms`4K>_J_d>}U9~wR0eOSElZn`J;RQ=Hh@P2W6 zFsACbv3DMX3pSpB72!_05|!Oe_qGy&+Vrj^kA{Yhtx)umbZ^Gx?BSo}L^-rC2q@kO zDx@^kB2_B-o}AW&NoYLWz5}tFndN(A1E2WRs5g)fNh+?vrLS!YjiSH8MSerRPyVKSfqc9?RQ9{t~5^SF1auHQnF4m2~d)L6z>zS6psQO<@chmM0(LEQIIhH2jLOno5G30Ai*~R zqhP6Ej3AJIpZ_VpkRQt@=wtN9^dfRGIhu?hDWV>N`D#Jdi&&Eh|AJ_BD2jnwSE5K- z-7kVxC!m-m;ITM4q|ObkC@~GD+tcc9Yzp)!-6TY((gMUx#xzrR0tM!qj;!A@0=B%# zrXOjJ7IH#A)SmQUj%Jv~NsaMG|7b%TXa1ai)Ll%}GRnN8(07j-HAi>!B2F=%e|j{T zB2E~~k3NnPpN1;0$46E4RrfbznAnD+$CbochHg9xUHTlV(N_kd@IR0G?(Kc-h>|#u zc6K<^i-~tR2CK^jl%m|<5xM+w)rUz^9owTME;4lVF`&D|(DC^1W!MAZzgJ)~J0^}K zt}==>#~u>=I$(MY$z3yH(k?sJ5Jy}$)*XWpb<^00|J*XV)G8v0`;4+rEeL+s7+*`N zh;Nv+f6iP=Fdvs4-Us`kPA8I>vW!}-jQAGqe6<#Y($pq}5dX)Nt*_0O@lC+uKMcLK z7TA9eH&VUakW2B5v&=W;wZ4HwBO*GVac4&g6Yp{2K7s!1`?d!+avIvtq*2<3GrnXl zpREm(6Aw`jX2w{f+l&-~`Sez8Y9#T4(dGCfZ{n8^9=AU(Mht z&*J&8Y}QUmHy@@#(b$$uzV(SrbUgy_oF-Pfiq* za(83$$;V-&+?OF1o%|c*^EQ^Ad<2aBjO8bf`;hWL=49>3jsj91V5~cd%NK;=R@@3f z{~7gOD3jc9a+i{n2P65aO=^^X(vQzXH=exRmXx<=+&xc;fUF(U+W*uK1SxOBC|ko1 zfm{WGw?z@Z?dgnUf6nqj$FNHYyc?4)*0>WWSyewB1;iTLqpfe|#37d}2cuE>oB#nTn|eWpT;9qVfj-yt1<2eU zMiHu-a3K_J`J^}k&7OE+J(JV#^hU@k7Oh*ne*n^ypY%Yb`a>dA_WeqlnU!|>tq@Y) z6A6}|?uOnNQr`{nWWHT~+FdG;!zNzd3mxk-N5!-$JADJn*c$~N zKh>G(zV-AG=#_np4X0Q8lJdUHnmmJb))m7h# zN4aqq-I>!aXF5YZ1JG)hi)~TT@jI^~wd=)j=7#Fb`yEL6AZEp|GxKPHydSV0j2ds} zE@pJeXLLX^1SXF&kCc>rs0Jk%a(tOU&6zvUe#6nY^=DGh+f(z>8DrU*!O&TU0dW#q zCBC~ENoVC5n9!Ot7ogQf7#q(BT&e`oX~YhZct^aUy_~1+l7xN=C*Dio7l=gtVl zb-xRU6r)QWPFmWVXiJH|9AXHCqzOqVA*8N{B`J#iCdd`#_6rs^M z;UMRLiRja!x?cQnus3I*^gn{UnBR)(lzvqL7b&6Ri}&OjA|P3}B(!-$T^CDnn5!G= z+DM2A#;sV4`8;wy(!&=AR0)Y@Hk6?Jk~T_-s)$yg1^MgBbTY}!Ql?{!ru z2qv_??gRz<%wNveEu|%CpNS1oTn4%;b{SM&sY?*x^MO1ahEN?$(9_VZ@9QF&RS9>? zg(&U6A|YB+k?+Zr4Y{ikF!_(_{uM-IqK7@|%b7i@`e9N0=|DRZ^-8IqhK3h}C{c&d zdL>F5S>FbYNUoPLdy*j$k!38ce;imcOQP7$8%bpI6!R3rAy{Lh{FHo?yhxrT50^`2 z*JOL(>URpP@ejqv#9PJl#Hr#AqCZ8aMW2dZflycBB7yL>aG&sB!r8(h!Zt!0u+ysq zuM2VoLj@}SJ$^ZVA-_MLq)*Zt>8Z3D?jn9k&7%fW67mAMUFIvjo*?}cwiB^Zf#iZ@ zn+%%dSXRWSUNg)9N@*qPp5kLKIbOnk9g?%7e2_&57~8 zjB0DWODG)CVruJ83&gqbsi5D?^lT)rua8Ab>CNuU=(_ryfs7!zVlg2!bc5d0X)Jo@ zVSSVW?u5fl7%qGmbpN9d>*HEi391JZ-Dok>&Cnf^#*9T1-OolgO}f|!aQHLA|C zlYo?1E^^&5%Mc3`5o6nmbv>8*TrR-AfC1=K_p`#Lg-QaVy-a_a)KgG`~-$%KSNKhkY|d|M!7l? z;8C2||DHD*cB>$giJx<}O3a@Rb+!n_EWhN*_?DjiMoBD2#Ll~+=*+)gbw`Dt-dl>I zm&2mfaQv(iExCPG$XqWw8yYAW#p4TzQ7}pe6HNBbvpXrbl3!*RdciEyZLC_nRJklf zcXu&YfV4#>8A{sQydvOTxkRxL1Sp-ISu`>;11w>P5Z!NwzQ`@~UkFr%>i(x_qZ#W--h!f;SK6S4%u6a1oe&{Gxy&nK z)Y|)0C=B9D1JEj1jD@7{o({6e>brE z0=axJ=WjG=Uv)mCNw~PS5C2PeTY<9Rj$ z4RYVFWa1kxo{k_6F-payMnX^ngolgKy7twcoaE7MKBm#tWd)(k_w*GcIL|`Ntr)6R31xbO5?xJnP2g zST^cCDO&xCM8ZteT>4N+oJ7Q%r~MgK>7|=Vd^p<3>yd8HV~oI zG8IkS-AiAArS2XRvEuq?6v|g#aY3F-7xY05Gu-$L?SAF4lz$(LxEd5BPz5s8+e^oi z%#z?Mx(MQqG5HE)WHM^5K|9jN<$is&T*m~tRHPOg;9J}(Z zkpCYj&qH*vYGFGRR!;Oqk17|&qO!7uzD!l!mHvUmPl%X&V)@49C#9%vijuG%uq2`A9WxVVuqS@^)HH4@QrC#Nf(JiijT3X*Al=5E9*ob{t63dMg)6i4?A1kbsRGVEidNvYr5c46-nqIT)ooIW znKKPnJ1J>}8`vaQzPltICI4`>koltV>QIo}9o4vBTZ&3|FX5xlP42$vB-zUaUHPqI z8B%#%3&9_J&io(Mfe~na;3SX3R19W&( zH(g6aWo=4?OrJJ2e3H>jyY{-ARQNGNv##aPjHc+?nlMt~W88Y}QDBK8Kq6hmO9!Qb zG*dcA+D#uSY?myPjF+?%|0J%57@n)dGsOeMp<==up7@MJ1W~OE0ztEg~^1{`_c+*Z-VUx`wuA%0H*xOzwaoSIeODd z(FgS!6G_9T7<8e~6u}6WnflYlYPRA+P|e+IK}_3*Yb8)KZJGC_*T>OfMKCmGJFvzh zm(vf1qe!>w?r3G)*X^0LF4y6_s|W=J#dSElDZnt3d>yPbiuOPdfeMrr!6>@-OxI_|k~(2G=bWe$7Y=q(}@-B8W$8y;xM zkJlw={-`)FribdrF<{UgT*z+3qspT?7iLuSjUDhR76rX=WCB_{`$izMIR3^f@Tv!@ zSsfR^46Me@5T%@Ff+!5RsGt+KRq!h!~aT#`aKB(T6$w=8aeZ zspx6kdgD=?KoJk}_e0NJ-!P z0e$`Z2q_bH_r^gfsp!wF`}+pqq&CnuL(qXN543ym&9*cK{6lqft2{aN z^z7jW;E*-s=5GRlVh{*B6m1!Ib1t(m`KG)bsTj_zoO82CEKm%APl+h`z^=i}@Y0(` zsGAXJ=dTm6qUa``E|O6F#AQ8D)ud&7I4O+Vh01=f6o2q&>&>a8V&t9%|5!MF1jIJn zZpR-7IZZ@Y!^xG*nzV*4ZHdXup;sDuO867t!xZ$@U%UG=gUcFV&oUJ~s@NU9@nnNP zlf1P7)_gdRTxdvvy=cP@C6R%2HAf1NMtLio+1Ai7B}$SG8O)f8ZMf*sfa&XUYkw4xX^g)GTbr4XY&NQSrM)NGl6I>VTD+>0E7Lpe7Tt!(W%@3^wO`7g z1xdhIw&{Eyo05XrS9WV~AfZ7IWqUiI&pXZrvujxq=xfeyg1+H*sssAw>?S!=UViKA zc0?hw>e8(u5s`0fxb--SuZ8^PAi`r+Kh*g4-EFWJyxodvIC}dOfm*+7l%PpPdp(%@ zt#127;0^6l6wz1v3!=J>kX57a~{v+K*-i30v& z5J!jN-^w|F8n4~%iDZ8S_@GA*m0?Y4!foUDuw&D)hU5f`x(cdR? zJ(;xXJKL3#*K;fmFX#uai(aU~>tZ4bST(rUM)|$YsCr<80F~|n=aQ|f2Gh)=x;uGl z0x`M2-}#;fBg&+|?`$XeYk}VeFhXw~w|COr55Pu(Vm90fK)!-BITPt}_d+1-LjP!} z8%i@HI^W$ZCBPce=Przl_`AnC6I&Ql(cJu-QXU?c1Hc}-OGGpo3ZgO zbgFkDrw@?pM#Dl>+GUjw)6n*=gg|9JdN1~Qqw=njDgEe9cY=Xk+%GEPGe+6}UIzj3 z3DaZfy=f%uW;YMNH;od$5BYpt6pG#+a48U7PKtJCVw3M3$Gh0{*Y9;@8V$Erk*JTy zmogNUKTO0#&p*42U?vsa`@oObff6>}gGMU5cMV%k5@ZEnFZsEk8;sX`V2vn8kJq1t z&*k^71roc^x`DU7P??)Q4JN^R&|ogRZ_0HX$%&uaqIOVK9|;$?_8~bz7F9`wfpB55e>y5m&(eK_;pc<%kr#O~Nz6H(N%h4S|Z*f=IsFuM^yIK7GK$7wm(DW*1j*n*vop5q)Gh zUmY_ZGz^ap1+rHqW8h1F?2TgsVxg;vT|DnxN7Y2;yo}78fe_Yu2x^;W3T|tIQ?g`W z59&mp?ZH=v_C|?$0J+vYDF@v|*OLQyUAmDduwcJ;fJ3T&<~yErT_?UeFqTA7|2^c{ zx+wq=hqXkX357C;LYa5$clWgUh2k5fVBqEPqCqoUaOFq`04P(d2cbndCcieRobN6` z4vk`c@SzX`ax%d!346)W7y9$n5sBzZo~d^VNw{F@Yai5@>RZZjq`fLNATR@zuREInog$4vV_B zC>AbgrgnBwz6JnwiZa2a8P^~E##p|3(0DF`z;1_KB3tBb0ifgP-i+d_gQ7^3?snMA z$Bu>rRHirg;;W;2k|<{Oq1J)6x&((k@Q%zhS7%~pKHSkF+51^eA=0RQ@sLeF$KE|X zT{{!I-AxD3A{G>?zvTsvENp#Hje@WApwW;)li|@U11w+XCqN;9F9dl1+p^Zunb417 zdXwlhIvB_m2J>dMa^P!iDc|t!&|P56e5F6=A8V}y^X)+PnH~niG%VGzfZ#2fUl@@I zAx82G@y!{0ufvPY-iBvG?~Q}{Pa>`Na=cxww{fV?lVR*nhVTxOgF!4c#*A-L;gIm)sWQ>!P) ziLo|>bU`Xq8(0f4tBMqpqNAU}NY7@c29D{7_o}6>Ti{1ewv+D6NR#rZg2CEoMcSaV$3r;fY>rJ; zLbYp`7TBs-sfhb?!ns%dS>| z%+0$c;n}EeFvO-$<*O6&xzYlG0R7*Q@roz$!SU{d^bF`Zokn9a4<*lqvYBgWWEs9i71qR-gk6>`^A^QztYV1_wPY z2DTtEsBV|c{_N@0&vsGm;VIeI)0Vq%P8q9Qa{PRC0^p~ z;uz6>QL6BcaFU>2FdRH>7V%x^GFnA#ph8K83?zzpJ0MWUOogtmewIX?4VMITLb$?t zYrd)H2nU~Y==;sC0XQUh@>jUNO9(r-5ddEG#%y0joKCIJhRe3V4_`zFb}F>xW~c~l z{bi5fWia-K^~&zjcOL-Zn<-Wg0{-~M>dsm?T)9M;q|LS#PcGGyzdEb3-ue10v04pR z4gmhZ;g)3`>RuUH~in4o^_lONtn$P}?h8Kf?+?;lR&)M7$#*$W#}yxE4GPfq{=$mEb0=0dGLUSJA&uKWM>TZXu!sKE zbQ?ZP!9wudn!3;=eJ&i8)Z*M+He6BcVtoc&oQF2SxAr0Pb`$Js;~!TB1ebzs9W40x z)=nk_9qyj3pJr_XoWI+6?p}yvwf}QQTrS{)d!Bl6#dC}s*D+T= zsmZ8__c`~Rqry_Wm@GZq2e))9cF3*Sc~PK;d7t8$FVpH4alDTP+gwSk#s%=&dUHF{9O!zDb$ldK>1{f(;4}ji>v9dsF zZ{&Ywh}W&y^{TFCcGMtWUO~4)v(7dp<-X zhiDOP=j)TW845#`)%B}$M}8OTB)y)e^Rdw-3h82=?(N~R1N8K@xg9=VomMeHO7@jn%~3Q9$x zvOwu>=^)8fNrA+LS1h_9tPrLO9*W-+59PN}eoPOfu8CIjzva(am*Byl0Lq;#MZ`vannc<0qlo2!$Ne}@e+Z5F#x}u2M z(-X8tpv7l_eK4AmU8GSfeiFsZfO;)4r@{zMZsuF8Py>!2O(N=xL2#CjGpEH+K|!{( zO|HUHyZXY>81$?xcZ``7XiMt=wM6YrfLtwdV)Q9rTS_>;gNFb_M5Vq2wIT!uuA602 z1=&ug0~~_`({I5+J_6#$TAR32(~h31f$O-_IkXi^n_Jp=AgC835?E^AHqcltcMp0y z9JEstxb7I3X_7aKD=ngnMXPyTb*|j4kz+-59#T%0>7duva=oH@eXZP~BiVNeR_((E z=%h>Y`0A9!9Lgpi^_dRaPOJuI6m0*ojxhfKYo`MH>8 zmdYuc$yblgwI+9I9{C$%eRDL{xN7v;9KL!yJ8alt>w=mERl{S4qXLVFCHgnLW*Uqg zww4?NN(Dpez8vU>$`;v**2!Mu2@*-@bLu2iHVe!ZSU2qsiD5c~z%)3109{$cSEtXn zmOz3ulYP7$N{z!2YXUvb(5m03IHZKl~t53SMvL}ZYN(7YWgkO$CbZ&VPfXq2#8Fb&-Y(QB0edsoW z%$C9@uPz)V7t@t~5611}Vs_&3Lu+@om!pPj8FK$8v1Vb}Mf6APsI*afKA8x^tBdFl zVQ?iu%;uDzjzm6d`8afR`h%gMB+NiNXPMx#5ezXLt`MwC)ACh)^XI{D3*a`*K=X_p z!1Z#NAOkG%-f`gjSXc$=d03z5$=k(KrYhc-|0W+Ods})Puyj|5FNlLh3xpShu7W}Q z)!?=tLM?ZAO1ub0FVpGcJ>bOZJCB8ZSWbYKc z4E`|0tq00sx;FY^&WvK7S_08$15L`8#25DVoXUBqE=pg-4K9o|YaZP%Yi4O{zh%H< z+`MBLqKnXL#p+>p{hb}+IRi}Mmr(=FAiyiB%G3)aMCdJE;p`CqQ z*l(W(=>qfxpm>7Hz=|h!@JC0QUdmkOWffweu7_SDR%Zd%g}@bx9)v#aHRokba~Ppq zF#v3b`3|;2^Jb%Ro=NmF>Kxk+?GViSL$}Klt4Bkbu~osg*-`Yk@KP4_Kr4Ss^v8a> zFnun7;DQJR77^0sznmV|+RELmU+=36)#r%SDZm^XIc(+M(q^FGB~AMQRv|c~^aPM$ zb`u#IsABocXnw#GHa9;9q8=}y=kQW^)jXLDf*1ma_6k-Crb;5kzlp2GuZqEfAo^8wSoAMZ24wP(h$DiD`NSk*H?fgi z2bWw&KwyfWi8^{D-5xHEoTo}YhMOZ}sBnrTFOxgqn#iZhrOI*2NVsA1wW3_HLNQ6v zQ6U0wjy>{~@-%r@xlDFj_JwSXY`UxmzncFlewB?T^{Rw>ZbAT%@DbkwNPkd@u%cL~@Su;{ArI6aw z@<#!+I|S4eO~tjCI!nNetL2r^J;OnN<{+6hdpKq}Xwbxz@!1oLsJ(4L%hh7eC7jYv zN`29C5oFYtEq|0y47k#EY0AJ-K3qH~06uN|P=}hQEYaE@#4Sm^se{dvI!)YyKluq3tJg90XNu3GmPE|c)N;j&~S;`V871fH`?<}d4l&)08Gp2N*_Bri_C3Yrv z-a5J$k4Jp-l(uYkXicX60uRole@d1_{n?dY^3Ul;P=EX{>=LQposcza|7N8dPW|SD zu4!jzMmCK4^;yVDnqs34rG9x9x~619sGt8aSqB)m$|e&N=j2QH(}(d_=O6v(LoI*w zr4P3J(T6_J@<(sFrsa=bbal%gJ?W~JKYGxWEq`>U_qY7fjjm|l8?C9@XUsH!I`)hy{i&mD$`Z#pyXp1@Kl@Qfo-tEj>M*wU z`0@&Q%7Kbc6f*g2nNj8{)kw-Egm{JMKcZ2>>%x(O-2w%F8GVl)N1c#Sy~t0k72H28vt7NEMb-j4n6`JwzjhYCxaDEO_o{0?F}e+$cs^#lC2nG5Z7fB8DO z!3VPc$*}%)q#)~c8qk{tk*)Mk3IOwcq z>U<5Y#Okq7K5PpFo<3+&h{pyKe54{vCp5TnBLX|qvxUQY*~}Nm$Woi^1)~|d zAcKooJst{%J?Vg-FIv*(#TJacv689tGblmj3XH5nz2sGs_lvAS9Pdyu9cobFP=nrR z!O~j_`x_dp!p3>ebN;qzf3&*_lTl=lgZn3xD-J4O$E+D>ky!=v(JlJ!?av^D=F2=xzNewJ4cv6E#20)_D zm)%}QH3vEA#}lBoX@}ZYq22@MzZ9b?*b-AYqw;u|VJTSkq11TQhf)V4m!B@Zlx=lJjQYD!r{;&9TvA?KRG(z~T zaEZ`gutPAEe}P}j52O#%+0-A@n^bS|0CAaIMZ80fAp?k!ke&U%4XqVbU8BIF)5Y=d zk^@EuC)=Ij@S5&v#xl{Zy24?Z_=4oaA>3SgA%s56&nkq#XY_8sO9&W1qLPP~Jy?aP z3nb#4O7{cGM`#L(zN^2?Ih|rRbbJ}o96O$_Fk>wM19vn+YZCc$rYRd6_L=?^FelWV z&?K$N&xY}V1>x@W)5)Nn^6Li<)d1_t%79T3Fe7^30)aXe9F19+Sv)~1n=B-j%dplN zPDqOYgJ3`gM}ns|rz9?LG~zCr&_cMzJtT`uAK3A-%xU^o(EgTLg%;$4=kHvOLfQGU zyHg4X?AmNyqxp8S^%^+8McK?FnWo_?d%tv!ll-SkVyB#x?3l>T%c3dpOpKe%CC3oB zPLqS*4ZcB0lXm4!J{&D>)x00Ewd)4yEqB?dM@0g4icW}Gv_W{VIb{)SM*>ahFj{CL z1Jt0ixg0RAa7%pMIYRTng8G|ty9LIPPI-cP-RS|B`Wc+T2j#N-Je_;ZvBiX$1lmITDHmcyt(m8Q-{W-(+MozhzFDiuvlPi#ZbP&(;zH?2sm;{>Wypg|H0p&d6zM zSalq?Hnf=QR=T;SaHkY7lB{l5)UT|&E+-N8w{l7W9l`1_Mg5|q1?qI27e|8~N$@GUi} zO=8Z6g!)d$6R5Mf8A-Kqfyv(~Q#@(_EDjY9$HWU&E-^{Rwpd*bADq`Y6vg@h z0%j@<5TQO6ijfZ-SZzV|k9TCv%Hmuv;QTFcuzrBw?EOw9Pp^|1V$4cF3#;-KCf95S zneAyEK3H>fcx#^=ezR*plI3{ITLI^uXbG!#)Dae*pDi=FzDOmHb<3yVy|Tm*Wme)^ zxM8ru^cF>S`0z|6H18I9%XOq7l54oJz^h=n$ve-oF>JnpvbD!Q=V;w;@|NjZ86x2L z44oy*%o9Z|H@VGn$ke_`96mf#`I_xjc}tfV!flm`3yMa}xG#Q@nsM_sm#14~2!mVo zP`(tde5$DqC3w!Fu?JLM>0CnxxIzs~60uTgxyd)(84`!{+H(HZUM~2Jx78(}G7IID z(pcpH1KSU|B;1oVbG~t&qw}{-`B=8&@ZMo>y#!AF?cuTrlyPwrV-6Z&Fa^9UA)0PM z7K1WC%}qJ;?d3qj3?>DVwHq#f!KN+i<_BtoT`#OJ7U>8>JM(z869p|;ZUW$7^1k#% zP7+qG3l|#NnmaVt*Syi=UYn4kIhHFu#Q$kt-) zdYts_UGa--F%FGm4vY}}MqZeAZ!sPWLmqr%jq8MhPK)721lL0nWu|*Q=O`b23 z5yrhx7QsHWH7MhN5vz=2IY~lH-p#g4&Kt$~+a^tAJu||4v~EjhZS!s#wxssF7mtbcjUcgS7quPd-Ydjih*7yzoD8w6wupube;2M4wi6r?Xau4B@A+SX>-<38BfgZrMc$_W zMW+%P+LfxM))Kp@bSj*jY_I6#0c1kpXh$WdHYXc`g2V0#gXm(!W+6r)#vP$ic-=!t z*FqNE=Ar@v#`0}r^6Cxx#K0z=d0GH8&eTF4PVkEHD}Y$M44BLzSPi-5Ywr*z$&vwd zxu^&dUIZCqAmQKL8v;w5BuoM<(mC0gbLn${I~dT-u`osX>8#4ODOmF;{GLAD4P@x; zNTJPx5a|Gk1Hv~YO3hPn-{@2E;Q9`F+~3w+Z5`|gY@Je^SvVhbw%IvQi}VR)8Sj+> zTvi$#wXJ1$hPO}S<7GeLXj3Dm3Hd`n>~vJJ%H-qbq(YD@zrkx3 zeFgNuL9vd7E8?JI?HbqIws^x`1i-k*z_l(YtT_=^A&HrJ#keO}l(}0uwCJ5HO#!hs zEDa1xtV&GJgE;er^g96c5jwU>h8*r*L~e!#Btbz_mV1wZOu4tJ#D2+CIkb7$5a(1` zaK;9*rWJ{wv1nW_)O~27wuvZi6iSNq%N zmIJVs{sKIc0M6UdRVRHK?%Q@Hh8OfE=+J?K98+rNW*245#D&B%xB{0{_6>aq5GFzs zN%Tq4O+S&v(-Ecp!uRe@CxPVwfTtZ;0wkXX48;yyanKETN59P~{7JNL@J(Nv#vgw* zYy2mGWDx*ceyPpPfB*|KtS`@)ojKi{W<0<&_w0x2RzrR5`1*!4xM}^`;hoUEIn6hl zc>ijXJn9LFq0EB;Q?)QBJ8!m@9>D1!f<$*Ndi9Auvxj1hj-51o@V~a6Sr>CSZ%ZdZEi3C7n={X*!_eaB~n8XoJWP-a4 zHZW`HegL!Ddm^UuLs8TXY2;JraVm2@(ym#H-uA9JTtL)wq5z62_yNH4twQ4{lJsCuD(-n<{m7c216#+5zAeowVr28mxMU zaWSRI=t~9b3QQr^{XOfV9oober=6Lu$&ARrwF0BU)~oSrbDti=jYzbk{2G9VSOy?_ zoTCqz$HdN!*8*(#%&8gaxGK!_qXAnt5YWwa-UMBPsw;qEvmZakf4T$+9l)8h{_yur-Zttu=YH$x1KIVo%2SFP>aSrccjK&rxy4 zyw9vD?MALS1zTo%6fD0`H|VX+SMBV55E%>Xj$DdVHU;u4um}B5&d-Jh;S!7ln+*W? zXbNDF!VV{0n)XDSiwDTpOm{&`t@II3CT-^OLd(GF8Jobd#!e?eEwiR29Mtit0(+=q z8`geG9Q5u)Br7x{ir^XFI;Yb{SW&vfp|C~5iJ&;NuF&LdfhY-b|JqGRFG_;_%T)AvA()Qv zXaM7OV)|_8WY)`z)K1uwX$CmX_&NC*F!?QDCqL-mHYh8MiDdcEK0Bs+UMRI2R*Yx1 zRZqaiYOE4h^LF!;^FbwED1Rv5CQp&o%MzrYNCPCr;!EOTqMZ=<90_{~ei4)lG6lZ; zT8I-CLtg_hwq#mJRZ?229eJI6olJmhpPvykh#=l>aIc*#n{5Cr(Wst2p*=yn6q5p| zIv4{z**ZemA69%9?zOXbxcMAV>3O^R8UQ%7t&fj9#+-G>bPe`Dw97=x{k9SV2sUq5 ze*<8GMgUy|(3Nd?5YWLX1wI<(rfYaR`x^l1Qw`}mL3+Hbn(@Ewso0TVSz>wRLk$?c z6G&o#1TVDF_KB@RIV`%o&qo;GT5Swa^#&?DshUB$?P)P1#|f6VW3T}LH^YFg8_?nT zy2PHs#?5Z-=6yEM0AQM-K-7hFbUk)9mD=ZrC9qAayibQ305;QHR`V_eeX;SHXA45u z&#Amm1{+3MMR(ZZ6teSPlNr5<81^$C@8f}nREGkgEt{`;nL`6KA+(zhc^?fl0M@0s zB9MQ9$*(0E>lDfRu&)6SEG=E{G|ZIY_8hq1P*2wBi1$H%1K?9yI?-gUsfA8t^UUDA zKhglOlUT4sXjZ&6ba%#t-6kq{?+rAJuoYuJ#F24c47>0yymyBi5@B!x2X=5m=n^xq zyFDK$2D|yPm1X+~1K>Vd`Y8?x;=G^2bgRj?g$LpNd$3`cwXxYCA!cCvChW`_P4+Es z+hD^`8&SiZ3V-KBeT%0}gIxkgw6(8ch^>9fN4L~IeJ!gZ@16dJ!M661B~=Zyr}STiML57Fh~Z%sOkr(SkU-Z+`(o} zr*^w!hqbb$_jvHO3{}W`8|+mBKz;rw?jlp|$yvJ{LBcLS? zExm8X*>Wu4y#fB~eZf2dEa!48{n@iivO|d+=^Z{jD@*pcqvRo78$$y4%LBh+j$g+Y z&kCQEl)Q~Pi6I^o#=vSK$I6#I`82b0wp4_c-aFO?JoU32mUtV$G8YF9p1>22k($>` zp)Y=Tu=9z^e9q$i3x-D@+wge!nyKB3FQM&-##_JG(3|U{FvW1A5ue7JsUTaby_ViP z)++DyL_;sJ+E1-+wihUZJrLe*f;Pp9m_Mk{{xZMAC&(A?nt1CH4LzM_=*(x*Aq$5G z$Par{^2(MNdRWb&b2HJ|esvyb>y^6ZSA{S+&=fgZMx4Ke+^rw5}Xsje|RF+Pe0V{_}#dI|Vb4DsQy}z+rmQQ+VRZ;&u>(_zRIvSu5BC$A?J%ZzX0_ zmtguw`T#_8nIei2J{F!5zAelab`$ai=ah4mgOxstZx#C#s}++Kk@Cm#IyjdU%KORx zAA8>&A4S#mKX+%gm)V_7AtWRlT4)KOcSz_+3jzuvC5;eBBMDttW-Dt&QN~KJ;qyE; z6eT_?3^r`2*t>!?c0fggiofrj*-dZw^1grl@_{q6Gw1g2xpT|8=R{e)#5up9Wr3x) z`HcBx^R4D$^H?))I%ayv4r8=#BP{-Hgry;ggvHU;S& z;I?t@xm+Uq4f_b|W-nl)HOFu&aIGd&VtzDi^xL~_HA9I0rc-+iKoWB7Nmi;C)X}U&&4g@#&ZZJEPg~D?QaUC}X zD-fBHlg93{Qsqc%(?sf*k+L~U!vO8_FXPPTz>lxhQqF``uXDB>vxGDLlVFQEL&IRL zmA{!OmrFT)!*H!sL$hFuI9;2;+^T7$X5lX3v~7lKCD=laJGWqNtX|>^xqxHO5qY<8 zlg}~4&D^BsA)1?hY6$O}xQWe!G&2F!FvN}AgmVhvu4E)`{5b`wWOj0y=NRG!E~DiT z?)t$=6Vbk&8^`Zq5}R}ek_YZ0bUovmR9VxmjShkp&@&z`)qPF@M6TaC@o(k&!maYSNN3wZ zr=gU;E=O*zPdogy+;!|*xZdZ&zM1RQjGdakYdAt~82x2jN;Cd8*f()K&xL&>*8}YC zwkoGlVK;Ey&n5cxT(^#}yCYy&$93%pe}sK4mwYblYdBZS?2YBWu4OB^q?Y*`br*H) z6*{3hpL}>O<}@^J7qgh*H`;1# z>#cuS*I7m9w9*4iB54c}O!81{eJ# ziFuz{48KQ~4clN=KY3d8sA*UbaP)pDs;L_xj?U*4heC}!d<c=k zdtJZOogw+csf25&^?$MoVzvpp!E4YK)RSuf}GJ1ff?1yM1;{ zlz{EgGUko!Z5v^&7(u6~*{u&6(=3$p)>s?!diJ&rYGRWbgs@7p?<%x64Y71@VT_GA zn!Rm(^AKH{GE+|z4w|ReR%}~`^Xr6X24ng$Z59!an#;qus%KprCJrKI_gOM{8SzFxz01s zW5o})#)lvcx@fI55B0rXud>ooQ?&G~h2{xYUsitk^3rmsBIV{YhcDX(GvjpsUD?l> zQyAg7p@448Pe;(3^ ze0eiVN=o5fo2ptf|3$x<)1==#Fz@{Ko0%nr#o^>0+qey0w&`bkegri79Sg0C&r9ht z*B4f}lmqol^_FdLyiEmO*;}Xm^Y3$O_@(DBo!Mn-1@7Onjk@A)m{QTcgZ#4dmr`Uo z>`_1iez>V@hle6g$-4ibBdjOVtbsOrj2Z9x<`qncmDTjEOP+ z$8d!q*;J)}ksZaI*6q=a*00iQv{{-5+0WS>n(680am+2`OT$TW3z@=Q&-}^_Ix0=*7$%iH((AN z4K7yCAKdG&F*nmVuA9^&Y{OG!TsKuOT1oY9e~qn~UUbutbSoTU!ga+Fhe31HBB%btmlQU~qNG5NTs5--(y%yn zo3W@AhQJ-2_o_{emPnOa{B1uyEsL8rPEo{*?j5(|>rCN00qGn^a z@nW^A=-H@#Z4|rygcX+nizeg3!RRTcHiOk2TjJsuEA9@JDsZDkhqskl{ec#WitsP4 zGj!fZ6{{HrD74ann@~ec|G?w=%lb8Wq>KZ>#CuCZro1&)}k`Lmhaong?ou zw3%z?hV>oEc&zp_#*y2w^{~m7nyOJ$O2hhqXlxp^7>)@S>7QbvH#cO5mDh4r;o0o1 z>7E=pU===tb4h7wv1_h!`igrAhC!xmRw3cOq{cF?t?H>8cp>qohl9CZ>InmYtN96o zhJ_3VjF=|jV&D++;#D*UofVs#ZOVsYkA)M|LkS9wsVSCWZDl%~p7QzN9LB+nVI8Wf zfh17FBps9l)jA31M5V#CGSZKesFBMyvrMg4>Ny^L#)J)O5PDKNqaD#}RMm|PlyE7~ z4<9y8g%mYK**c^+t8F~9w*5m<h=Jy2gl83~{#EX*aZ&!r5>}XWakv%o+}g zq)gFBPu}%)=k6_>QA4xCBwBXaiVfVmrHXwow3>3BFs{v3qjqI_?QUtwBwFB(#M^#de2*8@N)JG9hx%jvCNtGb?o#G4xz|gWiOi!sydhVv)mh z{pcARYTcseqi)z!warLBV_-RAssFoSg z>=W}VR#ldk;p9zaK6(*4WMqC4O(ED8pNSNgMpE3IR1=lmaxCYP+@#{1{JcCmK~;|I zR4_k^YzW51ry(smtx`&N?;Xzxi~i?nsqUP!vguOj56eTaC*BvS&_g9iC1K|OFahTK z385%sO1JoUu! zFnP?k<3cdnodkXyw`nxg&Bj4QfK+}zUg zJPLpsF);+2+S9SaLD#un@BVTRY24U2eWT5cR`xik<*PY1;_9w8Xco{!k*sybpD z(2msUiUC(?a_72&w3xKFrM>5vTdwnYzqt0rYIkjiL6k|hHEQ}yVMSs5g%SqCS z83i3GDs{9ysiM5lHNUbD2R}D3Ux))juymb`$Tq0iOKR@WzLo6JBaPJ0J>ZA4K)07V@yv%} zY6!NL=Z53TTv3zW;TT@uxg0TkAodMu;DIw-*N7oSO1dM~(BWvFx+4~adS6Tm5tv*; zG!<&0dUYg*?r5p7u5=jiSR}}2-V>8U3=B!t$JRwUwByANL9}6%%EI)_(meFp@4`xq zTdgVD=RkmPYJNzKvm?2reNH5o7tEbKi!K`EGw;C49Q?u4BGdI}HOBSXh7Rr`XE%s+ z!rY70INzqWoV#jAFxbR?N?)Ll!D3g2_JsB_?Fjx6egz+6d%;#@>tub;8nX7bd}_JM zGRb_>e2;mi*=l;;bcJcU$!OeXEH?Hvylj|J?MT1m2TrTb!Uk-qiI$$&Qe$g&pqLIo zmGc7JpbA~eB$zu^cweYI8r^J;P{&IpjM`_6!%Y+WjNDLlP^ZLF{ms|S7g8F=Qnx6? z4OdsIlwf1sHJ#f}+`tVk)um*@Y^f4xakrz+_5;Nt$Bk?{aznDP^s!ipV{~PHY6ngQ zAc}@+{@gHi&1Jx5tnxnZu8E0hI;dAlJXWHsW_tE@SO7^`C@I`&kG^JTW>Z1sc1>7Q zQCV6Hqi%{Z>I(L2v}E7uO1K?Y&oVWeIfR2v!6>E7HGTv8>K0wfqKNfs>PDS!k}bvX za0`CW_3Uq$OpRElW^v=xw;Zh%sBX%qW52|C^1f2~W^7N7+Eioe(IlRI{biaQU0f?by%jv$nU5tc7QF>}NPP-+PLh zwI2%KG_-jqbJas{ zw4NVjqQia&Fb*rG`H7M;9({vvw&)beO(X%JnXX3GO|RHb)#;TI!?$bRur^z34#z-4 zMU3x$fa%qsd^Od-=e}Vb)JmnbxB|+)2$4vgtArk0x-PY4JJ}HkHC#|<-^Wt?fLt}* z-!H4NG&33!&THdz!*;S?Xi(6^%{6TnG`tYczNfA;pmO@PCKaoHzCBjYzB>ywvWVu) zDXrby!cu=YXIU`3lvQvq*moMV_fI=tZ?(PERettubz-ZeBO|fakaAmaIKX~HO&3SOyFz2TCN$dAGP;wrKMpC0+vHk zC+1gX7Z$Nc(N6t=k1aJxv8@D97M=9$YwAjj(xu<_{!weQwIik8=m9qXH+*7^8`&Vx zy$>I?Haj2KFi>RqW(1wqcW26A2bu3~J7&AXwglhSm#kM>vn*#V+swb2^Gq+B(v8;` zzA`K|MCo6I?}S+RP8gv*qMgaT0jtQrvz3}JHS@@$WGeGHBC7klA>I~aDGT9DVecVB z6z!-wHwKE~6@?_A01X@(5NA$^o*6^{de*Vd9YKA7=x_ictPJ5aU^j412j?{t4tJ_& zQtqg)g^A^*WqGCRN{B;@58*uDpqWFG=-}+rt6_M9T7R*Csm>sX^2FHqXIeuB+&8sD zL+qk8gwuOH5HnrXSOx=J9gBHflbGx5OA%f)hj37@8={1IP@~!M^8D<|HER~%VT{CD9vXu62sFdoCRxobEh;Tf&Ce^WETuN8 zl*sEz7bO;OC|f|K<;0Q`8eHG9P>4Jr6-3x^G)-dPX%fR3C_%*`82Xp1Xz`$%#1UAjXv;SZtpAax zo1$!plB;}}hbvuA4CSHpmMbG?O=V?iNooNdm^819L5O6$!hsGR97Ml71arzs$SrgP z8v#I#sCg9q>Y^aJyil4kr3(T>>9KL(>^#M;P<^SDJL*+rJbgv9Q$wlsb{6DoY7+XZ z4n-PLa5uC^M7XJ;e)WOsT#>XKGTbgoe1x4E>RTT&v-5$3^o9wk_e#NvVE7MpgUtb= z!9p9%2&ZNyr%<)SI;#jP>ul#xHEZQN0uY z^b|c3jhC)@sFzhb_ED~NW_|p10snc*((2OZJMo0U8U-u~&qs=Mu_=;b%y~}i*qat8 z68(*p8kh^7jl}5U(VU+Trxl;qLb=p6Oe|Zis#uYqUs=JN6{ABi3p^7^Dk^oq9!@R# z-%2v4v~*Pk^OwknU=w%>QlzWFsL?)!{~IaJ%Z3e-3g%CI7+@H95|X1`4w6fj((lPJ z6#Q?bNvCra%pVmY7zn14K^29OV&_ZIQ=G^2m@~6OFbO;)HkPV=Oa01gk_RXzvFZsV zpk7BaY(tBw9T9?U-y{U1%f-}^R$hGwb)I4x_ zQpNl>Jp_}xeX&eT*T*-A#}Wp%woKg6CM9!vLMRa(J;G5tQi)f$u?QY9j>r6(8R~+Z zB20gT$#y;$>uxQriG^#a1y$ykQK5vob@N7jb7dm~l8xg*t%-82pw{)HH*@kg*Qr{;t@CaU>3V&Jig#QfXnYriDjM81XYQ(^ofcPS8c5DcrXVf0Wdt z7wZS>9l9U+F1EjI$8FEp?zRPOg|_L2tQCfVhA3MiOqM-sm8>hRv#o=zaTvdTZh66S zzvVj1VoNXh_Bdz`ndh04Oy8OwHEqQ@QH=4p@jl}^<9MUh@SfpLLkXo z8L&h*MwbAC0dHyV*9NppwZpXz?pwN^G>>!l#8j>E@s5h7``IL&d%q)W{kiu#!j{Ip zThHdMJ4w|n)l}}CdcM}#`f+b}gsm_4R!eMdSnH(=);*QEM}7tA!@b#pH}|=@EAsQ! zP)^dDd!ucJUfk<#Go)}wyJ5{psdab#QL;wncu7z0wK}HOczSTJw#(C;; zU%1;Em^6qSFI3MBxs+2&|K9{fdnP*m?@Ul6HZeiba(jKq`PyyM4>)hTJnwU!c6r|8 z#CCb!<+irV^A6{3m*;J6OFKMn<}Ge>XKhM!Q~AR=IOa|6vesU`!EI{o)$82G)?OXu zHZ*zVrY`5H@G!4&>zll*d-W=}uC-UMaBEw8b%a~fzC{~%*giOOg1f1G?g;Zw+>IS) zZp{vlVp)eC5p6hDVa}r+o}al}Tj{PO#F1*!cYCMB9bqd z_`xS5rHOKK-B)ETR0VA8<50XC*95XnmpAJa&zK-Lur+=+1{BSXJu?ArKx+Y7mtg$rnXb>(|-Tn$4@T;-ZJz_t>@;L0QD|LgIgjV+i z)qoMDWcKOVimrPkoL)-LsWCOvTo30UoN8pt=BWk?`AY6zS=Pna+G>6{Y}jeyp{79> z4{bMS*khs`-sYvXy~zJcLThb96^>dvvAD~ z#xx5yll{H@VD9Etf@ZM4wI8l|u<7jSe-O-_cLDqBKM0pMjs4}H1e?nK+$dNphC-TE z<`ni+qi`)73~3f@GJCS^U}%4Q9h!xk#GYt7T+6{GvOk?;Ft@VDK7sx59K$KW#08-q1#gR$&4t%qwp*ci5^ z10yn}cgB{sJD<6R8+i@^@|ml-5$D8z6*s(f{`&Gqa+J?p$qj2gKwZJ>`LE!Ho)iD& z+>ko{Hrl^Ffe<&iEQ-%MNmm zVBKGIkaalwc?UU%v7dF2b0~Y<-9gqN?6D4V4rV{?Am0&-=cANW|j+hEfCgXnN5~BrXcMGAuu}?o;cTBelo;x1Z zF5qhD7k>|DDGn{f)<7jJT>JsW~Bd#t7$G+FVrA`Jd!(Qc=F@u&ILdTM>e{j8s$t)!X=>q^8TP z_VUy8J@Pl9v}Aca8@TM^YP7$Udx}GI9 z$r<&V0WIAjL(nG8hh9NRK|U1f;DoH4^u90z{~Em!%NWEmtE47=WJ_V|pG9H`hwn8b z1aBMN5T1HONm_lN)3AEpmhNb^z{6lkUUoT2nG=HFjU-q@r~8Qg|9m#a-Dt0&^&d1B zaMn~>Kzhy&&4MBZ;y?x($wG@R2-}QuUTGne$w-g+Avo*khA2@djiPMLM`4?>&J8;@ zB;DtPX4Dt=q3kDP#qF_Sehg+4oyRW5DQLYHLj?pzAWi(P8+e# zEs{>@KXzslS5^q#L6Q+AAkipFx-kt;iP(H?EuMzYkyE-`jQ}KRRtVlhXf7#4sZX(y z9jh|c*BD8>AT$}<$p}vmMJ2!bboB6!g@;9oO46k$1UDZ&peRIpl8lJvTD^8qI?Zat zK_W?59)g38mXwkjyELp1PZiBo=Y}MHc?ga+!hxka-)N0_RWE6z^YRcpWJGxDJhe6E zRTqv(TzLrIEvT{+{dm>+RjcQXcv!QMPU}PPP7%=?bDe!Qsh&%@qk3aXH#D!X7#im# zWos%)Y)J_2C7?KFosIZcmxoI;1<#PC8wk6hUEDxIhYkJ2NZM@Ln(ci%) zX)f0+(DWo{$rI!zGMRK`eq;_Y0VZHx!!Y97LTLG<^!H3Bq!EIf4h8GS{%-1b4gPXWh>J>&<=C?WJh7=rGX~v`28+1*{S5KiA=F(Lim-Nb=M-26c)Z9_bTdviH z6d2=cDLmaiF)&9m%M2+{l4!~iURS3uE6rVn=u7Bnukh1`kF?D9JxdKZU)d~?h^j?6 zkcp{DFQL_BWsHqmw64dYtMrY2*wTv)Dd;kq=B|#ZNq?v#T_zV9QsCv8A;jG#Z0gqe z>(K(Mr*%(z<}eI*6s}sDCf$e~)ziSzcB5Bw%T~elQl6qhW@4@r3t_}8GbPzGvmH3s zTbXYZUH#+8a46qZR=Bpb(p5mGMpDW1BYR0t)P7*?q&|g{J*po{&lbB@X}9w ze~L1vrDj%Cz}76hxK5PPmiSE6!C-8U`T{m|yXm4?hjU$51^gxFmrKWoKGR7$I^>yH zY4((Sts9Q=T&vgQS19&(`nhsZ_ZXyA!bM6x%1*K*ad{@pISc62|k<`_1 zj;pA!U`3^p6^zL$7kcyT++es=ZKaePC z2R;$)&ZAXRri^G|%M70sC9{fY#!BiFRINvat6UlVh7VsUY~d;e-dHGXPgr1#gQR;# zMRL)o^K0}Ye5}-!<5tFIC~RbWh+Ad!8Lk@YSG2UC!UY$^D_m+l(MqqxhA(oaT3$kk z!eS+>iYGVZM){GymhKAoa}}57p}NX&dZUc~q(#FeCx1ou+QL%lCVhxs!V#0W81~~v z#iw{Oo62fF29JmUpSgk(dZc0gG}nX~)56Xz8$Fv=Qc; z_H+F}$$j|?BZq4Y;!N0xOO227jBC;>*1OD{ic=t!rQzS|52>j8po^li%gPWj)UXRy zP$1`Gq|{Fu+b6%vNCnh%$Dy*cARlR$rYwT-CC)_@k`{{7h)Q$?6}qz!hzh3 zX^zKa5(LMdR$8kiU;r}e9RCV=$Zd?@1~d0KpgaxKr#&%=AV0F+&x z@5+a&Jsr!ch$_#g4$#pr73F86s!$9!=2j3#tvD9O=HTwn)668g;%-*ex~}gpa@Huy z*NSBp#0`Bes#ss3@P?C8yflU%sYohDqV${sa2FP~l6>i#@q7EY`?*#?WEHUu=QKNF znl6ona`!UWrh@{jXGD|X#W`!SPEdL)TD94E$VT?se41Oya{6$>&I@m}AtR{R!ZO;Q zqk5?RtWvSi!&Ewl>^$^7)Yqu`xFX_iGn{D}D{Va*uWP}KxeHv&F{rCZGcaew3Yfja z*$vN>CPl#5GTSw&q!Pa1dtzKsuGcp|e$q+V&2o(|U9Wa0>h2bPN(WCGVx*hO3@$13 z#`6|*&<{jM=M`4a?B=1fqPRgZ(f>)yw8b&K6cKh+6qQz1q;bS5E{26XjAA{Lnq;be zq&YX7Vh%kDfVkA72Dr(^sS8~4!iQ;SGRna@<&}E$f$~#lou%}p;?7)sBBc-N6(`M> zX6jc|Vj_V^kWcgxs4H6k6{}PP<ev?9qvqHV_R7*c}}c*hHeT? zAju0qj2;IGt3WRvc9vVA9xg-T*{+JxHRZW9cS@HR)+vTamjVElrL@f38PKHmCa4I(!a*aqwCdv~&mx~PY5P5kx{wO#*bUlF(u{|$ zjUxRd!aF*Ychc6K-zKnW;RvRq42o0usW7SjmU|cHA8K#R#0-~rZc%^&EDOH<^Y8i)xLUQ%c zMM>jw=NNG;9GO)=6)GEs4HePME~{Y{<6xd<_yM*l)*MTrd9&$e{R-W7?R&~LeOW;MBsc^cMXZk#GEg;{JmOjy{Yj+>4Sn*I)t79a!)@TA-4?d#8ua^*@(?|G(| zG;hx{b~nll0nSxwbi&-Z7#l#Y)y&Sr(Y$r|?7P+|wl6Rez(hs700y@y{+fz#{RE}{ zE-W^*pQB4hD#pW~d^L@(6!nk~04p*SsK~EeQ-)kcPM}J!FEJ)a_VQ&Gj`B%l;1h8Y zseCJHC1yh6#7fL5@#XK|q-q*{^BeuB8vwNS{dbj=Ru(QVMAO%OGo+(`J{vW-)j>ey zdk@Jf%u(!wC?kb(2#%CKI3v0nre9()40U5}<(beVr*vY3PrRa(*Steyv?_-}VH}{Ji<%u!1{?WB;igl36s!I2C>I@k6=iQgr&2~ov&x7LCQqp~jef2Y z3`Gi*lA_8Lx5c!hEG%({hhG@27UiWX3D&_N4KqFQ0+<5FRL`@th2qd6)qf_DZg><` zv7tDp6k?U5IHLs|=x4hUxuD}JbUwg@B9)NB{u>HPOH_>D7tIkyr;*H;GB8_n7}JPoZc9nHEjB!smR z=|ueDzTxh(d`$_)h8VV>-%z9reU&o%fZ1^rI6Ur_W?#HB`V!j4SjWz-EXVYTiX28@ z^q4c%AHjrI98#i!Ji5u4t!`f0Y$h9)yllyxGo+I~JZO`CdVgNB^yJ z*L?xhuM|?kV2Yl^Kxjn{CHK(dF>vaoXyT_~iZ13B!TL{15Yl3QTTzG_!`u%2Ly=ObCa0_2jJ%eXt1}xq zJH`YgPZ@)y;{0P?KE_;mbQyqo@t-XrA>=h3UqS-6JDVXOAw8PEVAN+i3(lq#V5D|9RPrcegU8N)WVYfs(47Ln&XKx)e(>~ zgfA%=MLVnpA?n2%h+aV#49hzE`X_!&c^bk@JO|KE(#A5uy6R0bghboo)~`X%zzk!ZDx-TQI8Ns=AY%+l(v-JCsW{>t$QRhI{fm9KLH z?5W+bw7RmV)2&LHQX;y12C+*^wTm;BtKZvZ%K%E^VO{J-IgO0g(A~gj8C_y5QoLFz zRn_o|Q3-R$;co=0FdB6T!BFO+5Q^}klJu1HY_c>q_v?PFhS|P%=YyKWb zzT1DICaotq5$qrH4gP;y-9P5LcNbRaj&>&#bVE`(=3q&6R@rwKTOB<$gnI^tg8LHg zHEtrK*Hl+;{%*D)>6U$ypzY5w@>r?Y_U}%{Ob6eS#*r316Q^Nf377j5%dnbY+O^-| z|M%5t*Z%O{)z!MAXa7U2vlej7e_aemd#=Z%tud#2R3A(JakP$HE_Lbk_Pfx7w6Mt%jM*6zT>14^6c>4P4X^E$fB@$0{pE0Mt7(oKn{JK+)tI0LNWbMz@ z$=Y8&>7%WpIjGj9|B}shMujcZ8yqaVmrc}KOq^L4AckHBd`YX_gMSH{t94s{x|G-s z2;vZqIn#?_3k%i_h!=9qo~Y`L zF{fYQNU$0?-KA!-8kxKxo;*`MZ^Y>nggjk6Y1HYbDkWX|ypMF^r5y9*=;}}Rp4RZy z-^!<>myuTkuHOQ#-}k#}b#_U&_e?h}i{?(3($i}PSy;mDA!|l0H8O;&E={j>>j_)^ z)3DlTO^l9k3r0Vs!Bz%0Yv{w;(LZP=P^Qi!Ylq-bb=Iibks7woVzYGRnA%~iezCRs zxiPg93DHTWakc4$lSYlJeHpp>y`Rp*A;kn~L`Lm;ME`I`?QlKVzME2;oLs!vNVt85 zD|H4#KZ5}8nuL2^Z=CNv&D=(;^90 zs-9lk1DB7d*T&;gJH6J0Om?18JB^q*BxLZjVADz^Giwt$LkMYHGqd)3aCVKFU5G1**8%^fytlG*hU|(c-m`q%4V8AeSjL*>L zzg!xlXVF0|l&+awo7zc-Lf8Kz+`qH|r7EPuvunHWEIZk~mj@Cc4`-qPB-;NWXhEHB zn{hW9=OCAU38S}G56r54SIc&~R8wufsCFPR&Ay0m_j3ZHH&su*xb{h8t(sj_dz{;U z;^bz{P>+sd_UjlOqD7RtZHQa#FZ9-%v&L(jz&w zV^BS(a%u;ppe>K+7>%BAA>AI$EHGEpF$-11fI7izopeDiK%}kSnp=B9%Q_cZs>=&& zzr2zBUA;ha=7E`2y0QhNQs;?A|7EFmXPr4}Wlgt|>bXnK+^$!M}muC3PP|JhqponG)~DW|db zsJ?yGpV^ffdulaz?9Vg(HTHh{?SGwpO=BOq|JYxebd5cu+HODFO#>JV63$u(8gHEQ zY$bl~bDmvJsyjuWovy{N+|Flj)0%a93(InP+9OD2*V(k{;jXh6X{D=roLwk=+2ibL zX@1YMw@bhFJbNGFxjp6Vy$Cs@*V)JQ)jIp%+qAZ~ay&E95&nBJ?FiqkeqhMi%^ISS z`VK$axjJL`*(de(z9u%>V6cqibdX%eK5l=;S>0al3Wi)!?Kn1CB-UG3dlsTEUe0LB zvcIdAPM*Dks~&m!>|+mW>p((IjUg2W%LvJsNH)ruj}S6*79Z<1Ba^;#rTe;KynLHRLrla< zzZO)!So&A>0IMN~X%^k`7EVL_X8l$N2g&AS&aNS!qRy&5kJgZ{aD6dGL$V1g_lebz z!9-r%Nke=bejiWJKumdBn`wOSD4PQXHyC8jr6K<%@{`FLvWcr2im%zMDlh1ABS0Kw z?QSsIq@12-dsM}wAl|CApgWL?v6qHihgfgHb*}zk#vEcNvVDMtoZcnrcIT&PV<1Vr zn&aP0w@$v?*E$sJnS?PMDE(Qb#Ux+OtR%89nh)wi#RjGiTlEy)PX?bMQBN*L+{juQLGD%MYNl8y3Q(lLGY1+%| zwb1Ui>hA}qkag3&mq7BOlny35zs;-bU|!KaMEkVyBI*2y!C+6bWDGCMv~v2-H6!05 zN_RJMX218j(J!g}a#fXGPht@BqquJ3XwN1OaG?8FI^)?RPLhDGL1$cLcj-xIWV`YAp-4X} zzn-io`^~$K@??SFU4+7AF?Muw;ia&uP%7$JV=~D@()DByZMKgF=*iQFylSAHU@uet z7}w1@RPUk@dh!w&dX7}C@=08mb0(^BLiEQN{W04AyrZ{mPw?VXyn8gmBb|z>h2!+( z9-2b8C3^Bck+}>#*{D$J3ZgA6Ta^u^io;c7h@X+Ym24?3hL_iJx;U{s+?-?!D`%|~u4 z8MZjL?9~Ia9i#^<8(&1;bQ+G8haAevd(y$si;jEq< zLmM5_lVWz)b}i{`E&yLT5(Q%9iqG|An@OWH9~fpJ(&~6|jvYq*f&lcMzK_xbRqW zaBDZh5u>AU~f2?Ls}6irsfXv<1v;W`6Jb&@hU<8A}_!bDcfJ@y(% zKRdoW7alT@cX?7F_c>}HiFQ&cPdjEHS_fGp&pv4&@7u`Q1HFwT)=t*RnRX-jj3?{m z?k+rWkPY(a0Y>th4d1K5XpT%f*(9&cGLnsUa+!Q`nUN&h$!6KP+DLARCR^kO14iL3X5? z2)1vHaz?s|jIk4wyd}d#_VC0k_sBAlXn|PeQ8^~k*PwH-S48 z*YkvzOSYTHU3OxZowu9Fgec;WFMiZS?iPq3|Mk3y9JCUr{N&pvGTEeYm;qxG`KuR+ zk~Ky%`BSHHm=4;_;Emam95lM!|jBR|)}OkNO3tbFxwGdZFso#aIsW)kNx#{m$X z8BJdKM_iTtHXbjeIcCx)nsk<*UT!8g8%eypxXesuIZ1+ipVv$tu#+zGqU+71yPYJ; zTkkTHZ!P!$u6oE!z9TwEr<=O_lH^PGnaQyvk}QvT(@d7~q^o?}XJ#^)C*9;PPMXPr zPNcg$#$+MSX*G_-Dzn`}lB#-xURvb?^;Bsc7V<#V!=R7iLr@@C$Zdp`Ij4opW95ru zEabsBu7Dv0v^!i(oF5x~JurBAJc^F6&R&Yo0$b%DU?G21i32Tw%o$Mhjb{g0$aO3t z+CI!eiVSA0*^#)5Xc@-QN+DQo&pBmb|LngWli%p={Z1 zfh7~SBgxkTff9V(LF0W`CUtc7bp?&{C4e6{coQU^sEmvPy1g!3|sAg`gEXw_)r%686O?K)%sY_-+da;-+To0w2v0?SFaoN z7w;C(pS_zwPkAo`J?Y&9dcwOA^e4A>11>*$*Mt7xT?hKTcP;35Ug%ZYzx7sve&ekG zt?`zFe(hZi`jrp*J7&1Ft&|m-oH7pznFHfNp=+n+^JocNys0-ld>#d6$5`>0J!^hWAp?*S(8C zk9scwea*WN^i}Ty&{w<{gTCy&2=pcIe9#xY^FUwl&INtmdm-py?;OzQyjh^ndS}xr zdd52o^l9%*(5JjJKo5DRgUa3uKo5GSfgbQq1%1Lh8T4`QB+&nQCxSlaod8NwX-m#z$d&hu2O*E_KPS9pPW`{iC>-X8J-^Y(3CVBQ||0`vBO z7nryEy}-QP=LO{LUN0bTcYD0Ryj}EKK(}~-eEViE#r$Pniup}miuny*iuv_k4s@ND zqJ6Db1G>gbKr6ir=xPted6|bIywpPxUgDt$FZNJ?ukuiUuk=u87kVhPS9mD23)~)x z?d2Yd?R*c#cAke~JJ&<8o#Ua{&h}7jFY{1rFZEDtFY!=pFZNJuU+SUQUgV+JzQjYZ zy}(1UeX%DO^de6V=zLE$=sXVv^;{1H^@Sb^>Ny@aMRk^kqI$N6qI#BxqI#x>qI!mh zqI$ZAqWS_4MfEffMfFq9IXRU|gne$LQvmT0Pjfdiy zcqpD35Ae*N^#ITOUmhTt|I-5`^M7~%Wd4i?K;~;b05bo(#{~MD2XN+3djMztR}bLK z|Kb6h`JX*nQ1>YhP|ct8u%IVAKsEo9hk*X*VL*Qn(Lnt7BCySWCvFD)Rs_QNZ$u!R zuMvT8{%a8k=f4txaQ;hi9q1P#aL#`&0_Xf^B5=+h7Xfqrmchoqt|*1MU1_5oqV16M=UA zSrKUGpAvy~{*VZS^Rftp^9MyBoIfA};rx>#5Y9g#0^$7QA`s61R|LZO$3!5UuNHxD ze!mEW^N)&CK_3wTa2^^)pbv`xIRB6cfb)CB3AB126vu-;AOhk1{UQ*~-zSa(y;lUn z`TvMOIR9@E2cGB*&vgbflQ*Xok&qTfr55C1#2e7Y6gYs zIEvJ<6sTk7gN&XBGKwO0Bn9jUir3*3uES=745eTlLa{oSLUj;D>c9(V`wyT%O{X~R zPhpxyQJOjlq#wm--w7anC_sB>g7nG&NulWMNx|8JVzWDiW;cq=t`wNb6qhav%Or}* zL<-6-6q5-QlJOLgohcyWC?4INC>~?`gT$nPL{ltAQ7Aeo5(NrG2gRYC!jPvZv{4XR zdw^Id1kK$*OcaL3WDo-dp`Kz;M;VZ~%283<{u9gnI1aa zbbd6Jpz&`3CH~7m89zkS@wa~?=vn^;(7*f;RmY$Hb)bLv*Mgq$Lu4Jb{z}l_{S~0U z`O861`&Wbh>MsNR#qTb~0`xn70q8gW<)AhG zJkYQGxu9S9b3niJXM=v>Uk3WQe<|o^{w1Kt{g7eDG5@8YpZXVpe&W9b^ke@*(2x8J zP%_7de#o=q1OG*!@B1Oqj`#fYK;QMx1%1bVA?VxwIiPR(vq0bU&jx+NKMVAA|4h)M z{u!XJ`KN=v;=cg&h<_UB%l@gLFZri{zUZF}`htHF==1)Gpojev&VsY^xyuTp#Sm%;f{O!K)7R%9|(8c?FYggclm*E$DMv4+;N9L3G{Y95bmh* z1L2NcegNEYn;!so+~Nno9XI>Y1vqZ<1K-@mE<61v(?zqMeoI9@e1L2OV{6M(lNtG9SfusgFXt#7CiB>?;N>@=<`V@=<`V^ihBp z`rH)ZD|{5;1-=5%<-X;h`M!M69A6%2wvXa`nUCUpsgL4(iI3uZv2Q8pr9O)DMLvr2 zOMDdP3w;#l3w#vk7yBsAFY+w_o$sSCpXZ}6pX;MAztA_2mVSB7B;UB7CZkB7CxsB7BmMVtb-*3g`qM#rAj~#dfA|B4~zh0_Zp&h4xq< zh4vU9h4yIQIM7i(3hj};F%${{$g6!oP!Yp#KU&c!Ya`5FTMq5V9lO9gGIOD+t*U z?hHCXZx0HfyMqqUsvu-X*cIeKZwuN$Zw*>OZwXpJZ*m9CxZD_o@CZ`S0J<}%2fZPv z1HC?|1>F&Z2np8(Awt5nL5PsBJqQsJt`0(kgsTF;kZ@%H5+qy^*bI7k0CFUR0+1tN zTL5w-1Ot#GArOEZ3H|`&Nbm(9M}jxtUW1D#06`MOKn3X5Ksl&8uo`qr0D>fJ4wQm! z3Y36u3>1NG2&@8KAAkr6YXguVVNGBKXl0-Pv?8z^v^)R_63POQ9icP;*%68ZkR72Y z0ND{%1(t%Y3@o8}FAP9X;;6wnI;lR@VMCV^%JAV|XO00c>x6@VZKGXoGLVMYLgBuo#C1HB*sK@z3} z#(+)^K#qh-0mzXsF#tIdCIlcy!uSB>NXQI8j)aT=ZJ@t{w1LhBX#@Qgqz&{(kT#I}OpvxvZIHIm??Ku^zXfRvoet6# z`Xz|oP53!T8|YM!Hqgl+ZJ-lD+CV=AX#@Qjqz&{#kT%fwLE1py1!)6)8>9{NO^`Ow z*FoAqUj=E?d>*7t^I4EK&2e{-w#~61ZJSSnv~4~K(zf|HI1TipAZ?ltgS2Tr2-2o` zKS-PAy&!FxcZ0NP-VV~Hc`Hbp=FK2&nm2;9XQ(pRCM^%@59AN!)nU&ldONPl;thbV-1~Od!ZmX3P z@MMHMce|Bb9YsdUpWS68sdh3-wm)hmH%5`s^1olSl0W0g7Q}&mpT({acO}=K2jocVVrpvt!+31ek47t})8+p%3X3FFX8+n;0v*cHPwvqi- z%WUkEU&gRdWPL+lwd@HK`9v<(@Z^3QnIp$LcqP(VH&yzwWQ&t0x>4jp**S|o);MM# z%;L##LgvaN=I~@cPv*(cMI_(wWWM}C8RD>$i{x!0Pq!{FmUFiA#9${2B42rkC$I2ik$lNfo}@U)rLyNZPkynJ#qzpSJSpMH68S4=uDtIcOXWjO zY>isTGI@y0PA1q%w!9(TPUZ+CM}B#{o$QIW%zFW|CDk z^(p8_R{enceEH*rc2aC2dGho;J9*5E=aw>TmSXp78?Jf!s_)j>5oF|gJK0e6FzC%y z(>K`3?bvVo9#^X4Qik2tS2gmO&35vlz?m4csoIhC+YiP^T{b6)dU3fgADeDFW+@s& zA52qr-Fjn-_0uZ-t#(pSRSf!toOPR>+^2yCl}($ZrQ2za+=FEnQcB2jx$Jg3N#;p` zeBE9vP&L2hx7V)?iO z@J8*)(a8?lY$AG8;CZU)t&* zQFd%Tf4bd49^uJa`TE@s@~#uR&qa?oh}MbS=kn(r(5t}i^WLKlQig4DIr%dOS;=Gf z`O1?H^0bXyc3`$Z5x7O3Z5PN78ts;w#`!kOnNER>=zoqD{dCZ_e8rb$oaMMWw#2%#~#cG zlHS<8+|g&pQbP7!zM~sU3_Bj!Ic1DS<4AbWVHBscOeYPrfx%QFP%RsmI+Z7{w&q z8?fd3i@_)+(&sx8Z;B;k$IzR+gxm4>O*mY(qw~$HP{_c|E_h!M;$O2HF9V}SV@cX( zGH#-``wrYZjS!2hpAjT?8j-#&=~0W(XH?ku#K(+Ap8@x*#@6LMz0s#vpC>(IF#2@3 z*J^l|gy&j%FMmBhNTxswN$$TeNc4ngtAZHOOTs;fr<3xWkA2c$ z^u{XB&2f+6J_h$JYfac;HhQC#=hjY7S&VLP6nJt-X;Ars>sxG#%%%@D_V|ab zM$atVvl>3?8jI006Zcxc@J2kJq4FdhHyAw>s$5mok|4PU9nO@cK{5(gFRtCM z8X5if3S@vC8X4J#1kzK0M#i=`1cEP&Nv=I6kb!n+Wb`{JkUyhI{X9+H@zmfQLfH#0)2?v_m1|zgbS=;h~T*dYO|zFUcvtzuHOQ ztt?7Dwbe-;ODDq7z6fT@&qmVzcdsjvj@scFjhwD=U z6fh>wjUwM!pmH&ASrqw$s$8U%MbR#=o7{bC6#39ex*xngij>+&54r4)D6+;zddgqz zjiO)P6#2zNQ3T(nUh>UHqsSF>1k>|a6fxN`f*EikiVj)&9_SWLbao6~`q-n%cTpI+ z#Po=UP7;PLwgJ(kixWeaeiNg~85>3{DRZOAB^vD`*KhQv%YpgP@0>a{kBGvu~e6Gl_#3?#+w^( zg&7U5>X$$?*^leJ!Duocf=jkVlbMKXHm<|*dmFB!5%4)&x8eD$P&5?NIQaowpVMLN zRJlExm`qUTao-$Gg4!xwmWB9rerWL@SXuSL?r8EcV&8LnG`TIBlySFdG>pNJU#_Yj z4!%vp%5(0BCWZPalF#kMOPxMneb;?2^iQ7ucQiD@{;E3kALOPVdYCx@()nJUAv(=6 zZpt>2{)A?NP5(<+q4GlKgW5^9N5dMG-S4HTu2i$~0$ic!UbP(8Y((<{t~9z|aosvNYabN({$n>VxO`wUGG@Zv1od+q z2H1&~7;ff*i?HG4%O86 zV2>sdG*PC<64T?L=^aa=De!0#lf0>Dnn~UyXiPIr(|dmRBIlgzI^RFP@B02YC*^)% z*t2K$e(qfu@V{hA?_j@6*6mxKFdA0W?Yy zM_R+ER;ASMQ;0v8gb}i!8pTL=7@H|g;C2|jWq^ID*d0cn8DU>uJQzlmTG*Fa17YMg z!M=RrR2Z!af_<4b97Y$}zLd^|kz|5>nfg;0ZP3ELyh9mI*jUUHjfQXvH^9DJZV9I) zM%b6H+rsHV9qh}iD#FQ!%uEs07*3h`K%|BaZS+%a+9bL+N7HL65z`S)rz2o)e!DfC ziU{UrN^dy%8>n66>_Wm8j7HJiA5I1dmfMme;S?R9zG%N{M~B$)R5;Bs!;JgrbU3}M zhZ*<8xp2CJ&A3^Y!s-4{m~o_x;5oZOTnde#UyZavTuh3fh+z6osH_oms|9wPuOWim zfw1hd=0?yPYPvks3L9Su!>+zPg2K%(>^e3_(6gLXn0{RZ`9fgW{cBeQ{Rv?zUbriQ zwg$tns~w1-?;zkr>8S{6GQhBNzZF4$=wR46E<_+b9EM%pkGRrc+C2DRB)t|2yKajV zNl%8st}D!pq$K1%in+E($~S3O?$`<|_vCy|Ejur6t&OB}qzP4edv;tSwoQtpZT^Z- zq`x;r(gcN=*c3@Ef#SA#k@PU+oNv;CNO})r!oo;e2D#_L*iAv$va30z9?M468c9Z_ zklQ2aDSzK<%Oj})$H!g~iCnnNz`K1hDk}Minp$HF=e~4nIpUBt~NhTev(2D*@x-OIy z;?&_ts?p=b!OukU?5V^jrz7bF9pvJ}Baw6~a&E<>?;?3w`HPc~ELej9qSqKjR~VpF zzlx7y-4-NnEs7%S#)8GXnkZhvAtIwCij8@#kd{Qz7}l=S*G5rxI27tN&L~)a`H2 zMA5%Pp>E%KD~jw|XxY|}qo_rr35{{r>@nF66Y&Uqovd$W7vxnrO-mLfT_mLo|ILK?`e^;5{MG z!WG@obY~>g?*(Txp;W{oth=Hq4Z9gJr$3se8=!vgAHc^MpnmtAjHYX{knt#e!(TuV znmKeSnjRo1;s-BBQ)gC43O2>HsM=WD(W~;Etd($iw%8bY702f6x5QvGmMV5&%rHPh z4_IU9ZPw6z6*2U@5gK}0Qw+VVgLfgaErx!{V()@CX7rN^hjzsf{>g@fiJ|X|K{+bF zqmkGRuihvwX=Iv2qV}#Biec=EG2|O$Uk{qEO~Vh@^yP->4^|UXq_|!?=Wy8-v2Ac zCg0>k_(0z~zz)1N_HZm+1Li-0ajN#1ru$E8kpAVeo#j~ZH$pffv;Ps%^inLRNI&^X zELABDD*rnvI7Ahw3R1D-d(zM_3JDcZO4pu=rTbVZWu1>DI3p^>pO<1OlAR&pia1JO zXUG^s96icP=}Su-1+!B6*%n7O9h6dfMI2$HK2dlZ;%K`8t`B2d9R12lDR^xhozy`o zz1kZ`YfVr}6*tDw>L4hif&Mu5OH37=193DWK^aYYE{?*G%PLxjhHXABTdSvuX zoAwXH(+p^`7K|V2p~(tP#1kA2tHg%We1!VyTOxO^6ieTTr`0h~UTPM{_&l-K081p1JbS9*5> zJ;uuGquvCz$Ty4AyAr6w0PR(LAc4BrE73oYKyG-QMD~dU`b&?T_^jasf+K0Gm^zZc zR#=aidMSb4(<}P?2GbLHQ$a$?N#q-L{eEjAwUR=#VeAgY!Z=fv$o@2yIM$d*8(Agf zv?j9EqY;VSiP$>$)D;$1H-jCDI}Vw8Zjj6A6W$0Y1l$M4B3hMOz*okruu# zyVEGi@@NfF$<;^IPb*W6Tn=$xp2@`JhkBK~3t$0u!5SOOAXpq#jG6vmd+09^wMU6&=Zzn`m$J4gQ+86$^$Py8Zyx?`!TGPom}K7B9vcpAInk1>pMZ zxUDD)QJqtwafQ%3I$6{uCdJ(%E-3#;Nr?cusKN-ccAgXSQCQz91gI zt9{?{LAX=K-HDV`hV$f>ME^>A6ft^ZXIAajN9muLnQxq8yixg=DpI2@ADy)-Tg~07 z#QNB@!mm_(V&7_*B;z;yDo(dcY1pkEJ>X9Mgh+e?e`8%%>5#(ssnYlh zS@h#NZ{QD6`_AEj@DdzQpBT9A$*hwkHvaOC@GtypA-P_hT+}zW4Xyj{ANDu8#o2o|TNUESvEEKY)QbwEc!e zdKB}Mw=ag5-iPTIH*}J(1#cI5y4rgVK0n z^rnkdcySDtv+n_4BKGKkBEO$63zu{GKqBQSNG+1?!VMt`^4)TGB9&3F?@f#?sO?w% zsxd|GQ5xm42>hQ?^3Ok`tMeoE*!RfjBx5E1^@BU%OQW#{|MJ|m-IGXDYVf_@_mBHY zVQl~BOJ1)u)>i3`Qo|-=q_N4E`5*7Zr<_(qnob89<;?&5?+Y?^8WZt0jqftfbq42r z?p|hlp!gHx5K*A->HB#V1&X)_5@`iteYqb@q*9d5`<{O&5vGT~$a*-DzQ$#V$VU_D z76r`aqlZ`st8cw|USE*!?jwox0;KH9qbwFs45j*=ZzrifG4L1mRX?6cx8tskVBC(= zwjWERa*PKtPQ*95h%r3|Z~HvR_&DC_uSLrxG(cO8?uh7}6yj6*`>e;Y4kECQ-wra4 z`vYuM2B4$Mh7PRa_*<1~UpxMuhtIeXVo`jW`bezG(}5(TrLtiY0lEkFEZN!BF#CL5Nmv@nU4&B3A8Bq}Bt@Fi_Yd^(e` ztw~}%Y8Gp^CsB+Jw)?JKNdyOaxHx$*iEh!th@Ur*#G8vqk#Qo4i@u^n{csZ9WPm+* zVI+xeXJ^^AOG)%1tQ9diAenFJqpq61STQCjnLabYR8O=dQ=!DBdVVscYGJBxt4O9h z*;AI>kjycGB$%qn9L!0E%PN^(&xWf^+Rx{r$M@sorobMr?@wk2Lz-APkW4?AVUIVz zkW5X1u*dHiPNrR4*I0ZmnZDJ*9#6fLOp+01_!ua<&&+C=;l6TIC1=xNrFb_gh0=my zfh$r|*!HlB6V?>$Q(%F=P?bV!5Z4o>4JlO2(Y!TnDfAQv{<6DMNY5ttxL%x64--6j zR|@sXFu@|MCw#fWA80Rf~?#P?Yh z^q?Z3FwcrJ6_wbmd&h75v16T5v2GJ7@fciEaj!Rp3Pr8!h}Mx}eTSc#OHA?OvUb#a zwsn!By_=LBt2U5|%O3sw|0&7bM2gi*P)fO!l<1B_D*S1MpR&7c1>U#{e_OZLw`sSc zwBSe{HnNI>{JqtipA8RF1q1}*YuR;vZ;>tET4>47FSQj|_r`AdT^sP9y%&@Sr;7Bb zKKeivxy?`eyEY{xE+{T=3~p()dYP(O(M2A=ZMdavzFtcoW~Eber>%%@V4l@lQc9os ze0cc}Lyl&ttth|5Vk<2wF0rA&?ZNmy8jS8TkKUWazAS(BTbgWJVTlc21JhALZ~3lE z=%bHR%apXt*Ok~uzZq^+ziBHd#f;?@@#Nen)+Y7AA~7sf@3R%;;WMrIxCZ*rXHV{< z7Y!Qq0$YA@K2BI=(RXC{R+VA178UW87L?}Gx4!bMKKj{k zT=|X7YAwQ*mK56x=(w*YyN{mLFH#;WE&S)=aFUNiSWX{=piecBLN@Fei!iDT*fEYd zkwQ-xuw(pjIE5tm4n*KrDfGGuJH~e}r4RzG;|7xKCht=3zMOCEHpzj^v zCB$D6&p>76nmjpq990xrOBRFekfp%i5pCGyqR;^dD$2PEIK6Vqs>FMLuO z-R3(C?Dg5|(!iBlfLnd$$!T=P_Zje4oMvQ78kP9M>eDc*`+<9fb!r+7E21qL^Qbq; zU#C>512h^#ph~OLAOHj(m56Fcqa7rCjcIgEfQXu#MqjE`kNGJdV=v8vO5NEpeGS+y z51@>BS?7TGusw|~uxJ076={_2y9m5ZT(>ff8Wg@aR^z3c9vOEjOogrUg`w^=LKlT5 zq2H9oV)}EhUti9>`>V!udLQ02aer1i!8%zW9GYG1 zJ)`~U)QA9p=slWFTU6>lywtZu{Czx~o{GS>@~JcFgn&|~82%)kw_{!6^&iveWH7ds zyW!6t;Q;qqV+I}N0C#Fq24CL_v9BNlj&pz1Y7d(I6k@9(ha3T-wl0HOwAf|dJ~M;s za#y1}Kn6AP#?rASgF`cG#I9`_^in7`mh*1NppSWDIsQNfN08Qw_(K^~$l>l;Co^~j zZ4{pmXV9P?8_Rn}GRR=W#`4(Z3`&x)vHZ6xlTa+XMHq~k^cHU{Kec4C2D@7PX3M0p zI&3V9D>7*rZ!8ZqWYSLFSf;gR!sDf|`w7#UOm>o!u=e6@>}8y=CzGzyfy5{JGpWk} zvoQToCS5?BUFe?8q>D0)onPO{z?#yIaWmHwgswadh=@Tc%B+_3ftgg?l)Br=PZ`(6dE z^p!?s(O%!nz@yQLF!@51K{}J#-xy)k8WW7L<^80Dd)C+kMPGClZBj-`7G5C%O06+m ztue+KwHmE4Qq2nljV!XL*w+TE0qyU>n2PaLjCS9Q_$->?yBBz!FC!s~s(e=f=lM- zEOK&D`Qd|EbVvu=Y{{W45<1vqNhh+{{xON{;VgQCE6C|w7TsxrO?LNBxPe;OWRfbI zdUP$o6LF`Wf9x5v4TV5;edjFa@~gZTNJ(nhm&E7E!mw-tBkPH-Z+>|S+LTE4rf!U z9)C$YnN2D^jI?YRQtOQ{(hi=>rf805ic8sq#EdkdSLRTs7S`D&tfJ`%qKOxhQR|QT zd(mgjq1!kYE3qPnlm=L5sSP>wC+A`%x8~5-*)Yi@Zw@tUK@ z^ykozCYWZH$8)GL2&UQE6FG$Bk^=b8@rn+nS@B2?2R(`qPRb$V_Y@DN<hj|aknLxZQe5RsV$cxbs=h9FBDw}$R@&YH)1m*coqzTINoJir6 z=QxqODbI4|0b86_;0$Lju-TadY;tA;8=YCeh8|}ohUv}>;527CaH=y6Sno^)PH`gZ zP_A<(11C9?fD@gGz*=Vlu*Mk=oZz$otDSMcDrYRP(isD+a7F{iJEMT*&Pd=mX9RGp z6X6Ycj57>a=InuXl1rT?V2M)(7CR+ikuwxn=)_u;3!DaEzEcm(bLxOLrxs{+;!euB z&R}4U6LA+g+X=U=oaGDvW;*?W8BPr_%?YQmoa%&Tl2e>YV6syIOmb2WhD0aNNP>fZ zj(2PYS{&B^;~ZB5V;xrkV;oz6(T>f)D94q+NXI5%gkvKx+_3=|=0H-cY;qteR+b$| zhm|D<(qZLL$7-O_fpl2e;8+RNJ5~U7jw_JpD{CFg@k@wf88Fz<1q^Z^A65=@ECmKQ zI)MI;B|wd%9jJ6H1}Yq_KyoYs`Z*Rtrv2?$0Q}1_ANZ$Z9`FyxT;T7HIl$i>vw^=l zW&wY3%mn`IXhEW{^pgYmu+onX*6;9d*Eqj!D2T97u|lK6lgtKXcRoKXpt1UT{7HE}e6X z2lk9Oz;o#%2Y4=h=m5{94;)L=hC|l@LW3U0MDg&9N@Y1wgWtu-f|QG z-*kZO(isQXE}eGRfWr=OUV7aD&P%U3z7)akmrgjqc1bwEc4^2F2OM;O?b6c@uw8n}0k%s| zI>2`62?y9N9e053(lH0vEs=>X5AgAVXq z>UV(WlFtF2OLsU3c)J5Mmu|Cz=F+Wp&|JF3ehvR}vmHE_ZnA^t(v5cTT-s*`&!rpe z;JLKN4xUT9?clkz%MPAP*W1B!$!iDCC69eA&}|3XC8r&1mmGHRT(aB2bE(e`o=ZFJ zR{(d|mjkb}F9Tj{?*eYOcY^=YHamDO_1eL6smBhUOIz*Wxpa*kJeRJvw*jxRgYD85 z`y$|GJG1>tJF|VGo!P#@&TL}8ZfCYHvoqVf?9BE~JF|VMo!Q=Dp8{NBXSTQ7>wt^xlYnh@X8R&L^L(M5 zdA`8TJfCl`0?xBD+vnPu?Q`tofwS#Q_L+7jdyAcE-qUPnp6mPgR_p%9^Xz}?`QOd6 z@9V)${$I?qF9HAMM_pJp@*^%R8~I@umW}+73(H1+(1m3qKj6Z$k?(i%k@q>VY~*{L z*8uNvV%5lZJF#lyyPQ}x@|{ks8u_3TQz;*CV%5m|ome&U9Zswo`F1B(jeMIEt46-n ziB%)t;#|Y>|7ItajeL`HHSk6!7LUBoiNzz|;KbsQ_d2n7BOp$9Zswo+3v)uk^7ujHS$g;R*k&FiB%(C=ftX!uXSS8$lIM* zH9hh+Czg%eq(4CE9_~&@%B_;d5=8>!#H~~aI8HEIL4j`EVCy7OYQN% z61xRhY>xvL*<*o)_84G+JsOyAj{@54kwB|G9GGhl1LoMxz-+q-m}QrNnRW@7VGjkS z+l|09dyfG_s$CCEfuqV#O15i(N%jz6qCFTGZw~^-*#m&Fc7I@uT?34^gSJwX9ki7q z?Vzm`VFzuca64!#h1o${$=nCpN~S*0R+9TbTS@8zZKcpY&{i_`ZQ(x~`oLR?bmP>f zA~#NLDsR)TzIc3+l5n`vRpW|Dbs~hn=)KD zwJF_&6=6zq;moE~7gmHR#f24NN_JsIm=axB5vBy!I`H2V@4{j*#ksHwOtCJk0#l3& ztH2cP!YVLDxmExpU04OC2p3j?DcrRT80P8%nq8ehlWQqZc69(lT}yyQS3A()!dfut zU04eyoeOKhq;)Ln{iig?zA z8I@1EFr)Gb7v@qHF3hDo`HRLW1fFqQIg7p77^=E79UkGn9H z@?$PcrF_&C2t4A#gvx=3UAXP?fJ?K#A{Qw@$e+M?2ASz%c~dU7CmLziP09ALV&05g z%8rIl%+Z}ooAg7wa?u+Tp0T~Vb9v8FA^HyFlF9_nnEUZu`ZWliv7IM#Ik;SnaC$Bk zg~B6t`+2-e3y)atrCi!G+Cw7}vy;f>rpV-Z}TIsZg z8pQGgR!)m;6dxY4(nJ)Mh?EmJwZtiMZ(3=t4*sA8=dI-B5{$1dqX}^+{6UwMHkuV+ zMt4z}RJwpg0S13tfH64v3OwyVB^HL*C`$!zk;`DC50nU!ER$`NhQI8=xIWmY!7j~; zhk*MDvzTSE(bsA#ya|Z`aR~vT#*lylZG1{_u5~mdIW0>QUK|q;5~WLijK*F>T1&7R zZ8Z^?PO(uE##=B(V|*MV=VZQx@illo?n<>$I~frivj)siPWDe*5txrRszrD@ABZE1 zGi>A`q+?;!aK7s+SvJ}f6{Ptmr&QXZ`agrfzN%~+{DKN`HOAu#c)tp*Ho9Jh_v_RI z8-;U1;D-%1nxTjHE5Fr7A7#UlAbD*(iJSKCveEZ&g8hK8l=A{}4%jGEkA#ZK0UO6- z+CuRIVrv24 zqCkXqMvn;+=4}Pk$GPhJcNfrg2Kaaq4;IjJBd6gUDWH8J@bM&_D4+?U@bN4=Q@}|p z2Jy~F0nO$3Ti)dYI<2EagQ`M0lYm9{PC_AR0^#)eFtd>2RWvYUEu`52@cGOsDWq3} z;qytIP)Kbd@cB3z3h8+Rd_E0rg|yuWpU)d>3+cEHaX9z3Lb{jZa0R;y$u7g)GkA9) zC;UW<&mJ$NZGmw2EIUz1PwC)xtzB*LNmAo@rz>pUhNG8EC1K{{PgK!~m!n&=rvs3SqFiYlUgDtdN* zZ5ci>#Zp8YHNM+Yir{Vg1~>%^sx-9-ezonuY4~jzV&{I{MlkcbK8Fp zjTF-wC1NRSKQ5*s&c3_KSC3MONjS(4ILWhjd7_TIja6WP+Qv6Hk{%|OY z<8>vxEtv_)*|F6BJcnd0l-Qd-18 zgQ>eq+3h`B1Rp4+L_Nf2?m#K$InEW`CrVko%@g;X9(`rL_~KkC?ch4S)!&uU+ge&U z2*R1TOmDuijMkVSE?-M2qXMn2)v*|?MMDmDOTQ@$1!ZXZs*zPU1UcHoPlaU^5~PsT z=nGs%V}gCL*uc?Zg9rVJtNcnsel1VZ|ylVzNCxLiy2@MU_>Rx>>Wdkv=H03^^c*kT!eS_$QTOI zL0*4yatyt~Enp81k0GBC^1A8#7&?z4JW+Ug41F91c^wfrmLdWnuk%C4GF^H^tz|5Y zF)5sW;@ZNo)T@QOR#lIs4lOCf@&+7j2vH)^f_MV5A07+vosKA>OQNT3EPbyFRv}9s z>64o}R@~$pDJh@>B6iJK&WTowC$^8J$y%Xo?W0}jBrk4QjAAAwm!riV(*^G25;(3} zdoVC?Czrr+Iodk`fjhYbPN4`6`&k{hlZ(o5Ow3Wd&P8Pk-<3=IXwf(YX~Tb22JYnA zFLYs#`dJmYlWV_FY8S__J+M*zx@A_pp83^?) z#@k5kb1mn}Hl=tJV<+lLd||8m=qsOc*I3#QMjgZmh3zkz`p0sSYk(L#z_$n5Xy%Er zoOKcOX!7t_Vr7&vGL|;5GP?cJSaO-6jMDtaA@c>wD8n$03XD)ji{i(zNnj8K)^TKI zWz4W=4s|k#RJ_Ng#Qb$I&4qfecM_1E*@+%4wS(y6133IlaJ@Qd=6z=?Nq9KMEF?)2~`+hn()wgOf#PZ#g|Un*Z@g zIY$EI$@>S&>2qj_FEAp-B~AQzqMRef>7sbJoZ>hkd)B#f_WNgw+RNo^Q)La#8P5ry z+2UAMHO!xNdE@B>>by}hJ)U0CV_)UxCv;8Y>3~X8^$A;l z;_%Gz$S^r(9vQ1t4E4@I>Zr2SnJ1*Jcu))l$+LY6oi?m>E{qvZpAb$V&m3wUk33nQ zx_3Oi4W;sLjBRnyA?5w!=}j%Piu4G-TOrTg-#wPr2BCnQ8Gps%C8Bb|1S(O8qld@S z7FII3C&p7MM=xd#kEf@yp=6}L{(0}B+bfVbS~l2L!Ph-TG#Dyqk^w5_7E1*O3C9Vg zt%6eY*qdZjRM4{q=$LOBDmZLdAvUyD&}AcZOy}APz5`Vvt+#^fO{$?gDv(V8{ZezF zf>0V(Bc6G@g3#u;R=jeuf>!9DUrL87IMzN%9649P(b+mta;bs}pkD@8R?^dY-i;V4 zIr>^J(k+#A3&-W3wN-M+XPS7SvXYEOsF!z}Drun>>ZPQ$l2)6bUhdmaiMHoZFDrX1 zIl9)2B>zfkH$c7I&|k?JxGiGmKqaN}9^{c{D(NaM)Jw*2B^~Ba^amrAtSEbL&2!Ec zubr=?O))fgu(pbn5;V+Ysfx~_;W4aJB;n^RPlG)y=RhhnK=Fv-Wf=H236IBJgzImPl?rZLntJ_tEifG z1;IRzuB@h)Im7w$rfMeiYVmtpHMMi8^`bS^^r9J}Kh0iE*9X8fKfbG){$+p;*nXgz zc5Oi#`~LcTBGz@>NHtaQ zqG&r`O?Sr}(~Laxp;A5@;@rfk2IyD4taID!XH_Vn@wqQdgb^33nm`{0t9k3}8!}8F zUmz4mf5Zg3maDgu5+~5G7K-CX>jbKnpg2lF?XjFEy|H-$y{Lua7~eL5c7{T6Jil%N z{iTKCIJIp8&6gA|Kasd^0+-03yZ&7h=)Mprj?hCBsE13p_dGL!c5sGt_~{9}QB{i{ zE=-_&9pq`+_YFgRh5DdX;UsA(m1X?j?T@6h|j*GbW)*70vrYDB_Ysf_quxmkA&j8~-_;d|r$`G){pVZKI++-o+QVrEekgMIwTAur7_QknOqD@^(ry?O_Q!TZ; zdkROMUMsg_&;n2dnNT8h$B)T2qQwGjT%C@!j{HQWaLrrug6R;;MrRZDlW zf&bZ^we*V)LU!bEEj=eg$lm=zEgcPnkez$FmX0H=4WYqbfL_0SB2`n;;Dm`ZpEKqJ6zZKim3-9$padIWKI zOk|rlTWs4skxjoGk#JxlwXlf2a$q8v!Xa6`FHYortW6ZZJ(1lDd7=mG*%9nhUz$iu zFq_LT-l12$;HPYhZeb2ZE#+b7XG zIta@*cTb{!u|2-Oe-it5%Eg+)IED@K%I7B0N8D;7{`4fy@Te4DeLRUKb8=Jhcavx@ zTsVU-*KvdU38K?jN6)b>o)urm=5?(&W~<|>fQe#4WgUH^gRIPNsN;qUbz)~*9i@lD z79Utw#|=rQh+ntYv23dsU+$@+a9zk$gydlyt?ycPzw8^?T?wJN;6NR{$)%5ZhwA7@ z9i(U4i8?xOg!BwPQ^(~*jUr>Dj&?|po&(?4kq5^4VEJTvA_l_qmzc?vtAOxKvrJ}* zH&aZoPUaNGSt6@qGH>Q*i=>9hWC&%K#^TAeQ4ibvp*54aKy;q?q<1pCB|~yPwQn-* z4}#>J+dr8aS#mx!Fqw0P7KyqOlez6ftJpR?nI2$YM%Kt=avC8yk6oTjYmmA#m_CK_ zxu$V}VG2E#4Z$guPhmx9k{+p;LfoE$DyL8ax2H&In8IaGUBcEnh40NWR6k6iI5wB7 zd#BJm8A8){!xYpEKxn?+KZSe1tQ08&Q#dPU6>2f2@D^sZNF1KR1(n?*b7TrFve4Q= zS3UJ~cf0=fL*G~MFb3j1KDU*NLN z#duKXhLx+n415w^ExQ!p7swR_qWnZXcOLoR`AnR7XRnt)_pI$UQeZp zV6`Y5uBQ!ZwKL#(HO$$!>S>C?fO6#jEJ_}&jqv^cPCcFmfh$1IocMs4xPZW@;DGD` zWbG(@51y?bt(ATrW87G{`{V#yv-%SX&<7?q2E3+Fn=8~siSeV(JyP`)gnUbx#UUx_ z#wgk7q5}11b&^$WW!ImGf481?aut!P!4TFIjF(6iZVW338=@xuEEIqQg(n?U6h|kG z{x(4VDXT_*iZH5@camj@3NkbBg71s>>QQ*B@LArkr%$Yf&*Q${6B2Mq72sEl;uD1* zlGdM4@MHT%E3f}SQk_%o;IF9=ssFC00fj2$eRYWMy$|atdDMjT>CV?vV{qsxob3-B zXoi;vuT*nx{lgdP>1Ks0@O^cVnDkja{jKJA2aCyHgHwuQp(A7QsFI3&GU|feer#C! z`C~eK^brnKs1&~3bM;70g$q1)=u$mh#G(;jUaqHF9VrI$rqUV-x92WtD(wjYABrtg zxpGJ?vaC~iOr`scP>dh6O{D}V#-X)SS-1s>DZNu^A?w8lZkWos zZXx22yQlI48nmKxU@DCb$6w`*C&G}^)&jth;`=v5tb;o;V4^m{0D;Unv& z(Z&$y!sOm*6wO)ZRlBCqSDf6G+mE-iG8{WFjb75S}bWot#eBbMXopu{Lm`Zjs2WY#=nRC>DRuXkd%IMEu;*z}}To5w)R# zLb=IQj-!EgghSySJo_3Dl`pd=lNuk6_d+RD3xC(blbj~0rrbfkgq zHw0He7{FreSaoB7Z{hJ7IBm-12D&XAitw4hMj97PRYRsmJpKmy@3^HA_Jw-Gt+U+K z;{Jq2>WYOj46SUW^`TIPea(&ZMF^DPn$||zs~7t2Mp_<-<+pirBW3bBj#c|>wf-Td z*oX0uO{0Hta1b6~6&jh4p~NzSJi$5)t_kut1qKJ3!u>4)!690$HpHlx@oWLk2z+~P z3#DnW>Bld^u%(e+g(>U%;Oa&ik1_h1Mykiyg>kI!PT&mu_A^GLz>8H|8|h}+rwQ4w z9cpk-Qu+Ov#MbWf;+|==OIHHlonsKb~chg?**@m@lWFcOPBDjc{7@?D8UDYrfvw0Q7pN13lhp zK(}`)(B-WMI=xeX4)0{3-CGCj^G*Wp^iBls@YVva^VR^b^-ch8_f`Y9d8>fE-b!GP zw*t7;J05tA7tUPs)!uQyt9ra+F>LXU0dDq|0k8Cy0ylX}fE&HVzztr6dClv+2=kiP zdJ*6?ukq#qyS)hTnpb!~LX+mBUW6viN4)EShrR27175@@ z&5wG!fsc4s10VJxK52f)i}5QQ}tdJu&*7kIWH!fMX711^sE79c=(FbJ$%J!9=_sK4_|SLhp#xr#2>9Pl;HeK?7)TVDeAhqcm4@hnL zy2k@no4)cC0KfEr+op>iaNG2S2i!J&?g6(=pLueDpL%kDpLnu?7d%KJb9yrhj`taMSx95Zv^x2Lv~r^?=}}cRV1t>1|IB7;bvY69;_L z6AOI969YWsi3XnbL;;6Ak-*nI5y00x*#DSb^@IUm@tA=xdrZKWJTmZK9trrOClvUC z#|V7hV*sA==z-69biijlpt8P8}bHojvn-06dbJHO=cy1bSgXgA4 z-CKYUyFqi)LvGOA^q?CwH$C9q$QcIryTNnQeQxmFbgvscH{Ig~&rNr`!E@7HZt&c6 zr+YQnXXl~l)2F*=3xIyzC(;oLC{Ic5(hMRV|!En>{ZZO>Bb%Wt1k9#iA?FP?HF86Gp z(+#$p9B#1PWOsw@ram{=ZrbSv+f6&%V7uu$H`s2v)(y6sw!5bTx4FS~Q?Gj}u*VIu zo3^?^c2m#QZm`{Sl^bj~ZE-W(uXIlYZgMl{H@cbg>)p)xb?z$QS~qikjhi{&?H&(Y z?Jftdax?Q+x|#Va+|2ytZf5>6H#5J>&CKs~GxL|anfV=VCjOEhH#5K8&CFlyX6CoK znfa}5X8s~KGk>8w2e`nU4V>?0=Ff98^XIym`E%UN{Ml}1{!BM>zQxU)pW$ZCH@lhh zO>X9VqnkP3;AYBCcgF#zxqF!NQ{Bw@dN*@^ikmq<+0C4zm z&77a$X3kf;ne$a{=6t1_IbY#s&X0F9=gZwX;5fGyIM&UaAL9-NmbsborS3rR*1X4y znKSS9V&=^M)9M)V|G(+u|7msH^MB}L%-sKvI$r3-%$XN>F>&VkUQC>Mo);5mp6$iN znP+)1apsv`Oq{vJi-|MO@M7Z3OqxKa6$OUAG;uY7Da_{eX&AbjMvTo69;o32#g8!m_-`HTxh zmQTANg5+TrM3DTN3nEB<)ddkGzv6-jl3#X#$UX8)E-+dCmkUgmUvz=V@(V67S$^IH zCd;Q>%;bB#P$%ZQy-R_2c{_l2dY1qXdZA9t2fT}c{oXd9&)W*z?_C7E!;8r^-|Afe zyu~{Yc(Zpd@FwpZ;6CqcVBig2%%yp+cgD~_BVDP27jW~@MtVO4Uci=4Q!h2qFegF9QZu1R zPn*cKG;=$}RuPrmOc(I5=^<+~9p|oSPuQBdb_or2s_=>y9>k3e&6Hyd?m(7DnV(`) z+i``jZN@BY_FrpjreAgNB)-_)Op~+WNtE_CV{b~g?(c6#Gs7-a5jAse)H1PTpqY%} za42qkv6+7MheL7Ia5Ej@B&mdR&D?K!rP%s?GyOY+Rt?UZK_9U{ag1RGmlJi1CoMCm zJQRM!U-M>gRBWwSS~-L6Ho}n@(maE7-0wE3Z3cUTH;8-I%%JD-uvNshW>66O5U<=b zgVyU1G5NZG2Gye>uqZn;gU)8bb0~c{gTL@2`$uL_8ytv>F(PJqHR1^~=$il*FjioEA7hR$U||b_2`HS!h|W%8 z0OL$j{mW1NFLvbPaotBVJ$U5n=X2SSzqnsq>}Vmk+PC3~7J5#UtN_aHMBkZwviofFrA5cMG>5(1@7_TFA~lM?X5$LgUPE zWW~IQ>kUAJCuO*Wdw2(lwviTYQXDL@FO9wuGT1efx(#q-y=$0Bh1^9!pD>gAMCs95 za3*&QGKh~WXVTqhWGEc7XVRR25cETX8${W?Vexm8?+{i(o0#4Q}|5zBF@P8J@iJ3I4rtf`EU`gZ&UKkC5 zaCwazo=M+whtlkGGwI0)xV%39Z6*!+!{v34Virx)!R7U%VHUfUV}&PS7CpxGeANZ` zlQzVHrO@if2^HT3`g*ZElEpKXv$$k79-UKXvBNAuJl{Hto(zY-Yun~ov|S^V-F>uz z?{xRtKB`tBlfn?|4GFZ58O?mq#@wL^w3m(ktcw=-x%8jc!(UVd+Dk@%HpCyo>&5)D z@6tvjKeQl|BIXnPeY8I;8KX|&@7ezx8+lnBXwMq`IVk3+BG8_RpOvJK{0+y$)x#MZ z=KFAb`sgv*=)3T98viWr+Js7cbYB*}tNPIVQ>c1p!S@M=oo3rC&Mit7&+VGU)x9a= z?*3V{hl5!q1GDJ8Y{)k0!&$tdKH5Jri;yuViZE`J;IDi5`&o201dUdA&L)ZT$!?Wr zlOq`Jx+KeNT5W*4?gr~@nreW%?tH~;ZmVGxXBuYHq!_sCqE^kORt0A8>h9SnwTHW| zqIWhocP$W!yJpiJM!4%v9+=G$@*=cIoXvsyVo`Vkf0E#?d*hAS)WO}_N=If>C)eH| zxHOxC2V(|rp2N#}ETZUhSb&TZk6GqWU_6|2qH+#3hrnGYO`F5l^wa)^Imk$@5M>w< zO{_$T@*KLDiAa8en~zZc;cN3$AqREz@ZW}Z&7qe$Wc5n_99qC3tBip;9K5a-$tUK} zR!I#9n5g}au*Oqw%t4P>jhSw^!ZT6qdutAT83QlZw(sZAov6wmOrA?~IGL=+Fqcvc zP+j*}=F)o{?cbI+mmUs<(#oxwOFi)QiASf+rCSJrtGb4{w4D9aN89I8D!MX?e|O;r z$ReRyF_(0q&}`Dyx$I&!2k!5kOIBz&8^*WvLWACKS1B|ebWM9~tIxS-F7;~4E@|MO z7uvmZ={u;tp#yViDOa&~4$S4`tQHY-5@*#zwPg*@<;0X(;-!(fG-QEBbI?3;goJP= z@&t6f=-Ak?!gu z&Zl3rP+g^#`TU6P6=>NypH8sq8e2V|zJ=-%Sq(Ubbysrhe0qe7*WX+-pOYompjLc7 z2ME@pk;#1aDz6hC_0OknGjvzOvH65YgKrR9PRyq_xOjcq@O&;z--I4C^SRspmEy(A z^U>%vWV6a|0L^9Buiemb+;_6I10+|g7SLP{gSAQv=rkU;Ao45=_zC1!i$?1L`qBt3 zHm+&`{h);w%WGIb$3mgSE-qd`ky>;o?L!ibzB8~VuOQ!MDYX@%)5&MPDS3TJv2O@m ziryzhmJ;;8D5YWFX}mhmkR3QZFTW(;V#_b&RvZue#^(3Ic)1vum6uct4P>hxvHwaTnAIjSeX9J`>Yf&*8fE1ME<KSK^GDft8YYw(EF?4s2@@X&E}|Vu zjt^-U(LRO3+`Qkg2oCmeQGs!b3|;wD(jvlx&LhS3)GT`M#vR={%7osqrKNNc$(gB|@2@#V%vWDHcpO<8@RN%uFf=Fu-7Ao6ymHCY;?<~m zG+!b5-daSpp-{B1eYS{p2S87?URp#3BwY-yY2~E$6tU6J$}%%m++k^@$Z)8s<0Y+B z5d{78YgH>%aaP;d8LddJ4a!vc9gl^zzTpAi!tNz7^QSFtrN7Z)T1>mLm68LYuhwsC zWf_+%uHDtjQh(KLA>JIZeorg9LFhMq40mK>$4@?Y(E@zG*-dTqxDJsheOns^MnShlT-`=` z6?9vAZyRUzm5ah%Z5*~5FDBj9#vOAj#KOaEwA~D)cJ9SC+8Th=i`LU^oMBZh>>sz$ zi4Z8Vx=U>++JGWE8N8TQs-Vbn4U0L`Y$7uL7L&w{JttZhvv{jRe!*fo$GI0DH!o&h zPZ3kv7gHve&1_n;m@ev|x)%2?CL61+8}=;b)R*a^Jg+T-P3=@JVf(aOYNvbE&^o0N?L0L%I%axjij1gs zn#rv>w^`fiO-_ZLS=o+T2Tk)8-WjRYl=}r{Xv*1^&eP~m&G#+2{-Fn#O>22|rV38S+V%usN|DogJ1?mI111M(Yypg1JJ>0C%t9$B5uz#4Ki3 ziD~rn0-1kU9jasbXLW37OUoom#^8>d+p&ca6CG{1VEKfp$v1u!Isrpq=V2 zE#bZ;8wS%l=uYl8{feQ3OwmwI=d(KKStXRyJ=PA6KW`TG6&-Xzf-bVn=%5{}i;h7@ z{mDD3$GSVHgLP5V_6}~bvQ^C9)j{zQ&_!GB@1O@XitGK5RMNrLGl~2Y9bC|Znv-uj z@a5>_{!1N{02!Nz5jzgm;KHSJIsuZ^nz)qCbDMi9XDJ_fYQJ?UazXvYI~Xy?0b*s< zQhEyy>=D(COX)j~yBD=C<%Si(sEAq0_bWt{^p5_Z6(zft(wBM&*rfi^WAyk=ODUGO zD>WyVQne9s)p3SDNqy!f&GkmH<;|sZF&aX)qmPEO1-BmJzC zw^CuE&f3X)+i;Oy(Mfp*2-o=yo%A|anq;+hveJ$cQ@T63Q8g0LdONvIM+|aUJNe2! z*gw!orywPt$A~WyCxV{oq>?a%+pFL0q%Sm(lG!7joMMz9k}r*ZWa8k&E}pd{@ui`Q zrnB)r#?r+zk|Ij2U3hMfPlM}=Q>Vf#E5Vaxy11pbQcSDuqB4c1?hSv1pGvqUbkw1%6Z-qqAaS}ktw;YD2(K$Px#sujoJw)eGl(LE?g6FD7SbVP|6 zI^Wern*tzf=dS6Z!<^ry-O)uI!4R(Nc6G54pDm0BySS@Wj`;rnYwWzkqpGt$o|DWZ zA-ys8QiM>Xg_1&~LjdV5p;!?@QAnT3q_;^&*CoG#-8Bh_yNWHKD;i0Dq1bmd7SwfF zH=wMpzODgreJ!i+_XPLdegD|!dC}+GBs0lPWa%DI*Q$AB7T>+jGw0f~a7zh;S=N!omUDq= z?8%~*DV(y$Wh`p^Z^>zkTvCX)H1%&;7(M21QFnh9?I2jvofop`42syg7G`tb;9@g7 zI-4ivU2P`CXVa$`B!gRvY`&PVg1XbQ$w{!Nff?EKSGK7A+p;O2E$Y_7Y@T1U!bI0) z^LCzti_H61LSP<2bP2WesqK-YDO_4k*dHOrqyuMIkak^{x>m)@9H+0@o6~}&LwQA={e*b0lWH0 zeh!@>SlVWH4*hZpY-((4&cI(VytO@tHnDBR@w5foI{DcgIxq;=?Qa~<;R4y4Ov+n1 zT(Z2y^qcv@@4hM!{CDEY78gVX&1&b-A>iH!i)WbJ^--nRy3u zDV1%d_o-aUjfJi3doh>p90Xfg(wj^74u^@1`XYDW1xl&&i9ADJ=F%gvFqn_}=kYje zw>cV{$Ak7g=IPOSm|h(Gkzd%}kVNN4>^Dw39k;F!Mds7gJX+}pUn9J5AsC5)i=Go^ z!EAide~{D9&zjj>APS9|n};SPe`}U;rsdJBNHcF;9={I7X2Z5T{yj@@y_rYd(Xg`1 z>+`6LJ4KG)nMeCVU}ZP8=W&xph3P+>N1YL{vXA!U@l8sVdH>Bkz80-EOV8!eYA*QQ zcPWpd@tGe3@)4r&mwx8&G5J)-oqc7a@@a1@tZZOvKHU`#y?(%^H^n_Kg~s$Tniq{Lik`2&vl@8XUc2|J0EZxr0h^5=UY>l*#ou!c$ zvUh9b^Xy%EFyt*7$szk@jpUHMQzJQK@6gB%+1oX8L-sa}e4d@Dkr@ToT2&3XMpZ$sR+W&e zR0ZTpRSvmAl|e37rI5>13FH!040*LGf?TY;kc(6ytvy~L-C&PX*Ye+br9v9X9;=Xgu*WE* zk?hfG1LP>R9x`5KK#o*MBiSPq(n$6d3TY&JxLN}_Os$3-s#ZZ-Y9*vgErT4amO{p< zC6F=dYRG7{2r^17gp5>akP&JDGCp>=nvYMy)I7*gH5W2O&4C=GWE5(->S)w|E&@r zzfqHr@v;7{K)Cg_0^!yr1;VYb6bQF2C=hP-E3j>SsYXNoO@VOh3kAZh&lL!_K2spv z`l|xr)~5=DTc0QpZk<;k-1=AnZR;Ziw5@XrXj^9$(6;&%(6;`pVj+DWsu&#pq`>p4EdG<+t!;3Y+JnwY+G+Aux-7r zz_#^!1+=Z-DWGk=rhvBfs>IuEy&{3O^|A!o)=NGKwyhT>*tTAfVB0z+!M1f$f^F-B z1l!he3AU{s3AQl_7;IbJ(hGS^7D7HR-H@FUR9nwVP;DKRfZBRS0&45G5>Q)DOF(Ts zB>}Z{L;`B-umsdrhxFZo!;=zhTTe)^Z9OKzw)Ln4+twiowyj4b*tQ;)VB13E0P@!o zY+DaWux%ZbVB307f^F-71l!hr3AU|vc`am{1lm@s1lraE5@=h$k{clJmq6RPS7z`F za*s@hyjy~8>rM%_tve*Bw)RO-ZD|RrEhSe#O1T_TNDywdNDyxAl_1>ur3B&D?Q${X zFC;j(Zj<2Lx>bU6YmZz2*(`y%)g*zr)hL0v)gb49f2&@CbE{5*bE{T@bIT{exm6>< zxm7K}xm6{>xm77sAS+}tWVvL{%VZ*CsbtPeBy(OQnRBmX&I=`T?vdc!a!ba%Kr-g} zk}=Pdz}#o$O6ELAj)lyYOna7O+ILH){T9iz@024UcSz=ZyJXI{N#;CLGUr?65Xdc( zX}?J_?VBajexqdCZ;(v;^)eRnIvE3bjbzw2Nygl_Q8MRPfC{-@GUpkRIbSD3AlFK! zeT`(=S4*aSm1NpiN~V2_-)?Q;avK3g#DGX&FqmGD5O3g&#eV9t{TbDkua@I=9cPZLb|RKbK# z5lr}G!GtFW27HoWz{d*)e4JpkuM~{-Sm9%~$B30Nbv9 z0k&OV3b5_^n*iIcF9g_j{g(jSuFnP7c6}zmw(G9~Y`Z=cVB7VH0Nbv=2%zmcFMzh| zV*#{X9|@rCIwyd(>#P9UK3AU@iBJA4MnHZjK)CCS7!LVI0m5A$2oUc2g8<>K_XP-d zy(d7p>sN0k&P;EqLQxT`geS zb*u$!yPj{Ug6wPo+pgzYz_#nz7NG67yaj0g=c-v>ix&_7Kgwq9cQj6BzpZgH`z?)= z*>7r`%w$?VrPPG zP%8TcT>yDX=R=;*d6367RLkzsP%YbNsFvNWp;~sAhHBZzG*rueUPHC)P7T$vpVLq+ z`&qpM@~DP_+0SSwnEhLw3Hh|%3i*`Y0(nH=1bJ9*hV0Nc;$^g-)Hgsrp|6L0Twe$I zn1+Jck7_8GeMm#W>_;>d%zjvJfc%Yyg4w^;P%!%;oep_WuY-J0uZ29I*Ff&qP&2z- zL(S|qy%MrjL(A+3G_=gVUqj36`}9)2{<%j(&Fs51)Xct1L(S|vHPp<$LqpB%eL4+N z>jjWf&xaIx9%PH23%OTA&Fo+5*^syES&+ZbGa+x&P&4~h4K=g(=v2sN4K1^qbP8mn zhL+h48d^5NuGfk9q)tzRtkqK?eHv(PHT-dQ#@{r=s@)5)_ONR5RT~0IO(Paj%goi#|OOJa%zX0YK9=D z{rD?xS{{Tr%inw5w3<7$7x%g8Yu;`->w=pU_ei`J;K8yl(ja_saA z-FbNl^3nJ{+@eN25+$cP{N5VNkt_{rCwge9KjJgXl06*NO*Gy# z4`+6h%$|)NO6R%$?{D)^6$idIc|3H9=lZX#_3#SqRP&AU(A_Zz(1?Q`x}5{u!w!2W zkDCc^JK^Cq1+z@+TORJ`n{D=<#aFoV`anN^YhK`e#!*Pq!w{f}jxOZg-t*0ZQH9*C zxxjp$SjYkBH1p8HLVAH$Rpq1?a&^rjGizHRrSSg5Ja-|LaccH2wS~O=Y>7E_MyUJR=B;KYTk%;7cY-2-elHEFUO9rL0_Qv^2m?Q4lnPD zy3X|UcqwfNVlwoBm*xf`7Bl~>m%hicaWlK$%jxdTT}ee0%p0g?M;B2PhhkR67x9>& zt!7_x5l7xKP4U7adLRa&nAnX)v@Q&xm>ro#e5bs_%y1XcAEzKD6WdzEA<4&E+l%Np zLNF(AJjNjy-{B(O{A}BxGlS;w}?`>2ctC1vaFSpr;=TS7OgU* zS&R8aEyq}}Vou;zbWJFsdE82UOKb@zRjbU*_!9akg3#eIt%N?q8cb{+43yP~K$Nt- zkXVAYmH@LQsf04PJFp|QgalIBZE3Sg=-hgQPA3IV*vbuc}j zDA<9)Vt7_t;oK6s_g^!*j$S_1zqRL?ka;Ea1DYohTS<1Jchba|w6qdLD+673qhXTF zrL}k+3DKwI^b!Op{gt1YwylJcx!rub8-D_C3LjHjLixOqOY0Ik$U7Qm94Mh!UdXko zqlDiW6e0DL&>=2DqBlz@dP)d>Ni&cKyxpALUx{HfaO~FGzbeJ1wUjA(w>z6zcIug;S8#7CJPkNL| zDJrFzVF*j*)|S#3?z5A!lpf=1qMi9B&6Wu} zTgr1}Y*XJ~%9s!BI#-5YBK$A+O;JOzs1Qxp-kZ&uhiVb`HGKhP^gWLiKNDX@F&vBf zGO>)daOd6Hg=L&s8)3F*lyRT)Nb_Z88I75OI83){=M z$8LZRtOW0S=;|G$>r2XY|eROCFic6~e{I_}U4{iIYqZ+T@!6P^w zy9)o~<#e1~#i_T-=}~UObAMD$p}Yd7>YH+E4)(VLyBrntkJ0cM{$ncWhcJKJ*_~KH zErDxGb<>Yqx;XfE4Z+0zA31$;EIq1CPP=C znVF;e&y-;I#m&z++E#Vd;G2JWpn}G;GkLnBf+Ec2B-q z?C=wre*U|%9&7vQ`x=~m)0qmobqE~HhhJAvDA)dc=BVT{rDdidwvvautu(iduB0CV z!bhkTh#5B`Gn}<+pV8wgc^9i~iy*b!luxLn+k*Vq#*xz7?L#+!GWIz1f#Hv z`}Q1@B2%wQw}T#V41C`9e{PY(}|3>p+TI4nQ-EeiUCEx^FHgoO`(oPK@| z+Wr;|4v7ms91vV{`Qf;MZ;9RO2)YBKn)qvN+qU@tdwX&vs$yUven_b#E=*i7y>g&z zu@py)hHGoZ5j#EF-otSj6njK!CA||8jVourpuo%joMFMC0d4u$_@F97(<;$KZ+^YH z5({zfa`y*fS#>3fFIJiJIHJ;QHOlEK=@3^tc?v6O4euN=wUs>6X`NZ5D(TKBc-Qw~ z2vBpBVM>lv@)q9p#(k=ik|IJkfHD}1{Nj^gZEKT-kWSXf1~IDh=v`YK!-glt~MO^&$ZBdv8|JM&83Qxvz=`Q0z3lUsZAJ{AM#WsG6?gf~Ab8 zY7Uv(Gwz?SFsCr4npTg1(-n!;B;(+8x7cwoW(mamnz!(|qz!H606q=RMd_&C@GAsKltI!Cc8SwYQp0 zl-KO-tEQ}>@Vei8S4}-mZf8;rU#^y!`3q}E z42I8r{hAv3Gz964quXj|EU)7@nG zv}G{T8(%(DL%t9=n1YTPS`p>1{Y+<14Hd+|!AyF)hPLv0j$fRw;evqxbE?0Fmo_-M zX8Jh4=fw0+A4T(aj_1evD1oyZpCtNdWMtrdei4rb-N%`omY|3yoO+PM?@YwNW$<_A z=rSLj^&k4bD)@i&Z$M30`L3AxFRgo@f_{Ed*!af>+Gxp922H#C#edhcfp7l_-~I#C z=lfMYjPeX<8?)Mndg_3-)j0Cp&1@W5%@mGUHPJQ->b1lKtntx78f4?v;)ePR9gH$S zA2M>N(ecra2(xR8k52MVwuDR{-5(A2_>#v*t0u!6#r*b1IC*bX>~Ma1iW9~mO3n^gZE3#tfMF5 z;Qc->s-q>L@P3nO>*(&G@O~%mtD~Jxc)#)Ob*TP8)@e*f9o2E&>O(zsyq_o0T>n-b zw+|$l`F(YKJ&9Cxe;s$!r*w_2r;-@BxBFx2dFNZINsX`P;a*o6S5iH%mBDKHw0b(h zsp?DV^_=IOWzJ{TbLrx2)99|p<$-e!E<67@595j2dUpDAQI%WIrQPyTJa$V1FOpwu5~3S;?&{U1Hok!laAoV5#0L6u3cOqFmInSI_qJv> z0MTV;0*;sxx*XRk0}uSFRW?upZl)&V=;fQK_Ja+41-8okc({S`xjZPZr-3JHt}zpP z8+a|xS~Kr#1I5R|)^GW`fnE!t^sY&bq&cbG72Sx+IGFm6;v0D)r+75epycw1#v;px;LBXB<~H1{jrJPsguW=@kZfJYXatc zm>3xPPh*>DFpq8dF}@iiLrh?LDCJRzE`*aC>KCxPp!I=zI&XF)H&dFE&X|KUn(4+M zyevP>$5#U257HJj(}i&OgJdAs$z2&=WHz(sEHOpyW@_TJ_IGv7bQ^bNG)kP8i-)dm zZ{{nj3bUc3nPd$7z{e+=;lAMqTyHjWRd2OPI@`?Cny~M;znS8O!R~Jl-9rZ)5za`5 zU*v0%dn30;PK$K>Gl-FRgVX6h(Yf#5krTs{9FAcNuiRO%V{1{tj(z(_#x39vwk9QE zNnCtNQc^trn;762Hf{XR&&k?Zw)N)^x9%z|D0ctrnRx14|9z)M&W*&_+)>M};HM2d aWncTq!I76g^x{Wj)m%#AQ$LRMkNO`3v+Y0t delta 115517 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 o=e5&Lvqc{N1%8)dx7G>QT0kEh@=s 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 yk*-E)YSxb-Ki889C!PboQDFDECwu4$o grids-and-lists.md`, `Charts -> charts/chart-overview.md`) and, worse, loses the section for every following sibling. The walker keeps headers for section tracking; the xplat exporters still filter their landing pages out of the *export*, exactly as before. + +**Rule: an excluded header still updates the section.** Otherwise an xplat platform that excludes a header inherits the previous section for every entry after it. + +**Rule: group membership is decided by the top-level node below the header, not by depth.** `Data Grid` carries both an `href` and children, so `grid/grid.md` has a one-element ancestor chain — the same length as `accordion.md`, which must land at section level. An `ancestors.length > 1` test files the group's own overview page outside its group, which is precisely the doc a caller drilling into it wants. That pair is the regression test; 17 docs move in angular alone. + +**Rule: keep the duplicate write for a cross-listed href.** `injectTocMetadata` runs per TOC entry, so the two writes differ — `dashboard-tile.md` ships with `toc_name = "Charting in Dashboards"` (the second entry) in all four frameworks. Skipping the second write flips `docs.toc_name` and its `ORDER BY toc_name` position. Cache only the resolved *filename*, so the page stays one doc. + +**Rule: flat mode must not read through `doc_toc`.** The join multiplies cross-listed docs and reorders by TOC position, breaking both the byte-identical criterion and `ORDER BY toc_name`. Where `group` narrows a flat listing, membership is resolved with a separate `SELECT DISTINCT filename` and applied as a filter. + +**Rule: never render a filtered group's count from `doc_groups.doc_count`.** That column stores the full group size and would print `(45)` above three listed docs. Counts come from the matched rows, deduplicated by `(group_key, filename)`. + +**Rule: `build:db` publishes through a temp file.** It builds into `dist/igniteui-docs.db.tmp`, wraps schema changes, deletes, inserts, the FTS rebuild and the gates in one transaction, validates the staged file on a separate read-only connection, then renames `dist/` → backend → `db/` last. `db/igniteui-docs.db` is authoritative (`scripts/build.ts` copies it into `dist/` on every build), so it is the seed for an incremental run and the last thing published. Every handle is closed before a rename — Windows refuses to rename over an open SQLite file. + +**Rule: a full rebuild preflights all four frameworks.** Deriving the set from what happens to be on disk turned a missing framework into a silent omission, and a full rebuild drops and recreates the tables — so the previously good rows for it were simply gone. See also the `clear:build` hazard: it wipes `docs_processing` and `docs_prepeared` for *every* framework, so a full `build:db` at the wrong moment writes `toc_name = NULL` for the three that were not just processed. + +**Rule: the group set comes from the TOC, never from the summary cache.** Loading `doc_groups` from `data/group-summaries/.json` would make a new or renamed group vanish along with all of its docs, instead of appearing with a NULL summary. NULL summaries are a development state; `--release` is what refuses to ship one. + ## Related Documentation | Document | Description | Status | diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/package.json b/packages/igniteui-mcp/igniteui-doc-mcp/package.json index 8d623986f..5def1f12e 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/package.json +++ b/packages/igniteui-mcp/igniteui-doc-mcp/package.json @@ -41,6 +41,8 @@ "test:watch": "vitest", "coverage": "vitest run --coverage", "build:db": "npx tsx scripts/build-db.ts", + "release:db": "npm run build:db -- --release", + "report:toc-coverage": "npx tsx scripts/report-toc-coverage.ts", "validate:package": "npx tsx scripts/validate-package.ts", "inspector": "npx @modelcontextprotocol/inspector dist/index.js", "clear": "npx tsx -e \"import{rmSync}from'fs';rmSync('dist',{recursive:true,force:true})\"", @@ -73,6 +75,11 @@ "derive-components:react": "npx tsx scripts/derive-components.ts --framework react", "rewrite-api-urls:webcomponents": "npx tsx scripts/rewrite-api-links.ts --platform webcomponents", "derive-components:webcomponents": "npx tsx scripts/derive-components.ts --framework webcomponents", + "build:group-summaries": "npx tsx --env-file-if-exists=.env scripts/build-group-summaries.ts", + "group-summaries:angular": "npm run build:group-summaries -- --framework angular", + "group-summaries:blazor": "npm run build:group-summaries -- --framework blazor", + "group-summaries:react": "npm run build:group-summaries -- --framework react", + "group-summaries:webcomponents": "npm run build:group-summaries -- --framework webcomponents", "compress:angular": "npx tsx --env-file=.env scripts/compress-angular-docs.ts", "compress:blazor": "npx tsx --env-file=.env scripts/compress-blazor-docs.ts", "compress:react": "npx tsx --env-file=.env scripts/compress-react-docs.ts", @@ -98,14 +105,14 @@ "update-baseline:react": "npx tsx scripts/update-baseline.ts --framework react --manifest dist/diff-manifest.json", "update-baseline:webcomponents": "npx tsx scripts/update-baseline.ts --framework webcomponents --manifest dist/diff-manifest.json", "clear:build": "npx tsx -e \"import{rmSync}from'fs';['docs_processing','docs_prepeared'].forEach(d=>{rmSync('dist/'+d,{recursive:true,force:true})})\"", - "pipeline:angular": "npm run clear:build && npm run export:angular && npm run inject:angular && npm run rewrite-api-urls:angular && npm run diff:angular && npm run compress:angular -- --batch submit --manifest dist/diff-manifest.json && npm run compress:angular -- --batch poll && npm run derive-components:angular && npm run update-baseline:angular && npm run build:db -- --framework angular", - "pipeline:blazor": "npm run clear:build && npm run build:xplat-blazor && npm run export:blazor && npm run inject:blazor && npm run rewrite-api-urls:blazor && npm run diff:blazor && npm run compress:blazor -- --batch submit --manifest dist/diff-manifest.json && npm run compress:blazor -- --batch poll && npm run derive-components:blazor && npm run update-baseline:blazor && npm run build:db -- --framework blazor", - "pipeline:react": "npm run clear:build && npm run build:xplat-react && npm run export:react && npm run inject:react && npm run rewrite-api-urls:react && npm run diff:react && npm run compress:react -- --batch submit --manifest dist/diff-manifest.json && npm run compress:react -- --batch poll && npm run derive-components:react && npm run update-baseline:react && npm run build:db -- --framework react", - "pipeline:webcomponents": "npm run clear:build && npm run build:xplat-wc && npm run export:webcomponents && npm run inject:webcomponents && npm run rewrite-api-urls:webcomponents && npm run diff:webcomponents && npm run compress:webcomponents -- --batch submit --manifest dist/diff-manifest.json && npm run compress:webcomponents -- --batch poll && npm run derive-components:webcomponents && npm run update-baseline:webcomponents && npm run build:db -- --framework webcomponents", - "pipeline:angular:full": "npm run clear:angular && npm run export:angular && npm run inject:angular && npm run rewrite-api-urls:angular && npm run compress:angular -- --batch submit && npm run compress:angular -- --batch poll && npm run derive-components:angular && npx tsx scripts/update-baseline.ts --framework angular --full && npm run build:db -- --framework angular", - "pipeline:blazor:full": "npm run clear:blazor && npm run build:xplat-blazor && npm run export:blazor && npm run inject:blazor && npm run rewrite-api-urls:blazor && npm run compress:blazor -- --batch submit && npm run compress:blazor -- --batch poll && npm run derive-components:blazor && npx tsx scripts/update-baseline.ts --framework blazor --full && npm run build:db -- --framework blazor", - "pipeline:react:full": "npm run clear:react && npm run build:xplat-react && npm run export:react && npm run inject:react && npm run rewrite-api-urls:react && npm run compress:react -- --batch submit && npm run compress:react -- --batch poll && npm run derive-components:react && npx tsx scripts/update-baseline.ts --framework react --full && npm run build:db -- --framework react", - "pipeline:webcomponents:full": "npm run clear:webcomponents && npm run build:xplat-wc && npm run export:webcomponents && npm run inject:webcomponents && npm run rewrite-api-urls:webcomponents && npm run compress:webcomponents -- --batch submit && npm run compress:webcomponents -- --batch poll && npm run derive-components:webcomponents && npx tsx scripts/update-baseline.ts --framework webcomponents --full && npm run build:db -- --framework webcomponents" + "pipeline:angular": "npm run clear:build && npm run export:angular && npm run inject:angular && npm run rewrite-api-urls:angular && npm run diff:angular && npm run compress:angular -- --batch submit --manifest dist/diff-manifest.json && npm run compress:angular -- --batch poll && npm run derive-components:angular && npm run update-baseline:angular && npm run group-summaries:angular && npm run build:db -- --framework angular", + "pipeline:blazor": "npm run clear:build && npm run build:xplat-blazor && npm run export:blazor && npm run inject:blazor && npm run rewrite-api-urls:blazor && npm run diff:blazor && npm run compress:blazor -- --batch submit --manifest dist/diff-manifest.json && npm run compress:blazor -- --batch poll && npm run derive-components:blazor && npm run update-baseline:blazor && npm run group-summaries:blazor && npm run build:db -- --framework blazor", + "pipeline:react": "npm run clear:build && npm run build:xplat-react && npm run export:react && npm run inject:react && npm run rewrite-api-urls:react && npm run diff:react && npm run compress:react -- --batch submit --manifest dist/diff-manifest.json && npm run compress:react -- --batch poll && npm run derive-components:react && npm run update-baseline:react && npm run group-summaries:react && npm run build:db -- --framework react", + "pipeline:webcomponents": "npm run clear:build && npm run build:xplat-wc && npm run export:webcomponents && npm run inject:webcomponents && npm run rewrite-api-urls:webcomponents && npm run diff:webcomponents && npm run compress:webcomponents -- --batch submit --manifest dist/diff-manifest.json && npm run compress:webcomponents -- --batch poll && npm run derive-components:webcomponents && npm run update-baseline:webcomponents && npm run group-summaries:webcomponents && npm run build:db -- --framework webcomponents", + "pipeline:angular:full": "npm run clear:angular && npm run export:angular && npm run inject:angular && npm run rewrite-api-urls:angular && npm run compress:angular -- --batch submit && npm run compress:angular -- --batch poll && npm run derive-components:angular && npx tsx scripts/update-baseline.ts --framework angular --full && npm run group-summaries:angular && npm run build:db -- --framework angular", + "pipeline:blazor:full": "npm run clear:blazor && npm run build:xplat-blazor && npm run export:blazor && npm run inject:blazor && npm run rewrite-api-urls:blazor && npm run compress:blazor -- --batch submit && npm run compress:blazor -- --batch poll && npm run derive-components:blazor && npx tsx scripts/update-baseline.ts --framework blazor --full && npm run group-summaries:blazor && npm run build:db -- --framework blazor", + "pipeline:react:full": "npm run clear:react && npm run build:xplat-react && npm run export:react && npm run inject:react && npm run rewrite-api-urls:react && npm run compress:react -- --batch submit && npm run compress:react -- --batch poll && npm run derive-components:react && npx tsx scripts/update-baseline.ts --framework react --full && npm run group-summaries:react && npm run build:db -- --framework react", + "pipeline:webcomponents:full": "npm run clear:webcomponents && npm run build:xplat-wc && npm run export:webcomponents && npm run inject:webcomponents && npm run rewrite-api-urls:webcomponents && npm run compress:webcomponents -- --batch submit && npm run compress:webcomponents -- --batch poll && npm run derive-components:webcomponents && npx tsx scripts/update-baseline.ts --framework webcomponents --full && npm run group-summaries:webcomponents && npm run build:db -- --framework webcomponents" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.30.0", diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/build-db.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/build-db.ts index 853af4113..060e0fdfd 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/build-db.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/build-db.ts @@ -1,11 +1,17 @@ import Database from "better-sqlite3"; import * as fs from "fs"; import * as path from "path"; +import { parseFrontmatter } from "./lib/frontmatter.js"; +import type { TocSidecarRecord } from "./lib/toc-sidecar.js"; const DIST_DIR = path.resolve("dist"); const DOCS_FINAL_DIR = path.join(DIST_DIR, "docs_final"); const DOCS_PREPARED_DIR = path.join(DIST_DIR, "docs_prepeared"); +const TOC_INDEX_DIR = path.join(DIST_DIR, "toc-index"); +const GROUP_SUMMARIES_DIR = path.resolve("data", "group-summaries"); const DB_PATH = path.join(DIST_DIR, "igniteui-docs.db"); +const GIT_DB_PATH = path.resolve("db", "igniteui-docs.db"); +const BACKEND_DB_PATH = path.resolve("..", "docs-backend", "docs-backend", "igniteui-docs.db"); const FRAMEWORKS = ["angular", "react", "blazor", "webcomponents"]; const CREATE_DOCS = ` @@ -28,35 +34,42 @@ CREATE VIRTUAL TABLE docs_fts USING fts4( content='docs', tokenize=porter, prefix="2,3" )`; -function parseFrontmatter(raw: string): { - component: string; - keywords: string; +// group_key is NOT NULL and is the join key to doc_groups: SQLite allows several +// NULLs in a rowid table's PRIMARY KEY, so a nullable grouping column would both +// admit duplicate rows and drop every section-level group from the join. +// `path` is section-qualified so one file cross-listed in two sections cannot +// collide on the primary key. +const CREATE_DOC_TOC = ` +CREATE TABLE IF NOT EXISTS doc_toc ( + framework TEXT NOT NULL, + filename TEXT NOT NULL, + group_key TEXT NOT NULL, + section TEXT NOT NULL, + group_label TEXT NOT NULL DEFAULT '', + path TEXT NOT NULL, + ord INTEGER NOT NULL, + landing INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (framework, filename, path) +)`; + +const CREATE_DOC_TOC_INDEX = + `CREATE INDEX IF NOT EXISTS idx_doc_toc_group ON doc_toc(framework, group_key, ord)`; + +const CREATE_DOC_GROUPS = ` +CREATE TABLE IF NOT EXISTS doc_groups ( + framework TEXT NOT NULL, + group_key TEXT NOT NULL, + section TEXT NOT NULL, + group_label TEXT NOT NULL DEFAULT '', + summary TEXT, + doc_count INTEGER NOT NULL, + ord INTEGER NOT NULL, + PRIMARY KEY (framework, group_key) +)`; + +interface GroupSummaryEntry { + groupKey: string; summary: string; - premium: boolean; - content: string; -} { - const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/); - if (!match) return { component: "", keywords: "", summary: "", premium: false, content: raw }; - - const block = match[1]; - let component = ""; - let keywords = ""; - let summary = ""; - let premium = false; - - for (const line of block.split("\n")) { - const m1 = line.match(/^component:\s*(.+)/); - if (m1) component = m1[1].trim(); - const m2 = line.match(/^keywords:\s*(.+)/); - if (m2) keywords = m2[1].trim(); - const m3 = line.match(/^summary:\s*(.+)/); - if (m3) summary = m3[1].trim(); - const m4 = line.match(/^premium:\s*(.+)/); - if (m4) premium = m4[1].trim() === "true"; - } - - const content = raw.slice(match[0].length).replace(/^\r?\n/, ""); - return { component, keywords, summary, premium, content }; } function extractTocName(filePath: string): string | null { @@ -85,138 +98,381 @@ function collectMdFiles(dir: string): string[] { function buildPreparedIndex(preparedDir: string): Map { const index = new Map(); for (const fullPath of collectMdFiles(preparedDir)) { - const base = path.basename(fullPath); - index.set(base, fullPath); + index.set(path.basename(fullPath), fullPath); } return index; } -function main() { - const args = process.argv.slice(2); - const fwIdx = args.indexOf("--framework"); - const targetFramework = fwIdx !== -1 ? args[fwIdx + 1] : null; +function sidecarPath(framework: string): string { + return path.join(TOC_INDEX_DIR, `${framework}.json`); +} - if (targetFramework && !FRAMEWORKS.includes(targetFramework)) { - console.error(`Unknown framework: ${targetFramework}. Valid: ${FRAMEWORKS.join(", ")}`); - process.exit(1); +/** + * Abort before touching anything if an input is missing. + * + * Deriving the framework set from whatever happens to be on disk turns a missing + * framework into a silent omission: a full rebuild drops and recreates the + * tables, so the previously good rows for that framework are simply gone. + */ +function preflight(frameworks: string[]): void { + const problems: string[] = []; + + for (const fw of frameworks) { + if (collectMdFiles(path.join(DOCS_FINAL_DIR, fw)).length === 0) { + problems.push(`dist/docs_final/${fw}/ is missing or has no .md files`); + } + if (collectMdFiles(path.join(DOCS_PREPARED_DIR, fw)).length === 0) { + problems.push(`dist/docs_prepeared/${fw}/ is missing or has no .md files (toc_name comes from here)`); + } + if (!fs.existsSync(sidecarPath(fw))) { + problems.push(`dist/toc-index/${fw}.json is missing (run export:${fw})`); + } } - if (!fs.existsSync(DOCS_FINAL_DIR)) { - console.error(`dist/docs_final/ not found. Run the pipeline first.`); + if (problems.length > 0) { + console.error(`Preflight failed — refusing to build:`); + for (const p of problems) console.error(` - ${p}`); process.exit(1); } +} - const frameworksToProcess = targetFramework ? [targetFramework] : FRAMEWORKS; - const existingFrameworks = frameworksToProcess.filter((fw) => { - const dir = path.join(DOCS_FINAL_DIR, fw); - if (!fs.existsSync(dir)) return false; - const mdFiles = fs.readdirSync(dir).filter((f) => f.endsWith(".md") && !f.startsWith("_")); - return mdFiles.length > 0; - }); - - if (existingFrameworks.length === 0) { - console.error(`No .md files found in any framework directory under dist/docs_final/`); - process.exit(1); +function loadSidecar(framework: string): TocSidecarRecord[] { + const raw = fs.readFileSync(sidecarPath(framework), "utf-8"); + const records = JSON.parse(raw) as TocSidecarRecord[]; + if (!Array.isArray(records)) { + throw new Error(`Malformed TOC sidecar for ${framework}: expected an array`); } + return records; +} - const isFullRebuild = !targetFramework; - // Captured before opening — opening the database creates the file. - const dbExisted = fs.existsSync(DB_PATH); - let db: Database.Database; - - if (isFullRebuild || !dbExisted) { - db = new Database(DB_PATH); - db.exec("DROP TABLE IF EXISTS docs_fts"); - db.exec("DROP TABLE IF EXISTS docs"); - db.exec(CREATE_DOCS); - db.exec(CREATE_FTS); - } else { - db = new Database(DB_PATH); - db.exec(`DELETE FROM docs WHERE framework = '${targetFramework}'`); - } - - const insert = db.prepare(` +function loadGroupSummaries(framework: string): GroupSummaryEntry[] { + const file = path.join(GROUP_SUMMARIES_DIR, `${framework}.json`); + if (!fs.existsSync(file)) return []; + return JSON.parse(fs.readFileSync(file, "utf-8")) as GroupSummaryEntry[]; +} + +function ingestFramework(db: Database.Database, framework: string): void { + const finalDir = path.join(DOCS_FINAL_DIR, framework); + const preparedIndex = buildPreparedIndex(path.join(DOCS_PREPARED_DIR, framework)); + + const insertDoc = db.prepare(` INSERT INTO docs (framework, filename, component, toc_name, premium, keywords, summary, content) VALUES (?, ?, ?, ?, ?, ?, ?, ?) `); - const stats: Record = {}; + const mdFiles = fs + .readdirSync(finalDir) + .filter((f) => f.endsWith(".md") && !f.startsWith("_")); - for (const fw of existingFrameworks) { - const finalDir = path.join(DOCS_FINAL_DIR, fw); - const preparedDir = path.join(DOCS_PREPARED_DIR, fw); - const preparedIndex = buildPreparedIndex(preparedDir); + for (const file of mdFiles) { + const raw = fs.readFileSync(path.join(finalDir, file), "utf-8"); + const { component, keywords, summary, premium, content } = parseFrontmatter(raw); - const mdFiles = fs - .readdirSync(finalDir) - .filter((f) => f.endsWith(".md") && !f.startsWith("_")); + const preparedPath = preparedIndex.get(file); + const tocName = preparedPath ? extractTocName(preparedPath) : null; + if (!preparedPath) { + console.warn(` [warn] No prepared doc for ${framework}/${file} — toc_name will be null`); + } - const insertMany = db.transaction((files: string[]) => { - for (const file of files) { - const raw = fs.readFileSync(path.join(finalDir, file), "utf-8"); - const { component, keywords, summary, premium, content } = parseFrontmatter(raw); + insertDoc.run(framework, file, component, tocName, premium ? 1 : 0, keywords, summary, content); + } + console.log(` ${framework}: ${mdFiles.length} docs inserted`); - let tocName: string | null = null; - const preparedPath = preparedIndex.get(file); - if (preparedPath) { - tocName = extractTocName(preparedPath); - } else { - console.warn(` [warn] No prepared doc for ${fw}/${file} — toc_name will be null`); - } + // A record whose file never made it into `docs` is a warning, not a failure — + // the reverse (a doc with no group) is what the coverage gate rejects. + const known = new Set(mdFiles); + const insertToc = db.prepare(` + INSERT OR IGNORE INTO doc_toc (framework, filename, group_key, section, group_label, path, ord, landing) + VALUES (?, ?, ?, ?, ?, ?, ?, ?) + `); - insert.run(fw, file, component, tocName, premium ? 1 : 0, keywords, summary, content); - } + let inserted = 0; + let ignored = 0; + let orphaned = 0; + for (const rec of loadSidecar(framework)) { + if (!known.has(rec.file)) { + orphaned++; + continue; + } + const info = insertToc.run( + framework, + rec.file, + rec.groupKey, + rec.section, + rec.groupLabel ?? "", + rec.path, + rec.ord, + rec.landing ? 1 : 0 + ); + if (info.changes === 0) ignored++; + else inserted++; + } + console.log( + ` ${framework}: ${inserted} TOC membership(s) inserted` + + (ignored ? `, ${ignored} duplicate(s) ignored` : "") + + (orphaned ? `, ${orphaned} record(s) with no matching doc` : "") + ); + if (orphaned > 0) { + console.warn(` [warn] ${framework}: ${orphaned} TOC record(s) reference a doc that is not in docs_final`); + } + + // The group set is defined by the TOC, never by the summary cache: loading + // groups from the cache would make a new or renamed group vanish along with + // all of its docs instead of appearing with a NULL summary. + db.prepare(` + INSERT INTO doc_groups (framework, group_key, section, group_label, summary, doc_count, ord) + SELECT framework, group_key, MIN(section), MIN(group_label), NULL, + COUNT(DISTINCT filename), MIN(ord) + FROM doc_toc WHERE framework = ? GROUP BY framework, group_key + `).run(framework); + + const groupCount = ( + db.prepare(`SELECT COUNT(*) AS cnt FROM doc_groups WHERE framework = ?`).get(framework) as any + ).cnt; + + const updateSummary = db.prepare( + `UPDATE doc_groups SET summary = ? WHERE framework = ? AND group_key = ?` + ); + let applied = 0; + const stale: string[] = []; + for (const entry of loadGroupSummaries(framework)) { + if (!entry.summary) continue; + const info = updateSummary.run(entry.summary, framework, entry.groupKey); + if (info.changes === 0) stale.push(entry.groupKey); + else applied++; + } + console.log(` ${framework}: ${groupCount} group(s), ${applied} summary/summaries applied`); + for (const key of stale) { + console.warn(` [warn] ${framework}: cached summary for unknown group "${key}" — stale cache`); + } +} + +/** + * @param frameworks frameworks this invocation processed; always checked. + * @param release additionally apply the whole-DB gates. They are opt-in because + * they cannot pass mid-migration, and because a NULL group summary is a valid + * development state but never a shippable one. + */ +function validate(db: Database.Database, frameworks: string[], release: boolean): void { + const failures: string[] = []; + const placeholders = frameworks.map(() => "?").join(", "); + + const uncovered = db.prepare(` + SELECT d.framework, d.filename FROM docs d + WHERE d.framework IN (${placeholders}) + AND NOT EXISTS ( + SELECT 1 FROM doc_toc t WHERE t.framework = d.framework AND t.filename = d.filename + ) + LIMIT 20 + `).all(...frameworks) as { framework: string; filename: string }[]; + if (uncovered.length > 0) { + failures.push( + `${uncovered.length}+ doc(s) have no TOC group, e.g. ` + + uncovered.slice(0, 5).map((r) => `${r.framework}/${r.filename}`).join(", ") + ); + } + + const nullToc = db.prepare(` + SELECT framework, COUNT(*) AS cnt FROM docs + WHERE framework IN (${placeholders}) AND toc_name IS NULL + GROUP BY framework + `).all(...frameworks) as { framework: string; cnt: number }[]; + if (nullToc.length > 0) { + failures.push( + `NULL toc_name rows: ` + nullToc.map((r) => `${r.framework}=${r.cnt}`).join(", ") + ); + } + + if (release) { + const missingFw = FRAMEWORKS.filter((fw) => { + const row = db.prepare(`SELECT COUNT(*) AS cnt FROM doc_toc WHERE framework = ?`).get(fw) as any; + return row.cnt === 0; }); + if (missingFw.length > 0) { + failures.push(`framework(s) with no doc_toc rows: ${missingFw.join(", ")}`); + } - insertMany(mdFiles); - stats[fw] = mdFiles.length; - console.log(` ${fw}: ${mdFiles.length} docs inserted`); + const uncoveredAll = ( + db.prepare(` + SELECT COUNT(*) AS cnt FROM docs d + WHERE NOT EXISTS ( + SELECT 1 FROM doc_toc t WHERE t.framework = d.framework AND t.filename = d.filename + ) + `).get() as any + ).cnt; + if (uncoveredAll > 0) failures.push(`${uncoveredAll} doc(s) across the DB have no TOC group`); + + const nullTocAll = ( + db.prepare(`SELECT COUNT(*) AS cnt FROM docs WHERE toc_name IS NULL`).get() as any + ).cnt; + if (nullTocAll > 0) failures.push(`${nullTocAll} doc(s) across the DB have a NULL toc_name`); + + const nullSummaries = db.prepare(` + SELECT framework, group_key FROM doc_groups WHERE summary IS NULL OR summary = '' LIMIT 20 + `).all() as { framework: string; group_key: string }[]; + if (nullSummaries.length > 0) { + failures.push( + `${nullSummaries.length}+ group(s) have no summary — run build:group-summaries: ` + + nullSummaries.slice(0, 5).map((r) => `${r.framework}/${r.group_key}`).join(", ") + ); + } } - db.exec("INSERT INTO docs_fts(docs_fts) VALUES('rebuild')"); + if (failures.length > 0) { + throw new Error( + `Validation failed:\n` + failures.map((f) => ` - ${f}`).join("\n") + ); + } +} - // DROP/DELETE frees pages but never shrinks the file, and this DB is committed to git. - // A file created by this run has no free pages, so only vacuum an inherited one. - if (dbExisted) { - db.exec("VACUUM"); +function removeDbFiles(file: string): void { + for (const suffix of ["", "-wal", "-shm"]) { + fs.rmSync(`${file}${suffix}`, { force: true }); } +} - db.pragma("optimize"); +function main() { + const args = process.argv.slice(2); + const fwIdx = args.indexOf("--framework"); + const targetFramework = fwIdx !== -1 ? args[fwIdx + 1] : null; + const release = args.includes("--release"); - const totalRows = (db.prepare("SELECT COUNT(*) AS cnt FROM docs").get() as any).cnt; - db.close(); + if (targetFramework && !FRAMEWORKS.includes(targetFramework)) { + console.error(`Unknown framework: ${targetFramework}. Valid: ${FRAMEWORKS.join(", ")}`); + process.exit(1); + } - console.log(`\nDatabase built: ${DB_PATH}`); - console.log(`Total docs: ${totalRows}`); - for (const [fw, count] of Object.entries(stats)) { - console.log(` ${fw}: ${count}`); + const isFullRebuild = !targetFramework; + const frameworksToProcess = targetFramework ? [targetFramework] : FRAMEWORKS; + preflight(frameworksToProcess); + + // Build into a temp file so a failure anywhere leaves every published artifact + // untouched. `db/igniteui-docs.db` is authoritative — `scripts/build.ts` copies + // it into `dist/` on every build — so an incremental run seeds from there, not + // from the derived `dist/` copy. + const tmpPath = `${DB_PATH}.tmp`; + const stagedPaths: { staged: string; final: string }[] = []; + removeDbFiles(tmpPath); + fs.mkdirSync(DIST_DIR, { recursive: true }); + + const seeded = !isFullRebuild && fs.existsSync(GIT_DB_PATH); + if (seeded) { + fs.copyFileSync(GIT_DB_PATH, tmpPath); + } else if (!isFullRebuild) { + console.warn(`${GIT_DB_PATH} not found — building ${targetFramework} into a fresh database.`); } - const sizeKB = (fs.statSync(DB_PATH).size / 1024).toFixed(1); - console.log(`DB size: ${sizeKB} KB`); + const cleanup = () => { + removeDbFiles(tmpPath); + for (const { staged } of stagedPaths) removeDbFiles(staged); + }; + + let totalRows = 0; + const db = new Database(tmpPath); + try { + // No -wal/-shm siblings to clean up before the renames. + db.pragma("journal_mode = DELETE"); + + // One transaction spans the schema changes, the deletes, the inserts, the + // FTS rebuild and the gates, so a gate failure cannot leave a half-updated + // database behind. SQLite DDL is transactional, so this rolls back cleanly. + db.transaction(() => { + if (seeded) { + db.exec(CREATE_DOC_TOC); + db.exec(CREATE_DOC_TOC_INDEX); + db.exec(CREATE_DOC_GROUPS); + const del = (table: string) => + db.prepare(`DELETE FROM ${table} WHERE framework = ?`).run(targetFramework!); + del("docs"); + del("doc_toc"); + del("doc_groups"); + } else { + db.exec("DROP TABLE IF EXISTS docs_fts"); + db.exec("DROP TABLE IF EXISTS docs"); + db.exec("DROP TABLE IF EXISTS doc_groups"); + db.exec("DROP TABLE IF EXISTS doc_toc"); + db.exec(CREATE_DOCS); + db.exec(CREATE_FTS); + db.exec(CREATE_DOC_TOC); + db.exec(CREATE_DOC_TOC_INDEX); + db.exec(CREATE_DOC_GROUPS); + } - // Copy to db/ directory (tracked in git) - const gitDbPath = path.resolve("db/igniteui-docs.db"); - fs.mkdirSync(path.dirname(gitDbPath), { recursive: true }); - fs.copyFileSync(DB_PATH, gitDbPath); - console.log(`Copied DB to ${gitDbPath}`); + for (const fw of frameworksToProcess) { + ingestFramework(db, fw); + } + + db.exec("INSERT INTO docs_fts(docs_fts) VALUES('rebuild')"); + validate(db, frameworksToProcess, release); + })(); + + // VACUUM cannot run inside a transaction. A file this run created has no + // free pages, so only vacuum one inherited from the seed. + if (seeded) db.exec("VACUUM"); + db.pragma("optimize"); - const backendDbPath = path.resolve("../docs-backend/docs-backend/igniteui-docs.db"); - const backendDir = path.dirname(backendDbPath); - if (fs.existsSync(backendDir)) { + totalRows = (db.prepare("SELECT COUNT(*) AS cnt FROM docs").get() as any).cnt; + } catch (err) { + db.close(); + cleanup(); + console.error(err instanceof Error ? err.message : String(err)); + process.exit(1); + } finally { + // better-sqlite3 keeps the file open, and Windows refuses to rename or copy + // over an open SQLite file. try { - fs.copyFileSync(DB_PATH, backendDbPath); - console.log(`Copied DB to ${backendDbPath}`); - } catch (err) { - const message = err instanceof Error ? err.message : String(err); - console.warn( - `Could not copy DB to ${backendDbPath}: ${message}\n` + - `The DB was built and saved successfully — this copy is optional.` - ); + db.close(); + } catch { + /* already closed on the error path */ } - } else { - console.warn(`Backend dir not found (${backendDir}), skipping copy.`); } + + try { + // `dist/igniteui-docs.db.tmp` is already the stage for the dist/ copy, so + // only the other two destinations need one. Renames are per-file atomic; + // copies are not, so every copy happens before any rename. + stagedPaths.push({ staged: tmpPath, final: DB_PATH }); + + if (fs.existsSync(path.dirname(BACKEND_DB_PATH))) { + const backendTmp = `${BACKEND_DB_PATH}.tmp`; + fs.copyFileSync(tmpPath, backendTmp); + stagedPaths.push({ staged: backendTmp, final: BACKEND_DB_PATH }); + } else { + console.warn(`Backend dir not found (${path.dirname(BACKEND_DB_PATH)}), skipping copy.`); + } + + fs.mkdirSync(path.dirname(GIT_DB_PATH), { recursive: true }); + const gitTmp = `${GIT_DB_PATH}.tmp`; + fs.copyFileSync(tmpPath, gitTmp); + stagedPaths.push({ staged: gitTmp, final: GIT_DB_PATH }); + + // Validate what is about to be published, on a connection of its own, and + // close it before any rename for the same reason the writer is closed. + const check = new Database(tmpPath, { readonly: true }); + try { + validate(check, frameworksToProcess, release); + } finally { + check.close(); + } + + // db/ is the commit point and goes last: any failure before it leaves the + // authoritative database and its committed copy byte-for-byte intact. + for (const { staged, final } of stagedPaths) { + if (staged !== final) fs.renameSync(staged, final); + } + } catch (err) { + cleanup(); + console.error(err instanceof Error ? err.message : String(err)); + process.exit(1); + } + + console.log(`\nDatabase built: ${DB_PATH}`); + console.log(`Total docs: ${totalRows}`); + console.log(`DB size: ${(fs.statSync(DB_PATH).size / 1024).toFixed(1)} KB`); + for (const { final } of stagedPaths) { + if (final !== DB_PATH) console.log(`Published to ${final}`); + } + if (release) console.log(`Release gates passed.`); } main(); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/build-group-summaries.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/build-group-summaries.ts new file mode 100644 index 000000000..ab614223f --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/build-group-summaries.ts @@ -0,0 +1,217 @@ +import { createHash } from "crypto"; +import * as fs from "fs"; +import * as path from "path"; +import OpenAI from "openai"; +import { parseFrontmatter } from "./lib/frontmatter.js"; +import type { TocSidecarRecord } from "./lib/toc-sidecar.js"; + +const ROOT = path.resolve("."); +const DOCS_FINAL_DIR = path.join(ROOT, "dist", "docs_final"); +const TOC_INDEX_DIR = path.join(ROOT, "dist", "toc-index"); +const OUTPUT_DIR = path.join(ROOT, "data", "group-summaries"); +const FRAMEWORKS = ["angular", "react", "blazor", "webcomponents"]; + +// Bump when the prompt changes: it is part of the cache hash, so every group +// regenerates rather than silently keeping output from the previous wording. +const PROMPT_VERSION = 1; + +const SYSTEM_PROMPT = `You write one-line summaries for groups of component documentation. + +You are given the name of a documentation group and the summaries of the docs it contains. Write a single sentence describing what the group covers, so a developer can decide whether to open it. + +Rules: +- 120-160 characters. Never exceed 160. +- Name the concrete capabilities the group covers, in the docs' own vocabulary. +- No framework names, no product names, no "this group", no "documentation for". +- No markdown, no quotes, no trailing period beyond the single sentence's own. +- Output the sentence and nothing else.`; + +interface CacheEntry { + groupKey: string; + section: string; + groupLabel: string; + summary: string; + hash: string; + model: string; + promptVersion: number; +} + +interface GroupInput { + groupKey: string; + section: string; + groupLabel: string; + members: { file: string; summary: string }[]; + landing: string; +} + +function loadCache(framework: string): Map { + const file = path.join(OUTPUT_DIR, `${framework}.json`); + if (!fs.existsSync(file)) return new Map(); + const entries = JSON.parse(fs.readFileSync(file, "utf-8")) as CacheEntry[]; + return new Map(entries.map((e) => [e.groupKey, e])); +} + +function docSummary(framework: string, file: string): string { + const full = path.join(DOCS_FINAL_DIR, framework, file); + if (!fs.existsSync(full)) return ""; + return parseFrontmatter(fs.readFileSync(full, "utf-8")).summary; +} + +/** + * Group the sidecar's memberships, deduplicating by `(groupKey, file)` and + * keeping the lowest `ord` — the same rule the renderer and `doc_groups.doc_count` + * apply. Feeding raw records in would repeat a doc in the prompt and hash a + * member list that does not match what gets rendered. + */ +function collectGroups(framework: string): GroupInput[] { + const sidecarPath = path.join(TOC_INDEX_DIR, `${framework}.json`); + if (!fs.existsSync(sidecarPath)) { + console.error(`No TOC sidecar for ${framework} at ${sidecarPath} — run export:${framework} first.`); + process.exit(1); + } + const records = JSON.parse(fs.readFileSync(sidecarPath, "utf-8")) as TocSidecarRecord[]; + + const byGroup = new Map>(); + const landings = new Map(); + + for (const rec of records) { + let members = byGroup.get(rec.groupKey); + if (!members) { + members = new Map(); + byGroup.set(rec.groupKey, members); + } + const existing = members.get(rec.file); + if (!existing || rec.ord < existing.ord) members.set(rec.file, rec); + if (rec.landing) landings.set(rec.groupKey, rec.file); + } + + const groups: GroupInput[] = []; + for (const [groupKey, members] of byGroup) { + const ordered = [...members.values()].sort((a, b) => a.ord - b.ord); + const landingFile = landings.get(groupKey); + groups.push({ + groupKey, + section: ordered[0].section, + groupLabel: ordered[0].groupLabel, + members: ordered.map((r) => ({ file: r.file, summary: docSummary(framework, r.file) })), + landing: landingFile ? docSummary(framework, landingFile) : "", + }); + } + return groups.sort((a, b) => a.groupKey.localeCompare(b.groupKey)); +} + +function hashOf(group: GroupInput, model: string): string { + const payload = JSON.stringify({ + members: group.members.map((m) => [m.file, m.summary]), + landing: group.landing, + promptVersion: PROMPT_VERSION, + model, + }); + return createHash("sha256").update(payload).digest("hex").slice(0, 32); +} + +function userPrompt(group: GroupInput): string { + const lines = [`Group: ${group.groupKey}`]; + if (group.landing) lines.push(`Group overview: ${group.landing}`); + lines.push("", "Docs in this group:"); + for (const m of group.members) { + lines.push(`- ${m.file.replace(/\.md$/, "")}${m.summary ? `: ${m.summary}` : ""}`); + } + return lines.join("\n"); +} + +async function generate(client: OpenAI, model: string, group: GroupInput): Promise { + const response = await client.chat.completions.create({ + model, + messages: [ + { role: "system", content: SYSTEM_PROMPT }, + { role: "user", content: userPrompt(group) }, + ], + max_completion_tokens: 2000, + }); + return (response.choices[0].message.content ?? "").trim().replace(/\s+/g, " "); +} + +async function run(framework: string, model: string, force: boolean, apiBase?: string) { + const groups = collectGroups(framework); + const cache = loadCache(framework); + + const stale = groups.filter((g) => { + if (force) return true; + const hit = cache.get(g.groupKey); + return !hit || !hit.summary || hit.hash !== hashOf(g, model); + }); + + console.log(`${framework}: ${groups.length} group(s), ${stale.length} to regenerate, ${groups.length - stale.length} cached`); + + let client: OpenAI | null = null; + if (stale.length > 0) { + if (!process.env.OPENAI_API_KEY) { + console.error( + `${stale.length} group(s) need a summary but OPENAI_API_KEY is not set. ` + + `Provide a key, or leave the cache as-is (groups build with a NULL summary).` + ); + process.exit(1); + } + const clientOpts: ConstructorParameters[0] = {}; + if (apiBase) clientOpts.baseURL = apiBase; + client = new OpenAI(clientOpts); + } + + const staleKeys = new Set(stale.map((g) => g.groupKey)); + const out: CacheEntry[] = []; + + for (const group of groups) { + if (!staleKeys.has(group.groupKey)) { + // Copy the cached summary through; make no call. + out.push({ ...cache.get(group.groupKey)!, section: group.section, groupLabel: group.groupLabel }); + continue; + } + + const summary = await generate(client!, model, group); + if (!summary) { + console.warn(` [warn] empty summary for "${group.groupKey}" — leaving it uncached`); + continue; + } + console.log(` ${group.groupKey} (${group.members.length} docs) -> ${summary.length} ch`); + out.push({ + groupKey: group.groupKey, + section: group.section, + groupLabel: group.groupLabel, + summary, + hash: hashOf(group, model), + model, + promptVersion: PROMPT_VERSION, + }); + } + + fs.mkdirSync(OUTPUT_DIR, { recursive: true }); + const file = path.join(OUTPUT_DIR, `${framework}.json`); + const tmp = `${file}.tmp`; + fs.writeFileSync(tmp, `${JSON.stringify(out, null, 2)}\n`, "utf-8"); + fs.renameSync(tmp, file); + console.log(`${framework}: wrote ${out.length} summary/summaries -> ${file}`); +} + +async function main() { + const args = process.argv.slice(2); + const arg = (name: string) => { + const i = args.indexOf(name); + return i !== -1 ? args[i + 1] : undefined; + }; + + const targetFramework = arg("--framework"); + if (targetFramework && !FRAMEWORKS.includes(targetFramework)) { + console.error(`Unknown framework: ${targetFramework}. Valid: ${FRAMEWORKS.join(", ")}`); + process.exit(1); + } + + const model = arg("--model") || process.env.COMPRESS_MODEL || "gpt-5.6-luna"; + const force = args.includes("--force"); + + for (const fw of targetFramework ? [targetFramework] : FRAMEWORKS) { + await run(fw, model, force, arg("--api-base")); + } +} + +main(); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-angular-docs.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-angular-docs.ts index 43113d5cb..7e04f078e 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-angular-docs.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-angular-docs.ts @@ -1,6 +1,8 @@ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync } from "fs"; import { join, dirname, resolve, relative } from "path"; import yaml from "js-yaml"; +import { walkTocYaml, type TocEntry, type TocNode } from "./lib/toc-index.js"; +import { TocSidecar, resolveUniqueName } from "./lib/toc-sidecar.js"; const ROOT = resolve(import.meta.dirname, ".."); const DOCFX_ROOT = join(ROOT, "angular", "igniteui-docfx"); @@ -67,37 +69,10 @@ const gridsConfigs: Record> = { }, }; -interface TocEntry { - name: string; - href: string; - premium: boolean; -} - function parseToc(tocPath: string): TocEntry[] { const raw = readFileSync(tocPath, "utf-8"); - const entries: TocEntry[] = []; - - function flatten(items: any[]) { - for (const item of items) { - if (item.href) { - entries.push({ - name: item.name || "", - href: item.href, - premium: item.premium === true, - }); - } - if (Array.isArray(item.items)) { - flatten(item.items); - } - } - } - - const parsed = yaml.load(raw) as any[]; - if (Array.isArray(parsed)) { - flatten(parsed); - } - - return entries; + const parsed = yaml.load(raw) as TocNode[]; + return Array.isArray(parsed) ? walkTocYaml(parsed) : []; } function injectTocMetadata(content: string, entry: TocEntry): string { @@ -262,6 +237,9 @@ function main() { mkdirSync(OUTPUT_DIR, { recursive: true }); let totalFiles = 0; + const usedNames = new Map(); + const writtenFiles = new Set(); + const sidecar = new TocSidecar("angular", ROOT); // Step 3: Process toc entries console.error("Processing toc entries..."); @@ -298,12 +276,24 @@ function main() { content = replaceEnvironmentVars(content); content = stripImages(content); - const flatName = flattenPath(relPath); + // A cross-listed page appears under two TOC paths. Reuse the name resolved + // the first time so it stays one doc, but still write: injectTocMetadata has + // already run for this entry and last-write-wins is observable in the DB. + let flatName = sidecar.nameFor(relPath); + if (!flatName) { + flatName = resolveUniqueName(flattenPath(relPath), relPath, usedNames); + usedNames.set(flatName, relPath); + } + const outPath = join(OUTPUT_DIR, flatName); writeFileSync(outPath, content, "utf-8"); + writtenFiles.add(flatName); + sidecar.record(entry, flatName); totalFiles++; } + sidecar.write(writtenFiles); + console.error(`\nDone!`); console.error(` Files exported: ${totalFiles}`); console.error(` Output: ${OUTPUT_DIR}`); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-blazor-docs.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-blazor-docs.ts index e361e54e9..02a1be476 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-blazor-docs.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-blazor-docs.ts @@ -1,6 +1,8 @@ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync } from "fs"; -import { join, resolve, relative, basename } from "path"; +import { join, resolve, relative } from "path"; import { execSync } from "child_process"; +import { walkTocJson, type TocEntry, type TocNode } from "./lib/toc-index.js"; +import { TocSidecar, resolveUniqueName } from "./lib/toc-sidecar.js"; const ROOT = resolve(import.meta.dirname, ".."); const XPLAT_ROOT = join(ROOT, "common", "igniteui-xplat-docs"); @@ -19,38 +21,14 @@ function stripImages(content: string): string { return content.replace(/!\[[^\]]*\]\([^)]*\)/g, ""); } -interface TocEntry { - name: string; - href: string; - premium: boolean; -} - function parseTocJson(tocPath: string): TocEntry[] { const raw = readFileSync(tocPath, "utf-8"); - const data = JSON.parse(raw) as any[]; - const entries: TocEntry[] = []; - - function flatten(items: any[], parentExcluded: boolean) { - for (const item of items) { - const excludes: string[] = item.exclude || []; - const excluded = parentExcluded || excludes.includes("Blazor"); - - if (!excluded && item.href && !item.header) { - entries.push({ - name: item.name || "", - href: item.href, - premium: item.premium === true, - }); - } - - if (Array.isArray(item.items)) { - flatten(item.items, excluded); - } - } - } + const data = JSON.parse(raw) as TocNode[]; - flatten(data, false); - return entries; + // Header nodes are walked so `section` is tracked correctly, but their own + // landing pages have never been exported for the xplat platforms — keeping + // that filter here leaves the exported set unchanged. + return walkTocJson(data, { excludePlatform: "Blazor" }).filter((e) => !e.landing); } function injectTocMetadata(content: string, entry: TocEntry): string { @@ -138,6 +116,8 @@ function main() { let totalFiles = 0; let skipped = 0; const usedNames = new Map(); + const writtenFiles = new Set(); + const sidecar = new TocSidecar("blazor", ROOT); for (const entry of tocEntries) { const href = entry.href.replace(/\\/g, "/"); @@ -157,24 +137,24 @@ function main() { content = injectTocMetadata(content, entry); - let flatName = flattenPath(href); - - if (usedNames.has(flatName)) { - const parts = href.replace(/\\/g, "/").split("/"); - if (parts.length >= 2) { - flatName = `${parts[parts.length - 2]}-${basename(href)}`; - } - if (usedNames.has(flatName)) { - flatName = href.replace(/\//g, "-"); - } + // A cross-listed page appears under two TOC paths. Reuse the name resolved + // the first time so it stays one doc, but still write: injectTocMetadata has + // already run for this entry and last-write-wins is observable in the DB. + let flatName = sidecar.nameFor(href); + if (!flatName) { + flatName = resolveUniqueName(flattenPath(href), href, usedNames); + usedNames.set(flatName, href); } - usedNames.set(flatName, href); const outPath = join(OUTPUT_DIR, flatName); writeFileSync(outPath, content, "utf-8"); + writtenFiles.add(flatName); + sidecar.record(entry, flatName); totalFiles++; } + sidecar.write(writtenFiles); + console.error(`\nDone!`); console.error(` Files exported: ${totalFiles}`); console.error(` Skipped (not found): ${skipped}`); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-react-docs.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-react-docs.ts index e8aa273e3..6a91cf80c 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-react-docs.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-react-docs.ts @@ -1,6 +1,8 @@ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync } from "fs"; -import { join, resolve, relative, basename } from "path"; +import { join, resolve, relative } from "path"; import { execSync } from "child_process"; +import { walkTocJson, type TocEntry, type TocNode } from "./lib/toc-index.js"; +import { TocSidecar, resolveUniqueName } from "./lib/toc-sidecar.js"; const ROOT = resolve(import.meta.dirname, ".."); const XPLAT_ROOT = join(ROOT, "common", "igniteui-xplat-docs"); @@ -19,38 +21,14 @@ function stripImages(content: string): string { return content.replace(/!\[[^\]]*\]\([^)]*\)/g, ""); } -interface TocEntry { - name: string; - href: string; - premium: boolean; -} - function parseTocJson(tocPath: string): TocEntry[] { const raw = readFileSync(tocPath, "utf-8"); - const data = JSON.parse(raw) as any[]; - const entries: TocEntry[] = []; - - function flatten(items: any[], parentExcluded: boolean) { - for (const item of items) { - const excludes: string[] = item.exclude || []; - const excluded = parentExcluded || excludes.includes("React"); - - if (!excluded && item.href && !item.header) { - entries.push({ - name: item.name || "", - href: item.href, - premium: item.premium === true, - }); - } - - if (Array.isArray(item.items)) { - flatten(item.items, excluded); - } - } - } + const data = JSON.parse(raw) as TocNode[]; - flatten(data, false); - return entries; + // Header nodes are walked so `section` is tracked correctly, but their own + // landing pages have never been exported for the xplat platforms — keeping + // that filter here leaves the exported set unchanged. + return walkTocJson(data, { excludePlatform: "React" }).filter((e) => !e.landing); } function injectTocMetadata(content: string, entry: TocEntry): string { @@ -147,7 +125,9 @@ function main() { let totalFiles = 0; let skipped = 0; - const usedNames = new Map(); // flat name → original href (for collision detection) + const usedNames = new Map(); + const writtenFiles = new Set(); + const sidecar = new TocSidecar("react", ROOT); for (const entry of tocEntries) { const href = entry.href.replace(/\\/g, "/"); @@ -168,25 +148,24 @@ function main() { content = injectTocMetadata(content, entry); - let flatName = flattenPath(href); - - // Handle naming collisions - if (usedNames.has(flatName)) { - const parts = href.replace(/\\/g, "/").split("/"); - if (parts.length >= 2) { - flatName = `${parts[parts.length - 2]}-${basename(href)}`; - } - if (usedNames.has(flatName)) { - flatName = href.replace(/\//g, "-"); - } + // A cross-listed page appears under two TOC paths. Reuse the name resolved + // the first time so it stays one doc, but still write: injectTocMetadata has + // already run for this entry and last-write-wins is observable in the DB. + let flatName = sidecar.nameFor(href); + if (!flatName) { + flatName = resolveUniqueName(flattenPath(href), href, usedNames); + usedNames.set(flatName, href); } - usedNames.set(flatName, href); const outPath = join(OUTPUT_DIR, flatName); writeFileSync(outPath, content, "utf-8"); + writtenFiles.add(flatName); + sidecar.record(entry, flatName); totalFiles++; } + sidecar.write(writtenFiles); + console.error(`\nDone!`); console.error(` Files exported: ${totalFiles}`); console.error(` Skipped (not found): ${skipped}`); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-wc-docs.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-wc-docs.ts index 89ca3ccfb..f8104d042 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-wc-docs.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/export-wc-docs.ts @@ -1,6 +1,8 @@ import { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, statSync } from "fs"; -import { join, resolve, relative, basename } from "path"; +import { join, resolve, relative } from "path"; import { execSync } from "child_process"; +import { walkTocJson, type TocEntry, type TocNode } from "./lib/toc-index.js"; +import { TocSidecar, resolveUniqueName } from "./lib/toc-sidecar.js"; const ROOT = resolve(import.meta.dirname, ".."); const XPLAT_ROOT = join(ROOT, "common", "igniteui-xplat-docs"); @@ -19,38 +21,14 @@ function stripImages(content: string): string { return content.replace(/!\[[^\]]*\]\([^)]*\)/g, ""); } -interface TocEntry { - name: string; - href: string; - premium: boolean; -} - function parseTocJson(tocPath: string): TocEntry[] { const raw = readFileSync(tocPath, "utf-8"); - const data = JSON.parse(raw) as any[]; - const entries: TocEntry[] = []; - - function flatten(items: any[], parentExcluded: boolean) { - for (const item of items) { - const excludes: string[] = item.exclude || []; - const excluded = parentExcluded || excludes.includes("WebComponents"); - - if (!excluded && item.href && !item.header) { - entries.push({ - name: item.name || "", - href: item.href, - premium: item.premium === true, - }); - } - - if (Array.isArray(item.items)) { - flatten(item.items, excluded); - } - } - } + const data = JSON.parse(raw) as TocNode[]; - flatten(data, false); - return entries; + // Header nodes are walked so `section` is tracked correctly, but their own + // landing pages have never been exported for the xplat platforms — keeping + // that filter here leaves the exported set unchanged. + return walkTocJson(data, { excludePlatform: "WebComponents" }).filter((e) => !e.landing); } function injectTocMetadata(content: string, entry: TocEntry): string { @@ -138,6 +116,8 @@ function main() { let totalFiles = 0; let skipped = 0; const usedNames = new Map(); + const writtenFiles = new Set(); + const sidecar = new TocSidecar("webcomponents", ROOT); for (const entry of tocEntries) { const href = entry.href.replace(/\\/g, "/"); @@ -157,24 +137,24 @@ function main() { content = injectTocMetadata(content, entry); - let flatName = flattenPath(href); - - if (usedNames.has(flatName)) { - const parts = href.replace(/\\/g, "/").split("/"); - if (parts.length >= 2) { - flatName = `${parts[parts.length - 2]}-${basename(href)}`; - } - if (usedNames.has(flatName)) { - flatName = href.replace(/\//g, "-"); - } + // A cross-listed page appears under two TOC paths. Reuse the name resolved + // the first time so it stays one doc, but still write: injectTocMetadata has + // already run for this entry and last-write-wins is observable in the DB. + let flatName = sidecar.nameFor(href); + if (!flatName) { + flatName = resolveUniqueName(flattenPath(href), href, usedNames); + usedNames.set(flatName, href); } - usedNames.set(flatName, href); const outPath = join(OUTPUT_DIR, flatName); writeFileSync(outPath, content, "utf-8"); + writtenFiles.add(flatName); + sidecar.record(entry, flatName); totalFiles++; } + sidecar.write(writtenFiles); + console.error(`\nDone!`); console.error(` Files exported: ${totalFiles}`); console.error(` Skipped (not found): ${skipped}`); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/frontmatter.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/frontmatter.ts new file mode 100644 index 000000000..ed2b37898 --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/frontmatter.ts @@ -0,0 +1,33 @@ +export interface DocFrontmatter { + component: string; + keywords: string; + summary: string; + premium: boolean; + content: string; +} + +/** Parse the frontmatter a compression run writes at the top of a `docs_final` doc. */ +export function parseFrontmatter(raw: string): DocFrontmatter { + const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---/); + if (!match) return { component: "", keywords: "", summary: "", premium: false, content: raw }; + + const block = match[1]; + let component = ""; + let keywords = ""; + let summary = ""; + let premium = false; + + for (const line of block.split("\n")) { + const m1 = line.match(/^component:\s*(.+)/); + if (m1) component = m1[1].trim(); + const m2 = line.match(/^keywords:\s*(.+)/); + if (m2) keywords = m2[1].trim(); + const m3 = line.match(/^summary:\s*(.+)/); + if (m3) summary = m3[1].trim(); + const m4 = line.match(/^premium:\s*(.+)/); + if (m4) premium = m4[1].trim() === "true"; + } + + const content = raw.slice(match[0].length).replace(/^\r?\n/, ""); + return { component, keywords, summary, premium, content }; +} diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/list-fixtures.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/list-fixtures.ts new file mode 100644 index 000000000..80db839f9 --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/list-fixtures.ts @@ -0,0 +1,69 @@ +import { readFileSync, readdirSync } from "fs"; +import { join, resolve } from "path"; + +/** + * Fixtures shared by the TypeScript renderer tests and the .NET backend tests. + * Both load these rows into an in-memory SQLite database and compare the rendered + * text to `expected.txt` with ordinal equality — that is what keeps the two + * renderers from drifting. + */ +export interface ListFixture { + name: string; + framework: string; + filter?: string; + detail?: "groups" | "docs"; + group?: string; + docs: { + framework: string; + filename: string; + component: string; + toc_name: string | null; + premium?: number; + keywords?: string; + summary?: string; + }[]; + docToc: { + framework: string; + filename: string; + group_key: string; + section: string; + group_label: string; + path: string; + ord: number; + landing?: number; + }[]; + docGroups: { + framework: string; + group_key: string; + section: string; + group_label: string; + summary: string | null; + doc_count: number; + ord: number; + }[]; +} + +export const FIXTURES_DIR = resolve( + import.meta.dirname, + "..", + "..", + "..", + "shared-fixtures", + "list-components" +); + +export function fixtureNames(): string[] { + return readdirSync(FIXTURES_DIR, { withFileTypes: true }) + .filter((e) => e.isDirectory()) + .map((e) => e.name) + .sort(); +} + +export function loadFixture(name: string): ListFixture { + const input = JSON.parse(readFileSync(join(FIXTURES_DIR, name, "input.json"), "utf-8")); + return { name, ...input }; +} + +export function expectedPath(name: string): string { + return join(FIXTURES_DIR, name, "expected.txt"); +} diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/toc-index.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/toc-index.ts new file mode 100644 index 000000000..1b36dfe7b --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/toc-index.ts @@ -0,0 +1,147 @@ +/** + * Shared TOC walker for the documentation exporters. + * + * Both TOC sources (angular's `toc.yml` and the xplat `toc.json`) are arrays of + * nodes with the same shape: `name`, optional `href`, optional `items`, and + * `header: true` for the editorial section dividers. The exporters previously + * flattened these to `{ name, href, premium }` and discarded the tree; this + * walker keeps the structure so docs can be grouped by it. + * + * Derivation rules (normative, see TOC-GROUPING-PLAN.md §4.1): + * + * 1. `section` is the name of the most recent `header: true` node. Headers are + * siblings of the entries they introduce, never ancestors, so a header sets + * `section` and does not push onto `ancestors`. An excluded header still + * updates `section` so later siblings never inherit a stale one. + * 2. `ancestors` is the chain of names from the first node *below* the header + * down to and including the entry itself. A header's own href yields `[]`. + * `path` is that chain prefixed with the section. + * 3. `groupLabel` is decided by the top-level node below the header: if that + * node has children its name labels the whole subtree however deep, + * otherwise the entry sits at section level. Depth alone is not enough — + * `Data Grid` carries both an href and children, so `grid/grid.md` has a + * one-element ancestor chain yet must group with its 44 children. + * 4. `groupKey` is the section, or `"
> "`. + */ + +export interface TocNode { + name?: string; + href?: string; + header?: boolean; + premium?: boolean; + exclude?: string[]; + items?: TocNode[]; +} + +export interface TocEntry { + name: string; + href: string; + section: string; + ancestors: string[]; + groupKey: string; + groupLabel: string; + path: string; + ord: number; + premium: boolean; + landing: boolean; +} + +export interface WalkOptions { + /** + * Platform token filtered on by the xplat `toc.json` (`"Angular"`, `"React"`, + * `"Blazor"`, `"WebComponents"`). Omitted for `toc.yml`, which has no + * `exclude` entries. + */ + excludePlatform?: string; +} + +export function buildGroupKey(section: string, groupLabel: string): string { + return groupLabel ? `${section} > ${groupLabel}` : section; +} + +function buildPath(section: string, ancestors: string[]): string { + return [section, ...ancestors].filter((p) => p !== "").join(" > "); +} + +function walk(nodes: TocNode[], opts: WalkOptions): TocEntry[] { + const entries: TocEntry[] = []; + const platform = opts.excludePlatform; + let section = ""; + let ord = 0; + + const emit = ( + node: TocNode, + ancestors: string[], + groupLabel: string, + landing: boolean + ) => { + entries.push({ + name: node.name || "", + href: node.href!, + section, + ancestors, + groupKey: buildGroupKey(section, groupLabel), + groupLabel, + path: buildPath(section, ancestors), + ord: ord++, + premium: node.premium === true, + landing, + }); + }; + + const visit = ( + items: TocNode[], + ancestors: string[], + groupLabel: string | undefined, + parentExcluded: boolean + ) => { + for (const node of items) { + const excluded = + parentExcluded || + (platform !== undefined && Array.isArray(node.exclude) && node.exclude.includes(platform)); + + if (node.header === true) { + // Rule 1 — update the section even when excluded, then reset the + // ancestor chain: a header is a divider, not a parent. + section = node.name || ""; + if (!excluded && node.href) { + emit(node, [], "", true); + } + if (Array.isArray(node.items)) { + visit(node.items, [], undefined, excluded); + } + continue; + } + + const nodeAncestors = [...ancestors, node.name || ""]; + // Rule 3 — the label is fixed by the top-level node below the header and + // then inherited unchanged; `undefined` marks "not yet decided". + const label = + groupLabel !== undefined + ? groupLabel + : Array.isArray(node.items) && node.items.length > 0 + ? node.name || "" + : ""; + + if (!excluded && node.href) { + emit(node, nodeAncestors, label, false); + } + if (Array.isArray(node.items)) { + visit(node.items, nodeAncestors, label, excluded); + } + } + }; + + visit(nodes, [], undefined, false); + return entries; +} + +/** Walk a parsed `toc.yml` (angular). */ +export function walkTocYaml(nodes: TocNode[], opts: WalkOptions = {}): TocEntry[] { + return walk(nodes, opts); +} + +/** Walk a parsed `toc.json` (xplat), honouring per-platform `exclude`. */ +export function walkTocJson(nodes: TocNode[], opts: WalkOptions = {}): TocEntry[] { + return walk(nodes, opts); +} diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/toc-sidecar.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/toc-sidecar.ts new file mode 100644 index 000000000..3974d8f0a --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/lib/toc-sidecar.ts @@ -0,0 +1,149 @@ +import { mkdirSync, renameSync, rmSync, writeFileSync } from "fs"; +import { basename, dirname, join, resolve } from "path"; +import type { TocEntry } from "./toc-index.js"; + +/** + * One membership of a doc in the documentation TOC. A record always corresponds + * to a file the exporter actually wrote — there are no metadata-only records. + * A cross-listed page (reachable from two TOC paths) produces two records that + * share `file` and differ in `path`. + */ +export interface TocSidecarRecord { + file: string; + section: string; + groupKey: string; + groupLabel: string; + path: string; + ord: number; + landing: boolean; + /** + * Display-only, written by the exporter. A sidecar round-tripped from the + * committed DB (`restore-docs-final.ts --toc-stubs`, for a framework a CI run + * did not rebuild) cannot supply these, so ingestion must not require them. + */ + href?: string; + name?: string; + premium?: boolean; +} + +/** + * Accumulates sidecar records in memory and replaces `dist/toc-index/.json` + * atomically at the end of an export run. + * + * The file must be replaced rather than merged: `clear:build` deliberately does + * not reach `dist/toc-index/`, so a merged sidecar would keep resurrecting + * memberships for TOC entries that have since been deleted, renamed, or newly + * excluded for a platform — docs would vanish from the docs site but keep + * appearing under their old group in `list_components`. + */ +export class TocSidecar { + private records: TocSidecarRecord[] = []; + private files = new Set(); + private hrefNames = new Map(); + private outPath: string; + + constructor(framework: string, root: string) { + this.outPath = join(resolve(root), "dist", "toc-index", `${framework}.json`); + } + + /** Flat name already resolved for this href, if it has been seen before. */ + nameFor(href: string): string | undefined { + return this.hrefNames.get(href); + } + + record(entry: TocEntry, file: string): void { + this.hrefNames.set(entry.href, file); + this.files.add(file); + this.records.push({ + file, + href: entry.href, + name: entry.name, + section: entry.section, + groupKey: entry.groupKey, + groupLabel: entry.groupLabel, + path: entry.path, + ord: entry.ord, + premium: entry.premium, + landing: entry.landing, + }); + } + + get recordCount(): number { + return this.records.length; + } + + get fileCount(): number { + return this.files.size; + } + + /** + * @param writtenFiles distinct output filenames the export loop produced. + * Asserted equal to the sidecar's distinct files so a record can never + * describe a doc that is not in `docs_processing`, or vice versa. + */ + write(writtenFiles: Set): void { + if (writtenFiles.size !== this.files.size) { + throw new Error( + `TOC sidecar mismatch: ${this.files.size} distinct recorded file(s) but ` + + `${writtenFiles.size} distinct file(s) written.` + ); + } + for (const f of writtenFiles) { + if (!this.files.has(f)) { + throw new Error(`TOC sidecar mismatch: ${f} was written but not recorded.`); + } + } + + mkdirSync(dirname(this.outPath), { recursive: true }); + const tmp = `${this.outPath}.tmp`; + try { + writeFileSync(tmp, `${JSON.stringify(this.records, null, 2)}\n`, "utf-8"); + renameSync(tmp, this.outPath); + } catch (err) { + rmSync(tmp, { force: true }); + throw err; + } + console.error(` TOC sidecar: ${this.records.length} record(s) -> ${this.outPath}`); + } +} + +/** + * Pick a flat filename that is not already taken. + * + * The previous implementation tried two fixed candidates and used the second + * unconditionally, silently overwriting another doc when it was also taken. + * Candidates are tried in the old order — flattened, `parent-file`, then the + * full href — and only then fall back to a numeric suffix, so names produced + * today do not change. + */ +export function resolveUniqueName( + flatName: string, + href: string, + usedNames: Map +): string { + const normalized = href.replace(/\\/g, "/"); + const parts = normalized.split("/"); + + const candidates = [flatName]; + if (parts.length >= 2) { + candidates.push(`${parts[parts.length - 2]}-${basename(normalized)}`); + } + candidates.push(normalized.replace(/\//g, "-")); + + for (const candidate of candidates) { + if (!usedNames.has(candidate)) return candidate; + } + + const ext = flatName.endsWith(".md") ? ".md" : ""; + const stem = ext ? flatName.slice(0, -ext.length) : flatName; + for (let n = 2; ; n++) { + const candidate = `${stem}-${n}${ext}`; + if (!usedNames.has(candidate)) { + console.error( + `[WARN] Filename collision for "${href}" — falling back to "${candidate}". ` + + `A TOC restructure may have changed doc identities.` + ); + return candidate; + } + } +} diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/report-toc-coverage.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/report-toc-coverage.ts new file mode 100644 index 000000000..28538db4e --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/report-toc-coverage.ts @@ -0,0 +1,105 @@ +import Database from "better-sqlite3"; +import * as fs from "fs"; +import * as path from "path"; + +const FRAMEWORKS = ["angular", "react", "blazor", "webcomponents"]; +const DEFAULT_DB = path.resolve("db", "igniteui-docs.db"); + +interface Row { + framework: string; + docs: number; + covered: number; + memberships: number; + sections: number; + groups: number; + crossListed: number; + noSummary: number; +} + +function report(dbPath: string, frameworks: string[]): Row[] { + const db = new Database(dbPath, { readonly: true }); + try { + const grouped = + db.prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name IN ('doc_toc','doc_groups')`) + .all().length === 2; + if (!grouped) { + console.error(`${dbPath} has no doc_toc/doc_groups tables — nothing to report.`); + process.exit(1); + } + + return frameworks.map((framework) => { + const one = (sql: string) => Number((db.prepare(sql).get(framework) as any)?.n ?? 0); + return { + framework, + docs: one(`SELECT COUNT(*) n FROM docs WHERE framework = ?`), + covered: one(` + SELECT COUNT(*) n FROM docs d WHERE d.framework = ? + AND EXISTS (SELECT 1 FROM doc_toc t WHERE t.framework = d.framework AND t.filename = d.filename)`), + memberships: one(`SELECT COUNT(*) n FROM doc_toc WHERE framework = ?`), + sections: one(`SELECT COUNT(DISTINCT section) n FROM doc_toc WHERE framework = ?`), + groups: one(`SELECT COUNT(*) n FROM doc_groups WHERE framework = ?`), + crossListed: one(` + SELECT COUNT(*) n FROM ( + SELECT filename FROM doc_toc WHERE framework = ? + GROUP BY filename HAVING COUNT(DISTINCT group_key) > 1)`), + noSummary: one(` + SELECT COUNT(*) n FROM doc_groups WHERE framework = ? AND (summary IS NULL OR summary = '')`), + }; + }); + } finally { + db.close(); + } +} + +function main() { + const args = process.argv.slice(2); + const arg = (name: string) => { + const i = args.indexOf(name); + return i !== -1 ? args[i + 1] : undefined; + }; + + const dbPath = path.resolve(arg("--db") ?? DEFAULT_DB); + if (!fs.existsSync(dbPath)) { + console.error(`Database not found: ${dbPath}`); + process.exit(1); + } + + const target = arg("--framework"); + if (target && !FRAMEWORKS.includes(target)) { + console.error(`Unknown framework: ${target}. Valid: ${FRAMEWORKS.join(", ")}`); + process.exit(1); + } + + const rows = report(dbPath, target ? [target] : FRAMEWORKS); + const cols: [string, (r: Row) => string | number][] = [ + ["framework", (r) => r.framework], + ["docs", (r) => r.docs], + ["uncovered", (r) => r.docs - r.covered], + ["memberships", (r) => r.memberships], + ["sections", (r) => r.sections], + ["groups", (r) => r.groups], + ["cross-listed", (r) => r.crossListed], + ["no summary", (r) => r.noSummary], + ]; + + const widths = cols.map(([head, get]) => + Math.max(head.length, ...rows.map((r) => String(get(r)).length)) + ); + const row = (cells: (string | number)[]) => + cells.map((c, i) => (i === 0 ? String(c).padEnd(widths[i]) : String(c).padStart(widths[i]))).join(" "); + + console.log(row(cols.map(([h]) => h))); + for (const r of rows) console.log(row(cols.map(([, get]) => get(r)))); + + const uncovered = rows.filter((r) => r.docs !== r.covered); + if (uncovered.length > 0) { + console.error( + `\n${uncovered.length} framework(s) have docs with no TOC group: ` + + uncovered.map((r) => `${r.framework} (${r.docs - r.covered})`).join(", ") + ); + process.exit(1); + } + console.log(`\nCoverage is complete for ${rows.length} framework(s).`); +} + +main(); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/restore-docs-final.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/restore-docs-final.ts index a43ea81af..676a27a6b 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/restore-docs-final.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/restore-docs-final.ts @@ -23,6 +23,7 @@ import * as path from "path"; const FRAMEWORKS = ["angular", "react", "blazor", "webcomponents"]; const DOCS_FINAL_DIR = path.resolve("dist", "docs_final"); const DOCS_PREPARED_DIR = path.resolve("dist", "docs_prepeared"); +const TOC_INDEX_DIR = path.resolve("dist", "toc-index"); const DEFAULT_DB = path.resolve("db", "igniteui-docs.db"); interface DocRow { @@ -52,6 +53,52 @@ function buildDoc(row: DocRow): string { return `${lines.join("\n")}\n${row.content}`; } +/** + * Rebuild dist/toc-index/.json from the committed DB's own doc_toc rows. + * + * Re-deriving it from a TOC would mean checking out a submodule this run never + * touched; round-tripping keeps a non-rebuilt framework's groups exactly as they + * were published. Only the columns build-db ingests are available here — the + * exporter's display-only fields are absent by design. + */ +function restoreSidecar(db: Database.Database, framework: string): number | null { + const hasDocToc = + db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = 'doc_toc'").get() !== undefined; + if (!hasDocToc) return null; + + const rows = db + .prepare( + "SELECT filename, group_key, section, group_label, path, ord, landing FROM doc_toc WHERE framework = ? ORDER BY ord" + ) + .all(framework) as { + filename: string; + group_key: string; + section: string; + group_label: string; + path: string; + ord: number; + landing: number; + }[]; + if (rows.length === 0) return 0; + + const records = rows.map((r) => ({ + file: r.filename, + section: r.section, + groupKey: r.group_key, + groupLabel: r.group_label, + path: r.path, + ord: r.ord, + landing: r.landing === 1 + })); + + fs.mkdirSync(TOC_INDEX_DIR, { recursive: true }); + const out = path.join(TOC_INDEX_DIR, `${framework}.json`); + const tmp = `${out}.tmp`; + fs.writeFileSync(tmp, `${JSON.stringify(records, null, 2)}\n`, "utf-8"); + fs.renameSync(tmp, out); + return records.length; +} + function main(): void { const args = process.argv.slice(2); @@ -104,6 +151,17 @@ function main(): void { grandTotal += rows.length; console.log(` ${fw}: ${rows.length} docs restored to dist/docs_final/${fw}/${tocStubs ? " (+ toc stubs)" : ""}`); + + if (tocStubs) { + const memberships = restoreSidecar(db, fw); + if (memberships === null) { + console.warn(` [warn] ${fw}: ${path.basename(dbPath)} has no doc_toc table — no sidecar restored`); + } else if (memberships === 0) { + console.warn(` [warn] ${fw}: no doc_toc rows in ${path.basename(dbPath)} — no sidecar restored`); + } else { + console.log(` ${fw}: ${memberships} TOC membership(s) restored to dist/toc-index/${fw}.json`); + } + } } db.close(); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/validate-package.ts b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/validate-package.ts index 68bb7ed7a..37d0a54ee 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/scripts/validate-package.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/scripts/validate-package.ts @@ -1,3 +1,4 @@ +import Database from "better-sqlite3"; import { readdirSync, readFileSync, statSync, existsSync } from "fs"; import { join, resolve } from "path"; import { fileURLToPath } from "url"; @@ -6,6 +7,7 @@ const PKG_ROOT = resolve(fileURLToPath(new URL("..", import.meta.url))); const DB_PATH = join(PKG_ROOT, "dist", "igniteui-docs.db"); const DB_MIN_BYTES = 20 * 1024 * 1024; // 20 MB minimum for the SQLite DB const DOCS_ROOT = join(PKG_ROOT, "docs"); +const FRAMEWORKS = ["angular", "react", "blazor", "webcomponents"]; const FRAMEWORK_DIRS = ["angular-api", "react-api", "webcomponents-api", "blazor-api"]; const FRAMEWORK_MIN_BYTES = 300 * 1024; // 300 KB minimum for each docs/-api directory @@ -86,6 +88,71 @@ if (!existsSync(DB_PATH)) { } else { console.log(`OK db ${formatSize(size)} ${DB_PATH}`); } + validateGrouping(DB_PATH); +} + +/** + * The shipped DB must be fully grouped. A NULL group summary is a valid + * development state — Phase 2 and the renderer both tolerate it — but shipping + * one means the index arrives as bare headings and name lists, and nothing else + * in the pipeline would complain. + */ +function validateGrouping(dbPath: string): void { + const db = new Database(dbPath, { readonly: true }); + try { + const tables = db + .prepare(`SELECT name FROM sqlite_master WHERE type = 'table' AND name IN ('doc_toc', 'doc_groups')`) + .all() as { name: string }[]; + if (tables.length !== 2) { + errors.push(`DB is not grouped: doc_toc/doc_groups missing — run build:db`); + return; + } + + for (const framework of FRAMEWORKS) { + const { cnt } = db + .prepare(`SELECT COUNT(*) AS cnt FROM doc_toc WHERE framework = ?`) + .get(framework) as { cnt: number }; + if (cnt === 0) errors.push(`DB has no TOC groups for ${framework}`); + } + + const uncovered = db.prepare(` + SELECT framework, filename FROM docs d + WHERE NOT EXISTS ( + SELECT 1 FROM doc_toc t WHERE t.framework = d.framework AND t.filename = d.filename + ) LIMIT 5 + `).all() as { framework: string; filename: string }[]; + if (uncovered.length > 0) { + errors.push( + `DB has docs with no TOC group, e.g. ` + + uncovered.map((r) => `${r.framework}/${r.filename}`).join(", ") + ); + } + + const nullToc = db + .prepare(`SELECT framework, COUNT(*) AS cnt FROM docs WHERE toc_name IS NULL GROUP BY framework`) + .all() as { framework: string; cnt: number }[]; + if (nullToc.length > 0) { + errors.push(`DB has NULL toc_name rows: ${nullToc.map((r) => `${r.framework}=${r.cnt}`).join(", ")}`); + } + + const noSummary = db.prepare(` + SELECT framework, group_key FROM doc_groups + WHERE summary IS NULL OR summary = '' LIMIT 5 + `).all() as { framework: string; group_key: string }[]; + if (noSummary.length > 0) { + errors.push( + `DB has groups with no summary — run build:group-summaries: ` + + noSummary.map((r) => `${r.framework}/${r.group_key}`).join(", ") + ); + } + + if (errors.length === 0) { + const { groups } = db.prepare(`SELECT COUNT(*) AS groups FROM doc_groups`).get() as { groups: number }; + console.log(`OK toc ${String(groups).padStart(10)} groups across ${FRAMEWORKS.length} frameworks`); + } + } finally { + db.close(); + } } for (const framework of FRAMEWORK_DIRS) { diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/providers/LocalDocsProvider.list.test.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/providers/LocalDocsProvider.list.test.ts new file mode 100644 index 000000000..e08f3c97a --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/providers/LocalDocsProvider.list.test.ts @@ -0,0 +1,222 @@ +import { mkdtempSync, readFileSync, rmSync, writeFileSync } from "fs"; +import { createRequire } from "module"; +import { tmpdir } from "os"; +import { join } from "path"; +import initSqlJs from "sql.js"; +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { LocalDocsProvider } from "../../providers/LocalDocsProvider.js"; + +const require = createRequire(import.meta.url); + +interface Doc { + framework: string; + filename: string; + component: string; + toc_name: string; + premium?: number; + keywords?: string; + summary?: string; +} + +interface Membership { + framework: string; + filename: string; + group_key: string; + section: string; + group_label: string; + path: string; + ord: number; +} + +const DOCS: Doc[] = [ + { framework: "angular", filename: "grid-grid.md", component: "IgxGridComponent", toc_name: "Data Grid", summary: "The grid." }, + { framework: "angular", filename: "grid-sorting.md", component: "IgxGridComponent", toc_name: "Sorting", summary: "Sort rows.", premium: 1 }, + { framework: "angular", filename: "accordion.md", component: "IgxAccordionComponent", toc_name: "Accordion", summary: "Panels." }, + { framework: "angular", filename: "excel-utility.md", component: "IgxExcelUtility", toc_name: "Excel Utility", summary: "Excel helpers." }, + { framework: "react", filename: "grid-editing.md", component: "IgrGrid", toc_name: "Editing", summary: "Edit cells." }, +]; + +const MEMBERSHIPS: Membership[] = [ + { framework: "angular", filename: "grid-grid.md", group_key: "Grids & Lists > Data Grid", section: "Grids & Lists", group_label: "Data Grid", path: "Grids & Lists > Data Grid", ord: 0 }, + { framework: "angular", filename: "grid-sorting.md", group_key: "Grids & Lists > Data Grid", section: "Grids & Lists", group_label: "Data Grid", path: "Grids & Lists > Data Grid > Sorting", ord: 1 }, + { framework: "angular", filename: "excel-utility.md", group_key: "Grids & Lists > Data Grid", section: "Grids & Lists", group_label: "Data Grid", path: "Grids & Lists > Data Grid > Excel", ord: 2 }, + { framework: "angular", filename: "accordion.md", group_key: "Layouts", section: "Layouts", group_label: "", path: "Layouts > Accordion", ord: 3 }, + { framework: "angular", filename: "excel-utility.md", group_key: "Frameworks > Excel Library", section: "Frameworks", group_label: "Excel Library", path: "Frameworks > Excel Library > Excel Utility", ord: 4 }, +]; + +let SQL: Awaited>; +let dir: string; + +/** Build a fixture DB on disk; `frameworksWithToc` selects which get grouping rows. */ +function makeDb(name: string, opts: { toc: boolean; frameworksWithToc?: string[] }): string { + const db = new SQL.Database(); + db.run(`CREATE TABLE docs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, framework TEXT NOT NULL, filename TEXT NOT NULL, + component TEXT NOT NULL, toc_name TEXT, premium INTEGER DEFAULT 0, keywords TEXT, + summary TEXT, content TEXT NOT NULL, UNIQUE(framework, filename))`); + for (const d of DOCS) { + db.run( + `INSERT INTO docs (framework, filename, component, toc_name, premium, keywords, summary, content) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, + [d.framework, d.filename, d.component, d.toc_name, d.premium ?? 0, d.keywords ?? "", d.summary ?? "", "body"] + ); + } + + if (opts.toc) { + const keep = opts.frameworksWithToc ?? ["angular", "react"]; + db.run(`CREATE TABLE doc_toc (framework TEXT NOT NULL, filename TEXT NOT NULL, + group_key TEXT NOT NULL, section TEXT NOT NULL, group_label TEXT NOT NULL DEFAULT '', + path TEXT NOT NULL, ord INTEGER NOT NULL, landing INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (framework, filename, path))`); + db.run(`CREATE TABLE doc_groups (framework TEXT NOT NULL, group_key TEXT NOT NULL, + section TEXT NOT NULL, group_label TEXT NOT NULL DEFAULT '', summary TEXT, + doc_count INTEGER NOT NULL, ord INTEGER NOT NULL, PRIMARY KEY (framework, group_key))`); + + for (const m of MEMBERSHIPS.filter((m) => keep.includes(m.framework))) { + db.run( + `INSERT INTO doc_toc (framework, filename, group_key, section, group_label, path, ord, landing) + VALUES (?, ?, ?, ?, ?, ?, ?, 0)`, + [m.framework, m.filename, m.group_key, m.section, m.group_label, m.path, m.ord] + ); + } + db.run(`INSERT INTO doc_groups (framework, group_key, section, group_label, summary, doc_count, ord) + SELECT framework, group_key, MIN(section), MIN(group_label), NULL, + COUNT(DISTINCT filename), MIN(ord) + FROM doc_toc GROUP BY framework, group_key`); + db.run(`UPDATE doc_groups SET summary = 'Sorting, filtering, editing.' + WHERE group_key = 'Grids & Lists > Data Grid'`); + } + + const file = join(dir, name); + writeFileSync(file, Buffer.from(db.export())); + db.close(); + return file; +} + +async function provider(path: string): Promise { + const p = new LocalDocsProvider(path); + await p.init(); + return p; +} + +/** The renderer as it stood before grouping, used to prove flat mode is untouched. */ +function legacyFlat(framework: string, filter?: string): string { + const like = filter?.toLowerCase(); + const rows = DOCS.filter( + (d) => + d.framework === framework && + (!like || + [d.filename, d.component, d.toc_name, d.keywords ?? "", d.summary ?? ""].some((v) => + v.toLowerCase().includes(like) + )) + ).sort((a, b) => (a.toc_name < b.toc_name ? -1 : a.toc_name > b.toc_name ? 1 : 0)); + + if (rows.length === 0) { + return `No components found for framework "${framework}"${filter ? ` matching "${filter}"` : ""}.`; + } + const lines = rows.map((r) => { + const name = r.filename.replace(/\.md$/, ""); + const parts = [`- **${r.toc_name || name}** (\`${name}\`)`]; + if (r.summary) parts.push(` ${r.summary}`); + if (r.premium) parts.push(` ⭐ Premium`); + return parts.join("\n"); + }); + return `Found ${rows.length} components for **${framework}**${filter ? ` matching "${filter}"` : ""}:\n\n${lines.join("\n")}`; +} + +beforeAll(async () => { + const wasm = readFileSync(require.resolve("sql.js/dist/sql-wasm.wasm")); + SQL = await initSqlJs({ + wasmBinary: wasm.buffer.slice(wasm.byteOffset, wasm.byteOffset + wasm.byteLength), + }); + dir = mkdtempSync(join(tmpdir(), "local-docs-")); +}); + +afterAll(() => rmSync(dir, { recursive: true, force: true })); + +describe("LocalDocsProvider.listComponents — back-compat guard", () => { + it("renders flat against a legacy-schema DB", async () => { + const p = await provider(makeDb("legacy.db", { toc: false })); + expect(await p.listComponents("angular")).toBe(legacyFlat("angular")); + }); + + it("renders flat for a framework that has no doc_toc rows yet", async () => { + const p = await provider(makeDb("mixed.db", { toc: true, frameworksWithToc: ["angular"] })); + expect(await p.listComponents("react")).toBe(legacyFlat("react")); + expect(await p.listComponents("angular")).toContain("## Grids & Lists > Data Grid"); + }); +}); + +describe("LocalDocsProvider.listComponents — grouped modes", () => { + let p: LocalDocsProvider; + beforeAll(async () => { + p = await provider(makeDb("migrated.db", { toc: true })); + }); + + it("groups by default and counts a cross-listed doc once overall", async () => { + const out = await p.listComponents("angular"); + expect(out).toContain("Found 4 component doc(s) for **angular** in 3 group(s)"); + expect(out).toContain("## Grids & Lists > Data Grid (3)"); + expect(out).toContain("## Frameworks > Excel Library (1)"); + expect(out).toContain("Sorting, filtering, editing."); + }); + + it("drills into one group in TOC order", async () => { + const out = await p.listComponents("angular", { group: "Grids & Lists > Data Grid" }); + expect(out).toContain("Found 3 component doc(s) in **angular** > Grids & Lists > Data Grid"); + expect(out.indexOf("grid-grid")).toBeLessThan(out.indexOf("grid-sorting")); + }); + + it("answers an unknown group with the valid keys", async () => { + const out = await p.listComponents("angular", { group: "Nope" }); + expect(out).toContain('No group "Nope"'); + expect(out).toContain("- Layouts"); + }); + + it("lets a filter match a group name", async () => { + const out = await p.listComponents("angular", { filter: "Excel Library" }); + expect(out).toContain("## Frameworks > Excel Library (1)"); + expect(out).not.toContain("## Layouts"); + }); + + it("narrows within a group when filter and group are combined", async () => { + const out = await p.listComponents("angular", { + group: "Grids & Lists > Data Grid", + filter: "sort", + }); + expect(out).toContain("Found 1 component doc(s)"); + expect(out).toContain("grid-sorting"); + }); +}); + +describe("LocalDocsProvider.listComponents — flat mode fidelity", () => { + it("is byte-identical to the pre-grouping output on a migrated DB", async () => { + const p = await provider(makeDb("migrated2.db", { toc: true })); + expect(await p.listComponents("angular", { detail: "docs" })).toBe(legacyFlat("angular")); + expect(await p.listComponents("angular", { detail: "docs", filter: "grid" })).toBe( + legacyFlat("angular", "grid") + ); + }); + + it("emits a cross-listed doc once, and never matches a group name", async () => { + const p = await provider(makeDb("migrated3.db", { toc: true })); + const out = await p.listComponents("angular", { detail: "docs" }); + expect(out.match(/\(`excel-utility`\)/g)).toHaveLength(1); + expect(await p.listComponents("angular", { detail: "docs", filter: "Excel Library" })).toBe( + legacyFlat("angular", "Excel Library") + ); + }); + + it("restricts a flat listing to a group's members without joining", async () => { + const p = await provider(makeDb("migrated4.db", { toc: true })); + const out = await p.listComponents("angular", { + detail: "docs", + group: "Grids & Lists > Data Grid", + }); + expect(out).toContain("Found 3 components for **angular**"); + expect(out).not.toContain("accordion"); + // Flat order stays ORDER BY toc_name — Data Grid, Excel Utility, Sorting. + expect(out.indexOf("(`grid-grid`)")).toBeLessThan(out.indexOf("(`excel-utility`)")); + expect(out.indexOf("(`excel-utility`)")).toBeLessThan(out.indexOf("(`grid-sorting`)")); + }); +}); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/providers/RemoteDocsProvider.test.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/providers/RemoteDocsProvider.test.ts index 977d6bd2c..15fbbe1ae 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/providers/RemoteDocsProvider.test.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/providers/RemoteDocsProvider.test.ts @@ -40,13 +40,28 @@ describe('RemoteDocsProvider', () => { vi.stubGlobal('fetch', fetch); const provider = new RemoteDocsProvider(BACKEND_URL); - await provider.listComponents('angular', 'grid'); + await provider.listComponents('angular', { filter: 'grid' }); const url = new URL(fetch.mock.calls[0][0]); expect(url.searchParams.get('filter')).toBe('grid'); }); - it('omits filter param when not provided', async () => { + it('forwards group and detail params', async () => { + const fetch = mockFetch(200, '- IgxGrid'); + vi.stubGlobal('fetch', fetch); + + const provider = new RemoteDocsProvider(BACKEND_URL); + await provider.listComponents('angular', { + group: 'Grids & Lists > Data Grid', + detail: 'docs', + }); + + const url = new URL(fetch.mock.calls[0][0]); + expect(url.searchParams.get('group')).toBe('Grids & Lists > Data Grid'); + expect(url.searchParams.get('detail')).toBe('docs'); + }); + + it('omits filter, group and detail params when not provided', async () => { const fetch = mockFetch(200, ''); vi.stubGlobal('fetch', fetch); @@ -55,6 +70,8 @@ describe('RemoteDocsProvider', () => { const url = new URL(fetch.mock.calls[0][0]); expect(url.searchParams.has('filter')).toBe(false); + expect(url.searchParams.has('group')).toBe(false); + expect(url.searchParams.has('detail')).toBe(false); }); it('throws when backend returns a non-ok status', async () => { diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/build-db.test.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/build-db.test.ts new file mode 100644 index 000000000..5a344068c --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/build-db.test.ts @@ -0,0 +1,341 @@ +import { spawnSync } from "child_process"; +import { createHash } from "crypto"; +import { cpSync, existsSync, mkdirSync, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from "fs"; +import { tmpdir } from "os"; +import { dirname, join, resolve } from "path"; +import { fileURLToPath } from "url"; +import { afterEach, describe, expect, it } from "vitest"; + +/** + * Drives scripts/build-db.ts against a throwaway working directory. This is the + * destructive path — it drops tables, deletes rows and republishes a committed + * artifact — so the failure modes are exercised here rather than for the first + * time during a release. + */ +const PKG_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..", "..", ".."); +const REPO_ROOT = resolve(PKG_ROOT, "..", "..", ".."); +const TSX = join(REPO_ROOT, "node_modules", "tsx", "dist", "cli.mjs"); +const BUILD_DB = join(PKG_ROOT, "scripts", "build-db.ts"); +const FRAMEWORKS = ["angular", "react", "blazor", "webcomponents"]; + +const dirs: string[] = []; +afterEach(() => { + while (dirs.length) rmSync(dirs.pop()!, { recursive: true, force: true }); +}); + +interface DocSpec { + file: string; + prepared?: boolean; + tocName?: string | null; + groups?: string[]; +} + +function docsFor(framework: string): DocSpec[] { + return [ + { file: `${framework}-a.md`, groups: ["Grids & Lists > Data Grid"] }, + { file: `${framework}-b.md`, groups: ["Layouts"] }, + ]; +} + +/** Lay out dist/docs_final, dist/docs_prepeared and dist/toc-index for a framework. */ +function seedFramework(root: string, framework: string, specs: DocSpec[]): void { + const finalDir = join(root, "dist", "docs_final", framework); + const prepDir = join(root, "dist", "docs_prepeared", framework); + // Replace, never merge — a leftover prepared doc from an earlier call would + // mask exactly the missing-input cases these tests exist to cover. + rmSync(finalDir, { recursive: true, force: true }); + rmSync(prepDir, { recursive: true, force: true }); + mkdirSync(finalDir, { recursive: true }); + mkdirSync(prepDir, { recursive: true }); + + const records: unknown[] = []; + let ord = 0; + + for (const spec of specs) { + writeFileSync( + join(finalDir, spec.file), + `---\ncomponent: IgxThing\nkeywords: k\nsummary: Summary for ${spec.file}\n---\n\n# ${spec.file}\n`, + "utf-8" + ); + if (spec.prepared !== false) { + const tocName = spec.tocName === undefined ? spec.file.replace(/\.md$/, "") : spec.tocName; + writeFileSync( + join(prepDir, spec.file), + tocName === null ? `---\ncomponent: IgxThing\n---\n` : `---\n_tocName: ${tocName}\n---\n`, + "utf-8" + ); + } + for (const groupKey of spec.groups ?? []) { + const [section, label] = groupKey.includes(" > ") ? groupKey.split(" > ") : [groupKey, ""]; + records.push({ + file: spec.file, + section, + groupKey, + groupLabel: label, + path: `${groupKey} > ${spec.file}`, + ord: ord++, + landing: false, + }); + } + } + + const tocDir = join(root, "dist", "toc-index"); + mkdirSync(tocDir, { recursive: true }); + writeFileSync(join(tocDir, `${framework}.json`), `${JSON.stringify(records, null, 2)}\n`, "utf-8"); +} + +function makeRoot(overrides: Record = {}): string { + const root = mkdtempSync(join(tmpdir(), "build-db-")); + dirs.push(root); + for (const framework of FRAMEWORKS) { + seedFramework(root, framework, overrides[framework] ?? docsFor(framework)); + } + return root; +} + +function run(root: string, args: string[] = []) { + return spawnSync(process.execPath, [TSX, BUILD_DB, ...args], { + cwd: root, + encoding: "utf-8", + env: { ...process.env, NO_COLOR: "1" }, + }); +} + +function hash(file: string): string { + return createHash("sha256").update(readFileSync(file)).digest("hex"); +} + +function tmpResidue(root: string): string[] { + const out: string[] = []; + for (const dir of [join(root, "dist"), join(root, "db")]) { + if (!existsSync(dir)) continue; + for (const name of readdirSync(dir)) { + if (name.endsWith(".tmp") || name.endsWith("-wal") || name.endsWith("-shm")) out.push(name); + } + } + return out; +} + +describe("build-db — happy path", () => { + it("publishes to dist/ and db/ and leaves no residue", () => { + const root = makeRoot(); + const result = run(root); + + expect(result.status, result.stderr).toBe(0); + expect(existsSync(join(root, "dist", "igniteui-docs.db"))).toBe(true); + expect(existsSync(join(root, "db", "igniteui-docs.db"))).toBe(true); + expect(hash(join(root, "dist", "igniteui-docs.db"))).toBe(hash(join(root, "db", "igniteui-docs.db"))); + expect(tmpResidue(root)).toEqual([]); + }); + + it("rebuilds one framework incrementally, seeding from db/", () => { + const root = makeRoot(); + expect(run(root).status).toBe(0); + + // Change one framework's docs and rebuild only it. + seedFramework(root, "react", [ + ...docsFor("react"), + { file: "react-c.md", groups: ["Layouts"] }, + ]); + const result = run(root, ["--framework", "react"]); + + expect(result.status, result.stderr).toBe(0); + expect(result.stdout).toContain("react: 3 docs inserted"); + expect(result.stdout).not.toContain("angular:"); + expect(tmpResidue(root)).toEqual([]); + }); +}); + +describe("build-db — full-rebuild preflight", () => { + const cases: [string, (root: string) => void, RegExp][] = [ + [ + "a framework with no compressed docs", + (root) => rmSync(join(root, "dist", "docs_final", "blazor"), { recursive: true, force: true }), + /docs_final\/blazor/, + ], + [ + "a framework with no prepared docs", + (root) => rmSync(join(root, "dist", "docs_prepeared", "react"), { recursive: true, force: true }), + /docs_prepeared\/react/, + ], + [ + "a framework with no TOC sidecar", + (root) => rmSync(join(root, "dist", "toc-index", "webcomponents.json"), { force: true }), + /toc-index\/webcomponents\.json/, + ], + ]; + + for (const [label, breakInputs, expected] of cases) { + it(`aborts on ${label} and leaves the committed DB untouched`, () => { + const root = makeRoot(); + expect(run(root).status).toBe(0); // publish a good committed DB first + + const before = hash(join(root, "db", "igniteui-docs.db")); + breakInputs(root); + const result = run(root); + + expect(result.status).not.toBe(0); + expect(result.stderr).toMatch(/Preflight failed/); + expect(result.stderr).toMatch(expected); + expect(hash(join(root, "db", "igniteui-docs.db"))).toBe(before); + expect(tmpResidue(root)).toEqual([]); + }); + } +}); + +describe("build-db — validation gates", () => { + it("rolls back and preserves the artifacts when a doc has no TOC group", () => { + const root = makeRoot(); + expect(run(root).status).toBe(0); + const before = hash(join(root, "db", "igniteui-docs.db")); + const distBefore = hash(join(root, "dist", "igniteui-docs.db")); + + // A doc present in docs_final but absent from the sidecar. + seedFramework(root, "angular", [ + ...docsFor("angular"), + { file: "angular-orphan.md", groups: [] }, + ]); + + const result = run(root, ["--framework", "angular"]); + expect(result.status).not.toBe(0); + expect(result.stderr).toMatch(/no TOC group/); + expect(result.stderr).toContain("angular/angular-orphan.md"); + expect(hash(join(root, "db", "igniteui-docs.db"))).toBe(before); + expect(hash(join(root, "dist", "igniteui-docs.db"))).toBe(distBefore); + expect(tmpResidue(root)).toEqual([]); + }); + + it("rolls back on a NULL toc_name rather than warning past it", () => { + const root = makeRoot(); + expect(run(root).status).toBe(0); + const before = hash(join(root, "db", "igniteui-docs.db")); + + seedFramework(root, "blazor", [ + { file: "blazor-a.md", groups: ["Layouts"], tocName: null }, + { file: "blazor-b.md", groups: ["Layouts"] }, + ]); + + const result = run(root, ["--framework", "blazor"]); + expect(result.status).not.toBe(0); + expect(result.stderr).toMatch(/NULL toc_name/); + expect(hash(join(root, "db", "igniteui-docs.db"))).toBe(before); + }); + + it("rejects a summary-less DB under --release but accepts it without", () => { + const root = makeRoot(); + expect(run(root).status).toBe(0); + + const released = run(root, ["--release"]); + expect(released.status).not.toBe(0); + expect(released.stderr).toMatch(/no summary/); + }); + + it("passes --release once every group has a summary", () => { + const root = makeRoot(); + expect(run(root).status).toBe(0); + + const summaryDir = join(root, "data", "group-summaries"); + mkdirSync(summaryDir, { recursive: true }); + for (const framework of FRAMEWORKS) { + writeFileSync( + join(summaryDir, `${framework}.json`), + JSON.stringify([ + { groupKey: "Grids & Lists > Data Grid", summary: "The data grid." }, + { groupKey: "Layouts", summary: "Layout components." }, + ]), + "utf-8" + ); + } + + const result = run(root, ["--release"]); + expect(result.status, result.stderr).toBe(0); + expect(result.stdout).toContain("Release gates passed."); + }); + + it("warns about a cached summary for a group that no longer exists", () => { + const root = makeRoot(); + const summaryDir = join(root, "data", "group-summaries"); + mkdirSync(summaryDir, { recursive: true }); + writeFileSync( + join(summaryDir, "angular.json"), + JSON.stringify([{ groupKey: "Gone > Group", summary: "Stale." }]), + "utf-8" + ); + + const result = run(root, ["--framework", "angular"]); + expect(result.status, result.stderr).toBe(0); + expect(result.stderr + result.stdout).toMatch(/unknown group "Gone > Group"/); + }); +}); + +describe("build-db — sidecar ingestion", () => { + it("keeps a cross-listed doc in both groups and counts it once per group", () => { + const root = makeRoot({ + angular: [ + { file: "angular-a.md", groups: ["Grids & Lists > Spreadsheet", "Frameworks > Excel Library"] }, + { file: "angular-b.md", groups: ["Layouts"] }, + ], + }); + expect(run(root).status).toBe(0); + + const out = run(root, ["--framework", "angular"]); + expect(out.status, out.stderr).toBe(0); + expect(out.stdout).toContain("angular: 3 TOC membership(s) inserted"); + expect(out.stdout).toContain("angular: 3 group(s)"); + }); + + it("warns about a sidecar record with no matching doc", () => { + const root = makeRoot(); + const sidecar = join(root, "dist", "toc-index", "react.json"); + const records = JSON.parse(readFileSync(sidecar, "utf-8")); + records.push({ + file: "deleted.md", + section: "Layouts", + groupKey: "Layouts", + groupLabel: "", + path: "Layouts > Deleted", + ord: 99, + landing: false, + }); + writeFileSync(sidecar, JSON.stringify(records), "utf-8"); + + const result = run(root, ["--framework", "react"]); + expect(result.status, result.stderr).toBe(0); + expect(result.stdout + result.stderr).toMatch(/1 record\(s\) with no matching doc/); + }); +}); + +describe("build-db — publication", () => { + it("copies to the backend path when it exists", () => { + const root = makeRoot(); + const backend = join(root, "..", "docs-backend", "docs-backend"); + mkdirSync(backend, { recursive: true }); + dirs.push(resolve(root, "..", "docs-backend")); + + const result = run(root); + expect(result.status, result.stderr).toBe(0); + expect(existsSync(join(backend, "igniteui-docs.db"))).toBe(true); + expect(hash(join(backend, "igniteui-docs.db"))).toBe(hash(join(root, "db", "igniteui-docs.db"))); + }); + + it("leaves every published artifact untouched when validation fails after staging", () => { + const root = makeRoot(); + expect(run(root).status).toBe(0); + + const backup = join(root, "backup"); + mkdirSync(backup, { recursive: true }); + cpSync(join(root, "db", "igniteui-docs.db"), join(backup, "db.db")); + cpSync(join(root, "dist", "igniteui-docs.db"), join(backup, "dist.db")); + + seedFramework(root, "webcomponents", [ + { file: "webcomponents-a.md", groups: ["Layouts"], prepared: false }, + { file: "webcomponents-b.md", groups: ["Layouts"] }, + ]); + + const result = run(root, ["--framework", "webcomponents"]); + expect(result.status).not.toBe(0); + expect(hash(join(root, "db", "igniteui-docs.db"))).toBe(hash(join(backup, "db.db"))); + expect(hash(join(root, "dist", "igniteui-docs.db"))).toBe(hash(join(backup, "dist.db"))); + expect(tmpResidue(root)).toEqual([]); + }); +}); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/toc-index.test.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/toc-index.test.ts new file mode 100644 index 000000000..308b848eb --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/toc-index.test.ts @@ -0,0 +1,221 @@ +import { describe, expect, it } from "vitest"; +import { + walkTocJson, + walkTocYaml, + type TocEntry, + type TocNode, +} from "../../../scripts/lib/toc-index.js"; + +/** + * Mirrors the shape of `angular/igniteui-docfx/en/components/toc.yml`: headers + * are top-level siblings of the entries they introduce, and a header may carry + * its own landing-page href. + */ +const ANGULAR_TOC: TocNode[] = [ + { name: "Grids & Lists", href: "grids-and-lists.md", header: true }, + { + name: "Data Grid", + href: "grid/grid.md", + items: [ + { name: "Sorting", href: "grid/sorting.md" }, + { name: "Row Actions", href: "grid/row-actions.md", premium: true }, + ], + }, + { name: "Excel Utility", href: "excel-utility.md" }, + { name: "Layouts", header: true }, + { name: "Accordion", href: "accordion.md" }, + { name: "Styling & Themes", header: true }, + { + name: "Sass", + href: "themes/sass/index.md", + items: [ + { name: "Palettes", href: "themes/sass/palettes.md" }, + { + name: "Predefined Themes", + items: [{ name: "Material", href: "themes/sass/presets/material.md" }], + }, + ], + }, + { name: "Frameworks", header: true }, + { name: "Excel Library", items: [{ name: "Excel Utility", href: "excel-utility.md" }] }, +]; + +function byHref(entries: TocEntry[], href: string): TocEntry[] { + return entries.filter((e) => e.href === href); +} + +function shape(entry: TocEntry) { + return { + section: entry.section, + ancestors: entry.ancestors, + groupLabel: entry.groupLabel, + groupKey: entry.groupKey, + path: entry.path, + landing: entry.landing, + }; +} + +describe("walkTocYaml — §4.1 worked examples", () => { + const entries = walkTocYaml(ANGULAR_TOC); + + it("groups a node that has both an href and children with its own children", () => { + expect(shape(byHref(entries, "grid/grid.md")[0])).toEqual({ + section: "Grids & Lists", + ancestors: ["Data Grid"], + groupLabel: "Data Grid", + groupKey: "Grids & Lists > Data Grid", + path: "Grids & Lists > Data Grid", + landing: false, + }); + }); + + it("groups a descendant under the top-level node below the header", () => { + expect(shape(byHref(entries, "grid/sorting.md")[0])).toEqual({ + section: "Grids & Lists", + ancestors: ["Data Grid", "Sorting"], + groupLabel: "Data Grid", + groupKey: "Grids & Lists > Data Grid", + path: "Grids & Lists > Data Grid > Sorting", + landing: false, + }); + }); + + it("leaves a childless top-level node at section level", () => { + expect(shape(byHref(entries, "accordion.md")[0])).toEqual({ + section: "Layouts", + ancestors: ["Accordion"], + groupLabel: "", + groupKey: "Layouts", + path: "Layouts > Accordion", + landing: false, + }); + }); + + it("keeps a deep descendant under the top-level node, not its immediate parent", () => { + expect(shape(byHref(entries, "themes/sass/presets/material.md")[0])).toEqual({ + section: "Styling & Themes", + ancestors: ["Sass", "Predefined Themes", "Material"], + groupLabel: "Sass", + groupKey: "Styling & Themes > Sass", + path: "Styling & Themes > Sass > Predefined Themes > Material", + landing: false, + }); + }); + + it("groups a second-level entry under its top-level node", () => { + expect(shape(byHref(entries, "themes/sass/palettes.md")[0])).toEqual({ + section: "Styling & Themes", + ancestors: ["Sass", "Palettes"], + groupLabel: "Sass", + groupKey: "Styling & Themes > Sass", + path: "Styling & Themes > Sass > Palettes", + landing: false, + }); + }); + + it("emits a header's own href as the section landing page", () => { + expect(shape(byHref(entries, "grids-and-lists.md")[0])).toEqual({ + section: "Grids & Lists", + ancestors: [], + groupLabel: "", + groupKey: "Grids & Lists", + path: "Grids & Lists", + landing: true, + }); + }); + + // The pair that fails any `ancestors.length > 1` implementation: both have a + // single-element ancestor chain and must land in different groups. + it("separates grid/grid.md from accordion.md despite equal ancestor depth", () => { + const grid = byHref(entries, "grid/grid.md")[0]; + const accordion = byHref(entries, "accordion.md")[0]; + expect(grid.ancestors).toHaveLength(1); + expect(accordion.ancestors).toHaveLength(1); + expect(grid.groupKey).not.toBe(accordion.groupKey); + }); +}); + +describe("walkTocYaml — structure", () => { + const entries = walkTocYaml(ANGULAR_TOC); + + it("emits one entry per href in document order", () => { + expect(entries.map((e) => e.ord)).toEqual(entries.map((_, i) => i)); + expect(entries.map((e) => e.href)).toEqual([ + "grids-and-lists.md", + "grid/grid.md", + "grid/sorting.md", + "grid/row-actions.md", + "excel-utility.md", + "accordion.md", + "themes/sass/index.md", + "themes/sass/palettes.md", + "themes/sass/presets/material.md", + "excel-utility.md", + ]); + }); + + it("emits a cross-listed href once per TOC path, in different sections", () => { + const excel = byHref(entries, "excel-utility.md"); + expect(excel).toHaveLength(2); + expect(excel.map((e) => e.path)).toEqual([ + "Grids & Lists > Excel Utility", + "Frameworks > Excel Library > Excel Utility", + ]); + expect(excel.map((e) => e.groupKey)).toEqual([ + "Grids & Lists", + "Frameworks > Excel Library", + ]); + }); + + it("carries premium through", () => { + expect(byHref(entries, "grid/row-actions.md")[0].premium).toBe(true); + expect(byHref(entries, "grid/sorting.md")[0].premium).toBe(false); + }); +}); + +describe("walkTocJson — platform exclusion", () => { + const XPLAT_TOC: TocNode[] = [ + { name: "General", header: true }, + { + name: "Installation", + exclude: ["Angular", "React"], + items: [{ name: "NuGet Feed", href: "general-nuget-feed.md" }], + }, + { name: "Licensing", href: "general-licensing.md" }, + { name: "Charts", href: "charts/chart-overview.md", header: true }, + { name: "Area Chart", href: "charts/types/area-chart.md" }, + ]; + + it("drops an excluded subtree for the excluded platform only", () => { + const react = walkTocJson(XPLAT_TOC, { excludePlatform: "React" }); + const blazor = walkTocJson(XPLAT_TOC, { excludePlatform: "Blazor" }); + expect(react.map((e) => e.href)).not.toContain("general-nuget-feed.md"); + expect(blazor.map((e) => e.href)).toContain("general-nuget-feed.md"); + }); + + it("keeps header hrefs, so the exporter can filter them itself", () => { + const entries = walkTocJson(XPLAT_TOC, { excludePlatform: "React" }); + const overview = byHref(entries, "charts/chart-overview.md")[0]; + expect(overview.landing).toBe(true); + expect(entries.filter((e) => !e.landing).map((e) => e.href)).toEqual([ + "general-licensing.md", + "charts/types/area-chart.md", + ]); + }); + + it("lets an excluded header update the section so later siblings are not stale", () => { + const toc: TocNode[] = [ + { name: "General", header: true }, + { name: "Grids", header: true, exclude: ["React"] }, + { name: "Data Grid", href: "grids/grid/grid.md" }, + ]; + const entries = walkTocJson(toc, { excludePlatform: "React" }); + expect(entries).toHaveLength(1); + expect(entries[0].section).toBe("Grids"); + expect(entries[0].groupKey).toBe("Grids"); + }); + + it("walks with no exclusion when no platform is given", () => { + expect(walkTocJson(XPLAT_TOC).map((e) => e.href)).toContain("general-nuget-feed.md"); + }); +}); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/toc-sidecar.test.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/toc-sidecar.test.ts new file mode 100644 index 000000000..65f3dc424 --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/scripts/toc-sidecar.test.ts @@ -0,0 +1,151 @@ +import { mkdtempSync, readFileSync, rmSync } from "fs"; +import { tmpdir } from "os"; +import { join } from "path"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import { + TocSidecar, + resolveUniqueName, + type TocSidecarRecord, +} from "../../../scripts/lib/toc-sidecar.js"; +import { walkTocYaml, type TocEntry, type TocNode } from "../../../scripts/lib/toc-index.js"; + +const TOC: TocNode[] = [ + { name: "Grids & Lists", header: true }, + { name: "Excel Utility", href: "excel-utility.md" }, + { name: "Frameworks", header: true }, + { name: "Excel Library", items: [{ name: "Excel Utility", href: "excel-utility.md" }] }, +]; + +const dirs: string[] = []; + +function tempRoot(): string { + const dir = mkdtempSync(join(tmpdir(), "toc-sidecar-")); + dirs.push(dir); + return dir; +} + +afterEach(() => { + while (dirs.length) rmSync(dirs.pop()!, { recursive: true, force: true }); + vi.restoreAllMocks(); +}); + +function read(root: string, framework: string): TocSidecarRecord[] { + return JSON.parse(readFileSync(join(root, "dist", "toc-index", `${framework}.json`), "utf-8")); +} + +describe("TocSidecar", () => { + it("records a cross-listed href twice against one file", () => { + const root = tempRoot(); + const sidecar = new TocSidecar("angular", root); + const written = new Set(); + + for (const entry of walkTocYaml(TOC)) { + const file = sidecar.nameFor(entry.href) ?? "excel-utility.md"; + written.add(file); + sidecar.record(entry, file); + } + sidecar.write(written); + + const records = read(root, "angular"); + expect(records).toHaveLength(2); + expect(new Set(records.map((r) => r.file)).size).toBe(1); + expect(records.map((r) => r.groupKey)).toEqual([ + "Grids & Lists", + "Frameworks > Excel Library", + ]); + expect(records.map((r) => r.path)).toEqual([ + "Grids & Lists > Excel Utility", + "Frameworks > Excel Library > Excel Utility", + ]); + }); + + it("returns the cached name for an href it has already seen", () => { + const sidecar = new TocSidecar("react", tempRoot()); + const [first] = walkTocYaml(TOC); + expect(sidecar.nameFor(first.href)).toBeUndefined(); + sidecar.record(first, "excel-utility.md"); + expect(sidecar.nameFor(first.href)).toBe("excel-utility.md"); + }); + + it("replaces the previous sidecar rather than merging into it", () => { + const root = tempRoot(); + const stale: TocEntry = walkTocYaml(TOC)[0]; + + const first = new TocSidecar("blazor", root); + first.record(stale, "excel-utility.md"); + first.record({ ...stale, href: "gone.md", ord: 1 }, "gone.md"); + first.write(new Set(["excel-utility.md", "gone.md"])); + expect(read(root, "blazor")).toHaveLength(2); + + // A later run where `gone.md` has been deleted from the TOC. + const second = new TocSidecar("blazor", root); + second.record(stale, "excel-utility.md"); + second.write(new Set(["excel-utility.md"])); + + const records = read(root, "blazor"); + expect(records).toHaveLength(1); + expect(records[0].file).toBe("excel-utility.md"); + }); + + it("rejects a record set that does not match the files written", () => { + const sidecar = new TocSidecar("angular", tempRoot()); + sidecar.record(walkTocYaml(TOC)[0], "excel-utility.md"); + expect(() => sidecar.write(new Set(["excel-utility.md", "extra.md"]))).toThrow( + /sidecar mismatch/ + ); + }); + + it("leaves the previous sidecar intact when the write fails", () => { + const root = tempRoot(); + const entry = walkTocYaml(TOC)[0]; + + const first = new TocSidecar("angular", root); + first.record(entry, "excel-utility.md"); + first.write(new Set(["excel-utility.md"])); + const before = readFileSync(join(root, "dist", "toc-index", "angular.json"), "utf-8"); + + const second = new TocSidecar("angular", root); + second.record(entry, "excel-utility.md"); + second.record({ ...entry, href: "other.md", ord: 1 }, "other.md"); + expect(() => second.write(new Set(["excel-utility.md"]))).toThrow(); + + expect(readFileSync(join(root, "dist", "toc-index", "angular.json"), "utf-8")).toBe(before); + }); +}); + +describe("resolveUniqueName", () => { + it("keeps the flattened name when it is free", () => { + expect(resolveUniqueName("editing.md", "grids/grid/editing.md", new Map())).toBe("editing.md"); + }); + + it("falls back to parent-file, then to the full href", () => { + const used = new Map([["editing.md", "charts/editing.md"]]); + expect(resolveUniqueName("editing.md", "grids/grid/editing.md", used)).toBe("grid-editing.md"); + + used.set("grid-editing.md", "x"); + expect(resolveUniqueName("editing.md", "grids/grid/editing.md", used)).toBe( + "grids-grid-editing.md" + ); + }); + + it("keeps looking when every fixed candidate is taken, instead of overwriting", () => { + vi.spyOn(console, "error").mockImplementation(() => {}); + const used = new Map([ + ["editing.md", "a"], + ["grid-editing.md", "b"], + ["grids-grid-editing.md", "c"], + ]); + const name = resolveUniqueName("editing.md", "grids/grid/editing.md", used); + expect(name).toBe("editing-2.md"); + expect(used.has(name)).toBe(false); + }); + + it("gives distinct names to two different hrefs that flatten alike", () => { + const used = new Map(); + const first = resolveUniqueName("overview.md", "charts/overview.md", used); + used.set(first, "charts/overview.md"); + const second = resolveUniqueName("overview.md", "maps/overview.md", used); + expect(first).toBe("overview.md"); + expect(second).toBe("maps-overview.md"); + }); +}); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/shared/list-fixtures.test.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/shared/list-fixtures.test.ts new file mode 100644 index 000000000..c954c3699 --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/shared/list-fixtures.test.ts @@ -0,0 +1,46 @@ +import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "fs"; +import { tmpdir } from "os"; +import { join } from "path"; +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { expectedPath, fixtureNames, loadFixture } from "../../../scripts/lib/list-fixtures.js"; +import { renderFixture } from "./list-fixtures.js"; + +/** + * The .NET backend renders the same fixtures through its own port of the + * renderer and compares against the same `expected.txt`, so a change to either + * implementation that is not mirrored in the other fails here or there. + * + * Regenerate after a deliberate format change: + * UPDATE_LIST_FIXTURES=1 npx vitest run src/__tests__/shared + */ +const UPDATE = process.env.UPDATE_LIST_FIXTURES === "1"; + +let dir: string; +beforeAll(() => { + dir = mkdtempSync(join(tmpdir(), "list-fixtures-")); +}); +afterAll(() => rmSync(dir, { recursive: true, force: true })); + +describe("shared list_components fixtures", () => { + const names = fixtureNames(); + + it("has fixtures to run", () => { + expect(names.length).toBeGreaterThan(0); + }); + + for (const name of names) { + it(`renders ${name} exactly as recorded`, async () => { + const fixture = loadFixture(name); + const actual = await renderFixture(fixture, join(dir, `${name}.db`)); + const file = expectedPath(name); + + if (UPDATE || !existsSync(file)) { + writeFileSync(file, actual, "utf-8"); + } + + // Ordinal comparison, no line-ending normalisation — that is what makes + // drift between the TS and C# renderers fail loudly. + expect(actual).toBe(readFileSync(file, "utf-8")); + }); + } +}); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/shared/list-fixtures.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/shared/list-fixtures.ts new file mode 100644 index 000000000..a801950ec --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/shared/list-fixtures.ts @@ -0,0 +1,62 @@ +import { readFileSync } from "fs"; +import { createRequire } from "module"; +import initSqlJs from "sql.js"; +import type { ListFixture } from "../../../scripts/lib/list-fixtures.js"; +import { LocalDocsProvider } from "../../providers/LocalDocsProvider.js"; + +const require = createRequire(import.meta.url); + +/** Load a fixture's rows into an in-memory DB and render it through the provider. */ +export async function renderFixture(fixture: ListFixture, dbFile: string): Promise { + const wasm = readFileSync(require.resolve("sql.js/dist/sql-wasm.wasm")); + const SQL = await initSqlJs({ + wasmBinary: wasm.buffer.slice(wasm.byteOffset, wasm.byteOffset + wasm.byteLength), + }); + + const db = new SQL.Database(); + db.run(`CREATE TABLE docs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, framework TEXT NOT NULL, filename TEXT NOT NULL, + component TEXT NOT NULL, toc_name TEXT, premium INTEGER DEFAULT 0, keywords TEXT, + summary TEXT, content TEXT NOT NULL, UNIQUE(framework, filename))`); + db.run(`CREATE TABLE doc_toc (framework TEXT NOT NULL, filename TEXT NOT NULL, + group_key TEXT NOT NULL, section TEXT NOT NULL, group_label TEXT NOT NULL DEFAULT '', + path TEXT NOT NULL, ord INTEGER NOT NULL, landing INTEGER NOT NULL DEFAULT 0, + PRIMARY KEY (framework, filename, path))`); + db.run(`CREATE TABLE doc_groups (framework TEXT NOT NULL, group_key TEXT NOT NULL, + section TEXT NOT NULL, group_label TEXT NOT NULL DEFAULT '', summary TEXT, + doc_count INTEGER NOT NULL, ord INTEGER NOT NULL, PRIMARY KEY (framework, group_key))`); + + for (const d of fixture.docs) { + db.run( + `INSERT INTO docs (framework, filename, component, toc_name, premium, keywords, summary, content) + VALUES (?, ?, ?, ?, ?, ?, ?, 'body')`, + [d.framework, d.filename, d.component, d.toc_name, d.premium ?? 0, d.keywords ?? "", d.summary ?? ""] + ); + } + for (const t of fixture.docToc) { + db.run( + `INSERT INTO doc_toc (framework, filename, group_key, section, group_label, path, ord, landing) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, + [t.framework, t.filename, t.group_key, t.section, t.group_label, t.path, t.ord, t.landing ?? 0] + ); + } + for (const g of fixture.docGroups) { + db.run( + `INSERT INTO doc_groups (framework, group_key, section, group_label, summary, doc_count, ord) + VALUES (?, ?, ?, ?, ?, ?, ?)`, + [g.framework, g.group_key, g.section, g.group_label, g.summary, g.doc_count, g.ord] + ); + } + + const { writeFileSync } = await import("fs"); + writeFileSync(dbFile, Buffer.from(db.export())); + db.close(); + + const provider = new LocalDocsProvider(dbFile); + await provider.init(); + return provider.listComponents(fixture.framework, { + filter: fixture.filter, + detail: fixture.detail, + group: fixture.group, + }); +} diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/tools/render-components.test.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/tools/render-components.test.ts new file mode 100644 index 000000000..f17e2cda1 --- /dev/null +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/__tests__/tools/render-components.test.ts @@ -0,0 +1,154 @@ +import { describe, expect, it } from "vitest"; +import { + SUMMARY_THRESHOLD, + renderFlat, + renderGroup, + renderGroupedIndex, + renderUnknownGroup, + type GroupRow, + type GroupedDocRow, +} from "../../tools/render-components.js"; + +const GROUPS: GroupRow[] = [ + { group_key: "Grids & Lists", section: "Grids & Lists", group_label: "", summary: "Lists and grids.", doc_count: 1, ord: 0 }, + { group_key: "Grids & Lists > Data Grid", section: "Grids & Lists", group_label: "Data Grid", summary: "Sorting, filtering, editing.", doc_count: 2, ord: 1 }, + { group_key: "Frameworks > Excel Library", section: "Frameworks", group_label: "Excel Library", summary: null, doc_count: 1, ord: 3 }, +]; + +const ROWS: GroupedDocRow[] = [ + { filename: "grids-and-lists.md", toc_name: "Grids & Lists", summary: "Overview.", premium: 0, group_key: "Grids & Lists", ord: 0 }, + { filename: "excel-utility.md", toc_name: "Excel Utility", summary: "Excel helpers.", premium: 0, group_key: "Grids & Lists", ord: 1 }, + { filename: "grid-grid.md", toc_name: "Data Grid", summary: "The grid.", premium: 0, group_key: "Grids & Lists > Data Grid", ord: 2 }, + { filename: "grid-sorting.md", toc_name: "Sorting", summary: "Sort rows.", premium: 1, group_key: "Grids & Lists > Data Grid", ord: 3 }, + { filename: "excel-utility.md", toc_name: "Excel Utility", summary: "Excel helpers.", premium: 0, group_key: "Frameworks > Excel Library", ord: 9 }, +]; + +describe("renderGroupedIndex", () => { + it("renders a heading, the group summary and the member names per group", () => { + const many = Array.from({ length: 30 }, (_, i) => ({ + filename: `doc-${i}.md`, + toc_name: `Doc ${i}`, + summary: "s", + premium: 0, + group_key: "Grids & Lists > Data Grid", + ord: i, + })); + const out = renderGroupedIndex("angular", GROUPS, many); + expect(out).toContain("## Grids & Lists > Data Grid (30)"); + expect(out).toContain("Sorting, filtering, editing."); + expect(out).toContain("doc-0, doc-1"); + expect(out).not.toContain("- **Doc 0**"); + }); + + it("omits a group with no rows", () => { + const out = renderGroupedIndex("angular", GROUPS, ROWS.slice(2, 4)); + expect(out).toContain("## Grids & Lists > Data Grid (2)"); + expect(out).not.toContain("## Frameworks > Excel Library"); + }); + + it("renders a group with no summary as heading plus members", () => { + const out = renderGroupedIndex("angular", GROUPS, [ROWS[4]]); + expect(out).toContain("## Frameworks > Excel Library (1)"); + expect(out).toContain("excel-utility"); + }); + + it("counts a cross-listed doc once in the header and once per group", () => { + const out = renderGroupedIndex("angular", GROUPS, ROWS); + // Four distinct files, five memberships. + expect(out).toContain("Found 4 component doc(s)"); + expect(out).toContain("## Grids & Lists (2)"); + expect(out).toContain("## Frameworks > Excel Library (1)"); + }); + + it("includes per-doc summaries only while the match set is small", () => { + const small = renderGroupedIndex("angular", GROUPS, ROWS, "grid"); + expect(small).toContain("- **Data Grid** (`grid-grid`)"); + expect(small).toContain(" The grid."); + + const large = Array.from({ length: SUMMARY_THRESHOLD + 1 }, (_, i) => ({ + filename: `doc-${i}.md`, + toc_name: `Doc ${i}`, + summary: "s", + premium: 0, + group_key: "Grids & Lists > Data Grid", + ord: i, + })); + const big = renderGroupedIndex("angular", GROUPS, large, "grid"); + expect(big).not.toContain("- **Doc 0**"); + expect(big).toContain("doc-0, doc-1"); + }); + + it("marks premium docs when summaries are omitted", () => { + const many = [ + ...ROWS, + ...Array.from({ length: 25 }, (_, i) => ({ + filename: `pad-${i}.md`, + toc_name: `Pad ${i}`, + summary: "s", + premium: 0, + group_key: "Grids & Lists > Data Grid", + ord: 100 + i, + })), + ]; + expect(renderGroupedIndex("angular", GROUPS, many)).toContain("grid-sorting ⭐"); + }); + + it("keeps the lowest ord when one doc reaches a group by two paths", () => { + const twice: GroupedDocRow[] = [ + { filename: "b.md", toc_name: "B", summary: null, premium: 0, group_key: "Grids & Lists", ord: 1 }, + { filename: "a.md", toc_name: "A", summary: null, premium: 0, group_key: "Grids & Lists", ord: 5 }, + { filename: "a.md", toc_name: "A", summary: null, premium: 0, group_key: "Grids & Lists", ord: 0 }, + ]; + const out = renderGroupedIndex("angular", GROUPS, twice); + expect(out).toContain("## Grids & Lists (2)"); + // a.md is listed once, at its earliest TOC position — before b.md. + expect(out.indexOf("(`a`)")).toBeLessThan(out.indexOf("(`b`)")); + expect(out.match(/\(`a`\)/g)).toHaveLength(1); + }); + + it("reports an empty result set", () => { + expect(renderGroupedIndex("angular", GROUPS, [], "zzz")).toBe( + 'No components found for framework "angular" matching "zzz".' + ); + }); +}); + +describe("renderGroup", () => { + it("lists one group's docs with summaries in TOC order", () => { + const out = renderGroup("angular", GROUPS[1], ROWS); + expect(out.startsWith("Found 2 component doc(s) in **angular** > Grids & Lists > Data Grid:")).toBe(true); + expect(out).toContain("Sorting, filtering, editing."); + expect(out.indexOf("grid-grid")).toBeLessThan(out.indexOf("grid-sorting")); + expect(out).toContain(" ⭐ Premium"); + }); + + it("reports an empty group", () => { + expect(renderGroup("angular", GROUPS[2], [], "zzz")).toBe( + 'No components found in group "Frameworks > Excel Library" for framework "angular" matching "zzz".' + ); + }); +}); + +describe("renderUnknownGroup", () => { + it("answers with the valid keys rather than an error", () => { + const out = renderUnknownGroup("angular", "Nope", GROUPS); + expect(out).toContain('No group "Nope" in **angular**'); + for (const g of GROUPS) expect(out).toContain(`- ${g.group_key}`); + }); +}); + +describe("renderFlat", () => { + it("keeps the established per-doc shape", () => { + expect(renderFlat("angular", [ROWS[3]])).toBe( + "Found 1 components for **angular**:\n\n" + + "- **Sorting** (`grid-sorting`)\n Sort rows.\n ⭐ Premium" + ); + }); + + it("mentions the filter in the header and the empty message", () => { + expect(renderFlat("angular", [ROWS[3]], "sort")).toContain('matching "sort":'); + expect(renderFlat("angular", [], "sort")).toBe( + 'No components found for framework "angular" matching "sort".' + ); + }); +}); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/index.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/index.ts index ebb689c79..5c8c4eac2 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/src/index.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/index.ts @@ -111,16 +111,32 @@ function registerDocTools(server: McpServer, docsProvider: DocsProvider) { .string() .optional() .describe( - "Keyword to match against filename, component name, keywords, or summary. " + - "Case-insensitive substring match. Example: 'grid', 'combo', 'chart'. " + - "Omit to return all docs for the framework." + "Keyword to match against filename, component name, keywords, summary, or " + + "group name. Case-insensitive substring match. Example: 'grid', 'combo', 'chart'. " + + "Omit to return the full index for the framework." + ), + group: z + .string() + .optional() + .describe( + "A group heading exactly as printed by the grouped index, e.g. " + + "'Grids & Lists > Data Grid'. Returns that group's docs with summaries. " + + "An unknown value returns the list of valid groups." + ), + detail: z + .enum(["groups", "docs"]) + .optional() + .describe( + "'groups' (default) returns the compact grouped index. 'docs' returns the " + + "flat per-doc list with a summary for every doc — far larger; prefer " + + "'group' or 'filter' first." ), }, }, - async ({ framework, filter }) => { + async ({ framework, filter, group, detail }) => { const start = performance.now(); - const text = await docsProvider.listComponents(framework, filter); - log("list_components", { framework, filter }, text, Math.round(performance.now() - start)); + const text = await docsProvider.listComponents(framework, { filter, group, detail }); + log("list_components", { framework, filter, group, detail }, text, Math.round(performance.now() - start)); return { content: [{ type: "text" as const, text }] }; } ); diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/DocsProvider.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/DocsProvider.ts index f3b9b9fa0..4bd42c636 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/DocsProvider.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/DocsProvider.ts @@ -1,5 +1,14 @@ +export interface ListComponentsOptions { + /** Substring match. Grouped mode also matches the group key. */ + filter?: string; + /** `"groups"` (default) renders the grouped index; `"docs"` renders the flat list. */ + detail?: "groups" | "docs"; + /** A `group_key` as printed by the grouped index. */ + group?: string; +} + export interface DocsProvider { - listComponents(framework: string, filter?: string): Promise; + listComponents(framework: string, opts?: ListComponentsOptions): Promise; getDoc(framework: string, name: string): Promise<{ text: string; found: boolean }>; searchDocs(framework: string, query: string): Promise; } diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/LocalDocsProvider.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/LocalDocsProvider.ts index 3b6e24d43..b21219d11 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/LocalDocsProvider.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/LocalDocsProvider.ts @@ -3,13 +3,24 @@ import { readFileSync, existsSync } from "fs"; import { join, dirname } from "path"; import { fileURLToPath } from "url"; import { createRequire } from "module"; -import type { DocsProvider } from "./DocsProvider.js"; +import type { DocsProvider, ListComponentsOptions } from "./DocsProvider.js"; +import { + renderFlat, + renderGroup, + renderGroupedIndex, + renderUnknownGroup, + type DocRow, + type GroupRow, + type GroupedDocRow, +} from "../tools/render-components.js"; const __dirname = dirname(fileURLToPath(import.meta.url)); export class LocalDocsProvider implements DocsProvider { private db: Database | null = null; private dbPath: string; + private tocTablesPresent: boolean | null = null; + private groupedFrameworks = new Map(); constructor(dbPath?: string) { this.dbPath = dbPath || process.env.DB_PATH || join(__dirname, "..", "igniteui-docs.db"); @@ -36,51 +47,136 @@ export class LocalDocsProvider implements DocsProvider { return this.db; } - async listComponents(framework: string, filter?: string): Promise { - const db = this.ensureDb(); + private query(sql: string, params: Record = {}): Record[] { + const stmt = this.ensureDb().prepare(sql); + stmt.bind(params as never); + const rows: Record[] = []; + while (stmt.step()) { + rows.push(stmt.getAsObject()); + } + stmt.free(); + return rows; + } - let sql: string; - let params: Record; + /** + * The package ships a prebuilt DB and `db/igniteui-docs.db` is committed, so a + * client can update the server without rebuilding the database. A DB with no + * `doc_toc`, or one where this framework has not been migrated yet, renders + * exactly as it does today. + */ + private hasGroups(framework: string): boolean { + if (this.tocTablesPresent === null) { + this.tocTablesPresent = + this.query( + `SELECT name FROM sqlite_master + WHERE type = 'table' AND name IN ('doc_toc', 'doc_groups')` + ).length === 2; + } + if (!this.tocTablesPresent) return false; - if (filter) { - const like = `%${filter}%`; - sql = `SELECT filename, component, toc_name, premium, keywords, summary - FROM docs - WHERE framework = $framework - AND (filename LIKE $like OR component LIKE $like OR toc_name LIKE $like - OR keywords LIKE $like OR summary LIKE $like) - ORDER BY toc_name`; - params = { $framework: framework, $like: like }; - } else { - sql = `SELECT filename, component, toc_name, premium, keywords, summary - FROM docs - WHERE framework = $framework - ORDER BY toc_name`; - params = { $framework: framework }; + const cached = this.groupedFrameworks.get(framework); + if (cached !== undefined) return cached; + + const row = this.query(`SELECT COUNT(*) AS cnt FROM doc_toc WHERE framework = $framework`, { + $framework: framework, + })[0]; + const present = Number(row?.cnt ?? 0) > 0; + this.groupedFrameworks.set(framework, present); + return present; + } + + async listComponents(framework: string, opts: ListComponentsOptions = {}): Promise { + const { filter, detail, group } = opts; + + if (detail === "docs" || !this.hasGroups(framework)) { + return this.listFlat(framework, filter, group); } - const stmt = db.prepare(sql); - stmt.bind(params); + const groups = this.query( + `SELECT group_key, section, group_label, summary, doc_count, ord + FROM doc_groups WHERE framework = $framework ORDER BY ord`, + { $framework: framework } + ) as unknown as GroupRow[]; - const rows: Record[] = []; - while (stmt.step()) { - rows.push(stmt.getAsObject()); + if (group !== undefined) { + const match = groups.find((g) => g.group_key === group); + if (!match) return renderUnknownGroup(framework, group, groups); + return renderGroup(framework, match, this.groupedRows(framework, filter, group), filter); } - stmt.free(); - if (rows.length === 0) { - return `No components found for framework "${framework}"${filter ? ` matching "${filter}"` : ""}.`; + return renderGroupedIndex(framework, groups, this.groupedRows(framework, filter), filter); + } + + /** + * Grouped mode also matches `doc_toc.group_key`, so a filter can select whole + * sections. Flat mode deliberately does not — see `listFlat`. + */ + private groupedRows(framework: string, filter?: string, group?: string): GroupedDocRow[] { + const conditions = [`t.framework = $framework`]; + const params: Record = { $framework: framework }; + + if (group !== undefined) { + conditions.push(`t.group_key = $group`); + params.$group = group; + } + if (filter) { + conditions.push( + `(d.filename LIKE $like OR d.component LIKE $like OR d.toc_name LIKE $like + OR d.keywords LIKE $like OR d.summary LIKE $like OR t.group_key LIKE $like)` + ); + params.$like = `%${filter}%`; } - const lines = rows.map((r) => { - const name = (r.filename as string).replace(/\.md$/, ""); - const parts = [`- **${r.toc_name || name}** (\`${name}\`)`]; - if (r.summary) parts.push(` ${r.summary}`); - if (r.premium) parts.push(` ⭐ Premium`); - return parts.join("\n"); - }); + return this.query( + `SELECT d.filename, d.toc_name, d.premium, d.summary, t.group_key, t.ord + FROM doc_toc t + JOIN docs d ON d.framework = t.framework AND d.filename = t.filename + WHERE ${conditions.join(" AND ")} + ORDER BY t.ord`, + params + ) as unknown as GroupedDocRow[]; + } + + /** + * Flat mode never reads through `doc_toc`: the join multiplies cross-listed + * docs and reorders by TOC position. Where `group` narrows a flat listing, + * membership is resolved separately and applied to the unchanged query. + */ + private listFlat(framework: string, filter?: string, group?: string): string { + let rows: Record[]; + + if (filter) { + rows = this.query( + `SELECT filename, component, toc_name, premium, keywords, summary + FROM docs + WHERE framework = $framework + AND (filename LIKE $like OR component LIKE $like OR toc_name LIKE $like + OR keywords LIKE $like OR summary LIKE $like) + ORDER BY toc_name`, + { $framework: framework, $like: `%${filter}%` } + ); + } else { + rows = this.query( + `SELECT filename, component, toc_name, premium, keywords, summary + FROM docs + WHERE framework = $framework + ORDER BY toc_name`, + { $framework: framework } + ); + } + + if (group !== undefined && this.hasGroups(framework)) { + const members = new Set( + this.query( + `SELECT DISTINCT filename FROM doc_toc + WHERE framework = $framework AND group_key = $group`, + { $framework: framework, $group: group } + ).map((r) => r.filename as string) + ); + rows = rows.filter((r) => members.has(r.filename as string)); + } - return `Found ${rows.length} components for **${framework}**${filter ? ` matching "${filter}"` : ""}:\n\n${lines.join("\n")}`; + return renderFlat(framework, rows as unknown as DocRow[], filter); } async getDoc(framework: string, name: string): Promise<{ text: string; found: boolean }> { diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/RemoteDocsProvider.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/RemoteDocsProvider.ts index 0b364bad2..6a295f105 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/RemoteDocsProvider.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/providers/RemoteDocsProvider.ts @@ -1,4 +1,4 @@ -import type { DocsProvider } from "./DocsProvider.js"; +import type { DocsProvider, ListComponentsOptions } from "./DocsProvider.js"; export class RemoteDocsProvider implements DocsProvider { private backendUrl: string; @@ -13,10 +13,12 @@ export class RemoteDocsProvider implements DocsProvider { return resp.text(); } - async listComponents(framework: string, filter?: string): Promise { + async listComponents(framework: string, opts: ListComponentsOptions = {}): Promise { const url = new URL("/api/docs", this.backendUrl); url.searchParams.set("framework", framework); - if (filter) url.searchParams.set("filter", filter); + if (opts.filter) url.searchParams.set("filter", opts.filter); + if (opts.detail) url.searchParams.set("detail", opts.detail); + if (opts.group) url.searchParams.set("group", opts.group); return this.fetchText(url); } diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/tools/constants.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/tools/constants.ts index 3a3e094bf..7e54e5fb2 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/src/tools/constants.ts +++ b/packages/igniteui-mcp/igniteui-doc-mcp/src/tools/constants.ts @@ -21,11 +21,16 @@ This tool is read-only: it does not create files, run commands, detect the curre Template rule: start with the base template unless the user explicitly needs multiple routed views. Use side-nav only when multi-view routing is actually required. `, - list_components: `List all available Ignite UI component documentation entries for a given framework. Optionally filter by keyword matched against filename, component name, keywords, or summary. + list_components: `Browse the Ignite UI component documentation index for a framework, grouped by the published documentation table of contents. -Use this to discover what docs exist before calling get_doc — e.g. to browse available grid docs, filter with "grid". For feature-based or free-text queries ("how do I enable row editing"), use search_docs instead. +By default returns a compact index: one heading per group with a short group summary and the doc names it contains. Use it to discover what docs exist before calling get_doc. For feature-based or free-text queries ("how do I enable row editing"), use search_docs instead. -Returns a formatted list where each entry includes: doc name (pass this as the 'name' parameter to get_doc), display name, summary, and premium status. Without a filter, returns the full catalog for the framework. +Narrowing, cheapest first: +- 'group' — pass a heading exactly as printed by the index (e.g. "Grids & Lists > Data Grid") to get that group's docs with a summary each, in documentation order. An unknown value returns the valid headings rather than an error. +- 'filter' — case-insensitive substring match on filename, component name, keywords, summary, or group name. Groups with no match are omitted; per-doc summaries are included when few enough docs match. Combine with 'group' to search inside one group. +- 'detail: "docs"' — the flat per-doc list with a summary for every doc. This is the largest response by a wide margin; reach for it only when you genuinely need every summary at once. It matches the five doc columns only, not group names. + +Doc names printed by any mode are what you pass as the 'name' parameter to get_doc. ⭐ marks premium docs. No pagination — the full result set is returned in one call. `, diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/src/tools/render-components.ts b/packages/igniteui-mcp/igniteui-doc-mcp/src/tools/render-components.ts new file mode 100644 index 0000000000000000000000000000000000000000..20bbd467740d2358b87338d83588ab8caaf5769d GIT binary patch literal 5707 zcmc&&+in}l5zVu{qM{`blA%UPfV{|-4QIWp4G^yl*&85`1Wj|;6ek)^54wk@7@9yn zArJYD{M3F)PF3{`hZLna$U`11n0=|Pt~zz<^qdZdM>M1l3vbEWa$>#pfu_z=TI8X= z&D^|lr7i1_CiJ7Dw|^j$Wi|x*`S1UvdSfG-SW~vfHwQeu@NQArNpu+3L`*{0|2tlAdv8~buk7UM za7Yte0vAb~pS1bF*sqWa7xFrHB?2Px`t<%=TAJcM;b0MAL*wL&qbGf8;&<@;U^718 zP#ko9VaB#NH2q8j`9hgnlyx_TO$k~FwXysZjgwtsq^%qP9m z5gi{7BrmPmJbX}a?HO+H#W3$!j!2~Q^K+{G!qS&7a$ z1Y9(@b?2UNm1~CMQyGs6KBuengoeZ3ns3=u8vDSTH%M3iI_<6H$8|bLZ`eRSB|bWd z=oqN2q*{boKP6IIadMN&nY?8uFoXSFKmY3=6a%MQVvNMknW|1A>H74vNubt0L!SRiaax1*2=0a{3aH20_t!^7hS%(x&gfR zMmlI2^L5Xuv`czts+WqU(e8#)>FVpA6yE&8u$E zSCWwb6nAWTD)OCtqo&rKXfpCRl6r&$b0-&_u=3IY@n5atCT2vo0L3;YIHo%$Ms$VW zH~aC8>vzL8k=$nWTk!vrVT;|EuMu;_c>Jj6hGcH4e&0)me9Os$K@#%6p@3t9`Q#>M zg~mE9xb!&)EPx=52<78f++Tz@mU%tXI)<2t-DcHoByCNp-1;8&`cn`7SUP{-bP53& zAb@LKy5-f)D7L7!o$mIO$ekg9&bh<+O#8oS@)ob0LcO)Zh9%wt^u;yT9!|%-b^Bw( zKcp?vYf8~h>uknF)DCZsQ#wPV+9XnKTnJjcMP6F&0mz}o7IZ3|MG_jl=?kRN@5KwL z-p2XOu9sf=$kwglFr{DX=C5_|?7F-zdu#El!}*&OX5f=1n7Qy1I9lpZsC8l=&LqLH z=}3xY8l(yOH52A2MnKFxb0(WfWl>0xvj;?inI8-SeDo2CTb)z}fb>v!SxZCKn__8JaKk`rv$b~yG3X{)c6BF>GezcE74YddT3+*F+#H-_h z@z5r@tpW^cxMGXBlv=#Y{X{A)TU$lqfn>2wee#oJ;KZ8m4i zPw_eEebxW1I+lf?$tKWY=9VRAQ-Bdu!}X)-o`D)cBc{)wzovNR%-&l3+9(8JIziuxt>OcJnz&9Sk=H2+-SPvGUFEKZmntMD9)tj}anx?YX=()>=4=7R3PPCk0(J|jIYn17!q-YxGkx&BYA8}SR+bXk}67M|W) z{UtZ#Zyh3H Excel Library (1) +Read, write and format Excel workbooks without Excel installed. +- **Excel Utility** (`excel-utility`) + Load and save Excel workbooks. \ No newline at end of file diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/filtered/input.json b/packages/igniteui-mcp/shared-fixtures/list-components/filtered/input.json new file mode 100644 index 000000000..b00d36dd2 --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/filtered/input.json @@ -0,0 +1,217 @@ +{ + "framework": "angular", + "filter": "excel", + "docs": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "component": "IgxGridComponent", + "toc_name": "Grids & Lists", + "premium": 0, + "keywords": "grid list", + "summary": "Section overview for grids and lists." + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "component": "IgxGridComponent", + "toc_name": "Data Grid", + "premium": 0, + "keywords": "grid data", + "summary": "The data grid: setup, columns, binding." + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "component": "IgxGridComponent", + "toc_name": "Sorting", + "premium": 1, + "keywords": "sort ordering", + "summary": "Sort grid rows by one or more columns." + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "component": "IgxGridComponent", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit cell row", + "summary": "Edit cells and rows, batch and transactional." + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "component": "IgxExcelUtility", + "toc_name": "Excel Utility", + "premium": 0, + "keywords": "excel workbook", + "summary": "Load and save Excel workbooks." + }, + { + "framework": "angular", + "filename": "accordion.md", + "component": "IgxAccordionComponent", + "toc_name": "Accordion", + "premium": 0, + "keywords": "accordion panel", + "summary": "Expand and collapse stacked panels." + }, + { + "framework": "angular", + "filename": "no-component.md", + "component": "", + "toc_name": null, + "premium": 0, + "keywords": "", + "summary": "" + }, + { + "framework": "react", + "filename": "grid-editing.md", + "component": "IgrGrid", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit", + "summary": "Edit cells in the React grid." + } + ], + "docToc": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists", + "ord": 0, + "landing": 1 + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid", + "ord": 1, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Sorting", + "ord": 2, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 3, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists > Excel Utility", + "ord": 4, + "landing": 0 + }, + { + "framework": "angular", + "filename": "accordion.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Accordion", + "ord": 5, + "landing": 0 + }, + { + "framework": "angular", + "filename": "no-component.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Unnamed", + "ord": 6, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "path": "Frameworks > Excel Library > Excel Utility", + "ord": 7, + "landing": 0 + }, + { + "framework": "react", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 0, + "landing": 0 + } + ], + "docGroups": [ + { + "framework": "angular", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "summary": "Grid and list components, plus the Excel interop utility.", + "doc_count": 2, + "ord": 0 + }, + { + "framework": "angular", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid: sorting, filtering, editing, virtualization, export.", + "doc_count": 3, + "ord": 1 + }, + { + "framework": "angular", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "summary": null, + "doc_count": 2, + "ord": 5 + }, + { + "framework": "angular", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "summary": "Read, write and format Excel workbooks without Excel installed.", + "doc_count": 1, + "ord": 7 + }, + { + "framework": "react", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid editing.", + "doc_count": 1, + "ord": 0 + } + ] +} diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/flat/expected.txt b/packages/igniteui-mcp/shared-fixtures/list-components/flat/expected.txt new file mode 100644 index 000000000..49bcfae2e --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/flat/expected.txt @@ -0,0 +1,16 @@ +Found 7 components for **angular**: + +- **no-component** (`no-component`) +- **Accordion** (`accordion`) + Expand and collapse stacked panels. +- **Data Grid** (`grid-grid`) + The data grid: setup, columns, binding. +- **Editing** (`grid-editing`) + Edit cells and rows, batch and transactional. +- **Excel Utility** (`excel-utility`) + Load and save Excel workbooks. +- **Grids & Lists** (`grids-and-lists`) + Section overview for grids and lists. +- **Sorting** (`grid-sorting`) + Sort grid rows by one or more columns. + ⭐ Premium \ No newline at end of file diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/flat/input.json b/packages/igniteui-mcp/shared-fixtures/list-components/flat/input.json new file mode 100644 index 000000000..2b761a0cf --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/flat/input.json @@ -0,0 +1,217 @@ +{ + "framework": "angular", + "detail": "docs", + "docs": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "component": "IgxGridComponent", + "toc_name": "Grids & Lists", + "premium": 0, + "keywords": "grid list", + "summary": "Section overview for grids and lists." + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "component": "IgxGridComponent", + "toc_name": "Data Grid", + "premium": 0, + "keywords": "grid data", + "summary": "The data grid: setup, columns, binding." + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "component": "IgxGridComponent", + "toc_name": "Sorting", + "premium": 1, + "keywords": "sort ordering", + "summary": "Sort grid rows by one or more columns." + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "component": "IgxGridComponent", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit cell row", + "summary": "Edit cells and rows, batch and transactional." + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "component": "IgxExcelUtility", + "toc_name": "Excel Utility", + "premium": 0, + "keywords": "excel workbook", + "summary": "Load and save Excel workbooks." + }, + { + "framework": "angular", + "filename": "accordion.md", + "component": "IgxAccordionComponent", + "toc_name": "Accordion", + "premium": 0, + "keywords": "accordion panel", + "summary": "Expand and collapse stacked panels." + }, + { + "framework": "angular", + "filename": "no-component.md", + "component": "", + "toc_name": null, + "premium": 0, + "keywords": "", + "summary": "" + }, + { + "framework": "react", + "filename": "grid-editing.md", + "component": "IgrGrid", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit", + "summary": "Edit cells in the React grid." + } + ], + "docToc": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists", + "ord": 0, + "landing": 1 + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid", + "ord": 1, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Sorting", + "ord": 2, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 3, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists > Excel Utility", + "ord": 4, + "landing": 0 + }, + { + "framework": "angular", + "filename": "accordion.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Accordion", + "ord": 5, + "landing": 0 + }, + { + "framework": "angular", + "filename": "no-component.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Unnamed", + "ord": 6, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "path": "Frameworks > Excel Library > Excel Utility", + "ord": 7, + "landing": 0 + }, + { + "framework": "react", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 0, + "landing": 0 + } + ], + "docGroups": [ + { + "framework": "angular", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "summary": "Grid and list components, plus the Excel interop utility.", + "doc_count": 2, + "ord": 0 + }, + { + "framework": "angular", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid: sorting, filtering, editing, virtualization, export.", + "doc_count": 3, + "ord": 1 + }, + { + "framework": "angular", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "summary": null, + "doc_count": 2, + "ord": 5 + }, + { + "framework": "angular", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "summary": "Read, write and format Excel workbooks without Excel installed.", + "doc_count": 1, + "ord": 7 + }, + { + "framework": "react", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid editing.", + "doc_count": 1, + "ord": 0 + } + ] +} diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/grouped-index/expected.txt b/packages/igniteui-mcp/shared-fixtures/list-components/grouped-index/expected.txt new file mode 100644 index 000000000..70c03ea14 --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/grouped-index/expected.txt @@ -0,0 +1,28 @@ +Found 7 component doc(s) for **angular** in 4 group(s). Pass `group` with any heading below to get that group's docs with summaries. + +## Grids & Lists (2) +Grid and list components, plus the Excel interop utility. +- **Grids & Lists** (`grids-and-lists`) + Section overview for grids and lists. +- **Excel Utility** (`excel-utility`) + Load and save Excel workbooks. + +## Grids & Lists > Data Grid (3) +Data grid: sorting, filtering, editing, virtualization, export. +- **Data Grid** (`grid-grid`) + The data grid: setup, columns, binding. +- **Sorting** (`grid-sorting`) + Sort grid rows by one or more columns. + ⭐ Premium +- **Editing** (`grid-editing`) + Edit cells and rows, batch and transactional. + +## Layouts (2) +- **Accordion** (`accordion`) + Expand and collapse stacked panels. +- **no-component** (`no-component`) + +## Frameworks > Excel Library (1) +Read, write and format Excel workbooks without Excel installed. +- **Excel Utility** (`excel-utility`) + Load and save Excel workbooks. \ No newline at end of file diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/grouped-index/input.json b/packages/igniteui-mcp/shared-fixtures/list-components/grouped-index/input.json new file mode 100644 index 000000000..a00c990b8 --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/grouped-index/input.json @@ -0,0 +1,216 @@ +{ + "framework": "angular", + "docs": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "component": "IgxGridComponent", + "toc_name": "Grids & Lists", + "premium": 0, + "keywords": "grid list", + "summary": "Section overview for grids and lists." + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "component": "IgxGridComponent", + "toc_name": "Data Grid", + "premium": 0, + "keywords": "grid data", + "summary": "The data grid: setup, columns, binding." + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "component": "IgxGridComponent", + "toc_name": "Sorting", + "premium": 1, + "keywords": "sort ordering", + "summary": "Sort grid rows by one or more columns." + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "component": "IgxGridComponent", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit cell row", + "summary": "Edit cells and rows, batch and transactional." + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "component": "IgxExcelUtility", + "toc_name": "Excel Utility", + "premium": 0, + "keywords": "excel workbook", + "summary": "Load and save Excel workbooks." + }, + { + "framework": "angular", + "filename": "accordion.md", + "component": "IgxAccordionComponent", + "toc_name": "Accordion", + "premium": 0, + "keywords": "accordion panel", + "summary": "Expand and collapse stacked panels." + }, + { + "framework": "angular", + "filename": "no-component.md", + "component": "", + "toc_name": null, + "premium": 0, + "keywords": "", + "summary": "" + }, + { + "framework": "react", + "filename": "grid-editing.md", + "component": "IgrGrid", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit", + "summary": "Edit cells in the React grid." + } + ], + "docToc": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists", + "ord": 0, + "landing": 1 + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid", + "ord": 1, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Sorting", + "ord": 2, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 3, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists > Excel Utility", + "ord": 4, + "landing": 0 + }, + { + "framework": "angular", + "filename": "accordion.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Accordion", + "ord": 5, + "landing": 0 + }, + { + "framework": "angular", + "filename": "no-component.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Unnamed", + "ord": 6, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "path": "Frameworks > Excel Library > Excel Utility", + "ord": 7, + "landing": 0 + }, + { + "framework": "react", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 0, + "landing": 0 + } + ], + "docGroups": [ + { + "framework": "angular", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "summary": "Grid and list components, plus the Excel interop utility.", + "doc_count": 2, + "ord": 0 + }, + { + "framework": "angular", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid: sorting, filtering, editing, virtualization, export.", + "doc_count": 3, + "ord": 1 + }, + { + "framework": "angular", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "summary": null, + "doc_count": 2, + "ord": 5 + }, + { + "framework": "angular", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "summary": "Read, write and format Excel workbooks without Excel installed.", + "doc_count": 1, + "ord": 7 + }, + { + "framework": "react", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid editing.", + "doc_count": 1, + "ord": 0 + } + ] +} diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/single-group/expected.txt b/packages/igniteui-mcp/shared-fixtures/list-components/single-group/expected.txt new file mode 100644 index 000000000..cfe2f474c --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/single-group/expected.txt @@ -0,0 +1,11 @@ +Found 3 component doc(s) in **angular** > Grids & Lists > Data Grid: + +Data grid: sorting, filtering, editing, virtualization, export. + +- **Data Grid** (`grid-grid`) + The data grid: setup, columns, binding. +- **Sorting** (`grid-sorting`) + Sort grid rows by one or more columns. + ⭐ Premium +- **Editing** (`grid-editing`) + Edit cells and rows, batch and transactional. \ No newline at end of file diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/single-group/input.json b/packages/igniteui-mcp/shared-fixtures/list-components/single-group/input.json new file mode 100644 index 000000000..26d2a3886 --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/single-group/input.json @@ -0,0 +1,217 @@ +{ + "framework": "angular", + "group": "Grids & Lists > Data Grid", + "docs": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "component": "IgxGridComponent", + "toc_name": "Grids & Lists", + "premium": 0, + "keywords": "grid list", + "summary": "Section overview for grids and lists." + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "component": "IgxGridComponent", + "toc_name": "Data Grid", + "premium": 0, + "keywords": "grid data", + "summary": "The data grid: setup, columns, binding." + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "component": "IgxGridComponent", + "toc_name": "Sorting", + "premium": 1, + "keywords": "sort ordering", + "summary": "Sort grid rows by one or more columns." + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "component": "IgxGridComponent", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit cell row", + "summary": "Edit cells and rows, batch and transactional." + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "component": "IgxExcelUtility", + "toc_name": "Excel Utility", + "premium": 0, + "keywords": "excel workbook", + "summary": "Load and save Excel workbooks." + }, + { + "framework": "angular", + "filename": "accordion.md", + "component": "IgxAccordionComponent", + "toc_name": "Accordion", + "premium": 0, + "keywords": "accordion panel", + "summary": "Expand and collapse stacked panels." + }, + { + "framework": "angular", + "filename": "no-component.md", + "component": "", + "toc_name": null, + "premium": 0, + "keywords": "", + "summary": "" + }, + { + "framework": "react", + "filename": "grid-editing.md", + "component": "IgrGrid", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit", + "summary": "Edit cells in the React grid." + } + ], + "docToc": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists", + "ord": 0, + "landing": 1 + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid", + "ord": 1, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Sorting", + "ord": 2, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 3, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists > Excel Utility", + "ord": 4, + "landing": 0 + }, + { + "framework": "angular", + "filename": "accordion.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Accordion", + "ord": 5, + "landing": 0 + }, + { + "framework": "angular", + "filename": "no-component.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Unnamed", + "ord": 6, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "path": "Frameworks > Excel Library > Excel Utility", + "ord": 7, + "landing": 0 + }, + { + "framework": "react", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 0, + "landing": 0 + } + ], + "docGroups": [ + { + "framework": "angular", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "summary": "Grid and list components, plus the Excel interop utility.", + "doc_count": 2, + "ord": 0 + }, + { + "framework": "angular", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid: sorting, filtering, editing, virtualization, export.", + "doc_count": 3, + "ord": 1 + }, + { + "framework": "angular", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "summary": null, + "doc_count": 2, + "ord": 5 + }, + { + "framework": "angular", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "summary": "Read, write and format Excel workbooks without Excel installed.", + "doc_count": 1, + "ord": 7 + }, + { + "framework": "react", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid editing.", + "doc_count": 1, + "ord": 0 + } + ] +} diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/unknown-group/expected.txt b/packages/igniteui-mcp/shared-fixtures/list-components/unknown-group/expected.txt new file mode 100644 index 000000000..58754b749 --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/unknown-group/expected.txt @@ -0,0 +1,8 @@ +No group "Nope" in **angular**. Valid groups: + +- Grids & Lists +- Grids & Lists > Data Grid +- Layouts +- Frameworks > Excel Library + +Omit `group` for the full grouped index, or pass `filter` to search across groups. \ No newline at end of file diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/unknown-group/input.json b/packages/igniteui-mcp/shared-fixtures/list-components/unknown-group/input.json new file mode 100644 index 000000000..3a11a8208 --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/unknown-group/input.json @@ -0,0 +1,217 @@ +{ + "framework": "angular", + "group": "Nope", + "docs": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "component": "IgxGridComponent", + "toc_name": "Grids & Lists", + "premium": 0, + "keywords": "grid list", + "summary": "Section overview for grids and lists." + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "component": "IgxGridComponent", + "toc_name": "Data Grid", + "premium": 0, + "keywords": "grid data", + "summary": "The data grid: setup, columns, binding." + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "component": "IgxGridComponent", + "toc_name": "Sorting", + "premium": 1, + "keywords": "sort ordering", + "summary": "Sort grid rows by one or more columns." + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "component": "IgxGridComponent", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit cell row", + "summary": "Edit cells and rows, batch and transactional." + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "component": "IgxExcelUtility", + "toc_name": "Excel Utility", + "premium": 0, + "keywords": "excel workbook", + "summary": "Load and save Excel workbooks." + }, + { + "framework": "angular", + "filename": "accordion.md", + "component": "IgxAccordionComponent", + "toc_name": "Accordion", + "premium": 0, + "keywords": "accordion panel", + "summary": "Expand and collapse stacked panels." + }, + { + "framework": "angular", + "filename": "no-component.md", + "component": "", + "toc_name": null, + "premium": 0, + "keywords": "", + "summary": "" + }, + { + "framework": "react", + "filename": "grid-editing.md", + "component": "IgrGrid", + "toc_name": "Editing", + "premium": 0, + "keywords": "edit", + "summary": "Edit cells in the React grid." + } + ], + "docToc": [ + { + "framework": "angular", + "filename": "grids-and-lists.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists", + "ord": 0, + "landing": 1 + }, + { + "framework": "angular", + "filename": "grid-grid.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid", + "ord": 1, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-sorting.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Sorting", + "ord": 2, + "landing": 0 + }, + { + "framework": "angular", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 3, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "path": "Grids & Lists > Excel Utility", + "ord": 4, + "landing": 0 + }, + { + "framework": "angular", + "filename": "accordion.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Accordion", + "ord": 5, + "landing": 0 + }, + { + "framework": "angular", + "filename": "no-component.md", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "path": "Layouts > Unnamed", + "ord": 6, + "landing": 0 + }, + { + "framework": "angular", + "filename": "excel-utility.md", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "path": "Frameworks > Excel Library > Excel Utility", + "ord": 7, + "landing": 0 + }, + { + "framework": "react", + "filename": "grid-editing.md", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "path": "Grids & Lists > Data Grid > Editing", + "ord": 0, + "landing": 0 + } + ], + "docGroups": [ + { + "framework": "angular", + "group_key": "Grids & Lists", + "section": "Grids & Lists", + "group_label": "", + "summary": "Grid and list components, plus the Excel interop utility.", + "doc_count": 2, + "ord": 0 + }, + { + "framework": "angular", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid: sorting, filtering, editing, virtualization, export.", + "doc_count": 3, + "ord": 1 + }, + { + "framework": "angular", + "group_key": "Layouts", + "section": "Layouts", + "group_label": "", + "summary": null, + "doc_count": 2, + "ord": 5 + }, + { + "framework": "angular", + "group_key": "Frameworks > Excel Library", + "section": "Frameworks", + "group_label": "Excel Library", + "summary": "Read, write and format Excel workbooks without Excel installed.", + "doc_count": 1, + "ord": 7 + }, + { + "framework": "react", + "group_key": "Grids & Lists > Data Grid", + "section": "Grids & Lists", + "group_label": "Data Grid", + "summary": "Data grid editing.", + "doc_count": 1, + "ord": 0 + } + ] +} From c1934940e140d0a3c8c55a3ccd5ac294dfc9ab5e Mon Sep 17 00:00:00 2001 From: DKalinov Date: Wed, 26 Aug 2026 17:47:46 +0300 Subject: [PATCH 2/2] feat(docs): optimize component listing by using tuple keys for deduplication --- .../docs-backend/ComponentRenderer.cs | 6 +- .../ambiguous-keys/expected.txt | 11 ++++ .../list-components/ambiguous-keys/input.json | 65 +++++++++++++++++++ spec/unit/mcp-runtime-spec.ts | 4 +- 4 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/ambiguous-keys/expected.txt create mode 100644 packages/igniteui-mcp/shared-fixtures/list-components/ambiguous-keys/input.json diff --git a/packages/igniteui-mcp/docs-backend/docs-backend/ComponentRenderer.cs b/packages/igniteui-mcp/docs-backend/docs-backend/ComponentRenderer.cs index 24d6620bd..c0293d52d 100644 --- a/packages/igniteui-mcp/docs-backend/docs-backend/ComponentRenderer.cs +++ b/packages/igniteui-mcp/docs-backend/docs-backend/ComponentRenderer.cs @@ -40,10 +40,12 @@ private static string DocEntry(string filename, string? tocName, string? summary /// private static List Dedupe(IEnumerable rows) { - var best = new Dictionary(StringComparer.Ordinal); + // Keyed by the pair itself: concatenating with a separator would be + // ambiguous the moment either half could contain it. + var best = new Dictionary<(string GroupKey, string Filename), GroupedDocRow>(); foreach (var row in rows) { - var key = row.GroupKey + " " + row.Filename; + var key = (row.GroupKey, row.Filename); if (!best.TryGetValue(key, out var existing) || row.Ord < existing.Ord) best[key] = row; } return best.Values.OrderBy(r => r.Ord).ToList(); diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/ambiguous-keys/expected.txt b/packages/igniteui-mcp/shared-fixtures/list-components/ambiguous-keys/expected.txt new file mode 100644 index 000000000..84830f7a4 --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/ambiguous-keys/expected.txt @@ -0,0 +1,11 @@ +Found 2 component doc(s) for **angular** in 2 group(s). Pass `group` with any heading below to get that group's docs with summaries. + +## A (1) +Section-level group whose key is a prefix of the other. +- **B c** (`B c`) + Filename containing a space, in group "A". + +## A B (1) +Group whose key plus a space equals the other key plus its filename. +- **c** (`c`) + Filename without a space, in group "A B". \ No newline at end of file diff --git a/packages/igniteui-mcp/shared-fixtures/list-components/ambiguous-keys/input.json b/packages/igniteui-mcp/shared-fixtures/list-components/ambiguous-keys/input.json new file mode 100644 index 000000000..60cd2c99a --- /dev/null +++ b/packages/igniteui-mcp/shared-fixtures/list-components/ambiguous-keys/input.json @@ -0,0 +1,65 @@ +{ + "framework": "angular", + "docs": [ + { + "framework": "angular", + "filename": "B c.md", + "component": "IgxThing", + "toc_name": "B c", + "premium": 0, + "keywords": "", + "summary": "Filename containing a space, in group \"A\"." + }, + { + "framework": "angular", + "filename": "c.md", + "component": "IgxThing", + "toc_name": "c", + "premium": 0, + "keywords": "", + "summary": "Filename without a space, in group \"A B\"." + } + ], + "docToc": [ + { + "framework": "angular", + "filename": "B c.md", + "group_key": "A", + "section": "A", + "group_label": "", + "path": "A > B c", + "ord": 0, + "landing": 0 + }, + { + "framework": "angular", + "filename": "c.md", + "group_key": "A B", + "section": "A", + "group_label": "B", + "path": "A > B > c", + "ord": 1, + "landing": 0 + } + ], + "docGroups": [ + { + "framework": "angular", + "group_key": "A", + "section": "A", + "group_label": "", + "summary": "Section-level group whose key is a prefix of the other.", + "doc_count": 1, + "ord": 0 + }, + { + "framework": "angular", + "group_key": "A B", + "section": "A", + "group_label": "B", + "summary": "Group whose key plus a space equals the other key plus its filename.", + "doc_count": 1, + "ord": 1 + } + ] +} diff --git a/spec/unit/mcp-runtime-spec.ts b/spec/unit/mcp-runtime-spec.ts index 3f924e50c..e6ad8a672 100644 --- a/spec/unit/mcp-runtime-spec.ts +++ b/spec/unit/mcp-runtime-spec.ts @@ -393,7 +393,7 @@ describe("Unit - MCP runtime", () => { const fetchSpy = spyOn(globalThis, "fetch").and.resolveTo(new Response("grid docs", { status: 200 })); const provider = new RemoteDocsProvider("https://docs.example.test/base/"); - const result = await provider.listComponents("angular", "grid"); + const result = await provider.listComponents("angular", { filter: "grid" }); const requestUrl = fetchSpy.calls.mostRecent().args[0] as URL; expect(result).toBe("grid docs"); @@ -671,7 +671,7 @@ describe("Unit - MCP runtime", () => { const provider = new LocalDocsProvider(dbFixturePath); await provider.init(); - const result = await provider.listComponents("angular", "grid"); + const result = await provider.listComponents("angular", { filter: "grid" }); expect(result).toContain("Grid Editing"); expect(result).not.toContain("Combo Overview");