skill-schedule 0.2.0 → 0.2.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.
- package/SKILL.md +12 -6
- package/dist/cli/cmd_read.js +96 -104
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/config.d.ts +16 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/config.js +84 -0
- package/dist/cli/config.js.map +1 -0
- package/dist/cli/health.d.ts +7 -0
- package/dist/cli/health.d.ts.map +1 -0
- package/dist/cli/health.js +32 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/config.d.ts +43 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +64 -0
- package/dist/config.js.map +1 -0
- package/dist/fetch/db.d.ts +4 -0
- package/dist/fetch/db.d.ts.map +1 -1
- package/dist/fetch/db.js +10 -0
- package/dist/fetch/db.js.map +1 -1
- package/dist/fetch/errors.d.ts +1 -1
- package/dist/fetch/errors.d.ts.map +1 -1
- package/dist/fetch/errors.js.map +1 -1
- package/dist/fetch/feishu.d.ts +33 -9
- package/dist/fetch/feishu.d.ts.map +1 -1
- package/dist/fetch/feishu.js +137 -23
- package/dist/fetch/feishu.js.map +1 -1
- package/dist/fetch/index.d.ts +4 -4
- package/dist/fetch/index.d.ts.map +1 -1
- package/dist/fetch/index.js +3 -3
- package/dist/fetch/index.js.map +1 -1
- package/dist/fetch/paths.d.ts +5 -3
- package/dist/fetch/paths.d.ts.map +1 -1
- package/dist/fetch/paths.js +19 -24
- package/dist/fetch/paths.js.map +1 -1
- package/dist/health.d.ts +41 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +580 -0
- package/dist/health.js.map +1 -0
- package/dist/help/helpFile.d.ts +6 -27
- package/dist/help/helpFile.d.ts.map +1 -1
- package/dist/help/helpFile.js +13 -50
- package/dist/help/helpFile.js.map +1 -1
- package/dist/help/helpPaths.d.ts +13 -12
- package/dist/help/helpPaths.d.ts.map +1 -1
- package/dist/help/helpPaths.js +23 -29
- package/dist/help/helpPaths.js.map +1 -1
- package/dist/help/lookup.d.ts.map +1 -1
- package/dist/help/lookup.js +8 -1
- package/dist/help/lookup.js.map +1 -1
- package/dist/help/output.d.ts +15 -14
- package/dist/help/output.d.ts.map +1 -1
- package/dist/help/output.js +40 -53
- package/dist/help/output.js.map +1 -1
- package/dist/help/scenes/help-assets.d.ts +10 -10
- package/dist/help/scenes/help-assets.d.ts.map +1 -1
- package/dist/help/scenes/help-assets.js +10 -10
- package/dist/help/scenes/help-assets.js.map +1 -1
- package/dist/plan/check.d.ts +3 -0
- package/dist/plan/check.d.ts.map +1 -0
- package/dist/plan/check.js +71 -0
- package/dist/plan/check.js.map +1 -0
- package/dist/plan/context.d.ts +18 -0
- package/dist/plan/context.d.ts.map +1 -0
- package/dist/plan/context.js +4 -0
- package/dist/plan/context.js.map +1 -0
- package/dist/plan/ensure.d.ts +4 -0
- package/dist/plan/ensure.d.ts.map +1 -0
- package/dist/plan/ensure.js +140 -0
- package/dist/plan/ensure.js.map +1 -0
- package/dist/plan/index.d.ts +8 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +56 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/iso.d.ts +27 -0
- package/dist/plan/iso.d.ts.map +1 -0
- package/dist/plan/iso.js +55 -0
- package/dist/plan/iso.js.map +1 -0
- package/dist/plan/overview.d.ts +23 -0
- package/dist/plan/overview.d.ts.map +1 -0
- package/dist/plan/overview.js +38 -0
- package/dist/plan/overview.js.map +1 -0
- package/dist/plan/pull.d.ts +25 -0
- package/dist/plan/pull.d.ts.map +1 -0
- package/dist/plan/pull.js +83 -0
- package/dist/plan/pull.js.map +1 -0
- package/dist/plan/receipt.d.ts +52 -0
- package/dist/plan/receipt.d.ts.map +1 -0
- package/dist/plan/receipt.js +57 -0
- package/dist/plan/receipt.js.map +1 -0
- package/dist/plan/remoteDay.d.ts +62 -0
- package/dist/plan/remoteDay.d.ts.map +1 -0
- package/dist/plan/remoteDay.js +102 -0
- package/dist/plan/remoteDay.js.map +1 -0
- package/dist/plan/single.d.ts +4 -0
- package/dist/plan/single.d.ts.map +1 -0
- package/dist/plan/single.js +176 -0
- package/dist/plan/single.js.map +1 -0
- package/dist/plan/sync.d.ts +14 -0
- package/dist/plan/sync.d.ts.map +1 -0
- package/dist/plan/sync.js +158 -0
- package/dist/plan/sync.js.map +1 -0
- package/dist/plan/upsert.d.ts +5 -0
- package/dist/plan/upsert.d.ts.map +1 -0
- package/dist/plan/upsert.js +102 -0
- package/dist/plan/upsert.js.map +1 -0
- package/dist/policy/index.d.ts +2 -2
- package/dist/policy/index.d.ts.map +1 -1
- package/dist/policy/index.js +1 -1
- package/dist/policy/index.js.map +1 -1
- package/dist/policy/plan.d.ts +16 -1
- package/dist/policy/plan.d.ts.map +1 -1
- package/dist/policy/plan.js +51 -1
- package/dist/policy/plan.js.map +1 -1
- package/dist/policy/wakewords.js +4 -4
- package/dist/policy/wakewords.js.map +1 -1
- package/package.json +1 -1
package/dist/health.js
ADDED
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
/** 作息管家自己的配置体检(票 #706):一份只读的报告,回答「我配的东西现在通不通」。
|
|
2
|
+
*
|
|
3
|
+
* 口径(票面「开工前的形状裁定」):
|
|
4
|
+
* · **判据住技能侧**——每条的有效值(库在哪、产物落哪个目录、包内预置件在不在)只有本包算得出来;
|
|
5
|
+
* 插件包与总管只透传与渲染,不重写这里的任何一个字。
|
|
6
|
+
* · **只报不改**——不建目录、不写文件、不落那份默认配置;凡是要建目录才算得出的结论,一律当「不在」报。
|
|
7
|
+
* 所以本件**不许**调 `loadScheduleConfig()`(文件不在即落一份默认件),配置一律本件只读解析
|
|
8
|
+
* (`base-link-core` 的受限子集解析器**没有对外**,见其包门只有四条)。
|
|
9
|
+
* · 报告形状见面板侧镜像 `packages/plugin-manager/src/health-contract.ts`(唯一消费者)。
|
|
10
|
+
*
|
|
11
|
+
* 检查项与检查表 `docs/research/check-table-671-life-panel-20260917.html` 逐条对应:
|
|
12
|
+
* 六家通用 5 条(配置文件本身/数据目录/库文件表数/产物目录/这个值从哪来)
|
|
13
|
+
* + 作息特有 3 条(飞书 CLI/分类允许清单/包内模板目录)。
|
|
14
|
+
* **本家第 4 条(作息第二份库 `daily_recorder.db`)已由编者从检查表里撤回**,见票 #706 的遗留出口
|
|
15
|
+
* (老技能默认链算出的 `D:\.db\daily_recorder.db` 与实测那个不是同一个文件,事实在核)——故未实现,
|
|
16
|
+
* 报告里也不出现这一项。
|
|
17
|
+
*
|
|
18
|
+
* **判据查的路径一律是新仓的**(票面第 2 条「缺配置会怎样按新仓+新机制写」):检查表里那些老仓
|
|
19
|
+
* 文件名(例:分类允许清单的老 `category_whitelist.yaml`)只作注释里的出处,不进用户看到的报文。
|
|
20
|
+
*
|
|
21
|
+
* 本件与卡路里那份 `packages/skill-calorie/src/health.ts` 同形(同一套受限子集解析、同一套写探针、
|
|
22
|
+
* 同一个 `node:sqlite` 只读读表数),只换本家那份配置表与自有项——读的人一眼认得出是同一条链。
|
|
23
|
+
*/
|
|
24
|
+
import { accessSync, constants, existsSync, readdirSync, readFileSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
25
|
+
import { execFileSync } from 'node:child_process';
|
|
26
|
+
import { homedir } from 'node:os';
|
|
27
|
+
import { dirname, join } from 'node:path';
|
|
28
|
+
import { fileURLToPath } from 'node:url';
|
|
29
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
30
|
+
import { configPaths } from 'base-link-core';
|
|
31
|
+
import { SCHEDULE_CONFIG_DEFAULTS, SCHEDULE_CONFIG_STEM } from './config.js';
|
|
32
|
+
/** 库表数门槛:`src/fetch/db.ts` 三张建表(`schedule_records`/`daily_summary`/`schedule_plans`)齐了算正常。 */
|
|
33
|
+
export const DB_TABLE_THRESHOLD = 3;
|
|
34
|
+
const SKILL = 'schedule';
|
|
35
|
+
/** 探测两档超时(与 `src/fetch/feishu.ts` 的 15/30 秒同档)。 */
|
|
36
|
+
const LARK_STATUS_TIMEOUT_MS = 15000;
|
|
37
|
+
const LARK_CALENDAR_TIMEOUT_MS = 30000;
|
|
38
|
+
/** 包根:`dist/health.js` 上一级。 */
|
|
39
|
+
function packageRoot() {
|
|
40
|
+
return join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
41
|
+
}
|
|
42
|
+
/** 人话里的路径一律用正斜杠:报告给页面看,也让跨平台读数可比。 */
|
|
43
|
+
function p(path) {
|
|
44
|
+
return path.replace(/\\/g, '/');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* 只读解析那份配置文件(与 `base-link-core` 的受限子集同一套校验,口径逐条对齐):
|
|
48
|
+
* 剥 BOM、去 `\r`、空行与整行注释跳过、缩进只许 2 个空格且不许制表符、不支持列表、
|
|
49
|
+
* 一行须是「键: 值」、不许重复定义、顶层键冒号后没值即开一个组。
|
|
50
|
+
*
|
|
51
|
+
* 与 `loadConfig()` 的差别只有一处、也正是本件要的那一处:**文件不在时不落默认件**。
|
|
52
|
+
* 取值语义与它一致:文件里缺的项按默认值补。
|
|
53
|
+
*/
|
|
54
|
+
export function readScheduleConfigReadOnly() {
|
|
55
|
+
const file = configPaths(SCHEDULE_CONFIG_STEM).configFile;
|
|
56
|
+
if (!existsSync(file))
|
|
57
|
+
return { kind: 'missing' };
|
|
58
|
+
let text;
|
|
59
|
+
try {
|
|
60
|
+
text = readFileSync(file, 'utf8');
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
return { kind: 'bad', message: '读配置文件失败:' + file + '(' + (e instanceof Error ? e.message : String(e)) + ')' };
|
|
64
|
+
}
|
|
65
|
+
const parsed = parseSubset(text, file);
|
|
66
|
+
if (!parsed.ok)
|
|
67
|
+
return { kind: 'bad', message: parsed.message };
|
|
68
|
+
return { kind: 'ok', values: projectOnDefaults(parsed.values), present: presentKeysOf(parsed.values) };
|
|
69
|
+
}
|
|
70
|
+
/** 文件里真写了哪些键(扁平成 `组.键`):给「这个值从哪来」那条判据用。
|
|
71
|
+
*
|
|
72
|
+
* 为什么不能直接看投到默认值表之后的值:**空串=按默认落点**——留空的项值看起来与默认值一样,
|
|
73
|
+
* 但它的来源是「用户写了空串」,不是「文件里没有这一项」。混起来就会把来源报错。 */
|
|
74
|
+
function presentKeysOf(values) {
|
|
75
|
+
const out = new Set();
|
|
76
|
+
for (const [group, got] of Object.entries(values)) {
|
|
77
|
+
if (typeof got !== 'object' || got === null) {
|
|
78
|
+
out.add(group);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
for (const key of Object.keys(got))
|
|
82
|
+
out.add(group + '.' + key);
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
/** 受限子集的极简解析:只算值与行号,不算别的(校验口径与配置件同一套)。 */
|
|
87
|
+
function parseSubset(text, file) {
|
|
88
|
+
const source = text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
|
|
89
|
+
const lines = source.replace(/\r\n?/g, '\n').split('\n');
|
|
90
|
+
const values = {};
|
|
91
|
+
const lineOf = new Map();
|
|
92
|
+
let openGroup = null;
|
|
93
|
+
let openGroupLine = 0;
|
|
94
|
+
/** 标量解析的失败口:`parseScalar` 把报文写进 `scalarError`,调用处读它即可(不抛,免得类型糊)。 */
|
|
95
|
+
let scalarError = '';
|
|
96
|
+
const fail = (line, why) => ({ ok: false, message: '配置件第 ' + String(line) + ' 行:' + why + '(文件:' + file + ')' });
|
|
97
|
+
const closeGroup = () => {
|
|
98
|
+
if (openGroup !== null && Object.keys(values[openGroup]).length === 0) {
|
|
99
|
+
return fail(openGroupLine, '键「' + openGroup + '」冒号后没有值,也没有子项').message;
|
|
100
|
+
}
|
|
101
|
+
openGroup = null;
|
|
102
|
+
return null;
|
|
103
|
+
};
|
|
104
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
105
|
+
const lineNo = i + 1;
|
|
106
|
+
const raw = lines[i] ?? '';
|
|
107
|
+
if (raw.trim() === '')
|
|
108
|
+
continue;
|
|
109
|
+
if (/^\s*#/.test(raw))
|
|
110
|
+
continue;
|
|
111
|
+
const head = /^[ \t]*/.exec(raw)?.[0] ?? '';
|
|
112
|
+
const body = raw.slice(head.length);
|
|
113
|
+
if (head.includes('\t'))
|
|
114
|
+
return fail(lineNo, '缩进里有制表符:本子集只许空格,且嵌套缩进恰好 2 个空格');
|
|
115
|
+
if (body.startsWith('-'))
|
|
116
|
+
return fail(lineNo, '本子集不支持列表(「-」开头的行)');
|
|
117
|
+
const matched = /^([A-Za-z_][A-Za-z0-9_.-]*)[ \t]*:[ \t]*(.*)$/.exec(body);
|
|
118
|
+
if (matched === null)
|
|
119
|
+
return fail(lineNo, '不是「键: 值」形状:' + body.trim());
|
|
120
|
+
const key = matched[1];
|
|
121
|
+
const rest = (matched[2] ?? '').trim();
|
|
122
|
+
if (head.length > 0) {
|
|
123
|
+
if (head.length !== 2)
|
|
124
|
+
return fail(lineNo, '缩进必须恰好 2 个空格(本子集只支持一层嵌套),实为 ' + String(head.length) + ' 个空格');
|
|
125
|
+
if (openGroup === null)
|
|
126
|
+
return fail(lineNo, '缩进的子项「' + key + '」上面没有开着子的顶层键');
|
|
127
|
+
const group = values[openGroup];
|
|
128
|
+
if (Object.prototype.hasOwnProperty.call(group, key)) {
|
|
129
|
+
return fail(lineNo, '键「' + openGroup + '.' + key + '」重复定义(第 ' + String(lineOf.get(openGroup + '.' + key)) + ' 行已定义)');
|
|
130
|
+
}
|
|
131
|
+
if (rest === '')
|
|
132
|
+
return fail(lineNo, '键「' + openGroup + '.' + key + '」冒号后没有值');
|
|
133
|
+
const scalar = parseScalar(rest, lineNo, fail, (message) => {
|
|
134
|
+
scalarError = message;
|
|
135
|
+
});
|
|
136
|
+
if (scalarError !== '')
|
|
137
|
+
return { ok: false, message: scalarError };
|
|
138
|
+
group[key] = scalar;
|
|
139
|
+
lineOf.set(openGroup + '.' + key, lineNo);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const closedError = closeGroup();
|
|
143
|
+
if (closedError !== null)
|
|
144
|
+
return { ok: false, message: closedError };
|
|
145
|
+
if (Object.prototype.hasOwnProperty.call(values, key)) {
|
|
146
|
+
return fail(lineNo, '键「' + key + '」重复定义(第 ' + String(lineOf.get(key)) + ' 行已定义)');
|
|
147
|
+
}
|
|
148
|
+
lineOf.set(key, lineNo);
|
|
149
|
+
if (rest === '') {
|
|
150
|
+
values[key] = {};
|
|
151
|
+
openGroup = key;
|
|
152
|
+
openGroupLine = lineNo;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const scalar = parseScalar(rest, lineNo, fail, (message) => {
|
|
156
|
+
scalarError = message;
|
|
157
|
+
});
|
|
158
|
+
if (scalarError !== '')
|
|
159
|
+
return { ok: false, message: scalarError };
|
|
160
|
+
values[key] = scalar;
|
|
161
|
+
}
|
|
162
|
+
const tailError = closeGroup();
|
|
163
|
+
if (tailError !== null)
|
|
164
|
+
return { ok: false, message: tailError };
|
|
165
|
+
return { ok: true, values };
|
|
166
|
+
}
|
|
167
|
+
/** 标量:带引号/数字/布尔/裸字符串(值后的 `#` 注释照配置件同一口径切掉)。 */
|
|
168
|
+
function parseScalar(text, lineNo, fail, onError) {
|
|
169
|
+
const first = text[0];
|
|
170
|
+
if (first === '"' || first === "'") {
|
|
171
|
+
const quote = first;
|
|
172
|
+
let out = '';
|
|
173
|
+
let i = 1;
|
|
174
|
+
let closed = false;
|
|
175
|
+
for (; i < text.length; i += 1) {
|
|
176
|
+
const ch = text[i];
|
|
177
|
+
if (ch === quote) {
|
|
178
|
+
if (quote === "'" && text[i + 1] === "'") {
|
|
179
|
+
out += "'";
|
|
180
|
+
i += 1;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
closed = true;
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
if (quote === '"' && ch === '\\') {
|
|
187
|
+
const next = text[i + 1];
|
|
188
|
+
out += next === 'n' ? '\n' : next === 't' ? '\t' : (next ?? '');
|
|
189
|
+
i += 1;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
out += ch;
|
|
193
|
+
}
|
|
194
|
+
if (!closed) {
|
|
195
|
+
onError(fail(lineNo, '引号没有闭合:' + text).message);
|
|
196
|
+
return '';
|
|
197
|
+
}
|
|
198
|
+
return out;
|
|
199
|
+
}
|
|
200
|
+
let cut = text.length;
|
|
201
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
202
|
+
if (text[i] === '#' && (i === 0 || /\s/.test(text[i - 1]))) {
|
|
203
|
+
cut = i;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
const body = text.slice(0, cut).trim();
|
|
208
|
+
if (body === '') {
|
|
209
|
+
onError(fail(lineNo, '冒号后没有值(只有注释)').message);
|
|
210
|
+
return '';
|
|
211
|
+
}
|
|
212
|
+
if (body === 'true')
|
|
213
|
+
return true;
|
|
214
|
+
if (body === 'false')
|
|
215
|
+
return false;
|
|
216
|
+
if (/^-?(\d+\.?\d*|\.\d+)$/.test(body))
|
|
217
|
+
return Number(body);
|
|
218
|
+
return body;
|
|
219
|
+
}
|
|
220
|
+
/** 把文件里读到的取值投到默认值表的形状上(缺项补默认值;组内只取默认值表认得的键)。 */
|
|
221
|
+
function projectOnDefaults(values) {
|
|
222
|
+
const out = {};
|
|
223
|
+
for (const [group, def] of Object.entries(SCHEDULE_CONFIG_DEFAULTS)) {
|
|
224
|
+
const bucket = {};
|
|
225
|
+
const got = values[group];
|
|
226
|
+
const source = typeof got === 'object' && got !== null ? got : {};
|
|
227
|
+
for (const [key, defValue] of Object.entries(def)) {
|
|
228
|
+
const mine = source[key];
|
|
229
|
+
bucket[key] = typeof mine === typeof defValue ? mine : defValue;
|
|
230
|
+
}
|
|
231
|
+
out[group] = bucket;
|
|
232
|
+
}
|
|
233
|
+
return out;
|
|
234
|
+
}
|
|
235
|
+
/** 取值:一层嵌套按 `组.键` 读(缺层或类型不符回 undefined)。 */
|
|
236
|
+
function readValue(values, group, key) {
|
|
237
|
+
return values[group]?.[key];
|
|
238
|
+
}
|
|
239
|
+
/** 有值的字符串(空串=未配,按 `undefined` 处理,语义与各取用处一致)。 */
|
|
240
|
+
function textOf(value) {
|
|
241
|
+
return typeof value === 'string' && value.trim() !== '' ? value : '';
|
|
242
|
+
}
|
|
243
|
+
/** 「这个值从哪来」:真在文件里写了就是「配置文件」,否则按默认值(文件不存在则全按默认值)。 */
|
|
244
|
+
function sourceOf(present, key) {
|
|
245
|
+
return present.has(key) ? '配置文件' : '默认值';
|
|
246
|
+
}
|
|
247
|
+
/** 目录那一项的形状是**段串**(本家默认 `schedule_html/help` 两段),段数与 `src/config.ts` 自己的
|
|
248
|
+
* `splitDirSegments` 同一口径。本件不 import 它:health 面与配置面互锁没有好处,而这条规则只有三行。 */
|
|
249
|
+
function splitDirSegments(value) {
|
|
250
|
+
return value.split(/[\\/]+/).filter((s) => s.length > 0);
|
|
251
|
+
}
|
|
252
|
+
/** 目录能不能写:建一个探针文件再删掉(老技能三家同一套做法)。**不建目录本身**。 */
|
|
253
|
+
function writeProbe(dir) {
|
|
254
|
+
const probe = join(dir, '.ilife-health-probe-' + String(process.pid) + '-' + String(Date.now()));
|
|
255
|
+
try {
|
|
256
|
+
writeFileSync(probe, 'probe', { encoding: 'utf8', flag: 'wx' });
|
|
257
|
+
unlinkSync(probe);
|
|
258
|
+
return { ok: true, reason: '' };
|
|
259
|
+
}
|
|
260
|
+
catch (e) {
|
|
261
|
+
return { ok: false, reason: e instanceof Error ? e.message : String(e) };
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/** 已算过的目录结论按路径记一份:同一份报告里同一个目录不重复起写探针。 */
|
|
265
|
+
const dirMemo = new Map();
|
|
266
|
+
function dirVerdict(dir) {
|
|
267
|
+
const memoized = dirMemo.get(dir);
|
|
268
|
+
if (memoized !== undefined)
|
|
269
|
+
return memoized;
|
|
270
|
+
const verdict = dirVerdictUncached(dir);
|
|
271
|
+
dirMemo.set(dir, verdict);
|
|
272
|
+
return verdict;
|
|
273
|
+
}
|
|
274
|
+
function dirVerdictUncached(dir) {
|
|
275
|
+
if (!existsSync(dir))
|
|
276
|
+
return { exists: false, writable: false, reason: '' };
|
|
277
|
+
try {
|
|
278
|
+
if (!statSync(dir).isDirectory())
|
|
279
|
+
return { exists: false, writable: false, reason: '同名文件占了它的位置' };
|
|
280
|
+
}
|
|
281
|
+
catch (e) {
|
|
282
|
+
return { exists: false, writable: false, reason: e instanceof Error ? e.message : String(e) };
|
|
283
|
+
}
|
|
284
|
+
const probe = writeProbe(dir);
|
|
285
|
+
return { exists: true, writable: probe.ok, reason: probe.reason };
|
|
286
|
+
}
|
|
287
|
+
/** 模板件数:把 `templates/` 数一遍(只数 `.html`,含子目录;读不出来的子树按 0 计)。
|
|
288
|
+
* 报文里给这个数,是为了让「包内模板目录在不在」这句话能自证——件数对不上就是包装不完整。 */
|
|
289
|
+
function templateFileCount(dir) {
|
|
290
|
+
let entries;
|
|
291
|
+
try {
|
|
292
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
return 0;
|
|
296
|
+
}
|
|
297
|
+
let out = 0;
|
|
298
|
+
for (const entry of entries) {
|
|
299
|
+
out += entry.isDirectory()
|
|
300
|
+
? templateFileCount(join(dir, entry.name))
|
|
301
|
+
: (entry.name.endsWith('.html') ? 1 : 0);
|
|
302
|
+
}
|
|
303
|
+
return out;
|
|
304
|
+
}
|
|
305
|
+
/** 开库读表数(只读打开,不建库、不迁移)。打不开即当作「读不出」。 */
|
|
306
|
+
function tableCount(file) {
|
|
307
|
+
let db = null;
|
|
308
|
+
try {
|
|
309
|
+
db = new DatabaseSync(file, { readOnly: true });
|
|
310
|
+
const rows = db.prepare("SELECT name FROM sqlite_master WHERE type = 'table'").all();
|
|
311
|
+
const names = rows.map((row) => String(row.name ?? '')).filter((name) => name !== '' && !name.startsWith('sqlite_'));
|
|
312
|
+
return { ok: true, count: names.length, reason: '' };
|
|
313
|
+
}
|
|
314
|
+
catch (e) {
|
|
315
|
+
return { ok: false, count: 0, reason: e instanceof Error ? e.message : String(e) };
|
|
316
|
+
}
|
|
317
|
+
finally {
|
|
318
|
+
try {
|
|
319
|
+
db?.close();
|
|
320
|
+
}
|
|
321
|
+
catch {
|
|
322
|
+
/* 关不掉不影响结论 */
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/** lark-cli 在哪:**照 `src/fetch/feishu.ts` 的取法重写一份只读探测**,不 import 那个模块——
|
|
327
|
+
* 它的 `findLarkCli()` 要经 `loadScheduleConfig()` 取显式值,那会在文件不在时落一份默认配置,
|
|
328
|
+
* 与本件的「只报不改」相反。候选顺序与它逐条对齐:配置项 `lark.cliPath` → Windows npm 全局
|
|
329
|
+
* → `where`/`which` → 固定路径;找不到返 null(不抛)。 */
|
|
330
|
+
function findLarkCli(configured) {
|
|
331
|
+
if (configured !== '') {
|
|
332
|
+
try {
|
|
333
|
+
accessSync(configured, constants.X_OK);
|
|
334
|
+
return configured;
|
|
335
|
+
}
|
|
336
|
+
catch {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (process.platform === 'win32') {
|
|
341
|
+
const cand = join(homedir(), 'AppData', 'Roaming', 'npm', 'lark-cli.cmd');
|
|
342
|
+
try {
|
|
343
|
+
accessSync(cand, constants.X_OK);
|
|
344
|
+
return cand;
|
|
345
|
+
}
|
|
346
|
+
catch { /* 继续 */ }
|
|
347
|
+
try {
|
|
348
|
+
const out = execFileSync('where', ['lark-cli'], { stdio: 'pipe', encoding: 'utf8' }).split(/\r?\n/)[0].trim();
|
|
349
|
+
if (out)
|
|
350
|
+
return out;
|
|
351
|
+
}
|
|
352
|
+
catch { /* 继续 */ }
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
try {
|
|
356
|
+
const out = execFileSync('which', ['lark-cli'], { stdio: 'pipe', encoding: 'utf8' }).trim();
|
|
357
|
+
if (out)
|
|
358
|
+
return out.split('\n')[0];
|
|
359
|
+
}
|
|
360
|
+
catch { /* 继续 */ }
|
|
361
|
+
}
|
|
362
|
+
for (const cand of ['/usr/local/bin/lark-cli', '/usr/bin/lark-cli']) {
|
|
363
|
+
try {
|
|
364
|
+
accessSync(cand, constants.X_OK);
|
|
365
|
+
return cand;
|
|
366
|
+
}
|
|
367
|
+
catch { /* 继续 */ }
|
|
368
|
+
}
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
/** 调一次 lark-cli(只读子命令):同一套 Windows `cmd.exe /d /s /c` 中转(`.cmd` 直 spawn 报 EINVAL)。
|
|
372
|
+
* 失败一律回 `{ok:false}`,**不抛**——体检不许因为探测失败而崩。 */
|
|
373
|
+
function runLark(cli, args, timeoutMs) {
|
|
374
|
+
let file = cli;
|
|
375
|
+
let argv = args;
|
|
376
|
+
if (process.platform === 'win32' && /\.cmd$/i.test(cli)) {
|
|
377
|
+
file = 'cmd.exe';
|
|
378
|
+
argv = ['/d', '/s', '/c', cli, ...args];
|
|
379
|
+
}
|
|
380
|
+
try {
|
|
381
|
+
return { ok: true, stdout: execFileSync(file, argv, { stdio: 'pipe', encoding: 'utf8', timeout: timeoutMs }) };
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
return { ok: false, stdout: '' };
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/** 飞书三档(老 `setup_scenarios.py` 的 `tier` 三档现成):找不到 CLI=missing;已装但未授权或
|
|
388
|
+
* 日历不可写=partial;已授权且日历可写=full。能探测到哪一档就报哪一档——CLI 都不在就停在第 1 档,
|
|
389
|
+
* **不往下起子进程试登录**。 */
|
|
390
|
+
function larkTier(cli) {
|
|
391
|
+
if (cli === null)
|
|
392
|
+
return 'missing';
|
|
393
|
+
const status = runLark(cli, ['auth', 'status'], LARK_STATUS_TIMEOUT_MS);
|
|
394
|
+
if (!status.ok)
|
|
395
|
+
return 'partial';
|
|
396
|
+
let openId = '';
|
|
397
|
+
try {
|
|
398
|
+
const j = JSON.parse(status.stdout);
|
|
399
|
+
const id = j.identities?.user?.openId;
|
|
400
|
+
if (typeof id === 'string')
|
|
401
|
+
openId = id;
|
|
402
|
+
}
|
|
403
|
+
catch {
|
|
404
|
+
return 'partial';
|
|
405
|
+
}
|
|
406
|
+
if (openId === '')
|
|
407
|
+
return 'partial';
|
|
408
|
+
return runLark(cli, ['calendar', '+agenda'], LARK_CALENDAR_TIMEOUT_MS).ok ? 'full' : 'partial';
|
|
409
|
+
}
|
|
410
|
+
/** 跑一次体检,返回整份报告。**只读**:任何一处都不落盘(只有写探针那一个文件,且当场删掉)。 */
|
|
411
|
+
export function buildScheduleHealthReport() {
|
|
412
|
+
const paths = configPaths(SCHEDULE_CONFIG_STEM);
|
|
413
|
+
const items = [];
|
|
414
|
+
const read = readScheduleConfigReadOnly();
|
|
415
|
+
const values = read.kind === 'ok' ? read.values : projectOnDefaults({});
|
|
416
|
+
const present = read.kind === 'ok' ? read.present : new Set();
|
|
417
|
+
// ① 配置文件本身:能不能解析;它落在默认位置还是被 ILIFE_CONFIG_DIR 指到别处(只陈述,不评价)。
|
|
418
|
+
const defaultConfigFile = join(homedir(), '.ilife', SCHEDULE_CONFIG_STEM + '.yaml');
|
|
419
|
+
const relocated = paths.configFile !== defaultConfigFile;
|
|
420
|
+
const where = relocated ? '位置被 ILIFE_CONFIG_DIR 指到这里' : '默认位置';
|
|
421
|
+
if (read.kind === 'bad') {
|
|
422
|
+
items.push({
|
|
423
|
+
id: 'config.file', title: '配置文件', status: 'red',
|
|
424
|
+
message: read.message,
|
|
425
|
+
action: '照报文指的行号改回「键: 值」的写法;改不动就删掉这个文件,让技能按默认值重落一份。',
|
|
426
|
+
source: '配置文件',
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
else if (read.kind === 'missing') {
|
|
430
|
+
items.push({
|
|
431
|
+
id: 'config.file', title: '配置文件', status: 'yellow',
|
|
432
|
+
message: '配置文件还不存在:' + p(paths.configFile) + '(现在跑的是默认值)。',
|
|
433
|
+
action: '在面板上保存一次即会落一份;也可点「重置为默认」。',
|
|
434
|
+
source: '默认值',
|
|
435
|
+
});
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
items.push({
|
|
439
|
+
id: 'config.file', title: '配置文件', status: 'green',
|
|
440
|
+
message: '能解析:' + p(paths.configFile) + '(' + where + ')。',
|
|
441
|
+
action: '',
|
|
442
|
+
source: '配置文件',
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
// ② 数据目录:在不在、能不能写。
|
|
446
|
+
const dbDirConfigured = textOf(readValue(values, 'db', 'dir'));
|
|
447
|
+
const dataDir = dbDirConfigured !== '' ? dbDirConfigured : paths.dataDir;
|
|
448
|
+
const dataDirSource = sourceOf(present, 'db.dir');
|
|
449
|
+
const dataDirVerdict = dirVerdict(dataDir);
|
|
450
|
+
items.push({
|
|
451
|
+
id: 'db.dir', title: '数据目录',
|
|
452
|
+
status: !dataDirVerdict.exists || !dataDirVerdict.writable ? 'red' : 'green',
|
|
453
|
+
message: !dataDirVerdict.exists
|
|
454
|
+
? '不在:' + p(dataDir) + (dataDirVerdict.reason !== '' ? '(' + dataDirVerdict.reason + ')' : '')
|
|
455
|
+
: dataDirVerdict.writable
|
|
456
|
+
? '在且能写:' + p(dataDir) + '。'
|
|
457
|
+
: '在,但写不进去:' + p(dataDir) + '(' + dataDirVerdict.reason + ')。',
|
|
458
|
+
action: !dataDirVerdict.exists
|
|
459
|
+
? '先建这个目录,或把配置里的「数据目录」改到一个已存在的位置。'
|
|
460
|
+
: dataDirVerdict.writable ? '' : '去掉这个目录的只读属性,或把「数据目录」改到别处。',
|
|
461
|
+
source: dataDirSource,
|
|
462
|
+
});
|
|
463
|
+
// ③ 库文件:在不在 + 表数够不够。
|
|
464
|
+
const dbNameConfigured = textOf(readValue(values, 'db', 'name'));
|
|
465
|
+
const dbName = dbNameConfigured !== '' ? dbNameConfigured : String(SCHEDULE_CONFIG_DEFAULTS.db.name);
|
|
466
|
+
const dbFile = join(dataDir, dbName);
|
|
467
|
+
const dbSource = sourceOf(present, 'db.name');
|
|
468
|
+
if (!existsSync(dbFile)) {
|
|
469
|
+
items.push({
|
|
470
|
+
id: 'db.file', title: '库文件', status: 'red',
|
|
471
|
+
message: '不在:' + p(dbFile) + '。',
|
|
472
|
+
action: '确认「数据目录」与「库文件名」对不对;新装的话,跑一条会写库的命令即会建库。',
|
|
473
|
+
source: dbSource,
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
else {
|
|
477
|
+
const tables = tableCount(dbFile);
|
|
478
|
+
if (!tables.ok) {
|
|
479
|
+
items.push({
|
|
480
|
+
id: 'db.file', title: '库文件', status: 'red',
|
|
481
|
+
message: '在,但打不开:' + p(dbFile) + '(' + tables.reason + ')。',
|
|
482
|
+
action: '这个文件可能不是库文件或已损坏;先备份,再看要不要让技能重建一份。',
|
|
483
|
+
source: dbSource,
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
else if (tables.count < DB_TABLE_THRESHOLD) {
|
|
487
|
+
items.push({
|
|
488
|
+
id: 'db.file', title: '库文件', status: 'yellow',
|
|
489
|
+
message: '在,但表不全:' + p(dbFile) + '(' + String(tables.count) + ' / ' + String(DB_TABLE_THRESHOLD) + ' 张表)。',
|
|
490
|
+
action: '待建库(开始初始化):缺表会让对应的功能报错,跑一次会写库的命令让它补齐。',
|
|
491
|
+
source: dbSource,
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
items.push({
|
|
496
|
+
id: 'db.file', title: '库文件', status: 'green',
|
|
497
|
+
message: '在,' + String(tables.count) + ' 张表齐:' + p(dbFile) + '。',
|
|
498
|
+
action: '',
|
|
499
|
+
source: dbSource,
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
// ④ 产物目录:在不在、能不能写(还没建=绿:交付页面时才落这里,那时自动建)。
|
|
504
|
+
const htmlDirValue = textOf(readValue(values, 'html', 'dir'));
|
|
505
|
+
const htmlDir = join(dataDir, ...splitDirSegments(htmlDirValue !== '' ? htmlDirValue : String(SCHEDULE_CONFIG_DEFAULTS.html.dir)));
|
|
506
|
+
const htmlVerdict = dirVerdict(htmlDir);
|
|
507
|
+
const htmlSource = sourceOf(present, 'html.dir');
|
|
508
|
+
items.push({
|
|
509
|
+
id: 'html.dir', title: '产物目录',
|
|
510
|
+
status: !htmlVerdict.exists ? 'green' : htmlVerdict.writable ? 'green' : 'yellow',
|
|
511
|
+
message: !htmlVerdict.exists
|
|
512
|
+
? '还没建:' + p(htmlDir) + '(交付页面时才落这里,那时自动建)。'
|
|
513
|
+
: htmlVerdict.writable
|
|
514
|
+
? '在且能写:' + p(htmlDir) + '。'
|
|
515
|
+
: '在,但写不进去:' + p(htmlDir) + '(交付会转成内联回执,不再落盘)。',
|
|
516
|
+
action: !htmlVerdict.exists || htmlVerdict.writable ? '' : '去掉这个目录的只读属性,或把「HTML 产物目录名」改到别处。',
|
|
517
|
+
source: htmlSource,
|
|
518
|
+
});
|
|
519
|
+
// ⑤ 这个值从哪来:只陈述数据目录与库文件名的来源,不判好坏(六家通用最后一条)。
|
|
520
|
+
items.push({
|
|
521
|
+
id: 'value.source', title: '这个值从哪来', status: 'green',
|
|
522
|
+
message: '数据目录走「' + dataDirSource + '」,库文件名走「' + dbSource + '」'
|
|
523
|
+
+ (read.kind === 'missing' ? '(配置文件还不存在,落点全按默认值)。' : '。'),
|
|
524
|
+
action: '', source: dataDirSource,
|
|
525
|
+
});
|
|
526
|
+
// ⑥ 飞书 CLI(作息特有):三档——missing=黄/partial=黄/full=绿。三档话术逐字照抄老技能
|
|
527
|
+
// `scripts/setup_scenarios.py:181-192` 的 `_feishu_item`;装法那句也是老技能自己的
|
|
528
|
+
// `install_cmds`/`auth_note`(`:206-212`,含「npm 上 lark-cli 是僵尸包」那条警告)。
|
|
529
|
+
const larkConfigured = textOf(readValue(values, 'lark', 'cliPath'));
|
|
530
|
+
const larkCli = findLarkCli(larkConfigured);
|
|
531
|
+
const tier = larkTier(larkCli);
|
|
532
|
+
const larkWhere = larkCli === null ? '' : p(larkCli);
|
|
533
|
+
items.push({
|
|
534
|
+
id: 'lark.cli', title: '飞书 CLI',
|
|
535
|
+
status: tier === 'full' ? 'green' : 'yellow',
|
|
536
|
+
message: tier === 'full'
|
|
537
|
+
? '飞书同步已配置(lark-cli 已授权,日历可写),配合飞书效果最好(' + larkWhere + ')。'
|
|
538
|
+
: tier === 'partial'
|
|
539
|
+
? '飞书同步配置不完整(lark-cli 已装但未授权或日历不可写)。'
|
|
540
|
+
: '飞书同步未配置(强烈建议配置 · 配合飞书效果最好;不配则飞书同步不可用)。',
|
|
541
|
+
action: tier === 'full'
|
|
542
|
+
? ''
|
|
543
|
+
: tier === 'partial'
|
|
544
|
+
? '说「配置飞书」补全授权'
|
|
545
|
+
: '说「配置飞书」补装(npm install -g @larksuite/cli;官方包是 @larksuite/cli(bin 名 lark-cli),npm 上 lark-cli 是僵尸包,严禁安装)',
|
|
546
|
+
source: larkConfigured !== '' ? '配置文件' : '默认值',
|
|
547
|
+
});
|
|
548
|
+
// ⑦ 分类允许清单(作息特有):查的是**新仓这份实现**=`src/policy/category.ts`
|
|
549
|
+
// (`LEVEL1_WHITELIST` 一级 8 个固定 + `DEFAULT_WHITELIST` 二级内置默认,见该件 :2-3 的口径)。
|
|
550
|
+
// 老仓那个 `category_whitelist.yaml`(以及它那句逐字 action,出处 `scripts/setup_scenarios.py:230-231`)
|
|
551
|
+
// 只作注释里的出处,不出现报文里——新仓没有那个文件,用户 YAML 增量也不迁。
|
|
552
|
+
// 不在=黄:包内源码件,缺了多半是包装坏了,重装即补齐。
|
|
553
|
+
const whitelistSource = join(packageRoot(), 'src', 'policy', 'category.ts');
|
|
554
|
+
const whitelistExists = existsSync(whitelistSource);
|
|
555
|
+
items.push({
|
|
556
|
+
id: 'whitelist.file', title: '分类允许清单',
|
|
557
|
+
// 档位与 action 都照检查表原话(`docs/research/check-table-671-life-panel-20260917.html` 作息那行:
|
|
558
|
+
// 「不在=红(action 文案逐字有)」)。中间几轮曾按新仓事实下调成黄、并换掉那句逐字 action——
|
|
559
|
+
// 那是改判据,对抗式审查两轴都点了;这里还原成检查表的写法。
|
|
560
|
+
status: whitelistExists ? 'green' : 'red',
|
|
561
|
+
message: whitelistExists
|
|
562
|
+
? '在:' + p(whitelistSource) + '(新仓的分类允许清单住这里:一级固定 + 二级内置默认)。'
|
|
563
|
+
: '不在:' + p(whitelistSource) + '(新仓的分类允许清单;包内源码件,缺了多半是包装坏了)。',
|
|
564
|
+
action: whitelistExists ? '' : '缺失 category_whitelist.yaml,请检查技能目录完整性',
|
|
565
|
+
});
|
|
566
|
+
// ⑧ 包内模板目录(作息特有):业务页模板是包内固定件,缺了页面就渲染不出来 ⇒ 红。报文给件数。
|
|
567
|
+
const templatesDir = join(packageRoot(), 'templates');
|
|
568
|
+
const templatesOk = existsSync(templatesDir);
|
|
569
|
+
const templateCount = templatesOk ? templateFileCount(templatesDir) : 0;
|
|
570
|
+
items.push({
|
|
571
|
+
id: 'templates.dir', title: '包内模板目录',
|
|
572
|
+
status: templatesOk ? 'green' : 'red',
|
|
573
|
+
message: templatesOk
|
|
574
|
+
? '在,' + String(templateCount) + ' 件模板:' + p(templatesDir) + '。'
|
|
575
|
+
: '不在:' + p(templatesDir) + '。',
|
|
576
|
+
action: templatesOk ? '' : '技能包装得不完整:重装这个技能包,或跑一次它的构建。',
|
|
577
|
+
});
|
|
578
|
+
return { skill: SKILL, configPath: p(paths.configFile), dataDir: p(dataDir), items };
|
|
579
|
+
}
|
|
580
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC5H,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAqB7E,8FAA8F;AAC9F,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAU,CAAC;AAE7C,MAAM,KAAK,GAAG,UAAmB,CAAC;AAElC,mDAAmD;AACnD,MAAM,sBAAsB,GAAG,KAAc,CAAC;AAC9C,MAAM,wBAAwB,GAAG,KAAc,CAAC;AAEhD,+BAA+B;AAC/B,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,qCAAqC;AACrC,SAAS,CAAC,CAAC,IAAY;IACrB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAQD;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B;IACxC,MAAM,IAAI,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC,UAAU,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClD,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC;IAChH,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAChE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;AACzG,CAAC;AAED;;;6CAG6C;AAC7C,SAAS,aAAa,CAAC,MAA+B;IACpD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YAC5C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0CAA0C;AAC1C,SAAS,WAAW,CAAC,IAAY,EAAE,IAAY;IAG7C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,oEAAoE;IACpE,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAc,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC;IAC1I,MAAM,UAAU,GAAG,GAAkB,EAAE;QACrC,IAAI,SAAS,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAA4B,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjG,OAAO,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,SAAS,GAAG,eAAe,CAAC,CAAC,OAAO,CAAC;QACzE,CAAC;QACD,SAAS,GAAG,IAAI,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;QACrB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QAChC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,SAAS;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,+CAA+C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAW,CAAC;QACjC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC,MAAM,EAAE,8BAA8B,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;YAC1G,IAAI,SAAS,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC,MAAM,EAAE,QAAQ,GAAG,GAAG,GAAG,cAAc,CAAC,CAAC;YAC7E,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAA4B,CAAC;YAC3D,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YACxH,CAAC;YACD,IAAI,IAAI,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,SAAS,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;gBACzD,WAAW,GAAG,OAAO,CAAC;YACxB,CAAC,CAAC,CAAC;YACH,IAAI,WAAW,KAAK,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;YACnE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,GAAG,GAAG,GAAG,EAAE,MAAM,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC;QACjC,IAAI,WAAW,KAAK,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACrE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,GAAG,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxB,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACjB,SAAS,GAAG,GAAG,CAAC;YAChB,aAAa,GAAG,MAAM,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YACzD,WAAW,GAAG,OAAO,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,IAAI,WAAW,KAAK,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACnE,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;IACvB,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IACjE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;AAED,+CAA+C;AAC/C,SAAS,WAAW,CAClB,IAAY,EACZ,MAAc,EACd,IAAqF,EACrF,OAAkC;IAElC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,KAAK,CAAC;QACpB,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;gBACjB,IAAI,KAAK,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBACzC,GAAG,IAAI,GAAG,CAAC;oBACX,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC;gBACd,MAAM;YACR,CAAC;YACD,IAAI,KAAK,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAChE,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,GAAG,IAAI,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;YAChD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAW,CAAC,CAAC,EAAE,CAAC;YACrE,GAAG,GAAG,CAAC,CAAC;YACR,MAAM;QACR,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACjC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gDAAgD;AAChD,SAAS,iBAAiB,CAAC,MAA+B;IACxD,MAAM,GAAG,GAA4C,EAAE,CAAC;IACxD,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,EAAE,CAAC;QACpE,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAE,GAA+B,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/F,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAA8B,CAAC,EAAE,CAAC;YAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,IAAI,KAAK,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4CAA4C;AAC5C,SAAS,SAAS,CAAC,MAA+C,EAAE,KAAa,EAAE,GAAW;IAC5F,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,gDAAgD;AAChD,SAAS,MAAM,CAAC,KAAc;IAC5B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,oDAAoD;AACpD,SAAS,QAAQ,CAAC,OAA4B,EAAE,GAAW;IACzD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3C,CAAC;AAED;yEACyE;AACzE,SAAS,gBAAgB,CAAC,KAAa;IACrC,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC3D,CAAC;AASD,gDAAgD;AAChD,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC;QACH,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,yCAAyC;AACzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;AAE9C,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAC5E,IAAI,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IACpG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;AACpE,CAAC;AAED;mDACmD;AACnD,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE;YACxB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,uCAAuC;AACvC,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,EAAE,GAAwB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,EAAE,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC,GAAG,EAA+B,CAAC;QAClH,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QACrH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACvD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,EAAE,EAAE,KAAK,EAAE,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;8CAG8C;AAC9C,SAAS,WAAW,CAAC,UAAkB;IACrC,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,UAAU,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAC1E,IAAI,CAAC;YAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9G,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5F,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,CAAC,yBAAyB,EAAE,mBAAmB,CAAC,EAAE,CAAC;QACpE,IAAI,CAAC;YAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YAAC,OAAO,IAAI,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;+CAC+C;AAC/C,SAAS,OAAO,CAAC,GAAW,EAAE,IAAc,EAAE,SAAiB;IAC7D,IAAI,IAAI,GAAG,GAAG,CAAC;IACf,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxD,IAAI,GAAG,SAAS,CAAC;QACjB,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IACjH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;sBAEsB;AACtB,SAAS,QAAQ,CAAC,GAAkB;IAClC,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACxE,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IACjC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAqD,CAAC;QACxF,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC;QACtC,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,MAAM,GAAG,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACjG,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,yBAAyB;IACvC,MAAM,KAAK,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAChD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,IAAI,GAAG,0BAA0B,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAwB,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,EAAU,CAAC;IAE3F,4DAA4D;IAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC;IACpF,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,KAAK,iBAAiB,CAAC;IACzD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,MAAM,CAAC;IAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK;YAC/C,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,4CAA4C;YACpD,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ;YAClD,OAAO,EAAE,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,aAAa;YAC1D,MAAM,EAAE,2BAA2B;YACnC,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;YACjD,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI;YAC1D,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IACzE,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM;QAC3B,MAAM,EAAE,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;QAC5E,OAAO,EAAE,CAAC,cAAc,CAAC,MAAM;YAC7B,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9F,CAAC,CAAC,cAAc,CAAC,QAAQ;gBACvB,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG;gBAC5B,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG,GAAG,cAAc,CAAC,MAAM,GAAG,IAAI;QAClE,MAAM,EAAE,CAAC,cAAc,CAAC,MAAM;YAC5B,CAAC,CAAC,gCAAgC;YAClC,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,2BAA2B;QAC9D,MAAM,EAAE,aAAa;KACtB,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,gBAAgB,KAAK,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACrG,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;YAC1C,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG;YAChC,MAAM,EAAE,wCAAwC;YAChD,MAAM,EAAE,QAAQ;SACjB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;gBAC1C,OAAO,EAAE,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI;gBAC3D,MAAM,EAAE,mCAAmC;gBAC3C,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,MAAM,CAAC,KAAK,GAAG,kBAAkB,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ;gBAC7C,OAAO,EAAE,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,GAAG,OAAO;gBAC1G,MAAM,EAAE,uCAAuC;gBAC/C,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC;gBACT,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO;gBAC5C,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,GAAG;gBAChE,MAAM,EAAE,EAAE;gBACV,MAAM,EAAE,QAAQ;aACjB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,gBAAgB,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACnI,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM;QAC7B,MAAM,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;QACjF,OAAO,EAAE,CAAC,WAAW,CAAC,MAAM;YAC1B,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,oBAAoB;YAC5C,CAAC,CAAC,WAAW,CAAC,QAAQ;gBACpB,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,GAAG;gBAC5B,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,mBAAmB;QACnD,MAAM,EAAE,CAAC,WAAW,CAAC,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iCAAiC;QAC5F,MAAM,EAAE,UAAU;KACnB,CAAC,CAAC;IAEH,2CAA2C;IAC3C,KAAK,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO;QACpD,OAAO,EAAE,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,GAAG;cAC3D,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,GAAG,CAAC;QAC3D,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,aAAa;KAClC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,qEAAqE;IACrE,qEAAqE;IACrE,MAAM,cAAc,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ;QAC/B,MAAM,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ;QAC5C,OAAO,EAAE,IAAI,KAAK,MAAM;YACtB,CAAC,CAAC,sCAAsC,GAAG,SAAS,GAAG,IAAI;YAC3D,CAAC,CAAC,IAAI,KAAK,SAAS;gBAClB,CAAC,CAAC,mCAAmC;gBACrC,CAAC,CAAC,wCAAwC;QAC9C,MAAM,EAAE,IAAI,KAAK,MAAM;YACrB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,IAAI,KAAK,SAAS;gBAClB,CAAC,CAAC,aAAa;gBACf,CAAC,CAAC,uGAAuG;QAC7G,MAAM,EAAE,cAAc,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;KAC/C,CAAC,CAAC;IAEH,wDAAwD;IACxD,2EAA2E;IAC3E,yFAAyF;IACzF,2CAA2C;IAC3C,8BAA8B;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IAC5E,MAAM,eAAe,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IACpD,KAAK,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,gBAAgB,EAAE,KAAK,EAAE,QAAQ;QACrC,oFAAoF;QACpF,wDAAwD;QACxD,gCAAgC;QAChC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;QACzC,OAAO,EAAE,eAAe;YACtB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,eAAe,CAAC,GAAG,+BAA+B;YAC7D,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,eAAe,CAAC,GAAG,8BAA8B;QAC/D,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uCAAuC;KACvE,CAAC,CAAC;IAEH,mDAAmD;IACnD,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC;QACT,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,QAAQ;QACpC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;QACrC,OAAO,EAAE,WAAW;YAClB,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,GAAG;YAChE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,GAAG;QACjC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,4BAA4B;KACxD,CAAC,CAAC;IAEH,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC;AACvF,CAAC"}
|