euparliamentmonitor 0.8.4

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 (276) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +1005 -0
  3. package/SECURITY.md +151 -0
  4. package/package.json +131 -0
  5. package/scripts/constants/committee-indicator-map.d.ts +199 -0
  6. package/scripts/constants/committee-indicator-map.d.ts.map +1 -0
  7. package/scripts/constants/committee-indicator-map.js +1224 -0
  8. package/scripts/constants/committee-indicator-map.js.map +1 -0
  9. package/scripts/constants/config.d.ts +38 -0
  10. package/scripts/constants/config.d.ts.map +1 -0
  11. package/scripts/constants/config.js +66 -0
  12. package/scripts/constants/config.js.map +1 -0
  13. package/scripts/constants/language-articles.d.ts +84 -0
  14. package/scripts/constants/language-articles.d.ts.map +1 -0
  15. package/scripts/constants/language-articles.js +6771 -0
  16. package/scripts/constants/language-articles.js.map +1 -0
  17. package/scripts/constants/language-core.d.ts +38 -0
  18. package/scripts/constants/language-core.d.ts.map +1 -0
  19. package/scripts/constants/language-core.js +90 -0
  20. package/scripts/constants/language-core.js.map +1 -0
  21. package/scripts/constants/language-ui.d.ts +82 -0
  22. package/scripts/constants/language-ui.d.ts.map +1 -0
  23. package/scripts/constants/language-ui.js +889 -0
  24. package/scripts/constants/language-ui.js.map +1 -0
  25. package/scripts/constants/languages.d.ts +14 -0
  26. package/scripts/constants/languages.d.ts.map +1 -0
  27. package/scripts/constants/languages.js +15 -0
  28. package/scripts/constants/languages.js.map +1 -0
  29. package/scripts/generators/analysis-builders.d.ts +266 -0
  30. package/scripts/generators/analysis-builders.d.ts.map +1 -0
  31. package/scripts/generators/analysis-builders.js +2903 -0
  32. package/scripts/generators/analysis-builders.js.map +1 -0
  33. package/scripts/generators/breaking-content.d.ts +45 -0
  34. package/scripts/generators/breaking-content.d.ts.map +1 -0
  35. package/scripts/generators/breaking-content.js +530 -0
  36. package/scripts/generators/breaking-content.js.map +1 -0
  37. package/scripts/generators/committee-helpers.d.ts +54 -0
  38. package/scripts/generators/committee-helpers.d.ts.map +1 -0
  39. package/scripts/generators/committee-helpers.js +154 -0
  40. package/scripts/generators/committee-helpers.js.map +1 -0
  41. package/scripts/generators/dashboard-content.d.ts +95 -0
  42. package/scripts/generators/dashboard-content.d.ts.map +1 -0
  43. package/scripts/generators/dashboard-content.js +630 -0
  44. package/scripts/generators/dashboard-content.js.map +1 -0
  45. package/scripts/generators/deep-analysis-content.d.ts +23 -0
  46. package/scripts/generators/deep-analysis-content.d.ts.map +1 -0
  47. package/scripts/generators/deep-analysis-content.js +831 -0
  48. package/scripts/generators/deep-analysis-content.js.map +1 -0
  49. package/scripts/generators/mindmap-content.d.ts +55 -0
  50. package/scripts/generators/mindmap-content.d.ts.map +1 -0
  51. package/scripts/generators/mindmap-content.js +512 -0
  52. package/scripts/generators/mindmap-content.js.map +1 -0
  53. package/scripts/generators/motions-content.d.ts +50 -0
  54. package/scripts/generators/motions-content.d.ts.map +1 -0
  55. package/scripts/generators/motions-content.js +391 -0
  56. package/scripts/generators/motions-content.js.map +1 -0
  57. package/scripts/generators/news-enhanced.d.ts +14 -0
  58. package/scripts/generators/news-enhanced.d.ts.map +1 -0
  59. package/scripts/generators/news-enhanced.js +169 -0
  60. package/scripts/generators/news-enhanced.js.map +1 -0
  61. package/scripts/generators/news-indexes.d.ts +31 -0
  62. package/scripts/generators/news-indexes.d.ts.map +1 -0
  63. package/scripts/generators/news-indexes.js +410 -0
  64. package/scripts/generators/news-indexes.js.map +1 -0
  65. package/scripts/generators/pipeline/fetch-stage.d.ts +352 -0
  66. package/scripts/generators/pipeline/fetch-stage.d.ts.map +1 -0
  67. package/scripts/generators/pipeline/fetch-stage.js +1522 -0
  68. package/scripts/generators/pipeline/fetch-stage.js.map +1 -0
  69. package/scripts/generators/pipeline/generate-stage.d.ts +43 -0
  70. package/scripts/generators/pipeline/generate-stage.d.ts.map +1 -0
  71. package/scripts/generators/pipeline/generate-stage.js +204 -0
  72. package/scripts/generators/pipeline/generate-stage.js.map +1 -0
  73. package/scripts/generators/pipeline/output-stage.d.ts +48 -0
  74. package/scripts/generators/pipeline/output-stage.d.ts.map +1 -0
  75. package/scripts/generators/pipeline/output-stage.js +145 -0
  76. package/scripts/generators/pipeline/output-stage.js.map +1 -0
  77. package/scripts/generators/pipeline/transform-stage.d.ts +57 -0
  78. package/scripts/generators/pipeline/transform-stage.d.ts.map +1 -0
  79. package/scripts/generators/pipeline/transform-stage.js +111 -0
  80. package/scripts/generators/pipeline/transform-stage.js.map +1 -0
  81. package/scripts/generators/propositions-content.d.ts +29 -0
  82. package/scripts/generators/propositions-content.d.ts.map +1 -0
  83. package/scripts/generators/propositions-content.js +90 -0
  84. package/scripts/generators/propositions-content.js.map +1 -0
  85. package/scripts/generators/sankey-content.d.ts +45 -0
  86. package/scripts/generators/sankey-content.d.ts.map +1 -0
  87. package/scripts/generators/sankey-content.js +227 -0
  88. package/scripts/generators/sankey-content.js.map +1 -0
  89. package/scripts/generators/sitemap.d.ts +66 -0
  90. package/scripts/generators/sitemap.d.ts.map +1 -0
  91. package/scripts/generators/sitemap.js +562 -0
  92. package/scripts/generators/sitemap.js.map +1 -0
  93. package/scripts/generators/strategies/article-strategy.d.ts +146 -0
  94. package/scripts/generators/strategies/article-strategy.d.ts.map +1 -0
  95. package/scripts/generators/strategies/article-strategy.js +4 -0
  96. package/scripts/generators/strategies/article-strategy.js.map +1 -0
  97. package/scripts/generators/strategies/breaking-news-strategy.d.ts +64 -0
  98. package/scripts/generators/strategies/breaking-news-strategy.d.ts.map +1 -0
  99. package/scripts/generators/strategies/breaking-news-strategy.js +246 -0
  100. package/scripts/generators/strategies/breaking-news-strategy.js.map +1 -0
  101. package/scripts/generators/strategies/committee-reports-strategy.d.ts +93 -0
  102. package/scripts/generators/strategies/committee-reports-strategy.d.ts.map +1 -0
  103. package/scripts/generators/strategies/committee-reports-strategy.js +447 -0
  104. package/scripts/generators/strategies/committee-reports-strategy.js.map +1 -0
  105. package/scripts/generators/strategies/month-ahead-strategy.d.ts +60 -0
  106. package/scripts/generators/strategies/month-ahead-strategy.d.ts.map +1 -0
  107. package/scripts/generators/strategies/month-ahead-strategy.js +175 -0
  108. package/scripts/generators/strategies/month-ahead-strategy.js.map +1 -0
  109. package/scripts/generators/strategies/monthly-review-strategy.d.ts +66 -0
  110. package/scripts/generators/strategies/monthly-review-strategy.d.ts.map +1 -0
  111. package/scripts/generators/strategies/monthly-review-strategy.js +204 -0
  112. package/scripts/generators/strategies/monthly-review-strategy.js.map +1 -0
  113. package/scripts/generators/strategies/motions-strategy.d.ts +61 -0
  114. package/scripts/generators/strategies/motions-strategy.d.ts.map +1 -0
  115. package/scripts/generators/strategies/motions-strategy.js +215 -0
  116. package/scripts/generators/strategies/motions-strategy.js.map +1 -0
  117. package/scripts/generators/strategies/propositions-strategy.d.ts +60 -0
  118. package/scripts/generators/strategies/propositions-strategy.d.ts.map +1 -0
  119. package/scripts/generators/strategies/propositions-strategy.js +257 -0
  120. package/scripts/generators/strategies/propositions-strategy.js.map +1 -0
  121. package/scripts/generators/strategies/week-ahead-strategy.d.ts +57 -0
  122. package/scripts/generators/strategies/week-ahead-strategy.d.ts.map +1 -0
  123. package/scripts/generators/strategies/week-ahead-strategy.js +178 -0
  124. package/scripts/generators/strategies/week-ahead-strategy.js.map +1 -0
  125. package/scripts/generators/strategies/weekly-review-strategy.d.ts +63 -0
  126. package/scripts/generators/strategies/weekly-review-strategy.d.ts.map +1 -0
  127. package/scripts/generators/strategies/weekly-review-strategy.js +211 -0
  128. package/scripts/generators/strategies/weekly-review-strategy.js.map +1 -0
  129. package/scripts/generators/swot-content.d.ts +42 -0
  130. package/scripts/generators/swot-content.d.ts.map +1 -0
  131. package/scripts/generators/swot-content.js +366 -0
  132. package/scripts/generators/swot-content.js.map +1 -0
  133. package/scripts/generators/week-ahead-content.d.ts +103 -0
  134. package/scripts/generators/week-ahead-content.d.ts.map +1 -0
  135. package/scripts/generators/week-ahead-content.js +610 -0
  136. package/scripts/generators/week-ahead-content.js.map +1 -0
  137. package/scripts/index.d.ts +40 -0
  138. package/scripts/index.d.ts.map +1 -0
  139. package/scripts/index.js +53 -0
  140. package/scripts/index.js.map +1 -0
  141. package/scripts/mcp/ep-mcp-client.d.ts +471 -0
  142. package/scripts/mcp/ep-mcp-client.d.ts.map +1 -0
  143. package/scripts/mcp/ep-mcp-client.js +734 -0
  144. package/scripts/mcp/ep-mcp-client.js.map +1 -0
  145. package/scripts/mcp/mcp-connection.d.ts +264 -0
  146. package/scripts/mcp/mcp-connection.d.ts.map +1 -0
  147. package/scripts/mcp/mcp-connection.js +790 -0
  148. package/scripts/mcp/mcp-connection.js.map +1 -0
  149. package/scripts/mcp/mcp-health.d.ts +75 -0
  150. package/scripts/mcp/mcp-health.d.ts.map +1 -0
  151. package/scripts/mcp/mcp-health.js +78 -0
  152. package/scripts/mcp/mcp-health.js.map +1 -0
  153. package/scripts/mcp/mcp-retry.d.ts +94 -0
  154. package/scripts/mcp/mcp-retry.d.ts.map +1 -0
  155. package/scripts/mcp/mcp-retry.js +127 -0
  156. package/scripts/mcp/mcp-retry.js.map +1 -0
  157. package/scripts/mcp/wb-mcp-client.d.ts +38 -0
  158. package/scripts/mcp/wb-mcp-client.d.ts.map +1 -0
  159. package/scripts/mcp/wb-mcp-client.js +112 -0
  160. package/scripts/mcp/wb-mcp-client.js.map +1 -0
  161. package/scripts/templates/article-template.d.ts +9 -0
  162. package/scripts/templates/article-template.d.ts.map +1 -0
  163. package/scripts/templates/article-template.js +378 -0
  164. package/scripts/templates/article-template.js.map +1 -0
  165. package/scripts/templates/section-builders.d.ts +28 -0
  166. package/scripts/templates/section-builders.d.ts.map +1 -0
  167. package/scripts/templates/section-builders.js +142 -0
  168. package/scripts/templates/section-builders.js.map +1 -0
  169. package/scripts/types/analysis.d.ts +115 -0
  170. package/scripts/types/analysis.d.ts.map +1 -0
  171. package/scripts/types/analysis.js +4 -0
  172. package/scripts/types/analysis.js.map +1 -0
  173. package/scripts/types/common.d.ts +584 -0
  174. package/scripts/types/common.d.ts.map +1 -0
  175. package/scripts/types/common.js +96 -0
  176. package/scripts/types/common.js.map +1 -0
  177. package/scripts/types/generation.d.ts +104 -0
  178. package/scripts/types/generation.d.ts.map +1 -0
  179. package/scripts/types/generation.js +4 -0
  180. package/scripts/types/generation.js.map +1 -0
  181. package/scripts/types/index.d.ts +24 -0
  182. package/scripts/types/index.d.ts.map +1 -0
  183. package/scripts/types/index.js +16 -0
  184. package/scripts/types/index.js.map +1 -0
  185. package/scripts/types/intelligence.d.ts +129 -0
  186. package/scripts/types/intelligence.d.ts.map +1 -0
  187. package/scripts/types/intelligence.js +4 -0
  188. package/scripts/types/intelligence.js.map +1 -0
  189. package/scripts/types/mcp.d.ts +418 -0
  190. package/scripts/types/mcp.d.ts.map +1 -0
  191. package/scripts/types/mcp.js +4 -0
  192. package/scripts/types/mcp.js.map +1 -0
  193. package/scripts/types/parliament.d.ts +388 -0
  194. package/scripts/types/parliament.d.ts.map +1 -0
  195. package/scripts/types/parliament.js +4 -0
  196. package/scripts/types/parliament.js.map +1 -0
  197. package/scripts/types/quality.d.ts +114 -0
  198. package/scripts/types/quality.d.ts.map +1 -0
  199. package/scripts/types/quality.js +4 -0
  200. package/scripts/types/quality.js.map +1 -0
  201. package/scripts/types/stakeholder.d.ts +88 -0
  202. package/scripts/types/stakeholder.d.ts.map +1 -0
  203. package/scripts/types/stakeholder.js +16 -0
  204. package/scripts/types/stakeholder.js.map +1 -0
  205. package/scripts/types/visualization.d.ts +708 -0
  206. package/scripts/types/visualization.d.ts.map +1 -0
  207. package/scripts/types/visualization.js +4 -0
  208. package/scripts/types/visualization.js.map +1 -0
  209. package/scripts/types/world-bank.d.ts +85 -0
  210. package/scripts/types/world-bank.d.ts.map +1 -0
  211. package/scripts/types/world-bank.js +4 -0
  212. package/scripts/types/world-bank.js.map +1 -0
  213. package/scripts/utils/article-category.d.ts +18 -0
  214. package/scripts/utils/article-category.d.ts.map +1 -0
  215. package/scripts/utils/article-category.js +49 -0
  216. package/scripts/utils/article-category.js.map +1 -0
  217. package/scripts/utils/article-quality-scorer.d.ts +87 -0
  218. package/scripts/utils/article-quality-scorer.d.ts.map +1 -0
  219. package/scripts/utils/article-quality-scorer.js +1048 -0
  220. package/scripts/utils/article-quality-scorer.js.map +1 -0
  221. package/scripts/utils/content-metadata.d.ts +34 -0
  222. package/scripts/utils/content-metadata.d.ts.map +1 -0
  223. package/scripts/utils/content-metadata.js +249 -0
  224. package/scripts/utils/content-metadata.js.map +1 -0
  225. package/scripts/utils/content-validator.d.ts +94 -0
  226. package/scripts/utils/content-validator.d.ts.map +1 -0
  227. package/scripts/utils/content-validator.js +489 -0
  228. package/scripts/utils/content-validator.js.map +1 -0
  229. package/scripts/utils/copy-test-reports.d.ts +9 -0
  230. package/scripts/utils/copy-test-reports.d.ts.map +1 -0
  231. package/scripts/utils/copy-test-reports.js +508 -0
  232. package/scripts/utils/copy-test-reports.js.map +1 -0
  233. package/scripts/utils/file-utils.d.ts +144 -0
  234. package/scripts/utils/file-utils.d.ts.map +1 -0
  235. package/scripts/utils/file-utils.js +374 -0
  236. package/scripts/utils/file-utils.js.map +1 -0
  237. package/scripts/utils/fix-articles.d.ts +27 -0
  238. package/scripts/utils/fix-articles.d.ts.map +1 -0
  239. package/scripts/utils/fix-articles.js +510 -0
  240. package/scripts/utils/fix-articles.js.map +1 -0
  241. package/scripts/utils/generate-docs-index.d.ts +8 -0
  242. package/scripts/utils/generate-docs-index.d.ts.map +1 -0
  243. package/scripts/utils/generate-docs-index.js +275 -0
  244. package/scripts/utils/generate-docs-index.js.map +1 -0
  245. package/scripts/utils/html-sanitize.d.ts +18 -0
  246. package/scripts/utils/html-sanitize.d.ts.map +1 -0
  247. package/scripts/utils/html-sanitize.js +57 -0
  248. package/scripts/utils/html-sanitize.js.map +1 -0
  249. package/scripts/utils/intelligence-analysis.d.ts +173 -0
  250. package/scripts/utils/intelligence-analysis.d.ts.map +1 -0
  251. package/scripts/utils/intelligence-analysis.js +936 -0
  252. package/scripts/utils/intelligence-analysis.js.map +1 -0
  253. package/scripts/utils/intelligence-index.d.ts +126 -0
  254. package/scripts/utils/intelligence-index.d.ts.map +1 -0
  255. package/scripts/utils/intelligence-index.js +731 -0
  256. package/scripts/utils/intelligence-index.js.map +1 -0
  257. package/scripts/utils/metadata-utils.d.ts +14 -0
  258. package/scripts/utils/metadata-utils.d.ts.map +1 -0
  259. package/scripts/utils/metadata-utils.js +18 -0
  260. package/scripts/utils/metadata-utils.js.map +1 -0
  261. package/scripts/utils/news-metadata.d.ts +47 -0
  262. package/scripts/utils/news-metadata.d.ts.map +1 -0
  263. package/scripts/utils/news-metadata.js +259 -0
  264. package/scripts/utils/news-metadata.js.map +1 -0
  265. package/scripts/utils/validate-articles.d.ts +2 -0
  266. package/scripts/utils/validate-articles.d.ts.map +1 -0
  267. package/scripts/utils/validate-articles.js +284 -0
  268. package/scripts/utils/validate-articles.js.map +1 -0
  269. package/scripts/utils/validate-ep-api.d.ts +51 -0
  270. package/scripts/utils/validate-ep-api.d.ts.map +1 -0
  271. package/scripts/utils/validate-ep-api.js +160 -0
  272. package/scripts/utils/validate-ep-api.js.map +1 -0
  273. package/scripts/utils/world-bank-data.d.ts +84 -0
  274. package/scripts/utils/world-bank-data.d.ts.map +1 -0
  275. package/scripts/utils/world-bank-data.js +311 -0
  276. package/scripts/utils/world-bank-data.js.map +1 -0
@@ -0,0 +1,178 @@
1
+ // SPDX-FileCopyrightText: 2024-2026 Hack23 AB
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { ArticleCategory } from '../../types/index.js';
4
+ import { WEEK_AHEAD_TITLES, getLocalizedString } from '../../constants/languages.js';
5
+ import { fetchWeekAheadData, fetchEPFeedData } from '../pipeline/fetch-stage.js';
6
+ import { buildWeekAheadContent, buildKeywords, buildWhatToWatchSection, } from '../week-ahead-content.js';
7
+ import { buildDeepAnalysisSection } from '../deep-analysis-content.js';
8
+ import { buildProspectiveAnalysis, buildProspectiveSwot, buildProspectiveDashboard, buildProspectiveMindmap, } from '../analysis-builders.js';
9
+ import { buildSwotSection } from '../swot-content.js';
10
+ import { buildDashboardSection } from '../dashboard-content.js';
11
+ import { buildIntelligenceMindmapSection } from '../mindmap-content.js';
12
+ import { pl } from '../../utils/metadata-utils.js';
13
+ // ─── Date-range helper ────────────────────────────────────────────────────────
14
+ /**
15
+ * Compute the week-ahead date range starting the day after `baseDate`.
16
+ *
17
+ * @param baseDate - ISO 8601 publication date (YYYY-MM-DD)
18
+ * @returns Date range spanning the next 7 days
19
+ */
20
+ function computeWeekAheadDateRange(baseDate) {
21
+ const base = new Date(`${baseDate}T00:00:00Z`);
22
+ const startDate = new Date(base);
23
+ startDate.setUTCDate(base.getUTCDate() + 1);
24
+ const endDate = new Date(startDate);
25
+ endDate.setUTCDate(startDate.getUTCDate() + 7);
26
+ const startParts = startDate.toISOString().split('T');
27
+ const endParts = endDate.toISOString().split('T');
28
+ if (!startParts[0] || !endParts[0]) {
29
+ throw new Error('Invalid date format generated in computeWeekAheadDateRange');
30
+ }
31
+ return {
32
+ start: startParts[0],
33
+ end: endParts[0],
34
+ };
35
+ }
36
+ // ─── Content-aware metadata helpers ───────────────────────────────────────────
37
+ /**
38
+ * Build a content-aware title suffix from week-ahead data counts.
39
+ *
40
+ * @param weekData - Aggregated week-ahead domain data
41
+ * @returns Short suffix for the title, or empty string
42
+ */
43
+ function buildWeekAheadTitleSuffix(weekData) {
44
+ const parts = [];
45
+ if (weekData.events.length > 0)
46
+ parts.push(pl(weekData.events.length, 'Event', 'Events'));
47
+ if (weekData.committees.length > 0)
48
+ parts.push(pl(weekData.committees.length, 'Committee Meeting', 'Committee Meetings'));
49
+ if (weekData.pipeline.length > 0)
50
+ parts.push(pl(weekData.pipeline.length, 'Pipeline Item', 'Pipeline Items'));
51
+ return parts.join(', ');
52
+ }
53
+ /**
54
+ * Build a content-aware description from week-ahead data.
55
+ * Summarises event counts, committee meetings, and key highlights.
56
+ *
57
+ * @param weekData - Aggregated week-ahead domain data
58
+ * @param dateRange - Date range for the article
59
+ * @returns SEO-friendly description (≤ 200 chars)
60
+ */
61
+ function buildWeekAheadDescription(weekData, dateRange) {
62
+ const parts = [];
63
+ if (weekData.events.length > 0)
64
+ parts.push(`${pl(weekData.events.length, 'scheduled event', 'scheduled events')}`);
65
+ if (weekData.committees.length > 0)
66
+ parts.push(`${pl(weekData.committees.length, 'committee meeting', 'committee meetings')}`);
67
+ if (weekData.pipeline.length > 0)
68
+ parts.push(`${pl(weekData.pipeline.length, 'legislative pipeline item', 'legislative pipeline items')}`);
69
+ if (weekData.questions.length > 0)
70
+ parts.push(`${pl(weekData.questions.length, 'parliamentary question', 'parliamentary questions')}`);
71
+ if (parts.length === 0) {
72
+ return `European Parliament calendar and plenary agenda for ${dateRange.start} to ${dateRange.end}.`;
73
+ }
74
+ const highlight = weekData.events[0]?.title ?? '';
75
+ const base = `EP week ahead (${dateRange.start}–${dateRange.end}): ${parts.join(', ')}`;
76
+ if (highlight) {
77
+ const full = `${base}. Key: ${highlight}`;
78
+ return full.length > 200 ? full.slice(0, 197) + '...' : full;
79
+ }
80
+ return base.length > 200 ? base.slice(0, 197) + '...' : base;
81
+ }
82
+ // ─── Strategy implementation ──────────────────────────────────────────────────
83
+ /**
84
+ * Article strategy for {@link ArticleCategory.WEEK_AHEAD}.
85
+ * Fetches plenary, committee, document, pipeline and question data then builds
86
+ * a forward-looking preview of the upcoming parliamentary week.
87
+ */
88
+ export class WeekAheadStrategy {
89
+ type = ArticleCategory.WEEK_AHEAD;
90
+ requiredMCPTools = [
91
+ 'get_plenary_sessions',
92
+ 'get_committee_info',
93
+ 'search_documents',
94
+ 'monitor_legislative_pipeline',
95
+ 'get_parliamentary_questions',
96
+ 'get_events',
97
+ 'get_events_feed',
98
+ 'get_plenary_documents_feed',
99
+ 'get_adopted_texts_feed',
100
+ ];
101
+ /**
102
+ * Fetch week-ahead data from MCP.
103
+ *
104
+ * @param client - MCP client or null
105
+ * @param date - ISO 8601 publication date
106
+ * @returns Populated week-ahead data payload
107
+ */
108
+ async fetchData(client, date) {
109
+ const dateRange = computeWeekAheadDateRange(date);
110
+ console.log(` 📆 Date range: ${dateRange.start} to ${dateRange.end}`);
111
+ // Fetch traditional MCP data and EP feeds in parallel
112
+ const [weekData, feedData] = await Promise.all([
113
+ fetchWeekAheadData(client, dateRange),
114
+ fetchEPFeedData(client, 'one-week', dateRange),
115
+ ]);
116
+ const keywords = buildKeywords(weekData);
117
+ return {
118
+ date,
119
+ dateRange,
120
+ weekData,
121
+ keywords,
122
+ feedData,
123
+ };
124
+ }
125
+ /**
126
+ * Build the week-ahead HTML body for the specified language.
127
+ *
128
+ * @param data - Week-ahead data payload
129
+ * @param lang - Target language code used for editorial strings
130
+ * @returns Article HTML body
131
+ */
132
+ buildContent(data, lang) {
133
+ const base = buildWeekAheadContent(data.weekData, data.dateRange, lang);
134
+ const watchSection = buildWhatToWatchSection(data.weekData.pipeline, [], lang);
135
+ const analysis = buildProspectiveAnalysis(data.weekData, data.dateRange, 'week');
136
+ const analysisSection = buildDeepAnalysisSection(analysis, lang, 'en');
137
+ const mindmapData = buildProspectiveMindmap(data.weekData, lang);
138
+ const mindmapSection = buildIntelligenceMindmapSection(mindmapData, lang);
139
+ const swotData = buildProspectiveSwot(data.weekData, 'week', lang);
140
+ const swotSection = buildSwotSection(swotData, lang);
141
+ const dashboardData = buildProspectiveDashboard(data.weekData, 'week', lang);
142
+ const dashboardSection = buildDashboardSection(dashboardData, lang);
143
+ // Inject at the explicit <!-- /article-content --> marker position so the
144
+ // section stays inside the .article-content styling scope. The marker is
145
+ // removed from the final HTML output to avoid unnecessary bytes.
146
+ const injection = (watchSection || '') + analysisSection + mindmapSection + swotSection + dashboardSection;
147
+ if (injection) {
148
+ return base.replace('<!-- /article-content -->', injection);
149
+ }
150
+ return base.replace('<!-- /article-content -->', '');
151
+ }
152
+ /**
153
+ * Return language-specific metadata for the week-ahead article.
154
+ *
155
+ * @param data - Week-ahead data payload
156
+ * @param lang - Target language code
157
+ * @returns Localised metadata
158
+ */
159
+ getMetadata(data, lang) {
160
+ const titleFn = getLocalizedString(WEEK_AHEAD_TITLES, lang);
161
+ const { title: baseTitle, subtitle: baseSubtitle } = titleFn(data.dateRange.start, data.dateRange.end);
162
+ const suffix = lang === 'en' ? buildWeekAheadTitleSuffix(data.weekData) : '';
163
+ const title = suffix ? `${baseTitle} — ${suffix}` : baseTitle;
164
+ const subtitle = lang === 'en'
165
+ ? buildWeekAheadDescription(data.weekData, data.dateRange) || baseSubtitle
166
+ : baseSubtitle;
167
+ return {
168
+ title,
169
+ subtitle,
170
+ keywords: data.keywords,
171
+ category: ArticleCategory.WEEK_AHEAD,
172
+ sources: [],
173
+ };
174
+ }
175
+ }
176
+ /** Singleton instance for use by the strategy registry */
177
+ export const weekAheadStrategy = new WeekAheadStrategy();
178
+ //# sourceMappingURL=week-ahead-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"week-ahead-strategy.js","sourceRoot":"","sources":["../../../src/generators/strategies/week-ahead-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @module Generators/Strategies/WeeklyReviewStrategy
3
+ * @description Article strategy for the Week In Review article type.
4
+ * Fetches voting records, voting patterns, voting anomalies, and parliamentary
5
+ * questions from the past 7 days, then renders a retrospective analysis article.
6
+ */
7
+ import type { EuropeanParliamentMCPClient } from '../../mcp/ep-mcp-client.js';
8
+ import { ArticleCategory } from '../../types/index.js';
9
+ import type { LanguageCode, DateRange, VotingRecord, VotingPattern, VotingAnomaly, MotionsQuestion, EPFeedData } from '../../types/index.js';
10
+ import type { ArticleStrategy, ArticleData, ArticleMetadata } from './article-strategy.js';
11
+ /** Data fetched and pre-processed by {@link WeeklyReviewStrategy} */
12
+ export interface WeeklyReviewArticleData extends ArticleData {
13
+ /** Review period date range */
14
+ readonly dateRange: DateRange;
15
+ /** Voting records from the review period */
16
+ readonly votingRecords: readonly VotingRecord[];
17
+ /** Voting patterns analysis */
18
+ readonly votingPatterns: readonly VotingPattern[];
19
+ /** Detected voting anomalies */
20
+ readonly anomalies: readonly VotingAnomaly[];
21
+ /** Parliamentary questions from the period */
22
+ readonly questions: readonly MotionsQuestion[];
23
+ /** Start date string for display */
24
+ readonly dateFromStr: string;
25
+ /** EP feed data for enrichment (when available) */
26
+ readonly feedData?: EPFeedData | undefined;
27
+ }
28
+ /**
29
+ * Article strategy for {@link ArticleCategory.WEEK_IN_REVIEW}.
30
+ * Fetches voting records, anomalies, patterns, and questions for the
31
+ * past 7 days and builds a retrospective analysis article.
32
+ */
33
+ export declare class WeeklyReviewStrategy implements ArticleStrategy<WeeklyReviewArticleData> {
34
+ readonly type = ArticleCategory.WEEK_IN_REVIEW;
35
+ readonly requiredMCPTools: readonly ["get_voting_records", "analyze_voting_patterns", "detect_voting_anomalies", "get_parliamentary_questions", "get_adopted_texts_feed", "get_procedures_feed", "get_events_feed"];
36
+ /**
37
+ * Fetch weekly review data from MCP.
38
+ *
39
+ * @param client - MCP client or null
40
+ * @param date - ISO 8601 publication date
41
+ * @returns Populated weekly review data payload
42
+ */
43
+ fetchData(client: EuropeanParliamentMCPClient | null, date: string): Promise<WeeklyReviewArticleData>;
44
+ /**
45
+ * Build the weekly review HTML body for the specified language.
46
+ *
47
+ * @param data - Weekly review data payload
48
+ * @param lang - Target language code used for editorial strings
49
+ * @returns Article HTML body
50
+ */
51
+ buildContent(data: WeeklyReviewArticleData, lang: LanguageCode): string;
52
+ /**
53
+ * Return language-specific metadata for the weekly review article.
54
+ *
55
+ * @param data - Weekly review data payload
56
+ * @param lang - Target language code
57
+ * @returns Localised metadata
58
+ */
59
+ getMetadata(data: WeeklyReviewArticleData, lang: LanguageCode): ArticleMetadata;
60
+ }
61
+ /** Singleton instance for use by the strategy registry */
62
+ export declare const weeklyReviewStrategy: WeeklyReviewStrategy;
63
+ //# sourceMappingURL=weekly-review-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weekly-review-strategy.d.ts","sourceRoot":"","sources":["../../../src/generators/strategies/weekly-review-strategy.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,UAAU,EACX,MAAM,sBAAsB,CAAC;AAoB9B,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAK3F,qEAAqE;AACrE,MAAM,WAAW,uBAAwB,SAAQ,WAAW;IAC1D,+BAA+B;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,4CAA4C;IAC5C,QAAQ,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,CAAC;IAChD,+BAA+B;IAC/B,QAAQ,CAAC,cAAc,EAAE,SAAS,aAAa,EAAE,CAAC;IAClD,gCAAgC;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IAC7C,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,oCAAoC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,mDAAmD;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;CAC5C;AAsHD;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,eAAe,CAAC,uBAAuB,CAAC;IACnF,QAAQ,CAAC,IAAI,kCAAkC;IAE/C,QAAQ,CAAC,gBAAgB,2LAQd;IAEX;;;;;;OAMG;IACG,SAAS,CACb,MAAM,EAAE,2BAA2B,GAAG,IAAI,EAC1C,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,uBAAuB,CAAC;IAyBnC;;;;;;OAMG;IACH,YAAY,CAAC,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,YAAY,GAAG,MAAM;IAgDvE;;;;;;OAMG;IACH,WAAW,CAAC,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,YAAY,GAAG,eAAe;CAkBhF;AAED,0DAA0D;AAC1D,eAAO,MAAM,oBAAoB,sBAA6B,CAAC"}
@@ -0,0 +1,211 @@
1
+ // SPDX-FileCopyrightText: 2024-2026 Hack23 AB
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ import { ArticleCategory } from '../../types/index.js';
4
+ import { WEEKLY_REVIEW_TITLES, getLocalizedString } from '../../constants/languages.js';
5
+ import { fetchVotingRecords, fetchVotingPatterns, fetchMotionsAnomalies, fetchParliamentaryQuestionsForMotions, fetchEPFeedData, } from '../pipeline/fetch-stage.js';
6
+ import { generateMotionsContent, buildAdoptedTextsSection } from '../motions-content.js';
7
+ import { buildDeepAnalysisSection } from '../deep-analysis-content.js';
8
+ import { buildVotingAnalysis, buildVotingSwot, buildVotingDashboard, buildVotingMindmap, } from '../analysis-builders.js';
9
+ import { buildSwotSection } from '../swot-content.js';
10
+ import { buildDashboardSection } from '../dashboard-content.js';
11
+ import { buildIntelligenceMindmapSection } from '../mindmap-content.js';
12
+ import { pl } from '../../utils/metadata-utils.js';
13
+ /** Base keywords shared by all Weekly Review articles */
14
+ const WEEKLY_REVIEW_BASE_KEYWORDS = [
15
+ 'European Parliament',
16
+ 'weekly review',
17
+ 'voting records',
18
+ 'parliamentary activity',
19
+ ];
20
+ /**
21
+ * Extract content-aware keywords from weekly review data.
22
+ *
23
+ * @param data - Weekly review article data payload
24
+ * @returns Deduplicated keyword array
25
+ */
26
+ function buildWeeklyReviewKeywords(data) {
27
+ const keywords = [...WEEKLY_REVIEW_BASE_KEYWORDS];
28
+ for (const r of data.votingRecords.slice(0, 5)) {
29
+ if (r.title)
30
+ keywords.push(r.title.slice(0, 60));
31
+ }
32
+ for (const a of data.anomalies.slice(0, 3)) {
33
+ if (a.type)
34
+ keywords.push(a.type);
35
+ }
36
+ for (const q of data.questions.slice(0, 3)) {
37
+ if (q.topic)
38
+ keywords.push(q.topic);
39
+ }
40
+ if (data.feedData?.adoptedTexts) {
41
+ for (const text of data.feedData.adoptedTexts.slice(0, 3)) {
42
+ if (text.title)
43
+ keywords.push(text.title.slice(0, 60));
44
+ }
45
+ }
46
+ return [...new Set(keywords)];
47
+ }
48
+ /**
49
+ * Build a content-aware description from weekly review data.
50
+ *
51
+ * @param data - Weekly review article data payload
52
+ * @returns SEO-friendly description (≤ 200 chars)
53
+ */
54
+ function buildWeeklyReviewDescription(data) {
55
+ const parts = [];
56
+ if (data.votingRecords.length > 0)
57
+ parts.push(`${pl(data.votingRecords.length, 'vote', 'votes')} analysed`);
58
+ if (data.anomalies.length > 0)
59
+ parts.push(pl(data.anomalies.length, 'voting anomaly', 'voting anomalies'));
60
+ if (data.questions.length > 0)
61
+ parts.push(`${pl(data.questions.length, 'question', 'questions')} tabled`);
62
+ const adoptedCount = data.feedData?.adoptedTexts?.length ?? 0;
63
+ if (adoptedCount > 0)
64
+ parts.push(`${adoptedCount} adopted ${adoptedCount === 1 ? 'text' : 'texts'}`);
65
+ if (parts.length === 0) {
66
+ return `European Parliament weekly review for ${data.dateRange.start} to ${data.dateRange.end}.`;
67
+ }
68
+ const highlight = data.votingRecords[0]?.title ?? '';
69
+ const base = `EP week in review (${data.dateRange.start}–${data.dateRange.end}): ${parts.join(', ')}`;
70
+ if (highlight) {
71
+ const full = `${base}. Key: ${highlight}`;
72
+ return full.length > 200 ? full.slice(0, 197) + '...' : full;
73
+ }
74
+ return base.length > 200 ? base.slice(0, 197) + '...' : base;
75
+ }
76
+ /**
77
+ * Build a content-aware title suffix from weekly review data counts.
78
+ *
79
+ * @param data - Weekly review article data payload
80
+ * @returns Short suffix for the title, or empty string
81
+ */
82
+ function buildWeeklyReviewTitleSuffix(data) {
83
+ const parts = [];
84
+ if (data.votingRecords.length > 0) {
85
+ parts.push(pl(data.votingRecords.length, 'Vote', 'Votes'));
86
+ }
87
+ if (data.anomalies.length > 0) {
88
+ parts.push(pl(data.anomalies.length, 'Anomaly', 'Anomalies'));
89
+ }
90
+ const adoptedCount = data.feedData?.adoptedTexts?.length ?? 0;
91
+ if (adoptedCount > 0) {
92
+ parts.push(pl(adoptedCount, 'Text', 'Texts'));
93
+ }
94
+ return parts.join(', ');
95
+ }
96
+ // ─── Date-range helper ────────────────────────────────────────────────────────
97
+ /**
98
+ * Compute the review period covering the 7 days ending on `baseDate`.
99
+ *
100
+ * @param baseDate - ISO 8601 publication date (YYYY-MM-DD)
101
+ * @returns Date range covering the past 7 days
102
+ */
103
+ function computeWeeklyReviewDateRange(baseDate) {
104
+ const end = new Date(`${baseDate}T00:00:00Z`);
105
+ const start = new Date(end);
106
+ start.setUTCDate(end.getUTCDate() - 7);
107
+ const startParts = start.toISOString().split('T');
108
+ const endParts = end.toISOString().split('T');
109
+ if (!startParts[0] || !endParts[0]) {
110
+ throw new Error('Invalid date format generated in computeWeeklyReviewDateRange');
111
+ }
112
+ return {
113
+ start: startParts[0],
114
+ end: endParts[0],
115
+ };
116
+ }
117
+ // ─── Strategy implementation ──────────────────────────────────────────────────
118
+ /**
119
+ * Article strategy for {@link ArticleCategory.WEEK_IN_REVIEW}.
120
+ * Fetches voting records, anomalies, patterns, and questions for the
121
+ * past 7 days and builds a retrospective analysis article.
122
+ */
123
+ export class WeeklyReviewStrategy {
124
+ type = ArticleCategory.WEEK_IN_REVIEW;
125
+ requiredMCPTools = [
126
+ 'get_voting_records',
127
+ 'analyze_voting_patterns',
128
+ 'detect_voting_anomalies',
129
+ 'get_parliamentary_questions',
130
+ 'get_adopted_texts_feed',
131
+ 'get_procedures_feed',
132
+ 'get_events_feed',
133
+ ];
134
+ /**
135
+ * Fetch weekly review data from MCP.
136
+ *
137
+ * @param client - MCP client or null
138
+ * @param date - ISO 8601 publication date
139
+ * @returns Populated weekly review data payload
140
+ */
141
+ async fetchData(client, date) {
142
+ const dateRange = computeWeeklyReviewDateRange(date);
143
+ console.log(` 📊 Weekly review range: ${dateRange.start} to ${dateRange.end}`);
144
+ // Fetch voting data and EP feed data in parallel
145
+ const [votingRecords, votingPatterns, anomalies, questions, feedData] = await Promise.all([
146
+ fetchVotingRecords(client, dateRange.start, dateRange.end),
147
+ fetchVotingPatterns(client, dateRange.start, dateRange.end),
148
+ fetchMotionsAnomalies(client, dateRange.start, dateRange.end),
149
+ fetchParliamentaryQuestionsForMotions(client, dateRange.start, dateRange.end),
150
+ fetchEPFeedData(client, 'one-week', dateRange),
151
+ ]);
152
+ return {
153
+ date,
154
+ dateRange,
155
+ dateFromStr: dateRange.start,
156
+ votingRecords,
157
+ votingPatterns,
158
+ anomalies,
159
+ questions,
160
+ feedData,
161
+ };
162
+ }
163
+ /**
164
+ * Build the weekly review HTML body for the specified language.
165
+ *
166
+ * @param data - Weekly review data payload
167
+ * @param lang - Target language code used for editorial strings
168
+ * @returns Article HTML body
169
+ */
170
+ buildContent(data, lang) {
171
+ const base = generateMotionsContent(data.dateRange.start, data.dateRange.end, [...data.votingRecords], [...data.votingPatterns], [...data.anomalies], [...data.questions], lang);
172
+ const analysis = buildVotingAnalysis(data.dateRange.start, data.dateRange.end, data.votingRecords, data.votingPatterns, data.anomalies, data.questions);
173
+ const deepSection = buildDeepAnalysisSection(analysis, lang, 'en');
174
+ // Enrich with adopted texts from feed data when available
175
+ const adoptedTextsHtml = data.feedData && data.feedData.adoptedTexts.length > 0
176
+ ? buildAdoptedTextsSection(data.feedData.adoptedTexts, lang)
177
+ : '';
178
+ const mindmapData = buildVotingMindmap(data.votingRecords, data.votingPatterns, data.anomalies, lang);
179
+ const mindmapSection = buildIntelligenceMindmapSection(mindmapData, lang);
180
+ const swotData = buildVotingSwot(data.votingRecords, data.votingPatterns, data.anomalies, lang);
181
+ const swotSection = buildSwotSection(swotData, lang);
182
+ const dashboardData = buildVotingDashboard(data.votingRecords, data.votingPatterns, data.anomalies, lang);
183
+ const dashboardSection = buildDashboardSection(dashboardData, lang);
184
+ return base.replace('<!-- /article-content -->', adoptedTextsHtml + deepSection + mindmapSection + swotSection + dashboardSection);
185
+ }
186
+ /**
187
+ * Return language-specific metadata for the weekly review article.
188
+ *
189
+ * @param data - Weekly review data payload
190
+ * @param lang - Target language code
191
+ * @returns Localised metadata
192
+ */
193
+ getMetadata(data, lang) {
194
+ const titleFn = getLocalizedString(WEEKLY_REVIEW_TITLES, lang);
195
+ const { title: baseTitle, subtitle: baseSubtitle } = titleFn(data.dateRange.start, data.dateRange.end);
196
+ const suffix = lang === 'en' ? buildWeeklyReviewTitleSuffix(data) : '';
197
+ const title = suffix ? `${baseTitle} — ${suffix}` : baseTitle;
198
+ const description = lang === 'en' ? buildWeeklyReviewDescription(data) : '';
199
+ const subtitle = description || baseSubtitle;
200
+ return {
201
+ title,
202
+ subtitle,
203
+ keywords: buildWeeklyReviewKeywords(data),
204
+ category: ArticleCategory.WEEK_IN_REVIEW,
205
+ sources: [],
206
+ };
207
+ }
208
+ }
209
+ /** Singleton instance for use by the strategy registry */
210
+ export const weeklyReviewStrategy = new WeeklyReviewStrategy();
211
+ //# sourceMappingURL=weekly-review-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"weekly-review-strategy.js","sourceRoot":"","sources":["../../../src/generators/strategies/weekly-review-strategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { SwotAnalysis, MultiDimensionalSwot } from '../types/index.js';
2
+ /**
3
+ * Build a complete SWOT analysis section HTML.
4
+ *
5
+ * Generates an accessible CSS Grid-based SWOT matrix that can be embedded
6
+ * in any article type. The visualization is pure HTML/CSS with no JavaScript
7
+ * required, ensuring compatibility with strict CSP policies.
8
+ *
9
+ * Returns an empty string if the analysis is null/undefined or contains
10
+ * no items in any quadrant.
11
+ *
12
+ * @param analysis - SWOT analysis data (null/undefined returns empty string)
13
+ * @param lang - BCP 47 language code for localized headings (defaults to "en")
14
+ * @param heading - Optional custom section heading override
15
+ * @returns HTML section string or empty string
16
+ */
17
+ export declare function buildSwotSection(analysis: SwotAnalysis | null | undefined, lang?: string, heading?: string): string;
18
+ /**
19
+ * Build a complete multi-dimensional SWOT analysis section HTML.
20
+ *
21
+ * Renders a primary aggregated 4-quadrant SWOT matrix followed by optional:
22
+ * - **Dimension drill-downs** (Political, Economic, Social, Legal, Geopolitical)
23
+ * as CSS-only `<details>` disclosure widgets
24
+ * - **Stakeholder perspectives** (Citizens, Industry, NGOs, MEPs, etc.)
25
+ * as collapsible `<details>` widgets
26
+ * - **Temporal analysis** (short-term, medium-term, long-term)
27
+ * as collapsible `<details>` widgets
28
+ * - **Cross-references** linking SWOT items to specific EP documents/votes
29
+ *
30
+ * All interactivity is CSS-only (no JavaScript), ensuring compatibility
31
+ * with strict CSP policies and WCAG 2.1 AA accessibility requirements.
32
+ *
33
+ * Returns an empty string if the analysis has no dimensions or all
34
+ * dimensions are empty.
35
+ *
36
+ * @param analysis - Multi-dimensional SWOT data (null/undefined returns empty string)
37
+ * @param lang - BCP 47 language code for localized headings (defaults to "en")
38
+ * @param heading - Optional custom section heading override
39
+ * @returns HTML section string or empty string
40
+ */
41
+ export declare function buildMultiDimensionalSwotSection(analysis: MultiDimensionalSwot | null | undefined, lang?: string, heading?: string): string;
42
+ //# sourceMappingURL=swot-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swot-content.d.ts","sourceRoot":"","sources":["../../src/generators/swot-content.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EACV,YAAY,EAMZ,oBAAoB,EAGrB,MAAM,mBAAmB,CAAC;AAgD3B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,SAAS,EACzC,IAAI,GAAE,MAAa,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CA2DR;AAmQD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,oBAAoB,GAAG,IAAI,GAAG,SAAS,EACjD,IAAI,GAAE,MAAa,EACnB,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAuCR"}