1(() => { 2 const currentPath = (location.pathname.replace(/\/+$/, '') || '/').toLowerCase(); 3 const cafeUrl = 'https://xn--v52b5ax89b4zexb805dotlba81c.com/'; 4 5 // ì루ì íë¼ì´ìì ë°ì´í° â /service/solution ì 8ê° ê¸°ì (ìì´ì½Â·ê¸°ì ëª Â·í ì¤ ì¤ëª )ì ê·¸ëë¡ ì®ê²¨ì¨ ê² 6 const techIcon = paths => `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${paths}</svg>`; 7 8 const techSystems = [ 9 { 10 sys: 'ì ë° ë¶ì ìì¤í ', 11 techs: [ 12 { 13 key: 'decompile', title: 'ì ì± íì¼Â·APK ìë¶ì', 14 desc: 'ë²íì ì°ì¸ íì¼ì 리ë²ì±í´ 무ìì´ ë¹ ì ¸ëê° ì ììëì§ ì§ë¨í©ëë¤.', 15 icon: techIcon('<path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h7"/><path d="M13 2l5 5v4"/><circle cx="17" cy="17" r="3.2"/><path d="M19.4 19.4L22 22"/>') 16 }, 17 { 18 key: 'packet', title: 'ëì ·í¨í· ë¶ì', 19 desc: 'ì¤í ì¤ íµì ì ë¶ìí´ ê°í´ì ì ë³´ì ë°ì´í° ì ì¶ ê²½ë¡ë¥¼ íì¸í©ëë¤.', 20 icon: techIcon('<path d="M3 7h6M15 7h6M3 17h6M15 17h6"/><rect x="9" y="4.6" width="6" height="4.8" rx="1.2"/><rect x="9" y="14.6" width="6" height="4.8" rx="1.2"/><path d="M12 9.4v5.2"/>') 21 } 22 ] 23 }, 24 { 25 sys: 'CS ìì¤í ', 26 techs: [ 27 { 28 key: 'injection', title: 'ì°ë½ì² ë³´í¸ ë°ì´í° ì¸ì ì ', 29 desc: 'ê°ì ííì ê°ì ì°ë½ì²ë¥¼ ë£ì´ ì¤ì ì§ì¸ìê² ë¿ì íë¥ ì ë®ì¶¥ëë¤.', 30 icon: techIcon('<rect x="3" y="5" width="18" height="14" rx="2.4"/><circle cx="9" cy="11" r="2.1"/><path d="M5.8 16.2c.6-1.7 1.8-2.6 3.2-2.6s2.6.9 3.2 2.6"/><path d="M16 9.5h4M18 7.5v4"/>') 31 }, 32 { 33 key: 'sending', title: 'ë미ë°ì´í° ì½ì ', 34 desc: 'ìë²ì ì²ë¦¬ 구조를 ìì´ì©í´ ì¤ì 주ìë¡ì ë¤ë¡ ë°ì´ë ëë¤.', 35 icon: techIcon('<path d="M12 3l8 4-8 4-8-4 8-4z"/><path d="M4 12l8 4 8-4"/><path d="M4 17l8 4 8-4"/>') 36 }, 37 { 38 key: 'protection', title: 'íë°Â·ì í¬ íµí©ë°©ì´', 39 desc: 'ê°í´ì ê³ì ì´ìì ì ì§ìì¼ íë°ê³¼ ì í¬ ì¤íì ì§ì°ìíµëë¤.', 40 icon: techIcon('<path d="M12 3l7.5 3v6c0 4.6-3.1 7.9-7.5 9.3C7.6 19.9 4.5 16.6 4.5 12V6L12 3z"/>
40<path d="M9 12l2.2 2.2L15.5 10"/>') 41 } 42 ] 43 }, 44 { 45 sys: 'ë¼ë° ì¤ìºë', 46 techs: [ 47 { 48 key: 'crawling', title: 'ì¹Â·SNS ì í¬ íì§', 49 desc: 'ì í¬ ê°ë¥ì±ì´ ìë íì´ì§ë¥¼ ìë ë¶ìí´ ì í¬ ì¬ë¶ë¥¼ íì¸í©ëë¤.', 50 icon: techIcon('<circle cx="12" cy="12" r="9"/><path d="M3 12h18"/><path d="M12 3c2.6 2.6 3.9 5.6 3.9 9s-1.3 6.4-3.9 9c-2.6-2.6-3.9-5.6-3.9-9S9.4 5.6 12 3z"/>') 51 }, 52 { 53 key: 'keyword', title: 'í¤ìë 모ëí°ë§', 54 desc: 'ì´ë¯¸ì§ë¡ 찾기 ì´ë ¤ì´ í ì¤í¸ ììê¹ì§ ê´ë ¨ í¤ìëë¡ íìí©ëë¤.', 55 icon: techIcon('<circle cx="10.5" cy="10.5" r="6.5"/><path d="M15.4 15.4L21 21"/><path d="M7.6 9h5.8M7.6 12h3.6"/>') 56 }, 57 { 58 key: 'dna', title: 'ì´ë¯¸ì§Â·ìì DNA ì ì¬ë íì§', 59 desc: 'í¬ë¡Â·ìì¶Â·ìë³´ì ì¼ë¡ ë³íë ì½í ì¸ ê¹ì§ ì본과 ëì¡°í´ ì°¾ìë ëë¤.', 60 icon: techIcon('<path d="M6 3c0 4.5 12 6 12 10.5S6 19.5 6 21"/><path d="M18 3c0 4.5-12 6-12 10.5S18 19.5 18 21"/><path d="M8.4 7h7.2M8.4 17h7.2M7 12h10"/>') 61 } 62 ] 63 } 64 ]; 65 66 const groups = [ 67 { 68 label: 'ë¼ë°ì¨ì´ë¸', href: '/about', match: ['/about'], 69 items: [ 70 ['ì¤í 리 · 걸ì´ì¨ 길', '/about'], 71 ['ì¬ì ë¶ì¼', '/about/business'], 72 ['ìì§ì ìê°', '/about/people'] 73 ] 74 }, 75 { 76 label: 'ì í / ìë¹ì¤', href: '/service/solution', match: ['/service'], 77 mega: techSystems, 78 items: [ 79 ['ì í / ìë¹ì¤', '/service/solution'], 80 ['ì루ì ë°ëª¨', '/service/solution-demo'] 81 ] 82 }, 83 { 84 label: 'ì°êµ¬ì±ê³¼', href: '/tech-lab', match: ['/tech-lab', '/promote'], 85 items: [ 86 ['기ì ë¶ì¤ì°êµ¬ì', '/tech-lab'], 87 ['ìì & íë ¥', '/promote'] 88 ] 89 }, 90 { 91 label: 'íë ì¤', href: '/blog', match: ['/blog', '/inblog'], 92 items: [ 93 ['매거ì§', '/blog'], 94 ['í¼í´ëìê°ì´ë', '/inblog'] 95 ] 96 }, 97 { 98 label: 'ìë´ë¬¸ì', href: '/inquiry', match: ['/inquiry'], 99 items: [ 100 ['ëª¸ìº í¼ì±', '/inquiry'], 101 ['ë¥íì´í¬ / ë¼ë°ì¤ìºë', '/inquiry/lavar-scanner'], 102 ['몸í¼ëª¨ · ì¤ì ê³ ê°í기', cafeUrl, true] 103 ] 104 } 105 ]; 106 107 const isGroupActive = group => group.exact 108 ? group.match.includes(currentPath) 109 : group.match.some(prefix => currentPath === prefix || currentPath.startsWith(`${prefix}/`)); 110 const externalAttrs = external => external ? ' target="_blank" rel="noopener noreferrer" data-external-link' : ''; 111 const plainLinks = items => items.map(([label, href, external]) => `<a href="${href}"${externalAttrs(external)}>${label}${external ? '<span aria-hidden="true">â</span>' : ''}</a>`).join(''); 112 // íë¼ì´ìì ìì ë¤ì´ê°ë 기ì ë§í¬ â ìì´ì½ + 기ì ëª + í ì¤ ì¤ëª 113 // 기ì ë³ ìì¸ íì´ì§ë¡ ëëì§ ìê³ ì ë¶ ì루ì íì´ì§ë¡ ë³´ë¸ë¤. 114 // ?tech=í¤ ë¥¼ ë¶ì¬, ëì°©í ì루ì íì´ì§ìì ê·¸ 기ì ì´ ì íë ìíë¡ ì´ë¦¬ê² íë¤. 115 const techLinks = techs => techs.map(tech => `<a class="mega-fly-i" href="/service/solution?tech=${tech.key}#systems"><span class="mega-fly-ic">${tech.icon}</span><b>${tech.title}</b><span class="mega-fly-d">${tech.desc}</span></a>`).join(''); 116 // ìì "ì í / ìë¹ì¤" ë©ë´ì 첫 í목ìì 8ê° ê¸°ì í¨ëì í¼ì¹ë¤. 117 const megaFly = systems => `<div class="mega-fly" role="group" aria-label="ì í·ìë¹ì¤ 기ì 목ë¡"><div class="mega-fly-in">${systems.map(system => `<div class="mega-fly-g"><em class="mega-fly-h">${system.sys}</em>${techLinks(system.techs)}</div>`).join('')}<a class="mega-fly-all" href="/service/solution">ì í / ìë¹ì¤ ì ì²´ 보기<span aria-hidden="true">â</span></a></div></div>`; 118 // íµí© ì í / ìë¹ì¤ ë§í¬ìë§ ê¸°ì íë¼ì´ììì ë¶ì¸ë¤. 119 const megaBody = group => group.mega 120 ? group.items.map(([label, href, external]) => href === '/service/solution' 121 ? `<div class="mega-sol"><a class="mega-sol-link" href="${href}" aria-haspopup="true">${label}<i aria-hidden="true">âº</i></a>${megaFly(group.mega)}</div>` 122 : `<a href="${href}"${externalAttrs(external)}>${label}${external ? '<span aria-hidden="true">â</span>' : ''}</a>`).join('') 123 : plainLinks(group.items); 124
125 const gnb = document.querySelector('.gnb'); 126 if (gnb) { 127 gnb.innerHTML = groups.map(group => ` 128 <div class="gnb-item"> 129 <a class="gnb-link${isGroupActive(group) ? ' active' : ''}" href="${group.href}">${group.label}</a> 130 <div class="mega" aria-label="${group.label} íì ë©ë´"> 131 ${megaBody(group)} 132 </div> 133 </div>`).join(''); 134 } 135 136 const mobile = document.querySelector('.mobile-panel'); 137 if (mobile) { 138 mobile.innerHTML = `${groups.map((group, index) => { 139 const expanded = isGroupActive(group) || (!groups.some(isGroupActive) && index === 0); 140 return ` 141 <div class="mobile-group${expanded ? ' open' : ''}"> 142 <button class="mobile-group-toggle" type="button" aria-expanded="${expanded}"> 143 <span>${group.label}</span><span aria-hidden="true">ï¼</span> 144 </button> 145 <div class="mobile-links"> 146 ${plainLinks(group.items)} 147 </div> 148 </div>`; 149 }).join('')} 150 <div class="mobile-contact"> 151 <a class="btn btn-red" href="tel:18119634">1811-9634 ì í ìë´</a> 152 <a class="btn btn-line" href="/inquiry">ê°í¸ ìë´ ì ì²</a> 153 </div>`; 154 155 mobile.querySelectorAll('.mobile-group-toggle').forEach(button => { 156 button.addEventListener('click', () => { 157 const group = button.closest('.mobile-group'); 158 const willOpen = !group.classList.contains('open'); 159 mobile.querySelectorAll('.mobile-group').forEach(item => { 160 item.classList.remove('open'); 161 item.querySelector('.mobile-group-toggle')?.setAttribute('aria-expanded', 'false'); 162 }); 163 if (willOpen) { 164 group.classList.add('open'); 165 button.setAttribute('aria-expanded', 'true'); 166 } 167 }); 168 }); 169 } 170 171 const footerLinks = document.querySelector('.footer-links'); 172 if (footerLinks) { 173 footerLinks.innerHTML = ` 174 <div class="footer-col"><strong>ë¼ë°ì¨ì´ë¸</strong><a href="/about/business">ì¬ì ë¶ì¼</a><a href="/about">ì¤í 리 · 걸ì´ì¨ 길</a><a href="/about/people">ìì§ì ìê°</a></div> 175 <div class="footer-col"><strong>ì í / ìë¹ì¤</strong><a href="/service/solution">ì í / ìë¹ì¤</a><a href="/service/solution-demo">ì루ì ë°ëª¨</a></div> 176 <div class="footer-col"><strong>ì°êµ¬ì±ê³¼ · íë ì¤</strong><a href="/tech-lab">기ì ë¶ì¤ì°êµ¬ì</a><a href="/promote">ìì & íë ¥</a><a href="/blog">매거ì§</a><a href="/inblog">í¼í´ëìê°ì´ë</a></div> 177 <div class="footer-col"><strong>ìë´ë¬¸ì</strong><a href="tel:18119634">1811-9634</a><a href="/inquiry">ëª¸ìº í¼ì±</a><a href="/inquiry/lavar-scanner">ë¥íì´í¬ / ë¼ë°ì¤ìºë</a><a href="${cafeUrl}" target="_blank" rel="noopener noreferrer">몸í¼ëª¨ â</a></div>`; 178 } 179 180 document.querySelectorAll('[data-scroll-target]').forEach(button => { 181 button.addEventListener('click', () => document.querySelector(button.dataset.scrollTarget)?.scrollIntoView({behavior: 'smooth'})); 182 }); 183})();
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.