1import { aI as ye, aJ as ie, aK as ue, aL as we, aM as Ue, d as pe, q as fe, u as _e, g as $, Y as oe, aN as ke, X as xe, M as z, z as x, f as g, y as i, e as R, k as D, h as d, B as A, F as X, l as e, t as p, Z as Ne, K as Y, A as j, H as be, j as U, aO as ge, aP as ve, aQ as Se, aR as Ee, U as Ie, aS as Ae, T as P, _ as Ce, s as De, aT as $e, aU as le, aV as Le, c as Te, Q as Me, aG as ce, aW as Ve, I as Be, aX as de, a5 as Pe, W as ae, a3 as O, aY as Re, aZ as Fe, i as Oe } from "./CSCE6Vg2.js"; 2import { E as ze, a as Ye } from "./WYWP78wn.js"; 3import { _ as je, a as Ge } from "./CHcCZeGh.js"; 4import { _ as G } from "./BK2jQsIJ.js"; 5import { _ as qe } from "./BaK0F23F.js"; 6import { u as He, A as Qe } from "./B8yQbb0U.js"; 7import { E as We, a as Xe } from "./CbujOpDN.js"; 8import { E as Ze, a as Ke } from "./BHUFD9gV.js"; 9import { E as re } from "./DmEYpeZX.js"; 10import { u as Je } from "./CesY6ogl.js"; 11import { v as et } from "./Dm4zHxUw.js"; 12import "./CII-tQw4.js"; 13import "./CqrtuKKb.js"; 14import "./Dz3vHLWq.js"; 15import "./Bv4GO9Lm.js"; 16import "./B8u0w9tB.js"; 17import "./CRsIl1Yy.js"; 18import "./CeQqvnFU.js"; 19import "./DWHxQajD.js"; 20import "./DjLGDBGD.js"; 21import "./CpcHvzOH.js"; 22import "./FUKBWQwh.js"; 23import "./CEzLI_XM.js"; 24import "./B1hGu9GA.js"; 25import "./fWbG8gK3.js"; 26import "./DXq1RRK6.js"; 27import "./ChZXNEj1.js"; 28import "./Dis_jhua.js"; 29import "./v9PKyFuB.js"; 30import "./V2zqNvpV.js"; 31import "./BfbNICde.js"; 32import "./LdY3Up6O.js"; 33import "./CsZPXJzw.js"; 34import "./OAKT5gXF.js"; 35import "./BqQ_b-4w.js"; 36import "./v3mdHLdR.js"; 37import "./BN8VkRbt.js"; 38import "./BWP416Pv.js"; 39import "./OAWgKAkZ.js"; 40import "./0PYmIqKs.js"; 41import "./CQikfZCd.js"; 42import "./Di8OpqPk.js"; 43import "./D5T8jBC5.js"; 44import "./Dn2SRQuk.js"; 45import "./Ba8QGe2O.js"; 46function tt() { 47} 48function st(m) { 49 return m !== m; 50} 51function nt(m, n, u) { 52 for (var l = u - 1, o = m.length; ++l < o; ) if (m[l] === n) return l; 53 return -1; 54} 55function it(m, n, u) { 56 return n === n ? nt(m, n, u) : ye(m, st, u); 57} 58function at(m, n) { 59 var u = m == null ? 0 : m.length; 60 return !!u && it(m, n, 0) > -1; 61} 62var ot = 1 / 0, rt = ie && 1 / ue(new ie([, -0]))[1] == ot ? function(m) { 63 return new ie(m); 64} : tt, lt = 200; 65function ct(m, n, u) { 66 var l = -1, o = at, L = m.length, T = true, v = [], h = v; 67 if (L >= lt) { 68 var c = rt(m); 69 if (c) return ue(c); 70 T = false, o = Ue, h = new we(); 71 } else h = v; 72 e: for (; ++l < L; ) { 73 var k = m[l], w = k; 74 if (k = k !== 0 ? k : 0, T && w === w) { 75 for (var N = h.length; N--; ) if (h[N] === w) continue e; 76 v.push(k); 77 } else o(h, w, u) || (h !== v && h.push(w), v.push(k)); 78 } 79 return v; 80} 81function dt(m) { 82 return m && m.length ? ct(m) : []; 83} 84const mt = { class: "break-all" }, ut = { class: "break-all" }, pt = { class: "flex w-full flex-col" }, ft = { key: 0, class: "text-muted-foreground mt-1 flex items-center text-xs" }, _t = { class: "flex items-center gap-1" }, bt = { class: "flex w-full justify-end" }, me = 40, gt = pe({ __name: "admin-user-form", props: { mode: { default: "create" }, initialValues: {}, onSave: {}, subscriptionAssets: {} }, emits: ["success", "cancel"], setup(m, { emit: n }) { 85 const u = m, l = n, { t: o } = fe(), L = _e(), T = $(() => { 86 var _a; 87 return (_a = L.profile) == null ? void 0 : _a.id; 88 }), v = oe(false), { appContext: h } = ke(), c = xe({ name: "", adminLevel: z.ADMIN, ...u.initialValues }); 89 function k(I) { 90 const { displayNickName: r, displayContact: b, ...y } = I; 91 return y; 92 } 93 const w = $(() => { 94 var _a, _b; 95 const I = dt((_a = c.subscriptionAssetIds) == null ? void 0 : _a.map((r) => { 96 var _a2; 97 return (_a2 = u.subscriptionAssets) == null ? void 0 : _a2.find((b) => b.id === r); 98 }).map((r) => r == null ? void 0 : r.subscriptionId)).filter((r) => !!r); 99 return ((_b = u.subscriptionAssets) == null ? void 0 : _b.filter((r) => { 100 var _a2; 101 return I.includes(r.subscriptionId) ? (_a2 = c.subscriptionAssetIds) == null ? void 0 : _a2.includes(r.id) : !r.adminUserId || r.adminUserId === c.adminUserId; 102 })) || []; 103 }), N = $(() => { 104 var _a, _b; 105 const I = {}, r = w.value, b = (_a = c.subscriptionAssetIds) != null ? _a : []; 106 return (_b = u.subscriptionAssets) == null ? void 0 : _b.forEach((y) => { 107 const S = I[y.subscriptionId] || { subscriptionId: y.subscriptionId, total: 0, taken: 0, selectedCount: 0 }; 108 S.total += 1, y.adminUserId && y.adminUserId !== c.adminUserId && (S.taken += 1), b.includes(y.id) && (S.selectedCount += 1), r.some((V) => V.id === y.id) && (S.assetIdForUser = y.id), I[y.subscriptionId] = S; 109 }), Object.values(I); 110 }), M = oe(), F = $(() => ({ rolesadminLevel: o("roles.".concat(c.adminLevel)), rolestipsadminLevel: o("roles-tips.".concat(c.adminLevel)) })), q = (I) => { 111 I && I.validate(async (r) => { 112 var _a; 113 if (r) { 114 if (!((_a = c.subscriptionAssetIds) == null ? void 0 : _a.length)) try { 115 await re.confirm(o("user-info.admin-user-form.no-subscription-asset-confirm-description"), o("common.tips"), { confirmButtonText: o("common.ok"), cancelButtonText: o("common.cancel"), type: "warning" }, h); 116 } catch (e2) { 117 return; 118 } 119 try { 120 const b = k(c); 121 u.mode === "create" ? (v.value = true, c.adminLevel === z.ADMIN ? (await u.onSave(b), l("success"), v.value = false) : await re.confirm(o("user-info.admin-user-form.invited-users-will-serve-as", F.value), o("common.tips"), { confirmButtonText: o("common.ok"), cancelButtonText: o("common.cancel"), type: "warning" }, h).then(async () => { 122 await u.onSave(b), l("success"), v.value = false;
123 }).catch(() => { 124 })) : (await u.onSave(b), l("success")); 125 } catch (b) { 126 P.error(b.message); 127 } finally { 128 v.value = false; 129 } 130 } 131 }); 132 }; 133 return (I, r) => { 134 const b = Xe, y = Ne, S = Ke, V = Ze, Z = Se, K = ve, H = Ie, J = We; 135 return g(), x(J, { ref_key: "ruleFormRef", ref: M, model: c, "label-position": "right", "label-width": "120px", class: "mt-4" }, { default: i(() => [I.mode === "update" ? (g(), R(X, { key: 0 }, [d(b, { label: e(o)("role-settings.form.current-nickname-label"), "label-width": "150" }, { default: i(() => [A("span", mt, p(c.displayNickName || "-"), 1)]), _: 1 }, 8, ["label"]), d(b, { label: e(o)("role-settings.form.current-contact-label"), "label-width": "150" }, { default: i(() => [A("span", ut, p(c.displayContact || "-"), 1)]), _: 1 }, 8, ["label"])], 64)) : D("", true), d(b, { label: e(o)("role-settings.form.name"), prop: "name", "label-width": "150", rules: [{ required: true, message: e(o)("role-settings.form.name-required-message"), trigger: "blur" }, { max: me, message: e(o)("role-settings.form.name-length-message"), trigger: "blur" }] }, { default: i(() => [d(y, { modelValue: c.name, "onUpdate:modelValue": r[0] || (r[0] = (_) => c.name = _), class: "!w-[280px]", maxlength: me, "show-word-limit": "", placeholder: e(o)("role-settings.form.name-placeholder") }, null, 8, ["modelValue", "placeholder"])]), _: 1 }, 8, ["label", "rules"]), d(e(G), { ability: [[e(Y).Govern, e(j).SubscriptionAsset]], behavior: "hidden" }, { default: i(() => [d(b, { "label-width": "150", label: e(o)("role-settings.form.seat.label") }, { default: i(() => { 136 var _a; 137 return [A("div", pt, [d(V, { modelValue: c.subscriptionAssetIds, "onUpdate:modelValue": r[1] || (r[1] = (_) => c.subscriptionAssetIds = _) }, { default: i(() => [(g(true), R(X, null, be(e(N), (_) => { 138 var _a2; 139 return g(), x(S, { key: _.assetIdForUser, value: _.assetIdForUser, disabled: _.total - _.taken - _.selectedCount === 0 && !((_a2 = c.subscriptionAssetIds) == null ? void 0 : _a2.includes(_.assetIdForUser || "")) }, { default: i(() => [U(p(e(ge)(e(o), _.subscriptionId)) + " \u2013 " + p(_.taken + _.selectedCount) + " / " + p(_.total), 1)]), _: 2 }, 1032, ["value", "disabled"]); 140 }), 128))]), _: 1 }, 8, ["modelValue"]), ((_a = c.subscriptionAssetIds) == null ? void 0 : _a.length) ? D("", true) : (g(), R("span", ft, p(e(o)("role-settings.form.seat.tips")), 1))])]; 141 }), _: 1 }, 8, ["label"])]), _: 1 }, 8, ["ability"]), d(b, { "label-width": "150" }, { label: i(() => [A("div", _t, [U(p(e(o)("roles.SUPER_ADMIN")) + " ", 1), d(K, { effect: "dark", content: e(o)("roles-tips.SUPER_ADMIN"), placement: "bottom-end" }, { default: i(() => [d(Z, { class: "cursor-pointer text-gray-500" }, { default: i(() => [d(e(Ee))]), _: 1 })]), _: 1 }, 8, ["content"])])]), default: i(() => [d(S, { modelValue: c.adminLevel, "onUpdate:modelValue": r[2] || (r[2] = (_) => c.adminLevel = _), "true-label": e(z).SUPER_ADMIN, "false-label": e(z).ADMIN, disabled: e(T) === c.adminUserId }, null, 8, ["modelValue", "true-label", "false-label", "disabled"])]), _: 1 }), A("div", bt, [I.mode === "update" ? (g(), x(H, { key: 0, style: { "min-width": "65px" }, round: "", type: "primary", loading: v.value, onClick: r[3] || (r[3] = (_) => q(M.value)) }, { default: i(() => [U(p(e(o)("common.save")), 1)]), _: 1 }, 8, ["loading"])) : (g(), x(H, { key: 1, round: "", type: "primary", loading: v.value, icon: e(Ae), onClick: r[4] || (r[4] = (_) => q(M.value)) }, { default: i(() => [U(p(e(o)("user-info.admin-user-form.generate-invitation-link")), 1)]), _: 1 }, 8, ["loading", "icon"]))])]), _: 1 }, 8, ["model"]); 142 }; 143} }), vt = Object.assign(Ce(gt, [["__scopeId", "data-v-78aff8dd"]]), { __name: "UserInfoAdminUserForm" }), It = { class: "mb-2 flex justify-end" }, At = { class: "flex items-center gap-1" }, ht = { class: "mr-2" }, yt = { class: "flex items-center gap-1" }, wt = { class: "flex flex-col" }, Ut = { class: "text-xs" }, kt = { class: "flex items-center justify-end" }, gs = pe({ __name: "role", setup(m) { 144 const { t: n } = fe(), u = De(), l = _e(), o = $(() => { 145 var _a; 146 return (_a = l.profile) == null ? void 0 : _a.id; 147 }); 148 $(() => { 149 var _a; 150 return (_a = l.profile) == null ? void 0 : _a.nickName; 151 }); 152 const { data: L, loading: T, page: v, pageSize: h, total: c, refresh: k } = Je(({ page: s, pageSize: t }) => u("/api/application/".concat(l.appId, "/admin-user"), { query: { page: s, pageSize: t } }), { onError: (s) => { 153 console.error(s), P.error(n("role-settings.fetch-list-failed")); 154 } }), w = He(), N = $e(() => u("/api/subscription-asset/all"), "$h6pl2PdjeG"), M = $(() => { 155 var _a; 156 return le((_a = N.data.value) != null ? _a : []); 157 }), F = oe(""); 158 function q(s) { 159 var _a, _b; 160 const t = String((_a = s == null ? void 0 : s.nickName) != null ? _a : ""), f = String((_b = s == null ? void 0 : s.name) != null ? _b : ""); 161 return t && f && f !== t ? "".concat(t, "(").concat(f, ")") : t || f; 162 } 163 function I(s) { 164 var _a; 165 return String((_a = s == null ? void 0 : s.name) != null ? _a : ""); 166 } 167 function r(s) { 168 var _a, _b, _c; 169 const t = s.adminUser.accounts || []; 170 return ((_a = t.find((f) => f.type === ae.EMAIL)) == null ? void 0 : _a.accountId) || ((_c = (_b = t.find((f) => { 171 var _a2; 172 return !!((_a2 = f.data) == null ? void 0 : _a2.email); 173 })) == null ? void 0 : _b.data) == null ? void 0 : _c.email) || ""; 174 } 175 const b = async () => { 176 const s = M.value; 177 try {
178 F.value = n("role-settings.add-user"); 179 const t = s == null ? void 0 : s.find((f) => !f.adminUserId); 180 await w.open({ initialValues: { subscriptionAssetIds: t ? [t.id] : [] }, onSave: async (f) => { 181 await S(f); 182 } }), k(), N.refresh(); 183 } catch (e2) { 184 } 185 }, { copy: y } = Le(), S = async (s) => { 186 const t = await u("/api/application/admin-user/invite?appId=".concat(l.appId), { method: "POST", body: { adminUser: { name: s.name }, adminLevel: s.adminLevel, subscriptionAssetIds: s.subscriptionAssetIds } }); 187 return await V(t.adminUserId, s.subscriptionAssetIds), true; 188 }, V = async (s, t) => { 189 var _a, _b, _c, _d, _e2, _f, _g, _h, _i, _j, _k, _l; 190 const f = (_a = N.data.value) == null ? void 0 : _a.filter((a) => t == null ? void 0 : t.includes(a.id)), B = f && f.some((a) => Re.includes(a.subscriptionId)) ? "Invite-Design" : "Invite", C = (_b = l.appId) != null ? _b : "", ee = (_d = (_c = l.application) == null ? void 0 : _c.name) != null ? _d : "", Q = (_f = (_e2 = l.application) == null ? void 0 : _e2.avatar) != null ? _f : "", te = (_l = (_k = (_i = (_g = l.profile) == null ? void 0 : _g.nickName) != null ? _i : (_h = l.profile) == null ? void 0 : _h.email) != null ? _k : (_j = l.profile) == null ? void 0 : _j.phone) != null ? _l : "", se = B === "Invite-Design" ? "invite/design" : "invite", ne = await u("/api/share", { method: "POST", body: { resourceType: "Application", resourceId: l.appId, validateBefore: "FOREVER", redirectUrl: Fe(se, { appId: C, appName: ee, appAvatar: Q, creatorName: te }), data: { appId: C, adminUserId: s } } }), W = "".concat(location.origin, "/s/").concat(ne.alias); 191 y(W), P.success(n("role-settings.add-success", { link: W })); 192 }, Z = Te(), K = async (s) => { 193 var _a; 194 try { 195 F.value = n("role-settings.edit-user"), await w.open({ initialValues: { adminUserId: s.adminUserId, name: I(s.adminUser), displayNickName: s.adminUser.nickName, displayContact: (() => { 196 var _a2; 197 const t = r(s); 198 if (de) return t; 199 const f = ((_a2 = (s.adminUser.accounts || []).find((B) => B.type === ae.PHONE_NUMBER)) == null ? void 0 : _a2.accountId) || ""; 200 return [t, f].filter(Boolean).join(" / "); 201 })(), adminLevel: s.adminLevel, isActive: s.adminUser.isActive, subscriptionAssetIds: s.adminUser.subscriptionAssets.map((t) => t.id) }, mode: "update", onSave: (t) => u("/api/application/".concat(l.appId, "/admin-user/").concat(s.adminUserId), { method: "PATCH", body: { name: t.name, adminLevel: t.adminLevel, subscriptionAssetIds: t.subscriptionAssetIds } }) }), P.success(n("role-settings.edit-success")), k(), s.adminUser.id === ((_a = l.profile) == null ? void 0 : _a.id) && Oe(Z), N.refresh(); 202 } catch (e2) { 203 } 204 }, H = async (s) => { 205 try { 206 await u("/api/application/".concat(l.appId, "/admin-user/").concat(s), { method: "DELETE" }), P.success(n("common.message.delete-success")), k(), N.refresh(); 207 } catch (t) { 208 P.error(t.message); 209 } 210 }, J = (s, t) => { 211 re.confirm(n("role-settings.delete-user-popup"), n("common.warning"), { confirmButtonText: n("common.confirm"), cancelButtonText: n("common.cancel"), type: "error" }).then(() => { 212 H(s); 213 }); 214 }, _ = (s) => { 215 if (s.forever) return null; 216 const t = O(s.expiredAt); 217 if (t.isBefore(/* @__PURE__ */ new Date())) return n("role-settings.expired-time", { duration: O.duration(t.diff(/* @__PURE__ */ new Date())).humanize() }); 218 const f = O.duration(t.diff(/* @__PURE__ */ new Date())); 219 return n("role-settings.left-time", { duration: f.humanize() }); 220 }; 221 return (s, t) => { 222 const f = Ie, B = Be, C = Ye, ee = ve, Q = Ge, te = je, se = ze, ne = Ve, W = et; 223 return g(), R(X, null, [A("div", It, [d(e(G), { ability: [e(Y).Create, e(j).AdminUserOnApplication], behavior: "message-box", "show-contact": false }, { reason: i(() => [U(p(e(n)("role-settings.no-permission-tips")), 1)]), default: i(() => [d(f, { type: "primary", round: "", onClick: b }, { default: i(() => [U(p(e(n)("role-settings.add-user")), 1)]), _: 1 })]), _: 1 }, 8, ["ability"])]), Me((g(), x(se, { data: e(L), "current-row-key": "id", "max-height": "calc(100vh - 220p
223x)" }, { default: i(() => [d(C, { prop: "adminUser.nickName", label: e(n)("role-settings.table-column.nickName") }, { default: i((a) => { 224 var _a, _b; 225 return [A("div", At, [d(e(qe), { "admin-user": a.row.adminUser, size: 16, style: { "min-width": "16px" } }, null, 8, ["admin-user"]), A("span", ht, p(q(a.row.adminUser)), 1), A("div", yt, [((_a = e(l).application) == null ? void 0 : _a.ownerId) && ((_b = a.row.adminUser) == null ? void 0 : _b.id) === e(l).application.ownerId ? (g(), x(B, { key: 0, type: "success", size: "small", round: "", "disable-transitions": true }, { default: i(() => [U(p(e(n)("role-settings.owner")), 1)]), _: 1 })) : a.row.adminLevel === e(z).SUPER_ADMIN ? (g(), x(B, { key: 1, type: "warning", size: "small", round: "", "disable-transitions": true }, { default: i(() => [U(p(e(n)("roles.SUPER_ADMIN")), 1)]), _: 1 })) : D("", true)])])]; 226 }), _: 1 }, 8, ["label"]), e(de) ? (g(), x(C, { key: 0, prop: "adminUser.email", label: e(n)("common.email") }, { default: i((a) => [U(p(r(a.row)), 1)]), _: 1 }, 8, ["label"])) : D("", true), e(Pe) ? (g(), x(C, { key: 1, label: e(n)("common.contact") }, { default: i((a) => { 227 var _a; 228 return [A("div", wt, [A("span", null, p(r(a.row)), 1), A("span", null, p(((_a = (a.row.adminUser.accounts || []).find((E) => E.type === e(ae).PHONE_NUMBER)) == null ? void 0 : _a.accountId) || ""), 1)])]; 229 }), _: 1 }, 8, ["label"])) : D("", true), d(e(G), { ability: [[e(Y).Read, e(j).SubscriptionAsset]], behavior: "hidden" }, { default: i(() => [d(C, { prop: "seat", label: e(n)("role-settings.table-column.seat") }, { default: i(({ row: a }) => [(g(true), R(X, null, be(e(le)(a.adminUser.subscriptionAssets), (E) => (g(), R("div", { key: E.id, class: "flex flex-col items-start" }, [A("span", null, p(e(ge)(e(n), E.subscriptionId)), 1), E.forever ? D("", true) : (g(), x(ee, { key: 0, content: e(O)(E.expiredAt).format("YYYY-MM-DD hh:mm:ss"), placement: "right" }, { default: i(() => [A("span", Ut, p(_(E)), 1)]), _: 2 }, 1032, ["content"]))]))), 128))]), _: 1 }, 8, ["label"])]), _: 1 }, 8, ["ability"]), d(C, { prop: "createdAt", label: e(n)("role-settings.table-column.createdAt"), width: "140" }, { default: i((a) => [U(p(e(O)(a.row.createdAt).format("YYYY-MM-DD")), 1)]), _: 1 }, 8, ["label"]), d(C, { label: e(n)("common.operations"), align: "right", width: "140" }, { default: i((a) => [A("div", kt, [a.row.adminUser.isActive ? D("", true) : (g(), x(f, { key: 0, class: "mr-2", size: "small", round: "", icon: e(Ae), onClick: (E) => V(a.row.adminUserId, a.row.adminUser.subscriptionAssets.map((he) => he.id)) }, { default: i(() => [U(p(e(n)("settings.role.invite-link")), 1)]), _: 2 }, 1032, ["icon", "onClick"])), d(te, null, { default: i(() => [d(e(G), { ability: [e(Y).Update, e(j).AdminUserOnApplication], behavior: "disabled" }, { default: i(() => [d(Q, { onClick: (E) => K(a.row) }, { default: i(() => [U(p(e(n)("common.edit")), 1)]), _: 2 }, 1032, ["onClick"])]), _: 2 }, 1032, ["ability"]), d(e(G), { ability: [e(Y).Govern, e(j).AdminUserOnApplication], behavior: "disabled" }, { default: i(() => [d(Q, { disabled: e(o) === a.row.adminUserId, onClick: (E) => J(a.row.adminUserId, a.$index) }, { default: i(() => [U(p(e(n)("common.delete")), 1)]), _: 2 }, 1032, ["disabled", "onClick"])]), _: 2 }, 1032, ["ability"])]), _: 2 }, 1024)])]), _: 1 }, 8, ["label"])]), _: 1 }, 8, ["data"])), [[W, e(T)]]), d(ne, { "current-page": e(v), "onUpdate:currentPage": t[0] || (t[0] = (a) => ce(v) ? v.value = a : null), "page-size": e(h), "onUpdate:pageSize": t[1] || (t[1] = (a) => ce(h) ? h.value = a : null), class: "mt-4 flex justify-end", total: e(c) }, null, 8, ["current-page", "page-size", "total"]), d(Qe, { modal: e(w), "dialog-props": { title: e(F), width: "600px" } }, { default: i((a) => [a.params ? (g(), x(vt, { key: 0, "initial-values": a.params.initialValues, mode: a.params.mode, "on-save": a.params.onSave, "subscription-assets": e(M), onSuccess: e(w).onConfirm, onCancel: e(w).onCancel }, null, 8, ["initial-values", "mode", "on-save", "subscription-assets", "onSuccess", "onCancel"])) : D("", true)]), _: 1 }, 8, ["modal", "dialog-props"])], 64); 230 }; 231} }); 232export { 233 gs as default 234};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.