@cyanheads/hn-mcp-server 0.5.21 → 0.5.22
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.
- package/AGENTS.md +7 -4
- package/CLAUDE.md +7 -4
- package/Dockerfile +4 -4
- package/README.md +17 -12
- package/changelog/0.5.x/0.5.22.md +45 -0
- package/dist/mcp-server/tools/definitions/get-stories.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-stories.tool.js +23 -12
- package/dist/mcp-server/tools/definitions/get-stories.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-thread.tool.d.ts +3 -2
- package/dist/mcp-server/tools/definitions/get-thread.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-thread.tool.js +192 -99
- package/dist/mcp-server/tools/definitions/get-thread.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/get-user.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-user.tool.js +22 -8
- package/dist/mcp-server/tools/definitions/get-user.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-content.tool.d.ts +93 -0
- package/dist/mcp-server/tools/definitions/search-content.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-content.tool.js +322 -59
- package/dist/mcp-server/tools/definitions/search-content.tool.js.map +1 -1
- package/dist/mcp-server/tools/served-at-cap.d.ts +14 -0
- package/dist/mcp-server/tools/served-at-cap.d.ts.map +1 -0
- package/dist/mcp-server/tools/served-at-cap.js +16 -0
- package/dist/mcp-server/tools/served-at-cap.js.map +1 -0
- package/dist/mcp-server/tools/thread-cursor.d.ts +68 -0
- package/dist/mcp-server/tools/thread-cursor.d.ts.map +1 -0
- package/dist/mcp-server/tools/thread-cursor.js +200 -0
- package/dist/mcp-server/tools/thread-cursor.js.map +1 -0
- package/dist/services/hn/hn-service.d.ts +29 -4
- package/dist/services/hn/hn-service.d.ts.map +1 -1
- package/dist/services/hn/hn-service.js +58 -25
- package/dist/services/hn/hn-service.js.map +1 -1
- package/dist/services/hn/types.d.ts +9 -0
- package/dist/services/hn/types.d.ts.map +1 -1
- package/package.json +9 -9
- package/server.json +3 -3
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
7
|
import { escapeInline, quoteBody } from '../markdown-escape.js';
|
|
8
|
+
import { servedAtCap } from '../served-at-cap.js';
|
|
8
9
|
import { decodeHtmlEntities, getHnService, normalizeUrl, settlePage, stripHtml, } from '../../../services/hn/hn-service.js';
|
|
10
|
+
/** Most submissions one call resolves; a larger `submissionCount` is served at this cap. */
|
|
11
|
+
const SUBMISSION_COUNT_CAP = 50;
|
|
12
|
+
/** Largest `submissionCount` accepted; anything above it is rejected. */
|
|
13
|
+
const SUBMISSION_COUNT_CEILING = 1000;
|
|
9
14
|
export const getUser = tool('hn_get_user', {
|
|
10
15
|
description: 'Get an HN user profile with karma, about, and optionally their most recent submissions resolved into full items.',
|
|
11
16
|
annotations: { readOnlyHint: true },
|
|
@@ -71,15 +76,15 @@ export const getUser = tool('hn_get_user', {
|
|
|
71
76
|
.number()
|
|
72
77
|
.int()
|
|
73
78
|
.min(1)
|
|
74
|
-
.max(
|
|
79
|
+
.max(SUBMISSION_COUNT_CEILING)
|
|
75
80
|
.default(10)
|
|
76
|
-
.describe(
|
|
81
|
+
.describe(`Page size — how many submissions to resolve per call, at most ${SUBMISSION_COUNT_CAP} per call. A larger value is served at ${SUBMISSION_COUNT_CAP}, and the notice names the submissionOffset for the next page. Only used when includeSubmissions is true.`),
|
|
77
82
|
submissionOffset: z
|
|
78
83
|
.number()
|
|
79
84
|
.int()
|
|
80
85
|
.min(0)
|
|
81
86
|
.default(0)
|
|
82
|
-
.describe('How many submissions to skip before resolving, counting back from the most recent. Use with submissionCount to page through a long history: request offset 0, then
|
|
87
|
+
.describe('How many submissions to skip before resolving, counting back from the most recent. Use with submissionCount to page through a long history: request offset 0, then advance by the page size served, and so on. The enrichment block echoes submissionOffset and, when more remain, the offset to send next. Only used when includeSubmissions is true.'),
|
|
83
88
|
}),
|
|
84
89
|
output: z.object({
|
|
85
90
|
user: z
|
|
@@ -106,7 +111,10 @@ export const getUser = tool('hn_get_user', {
|
|
|
106
111
|
text: z.string().optional().describe('Body text (HTML stripped).'),
|
|
107
112
|
score: z.number().optional().describe('Score/upvotes.'),
|
|
108
113
|
time: z.number().optional().describe('Unix timestamp.'),
|
|
109
|
-
descendants: z
|
|
114
|
+
descendants: z
|
|
115
|
+
.number()
|
|
116
|
+
.optional()
|
|
117
|
+
.describe("HN's count of live comments in the thread (descendants); dead and deleted comments are not counted. Present for stories and polls."),
|
|
110
118
|
})
|
|
111
119
|
.describe('A single submission by the user (story, comment, job, poll, or poll option).'))
|
|
112
120
|
.optional()
|
|
@@ -119,7 +127,10 @@ export const getUser = tool('hn_get_user', {
|
|
|
119
127
|
.describe('The offset this page started at. Absent when includeSubmissions is false or the user has never submitted.'),
|
|
120
128
|
truncated: z.boolean().optional().describe('True when submissions remain beyond this page.'),
|
|
121
129
|
shown: z.number().optional().describe('Number of submissions returned.'),
|
|
122
|
-
cap: z
|
|
130
|
+
cap: z
|
|
131
|
+
.number()
|
|
132
|
+
.optional()
|
|
133
|
+
.describe(`The submissionCount value served: as passed, or ${SUBMISSION_COUNT_CAP} when submissionCount was above that cap.`),
|
|
123
134
|
failedIds: z
|
|
124
135
|
.array(z.number())
|
|
125
136
|
.optional()
|
|
@@ -127,7 +138,7 @@ export const getUser = tool('hn_get_user', {
|
|
|
127
138
|
notice: z
|
|
128
139
|
.string()
|
|
129
140
|
.optional()
|
|
130
|
-
.describe('Pagination context — which window of the history this page covers and the submissionOffset to send next, the submission IDs that failed to load and how to retry them, or a warning that the offset is past the end. Absent when the page reaches the end of the history with no failed IDs, or when no submissions were resolved.'),
|
|
141
|
+
.describe('Pagination context — which window of the history this page covers and the submissionOffset to send next, the submission IDs that failed to load and how to retry them, or a warning that the offset is past the end — noting when submissionCount was served at its per-call cap. Absent when the page reaches the end of the history with no failed IDs, or when no submissions were resolved.'),
|
|
131
142
|
},
|
|
132
143
|
enrichmentTrailer: {
|
|
133
144
|
failedIds: { render: (ids) => `**Failed to load:** ${(ids ?? []).join(', ')}` },
|
|
@@ -148,7 +159,8 @@ export const getUser = tool('hn_get_user', {
|
|
|
148
159
|
totalSubmissions: user.submitted?.length ?? 0,
|
|
149
160
|
};
|
|
150
161
|
const offset = input.submissionOffset;
|
|
151
|
-
const
|
|
162
|
+
const submissionCount = Math.min(input.submissionCount, SUBMISSION_COUNT_CAP);
|
|
163
|
+
const pageEnd = offset + submissionCount;
|
|
152
164
|
const windowIds = input.includeSubmissions && user.submitted?.length
|
|
153
165
|
? user.submitted.slice(offset, pageEnd)
|
|
154
166
|
: undefined;
|
|
@@ -183,9 +195,11 @@ export const getUser = tool('hn_get_user', {
|
|
|
183
195
|
ctx.enrich.notice(`submissionOffset ${offset} is past the end of ${total.toLocaleString()} submissions. Valid offsets are 0 to ${total - 1}.`);
|
|
184
196
|
}
|
|
185
197
|
else if (pageEnd < total) {
|
|
186
|
-
ctx.enrich.truncated({ shown, cap:
|
|
198
|
+
ctx.enrich.truncated({ shown, cap: submissionCount });
|
|
187
199
|
ctx.enrich.notice([
|
|
188
200
|
`Showing ${shown} live item${shown === 1 ? '' : 's'} from positions ${(offset + 1).toLocaleString()}–${pageEnd.toLocaleString()} of ${total.toLocaleString()} submissions.`,
|
|
201
|
+
input.submissionCount > SUBMISSION_COUNT_CAP &&
|
|
202
|
+
servedAtCap('submissionCount', input.submissionCount, SUBMISSION_COUNT_CAP),
|
|
189
203
|
failureMessage,
|
|
190
204
|
`Set submissionOffset to ${pageEnd} for the next page.`,
|
|
191
205
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-user.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-user.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,SAAS,GACV,MAAM,6BAA6B,CAAC;AAErC,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;IACzC,WAAW,EACT,kHAAkH;IACpH,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;IACnC,MAAM,EAAE;QACN;YACE,MAAM,EAAE,gBAAgB;YACxB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,2DAA2D;YACjE,QAAQ,EAAE,iEAAiE;YAC3E,QAAQ,EAAE,QAAQ;SACnB;QACD;YACE,MAAM,EAAE,mBAAmB;YAC3B,IAAI,EAAE,gBAAgB,CAAC,aAAa;YACpC,IAAI,EAAE,2IAA2I;YACjJ,QAAQ,EAAE,+EAA+E;YACzF,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,MAAM,EAAE,uBAAuB;YAC/B,IAAI,EAAE,gBAAgB,CAAC,WAAW;YAClC,IAAI,EAAE,oCAAoC;YAC1C,QAAQ,EACN,kIAAkI;YACpI,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,MAAM,EAAE,sBAAsB;YAC9B,IAAI,EAAE,gBAAgB,CAAC,kBAAkB;YACzC,IAAI,EAAE,wCAAwC;YAC9C,QAAQ,EAAE,8EAA8E;YACxF,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,MAAM,EAAE,eAAe;YACvB,IAAI,EAAE,gBAAgB,CAAC,kBAAkB;YACzC,IAAI,EAAE,2GAA2G;YACjH,QAAQ,EAAE,0EAA0E;YACpF,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,SAAS;SACpB;QACD;YACE,MAAM,EAAE,oBAAoB;YAC5B,IAAI,EAAE,gBAAgB,CAAC,kBAAkB;YACzC,IAAI,EAAE,oEAAoE;YAC1E,QAAQ,EAAE,kFAAkF;YAC5F,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,SAAS;SACpB;KACF;IACD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,EAAE,wDAAwD,CAAC;aAChE,QAAQ,CACP,mFAAmF,CACpF;QACH,kBAAkB,EAAE,CAAC;aAClB,OAAO,EAAE;aACT,OAAO,CAAC,KAAK,CAAC;aACd,QAAQ,CACP,mHAAmH,CACpH;QACH,eAAe,EAAE,CAAC;aACf,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"get-user.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-user.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,57 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
/**
|
|
8
|
+
* Drop the scheme and `www.` from a query that is a URL alone. Algolia requires
|
|
9
|
+
* every token, so `https` and `www` would otherwise have to appear in the
|
|
10
|
+
* submitted URL, and the same page submitted under the other scheme or without
|
|
11
|
+
* `www.` would drop out. A query with whitespace is searched as typed, and so
|
|
12
|
+
* is one the prefix would leave empty.
|
|
13
|
+
*/
|
|
14
|
+
export declare function stripUrlPrefix(query: string): {
|
|
15
|
+
query: string;
|
|
16
|
+
droppedPrefix?: string;
|
|
17
|
+
};
|
|
18
|
+
/** What the search notice is composed from: the inputs as searched, and the page Algolia returned. */
|
|
19
|
+
export interface SearchNoticeFacts {
|
|
20
|
+
author?: string | undefined;
|
|
21
|
+
count: number;
|
|
22
|
+
dateRange?: {
|
|
23
|
+
start?: string | undefined;
|
|
24
|
+
end?: string | undefined;
|
|
25
|
+
} | undefined;
|
|
26
|
+
/** The URL prefix dropped from the caller's query before searching. */
|
|
27
|
+
droppedPrefix?: string | undefined;
|
|
28
|
+
minPoints?: number | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* The caller's count and page when count was above the per-call cap. The
|
|
31
|
+
* search then ran at `count` (the cap) and `page` (the page at the cap where
|
|
32
|
+
* the requested page starts), which the other facts describe.
|
|
33
|
+
*/
|
|
34
|
+
overCap?: {
|
|
35
|
+
count: number;
|
|
36
|
+
page: number;
|
|
37
|
+
} | undefined;
|
|
38
|
+
page: number;
|
|
39
|
+
/** The query sent to Algolia; absent for a filter-only search. */
|
|
40
|
+
query?: string | undefined;
|
|
41
|
+
/** Hits on this page. */
|
|
42
|
+
shown: number;
|
|
43
|
+
storyId?: number | undefined;
|
|
44
|
+
tags?: string | undefined;
|
|
45
|
+
totalHits: number;
|
|
46
|
+
/** False when totalHits is an estimate; undefined when Algolia does not say. */
|
|
47
|
+
totalHitsExact?: boolean | undefined;
|
|
48
|
+
totalPages: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Compose the one `notice` string every search writes. `notice` is last-wins,
|
|
52
|
+
* so each source goes through here: the page-state sentence first, then the
|
|
53
|
+
* cause sentences in input order — query, tags, author, storyId, count. None
|
|
54
|
+
* replaces another. Undefined when nothing applies — the last page of an
|
|
55
|
+
* uncapped, non-empty search.
|
|
56
|
+
*/
|
|
57
|
+
export declare function composeSearchNotice(facts: SearchNoticeFacts): string | undefined;
|
|
7
58
|
export declare const searchHn: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
|
|
8
59
|
query: z.ZodOptional<z.ZodString>;
|
|
9
60
|
tags: z.ZodOptional<z.ZodEnum<{
|
|
@@ -35,6 +86,13 @@ export declare const searchHn: import("@cyanheads/mcp-ts-core").ToolDefinition<z
|
|
|
35
86
|
}, z.core.$strip>, z.ZodObject<{
|
|
36
87
|
hits: z.ZodArray<z.ZodObject<{
|
|
37
88
|
id: z.ZodNumber;
|
|
89
|
+
type: z.ZodOptional<z.ZodEnum<{
|
|
90
|
+
comment: "comment";
|
|
91
|
+
job: "job";
|
|
92
|
+
poll: "poll";
|
|
93
|
+
pollopt: "pollopt";
|
|
94
|
+
story: "story";
|
|
95
|
+
}>>;
|
|
38
96
|
title: z.ZodOptional<z.ZodString>;
|
|
39
97
|
url: z.ZodOptional<z.ZodString>;
|
|
40
98
|
domain: z.ZodOptional<z.ZodString>;
|
|
@@ -70,6 +128,12 @@ export declare const searchHn: import("@cyanheads/mcp-ts-core").ToolDefinition<z
|
|
|
70
128
|
readonly when: "minPoints was combined with tags \"comment\" or \"job\", record types Algolia stores without points.";
|
|
71
129
|
readonly recovery: "Drop minPoints to search comments or jobs, or search a scored type (story, poll, ask_hn, show_hn, front_page) to filter by points.";
|
|
72
130
|
readonly severity: "notice";
|
|
131
|
+
}, {
|
|
132
|
+
readonly reason: "count_page_unaligned";
|
|
133
|
+
readonly code: JsonRpcErrorCode.InvalidParams;
|
|
134
|
+
readonly when: "count was above the per-call cap of 50 with a page whose first hit (page × count) begins no page of 50 hits, so the requested page cannot be served from its start at the cap.";
|
|
135
|
+
readonly recovery: "Pass a count of 50 or less with page counted in that count; the error names a count and page that start at the same hit and, when that count is under 25, the page of 50 that holds the hit.";
|
|
136
|
+
readonly severity: "notice";
|
|
73
137
|
}, {
|
|
74
138
|
readonly reason: "upstream_rejected";
|
|
75
139
|
readonly code: JsonRpcErrorCode.InvalidParams;
|
|
@@ -105,9 +169,38 @@ export declare const searchHn: import("@cyanheads/mcp-ts-core").ToolDefinition<z
|
|
|
105
169
|
readonly retryable: true;
|
|
106
170
|
readonly thrownBy: "service";
|
|
107
171
|
}], {
|
|
172
|
+
readonly criteria: z.ZodObject<{
|
|
173
|
+
tags: z.ZodOptional<z.ZodEnum<{
|
|
174
|
+
ask_hn: "ask_hn";
|
|
175
|
+
comment: "comment";
|
|
176
|
+
front_page: "front_page";
|
|
177
|
+
job: "job";
|
|
178
|
+
poll: "poll";
|
|
179
|
+
show_hn: "show_hn";
|
|
180
|
+
story: "story";
|
|
181
|
+
}>>;
|
|
182
|
+
author: z.ZodOptional<z.ZodString>;
|
|
183
|
+
storyId: z.ZodOptional<z.ZodNumber>;
|
|
184
|
+
minPoints: z.ZodOptional<z.ZodNumber>;
|
|
185
|
+
dateRange: z.ZodOptional<z.ZodObject<{
|
|
186
|
+
start: z.ZodOptional<z.ZodString>;
|
|
187
|
+
end: z.ZodOptional<z.ZodString>;
|
|
188
|
+
}, z.core.$strip>>;
|
|
189
|
+
sort: z.ZodEnum<{
|
|
190
|
+
date: "date";
|
|
191
|
+
relevance: "relevance";
|
|
192
|
+
}>;
|
|
193
|
+
count: z.ZodNumber;
|
|
194
|
+
view: z.ZodEnum<{
|
|
195
|
+
compact: "compact";
|
|
196
|
+
full: "full";
|
|
197
|
+
}>;
|
|
198
|
+
}, z.core.$strip>;
|
|
108
199
|
readonly totalHits: z.ZodNumber;
|
|
200
|
+
readonly totalHitsExact: z.ZodOptional<z.ZodBoolean>;
|
|
109
201
|
readonly page: z.ZodNumber;
|
|
110
202
|
readonly totalPages: z.ZodNumber;
|
|
203
|
+
readonly reachableHits: z.ZodOptional<z.ZodNumber>;
|
|
111
204
|
readonly truncated: z.ZodOptional<z.ZodBoolean>;
|
|
112
205
|
readonly shown: z.ZodOptional<z.ZodNumber>;
|
|
113
206
|
readonly cap: z.ZodOptional<z.ZodNumber>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-content.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-content.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"search-content.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-content.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAsHjE;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAKvF;AA0ED,sGAAsG;AACtG,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,SAAS,CAAC;IACjF,uEAAuE;IACvE,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B;;;;OAIG;IACH,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACrC,UAAU,EAAE,MAAM,CAAC;CACpB;AA8FD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAKhF;AAwDD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8fnB,CAAC"}
|