PageSourceSearch

https://app.zophous.ai/assets/posts-Csbbridh.js

js zophous.ai collected 2026-10-05 16:08:14 UTC 18,883 bytes, 1 lines download raw bytes

1import{j as t,r as m}from"./react-Ux6JKkVi.js";import{o as b,v as Fe,s as Z,G as qe,g as Ae,u as Le,M as Me,N as Oe}from"./opencut-77hmEi7z.js";import{P as Ye}from"./PageGuide-BAs2lsqe.js";import{G as Re}from"./guides-BM6pPaL3.js";import{k as E,B as T,I as Ee,T as Ke,D as Be}from"./index-BuVpVpcd.js";import{s as de,V as $e,y as ce,T as ue,Y as me,P as D,t as Ge,F as ne,D as ze,a as Ue,b as Ve,c as Qe,d as He,i as We,e as Ze,l as he,f as xe,g as fe,h as Y,j as Je,k as ae,m as Xe,M as Ie,r as et,n as tt,o as st,p as V,q as nt}from"./YouTubeSettings-D-azRNwM.js";import{M as pe}from"./Modal-ZqJXXsxV.js";import{a as at}from"./useSignedUrl-DArxJPqu.js";import{l as J}from"./batchSchedule-DekKA-IQ.js";import{a as it}from"./returnTo-B4eplrSt.js";import{b as ot,c as lt}from"./oauth-BOXPfhTU.js";import"./helpers-Bpr93w1e.js";import"./storage-BLCrNtuv.js";function rt({open:e,post:n,onClose:i}){const{url:a,isLoading:r}=at(e?de(n):null);return t.jsx(pe,{open:e,onClose:i,widthClassName:"max-w-sm",children:t.jsxs("div",{className:"space-y-3",children:[t.jsx("h2",{className:"font-display text-lg font-bold text-white",children:n.title}),a?t.jsx($e,{src:a}):t.jsx("div",{className:"flex aspect-[9/16] w-full max-w-[220px] items-center justify-center rounded-xl border border-[#1e1e2e] bg-black",children:t.jsx("p",{className:"px-4 text-center text-[11px] text-[#8888a8]",children:r?"Loading preview…":"Preview unavailable"})})]})})}const dt={scheduled:"Scheduled",delayed:"Delayed",posting:"Posting…",posted:"Posted",drafted:"Sent to drafts",failed:"Failed"},ye="youtube_quota_exceeded",ct=[[/^TikTok account is no longer connected/i,"TikTok was disconnected"],[/^YouTube was disconnected/i,"YouTube was disconnected"],[/^This video is no longer available/i,"This clip was deleted"],[/^subscription is no longer active|^Your plan no longer includes posting/i,"Your plan no longer includes posting"],[/^a different TikTok account/i,"A different TikTok account is connected now"],[/^A different YouTube channel/i,"A different YouTube channel is connected now"],[/^daily limit reached/i,"That day's post limit was already reached"]];function ge(e){if(!e)return null;if(e===ye)return"YouTube daily limit — retrying tomorrow";for(const[n,i]of ct)if(n.test(e))return i;return e}function F(e){const n=e.status==="claimed"?"posting":e.status==="posted"?"posted":e.status==="failed"?"failed":e.lastError===ye?"delayed":"scheduled";return{key:`sp:${e.id}`,platform:e.platform,title:e.title,at:e.scheduledAt,status:n,reason:n==="failed"||n==="delayed"?ge(e.lastError):null,link:e.platform==="youtube"&&n==="posted"&&e.publishId?ce(e.publishId):null,mediaRef:de(e),scheduled:e}}function ie(e){return e.media_kind==="ace_clip"?{resource:"ace_clip",id:String(e.media_id),index:Number(e.media_index??0)}:{resource:"shortform_variation",id:String(e.media_id)}}async function ut(e,n){const i=[...new Set(n.filter(l=>l.media_kind==="ace_clip").map(l=>String(l.media_id)))],a=[...new Set(n.filter(l=>l.media_kind==="shortform_variation").map(l=>String(l.media_id)))],[r,d]=await Promise.all([i.length?e.from("AceClipsList").select("id, clips").in("id",i):Promise.resolve({data:[]}),a.length?e.from("shortform_variations").select("id, topic_title, variation_letter").in("id",a):Promise.resolve({data:[]})]),c=new Map((r.data??[]).map(l=>[String(l.id),l])),f=new Map((d.data??[]).map(l=>[String(l.id),l]));return l=>{if(l.media_kind==="ace_clip"){const u=Number(l.media_index??0);return(c.get(String(l.media_id))?.clips??[])[u]?.title||`Clip ${u+1}`}const x=f.get(String(l.media_id));return x?.topic_title||(x?`Variation ${x.variation_letter}`:"Studio clip")}}async function oe(e,n,i,{until:a,limit:r=50}={}){let d=e.from("tiktok_posts").select("id, source, posted_at, media_kind, media_id, media_index").eq("manager_id",n).in("source",["direct","draft"]).gte("posted_at",i.toISOString()),c=e.from("youtube_posts").select("id, status, created_at, title, youtube_video_id, media_kind, media_id, media_index, error").eq("manager_id",n).eq("source","direct").gte("created_at",i.toISOString());a&&(d=d.lt("posted_at",a.toISOString()),c=c.lt("created_at",a.toISOString()));const[f,l]=await Promise.all([d.order("posted_at",{ascending:!1}).limit(r),c.order("created_at",{ascending:!1}).limit(r)]),x=f.data??[],u=l.data??[],p=await ut(e,x);return[...x.map(o=>({key:`tt:${o.id}`,platform:"tiktok",title:p(o),at:String(o.posted_at),status:o.source==="draft"?"drafted":"posted",reason:null,link:null,mediaRef:ie(o),scheduled:null})),...u.map(o=>({key:`yt:${o.id}`,platform:"youtube",title:String(o.title??""),at:String(o.created_at),status:o.status==="done"?"posted":o.status==="failed"?"failed":"posting",reason:o.status==="failed"?ge(o.error??null):null,link:o.status==="done"&&o.youtube_video_id?ce(String(o.youtube_video_id)):null,mediaRef:ie(o),scheduled:null}))].sort((o,S)=>S.at.localeCompare(o.at))}const mt={scheduled:"bg-[#7c3aed]/15 text-[#a78bfa]",delayed:"bg-[#f59e0b]/15 text-[#f5c26b]",posting:"bg-[#f59e0b]/15 text-[#f5c26b]",posted:"bg-[#10b981]/15 text-[#10b981]",drafted:"bg-[#7c3aed]/10 text-[#a78bfa]",failed:"bg-[#ef4444]/15 text-[#f5b1b1]"};function Q({item:e,timeZone:n,showDate:i=!1,onPreview:a,onEdit:r,onCancel:d,onRetry:c,onDismiss:f}){const[l,x]=m.useState(!1),[u,p]=m.useState(null),k=e.platform==="tiktok"?ue:me,o=new Date(e.at).toLocaleStr
1ing(void 0,i?{month:"short",day:"numeric",hour:"numeric",minute:"2-digit",timeZone:n}:{hour:"numeric",minute:"2-digit",timeZone:n}),S=e.scheduled!=null&&(e.status==="scheduled"||e.status==="delayed"||e.status==="failed");return t.jsxs("li",{className:"rounded-lg border border-[#1e1e2e] bg-[#111120] px-3 py-2",children:[t.jsxs("div",{className:"flex items-center gap-3",children:[t.jsx("span",{className:"shrink-0 text-[#8888a8]",title:D[e.platform],children:t.jsx(k,{className:"h-4 w-4"})}),t.jsxs("div",{className:"min-w-0 flex-1",children:[t.jsx("p",{className:"truncate text-sm font-medium text-white",children:e.title}),t.jsx("p",{className:"text-xs text-[#8888a8]",children:o})]}),t.jsx("span",{className:E("shrink-0 rounded-full px-2 py-0.5 text-[11px] font-semibold",mt[e.status]),children:dt[e.status]})]}),e.reason&&t.jsx("p",{className:E("mt-2 text-[11px]",e.status==="failed"?"text-[#f5b1b1]":"text-[#f5c26b]"),children:e.reason}),u&&t.jsx("p",{className:"mt-2 text-[11px] text-[#f5b1b1]",children:u}),t.jsxs("div",{className:"mt-2 flex flex-wrap justify-end gap-2",children:[e.scheduled&&t.jsx(T,{type:"button",variant:"ghost",size:"sm",onClick:()=>a(e),children:"Preview"}),e.link&&t.jsxs("a",{href:e.link,target:"_blank",rel:"noopener noreferrer",className:"rounded-lg px-2.5 py-1.5 text-xs font-semibold text-[#a78bfa]",children:["View on ",D[e.platform]]}),S&&t.jsx(T,{type:"button",variant:"ghost",size:"sm",onClick:()=>r(e),children:"Edit"}),e.status==="failed"&&e.scheduled&&t.jsxs(t.Fragment,{children:[t.jsx(T,{type:"button",variant:"ghost",size:"sm",disabled:l,onClick:async()=>{x(!0),p(await c(e)),x(!1)},children:l?"Retrying…":"Retry"}),t.jsx(T,{type:"button",variant:"ghost",size:"sm",onClick:()=>f(e),children:"Dismiss"})]}),(e.status==="scheduled"||e.status==="delayed")&&e.scheduled&&t.jsx(T,{type:"button",variant:"ghost",size:"sm",onClick:()=>d(e),children:"Cancel"})]})]})}function ht(e){return{...We(e.title,e.description),privacy:e.privacyLevel,allowComment:!e.disableComment,allowDuet:!e.disableDuet,allowStitch:!e.disableStitch,commercialDisclosure:e.brandOrganicType||e.brandContentType,yourBrand:e.brandOrganicType,brandedContent:e.brandContentType,mode:"schedule"}}function xt({open:e,post:n,workspaceId:i,onClose:a,onSaved:r}){return e?t.jsx(ft,{post:n,workspaceId:i,onClose:a,onSaved:r}):null}function ft({post:e,workspaceId:n,onClose:i,onSaved:a}){const[r,d]=m.useState(e.title),[c,f]=m.useState(e.description),[l,x]=m.useState(Ge(new Date(e.scheduledAt))),[u,p]=m.useState(()=>ht(e)),[k,o]=m.useState(e.youtubePrivacy),[S,j]=m.useState(!1),[N,A]=m.useState(null),P=b({queryKey:["post-sheet-account",e.platform,n],queryFn:()=>e.platform==="tiktok"?he(n):xe(n,fe())}),L=async()=>{j(!0),A(null);const h=await Ze(e,n,{scheduledAt:l?new Date(l):void 0,title:r.trim(),description:c.trim(),...e.platform==="tiktok"?{privacyLevel:u.privacy??void 0,disableComment:!u.allowComment,disableDuet:!u.allowDuet,disableStitch:!u.allowStitch,brandOrganicType:u.commercialDisclosure&&u.yourBrand,brandContentType:u.commercialDisclosure&&u.brandedContent}:{youtubePrivacy:k??void 0}});j(!1),h.ok?a():A(h.error)},g=P.data,w=e.platform==="tiktok"&&g?.status==="ready"&&"creator_nickname"in g.info?g.info:null,v=e.platform==="youtube"&&g?.status==="ready"&&"dailyLimit"in g.info?g.info:null,M=w!=null||v!=null;return t.jsx(pe,{open:!0,onClose:i,widthClassName:"max-w-xl",children:t.jsxs("div",{className:"space-y-4",children:[t.jsxs("h2",{className:"font-display text-lg font-bold text-white",children:["Edit ",D[e.platform]," post"]}),t.jsx(ne,{label:"Title",htmlFor:"edit-title",children:t.jsx(Ee,{id:"edit-title",value:r,maxLength:e.platform==="youtube"?100:150,onChange:h=>d(h.target.value)})}),t.jsx(ne,{label:"Description",htmlFor:"edit-description",children:t.jsx(Ke,{id:"edit-description",rows:2,value:c,onChange:h=>f(h.target.value)})}),t.jsxs("div",{children:[t.jsx("p",{className:"mb-1.5 text-xs font-semibold text-white",children:"Post at"}),t.jsx(ze,{ariaLabel:"Post at",value:l,min:new Date,onChange:x})]}),g?.status==="disconnected"&&t.jsxs("p",{className:"text-xs text-[#f5c26b]",children:[D[e.platform]," is disconnected — reconnect it to edit this post."]}
1),w&&t.jsx(Ue,{state:{...u,title:r,description:c},info:w,onPatch:h=>p(_=>({..._,...h})),onBranded:h=>p(_=>Qe(_,h)),onDisclosure:h=>p(_=>Ve(_,h))}),v&&t.jsx(He,{privacy:k,info:v,onPrivacy:o}),N&&t.jsx("p",{className:"rounded-lg border border-[#ef4444]/40 bg-[#ef4444]/10 px-3 py-2 text-sm text-[#f5b1b1]",children:N}),t.jsxs("div",{className:"flex justify-end gap-2",children:[t.jsx(T,{type:"button",variant:"ghost",onClick:i,children:"Close"}),t.jsx(T,{type:"button",variant:"gradient",disabled:S||!M,onClick:()=>{L()},children:S?"Saving…":"Save changes"})]})]})})}function H(e){const n=i=>String(i).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())}`}function R(e){const[n,i,a]=e.split("-").map(Number);return new Date(n,i-1,a)}function be(e,n){const i=new Map;for(const a of[...e].sort((r,d)=>r.at.localeCompare(d.at))){const r=J(new Date(a.at),n),d=i.get(r);d?d.push(a):i.set(r,[a])}return i}const pt=["scheduled","delayed","posting"];function yt(e,n,i=new Date){const a=J(i,n),r=[...be(e,n).entries()].find(([d,c])=>d>=a&&c.some(f=>pt.includes(f.status)));return r?r[0]:a}const le=30,q=864e5,re=3,gt={scheduled:"bg-[#7c3aed]/20 text-[#c4b5fd]",delayed:"bg-[#f59e0b]/15 text-[#f5c26b]",posting:"bg-[#f59e0b]/15 text-[#f5c26b]",posted:"bg-[#10b981]/10 text-[#6ee7b7]",drafted:"bg-white/[0.05] text-[#a0a0b8]",failed:"bg-[#ef4444]/15 text-[#f5b1b1]"};function W(e,n){return e.getFullYear()===n.getFullYear()&&e.getMonth()===n.getMonth()}function bt({items:e,timeZone:n}){if(e.length===0)return null;const i=e.length-re;return t.jsxs(t.Fragment,{children:[t.jsx("span",{className:"self-start rounded-full bg-[#7c3aed]/25 px-1.5 text-[10px] font-semibold text-[#c4b5fd] sm:hidden",children:e.length}),t.jsxs("span",{className:"hidden flex-col gap-0.5 sm:flex",children:[e.slice(0,re).map(a=>{const r=a.platform==="tiktok"?ue:me;return t.jsxs("span",{title:a.title,className:E("flex items-center gap-1 truncate rounded px-1 py-0.5 text-[10px] font-medium",gt[a.status]),children:[t.jsx(r,{className:"h-2.5 w-2.5 shrink-0"}),new Date(a.at).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit",timeZone:n})]},a.key)}),i>0&&t.jsxs("span",{className:"px-1 text-[10px] text-[#8888a8]",children:["+",i," more"]})]})]})}function jt({workspaceId:e,initialMonth:n}){const[i,a]=m.useState(n?Y(n):null),[r,d]=m.useState(null),[c,f]=m.useState("all"),[l,x]=m.useState(null),[u,p]=m.useState(null),k=qe(),o=Ae(),{data:S}=b({queryKey:["workspace-timezone",e],queryFn:()=>st(o,e)}),j=Je(S),N=s=>c==="all"||s.platform===c,A=m.useMemo(()=>({from:new Date(Date.now()-2*q),to:new Date(Date.now()+15*q)}),[]),{data:P=[]}=b({queryKey:["scheduled-posts",e,"upcoming"],queryFn:()=>V(o,{workspaceId:e,...A})}),L=yt(P.map(F).filter(N),j),g=r??L,w=i??Y(R(L)),v=Y(w),M=new Date(v.getTime()-q),h=new Date(new Date(v.getFullYear(),v.getMonth()+1,1).getTime()+q),{data:_=[]}=b({queryKey:["scheduled-posts",e,v.toISOString()],queryFn:()=>V(o,{workspaceId:e,from:M,to:h})}),{data:je=[]}=b({queryKey:["post-history",e,v.toISOString()],queryFn:()=>oe(o,e,M,{until:h,limit:200})}),X=m.useMemo(()=>new Date(Date.now()-le*q),[]),{data:ve=[]}=b({queryKey:["attention-posts",e],queryFn:()=>nt(o,e)}),{data:ke=[]}=b({queryKey:["scheduled-posts",e,"history"],queryFn:()=>V(o,{workspaceId:e,from:X,to:new Date})}),{data:Se=[]}=b({queryKey:["post-history",e],queryFn:()=>oe(o,e,X)}),we=b({queryKey:["post-sheet-account","tiktok",e],queryFn:()=>he(e)}),Te=b({queryKey:["post-sheet-account","youtube",e],queryFn:()=>xe(e,fe())}),I=new Map;for(const s of[..._.map(F),...je,...P.map(F)])I.set(s.key,s);const K=be([...I.values()].filter(N),j),B=ve.map(F).filter(N),$=[...ke.filter(s=>s.status==="posted").map(F),...Se].filter(N).sort((s,y)=>y.at.localeCompare(s.at)),O=J(new Date,j),ee=R(g),C=K.get(g)??[],Ne=s=>{d(H(s)),W(s,w)||a(Y(s))},_e=s=>{a(s),d(W(R(O),s)?O:H(s))},G=()=>{k.invalidateQueries({queryKey:["scheduled-posts",e]}),k.invalidateQueries({queryKey:["attention-posts",e]})},te=async(s,y)=>{!s.scheduled||!window.confirm(y)||(await tt(o,s.scheduled.id),G())},De=async s=>{if(!s.scheduled)return null;const y=await et(s.scheduled,e);return G(),y.ok?null:y.error},z=s=>P.filter(y=>y.platform===s&&y.status==="pending").length,Pe=ae.filter(s=>(s==="tiktok"?we.data:Te.data)?.status==="disconnected"&&z(s)>0),Ce=s=>{const y=window.location.origin;it(s==="tiktok"?ot(e,y):lt(e,y),`/workspace/${e}/posts`)},U={timeZone:j,onPreview:s=>{s.scheduled&&x(s.scheduled)},onEdit:s=>{s.scheduled&&p(s.scheduled)},onCancel:s=>
1{te(s,"Cancel this scheduled post? This can't be undone.")},onRetry:De,onDismiss:s=>{te(s,"Remove this failed post from the list?")}},se=K.size===0&&B.length===0&&$.length===0;return t.jsxs("div",{className:"space-y-5 p-4 sm:p-8 max-w-6xl",children:[t.jsxs("div",{children:[t.jsx("h1",{className:"font-display text-xl sm:text-2xl font-bold text-white",children:"Posts"}),t.jsxs("p",{className:"text-sm text-[#8888a8]",children:["Everything you've posted or scheduled, across TikTok and YouTube. Times in ",Xe(j),"."]})]}),t.jsx(Ye,{guideKey:"posts",...Re.posts}),Pe.map(s=>t.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-xl border border-[#f59e0b]/40 bg-[#f59e0b]/[0.07] px-3 py-2.5",children:[t.jsxs("p",{className:"text-sm text-[#f5c26b]",children:[D[s]," is disconnected — ",z(s)," scheduled post",z(s)===1?"":"s"," will fail."]}),t.jsxs(T,{type:"button",variant:"gradient",size:"sm",onClick:()=>Ce(s),children:["Reconnect ",D[s]]})]},s)),t.jsx("div",{role:"tablist","aria-label":"Platform",className:"flex gap-1",children:["all",...ae].map(s=>t.jsx("button",{type:"button",role:"tab","aria-selected":c===s,onClick:()=>f(s),className:E("rounded-lg px-3 py-1.5 text-xs font-semibold",c===s?"bg-[#7c3aed]/20 text-white":"text-[#8888a8] hover:text-white"),children:s==="all"?"All":D[s]},s))}),se&&t.jsxs("div",{className:"rounded-xl border border-dashed border-[#1e1e2e] p-10 text-center",children:[t.jsx("p",{className:"font-semibold text-white",children:"Nothing posted or scheduled yet."}),t.jsx("p",{className:"mt-1 text-sm text-[#8888a8]",children:"Post a clip and it shows up here."}),t.jsx(Z,{to:"/workspace/$id/ace-clips",params:{id:e},className:"mt-4 inline-block rounded-lg bg-gradient-brand px-4 py-2 text-sm font-semibold text-white",children:"Go to your clips"})]}),B.length>0&&t.jsxs("section",{className:"space-y-2 rounded-xl border border-[#ef4444]/30 bg-[#ef4444]/[0.04] p-3",children:[t.jsx("h2",{className:"text-xs font-semibold uppercase tracking-wide text-[#f5b1b1]",children:"Needs attention"}),t.jsx("ul",{className:"space-y-2",children:B.map(s=>t.jsx(Q,{item:s,showDate:!0,...U},s.key))})]}),!se&&t.jsxs(t.Fragment,{children:[t.jsx(Ie,{size:"large",month:w,onMonthChange:_e,selected:ee,onSelect:Ne,today:R(O),renderDay:s=>W(s,w)?t.jsx(bt,{items:K.get(H(s))??[],timeZone:j}):null}),t.jsxs("section",{className:"space-y-2",children:[t.jsxs("h2",{className:"text-sm font-semibold text-white",children:[ee.toLocaleDateString(void 0,{weekday:"long",month:"long",day:"numeric"}),C.length>0&&t.jsxs("span",{className:"font-normal text-[#8888a8]",children:[" · ",C.length," post",C.length===1?"":"s"]})]}),C.length>0?t.jsx("ul",{className:"space-y-2",children:C.map(s=>t.jsx(Q,{item:s,...U},s.key))}):t.jsxs("div",{className:"rounded-xl border border-dashed border-[#1e1e2e] px-4 py-6 text-center",children:[t.jsx("p",{className:"text-sm text-[#8888a8]",children:"Nothing on this day."}),g>=O&&t.jsx(Z,{to:"/workspace/$id/ace-clips",params:{id:e},className:"mt-2 inline-block text-sm font-semibold text-[#a78bfa] hover:text-white",children:"Schedule clips from your clips"})]})]})]}),$.length>0&&t.jsxs("section",{className:"space-y-2",children:[t.jsxs("h2",{className:"text-xs font-semibold uppercase tracking-wide text-[#8888a8]",children:["History · last ",le," days"]}),t.jsx("ul",{className:"space-y-2",children:$.map(s=>t.jsx(Q,{item:s,showDate:!0,...U},s.key))})]}),l&&t.jsx(rt,{open:!0,post:l,onClose:()=>x(null)}),u&&t.jsx(xt,{open:!0,post:u,workspaceId:e,onClose:()=>p(null),onSaved:()=>{p(null),G()}})]})}function vt({workspaceId:e,isPaid:n,isLoading:i,children:a}){return Fe("posts_gate",!i&&!n),i?null:n?t.jsx(t.Fragment,{children:a}):t.jsxs("div",{className:"mx-auto mt-10 max-w-md rounded-xl border border-[#1e1e2e] bg-[#111120] p-6 text-center",children:[t.jsx("h2",{className:"text-base font-semibold text-white",children:"Posting is a paid feature"}),t.jsx("p",{className:"mt-2 text-sm leading-relaxed text-[#8888a8]",children:"Post and schedule to TikTok and YouTube — up to 15 posts a day, depending on your plan."}),t.jsx(Z,{to:"/workspace/$id/billing",params:{id:e},search:{code:null,from:"posts_gate"},className:"mt-5 inline-block rounded-lg bg-[#7c3aed] px-4 py-2 text-sm font-semibold text-white hover:bg-[#6d28d9]",children:"Upgrade your plan"})]})}function kt({isPaid:e,paidLoading:n,allowance:i,allowanceLoading:a}){return{canView:e===!0||i?.everUnlocked===!0,loading:n||e!==!0&&a}}function Ot(){const{id:e}=Be.useParams(),{session:n}=Le(),{data:i,isLoading:a}=Me(n?.user?.id??""),{data:r,isLoading:d}=Oe(),{canView:c,loading:f}=kt({isPaid:i,paidLoading:a,allowance:r,allowanceLoading:d});return t.jsx(vt,{workspaceId:e,isPaid:c,isLoading:f,children:t.jsx(jt,{workspaceId:e})})}export{vt as PostsGate,jt as PostsView,Ot as component,kt as postsAccess};

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.