// ==UserScript==
// @name 甘肃专业技术人员继续教育(定西沃尔德)学习助手
// @namespace https://www.wlxy.live/
// @version 1.1
// @description 甘肃专业技术人员继续教育·定西沃尔德平台(www.w2dzx.com ):勾选计划课程、自动完成视频学时,完成后自动完成考试;免费体验 2 个章节课时(不含自动考试),专业版激活后不限课时与考试。效率模式看课。
// @author 柠檬真酸
// @icon https://huaweicloudobs.ahjxjy.cn/895789f9086469785b846d30c0ed95f9.png
// @match *://www.w2dzx.com/*
// @match *://w2dzx.com/*
// @match *://*.brjxjy.com/*
// @noframes
// @antifeature payment 免费体验2个章节课时(不含自动考试),升级专业版不限
// @antifeature membership 需会员授权
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// @grant GM_openInTab
// @connect www.w2dzx.com
// @connect w2dzx.com
// @connect *.brjxjy.com
// @connect huaweicloudobs.ahjxjy.cn
// @connect oa29.ahzsksw.cn
// @connect oa33.ahzsksw.cn
// @connect card.wlxy.live
// @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/vue/3.4.27/vue.global.prod.min.js
// @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/vue-demi/0.14.6/index.iife.js
// @require data:application/javascript,%3Bwindow.Vue%3DVue%3B
// @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/dompurify/3.1.6/purify.min.js
// @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/crypto-js/4.2.0/crypto-js.min.js
// @require https://mirrors.sustech.edu.cn/cdnjs/ajax/libs/pinia/2.2.4/pinia.iife.prod.js
// @run-at document-idle
// @tag 甘肃专技
// @tag 学习辅助
// @license All Rights Reserved
// ==/UserScript==
(function(Vue,DOMPurify,Pinia,CryptoJS){
"use strict";
(() => {
var Xe = "1.0.4";
var Qe = "\u7518\u8083\u4E13\u4E1A\u6280\u672F\u4EBA\u5458\u7EE7\u7EED\u6559\u80B2(\u5B9A\u897F\u6C83\u5C14\u5FB7)\u52A9\u624B", q = "__W2DZX_WATCH_BOOT__", N = location.hostname.replace(/^www\./, ""), Y = location.origin, z = {
enabled: `w2dzx_enabled_${N}`,
pace: `w2dzx_pace_${N}`,
onlyIncomplete: `w2dzx_only_incomplete_${N}`,
autoExam: `w2dzx_auto_exam_${N}`,
selected: `w2dzx_selected_${N}`,
panelPos: `w2dzx_panel_pos_${N}`,
collapsed: `w2dzx_collapsed_${N}`,
examBank: `w2dzx_exam_bank_${N}`
}, F = {
efficiency: "efficiency",
turbo: "turbo",
realtime: "realtime",
player: "player"
};
var We = 30, be = 5, Ze = 12, et = 1600, $e = 200;
var tt = "https://huaweicloudobs.ahjxjy.cn/895789f9086469785b846d30c0ed95f9.png", nt = "\u5B66\u6EE1\u8BFE\u7A0B\u5BF9\u5E94\u5B66\u65F6\u5373\u53EF\uFF0C\u65E0\u9700\u770B\u5B8C\u6240\u6709\u7AE0\u8282\u3002\u514D\u8D39\u7248\u4E0D\u542B\u81EA\u52A8\u8003\u8BD5\uFF1B\u4E13\u4E1A\u7248\u53EF\u5B66\u5B8C\u8BA1\u5212\u540E\u81EA\u52A8\u8003\u8BD5\u3002\u8BF7\u52FF\u540C\u65F6\u6253\u5F00\u591A\u4E2A\u64AD\u653E\u9875\u3002", rt = "903117129", ot = "https://qun.qq.com/universal-share/share?ac=1&authKey=rxdL6YIJ0%2FxOEemjLqTGULvl5aAfJIVQcIvkvnwvmL%2FAmpFZnSafajYHgSXMUXvx&busi_data=eyJncm91cENvZGUiOiI5MDMxMTcxMjkiLCJ0b2tlbiI6IlB2dkFGSm5XRXBrSEhtQVFTUGQzdVNZakhNWDNMbW1kODA2enpoMi9obDh4SWp0YzBDODNFaGtwRU44Z0hyU0siLCJ1aW4iOiIxMjU0MzE1MTQifQ%3D%3D&data=9oyJixSPcigCQW-saV5eXlcMwV9C6J36XySx-rDHwVwNlofvRmd2ze5sLwFtHTbYbG4nAWIUrI0qftC6aTX9xg&svctype=4&tempid=h5_group_info", he = "https://oa33.ahzsksw.cn", X = "w2dzx_cloud_token_v1", ze = "w2dzx_cloud_lease_cache_v1", Q = "w2dzx_client_cfg_v1", D = "https://card.wlxy.live/details/AC690A57", M = 2;
var at = "", it = "", ye = "wed_token", C = {
videoDonePct: 99.99,
courseDonePct: 99.5,
courseCreditRatio: 0.99,
progressLogIntervalMs: 12e4,
defaultTicktok: 30
};
var we = null;
function st(e) {
we = e;
}
var n = {
enabled: !1,
stopFlag: !1,
running: !1,
pace: "efficiency",
onlyIncomplete: !0,
autoExam: !1,
studyPlans: [],
planGroups: [],
learningCourses: [],
completedCourses: [],
selectedIds: /* @__PURE__ */ new Set(),
selectMode: "all",
chapters: [],
activeCourse: null,
activeVideoId: "",
currentCourse: "",
currentChapter: "",
logs: [],
task: "",
panelHint: "",
reportInterval: We,
semester: (/* @__PURE__ */ new Date()).getFullYear(),
userName: "",
examBank: {},
queueVideoTotal: 0,
queueVideoDone: 0,
queueExamTotal: 0,
queueExamDone: 0,
studyModeHintTimer: null,
cloudApiBase: he,
cloudToken: String(localStorage.getItem(X) || "").trim(),
cloudLease: "",
cloudLeaseExp: 0,
cloudTier: "unknown",
cloudProExpireAt: 0,
freeCourseLimit: M,
freeUsedCourses: 0,
proBuyUrl: D,
remotePanelNotice: "",
canExam: !1,
freeCanExam: !1,
cloudReady: !1,
activationTtlDays: 30,
videoDonePct: C.videoDonePct,
courseDonePct: C.courseDonePct,
courseCreditRatio: C.courseCreditRatio,
progressLogIntervalMs: C.progressLogIntervalMs,
defaultTicktok: C.defaultTicktok
}, U = null;
function ct(e) {
U = e;
}
function k(e) {
return new Promise((t) => setTimeout(t, Math.max(0, e)));
}
function b(e) {
return String(e ?? "").replace(/&/g, "&").replace(//g, ">");
}
function v(e, t) {
let r = String(e || "");
return r.length > t ? r.slice(0, t) + "\u2026" : r;
}
function W(e) {
let t = Math.max(0, Math.floor(Number(e) || 0)), r = Math.floor(t / 60), o = t % 60;
return `${r}:${String(o).padStart(2, "0")}`;
}
function Z(e, t) {
try {
let r = GM_getValue(e, null);
return r == null ? t : typeof r == "string" ? JSON.parse(r) : r;
} catch {
return t;
}
}
function ee(e, t) {
GM_setValue(e, JSON.stringify(t));
}
function lt(e) {
if (e == null || e === "") return 0;
if (typeof e == "number" && Number.isFinite(e)) return Math.max(0, e);
let t = String(e).trim();
if (/^\d+(\.\d+)?$/.test(t)) return parseFloat(t) || 0;
let r = t.split(":").map((o) => parseInt(o, 10) || 0);
return r.length === 3 ? r[0] * 3600 + r[1] * 60 + r[2] : r.length === 2 ? r[0] * 60 + r[1] : 0;
}
var te = [], ne = String(at || ""), re = String(it || "");
function dt(e) {
te.unshift({ ...e, at: Date.now() }), te.length > 120 && (te.length = 120);
let t = window[q];
t && typeof t == "object" ? t.netLog = te : window[q] = { netLog: te };
}
function Wt(e, t) {
let r = {};
try {
for (let [o, a] of e.entries())
t && o === "token" ? r[o] = `${String(a).slice(0, 8)}\u2026` : r[o] = a;
} catch {
}
return r;
}
function Te(e) {
let t = document.cookie.match(
new RegExp(
`(?:^|;\\s*)${e.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}=([^;]*)`
)
);
return t ? decodeURIComponent(t[1]) : "";
}
function _e(e, t) {
let r = String(e || "").trim(), o = String(t || "").trim();
r && (ne = r), o && (re = o);
}
function Zt() {
try {
let e = localStorage.getItem(Q);
if (!e) return !1;
let t = JSON.parse(e);
return _e(t.aesKey, t.aesIv), !!(ne && re);
} catch {
return !1;
}
}
function ut() {
if (!ne || !re)
throw new Error("\u4E91\u7AEF\u914D\u7F6E\u672A\u5C31\u7EEA\uFF08\u7F3A\u5C11\u5E73\u53F0\u5BC6\u94A5\uFF09\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u6216\u68C0\u67E5\u7F51\u7EDC");
}
function w(e) {
ut();
let t = CryptoJS.enc.Utf8.parse(ne), r = CryptoJS.enc.Utf8.parse(re);
return CryptoJS.AES.encrypt(String(e), t, {
iv: r,
padding: CryptoJS.pad.Pkcs7
}).toString();
}
function en(e) {
if (!e) return "";
ut();
let t = CryptoJS.enc.Utf8.parse(ne), r = CryptoJS.enc.Utf8.parse(re);
return CryptoJS.AES.decrypt(String(e), t, {
iv: r,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
}
function tn() {
let e = Te(ye) || Te("wed_token") || "";
if (e) return e.trim();
try {
if (typeof window.$cookies?.get == "function") {
let t = window.$cookies.get("wed_token") || window.$cookies.get(ye);
if (t) return String(t).trim();
}
} catch {
}
for (let t of [localStorage, sessionStorage])
try {
let r = t.getItem("wed_token") || t.getItem(ye);
if (r) return String(r).trim();
} catch {
}
return "";
}
function ve() {
let e = Te("wed_userinfo") || (() => {
try {
return window.$cookies?.get?.("wed_userinfo") || "";
} catch {
return "";
}
})() || localStorage.getItem("wed_userinfo") || "";
if (!e) return null;
try {
let t = en(e);
return t ? JSON.parse(t) : null;
} catch {
try {
return JSON.parse(e);
} catch {
return null;
}
}
}
function Ne() {
let e = ve(), t = e?.stu_id ?? e?.user_id ?? e?.id ?? "";
return String(t || "").trim();
}
function nn() {
let e = tn();
if (!e) throw new Error("\u672A\u767B\u5F55\u6216 token \u5931\u6548\uFF0C\u8BF7\u5148\u767B\u5F55\u5E73\u53F0");
let t = ve();
return t && (n.userName = t.stu_name || t.name || "", n.semester = Number(t.stu_year) || Number((/* @__PURE__ */ new Date()).getFullYear())), e;
}
function S(e, t, r) {
let a = { token: nn(), ...t || {} };
Object.keys(a).forEach((p) => {
(a[p] == null || a[p] === "") && delete a[p];
});
let i = new FormData();
Object.entries(a).forEach(([p, c]) => i.append(p, String(c)));
let s = `${Y}${e}`, l = {}, m = r && r.referer;
m && (l.Referer = m, l.Origin = Y);
let d = Wt(i, !0);
dt({ phase: "request", path: e, url: s, fields: d });
let g = (p) => {
let c = {};
try {
c = JSON.parse(p.responseText || "{}");
} catch (_) {
throw new Error(`\u54CD\u5E94\u89E3\u6790\u5931\u8D25: ${_.message}`);
}
dt({
phase: "response",
path: e,
status: p.status,
code: c.code,
msg: c.msg,
data: c.data
});
let h = c.code === 1 || c.code === 0;
if (p.status >= 200 && p.status < 300 && h) return c;
let f = new Error(c.msg || c.message || `HTTP ${p.status}`);
throw f.code = c.code, f.data = c.data, f;
};
return new Promise((p, c) => {
GM_xmlhttpRequest({
method: "POST",
url: s,
data: i,
headers: l,
onload(h) {
try {
p(g(h));
} catch (f) {
c(f);
}
},
onerror() {
c(new Error("\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25"));
}
});
});
}
Zt();
var Me = () => {
};
function pt(e) {
Me = typeof e == "function" ? e : () => {
};
}
function rn(e, t) {
return `${e}:${t}`;
}
function oe(e) {
let t = w(String(e.planId)), r = w(String(e.courseId || e.rawId)), o = w("myPlan");
return `${Y}/web/planVideoPlay?ids=${encodeURIComponent(t)}&course_id=${encodeURIComponent(r)}&source=${encodeURIComponent(o)}`;
}
function ft() {
n.enabled = !!GM_getValue(z.enabled, !1), n.pace = F.efficiency, GM_setValue(z.pace, F.efficiency), n.onlyIncomplete = GM_getValue(z.onlyIncomplete, !0) !== !1, n.autoExam = !0, GM_setValue(z.autoExam, !0), n.examBank = Z(z.examBank, {}) || {};
let e = Z(z.selected, null);
e && typeof e == "object" && !Array.isArray(e) ? (n.selectMode = e.mode === "none" || e.mode === "partial" ? e.mode : "all", n.selectedIds = new Set(Array.isArray(e.ids) ? e.ids : [])) : Array.isArray(e) ? (n.selectMode = e.length ? "partial" : "all", n.selectedIds = new Set(e)) : (n.selectMode = "all", n.selectedIds = /* @__PURE__ */ new Set());
}
function Se() {
ee(z.selected, {
mode: n.selectMode,
ids: Array.from(n.selectedIds)
});
}
function mt(e) {
return n.selectMode === "none" ? !1 : n.selectMode === "all" ? !0 : n.selectedIds.has(e);
}
function $() {
if (n.selectMode === "none") return [];
let e = O();
return n.selectMode === "all" ? e.slice() : e.filter((t) => n.selectedIds.has(t.id));
}
function xt() {
n.selectMode = "all", n.selectedIds = /* @__PURE__ */ new Set(), Se(), Me();
}
function gt() {
n.selectMode = "none", n.selectedIds = /* @__PURE__ */ new Set(), Se(), Me();
}
function I(e) {
let t = Ce(e), r = parseFloat(e.completedPeriod);
if (t > 0 && Number.isFinite(r) && r >= 0)
return Math.min(100, Math.max(0, r / t * 100));
let o = e.completedPeriodPercent ?? e.progress ?? 0, a = parseFloat(String(o)) || 0;
return a <= 0 && (e.isCompleted === "\u5DF2\u5B8C\u6210" || e.isCompleted === !0) && (a = 100), Math.min(100, Math.max(0, a));
}
function Ce(e) {
let t = parseFloat(e.courseStudyDuration ?? e.period);
return Number.isFinite(t) && t > 0 ? t : 0;
}
function on(e) {
let t = Ce(e), r = parseFloat(e.completedPeriod);
if (Number.isFinite(r) && r >= 0)
return t > 0 ? Math.min(t, r) : r;
let o = I(e);
return t ? o >= (n.courseDonePct || 99.5) ? t : Math.round(t * o / 100 * 10) / 10 : null;
}
function bt(e) {
let t = I(e), r = Ce(e), o = on(e);
return r > 0 && o != null ? `\u5B66\u65F6 ${o}/${r} \xB7 \u5B66\u4E60 ${t.toFixed(0)}%` : `\u5B66\u4E60\u8FDB\u5EA6 ${t.toFixed(0)}%`;
}
function an(e) {
return y(e) ? "\u5B66\u65F6\u5DF2\u6EE1" : "\u5B66\u65F6\u672A\u6EE1";
}
function sn(e) {
return y(e) ? "#16a34a" : "#64748b";
}
function cn(e, t) {
let r = e || {}, o = Array.isArray(t) ? t : [], a = o.length > 0 && o.every((m) => y(m)), i = Number(r.sig_remain_num);
if (r.sig_passtext === "yes")
return { text: "\u5DF2\u901A\u8FC7", hint: "\u8BA1\u5212\u8003\u8BD5\u5DF2\u901A\u8FC7", ready: !1, passed: !0, color: "#16a34a" };
if (r.is_can_exam === 1 || a)
return {
text: "\u53EF\u8003\u8BD5",
hint: `\u8BFE\u7A0B\u5DF2\u5B66\u5B8C\uFF0C\u70B9\u5F00\u59CB\u540E\u81EA\u52A8\u56E4\u9898\u5E76\u8003\u8BD5${Number.isFinite(i) ? ` \xB7 \u5269\u4F59 ${i} \u6B21` : ""}`,
ready: !0,
passed: !1,
color: "#b45309"
};
if (r.is_can_exam_message)
return {
text: "\u672A\u5F00\u653E",
hint: String(r.is_can_exam_message),
ready: !1,
passed: !1,
color: "#64748b"
};
let s = parseFloat(r.sig_alerdy_video), l = parseFloat(r.stp_period);
return Number.isFinite(s) && Number.isFinite(l) && l > 0 ? {
text: "\u5B66\u5B8C\u53EF\u8003",
hint: `\u8BA1\u5212\u8FDB\u5EA6 ${s.toFixed(1)}/${l} \u5B66\u65F6`,
ready: !1,
passed: !1,
color: "#64748b"
} : {
text: "\u5B66\u5B8C\u53EF\u8003",
hint: "\u5B66\u5B8C\u672C\u7EC4\u8BFE\u7A0B\u540E\u5F00\u653E\u8003\u8BD5",
ready: !1,
passed: !1,
color: "#64748b"
};
}
function Ie() {
ee(z.examBank, n.examBank || {});
}
function ae(e) {
let t = [];
for (let r of e.children || [])
for (let o of r.children || [])
!o || !o.id || t.push({
...o,
chapterId: r.id,
chapterName: r.chapterName || "",
durationSec: lt(o.videoDuration),
courseId: e.courseId || e.rawId,
planId: e.planId
});
return t;
}
function y(e) {
if (!e) return !1;
if (e.isCompleted === "\u5DF2\u5B8C\u6210" || e.isCompleted === !0) return !0;
let t = Ce(e), r = parseFloat(e.completedPeriod);
return t > 0 && Number.isFinite(r) && r >= t * (n.courseCreditRatio || 0.99) ? !0 : I(e) >= (n.courseDonePct || 99.5);
}
async function ie() {
let e = [], t = 1, r = 20;
for (; !n.stopFlag; ) {
let o = await S("/api/v2.Order/getMyStudyPlanList", {
page: String(t),
limit: String(r)
}), a = o && o.data || {}, i = a.data || [];
if (e.push(...i), !i.length || t >= (a.last_page || 1)) break;
t += 1;
}
return n.studyPlans = e, e;
}
async function ln(e) {
let t = e.stp_id, r = await S("/api/v2.Order/getMyStudyPlanCourseList", {
ids: w(String(t))
});
return ((r && r.data || {}).data || []).map((a) => ({
...a,
rawId: a.id,
id: rn(t, a.id),
courseId: a.id,
name: a.courseName || a.name || a.id,
title: a.courseName || a.name || a.id,
planId: t,
sigId: e.sig_id,
planName: e.stp_name || "",
_plan: e
}));
}
async function se() {
let e = await ie(), t = [], r = [], o = [];
for (let a of e) {
if (n.stopFlag) break;
let i = await ln(a);
o.push({
plan: a,
planId: String(a.stp_id),
name: a.stp_name || `\u8BA1\u5212${a.stp_id}`,
courses: i
});
for (let s of i)
y(s) ? r.push(s) : t.push(s);
}
return n.planGroups = o, n.learningCourses = t, n.completedCourses = r, { learning: t, completed: r, plans: e, planGroups: o };
}
async function B(e) {
let t = await S("/api/v2.Order/getMyStudyPlanCourseList", {
ids: w(String(e.planId))
}), o = ((t && t.data || {}).data || []).find((a) => String(a.id) === String(e.courseId));
return o ? {
...e,
...o,
rawId: o.id,
id: e.id,
courseId: o.id,
name: o.courseName || e.name,
title: o.courseName || e.name,
planId: e.planId,
sigId: e.sigId,
planName: e.planName,
_plan: e._plan
} : e;
}
async function je(e, t, r) {
let o = await S(
"/api/v2.Order/getMyStudyPlanCourseVideo",
{
video_id: w(String(e)),
plan_id: w(String(t))
},
r ? { referer: r } : void 0
);
return o && o.data || null;
}
function O() {
return n.planGroups && n.planGroups.length ? n.planGroups.flatMap((e) => e.courses || []) : [...n.learningCourses, ...n.completedCourses];
}
function ht(e, t) {
let r = t || {}, o = !!r.checkable, a = !!r.checked, i = !!r.isActive, s = e.name || e.title || e.courseName || e.id, l = I(e), m = y(e), d = sn(e), g = o ? `` : "", p = o ? "label" : "div";
return `<${p} class="w2-course-card${i ? " is-active" : ""}${m ? " is-done" : ""}">
${g}
${b(s)}
${m ? '\u5B66\u65F6\u5DF2\u6EE1' : ""}
${b(bt(e))}${b(an(e))}
${p}>`;
}
function dn(e, t) {
let r = cn(e, t), o = r.ready ? " is-ready" : "", a = r.passed ? " is-passed" : "";
return `
\u8BA1\u5212\u8003\u8BD5${b(r.hint)}${b(r.text)}
`;
}
function un(e, t) {
let o = (t || {}).activeId, a = e.plan || {}, i = e.courses || [], s = e.name || a.stp_name || `\u8BA1\u5212${e.planId}`, l = i.filter((d) => y(d)).length, m = i.map(
(d) => ht(d, {
checkable: !0,
checked: mt(d.id),
isActive: d.id === o
})
).join("");
return `
${b(s)}${l}/${i.length} \u95E8
${m}${dn(a, i)}
`;
}
function zt(e) {
let t = n.planGroups || [];
if (!t.length) {
let r = O();
return r.length ? r.map(
(o) => ht(o, {
checkable: !0,
checked: mt(o.id),
isActive: o.id === e
})
).join("") : "";
}
return t.map((r) => un(r, { activeId: e })).join("");
}
function pn(e) {
let t = parseFloat(e);
if (!Number.isFinite(t) || t <= 0) return "0";
if (t >= 100) return "100";
let r = Math.round(t * 100) / 100;
return String(r);
}
function fn(e) {
if (Ee(e)) return "\u5DF2\u5B8C\u6210";
let t = parseFloat(e.progressPercent) || 0;
return e.studyStatus === "\u5B66\u4E60\u4E2D" || t > 0 ? `\u5B66\u4E60\u4E2D ${pn(t)}%` : "\u672A\u5F00\u59CB";
}
function Ee(e) {
if (!e) return !1;
if (e.studyStatus === "\u5DF2\u5B8C\u6210") return !0;
let t = parseFloat(e.progressPercent);
return !!(Number.isFinite(t) && t >= (n.videoDonePct || 99.99));
}
function ce(e, t, r, o) {
let a = o || {}, i = Number(r) || 0, s = Math.max(0, Number(t) || 0), l = i > 0 ? Math.min(100, s / i * 100) : 0, d = a.finished === !0 || l >= (n.videoDonePct || 99.99), g = String(e), p = 0, c = (f) => {
!f || String(f.id) !== g || (f.progressPercent = d ? 100 : Math.round(l * 100) / 100, f._progressSec = s, i > 0 && (f.durationSec = i), d ? (f.studyStatus = "\u5DF2\u5B8C\u6210", f.progressPercent = 100) : l > 0 && (f.studyStatus = "\u5B66\u4E60\u4E2D"), p += 1);
}, h = (f) => {
if (f)
for (let _ of f.children || [])
for (let j of _.children || []) c(j);
};
h(n.activeCourse);
for (let f of n.planGroups || [])
for (let _ of f.courses || []) h(_);
for (let f of n.learningCourses || []) h(f);
for (let f of n.completedCourses || []) h(f);
return p;
}
function yt(e) {
let t = Array.isArray(e) ? e : [];
if (!t.length)
return '
';
let r = String(n.activeVideoId || "");
return t.map((o) => {
let a = o.name || o.title || o.id, i = o.children || [], s = ae(o), l = bt(o), m = i.length > 0 ? i.map((d) => {
let g = d.children || [], p = g.map((c) => {
let h = fn(c), f = Ee(c), _ = r && String(c.id) === r;
return `