PageSourceSearch

https://www.lavarwave.co.kr/assets/js/draft.js?v=20260831c

js lavarwave.co.kr collected 2026-10-08 23:11:24 UTC 9,861 bytes, 183 lines download raw bytes

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.