@sabrish/power-platform-solution-blueprint 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/CHANGELOG.md +166 -0
  2. package/LICENSE +21 -0
  3. package/README.md +331 -0
  4. package/dist/assets/BusinessProcessFlowDiscovery-BSDgBoIA.js +2 -0
  5. package/dist/assets/BusinessProcessFlowDiscovery-BSDgBoIA.js.map +1 -0
  6. package/dist/assets/ColumnSecurityDiscovery-B3yVn0LZ.js +2 -0
  7. package/dist/assets/ColumnSecurityDiscovery-B3yVn0LZ.js.map +1 -0
  8. package/dist/assets/ConnectionReferenceDiscovery-DFTQuo-S.js +2 -0
  9. package/dist/assets/ConnectionReferenceDiscovery-DFTQuo-S.js.map +1 -0
  10. package/dist/assets/CustomAPIDiscovery-BiQS_ENt.js +2 -0
  11. package/dist/assets/CustomAPIDiscovery-BiQS_ENt.js.map +1 -0
  12. package/dist/assets/CustomConnectorDiscovery-TvNjElP3.js +2 -0
  13. package/dist/assets/CustomConnectorDiscovery-TvNjElP3.js.map +1 -0
  14. package/dist/assets/EnvironmentVariableDiscovery-DG_tXCcQ.js +2 -0
  15. package/dist/assets/EnvironmentVariableDiscovery-DG_tXCcQ.js.map +1 -0
  16. package/dist/assets/GlobalChoiceDiscovery-nivz9yGs.js +2 -0
  17. package/dist/assets/GlobalChoiceDiscovery-nivz9yGs.js.map +1 -0
  18. package/dist/assets/HtmlReporter-Cu9NwA6b.js +1894 -0
  19. package/dist/assets/HtmlReporter-Cu9NwA6b.js.map +1 -0
  20. package/dist/assets/JsonReporter-BqDJorX-.js +2 -0
  21. package/dist/assets/JsonReporter-BqDJorX-.js.map +1 -0
  22. package/dist/assets/MarkdownReporter-B1FEpc6-.js +53 -0
  23. package/dist/assets/MarkdownReporter-B1FEpc6-.js.map +1 -0
  24. package/dist/assets/ZipPackager-B4xx8LbF.js +3 -0
  25. package/dist/assets/ZipPackager-B4xx8LbF.js.map +1 -0
  26. package/dist/assets/_baseUniq-Nm59UrQz.js +2 -0
  27. package/dist/assets/_baseUniq-Nm59UrQz.js.map +1 -0
  28. package/dist/assets/arc-BVr5R-xB.js +2 -0
  29. package/dist/assets/arc-BVr5R-xB.js.map +1 -0
  30. package/dist/assets/architectureDiagram-VXUJARFQ-C-olLUHb.js +37 -0
  31. package/dist/assets/architectureDiagram-VXUJARFQ-C-olLUHb.js.map +1 -0
  32. package/dist/assets/blockDiagram-VD42YOAC-B4incSX8.js +123 -0
  33. package/dist/assets/blockDiagram-VD42YOAC-B4incSX8.js.map +1 -0
  34. package/dist/assets/c4Diagram-YG6GDRKO-BJxhcb17.js +11 -0
  35. package/dist/assets/c4Diagram-YG6GDRKO-BJxhcb17.js.map +1 -0
  36. package/dist/assets/channel-CjhOgOS9.js +2 -0
  37. package/dist/assets/channel-CjhOgOS9.js.map +1 -0
  38. package/dist/assets/chunk-4BX2VUAB-BIe6iK-b.js +2 -0
  39. package/dist/assets/chunk-4BX2VUAB-BIe6iK-b.js.map +1 -0
  40. package/dist/assets/chunk-55IACEB6-CA6P5Ey6.js +2 -0
  41. package/dist/assets/chunk-55IACEB6-CA6P5Ey6.js.map +1 -0
  42. package/dist/assets/chunk-B4BG7PRW-licIQLj-.js +166 -0
  43. package/dist/assets/chunk-B4BG7PRW-licIQLj-.js.map +1 -0
  44. package/dist/assets/chunk-DI55MBZ5-CxFpzZDS.js +221 -0
  45. package/dist/assets/chunk-DI55MBZ5-CxFpzZDS.js.map +1 -0
  46. package/dist/assets/chunk-FMBD7UC4-VjnBPAq9.js +16 -0
  47. package/dist/assets/chunk-FMBD7UC4-VjnBPAq9.js.map +1 -0
  48. package/dist/assets/chunk-QN33PNHL-BcMwEixv.js +2 -0
  49. package/dist/assets/chunk-QN33PNHL-BcMwEixv.js.map +1 -0
  50. package/dist/assets/chunk-QZHKN3VN-6eOG0UZ6.js +2 -0
  51. package/dist/assets/chunk-QZHKN3VN-6eOG0UZ6.js.map +1 -0
  52. package/dist/assets/chunk-TZMSLE5B-B38vDpWG.js +2 -0
  53. package/dist/assets/chunk-TZMSLE5B-B38vDpWG.js.map +1 -0
  54. package/dist/assets/classDiagram-2ON5EDUG-CEjpoRuI.js +2 -0
  55. package/dist/assets/classDiagram-2ON5EDUG-CEjpoRuI.js.map +1 -0
  56. package/dist/assets/classDiagram-v2-WZHVMYZB-CEjpoRuI.js +2 -0
  57. package/dist/assets/classDiagram-v2-WZHVMYZB-CEjpoRuI.js.map +1 -0
  58. package/dist/assets/clone-FgHYDKfb.js +2 -0
  59. package/dist/assets/clone-FgHYDKfb.js.map +1 -0
  60. package/dist/assets/cose-bilkent-S5V4N54A-BFz6nI_Q.js +2 -0
  61. package/dist/assets/cose-bilkent-S5V4N54A-BFz6nI_Q.js.map +1 -0
  62. package/dist/assets/cytoscape.esm-CyJtwmzi.js +332 -0
  63. package/dist/assets/cytoscape.esm-CyJtwmzi.js.map +1 -0
  64. package/dist/assets/dagre-6UL2VRFP-B9xCTGce.js +5 -0
  65. package/dist/assets/dagre-6UL2VRFP-B9xCTGce.js.map +1 -0
  66. package/dist/assets/defaultLocale-DX6XiGOO.js +2 -0
  67. package/dist/assets/defaultLocale-DX6XiGOO.js.map +1 -0
  68. package/dist/assets/diagram-PSM6KHXK-BG-mPBdn.js +25 -0
  69. package/dist/assets/diagram-PSM6KHXK-BG-mPBdn.js.map +1 -0
  70. package/dist/assets/diagram-QEK2KX5R-BAd41szY.js +44 -0
  71. package/dist/assets/diagram-QEK2KX5R-BAd41szY.js.map +1 -0
  72. package/dist/assets/diagram-S2PKOQOG-Qhy7nrMX.js +25 -0
  73. package/dist/assets/diagram-S2PKOQOG-Qhy7nrMX.js.map +1 -0
  74. package/dist/assets/erDiagram-Q2GNP2WA-HJD-sygr.js +61 -0
  75. package/dist/assets/erDiagram-Q2GNP2WA-HJD-sygr.js.map +1 -0
  76. package/dist/assets/flowDiagram-NV44I4VS-DcFzPV5l.js +163 -0
  77. package/dist/assets/flowDiagram-NV44I4VS-DcFzPV5l.js.map +1 -0
  78. package/dist/assets/ganttDiagram-JELNMOA3-5hzmn_YM.js +268 -0
  79. package/dist/assets/ganttDiagram-JELNMOA3-5hzmn_YM.js.map +1 -0
  80. package/dist/assets/gitGraphDiagram-NY62KEGX-BJoaRoQP.js +66 -0
  81. package/dist/assets/gitGraphDiagram-NY62KEGX-BJoaRoQP.js.map +1 -0
  82. package/dist/assets/graph-iTkoc_Qp.js +2 -0
  83. package/dist/assets/graph-iTkoc_Qp.js.map +1 -0
  84. package/dist/assets/index-C0N3Q-wf.js +404 -0
  85. package/dist/assets/index-C0N3Q-wf.js.map +1 -0
  86. package/dist/assets/index-Dau71uup.css +1 -0
  87. package/dist/assets/infoDiagram-WHAUD3N6-Dm-9Locf.js +3 -0
  88. package/dist/assets/infoDiagram-WHAUD3N6-Dm-9Locf.js.map +1 -0
  89. package/dist/assets/init-Gi6I4Gst.js +2 -0
  90. package/dist/assets/init-Gi6I4Gst.js.map +1 -0
  91. package/dist/assets/journeyDiagram-XKPGCS4Q-Cn4q49x5.js +140 -0
  92. package/dist/assets/journeyDiagram-XKPGCS4Q-Cn4q49x5.js.map +1 -0
  93. package/dist/assets/kanban-definition-3W4ZIXB7-lUx8-faE.js +90 -0
  94. package/dist/assets/kanban-definition-3W4ZIXB7-lUx8-faE.js.map +1 -0
  95. package/dist/assets/katex-CBSAILhF.js +262 -0
  96. package/dist/assets/katex-CBSAILhF.js.map +1 -0
  97. package/dist/assets/layout-BNMvCxLN.js +2 -0
  98. package/dist/assets/layout-BNMvCxLN.js.map +1 -0
  99. package/dist/assets/linear-OqJg3PPm.js +2 -0
  100. package/dist/assets/linear-OqJg3PPm.js.map +1 -0
  101. package/dist/assets/min-N_DZlU1c.js +2 -0
  102. package/dist/assets/min-N_DZlU1c.js.map +1 -0
  103. package/dist/assets/mindmap-definition-VGOIOE7T-C43AGCOz.js +69 -0
  104. package/dist/assets/mindmap-definition-VGOIOE7T-C43AGCOz.js.map +1 -0
  105. package/dist/assets/ordinal-Cboi1Yqb.js +2 -0
  106. package/dist/assets/ordinal-Cboi1Yqb.js.map +1 -0
  107. package/dist/assets/pieDiagram-ADFJNKIX-COl1BPcc.js +31 -0
  108. package/dist/assets/pieDiagram-ADFJNKIX-COl1BPcc.js.map +1 -0
  109. package/dist/assets/quadrantDiagram-AYHSOK5B-C-fSINkS.js +8 -0
  110. package/dist/assets/quadrantDiagram-AYHSOK5B-C-fSINkS.js.map +1 -0
  111. package/dist/assets/requirementDiagram-UZGBJVZJ-DSag9Z4m.js +65 -0
  112. package/dist/assets/requirementDiagram-UZGBJVZJ-DSag9Z4m.js.map +1 -0
  113. package/dist/assets/sankeyDiagram-TZEHDZUN-JyvYJ7BV.js +11 -0
  114. package/dist/assets/sankeyDiagram-TZEHDZUN-JyvYJ7BV.js.map +1 -0
  115. package/dist/assets/sequenceDiagram-WL72ISMW-GkUPZQOc.js +146 -0
  116. package/dist/assets/sequenceDiagram-WL72ISMW-GkUPZQOc.js.map +1 -0
  117. package/dist/assets/stateDiagram-FKZM4ZOC-DiJHFrza.js +2 -0
  118. package/dist/assets/stateDiagram-FKZM4ZOC-DiJHFrza.js.map +1 -0
  119. package/dist/assets/stateDiagram-v2-4FDKWEC3-BgdSYitm.js +2 -0
  120. package/dist/assets/stateDiagram-v2-4FDKWEC3-BgdSYitm.js.map +1 -0
  121. package/dist/assets/timeline-definition-IT6M3QCI-BIeoFfU5.js +62 -0
  122. package/dist/assets/timeline-definition-IT6M3QCI-BIeoFfU5.js.map +1 -0
  123. package/dist/assets/treemap-KMMF4GRG-BDDqLxLB.js +129 -0
  124. package/dist/assets/treemap-KMMF4GRG-BDDqLxLB.js.map +1 -0
  125. package/dist/assets/xychartDiagram-PRI3JC2R-CUzWjNyv.js +8 -0
  126. package/dist/assets/xychartDiagram-PRI3JC2R-CUzWjNyv.js.map +1 -0
  127. package/dist/index.html +13 -0
  128. package/index.html +12 -0
  129. package/package.json +74 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownReporter-B1FEpc6-.js","sources":["../../src/core/reporters/markdown/MarkdownFormatter.ts","../../src/core/reporters/MarkdownReporter.ts"],"sourcesContent":["/**\n * Markdown formatting utility class for PPSB\n * Provides static helper methods for generating markdown content\n */\nimport type { FileNode } from '../../types/blueprint.js';\n\nexport default class MarkdownFormatter {\n /**\n * Generate a markdown table with proper alignment\n * @param headers - Table header labels\n * @param rows - Array of row data (each row is an array of cell values)\n * @param alignment - Optional alignment for each column ('left' | 'center' | 'right'), defaults to 'left'\n * @returns Formatted markdown table string\n *\n * @example\n * ```typescript\n * const table = MarkdownFormatter.formatTable(\n * ['Name', 'Type', 'Required'],\n * [\n * ['id', 'String', 'Yes'],\n * ['name', 'String', 'No']\n * ],\n * ['left', 'center', 'right']\n * );\n * ```\n */\n static formatTable(\n headers: string[],\n rows: string[][],\n alignment?: ('left' | 'center' | 'right')[]\n ): string {\n if (headers.length === 0) {\n return '';\n }\n\n const alignments = alignment || headers.map(() => 'left');\n\n // Escape pipe characters in content\n const escapePipes = (text: string): string => {\n return (text || '').replace(/\\|/g, '\\\\|');\n };\n\n // Build header row\n const headerRow = '| ' + headers.map(escapePipes).join(' | ') + ' |';\n\n // Build separator row with alignment\n const separatorRow = '| ' + headers.map((_, i) => {\n const align = alignments[i] || 'left';\n switch (align) {\n case 'center':\n return ':--------:';\n case 'right':\n return '---------:';\n default:\n return '----------';\n }\n }).join(' | ') + ' |';\n\n // Build data rows\n const dataRows = rows.map(row => {\n const cells = headers.map((_, i) => escapePipes(row[i] || ''));\n return '| ' + cells.join(' | ') + ' |';\n });\n\n return [headerRow, separatorRow, ...dataRows].join('\\n');\n }\n\n /**\n * Format a badge with emoji/symbol based on type\n * @param text - Badge text\n * @param type - Badge type (success, warning, error, info)\n * @returns Formatted badge string\n *\n * @example\n * ```typescript\n * MarkdownFormatter.formatBadge('Active', 'success'); // ✅ Active\n * MarkdownFormatter.formatBadge('Warning', 'warning'); // ⚠️ Warning\n * ```\n */\n static formatBadge(text: string, type: 'success' | 'warning' | 'error' | 'info'): string {\n const icons = {\n success: '✅',\n warning: '⚠️',\n error: '❌',\n info: 'ℹ️'\n };\n\n return `${icons[type]} ${text}`;\n }\n\n /**\n * Format a markdown link\n * @param text - Link display text\n * @param url - Link URL\n * @returns Formatted markdown link\n *\n * @example\n * ```typescript\n * MarkdownFormatter.formatLink('Google', 'https://google.com'); // [Google](https://google.com)\n * ```\n */\n static formatLink(text: string, url: string): string {\n return `[${text}](${url})`;\n }\n\n /**\n * Format a code block with language syntax highlighting\n * @param code - Code content\n * @param language - Programming language identifier\n * @returns Formatted fenced code block\n *\n * @example\n * ```typescript\n * MarkdownFormatter.formatCodeBlock('console.log(\"hello\");', 'javascript');\n * // Returns:\n * // ```javascript\n * // console.log(\"hello\");\n * // ```\n * ```\n */\n static formatCodeBlock(code: string, language: string): string {\n return `\\`\\`\\`${language}\\n${code}\\n\\`\\`\\``;\n }\n\n /**\n * Format a markdown list (ordered or unordered)\n * @param items - List items\n * @param ordered - Whether to create an ordered list (default: false)\n * @returns Formatted markdown list\n *\n * @example\n * ```typescript\n * MarkdownFormatter.formatList(['Apple', 'Banana'], false);\n * // - Apple\n * // - Banana\n *\n * MarkdownFormatter.formatList(['First', 'Second'], true);\n * // 1. First\n * // 2. Second\n * ```\n */\n static formatList(items: string[], ordered: boolean = false): string {\n if (items.length === 0) {\n return '';\n }\n\n if (ordered) {\n return items.map((item, index) => `${index + 1}. ${item}`).join('\\n');\n } else {\n return items.map(item => `- ${item}`).join('\\n');\n }\n }\n\n /**\n * Format a markdown heading\n * @param text - Heading text\n * @param level - Heading level (1-6), will be clamped to this range\n * @returns Formatted markdown heading\n *\n * @example\n * ```typescript\n * MarkdownFormatter.formatHeading('Title', 1); // # Title\n * MarkdownFormatter.formatHeading('Subtitle', 2); // ## Subtitle\n * ```\n */\n static formatHeading(text: string, level: number): string {\n const clampedLevel = Math.max(1, Math.min(6, level));\n const hashes = '#'.repeat(clampedLevel);\n return `${hashes} ${text}`;\n }\n\n /**\n * Format a horizontal rule\n * @returns Markdown horizontal rule\n *\n * @example\n * ```typescript\n * MarkdownFormatter.formatHorizontalRule(); // ---\n * ```\n */\n static formatHorizontalRule(): string {\n return '---';\n }\n\n /**\n * Escape special markdown characters in user content\n * @param text - Text to escape\n * @returns Escaped text safe for markdown\n *\n * @example\n * ```typescript\n * MarkdownFormatter.escapeMarkdown('Hello *world*'); // Hello \\\\*world\\\\*\n * ```\n */\n static escapeMarkdown(text: string): string {\n if (!text) {\n return '';\n }\n\n // Escape markdown special characters\n const specialChars = /([*_\\[\\]()#+\\-.!|\\\\])/g;\n return text.replace(specialChars, '\\\\$1');\n }\n\n /**\n * Generate ASCII file tree representation\n * @param node - Root file node\n * @returns Formatted file tree string\n *\n * @example\n * ```typescript\n * const tree: FileNode = {\n * name: 'blueprint',\n * type: 'directory',\n * path: 'blueprint',\n * children: [\n * { name: 'README.md', type: 'file', path: 'blueprint/README.md' },\n * {\n * name: 'entities',\n * type: 'directory',\n * path: 'blueprint/entities',\n * children: [\n * { name: 'account.md', type: 'file', path: 'blueprint/entities/account.md' }\n * ]\n * }\n * ]\n * };\n * MarkdownFormatter.formatFileTree(tree);\n * // blueprint/\n * // ├── README.md\n * // └── entities/\n * // └── account.md\n * ```\n */\n static formatFileTree(node: FileNode): string {\n return this.formatFileTreeRecursive(node, '', true, true);\n }\n\n /**\n * Helper method for recursive file tree formatting\n * @param node - Current file node\n * @param prefix - Current prefix for indentation\n * @param isLast - Whether this node is the last sibling\n * @param isRoot - Whether this is the root node\n * @returns Formatted file tree string\n */\n private static formatFileTreeRecursive(\n node: FileNode,\n prefix: string,\n isLast: boolean,\n isRoot: boolean\n ): string {\n const lines: string[] = [];\n\n // Format current node\n const nodeName = node.name + (node.type === 'directory' ? '/' : '');\n\n if (isRoot) {\n lines.push(nodeName);\n } else {\n const connector = isLast ? '└── ' : '├── ';\n lines.push(prefix + connector + nodeName);\n }\n\n // Process children\n if (node.children && node.children.length > 0) {\n node.children.forEach((child, index) => {\n const isLastChild = index === node.children!.length - 1;\n\n // Calculate new prefix for children\n let newPrefix: string;\n if (isRoot) {\n newPrefix = '';\n } else {\n newPrefix = prefix + (isLast ? ' ' : '│ ');\n }\n\n const childLines = this.formatFileTreeRecursive(child, newPrefix, isLastChild, false);\n lines.push(childLines);\n });\n }\n\n return lines.join('\\n');\n }\n}\n","/**\n * MarkdownReporter - Generates complete markdown documentation for blueprints\n *\n * Generates a comprehensive file structure with:\n * - Root README with ERD and navigation\n * - Summary files (metrics, all-plugins, all-flows, etc.)\n * - Entity-specific documentation (overview, schema, automation, execution pipeline)\n * - Analysis files (complexity, performance risks, migration recommendations)\n */\nimport type {\n BlueprintResult,\n EntityBlueprint,\n FileNode,\n MarkdownExport,\n PluginStep,\n Flow,\n BusinessRule,\n WebResource,\n PerformanceRisk,\n CrossEntityLink,\n ExternalEndpoint,\n ERDDefinition,\n EntityQuickLink,\n} from '../types/blueprint.js';\nimport type { ClassicWorkflow } from '../types/classicWorkflow.js';\nimport type { BusinessProcessFlow } from '../types/businessProcessFlow.js';\nimport type { CustomAPI } from '../types/customApi.js';\nimport MarkdownFormatter from './markdown/MarkdownFormatter.js';\n\nexport class MarkdownReporter {\n /**\n * Generate complete markdown export from blueprint result\n */\n generate(result: BlueprintResult): MarkdownExport {\n const files = new Map<string, string>();\n\n // Generate root README\n files.set('README.md', this.generateReadme(result));\n\n // Generate summary files\n files.set('summary/metrics.md', this.generateMetrics(result));\n files.set('summary/all-plugins.md', this.generateAllPlugins(result));\n files.set('summary/all-flows.md', this.generateAllFlows(result));\n files.set('summary/all-business-rules.md', this.generateAllBusinessRules(result));\n files.set('summary/all-classic-workflows.md', this.generateAllClassicWorkflows(result));\n files.set('summary/all-webresources.md', this.generateAllWebResources(result));\n files.set('summary/all-custom-apis.md', this.generateAllCustomAPIs(result));\n files.set('summary/all-environment-variables.md', this.generateAllEnvironmentVariables(result));\n files.set('summary/all-connection-references.md', this.generateAllConnectionReferences(result));\n files.set('summary/all-business-process-flows.md', this.generateAllBusinessProcessFlows(result));\n\n if (result.externalEndpoints && result.externalEndpoints.length > 0) {\n files.set('summary/external-integrations.md', this.generateExternalIntegrations(result));\n }\n\n if (result.crossEntityLinks && result.crossEntityLinks.length > 0) {\n files.set('summary/cross-entity-automation.md', this.generateCrossEntityAutomation(result));\n }\n\n if (result.solutionDistribution && result.solutionDistribution.length > 0) {\n files.set('summary/solution-distribution.md', this.generateSolutionDistribution(result));\n }\n\n // Generate security files\n if (result.securityRoles || result.fieldSecurityProfiles || result.attributeMaskingRules || result.columnSecurityProfiles) {\n files.set('security/overview.md', this.generateSecurityOverview(result));\n\n // Generate individual role pages\n if (result.securityRoles) {\n for (const role of result.securityRoles) {\n const roleName = role.name.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase();\n files.set(`security/roles/${roleName}.md`, this.generateSecurityRoleDetail(role));\n }\n }\n\n // Generate field security profiles page\n if (result.fieldSecurityProfiles && result.fieldSecurityProfiles.length > 0) {\n files.set('security/field-security-profiles.md', this.generateFieldSecurityProfiles(result));\n }\n\n // Generate attribute masking rules page\n if (result.attributeMaskingRules && result.attributeMaskingRules.length > 0) {\n files.set('security/attribute-masking.md', this.generateAttributeMaskingRules(result));\n }\n\n // Generate column security profiles page\n if (result.columnSecurityProfiles && result.columnSecurityProfiles.length > 0) {\n files.set('security/column-security.md', this.generateColumnSecurityProfiles(result));\n }\n }\n\n // Generate entity-specific files\n for (const entity of result.entities) {\n const name = entity.entity.LogicalName;\n files.set(`entities/${name}/overview.md`, this.generateEntityOverview(entity, result));\n files.set(`entities/${name}/schema.md`, this.generateEntitySchema(entity));\n\n // Only generate automation.md if there's automation\n if (this.hasAutomation(entity, result)) {\n files.set(`entities/${name}/automation.md`, this.generateEntityAutomation(entity, result));\n }\n\n // Only generate execution pipeline if there's server-side automation\n if (this.hasExecutionPipeline(entity, result)) {\n files.set(`entities/${name}/execution-pipeline.md`, this.generateExecutionPipeline(entity, result));\n }\n\n // Only generate BPF file if entity has BPFs\n const bpfs = this.getEntityBpfs(entity.entity.LogicalName, result);\n if (bpfs.length > 0) {\n files.set(`entities/${name}/business-process-flows.md`, this.generateEntityBpfs(entity, bpfs));\n }\n }\n\n // Generate analysis files\n files.set('analysis/complexity-scores.md', this.generateComplexityScores(result));\n files.set('analysis/performance-risks.md', this.generatePerformanceRisks(result));\n files.set('analysis/migration-recommendations.md', this.generateMigrationRecommendations(result));\n\n // Calculate total size\n const totalSize = Array.from(files.values()).reduce(\n (sum, content) => sum + new TextEncoder().encode(content).length,\n 0\n );\n\n // Build file tree structure\n const structure = this.buildFileTree(files);\n\n return {\n files,\n structure,\n totalFiles: files.size,\n totalSize,\n };\n }\n\n /**\n * Generate root README.md with ERD, legend, and navigation\n */\n private generateReadme(result: BlueprintResult): string {\n const sections: string[] = [];\n\n // Title and metadata\n sections.push(MarkdownFormatter.formatHeading('Power Platform Solution Blueprint', 1));\n sections.push('');\n sections.push(`**Generated:** ${result.metadata.generatedAt.toISOString()}`);\n sections.push(`**Environment:** ${result.metadata.environment}`);\n sections.push(`**Scope:** ${result.metadata.scope.description}`);\n sections.push('');\n sections.push(MarkdownFormatter.formatHorizontalRule());\n sections.push('');\n\n // ERD Section\n if (result.erd) {\n sections.push(MarkdownFormatter.formatHeading('Entity Relationship Diagram', 2));\n sections.push('');\n sections.push(this.generateERDSection(result.erd));\n sections.push('');\n sections.push(MarkdownFormatter.formatHorizontalRule());\n sections.push('');\n }\n\n // Quick metrics summary\n sections.push(MarkdownFormatter.formatHeading('Summary', 2));\n sections.push('');\n sections.push(this.generateQuickMetrics(result));\n sections.push('');\n sections.push(MarkdownFormatter.formatHorizontalRule());\n sections.push('');\n\n // Entity quick links\n if (result.erd && result.erd.entityQuickLinks.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Entities', 2));\n sections.push('');\n sections.push(this.generateEntityQuickLinksTable(result.erd.entityQuickLinks));\n sections.push('');\n sections.push(MarkdownFormatter.formatHorizontalRule());\n sections.push('');\n }\n\n // Navigation links\n sections.push(MarkdownFormatter.formatHeading('Documentation Structure', 2));\n sections.push('');\n sections.push(this.generateNavigationLinks());\n sections.push('');\n\n return sections.join('\\n');\n }\n\n /**\n * Generate ERD section with diagrams and legend\n */\n private generateERDSection(erd: ERDDefinition): string {\n const sections: string[] = [];\n\n // Publisher legend\n if (erd.legend.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Publisher Legend', 3));\n sections.push('');\n\n const headers = ['Publisher', 'Prefix', 'Entities', 'Color'];\n const rows = erd.legend.map(pub => [\n pub.publisherName,\n pub.publisherPrefix,\n pub.entityCount.toString(),\n pub.color,\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // Diagram - Use only the first diagram (comprehensive view) to match UI behavior\n if (erd.diagrams.length > 0) {\n const diagram = erd.diagrams[0];\n sections.push(MarkdownFormatter.formatHeading(diagram.title, 3));\n sections.push('');\n if (diagram.description) {\n sections.push(diagram.description);\n sections.push('');\n }\n sections.push(MarkdownFormatter.formatCodeBlock(diagram.mermaidDiagram, 'mermaid'));\n sections.push('');\n }\n\n // Warnings\n if (erd.warnings && erd.warnings.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Diagram Warnings', 3));\n sections.push('');\n sections.push(MarkdownFormatter.formatList(erd.warnings.map(w => `⚠️ ${w}`)));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate quick metrics summary\n */\n private generateQuickMetrics(result: BlueprintResult): string {\n const items: string[] = [];\n\n items.push(`**${result.summary.totalEntities}** Entities`);\n items.push(`**${result.summary.totalPlugins}** Plugins (${result.summary.totalPluginPackages} assemblies)`);\n items.push(`**${result.summary.totalFlows}** Cloud Flows`);\n items.push(`**${result.summary.totalBusinessRules}** Business Rules`);\n items.push(`**${result.summary.totalClassicWorkflows}** Classic Workflows ⚠️`);\n items.push(`**${result.summary.totalBusinessProcessFlows}** Business Process Flows`);\n items.push(`**${result.summary.totalWebResources}** Web Resources`);\n items.push(`**${result.summary.totalCustomAPIs}** Custom APIs`);\n items.push(`**${result.summary.totalEnvironmentVariables}** Environment Variables`);\n items.push(`**${result.summary.totalConnectionReferences}** Connection References`);\n items.push(`**${result.summary.totalSecurityRoles}** Security Roles`);\n items.push(`**${result.summary.totalFieldSecurityProfiles}** Field Security Profiles`);\n\n return MarkdownFormatter.formatList(items);\n }\n\n /**\n * Generate entity quick links table\n */\n private generateEntityQuickLinksTable(links: EntityQuickLink[]): string {\n const headers = ['Entity', 'Publisher', 'Fields', 'Plugins', 'Flows', 'Rules', 'Complexity'];\n const rows = links.map(link => [\n MarkdownFormatter.formatLink(link.displayName, `entities/${link.logicalName}/overview.md`),\n link.publisherPrefix,\n link.fieldCount.toString(),\n link.pluginCount.toString(),\n link.flowCount.toString(),\n link.businessRuleCount.toString(),\n this.formatComplexityBadge(link.complexity),\n ]);\n\n return MarkdownFormatter.formatTable(headers, rows);\n }\n\n /**\n * Generate navigation links\n */\n private generateNavigationLinks(): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Summary', 3));\n sections.push('');\n sections.push(MarkdownFormatter.formatList([\n MarkdownFormatter.formatLink('Metrics & Statistics', 'summary/metrics.md'),\n MarkdownFormatter.formatLink('All Plugins', 'summary/all-plugins.md'),\n MarkdownFormatter.formatLink('All Flows', 'summary/all-flows.md'),\n MarkdownFormatter.formatLink('All Business Rules', 'summary/all-business-rules.md'),\n MarkdownFormatter.formatLink('All Classic Workflows', 'summary/all-classic-workflows.md'),\n MarkdownFormatter.formatLink('All Web Resources', 'summary/all-webresources.md'),\n MarkdownFormatter.formatLink('All Custom APIs', 'summary/all-custom-apis.md'),\n MarkdownFormatter.formatLink('All Environment Variables', 'summary/all-environment-variables.md'),\n MarkdownFormatter.formatLink('All Connection References', 'summary/all-connection-references.md'),\n MarkdownFormatter.formatLink('All Business Process Flows', 'summary/all-business-process-flows.md'),\n MarkdownFormatter.formatLink('External Integrations', 'summary/external-integrations.md'),\n MarkdownFormatter.formatLink('Cross-Entity Automation', 'summary/cross-entity-automation.md'),\n MarkdownFormatter.formatLink('Solution Distribution', 'summary/solution-distribution.md'),\n ]));\n sections.push('');\n\n sections.push(MarkdownFormatter.formatHeading('Security', 3));\n sections.push('');\n sections.push(MarkdownFormatter.formatList([\n MarkdownFormatter.formatLink('Security Overview', 'security/overview.md'),\n MarkdownFormatter.formatLink('Field Security Profiles', 'security/field-security-profiles.md'),\n MarkdownFormatter.formatLink('Attribute Masking Rules', 'security/attribute-masking.md'),\n MarkdownFormatter.formatLink('Column Security Profiles', 'security/column-security.md'),\n ]));\n sections.push('');\n\n sections.push(MarkdownFormatter.formatHeading('Analysis', 3));\n sections.push('');\n sections.push(MarkdownFormatter.formatList([\n MarkdownFormatter.formatLink('Complexity Scores', 'analysis/complexity-scores.md'),\n MarkdownFormatter.formatLink('Performance Risks', 'analysis/performance-risks.md'),\n MarkdownFormatter.formatLink('Migration Recommendations', 'analysis/migration-recommendations.md'),\n ]));\n sections.push('');\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/metrics.md\n */\n private generateMetrics(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Blueprint Metrics & Statistics', 1));\n sections.push('');\n\n // Overall counts\n sections.push(MarkdownFormatter.formatHeading('Component Counts', 2));\n sections.push('');\n const headers = ['Component Type', 'Count'];\n const rows = [\n ['Entities', result.summary.totalEntities.toString()],\n ['Attributes (Fields)', result.summary.totalAttributes.toString()],\n ['Plugins', result.summary.totalPlugins.toString()],\n ['Plugin Assemblies', result.summary.totalPluginPackages.toString()],\n ['Cloud Flows', result.summary.totalFlows.toString()],\n ['Business Rules', result.summary.totalBusinessRules.toString()],\n ['Classic Workflows', result.summary.totalClassicWorkflows.toString()],\n ['Business Process Flows', result.summary.totalBusinessProcessFlows.toString()],\n ['Web Resources', result.summary.totalWebResources.toString()],\n ['Custom APIs', result.summary.totalCustomAPIs.toString()],\n ['Environment Variables', result.summary.totalEnvironmentVariables.toString()],\n ['Connection References', result.summary.totalConnectionReferences.toString()],\n ['Global Choices', result.summary.totalGlobalChoices.toString()],\n ['Custom Connectors', result.summary.totalCustomConnectors.toString()],\n ['Security Roles', result.summary.totalSecurityRoles.toString()],\n ['Field Security Profiles', result.summary.totalFieldSecurityProfiles.toString()],\n ['Canvas Apps', result.summary.totalCanvasApps.toString()],\n ['Custom Pages', result.summary.totalCustomPages.toString()],\n ];\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n // External calls summary\n if (result.externalEndpoints && result.externalEndpoints.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('External Integration Summary', 2));\n sections.push('');\n sections.push(`**Total External Endpoints:** ${result.externalEndpoints.length}`);\n sections.push('');\n\n const pluginsWithCalls = result.plugins.filter(() => {\n // Check if plugin has external calls (would need to be tracked in discovery)\n return false; // Placeholder - would need actual external call detection\n }).length;\n\n const flowsWithCalls = result.flows.filter(f => f.hasExternalCalls).length;\n\n sections.push(`- Plugins with external calls: ${pluginsWithCalls}`);\n sections.push(`- Flows with external calls: ${flowsWithCalls}`);\n sections.push('');\n\n sections.push(MarkdownFormatter.formatLink('View detailed external integrations', 'external-integrations.md'));\n sections.push('');\n }\n\n // Performance risk summary\n const allRisks: PerformanceRisk[] = [];\n for (const entity of result.entities) {\n if (entity.performanceRisks) {\n allRisks.push(...entity.performanceRisks);\n }\n }\n\n if (allRisks.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Performance Risk Summary', 2));\n sections.push('');\n\n const critical = allRisks.filter(r => r.severity === 'Critical').length;\n const high = allRisks.filter(r => r.severity === 'High').length;\n const medium = allRisks.filter(r => r.severity === 'Medium').length;\n const low = allRisks.filter(r => r.severity === 'Low').length;\n\n sections.push(`- ${MarkdownFormatter.formatBadge(`${critical} Critical`, 'error')}`);\n sections.push(`- ${MarkdownFormatter.formatBadge(`${high} High`, 'error')}`);\n sections.push(`- ${MarkdownFormatter.formatBadge(`${medium} Medium`, 'warning')}`);\n sections.push(`- ${MarkdownFormatter.formatBadge(`${low} Low`, 'info')}`);\n sections.push('');\n\n sections.push(MarkdownFormatter.formatLink('View detailed performance analysis', '../analysis/performance-risks.md'));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-plugins.md\n */\n private generateAllPlugins(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Plugins', 1));\n sections.push('');\n sections.push(`**Total Plugins:** ${result.summary.totalPlugins}`);\n sections.push(`**Total Assemblies:** ${result.summary.totalPluginPackages}`);\n sections.push('');\n\n if (result.plugins.length === 0) {\n sections.push('No plugins found in this scope.');\n return sections.join('\\n');\n }\n\n // Group by assembly -> entity -> message\n const grouped = this.groupPluginsByAssembly(result.plugins);\n\n for (const [assemblyName, entities] of grouped) {\n sections.push(MarkdownFormatter.formatHeading(assemblyName, 2));\n sections.push('');\n\n for (const [entityName, plugins] of entities) {\n sections.push(MarkdownFormatter.formatHeading(entityName, 3));\n sections.push('');\n\n const headers = ['Name', 'Message', 'Stage', 'Mode', 'Rank', 'External', 'Solution', 'Description'];\n const rows = plugins.map(plugin => [\n plugin.name,\n plugin.message,\n plugin.stageName,\n plugin.modeName,\n plugin.rank.toString(),\n this.hasExternalCalls(plugin) ? '🌐' : '',\n this.getPluginSolution(plugin, result),\n plugin.description || '',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n }\n\n // Performance warnings\n const syncWithExternal = result.plugins.filter(p =>\n p.modeName === 'Synchronous' && this.hasExternalCalls(p)\n );\n\n if (syncWithExternal.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('⚠️ Performance Warnings', 2));\n sections.push('');\n sections.push('The following synchronous plugins may have external calls, which can impact performance:');\n sections.push('');\n\n const warnHeaders = ['Plugin', 'Entity', 'Message', 'Stage'];\n const warnRows = syncWithExternal.map(p => [\n p.name,\n p.entity,\n p.message,\n p.stageName,\n ]);\n\n sections.push(MarkdownFormatter.formatTable(warnHeaders, warnRows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-flows.md\n */\n private generateAllFlows(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Cloud Flows', 1));\n sections.push('');\n sections.push(`**Total Flows:** ${result.summary.totalFlows}`);\n sections.push('');\n\n if (result.flows.length === 0) {\n sections.push('No flows found in this scope.');\n return sections.join('\\n');\n }\n\n // Group by entity -> trigger type\n const grouped = this.groupFlowsByEntity(result.flows);\n\n for (const [entityName, flows] of grouped) {\n sections.push(MarkdownFormatter.formatHeading(entityName || 'Manual/Scheduled Flows', 2));\n sections.push('');\n\n const headers = ['Name', 'Trigger', 'Scope', 'State', 'External', 'Owner', 'Modified', 'Description'];\n const rows = flows.map(flow => [\n flow.name,\n `${flow.definition.triggerType} (${flow.definition.triggerEvent})`,\n flow.scopeName,\n this.formatFlowStateBadge(flow.state),\n flow.hasExternalCalls ? '🌐' : '',\n flow.owner,\n this.formatDate(flow.modifiedOn),\n flow.description || '',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-business-rules.md\n */\n private generateAllBusinessRules(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Business Rules', 1));\n sections.push('');\n sections.push(`**Total Business Rules:** ${result.summary.totalBusinessRules}`);\n sections.push('');\n\n if (result.businessRules.length === 0) {\n sections.push('No business rules found in this scope.');\n return sections.join('\\n');\n }\n\n // Group by entity\n const grouped = this.groupBusinessRulesByEntity(result.businessRules);\n\n for (const [entityName, rules] of grouped) {\n sections.push(MarkdownFormatter.formatHeading(entityName, 2));\n sections.push('');\n\n const headers = ['Name', 'Scope', 'Context', 'State', 'Conditions', 'Actions', 'Modified'];\n const rows = rules.map(rule => [\n rule.name,\n rule.scopeName,\n rule.definition.executionContext,\n rule.state === 'Active' ? MarkdownFormatter.formatBadge('Active', 'success') : MarkdownFormatter.formatBadge('Draft', 'warning'),\n rule.definition.conditions.length.toString(),\n rule.definition.actions.length.toString(),\n this.formatDate(rule.modifiedOn),\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-classic-workflows.md\n */\n private generateAllClassicWorkflows(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Classic Workflows', 1));\n sections.push('');\n sections.push('⚠️ **Classic workflows are deprecated and require migration to Power Automate.**');\n sections.push('');\n sections.push(`**Total Classic Workflows:** ${result.summary.totalClassicWorkflows}`);\n sections.push('');\n\n if (result.classicWorkflows.length === 0) {\n sections.push('No classic workflows found in this scope.');\n return sections.join('\\n');\n }\n\n // Group by entity\n const grouped = this.groupClassicWorkflowsByEntity(result.classicWorkflows);\n\n for (const [entityName, workflows] of grouped) {\n sections.push(MarkdownFormatter.formatHeading(entityName, 2));\n sections.push('');\n\n const headers = ['Name', 'Type', 'Mode', 'Triggers', 'State', 'Migration', 'Modified', 'Description'];\n const rows = workflows.map(wf => [\n wf.name,\n wf.typeName,\n wf.modeName,\n this.formatWorkflowTriggers(wf),\n wf.state,\n wf.migrationRecommendation?.complexity || 'Unknown',\n this.formatDate(wf.modifiedOn),\n wf.description || '',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n sections.push(MarkdownFormatter.formatHeading('Migration Required', 2));\n sections.push('');\n sections.push('See ' + MarkdownFormatter.formatLink('Migration Recommendations', '../analysis/migration-recommendations.md') + ' for detailed migration guidance.');\n sections.push('');\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-webresources.md\n */\n private generateAllWebResources(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Web Resources', 1));\n sections.push('');\n sections.push(`**Total Web Resources:** ${result.summary.totalWebResources}`);\n sections.push('');\n\n if (result.webResources.length === 0) {\n sections.push('No web resources found in this scope.');\n return sections.join('\\n');\n }\n\n // Group by type\n const grouped = this.groupWebResourcesByType(result.webResources);\n\n for (const [typeName, resources] of grouped) {\n sections.push(MarkdownFormatter.formatHeading(`${typeName} Files`, 2));\n sections.push('');\n\n const headers = ['Name', 'Display Name', 'Size', 'External Calls', 'Deprecated', 'Modified', 'Description'];\n const rows = resources.map(wr => [\n wr.name,\n wr.displayName,\n this.formatFileSize(wr.contentSize),\n wr.hasExternalCalls ? '🌐' : '',\n wr.isDeprecated ? '⚠️ Yes' : '',\n this.formatDate(wr.modifiedOn),\n wr.description || '',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // JavaScript analysis summary\n const jsResources = result.webResources.filter(wr => wr.typeName === 'JavaScript' && wr.analysis);\n if (jsResources.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('JavaScript Analysis', 2));\n sections.push('');\n\n const deprecatedCount = jsResources.filter(wr => wr.isDeprecated).length;\n const externalCallsCount = jsResources.filter(wr => wr.hasExternalCalls).length;\n const highComplexityCount = jsResources.filter(wr => wr.analysis?.complexity === 'High').length;\n\n sections.push(`- Using deprecated Xrm.Page API: **${deprecatedCount}** files`);\n sections.push(`- With external API calls: **${externalCallsCount}** files`);\n sections.push(`- High complexity: **${highComplexityCount}** files`);\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-custom-apis.md\n */\n private generateAllCustomAPIs(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Custom APIs', 1));\n sections.push('');\n sections.push(`**Total Custom APIs:** ${result.summary.totalCustomAPIs}`);\n sections.push('');\n\n if (result.customAPIs.length === 0) {\n sections.push('No custom APIs found in this scope.');\n return sections.join('\\n');\n }\n\n // Group by binding type\n const grouped = this.groupCustomAPIsByBinding(result.customAPIs);\n\n for (const [bindingType, apis] of grouped) {\n sections.push(MarkdownFormatter.formatHeading(`${bindingType} APIs`, 2));\n sections.push('');\n\n const headers = ['Name', 'Type', 'Bound Entity', 'Private', 'Parameters', 'Responses', 'Modified'];\n const rows = apis.map(api => [\n api.uniqueName,\n api.isFunction ? 'Function' : 'Action',\n api.boundEntityLogicalName || 'N/A',\n api.isPrivate ? 'Yes' : 'No',\n api.requestParameters.length.toString(),\n api.responseProperties.length.toString(),\n this.formatDate(api.modifiedOn),\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-environment-variables.md\n */\n private generateAllEnvironmentVariables(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Environment Variables', 1));\n sections.push('');\n sections.push(`**Total Environment Variables:** ${result.summary.totalEnvironmentVariables}`);\n sections.push('');\n\n if (result.environmentVariables.length === 0) {\n sections.push('No environment variables found in this scope.');\n return sections.join('\\n');\n }\n\n const headers = ['Schema Name', 'Type', 'Required', 'Has Value', 'Modified'];\n const rows = result.environmentVariables.map(env => [\n env.schemaName,\n env.typeName,\n env.isRequired ? 'Yes' : 'No',\n env.currentValue ? 'Yes' : 'No',\n this.formatDate(env.modifiedOn),\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n // Missing values warning\n const missingValues = result.environmentVariables.filter(env => env.isRequired && !env.currentValue);\n if (missingValues.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('⚠️ Missing Required Values', 2));\n sections.push('');\n sections.push('The following required environment variables have no current value:');\n sections.push('');\n sections.push(MarkdownFormatter.formatList(missingValues.map(env => env.schemaName)));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-connection-references.md\n */\n private generateAllConnectionReferences(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Connection References', 1));\n sections.push('');\n sections.push(`**Total Connection References:** ${result.summary.totalConnectionReferences}`);\n sections.push('');\n\n if (result.connectionReferences.length === 0) {\n sections.push('No connection references found in this scope.');\n return sections.join('\\n');\n }\n\n const headers = ['Name', 'Connector', 'Status', 'Modified'];\n const rows = result.connectionReferences.map(conn => [\n conn.displayName,\n conn.connectorDisplayName || 'Unknown',\n conn.connectionId ? MarkdownFormatter.formatBadge('Connected', 'success') : MarkdownFormatter.formatBadge('Not Connected', 'error'),\n this.formatDate(conn.modifiedOn),\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/all-business-process-flows.md\n */\n private generateAllBusinessProcessFlows(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('All Business Process Flows', 1));\n sections.push('');\n sections.push(`**Total Business Process Flows:** ${result.summary.totalBusinessProcessFlows}`);\n sections.push('');\n\n if (result.businessProcessFlows.length === 0) {\n sections.push('No business process flows found in this scope.');\n return sections.join('\\n');\n }\n\n // Group by primary entity\n const grouped = this.groupBpfsByEntity(result.businessProcessFlows);\n\n for (const [entityName, bpfs] of grouped) {\n sections.push(MarkdownFormatter.formatHeading(entityName, 2));\n sections.push('');\n\n const headers = ['Name', 'Stages', 'Entities', 'Cross-Entity', 'State', 'Modified'];\n const rows = bpfs.map(bpf => [\n bpf.name,\n bpf.definition.stages.length.toString(),\n bpf.definition.entities.join(', '),\n bpf.definition.crossEntityFlow ? 'Yes' : 'No',\n bpf.state === 'Active' ? MarkdownFormatter.formatBadge('Active', 'success') : MarkdownFormatter.formatBadge('Draft', 'warning'),\n this.formatDate(bpf.modifiedOn),\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/external-integrations.md\n */\n private generateExternalIntegrations(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('External Integrations', 1));\n sections.push('');\n\n if (!result.externalEndpoints || result.externalEndpoints.length === 0) {\n sections.push('No external integrations detected.');\n return sections.join('\\n');\n }\n\n sections.push(`**Total External Endpoints:** ${result.externalEndpoints.length}`);\n sections.push('');\n\n // Group by risk level\n const byRisk = new Map<string, ExternalEndpoint[]>();\n for (const endpoint of result.externalEndpoints) {\n const risk = endpoint.riskLevel;\n if (!byRisk.has(risk)) {\n byRisk.set(risk, []);\n }\n byRisk.get(risk)!.push(endpoint);\n }\n\n for (const [riskLevel, endpoints] of byRisk) {\n sections.push(MarkdownFormatter.formatHeading(`${riskLevel} Risk Endpoints`, 2));\n sections.push('');\n\n const headers = ['Domain', 'Protocol', 'Calls', 'Detected In'];\n const rows = endpoints.map(ep => [\n ep.domain,\n ep.protocol.toUpperCase(),\n ep.callCount.toString(),\n ep.detectedIn.length.toString() + ' components',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/cross-entity-automation.md\n */\n private generateCrossEntityAutomation(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Cross-Entity Automation', 1));\n sections.push('');\n\n if (!result.crossEntityLinks || result.crossEntityLinks.length === 0) {\n sections.push('> **Note:** Cross-entity automation analysis is coming in a future update.');\n return sections.join('\\n');\n }\n\n sections.push(`**Total Cross-Entity Links:** ${result.crossEntityLinks.length}`);\n sections.push('');\n\n // Group by automation type\n const byType = new Map<string, CrossEntityLink[]>();\n for (const link of result.crossEntityLinks) {\n if (!byType.has(link.automationType)) {\n byType.set(link.automationType, []);\n }\n byType.get(link.automationType)!.push(link);\n }\n\n for (const [type, links] of byType) {\n sections.push(MarkdownFormatter.formatHeading(type, 2));\n sections.push('');\n\n const headers = ['Source Entity', 'Target Entity', 'Automation', 'Operation', 'Mode'];\n const rows = links.map(link => [\n link.sourceEntityDisplayName,\n link.targetEntityDisplayName,\n link.automationName,\n link.operation,\n link.isAsynchronous ? 'Async' : 'Sync',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate summary/solution-distribution.md\n */\n private generateSolutionDistribution(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Solution Distribution', 1));\n sections.push('');\n\n if (!result.solutionDistribution || result.solutionDistribution.length === 0) {\n sections.push('No solution distribution information available.');\n return sections.join('\\n');\n }\n\n for (const solution of result.solutionDistribution) {\n sections.push(MarkdownFormatter.formatHeading(solution.solutionName, 2));\n sections.push('');\n sections.push(`**Publisher:** ${solution.publisher}`);\n sections.push(`**Version:** ${solution.version}`);\n sections.push(`**Managed:** ${solution.isManaged ? 'Yes' : 'No'}`);\n sections.push('');\n\n sections.push(MarkdownFormatter.formatHeading('Component Distribution', 3));\n sections.push('');\n\n const headers = ['Component Type', 'Count'];\n const rows = [\n ['Entities', solution.componentCounts.entities.toString()],\n ['Plugins', solution.componentCounts.plugins.toString()],\n ['Flows', solution.componentCounts.flows.toString()],\n ['Business Rules', solution.componentCounts.businessRules.toString()],\n ['Classic Workflows', solution.componentCounts.classicWorkflows.toString()],\n ['Business Process Flows', solution.componentCounts.bpfs.toString()],\n ['Web Resources', solution.componentCounts.webResources.toString()],\n ['Custom APIs', solution.componentCounts.customAPIs.toString()],\n ['Environment Variables', solution.componentCounts.environmentVariables.toString()],\n ['Connection References', solution.componentCounts.connectionReferences.toString()],\n ['Global Choices', solution.componentCounts.globalChoices.toString()],\n ];\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate entities/{entity}/overview.md\n */\n private generateEntityOverview(entity: EntityBlueprint, result: BlueprintResult): string {\n const sections: string[] = [];\n const meta = entity.entity;\n const displayName = meta.DisplayName?.UserLocalizedLabel?.Label || meta.LogicalName;\n\n sections.push(MarkdownFormatter.formatHeading(`${displayName} - Overview`, 1));\n sections.push('');\n\n // Quick stats card\n sections.push(MarkdownFormatter.formatHeading('Quick Stats', 2));\n sections.push('');\n sections.push(`- **Logical Name:** ${meta.LogicalName}`);\n sections.push(`- **Schema Name:** ${meta.SchemaName}`);\n sections.push(`- **Primary ID:** ${meta.PrimaryIdAttribute}`);\n sections.push(`- **Primary Name:** ${meta.PrimaryNameAttribute}`);\n sections.push(`- **Custom Entity:** ${meta.IsCustomEntity ? 'Yes' : 'No'}`);\n sections.push(`- **Managed:** ${meta.IsManaged ? 'Yes' : 'No'}`);\n sections.push('');\n sections.push(`- **Total Attributes:** ${meta.Attributes?.length || 0}`);\n sections.push(`- **Plugins:** ${entity.plugins.length}`);\n sections.push(`- **Flows:** ${entity.flows.length}`);\n sections.push(`- **Business Rules:** ${entity.businessRules.length}`);\n sections.push(`- **Forms:** ${entity.forms.length}`);\n sections.push('');\n\n // Navigation links\n sections.push(MarkdownFormatter.formatHeading('Documentation', 2));\n sections.push('');\n\n const navLinks = [MarkdownFormatter.formatLink('Schema & Fields', 'schema.md')];\n\n // Only add automation link if there's automation\n if (this.hasAutomation(entity, result)) {\n navLinks.push(MarkdownFormatter.formatLink('Automation Details', 'automation.md'));\n }\n\n // Only add execution pipeline link if there's server-side automation\n if (this.hasExecutionPipeline(entity, result)) {\n navLinks.push(MarkdownFormatter.formatLink('Execution Pipeline', 'execution-pipeline.md'));\n }\n\n // Only add BPF link if there are BPFs\n const bpfs = this.getEntityBpfs(entity.entity.LogicalName, result);\n if (bpfs.length > 0) {\n navLinks.push(MarkdownFormatter.formatLink('Business Process Flows', 'business-process-flows.md'));\n }\n\n sections.push(MarkdownFormatter.formatList(navLinks));\n sections.push('');\n\n return sections.join('\\n');\n }\n\n /**\n * Generate entities/{entity}/schema.md\n */\n private generateEntitySchema(entity: EntityBlueprint): string {\n const sections: string[] = [];\n const meta = entity.entity;\n const displayName = meta.DisplayName?.UserLocalizedLabel?.Label || meta.LogicalName;\n\n sections.push(MarkdownFormatter.formatHeading(`${displayName} - Schema`, 1));\n sections.push('');\n\n // Entity description\n const entityDescription = meta.Description?.UserLocalizedLabel?.Label;\n if (entityDescription) {\n sections.push(entityDescription);\n sections.push('');\n }\n\n // Attributes table\n sections.push(MarkdownFormatter.formatHeading('Attributes', 2));\n sections.push('');\n\n if (meta.Attributes && meta.Attributes.length > 0) {\n const headers = ['Logical Name', 'Display Name', 'Type', 'Required', 'Custom', 'Description'];\n const rows = meta.Attributes.map(attr => [\n attr.LogicalName,\n attr.DisplayName?.UserLocalizedLabel?.Label || '',\n attr.AttributeType,\n attr.RequiredLevel.Value,\n attr.IsCustomAttribute ? 'Yes' : 'No',\n attr.Description?.UserLocalizedLabel?.Label || '',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n } else {\n sections.push('No attributes found.');\n sections.push('');\n }\n\n // Relationships\n if (meta.ManyToOneRelationships && meta.ManyToOneRelationships.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Many-to-One Relationships (Lookups)', 2));\n sections.push('');\n\n const headers = ['Schema Name', 'Referenced Entity', 'Referencing Attribute', 'Custom'];\n const rows = meta.ManyToOneRelationships.map(rel => [\n rel.SchemaName,\n rel.ReferencedEntity,\n rel.ReferencingAttribute,\n rel.IsCustomRelationship ? 'Yes' : 'No',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n if (meta.OneToManyRelationships && meta.OneToManyRelationships.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('One-to-Many Relationships', 2));\n sections.push('');\n\n const headers = ['Schema Name', 'Referencing Entity', 'Referencing Attribute', 'Custom'];\n const rows = meta.OneToManyRelationships.map(rel => [\n rel.SchemaName,\n rel.ReferencingEntity,\n rel.ReferencingAttribute,\n rel.IsCustomRelationship ? 'Yes' : 'No',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n if (meta.ManyToManyRelationships && meta.ManyToManyRelationships.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Many-to-Many Relationships', 2));\n sections.push('');\n\n const headers = ['Schema Name', 'Entity 1', 'Entity 2', 'Intersect Table', 'Custom'];\n const rows = meta.ManyToManyRelationships.map(rel => [\n rel.SchemaName,\n rel.Entity1LogicalName,\n rel.Entity2LogicalName,\n rel.IntersectEntityName,\n rel.IsCustomRelationship ? 'Yes' : 'No',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // Keys\n if (meta.Keys && meta.Keys.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Alternate Keys', 2));\n sections.push('');\n\n const headers = ['Logical Name', 'Key Attributes', 'Status'];\n const rows = meta.Keys.map(key => [\n key.LogicalName,\n key.KeyAttributes.join(', '),\n key.EntityKeyIndexStatus || 'Unknown',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // Field Security\n if (entity.fieldSecurity && entity.fieldSecurity.securedFields.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Field Security', 2));\n sections.push('');\n sections.push(`This entity has **${entity.fieldSecurity.securedFields.length}** secured field(s) with field-level permissions.`);\n sections.push('');\n\n const headers = ['Field', 'Profiles with Access'];\n const rows: string[][] = [];\n\n for (const securedField of entity.fieldSecurity.securedFields) {\n const profileNames = securedField.profiles.map(p => {\n const permissions = [];\n if (p.canRead) permissions.push('R');\n if (p.canCreate) permissions.push('C');\n if (p.canUpdate) permissions.push('U');\n return `${p.profileName} (${permissions.join(', ')})`;\n }).join('; ');\n\n rows.push([\n securedField.attributeLogicalName,\n profileNames,\n ]);\n }\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n sections.push('**Permissions:** R = Read, C = Create, U = Update');\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate entities/{entity}/automation.md\n */\n private generateEntityAutomation(entity: EntityBlueprint, result: BlueprintResult): string {\n const sections: string[] = [];\n const meta = entity.entity;\n const displayName = meta.DisplayName?.UserLocalizedLabel?.Label || meta.LogicalName;\n\n sections.push(MarkdownFormatter.formatHeading(`${displayName} - Automation`, 1));\n sections.push('');\n\n // Plugins\n if (entity.plugins.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Plugins', 2));\n sections.push('');\n\n const headers = ['Name', 'Message', 'Stage', 'Mode', 'Rank', 'Assembly'];\n const rows = entity.plugins.map(plugin => [\n plugin.name,\n plugin.message,\n plugin.stageName,\n plugin.modeName,\n plugin.rank.toString(),\n plugin.assemblyName,\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // Flows\n if (entity.flows.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Cloud Flows', 2));\n sections.push('');\n\n const headers = ['Name', 'Trigger', 'Scope', 'State', 'External'];\n const rows = entity.flows.map(flow => [\n flow.name,\n `${flow.definition.triggerType} (${flow.definition.triggerEvent})`,\n flow.scopeName,\n this.formatFlowStateBadge(flow.state),\n flow.hasExternalCalls ? '🌐' : '',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // Business Rules\n if (entity.businessRules.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Business Rules', 2));\n sections.push('');\n\n const headers = ['Name', 'Scope', 'Context', 'State', 'Conditions', 'Actions'];\n const rows = entity.businessRules.map(rule => [\n rule.name,\n rule.scopeName,\n rule.definition.executionContext,\n rule.state === 'Active' ? MarkdownFormatter.formatBadge('Active', 'success') : MarkdownFormatter.formatBadge('Draft', 'warning'),\n rule.definition.conditions.length.toString(),\n rule.definition.actions.length.toString(),\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // JavaScript (from forms)\n if (entity.forms.length > 0) {\n const jsHandlers = entity.forms.flatMap(form => form.eventHandlers);\n\n if (jsHandlers.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('JavaScript Event Handlers', 2));\n sections.push('');\n\n const headers = ['Event', 'Library', 'Function', 'Attribute', 'Enabled'];\n const rows = jsHandlers.map(handler => [\n handler.event,\n handler.libraryName,\n handler.functionName,\n handler.attribute || 'N/A',\n handler.enabled ? 'Yes' : 'No',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n }\n\n // Classic workflows\n const classicWorkflows = result.classicWorkflowsByEntity.get(meta.LogicalName) || [];\n if (classicWorkflows.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Classic Workflows (Deprecated)', 2));\n sections.push('');\n sections.push('⚠️ These workflows require migration to Power Automate.');\n sections.push('');\n\n const headers = ['Name', 'Type', 'Mode', 'Triggers', 'State'];\n const rows = classicWorkflows.map(wf => [\n wf.name,\n wf.typeName,\n wf.modeName,\n this.formatWorkflowTriggers(wf),\n wf.state,\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate entities/{entity}/execution-pipeline.md\n */\n private generateExecutionPipeline(entity: EntityBlueprint, _result: BlueprintResult): string {\n const sections: string[] = [];\n const meta = entity.entity;\n const displayName = meta.DisplayName?.UserLocalizedLabel?.Label || meta.LogicalName;\n\n sections.push(MarkdownFormatter.formatHeading(`${displayName} - Execution Pipeline`, 1));\n sections.push('');\n sections.push('This page shows the execution order of server-side automation on this entity.');\n sections.push('');\n\n // Group plugins by message/event\n const pluginsByMessage = new Map<string, typeof entity.plugins>();\n for (const plugin of entity.plugins) {\n const key = plugin.message;\n if (!pluginsByMessage.has(key)) {\n pluginsByMessage.set(key, []);\n }\n pluginsByMessage.get(key)!.push(plugin);\n }\n\n // If no plugins, show business rules and flows\n if (entity.plugins.length === 0) {\n sections.push('**No plugins registered on this entity.**');\n sections.push('');\n\n // Show business rules\n if (entity.businessRules.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Business Rules', 2));\n sections.push('');\n const headers = ['Name', 'Scope', 'State'];\n const rows = entity.businessRules.map(br => [\n br.name,\n br.scopeName,\n br.state === 'Active' ? MarkdownFormatter.formatBadge('Active', 'success') : MarkdownFormatter.formatBadge('Draft', 'warning'),\n ]);\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // Show Dataverse flows\n const dataverseFlows = entity.flows.filter(f => f.definition.triggerType === 'Dataverse');\n if (dataverseFlows.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Dataverse Flows', 2));\n sections.push('');\n const headers = ['Name', 'Trigger Event', 'Scope'];\n const rows = dataverseFlows.map(flow => [\n flow.name,\n flow.definition.triggerEvent,\n flow.scopeName,\n ]);\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n // Get entity-scoped business rules (they run server-side)\n const entityScopedBRs = entity.businessRules.filter(br => br.scopeName === 'Entity');\n\n // Generate execution order for each message\n for (const [message, plugins] of pluginsByMessage) {\n sections.push(MarkdownFormatter.formatHeading(`${message} Event`, 2));\n sections.push('');\n\n // Sort plugins by stage then rank\n const sortedPlugins = [...plugins].sort((a, b) => {\n if (a.stage !== b.stage) return a.stage - b.stage;\n return a.rank - b.rank;\n });\n\n // Group by stage\n const byStage = new Map<number, typeof sortedPlugins>();\n for (const plugin of sortedPlugins) {\n if (!byStage.has(plugin.stage)) {\n byStage.set(plugin.stage, []);\n }\n byStage.get(plugin.stage)!.push(plugin);\n }\n\n // Generate ASCII visualization including business rules\n sections.push(MarkdownFormatter.formatCodeBlock(\n this.generateSimplePipelineASCII(byStage, entityScopedBRs),\n 'text'\n ));\n sections.push('');\n\n // Detailed table\n sections.push(MarkdownFormatter.formatHeading('Execution Details', 3));\n sections.push('');\n\n const headers = ['Order', 'Type', 'Name', 'Stage/Details', 'Mode', 'Rank'];\n const rows: string[][] = [];\n\n // Add business rules first\n // Note: Entity-scoped business rules run server-side as synchronous plugins,\n // but Microsoft doesn't explicitly document their exact pipeline stage.\n // They likely execute early (PreValidation or similar) as validation logic.\n if (entityScopedBRs.length > 0) {\n entityScopedBRs.forEach((br) => {\n rows.push([\n (rows.length + 1).toString(),\n 'Business Rule',\n br.name,\n 'Server-side (Entity scope)',\n br.state === 'Active' ? MarkdownFormatter.formatBadge('Active', 'success') : MarkdownFormatter.formatBadge('Draft', 'warning'),\n '-',\n ]);\n });\n }\n\n // Add plugins\n sortedPlugins.forEach((plugin) => {\n rows.push([\n (rows.length + 1).toString(),\n 'Plugin',\n plugin.name,\n plugin.stageName,\n plugin.modeName,\n plugin.rank.toString(),\n ]);\n });\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n // Check for sync plugins (potential performance impact)\n const syncPlugins = sortedPlugins.filter(p => p.mode === 0);\n if (syncPlugins.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('ℹ️ Synchronous Plugins', 3));\n sections.push('');\n sections.push(`${syncPlugins.length} synchronous plugin(s) execute in this pipeline. Synchronous plugins block the transaction and should complete quickly.`);\n sections.push('');\n }\n }\n\n // Show business rules if any\n if (entity.businessRules.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Business Rules', 2));\n sections.push('');\n sections.push('Business rules execute on the client (form) or server depending on their scope.');\n sections.push('');\n const headers = ['Name', 'Scope', 'Context', 'State'];\n const rows = entity.businessRules.map(br => [\n br.name,\n br.scopeName,\n br.definition.executionContext,\n br.state === 'Active' ? MarkdownFormatter.formatBadge('Active', 'success') : MarkdownFormatter.formatBadge('Draft', 'warning'),\n ]);\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // Show Dataverse flows\n const dataverseFlows = entity.flows.filter(f => f.definition.triggerType === 'Dataverse');\n if (dataverseFlows.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Dataverse Flows (Real-time)', 2));\n sections.push('');\n sections.push('These flows trigger when data changes occur.');\n sections.push('');\n const headers = ['Name', 'Trigger Event', 'Scope', 'State'];\n const rows = dataverseFlows.map(flow => [\n flow.name,\n flow.definition.triggerEvent,\n flow.scopeName,\n this.formatFlowStateBadge(flow.state),\n ]);\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate simple ASCII visualization of plugin execution pipeline\n */\n private generateSimplePipelineASCII(byStage: Map<number, any[]>, businessRules: BusinessRule[]): string {\n const lines: string[] = [];\n lines.push('Execution Order:');\n lines.push('');\n\n // Add business rules first (server-side entity-scoped rules execute early in pipeline)\n if (businessRules.length > 0) {\n lines.push('┌─ Business Rules (Server-side, Entity-scoped)');\n lines.push('│');\n for (let i = 0; i < businessRules.length; i++) {\n const br = businessRules[i];\n const isLast = i === businessRules.length - 1 && byStage.size === 0;\n const prefix = isLast ? '└─' : '├─';\n const state = br.state === 'Active' ? '[ACTIVE]' : '[DRAFT]';\n lines.push(`${prefix} ${i + 1}. ${br.name} ${state}`);\n if (!isLast) {\n lines.push('│');\n }\n }\n lines.push('');\n }\n\n // Add plugin stages\n let stageIndex = 0;\n for (const [stage, plugins] of byStage) {\n const stageName = plugins[0].stageName;\n const isLastStage = stageIndex === byStage.size - 1;\n\n lines.push(`┌─ Stage ${stage}: ${stageName}`);\n lines.push('│');\n\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n const isLastPlugin = i === plugins.length - 1;\n const prefix = isLastPlugin && isLastStage ? '└─' : '├─';\n const mode = plugin.mode === 0 ? '[SYNC]' : '[ASYNC]';\n lines.push(`${prefix} ${i + 1}. ${plugin.name} ${mode}`);\n if (!isLastPlugin || !isLastStage) {\n lines.push('│ (Rank: ' + plugin.rank + ')');\n } else {\n lines.push(' (Rank: ' + plugin.rank + ')');\n }\n if (!isLastPlugin) {\n lines.push('│');\n }\n }\n\n lines.push('');\n stageIndex++;\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Generate entities/{entity}/business-process-flows.md\n */\n private generateEntityBpfs(entity: EntityBlueprint, bpfs: BusinessProcessFlow[]): string {\n const sections: string[] = [];\n const meta = entity.entity;\n const displayName = meta.DisplayName?.UserLocalizedLabel?.Label || meta.LogicalName;\n\n sections.push(MarkdownFormatter.formatHeading(`${displayName} - Business Process Flows`, 1));\n sections.push('');\n\n for (const bpf of bpfs) {\n sections.push(MarkdownFormatter.formatHeading(bpf.name, 2));\n sections.push('');\n\n if (bpf.description) {\n sections.push(bpf.description);\n sections.push('');\n }\n\n sections.push(`**State:** ${bpf.state === 'Active' ? MarkdownFormatter.formatBadge('Active', 'success') : MarkdownFormatter.formatBadge('Draft', 'warning')}`);\n sections.push(`**Entities:** ${bpf.definition.entities.join(', ')}`);\n sections.push(`**Cross-Entity:** ${bpf.definition.crossEntityFlow ? 'Yes' : 'No'}`);\n sections.push('');\n\n // Stages\n sections.push(MarkdownFormatter.formatHeading('Stages', 3));\n sections.push('');\n\n for (const stage of bpf.definition.stages) {\n sections.push(`**${stage.order}. ${stage.name}** (${stage.entity})`);\n sections.push('');\n\n if (stage.steps.length > 0) {\n const stepsList = stage.steps.map(step =>\n `${step.name} (${step.fieldName})${step.required ? ' *Required*' : ''}`\n );\n sections.push(MarkdownFormatter.formatList(stepsList));\n }\n sections.push('');\n }\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate analysis/complexity-scores.md\n */\n private generateComplexityScores(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Entity Complexity Scores', 1));\n sections.push('');\n\n // Calculate complexity for each entity\n const scores = result.entities.map(entity => {\n const score = this.calculateComplexityScore(entity, result);\n return {\n entity: entity.entity.LogicalName,\n displayName: entity.entity.DisplayName?.UserLocalizedLabel?.Label || entity.entity.LogicalName,\n score: score.total,\n complexity: score.level,\n breakdown: score.breakdown,\n };\n });\n\n // Sort by score descending\n scores.sort((a, b) => b.score - a.score);\n\n // Table\n const headers = ['Entity', 'Score', 'Complexity', 'Fields', 'Plugins', 'Flows', 'Rules'];\n const rows = scores.map(s => [\n s.displayName,\n s.score.toString(),\n this.formatComplexityBadge(s.complexity),\n s.breakdown.attributes.toString(),\n s.breakdown.plugins.toString(),\n s.breakdown.flows.toString(),\n s.breakdown.businessRules.toString(),\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n // Methodology\n sections.push(MarkdownFormatter.formatHeading('Scoring Methodology', 2));\n sections.push('');\n sections.push('Complexity score is calculated based on:');\n sections.push('');\n sections.push(MarkdownFormatter.formatList([\n 'Attributes: 1 point each',\n 'Plugins: 5 points each',\n 'Flows: 3 points each',\n 'Business Rules: 2 points each',\n 'Forms: 2 points each',\n ]));\n sections.push('');\n sections.push('**Complexity Levels:**');\n sections.push('- Low: 0-50 points');\n sections.push('- Medium: 51-150 points');\n sections.push('- High: 151+ points');\n sections.push('');\n\n return sections.join('\\n');\n }\n\n /**\n * Generate analysis/performance-risks.md\n */\n private generatePerformanceRisks(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Performance Risks', 1));\n sections.push('');\n\n // Collect all risks\n const allRisks: Array<PerformanceRisk & { entity: string }> = [];\n for (const entity of result.entities) {\n if (entity.performanceRisks) {\n for (const risk of entity.performanceRisks) {\n allRisks.push({\n ...risk,\n entity: entity.entity.LogicalName,\n });\n }\n }\n }\n\n if (allRisks.length === 0) {\n sections.push('No performance risks detected.');\n return sections.join('\\n');\n }\n\n // Group by severity\n const bySeverity = new Map<string, typeof allRisks>();\n for (const risk of allRisks) {\n if (!bySeverity.has(risk.severity)) {\n bySeverity.set(risk.severity, []);\n }\n bySeverity.get(risk.severity)!.push(risk);\n }\n\n // Display each severity level\n for (const severity of ['Critical', 'High', 'Medium', 'Low']) {\n const risks = bySeverity.get(severity) || [];\n if (risks.length === 0) continue;\n\n sections.push(MarkdownFormatter.formatHeading(`${severity} Risk (${risks.length})`, 2));\n sections.push('');\n\n const headers = ['Entity', 'Step', 'Type', 'Reason', 'Recommendation'];\n const rows = risks.map(risk => [\n risk.entity,\n risk.step.name,\n risk.step.type,\n risk.reason,\n risk.recommendation,\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate analysis/migration-recommendations.md\n */\n private generateMigrationRecommendations(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Migration Recommendations', 1));\n sections.push('');\n\n if (result.classicWorkflows.length === 0) {\n sections.push('No classic workflows found. No migration needed.');\n return sections.join('\\n');\n }\n\n sections.push('⚠️ **Classic workflows are deprecated and will be retired by Microsoft.**');\n sections.push('');\n sections.push(`**Total Classic Workflows:** ${result.classicWorkflows.length}`);\n sections.push('');\n\n // Group by complexity\n const byComplexity = new Map<string, ClassicWorkflow[]>();\n for (const workflow of result.classicWorkflows) {\n const complexity = workflow.migrationRecommendation?.complexity || 'Unknown';\n if (!byComplexity.has(complexity)) {\n byComplexity.set(complexity, []);\n }\n byComplexity.get(complexity)!.push(workflow);\n }\n\n // Display each complexity level\n for (const complexity of ['Critical', 'High', 'Medium', 'Low']) {\n const workflows = byComplexity.get(complexity) || [];\n if (workflows.length === 0) continue;\n\n sections.push(MarkdownFormatter.formatHeading(`${complexity} Complexity (${workflows.length})`, 2));\n sections.push('');\n\n const headers = ['Workflow', 'Entity', 'Type', 'Effort', 'Approach'];\n const rows = workflows.map(wf => [\n wf.name,\n wf.entityDisplayName || wf.entity,\n wf.typeName,\n wf.migrationRecommendation?.effort || 'Unknown',\n wf.migrationRecommendation?.approach.substring(0, 50) + '...' || 'Unknown',\n ]);\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n }\n\n // General guidance\n sections.push(MarkdownFormatter.formatHeading('General Migration Guidance', 2));\n sections.push('');\n sections.push(MarkdownFormatter.formatList([\n 'Prioritize critical and high complexity workflows first',\n 'Test thoroughly in a development environment before production',\n 'Update security roles and permissions for Power Automate',\n 'Consider using connection references for external integrations',\n 'Document any custom logic that may need reimplementation',\n 'Plan for user training on new flow behavior',\n ]));\n sections.push('');\n\n sections.push('**Resources:**');\n sections.push('- ' + MarkdownFormatter.formatLink('Microsoft Migration Guide', 'https://learn.microsoft.com/power-automate/migrate-from-classic-workflows'));\n sections.push('');\n\n return sections.join('\\n');\n }\n\n /**\n * Build file tree structure from file paths\n */\n private buildFileTree(files: Map<string, string>): FileNode {\n const root: FileNode = {\n name: 'blueprint',\n type: 'directory',\n path: 'blueprint',\n children: [],\n };\n\n for (const filePath of files.keys()) {\n this.addFileToTree(root, filePath, files.get(filePath)!);\n }\n\n return root;\n }\n\n /**\n * Add a file to the tree structure\n */\n private addFileToTree(root: FileNode, path: string, content: string): void {\n const parts = path.split('/');\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i === parts.length - 1;\n\n if (!current.children) {\n current.children = [];\n }\n\n let existing = current.children.find(c => c.name === part);\n\n if (!existing) {\n existing = {\n name: part,\n type: isLast ? 'file' : 'directory',\n path: `blueprint/${parts.slice(0, i + 1).join('/')}`,\n children: isLast ? undefined : [],\n };\n\n if (isLast) {\n existing.size = new TextEncoder().encode(content).length;\n }\n\n current.children.push(existing);\n }\n\n current = existing;\n }\n }\n\n // ==================== Helper Methods ====================\n\n /**\n * Check if entity has any automation\n */\n private hasAutomation(entity: EntityBlueprint, result: BlueprintResult): boolean {\n // Check for plugins\n if (entity.plugins.length > 0) return true;\n\n // Check for flows\n if (entity.flows.length > 0) return true;\n\n // Check for business rules\n if (entity.businessRules.length > 0) return true;\n\n // Check for JavaScript event handlers\n const jsHandlers = entity.forms.flatMap(form => form.eventHandlers);\n if (jsHandlers.length > 0) return true;\n\n // Check for classic workflows\n const classicWorkflows = result.classicWorkflowsByEntity.get(entity.entity.LogicalName) || [];\n if (classicWorkflows.length > 0) return true;\n\n return false;\n }\n\n /**\n * Check if entity has execution pipeline components\n * (server-side automation that participates in the execution pipeline)\n */\n private hasExecutionPipeline(entity: EntityBlueprint, result: BlueprintResult): boolean {\n // Plugins are always part of execution pipeline\n if (entity.plugins.length > 0) return true;\n\n // Entity-scoped business rules run server-side (part of execution pipeline)\n const hasEntityScopedBRs = entity.businessRules.some(br => br.scopeName === 'Entity');\n if (hasEntityScopedBRs) return true;\n\n // Check for synchronous classic workflows\n const classicWorkflows = result.classicWorkflowsByEntity.get(entity.entity.LogicalName) || [];\n const hasSyncWorkflows = classicWorkflows.some(wf => wf.mode === 0); // 0 = Synchronous\n if (hasSyncWorkflows) return true;\n\n // Flows with Dataverse triggers are part of execution pipeline\n const hasDataverseFlows = entity.flows.some(flow =>\n flow.definition.triggerType === 'Dataverse'\n );\n if (hasDataverseFlows) return true;\n\n return false;\n }\n\n /**\n * Get BPFs for a specific entity\n */\n private getEntityBpfs(entityLogicalName: string, result: BlueprintResult): BusinessProcessFlow[] {\n const bpfs = result.businessProcessFlowsByEntity.get(entityLogicalName) || [];\n return bpfs;\n }\n\n /**\n * Format complexity badge\n */\n private formatComplexityBadge(complexity: 'Low' | 'Medium' | 'High'): string {\n const badges = {\n Low: MarkdownFormatter.formatBadge('Low', 'success'),\n Medium: MarkdownFormatter.formatBadge('Medium', 'warning'),\n High: MarkdownFormatter.formatBadge('High', 'error'),\n };\n return badges[complexity];\n }\n\n /**\n * Format flow state badge\n */\n private formatFlowStateBadge(state: 'Draft' | 'Active' | 'Suspended'): string {\n const badges = {\n Active: MarkdownFormatter.formatBadge('Active', 'success'),\n Draft: MarkdownFormatter.formatBadge('Draft', 'warning'),\n Suspended: MarkdownFormatter.formatBadge('Suspended', 'error'),\n };\n return badges[state];\n }\n\n /**\n * Format date to readable string\n */\n private formatDate(dateString: string): string {\n const date = new Date(dateString);\n return date.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n });\n }\n\n /**\n * Format file size to readable string\n */\n private formatFileSize(bytes: number): string {\n if (bytes === 0) return '0 B';\n const k = 1024;\n const sizes = ['B', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n }\n\n /**\n * Format workflow triggers\n */\n private formatWorkflowTriggers(workflow: ClassicWorkflow): string {\n const triggers: string[] = [];\n if (workflow.triggerOnCreate) triggers.push('Create');\n if (workflow.triggerOnUpdate) triggers.push('Update');\n if (workflow.triggerOnDelete) triggers.push('Delete');\n if (workflow.onDemand) triggers.push('Manual');\n return triggers.join(', ') || 'None';\n }\n\n /**\n * Check if plugin has external calls (placeholder)\n */\n private hasExternalCalls(_plugin: PluginStep): boolean {\n // This would need to be detected during plugin discovery\n // For now, return false as placeholder\n return false;\n }\n\n /**\n * Get solution for plugin (placeholder)\n */\n private getPluginSolution(_plugin: PluginStep, _result: BlueprintResult): string {\n // This would need solution component mapping\n return 'Unknown';\n }\n\n /**\n * Group plugins by assembly -> entity\n */\n private groupPluginsByAssembly(plugins: PluginStep[]): Map<string, Map<string, PluginStep[]>> {\n const grouped = new Map<string, Map<string, PluginStep[]>>();\n\n for (const plugin of plugins) {\n if (!grouped.has(plugin.assemblyName)) {\n grouped.set(plugin.assemblyName, new Map());\n }\n\n const entities = grouped.get(plugin.assemblyName)!;\n if (!entities.has(plugin.entity)) {\n entities.set(plugin.entity, []);\n }\n\n entities.get(plugin.entity)!.push(plugin);\n }\n\n return grouped;\n }\n\n /**\n * Group flows by entity\n */\n private groupFlowsByEntity(flows: Flow[]): Map<string, Flow[]> {\n const grouped = new Map<string, Flow[]>();\n\n for (const flow of flows) {\n const entity = flow.entity || 'Manual/Scheduled';\n if (!grouped.has(entity)) {\n grouped.set(entity, []);\n }\n grouped.get(entity)!.push(flow);\n }\n\n return grouped;\n }\n\n /**\n * Group business rules by entity\n */\n private groupBusinessRulesByEntity(rules: BusinessRule[]): Map<string, BusinessRule[]> {\n const grouped = new Map<string, BusinessRule[]>();\n\n for (const rule of rules) {\n if (!grouped.has(rule.entity)) {\n grouped.set(rule.entity, []);\n }\n grouped.get(rule.entity)!.push(rule);\n }\n\n return grouped;\n }\n\n /**\n * Group classic workflows by entity\n */\n private groupClassicWorkflowsByEntity(workflows: ClassicWorkflow[]): Map<string, ClassicWorkflow[]> {\n const grouped = new Map<string, ClassicWorkflow[]>();\n\n for (const workflow of workflows) {\n if (!grouped.has(workflow.entity)) {\n grouped.set(workflow.entity, []);\n }\n grouped.get(workflow.entity)!.push(workflow);\n }\n\n return grouped;\n }\n\n /**\n * Group web resources by type\n */\n private groupWebResourcesByType(resources: WebResource[]): Map<string, WebResource[]> {\n const grouped = new Map<string, WebResource[]>();\n\n for (const resource of resources) {\n if (!grouped.has(resource.typeName)) {\n grouped.set(resource.typeName, []);\n }\n grouped.get(resource.typeName)!.push(resource);\n }\n\n return grouped;\n }\n\n /**\n * Group custom APIs by binding type\n */\n private groupCustomAPIsByBinding(apis: CustomAPI[]): Map<string, CustomAPI[]> {\n const grouped = new Map<string, CustomAPI[]>();\n\n for (const api of apis) {\n if (!grouped.has(api.bindingType)) {\n grouped.set(api.bindingType, []);\n }\n grouped.get(api.bindingType)!.push(api);\n }\n\n return grouped;\n }\n\n /**\n * Group BPFs by primary entity\n */\n private groupBpfsByEntity(bpfs: BusinessProcessFlow[]): Map<string, BusinessProcessFlow[]> {\n const grouped = new Map<string, BusinessProcessFlow[]>();\n\n for (const bpf of bpfs) {\n const entity = bpf.primaryEntityDisplayName || bpf.primaryEntity;\n if (!grouped.has(entity)) {\n grouped.set(entity, []);\n }\n grouped.get(entity)!.push(bpf);\n }\n\n return grouped;\n }\n\n /**\n * Calculate complexity score for entity\n */\n private calculateComplexityScore(entity: EntityBlueprint, _result: BlueprintResult): {\n total: number;\n level: 'Low' | 'Medium' | 'High';\n breakdown: {\n attributes: number;\n plugins: number;\n flows: number;\n businessRules: number;\n forms: number;\n };\n } {\n const breakdown = {\n attributes: entity.entity.Attributes?.length || 0,\n plugins: entity.plugins.length,\n flows: entity.flows.length,\n businessRules: entity.businessRules.length,\n forms: entity.forms.length,\n };\n\n const total =\n breakdown.attributes * 1 +\n breakdown.plugins * 5 +\n breakdown.flows * 3 +\n breakdown.businessRules * 2 +\n breakdown.forms * 2;\n\n let level: 'Low' | 'Medium' | 'High';\n if (total <= 50) {\n level = 'Low';\n } else if (total <= 150) {\n level = 'Medium';\n } else {\n level = 'High';\n }\n\n return { total, level, breakdown };\n }\n\n /**\n * Generate security overview with special permissions matrix\n */\n private generateSecurityOverview(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Security Overview', 1));\n sections.push('');\n sections.push('This document provides an overview of security roles and field security profiles in the solution.');\n sections.push('');\n\n // Security Roles Section\n if (result.securityRoles && result.securityRoles.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Security Roles', 2));\n sections.push('');\n sections.push(`Found **${result.securityRoles.length}** security role(s) in the selected solution(s).`);\n sections.push('');\n\n // Special Permissions Matrix\n sections.push(MarkdownFormatter.formatHeading('Special Permissions Matrix', 3));\n sections.push('');\n sections.push('This table shows which security roles have special/miscellaneous permissions.');\n sections.push('');\n\n // Build special permissions table (all 11 core special permissions)\n const specialPermissionKeys: Array<keyof import('../discovery/SecurityRoleDiscovery.js').SpecialPermissions> = [\n 'documentGeneration',\n 'dynamics365ForMobile',\n 'exportToExcel',\n 'goOfflineInOutlook',\n 'mailMerge',\n 'print',\n 'syncToOutlook',\n 'useDynamics365AppForOutlook',\n 'activateRealtimeProcesses',\n 'executeWorkflowJob',\n 'runFlows',\n ];\n\n const headers = ['Role Name', 'Business Unit', ...specialPermissionKeys.map(k => this.formatSpecialPermissionName(k))];\n const rows: string[][] = [];\n\n for (const role of result.securityRoles) {\n const row = [\n `[${role.name}](roles/${role.name.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase()}.md)`,\n role.businessunitname || 'Unknown',\n ];\n\n for (const key of specialPermissionKeys) {\n row.push(role.specialPermissions[key] ? '✓' : '');\n }\n\n rows.push(row);\n }\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n // Role Summary Table\n sections.push(MarkdownFormatter.formatHeading('Role Summary', 3));\n sections.push('');\n\n const summaryHeaders = ['Role Name', 'Business Unit', 'Entities', 'System Admin', 'Managed'];\n const summaryRows: string[][] = [];\n\n for (const role of result.securityRoles) {\n summaryRows.push([\n `[${role.name}](roles/${role.name.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase()}.md)`,\n role.businessunitname || 'Unknown',\n role.totalEntities.toString(),\n role.hasSystemAdminPrivileges ? 'Yes' : 'No',\n role.ismanaged ? 'Yes' : 'No',\n ]);\n }\n\n sections.push(MarkdownFormatter.formatTable(summaryHeaders, summaryRows));\n sections.push('');\n }\n\n // Field Security Profiles Section\n if (result.fieldSecurityProfiles && result.fieldSecurityProfiles.length > 0) {\n sections.push(MarkdownFormatter.formatHeading('Field Security Profiles', 2));\n sections.push('');\n sections.push(`Found **${result.fieldSecurityProfiles.length}** field security profile(s) in the selected solution(s).`);\n sections.push('');\n sections.push('[View Field Security Profiles Details](field-security-profiles.md)');\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate detailed security role page\n */\n private generateSecurityRoleDetail(role: import('../discovery/SecurityRoleDiscovery.js').SecurityRoleDetail): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading(`Security Role: ${role.name}`, 1));\n sections.push('');\n\n // Role metadata\n sections.push(MarkdownFormatter.formatHeading('Details', 2));\n sections.push('');\n sections.push(`- **Business Unit:** ${role.businessunitname || 'Unknown'}`);\n sections.push(`- **Is Managed:** ${role.ismanaged ? 'Yes' : 'No'}`);\n sections.push(`- **Is Customizable:** ${role.iscustomizable ? 'Yes' : 'No'}`);\n sections.push(`- **Has System Admin Privileges:** ${role.hasSystemAdminPrivileges ? 'Yes' : 'No'}`);\n sections.push(`- **Total Entities with Permissions:** ${role.totalEntities}`);\n if (role.description) {\n sections.push(`- **Description:** ${role.description}`);\n }\n sections.push('');\n\n // Special Permissions\n sections.push(MarkdownFormatter.formatHeading('Special Permissions', 2));\n sections.push('');\n const activeSpecialPermissions = Object.entries(role.specialPermissions)\n .filter(([_, value]) => value)\n .map(([key]) => this.formatSpecialPermissionName(key as keyof import('../discovery/SecurityRoleDiscovery.js').SpecialPermissions));\n\n if (activeSpecialPermissions.length > 0) {\n for (const perm of activeSpecialPermissions) {\n sections.push(`- ✓ ${perm}`);\n }\n } else {\n sections.push('*No special permissions granted*');\n }\n sections.push('');\n\n // Entity Permissions\n sections.push(MarkdownFormatter.formatHeading('Entity Permissions', 2));\n sections.push('');\n\n if (role.entityPermissions.length > 0) {\n sections.push(`This role has permissions on **${role.entityPermissions.length}** entit${role.entityPermissions.length === 1 ? 'y' : 'ies'}.`);\n sections.push('');\n\n const headers = ['Entity', ...['Create', 'Read', 'Write', 'Delete', 'Append', 'AppendTo', 'Assign', 'Share']];\n const rows: string[][] = [];\n\n for (const entityPerm of role.entityPermissions) {\n // Skip entities with no privileges\n if (entityPerm.privileges.length === 0) {\n continue;\n }\n\n const row = [entityPerm.entityLogicalName];\n const privMap = new Map(entityPerm.privileges.map(p => [p.type, p]));\n\n for (const type of ['Create', 'Read', 'Write', 'Delete', 'Append', 'AppendTo', 'Assign', 'Share']) {\n const priv = privMap.get(type as any);\n row.push(priv ? priv.depth : '');\n }\n\n rows.push(row);\n }\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n // Legend\n sections.push('**Privilege Depth Legend:**');\n sections.push('- **Basic** - User level (own records only)');\n sections.push('- **Local** - Business unit level');\n sections.push('- **Deep** - Parent and child business units');\n sections.push('- **Global** - Organization level (all records)');\n sections.push('');\n } else {\n sections.push('*No entity permissions defined*');\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate field security profiles page\n */\n private generateFieldSecurityProfiles(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Field Security Profiles', 1));\n sections.push('');\n sections.push('Field security profiles control who can read, create, or update specific secured fields.');\n sections.push('');\n\n if (result.fieldSecurityProfiles && result.fieldSecurityProfiles.length > 0) {\n const headers = ['Profile Name', 'Description'];\n const rows: string[][] = [];\n\n for (const profile of result.fieldSecurityProfiles) {\n rows.push([\n profile.name,\n profile.description || '*No description*',\n ]);\n }\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n sections.push('> **Note:** Field-level permissions for specific entities are documented in each entity\\'s schema page.');\n sections.push('');\n } else {\n sections.push('*No field security profiles found*');\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate attribute masking rules page\n */\n private generateAttributeMaskingRules(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Attribute Masking Rules', 1));\n sections.push('');\n sections.push('Attribute masking rules control how sensitive data is masked when displayed to users without appropriate permissions.');\n sections.push('');\n\n if (result.attributeMaskingRules && result.attributeMaskingRules.length > 0) {\n const headers = ['Entity', 'Attribute', 'Masking Type', 'Managed'];\n const rows: string[][] = [];\n\n for (const rule of result.attributeMaskingRules) {\n const maskingType = rule.maskingtype === 1 ? 'Full' : rule.maskingtype === 2 ? 'Partial' : rule.maskingtype === 3 ? 'Email' : 'Custom';\n rows.push([\n rule.entitylogicalname,\n rule.attributelogicalname,\n maskingType,\n rule.ismanaged ? 'Yes' : 'No',\n ]);\n }\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n sections.push('**Masking Types:**');\n sections.push('- **Full**: Entire value is masked');\n sections.push('- **Partial**: Part of the value is shown');\n sections.push('- **Email**: Email format is preserved while masking');\n sections.push('- **Custom**: Custom masking format is applied');\n sections.push('');\n } else {\n sections.push('*No attribute masking rules found*');\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Generate column security profiles page\n */\n private generateColumnSecurityProfiles(result: BlueprintResult): string {\n const sections: string[] = [];\n\n sections.push(MarkdownFormatter.formatHeading('Column Security Profiles', 1));\n sections.push('');\n sections.push('Column security profiles define which users can access specific secured columns across entities.');\n sections.push('');\n\n if (result.columnSecurityProfiles && result.columnSecurityProfiles.length > 0) {\n const headers = ['Profile Name', 'Description', 'Managed'];\n const rows: string[][] = [];\n\n for (const profile of result.columnSecurityProfiles) {\n rows.push([\n profile.name,\n profile.description || '*No description*',\n profile.ismanaged ? 'Yes' : 'No',\n ]);\n }\n\n sections.push(MarkdownFormatter.formatTable(headers, rows));\n sections.push('');\n\n sections.push('> **Note:** Column-level permissions control create, read, and update access to secured fields.');\n sections.push('');\n } else {\n sections.push('*No column security profiles found*');\n sections.push('');\n }\n\n return sections.join('\\n');\n }\n\n /**\n * Format special permission name for display\n */\n private formatSpecialPermissionName(key: string): string {\n // Convert camelCase to Title Case with spaces\n return key\n .replace(/([A-Z])/g, ' $1')\n .replace(/^./, str => str.toUpperCase())\n .trim();\n }\n}\n"],"names":["MarkdownFormatter","headers","rows","alignment","alignments","escapePipes","text","headerRow","separatorRow","_","i","dataRows","row","type","url","code","language","items","ordered","item","index","level","clampedLevel","specialChars","node","prefix","isLast","isRoot","lines","nodeName","connector","child","isLastChild","newPrefix","childLines","MarkdownReporter","result","files","role","roleName","entity","name","bpfs","totalSize","sum","content","structure","sections","erd","pub","diagram","w","links","link","pluginsWithCalls","flowsWithCalls","f","allRisks","critical","r","high","medium","low","grouped","assemblyName","entities","entityName","plugins","plugin","syncWithExternal","p","warnHeaders","warnRows","flows","flow","rules","rule","workflows","wf","_a","typeName","resources","wr","jsResources","deprecatedCount","externalCallsCount","highComplexityCount","bindingType","apis","api","env","missingValues","conn","bpf","byRisk","endpoint","risk","riskLevel","endpoints","ep","byType","solution","_b","_c","meta","displayName","navLinks","_d","entityDescription","attr","rel","key","securedField","profileNames","permissions","jsHandlers","form","handler","classicWorkflows","_result","pluginsByMessage","br","dataverseFlows","entityScopedBRs","message","sortedPlugins","a","b","byStage","syncPlugins","businessRules","state","stageIndex","stage","stageName","isLastStage","isLastPlugin","mode","stepsList","step","scores","score","s","bySeverity","severity","risks","byComplexity","workflow","complexity","root","filePath","path","parts","current","part","existing","c","entityLogicalName","dateString","bytes","k","sizes","triggers","_plugin","resource","breakdown","total","specialPermissionKeys","summaryHeaders","summaryRows","activeSpecialPermissions","value","perm","entityPerm","privMap","priv","profile","maskingType","str"],"mappings":"AAMA,MAAqBA,CAAkB,CAoBrC,OAAO,YACLC,EACAC,EACAC,EACQ,CACR,GAAIF,EAAQ,SAAW,EACrB,MAAO,GAGT,MAAMG,EAAaD,GAAaF,EAAQ,IAAI,IAAM,MAAM,EAGlDI,EAAeC,IACXA,GAAQ,IAAI,QAAQ,MAAO,KAAK,EAIpCC,EAAY,KAAON,EAAQ,IAAII,CAAW,EAAE,KAAK,KAAK,EAAI,KAG1DG,EAAe,KAAOP,EAAQ,IAAI,CAACQ,EAAGC,IAAM,CAEhD,OADcN,EAAWM,CAAC,GAAK,OACvB,CACN,IAAK,SACH,MAAO,aACT,IAAK,QACH,MAAO,aACT,QACE,MAAO,YAAA,CAEb,CAAC,EAAE,KAAK,KAAK,EAAI,KAGXC,EAAWT,EAAK,IAAIU,GAEjB,KADOX,EAAQ,IAAI,CAACQ,EAAGC,IAAML,EAAYO,EAAIF,CAAC,GAAK,EAAE,CAAC,EACzC,KAAK,KAAK,EAAI,IACnC,EAED,MAAO,CAACH,EAAWC,EAAc,GAAGG,CAAQ,EAAE,KAAK;AAAA,CAAI,CACzD,CAcA,OAAO,YAAYL,EAAcO,EAAwD,CAQvF,MAAO,GAPO,CACZ,QAAS,IACT,QAAS,KACT,MAAO,IACP,KAAM,IAAA,EAGQA,CAAI,CAAC,IAAIP,CAAI,EAC/B,CAaA,OAAO,WAAWA,EAAcQ,EAAqB,CACnD,MAAO,IAAIR,CAAI,KAAKQ,CAAG,GACzB,CAiBA,OAAO,gBAAgBC,EAAcC,EAA0B,CAC7D,MAAO,SAASA,CAAQ;AAAA,EAAKD,CAAI;AAAA,OACnC,CAmBA,OAAO,WAAWE,EAAiBC,EAAmB,GAAe,CACnE,OAAID,EAAM,SAAW,EACZ,GAGLC,EACKD,EAAM,IAAI,CAACE,EAAMC,IAAU,GAAGA,EAAQ,CAAC,KAAKD,CAAI,EAAE,EAAE,KAAK;AAAA,CAAI,EAE7DF,EAAM,IAAIE,GAAQ,KAAKA,CAAI,EAAE,EAAE,KAAK;AAAA,CAAI,CAEnD,CAcA,OAAO,cAAcb,EAAce,EAAuB,CACxD,MAAMC,EAAe,KAAK,IAAI,EAAG,KAAK,IAAI,EAAGD,CAAK,CAAC,EAEnD,MAAO,GADQ,IAAI,OAAOC,CAAY,CACtB,IAAIhB,CAAI,EAC1B,CAWA,OAAO,sBAA+B,CACpC,MAAO,KACT,CAYA,OAAO,eAAeA,EAAsB,CAC1C,GAAI,CAACA,EACH,MAAO,GAIT,MAAMiB,EAAe,yBACrB,OAAOjB,EAAK,QAAQiB,EAAc,MAAM,CAC1C,CAgCA,OAAO,eAAeC,EAAwB,CAC5C,OAAO,KAAK,wBAAwBA,EAAM,GAAI,GAAM,EAAI,CAC1D,CAUA,OAAe,wBACbA,EACAC,EACAC,EACAC,EACQ,CACR,MAAMC,EAAkB,CAAA,EAGlBC,EAAWL,EAAK,MAAQA,EAAK,OAAS,YAAc,IAAM,IAEhE,GAAIG,EACFC,EAAM,KAAKC,CAAQ,MACd,CACL,MAAMC,EAAYJ,EAAS,OAAS,OACpCE,EAAM,KAAKH,EAASK,EAAYD,CAAQ,CAC1C,CAGA,OAAIL,EAAK,UAAYA,EAAK,SAAS,OAAS,GAC1CA,EAAK,SAAS,QAAQ,CAACO,EAAOX,IAAU,CACtC,MAAMY,EAAcZ,IAAUI,EAAK,SAAU,OAAS,EAGtD,IAAIS,EACAN,EACFM,EAAY,GAEZA,EAAYR,GAAUC,EAAS,OAAS,QAG1C,MAAMQ,EAAa,KAAK,wBAAwBH,EAAOE,EAAWD,EAAa,EAAK,EACpFJ,EAAM,KAAKM,CAAU,CACvB,CAAC,EAGIN,EAAM,KAAK;AAAA,CAAI,CACxB,CACF,CC/PO,MAAMO,CAAiB,CAI5B,SAASC,EAAyC,CAChD,MAAMC,MAAY,IA8BlB,GA3BAA,EAAM,IAAI,YAAa,KAAK,eAAeD,CAAM,CAAC,EAGlDC,EAAM,IAAI,qBAAsB,KAAK,gBAAgBD,CAAM,CAAC,EAC5DC,EAAM,IAAI,yBAA0B,KAAK,mBAAmBD,CAAM,CAAC,EACnEC,EAAM,IAAI,uBAAwB,KAAK,iBAAiBD,CAAM,CAAC,EAC/DC,EAAM,IAAI,gCAAiC,KAAK,yBAAyBD,CAAM,CAAC,EAChFC,EAAM,IAAI,mCAAoC,KAAK,4BAA4BD,CAAM,CAAC,EACtFC,EAAM,IAAI,8BAA+B,KAAK,wBAAwBD,CAAM,CAAC,EAC7EC,EAAM,IAAI,6BAA8B,KAAK,sBAAsBD,CAAM,CAAC,EAC1EC,EAAM,IAAI,uCAAwC,KAAK,gCAAgCD,CAAM,CAAC,EAC9FC,EAAM,IAAI,uCAAwC,KAAK,gCAAgCD,CAAM,CAAC,EAC9FC,EAAM,IAAI,wCAAyC,KAAK,gCAAgCD,CAAM,CAAC,EAE3FA,EAAO,mBAAqBA,EAAO,kBAAkB,OAAS,GAChEC,EAAM,IAAI,mCAAoC,KAAK,6BAA6BD,CAAM,CAAC,EAGrFA,EAAO,kBAAoBA,EAAO,iBAAiB,OAAS,GAC9DC,EAAM,IAAI,qCAAsC,KAAK,8BAA8BD,CAAM,CAAC,EAGxFA,EAAO,sBAAwBA,EAAO,qBAAqB,OAAS,GACtEC,EAAM,IAAI,mCAAoC,KAAK,6BAA6BD,CAAM,CAAC,EAIrFA,EAAO,eAAiBA,EAAO,uBAAyBA,EAAO,uBAAyBA,EAAO,uBAAwB,CAIzH,GAHAC,EAAM,IAAI,uBAAwB,KAAK,yBAAyBD,CAAM,CAAC,EAGnEA,EAAO,cACT,UAAWE,KAAQF,EAAO,cAAe,CACvC,MAAMG,EAAWD,EAAK,KAAK,QAAQ,gBAAiB,GAAG,EAAE,YAAA,EACzDD,EAAM,IAAI,kBAAkBE,CAAQ,MAAO,KAAK,2BAA2BD,CAAI,CAAC,CAClF,CAIEF,EAAO,uBAAyBA,EAAO,sBAAsB,OAAS,GACxEC,EAAM,IAAI,sCAAuC,KAAK,8BAA8BD,CAAM,CAAC,EAIzFA,EAAO,uBAAyBA,EAAO,sBAAsB,OAAS,GACxEC,EAAM,IAAI,gCAAiC,KAAK,8BAA8BD,CAAM,CAAC,EAInFA,EAAO,wBAA0BA,EAAO,uBAAuB,OAAS,GAC1EC,EAAM,IAAI,8BAA+B,KAAK,+BAA+BD,CAAM,CAAC,CAExF,CAGA,UAAWI,KAAUJ,EAAO,SAAU,CACpC,MAAMK,EAAOD,EAAO,OAAO,YAC3BH,EAAM,IAAI,YAAYI,CAAI,eAAgB,KAAK,uBAAuBD,EAAQJ,CAAM,CAAC,EACrFC,EAAM,IAAI,YAAYI,CAAI,aAAc,KAAK,qBAAqBD,CAAM,CAAC,EAGrE,KAAK,cAAcA,EAAQJ,CAAM,GACnCC,EAAM,IAAI,YAAYI,CAAI,iBAAkB,KAAK,yBAAyBD,EAAQJ,CAAM,CAAC,EAIvF,KAAK,qBAAqBI,EAAQJ,CAAM,GAC1CC,EAAM,IAAI,YAAYI,CAAI,yBAA0B,KAAK,0BAA0BD,EAAQJ,CAAM,CAAC,EAIpG,MAAMM,EAAO,KAAK,cAAcF,EAAO,OAAO,YAAaJ,CAAM,EAC7DM,EAAK,OAAS,GAChBL,EAAM,IAAI,YAAYI,CAAI,6BAA8B,KAAK,mBAAmBD,EAAQE,CAAI,CAAC,CAEjG,CAGAL,EAAM,IAAI,gCAAiC,KAAK,yBAAyBD,CAAM,CAAC,EAChFC,EAAM,IAAI,gCAAiC,KAAK,yBAAyBD,CAAM,CAAC,EAChFC,EAAM,IAAI,wCAAyC,KAAK,iCAAiCD,CAAM,CAAC,EAGhG,MAAMO,EAAY,MAAM,KAAKN,EAAM,OAAA,CAAQ,EAAE,OAC3C,CAACO,EAAKC,IAAYD,EAAM,IAAI,YAAA,EAAc,OAAOC,CAAO,EAAE,OAC1D,CAAA,EAIIC,EAAY,KAAK,cAAcT,CAAK,EAE1C,MAAO,CACL,MAAAA,EACA,UAAAS,EACA,WAAYT,EAAM,KAClB,UAAAM,CAAA,CAEJ,CAKQ,eAAeP,EAAiC,CACtD,MAAMW,EAAqB,CAAA,EAG3B,OAAAA,EAAS,KAAK/C,EAAkB,cAAc,oCAAqC,CAAC,CAAC,EACrF+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,kBAAkBX,EAAO,SAAS,YAAY,YAAA,CAAa,EAAE,EAC3EW,EAAS,KAAK,oBAAoBX,EAAO,SAAS,WAAW,EAAE,EAC/DW,EAAS,KAAK,cAAcX,EAAO,SAAS,MAAM,WAAW,EAAE,EAC/DW,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,sBAAsB,EACtD+C,EAAS,KAAK,EAAE,EAGZX,EAAO,MACTW,EAAS,KAAK/C,EAAkB,cAAc,8BAA+B,CAAC,CAAC,EAC/E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,KAAK,mBAAmBX,EAAO,GAAG,CAAC,EACjDW,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,sBAAsB,EACtD+C,EAAS,KAAK,EAAE,GAIlBA,EAAS,KAAK/C,EAAkB,cAAc,UAAW,CAAC,CAAC,EAC3D+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,KAAK,qBAAqBX,CAAM,CAAC,EAC/CW,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,sBAAsB,EACtD+C,EAAS,KAAK,EAAE,EAGZX,EAAO,KAAOA,EAAO,IAAI,iBAAiB,OAAS,IACrDW,EAAS,KAAK/C,EAAkB,cAAc,WAAY,CAAC,CAAC,EAC5D+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,KAAK,8BAA8BX,EAAO,IAAI,gBAAgB,CAAC,EAC7EW,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,sBAAsB,EACtD+C,EAAS,KAAK,EAAE,GAIlBA,EAAS,KAAK/C,EAAkB,cAAc,0BAA2B,CAAC,CAAC,EAC3E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,KAAK,yBAAyB,EAC5CA,EAAS,KAAK,EAAE,EAETA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,mBAAmBC,EAA4B,CACrD,MAAMD,EAAqB,CAAA,EAG3B,GAAIC,EAAI,OAAO,OAAS,EAAG,CACzBD,EAAS,KAAK/C,EAAkB,cAAc,mBAAoB,CAAC,CAAC,EACpE+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,YAAa,SAAU,WAAY,OAAO,EACrDC,EAAO8C,EAAI,OAAO,IAAIC,GAAO,CACjCA,EAAI,cACJA,EAAI,gBACJA,EAAI,YAAY,SAAA,EAChBA,EAAI,KAAA,CACL,EAEDF,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,GAAIC,EAAI,SAAS,OAAS,EAAG,CAC3B,MAAME,EAAUF,EAAI,SAAS,CAAC,EAC9BD,EAAS,KAAK/C,EAAkB,cAAckD,EAAQ,MAAO,CAAC,CAAC,EAC/DH,EAAS,KAAK,EAAE,EACZG,EAAQ,cACVH,EAAS,KAAKG,EAAQ,WAAW,EACjCH,EAAS,KAAK,EAAE,GAElBA,EAAS,KAAK/C,EAAkB,gBAAgBkD,EAAQ,eAAgB,SAAS,CAAC,EAClFH,EAAS,KAAK,EAAE,CAClB,CAGA,OAAIC,EAAI,UAAYA,EAAI,SAAS,OAAS,IACxCD,EAAS,KAAK/C,EAAkB,cAAc,mBAAoB,CAAC,CAAC,EACpE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,WAAWgD,EAAI,SAAS,IAAIG,GAAK,MAAMA,CAAC,EAAE,CAAC,CAAC,EAC5EJ,EAAS,KAAK,EAAE,GAGXA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,qBAAqBX,EAAiC,CAC5D,MAAMnB,EAAkB,CAAA,EAExB,OAAAA,EAAM,KAAK,KAAKmB,EAAO,QAAQ,aAAa,aAAa,EACzDnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,YAAY,eAAeA,EAAO,QAAQ,mBAAmB,cAAc,EAC1GnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,UAAU,gBAAgB,EACzDnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,kBAAkB,mBAAmB,EACpEnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,qBAAqB,yBAAyB,EAC7EnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,yBAAyB,2BAA2B,EACnFnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,iBAAiB,kBAAkB,EAClEnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,eAAe,gBAAgB,EAC9DnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,yBAAyB,0BAA0B,EAClFnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,yBAAyB,0BAA0B,EAClFnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,kBAAkB,mBAAmB,EACpEnB,EAAM,KAAK,KAAKmB,EAAO,QAAQ,0BAA0B,4BAA4B,EAE9EpC,EAAkB,WAAWiB,CAAK,CAC3C,CAKQ,8BAA8BmC,EAAkC,CACtE,MAAMnD,EAAU,CAAC,SAAU,YAAa,SAAU,UAAW,QAAS,QAAS,YAAY,EACrFC,EAAOkD,EAAM,IAAIC,GAAQ,CAC7BrD,EAAkB,WAAWqD,EAAK,YAAa,YAAYA,EAAK,WAAW,cAAc,EACzFA,EAAK,gBACLA,EAAK,WAAW,SAAA,EAChBA,EAAK,YAAY,SAAA,EACjBA,EAAK,UAAU,SAAA,EACfA,EAAK,kBAAkB,SAAA,EACvB,KAAK,sBAAsBA,EAAK,UAAU,CAAA,CAC3C,EAED,OAAOrD,EAAkB,YAAYC,EAASC,CAAI,CACpD,CAKQ,yBAAkC,CACxC,MAAM6C,EAAqB,CAAA,EAE3B,OAAAA,EAAS,KAAK/C,EAAkB,cAAc,UAAW,CAAC,CAAC,EAC3D+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,WAAW,CACzCA,EAAkB,WAAW,uBAAwB,oBAAoB,EACzEA,EAAkB,WAAW,cAAe,wBAAwB,EACpEA,EAAkB,WAAW,YAAa,sBAAsB,EAChEA,EAAkB,WAAW,qBAAsB,+BAA+B,EAClFA,EAAkB,WAAW,wBAAyB,kCAAkC,EACxFA,EAAkB,WAAW,oBAAqB,6BAA6B,EAC/EA,EAAkB,WAAW,kBAAmB,4BAA4B,EAC5EA,EAAkB,WAAW,4BAA6B,sCAAsC,EAChGA,EAAkB,WAAW,4BAA6B,sCAAsC,EAChGA,EAAkB,WAAW,6BAA8B,uCAAuC,EAClGA,EAAkB,WAAW,wBAAyB,kCAAkC,EACxFA,EAAkB,WAAW,0BAA2B,oCAAoC,EAC5FA,EAAkB,WAAW,wBAAyB,kCAAkC,CAAA,CACzF,CAAC,EACF+C,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK/C,EAAkB,cAAc,WAAY,CAAC,CAAC,EAC5D+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,WAAW,CACzCA,EAAkB,WAAW,oBAAqB,sBAAsB,EACxEA,EAAkB,WAAW,0BAA2B,qCAAqC,EAC7FA,EAAkB,WAAW,0BAA2B,+BAA+B,EACvFA,EAAkB,WAAW,2BAA4B,6BAA6B,CAAA,CACvF,CAAC,EACF+C,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK/C,EAAkB,cAAc,WAAY,CAAC,CAAC,EAC5D+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,WAAW,CACzCA,EAAkB,WAAW,oBAAqB,+BAA+B,EACjFA,EAAkB,WAAW,oBAAqB,+BAA+B,EACjFA,EAAkB,WAAW,4BAA6B,uCAAuC,CAAA,CAClG,CAAC,EACF+C,EAAS,KAAK,EAAE,EAETA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,gBAAgBX,EAAiC,CACvD,MAAMW,EAAqB,CAAA,EAE3BA,EAAS,KAAK/C,EAAkB,cAAc,iCAAkC,CAAC,CAAC,EAClF+C,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,mBAAoB,CAAC,CAAC,EACpE+C,EAAS,KAAK,EAAE,EAChB,MAAM9C,EAAU,CAAC,iBAAkB,OAAO,EACpCC,EAAO,CACX,CAAC,WAAYkC,EAAO,QAAQ,cAAc,UAAU,EACpD,CAAC,sBAAuBA,EAAO,QAAQ,gBAAgB,UAAU,EACjE,CAAC,UAAWA,EAAO,QAAQ,aAAa,UAAU,EAClD,CAAC,oBAAqBA,EAAO,QAAQ,oBAAoB,UAAU,EACnE,CAAC,cAAeA,EAAO,QAAQ,WAAW,UAAU,EACpD,CAAC,iBAAkBA,EAAO,QAAQ,mBAAmB,UAAU,EAC/D,CAAC,oBAAqBA,EAAO,QAAQ,sBAAsB,UAAU,EACrE,CAAC,yBAA0BA,EAAO,QAAQ,0BAA0B,UAAU,EAC9E,CAAC,gBAAiBA,EAAO,QAAQ,kBAAkB,UAAU,EAC7D,CAAC,cAAeA,EAAO,QAAQ,gBAAgB,UAAU,EACzD,CAAC,wBAAyBA,EAAO,QAAQ,0BAA0B,UAAU,EAC7E,CAAC,wBAAyBA,EAAO,QAAQ,0BAA0B,UAAU,EAC7E,CAAC,iBAAkBA,EAAO,QAAQ,mBAAmB,UAAU,EAC/D,CAAC,oBAAqBA,EAAO,QAAQ,sBAAsB,UAAU,EACrE,CAAC,iBAAkBA,EAAO,QAAQ,mBAAmB,UAAU,EAC/D,CAAC,0BAA2BA,EAAO,QAAQ,2BAA2B,UAAU,EAChF,CAAC,cAAeA,EAAO,QAAQ,gBAAgB,UAAU,EACzD,CAAC,eAAgBA,EAAO,QAAQ,iBAAiB,UAAU,CAAA,EAM7D,GAJAW,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAGZX,EAAO,mBAAqBA,EAAO,kBAAkB,OAAS,EAAG,CACnEW,EAAS,KAAK/C,EAAkB,cAAc,+BAAgC,CAAC,CAAC,EAChF+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,iCAAiCX,EAAO,kBAAkB,MAAM,EAAE,EAChFW,EAAS,KAAK,EAAE,EAEhB,MAAMO,EAAmBlB,EAAO,QAAQ,OAAO,IAEtC,EACR,EAAE,OAEGmB,EAAiBnB,EAAO,MAAM,OAAOoB,GAAKA,EAAE,gBAAgB,EAAE,OAEpET,EAAS,KAAK,kCAAkCO,CAAgB,EAAE,EAClEP,EAAS,KAAK,gCAAgCQ,CAAc,EAAE,EAC9DR,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK/C,EAAkB,WAAW,sCAAuC,0BAA0B,CAAC,EAC7G+C,EAAS,KAAK,EAAE,CAClB,CAGA,MAAMU,EAA8B,CAAA,EACpC,UAAWjB,KAAUJ,EAAO,SACtBI,EAAO,kBACTiB,EAAS,KAAK,GAAGjB,EAAO,gBAAgB,EAI5C,GAAIiB,EAAS,OAAS,EAAG,CACvBV,EAAS,KAAK/C,EAAkB,cAAc,2BAA4B,CAAC,CAAC,EAC5E+C,EAAS,KAAK,EAAE,EAEhB,MAAMW,EAAWD,EAAS,UAAYE,EAAE,WAAa,UAAU,EAAE,OAC3DC,EAAOH,EAAS,UAAYE,EAAE,WAAa,MAAM,EAAE,OACnDE,EAASJ,EAAS,UAAYE,EAAE,WAAa,QAAQ,EAAE,OACvDG,EAAML,EAAS,UAAYE,EAAE,WAAa,KAAK,EAAE,OAEvDZ,EAAS,KAAK,KAAK/C,EAAkB,YAAY,GAAG0D,CAAQ,YAAa,OAAO,CAAC,EAAE,EACnFX,EAAS,KAAK,KAAK/C,EAAkB,YAAY,GAAG4D,CAAI,QAAS,OAAO,CAAC,EAAE,EAC3Eb,EAAS,KAAK,KAAK/C,EAAkB,YAAY,GAAG6D,CAAM,UAAW,SAAS,CAAC,EAAE,EACjFd,EAAS,KAAK,KAAK/C,EAAkB,YAAY,GAAG8D,CAAG,OAAQ,MAAM,CAAC,EAAE,EACxEf,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK/C,EAAkB,WAAW,qCAAsC,kCAAkC,CAAC,EACpH+C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,mBAAmBX,EAAiC,CAC1D,MAAMW,EAAqB,CAAA,EAQ3B,GANAA,EAAS,KAAK/C,EAAkB,cAAc,cAAe,CAAC,CAAC,EAC/D+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,sBAAsBX,EAAO,QAAQ,YAAY,EAAE,EACjEW,EAAS,KAAK,yBAAyBX,EAAO,QAAQ,mBAAmB,EAAE,EAC3EW,EAAS,KAAK,EAAE,EAEZX,EAAO,QAAQ,SAAW,EAC5B,OAAAW,EAAS,KAAK,iCAAiC,EACxCA,EAAS,KAAK;AAAA,CAAI,EAI3B,MAAMgB,EAAU,KAAK,uBAAuB3B,EAAO,OAAO,EAE1D,SAAW,CAAC4B,EAAcC,CAAQ,IAAKF,EAAS,CAC9ChB,EAAS,KAAK/C,EAAkB,cAAcgE,EAAc,CAAC,CAAC,EAC9DjB,EAAS,KAAK,EAAE,EAEhB,SAAW,CAACmB,EAAYC,CAAO,IAAKF,EAAU,CAC5ClB,EAAS,KAAK/C,EAAkB,cAAckE,EAAY,CAAC,CAAC,EAC5DnB,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,UAAW,QAAS,OAAQ,OAAQ,WAAY,WAAY,aAAa,EAC5FC,EAAOiE,EAAQ,IAAIC,GAAU,CACjCA,EAAO,KACPA,EAAO,QACPA,EAAO,UACPA,EAAO,SACPA,EAAO,KAAK,SAAA,EACZ,KAAK,iBAAiBA,CAAM,EAAI,KAAO,GACvC,KAAK,kBAAkBA,EAAQhC,CAAM,EACrCgC,EAAO,aAAe,EAAA,CACvB,EAEDrB,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CACF,CAGA,MAAMsB,EAAmBjC,EAAO,QAAQ,UACtCkC,EAAE,WAAa,eAAiB,KAAK,iBAAiBA,CAAC,CAAA,EAGzD,GAAID,EAAiB,OAAS,EAAG,CAC/BtB,EAAS,KAAK/C,EAAkB,cAAc,0BAA2B,CAAC,CAAC,EAC3E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,0FAA0F,EACxGA,EAAS,KAAK,EAAE,EAEhB,MAAMwB,EAAc,CAAC,SAAU,SAAU,UAAW,OAAO,EACrDC,EAAWH,EAAiB,IAAIC,GAAK,CACzCA,EAAE,KACFA,EAAE,OACFA,EAAE,QACFA,EAAE,SAAA,CACH,EAEDvB,EAAS,KAAK/C,EAAkB,YAAYuE,EAAaC,CAAQ,CAAC,EAClEzB,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,iBAAiBX,EAAiC,CACxD,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,kBAAmB,CAAC,CAAC,EACnE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,oBAAoBX,EAAO,QAAQ,UAAU,EAAE,EAC7DW,EAAS,KAAK,EAAE,EAEZX,EAAO,MAAM,SAAW,EAC1B,OAAAW,EAAS,KAAK,+BAA+B,EACtCA,EAAS,KAAK;AAAA,CAAI,EAI3B,MAAMgB,EAAU,KAAK,mBAAmB3B,EAAO,KAAK,EAEpD,SAAW,CAAC8B,EAAYO,CAAK,IAAKV,EAAS,CACzChB,EAAS,KAAK/C,EAAkB,cAAckE,GAAc,yBAA0B,CAAC,CAAC,EACxFnB,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,UAAW,QAAS,QAAS,WAAY,QAAS,WAAY,aAAa,EAC9FC,EAAOuE,EAAM,IAAIC,GAAQ,CAC7BA,EAAK,KACL,GAAGA,EAAK,WAAW,WAAW,KAAKA,EAAK,WAAW,YAAY,IAC/DA,EAAK,UACL,KAAK,qBAAqBA,EAAK,KAAK,EACpCA,EAAK,iBAAmB,KAAO,GAC/BA,EAAK,MACL,KAAK,WAAWA,EAAK,UAAU,EAC/BA,EAAK,aAAe,EAAA,CACrB,EAED3B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,yBAAyBX,EAAiC,CAChE,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,qBAAsB,CAAC,CAAC,EACtE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,6BAA6BX,EAAO,QAAQ,kBAAkB,EAAE,EAC9EW,EAAS,KAAK,EAAE,EAEZX,EAAO,cAAc,SAAW,EAClC,OAAAW,EAAS,KAAK,wCAAwC,EAC/CA,EAAS,KAAK;AAAA,CAAI,EAI3B,MAAMgB,EAAU,KAAK,2BAA2B3B,EAAO,aAAa,EAEpE,SAAW,CAAC8B,EAAYS,CAAK,IAAKZ,EAAS,CACzChB,EAAS,KAAK/C,EAAkB,cAAckE,EAAY,CAAC,CAAC,EAC5DnB,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,QAAS,UAAW,QAAS,aAAc,UAAW,UAAU,EACnFC,EAAOyE,EAAM,IAAIC,GAAQ,CAC7BA,EAAK,KACLA,EAAK,UACLA,EAAK,WAAW,iBAChBA,EAAK,QAAU,SAAW5E,EAAkB,YAAY,SAAU,SAAS,EAAIA,EAAkB,YAAY,QAAS,SAAS,EAC/H4E,EAAK,WAAW,WAAW,OAAO,SAAA,EAClCA,EAAK,WAAW,QAAQ,OAAO,SAAA,EAC/B,KAAK,WAAWA,EAAK,UAAU,CAAA,CAChC,EAED7B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,4BAA4BX,EAAiC,CACnE,MAAMW,EAAqB,CAAA,EAS3B,GAPAA,EAAS,KAAK/C,EAAkB,cAAc,wBAAyB,CAAC,CAAC,EACzE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,kFAAkF,EAChGA,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,gCAAgCX,EAAO,QAAQ,qBAAqB,EAAE,EACpFW,EAAS,KAAK,EAAE,EAEZX,EAAO,iBAAiB,SAAW,EACrC,OAAAW,EAAS,KAAK,2CAA2C,EAClDA,EAAS,KAAK;AAAA,CAAI,EAI3B,MAAMgB,EAAU,KAAK,8BAA8B3B,EAAO,gBAAgB,EAE1E,SAAW,CAAC8B,EAAYW,CAAS,IAAKd,EAAS,CAC7ChB,EAAS,KAAK/C,EAAkB,cAAckE,EAAY,CAAC,CAAC,EAC5DnB,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,OAAQ,OAAQ,WAAY,QAAS,YAAa,WAAY,aAAa,EAC9FC,EAAO2E,EAAU,IAAIC,GAAA,CDzkBjC,IAAAC,ECykBuC,OAC/BD,EAAG,KACHA,EAAG,SACHA,EAAG,SACH,KAAK,uBAAuBA,CAAE,EAC9BA,EAAG,QACHC,EAAAD,EAAG,0BAAH,YAAAC,EAA4B,aAAc,UAC1C,KAAK,WAAWD,EAAG,UAAU,EAC7BA,EAAG,aAAe,EAAA,EACnB,EAED/B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAAA,EAAS,KAAK/C,EAAkB,cAAc,qBAAsB,CAAC,CAAC,EACtE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,OAAS/C,EAAkB,WAAW,4BAA6B,0CAA0C,EAAI,mCAAmC,EAClK+C,EAAS,KAAK,EAAE,EAETA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,wBAAwBX,EAAiC,CAC/D,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,oBAAqB,CAAC,CAAC,EACrE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,4BAA4BX,EAAO,QAAQ,iBAAiB,EAAE,EAC5EW,EAAS,KAAK,EAAE,EAEZX,EAAO,aAAa,SAAW,EACjC,OAAAW,EAAS,KAAK,uCAAuC,EAC9CA,EAAS,KAAK;AAAA,CAAI,EAI3B,MAAMgB,EAAU,KAAK,wBAAwB3B,EAAO,YAAY,EAEhE,SAAW,CAAC4C,EAAUC,CAAS,IAAKlB,EAAS,CAC3ChB,EAAS,KAAK/C,EAAkB,cAAc,GAAGgF,CAAQ,SAAU,CAAC,CAAC,EACrEjC,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,eAAgB,OAAQ,iBAAkB,aAAc,WAAY,aAAa,EACpGC,EAAO+E,EAAU,IAAIC,GAAM,CAC/BA,EAAG,KACHA,EAAG,YACH,KAAK,eAAeA,EAAG,WAAW,EAClCA,EAAG,iBAAmB,KAAO,GAC7BA,EAAG,aAAe,SAAW,GAC7B,KAAK,WAAWA,EAAG,UAAU,EAC7BA,EAAG,aAAe,EAAA,CACnB,EAEDnC,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,MAAMoC,EAAc/C,EAAO,aAAa,UAAa8C,EAAG,WAAa,cAAgBA,EAAG,QAAQ,EAChG,GAAIC,EAAY,OAAS,EAAG,CAC1BpC,EAAS,KAAK/C,EAAkB,cAAc,sBAAuB,CAAC,CAAC,EACvE+C,EAAS,KAAK,EAAE,EAEhB,MAAMqC,EAAkBD,EAAY,OAAOD,GAAMA,EAAG,YAAY,EAAE,OAC5DG,EAAqBF,EAAY,OAAOD,GAAMA,EAAG,gBAAgB,EAAE,OACnEI,EAAsBH,EAAY,OAAOD,ID9oBrD,IAAAH,EC8oB2D,QAAAA,EAAAG,EAAG,WAAH,YAAAH,EAAa,cAAe,OAAM,EAAE,OAEzFhC,EAAS,KAAK,sCAAsCqC,CAAe,UAAU,EAC7ErC,EAAS,KAAK,gCAAgCsC,CAAkB,UAAU,EAC1EtC,EAAS,KAAK,wBAAwBuC,CAAmB,UAAU,EACnEvC,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,sBAAsBX,EAAiC,CAC7D,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,kBAAmB,CAAC,CAAC,EACnE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,0BAA0BX,EAAO,QAAQ,eAAe,EAAE,EACxEW,EAAS,KAAK,EAAE,EAEZX,EAAO,WAAW,SAAW,EAC/B,OAAAW,EAAS,KAAK,qCAAqC,EAC5CA,EAAS,KAAK;AAAA,CAAI,EAI3B,MAAMgB,EAAU,KAAK,yBAAyB3B,EAAO,UAAU,EAE/D,SAAW,CAACmD,EAAaC,CAAI,IAAKzB,EAAS,CACzChB,EAAS,KAAK/C,EAAkB,cAAc,GAAGuF,CAAW,QAAS,CAAC,CAAC,EACvExC,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,OAAQ,eAAgB,UAAW,aAAc,YAAa,UAAU,EAC3FC,EAAOsF,EAAK,IAAIC,GAAO,CAC3BA,EAAI,WACJA,EAAI,WAAa,WAAa,SAC9BA,EAAI,wBAA0B,MAC9BA,EAAI,UAAY,MAAQ,KACxBA,EAAI,kBAAkB,OAAO,SAAA,EAC7BA,EAAI,mBAAmB,OAAO,SAAA,EAC9B,KAAK,WAAWA,EAAI,UAAU,CAAA,CAC/B,EAED1C,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,gCAAgCX,EAAiC,CACvE,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,4BAA6B,CAAC,CAAC,EAC7E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,oCAAoCX,EAAO,QAAQ,yBAAyB,EAAE,EAC5FW,EAAS,KAAK,EAAE,EAEZX,EAAO,qBAAqB,SAAW,EACzC,OAAAW,EAAS,KAAK,+CAA+C,EACtDA,EAAS,KAAK;AAAA,CAAI,EAG3B,MAAM9C,EAAU,CAAC,cAAe,OAAQ,WAAY,YAAa,UAAU,EACrEC,EAAOkC,EAAO,qBAAqB,IAAIsD,GAAO,CAClDA,EAAI,WACJA,EAAI,SACJA,EAAI,WAAa,MAAQ,KACzBA,EAAI,aAAe,MAAQ,KAC3B,KAAK,WAAWA,EAAI,UAAU,CAAA,CAC/B,EAED3C,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAGhB,MAAM4C,EAAgBvD,EAAO,qBAAqB,UAAcsD,EAAI,YAAc,CAACA,EAAI,YAAY,EACnG,OAAIC,EAAc,OAAS,IACzB5C,EAAS,KAAK/C,EAAkB,cAAc,6BAA8B,CAAC,CAAC,EAC9E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,qEAAqE,EACnFA,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,WAAW2F,EAAc,IAAID,GAAOA,EAAI,UAAU,CAAC,CAAC,EACpF3C,EAAS,KAAK,EAAE,GAGXA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,gCAAgCX,EAAiC,CACvE,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,4BAA6B,CAAC,CAAC,EAC7E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,oCAAoCX,EAAO,QAAQ,yBAAyB,EAAE,EAC5FW,EAAS,KAAK,EAAE,EAEZX,EAAO,qBAAqB,SAAW,EACzC,OAAAW,EAAS,KAAK,+CAA+C,EACtDA,EAAS,KAAK;AAAA,CAAI,EAG3B,MAAM9C,EAAU,CAAC,OAAQ,YAAa,SAAU,UAAU,EACpDC,EAAOkC,EAAO,qBAAqB,IAAIwD,GAAQ,CACnDA,EAAK,YACLA,EAAK,sBAAwB,UAC7BA,EAAK,aAAe5F,EAAkB,YAAY,YAAa,SAAS,EAAIA,EAAkB,YAAY,gBAAiB,OAAO,EAClI,KAAK,WAAW4F,EAAK,UAAU,CAAA,CAChC,EAED,OAAA7C,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAETA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,gCAAgCX,EAAiC,CACvE,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,6BAA8B,CAAC,CAAC,EAC9E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,qCAAqCX,EAAO,QAAQ,yBAAyB,EAAE,EAC7FW,EAAS,KAAK,EAAE,EAEZX,EAAO,qBAAqB,SAAW,EACzC,OAAAW,EAAS,KAAK,gDAAgD,EACvDA,EAAS,KAAK;AAAA,CAAI,EAI3B,MAAMgB,EAAU,KAAK,kBAAkB3B,EAAO,oBAAoB,EAElE,SAAW,CAAC8B,EAAYxB,CAAI,IAAKqB,EAAS,CACxChB,EAAS,KAAK/C,EAAkB,cAAckE,EAAY,CAAC,CAAC,EAC5DnB,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,SAAU,WAAY,eAAgB,QAAS,UAAU,EAC5EC,EAAOwC,EAAK,IAAImD,GAAO,CAC3BA,EAAI,KACJA,EAAI,WAAW,OAAO,OAAO,SAAA,EAC7BA,EAAI,WAAW,SAAS,KAAK,IAAI,EACjCA,EAAI,WAAW,gBAAkB,MAAQ,KACzCA,EAAI,QAAU,SAAW7F,EAAkB,YAAY,SAAU,SAAS,EAAIA,EAAkB,YAAY,QAAS,SAAS,EAC9H,KAAK,WAAW6F,EAAI,UAAU,CAAA,CAC/B,EAED9C,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,6BAA6BX,EAAiC,CACpE,MAAMW,EAAqB,CAAA,EAK3B,GAHAA,EAAS,KAAK/C,EAAkB,cAAc,wBAAyB,CAAC,CAAC,EACzE+C,EAAS,KAAK,EAAE,EAEZ,CAACX,EAAO,mBAAqBA,EAAO,kBAAkB,SAAW,EACnE,OAAAW,EAAS,KAAK,oCAAoC,EAC3CA,EAAS,KAAK;AAAA,CAAI,EAG3BA,EAAS,KAAK,iCAAiCX,EAAO,kBAAkB,MAAM,EAAE,EAChFW,EAAS,KAAK,EAAE,EAGhB,MAAM+C,MAAa,IACnB,UAAWC,KAAY3D,EAAO,kBAAmB,CAC/C,MAAM4D,EAAOD,EAAS,UACjBD,EAAO,IAAIE,CAAI,GAClBF,EAAO,IAAIE,EAAM,EAAE,EAErBF,EAAO,IAAIE,CAAI,EAAG,KAAKD,CAAQ,CACjC,CAEA,SAAW,CAACE,EAAWC,CAAS,IAAKJ,EAAQ,CAC3C/C,EAAS,KAAK/C,EAAkB,cAAc,GAAGiG,CAAS,kBAAmB,CAAC,CAAC,EAC/ElD,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,SAAU,WAAY,QAAS,aAAa,EACvDC,EAAOgG,EAAU,IAAIC,GAAM,CAC/BA,EAAG,OACHA,EAAG,SAAS,YAAA,EACZA,EAAG,UAAU,SAAA,EACbA,EAAG,WAAW,OAAO,WAAa,aAAA,CACnC,EAEDpD,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,8BAA8BX,EAAiC,CACrE,MAAMW,EAAqB,CAAA,EAK3B,GAHAA,EAAS,KAAK/C,EAAkB,cAAc,0BAA2B,CAAC,CAAC,EAC3E+C,EAAS,KAAK,EAAE,EAEZ,CAACX,EAAO,kBAAoBA,EAAO,iBAAiB,SAAW,EACjE,OAAAW,EAAS,KAAK,4EAA4E,EACnFA,EAAS,KAAK;AAAA,CAAI,EAG3BA,EAAS,KAAK,iCAAiCX,EAAO,iBAAiB,MAAM,EAAE,EAC/EW,EAAS,KAAK,EAAE,EAGhB,MAAMqD,MAAa,IACnB,UAAW/C,KAAQjB,EAAO,iBACnBgE,EAAO,IAAI/C,EAAK,cAAc,GACjC+C,EAAO,IAAI/C,EAAK,eAAgB,CAAA,CAAE,EAEpC+C,EAAO,IAAI/C,EAAK,cAAc,EAAG,KAAKA,CAAI,EAG5C,SAAW,CAACxC,EAAMuC,CAAK,IAAKgD,EAAQ,CAClCrD,EAAS,KAAK/C,EAAkB,cAAca,EAAM,CAAC,CAAC,EACtDkC,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,gBAAiB,gBAAiB,aAAc,YAAa,MAAM,EAC9EC,EAAOkD,EAAM,IAAIC,GAAQ,CAC7BA,EAAK,wBACLA,EAAK,wBACLA,EAAK,eACLA,EAAK,UACLA,EAAK,eAAiB,QAAU,MAAA,CACjC,EAEDN,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,6BAA6BX,EAAiC,CACpE,MAAMW,EAAqB,CAAA,EAK3B,GAHAA,EAAS,KAAK/C,EAAkB,cAAc,wBAAyB,CAAC,CAAC,EACzE+C,EAAS,KAAK,EAAE,EAEZ,CAACX,EAAO,sBAAwBA,EAAO,qBAAqB,SAAW,EACzE,OAAAW,EAAS,KAAK,iDAAiD,EACxDA,EAAS,KAAK;AAAA,CAAI,EAG3B,UAAWsD,KAAYjE,EAAO,qBAAsB,CAClDW,EAAS,KAAK/C,EAAkB,cAAcqG,EAAS,aAAc,CAAC,CAAC,EACvEtD,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,kBAAkBsD,EAAS,SAAS,EAAE,EACpDtD,EAAS,KAAK,gBAAgBsD,EAAS,OAAO,EAAE,EAChDtD,EAAS,KAAK,gBAAgBsD,EAAS,UAAY,MAAQ,IAAI,EAAE,EACjEtD,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK/C,EAAkB,cAAc,yBAA0B,CAAC,CAAC,EAC1E+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,iBAAkB,OAAO,EACpCC,EAAO,CACX,CAAC,WAAYmG,EAAS,gBAAgB,SAAS,UAAU,EACzD,CAAC,UAAWA,EAAS,gBAAgB,QAAQ,UAAU,EACvD,CAAC,QAASA,EAAS,gBAAgB,MAAM,UAAU,EACnD,CAAC,iBAAkBA,EAAS,gBAAgB,cAAc,UAAU,EACpE,CAAC,oBAAqBA,EAAS,gBAAgB,iBAAiB,UAAU,EAC1E,CAAC,yBAA0BA,EAAS,gBAAgB,KAAK,UAAU,EACnE,CAAC,gBAAiBA,EAAS,gBAAgB,aAAa,UAAU,EAClE,CAAC,cAAeA,EAAS,gBAAgB,WAAW,UAAU,EAC9D,CAAC,wBAAyBA,EAAS,gBAAgB,qBAAqB,UAAU,EAClF,CAAC,wBAAyBA,EAAS,gBAAgB,qBAAqB,UAAU,EAClF,CAAC,iBAAkBA,EAAS,gBAAgB,cAAc,UAAU,CAAA,EAGtEtD,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,uBAAuBP,EAAyBJ,EAAiC,CDh8B3F,IAAA2C,EAAAuB,EAAAC,ECi8BI,MAAMxD,EAAqB,CAAA,EACrByD,EAAOhE,EAAO,OACdiE,IAAcH,GAAAvB,EAAAyB,EAAK,cAAL,YAAAzB,EAAkB,qBAAlB,YAAAuB,EAAsC,QAASE,EAAK,YAExEzD,EAAS,KAAK/C,EAAkB,cAAc,GAAGyG,CAAW,cAAe,CAAC,CAAC,EAC7E1D,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,cAAe,CAAC,CAAC,EAC/D+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,uBAAuByD,EAAK,WAAW,EAAE,EACvDzD,EAAS,KAAK,sBAAsByD,EAAK,UAAU,EAAE,EACrDzD,EAAS,KAAK,qBAAqByD,EAAK,kBAAkB,EAAE,EAC5DzD,EAAS,KAAK,uBAAuByD,EAAK,oBAAoB,EAAE,EAChEzD,EAAS,KAAK,wBAAwByD,EAAK,eAAiB,MAAQ,IAAI,EAAE,EAC1EzD,EAAS,KAAK,kBAAkByD,EAAK,UAAY,MAAQ,IAAI,EAAE,EAC/DzD,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,6BAA2BwD,EAAAC,EAAK,aAAL,YAAAD,EAAiB,SAAU,CAAC,EAAE,EACvExD,EAAS,KAAK,kBAAkBP,EAAO,QAAQ,MAAM,EAAE,EACvDO,EAAS,KAAK,gBAAgBP,EAAO,MAAM,MAAM,EAAE,EACnDO,EAAS,KAAK,yBAAyBP,EAAO,cAAc,MAAM,EAAE,EACpEO,EAAS,KAAK,gBAAgBP,EAAO,MAAM,MAAM,EAAE,EACnDO,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,gBAAiB,CAAC,CAAC,EACjE+C,EAAS,KAAK,EAAE,EAEhB,MAAM2D,EAAW,CAAC1G,EAAkB,WAAW,kBAAmB,WAAW,CAAC,EAG9E,OAAI,KAAK,cAAcwC,EAAQJ,CAAM,GACnCsE,EAAS,KAAK1G,EAAkB,WAAW,qBAAsB,eAAe,CAAC,EAI/E,KAAK,qBAAqBwC,EAAQJ,CAAM,GAC1CsE,EAAS,KAAK1G,EAAkB,WAAW,qBAAsB,uBAAuB,CAAC,EAI9E,KAAK,cAAcwC,EAAO,OAAO,YAAaJ,CAAM,EACxD,OAAS,GAChBsE,EAAS,KAAK1G,EAAkB,WAAW,yBAA0B,2BAA2B,CAAC,EAGnG+C,EAAS,KAAK/C,EAAkB,WAAW0G,CAAQ,CAAC,EACpD3D,EAAS,KAAK,EAAE,EAETA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,qBAAqBP,EAAiC,CDx/BhE,IAAAuC,EAAAuB,EAAAC,EAAAI,ECy/BI,MAAM5D,EAAqB,CAAA,EACrByD,EAAOhE,EAAO,OACdiE,IAAcH,GAAAvB,EAAAyB,EAAK,cAAL,YAAAzB,EAAkB,qBAAlB,YAAAuB,EAAsC,QAASE,EAAK,YAExEzD,EAAS,KAAK/C,EAAkB,cAAc,GAAGyG,CAAW,YAAa,CAAC,CAAC,EAC3E1D,EAAS,KAAK,EAAE,EAGhB,MAAM6D,GAAoBD,GAAAJ,EAAAC,EAAK,cAAL,YAAAD,EAAkB,qBAAlB,YAAAI,EAAsC,MAUhE,GATIC,IACF7D,EAAS,KAAK6D,CAAiB,EAC/B7D,EAAS,KAAK,EAAE,GAIlBA,EAAS,KAAK/C,EAAkB,cAAc,aAAc,CAAC,CAAC,EAC9D+C,EAAS,KAAK,EAAE,EAEZyD,EAAK,YAAcA,EAAK,WAAW,OAAS,EAAG,CACjD,MAAMvG,EAAU,CAAC,eAAgB,eAAgB,OAAQ,WAAY,SAAU,aAAa,EACtFC,EAAOsG,EAAK,WAAW,IAAIK,GAAA,CD7gCvC,IAAA9B,EAAAuB,EAAAC,EAAAI,EC6gC+C,OACvCE,EAAK,cACLP,GAAAvB,EAAA8B,EAAK,cAAL,YAAA9B,EAAkB,qBAAlB,YAAAuB,EAAsC,QAAS,GAC/CO,EAAK,cACLA,EAAK,cAAc,MACnBA,EAAK,kBAAoB,MAAQ,OACjCF,GAAAJ,EAAAM,EAAK,cAAL,YAAAN,EAAkB,qBAAlB,YAAAI,EAAsC,QAAS,EAAA,EAChD,EAED5D,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,MACEA,EAAS,KAAK,sBAAsB,EACpCA,EAAS,KAAK,EAAE,EAIlB,GAAIyD,EAAK,wBAA0BA,EAAK,uBAAuB,OAAS,EAAG,CACzEzD,EAAS,KAAK/C,EAAkB,cAAc,sCAAuC,CAAC,CAAC,EACvF+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,cAAe,oBAAqB,wBAAyB,QAAQ,EAChFC,EAAOsG,EAAK,uBAAuB,IAAIM,GAAO,CAClDA,EAAI,WACJA,EAAI,iBACJA,EAAI,qBACJA,EAAI,qBAAuB,MAAQ,IAAA,CACpC,EAED/D,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,GAAIyD,EAAK,wBAA0BA,EAAK,uBAAuB,OAAS,EAAG,CACzEzD,EAAS,KAAK/C,EAAkB,cAAc,4BAA6B,CAAC,CAAC,EAC7E+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,cAAe,qBAAsB,wBAAyB,QAAQ,EACjFC,EAAOsG,EAAK,uBAAuB,IAAIM,GAAO,CAClDA,EAAI,WACJA,EAAI,kBACJA,EAAI,qBACJA,EAAI,qBAAuB,MAAQ,IAAA,CACpC,EAED/D,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,GAAIyD,EAAK,yBAA2BA,EAAK,wBAAwB,OAAS,EAAG,CAC3EzD,EAAS,KAAK/C,EAAkB,cAAc,6BAA8B,CAAC,CAAC,EAC9E+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,cAAe,WAAY,WAAY,kBAAmB,QAAQ,EAC7EC,EAAOsG,EAAK,wBAAwB,IAAIM,GAAO,CACnDA,EAAI,WACJA,EAAI,mBACJA,EAAI,mBACJA,EAAI,oBACJA,EAAI,qBAAuB,MAAQ,IAAA,CACpC,EAED/D,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,GAAIyD,EAAK,MAAQA,EAAK,KAAK,OAAS,EAAG,CACrCzD,EAAS,KAAK/C,EAAkB,cAAc,iBAAkB,CAAC,CAAC,EAClE+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,eAAgB,iBAAkB,QAAQ,EACrDC,EAAOsG,EAAK,KAAK,IAAIO,GAAO,CAChCA,EAAI,YACJA,EAAI,cAAc,KAAK,IAAI,EAC3BA,EAAI,sBAAwB,SAAA,CAC7B,EAEDhE,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,GAAIP,EAAO,eAAiBA,EAAO,cAAc,cAAc,OAAS,EAAG,CACzEO,EAAS,KAAK/C,EAAkB,cAAc,iBAAkB,CAAC,CAAC,EAClE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,qBAAqBP,EAAO,cAAc,cAAc,MAAM,mDAAmD,EAC/HO,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,QAAS,sBAAsB,EAC1CC,EAAmB,CAAA,EAEzB,UAAW8G,KAAgBxE,EAAO,cAAc,cAAe,CAC7D,MAAMyE,EAAeD,EAAa,SAAS,IAAI1C,GAAK,CAClD,MAAM4C,EAAc,CAAA,EACpB,OAAI5C,EAAE,SAAS4C,EAAY,KAAK,GAAG,EAC/B5C,EAAE,WAAW4C,EAAY,KAAK,GAAG,EACjC5C,EAAE,WAAW4C,EAAY,KAAK,GAAG,EAC9B,GAAG5C,EAAE,WAAW,KAAK4C,EAAY,KAAK,IAAI,CAAC,GACpD,CAAC,EAAE,KAAK,IAAI,EAEZhH,EAAK,KAAK,CACR8G,EAAa,qBACbC,CAAA,CACD,CACH,CAEAlE,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,mDAAmD,EACjEA,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,yBAAyBP,EAAyBJ,EAAiC,CDpoC7F,IAAA2C,EAAAuB,ECqoCI,MAAMvD,EAAqB,CAAA,EACrByD,EAAOhE,EAAO,OACdiE,IAAcH,GAAAvB,EAAAyB,EAAK,cAAL,YAAAzB,EAAkB,qBAAlB,YAAAuB,EAAsC,QAASE,EAAK,YAMxE,GAJAzD,EAAS,KAAK/C,EAAkB,cAAc,GAAGyG,CAAW,gBAAiB,CAAC,CAAC,EAC/E1D,EAAS,KAAK,EAAE,EAGZP,EAAO,QAAQ,OAAS,EAAG,CAC7BO,EAAS,KAAK/C,EAAkB,cAAc,UAAW,CAAC,CAAC,EAC3D+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,UAAW,QAAS,OAAQ,OAAQ,UAAU,EACjEC,EAAOsC,EAAO,QAAQ,IAAI4B,GAAU,CACxCA,EAAO,KACPA,EAAO,QACPA,EAAO,UACPA,EAAO,SACPA,EAAO,KAAK,SAAA,EACZA,EAAO,YAAA,CACR,EAEDrB,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,GAAIP,EAAO,MAAM,OAAS,EAAG,CAC3BO,EAAS,KAAK/C,EAAkB,cAAc,cAAe,CAAC,CAAC,EAC/D+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,UAAW,QAAS,QAAS,UAAU,EAC1DC,EAAOsC,EAAO,MAAM,IAAIkC,GAAQ,CACpCA,EAAK,KACL,GAAGA,EAAK,WAAW,WAAW,KAAKA,EAAK,WAAW,YAAY,IAC/DA,EAAK,UACL,KAAK,qBAAqBA,EAAK,KAAK,EACpCA,EAAK,iBAAmB,KAAO,EAAA,CAChC,EAED3B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,GAAIP,EAAO,cAAc,OAAS,EAAG,CACnCO,EAAS,KAAK/C,EAAkB,cAAc,iBAAkB,CAAC,CAAC,EAClE+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,QAAS,UAAW,QAAS,aAAc,SAAS,EACvEC,EAAOsC,EAAO,cAAc,IAAIoC,GAAQ,CAC5CA,EAAK,KACLA,EAAK,UACLA,EAAK,WAAW,iBAChBA,EAAK,QAAU,SAAW5E,EAAkB,YAAY,SAAU,SAAS,EAAIA,EAAkB,YAAY,QAAS,SAAS,EAC/H4E,EAAK,WAAW,WAAW,OAAO,SAAA,EAClCA,EAAK,WAAW,QAAQ,OAAO,SAAA,CAAS,CACzC,EAED7B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,GAAIP,EAAO,MAAM,OAAS,EAAG,CAC3B,MAAM2E,EAAa3E,EAAO,MAAM,QAAQ4E,GAAQA,EAAK,aAAa,EAElE,GAAID,EAAW,OAAS,EAAG,CACzBpE,EAAS,KAAK/C,EAAkB,cAAc,4BAA6B,CAAC,CAAC,EAC7E+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,QAAS,UAAW,WAAY,YAAa,SAAS,EACjEC,EAAOiH,EAAW,IAAIE,GAAW,CACrCA,EAAQ,MACRA,EAAQ,YACRA,EAAQ,aACRA,EAAQ,WAAa,MACrBA,EAAQ,QAAU,MAAQ,IAAA,CAC3B,EAEDtE,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CACF,CAGA,MAAMuE,EAAmBlF,EAAO,yBAAyB,IAAIoE,EAAK,WAAW,GAAK,CAAA,EAClF,GAAIc,EAAiB,OAAS,EAAG,CAC/BvE,EAAS,KAAK/C,EAAkB,cAAc,iCAAkC,CAAC,CAAC,EAClF+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,yDAAyD,EACvEA,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,OAAQ,OAAQ,OAAQ,WAAY,OAAO,EACtDC,EAAOoH,EAAiB,IAAIxC,GAAM,CACtCA,EAAG,KACHA,EAAG,SACHA,EAAG,SACH,KAAK,uBAAuBA,CAAE,EAC9BA,EAAG,KAAA,CACJ,EAED/B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,0BAA0BP,EAAyB+E,EAAkC,CDrvC/F,IAAAxC,EAAAuB,ECsvCI,MAAMvD,EAAqB,CAAA,EACrByD,EAAOhE,EAAO,OACdiE,IAAcH,GAAAvB,EAAAyB,EAAK,cAAL,YAAAzB,EAAkB,qBAAlB,YAAAuB,EAAsC,QAASE,EAAK,YAExEzD,EAAS,KAAK/C,EAAkB,cAAc,GAAGyG,CAAW,wBAAyB,CAAC,CAAC,EACvF1D,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,+EAA+E,EAC7FA,EAAS,KAAK,EAAE,EAGhB,MAAMyE,MAAuB,IAC7B,UAAWpD,KAAU5B,EAAO,QAAS,CACnC,MAAMuE,EAAM3C,EAAO,QACdoD,EAAiB,IAAIT,CAAG,GAC3BS,EAAiB,IAAIT,EAAK,EAAE,EAE9BS,EAAiB,IAAIT,CAAG,EAAG,KAAK3C,CAAM,CACxC,CAGA,GAAI5B,EAAO,QAAQ,SAAW,EAAG,CAK/B,GAJAO,EAAS,KAAK,2CAA2C,EACzDA,EAAS,KAAK,EAAE,EAGZP,EAAO,cAAc,OAAS,EAAG,CACnCO,EAAS,KAAK/C,EAAkB,cAAc,iBAAkB,CAAC,CAAC,EAClE+C,EAAS,KAAK,EAAE,EAChB,MAAM9C,EAAU,CAAC,OAAQ,QAAS,OAAO,EACnCC,EAAOsC,EAAO,cAAc,IAAIiF,GAAM,CAC1CA,EAAG,KACHA,EAAG,UACHA,EAAG,QAAU,SAAWzH,EAAkB,YAAY,SAAU,SAAS,EAAIA,EAAkB,YAAY,QAAS,SAAS,CAAA,CAC9H,EACD+C,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,MAAM2E,EAAiBlF,EAAO,MAAM,UAAYgB,EAAE,WAAW,cAAgB,WAAW,EACxF,GAAIkE,EAAe,OAAS,EAAG,CAC7B3E,EAAS,KAAK/C,EAAkB,cAAc,kBAAmB,CAAC,CAAC,EACnE+C,EAAS,KAAK,EAAE,EAChB,MAAM9C,EAAU,CAAC,OAAQ,gBAAiB,OAAO,EAC3CC,EAAOwH,EAAe,IAAIhD,GAAQ,CACtCA,EAAK,KACLA,EAAK,WAAW,aAChBA,EAAK,SAAA,CACN,EACD3B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAGA,MAAM4E,EAAkBnF,EAAO,cAAc,OAAOiF,GAAMA,EAAG,YAAc,QAAQ,EAGnF,SAAW,CAACG,EAASzD,CAAO,IAAKqD,EAAkB,CACjDzE,EAAS,KAAK/C,EAAkB,cAAc,GAAG4H,CAAO,SAAU,CAAC,CAAC,EACpE7E,EAAS,KAAK,EAAE,EAGhB,MAAM8E,EAAgB,CAAC,GAAG1D,CAAO,EAAE,KAAK,CAAC2D,EAAGC,IACtCD,EAAE,QAAUC,EAAE,MAAcD,EAAE,MAAQC,EAAE,MACrCD,EAAE,KAAOC,EAAE,IACnB,EAGKC,MAAc,IACpB,UAAW5D,KAAUyD,EACdG,EAAQ,IAAI5D,EAAO,KAAK,GAC3B4D,EAAQ,IAAI5D,EAAO,MAAO,CAAA,CAAE,EAE9B4D,EAAQ,IAAI5D,EAAO,KAAK,EAAG,KAAKA,CAAM,EAIxCrB,EAAS,KAAK/C,EAAkB,gBAC9B,KAAK,4BAA4BgI,EAASL,CAAe,EACzD,MAAA,CACD,EACD5E,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,oBAAqB,CAAC,CAAC,EACrE+C,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,QAAS,OAAQ,OAAQ,gBAAiB,OAAQ,MAAM,EACnEC,EAAmB,CAAA,EAMrByH,EAAgB,OAAS,GAC3BA,EAAgB,QAASF,GAAO,CAC9BvH,EAAK,KAAK,EACPA,EAAK,OAAS,GAAG,SAAA,EAClB,gBACAuH,EAAG,KACH,6BACAA,EAAG,QAAU,SAAWzH,EAAkB,YAAY,SAAU,SAAS,EAAIA,EAAkB,YAAY,QAAS,SAAS,EAC7H,GAAA,CACD,CACH,CAAC,EAIH6H,EAAc,QAASzD,GAAW,CAChClE,EAAK,KAAK,EACPA,EAAK,OAAS,GAAG,SAAA,EAClB,SACAkE,EAAO,KACPA,EAAO,UACPA,EAAO,SACPA,EAAO,KAAK,SAAA,CAAS,CACtB,CACH,CAAC,EAEDrB,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAGhB,MAAMkF,EAAcJ,EAAc,OAAOvD,GAAKA,EAAE,OAAS,CAAC,EACtD2D,EAAY,OAAS,IACvBlF,EAAS,KAAK/C,EAAkB,cAAc,yBAA0B,CAAC,CAAC,EAC1E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,GAAGkF,EAAY,MAAM,yHAAyH,EAC5JlF,EAAS,KAAK,EAAE,EAEpB,CAGA,GAAIP,EAAO,cAAc,OAAS,EAAG,CACnCO,EAAS,KAAK/C,EAAkB,cAAc,iBAAkB,CAAC,CAAC,EAClE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,iFAAiF,EAC/FA,EAAS,KAAK,EAAE,EAChB,MAAM9C,EAAU,CAAC,OAAQ,QAAS,UAAW,OAAO,EAC9CC,EAAOsC,EAAO,cAAc,IAAIiF,GAAM,CAC1CA,EAAG,KACHA,EAAG,UACHA,EAAG,WAAW,iBACdA,EAAG,QAAU,SAAWzH,EAAkB,YAAY,SAAU,SAAS,EAAIA,EAAkB,YAAY,QAAS,SAAS,CAAA,CAC9H,EACD+C,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,MAAM2E,EAAiBlF,EAAO,MAAM,UAAYgB,EAAE,WAAW,cAAgB,WAAW,EACxF,GAAIkE,EAAe,OAAS,EAAG,CAC7B3E,EAAS,KAAK/C,EAAkB,cAAc,8BAA+B,CAAC,CAAC,EAC/E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,8CAA8C,EAC5DA,EAAS,KAAK,EAAE,EAChB,MAAM9C,EAAU,CAAC,OAAQ,gBAAiB,QAAS,OAAO,EACpDC,EAAOwH,EAAe,IAAIhD,GAAQ,CACtCA,EAAK,KACLA,EAAK,WAAW,aAChBA,EAAK,UACL,KAAK,qBAAqBA,EAAK,KAAK,CAAA,CACrC,EACD3B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,4BAA4BiF,EAA6BE,EAAuC,CACtG,MAAMtG,EAAkB,CAAA,EAKxB,GAJAA,EAAM,KAAK,kBAAkB,EAC7BA,EAAM,KAAK,EAAE,EAGTsG,EAAc,OAAS,EAAG,CAC5BtG,EAAM,KAAK,gDAAgD,EAC3DA,EAAM,KAAK,GAAG,EACd,QAAS,EAAI,EAAG,EAAIsG,EAAc,OAAQ,IAAK,CAC7C,MAAMT,EAAKS,EAAc,CAAC,EACpBxG,EAAS,IAAMwG,EAAc,OAAS,GAAKF,EAAQ,OAAS,EAC5DvG,EAASC,EAAS,KAAO,KACzByG,EAAQV,EAAG,QAAU,SAAW,WAAa,UACnD7F,EAAM,KAAK,GAAGH,CAAM,IAAI,EAAI,CAAC,KAAKgG,EAAG,IAAI,IAAIU,CAAK,EAAE,EAC/CzG,GACHE,EAAM,KAAK,GAAG,CAElB,CACAA,EAAM,KAAK,EAAE,CACf,CAGA,IAAIwG,EAAa,EACjB,SAAW,CAACC,EAAOlE,CAAO,IAAK6D,EAAS,CACtC,MAAMM,EAAYnE,EAAQ,CAAC,EAAE,UACvBoE,EAAcH,IAAeJ,EAAQ,KAAO,EAElDpG,EAAM,KAAK,YAAYyG,CAAK,KAAKC,CAAS,EAAE,EAC5C1G,EAAM,KAAK,GAAG,EAEd,QAASlB,EAAI,EAAGA,EAAIyD,EAAQ,OAAQzD,IAAK,CACvC,MAAM0D,EAASD,EAAQzD,CAAC,EAClB8H,EAAe9H,IAAMyD,EAAQ,OAAS,EACtC1C,EAAS+G,GAAgBD,EAAc,KAAO,KAC9CE,EAAOrE,EAAO,OAAS,EAAI,SAAW,UAC5CxC,EAAM,KAAK,GAAGH,CAAM,IAAIf,EAAI,CAAC,KAAK0D,EAAO,IAAI,IAAIqE,CAAI,EAAE,EACnD,CAACD,GAAgB,CAACD,EACpB3G,EAAM,KAAK,cAAgBwC,EAAO,KAAO,GAAG,EAE5CxC,EAAM,KAAK,cAAgBwC,EAAO,KAAO,GAAG,EAEzCoE,GACH5G,EAAM,KAAK,GAAG,CAElB,CAEAA,EAAM,KAAK,EAAE,EACbwG,GACF,CAEA,OAAOxG,EAAM,KAAK;AAAA,CAAI,CACxB,CAKQ,mBAAmBY,EAAyBE,EAAqC,CD/9C3F,IAAAqC,EAAAuB,ECg+CI,MAAMvD,EAAqB,CAAA,EACrByD,EAAOhE,EAAO,OACdiE,IAAcH,GAAAvB,EAAAyB,EAAK,cAAL,YAAAzB,EAAkB,qBAAlB,YAAAuB,EAAsC,QAASE,EAAK,YAExEzD,EAAS,KAAK/C,EAAkB,cAAc,GAAGyG,CAAW,4BAA6B,CAAC,CAAC,EAC3F1D,EAAS,KAAK,EAAE,EAEhB,UAAW8C,KAAOnD,EAAM,CACtBK,EAAS,KAAK/C,EAAkB,cAAc6F,EAAI,KAAM,CAAC,CAAC,EAC1D9C,EAAS,KAAK,EAAE,EAEZ8C,EAAI,cACN9C,EAAS,KAAK8C,EAAI,WAAW,EAC7B9C,EAAS,KAAK,EAAE,GAGlBA,EAAS,KAAK,cAAc8C,EAAI,QAAU,SAAW7F,EAAkB,YAAY,SAAU,SAAS,EAAIA,EAAkB,YAAY,QAAS,SAAS,CAAC,EAAE,EAC7J+C,EAAS,KAAK,iBAAiB8C,EAAI,WAAW,SAAS,KAAK,IAAI,CAAC,EAAE,EACnE9C,EAAS,KAAK,qBAAqB8C,EAAI,WAAW,gBAAkB,MAAQ,IAAI,EAAE,EAClF9C,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,SAAU,CAAC,CAAC,EAC1D+C,EAAS,KAAK,EAAE,EAEhB,UAAWsF,KAASxC,EAAI,WAAW,OAAQ,CAIzC,GAHA9C,EAAS,KAAK,KAAKsF,EAAM,KAAK,KAAKA,EAAM,IAAI,OAAOA,EAAM,MAAM,GAAG,EACnEtF,EAAS,KAAK,EAAE,EAEZsF,EAAM,MAAM,OAAS,EAAG,CAC1B,MAAMK,EAAYL,EAAM,MAAM,IAAIM,GAChC,GAAGA,EAAK,IAAI,KAAKA,EAAK,SAAS,IAAIA,EAAK,SAAW,cAAgB,EAAE,EAAA,EAEvE5F,EAAS,KAAK/C,EAAkB,WAAW0I,CAAS,CAAC,CACvD,CACA3F,EAAS,KAAK,EAAE,CAClB,CACF,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,yBAAyBX,EAAiC,CAChE,MAAMW,EAAqB,CAAA,EAE3BA,EAAS,KAAK/C,EAAkB,cAAc,2BAA4B,CAAC,CAAC,EAC5E+C,EAAS,KAAK,EAAE,EAGhB,MAAM6F,EAASxG,EAAO,SAAS,IAAII,GAAU,CDphDjD,IAAAuC,EAAAuB,ECqhDM,MAAMuC,EAAQ,KAAK,yBAAyBrG,EAAQJ,CAAM,EAC1D,MAAO,CACL,OAAQI,EAAO,OAAO,YACtB,cAAa8D,GAAAvB,EAAAvC,EAAO,OAAO,cAAd,YAAAuC,EAA2B,qBAA3B,YAAAuB,EAA+C,QAAS9D,EAAO,OAAO,YACnF,MAAOqG,EAAM,MACb,WAAYA,EAAM,MAClB,UAAWA,EAAM,SAAA,CAErB,CAAC,EAGDD,EAAO,KAAK,CAAC,EAAGb,IAAMA,EAAE,MAAQ,EAAE,KAAK,EAGvC,MAAM9H,EAAU,CAAC,SAAU,QAAS,aAAc,SAAU,UAAW,QAAS,OAAO,EACjFC,EAAO0I,EAAO,IAAIE,GAAK,CAC3BA,EAAE,YACFA,EAAE,MAAM,SAAA,EACR,KAAK,sBAAsBA,EAAE,UAAU,EACvCA,EAAE,UAAU,WAAW,SAAA,EACvBA,EAAE,UAAU,QAAQ,SAAA,EACpBA,EAAE,UAAU,MAAM,SAAA,EAClBA,EAAE,UAAU,cAAc,SAAA,CAAS,CACpC,EAED,OAAA/F,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,sBAAuB,CAAC,CAAC,EACvE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,0CAA0C,EACxDA,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,WAAW,CACzC,2BACA,yBACA,uBACA,gCACA,sBAAA,CACD,CAAC,EACF+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,wBAAwB,EACtCA,EAAS,KAAK,oBAAoB,EAClCA,EAAS,KAAK,yBAAyB,EACvCA,EAAS,KAAK,qBAAqB,EACnCA,EAAS,KAAK,EAAE,EAETA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,yBAAyBX,EAAiC,CAChE,MAAMW,EAAqB,CAAA,EAE3BA,EAAS,KAAK/C,EAAkB,cAAc,oBAAqB,CAAC,CAAC,EACrE+C,EAAS,KAAK,EAAE,EAGhB,MAAMU,EAAwD,CAAA,EAC9D,UAAWjB,KAAUJ,EAAO,SAC1B,GAAII,EAAO,iBACT,UAAWwD,KAAQxD,EAAO,iBACxBiB,EAAS,KAAK,CACZ,GAAGuC,EACH,OAAQxD,EAAO,OAAO,WAAA,CACvB,EAKP,GAAIiB,EAAS,SAAW,EACtB,OAAAV,EAAS,KAAK,gCAAgC,EACvCA,EAAS,KAAK;AAAA,CAAI,EAI3B,MAAMgG,MAAiB,IACvB,UAAW/C,KAAQvC,EACZsF,EAAW,IAAI/C,EAAK,QAAQ,GAC/B+C,EAAW,IAAI/C,EAAK,SAAU,CAAA,CAAE,EAElC+C,EAAW,IAAI/C,EAAK,QAAQ,EAAG,KAAKA,CAAI,EAI1C,UAAWgD,IAAY,CAAC,WAAY,OAAQ,SAAU,KAAK,EAAG,CAC5D,MAAMC,EAAQF,EAAW,IAAIC,CAAQ,GAAK,CAAA,EAC1C,GAAIC,EAAM,SAAW,EAAG,SAExBlG,EAAS,KAAK/C,EAAkB,cAAc,GAAGgJ,CAAQ,UAAUC,EAAM,MAAM,IAAK,CAAC,CAAC,EACtFlG,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,SAAU,OAAQ,OAAQ,SAAU,gBAAgB,EAC/DC,EAAO+I,EAAM,IAAIjD,GAAQ,CAC7BA,EAAK,OACLA,EAAK,KAAK,KACVA,EAAK,KAAK,KACVA,EAAK,OACLA,EAAK,cAAA,CACN,EAEDjD,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAEA,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,iCAAiCX,EAAiC,CDtoD5E,IAAA2C,ECuoDI,MAAMhC,EAAqB,CAAA,EAK3B,GAHAA,EAAS,KAAK/C,EAAkB,cAAc,4BAA6B,CAAC,CAAC,EAC7E+C,EAAS,KAAK,EAAE,EAEZX,EAAO,iBAAiB,SAAW,EACrC,OAAAW,EAAS,KAAK,kDAAkD,EACzDA,EAAS,KAAK;AAAA,CAAI,EAG3BA,EAAS,KAAK,2EAA2E,EACzFA,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,gCAAgCX,EAAO,iBAAiB,MAAM,EAAE,EAC9EW,EAAS,KAAK,EAAE,EAGhB,MAAMmG,MAAmB,IACzB,UAAWC,KAAY/G,EAAO,iBAAkB,CAC9C,MAAMgH,IAAarE,EAAAoE,EAAS,0BAAT,YAAApE,EAAkC,aAAc,UAC9DmE,EAAa,IAAIE,CAAU,GAC9BF,EAAa,IAAIE,EAAY,EAAE,EAEjCF,EAAa,IAAIE,CAAU,EAAG,KAAKD,CAAQ,CAC7C,CAGA,UAAWC,IAAc,CAAC,WAAY,OAAQ,SAAU,KAAK,EAAG,CAC9D,MAAMvE,EAAYqE,EAAa,IAAIE,CAAU,GAAK,CAAA,EAClD,GAAIvE,EAAU,SAAW,EAAG,SAE5B9B,EAAS,KAAK/C,EAAkB,cAAc,GAAGoJ,CAAU,gBAAgBvE,EAAU,MAAM,IAAK,CAAC,CAAC,EAClG9B,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,WAAY,SAAU,OAAQ,SAAU,UAAU,EAC7DC,EAAO2E,EAAU,IAAIC,GAAA,CDzqDjC,IAAAC,EAAAuB,ECyqDuC,OAC/BxB,EAAG,KACHA,EAAG,mBAAqBA,EAAG,OAC3BA,EAAG,WACHC,EAAAD,EAAG,0BAAH,YAAAC,EAA4B,SAAU,YACtCuB,EAAAxB,EAAG,0BAAH,YAAAwB,EAA4B,SAAS,UAAU,EAAG,KAAM,OAAS,SAAA,EAClE,EAEDvD,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,CAClB,CAGA,OAAAA,EAAS,KAAK/C,EAAkB,cAAc,6BAA8B,CAAC,CAAC,EAC9E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK/C,EAAkB,WAAW,CACzC,0DACA,iEACA,2DACA,iEACA,2DACA,6CAAA,CACD,CAAC,EACF+C,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK,gBAAgB,EAC9BA,EAAS,KAAK,KAAO/C,EAAkB,WAAW,4BAA6B,2EAA2E,CAAC,EAC3J+C,EAAS,KAAK,EAAE,EAETA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,cAAcV,EAAsC,CAC1D,MAAMgH,EAAiB,CACrB,KAAM,YACN,KAAM,YACN,KAAM,YACN,SAAU,CAAA,CAAC,EAGb,UAAWC,KAAYjH,EAAM,OAC3B,KAAK,cAAcgH,EAAMC,EAAUjH,EAAM,IAAIiH,CAAQ,CAAE,EAGzD,OAAOD,CACT,CAKQ,cAAcA,EAAgBE,EAAc1G,EAAuB,CACzE,MAAM2G,EAAQD,EAAK,MAAM,GAAG,EAC5B,IAAIE,EAAUJ,EAEd,QAAS3I,EAAI,EAAGA,EAAI8I,EAAM,OAAQ9I,IAAK,CACrC,MAAMgJ,EAAOF,EAAM9I,CAAC,EACdgB,EAAShB,IAAM8I,EAAM,OAAS,EAE/BC,EAAQ,WACXA,EAAQ,SAAW,CAAA,GAGrB,IAAIE,EAAWF,EAAQ,SAAS,KAAKG,GAAKA,EAAE,OAASF,CAAI,EAEpDC,IACHA,EAAW,CACT,KAAMD,EACN,KAAMhI,EAAS,OAAS,YACxB,KAAM,aAAa8H,EAAM,MAAM,EAAG9I,EAAI,CAAC,EAAE,KAAK,GAAG,CAAC,GAClD,SAAUgB,EAAS,OAAY,CAAA,CAAC,EAG9BA,IACFiI,EAAS,KAAO,IAAI,YAAA,EAAc,OAAO9G,CAAO,EAAE,QAGpD4G,EAAQ,SAAS,KAAKE,CAAQ,GAGhCF,EAAUE,CACZ,CACF,CAOQ,cAAcnH,EAAyBJ,EAAkC,CAgB/E,OAdII,EAAO,QAAQ,OAAS,GAGxBA,EAAO,MAAM,OAAS,GAGtBA,EAAO,cAAc,OAAS,GAGfA,EAAO,MAAM,QAAQ4E,GAAQA,EAAK,aAAa,EACnD,OAAS,IAGChF,EAAO,yBAAyB,IAAII,EAAO,OAAO,WAAW,GAAK,CAAA,GACtE,OAAS,CAGhC,CAMQ,qBAAqBA,EAAyBJ,EAAkC,CAiBtF,MAfI,GAAAI,EAAO,QAAQ,OAAS,GAGDA,EAAO,cAAc,KAAKiF,GAAMA,EAAG,YAAc,QAAQ,IAI3DrF,EAAO,yBAAyB,IAAII,EAAO,OAAO,WAAW,GAAK,CAAA,GACjD,KAAKsC,GAAMA,EAAG,OAAS,CAAC,GAIxCtC,EAAO,MAAM,KAAKkC,GAC1CA,EAAK,WAAW,cAAgB,WAAA,EAKpC,CAKQ,cAAcmF,EAA2BzH,EAAgD,CAE/F,OADaA,EAAO,6BAA6B,IAAIyH,CAAiB,GAAK,CAAA,CAE7E,CAKQ,sBAAsBT,EAA+C,CAM3E,MALe,CACb,IAAKpJ,EAAkB,YAAY,MAAO,SAAS,EACnD,OAAQA,EAAkB,YAAY,SAAU,SAAS,EACzD,KAAMA,EAAkB,YAAY,OAAQ,OAAO,CAAA,EAEvCoJ,CAAU,CAC1B,CAKQ,qBAAqBjB,EAAiD,CAM5E,MALe,CACb,OAAQnI,EAAkB,YAAY,SAAU,SAAS,EACzD,MAAOA,EAAkB,YAAY,QAAS,SAAS,EACvD,UAAWA,EAAkB,YAAY,YAAa,OAAO,CAAA,EAEjDmI,CAAK,CACrB,CAKQ,WAAW2B,EAA4B,CAE7C,OADa,IAAI,KAAKA,CAAU,EACpB,mBAAmB,QAAS,CACtC,KAAM,UACN,MAAO,QACP,IAAK,SAAA,CACN,CACH,CAKQ,eAAeC,EAAuB,CAC5C,GAAIA,IAAU,EAAG,MAAO,MACxB,MAAMC,EAAI,KACJC,EAAQ,CAAC,IAAK,KAAM,KAAM,IAAI,EAC9BvJ,EAAI,KAAK,MAAM,KAAK,IAAIqJ,CAAK,EAAI,KAAK,IAAIC,CAAC,CAAC,EAClD,OAAO,KAAK,MAAOD,EAAQ,KAAK,IAAIC,EAAGtJ,CAAC,EAAK,GAAG,EAAI,IAAM,IAAMuJ,EAAMvJ,CAAC,CACzE,CAKQ,uBAAuByI,EAAmC,CAChE,MAAMe,EAAqB,CAAA,EAC3B,OAAIf,EAAS,iBAAiBe,EAAS,KAAK,QAAQ,EAChDf,EAAS,iBAAiBe,EAAS,KAAK,QAAQ,EAChDf,EAAS,iBAAiBe,EAAS,KAAK,QAAQ,EAChDf,EAAS,UAAUe,EAAS,KAAK,QAAQ,EACtCA,EAAS,KAAK,IAAI,GAAK,MAChC,CAKQ,iBAAiBC,EAA8B,CAGrD,MAAO,EACT,CAKQ,kBAAkBA,EAAqB5C,EAAkC,CAE/E,MAAO,SACT,CAKQ,uBAAuBpD,EAA+D,CAC5F,MAAMJ,MAAc,IAEpB,UAAWK,KAAUD,EAAS,CACvBJ,EAAQ,IAAIK,EAAO,YAAY,GAClCL,EAAQ,IAAIK,EAAO,aAAc,IAAI,GAAK,EAG5C,MAAMH,EAAWF,EAAQ,IAAIK,EAAO,YAAY,EAC3CH,EAAS,IAAIG,EAAO,MAAM,GAC7BH,EAAS,IAAIG,EAAO,OAAQ,CAAA,CAAE,EAGhCH,EAAS,IAAIG,EAAO,MAAM,EAAG,KAAKA,CAAM,CAC1C,CAEA,OAAOL,CACT,CAKQ,mBAAmBU,EAAoC,CAC7D,MAAMV,MAAc,IAEpB,UAAWW,KAAQD,EAAO,CACxB,MAAMjC,EAASkC,EAAK,QAAU,mBACzBX,EAAQ,IAAIvB,CAAM,GACrBuB,EAAQ,IAAIvB,EAAQ,EAAE,EAExBuB,EAAQ,IAAIvB,CAAM,EAAG,KAAKkC,CAAI,CAChC,CAEA,OAAOX,CACT,CAKQ,2BAA2BY,EAAoD,CACrF,MAAMZ,MAAc,IAEpB,UAAWa,KAAQD,EACZZ,EAAQ,IAAIa,EAAK,MAAM,GAC1Bb,EAAQ,IAAIa,EAAK,OAAQ,CAAA,CAAE,EAE7Bb,EAAQ,IAAIa,EAAK,MAAM,EAAG,KAAKA,CAAI,EAGrC,OAAOb,CACT,CAKQ,8BAA8Bc,EAA8D,CAClG,MAAMd,MAAc,IAEpB,UAAWoF,KAAYtE,EAChBd,EAAQ,IAAIoF,EAAS,MAAM,GAC9BpF,EAAQ,IAAIoF,EAAS,OAAQ,CAAA,CAAE,EAEjCpF,EAAQ,IAAIoF,EAAS,MAAM,EAAG,KAAKA,CAAQ,EAG7C,OAAOpF,CACT,CAKQ,wBAAwBkB,EAAsD,CACpF,MAAMlB,MAAc,IAEpB,UAAWqG,KAAYnF,EAChBlB,EAAQ,IAAIqG,EAAS,QAAQ,GAChCrG,EAAQ,IAAIqG,EAAS,SAAU,CAAA,CAAE,EAEnCrG,EAAQ,IAAIqG,EAAS,QAAQ,EAAG,KAAKA,CAAQ,EAG/C,OAAOrG,CACT,CAKQ,yBAAyByB,EAA6C,CAC5E,MAAMzB,MAAc,IAEpB,UAAW0B,KAAOD,EACXzB,EAAQ,IAAI0B,EAAI,WAAW,GAC9B1B,EAAQ,IAAI0B,EAAI,YAAa,CAAA,CAAE,EAEjC1B,EAAQ,IAAI0B,EAAI,WAAW,EAAG,KAAKA,CAAG,EAGxC,OAAO1B,CACT,CAKQ,kBAAkBrB,EAAiE,CACzF,MAAMqB,MAAc,IAEpB,UAAW8B,KAAOnD,EAAM,CACtB,MAAMF,EAASqD,EAAI,0BAA4BA,EAAI,cAC9C9B,EAAQ,IAAIvB,CAAM,GACrBuB,EAAQ,IAAIvB,EAAQ,EAAE,EAExBuB,EAAQ,IAAIvB,CAAM,EAAG,KAAKqD,CAAG,CAC/B,CAEA,OAAO9B,CACT,CAKQ,yBAAyBvB,EAAyB+E,EAUxD,CD5gEJ,IAAAxC,EC6gEI,MAAMsF,EAAY,CAChB,aAAYtF,EAAAvC,EAAO,OAAO,aAAd,YAAAuC,EAA0B,SAAU,EAChD,QAASvC,EAAO,QAAQ,OACxB,MAAOA,EAAO,MAAM,OACpB,cAAeA,EAAO,cAAc,OACpC,MAAOA,EAAO,MAAM,MAAA,EAGhB8H,EACJD,EAAU,WAAa,EACvBA,EAAU,QAAU,EACpBA,EAAU,MAAQ,EAClBA,EAAU,cAAgB,EAC1BA,EAAU,MAAQ,EAEpB,IAAIhJ,EACJ,OAAIiJ,GAAS,GACXjJ,EAAQ,MACCiJ,GAAS,IAClBjJ,EAAQ,SAERA,EAAQ,OAGH,CAAE,MAAAiJ,EAAO,MAAAjJ,EAAO,UAAAgJ,CAAA,CACzB,CAKQ,yBAAyBjI,EAAiC,CAChE,MAAMW,EAAqB,CAAA,EAQ3B,GANAA,EAAS,KAAK/C,EAAkB,cAAc,oBAAqB,CAAC,CAAC,EACrE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,mGAAmG,EACjHA,EAAS,KAAK,EAAE,EAGZX,EAAO,eAAiBA,EAAO,cAAc,OAAS,EAAG,CAC3DW,EAAS,KAAK/C,EAAkB,cAAc,iBAAkB,CAAC,CAAC,EAClE+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,WAAWX,EAAO,cAAc,MAAM,kDAAkD,EACtGW,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,6BAA8B,CAAC,CAAC,EAC9E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,+EAA+E,EAC7FA,EAAS,KAAK,EAAE,EAGhB,MAAMwH,EAAyG,CAC7G,qBACA,uBACA,gBACA,qBACA,YACA,QACA,gBACA,8BACA,4BACA,qBACA,UAAA,EAGItK,EAAU,CAAC,YAAa,gBAAiB,GAAGsK,EAAsB,IAAIP,GAAK,KAAK,4BAA4BA,CAAC,CAAC,CAAC,EAC/G9J,EAAmB,CAAA,EAEzB,UAAWoC,KAAQF,EAAO,cAAe,CACvC,MAAMxB,EAAM,CACV,IAAI0B,EAAK,IAAI,WAAWA,EAAK,KAAK,QAAQ,gBAAiB,GAAG,EAAE,YAAA,CAAa,OAC7EA,EAAK,kBAAoB,SAAA,EAG3B,UAAWyE,KAAOwD,EAChB3J,EAAI,KAAK0B,EAAK,mBAAmByE,CAAG,EAAI,IAAM,EAAE,EAGlD7G,EAAK,KAAKU,CAAG,CACf,CAEAmC,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,eAAgB,CAAC,CAAC,EAChE+C,EAAS,KAAK,EAAE,EAEhB,MAAMyH,EAAiB,CAAC,YAAa,gBAAiB,WAAY,eAAgB,SAAS,EACrFC,EAA0B,CAAA,EAEhC,UAAWnI,KAAQF,EAAO,cACxBqI,EAAY,KAAK,CACf,IAAInI,EAAK,IAAI,WAAWA,EAAK,KAAK,QAAQ,gBAAiB,GAAG,EAAE,YAAA,CAAa,OAC7EA,EAAK,kBAAoB,UACzBA,EAAK,cAAc,SAAA,EACnBA,EAAK,yBAA2B,MAAQ,KACxCA,EAAK,UAAY,MAAQ,IAAA,CAC1B,EAGHS,EAAS,KAAK/C,EAAkB,YAAYwK,EAAgBC,CAAW,CAAC,EACxE1H,EAAS,KAAK,EAAE,CAClB,CAGA,OAAIX,EAAO,uBAAyBA,EAAO,sBAAsB,OAAS,IACxEW,EAAS,KAAK/C,EAAkB,cAAc,0BAA2B,CAAC,CAAC,EAC3E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,WAAWX,EAAO,sBAAsB,MAAM,2DAA2D,EACvHW,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,oEAAoE,EAClFA,EAAS,KAAK,EAAE,GAGXA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,2BAA2BT,EAAkF,CACnH,MAAMS,EAAqB,CAAA,EAE3BA,EAAS,KAAK/C,EAAkB,cAAc,kBAAkBsC,EAAK,IAAI,GAAI,CAAC,CAAC,EAC/ES,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,UAAW,CAAC,CAAC,EAC3D+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,wBAAwBT,EAAK,kBAAoB,SAAS,EAAE,EAC1ES,EAAS,KAAK,qBAAqBT,EAAK,UAAY,MAAQ,IAAI,EAAE,EAClES,EAAS,KAAK,0BAA0BT,EAAK,eAAiB,MAAQ,IAAI,EAAE,EAC5ES,EAAS,KAAK,sCAAsCT,EAAK,yBAA2B,MAAQ,IAAI,EAAE,EAClGS,EAAS,KAAK,0CAA0CT,EAAK,aAAa,EAAE,EACxEA,EAAK,aACPS,EAAS,KAAK,sBAAsBT,EAAK,WAAW,EAAE,EAExDS,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,sBAAuB,CAAC,CAAC,EACvE+C,EAAS,KAAK,EAAE,EAChB,MAAM2H,EAA2B,OAAO,QAAQpI,EAAK,kBAAkB,EACpE,OAAO,CAAC,CAAC7B,EAAGkK,CAAK,IAAMA,CAAK,EAC5B,IAAI,CAAC,CAAC5D,CAAG,IAAM,KAAK,4BAA4BA,CAA+E,CAAC,EAEnI,GAAI2D,EAAyB,OAAS,EACpC,UAAWE,KAAQF,EACjB3H,EAAS,KAAK,OAAO6H,CAAI,EAAE,OAG7B7H,EAAS,KAAK,kCAAkC,EAQlD,GANAA,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK/C,EAAkB,cAAc,qBAAsB,CAAC,CAAC,EACtE+C,EAAS,KAAK,EAAE,EAEZT,EAAK,kBAAkB,OAAS,EAAG,CACrCS,EAAS,KAAK,kCAAkCT,EAAK,kBAAkB,MAAM,WAAWA,EAAK,kBAAkB,SAAW,EAAI,IAAM,KAAK,GAAG,EAC5IS,EAAS,KAAK,EAAE,EAEhB,MAAM9C,EAAU,CAAC,SAAc,SAAU,OAAQ,QAAS,SAAU,SAAU,WAAY,SAAU,OAAQ,EACtGC,EAAmB,CAAA,EAEzB,UAAW2K,KAAcvI,EAAK,kBAAmB,CAE/C,GAAIuI,EAAW,WAAW,SAAW,EACnC,SAGF,MAAMjK,EAAM,CAACiK,EAAW,iBAAiB,EACnCC,EAAU,IAAI,IAAID,EAAW,WAAW,IAAIvG,GAAK,CAACA,EAAE,KAAMA,CAAC,CAAC,CAAC,EAEnE,UAAWzD,IAAQ,CAAC,SAAU,OAAQ,QAAS,SAAU,SAAU,WAAY,SAAU,OAAO,EAAG,CACjG,MAAMkK,EAAOD,EAAQ,IAAIjK,CAAW,EACpCD,EAAI,KAAKmK,EAAOA,EAAK,MAAQ,EAAE,CACjC,CAEA7K,EAAK,KAAKU,CAAG,CACf,CAEAmC,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAGhBA,EAAS,KAAK,6BAA6B,EAC3CA,EAAS,KAAK,6CAA6C,EAC3DA,EAAS,KAAK,mCAAmC,EACjDA,EAAS,KAAK,8CAA8C,EAC5DA,EAAS,KAAK,iDAAiD,EAC/DA,EAAS,KAAK,EAAE,CAClB,MACEA,EAAS,KAAK,iCAAiC,EAC/CA,EAAS,KAAK,EAAE,EAGlB,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,8BAA8BX,EAAiC,CACrE,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,0BAA2B,CAAC,CAAC,EAC3E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,0FAA0F,EACxGA,EAAS,KAAK,EAAE,EAEZX,EAAO,uBAAyBA,EAAO,sBAAsB,OAAS,EAAG,CAC3E,MAAMnC,EAAU,CAAC,eAAgB,aAAa,EACxCC,EAAmB,CAAA,EAEzB,UAAW8K,KAAW5I,EAAO,sBAC3BlC,EAAK,KAAK,CACR8K,EAAQ,KACRA,EAAQ,aAAe,kBAAA,CACxB,EAGHjI,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK,wGAAyG,EACvHA,EAAS,KAAK,EAAE,CAClB,MACEA,EAAS,KAAK,oCAAoC,EAClDA,EAAS,KAAK,EAAE,EAGlB,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,8BAA8BX,EAAiC,CACrE,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,0BAA2B,CAAC,CAAC,EAC3E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,uHAAuH,EACrIA,EAAS,KAAK,EAAE,EAEZX,EAAO,uBAAyBA,EAAO,sBAAsB,OAAS,EAAG,CAC3E,MAAMnC,EAAU,CAAC,SAAU,YAAa,eAAgB,SAAS,EAC3DC,EAAmB,CAAA,EAEzB,UAAW0E,KAAQxC,EAAO,sBAAuB,CAC/C,MAAM6I,EAAcrG,EAAK,cAAgB,EAAI,OAASA,EAAK,cAAgB,EAAI,UAAYA,EAAK,cAAgB,EAAI,QAAU,SAC9H1E,EAAK,KAAK,CACR0E,EAAK,kBACLA,EAAK,qBACLqG,EACArG,EAAK,UAAY,MAAQ,IAAA,CAC1B,CACH,CAEA7B,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK,oBAAoB,EAClCA,EAAS,KAAK,oCAAoC,EAClDA,EAAS,KAAK,2CAA2C,EACzDA,EAAS,KAAK,sDAAsD,EACpEA,EAAS,KAAK,gDAAgD,EAC9DA,EAAS,KAAK,EAAE,CAClB,MACEA,EAAS,KAAK,oCAAoC,EAClDA,EAAS,KAAK,EAAE,EAGlB,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,+BAA+BX,EAAiC,CACtE,MAAMW,EAAqB,CAAA,EAO3B,GALAA,EAAS,KAAK/C,EAAkB,cAAc,2BAA4B,CAAC,CAAC,EAC5E+C,EAAS,KAAK,EAAE,EAChBA,EAAS,KAAK,kGAAkG,EAChHA,EAAS,KAAK,EAAE,EAEZX,EAAO,wBAA0BA,EAAO,uBAAuB,OAAS,EAAG,CAC7E,MAAMnC,EAAU,CAAC,eAAgB,cAAe,SAAS,EACnDC,EAAmB,CAAA,EAEzB,UAAW8K,KAAW5I,EAAO,uBAC3BlC,EAAK,KAAK,CACR8K,EAAQ,KACRA,EAAQ,aAAe,mBACvBA,EAAQ,UAAY,MAAQ,IAAA,CAC7B,EAGHjI,EAAS,KAAK/C,EAAkB,YAAYC,EAASC,CAAI,CAAC,EAC1D6C,EAAS,KAAK,EAAE,EAEhBA,EAAS,KAAK,iGAAiG,EAC/GA,EAAS,KAAK,EAAE,CAClB,MACEA,EAAS,KAAK,qCAAqC,EACnDA,EAAS,KAAK,EAAE,EAGlB,OAAOA,EAAS,KAAK;AAAA,CAAI,CAC3B,CAKQ,4BAA4BgE,EAAqB,CAEvD,OAAOA,EACJ,QAAQ,WAAY,KAAK,EACzB,QAAQ,KAAMmE,GAAOA,EAAI,YAAA,CAAa,EACtC,KAAA,CACL,CACF"}
@@ -0,0 +1,3 @@
1
+ import{J as u}from"./index-C0N3Q-wf.js";class c{async packageBlueprint(o,s,i){const e=new u,t=new Date;if(o){const r=e.folder("markdown");if(r)for(const[p,n]of o.files.entries())r.file(p,n)}s&&e.file("blueprint.json",s),i&&e.file("blueprint.html",i);const a=this.generateMetadata(t,o,s,i);return e.file("metadata.txt",a),await e.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:6}})}generateMetadata(o,s,i,e){const t=[];if(t.push("Power Platform Solution Blueprint - Export Metadata"),t.push("=".repeat(60)),t.push(""),t.push(`Generated: ${o.toISOString()}`),t.push("Tool Version: 1.0.0"),t.push(""),t.push("Exported Formats:"),t.push("-".repeat(60)),s&&t.push(`✓ Markdown (${s.totalFiles} files, ${this.formatBytes(s.totalSize)})`),i){const a=new TextEncoder().encode(i).length;t.push(`✓ JSON (${this.formatBytes(a)})`)}if(e){const a=new TextEncoder().encode(e).length;t.push(`✓ HTML (${this.formatBytes(a)})`)}return t.push(""),t.push("File Structure:"),t.push("-".repeat(60)),s&&(t.push("markdown/"),t.push(" ├── README.md"),t.push(" ├── summary/"),t.push(" ├── entities/"),t.push(" └── analysis/")),i&&t.push("blueprint.json"),e&&t.push("blueprint.html"),t.push("metadata.txt"),t.push(""),t.push("Usage:"),t.push("-".repeat(60)),t.push("- Extract ZIP to view all files"),t.push("- Markdown: Upload to Azure DevOps Wiki or GitHub"),t.push("- JSON: Use for baselines, automation, or programmatic analysis"),t.push("- HTML: Open blueprint.html in any modern web browser"),t.push(""),t.push("For more information, visit:"),t.push("https://github.com/anthropics/power-platform-solution-blueprint"),t.join(`
2
+ `)}formatBytes(o){if(o===0)return"0 Bytes";const s=1024,i=["Bytes","KB","MB","GB"],e=Math.floor(Math.log(o)/Math.log(s));return Math.round(o/Math.pow(s,e)*100)/100+" "+i[e]}}export{c as ZipPackager};
3
+ //# sourceMappingURL=ZipPackager-B4xx8LbF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZipPackager-B4xx8LbF.js","sources":["../../src/core/exporters/ZipPackager.ts"],"sourcesContent":["import JSZip from 'jszip';\nimport type { MarkdownExport } from '../types/blueprint.js';\n\n/**\n * Package all exports into downloadable ZIP file\n *\n * ZIP Structure:\n * system-blueprint-{timestamp}.zip\n * ├── markdown/\n * │ ├── README.md\n * │ ├── summary/\n * │ ├── entities/\n * │ └── analysis/\n * ├── blueprint.json\n * ├── blueprint.html\n * └── metadata.txt\n */\nexport class ZipPackager {\n /**\n * Package blueprint exports into ZIP blob\n * @param markdown Markdown export (optional)\n * @param json JSON export string (optional)\n * @param html HTML export string (optional)\n * @returns ZIP file as Blob\n */\n async packageBlueprint(\n markdown?: MarkdownExport,\n json?: string,\n html?: string\n ): Promise<Blob> {\n const zip = new JSZip();\n const timestamp = new Date();\n\n // Add markdown files if provided\n if (markdown) {\n const markdownFolder = zip.folder('markdown');\n if (markdownFolder) {\n for (const [filepath, content] of markdown.files.entries()) {\n markdownFolder.file(filepath, content);\n }\n }\n }\n\n // Add JSON if provided\n if (json) {\n zip.file('blueprint.json', json);\n }\n\n // Add HTML if provided\n if (html) {\n zip.file('blueprint.html', html);\n }\n\n // Add metadata file\n const metadata = this.generateMetadata(timestamp, markdown, json, html);\n zip.file('metadata.txt', metadata);\n\n // Generate ZIP blob with compression\n const blob = await zip.generateAsync({\n type: 'blob',\n compression: 'DEFLATE',\n compressionOptions: {\n level: 6, // Moderate compression (1-9, where 9 is maximum)\n },\n });\n\n return blob;\n }\n\n /**\n * Generate metadata.txt content\n */\n private generateMetadata(\n timestamp: Date,\n markdown?: MarkdownExport,\n json?: string,\n html?: string\n ): string {\n const lines: string[] = [];\n\n lines.push('Power Platform Solution Blueprint - Export Metadata');\n lines.push('='.repeat(60));\n lines.push('');\n lines.push(`Generated: ${timestamp.toISOString()}`);\n lines.push(`Tool Version: 1.0.0`);\n lines.push('');\n lines.push('Exported Formats:');\n lines.push('-'.repeat(60));\n\n if (markdown) {\n lines.push(`✓ Markdown (${markdown.totalFiles} files, ${this.formatBytes(markdown.totalSize)})`);\n }\n\n if (json) {\n const jsonSize = new TextEncoder().encode(json).length;\n lines.push(`✓ JSON (${this.formatBytes(jsonSize)})`);\n }\n\n if (html) {\n const htmlSize = new TextEncoder().encode(html).length;\n lines.push(`✓ HTML (${this.formatBytes(htmlSize)})`);\n }\n\n lines.push('');\n lines.push('File Structure:');\n lines.push('-'.repeat(60));\n\n if (markdown) {\n lines.push('markdown/');\n lines.push(' ├── README.md');\n lines.push(' ├── summary/');\n lines.push(' ├── entities/');\n lines.push(' └── analysis/');\n }\n\n if (json) {\n lines.push('blueprint.json');\n }\n\n if (html) {\n lines.push('blueprint.html');\n }\n\n lines.push('metadata.txt');\n lines.push('');\n lines.push('Usage:');\n lines.push('-'.repeat(60));\n lines.push('- Extract ZIP to view all files');\n lines.push('- Markdown: Upload to Azure DevOps Wiki or GitHub');\n lines.push('- JSON: Use for baselines, automation, or programmatic analysis');\n lines.push('- HTML: Open blueprint.html in any modern web browser');\n lines.push('');\n lines.push('For more information, visit:');\n lines.push('https://github.com/anthropics/power-platform-solution-blueprint');\n\n return lines.join('\\n');\n }\n\n /**\n * Format bytes to human-readable string\n */\n private formatBytes(bytes: number): string {\n if (bytes === 0) return '0 Bytes';\n\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];\n }\n}\n"],"names":["ZipPackager","markdown","json","html","zip","JSZip","timestamp","markdownFolder","filepath","content","metadata","lines","jsonSize","htmlSize","bytes","k","sizes","i"],"mappings":"wCAiBO,MAAMA,CAAY,CAQvB,MAAM,iBACJC,EACAC,EACAC,EACe,CACf,MAAMC,EAAM,IAAIC,EACVC,MAAgB,KAGtB,GAAIL,EAAU,CACZ,MAAMM,EAAiBH,EAAI,OAAO,UAAU,EAC5C,GAAIG,EACF,SAAW,CAACC,EAAUC,CAAO,IAAKR,EAAS,MAAM,UAC/CM,EAAe,KAAKC,EAAUC,CAAO,CAG3C,CAGIP,GACFE,EAAI,KAAK,iBAAkBF,CAAI,EAI7BC,GACFC,EAAI,KAAK,iBAAkBD,CAAI,EAIjC,MAAMO,EAAW,KAAK,iBAAiBJ,EAAWL,EAAUC,EAAMC,CAAI,EACtE,OAAAC,EAAI,KAAK,eAAgBM,CAAQ,EAGpB,MAAMN,EAAI,cAAc,CACnC,KAAM,OACN,YAAa,UACb,mBAAoB,CAClB,MAAO,CAAA,CACT,CACD,CAGH,CAKQ,iBACNE,EACAL,EACAC,EACAC,EACQ,CACR,MAAMQ,EAAkB,CAAA,EAexB,GAbAA,EAAM,KAAK,qDAAqD,EAChEA,EAAM,KAAK,IAAI,OAAO,EAAE,CAAC,EACzBA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,cAAcL,EAAU,YAAA,CAAa,EAAE,EAClDK,EAAM,KAAK,qBAAqB,EAChCA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,mBAAmB,EAC9BA,EAAM,KAAK,IAAI,OAAO,EAAE,CAAC,EAErBV,GACFU,EAAM,KAAK,eAAeV,EAAS,UAAU,WAAW,KAAK,YAAYA,EAAS,SAAS,CAAC,GAAG,EAG7FC,EAAM,CACR,MAAMU,EAAW,IAAI,YAAA,EAAc,OAAOV,CAAI,EAAE,OAChDS,EAAM,KAAK,WAAW,KAAK,YAAYC,CAAQ,CAAC,GAAG,CACrD,CAEA,GAAIT,EAAM,CACR,MAAMU,EAAW,IAAI,YAAA,EAAc,OAAOV,CAAI,EAAE,OAChDQ,EAAM,KAAK,WAAW,KAAK,YAAYE,CAAQ,CAAC,GAAG,CACrD,CAEA,OAAAF,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,iBAAiB,EAC5BA,EAAM,KAAK,IAAI,OAAO,EAAE,CAAC,EAErBV,IACFU,EAAM,KAAK,WAAW,EACtBA,EAAM,KAAK,iBAAiB,EAC5BA,EAAM,KAAK,gBAAgB,EAC3BA,EAAM,KAAK,iBAAiB,EAC5BA,EAAM,KAAK,iBAAiB,GAG1BT,GACFS,EAAM,KAAK,gBAAgB,EAGzBR,GACFQ,EAAM,KAAK,gBAAgB,EAG7BA,EAAM,KAAK,cAAc,EACzBA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,QAAQ,EACnBA,EAAM,KAAK,IAAI,OAAO,EAAE,CAAC,EACzBA,EAAM,KAAK,iCAAiC,EAC5CA,EAAM,KAAK,mDAAmD,EAC9DA,EAAM,KAAK,iEAAiE,EAC5EA,EAAM,KAAK,uDAAuD,EAClEA,EAAM,KAAK,EAAE,EACbA,EAAM,KAAK,8BAA8B,EACzCA,EAAM,KAAK,iEAAiE,EAErEA,EAAM,KAAK;AAAA,CAAI,CACxB,CAKQ,YAAYG,EAAuB,CACzC,GAAIA,IAAU,EAAG,MAAO,UAExB,MAAMC,EAAI,KACJC,EAAQ,CAAC,QAAS,KAAM,KAAM,IAAI,EAClCC,EAAI,KAAK,MAAM,KAAK,IAAIH,CAAK,EAAI,KAAK,IAAIC,CAAC,CAAC,EAElD,OAAO,KAAK,MAAMD,EAAQ,KAAK,IAAIC,EAAGE,CAAC,EAAI,GAAG,EAAI,IAAM,IAAMD,EAAMC,CAAC,CACvE,CACF"}
@@ -0,0 +1,2 @@
1
+ import{aX as L,bl as ln,aF as A,aV as P,aE as W,bm as gn,bn as dn,bo as hn,bp as z,bq as pn,br as An,bs as m,aY as N,b1 as U,b4 as T,bt as _n,a$ as on,bu as wn,bv as On,aG as V,bw as vn,bx as I}from"./index-C0N3Q-wf.js";var Pn="[object Symbol]";function x(n){return typeof n=="symbol"||L(n)&&ln(n)==Pn}function bn(n,r){for(var e=-1,i=n==null?0:n.length,f=Array(i);++e<i;)f[e]=r(n[e],e,n);return f}var B=P?P.prototype:void 0,K=B?B.toString:void 0;function k(n){if(typeof n=="string")return n;if(A(n))return bn(n,k)+"";if(x(n))return K?K.call(n):"";var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function yn(){}function En(n,r){for(var e=-1,i=n==null?0:n.length;++e<i&&r(n[e],e,n)!==!1;);return n}function cn(n,r,e,i){for(var f=n.length,t=e+-1;++t<f;)if(r(n[t],t,n))return t;return-1}function Tn(n){return n!==n}function Rn(n,r,e){for(var i=e-1,f=n.length;++i<f;)if(n[i]===r)return i;return-1}function In(n,r,e){return r===r?Rn(n,r,e):cn(n,Tn,e)}function Sn(n,r){var e=n==null?0:n.length;return!!e&&In(n,r,0)>-1}function M(n){return W(n)?gn(n):dn(n)}var Ln=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,xn=/^\w*$/;function $(n,r){if(A(n))return!1;var e=typeof n;return e=="number"||e=="symbol"||e=="boolean"||n==null||x(n)?!0:xn.test(n)||!Ln.test(n)||r!=null&&n in Object(r)}var Mn=500;function $n(n){var r=hn(n,function(i){return e.size===Mn&&e.clear(),i}),e=r.cache;return r}var Cn=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Fn=/\\(\\)?/g,Gn=$n(function(n){var r=[];return n.charCodeAt(0)===46&&r.push(""),n.replace(Cn,function(e,i,f,t){r.push(f?t.replace(Fn,"$1"):i||e)}),r});function Dn(n){return n==null?"":k(n)}function j(n,r){return A(n)?n:$(n,r)?[n]:Gn(Dn(n))}function R(n){if(typeof n=="string"||x(n))return n;var r=n+"";return r=="0"&&1/n==-1/0?"-0":r}function nn(n,r){r=j(r,n);for(var e=0,i=r.length;n!=null&&e<i;)n=n[R(r[e++])];return e&&e==i?n:void 0}function mn(n,r,e){var i=n==null?void 0:nn(n,r);return i===void 0?e:i}function rn(n,r){for(var e=-1,i=r.length,f=n.length;++e<i;)n[f+e]=r[e];return n}var H=P?P.isConcatSpreadable:void 0;function Nn(n){return A(n)||z(n)||!!(H&&n&&n[H])}function Hr(n,r,e,i,f){var t=-1,s=n.length;for(e||(e=Nn),f||(f=[]);++t<s;){var u=n[t];e(u)?rn(f,u):i||(f[f.length]=u)}return f}function Un(n,r,e,i){var f=-1,t=n==null?0:n.length;for(i&&t&&(e=n[++f]);++f<t;)e=r(e,n[f],f,n);return e}function en(n,r){for(var e=-1,i=n==null?0:n.length,f=0,t=[];++e<i;){var s=n[e];r(s,e,n)&&(t[f++]=s)}return t}function Bn(){return[]}var Kn=Object.prototype,Hn=Kn.propertyIsEnumerable,q=Object.getOwnPropertySymbols,qn=q?function(n){return n==null?[]:(n=Object(n),en(q(n),function(r){return Hn.call(n,r)}))}:Bn;function Yn(n,r,e){var i=r(n);return A(n)?i:rn(i,e(n))}function Y(n){return Yn(n,M,qn)}var Zn="__lodash_hash_undefined__";function Xn(n){return this.__data__.set(n,Zn),this}function Jn(n){return this.__data__.has(n)}function b(n){var r=-1,e=n==null?0:n.length;for(this.__data__=new pn;++r<e;)this.add(n[r])}b.prototype.add=b.prototype.push=Xn;b.prototype.has=Jn;function Qn(n,r){for(var e=-1,i=n==null?0:n.length;++e<i;)if(r(n[e],e,n))return!0;return!1}function tn(n,r){return n.has(r)}var Wn=1,zn=2;function fn(n,r,e,i,f,t){var s=e&Wn,u=n.length,a=r.length;if(u!=a&&!(s&&a>u))return!1;var h=t.get(n),g=t.get(r);if(h&&g)return h==r&&g==n;var l=-1,d=!0,o=e&zn?new b:void 0;for(t.set(n,r),t.set(r,n);++l<u;){var p=n[l],_=r[l];if(i)var w=s?i(_,p,l,r,n,t):i(p,_,l,n,r,t);if(w!==void 0){if(w)continue;d=!1;break}if(o){if(!Qn(r,function(O,v){if(!tn(o,v)&&(p===O||f(p,O,e,i,t)))return o.push(v)})){d=!1;break}}else if(!(p===_||f(p,_,e,i,t))){d=!1;break}}return t.delete(n),t.delete(r),d}function Vn(n){var r=-1,e=Array(n.size);return n.forEach(function(i,f){e[++r]=[f,i]}),e}function C(n){var r=-1,e=Array(n.size);return n.forEach(function(i){e[++r]=i}),e}var kn=1,jn=2,nr="[object Boolean]",rr="[object Date]",er="[object Error]",ir="[object Map]",tr="[object Number]",fr="[object RegExp]",sr="[object Set]",ur="[object String]",ar="[object Symbol]",lr="[object ArrayBuffer]",gr="[object DataView]",Z=P?P.prototype:void 0,S=Z?Z.valueOf:void 0;function dr(n,r,e,i,f,t,s){switch(e){case gr:if(n.byteLength!=r.byteLength||n.byteOffset!=r.byteOffset)return!1;n=n.buffer,r=r.buffer;case lr:return!(n.byteLength!=r.byteLength||!t(new m(n),new m(r)));case nr:case rr:case tr:return An(+n,+r);case er:return n.name==r.name&&n.message==r.message;case fr:case ur:return n==r+"";case ir:var u=Vn;case sr:var a=i&kn;if(u||(u=C),n.size!=r.size&&!a)return!1;var h=s.get(n);if(h)return h==r;i|=jn,s.set(n,r);var g=fn(u(n),u(r),i,f,t,s);return s.delete(n),g;case ar:if(S)return S.call(n)==S.call(r)}return!1}var hr=1,pr=Object.prototype,Ar=pr.hasOwnProperty;function _r(n,r,e,i,f,t){var s=e&hr,u=Y(n),a=u.length,h=Y(r),g=h.length;if(a!=g&&!s)return!1;for(var l=a;l--;){var d=u[l];if(!(s?d in r:Ar.call(r,d)))return!1}var o=t.get(n),p=t.get(r);if(o&&p)return o==r&&p==n;var _=!0;t.set(n,r),t.set(r,n);for(var w=s;++l<a;){d=u[l];var O=n[d],v=r[d];if(i)var D=s?i(v,O,d,r,n,t):i(O,v,d,n,r,t);if(!(D===void 0?O===v||f(O,v,e,i,t):D)){_=!1;break}w||(w=d=="constructor")}if(_&&!w){var y=n.constructor,E=r.constructor;y!=E&&"constructor"in n&&"constructor"in r&&!(typeof y=="function"&&y instanceof y&&typeof E=="function"&&E instanceof E)&&(_=!1)}return t.delete(n),t.delete(r),_}var or=1,X="[object Arguments]",J="[object Array]",c="[object Object]",wr=Object.prototype,Q=wr.hasOwnProperty;function Or(n,r,e,i,f,t){var s=A(n),u=A(r),a=s?J:N(n),h=u?J:N(r);a=a==X?c:a,h=h==X?c:h;var g=a==c,l=h==c,d=a==h;if(d&&U(n)){if(!U(r))return!1;s=!0,g=!1}if(d&&!g)return t||(t=new T),s||_n(n)?fn(n,r,e,i,f,t):dr(n,r,a,e,i,f,t);if(!(e&or)){var o=g&&Q.call(n,"__wrapped__"),p=l&&Q.call(r,"__wrapped__");if(o||p){var _=o?n.value():n,w=p?r.value():r;return t||(t=new T),f(_,w,e,i,t)}}return d?(t||(t=new T),_r(n,r,e,i,f,t)):!1}function F(n,r,e,i,f){return n===r?!0:n==null||r==null||!L(n)&&!L(r)?n!==n&&r!==r:Or(n,r,e,i,F,f)}var vr=1,Pr=2;function br(n,r,e,i){var f=e.length,t=f;if(n==null)return!t;for(n=Object(n);f--;){var s=e[f];if(s[2]?s[1]!==n[s[0]]:!(s[0]in n))return!1}for(;++f<t;){s=e[f];var u=s[0],a=n[u],h=s[1];if(s[2]){if(a===void 0&&!(u in n))return!1}else{var g=new T,l;if(!(l===void 0?F(h,a,vr|Pr,i,g):l))return!1}}return!0}function sn(n){return n===n&&!on(n)}function yr(n){for(var r=M(n),e=r.length;e--;){var i=r[e],f=n[i];r[e]=[i,f,sn(f)]}return r}function un(n,r){return function(e){return e==null?!1:e[n]===r&&(r!==void 0||n in Object(e))}}function Er(n){var r=yr(n);return r.length==1&&r[0][2]?un(r[0][0],r[0][1]):function(e){return e===n||br(e,n,r)}}function cr(n,r){return n!=null&&r in Object(n)}function Tr(n,r,e){r=j(r,n);for(var i=-1,f=r.length,t=!1;++i<f;){var s=R(r[i]);if(!(t=n!=null&&e(n,s)))break;n=n[s]}return t||++i!=f?t:(f=n==null?0:n.length,!!f&&wn(f)&&On(s,f)&&(A(n)||z(n)))}function Rr(n,r){return n!=null&&Tr(n,r,cr)}var Ir=1,Sr=2;function Lr(n,r){return $(n)&&sn(r)?un(R(n),r):function(e){var i=mn(e,n);return i===void 0&&i===r?Rr(e,n):F(r,i,Ir|Sr)}}function xr(n){return function(r){return r==null?void 0:r[n]}}function Mr(n){return function(r){return nn(r,n)}}function $r(n){return $(n)?xr(R(n)):Mr(n)}function an(n){return typeof n=="function"?n:n==null?V:typeof n=="object"?A(n)?Lr(n[0],n[1]):Er(n):$r(n)}function Cr(n,r){return n&&vn(n,r,M)}function Fr(n,r){return function(e,i){if(e==null)return e;if(!W(e))return n(e,i);for(var f=e.length,t=-1,s=Object(e);++t<f&&i(s[t],t,s)!==!1;);return e}}var G=Fr(Cr);function Gr(n){return typeof n=="function"?n:V}function qr(n,r){var e=A(n)?En:G;return e(n,Gr(r))}function Dr(n,r){var e=[];return G(n,function(i,f,t){r(i,f,t)&&e.push(i)}),e}function Yr(n,r){var e=A(n)?en:Dr;return e(n,an(r))}function mr(n,r,e,i,f){return f(n,function(t,s,u){e=i?(i=!1,t):r(e,t,s,u)}),e}function Zr(n,r,e){var i=A(n)?Un:mr,f=arguments.length<3;return i(n,an(r),e,f,G)}var Nr=1/0,Ur=I&&1/C(new I([,-0]))[1]==Nr?function(n){return new I(n)}:yn,Br=200;function Xr(n,r,e){var i=-1,f=Sn,t=n.length,s=!0,u=[],a=u;if(t>=Br){var h=r?null:Ur(n);if(h)return C(h);s=!1,f=tn,a=new b}else a=r?[]:u;n:for(;++i<t;){var g=n[i],l=r?r(g):g;if(g=g!==0?g:0,s&&l===l){for(var d=a.length;d--;)if(a[d]===l)continue n;r&&a.push(l),u.push(g)}else f(a,l,e)||(a!==u&&a.push(l),u.push(g))}return u}export{G as a,Hr as b,an as c,bn as d,rn as e,Yn as f,qn as g,En as h,x as i,Y as j,M as k,Xr as l,Yr as m,qr as n,cn as o,Gr as p,Cr as q,Zr as r,Bn as s,Tr as t,j as u,R as v,nn as w,Rr as x,Dn as y};
2
+ //# sourceMappingURL=_baseUniq-Nm59UrQz.js.map