PageSourceSearch

https://utilzip.com/_next/static/chunks/4706.ffb84ab9cb26f694.js

js utilzip.com collected 2026-09-24 14:58:32 UTC 18,857 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4706],{14706:(e,t,r)=>{r.r(t),r.d(t,{default:()=>v});var n=r(95155),a=r(94801),i=r(12115),l=r(46339),s=r(92531),o=r(16443),c=r(69174),d=r(31166);let u=["image/jpeg","image/png","image/webp"],f={jpeg:"image/jpeg",png:"image/png",webp:"image/webp"},h={jpeg:"jpg",png:"png",webp:"webp"},g={tiff:!0,exif:!0,gps:!0,interop:!0,ifd1:!1,jfif:!0,ihdr:!0,iptc:!0,icc:!0,xmp:!0,mergeOutput:!0,sanitize:!0,translateKeys:!0,translateValues:!0,reviveValues:!0};async function m(e){if(!globalThis.crypto?.subtle)return null;try{let t=await crypto.subtle.digest("SHA-256",e);return Array.from(new Uint8Array(t)).map(e=>e.toString(16).padStart(2,"0")).join("")}catch{return null}}let p={192:"Baseline DCT, Huffman coding",193:"Extended sequential DCT, Huffman coding",194:"Progressive DCT, Huffman coding",195:"Lossless, Huffman coding",201:"Extended sequential DCT, arithmetic coding",202:"Progressive DCT, arithmetic coding"},b={22:"YCbCr4:2:0",21:"YCbCr4:2:2",12:"YCbCr4:4:0",11:"YCbCr4:4:4"};async function x(e){try{let t=await createImageBitmap(e),r={w:t.width,h:t.height};return t.close(),r}catch{return null}}async function w(e,t,r,n){var a;let i=[],l=(e,t)=>{let r=function e(t){if(null==t)return null;if(t instanceof Date)return Number.isNaN(t.getTime())?null:function(e){let t=e=>String(e).padStart(2,"0");return`${e.getFullYear()}:${t(e.getMonth()+1)}:${t(e.getDate())} ${t(e.getHours())}:${t(e.getMinutes())}:${t(e.getSeconds())}`}(t);if("number"==typeof t)return Number.isFinite(t)?String(Math.round(1e5*t)/1e5):null;if("string"==typeof t)return t.trim()||null;if("boolean"==typeof t)return t?"Yes":"No";if(t instanceof Uint8Array||t instanceof ArrayBuffer)return`(Binary data ${t.byteLength} bytes)`;if(Array.isArray(t)){let r=t.map(e).filter(e=>null!==e);return r.length?r.join(t.every(e=>"number"==typeof e)?" ":", "):null}return null}(t);null!==r&&i.push({k:e,v:r})};for(let[i,s]of(l("checksum",await m(t)),l("file_name",e.name),l("file_size",(a=e.size)>=1e6?`${(a/1e3/1e3).toFixed(1)} MB`:a>=1e3?`${Math.round(a/1e3)} kB`:`${a} bytes`),l("file_type",r.toUpperCase()),l("file_type_extension",h[r]),l("mime_type",e.type||f[r]),Object.entries(n)))l(i.replace(/([a-z0-9])([A-Z])/g,"$1_$2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").toLowerCase(),s);if("jpeg"===r){let e=function(e){let t=new Uint8Array(e),r=new DataView(e),n=2;for(;n+3<t.length;){if(255!==t[n]){n+=1;continue}let e=t[n+1];if(255===e||216===e||e>=208&&e<=217){n+=2;continue}if(218===e)break;let a=r.getUint16(n+2);if(a<2||n+2+a>t.length)break;if(e>=192&&e<=207&&196!==e&&200!==e&&204!==e){let r=t[n+9],a={encoding_process:p[e]??`Unknown (0x${e.toString(16)})`,bits_per_sample:t[n+4],color_components:r};if(3===r){let e=t[n+11]>>4,r=15&t[n+11];a.y_cb_cr_sub_sampling=`${b[`${e}${r}`]??"YCbCr"} (${e} ${r})`}return a}n+=2+a}return null}(t);if(e)for(let[t,r]of Object.entries(e))l(t,r)}let s=await x(e);return s&&(l("image_width",s.w),l("image_height",s.h),l("image_size",`${s.w}x${s.h}`),l("megapixels",Number((s.w*s.h/1e6).toFixed(3)))),l("category","image"),l("raw_header",function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:128;return Array.from(new Uint8Array(e,0,Math.min(t,e.byteLength))).map(e=>e.toString(16).toUpperCase().padStart(2,"0")).join(" ")}(t)),i}function v(){let[e,t]=(0,i.useState)([]),[h,m]=(0,i.useState)(null),[p,b]=(0,i.useState)(!1),[x,v]=(0,i.useState)(""),[y,j]=(0,i.useState)(null),{copy:N,copied:_}=(0,c.i)(),U=(0,i.useRef)(null),k=(0,i.useRef)(e);k.current=e;let C=(0,i.useRef)(!1),A=(0,i.useRef)(!0),E=(0,i.useRef)(null),D=(0,i.useCallback)(e=>{let r=Array.from(e),n=r.filter(e=>u.includes(e.type)),i=n.filter(e=>e.size>0x3200000),l=n.filter(e=>e.size<=0x3200000);if(r.length>0&&0===n.length)return void v("JPG \xb7 PNG \xb7 WebP 이미지만 올릴 수 있어요.");if(i.length>0&&v(`장당 50MB 이하만 올릴 수 있어요. ${i.length}장을 제외했어요.`),0===l.length)return;(0,a.s)("exif_viewer_files_added",{file_count:l.length});let s=k.current.length,o=50-s;l.length>o&&v(`최대 50장까지 한 번에 처리할 수 있어요. ${l.length-o}장을 제외했어요.`);let c=l.slice(0,Math.max(0,o)).map(e=>({id:Math.random().toString(36).slice(2,10),file:e,previewUrl:URL.createObjectURL(e),status:"pending"}));c.length&&(t(e=>[...e,...c]),0===s&&m(c[0].id))},[]);(0,i.useEffect)(()=>{let e=0,t=t=>{let r=[];for(let n of Array.from(t.clipboardData?.items??[]))if("file"===n.kind&&n.type.startsWith("image/")){let t=n.getAsFile();if(t){e+=1;let n="image/png"===t.type?"png":"image/webp"===t.type?"webp":"jpg";r.push(new File([t],t.name||`붙여넣은-이미지-${e}.${n}`,{type:t.type}))}}r.length&&(t.preventDefault(),D(r))};return document.addEventListener("paste",t),()=>document.removeEventListener("paste",t)},[D]);let $=(0,i.useCallback)(async()=>
1{if(C.current)return;C.current=!0,(0,a.s)("exif_viewer_started",{file_count:k.current.filter(e=>"pending"===e.status).length});let e=0;for(;A.current;){let a=k.current.find(e=>"pending"===e.status);if(!a)break;t(e=>e.map(e=>e.id===a.id?{...e,status:"processing"}:e)),await new Promise(e=>setTimeout(e,0));try{var n;let e,i=await a.file.arrayBuffer(),l=function(e){let t=new Uint8Array(e,0,Math.min(16,e.byteLength));if(255===t[0]&&216===t[1])return"jpeg";if(137===t[0]&&80===t[1]&&78===t[2]&&71===t[3])return"png";if(t.length>=12&&82===t[0]&&73===t[1]&&70===t[2]&&70===t[3]&&87===t[8]&&69===t[9]&&66===t[10]&&80===t[11])return"webp";throw Error("UNSUPPORTED_FORMAT")}(i),s={};try{let t=await Promise.all([r.e(5376),r.e(7573)]).then(r.bind(r,17573));s=await t.parse(i,g)??{},"jpeg"===l&&(e=await t.orientation(i).catch(()=>void 0)??void 0)}catch{s={}}let o=await w(a.file,i,l,s),c=(n=e,"jpeg"===l?function(e,t){let r=new Uint8Array(e),n=new DataView(e);if(r.length<4||255!==r[0]||216!==r[1])throw Error("JPEG_INVALID");let a=[r.subarray(0,2)],i=2;for(;i+1<r.length;){if(255!==r[i])throw Error("JPEG_INVALID");for(;i+1<r.length&&255===r[i]&&255===r[i+1];)a.push(r.subarray(i,i+1)),i+=1;if(i+1>=r.length)throw Error("JPEG_INVALID");let e=r[i+1];if(217===e||e>=208&&e<=215){a.push(r.subarray(i,i+2)),i+=2;continue}if(218===e){a.push(r.subarray(i,r.length)),i=r.length;break}if(i+4>r.length)throw Error("JPEG_INVALID");let t=n.getUint16(i+2),l=i+2+t;if(t<2||l>r.length)throw Error("JPEG_INVALID");let s=225===e,o=237===e;s||o||a.push(r.subarray(i,l)),i=l}if(void 0!==t&&1!==t){let e=1;a[1]&&255===a[e][0]&&224===a[e][1]&&(e+=1),a.splice(e,0,function(e){let t=new Uint8Array(36),r=new DataView(t.buffer);return t.set([255,225,0,34],0),t.set([69,120,105,102,0,0],4),t.set([73,73,42,0],10),r.setUint32(14,8,!0),r.setUint16(18,1,!0),r.setUint16(20,274,!0),r.setUint16(22,3,!0),r.setUint32(24,1,!0),r.setUint16(28,e,!0),t}(t))}let l=new Uint8Array(a.reduce((e,t)=>e+t.length,0)),s=0;for(let e of a)l.set(e,s),s+=e.length;return l.buffer}(i,n):"png"===l?function(e){let t=new Uint8Array(e),r=new DataView(e);if(t.length<8||[137,80,78,71,13,10,26,10].some((e,r)=>t[r]!==e))throw Error("PNG_INVALID");let n=new Set(["eXIf","tEXt","zTXt","iTXt"]),a=[t.subarray(0,8)],i=8;for(;i+8<=t.length;){let e=r.getUint32(i),l=String.fromCharCode(t[i+4],t[i+5],t[i+6],t[i+7]),s=i+8+e+4;if(s>t.length)throw Error("PNG_INVALID");if(n.has(l)||a.push(t.subarray(i,s)),i=s,"IEND"===l)break}let l=new Uint8Array(a.reduce((e,t)=>e+t.length,0)),s=0;for(let e of a)l.set(e,s),s+=e.length;return l.buffer}(i):function(e){let t=new Uint8Array(e),r=new DataView(e);if(t.length<12||"RIFF"!==String.fromCharCode(t[0],t[1],t[2],t[3])||"WEBP"!==String.fromCharCode(t[8],t[9],t[10],t[11]))throw Error("WEBP_INVALID");let n=[],a=12;for(;a+8<=t.length;){let e=String.fromCharCode(t[a],t[a+1],t[a+2],t[a+3]),i=r.getUint32(a+4,!0),l=a+8,s=l+i;if(s>t.length)throw Error("WEBP_INVALID");if("EXIF"===e||"XMP "===e){a=s+i%2;continue}let o=t.subarray(l,s);if("VP8X"===e){let e=new Uint8Array(o);e[0]=-13&e[0],o=e}n.push({type:e,data:o}),a=s+i%2}let i=new TextEncoder,l=[],s=0;for(let e of n){let t=new Uint8Array(8);t.set(i.encode(e.type),0),new DataView(t.buffer).setUint32(4,e.data.length,!0),l.push(t,e.data),s+=8+e.data.length,e.data.length%2==1&&(l.push(new Uint8Array([0])),s+=1)}let o=new Uint8Array(12+s);o.set(i.encode("RIFF"),0),new DataView(o.buffer).setUint32(4,4+s,!0),o.set(i.encode("WEBP"),8);let c=12;for(let e of l)o.set(e,c),c+=e.length;return o.buffer}(i)),d=new Blob([c],{type:a.file.type||f[l]});if(!A.current)break;t(e=>e.map(e=>e.id===a.id?{...e,status:"done",rows:o,cleanedBlob:d}:e))}catch(r){if(!A.current)break;let e=r instanceof Error&&"UNSUPPORTED_FORMAT"===r.message?"지원하지 않는 이미지 형식입니다 — JPG\xb7PNG\xb7WebP로 저장해 다시 올려주세요.":"이미지 구조를 읽을 수 없습니다 — 다른 프로그램에서 다시 저장한 뒤 올려주세요.";t(t=>t.map(t=>t.id===a.id?{...t,status:"error",errorMsg:e}:t))}e+=1}C.current=!1,A.current&&e>0&&(0,a.s)("exif_viewer_completed",{file_count:e})},[]);(0,i.useEffect)(()=>{e.some(e=>"pending"===e.status)&&$()},[e,$]),(0,i.useEffect)(()=>(A.current=!0,()=>{A.current=!1,E.current&&clearTimeout(E.current),k.current.forEach(e
1=>URL.revokeObjectURL(e.previewUrl))}),[]);let P=e=>{j(e),E.current&&clearTimeout(E.current),E.current=setTimeout(()=>j(null),1500)},L=async()=>{let t=e.filter(e=>"done"===e.status&&e.cleanedBlob);if(!t.length)return;(0,a.s)("exif_viewer_zip_download",{file_count:t.length});let{default:n}=await Promise.all([r.e(5376),r.e(7496)]).then(r.t.bind(r,7496,23)),i=new n,l=new Map;t.forEach(e=>{let t=e.file.name,r=t,n=l.get(t)??0;n>0&&(r=t.replace(/(\.[^.]+)$/,`_${n}$1`)),l.set(t,n+1),i.file(r,e.cleanedBlob)});let s=URL.createObjectURL(await i.generateAsync({type:"blob"}));Object.assign(document.createElement("a"),{href:s,download:"exif-제거-이미지.zip"}).click(),URL.revokeObjectURL(s),P("all")},R=e.length>0,I=e.find(e=>e.id===h)??e[0],S=e.length>0&&e.every(e=>"done"===e.status||"error"===e.status),T=e.filter(e=>"done"===e.status),V=e.length>=2,B=!S||0===T.length,M=I?.rows?{lat:I.rows.find(e=>"latitude"===e.k)?.v,lng:I.rows.find(e=>"longitude"===e.k)?.v}:null;return(0,n.jsxs)("div",{className:"space-y-4",children:[!R&&(0,n.jsx)(s.A,{onFiles:D,accept:u.join(","),multiple:!0,icon:(0,n.jsx)(l.iR,{size:52,className:"text-accent"}),label:"사진 선택",hint:`JPG \xb7 PNG \xb7 WebP \xb7 Ctrl+V 붙여넣기 \xb7 최대 50장 \xb7 장당 50MB`}),R&&(0,n.jsxs)("div",{onDragOver:e=>{e.preventDefault(),b(!0)},onDragLeave:e=>{e.currentTarget.contains(e.relatedTarget)||b(!1)},onDrop:e=>{e.preventDefault(),b(!1),D(e.dataTransfer.files)},className:"relative",children:[p&&(0,n.jsx)("div",{className:"absolute inset-0 z-20 pointer-events-none flex items-center justify-center rounded-2xl bg-accent-sub/70",children:(0,n.jsx)("span",{className:"rounded-full bg-white px-5 py-2.5 text-sm font-semibold text-accent shadow-lg",children:"놓으면 이미지가 추가됩니다"})}),(0,n.jsxs)("div",{className:"grid items-start gap-5 lg:grid-cols-[minmax(0,44%)_minmax(0,1fr)] lg:gap-8",children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("div",{className:"flex h-[clamp(220px,38vh,380px)] items-center justify-center overflow-hidden",children:I&&(0,n.jsxs)("div",{className:"relative inline-flex max-h-full max-w-full",children:[(0,n.jsx)("img",{src:I.previewUrl,alt:I.file.name,draggable:!1,decoding:"async",className:"max-h-full max-w-full rounded-lg object-contain shadow-sm ring-1 ring-warm-200/70"}),("pending"===I.status||"processing"===I.status)&&(0,n.jsx)("div",{className:"pointer-events-none absolute inset-0 rounded-lg bg-white/40","aria-hidden":"true"})]})}),(0,n.jsx)("div",{className:"mt-3 overflow-x-auto",children:(0,n.jsxs)("div",{className:"mx-auto flex w-max items-center gap-2 px-1 py-1",children:[e.map(e=>(0,n.jsxs)("div",{role:"button",tabIndex:0,onClick:()=>m(e.id),onKeyDown:t=>{("Enter"===t.key||" "===t.key)&&(t.preventDefault(),m(e.id))},"aria-label":e.file.name,className:`group relative h-16 w-16 shrink-0 cursor-pointer overflow-hidden rounded-lg border-2 transition ${e.id===I?.id?"border-accent":"border-transparent hover:border-warm-200"} ${"error"===e.status?"ring-2 ring-red-300":""}`,children:[(0,n.jsx)("img",{src:e.previewUrl,alt:"",draggable:!1,loading:"lazy",decoding:"async",className:`h-full w-full object-cover transition ${"done"!==e.status&&"error"!==e.status?"opacity-40":""}`}),(0,n.jsx)("button",{type:"button","aria-label":"이미지 제거",onClick:r=>{r.stopPropagation();var n=e.id;let a=k.current.find(e=>e.id===n);a?.previewUrl&&URL.revokeObjectURL(a.previewUrl);let i=k.current.filter(e=>e.id!==n);t(i),h===n&&m(i[0]?.id??null)},onKeyDown:e=>e.stopPropagation(),className:"absolute right-0.5 top-0.5 hidden h-5 w-5 items-center justify-center rounded-md bg-warm-800/60 text-[10px] text-white hover:bg-red-500 group-hover:flex max-lg:flex",children:"✕"})]},e.id)),(0,n.jsxs)("button",{onClick:()=>U.current?.click(),"aria-label":"이미지 추가",className:"flex h-16 w-16 shrink-0 flex-col items-center justify-center gap-0.5 rounded-lg border-2 border-dashed border-warm-200 text-warm-400 transition hover:border-accent/60 hover:text-accent",children:[(0,n.jsx)("span",{className:"text-lg leading-none",children:"+"}),(0,n.jsx)("span",{className:"text-[10px]",children:"추가"})]})]})})]}),I&&(0,n.jsxs)("div",{className:"min-w-0",children:[("pending"===I.status||"processing"===I.status)&&(0,n.jsx)("p",{className:"py-2 text-sm text-warm-400",children:"pending"===I.status?"대기 중":"메타데이터 확인 중"}),"error"===I.status&&(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 py-2",children:[(0,n.jsx)("p",{className:"text-sm text-red-500",children:I.errorMsg}),(0,n.jsx)("button",{onClick:()=>{var e;return e=I.id,void t(t=>t.map(t=>
1t.id===e?{...t,status:"pending",errorMsg:void 0}:t))},className:"rounded-md border border-warm-200 px-2.5 py-1 text-xs font-medium text-warm-600 transition hover:bg-warm-50",children:"다시 시도"})]}),"done"===I.status&&I.rows&&(0,n.jsx)("dl",{className:"divide-y divide-warm-100 text-sm lg:max-h-[calc(clamp(220px,38vh,380px)_+_84px)] lg:overflow-y-auto lg:pr-2",children:I.rows.map(e=>(0,n.jsxs)("div",{className:"flex flex-col gap-0.5 py-2.5 sm:flex-row sm:gap-4",children:[(0,n.jsx)("dt",{className:"shrink-0 font-semibold text-warm-700 sm:w-40",children:e.k}),(0,n.jsxs)("dd",{className:"min-w-0 flex-1 break-all text-warm-500",children:[e.v,"latitude"===e.k&&M?.lat&&M.lng&&(0,n.jsx)("a",{href:`https://www.google.com/maps?q=${M.lat},${M.lng}`,target:"_blank",rel:"noopener noreferrer",className:"ml-2 text-xs font-medium text-accent underline underline-offset-2 hover:text-accent-hover",children:"지도에서 보기"})]})]},e.k))}),"done"===I.status&&I.rows?.length?(0,n.jsxs)("div",{className:"mt-4 flex items-center justify-end gap-2",children:[(0,n.jsx)("button",{onClick:()=>N(I.rows.map(e=>`${e.k}	${e.v}`).join("\n")),className:"rounded-md px-2.5 py-1 text-xs font-medium text-warm-500 transition hover:bg-warm-50 hover:text-warm-700",children:_?"복사됨":"정보 복사"}),(0,n.jsx)("button",{onClick:()=>((e,t)=>{if(!e.cleanedBlob)return;(0,a.s)("exif_viewer_single_download",{});let r=URL.createObjectURL(e.cleanedBlob);Object.assign(document.createElement("a"),{href:r,download:e.file.name}).click(),URL.revokeObjectURL(r),P(t)})(I,I.id),className:V||y===I.id?d.S8:d.t0,children:y===I.id?"저장됨":"이 사진 저장"})]}):null]})]}),V&&(0,n.jsx)("div",{className:"mt-5 flex justify-end",children:(0,n.jsxs)("button",{onClick:L,disabled:B,className:"all"===y?d.S8:d.t0,children:[(0,n.jsx)(l.s3,{size:16,className:"shrink-0"}),"all"===y?"저장됨":"전체 EXIF 제거 저장(ZIP)"]})})]}),(0,n.jsx)("input",{ref:U,type:"file",accept:u.join(","),multiple:!0,className:"hidden",onChange:e=>{D(e.target.files??[]),e.target.value=""},"aria-hidden":"true"}),x&&(0,n.jsx)(o.A,{message:x,onClose:()=>v("")})]})}},31166:(e,t,r)=>{r.d(t,{Ay:()=>f,S8:()=>d,oK:()=>u,t0:()=>o,tV:()=>c});var n=r(95155),a=r(12115);let i={primary:"bg-accent text-white shadow-cta hover:bg-accent-hover hover:shadow-cta-hover",secondary:"bg-white text-warm-600 border border-warm-200 shadow-card hover:border-accent hover:text-accent-deep hover:bg-accent-sub",ghost:"text-warm-600 hover:bg-warm-50",danger:"bg-red-500 text-white hover:bg-red-600"},l={sm:"h-8 px-3 text-sm",md:"h-10 px-4 text-sm",lg:"h-12 px-6 text-base"},s=(0,a.forwardRef)(function(e,t){let{variant:r="primary",size:a="md",loading:s=!1,disabled:o,className:c="",children:d,...u}=e;return(0,n.jsxs)("button",{ref:t,disabled:o||s,className:["rounded-md font-semibold transition-all duration-200 active:scale-95 disabled:opacity-50 disabled:pointer-events-none inline-flex items-center justify-center gap-2",i[r],l[a],c].join(" "),...u,children:[s&&(0,n.jsxs)("svg",{width:16,height:16,viewBox:"0 0 24 24",fill:"none",className:"animate-spin","aria-hidden":"true",children:[(0,n.jsx)("circle",{cx:"12",cy:"12",r:"10",stroke:"currentColor",strokeWidth:"3",strokeOpacity:"0.3"}),(0,n.jsx)("path",{d:"M12 2a10 10 0 0 1 10 10",stroke:"currentColor",strokeWidth:"3",strokeLinecap:"round"})]}),d]})}),o="inline-flex items-center justify-center gap-2 min-h-[44px] px-5 rounded-xl bg-accent text-white text-sm font-bold whitespace-nowrap shadow-cta transition-all duration-200 hover:bg-accent-hover hover:shadow-cta-hover active:scale-95 disabled:opacity-50 disabled:shadow-none disabled:cursor-not-allowed disabled:hover:bg-accent",c="inline-flex items-center justify-center gap-1 min-h-[36px] px-2.5 rounded-lg bg-accent-sub text-accent-deep text-xs font-semibold whitespace-nowrap border border-accent/25 transition hover:bg-accent hover:text-white",d="inline-flex items-center justify-center gap-2 min-h-[44px] px-5 rounded-xl bg-accent-sub text-accent-deep text-sm font-semibold whitespace-nowrap border border-accent/25 transition hover:bg-accent-tint disabled:opacity-40 disabled:cursor-not-allowed",u="inline-flex shrink-0 items-center gap-1.5 rounded-full px-4 py-1.5 bg-accent text-white text-xs font-bold shadow-cta transition hover:bg-accent-hover hover:shadow-cta-hover disabled:opacity-50 disabled:shadow-none",f=s},69174:(e,t,r)=>{r.d(t,{i:()=>a});var n=r(12115);function a(){let e=arguments.length>
10&&void 0!==arguments[0]?arguments[0]:2e3,[t,r]=(0,n.useState)(!1),a=(0,n.useRef)(null);return{copy:(0,n.useCallback)(async t=>{try{let n=!1;if(navigator.clipboard&&navigator.clipboard.writeText&&(n=await navigator.clipboard.writeText(t).then(()=>!0,()=>!1)),!n){let e=document.createElement("textarea");e.value=t,e.style.position="fixed",e.style.opacity="0",document.body.appendChild(e),e.select();let r=document.execCommand("copy");if(document.body.removeChild(e),!r)return!1}return r(!0),a.current&&clearTimeout(a.current),a.current=setTimeout(()=>{r(!1),a.current=null},e),!0}catch{return!1}},[e]),copied:t}}}}]);

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.