sales-frontend-utils 0.0.56 → 0.0.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/timing-utils.ts","../src/utils/cookie-utils.ts","../src/utils/environment-utils.ts","../src/utils/user-agent-utils.ts","../src/utils/event-handler-utils.ts","../src/utils/canvas-utils.ts","../src/utils/file-utils.ts","../src/utils/astx2/astx2.min.js","../src/utils/astx2/astx2_custom.js","../src/utils/astx2-utils.ts","../src/utils/date-utils.ts","../src/utils/key-trigger-utils.ts","../src/utils/gender.ts","../src/utils/ga/ga.js","../src/utils/ga/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 쓰로틀\n * @param func\n * @param delay\n * @returns\n */\nexport function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n\n if (now - lastCall >= delay) {\n // 마지막 호출로부터 delay 시간이 지났으면 즉시 실행\n lastCall = now;\n func(...args);\n } else if (!timeout) {\n // 대기 중인 타이머가 없으면 새로운 타이머 설정\n timeout = setTimeout(\n () => {\n lastCall = Date.now();\n func(...args);\n timeout = null;\n },\n delay - (now - lastCall)\n );\n }\n };\n}\n\n/**\n * 디바운스\n * @param func\n * @param delay\n * @returns\n */\nexport function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n timeout = null;\n }, delay);\n };\n}\n","import { isClient } from \"./environment-utils\";\n\nexport const getCookie = (name: string): string => {\n if (!isClient()) {\n return '';\n }\n if (typeof document === 'undefined') {\n return '';\n }\n const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));\n\n return match ? decodeURIComponent(match[2] || '') : '';\n};\n\nexport const setCookie = (\n name: string,\n value: string,\n options: {\n expires?: number | Date; // number of days\n path?: string;\n domain?: string;\n secure?: boolean;\n } = {}\n): void => {\n if (!isClient()) {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options.expires) {\n let expiresDate: Date;\n if (typeof options.expires === 'number') {\n expiresDate = new Date();\n expiresDate.setDate(expiresDate.getDate() + options.expires);\n } else {\n expiresDate = options.expires;\n }\n cookieString += `; expires=${expiresDate.toUTCString()}`;\n }\n\n cookieString += `; path=${options.path || '/'}`;\n\n if (options.domain) {\n cookieString += `; domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookieString += '; secure';\n }\n\n document.cookie = cookieString;\n};\n\nexport const deleteCookie = (name: string, options: { path?: string; domain?: string } = {}): void => {\n if (!isClient()) {\n return;\n }\n setCookie(name, '', { ...options, expires: -1 });\n};\n","import { getCookie } from './cookie-utils';\n\n/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n if (isClient()) {\n const debugModeEnv = getCookie('dsp-debug-mode-env')?.toLowerCase();\n if (debugModeEnv) {\n return debugModeEnv as 'local' | 'dev' | 'stg' | 'prd';\n }\n }\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n\n/**\n * 현재 업무구분 코드 구하기\n * 원칙: pathname의 첫 번째가 업무구분코드를 사용할 경우 해당 값을 반환\n * @returns\n */\nexport const getBusinessWorkDivisionCode = (pathname?: string) => {\n if (pathname) {\n return pathname.split('/')[1] ?? '';\n }\n\n return location.pathname.split('/')[1] ?? '';\n};\n\n/**\n * @description storybook에서 동작을 고려하여 수정한 버전\n * @returns\n */\nexport const getServicePath = () => {\n if (typeof window.isStorybookEnv === 'boolean') {\n return '';\n } else {\n return `/${getBusinessWorkDivisionCode()}`;\n }\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\n\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://dev-dsp-static.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://stg-dsp-static.hanwhalife.com`;\n\n case 'prd':\n return `https://dsp-static.hanwhalife.com'`;\n\n default:\n console.warn('DSP environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 비정형PI 호스트명을 반환합니다.\n * @param serviceCode dea,dis,dcm\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDudApiBasePathFromEnvironment = (hostname: string, servicePath: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${servicePath}/api/dud`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://dsp-dud-dev.hanwhalife.com:10101/api`;\n\n case 'stg':\n return `https://dsp-dud-stg.hanwhalife.com:10102/api`;\n\n case 'prd':\n return `https://dsp-dud.hanwhalife.com/api`;\n\n default:\n console.warn('DUD API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 Dsp 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCodeTo dea,dis 같은 api서버명\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDspApiBasePathFromEnvironment = (serviceCodeTo: string, hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/${serviceCodeTo}`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com/api/${serviceCodeTo}`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 NLC 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getNlcHostFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n case 'local':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'dev':\n return `https://nxl-nlc-dev.hanwhalife.com`;\n\n case 'stg':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-nlc.hanwhalife.com`;\n\n default:\n console.warn('NLC environment is not defined');\n\n return '';\n }\n};\n","import { ExecutionEnvironment, OSName, BrowserName } from '../types/common.types';\n\nimport { isClient } from './environment-utils';\n/**\n * 한화생명 영업지원 웹 실행 환경 탐지\n * @returns\n */\nexport const getDspExecutionEnvironment = (): ExecutionEnvironment => {\n if (!isClient()) {\n return 'unknown';\n }\n\n if (window.n2Bridge) {\n return 'android-webview';\n }\n\n if (window.webkit?.messageHandlers?.n2Bridge) {\n return 'ios-webview';\n }\n\n if (window.self !== window.top) {\n return 'iframe';\n }\n\n return 'web';\n};\n\n/**\n * 한화생명 영업 앱 환경 여부 판단(DSP 앱 또는 FP 플래너 앱)\n * 운영 중인 프로덕션 앱에서 실행 중인지 확인\n * @returns\n */\nexport const isProductionApp = () => {\n if (!isClient()) {\n return false;\n }\n\n return isDspApp() || isFpPlannerApp();\n};\n\n/**\n * UserAgent에 SspApp 이 있는지 검사\n * 있으면, DSP 앱\n * @param userAgent\n * @returns\n */\nexport const checkUserAgentDspApp = (userAgent: string) => {\n return userAgent.toLowerCase().includes('sspapp');\n};\n\n/**\n * 한화생명 영업지원 웹뷰 환경 여부 판단\n * @returns 웹뷰(Android/iOS) 환경이면 true, 아니면 false\n */\nexport const isDspApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) && (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * FP 플래너 웹뷰 환경 여부 판단\n * @returns\n */\nexport const isFpPlannerApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) === false &&\n (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * 영업 포털 환경 여부 판단\n * @returns\n */\nexport const isSalesPortal = () => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return environment === 'iframe';\n};\n\n/**\n * 태블릿 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isTablet = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 태블릿\n ua.includes('ipad') ||\n // Android 태블릿 (Mobile 키워드 없음)\n (ua.includes('android') && !ua.includes('mobile')) ||\n // 명시적 태블릿 키워드\n ua.includes('tablet') ||\n // Amazon 태블릿\n ua.includes('kindle') ||\n ua.includes('silk') ||\n /kf[a-z]{2}wi|kftt/.test(ua) ||\n // BlackBerry 태블릿\n ua.includes('playbook') ||\n // 삼성 갤럭시 탭 (개선된 정규식)\n /gt-p\\d{4}|sm-[tp]\\d{3}/.test(ua) ||\n // 구글 넥서스/픽셀 태블릿\n /nexus (?:[789]|10)|pixel [cs]|pixel slate/.test(ua) ||\n // 기타 브랜드 태블릿\n /xoom|transformer|mediapad|mipad|tab\\s/.test(ua) ||\n // Windows 태블릿 (개선된 조건)\n (ua.includes('windows') && (ua.includes('touch') || ua.includes('tablet'))) ||\n ua.includes('surface')\n );\n};\n\n/**\n * 스마트폰 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPhone = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 모바일\n ua.includes('iphone') ||\n ua.includes('ipod') ||\n // Android 스마트폰 (Mobile 키워드 있음)\n (ua.includes('android') && ua.includes('mobile')) ||\n // BlackBerry\n ua.includes('blackberry') ||\n ua.includes('bb10') ||\n // Windows Mobile\n ua.includes('windows phone') ||\n ua.includes('windows mobile') ||\n ua.includes('iemobile') ||\n // Opera Mobile\n ua.includes('opera mini') ||\n ua.includes('opera mobi') ||\n // 기타 모바일 브라우저\n (ua.includes('mobile') &&\n (ua.includes('firefox') || ua.includes('chrome') || ua.includes('safari') || ua.includes('edge'))) ||\n // 모바일 키워드 (태블릿 제외)\n (ua.includes('mobile') && !ua.includes('tablet')) ||\n // 삼성 갤럭시 폰 (개선)\n /sm-[a-z]\\d{3}[a-z]?|gt-[a-z]\\d{4}/.test(ua) ||\n // LG, HTC 폰\n /lg-[a-z]\\d{3,4}|htc[_\\s]/.test(ua) ||\n // 화웨이/샤오미 등 (개선)\n /huawei|honor|redmi|mi[\\s\\d]|oneplus|oppo|vivo/.test(ua)\n );\n};\n\n/**\n * 데스크톱 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPc = (userAgent: string) => {\n const ua = userAgent.toLowerCase();\n\n return !isPhone(ua) && !isTablet(ua);\n};\n\n/**\n * UserAgent에서 기기 타입 구분\n * @param userAgent\n * @returns\n */\nexport const getFormFactorFromUserAgent = (userAgent: string) => {\n if (!userAgent) {\n return 'pc';\n }\n\n const ua = userAgent.toLowerCase();\n\n if (isTablet(ua)) {\n return 'tablet';\n }\n\n if (isPhone(ua)) {\n return 'phone';\n }\n\n return 'pc';\n};\n\n/**\n * UserAgent에서 운영체제 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 운영체제 이름\n */\nexport const getOSName = (userAgent: string): OSName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 체크 (iPhone, iPad, iPod)\n if (/iphone|ipad|ipod/.test(ua)) {\n return 'ios';\n }\n\n // Android 체크\n if (ua.includes('android')) {\n return 'android';\n }\n\n // Windows 체크\n if (ua.includes('windows') || ua.includes('win32') || ua.includes('win64')) {\n return 'windows';\n }\n\n // macOS 체크 (Mac OS X, macOS)\n if (ua.includes('mac os x') || ua.includes('macos') || ua.includes('macintosh')) {\n return 'mac';\n }\n\n // Linux 체크 (Android 제외)\n if (ua.includes('linux') && !ua.includes('android')) {\n return 'linux';\n }\n\n return 'unknown';\n};\n\n/**\n * 현재 브라우저의 운영체제 이름을 가져오기\n * @returns 현재 환경의 운영체제 이름\n */\nexport const getCurrentOSName = (): OSName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSName(navigator.userAgent);\n};\n\n/**\n * UserAgent에서 OS 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns OS 버전 문자열\n */\nexport const getOSVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 버전 (iPhone OS 15_0, iPad OS 15_0)\n const iosMatch = ua.match(/os (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (iosMatch && iosMatch.length >= 3) {\n const major = iosMatch[1];\n const minor = iosMatch[2];\n const patch = iosMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n // Android 버전\n const androidMatch = ua.match(/android (\\d+(?:\\.\\d+)*)/);\n if (androidMatch && androidMatch[1]) {\n return androidMatch[1];\n }\n\n // Windows 버전\n const windowsMatch = ua.match(/windows nt (\\d+\\.\\d+)/);\n if (windowsMatch && windowsMatch[1]) {\n const version = windowsMatch[1];\n // Windows NT 버전을 실제 Windows 버전으로 매핑\n const windowsVersionMap: Record<string, string> = {\n '10.0': '10/11',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': '7',\n '6.0': 'Vista',\n '5.1': 'XP'\n };\n\n return windowsVersionMap[version] || version;\n }\n\n // macOS 버전\n const macMatch = ua.match(/mac os x (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (macMatch && macMatch.length >= 3) {\n const major = macMatch[1];\n const minor = macMatch[2];\n const patch = macMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 이름\n */\nexport const getBrowserName = (userAgent: string): BrowserName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium 기반) - Chrome보다 먼저 체크해야 함\n if (ua.includes('edg/') || ua.includes('edge/')) {\n return 'edge';\n }\n\n // Samsung Internet\n if (ua.includes('samsungbrowser')) {\n return 'samsung';\n }\n\n // Opera - Chrome보다 먼저 체크해야 함\n if (ua.includes('opr/') || ua.includes('opera')) {\n return 'opera';\n }\n\n // Chrome (Chromium 기반 브라우저들보다 늦게 체크)\n if (ua.includes('chrome') && !ua.includes('edg')) {\n return 'chrome';\n }\n\n // Firefox\n if (ua.includes('firefox')) {\n return 'firefox';\n }\n\n // Safari (Chrome와 구분하기 위해 webkit 체크)\n if (ua.includes('safari') && !ua.includes('chrome')) {\n return 'safari';\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 버전\n */\nexport const getBrowserVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium)\n const edgMatch = ua.match(/edg\\/(\\d+(?:\\.\\d+)*)/);\n if (edgMatch && edgMatch[1]) {\n return edgMatch[1];\n }\n\n // Samsung Internet\n const samsungMatch = ua.match(/samsungbrowser\\/(\\d+(?:\\.\\d+)*)/);\n if (samsungMatch && samsungMatch[1]) {\n return samsungMatch[1];\n }\n\n // Opera\n const operaMatch = ua.match(/(?:opr|opera)\\/(\\d+(?:\\.\\d+)*)/);\n if (operaMatch && operaMatch[1]) {\n return operaMatch[1];\n }\n\n // Chrome\n const chromeMatch = ua.match(/chrome\\/(\\d+(?:\\.\\d+)*)/);\n if (chromeMatch && chromeMatch[1] && !ua.includes('edg')) {\n return chromeMatch[1];\n }\n\n // Firefox\n const firefoxMatch = ua.match(/firefox\\/(\\d+(?:\\.\\d+)*)/);\n if (firefoxMatch && firefoxMatch[1]) {\n return firefoxMatch[1];\n }\n\n // Safari\n const safariMatch = ua.match(/version\\/(\\d+(?:\\.\\d+)*)/);\n if (safariMatch && safariMatch[1] && ua.includes('safari') && !ua.includes('chrome')) {\n return safariMatch[1];\n }\n\n return 'unknown';\n};\n/**\n * 현재 브라우저의 OS 버전을 가져오기\n * @returns 현재 환경의 OS 버전\n */\nexport const getCurrentOSVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSVersion(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 이름을 가져오기\n * @returns 현재 환경의 브라우저 이름\n */\nexport const getCurrentBrowserName = (): BrowserName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserName(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 버전을 가져오기\n * @returns 현재 환경의 브라우저 버전\n */\nexport const getCurrentBrowserVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserVersion(navigator.userAgent);\n};\n\n/**\n * 클라이언트용 디바이스 ID 생성 및 관리(임시값)\n */\nexport const getOrCreateDeviceId = (): string => {\n if (typeof window === 'undefined') {\n return '';\n }\n\n const STORAGE_KEY = 'dsp_device_id';\n let deviceId = localStorage.getItem(STORAGE_KEY);\n\n if (!deviceId) {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 15);\n deviceId = `dsp-web-${timestamp}-${random}`;\n\n try {\n localStorage.setItem(STORAGE_KEY, deviceId);\n } catch (error) {\n console.warn('[DeviceId] localStorage 저장 실패:', error);\n }\n }\n\n return deviceId;\n};\n\n/**\n * 디바이스 모델 감지\n */\nexport const getDeviceModel = (): string => {\n if (!isClient()) {\n return '';\n }\n\n const ua = navigator.userAgent;\n\n // iOS\n if (/iPad/.test(ua)) {\n return 'iPad';\n }\n if (/iPhone/.test(ua)) {\n return 'iPhone';\n }\n if (/iPod/.test(ua)) {\n return 'iPod Touch';\n }\n\n // Android - 주요 브랜드\n if (/SM-[A-Z0-9]+/.test(ua)) {\n const match = ua.match(/SM-[A-Z0-9]+/);\n\n return match ? `Samsung ${match[0]}` : 'Samsung';\n }\n if (/Pixel/.test(ua)) {\n const match = ua.match(/Pixel [0-9]+[a-zA-Z]*/);\n\n return match ? `Google ${match[0]}` : 'Google Pixel';\n }\n if (/Mi\\s|Redmi|POCO/.test(ua)) {\n return 'Xiaomi';\n }\n if (/HUAWEI/.test(ua)) {\n return 'Huawei';\n }\n if (/OnePlus/.test(ua)) {\n return 'OnePlus';\n }\n\n // Desktop\n if (/Windows/.test(ua)) {\n return 'Windows PC';\n }\n if (/Mac OS X/.test(ua)) {\n return 'Mac';\n }\n if (/Linux/.test(ua)) {\n return 'Linux PC';\n }\n\n return 'Unknown';\n};\n\n/**\n * Android 기기인지 확인\n * (클라이언트용)\n */\nexport const isAndroidDevice = (): boolean => {\n if (isClient() === false) {\n return false;\n }\n\n return /Android/i.test(navigator.userAgent);\n};\n\n/**\n * iOS 기기인지 확인 (iPhone, iPad, iPod)\n * (클라이언트용)\n */\nexport const isIosDevice = (): boolean => {\n if (isClient() === false) {\n return false;\n }\n\n const ua = navigator.userAgent;\n\n // 1. 안드로이드면 즉시 제외 (AOS 체크)\n if (/Android/i.test(ua)) {\n return false;\n }\n\n // 2. iPhone, iPad, iPod 키워드가 직접 포함된 경우\n const isDirectIOS = /iPhone|iPad|iPod/i.test(ua);\n\n // 3. iPadOS 13+ 데스크탑 모드 대응 (MacIntel이면서 터치 지점이 1개 이상인 경우)\n const isIPadOS = (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n\n return isDirectIOS || isIPadOS;\n};\n\n/**\n * 영업지원 안드로이드 웹뷰 여부\n * @returns boolean\n */\nexport const isAndroidWebView = () => {\n return getDspExecutionEnvironment() === 'android-webview';\n};\n\n/**\n * 영업지원 iOS 웹뷰 여부(FP 플래너 포함)\n * @returns boolean\n */\nexport const isIosWebView = () => {\n return getDspExecutionEnvironment() === 'ios-webview';\n};\n","/**\n * Message 이벤트 헨들러를 관리하는 클래스입니다. (싱글턴)\n * 모든 message 핸들러는 여기를 통해 등록해야합니다.\n * window.addEventListener('message') 의 중복을 방지하기 위함입니다.\n */\nexport class MessageEventManager {\n private static instance: MessageEventManager;\n private handlers = new Map<string, (event: MessageEvent) => void>();\n\n static getInstance(): MessageEventManager {\n if (!MessageEventManager.instance) {\n MessageEventManager.instance = new MessageEventManager();\n }\n\n return MessageEventManager.instance;\n }\n\n private constructor() {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n\n /**\n *\n * @param event\n */\n private handleMessage(event: MessageEvent): void {\n // 모든 등록된 핸들러 실행\n for (const [key, handler] of this.handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(`Message handler ${key} error:`, error);\n }\n }\n }\n\n /**\n * 이벤트 헨들러 함수를 등록합니다.\n * @param key\n * @param handler\n */\n registerHandler(key: string, handler: (event: MessageEvent) => void): void {\n this.handlers.set(key, handler);\n }\n\n /**\n * 이벤트 핸들러 함수를 삭제합니다.\n * @param key\n */\n unregisterHandler(key: string): void {\n this.handlers.delete(key);\n }\n}\n","interface ConvertTextToImgParams {\n /** 이미지로 변환할 문자열 */\n targetStr: string;\n /** 캔버스 너비 (지정하지 않으면 텍스트 길이에 따라 자동 계산) */\n canvasWidth?: number;\n /** 캔버스 높이 (지정하지 않으면 기본값 150px) */\n canvasHeight?: number;\n /** 배경색 (지정하지 않으면 투명) */\n backgroundColor?: string;\n /** 폰트 크기 (지정하지 않으면 기본값 75px) */\n fontSize?: number;\n /** 폰트 색상 (지정하지 않으면 기본값 검정색) */\n fontColor?: string;\n /** 폰트 두께 (지정하지 않으면 기본값 bold) */\n fontWeight?: string;\n /** 폰트 패밀리 (지정하지 않으면 기본값 ) */\n fontFamily?: string;\n}\n\n\n\nexport const getTextWidth = (text: string, font: string, context: CanvasRenderingContext2D) => {\n\n // 폰트 스타일 설정\n context.font = font;\n\n // measureText()를 사용하여 TextMetrics 객체 가져오기\n const metrics = context.measureText(text);\n\n // 너비(width) 반환\n return metrics.width;\n}\n\n\n\n\n/**\n * 텍스트를 이미지(Base64)로 변환하는 함수\n * @param params - 변환에 필요한 파라미터 객체\n * @returns Base64로 인코딩된 이미지 데이터 URL\n */\nexport const convertTextToImg = ({\n targetStr,\n canvasWidth,\n canvasHeight,\n backgroundColor,\n fontColor,\n fontSize,\n fontWeight,\n fontFamily = `'system-ui', 'sans-serif'`\n}: ConvertTextToImgParams): string => {\n // 1. 메모리에 캔버스 요소 생성\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n // 캔버스 컨텍스트를 가져올 수 없는 경우 에러 처리\n throw new Error('Canvas context를 가져올 수 없습니다.');\n }\n\n const font = `${fontWeight ?? 'normal'} ${fontSize ?? 75}px ${fontFamily}`;\n\n // 2. 캔버스 크기 설정\n const defaultHeight = 150;\n\n // as-is\n // const calculatedWidth = targetStr.length * 70; // 글자 수 기반 너비 계산\n\n const calculatedWidth = getTextWidth(targetStr, font, ctx);\n canvas.width = canvasWidth ?? calculatedWidth;\n canvas.height = canvasHeight ?? defaultHeight;\n\n // 3. 배경색 처리\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // 4. 텍스트 그리기\n ctx.fillStyle = fontColor ?? 'black';\n ctx.textAlign = 'center';\n ctx.font = font;\n ctx.textBaseline = 'middle'; // 텍스트를 수직 중앙에 더 잘 맞추기 위해 추가\n\n // 텍스트를 캔버스 중앙에 그립니다.\n ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);\n\n // 5. Base64 이미지 데이터로 변환하여 반환\n return canvas.toDataURL(); // 기본적으로 'image/png'\n};\n\nexport function drawImageResizeCentered(base64: string, size: { canvasWidth: number; canvasHeight: number }) {\n return new Promise((resolve) => {\n const { canvasHeight, canvasWidth } = size;\n\n const canvas = document.createElement('canvas');\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n const ctx = canvas.getContext('2d');\n\n const img = new Image();\n img.src = base64;\n img.onload = () => {\n const imageWidth = img.width;\n const imageHeight = img.height;\n\n const canvasRatio = canvasWidth / canvasHeight;\n const imageRatio = imageWidth / imageHeight;\n\n let newWidth;\n let newHeight;\n\n if (imageRatio > canvasRatio) {\n newWidth = canvasWidth;\n newHeight = newWidth / imageRatio;\n } else {\n newHeight = canvasHeight;\n newWidth = newHeight * imageRatio;\n }\n\n const x = (canvasWidth - newWidth) / 2;\n const y = (canvasHeight - newHeight) / 2;\n\n ctx?.clearRect(0, 0, canvasWidth, canvasHeight);\n ctx?.drawImage(img, x, y, newWidth, newHeight);\n\n resolve(canvas.toDataURL());\n };\n });\n}\n","import { getCookie } from './cookie-utils';\n\nexport function base64ToBlob(base64String: string, contentType = '') {\n const regex = /^data:([a-zA-Z0-9/+.-]+);base64,/;\n const matches = base64String.match(regex);\n\n if (matches === null) {\n // ✅ 디버깅 정보 추가\n const debugInfo = {\n base64String\n };\n\n throw new Error(`Invalid base64 string format. Debug info: ${JSON.stringify(debugInfo, null, 2)}`);\n }\n\n const contentTypeFinal = contentType || matches[1];\n\n try {\n const byteCharacters = atob(base64String.replace(regex, ''));\n const byteNumbers = new Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n\n return new Blob([byteArray], { type: contentTypeFinal });\n } catch (error) {\n // ✅ atob 실패 시 추가 정보\n throw new Error(\n `Failed to decode base64 string. Original error: ${error instanceof Error ? error.message : 'Unknown error'}. String length: ${base64String?.length}, Content type: ${contentTypeFinal}`\n );\n }\n}\n\nexport function base64ToFile(base64String: string, fileName: string, contentType = '') {\n try {\n const blob = base64ToBlob(base64String, contentType);\n\n if (!blob) {\n throw new Error(\n `Failed to create blob. FileName: ${fileName}, ContentType: ${contentType}, StringLength: ${base64String?.length}`\n );\n }\n\n return blobToFile(blob, fileName);\n } catch (error) {\n // ✅ 상위 함수에서도 컨텍스트 추가\n throw new Error(\n `base64ToFile failed for \"${fileName}\". ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n type: blob.type,\n lastModified: Date.now()\n });\n}\n\nexport async function fileToBase64(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 파일확장자 리턴\n * @param data string File Blob\n */\nexport function getExt(data: string | File | Blob) {\n if (typeof data === 'string') {\n return data.split('.').pop();\n }\n\n if (data instanceof File) {\n return data.name.split('/').pop();\n }\n\n if (data instanceof Blob) {\n return data.type.split('/').pop();\n }\n}\n\nexport async function objectUrlToBlob(objectUrl: string) {\n try {\n const response = await fetch(objectUrl);\n const blob = await response.blob();\n\n return blob;\n } catch (error) {\n console.error('Error converting object URL to Blob:', error);\n throw error;\n }\n}\n\nexport async function objectUrlToBase64(objectUrl: string): Promise<string> {\n const blob = await objectUrlToBlob(objectUrl);\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function downloadBlob(blob: Blob, filename: string) {\n // 1. Create a temporary URL for the Blob object\n const url = URL.createObjectURL(blob);\n\n // 2. Create a hidden anchor element\n const link = document.createElement('a');\n link.style.display = 'none';\n link.href = url;\n\n // 3. Set the 'download' attribute with the desired file name\n // This attribute forces the browser to download the URL content instead of navigating to it\n link.download = `${filename}.${getExt(blob)}`;\n\n // 4. Append the link to the body (necessary for the click to work in some browsers)\n document.body.appendChild(link);\n\n // 5. Simulate a click on the link to trigger the download\n link.click();\n\n // 6. Clean up: Remove the link and revoke the object URL\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * image url을 File Object로 변경.\n * @param imageUrl fileObject로 변경할 image url\n * @note fetch를 이용하여 변환하기때문에, 앱내 커스텀스킴을 사용하는경우는 처리불가. imageUrlToFileWithCanvas사용\n * @return file object\n */\nexport async function imageUrlToFileFetch(imageUrl: string): Promise<File> {\n const headers = new Headers();\n headers.append('cache-control', 'no-cache');\n const resImage = await fetch(imageUrl, { headers });\n const blob = await resImage.blob();\n const { type } = blob;\n const name = type.split('/').join('.');\n const file = new File([blob], name, { type });\n\n return file;\n}\n\nexport async function imageUrlToFile(imageUrl: string): Promise<File> {\n const fileConvertTypeCookieKey = 'dsp-debug-mode-file-convert-type';\n const fileConvertType = getCookie(fileConvertTypeCookieKey);\n\n if (fileConvertType === 'fetch') {\n return await imageUrlToFileFetch(imageUrl);\n }\n\n if (fileConvertType === 'xhr') {\n return await imageUrlToFileWithXMLHttpRequest(imageUrl);\n }\n\n return await imageUrlToFileWithCanvas(imageUrl);\n}\n\n/**\n * imageUrlToFile버전을 사용할수 없는경우 대체하여 사용.\n * 메모리소모가 증가하고, 이미지손실가능성이 있음.\n * 이미지원본에 대한 보존이 필수인경우 비추\n * @param imageUrl\n * @returns\n */\nexport async function imageUrlToFileWithCanvas(imageUrl: string): Promise<File> {\n const newImage = new Image();\n newImage.src = imageUrl;\n newImage.crossOrigin = 'Anonymous';\n\n return new Promise((resolve, reject) => {\n newImage.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = newImage.width;\n canvas.height = newImage.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(newImage, 0, 0);\n canvas.toBlob((blob) => {\n if (blob) {\n const ext = getExt(imageUrl);\n const file = new File([blob], `image.${ext}`, { type: blob.type });\n resolve(file);\n }\n });\n }\n };\n newImage.onerror = (e) => {\n reject(JSON.stringify(e));\n };\n });\n}\n\nexport async function imageUrlToFileWithXMLHttpRequest(imageUrl: string): Promise<File> {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', imageUrl, true);\n xhr.responseType = 'blob';\n xhr.send();\n\n return new Promise((resolve, reject) => {\n xhr.onload = () => {\n if (xhr.status === 200) {\n const blob = xhr.response;\n const file = new File([blob], `image.${getExt(imageUrl)}`, { type: blob.type });\n resolve(file);\n } else {\n reject(new Error(`Failed to load image: ${xhr.status}`));\n }\n };\n xhr.onerror = (e) => {\n reject(JSON.stringify(e));\n };\n });\n}\n","/* eslint-disable */\n\nfunction getAstx2CookieFromDsp(name) {\n let cookieName = name + '=';\n let decodedCookie = decodeURIComponent(document.cookie);\n let ca = decodedCookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i].trim(); // Remove leading/trailing whitespace\n if (c.indexOf(cookieName) === 0) {\n return c.substring(cookieName.length, c.length);\n }\n }\n return '';\n}\n\n/* ASTx 1.3 | (C) Copyright AhnLab, Inc. | $Revision: 32070 $ */\nvar $ASTX2_CONST = {\n ERROR_SUCCESS: 0,\n ERROR_FAILED: 101,\n ERROR_NOINIT: 102,\n ERROR_NOTINST: 103,\n ERROR_NOTSUPPORTED: 104,\n ERROR_NOCONNECT: 105,\n ERROR_NCK: 106,\n ERROR_ERR: 107,\n ERROR_NSP: 108,\n ERROR_PARAM: 109,\n ERROR_EXCESS: 110,\n ERROR_NEEDUPDATE: 111,\n OPTION_NONE2E: 1,\n OPTION_AUTOFOCUS: 2,\n OPTION_AUTOSETTEXT: 4,\n OPTION_E2EFORM: 8,\n OPTION_E2EFORM_NOENC: 16,\n OPTION_E2EFORM_ALLTRIP: 32,\n OPTION_E2EFORM_ONLY: 64,\n OPTION_E2EFORM_TAGSET: 128,\n OPTION_NONE2E_ALG: 256,\n OPTION_NOSPTDUMMY: 512,\n OPTION_FIXEDTYPE: 1024,\n PROTECT_AK: 1,\n PROTECT_FW: 2,\n PROTECT_PB: 4,\n PROTECT_PCS: 8,\n SERVICE_AK: 1,\n REQUEST_JSONP: 1,\n REQUEST_AJAX: 2,\n DEBUG_NOALIVE: 1,\n INTERVAL_ALIVE: 5e3,\n E2ETYPE_EXCLUDE: -1,\n E2ETYPE_NONE: 0,\n E2ETYPE_CERT1: 1,\n E2ETYPE_CERT2: 2,\n E2ETYPE_SDK: 11,\n E2ETYPE_PLAIN1: 21,\n E2ETYPE_PLAIN2: 22,\n E2ETYPE_WIZVERA: 31,\n PAGEID: '',\n BROWSER_TYPE: '',\n BROWSER_VER: '',\n E2EFORM_TAIL: !0,\n E2EFORM_INIT: '_e2e_forminit',\n E2EFORM_TAG1: '_e2e_1__',\n E2EFORM_TAG2: '_e2e_2__',\n E2EFORM_TAG1_PWD: '_e2e_1_pwd__',\n E2EFORM_TAG2_PWD: '_e2e_2_pwd__',\n getErrno: function (a) {\n return 'NCK' == a ? this.ERROR_NCK : 'ERR' == a ? this.ERROR_ERR : 'NSP' == a ? this.ERROR_NSP : this.ERROR_FAILED;\n },\n _get_browser_version: function (a) {\n var b = 0;\n if (0 <= a.indexOf('Edge/') && ((b = parseInt(a.split('Edge/')[1])), 0 < b)) return 'EG' + b;\n if (0 <= a.indexOf('MSIE')) {\n if (((b = parseInt(a.split('MSIE')[1])), 0 < b)) return 'IE' + b;\n } else if (\n 0 <= a.indexOf('Trident') &&\n (0 <= a.indexOf('rv:')\n ? (b = parseInt(a.split('rv:')[1]))\n : 0 <= a.indexOf('IE') && (b = parseInt(a.split('IE')[1])),\n 0 < b)\n )\n return 'IE' + b;\n return 0 <= a.indexOf('OPR/') && ((b = parseInt(a.split('OPR/')[1])), 0 < b)\n ? 'OP' + b\n : 0 <= a.indexOf('Firefox/') && ((b = parseInt(a.split('Firefox/')[1])), 0 < b)\n ? 'FF' + b\n : 0 <= a.indexOf('Chrome/') && ((b = parseInt(a.split('Chrome/')[1])), 0 < b)\n ? 'CR' + b\n : 0 <= a.indexOf('AppleWebKit') &&\n 0 <= a.indexOf('Version/') &&\n ((b = parseInt(a.split('Version/')[1])), 0 < b)\n ? 'SF' + b\n : 'OT0';\n },\n init: function () {\n this.PAGEID = new Date().getTime();\n this.PAGEID -= Math.floor(100 * Math.random());\n this.BROWSER_VER = this._get_browser_version(navigator.userAgent);\n this.BROWSER_TYPE = this.BROWSER_VER.substring(0, 2);\n }\n};\n$ASTX2_CONST.init();\nvar $ASTX2_COMM = {\n mLocalServerURL: '',\n mClientPublicKey: '',\n mErrorAbortFlag: !1,\n mDegugFlags: 0,\n setDegugFlags: function (a) {\n this.mDegugFlags |= a;\n },\n getDegugFlags: function () {\n return this.mDegugFlags;\n },\n isEnable: function () {\n return 0 < this.mLocalServerURL.length ? !0 : !1;\n },\n uninit: function () {\n this.mLocalServerURL = '';\n },\n errorAbort: function (a) {\n 1 != this.mErrorAbortFlag && ((this.mErrorAbortFlag = !0), $ASTX2_CUST.errorAbort(a));\n }\n },\n $_astxu = {\n mJsonpSequence: 0,\n jsonQstr: function (a) {\n var b = [],\n c;\n for (c in a) a.hasOwnProperty(c) && b.push(encodeURIComponent(c) + '=' + encodeURIComponent(a[c]));\n return b.join('&');\n },\n jsonParse: function (a) {\n var b = a.indexOf('{'),\n c = a.indexOf('}');\n if (-1 == b || -1 == c) return {};\n a = a.substring(b, c + 1);\n return 'object' == typeof window.JSON && 'function' == typeof window.JSON.parse\n ? window.JSON.parse(a)\n : 'function' == typeof jQuery && 'function' == typeof jQuery.parseJSON\n ? jQuery.parseJSON(a)\n : eval('(' + a + ')');\n },\n _send_jsonp_jquery: function (a) {\n try {\n jQuery.ajax({\n url: a.src,\n timeout: a.timeout,\n cache: !1,\n crossDomain: !0,\n dataType: 'jsonp',\n contentType: 'application/javascript',\n success: function (b, d, e) {\n a.onSuccess(b);\n },\n error: function (b, d, e) {\n if (200 == b.status && 1 == a.nocallback) a.onSuccess();\n else a.onFailure();\n },\n complete: function (a, b) {}\n });\n } catch (b) {\n a.onFailure();\n }\n },\n _send_jsonp_dom: function (a) {\n var b = document.createElement('script');\n b.type = 'text/javascript';\n b.id = a.callback;\n b.async = a.async;\n b.src = a.src;\n var c = document.getElementsByTagName('body')[0];\n if (null == c && ((c = document.getElementsByTagName('head')[0]), null == c)) {\n a.onFailure();\n return;\n }\n var d = window.setTimeout(function () {\n window[a.callback] = function () {};\n try {\n var b = document.getElementById(a.callback);\n b && ((b.onerror = function () {}), c.removeChild(b));\n } catch (d) {}\n a.onFailure();\n }, a.timeout);\n 0 == a.nocallback\n ? (window[a.callback] = function (b) {\n window.clearTimeout(d);\n try {\n var f = document.getElementById(a.callback);\n f && c.removeChild(f);\n } catch (g) {}\n a.onSuccess(b);\n })\n : (b.onload = function () {\n window.clearTimeout(d);\n try {\n var b = document.getElementById(a.callback);\n b && c.removeChild(b);\n } catch (f) {}\n a.onSuccess();\n });\n b.onerror = function () {\n window.clearTimeout(d);\n window[a.callback] = function () {};\n try {\n var b = document.getElementById(a.callback);\n b && c.removeChild(b);\n } catch (f) {}\n a.onFailure();\n };\n c.appendChild(b);\n },\n sendJsonp: function (a) {\n null == a.data && (a.data = {});\n null == a.callback && (a.callback = 'jsonpCallback' + $_astxu.rnd());\n null == a.nocallback && (a.nocallback = !1);\n null == a.timeout && (a.timeout = 5e3);\n null == a.async && (a.async = !0);\n null == a.seq && (a.seq = !1);\n null == a.onSuccess && (a.onSuccess = function (a) {});\n null == a.onFailure && (a.onFailure = function () {});\n a.src = 1 == $ASTX2.mUseJQuery ? a.url + '?v=3' : a.url + '?v=2&callback=' + a.callback;\n if (1 == a.seq) {\n var b = ++this.mJsonpSequence;\n a.src += '&seq=' + b;\n 2147483647 <= this.mJsonpSequence && (this.mJsonpSequence = 0);\n }\n b = this.jsonQstr(a.data);\n 0 < b.length && (a.src += '&' + b);\n 1 == $ASTX2.mUseJQuery ? this._send_jsonp_jquery(a) : this._send_jsonp_dom(a);\n },\n _get_xhr_object: function () {\n if ('undefined' !== typeof XMLHttpRequest)\n try {\n return new XMLHttpRequest();\n } catch (a) {}\n try {\n return new ActiveXObject('Microsoft.XMLHTTP');\n } catch (b) {}\n return null;\n },\n sendAjax: function (a) {\n var b = this._get_xhr_object();\n if (null == b) $_astxu.msg('[sendAjax] _get_xhr_object failed');\n else {\n null == a.data && (a.data = {});\n null == a.type && (a.type = 'POST');\n null == a.async && (a.async = !0);\n null == a.onSuccess && (a.onSuccess = function (a) {});\n null == a.onFailure && (a.onFailure = function (a, b) {});\n var c = this.jsonQstr(a.data);\n b.open(a.type, 'GET' == a.type ? a.url + '&' + c : a.url, a.async);\n b.onreadystatechange = function () {\n if (4 == b.readyState)\n if (200 == b.status) a.onSuccess(b.responseText);\n else a.onFailure(b.status);\n };\n null != a.timeout && (b.timeout = a.timeout);\n b.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n b.send(c);\n }\n },\n sendAuthAjax: function (a) {\n var b = this._get_xhr_object();\n const stored = JSON.parse(sessionStorage.getItem('cust-mgmt-auth') || '{}');\n if (null == b) $_astxu.msg('[sendAjax] _get_xhr_object failed');\n else {\n null == a.data && (a.data = {});\n null == a.type && (a.type = 'POST');\n null == a.async && (a.async = !0);\n null == a.onSuccess && (a.onSuccess = function (a) {});\n null == a.onFailure && (a.onFailure = function (a, b) {});\n var c = this.jsonQstr(a.data);\n b.open(a.type, 'GET' == a.type ? a.url + '&' + c : a.url, a.async);\n b.onreadystatechange = function () {\n if (4 == b.readyState)\n if (200 == b.status) a.onSuccess(b.responseText);\n else a.onFailure(b.status);\n };\n null != a.timeout && (b.timeout = a.timeout);\n b.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n b.setRequestHeader('Authorization', stored.key);\n b.withCredentials = true;\n b.send(c);\n }\n },\n isACK: function (a) {\n return a && 'ACK' == a ? !0 : !1;\n },\n isWinOS: function () {\n return -1 != navigator.platform.indexOf('Win32') || -1 != navigator.platform.indexOf('Win64') ? !0 : !1;\n },\n isMacOS: function () {\n return -1 != navigator.platform.indexOf('Mac') ? !0 : !1;\n },\n isLinuxOS: function () {\n return -1 != navigator.platform.indexOf('Linux') ? !0 : !1;\n },\n isMacLinuxOS: function () {\n return 1 == this.isMacOS() || 1 == this.isLinuxOS() ? !0 : !1;\n },\n hasFocused: function () {\n var a = !1;\n try {\n a = document.hasFocus();\n } catch (b) {}\n return a;\n },\n addEvent: function (a, b, c) {\n a.addEventListener ? a.addEventListener(b, c, !1) : a.attachEvent('on' + b, c);\n },\n removeEvent: function (a, b, c) {\n a.removeEventListener ? a.removeEventListener(b, c) : a.detachEvent('on' + b, c);\n },\n getCreatedFormValue: function (a, b, c) {\n null == c && (c = !1);\n c = 1 == c ? document.getElementsByTagName('input') : a.getElementsByTagName('input');\n for (var d = 0; d < c.length; d++) {\n var e = c[d];\n if (e && this.getnc(e.name) == b) return e;\n }\n c = document.createElement('input');\n c.name = b;\n c.type = 'hidden';\n if ('function' === typeof $ASTX2_CUST.onCreatedFormValue) $ASTX2_CUST.onCreatedFormValue(c, b);\n a.appendChild(c);\n return c;\n },\n getHostPath: function () {\n var a = window.location.protocol + '//' + window.location.hostname;\n return (a += window.location.port ? ':' + window.location.port : '');\n },\n getnc: function (a, b) {\n null == b && (b = '');\n return null == a ? b : a;\n },\n getint: function (a, b) {\n null == b && (b = 0);\n return parseInt(a) || b;\n },\n rnd: function () {\n var a = new Date().getTime();\n return (a += new String(Math.floor(100 * Math.random())));\n },\n getKeyCode: function (a) {\n var b = null;\n a && (b = a.keyCode ? a.keyCode : a.which);\n return b;\n },\n xorEncode: function (a, b) {\n for (var c = '', d = new String(a), e = 0; e < d.length; e++) c += String.fromCharCode(b ^ d.charCodeAt(e));\n return c;\n },\n xorDecode: function (a, b) {\n for (var c = '', d = new String(a), e = 0; e < d.length; e++) c += String.fromCharCode(b ^ d.charCodeAt(e));\n return c;\n },\n ltrim: function (a, b) {\n for (b = this.getnc(b, ' '); a.substring(0, 1) == b; ) a = a.substring(1, a.length);\n return a;\n },\n rtrim: function (a, b) {\n for (b = this.getnc(b, ' '); a.substring(a.length - 1, a.length) == b; ) a = a.substring(0, a.length - 1);\n return a;\n },\n alltrim: function (a, b) {\n return this.ltrim(this.rtrim(a, b), b);\n },\n setInputFocus: function () {\n try {\n for (var a = document.getElementsByTagName('input'), b = 0; b < a.length; b++) {\n var c = a[b];\n if (c && 'hidden' != c.type) {\n c.focus();\n break;\n }\n }\n } catch (d) {}\n },\n log: function (a) {\n 'object' === typeof debuger && 'function' === typeof debuger.write\n ? debuger.write(a)\n : 'object' === typeof window.console && 'function' === typeof console.log && console.log(a);\n },\n msg: function (a) {\n this.log(a);\n }\n },\n $ASTX2_E2E = (function () {\n var a = null,\n b = function (a) {\n function b(a) {\n var c = a.target;\n null == c && (c = a.srcElement);\n return c;\n }\n function e(a) {\n if (null == a) return null;\n var b = a.getAttribute('e2e_inputid');\n if (null == b || 0 >= b) return null;\n var c = a.getAttribute('e2e_type');\n if (null == c || 0 >= c) return null;\n var d = a.getAttribute('e2e_inputtype');\n if (null == d || 0 >= d) d = '';\n var e = a.getAttribute('wizvera_key');\n null == e && (e = '');\n var f = {};\n f.e2e_inputid = b;\n f.e2e_type = c;\n f.e2e_inputtype = d;\n f.name = $_astxu.getnc(a.name);\n f.form = a.form ? $_astxu.getnc(a.form.name) : '';\n f.wizvera_key = e;\n return f;\n }\n function f(a) {\n var b = e(a);\n if (null == b) return null;\n b.type = $_astxu.getnc(a.type);\n b.maxlength = $_astxu.getnc(a.getAttribute('maxlength'));\n b.txtmsk = $_astxu.getnc(a.getAttribute('e2e_txtmsk'));\n return b;\n }\n function g(a, b) {\n a.getAttribute('e2e_type') != $ASTX2_CONST.E2ETYPE_PLAIN1 && (a.readOnly = b);\n }\n function h(a, b, c, d, e) {\n 1 == n && q(a, b, c, d, e);\n }\n function q(b, s, d, e, f) {\n var g = {};\n g.pageid = $ASTX2_CONST.PAGEID;\n if (null != s) for (var h in s) s.hasOwnProperty(h) && (g[h] = s[h]);\n a.send_e2e_cmd(b, g, d, e, f);\n }\n function l(a, b) {\n var c = '';\n return (c = 0 == $ASTX2_CONST.E2EFORM_TAIL ? b + a : a + b);\n }\n function m(a, b) {\n var c = '';\n return (c =\n 'password' == a.type\n ? b == $ASTX2_CONST.E2ETYPE_CERT2\n ? l(a.name, $ASTX2_CONST.E2EFORM_TAG2_PWD)\n : l(a.name, $ASTX2_CONST.E2EFORM_TAG1_PWD)\n : b == $ASTX2_CONST.E2ETYPE_CERT2\n ? l(a.name, $ASTX2_CONST.E2EFORM_TAG2)\n : l(a.name, $ASTX2_CONST.E2EFORM_TAG1));\n }\n function C() {\n if (0 != D)\n for (var a = document.getElementsByTagName('form'), b = 0; b < a.length; b++) {\n var c = a[b];\n if (null != c) {\n var d = !1;\n if (k & $ASTX2_CONST.OPTION_E2EFORM_TAGSET) {\n var e = c.getAttribute(E.e2eform_tagset);\n if (null == e || 0 >= e) d = !0;\n } else if (k & $ASTX2_CONST.OPTION_E2EFORM_ONLY) {\n if (null == c) e = !1;\n else\n for (var e = !1, f = c.getElementsByTagName('input'), g = 0; g < f.length; g++) {\n var h = f[g];\n if (null != h && ((h = h.getAttribute('e2e_type')), null != h && 0 < h)) {\n e = !0;\n break;\n }\n }\n 0 == e && (d = !0);\n }\n if (1 != d) {\n if ((d = $_astxu.getCreatedFormValue(c, l($ASTX2_CONST.E2EFORM_INIT, $ASTX2_CONST.E2EFORM_TAG1))))\n d.value = F;\n if ((d = $_astxu.getCreatedFormValue(c, l($ASTX2_CONST.E2EFORM_INIT, $ASTX2_CONST.E2EFORM_TAG2))))\n d.value = G;\n }\n }\n }\n }\n function V(a) {\n var b = 0;\n k & $ASTX2_CONST.OPTION_E2EFORM_NOENC && (b = 1);\n a = {\n ver: $_astxu.getint(a.ver),\n alg: $_astxu.getint(a.alg),\n svr: $_astxu.getnc(a.svr),\n norsa: $_astxu.getint(a.norsa),\n uniq: $_astxu.getnc(a.uniq),\n utime: $_astxu.getint(a.utime),\n ncert: $_astxu.getnc(a.ncert),\n pageid: $ASTX2_CONST.PAGEID,\n noenc: b\n };\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/e2e_forminit',\n data: a,\n onSuccess: function (a) {\n var b = $_astxu.getnc(a ? a.result : '');\n 0 == $_astxu.isACK(b)\n ? $_astxu.msg('[e2e_forminit] result=' + b)\n : ((D = !0), (F = $_astxu.getnc(a.e2e_form1)), (G = $_astxu.getnc(a.e2e_form2)), C());\n },\n onFailure: function () {\n $_astxu.msg('[e2e_forminit] failure.');\n }\n });\n }\n function W() {\n $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_CERT),\n onSuccess: function (a) {\n var b = $_astxu.jsonParse(a);\n a = $_astxu.getnc(b ? b.result : '');\n 0 == $_astxu.isACK(a)\n ? $_astxu.msg('[_init_e2eform] result=' + a)\n : $ASTX2.set_cert(\n function () {\n V(b);\n },\n function () {\n $_astxu.msg('[_init_e2eform] set_cert() failure');\n },\n b\n );\n },\n onFailure: function (a) {\n $_astxu.msg('[_init_e2eform] failure');\n }\n });\n }\n function H(a) {\n var b = $_astxu.getHostPath() + $_astxu.getnc(window.location.pathname),\n c = 0;\n k & $ASTX2_CONST.OPTION_NOSPTDUMMY && (c = 1);\n q(\n 'e2e_start',\n { browser: $ASTX2_CONST.BROWSER_VER, ver: a.ver, svr: a.svr, valg: a.valg, url: b, custcode: w, nospt: c },\n 5e3,\n function (a) {\n var b = $_astxu.getnc(a ? a.result : '');\n if ($_astxu.isACK(b)) {\n n = 1;\n I = $_astxu.getint(a.call_settext);\n t = $_astxu.getint(a.call_gettext);\n J = $_astxu.getint(a.vm_env);\n K = $_astxu.getint(a.ak_drv);\n try {\n var c = document.activeElement;\n c && x(c, !1);\n } catch (aa) {}\n k & $ASTX2_CONST.OPTION_E2EFORM &&\n (3 > $_astxu.getint(a.stsvr) ? $ASTX2_COMM.errorAbort($ASTX2_CONST.ERROR_NEEDUPDATE) : W());\n if (k & $ASTX2_CONST.OPTION_AUTOSETTEXT)\n for (var d in u) (a = u[d]), null != a && (0 >= $_astxu.getnc(a.value).length || y(a));\n } else n = 2;\n },\n function () {\n n = 2;\n }\n );\n }\n function L(a) {\n if (0 == $_astxu.hasFocused()) return !1;\n if (0 == n) return !0;\n if (1 == n) {\n if (!1 === a) return;\n try {\n var b = document.activeElement;\n b && x(b, !1);\n } catch (c) {}\n return !0;\n }\n n = 0;\n k & $ASTX2_CONST.OPTION_NONE2E\n ? ((a = 0),\n k & $ASTX2_CONST.OPTION_NONE2E_ALG && (a = $ASTX2.mOptionStrings.none2e_alg),\n H({ ver: 1, svr: '_none2e', valg: a }))\n : $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_INIT),\n onSuccess: function (a) {\n a = $_astxu.jsonParse(a);\n var b = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(b) ? H(a) : (n = -1);\n },\n onFailure: function (a) {\n n = -1;\n }\n });\n return !0;\n }\n function r(a) {\n if (null != a && (a.getAttribute('e2e_type') != $ASTX2_CONST.E2ETYPE_PLAIN1 || 0 != t)) {\n try {\n if (a != document.activeElement) return;\n } catch (b) {}\n 'number' == typeof a.selectionStart\n ? (a.selectionStart = a.selectionEnd = a.value.length)\n : 'undefined' != typeof a.createTextRange && ((a = a.createTextRange()), a.collapse(!1), a.select());\n }\n }\n function x(a, b) {\n v = !1;\n if (k & $ASTX2_CONST.OPTION_FIXEDTYPE && a) {\n var c = a.getAttribute('e2e_inputid');\n null != c && 0 < c && z[c] != a.type && (a.type = z[c]);\n }\n c = f(a);\n null != c &&\n (!0 === b && L(!1),\n h(\n 'e2e_focus',\n c,\n null,\n function (b) {\n g(a, !1);\n window.setTimeout(function () {\n r(a);\n }, 1);\n },\n function () {}\n ));\n }\n function M(a) {\n var c = b(a);\n if (null != c) {\n if ('function' === typeof $ASTX2_CUST.onHandlerPreFocus) $ASTX2_CUST.onHandlerPreFocus(c, a);\n x(c, !0);\n }\n }\n function N(a) {\n a = b(a);\n if (null != a) {\n var c = e(a);\n if (null != c) {\n try {\n if (document.hasFocus() && a === document.activeElement) return;\n } catch (f) {}\n g(a, !0);\n h('e2e_blur', c);\n }\n }\n }\n function O(a) {\n var c = b(a);\n null != c &&\n window.setTimeout(function () {\n r(c);\n }, 1);\n }\n function y(a, b) {\n var c = f(a);\n if (null != c) {\n var d = $_astxu.getnc(a.value);\n c.text = d;\n k & $ASTX2_CONST.OPTION_E2EFORM && (c.e2eform = 1);\n k & $ASTX2_CONST.OPTION_E2EFORM_NOENC && (c.noenc = 1);\n h(\n 'e2e_settext',\n c,\n null,\n function (d) {\n var e = $_astxu.getnc(d ? d.result : '');\n if (0 == $_astxu.isACK(e)) b && b($ASTX2_CONST.ERROR_NCK);\n else {\n if (k & $ASTX2_CONST.OPTION_E2EFORM) {\n var e = m(a, c.e2e_type),\n f = !1;\n k & $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP && (f = !0);\n if ((e = $_astxu.getCreatedFormValue(a.form, e, f))) e.value = $_astxu.getnc(d.e2e_data);\n }\n b && b($ASTX2_CONST.ERROR_SUCCESS);\n }\n },\n function () {\n b && b($ASTX2_CONST.ERROR_FAILED);\n }\n );\n }\n }\n function A(a) {\n 'function' === typeof a.stopPropagation && a.stopPropagation();\n 'function' === typeof a.preventDefault ? a.preventDefault() : (a.returnValue = !1);\n }\n function X(a, b, c) {\n h(\n 'e2e_gettext',\n b,\n null,\n function (b) {\n var d = $_astxu.getnc(b ? b.result : '');\n $_astxu.isACK(d)\n ? ((b = $_astxu.getnc(b.text)), (a.value = b), c && c($ASTX2_CONST.ERROR_SUCCESS))\n : c && c($ASTX2_CONST.ERROR_NCK);\n },\n function () {\n c && c($ASTX2_CONST.ERROR_FAILED);\n }\n );\n }\n function Y(a, b) {\n k & $ASTX2_CONST.OPTION_E2EFORM_NOENC && (b.noenc = 1);\n h(\n 'e2e_formget',\n b,\n null,\n function (c) {\n var d = $_astxu.getnc(c ? c.result : '');\n if (0 == $_astxu.isACK(d)) $_astxu.msg('[e2e_formget] ' + b.name + ',result=' + d);\n else if (((d = a.form), null != d)) {\n var e = m(a, b.e2e_type),\n f = !1;\n k & $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP && (f = !0);\n if ((d = $_astxu.getCreatedFormValue(d, e, f))) d.value = $_astxu.getnc(c.e2e_data);\n }\n },\n function () {}\n );\n }\n function P(a) {\n var c = b(a);\n if (null != c) {\n var e = f(c);\n if (null != e) {\n r(c);\n var p = $_astxu.getKeyCode(a);\n 17 == p && (v = !0);\n if (1 == v)\n return (\n 86 == p &&\n h(\n 'e2e_clear',\n e,\n null,\n function (a) {\n c.value = '';\n },\n function () {}\n ),\n A(a),\n !1\n );\n if (1 == (16 == p || 17 == p || 18 == p ? !0 : !1)) return !0;\n var g = !0;\n k & $ASTX2_CONST.OPTION_E2EFORM &&\n ((e.e2e_type != $ASTX2_CONST.E2ETYPE_CERT1 && e.e2e_type != $ASTX2_CONST.E2ETYPE_CERT2) || Y(c, e));\n 'function' === typeof $ASTX2_CUST.onHandlerKeyDown &&\n 0 == $ASTX2_CUST.onHandlerKeyDown(c, a) &&\n (A(a), (g = !1));\n 1 != t ||\n ('password' == c.type && e.e2e_type != $ASTX2_CONST.E2ETYPE_PLAIN1) ||\n 0 != J ||\n (1 == g &&\n X(c, e, function () {\n 'password' != c.type &&\n 'dynamic' == c.getAttribute('e2e_txtmsk') &&\n (c.value = c.value.replace(/[^*]/g, '*').substring(0, c.value.length - 1) + c.value.slice(-1));\n }),\n 0 == (8 == p || 9 == p || 13 == p || 20 == p ? !0 : !1) && (A(a), (g = !1)));\n return g;\n }\n }\n }\n function Q(a) {\n var c = b(a);\n null != c &&\n (17 == $_astxu.getKeyCode(a) && (v = !1),\n 1 == I\n ? y(c)\n : 0 == t &&\n 'password' != c.type &&\n 'dynamic' == c.getAttribute('e2e_txtmsk') &&\n (c.value = c.value.replace(/[^*]/g, '*').substring(0, c.value.length - 1) + c.value.slice(-1)),\n window.setTimeout(function () {\n r(c);\n }, 1));\n }\n function R(a) {\n var c = b(a);\n null != c &&\n window.setTimeout(function () {\n r(c);\n }, 1);\n }\n function S(a) {\n if ('IE' == $ASTX2_CONST.BROWSER_TYPE || 'EG' == $ASTX2_CONST.BROWSER_TYPE) {\n var c = b(a);\n null != c &&\n '' != c.value &&\n setTimeout(function () {\n if ('' == c.value) {\n var a = e(c);\n null != a && h('e2e_clear', a);\n }\n }, 1);\n }\n }\n function T(a) {\n var c = b(a);\n null != c &&\n ('number' == typeof c.selectionStart\n ? (c.selectionStart < c.value.length || c.selectionEnd < c.value.length) &&\n window.setTimeout(function () {\n r(c);\n }, 1)\n : 'undefined' != typeof c.createTextRange &&\n document.selection &&\n ((a = document.selection.createRange()),\n a.moveStart('character', -c.value.length),\n a.text.length <= c.value.length &&\n window.setTimeout(function () {\n r(c);\n }, 1)));\n }\n function Z(a) {}\n function U(a) {\n h('e2e_unload');\n }\n var k = 0,\n E = [],\n $ = 0,\n B = !1,\n w = 0,\n n = -1,\n I = 0,\n t = 0,\n J = 0,\n K = 1,\n v = !1,\n u = [],\n z = [],\n D = !1,\n F = '',\n G = '';\n this.setOption = function (a) {\n k |= a;\n };\n this.setOptionStrings = function (a) {\n E = a;\n };\n this.attach = function (a, b) {\n null != a && (w = a);\n k & $ASTX2_CONST.OPTION_AUTOSETTEXT && (u = []);\n k & $ASTX2_CONST.OPTION_E2EFORM && C();\n for (var c = document.getElementsByTagName('input'), d = 0; d < c.length; d++) {\n var e = c[d];\n null != e && this.addObject(e);\n }\n q(\n 'e2e_init',\n null,\n null,\n function (a) {\n L();\n $_astxu.addEvent(window, 'blur', Z);\n $_astxu.addEvent(window, 'unload', U);\n $_astxu.addEvent(window, 'beforeunload', U);\n b && b(!0);\n },\n function () {\n b && b(!1);\n }\n );\n B = !0;\n };\n this.addObject = function (a) {\n if (null != a) {\n var b = a.getAttribute('e2e_inputid');\n if (!(null != b && 0 < b)) {\n var c = a.getAttribute('e2e_type');\n if (null == c || 0 >= c)\n if (((c = a.getAttribute('e2e')), 'true' == c || 'on' == c))\n (c = $ASTX2_CONST.E2ETYPE_CERT1), a.setAttribute('e2e_type', c);\n else {\n c = $ASTX2_CONST.E2ETYPE_NONE;\n try {\n if (\n ('function' === typeof $ASTX2_CUST.isE2EObject &&\n 1 == $ASTX2_CUST.isE2EObject(a) &&\n ((c = $ASTX2_CONST.E2ETYPE_CERT1), a.setAttribute('e2e_type', c)),\n 'function' === typeof $ASTX2_CUST.getE2Etype)\n ) {\n var d = $ASTX2_CUST.getE2Etype(a);\n d && ((c = d), a.setAttribute('e2e_type', c));\n }\n } catch (e) {}\n if (c == $ASTX2_CONST.E2ETYPE_NONE) return;\n }\n b = ++$;\n a.setAttribute('e2e_inputid', b);\n d = !0;\n k & $ASTX2_CONST.OPTION_AUTOSETTEXT && 0 < a.value.length && ((d = !1), u.push(a));\n 1 == d && (a.value = '');\n a.setAttribute('autocomplete', 'off');\n g(a, !0);\n z[b] = a.type;\n $_astxu.addEvent(a, 'focus', M);\n $_astxu.addEvent(a, 'blur', N);\n $_astxu.addEvent(a, 'click', O);\n $_astxu.addEvent(a, 'keyup', Q);\n $_astxu.addEvent(a, 'keydown', P);\n $_astxu.addEvent(a, 'select', T);\n $_astxu.addEvent(a, 'mouseup', S);\n $_astxu.addEvent(a, 'mousedown', R);\n k & $ASTX2_CONST.OPTION_E2EFORM &&\n (c == $ASTX2_CONST.E2ETYPE_CERT1 || c == $ASTX2_CONST.E2ETYPE_CERT2) &&\n ((b = a.form),\n null != b &&\n ((a = m(a, c)),\n (c = !1),\n k & $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP && (c = !0),\n $_astxu.getCreatedFormValue(b, a, c)));\n }\n }\n };\n this.subObject = function (a) {\n var b = e(a);\n if (null != b) {\n $_astxu.removeEvent(a, 'focus', M);\n $_astxu.removeEvent(a, 'blur', N);\n $_astxu.removeEvent(a, 'click', O);\n $_astxu.removeEvent(a, 'keyup', Q);\n $_astxu.removeEvent(a, 'keydown', P);\n $_astxu.removeEvent(a, 'select', T);\n $_astxu.removeEvent(a, 'mouseup', S);\n $_astxu.removeEvent(a, 'mousedown', R);\n try {\n a == document.activeElement && h('e2e_blur', b);\n } catch (c) {}\n a.value = '';\n a.setAttribute('e2e_inputid', -1);\n a.setAttribute('e2e_type', -1);\n g(a, !1);\n }\n };\n this.getE2EHash = function (a, b) {\n var c = e(a);\n null == c\n ? b(null, $ASTX2_CONST.ERROR_PARAM)\n : h(\n 'e2e_gethash',\n c,\n null,\n function (a) {\n var c = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(c)\n ? b($_astxu.getnc(a.hash), $ASTX2_CONST.ERROR_SUCCESS)\n : b(null, $ASTX2_CONST.ERROR_NCK);\n },\n function () {\n b(null, $ASTX2_CONST.ERROR_FAILED);\n }\n );\n };\n this.getEncText = function (a, b, c) {\n var d = e(a);\n d.customcode = w;\n d.random = b;\n null == d\n ? c(null, null, $ASTX2_CONST.ERROR_PARAM)\n : h(\n 'sdk_getenctext',\n d,\n null,\n function (a) {\n var b = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(b)\n ? c(d.name, $_astxu.getnc(a.getenctext), $ASTX2_CONST.ERROR_SUCCESS)\n : c(null, null, $ASTX2_CONST.ERROR_NCK);\n },\n function () {\n c(null, null, $ASTX2_CONST.ERROR_FAILED);\n }\n );\n };\n this.getE2EText = function (a, b) {\n var c = e(a);\n null == c\n ? b(null, null, $ASTX2_CONST.ERROR_PARAM)\n : c.e2e_type != $ASTX2_CONST.E2ETYPE_PLAIN2 && c.e2e_type != $ASTX2_CONST.E2ETYPE_WIZVERA\n ? b(null, null, $ASTX2_CONST.ERROR_PARAM)\n : h(\n 'e2e_gettext',\n c,\n null,\n function (a) {\n var d = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(d)\n ? b(c.name, $_astxu.getnc(a.text), $ASTX2_CONST.ERROR_SUCCESS)\n : b(null, null, $ASTX2_CONST.ERROR_NCK);\n },\n function () {\n b(null, null, $ASTX2_CONST.ERROR_FAILED);\n }\n );\n };\n this.setE2EText = function (a, b) {\n y(a, b);\n };\n this.clearE2EText = function (a, b) {\n var c = e(a);\n null != c &&\n h(\n 'e2e_clear',\n c,\n null,\n function (d) {\n d = $_astxu.getnc(d ? d.result : '');\n if (0 == $_astxu.isACK(d)) b && b($ASTX2_CONST.ERROR_NCK);\n else {\n a.value = '';\n if (k & $ASTX2_CONST.OPTION_E2EFORM) {\n d = m(a, c.e2e_type);\n var e = !1;\n k & $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP && (e = !0);\n if ((d = $_astxu.getCreatedFormValue(a.form, d, e))) d.value = '';\n }\n b && b($ASTX2_CONST.ERROR_SUCCESS);\n }\n },\n function () {\n b && b($ASTX2_CONST.ERROR_FAILED);\n }\n );\n };\n this.dettach = function () {\n h('e2e_uninit');\n B = !1;\n };\n this.isAttached = function () {\n return B;\n };\n this.isStarted = function () {\n return 1 == n ? !0 : !1;\n };\n this.checkService = function (a) {\n var b = {};\n b.service = $ASTX2_CONST.SERVICE_AK;\n b.result = $ASTX2_CONST.ERROR_SUCCESS;\n if (0 >= n) {\n var c = this;\n window.setTimeout(function () {\n c.checkService(a);\n }, 300);\n } else\n 1 == n && 0 == K\n ? (b.result = $ASTX2_CONST.ERROR_FAILED)\n : 2 == n && (b.result = $ASTX2_CONST.ERROR_FAILED),\n a(b);\n };\n this.getE2EelmsForm = function (a, b, c, d) {\n for (var f = document.getElementsByTagName('input'), g = 0; g < f.length; g++) {\n var h = f[g];\n if (null != h && ((h = e(h)), null != h && h.e2e_type == d)) {\n var k = !1;\n null == a ? (k = !0) : $_astxu.getnc(a.name) == h.form && (k = !0);\n 0 != k && (b.push(h.e2e_inputid), c.push(h.name));\n }\n }\n };\n this.getE2EelmsID = function (a, b, c, d) {\n for (var f = document.getElementsByTagName('input'), g = 0; g < f.length; g++) {\n var h = f[g];\n if (null != h) {\n var k = e(h);\n if (null != k && k.e2e_type == d) {\n for (var l = !1, h = $_astxu.getnc(h.id).toLowerCase(), m = 0; m < a.length; m++)\n if (a[m].toLowerCase() == h) {\n l = !0;\n break;\n }\n 0 != l && (b.push(k.e2e_inputid), c.push(k.name));\n }\n }\n }\n };\n this.resetE2Evalues = function (a, b) {\n for (var c = document.getElementsByTagName('input'), d = 0; d < c.length; d++) {\n var f = c[d];\n if (null != f) {\n var g = e(f);\n null != g &&\n g.form == a &&\n g.e2e_type != $ASTX2_CONST.E2ETYPE_PLAIN1 &&\n g.e2e_type != $ASTX2_CONST.E2ETYPE_PLAIN2 &&\n (f.value = b);\n }\n }\n };\n this.getE2Eattribute = function (a) {\n return e(a);\n };\n };\n return {\n getInstance: function (c) {\n null === a && (a = new b(c));\n return a;\n }\n };\n })(),\n $ASTX2 = {\n mUseJQuery: !0,\n mUseAjaxHello: !1,\n mUseAutoStart: !0,\n mOption: 0,\n mOptionStrings: [],\n mE2EInst: null,\n mLastError: $ASTX2_CONST.ERROR_SUCCESS,\n send_e2e_cmd: function (a, b, c, d, e, f) {\n if ('object' == typeof $ASTX2_COMM && 0 != $ASTX2_COMM.isEnable()) {\n var g = this;\n null == f && (f = 1);\n var h = !1;\n if ('e2e_focus' == a || 'e2e_blur' == a || 'e2e_gettext' == a || 'e2e_settext' == a) h = !0;\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/' + a,\n data: b,\n timeout: c || 5e3,\n async: !1,\n seq: h,\n onSuccess: function (a) {\n d && d(a);\n },\n onFailure: function () {\n 3 > f ? g.send_e2e_cmd(a, b, c, d, e, f + 1) : e && e();\n }\n });\n }\n },\n _send_alive: function () {\n var a = { pageid: $ASTX2_CONST.PAGEID, focus: $_astxu.hasFocused() ? 1 : 0 };\n $_astxu.sendJsonp({ url: $ASTX2_COMM.mLocalServerURL + '/alive', data: a });\n },\n send_alive_run: function () {\n if (!($ASTX2_COMM.getDegugFlags() & $ASTX2_CONST.DEBUG_NOALIVE)) {\n var a = this;\n setInterval(function () {\n a._send_alive();\n }, $ASTX2_CONST.INTERVAL_ALIVE);\n }\n },\n _hello_local_server: function (a, b, c, d, e) {\n var f = this;\n if (d >= c.length)\n f.setLastError($ASTX2_CONST.ERROR_NOTINST),\n 1 == $_astxu.isWinOS() &&\n 1 == f.mUseAutoStart &&\n ((f.mUseAutoStart = !1),\n 'IE' != $ASTX2_CONST.BROWSER_TYPE &&\n 'EG' != $ASTX2_CONST.BROWSER_TYPE &&\n (window.location.href = 'astx://start')),\n b();\n else {\n var g = e[d],\n h = c[d],\n q = 'https://' + (1 == $_astxu.isMacOS() ? 'lx.astxsvc.com' : '127.0.0.1') + ':' + h + '/ASTX2',\n h = '',\n l = document.getElementsByTagName('script');\n if (l) for (var m = 0; m < l.length; m++) l[m].src && 0 <= l[m].src.indexOf('astx2.min.js') && (h = l[m].src);\n l = '$Revision: 32070 $';\n l = l.substr(11, l.length - 13);\n m = !1;\n 0 == $ASTX2.mUseAjaxHello && 1 == d % 2 && (m = !0);\n 'IE' == $ASTX2_CONST.BROWSER_TYPE &&\n 'IE10' != $ASTX2_CONST.BROWSER_VER &&\n 'IE11' != $ASTX2_CONST.BROWSER_VER &&\n ((m = !0), 2e3 < g && (g = 2e3));\n d++;\n 1 == m\n ? $_astxu.sendJsonp({\n url: q + '/hello',\n data: { url: h, version: l },\n timeout: g,\n onSuccess: function (c) {\n var d = $_astxu.getnc(c ? c.result : '');\n c = $_astxu.getnc(c ? c.client_public_key : '');\n $_astxu.isACK(d)\n ? (($ASTX2_COMM.mLocalServerURL = q), ($ASTX2_COMM.mClientPublicKey = c), a())\n : (f.setLastError($ASTX2_CONST.ERROR_NOTINST), b());\n },\n onFailure: function () {\n f._hello_local_server(a, b, c, d, e);\n }\n })\n : $_astxu.sendAjax({\n url: q + '/hello?',\n type: 'POST',\n data: { url: h, version: l },\n timeout: g,\n onSuccess: function (c) {\n var d = $_astxu.jsonParse(c);\n c = $_astxu.getnc(d ? d.result : '');\n d = $_astxu.getnc(d ? d.client_public_key : '');\n $_astxu.isACK(c)\n ? (($ASTX2_COMM.mLocalServerURL = q), ($ASTX2_COMM.mClientPublicKey = d), a())\n : (f.setLastError($ASTX2_CONST.ERROR_NOTINST), b());\n },\n onFailure: function () {\n f._hello_local_server(a, b, c, d, e);\n }\n });\n }\n },\n setOption: function (a) {\n if (null != a) {\n !0 === a.autofocus && (this.mOption |= $ASTX2_CONST.OPTION_AUTOFOCUS);\n !0 === a.e2eform && (this.mOption |= $ASTX2_CONST.OPTION_E2EFORM);\n !1 === a.e2eform_enc && (this.mOption |= $ASTX2_CONST.OPTION_E2EFORM_NOENC);\n !0 === a.e2eform_alltrip && (this.mOption |= $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP);\n !0 === a.e2eform_only && (this.mOption |= $ASTX2_CONST.OPTION_E2EFORM_ONLY);\n !0 === a.autosettext && (this.mOption |= $ASTX2_CONST.OPTION_AUTOSETTEXT);\n !0 === a.nospt && (this.mOption |= $ASTX2_CONST.OPTION_NOSPTDUMMY);\n !0 === a.fixedtype && (this.mOption |= $ASTX2_CONST.OPTION_FIXEDTYPE);\n var b = $_astxu.getnc(a.e2eform_tagset);\n 0 < b.length &&\n ((this.mOption |= $ASTX2_CONST.OPTION_E2EFORM_TAGSET), (this.mOptionStrings.e2eform_tagset = b));\n b = $_astxu.getint(a.none2e_alg);\n 0 < b && ((this.mOption |= $ASTX2_CONST.OPTION_NONE2E_ALG), (this.mOptionStrings.none2e_alg = b));\n }\n },\n _get_custom_value: function () {\n 'undefined' !== typeof $ASTX2_CUST.mUseJQuery && ($ASTX2.mUseJQuery = $ASTX2_CUST.mUseJQuery);\n 'undefined' !== typeof $ASTX2_CUST.mUseAjaxHello && ($ASTX2.mUseAjaxHello = $ASTX2_CUST.mUseAjaxHello);\n 'undefined' !== typeof $ASTX2_CUST.mUseAutoStart &&\n ($ASTX2.mUseAutoStart = 1 == $ASTX2.mUseAutoStart ? $ASTX2_CUST.mUseAutoStart : !1);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAIL && ($ASTX2_CONST.E2EFORM_TAIL = $ASTX2_CUST.E2EFORM_TAIL);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_INIT && ($ASTX2_CONST.E2EFORM_INIT = $ASTX2_CUST.E2EFORM_INIT);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAG1 && ($ASTX2_CONST.E2EFORM_TAG1 = $ASTX2_CUST.E2EFORM_TAG1);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAG2 && ($ASTX2_CONST.E2EFORM_TAG2 = $ASTX2_CUST.E2EFORM_TAG2);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAG1_PWD &&\n ($ASTX2_CONST.E2EFORM_TAG1_PWD = $ASTX2_CUST.E2EFORM_TAG1_PWD);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAG2_PWD &&\n ($ASTX2_CONST.E2EFORM_TAG2_PWD = $ASTX2_CUST.E2EFORM_TAG2_PWD);\n },\n init: function (a, b, c, d) {\n function e() {\n a();\n if (1 == $_astxu.isMacLinuxOS()) {\n f.send_alive_run();\n try {\n $ASTX2_MLi.init();\n } catch (b) {}\n }\n }\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n if (1 == $ASTX2_COMM.isEnable()) a();\n else {\n this._get_custom_value();\n null != d && ($ASTX2.mUseAutoStart = 1 == d ? $ASTX2.mUseAutoStart : !1);\n 1 == $ASTX2.mUseJQuery && 'undefined' === typeof jQuery && ($ASTX2.mUseJQuery = !1);\n var f = this;\n this.mE2EInst = $ASTX2_E2E.getInstance(this);\n this.mE2EInst.setOption(this.mOption);\n this.mE2EInst.setOptionStrings(this.mOptionStrings);\n var g = [],\n h = [];\n null != c\n ? ((g = [55920, 55920, 55921, 55922]), (h = [c, c, c, c]))\n : ((g = [55920, 55920, 55921, 55922]), (h = [1e4, 1500, 750, 250]));\n setTimeout(function () {\n f._hello_local_server(e, b, g, 0, h);\n }, 200);\n }\n },\n _check_local_server_chk_stamp: function (a, b, c, d) {\n var e = this;\n $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_CHK_STAMP),\n data: d,\n onSuccess: function (c) {\n c = $_astxu.jsonParse(c);\n c = $_astxu.getnc(c ? c.result : '');\n $_astxu.isACK(c) ? a() : (e.setLastError($ASTX2_CONST.ERROR_NCK), b());\n },\n onFailure: function (a) {\n b();\n }\n });\n },\n _check_local_server: function (a, b, c, d) {\n var e = this;\n null == d && (d = 1);\n 3 < d\n ? (e.setLastError($ASTX2_CONST.ERROR_NOCONNECT), b())\n : $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/check',\n data: { method: c, url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_STAMP), rnd: $_astxu.rnd() },\n onSuccess: function (f) {\n var g = $_astxu.getnc(f ? f.result : '');\n $_astxu.isACK(g)\n ? ((f.rnd = $_astxu.rnd()), e._check_local_server_chk_stamp(a, b, c, f))\n : e._check_local_server(a, b, c, d + 1);\n },\n onFailure: function () {\n e.setLastError($ASTX2_CONST.ERROR_FAILED);\n e._check_local_server(a, b, c, d + 1);\n }\n });\n },\n checkServer: function (a, b, c) {\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n 0 == $ASTX2_COMM.isEnable()\n ? (this.setLastError($ASTX2_CONST.ERROR_NOINIT), b())\n : (0 == $_astxu.isWinOS() ? (c = 1) : null == c && (c = 1), this._check_local_server(a, b, c));\n },\n _e2e_enable: function () {\n return 0 == $_astxu.isWinOS()\n ? (this.setLastError($ASTX2_CONST.ERROR_NOTSUPPORTED), !1)\n : 0 == $ASTX2_COMM.isEnable()\n ? (this.setLastError($ASTX2_CONST.ERROR_NOINIT), !1)\n : !0;\n },\n resetE2E: function (a, b) {\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n if (0 == this._e2e_enable()) return !1;\n var c = this;\n window.setTimeout(function () {\n c.mE2EInst.attach(a, b);\n }, 100);\n return !0;\n },\n initE2E: function (a, b) {\n this.mOption & $ASTX2_CONST.OPTION_AUTOFOCUS && $_astxu.setInputFocus();\n return this.resetE2E(a, b);\n },\n resetNonE2E: function (a, b) {\n return this.initNonE2E(a, b);\n },\n initNonE2E: function (a, b) {\n this.mE2EInst.setOption($ASTX2_CONST.OPTION_NONE2E);\n this.mOption & $ASTX2_CONST.OPTION_AUTOFOCUS && $_astxu.setInputFocus();\n return this.resetE2E(a, b);\n },\n uninitE2E: function () {\n 1 == $_astxu.isWinOS() && 1 == $ASTX2_COMM.isEnable() && this.mE2EInst.dettach();\n },\n uninitNonE2E: function () {\n this.uninitE2E();\n },\n set_cert: function (a, b, c, d) {\n null == d && (d = 1);\n var e = new String($_astxu.getnc(c['cert' + d]));\n if (0 == e.length) 0 < d ? a() : b();\n else {\n var f = this;\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/set_cert',\n data: { step: d, cert: e, pageid: $ASTX2_CONST.PAGEID },\n onSuccess: function (e) {\n setTimeout(function () {\n f.set_cert(a, b, c, d + 1);\n }, 250);\n },\n onFailure: function () {\n b();\n }\n });\n }\n },\n _e2edata_get: function (a, b, c, d) {\n var e = this;\n a = {\n ver: $_astxu.getint(d.ver),\n alg: $_astxu.getint(d.alg),\n svr: $_astxu.getnc(d.svr),\n norsa: $_astxu.getint(d.norsa),\n uniq: $_astxu.getnc(d.uniq),\n utime: $_astxu.getint(d.utime),\n ncert: $_astxu.getnc(d.ncert),\n pageid: $ASTX2_CONST.PAGEID,\n ids1: a.ids1,\n names1: a.names1,\n ids2: a.ids2,\n names2: a.names2\n };\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/get_data',\n data: a,\n timeout: 1e4,\n onSuccess: function (a) {\n var d = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(d) ? b(a) : (e.setLastError($ASTX2_CONST.ERROR_NCK), c());\n },\n onFailure: function () {\n e.setLastError($ASTX2_CONST.ERROR_FAILED);\n c();\n }\n });\n },\n _e2edata: function (a, b, c) {\n var d = this;\n $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_CERT),\n onSuccess: function (e) {\n var f = $_astxu.jsonParse(e);\n e = $_astxu.getnc(f ? f.result : '');\n 0 == $_astxu.isACK(e)\n ? (d.setLastError($ASTX2_CONST.ERROR_NCK), c())\n : d.set_cert(\n function () {\n d._e2edata_get(a, b, c, f);\n },\n function () {\n d.setLastError($ASTX2_CONST.ERROR_NOCONNECT);\n c();\n },\n f\n );\n },\n onFailure: function (a) {\n d.setLastError($ASTX2_CONST.ERROR_FAILED);\n c();\n }\n });\n },\n getE2EData: function (a, b, c) {\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n if (0 == this._e2e_enable()) c();\n else {\n var d = [],\n e = [],\n f = [],\n g = [];\n this.mE2EInst.getE2EelmsForm(a, d, e, 1);\n this.mE2EInst.getE2EelmsForm(a, f, g, 2);\n a = { ids1: d.join(','), names1: e.join(','), ids2: f.join(','), names2: g.join(',') };\n this._e2edata(a, b, c);\n }\n },\n getE2EDataRetry: function (a, b, c, d, e) {\n null == d && (d = 3);\n null == e && (e = 1e3);\n if (0 >= d) this.setLastError($ASTX2_CONST.ERROR_EXCESS), c();\n else {\n var f = this;\n this.getE2EData(\n a,\n function (a) {\n b(a);\n },\n function () {\n f.getLastError() == $ASTX2_CONST.ERROR_NOINIT\n ? window.setTimeout(function () {\n f.getE2EDataRetry(a, b, c, d - 1, e);\n }, e)\n : c();\n }\n );\n }\n },\n getE2EDataIDs: function (a, b, c) {\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n if (0 == this._e2e_enable()) c();\n else {\n null == a && (that.setLastError($ASTX2_CONST.ERROR_PARAM), c());\n var d = [],\n e = [],\n f = [],\n g = [];\n this.mE2EInst.getE2EelmsID(a, d, e, 1);\n this.mE2EInst.getE2EelmsID(a, f, g, 2);\n a = { ids1: d.join(','), names1: e.join(','), ids2: f.join(','), names2: g.join(',') };\n this._e2edata(a, b, c);\n }\n },\n setE2EData: function (a, b, c, d) {\n null == c && (c = !0);\n null == d && (d = '');\n var e = $_astxu.getnc(b.e2e_data1);\n 0 < e.length && ($_astxu.getCreatedFormValue(a, 'e2e_data1').value = e);\n b = $_astxu.getnc(b.e2e_data2);\n 0 < b.length && ($_astxu.getCreatedFormValue(a, 'e2e_data2').value = b);\n 1 == c && this.mE2EInst.resetE2Evalues($_astxu.getnc(a.name), d);\n },\n getE2EPageID: function () {\n return $ASTX2_CONST.PAGEID;\n },\n getE2EInputID: function (a) {\n a = this.mE2EInst.getE2Eattribute(a);\n return null == a ? null : a.e2e_inputid;\n },\n getE2EHash: function (a, b) {\n this.mE2EInst.getE2EHash(a, function (a, d) {\n b(a, d);\n });\n },\n getEncText: function (a, b, c) {\n this.mE2EInst.getEncText(a, b, function (a, b, f) {\n c(b, f);\n });\n },\n getE2EText: function (a, b) {\n this.mE2EInst.getE2EText(a, function (a, d, e) {\n b(d, e);\n });\n },\n getE2ETextS: function (a, b) {\n for (var c = 0, d = 0, e = [], f = 0; f < a.length; f++) {\n var g = a[f];\n null != g && ((g = g.getAttribute('e2e_type')), null != g && g == $ASTX2_CONST.E2ETYPE_PLAIN2 && c++);\n }\n if (0 == c || c != a.length) b(e, $ASTX2_CONST.ERROR_PARAM);\n else\n for (f = 0; f < a.length; f++)\n this.mE2EInst.getE2EText(a[f], function (a, f, g) {\n d >= c || (0 == g ? (e[a] = f) : (d = c), ++d >= c && b(e, g));\n });\n },\n setE2EText: function (a, b) {\n this.mE2EInst.setE2EText(a, b);\n },\n clearE2EText: function (a, b) {\n this.mE2EInst.clearE2EText(a, b);\n },\n clearE2EForm: function (a) {\n for (var b = document.getElementsByTagName('input'), c = 0; c < b.length; c++) {\n var d = b[c];\n null != d &&\n d.form.name == a &&\n 0 != ('text' == d.type || 'password' == d.type) &&\n null != d.getAttribute('e2e_type') &&\n this.mE2EInst.clearE2EText(d);\n }\n },\n addE2EObject: function (a, b) {\n null == b && (b = $ASTX2_CONST.E2ETYPE_CERT1);\n !a || ('text' != a.type && 'password' != a.type) || (a.setAttribute('e2e_type', b), this.mE2EInst.addObject(a));\n },\n subE2EObject: function (a) {\n a && this.mE2EInst.subObject(a);\n },\n setE2EAllExceptInputs: function () {\n for (var a = document.getElementsByTagName('input'), b = 0; b < a.length; b++) {\n var c = a[b];\n null != c &&\n 0 != ('text' == c.type || 'password' == c.type) &&\n null == c.getAttribute('e2e_type') &&\n c.setAttribute('e2e_type', $ASTX2_CONST.E2ETYPE_NONE);\n }\n },\n killFocusE2EAllInputs: function () {\n for (var a = document.getElementsByTagName('input'), b = 0; b < a.length; b++) {\n var c = a[b];\n null != c && 0 != ('text' == c.type || 'password' == c.type) && 0 < c.getAttribute('e2e_type') && c.blur();\n }\n },\n _pclogdata_get: function (a, b, c, d) {\n var e = this;\n c = {\n ver: $_astxu.getint(c.ver),\n alg: $_astxu.getint(c.alg),\n svr: $_astxu.getnc(c.svr),\n norsa: $_astxu.getint(c.norsa),\n uniq: $_astxu.getnc(c.uniq),\n utime: $_astxu.getint(c.utime),\n nlog: $_astxu.getnc(c.nlog),\n ipaddr: $_astxu.getnc(c.ipaddr),\n s2c_alg: $_astxu.getnc(c.s2c_alg),\n s2c_key: $_astxu.getnc(c.s2c_key),\n s2c_salt: $_astxu.getnc(c.s2c_salt),\n browser: $ASTX2_CONST.BROWSER_VER,\n pageid: $ASTX2_CONST.PAGEID,\n opt: d\n };\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/get_pclog',\n data: c,\n timeout: 1e4,\n onSuccess: function (c) {\n var d = $_astxu.getnc(c ? c.result : '');\n $_astxu.isACK(d) ? a(c) : (e.setLastError($ASTX2_CONST.ERROR_NCK), b());\n },\n onFailure: function () {\n e.setLastError($ASTX2_CONST.ERROR_FAILED);\n b();\n }\n });\n },\n _pclogdata: function (a, b, c) {\n var d = this;\n $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_CERT),\n data: { pclog: 1, client_public_key: $ASTX2_COMM.mClientPublicKey },\n onSuccess: function (e) {\n var f = $_astxu.jsonParse(e);\n e = $_astxu.getnc(f ? f.result : '');\n 0 == $_astxu.isACK(e)\n ? (d.setLastError($ASTX2_CONST.ERROR_NCK), b())\n : d.set_cert(\n function () {\n d._pclogdata_get(a, b, f, c);\n },\n function () {\n d.setLastError($ASTX2_CONST.ERROR_NOCONNECT);\n b();\n },\n f\n );\n },\n onFailure: function (a) {\n d.setLastError($ASTX2_CONST.ERROR_FAILED);\n b();\n }\n });\n },\n getPCLOGData: function (a, b, c, d) {\n null == d && (d = '');\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n 0 == $ASTX2_COMM.isEnable() ? (this.setLastError($ASTX2_CONST.ERROR_NOINIT), c()) : this._pclogdata(b, c, d);\n },\n getPCLOGDataRetry: function (a, b, c, d, e) {\n null == d && (d = 3);\n null == e && (e = 1e3);\n if (0 >= d) this.setLastError($ASTX2_CONST.ERROR_EXCESS), c();\n else {\n var f = this;\n this.getPCLOGData(\n a,\n function (a) {\n b(a);\n },\n function () {\n f.getLastError() == $ASTX2_CONST.ERROR_NOINIT\n ? window.setTimeout(function () {\n f.getPCLOGDataRetry(a, b, c, d - 1, e);\n }, e)\n : c();\n }\n );\n }\n },\n setPCLOGData: function (a, b) {\n var c = $_astxu.getnc(b.pclog_data);\n 0 < c.length && ($_astxu.getCreatedFormValue(a, 'pclog_data').value = c);\n },\n isVmEnv: function (a, b) {\n 0 == $ASTX2_COMM.isEnable()\n ? a(null, $ASTX2_CONST.ERROR_NOINIT)\n : (null == b && (b = ''),\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/is_vm_env',\n data: { opts: b },\n onSuccess: function (b) {\n var d = $_astxu.getnc(b ? b.result : '');\n $_astxu.isACK(d) ? a(b.vm_env, $ASTX2_CONST.ERROR_SUCCESS) : a(null, $ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n a(null, $ASTX2_CONST.ERROR_FAILED);\n }\n }));\n },\n isRemoteEnv: function (a, b) {\n 0 == $ASTX2_COMM.isEnable()\n ? a(null, $ASTX2_CONST.ERROR_NOINIT)\n : (null == b && (b = ''),\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/is_remote_env',\n data: { opts: b },\n onSuccess: function (b) {\n var d = $_astxu.getnc(b ? b.result : '');\n $_astxu.isACK(d) ? a(b.remote_env, $ASTX2_CONST.ERROR_SUCCESS) : a(null, $ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n a(null, $ASTX2_CONST.ERROR_FAILED);\n }\n }));\n },\n isVmRemoteEnv: function (a, b) {\n 0 == $ASTX2_COMM.isEnable()\n ? a(null, $ASTX2_CONST.ERROR_NOINIT)\n : (null == b && (b = ''),\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/is_vm_remote_env',\n data: { opts: b },\n onSuccess: function (b) {\n var d = $_astxu.getnc(b ? b.result : '');\n $_astxu.isACK(d) ? a(b.vm_remote_env, $ASTX2_CONST.ERROR_SUCCESS) : a(null, $ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n a(null, $ASTX2_CONST.ERROR_FAILED);\n }\n }));\n },\n checkService: function (a, b) {\n a == $ASTX2_CONST.SERVICE_AK && this.mE2EInst.checkService(b);\n },\n setProtect: function (a, b) {\n if (0 == $ASTX2_COMM.isEnable()) b && b($ASTX2_CONST.ERROR_NOINIT);\n else {\n var c = {\n customerid: $_astxu.getnc($ASTX2_CUST.mCustomerID),\n ak: a & $ASTX2_CONST.PROTECT_AK ? 1 : -1,\n fw: a & $ASTX2_CONST.PROTECT_FW ? 1 : -1,\n pb: a & $ASTX2_CONST.PROTECT_PB ? 1 : -1,\n pcs: a & $ASTX2_CONST.PROTECT_PCS ? 1 : -1\n };\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/set_protect',\n data: c,\n onSuccess: function (a) {\n a = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(a) ? b && b($ASTX2_CONST.ERROR_SUCCESS) : b && b($ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n b && b($ASTX2_CONST.ERROR_FAILED);\n }\n });\n }\n },\n isNotSupportOS: function (a, b) {\n 0 == $ASTX2_COMM.isEnable()\n ? b && b(null, $ASTX2_CONST.ERROR_NOINIT)\n : $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/is_not_support_os',\n data: {\n ak: a & $ASTX2_CONST.PROTECT_AK ? 1 : 0,\n fw: a & $ASTX2_CONST.PROTECT_FW ? 1 : 0,\n pb: a & $ASTX2_CONST.PROTECT_PB ? 1 : 0,\n pcs: a & $ASTX2_CONST.PROTECT_PCS ? 1 : 0\n },\n onSuccess: function (a) {\n var d = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(d) ? b && b(a, $ASTX2_CONST.ERROR_SUCCESS) : b && b(null, $ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n b && b(null, $ASTX2_CONST.ERROR_FAILED);\n }\n });\n },\n isAccessible: function (a, b, c, d, e) {\n null == e && (e = 750);\n if (a == $ASTX2_CONST.REQUEST_JSONP)\n $_astxu.sendJsonp({\n url: b,\n nocallback: !0,\n timeout: e,\n onSuccess: function () {\n c && c(b);\n },\n onFailure: function () {\n d && d(b);\n }\n });\n else {\n if (\n 0 != b.indexOf(window.location.protocol + '//' + window.location.host) &&\n 'IE' == $ASTX2_CONST.BROWSER_TYPE\n ) {\n if ('IE10' != $ASTX2_CONST.BROWSER_VER && 'IE11' != $ASTX2_CONST.BROWSER_VER) {\n d && d(b, 'CORS, not allowed browser');\n return;\n }\n if (0 != b.indexOf('http:') && 0 != b.indexOf('https:')) {\n d && d(b, 'CORS, not allowed protocol');\n return;\n }\n }\n $_astxu.sendAjax({\n url: b,\n type: 'GET',\n timeout: e,\n onSuccess: function (a) {\n c && c(b);\n },\n onFailure: function (a) {\n d && d(b, a);\n }\n });\n }\n },\n uninit: function () {\n this.uninitE2E();\n $ASTX2_COMM.uninit();\n },\n setLastError: function (a) {\n this.mLastError = a;\n },\n getLastError: function () {\n return this.mLastError;\n }\n };\n$ASTX2_MLi = {\n init: function () {\n setTimeout(function () {\n var a = { pageid: $ASTX2_CONST.PAGEID, focus: $_astxu.hasFocused() ? 1 : 0 };\n $_astxu.sendJsonp({ url: $ASTX2_COMM.mLocalServerURL + '/initForML', timeout: 1e3, data: a });\n }, 200);\n }\n};\n\nwindow.$ASTX2 = {\n ...$ASTX2,\n $ASTX2_COMM,\n $_astxu,\n $ASTX2_E2E,\n $ASTX2_MLi\n};\n\n/* ASTx 1.3 | (C) Copyright AhnLab, Inc. | $Revision: 30833 $ */\nconst getSubdomain = (hostname) => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nconst getEnvironmentFromHostname = (hostname) => {\n const debugModeEnv = getAstx2CookieFromDsp('dsp-debug-mode-env')?.toLowerCase();\n if (debugModeEnv) {\n return debugModeEnv;\n }\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost:')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\nconst getServicePath = () => {\n if (typeof window.isStorybookEnv === 'boolean') {\n return '';\n } else {\n return `/${location.pathname.split('/')[1]}`;\n }\n};\n\nconst getApiHostNameFromEnvironment = (currentHostname) => {\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com`;\n\n case 'local':\n return `${getServicePath()}`;\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n","/* ASTx 1.3 | (C) Copyright AhnLab, Inc. | $Revision: 30833 $ */\r\n/* eslint-disable */\r\n\r\nlet $ASTX2_CUST = {\r\n // Customer option\r\n /*\r\n\tmUseJQuery: false, \t// Whether to use JQuery.\t\r\n\tmUseAjaxHello: false,\r\n\tmUseAutoStart: false, \r\n\tE2EFORM_TAIL: true,\r\n\tE2EFORM_INIT: '_e2e_forminit',\r\n\tE2EFORM_TAG1: '_e2e_1__',\r\n\tE2EFORM_TAG2: '_e2e_2__',\r\n\tE2EFORM_TAG1_PWD: '_e2e_1_pwd__',\r\n\tE2EFORM_TAG2_PWD: '_e2e_2_pwd__',\r\n\t*/\r\n\r\n mCustomerID: null, // Customer ID for setProtect.\r\n\r\n // ASTX2_CUST defined values\r\n URL_GET_INIT: 101,\r\n URL_GET_CERT: 102,\r\n URL_GET_STAMP: 103,\r\n URL_CHK_STAMP: 104,\r\n\r\n setCustomerID(customerID) {\r\n if (customerID !== null && customerID !== 'undefined') {\r\n this.mCustomerID = customerID;\r\n }\r\n },\r\n\r\n getURL(type) {\r\n let result = '';\r\n const timestamp = new Date().getTime();\r\n const hostname = location.hostname;\r\n switch (type) {\r\n case this.URL_GET_INIT:\r\n result = `${getApiHostNameFromEnvironment(hostname)}/api/dea/sltn/astx2/init/get`;\r\n break;\r\n case this.URL_GET_CERT:\r\n result = `${getApiHostNameFromEnvironment(hostname)}/api/dea/sltn/astx2/cert/get?v=${timestamp}`; // WAF 차단 방지 (post 요청 시 값이 없는 경우 차단)\r\n break;\r\n case this.URL_GET_STAMP:\r\n result = `${getApiHostNameFromEnvironment(hostname)}/api/dea/sltn/astx2/stamp/get`;\r\n break;\r\n case this.URL_CHK_STAMP:\r\n result = `${getApiHostNameFromEnvironment(hostname)}/api/dea/sltn/astx2/stamp-chk/post`;\r\n break;\r\n } // end of switch\r\n\r\n return result;\r\n },\r\n\r\n isE2EObject(obj) {\r\n return false;\r\n },\r\n\r\n getE2Etype(obj) {\r\n return null;\r\n },\r\n\r\n onCreatedFormValue(obj, obj_name) {},\r\n\r\n onHandlerPreFocus(obj, event) {},\r\n\r\n onHandlerKeyDown(obj, event) {\r\n return true;\r\n },\r\n\r\n getErrorMessage(errno) {\r\n let message = '[ASTx] ';\r\n\r\n switch (errno) {\r\n case $ASTX2_CONST.ERROR_FAILED:\r\n message += '내부 오류가 발생하였습니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NOINIT:\r\n message += '초기화가 필요합니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NOTINST:\r\n message += '설치되어 있지 않습니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NOTSUPPORTED:\r\n message += '지원하지 않는 OS입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NOCONNECT:\r\n message += '서버(Web) 통신 실패입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NCK:\r\n message += '서버(Local) 응답 실패입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_ERR:\r\n message += '서버(Local) 내부 오류입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NSP:\r\n message += '지원하지 되지 않는 환경입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_PARAM:\r\n message += '잘못된 인자입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_EXCESS:\r\n message += '재시도 회수를 초과 하였습니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NEEDUPDATE:\r\n message += '제품 업데이트가 필요합니다.';\r\n break;\r\n default:\r\n message += `errno=${errno}`;\r\n break;\r\n } // end of switch\r\n\r\n return message;\r\n },\r\n\r\n errorAbort(errno) {\r\n alert(this.getErrorMessage(errno));\r\n }\r\n};\r\n","type ASTXWindow = Window & {\n $ASTX2: any;\n};\n\ndeclare const window: ASTXWindow;\n\nimport astx2ScriptContent from './astx2/astx2.min.js';\nimport astx2ScriptCustomContent from './astx2/astx2_custom.js';\n\n/**\n * element를 동적으로 추가하는 경우 사용.\n * @param el HTMLElement\n * @param e2e_type string\n */\nexport function addE2EObject(el: HTMLElement, e2e_type?: string) {\n if (window.$ASTX2) {\n window.$ASTX2.addE2EObject(el, e2e_type);\n window.$ASTX2.resetE2E();\n }\n}\n\nexport function hasAstx2() {\n return !!window.$ASTX2;\n}\n\ninterface Astx2Init {\n initSuccess?: () => void;\n initFailure?: () => void;\n checkServerSuccess?: () => void;\n checkServerFailure?: () => void;\n}\n\nexport const loadScript = (callback?: () => void) => {\n if (!window.$ASTX2) {\n console.log('dynamic load');\n const script = document.createElement('script');\n script.innerHTML = `\n ${astx2ScriptContent} \n ${astx2ScriptCustomContent}\n `;\n\n document.head.appendChild(script);\n\n script.onload = () => {\n callback && callback();\n };\n }\n};\n\nconst init = ({\n initSuccess = () => {\n /* empty */\n },\n initFailure = () => {\n /* empty */\n },\n checkServerSuccess = () => {\n /* empty */\n },\n checkServerFailure = () => {\n /* empty */\n }\n}: Astx2Init = {}) => {\n window.$ASTX2.init(\n () => {\n window.$ASTX2.initE2E();\n window.$ASTX2.checkServer(\n () => {\n checkServerSuccess();\n },\n () => {\n checkServerFailure();\n console.error(`ASTX.checkServer() onFailure: errno=${window.$ASTX2.getLastError()}`);\n }\n );\n initSuccess();\n },\n () => {\n initFailure();\n if (window.$ASTX2.getLastError() === 103) {\n console.error('AhnLab Safe Transaction 클라이언트가 설치되지 않았습니다.');\n } else {\n console.error(`$ASTX2.init() onFailure: errno=${window.$ASTX2.getLastError()}`);\n }\n }\n );\n};\n\n/**\n * @description 페이지진입후 최초 실행\n */\nexport const initASTX2 = ({\n initSuccess = () => {\n /* empty */\n },\n initFailure = () => {\n /* empty */\n },\n checkServerSuccess = () => {\n /* empty */\n },\n checkServerFailure = () => {\n /* empty */\n }\n}: Astx2Init = {}) => {\n if (window.$ASTX2) {\n init({\n initSuccess,\n initFailure,\n checkServerSuccess,\n checkServerFailure\n });\n }\n};\n\n/**\n * form객체로 감싸진 html input이 아닌 개별 input을 컨트롤\n * id기반으로 데이터접근\n * @param ids string[]\n * @param onSuccess\n * @param onFailure\n */\nexport function getE2EDataIDs(ids: string[], onSuccess: (astx_data: any) => void, onFailure: () => void = () => {}) {\n if (window.$ASTX2) {\n window.$ASTX2.getE2EDataIDs(\n ids,\n async (astx_data: any) => {\n /**\n * 성공시 데이터 세팅\n */\n onSuccess(astx_data);\n },\n () => {\n onFailure();\n console.log(`ASTX.getE2EData() onFailure: errno=${window.$ASTX2.getLastError()}`);\n }\n );\n }\n}\n","import dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (\n date1: string | number | dayjs.Dayjs | Date,\n date2: string | number | dayjs.Dayjs | Date\n): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(\n targetDate: string | number | dayjs.Dayjs | Date,\n compareDate: string | number | dayjs.Dayjs | Date\n) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\nexport type PeriodType =\n | 'thisWeek'\n | 'lastWeek'\n | 'last7Days'\n | 'thisMonth'\n | 'lastMonth'\n | 'last365Days'\n | 'week'\n | 'month'\n | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType\n * @returns\n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return { startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() };\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return {\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n };\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return { startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() };\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return {\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n };\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return {\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n };\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return { startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() };\n default:\n return null;\n }\n};\n","import React from 'react';\n\nexport const charFilterEng = (value: string) => value.replace(/[^a-zA-Z]/g, '');\nexport const charFilterKor = (value: string) => value.replace(/[^\\uAC00-\\uD7AF]/g, '');\n\n/**\n * 영문+한글포함 N글자 이상 입력시 트리거 발생\n */\nexport function isOverCharCount(value: string, count: number) {\n // value에서 한글만 추출\n const hangulLength = charFilterKor(value).length;\n\n // value에서 영문만 추출\n const englishLength = charFilterEng(value).length;\n\n //영문 한글 조합일때, count 이상 일경우, 트리거 발생\n if (hangulLength + englishLength >= count) {\n return true;\n }\n\n return false;\n}\n\n/**\n * 배열 keys에 포함된 key를 입력시 true 리턴\n * @param event React.KeyboardEvent<HTMLInputElement>\n * @param keys React.KeyboardEvent<HTMLInputElement>['key'][]\n * @returns boolean\n */\nexport function checkKeys(event: React.KeyboardEvent<HTMLInputElement>, keys: React.KeyboardEvent<HTMLInputElement>['key'][]) {\n if (keys.includes(event.key)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Enter 키 입력시 트리거 발생\n * 일반 엔터키 + numberpad 엔터키\n */\nexport function isEnter(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Enter']) || event.code === 'NumpadEnter') {\n return true;\n }\n\n return false;\n}\n\n\n/**\n * Backspace 키 입력시 트리거 발생\n */\nexport function isBackspace(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Backspace'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowUp 키 입력시 트리거 발생\n */\nexport function isArrowUp(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowUp'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowDown 키 입력시 트리거 발생\n */\nexport function isArrowDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowDown'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowLeft 키 입력시 트리거 발생\n */\nexport function isArrowLeft(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowLeft'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowRight 키 입력시 트리거 발생\n */\nexport function isArrowRight(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowRight'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Tab 키 입력시 트리거 발생\n */\nexport function isTab(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Tab'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Escape 키 입력시 트리거 발생\n */\nexport function isEscape(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Escape'])) {\n return true;\n }\n\n return false;\n}\n\n\n/**\n * 한글 N글자 이상 입력시 트리거 발생\n */\nexport function isOverKorCharCount(value: string, count: number) {\n //value에서 한글만 추출\n const hangulLength = charFilterKor(value).length;\n\n //한글 count 초과 일경우, 트리거 발생\n if (hangulLength > count) {\n return true;\n }\n\n return false;\n}\n\n\n\n/**\n * 영문 N글자 이상 입력시 트리거 발생\n */\nexport function isOverEngCharCount(value: string, count: number) {\n\n //value에서 영문만 추출\n const englishLength = charFilterEng(value).length;\n\n //영문 count 초과 일경우, 트리거 발생\n if (englishLength > count) {\n return true;\n }\n\n return false;\n}\n","import { GenderCode } from \"../types/common.types\";\n\nexport const GENDER_LABEL_MAP = {\n '1': '남성',\n '2': '여성',\n '3': '남성',\n '4': '여성',\n '5': '남성',\n '6': '여성',\n '7': '남성',\n '8': '여성'\n} as const;\n\nexport const getGenderName = (genderCode?: GenderCode) => {\n return genderCode ? GENDER_LABEL_MAP[genderCode] : '';\n};\n","(function (w, d, s, l, i) {\n w[l] = w[l] || [];\n w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });\n let f = d.getElementsByTagName(s)[0],\n j = d.createElement(s),\n dl = l !== 'dataLayer' ? `&l=${l}` : '';\n j.async = true;\n j.src = `https://www.googletagmanager.com/gtm.js?id=${i}${dl}`;\n f.parentNode.insertBefore(j, f);\n})(window, document, 'script', 'dataLayer', 'GTM-PPT3LJ56');\n","import { isClient } from '../environment-utils.js';\n\nimport gaScript from './ga.js';\n\nexport const loadGaScript = () => {\n if (isClient()) {\n //이미 로드된 경우 return\n if (document.querySelector('script[src*=\"googletagmanager.com/gtm.js\"]')) {\n return;\n }\n console.log('ga script load dynamic');\n const script = document.createElement('script');\n script.innerHTML = `\n ${gaScript}\n `;\n document.head.appendChild(script);\n\n }\n}"]}
1
+ {"version":3,"sources":["../src/utils/timing-utils.ts","../src/utils/cookie-utils.ts","../src/utils/environment-utils.ts","../src/utils/user-agent-utils.ts","../src/utils/event-handler-utils.ts","../src/utils/canvas-utils.ts","../src/utils/file-utils.ts","../src/utils/astx2/astx2.min.js","../src/utils/astx2/astx2_custom.js","../src/utils/astx2-utils.ts","../src/utils/date-utils.ts","../src/utils/key-trigger-utils.ts","../src/utils/gender.ts","../src/utils/download-utils.ts","../src/utils/ga/ga.js","../src/utils/ga/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 쓰로틀\n * @param func\n * @param delay\n * @returns\n */\nexport function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n\n if (now - lastCall >= delay) {\n // 마지막 호출로부터 delay 시간이 지났으면 즉시 실행\n lastCall = now;\n func(...args);\n } else if (!timeout) {\n // 대기 중인 타이머가 없으면 새로운 타이머 설정\n timeout = setTimeout(\n () => {\n lastCall = Date.now();\n func(...args);\n timeout = null;\n },\n delay - (now - lastCall)\n );\n }\n };\n}\n\n/**\n * 디바운스\n * @param func\n * @param delay\n * @returns\n */\nexport function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n timeout = null;\n }, delay);\n };\n}\n","import { isClient } from \"./environment-utils\";\n\nexport const getCookie = (name: string): string => {\n if (!isClient()) {\n return '';\n }\n if (typeof document === 'undefined') {\n return '';\n }\n const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));\n\n return match ? decodeURIComponent(match[2] || '') : '';\n};\n\nexport const setCookie = (\n name: string,\n value: string,\n options: {\n expires?: number | Date; // number of days\n path?: string;\n domain?: string;\n secure?: boolean;\n } = {}\n): void => {\n if (!isClient()) {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options.expires) {\n let expiresDate: Date;\n if (typeof options.expires === 'number') {\n expiresDate = new Date();\n expiresDate.setDate(expiresDate.getDate() + options.expires);\n } else {\n expiresDate = options.expires;\n }\n cookieString += `; expires=${expiresDate.toUTCString()}`;\n }\n\n cookieString += `; path=${options.path || '/'}`;\n\n if (options.domain) {\n cookieString += `; domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookieString += '; secure';\n }\n\n document.cookie = cookieString;\n};\n\nexport const deleteCookie = (name: string, options: { path?: string; domain?: string } = {}): void => {\n if (!isClient()) {\n return;\n }\n setCookie(name, '', { ...options, expires: -1 });\n};\n","import { getCookie } from './cookie-utils';\n\n/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n if (isClient()) {\n const debugModeEnv = getCookie('dsp-debug-mode-env')?.toLowerCase();\n if (debugModeEnv) {\n return debugModeEnv as 'local' | 'dev' | 'stg' | 'prd';\n }\n }\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n\n/**\n * 현재 업무구분 코드 구하기\n * 원칙: pathname의 첫 번째가 업무구분코드를 사용할 경우 해당 값을 반환\n * @returns\n */\nexport const getBusinessWorkDivisionCode = (pathname?: string) => {\n if (pathname) {\n return pathname.split('/')[1] ?? '';\n }\n\n return location.pathname.split('/')[1] ?? '';\n};\n\n/**\n * @description storybook에서 동작을 고려하여 수정한 버전\n * @returns\n */\nexport const getServicePath = () => {\n if (typeof window.isStorybookEnv === 'boolean') {\n return '';\n } else {\n return `/${getBusinessWorkDivisionCode()}`;\n }\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\n\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://dev-dsp-static.hanwhalife.com`;\n\n case 'local':\n case 'stg':\n return `https://stg-dsp-static.hanwhalife.com`;\n\n case 'prd':\n return `https://dsp-static.hanwhalife.com'`;\n\n default:\n console.warn('DSP environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 비정형PI 호스트명을 반환합니다.\n * @param serviceCode dea,dis,dcm\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDudApiBasePathFromEnvironment = (hostname: string, servicePath: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${servicePath}/api/dud`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://dsp-dud-dev.hanwhalife.com:10101/api`;\n\n case 'stg':\n return `https://dsp-dud-stg.hanwhalife.com:10102/api`;\n\n case 'prd':\n return `https://dsp-dud.hanwhalife.com/api`;\n\n default:\n console.warn('DUD API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 Dsp 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param serviceCodeTo dea,dis 같은 api서버명\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getDspApiBasePathFromEnvironment = (serviceCodeTo: string, hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n /**\n * local에서 호출시, rewrite동작을 위해 상대주소를 호출합니다.\n * (cors이슈 해결을 위해 필수)\n */\n case 'local':\n return `${getServicePath()}/api/${serviceCodeTo}`;\n /**\n * local 이 아닌 환경에서는 전체주소를 호출합니다.\n */\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com/api/${serviceCodeTo}`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com/api/${serviceCodeTo}`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n\n/**\n * @description\n * 환경에 맞는 NLC 호스트명을 반환합니다.\n * client side에서 사용하는 함수입니다.\n * @param hostname window.location.hostname\n * @returns\n */\nexport const getNlcHostFromEnvironment = (hostname?: string) => {\n if (!isClient()) {\n return '';\n }\n\n const environment = getEnvironmentFromHostname(hostname || location.hostname);\n\n switch (environment) {\n case 'local':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'dev':\n return `https://nxl-nlc-dev.hanwhalife.com`;\n\n case 'stg':\n return `https://nxl-nlc-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-nlc.hanwhalife.com`;\n\n default:\n console.warn('NLC environment is not defined');\n\n return '';\n }\n};\n","import { ExecutionEnvironment, OSName, BrowserName } from '../types/common.types';\n\nimport { isClient } from './environment-utils';\n/**\n * 한화생명 영업지원 웹 실행 환경 탐지\n * @returns\n */\nexport const getDspExecutionEnvironment = (): ExecutionEnvironment => {\n if (!isClient()) {\n return 'unknown';\n }\n\n if (window.n2Bridge) {\n return 'android-webview';\n }\n\n if (window.webkit?.messageHandlers?.n2Bridge) {\n return 'ios-webview';\n }\n\n if (window.self !== window.top) {\n return 'iframe';\n }\n\n return 'web';\n};\n\n/**\n * 한화생명 영업 앱 환경 여부 판단(DSP 앱 또는 FP 플래너 앱)\n * 운영 중인 프로덕션 앱에서 실행 중인지 확인\n * @returns\n */\nexport const isProductionApp = () => {\n if (!isClient()) {\n return false;\n }\n\n return isDspApp() || isFpPlannerApp();\n};\n\n/**\n * UserAgent에 SspApp 이 있는지 검사\n * 있으면, DSP 앱\n * @param userAgent\n * @returns\n */\nexport const checkUserAgentDspApp = (userAgent: string) => {\n return userAgent.toLowerCase().includes('sspapp');\n};\n\n/**\n * 한화생명 영업지원 웹뷰 환경 여부 판단\n * @returns 웹뷰(Android/iOS) 환경이면 true, 아니면 false\n */\nexport const isDspApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) && (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * FP 플래너 웹뷰 환경 여부 판단\n * @returns\n */\nexport const isFpPlannerApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) === false &&\n (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * 영업 포털 환경 여부 판단\n * @returns\n */\nexport const isSalesPortal = () => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return environment === 'iframe';\n};\n\n/**\n * 태블릿 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isTablet = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 태블릿\n ua.includes('ipad') ||\n // Android 태블릿 (Mobile 키워드 없음)\n (ua.includes('android') && !ua.includes('mobile')) ||\n // 명시적 태블릿 키워드\n ua.includes('tablet') ||\n // Amazon 태블릿\n ua.includes('kindle') ||\n ua.includes('silk') ||\n /kf[a-z]{2}wi|kftt/.test(ua) ||\n // BlackBerry 태블릿\n ua.includes('playbook') ||\n // 삼성 갤럭시 탭 (개선된 정규식)\n /gt-p\\d{4}|sm-[tp]\\d{3}/.test(ua) ||\n // 구글 넥서스/픽셀 태블릿\n /nexus (?:[789]|10)|pixel [cs]|pixel slate/.test(ua) ||\n // 기타 브랜드 태블릿\n /xoom|transformer|mediapad|mipad|tab\\s/.test(ua) ||\n // Windows 태블릿 (개선된 조건)\n (ua.includes('windows') && (ua.includes('touch') || ua.includes('tablet'))) ||\n ua.includes('surface')\n );\n};\n\n/**\n * 스마트폰 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPhone = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 모바일\n ua.includes('iphone') ||\n ua.includes('ipod') ||\n // Android 스마트폰 (Mobile 키워드 있음)\n (ua.includes('android') && ua.includes('mobile')) ||\n // BlackBerry\n ua.includes('blackberry') ||\n ua.includes('bb10') ||\n // Windows Mobile\n ua.includes('windows phone') ||\n ua.includes('windows mobile') ||\n ua.includes('iemobile') ||\n // Opera Mobile\n ua.includes('opera mini') ||\n ua.includes('opera mobi') ||\n // 기타 모바일 브라우저\n (ua.includes('mobile') &&\n (ua.includes('firefox') || ua.includes('chrome') || ua.includes('safari') || ua.includes('edge'))) ||\n // 모바일 키워드 (태블릿 제외)\n (ua.includes('mobile') && !ua.includes('tablet')) ||\n // 삼성 갤럭시 폰 (개선)\n /sm-[a-z]\\d{3}[a-z]?|gt-[a-z]\\d{4}/.test(ua) ||\n // LG, HTC 폰\n /lg-[a-z]\\d{3,4}|htc[_\\s]/.test(ua) ||\n // 화웨이/샤오미 등 (개선)\n /huawei|honor|redmi|mi[\\s\\d]|oneplus|oppo|vivo/.test(ua)\n );\n};\n\n/**\n * 데스크톱 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPc = (userAgent: string) => {\n const ua = userAgent.toLowerCase();\n\n return !isPhone(ua) && !isTablet(ua);\n};\n\n/**\n * UserAgent에서 기기 타입 구분\n * @param userAgent\n * @returns\n */\nexport const getFormFactorFromUserAgent = (userAgent: string) => {\n if (!userAgent) {\n return 'pc';\n }\n\n const ua = userAgent.toLowerCase();\n\n if (isTablet(ua)) {\n return 'tablet';\n }\n\n if (isPhone(ua)) {\n return 'phone';\n }\n\n return 'pc';\n};\n\n/**\n * UserAgent에서 운영체제 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 운영체제 이름\n */\nexport const getOSName = (userAgent: string): OSName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 체크 (iPhone, iPad, iPod)\n if (/iphone|ipad|ipod/.test(ua)) {\n return 'ios';\n }\n\n // Android 체크\n if (ua.includes('android')) {\n return 'android';\n }\n\n // Windows 체크\n if (ua.includes('windows') || ua.includes('win32') || ua.includes('win64')) {\n return 'windows';\n }\n\n // macOS 체크 (Mac OS X, macOS)\n if (ua.includes('mac os x') || ua.includes('macos') || ua.includes('macintosh')) {\n return 'mac';\n }\n\n // Linux 체크 (Android 제외)\n if (ua.includes('linux') && !ua.includes('android')) {\n return 'linux';\n }\n\n return 'unknown';\n};\n\n/**\n * 현재 브라우저의 운영체제 이름을 가져오기\n * @returns 현재 환경의 운영체제 이름\n */\nexport const getCurrentOSName = (): OSName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSName(navigator.userAgent);\n};\n\n/**\n * UserAgent에서 OS 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns OS 버전 문자열\n */\nexport const getOSVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 버전 (iPhone OS 15_0, iPad OS 15_0)\n const iosMatch = ua.match(/os (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (iosMatch && iosMatch.length >= 3) {\n const major = iosMatch[1];\n const minor = iosMatch[2];\n const patch = iosMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n // Android 버전\n const androidMatch = ua.match(/android (\\d+(?:\\.\\d+)*)/);\n if (androidMatch && androidMatch[1]) {\n return androidMatch[1];\n }\n\n // Windows 버전\n const windowsMatch = ua.match(/windows nt (\\d+\\.\\d+)/);\n if (windowsMatch && windowsMatch[1]) {\n const version = windowsMatch[1];\n // Windows NT 버전을 실제 Windows 버전으로 매핑\n const windowsVersionMap: Record<string, string> = {\n '10.0': '10/11',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': '7',\n '6.0': 'Vista',\n '5.1': 'XP'\n };\n\n return windowsVersionMap[version] || version;\n }\n\n // macOS 버전\n const macMatch = ua.match(/mac os x (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (macMatch && macMatch.length >= 3) {\n const major = macMatch[1];\n const minor = macMatch[2];\n const patch = macMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 이름\n */\nexport const getBrowserName = (userAgent: string): BrowserName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium 기반) - Chrome보다 먼저 체크해야 함\n if (ua.includes('edg/') || ua.includes('edge/')) {\n return 'edge';\n }\n\n // Samsung Internet\n if (ua.includes('samsungbrowser')) {\n return 'samsung';\n }\n\n // Opera - Chrome보다 먼저 체크해야 함\n if (ua.includes('opr/') || ua.includes('opera')) {\n return 'opera';\n }\n\n // Chrome (Chromium 기반 브라우저들보다 늦게 체크)\n if (ua.includes('chrome') && !ua.includes('edg')) {\n return 'chrome';\n }\n\n // Firefox\n if (ua.includes('firefox')) {\n return 'firefox';\n }\n\n // Safari (Chrome와 구분하기 위해 webkit 체크)\n if (ua.includes('safari') && !ua.includes('chrome')) {\n return 'safari';\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 버전\n */\nexport const getBrowserVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium)\n const edgMatch = ua.match(/edg\\/(\\d+(?:\\.\\d+)*)/);\n if (edgMatch && edgMatch[1]) {\n return edgMatch[1];\n }\n\n // Samsung Internet\n const samsungMatch = ua.match(/samsungbrowser\\/(\\d+(?:\\.\\d+)*)/);\n if (samsungMatch && samsungMatch[1]) {\n return samsungMatch[1];\n }\n\n // Opera\n const operaMatch = ua.match(/(?:opr|opera)\\/(\\d+(?:\\.\\d+)*)/);\n if (operaMatch && operaMatch[1]) {\n return operaMatch[1];\n }\n\n // Chrome\n const chromeMatch = ua.match(/chrome\\/(\\d+(?:\\.\\d+)*)/);\n if (chromeMatch && chromeMatch[1] && !ua.includes('edg')) {\n return chromeMatch[1];\n }\n\n // Firefox\n const firefoxMatch = ua.match(/firefox\\/(\\d+(?:\\.\\d+)*)/);\n if (firefoxMatch && firefoxMatch[1]) {\n return firefoxMatch[1];\n }\n\n // Safari\n const safariMatch = ua.match(/version\\/(\\d+(?:\\.\\d+)*)/);\n if (safariMatch && safariMatch[1] && ua.includes('safari') && !ua.includes('chrome')) {\n return safariMatch[1];\n }\n\n return 'unknown';\n};\n/**\n * 현재 브라우저의 OS 버전을 가져오기\n * @returns 현재 환경의 OS 버전\n */\nexport const getCurrentOSVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSVersion(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 이름을 가져오기\n * @returns 현재 환경의 브라우저 이름\n */\nexport const getCurrentBrowserName = (): BrowserName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserName(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 버전을 가져오기\n * @returns 현재 환경의 브라우저 버전\n */\nexport const getCurrentBrowserVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserVersion(navigator.userAgent);\n};\n\n/**\n * 클라이언트용 디바이스 ID 생성 및 관리(임시값)\n */\nexport const getOrCreateDeviceId = (): string => {\n if (typeof window === 'undefined') {\n return '';\n }\n\n const STORAGE_KEY = 'dsp_device_id';\n let deviceId = localStorage.getItem(STORAGE_KEY);\n\n if (!deviceId) {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 15);\n deviceId = `dsp-web-${timestamp}-${random}`;\n\n try {\n localStorage.setItem(STORAGE_KEY, deviceId);\n } catch (error) {\n console.warn('[DeviceId] localStorage 저장 실패:', error);\n }\n }\n\n return deviceId;\n};\n\n/**\n * 디바이스 모델 감지\n */\nexport const getDeviceModel = (): string => {\n if (!isClient()) {\n return '';\n }\n\n const ua = navigator.userAgent;\n\n // iOS\n if (/iPad/.test(ua)) {\n return 'iPad';\n }\n if (/iPhone/.test(ua)) {\n return 'iPhone';\n }\n if (/iPod/.test(ua)) {\n return 'iPod Touch';\n }\n\n // Android - 주요 브랜드\n if (/SM-[A-Z0-9]+/.test(ua)) {\n const match = ua.match(/SM-[A-Z0-9]+/);\n\n return match ? `Samsung ${match[0]}` : 'Samsung';\n }\n if (/Pixel/.test(ua)) {\n const match = ua.match(/Pixel [0-9]+[a-zA-Z]*/);\n\n return match ? `Google ${match[0]}` : 'Google Pixel';\n }\n if (/Mi\\s|Redmi|POCO/.test(ua)) {\n return 'Xiaomi';\n }\n if (/HUAWEI/.test(ua)) {\n return 'Huawei';\n }\n if (/OnePlus/.test(ua)) {\n return 'OnePlus';\n }\n\n // Desktop\n if (/Windows/.test(ua)) {\n return 'Windows PC';\n }\n if (/Mac OS X/.test(ua)) {\n return 'Mac';\n }\n if (/Linux/.test(ua)) {\n return 'Linux PC';\n }\n\n return 'Unknown';\n};\n\n/**\n * Android 기기인지 확인\n * (클라이언트용)\n */\nexport const isAndroidDevice = (): boolean => {\n if (isClient() === false) {\n return false;\n }\n\n return /Android/i.test(navigator.userAgent);\n};\n\n/**\n * iOS 기기인지 확인 (iPhone, iPad, iPod)\n * (클라이언트용)\n */\nexport const isIosDevice = (): boolean => {\n if (isClient() === false) {\n return false;\n }\n\n const ua = navigator.userAgent;\n\n // 1. 안드로이드면 즉시 제외 (AOS 체크)\n if (/Android/i.test(ua)) {\n return false;\n }\n\n // 2. iPhone, iPad, iPod 키워드가 직접 포함된 경우\n const isDirectIOS = /iPhone|iPad|iPod/i.test(ua);\n\n // 3. iPadOS 13+ 데스크탑 모드 대응 (MacIntel이면서 터치 지점이 1개 이상인 경우)\n const isIPadOS = (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1);\n\n return isDirectIOS || isIPadOS;\n};\n\n/**\n * 영업지원 안드로이드 웹뷰 여부\n * @returns boolean\n */\nexport const isAndroidWebView = () => {\n return getDspExecutionEnvironment() === 'android-webview';\n};\n\n/**\n * 영업지원 iOS 웹뷰 여부(FP 플래너 포함)\n * @returns boolean\n */\nexport const isIosWebView = () => {\n return getDspExecutionEnvironment() === 'ios-webview';\n};\n","/**\n * Message 이벤트 헨들러를 관리하는 클래스입니다. (싱글턴)\n * 모든 message 핸들러는 여기를 통해 등록해야합니다.\n * window.addEventListener('message') 의 중복을 방지하기 위함입니다.\n */\nexport class MessageEventManager {\n private static instance: MessageEventManager;\n private handlers = new Map<string, (event: MessageEvent) => void>();\n\n static getInstance(): MessageEventManager {\n if (!MessageEventManager.instance) {\n MessageEventManager.instance = new MessageEventManager();\n }\n\n return MessageEventManager.instance;\n }\n\n private constructor() {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n\n /**\n *\n * @param event\n */\n private handleMessage(event: MessageEvent): void {\n // 모든 등록된 핸들러 실행\n for (const [key, handler] of this.handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(`Message handler ${key} error:`, error);\n }\n }\n }\n\n /**\n * 이벤트 헨들러 함수를 등록합니다.\n * @param key\n * @param handler\n */\n registerHandler(key: string, handler: (event: MessageEvent) => void): void {\n this.handlers.set(key, handler);\n }\n\n /**\n * 이벤트 핸들러 함수를 삭제합니다.\n * @param key\n */\n unregisterHandler(key: string): void {\n this.handlers.delete(key);\n }\n}\n","interface ConvertTextToImgParams {\n /** 이미지로 변환할 문자열 */\n targetStr: string;\n /** 캔버스 너비 (지정하지 않으면 텍스트 길이에 따라 자동 계산) */\n canvasWidth?: number;\n /** 캔버스 높이 (지정하지 않으면 기본값 150px) */\n canvasHeight?: number;\n /** 배경색 (지정하지 않으면 투명) */\n backgroundColor?: string;\n /** 폰트 크기 (지정하지 않으면 기본값 75px) */\n fontSize?: number;\n /** 폰트 색상 (지정하지 않으면 기본값 검정색) */\n fontColor?: string;\n /** 폰트 두께 (지정하지 않으면 기본값 bold) */\n fontWeight?: string;\n /** 폰트 패밀리 (지정하지 않으면 기본값 ) */\n fontFamily?: string;\n}\n\n\n\nexport const getTextWidth = (text: string, font: string, context: CanvasRenderingContext2D) => {\n\n // 폰트 스타일 설정\n context.font = font;\n\n // measureText()를 사용하여 TextMetrics 객체 가져오기\n const metrics = context.measureText(text);\n\n // 너비(width) 반환\n return metrics.width;\n}\n\n\n\n\n/**\n * 텍스트를 이미지(Base64)로 변환하는 함수\n * @param params - 변환에 필요한 파라미터 객체\n * @returns Base64로 인코딩된 이미지 데이터 URL\n */\nexport const convertTextToImg = ({\n targetStr,\n canvasWidth,\n canvasHeight,\n backgroundColor,\n fontColor,\n fontSize,\n fontWeight,\n fontFamily = `'system-ui', 'sans-serif'`\n}: ConvertTextToImgParams): string => {\n // 1. 메모리에 캔버스 요소 생성\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n // 캔버스 컨텍스트를 가져올 수 없는 경우 에러 처리\n throw new Error('Canvas context를 가져올 수 없습니다.');\n }\n\n const font = `${fontWeight ?? 'normal'} ${fontSize ?? 75}px ${fontFamily}`;\n\n // 2. 캔버스 크기 설정\n const defaultHeight = 150;\n\n // as-is\n // const calculatedWidth = targetStr.length * 70; // 글자 수 기반 너비 계산\n\n const calculatedWidth = getTextWidth(targetStr, font, ctx);\n canvas.width = canvasWidth ?? calculatedWidth;\n canvas.height = canvasHeight ?? defaultHeight;\n\n // 3. 배경색 처리\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // 4. 텍스트 그리기\n ctx.fillStyle = fontColor ?? 'black';\n ctx.textAlign = 'center';\n ctx.font = font;\n ctx.textBaseline = 'middle'; // 텍스트를 수직 중앙에 더 잘 맞추기 위해 추가\n\n // 텍스트를 캔버스 중앙에 그립니다.\n ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);\n\n // 5. Base64 이미지 데이터로 변환하여 반환\n return canvas.toDataURL(); // 기본적으로 'image/png'\n};\n\nexport function drawImageResizeCentered(base64: string, size: { canvasWidth: number; canvasHeight: number }) {\n return new Promise((resolve) => {\n const { canvasHeight, canvasWidth } = size;\n\n const canvas = document.createElement('canvas');\n canvas.width = canvasWidth;\n canvas.height = canvasHeight;\n const ctx = canvas.getContext('2d');\n\n const img = new Image();\n img.src = base64;\n img.onload = () => {\n const imageWidth = img.width;\n const imageHeight = img.height;\n\n const canvasRatio = canvasWidth / canvasHeight;\n const imageRatio = imageWidth / imageHeight;\n\n let newWidth;\n let newHeight;\n\n if (imageRatio > canvasRatio) {\n newWidth = canvasWidth;\n newHeight = newWidth / imageRatio;\n } else {\n newHeight = canvasHeight;\n newWidth = newHeight * imageRatio;\n }\n\n const x = (canvasWidth - newWidth) / 2;\n const y = (canvasHeight - newHeight) / 2;\n\n ctx?.clearRect(0, 0, canvasWidth, canvasHeight);\n ctx?.drawImage(img, x, y, newWidth, newHeight);\n\n resolve(canvas.toDataURL());\n };\n });\n}\n","import { getCookie } from './cookie-utils';\n\nexport function base64ToBlob(base64String: string, contentType = '') {\n const regex = /^data:([a-zA-Z0-9/+.-]+);base64,/;\n const matches = base64String.match(regex);\n\n if (matches === null) {\n // ✅ 디버깅 정보 추가\n const debugInfo = {\n base64String\n };\n\n throw new Error(`Invalid base64 string format. Debug info: ${JSON.stringify(debugInfo, null, 2)}`);\n }\n\n const contentTypeFinal = contentType || matches[1];\n\n try {\n const byteCharacters = atob(base64String.replace(regex, ''));\n const byteNumbers = new Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n\n return new Blob([byteArray], { type: contentTypeFinal });\n } catch (error) {\n // ✅ atob 실패 시 추가 정보\n throw new Error(\n `Failed to decode base64 string. Original error: ${error instanceof Error ? error.message : 'Unknown error'}. String length: ${base64String?.length}, Content type: ${contentTypeFinal}`\n );\n }\n}\n\nexport function base64ToFile(base64String: string, fileName: string, contentType = '') {\n try {\n const blob = base64ToBlob(base64String, contentType);\n\n if (!blob) {\n throw new Error(\n `Failed to create blob. FileName: ${fileName}, ContentType: ${contentType}, StringLength: ${base64String?.length}`\n );\n }\n\n return blobToFile(blob, fileName);\n } catch (error) {\n // ✅ 상위 함수에서도 컨텍스트 추가\n throw new Error(\n `base64ToFile failed for \"${fileName}\". ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n type: blob.type,\n lastModified: Date.now()\n });\n}\n\nexport async function fileToBase64(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 파일확장자 리턴\n * @param data string File Blob\n */\nexport function getExt(data: string | File | Blob) {\n if (typeof data === 'string') {\n return data.split('.').pop();\n }\n\n if (data instanceof File) {\n return data.name.split('/').pop();\n }\n\n if (data instanceof Blob) {\n return data.type.split('/').pop();\n }\n}\n\nexport async function objectUrlToBlob(objectUrl: string) {\n try {\n const response = await fetch(objectUrl);\n const blob = await response.blob();\n\n return blob;\n } catch (error) {\n console.error('Error converting object URL to Blob:', error);\n throw error;\n }\n}\n\nexport async function objectUrlToBase64(objectUrl: string): Promise<string> {\n const blob = await objectUrlToBlob(objectUrl);\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function downloadBlob(blob: Blob, filename: string) {\n // 1. Create a temporary URL for the Blob object\n const url = URL.createObjectURL(blob);\n\n // 2. Create a hidden anchor element\n const link = document.createElement('a');\n link.style.display = 'none';\n link.href = url;\n\n // 3. Set the 'download' attribute with the desired file name\n // This attribute forces the browser to download the URL content instead of navigating to it\n link.download = `${filename}.${getExt(blob)}`;\n\n // 4. Append the link to the body (necessary for the click to work in some browsers)\n document.body.appendChild(link);\n\n // 5. Simulate a click on the link to trigger the download\n link.click();\n\n // 6. Clean up: Remove the link and revoke the object URL\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * image url을 File Object로 변경.\n * @param imageUrl fileObject로 변경할 image url\n * @note fetch를 이용하여 변환하기때문에, 앱내 커스텀스킴을 사용하는경우는 처리불가. imageUrlToFileWithCanvas사용\n * @return file object\n */\nexport async function imageUrlToFileFetch(imageUrl: string): Promise<File> {\n const headers = new Headers();\n headers.append('cache-control', 'no-cache');\n const resImage = await fetch(imageUrl, { headers });\n const blob = await resImage.blob();\n const { type } = blob;\n const name = type.split('/').join('.');\n const file = new File([blob], name, { type });\n\n return file;\n}\n\nexport async function imageUrlToFile(imageUrl: string): Promise<File> {\n const fileConvertTypeCookieKey = 'dsp-debug-mode-file-convert-type';\n const fileConvertType = getCookie(fileConvertTypeCookieKey);\n\n if (fileConvertType === 'fetch') {\n return await imageUrlToFileFetch(imageUrl);\n }\n\n if (fileConvertType === 'xhr') {\n return await imageUrlToFileWithXMLHttpRequest(imageUrl);\n }\n\n return await imageUrlToFileWithCanvas(imageUrl);\n}\n\n/**\n * imageUrlToFile버전을 사용할수 없는경우 대체하여 사용.\n * 메모리소모가 증가하고, 이미지손실가능성이 있음.\n * 이미지원본에 대한 보존이 필수인경우 비추\n * @param imageUrl\n * @returns\n */\nexport async function imageUrlToFileWithCanvas(imageUrl: string): Promise<File> {\n const newImage = new Image();\n newImage.src = imageUrl;\n newImage.crossOrigin = 'Anonymous';\n\n return new Promise((resolve, reject) => {\n newImage.onload = () => {\n const canvas = document.createElement('canvas');\n canvas.width = newImage.width;\n canvas.height = newImage.height;\n const ctx = canvas.getContext('2d');\n if (ctx) {\n ctx.drawImage(newImage, 0, 0);\n canvas.toBlob((blob) => {\n if (blob) {\n const ext = getExt(imageUrl);\n const file = new File([blob], `image.${ext}`, { type: blob.type });\n resolve(file);\n }\n });\n }\n };\n newImage.onerror = (e) => {\n reject(JSON.stringify(e));\n };\n });\n}\n\nexport async function imageUrlToFileWithXMLHttpRequest(imageUrl: string): Promise<File> {\n const xhr = new XMLHttpRequest();\n xhr.open('GET', imageUrl, true);\n xhr.responseType = 'blob';\n xhr.send();\n\n return new Promise((resolve, reject) => {\n xhr.onload = () => {\n if (xhr.status === 200) {\n const blob = xhr.response;\n const file = new File([blob], `image.${getExt(imageUrl)}`, { type: blob.type });\n resolve(file);\n } else {\n reject(new Error(`Failed to load image: ${xhr.status}`));\n }\n };\n xhr.onerror = (e) => {\n reject(JSON.stringify(e));\n };\n });\n}\n","/* eslint-disable */\n\nfunction getAstx2CookieFromDsp(name) {\n let cookieName = name + '=';\n let decodedCookie = decodeURIComponent(document.cookie);\n let ca = decodedCookie.split(';');\n for (let i = 0; i < ca.length; i++) {\n let c = ca[i].trim(); // Remove leading/trailing whitespace\n if (c.indexOf(cookieName) === 0) {\n return c.substring(cookieName.length, c.length);\n }\n }\n return '';\n}\n\n/* ASTx 1.3 | (C) Copyright AhnLab, Inc. | $Revision: 32070 $ */\nvar $ASTX2_CONST = {\n ERROR_SUCCESS: 0,\n ERROR_FAILED: 101,\n ERROR_NOINIT: 102,\n ERROR_NOTINST: 103,\n ERROR_NOTSUPPORTED: 104,\n ERROR_NOCONNECT: 105,\n ERROR_NCK: 106,\n ERROR_ERR: 107,\n ERROR_NSP: 108,\n ERROR_PARAM: 109,\n ERROR_EXCESS: 110,\n ERROR_NEEDUPDATE: 111,\n OPTION_NONE2E: 1,\n OPTION_AUTOFOCUS: 2,\n OPTION_AUTOSETTEXT: 4,\n OPTION_E2EFORM: 8,\n OPTION_E2EFORM_NOENC: 16,\n OPTION_E2EFORM_ALLTRIP: 32,\n OPTION_E2EFORM_ONLY: 64,\n OPTION_E2EFORM_TAGSET: 128,\n OPTION_NONE2E_ALG: 256,\n OPTION_NOSPTDUMMY: 512,\n OPTION_FIXEDTYPE: 1024,\n PROTECT_AK: 1,\n PROTECT_FW: 2,\n PROTECT_PB: 4,\n PROTECT_PCS: 8,\n SERVICE_AK: 1,\n REQUEST_JSONP: 1,\n REQUEST_AJAX: 2,\n DEBUG_NOALIVE: 1,\n INTERVAL_ALIVE: 5e3,\n E2ETYPE_EXCLUDE: -1,\n E2ETYPE_NONE: 0,\n E2ETYPE_CERT1: 1,\n E2ETYPE_CERT2: 2,\n E2ETYPE_SDK: 11,\n E2ETYPE_PLAIN1: 21,\n E2ETYPE_PLAIN2: 22,\n E2ETYPE_WIZVERA: 31,\n PAGEID: '',\n BROWSER_TYPE: '',\n BROWSER_VER: '',\n E2EFORM_TAIL: !0,\n E2EFORM_INIT: '_e2e_forminit',\n E2EFORM_TAG1: '_e2e_1__',\n E2EFORM_TAG2: '_e2e_2__',\n E2EFORM_TAG1_PWD: '_e2e_1_pwd__',\n E2EFORM_TAG2_PWD: '_e2e_2_pwd__',\n getErrno: function (a) {\n return 'NCK' == a ? this.ERROR_NCK : 'ERR' == a ? this.ERROR_ERR : 'NSP' == a ? this.ERROR_NSP : this.ERROR_FAILED;\n },\n _get_browser_version: function (a) {\n var b = 0;\n if (0 <= a.indexOf('Edge/') && ((b = parseInt(a.split('Edge/')[1])), 0 < b)) return 'EG' + b;\n if (0 <= a.indexOf('MSIE')) {\n if (((b = parseInt(a.split('MSIE')[1])), 0 < b)) return 'IE' + b;\n } else if (\n 0 <= a.indexOf('Trident') &&\n (0 <= a.indexOf('rv:')\n ? (b = parseInt(a.split('rv:')[1]))\n : 0 <= a.indexOf('IE') && (b = parseInt(a.split('IE')[1])),\n 0 < b)\n )\n return 'IE' + b;\n return 0 <= a.indexOf('OPR/') && ((b = parseInt(a.split('OPR/')[1])), 0 < b)\n ? 'OP' + b\n : 0 <= a.indexOf('Firefox/') && ((b = parseInt(a.split('Firefox/')[1])), 0 < b)\n ? 'FF' + b\n : 0 <= a.indexOf('Chrome/') && ((b = parseInt(a.split('Chrome/')[1])), 0 < b)\n ? 'CR' + b\n : 0 <= a.indexOf('AppleWebKit') &&\n 0 <= a.indexOf('Version/') &&\n ((b = parseInt(a.split('Version/')[1])), 0 < b)\n ? 'SF' + b\n : 'OT0';\n },\n init: function () {\n this.PAGEID = new Date().getTime();\n this.PAGEID -= Math.floor(100 * Math.random());\n this.BROWSER_VER = this._get_browser_version(navigator.userAgent);\n this.BROWSER_TYPE = this.BROWSER_VER.substring(0, 2);\n }\n};\n$ASTX2_CONST.init();\nvar $ASTX2_COMM = {\n mLocalServerURL: '',\n mClientPublicKey: '',\n mErrorAbortFlag: !1,\n mDegugFlags: 0,\n setDegugFlags: function (a) {\n this.mDegugFlags |= a;\n },\n getDegugFlags: function () {\n return this.mDegugFlags;\n },\n isEnable: function () {\n return 0 < this.mLocalServerURL.length ? !0 : !1;\n },\n uninit: function () {\n this.mLocalServerURL = '';\n },\n errorAbort: function (a) {\n 1 != this.mErrorAbortFlag && ((this.mErrorAbortFlag = !0), $ASTX2_CUST.errorAbort(a));\n }\n },\n $_astxu = {\n mJsonpSequence: 0,\n jsonQstr: function (a) {\n var b = [],\n c;\n for (c in a) a.hasOwnProperty(c) && b.push(encodeURIComponent(c) + '=' + encodeURIComponent(a[c]));\n return b.join('&');\n },\n jsonParse: function (a) {\n var b = a.indexOf('{'),\n c = a.indexOf('}');\n if (-1 == b || -1 == c) return {};\n a = a.substring(b, c + 1);\n return 'object' == typeof window.JSON && 'function' == typeof window.JSON.parse\n ? window.JSON.parse(a)\n : 'function' == typeof jQuery && 'function' == typeof jQuery.parseJSON\n ? jQuery.parseJSON(a)\n : eval('(' + a + ')');\n },\n _send_jsonp_jquery: function (a) {\n try {\n jQuery.ajax({\n url: a.src,\n timeout: a.timeout,\n cache: !1,\n crossDomain: !0,\n dataType: 'jsonp',\n contentType: 'application/javascript',\n success: function (b, d, e) {\n a.onSuccess(b);\n },\n error: function (b, d, e) {\n if (200 == b.status && 1 == a.nocallback) a.onSuccess();\n else a.onFailure();\n },\n complete: function (a, b) {}\n });\n } catch (b) {\n a.onFailure();\n }\n },\n _send_jsonp_dom: function (a) {\n var b = document.createElement('script');\n b.type = 'text/javascript';\n b.id = a.callback;\n b.async = a.async;\n b.src = a.src;\n var c = document.getElementsByTagName('body')[0];\n if (null == c && ((c = document.getElementsByTagName('head')[0]), null == c)) {\n a.onFailure();\n return;\n }\n var d = window.setTimeout(function () {\n window[a.callback] = function () {};\n try {\n var b = document.getElementById(a.callback);\n b && ((b.onerror = function () {}), c.removeChild(b));\n } catch (d) {}\n a.onFailure();\n }, a.timeout);\n 0 == a.nocallback\n ? (window[a.callback] = function (b) {\n window.clearTimeout(d);\n try {\n var f = document.getElementById(a.callback);\n f && c.removeChild(f);\n } catch (g) {}\n a.onSuccess(b);\n })\n : (b.onload = function () {\n window.clearTimeout(d);\n try {\n var b = document.getElementById(a.callback);\n b && c.removeChild(b);\n } catch (f) {}\n a.onSuccess();\n });\n b.onerror = function () {\n window.clearTimeout(d);\n window[a.callback] = function () {};\n try {\n var b = document.getElementById(a.callback);\n b && c.removeChild(b);\n } catch (f) {}\n a.onFailure();\n };\n c.appendChild(b);\n },\n sendJsonp: function (a) {\n null == a.data && (a.data = {});\n null == a.callback && (a.callback = 'jsonpCallback' + $_astxu.rnd());\n null == a.nocallback && (a.nocallback = !1);\n null == a.timeout && (a.timeout = 5e3);\n null == a.async && (a.async = !0);\n null == a.seq && (a.seq = !1);\n null == a.onSuccess && (a.onSuccess = function (a) {});\n null == a.onFailure && (a.onFailure = function () {});\n a.src = 1 == $ASTX2.mUseJQuery ? a.url + '?v=3' : a.url + '?v=2&callback=' + a.callback;\n if (1 == a.seq) {\n var b = ++this.mJsonpSequence;\n a.src += '&seq=' + b;\n 2147483647 <= this.mJsonpSequence && (this.mJsonpSequence = 0);\n }\n b = this.jsonQstr(a.data);\n 0 < b.length && (a.src += '&' + b);\n 1 == $ASTX2.mUseJQuery ? this._send_jsonp_jquery(a) : this._send_jsonp_dom(a);\n },\n _get_xhr_object: function () {\n if ('undefined' !== typeof XMLHttpRequest)\n try {\n return new XMLHttpRequest();\n } catch (a) {}\n try {\n return new ActiveXObject('Microsoft.XMLHTTP');\n } catch (b) {}\n return null;\n },\n sendAjax: function (a) {\n var b = this._get_xhr_object();\n if (null == b) $_astxu.msg('[sendAjax] _get_xhr_object failed');\n else {\n null == a.data && (a.data = {});\n null == a.type && (a.type = 'POST');\n null == a.async && (a.async = !0);\n null == a.onSuccess && (a.onSuccess = function (a) {});\n null == a.onFailure && (a.onFailure = function (a, b) {});\n var c = this.jsonQstr(a.data);\n b.open(a.type, 'GET' == a.type ? a.url + '&' + c : a.url, a.async);\n b.onreadystatechange = function () {\n if (4 == b.readyState)\n if (200 == b.status) a.onSuccess(b.responseText);\n else a.onFailure(b.status);\n };\n null != a.timeout && (b.timeout = a.timeout);\n b.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n b.send(c);\n }\n },\n sendAuthAjax: function (a) {\n var b = this._get_xhr_object();\n const stored = JSON.parse(sessionStorage.getItem('cust-mgmt-auth') || '{}');\n if (null == b) $_astxu.msg('[sendAjax] _get_xhr_object failed');\n else {\n null == a.data && (a.data = {});\n null == a.type && (a.type = 'POST');\n null == a.async && (a.async = !0);\n null == a.onSuccess && (a.onSuccess = function (a) {});\n null == a.onFailure && (a.onFailure = function (a, b) {});\n var c = this.jsonQstr(a.data);\n b.open(a.type, 'GET' == a.type ? a.url + '&' + c : a.url, a.async);\n b.onreadystatechange = function () {\n if (4 == b.readyState)\n if (200 == b.status) a.onSuccess(b.responseText);\n else a.onFailure(b.status);\n };\n null != a.timeout && (b.timeout = a.timeout);\n b.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n b.setRequestHeader('Authorization', stored.key);\n b.withCredentials = true;\n b.send(c);\n }\n },\n isACK: function (a) {\n return a && 'ACK' == a ? !0 : !1;\n },\n isWinOS: function () {\n return -1 != navigator.platform.indexOf('Win32') || -1 != navigator.platform.indexOf('Win64') ? !0 : !1;\n },\n isMacOS: function () {\n return -1 != navigator.platform.indexOf('Mac') ? !0 : !1;\n },\n isLinuxOS: function () {\n return -1 != navigator.platform.indexOf('Linux') ? !0 : !1;\n },\n isMacLinuxOS: function () {\n return 1 == this.isMacOS() || 1 == this.isLinuxOS() ? !0 : !1;\n },\n hasFocused: function () {\n var a = !1;\n try {\n a = document.hasFocus();\n } catch (b) {}\n return a;\n },\n addEvent: function (a, b, c) {\n a.addEventListener ? a.addEventListener(b, c, !1) : a.attachEvent('on' + b, c);\n },\n removeEvent: function (a, b, c) {\n a.removeEventListener ? a.removeEventListener(b, c) : a.detachEvent('on' + b, c);\n },\n getCreatedFormValue: function (a, b, c) {\n null == c && (c = !1);\n c = 1 == c ? document.getElementsByTagName('input') : a.getElementsByTagName('input');\n for (var d = 0; d < c.length; d++) {\n var e = c[d];\n if (e && this.getnc(e.name) == b) return e;\n }\n c = document.createElement('input');\n c.name = b;\n c.type = 'hidden';\n if ('function' === typeof $ASTX2_CUST.onCreatedFormValue) $ASTX2_CUST.onCreatedFormValue(c, b);\n a.appendChild(c);\n return c;\n },\n getHostPath: function () {\n var a = window.location.protocol + '//' + window.location.hostname;\n return (a += window.location.port ? ':' + window.location.port : '');\n },\n getnc: function (a, b) {\n null == b && (b = '');\n return null == a ? b : a;\n },\n getint: function (a, b) {\n null == b && (b = 0);\n return parseInt(a) || b;\n },\n rnd: function () {\n var a = new Date().getTime();\n return (a += new String(Math.floor(100 * Math.random())));\n },\n getKeyCode: function (a) {\n var b = null;\n a && (b = a.keyCode ? a.keyCode : a.which);\n return b;\n },\n xorEncode: function (a, b) {\n for (var c = '', d = new String(a), e = 0; e < d.length; e++) c += String.fromCharCode(b ^ d.charCodeAt(e));\n return c;\n },\n xorDecode: function (a, b) {\n for (var c = '', d = new String(a), e = 0; e < d.length; e++) c += String.fromCharCode(b ^ d.charCodeAt(e));\n return c;\n },\n ltrim: function (a, b) {\n for (b = this.getnc(b, ' '); a.substring(0, 1) == b; ) a = a.substring(1, a.length);\n return a;\n },\n rtrim: function (a, b) {\n for (b = this.getnc(b, ' '); a.substring(a.length - 1, a.length) == b; ) a = a.substring(0, a.length - 1);\n return a;\n },\n alltrim: function (a, b) {\n return this.ltrim(this.rtrim(a, b), b);\n },\n setInputFocus: function () {\n try {\n for (var a = document.getElementsByTagName('input'), b = 0; b < a.length; b++) {\n var c = a[b];\n if (c && 'hidden' != c.type) {\n c.focus();\n break;\n }\n }\n } catch (d) {}\n },\n log: function (a) {\n 'object' === typeof debuger && 'function' === typeof debuger.write\n ? debuger.write(a)\n : 'object' === typeof window.console && 'function' === typeof console.log && console.log(a);\n },\n msg: function (a) {\n this.log(a);\n }\n },\n $ASTX2_E2E = (function () {\n var a = null,\n b = function (a) {\n function b(a) {\n var c = a.target;\n null == c && (c = a.srcElement);\n return c;\n }\n function e(a) {\n if (null == a) return null;\n var b = a.getAttribute('e2e_inputid');\n if (null == b || 0 >= b) return null;\n var c = a.getAttribute('e2e_type');\n if (null == c || 0 >= c) return null;\n var d = a.getAttribute('e2e_inputtype');\n if (null == d || 0 >= d) d = '';\n var e = a.getAttribute('wizvera_key');\n null == e && (e = '');\n var f = {};\n f.e2e_inputid = b;\n f.e2e_type = c;\n f.e2e_inputtype = d;\n f.name = $_astxu.getnc(a.name);\n f.form = a.form ? $_astxu.getnc(a.form.name) : '';\n f.wizvera_key = e;\n return f;\n }\n function f(a) {\n var b = e(a);\n if (null == b) return null;\n b.type = $_astxu.getnc(a.type);\n b.maxlength = $_astxu.getnc(a.getAttribute('maxlength'));\n b.txtmsk = $_astxu.getnc(a.getAttribute('e2e_txtmsk'));\n return b;\n }\n function g(a, b) {\n a.getAttribute('e2e_type') != $ASTX2_CONST.E2ETYPE_PLAIN1 && (a.readOnly = b);\n }\n function h(a, b, c, d, e) {\n 1 == n && q(a, b, c, d, e);\n }\n function q(b, s, d, e, f) {\n var g = {};\n g.pageid = $ASTX2_CONST.PAGEID;\n if (null != s) for (var h in s) s.hasOwnProperty(h) && (g[h] = s[h]);\n a.send_e2e_cmd(b, g, d, e, f);\n }\n function l(a, b) {\n var c = '';\n return (c = 0 == $ASTX2_CONST.E2EFORM_TAIL ? b + a : a + b);\n }\n function m(a, b) {\n var c = '';\n return (c =\n 'password' == a.type\n ? b == $ASTX2_CONST.E2ETYPE_CERT2\n ? l(a.name, $ASTX2_CONST.E2EFORM_TAG2_PWD)\n : l(a.name, $ASTX2_CONST.E2EFORM_TAG1_PWD)\n : b == $ASTX2_CONST.E2ETYPE_CERT2\n ? l(a.name, $ASTX2_CONST.E2EFORM_TAG2)\n : l(a.name, $ASTX2_CONST.E2EFORM_TAG1));\n }\n function C() {\n if (0 != D)\n for (var a = document.getElementsByTagName('form'), b = 0; b < a.length; b++) {\n var c = a[b];\n if (null != c) {\n var d = !1;\n if (k & $ASTX2_CONST.OPTION_E2EFORM_TAGSET) {\n var e = c.getAttribute(E.e2eform_tagset);\n if (null == e || 0 >= e) d = !0;\n } else if (k & $ASTX2_CONST.OPTION_E2EFORM_ONLY) {\n if (null == c) e = !1;\n else\n for (var e = !1, f = c.getElementsByTagName('input'), g = 0; g < f.length; g++) {\n var h = f[g];\n if (null != h && ((h = h.getAttribute('e2e_type')), null != h && 0 < h)) {\n e = !0;\n break;\n }\n }\n 0 == e && (d = !0);\n }\n if (1 != d) {\n if ((d = $_astxu.getCreatedFormValue(c, l($ASTX2_CONST.E2EFORM_INIT, $ASTX2_CONST.E2EFORM_TAG1))))\n d.value = F;\n if ((d = $_astxu.getCreatedFormValue(c, l($ASTX2_CONST.E2EFORM_INIT, $ASTX2_CONST.E2EFORM_TAG2))))\n d.value = G;\n }\n }\n }\n }\n function V(a) {\n var b = 0;\n k & $ASTX2_CONST.OPTION_E2EFORM_NOENC && (b = 1);\n a = {\n ver: $_astxu.getint(a.ver),\n alg: $_astxu.getint(a.alg),\n svr: $_astxu.getnc(a.svr),\n norsa: $_astxu.getint(a.norsa),\n uniq: $_astxu.getnc(a.uniq),\n utime: $_astxu.getint(a.utime),\n ncert: $_astxu.getnc(a.ncert),\n pageid: $ASTX2_CONST.PAGEID,\n noenc: b\n };\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/e2e_forminit',\n data: a,\n onSuccess: function (a) {\n var b = $_astxu.getnc(a ? a.result : '');\n 0 == $_astxu.isACK(b)\n ? $_astxu.msg('[e2e_forminit] result=' + b)\n : ((D = !0), (F = $_astxu.getnc(a.e2e_form1)), (G = $_astxu.getnc(a.e2e_form2)), C());\n },\n onFailure: function () {\n $_astxu.msg('[e2e_forminit] failure.');\n }\n });\n }\n function W() {\n $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_CERT),\n onSuccess: function (a) {\n var b = $_astxu.jsonParse(a);\n a = $_astxu.getnc(b ? b.result : '');\n 0 == $_astxu.isACK(a)\n ? $_astxu.msg('[_init_e2eform] result=' + a)\n : $ASTX2.set_cert(\n function () {\n V(b);\n },\n function () {\n $_astxu.msg('[_init_e2eform] set_cert() failure');\n },\n b\n );\n },\n onFailure: function (a) {\n $_astxu.msg('[_init_e2eform] failure');\n }\n });\n }\n function H(a) {\n var b = $_astxu.getHostPath() + $_astxu.getnc(window.location.pathname),\n c = 0;\n k & $ASTX2_CONST.OPTION_NOSPTDUMMY && (c = 1);\n q(\n 'e2e_start',\n { browser: $ASTX2_CONST.BROWSER_VER, ver: a.ver, svr: a.svr, valg: a.valg, url: b, custcode: w, nospt: c },\n 5e3,\n function (a) {\n var b = $_astxu.getnc(a ? a.result : '');\n if ($_astxu.isACK(b)) {\n n = 1;\n I = $_astxu.getint(a.call_settext);\n t = $_astxu.getint(a.call_gettext);\n J = $_astxu.getint(a.vm_env);\n K = $_astxu.getint(a.ak_drv);\n try {\n var c = document.activeElement;\n c && x(c, !1);\n } catch (aa) {}\n k & $ASTX2_CONST.OPTION_E2EFORM &&\n (3 > $_astxu.getint(a.stsvr) ? $ASTX2_COMM.errorAbort($ASTX2_CONST.ERROR_NEEDUPDATE) : W());\n if (k & $ASTX2_CONST.OPTION_AUTOSETTEXT)\n for (var d in u) (a = u[d]), null != a && (0 >= $_astxu.getnc(a.value).length || y(a));\n } else n = 2;\n },\n function () {\n n = 2;\n }\n );\n }\n function L(a) {\n if (0 == $_astxu.hasFocused()) return !1;\n if (0 == n) return !0;\n if (1 == n) {\n if (!1 === a) return;\n try {\n var b = document.activeElement;\n b && x(b, !1);\n } catch (c) {}\n return !0;\n }\n n = 0;\n k & $ASTX2_CONST.OPTION_NONE2E\n ? ((a = 0),\n k & $ASTX2_CONST.OPTION_NONE2E_ALG && (a = $ASTX2.mOptionStrings.none2e_alg),\n H({ ver: 1, svr: '_none2e', valg: a }))\n : $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_INIT),\n onSuccess: function (a) {\n a = $_astxu.jsonParse(a);\n var b = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(b) ? H(a) : (n = -1);\n },\n onFailure: function (a) {\n n = -1;\n }\n });\n return !0;\n }\n function r(a) {\n if (null != a && (a.getAttribute('e2e_type') != $ASTX2_CONST.E2ETYPE_PLAIN1 || 0 != t)) {\n try {\n if (a != document.activeElement) return;\n } catch (b) {}\n 'number' == typeof a.selectionStart\n ? (a.selectionStart = a.selectionEnd = a.value.length)\n : 'undefined' != typeof a.createTextRange && ((a = a.createTextRange()), a.collapse(!1), a.select());\n }\n }\n function x(a, b) {\n v = !1;\n if (k & $ASTX2_CONST.OPTION_FIXEDTYPE && a) {\n var c = a.getAttribute('e2e_inputid');\n null != c && 0 < c && z[c] != a.type && (a.type = z[c]);\n }\n c = f(a);\n null != c &&\n (!0 === b && L(!1),\n h(\n 'e2e_focus',\n c,\n null,\n function (b) {\n g(a, !1);\n window.setTimeout(function () {\n r(a);\n }, 1);\n },\n function () {}\n ));\n }\n function M(a) {\n var c = b(a);\n if (null != c) {\n if ('function' === typeof $ASTX2_CUST.onHandlerPreFocus) $ASTX2_CUST.onHandlerPreFocus(c, a);\n x(c, !0);\n }\n }\n function N(a) {\n a = b(a);\n if (null != a) {\n var c = e(a);\n if (null != c) {\n try {\n if (document.hasFocus() && a === document.activeElement) return;\n } catch (f) {}\n g(a, !0);\n h('e2e_blur', c);\n }\n }\n }\n function O(a) {\n var c = b(a);\n null != c &&\n window.setTimeout(function () {\n r(c);\n }, 1);\n }\n function y(a, b) {\n var c = f(a);\n if (null != c) {\n var d = $_astxu.getnc(a.value);\n c.text = d;\n k & $ASTX2_CONST.OPTION_E2EFORM && (c.e2eform = 1);\n k & $ASTX2_CONST.OPTION_E2EFORM_NOENC && (c.noenc = 1);\n h(\n 'e2e_settext',\n c,\n null,\n function (d) {\n var e = $_astxu.getnc(d ? d.result : '');\n if (0 == $_astxu.isACK(e)) b && b($ASTX2_CONST.ERROR_NCK);\n else {\n if (k & $ASTX2_CONST.OPTION_E2EFORM) {\n var e = m(a, c.e2e_type),\n f = !1;\n k & $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP && (f = !0);\n if ((e = $_astxu.getCreatedFormValue(a.form, e, f))) e.value = $_astxu.getnc(d.e2e_data);\n }\n b && b($ASTX2_CONST.ERROR_SUCCESS);\n }\n },\n function () {\n b && b($ASTX2_CONST.ERROR_FAILED);\n }\n );\n }\n }\n function A(a) {\n 'function' === typeof a.stopPropagation && a.stopPropagation();\n 'function' === typeof a.preventDefault ? a.preventDefault() : (a.returnValue = !1);\n }\n function X(a, b, c) {\n h(\n 'e2e_gettext',\n b,\n null,\n function (b) {\n var d = $_astxu.getnc(b ? b.result : '');\n $_astxu.isACK(d)\n ? ((b = $_astxu.getnc(b.text)), (a.value = b), c && c($ASTX2_CONST.ERROR_SUCCESS))\n : c && c($ASTX2_CONST.ERROR_NCK);\n },\n function () {\n c && c($ASTX2_CONST.ERROR_FAILED);\n }\n );\n }\n function Y(a, b) {\n k & $ASTX2_CONST.OPTION_E2EFORM_NOENC && (b.noenc = 1);\n h(\n 'e2e_formget',\n b,\n null,\n function (c) {\n var d = $_astxu.getnc(c ? c.result : '');\n if (0 == $_astxu.isACK(d)) $_astxu.msg('[e2e_formget] ' + b.name + ',result=' + d);\n else if (((d = a.form), null != d)) {\n var e = m(a, b.e2e_type),\n f = !1;\n k & $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP && (f = !0);\n if ((d = $_astxu.getCreatedFormValue(d, e, f))) d.value = $_astxu.getnc(c.e2e_data);\n }\n },\n function () {}\n );\n }\n function P(a) {\n var c = b(a);\n if (null != c) {\n var e = f(c);\n if (null != e) {\n r(c);\n var p = $_astxu.getKeyCode(a);\n 17 == p && (v = !0);\n if (1 == v)\n return (\n 86 == p &&\n h(\n 'e2e_clear',\n e,\n null,\n function (a) {\n c.value = '';\n },\n function () {}\n ),\n A(a),\n !1\n );\n if (1 == (16 == p || 17 == p || 18 == p ? !0 : !1)) return !0;\n var g = !0;\n k & $ASTX2_CONST.OPTION_E2EFORM &&\n ((e.e2e_type != $ASTX2_CONST.E2ETYPE_CERT1 && e.e2e_type != $ASTX2_CONST.E2ETYPE_CERT2) || Y(c, e));\n 'function' === typeof $ASTX2_CUST.onHandlerKeyDown &&\n 0 == $ASTX2_CUST.onHandlerKeyDown(c, a) &&\n (A(a), (g = !1));\n 1 != t ||\n ('password' == c.type && e.e2e_type != $ASTX2_CONST.E2ETYPE_PLAIN1) ||\n 0 != J ||\n (1 == g &&\n X(c, e, function () {\n 'password' != c.type &&\n 'dynamic' == c.getAttribute('e2e_txtmsk') &&\n (c.value = c.value.replace(/[^*]/g, '*').substring(0, c.value.length - 1) + c.value.slice(-1));\n }),\n 0 == (8 == p || 9 == p || 13 == p || 20 == p ? !0 : !1) && (A(a), (g = !1)));\n return g;\n }\n }\n }\n function Q(a) {\n var c = b(a);\n null != c &&\n (17 == $_astxu.getKeyCode(a) && (v = !1),\n 1 == I\n ? y(c)\n : 0 == t &&\n 'password' != c.type &&\n 'dynamic' == c.getAttribute('e2e_txtmsk') &&\n (c.value = c.value.replace(/[^*]/g, '*').substring(0, c.value.length - 1) + c.value.slice(-1)),\n window.setTimeout(function () {\n r(c);\n }, 1));\n }\n function R(a) {\n var c = b(a);\n null != c &&\n window.setTimeout(function () {\n r(c);\n }, 1);\n }\n function S(a) {\n if ('IE' == $ASTX2_CONST.BROWSER_TYPE || 'EG' == $ASTX2_CONST.BROWSER_TYPE) {\n var c = b(a);\n null != c &&\n '' != c.value &&\n setTimeout(function () {\n if ('' == c.value) {\n var a = e(c);\n null != a && h('e2e_clear', a);\n }\n }, 1);\n }\n }\n function T(a) {\n var c = b(a);\n null != c &&\n ('number' == typeof c.selectionStart\n ? (c.selectionStart < c.value.length || c.selectionEnd < c.value.length) &&\n window.setTimeout(function () {\n r(c);\n }, 1)\n : 'undefined' != typeof c.createTextRange &&\n document.selection &&\n ((a = document.selection.createRange()),\n a.moveStart('character', -c.value.length),\n a.text.length <= c.value.length &&\n window.setTimeout(function () {\n r(c);\n }, 1)));\n }\n function Z(a) {}\n function U(a) {\n h('e2e_unload');\n }\n var k = 0,\n E = [],\n $ = 0,\n B = !1,\n w = 0,\n n = -1,\n I = 0,\n t = 0,\n J = 0,\n K = 1,\n v = !1,\n u = [],\n z = [],\n D = !1,\n F = '',\n G = '';\n this.setOption = function (a) {\n k |= a;\n };\n this.setOptionStrings = function (a) {\n E = a;\n };\n this.attach = function (a, b) {\n null != a && (w = a);\n k & $ASTX2_CONST.OPTION_AUTOSETTEXT && (u = []);\n k & $ASTX2_CONST.OPTION_E2EFORM && C();\n for (var c = document.getElementsByTagName('input'), d = 0; d < c.length; d++) {\n var e = c[d];\n null != e && this.addObject(e);\n }\n q(\n 'e2e_init',\n null,\n null,\n function (a) {\n L();\n $_astxu.addEvent(window, 'blur', Z);\n $_astxu.addEvent(window, 'unload', U);\n $_astxu.addEvent(window, 'beforeunload', U);\n b && b(!0);\n },\n function () {\n b && b(!1);\n }\n );\n B = !0;\n };\n this.addObject = function (a) {\n if (null != a) {\n var b = a.getAttribute('e2e_inputid');\n if (!(null != b && 0 < b)) {\n var c = a.getAttribute('e2e_type');\n if (null == c || 0 >= c)\n if (((c = a.getAttribute('e2e')), 'true' == c || 'on' == c))\n (c = $ASTX2_CONST.E2ETYPE_CERT1), a.setAttribute('e2e_type', c);\n else {\n c = $ASTX2_CONST.E2ETYPE_NONE;\n try {\n if (\n ('function' === typeof $ASTX2_CUST.isE2EObject &&\n 1 == $ASTX2_CUST.isE2EObject(a) &&\n ((c = $ASTX2_CONST.E2ETYPE_CERT1), a.setAttribute('e2e_type', c)),\n 'function' === typeof $ASTX2_CUST.getE2Etype)\n ) {\n var d = $ASTX2_CUST.getE2Etype(a);\n d && ((c = d), a.setAttribute('e2e_type', c));\n }\n } catch (e) {}\n if (c == $ASTX2_CONST.E2ETYPE_NONE) return;\n }\n b = ++$;\n a.setAttribute('e2e_inputid', b);\n d = !0;\n k & $ASTX2_CONST.OPTION_AUTOSETTEXT && 0 < a.value.length && ((d = !1), u.push(a));\n 1 == d && (a.value = '');\n a.setAttribute('autocomplete', 'off');\n g(a, !0);\n z[b] = a.type;\n $_astxu.addEvent(a, 'focus', M);\n $_astxu.addEvent(a, 'blur', N);\n $_astxu.addEvent(a, 'click', O);\n $_astxu.addEvent(a, 'keyup', Q);\n $_astxu.addEvent(a, 'keydown', P);\n $_astxu.addEvent(a, 'select', T);\n $_astxu.addEvent(a, 'mouseup', S);\n $_astxu.addEvent(a, 'mousedown', R);\n k & $ASTX2_CONST.OPTION_E2EFORM &&\n (c == $ASTX2_CONST.E2ETYPE_CERT1 || c == $ASTX2_CONST.E2ETYPE_CERT2) &&\n ((b = a.form),\n null != b &&\n ((a = m(a, c)),\n (c = !1),\n k & $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP && (c = !0),\n $_astxu.getCreatedFormValue(b, a, c)));\n }\n }\n };\n this.subObject = function (a) {\n var b = e(a);\n if (null != b) {\n $_astxu.removeEvent(a, 'focus', M);\n $_astxu.removeEvent(a, 'blur', N);\n $_astxu.removeEvent(a, 'click', O);\n $_astxu.removeEvent(a, 'keyup', Q);\n $_astxu.removeEvent(a, 'keydown', P);\n $_astxu.removeEvent(a, 'select', T);\n $_astxu.removeEvent(a, 'mouseup', S);\n $_astxu.removeEvent(a, 'mousedown', R);\n try {\n a == document.activeElement && h('e2e_blur', b);\n } catch (c) {}\n a.value = '';\n a.setAttribute('e2e_inputid', -1);\n a.setAttribute('e2e_type', -1);\n g(a, !1);\n }\n };\n this.getE2EHash = function (a, b) {\n var c = e(a);\n null == c\n ? b(null, $ASTX2_CONST.ERROR_PARAM)\n : h(\n 'e2e_gethash',\n c,\n null,\n function (a) {\n var c = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(c)\n ? b($_astxu.getnc(a.hash), $ASTX2_CONST.ERROR_SUCCESS)\n : b(null, $ASTX2_CONST.ERROR_NCK);\n },\n function () {\n b(null, $ASTX2_CONST.ERROR_FAILED);\n }\n );\n };\n this.getEncText = function (a, b, c) {\n var d = e(a);\n d.customcode = w;\n d.random = b;\n null == d\n ? c(null, null, $ASTX2_CONST.ERROR_PARAM)\n : h(\n 'sdk_getenctext',\n d,\n null,\n function (a) {\n var b = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(b)\n ? c(d.name, $_astxu.getnc(a.getenctext), $ASTX2_CONST.ERROR_SUCCESS)\n : c(null, null, $ASTX2_CONST.ERROR_NCK);\n },\n function () {\n c(null, null, $ASTX2_CONST.ERROR_FAILED);\n }\n );\n };\n this.getE2EText = function (a, b) {\n var c = e(a);\n null == c\n ? b(null, null, $ASTX2_CONST.ERROR_PARAM)\n : c.e2e_type != $ASTX2_CONST.E2ETYPE_PLAIN2 && c.e2e_type != $ASTX2_CONST.E2ETYPE_WIZVERA\n ? b(null, null, $ASTX2_CONST.ERROR_PARAM)\n : h(\n 'e2e_gettext',\n c,\n null,\n function (a) {\n var d = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(d)\n ? b(c.name, $_astxu.getnc(a.text), $ASTX2_CONST.ERROR_SUCCESS)\n : b(null, null, $ASTX2_CONST.ERROR_NCK);\n },\n function () {\n b(null, null, $ASTX2_CONST.ERROR_FAILED);\n }\n );\n };\n this.setE2EText = function (a, b) {\n y(a, b);\n };\n this.clearE2EText = function (a, b) {\n var c = e(a);\n null != c &&\n h(\n 'e2e_clear',\n c,\n null,\n function (d) {\n d = $_astxu.getnc(d ? d.result : '');\n if (0 == $_astxu.isACK(d)) b && b($ASTX2_CONST.ERROR_NCK);\n else {\n a.value = '';\n if (k & $ASTX2_CONST.OPTION_E2EFORM) {\n d = m(a, c.e2e_type);\n var e = !1;\n k & $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP && (e = !0);\n if ((d = $_astxu.getCreatedFormValue(a.form, d, e))) d.value = '';\n }\n b && b($ASTX2_CONST.ERROR_SUCCESS);\n }\n },\n function () {\n b && b($ASTX2_CONST.ERROR_FAILED);\n }\n );\n };\n this.dettach = function () {\n h('e2e_uninit');\n B = !1;\n };\n this.isAttached = function () {\n return B;\n };\n this.isStarted = function () {\n return 1 == n ? !0 : !1;\n };\n this.checkService = function (a) {\n var b = {};\n b.service = $ASTX2_CONST.SERVICE_AK;\n b.result = $ASTX2_CONST.ERROR_SUCCESS;\n if (0 >= n) {\n var c = this;\n window.setTimeout(function () {\n c.checkService(a);\n }, 300);\n } else\n 1 == n && 0 == K\n ? (b.result = $ASTX2_CONST.ERROR_FAILED)\n : 2 == n && (b.result = $ASTX2_CONST.ERROR_FAILED),\n a(b);\n };\n this.getE2EelmsForm = function (a, b, c, d) {\n for (var f = document.getElementsByTagName('input'), g = 0; g < f.length; g++) {\n var h = f[g];\n if (null != h && ((h = e(h)), null != h && h.e2e_type == d)) {\n var k = !1;\n null == a ? (k = !0) : $_astxu.getnc(a.name) == h.form && (k = !0);\n 0 != k && (b.push(h.e2e_inputid), c.push(h.name));\n }\n }\n };\n this.getE2EelmsID = function (a, b, c, d) {\n for (var f = document.getElementsByTagName('input'), g = 0; g < f.length; g++) {\n var h = f[g];\n if (null != h) {\n var k = e(h);\n if (null != k && k.e2e_type == d) {\n for (var l = !1, h = $_astxu.getnc(h.id).toLowerCase(), m = 0; m < a.length; m++)\n if (a[m].toLowerCase() == h) {\n l = !0;\n break;\n }\n 0 != l && (b.push(k.e2e_inputid), c.push(k.name));\n }\n }\n }\n };\n this.resetE2Evalues = function (a, b) {\n for (var c = document.getElementsByTagName('input'), d = 0; d < c.length; d++) {\n var f = c[d];\n if (null != f) {\n var g = e(f);\n null != g &&\n g.form == a &&\n g.e2e_type != $ASTX2_CONST.E2ETYPE_PLAIN1 &&\n g.e2e_type != $ASTX2_CONST.E2ETYPE_PLAIN2 &&\n (f.value = b);\n }\n }\n };\n this.getE2Eattribute = function (a) {\n return e(a);\n };\n };\n return {\n getInstance: function (c) {\n null === a && (a = new b(c));\n return a;\n }\n };\n })(),\n $ASTX2 = {\n mUseJQuery: !0,\n mUseAjaxHello: !1,\n mUseAutoStart: !0,\n mOption: 0,\n mOptionStrings: [],\n mE2EInst: null,\n mLastError: $ASTX2_CONST.ERROR_SUCCESS,\n send_e2e_cmd: function (a, b, c, d, e, f) {\n if ('object' == typeof $ASTX2_COMM && 0 != $ASTX2_COMM.isEnable()) {\n var g = this;\n null == f && (f = 1);\n var h = !1;\n if ('e2e_focus' == a || 'e2e_blur' == a || 'e2e_gettext' == a || 'e2e_settext' == a) h = !0;\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/' + a,\n data: b,\n timeout: c || 5e3,\n async: !1,\n seq: h,\n onSuccess: function (a) {\n d && d(a);\n },\n onFailure: function () {\n 3 > f ? g.send_e2e_cmd(a, b, c, d, e, f + 1) : e && e();\n }\n });\n }\n },\n _send_alive: function () {\n var a = { pageid: $ASTX2_CONST.PAGEID, focus: $_astxu.hasFocused() ? 1 : 0 };\n $_astxu.sendJsonp({ url: $ASTX2_COMM.mLocalServerURL + '/alive', data: a });\n },\n send_alive_run: function () {\n if (!($ASTX2_COMM.getDegugFlags() & $ASTX2_CONST.DEBUG_NOALIVE)) {\n var a = this;\n setInterval(function () {\n a._send_alive();\n }, $ASTX2_CONST.INTERVAL_ALIVE);\n }\n },\n _hello_local_server: function (a, b, c, d, e) {\n var f = this;\n if (d >= c.length)\n f.setLastError($ASTX2_CONST.ERROR_NOTINST),\n 1 == $_astxu.isWinOS() &&\n 1 == f.mUseAutoStart &&\n ((f.mUseAutoStart = !1),\n 'IE' != $ASTX2_CONST.BROWSER_TYPE &&\n 'EG' != $ASTX2_CONST.BROWSER_TYPE &&\n (window.location.href = 'astx://start')),\n b();\n else {\n var g = e[d],\n h = c[d],\n q = 'https://' + (1 == $_astxu.isMacOS() ? 'lx.astxsvc.com' : '127.0.0.1') + ':' + h + '/ASTX2',\n h = '',\n l = document.getElementsByTagName('script');\n if (l) for (var m = 0; m < l.length; m++) l[m].src && 0 <= l[m].src.indexOf('astx2.min.js') && (h = l[m].src);\n l = '$Revision: 32070 $';\n l = l.substr(11, l.length - 13);\n m = !1;\n 0 == $ASTX2.mUseAjaxHello && 1 == d % 2 && (m = !0);\n 'IE' == $ASTX2_CONST.BROWSER_TYPE &&\n 'IE10' != $ASTX2_CONST.BROWSER_VER &&\n 'IE11' != $ASTX2_CONST.BROWSER_VER &&\n ((m = !0), 2e3 < g && (g = 2e3));\n d++;\n 1 == m\n ? $_astxu.sendJsonp({\n url: q + '/hello',\n data: { url: h, version: l },\n timeout: g,\n onSuccess: function (c) {\n var d = $_astxu.getnc(c ? c.result : '');\n c = $_astxu.getnc(c ? c.client_public_key : '');\n $_astxu.isACK(d)\n ? (($ASTX2_COMM.mLocalServerURL = q), ($ASTX2_COMM.mClientPublicKey = c), a())\n : (f.setLastError($ASTX2_CONST.ERROR_NOTINST), b());\n },\n onFailure: function () {\n f._hello_local_server(a, b, c, d, e);\n }\n })\n : $_astxu.sendAjax({\n url: q + '/hello?',\n type: 'POST',\n data: { url: h, version: l },\n timeout: g,\n onSuccess: function (c) {\n var d = $_astxu.jsonParse(c);\n c = $_astxu.getnc(d ? d.result : '');\n d = $_astxu.getnc(d ? d.client_public_key : '');\n $_astxu.isACK(c)\n ? (($ASTX2_COMM.mLocalServerURL = q), ($ASTX2_COMM.mClientPublicKey = d), a())\n : (f.setLastError($ASTX2_CONST.ERROR_NOTINST), b());\n },\n onFailure: function () {\n f._hello_local_server(a, b, c, d, e);\n }\n });\n }\n },\n setOption: function (a) {\n if (null != a) {\n !0 === a.autofocus && (this.mOption |= $ASTX2_CONST.OPTION_AUTOFOCUS);\n !0 === a.e2eform && (this.mOption |= $ASTX2_CONST.OPTION_E2EFORM);\n !1 === a.e2eform_enc && (this.mOption |= $ASTX2_CONST.OPTION_E2EFORM_NOENC);\n !0 === a.e2eform_alltrip && (this.mOption |= $ASTX2_CONST.OPTION_E2EFORM_ALLTRIP);\n !0 === a.e2eform_only && (this.mOption |= $ASTX2_CONST.OPTION_E2EFORM_ONLY);\n !0 === a.autosettext && (this.mOption |= $ASTX2_CONST.OPTION_AUTOSETTEXT);\n !0 === a.nospt && (this.mOption |= $ASTX2_CONST.OPTION_NOSPTDUMMY);\n !0 === a.fixedtype && (this.mOption |= $ASTX2_CONST.OPTION_FIXEDTYPE);\n var b = $_astxu.getnc(a.e2eform_tagset);\n 0 < b.length &&\n ((this.mOption |= $ASTX2_CONST.OPTION_E2EFORM_TAGSET), (this.mOptionStrings.e2eform_tagset = b));\n b = $_astxu.getint(a.none2e_alg);\n 0 < b && ((this.mOption |= $ASTX2_CONST.OPTION_NONE2E_ALG), (this.mOptionStrings.none2e_alg = b));\n }\n },\n _get_custom_value: function () {\n 'undefined' !== typeof $ASTX2_CUST.mUseJQuery && ($ASTX2.mUseJQuery = $ASTX2_CUST.mUseJQuery);\n 'undefined' !== typeof $ASTX2_CUST.mUseAjaxHello && ($ASTX2.mUseAjaxHello = $ASTX2_CUST.mUseAjaxHello);\n 'undefined' !== typeof $ASTX2_CUST.mUseAutoStart &&\n ($ASTX2.mUseAutoStart = 1 == $ASTX2.mUseAutoStart ? $ASTX2_CUST.mUseAutoStart : !1);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAIL && ($ASTX2_CONST.E2EFORM_TAIL = $ASTX2_CUST.E2EFORM_TAIL);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_INIT && ($ASTX2_CONST.E2EFORM_INIT = $ASTX2_CUST.E2EFORM_INIT);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAG1 && ($ASTX2_CONST.E2EFORM_TAG1 = $ASTX2_CUST.E2EFORM_TAG1);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAG2 && ($ASTX2_CONST.E2EFORM_TAG2 = $ASTX2_CUST.E2EFORM_TAG2);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAG1_PWD &&\n ($ASTX2_CONST.E2EFORM_TAG1_PWD = $ASTX2_CUST.E2EFORM_TAG1_PWD);\n 'undefined' !== typeof $ASTX2_CUST.E2EFORM_TAG2_PWD &&\n ($ASTX2_CONST.E2EFORM_TAG2_PWD = $ASTX2_CUST.E2EFORM_TAG2_PWD);\n },\n init: function (a, b, c, d) {\n function e() {\n a();\n if (1 == $_astxu.isMacLinuxOS()) {\n f.send_alive_run();\n try {\n $ASTX2_MLi.init();\n } catch (b) {}\n }\n }\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n if (1 == $ASTX2_COMM.isEnable()) a();\n else {\n this._get_custom_value();\n null != d && ($ASTX2.mUseAutoStart = 1 == d ? $ASTX2.mUseAutoStart : !1);\n 1 == $ASTX2.mUseJQuery && 'undefined' === typeof jQuery && ($ASTX2.mUseJQuery = !1);\n var f = this;\n this.mE2EInst = $ASTX2_E2E.getInstance(this);\n this.mE2EInst.setOption(this.mOption);\n this.mE2EInst.setOptionStrings(this.mOptionStrings);\n var g = [],\n h = [];\n null != c\n ? ((g = [55920, 55920, 55921, 55922]), (h = [c, c, c, c]))\n : ((g = [55920, 55920, 55921, 55922]), (h = [1e4, 1500, 750, 250]));\n setTimeout(function () {\n f._hello_local_server(e, b, g, 0, h);\n }, 200);\n }\n },\n _check_local_server_chk_stamp: function (a, b, c, d) {\n var e = this;\n $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_CHK_STAMP),\n data: d,\n onSuccess: function (c) {\n c = $_astxu.jsonParse(c);\n c = $_astxu.getnc(c ? c.result : '');\n $_astxu.isACK(c) ? a() : (e.setLastError($ASTX2_CONST.ERROR_NCK), b());\n },\n onFailure: function (a) {\n b();\n }\n });\n },\n _check_local_server: function (a, b, c, d) {\n var e = this;\n null == d && (d = 1);\n 3 < d\n ? (e.setLastError($ASTX2_CONST.ERROR_NOCONNECT), b())\n : $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/check',\n data: { method: c, url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_STAMP), rnd: $_astxu.rnd() },\n onSuccess: function (f) {\n var g = $_astxu.getnc(f ? f.result : '');\n $_astxu.isACK(g)\n ? ((f.rnd = $_astxu.rnd()), e._check_local_server_chk_stamp(a, b, c, f))\n : e._check_local_server(a, b, c, d + 1);\n },\n onFailure: function () {\n e.setLastError($ASTX2_CONST.ERROR_FAILED);\n e._check_local_server(a, b, c, d + 1);\n }\n });\n },\n checkServer: function (a, b, c) {\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n 0 == $ASTX2_COMM.isEnable()\n ? (this.setLastError($ASTX2_CONST.ERROR_NOINIT), b())\n : (0 == $_astxu.isWinOS() ? (c = 1) : null == c && (c = 1), this._check_local_server(a, b, c));\n },\n _e2e_enable: function () {\n return 0 == $_astxu.isWinOS()\n ? (this.setLastError($ASTX2_CONST.ERROR_NOTSUPPORTED), !1)\n : 0 == $ASTX2_COMM.isEnable()\n ? (this.setLastError($ASTX2_CONST.ERROR_NOINIT), !1)\n : !0;\n },\n resetE2E: function (a, b) {\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n if (0 == this._e2e_enable()) return !1;\n var c = this;\n window.setTimeout(function () {\n c.mE2EInst.attach(a, b);\n }, 100);\n return !0;\n },\n initE2E: function (a, b) {\n this.mOption & $ASTX2_CONST.OPTION_AUTOFOCUS && $_astxu.setInputFocus();\n return this.resetE2E(a, b);\n },\n resetNonE2E: function (a, b) {\n return this.initNonE2E(a, b);\n },\n initNonE2E: function (a, b) {\n this.mE2EInst.setOption($ASTX2_CONST.OPTION_NONE2E);\n this.mOption & $ASTX2_CONST.OPTION_AUTOFOCUS && $_astxu.setInputFocus();\n return this.resetE2E(a, b);\n },\n uninitE2E: function () {\n 1 == $_astxu.isWinOS() && 1 == $ASTX2_COMM.isEnable() && this.mE2EInst.dettach();\n },\n uninitNonE2E: function () {\n this.uninitE2E();\n },\n set_cert: function (a, b, c, d) {\n null == d && (d = 1);\n var e = new String($_astxu.getnc(c['cert' + d]));\n if (0 == e.length) 0 < d ? a() : b();\n else {\n var f = this;\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/set_cert',\n data: { step: d, cert: e, pageid: $ASTX2_CONST.PAGEID },\n onSuccess: function (e) {\n setTimeout(function () {\n f.set_cert(a, b, c, d + 1);\n }, 250);\n },\n onFailure: function () {\n b();\n }\n });\n }\n },\n _e2edata_get: function (a, b, c, d) {\n var e = this;\n a = {\n ver: $_astxu.getint(d.ver),\n alg: $_astxu.getint(d.alg),\n svr: $_astxu.getnc(d.svr),\n norsa: $_astxu.getint(d.norsa),\n uniq: $_astxu.getnc(d.uniq),\n utime: $_astxu.getint(d.utime),\n ncert: $_astxu.getnc(d.ncert),\n pageid: $ASTX2_CONST.PAGEID,\n ids1: a.ids1,\n names1: a.names1,\n ids2: a.ids2,\n names2: a.names2\n };\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/get_data',\n data: a,\n timeout: 1e4,\n onSuccess: function (a) {\n var d = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(d) ? b(a) : (e.setLastError($ASTX2_CONST.ERROR_NCK), c());\n },\n onFailure: function () {\n e.setLastError($ASTX2_CONST.ERROR_FAILED);\n c();\n }\n });\n },\n _e2edata: function (a, b, c) {\n var d = this;\n $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_CERT),\n onSuccess: function (e) {\n var f = $_astxu.jsonParse(e);\n e = $_astxu.getnc(f ? f.result : '');\n 0 == $_astxu.isACK(e)\n ? (d.setLastError($ASTX2_CONST.ERROR_NCK), c())\n : d.set_cert(\n function () {\n d._e2edata_get(a, b, c, f);\n },\n function () {\n d.setLastError($ASTX2_CONST.ERROR_NOCONNECT);\n c();\n },\n f\n );\n },\n onFailure: function (a) {\n d.setLastError($ASTX2_CONST.ERROR_FAILED);\n c();\n }\n });\n },\n getE2EData: function (a, b, c) {\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n if (0 == this._e2e_enable()) c();\n else {\n var d = [],\n e = [],\n f = [],\n g = [];\n this.mE2EInst.getE2EelmsForm(a, d, e, 1);\n this.mE2EInst.getE2EelmsForm(a, f, g, 2);\n a = { ids1: d.join(','), names1: e.join(','), ids2: f.join(','), names2: g.join(',') };\n this._e2edata(a, b, c);\n }\n },\n getE2EDataRetry: function (a, b, c, d, e) {\n null == d && (d = 3);\n null == e && (e = 1e3);\n if (0 >= d) this.setLastError($ASTX2_CONST.ERROR_EXCESS), c();\n else {\n var f = this;\n this.getE2EData(\n a,\n function (a) {\n b(a);\n },\n function () {\n f.getLastError() == $ASTX2_CONST.ERROR_NOINIT\n ? window.setTimeout(function () {\n f.getE2EDataRetry(a, b, c, d - 1, e);\n }, e)\n : c();\n }\n );\n }\n },\n getE2EDataIDs: function (a, b, c) {\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n if (0 == this._e2e_enable()) c();\n else {\n null == a && (that.setLastError($ASTX2_CONST.ERROR_PARAM), c());\n var d = [],\n e = [],\n f = [],\n g = [];\n this.mE2EInst.getE2EelmsID(a, d, e, 1);\n this.mE2EInst.getE2EelmsID(a, f, g, 2);\n a = { ids1: d.join(','), names1: e.join(','), ids2: f.join(','), names2: g.join(',') };\n this._e2edata(a, b, c);\n }\n },\n setE2EData: function (a, b, c, d) {\n null == c && (c = !0);\n null == d && (d = '');\n var e = $_astxu.getnc(b.e2e_data1);\n 0 < e.length && ($_astxu.getCreatedFormValue(a, 'e2e_data1').value = e);\n b = $_astxu.getnc(b.e2e_data2);\n 0 < b.length && ($_astxu.getCreatedFormValue(a, 'e2e_data2').value = b);\n 1 == c && this.mE2EInst.resetE2Evalues($_astxu.getnc(a.name), d);\n },\n getE2EPageID: function () {\n return $ASTX2_CONST.PAGEID;\n },\n getE2EInputID: function (a) {\n a = this.mE2EInst.getE2Eattribute(a);\n return null == a ? null : a.e2e_inputid;\n },\n getE2EHash: function (a, b) {\n this.mE2EInst.getE2EHash(a, function (a, d) {\n b(a, d);\n });\n },\n getEncText: function (a, b, c) {\n this.mE2EInst.getEncText(a, b, function (a, b, f) {\n c(b, f);\n });\n },\n getE2EText: function (a, b) {\n this.mE2EInst.getE2EText(a, function (a, d, e) {\n b(d, e);\n });\n },\n getE2ETextS: function (a, b) {\n for (var c = 0, d = 0, e = [], f = 0; f < a.length; f++) {\n var g = a[f];\n null != g && ((g = g.getAttribute('e2e_type')), null != g && g == $ASTX2_CONST.E2ETYPE_PLAIN2 && c++);\n }\n if (0 == c || c != a.length) b(e, $ASTX2_CONST.ERROR_PARAM);\n else\n for (f = 0; f < a.length; f++)\n this.mE2EInst.getE2EText(a[f], function (a, f, g) {\n d >= c || (0 == g ? (e[a] = f) : (d = c), ++d >= c && b(e, g));\n });\n },\n setE2EText: function (a, b) {\n this.mE2EInst.setE2EText(a, b);\n },\n clearE2EText: function (a, b) {\n this.mE2EInst.clearE2EText(a, b);\n },\n clearE2EForm: function (a) {\n for (var b = document.getElementsByTagName('input'), c = 0; c < b.length; c++) {\n var d = b[c];\n null != d &&\n d.form.name == a &&\n 0 != ('text' == d.type || 'password' == d.type) &&\n null != d.getAttribute('e2e_type') &&\n this.mE2EInst.clearE2EText(d);\n }\n },\n addE2EObject: function (a, b) {\n null == b && (b = $ASTX2_CONST.E2ETYPE_CERT1);\n !a || ('text' != a.type && 'password' != a.type) || (a.setAttribute('e2e_type', b), this.mE2EInst.addObject(a));\n },\n subE2EObject: function (a) {\n a && this.mE2EInst.subObject(a);\n },\n setE2EAllExceptInputs: function () {\n for (var a = document.getElementsByTagName('input'), b = 0; b < a.length; b++) {\n var c = a[b];\n null != c &&\n 0 != ('text' == c.type || 'password' == c.type) &&\n null == c.getAttribute('e2e_type') &&\n c.setAttribute('e2e_type', $ASTX2_CONST.E2ETYPE_NONE);\n }\n },\n killFocusE2EAllInputs: function () {\n for (var a = document.getElementsByTagName('input'), b = 0; b < a.length; b++) {\n var c = a[b];\n null != c && 0 != ('text' == c.type || 'password' == c.type) && 0 < c.getAttribute('e2e_type') && c.blur();\n }\n },\n _pclogdata_get: function (a, b, c, d) {\n var e = this;\n c = {\n ver: $_astxu.getint(c.ver),\n alg: $_astxu.getint(c.alg),\n svr: $_astxu.getnc(c.svr),\n norsa: $_astxu.getint(c.norsa),\n uniq: $_astxu.getnc(c.uniq),\n utime: $_astxu.getint(c.utime),\n nlog: $_astxu.getnc(c.nlog),\n ipaddr: $_astxu.getnc(c.ipaddr),\n s2c_alg: $_astxu.getnc(c.s2c_alg),\n s2c_key: $_astxu.getnc(c.s2c_key),\n s2c_salt: $_astxu.getnc(c.s2c_salt),\n browser: $ASTX2_CONST.BROWSER_VER,\n pageid: $ASTX2_CONST.PAGEID,\n opt: d\n };\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/get_pclog',\n data: c,\n timeout: 1e4,\n onSuccess: function (c) {\n var d = $_astxu.getnc(c ? c.result : '');\n $_astxu.isACK(d) ? a(c) : (e.setLastError($ASTX2_CONST.ERROR_NCK), b());\n },\n onFailure: function () {\n e.setLastError($ASTX2_CONST.ERROR_FAILED);\n b();\n }\n });\n },\n _pclogdata: function (a, b, c) {\n var d = this;\n $_astxu.sendAuthAjax({\n url: $ASTX2_CUST.getURL($ASTX2_CUST.URL_GET_CERT),\n data: { pclog: 1, client_public_key: $ASTX2_COMM.mClientPublicKey },\n onSuccess: function (e) {\n var f = $_astxu.jsonParse(e);\n e = $_astxu.getnc(f ? f.result : '');\n 0 == $_astxu.isACK(e)\n ? (d.setLastError($ASTX2_CONST.ERROR_NCK), b())\n : d.set_cert(\n function () {\n d._pclogdata_get(a, b, f, c);\n },\n function () {\n d.setLastError($ASTX2_CONST.ERROR_NOCONNECT);\n b();\n },\n f\n );\n },\n onFailure: function (a) {\n d.setLastError($ASTX2_CONST.ERROR_FAILED);\n b();\n }\n });\n },\n getPCLOGData: function (a, b, c, d) {\n null == d && (d = '');\n this.setLastError($ASTX2_CONST.ERROR_SUCCESS);\n 0 == $ASTX2_COMM.isEnable() ? (this.setLastError($ASTX2_CONST.ERROR_NOINIT), c()) : this._pclogdata(b, c, d);\n },\n getPCLOGDataRetry: function (a, b, c, d, e) {\n null == d && (d = 3);\n null == e && (e = 1e3);\n if (0 >= d) this.setLastError($ASTX2_CONST.ERROR_EXCESS), c();\n else {\n var f = this;\n this.getPCLOGData(\n a,\n function (a) {\n b(a);\n },\n function () {\n f.getLastError() == $ASTX2_CONST.ERROR_NOINIT\n ? window.setTimeout(function () {\n f.getPCLOGDataRetry(a, b, c, d - 1, e);\n }, e)\n : c();\n }\n );\n }\n },\n setPCLOGData: function (a, b) {\n var c = $_astxu.getnc(b.pclog_data);\n 0 < c.length && ($_astxu.getCreatedFormValue(a, 'pclog_data').value = c);\n },\n isVmEnv: function (a, b) {\n 0 == $ASTX2_COMM.isEnable()\n ? a(null, $ASTX2_CONST.ERROR_NOINIT)\n : (null == b && (b = ''),\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/is_vm_env',\n data: { opts: b },\n onSuccess: function (b) {\n var d = $_astxu.getnc(b ? b.result : '');\n $_astxu.isACK(d) ? a(b.vm_env, $ASTX2_CONST.ERROR_SUCCESS) : a(null, $ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n a(null, $ASTX2_CONST.ERROR_FAILED);\n }\n }));\n },\n isRemoteEnv: function (a, b) {\n 0 == $ASTX2_COMM.isEnable()\n ? a(null, $ASTX2_CONST.ERROR_NOINIT)\n : (null == b && (b = ''),\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/is_remote_env',\n data: { opts: b },\n onSuccess: function (b) {\n var d = $_astxu.getnc(b ? b.result : '');\n $_astxu.isACK(d) ? a(b.remote_env, $ASTX2_CONST.ERROR_SUCCESS) : a(null, $ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n a(null, $ASTX2_CONST.ERROR_FAILED);\n }\n }));\n },\n isVmRemoteEnv: function (a, b) {\n 0 == $ASTX2_COMM.isEnable()\n ? a(null, $ASTX2_CONST.ERROR_NOINIT)\n : (null == b && (b = ''),\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/is_vm_remote_env',\n data: { opts: b },\n onSuccess: function (b) {\n var d = $_astxu.getnc(b ? b.result : '');\n $_astxu.isACK(d) ? a(b.vm_remote_env, $ASTX2_CONST.ERROR_SUCCESS) : a(null, $ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n a(null, $ASTX2_CONST.ERROR_FAILED);\n }\n }));\n },\n checkService: function (a, b) {\n a == $ASTX2_CONST.SERVICE_AK && this.mE2EInst.checkService(b);\n },\n setProtect: function (a, b) {\n if (0 == $ASTX2_COMM.isEnable()) b && b($ASTX2_CONST.ERROR_NOINIT);\n else {\n var c = {\n customerid: $_astxu.getnc($ASTX2_CUST.mCustomerID),\n ak: a & $ASTX2_CONST.PROTECT_AK ? 1 : -1,\n fw: a & $ASTX2_CONST.PROTECT_FW ? 1 : -1,\n pb: a & $ASTX2_CONST.PROTECT_PB ? 1 : -1,\n pcs: a & $ASTX2_CONST.PROTECT_PCS ? 1 : -1\n };\n $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/set_protect',\n data: c,\n onSuccess: function (a) {\n a = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(a) ? b && b($ASTX2_CONST.ERROR_SUCCESS) : b && b($ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n b && b($ASTX2_CONST.ERROR_FAILED);\n }\n });\n }\n },\n isNotSupportOS: function (a, b) {\n 0 == $ASTX2_COMM.isEnable()\n ? b && b(null, $ASTX2_CONST.ERROR_NOINIT)\n : $_astxu.sendJsonp({\n url: $ASTX2_COMM.mLocalServerURL + '/is_not_support_os',\n data: {\n ak: a & $ASTX2_CONST.PROTECT_AK ? 1 : 0,\n fw: a & $ASTX2_CONST.PROTECT_FW ? 1 : 0,\n pb: a & $ASTX2_CONST.PROTECT_PB ? 1 : 0,\n pcs: a & $ASTX2_CONST.PROTECT_PCS ? 1 : 0\n },\n onSuccess: function (a) {\n var d = $_astxu.getnc(a ? a.result : '');\n $_astxu.isACK(d) ? b && b(a, $ASTX2_CONST.ERROR_SUCCESS) : b && b(null, $ASTX2_CONST.ERROR_NCK);\n },\n onFailure: function () {\n b && b(null, $ASTX2_CONST.ERROR_FAILED);\n }\n });\n },\n isAccessible: function (a, b, c, d, e) {\n null == e && (e = 750);\n if (a == $ASTX2_CONST.REQUEST_JSONP)\n $_astxu.sendJsonp({\n url: b,\n nocallback: !0,\n timeout: e,\n onSuccess: function () {\n c && c(b);\n },\n onFailure: function () {\n d && d(b);\n }\n });\n else {\n if (\n 0 != b.indexOf(window.location.protocol + '//' + window.location.host) &&\n 'IE' == $ASTX2_CONST.BROWSER_TYPE\n ) {\n if ('IE10' != $ASTX2_CONST.BROWSER_VER && 'IE11' != $ASTX2_CONST.BROWSER_VER) {\n d && d(b, 'CORS, not allowed browser');\n return;\n }\n if (0 != b.indexOf('http:') && 0 != b.indexOf('https:')) {\n d && d(b, 'CORS, not allowed protocol');\n return;\n }\n }\n $_astxu.sendAjax({\n url: b,\n type: 'GET',\n timeout: e,\n onSuccess: function (a) {\n c && c(b);\n },\n onFailure: function (a) {\n d && d(b, a);\n }\n });\n }\n },\n uninit: function () {\n this.uninitE2E();\n $ASTX2_COMM.uninit();\n },\n setLastError: function (a) {\n this.mLastError = a;\n },\n getLastError: function () {\n return this.mLastError;\n }\n };\n$ASTX2_MLi = {\n init: function () {\n setTimeout(function () {\n var a = { pageid: $ASTX2_CONST.PAGEID, focus: $_astxu.hasFocused() ? 1 : 0 };\n $_astxu.sendJsonp({ url: $ASTX2_COMM.mLocalServerURL + '/initForML', timeout: 1e3, data: a });\n }, 200);\n }\n};\n\nwindow.$ASTX2 = {\n ...$ASTX2,\n $ASTX2_COMM,\n $_astxu,\n $ASTX2_E2E,\n $ASTX2_MLi\n};\n\n/* ASTx 1.3 | (C) Copyright AhnLab, Inc. | $Revision: 30833 $ */\nconst getSubdomain = (hostname) => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nconst getEnvironmentFromHostname = (hostname) => {\n const debugModeEnv = getAstx2CookieFromDsp('dsp-debug-mode-env')?.toLowerCase();\n if (debugModeEnv) {\n return debugModeEnv;\n }\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost:')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\nconst getServicePath = () => {\n if (typeof window.isStorybookEnv === 'boolean') {\n return '';\n } else {\n return `/${location.pathname.split('/')[1]}`;\n }\n};\n\nconst getApiHostNameFromEnvironment = (currentHostname) => {\n const environment = getEnvironmentFromHostname(currentHostname);\n\n switch (environment) {\n case 'dev':\n return `https://nxl-dsp-dev.hanwhalife.com`;\n\n case 'local':\n return `${getServicePath()}`;\n case 'stg':\n return `https://nxl-dsp-stg.hanwhalife.com`;\n\n case 'prd':\n return `https://nxl-dsp.hanwhalife.com`;\n\n default:\n console.warn('DSP API environment is not defined');\n\n return '';\n }\n};\n","/* ASTx 1.3 | (C) Copyright AhnLab, Inc. | $Revision: 30833 $ */\r\n/* eslint-disable */\r\n\r\nlet $ASTX2_CUST = {\r\n // Customer option\r\n /*\r\n\tmUseJQuery: false, \t// Whether to use JQuery.\t\r\n\tmUseAjaxHello: false,\r\n\tmUseAutoStart: false, \r\n\tE2EFORM_TAIL: true,\r\n\tE2EFORM_INIT: '_e2e_forminit',\r\n\tE2EFORM_TAG1: '_e2e_1__',\r\n\tE2EFORM_TAG2: '_e2e_2__',\r\n\tE2EFORM_TAG1_PWD: '_e2e_1_pwd__',\r\n\tE2EFORM_TAG2_PWD: '_e2e_2_pwd__',\r\n\t*/\r\n\r\n mCustomerID: null, // Customer ID for setProtect.\r\n\r\n // ASTX2_CUST defined values\r\n URL_GET_INIT: 101,\r\n URL_GET_CERT: 102,\r\n URL_GET_STAMP: 103,\r\n URL_CHK_STAMP: 104,\r\n\r\n setCustomerID(customerID) {\r\n if (customerID !== null && customerID !== 'undefined') {\r\n this.mCustomerID = customerID;\r\n }\r\n },\r\n\r\n getURL(type) {\r\n let result = '';\r\n const timestamp = new Date().getTime();\r\n const hostname = location.hostname;\r\n switch (type) {\r\n case this.URL_GET_INIT:\r\n result = `${getApiHostNameFromEnvironment(hostname)}/api/dea/sltn/astx2/init/get`;\r\n break;\r\n case this.URL_GET_CERT:\r\n result = `${getApiHostNameFromEnvironment(hostname)}/api/dea/sltn/astx2/cert/get?v=${timestamp}`; // WAF 차단 방지 (post 요청 시 값이 없는 경우 차단)\r\n break;\r\n case this.URL_GET_STAMP:\r\n result = `${getApiHostNameFromEnvironment(hostname)}/api/dea/sltn/astx2/stamp/get`;\r\n break;\r\n case this.URL_CHK_STAMP:\r\n result = `${getApiHostNameFromEnvironment(hostname)}/api/dea/sltn/astx2/stamp-chk/post`;\r\n break;\r\n } // end of switch\r\n\r\n return result;\r\n },\r\n\r\n isE2EObject(obj) {\r\n return false;\r\n },\r\n\r\n getE2Etype(obj) {\r\n return null;\r\n },\r\n\r\n onCreatedFormValue(obj, obj_name) {},\r\n\r\n onHandlerPreFocus(obj, event) {},\r\n\r\n onHandlerKeyDown(obj, event) {\r\n return true;\r\n },\r\n\r\n getErrorMessage(errno) {\r\n let message = '[ASTx] ';\r\n\r\n switch (errno) {\r\n case $ASTX2_CONST.ERROR_FAILED:\r\n message += '내부 오류가 발생하였습니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NOINIT:\r\n message += '초기화가 필요합니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NOTINST:\r\n message += '설치되어 있지 않습니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NOTSUPPORTED:\r\n message += '지원하지 않는 OS입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NOCONNECT:\r\n message += '서버(Web) 통신 실패입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NCK:\r\n message += '서버(Local) 응답 실패입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_ERR:\r\n message += '서버(Local) 내부 오류입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NSP:\r\n message += '지원하지 되지 않는 환경입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_PARAM:\r\n message += '잘못된 인자입니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_EXCESS:\r\n message += '재시도 회수를 초과 하였습니다.';\r\n break;\r\n case $ASTX2_CONST.ERROR_NEEDUPDATE:\r\n message += '제품 업데이트가 필요합니다.';\r\n break;\r\n default:\r\n message += `errno=${errno}`;\r\n break;\r\n } // end of switch\r\n\r\n return message;\r\n },\r\n\r\n errorAbort(errno) {\r\n alert(this.getErrorMessage(errno));\r\n }\r\n};\r\n","type ASTXWindow = Window & {\n $ASTX2: any;\n};\n\ndeclare const window: ASTXWindow;\n\nimport astx2ScriptContent from './astx2/astx2.min.js';\nimport astx2ScriptCustomContent from './astx2/astx2_custom.js';\n\n/**\n * element를 동적으로 추가하는 경우 사용.\n * @param el HTMLElement\n * @param e2e_type string\n */\nexport function addE2EObject(el: HTMLElement, e2e_type?: string) {\n if (window.$ASTX2) {\n window.$ASTX2.addE2EObject(el, e2e_type);\n window.$ASTX2.resetE2E();\n }\n}\n\nexport function hasAstx2() {\n return !!window.$ASTX2;\n}\n\ninterface Astx2Init {\n initSuccess?: () => void;\n initFailure?: () => void;\n checkServerSuccess?: () => void;\n checkServerFailure?: () => void;\n}\n\nexport const loadScript = (callback?: () => void) => {\n if (!window.$ASTX2) {\n console.log('dynamic load');\n const script = document.createElement('script');\n script.innerHTML = `\n ${astx2ScriptContent} \n ${astx2ScriptCustomContent}\n `;\n\n document.head.appendChild(script);\n\n script.onload = () => {\n callback && callback();\n };\n }\n};\n\nconst init = ({\n initSuccess = () => {\n /* empty */\n },\n initFailure = () => {\n /* empty */\n },\n checkServerSuccess = () => {\n /* empty */\n },\n checkServerFailure = () => {\n /* empty */\n }\n}: Astx2Init = {}) => {\n window.$ASTX2.init(\n () => {\n window.$ASTX2.initE2E();\n window.$ASTX2.checkServer(\n () => {\n checkServerSuccess();\n },\n () => {\n checkServerFailure();\n console.error(`ASTX.checkServer() onFailure: errno=${window.$ASTX2.getLastError()}`);\n }\n );\n initSuccess();\n },\n () => {\n initFailure();\n if (window.$ASTX2.getLastError() === 103) {\n console.error('AhnLab Safe Transaction 클라이언트가 설치되지 않았습니다.');\n } else {\n console.error(`$ASTX2.init() onFailure: errno=${window.$ASTX2.getLastError()}`);\n }\n }\n );\n};\n\n/**\n * @description 페이지진입후 최초 실행\n */\nexport const initASTX2 = ({\n initSuccess = () => {\n /* empty */\n },\n initFailure = () => {\n /* empty */\n },\n checkServerSuccess = () => {\n /* empty */\n },\n checkServerFailure = () => {\n /* empty */\n }\n}: Astx2Init = {}) => {\n if (window.$ASTX2) {\n init({\n initSuccess,\n initFailure,\n checkServerSuccess,\n checkServerFailure\n });\n }\n};\n\n/**\n * form객체로 감싸진 html input이 아닌 개별 input을 컨트롤\n * id기반으로 데이터접근\n * @param ids string[]\n * @param onSuccess\n * @param onFailure\n */\nexport function getE2EDataIDs(ids: string[], onSuccess: (astx_data: any) => void, onFailure: () => void = () => {}) {\n if (window.$ASTX2) {\n window.$ASTX2.getE2EDataIDs(\n ids,\n async (astx_data: any) => {\n /**\n * 성공시 데이터 세팅\n */\n onSuccess(astx_data);\n },\n () => {\n onFailure();\n console.log(`ASTX.getE2EData() onFailure: errno=${window.$ASTX2.getLastError()}`);\n }\n );\n }\n}\n","import dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\n\n/*****************************\n * 날짜 관련 유틸\n ******************************/\ndayjs.locale('ko');\ndayjs.extend(customParseFormat);\n\n/**\n *\n * @param year\n * @param month\n * @returns\n */\nexport function getLastDay(year: number, month: number) {\n switch (month) {\n case 2:\n return year % 4 === 0 ? 29 : 28;\n case 4:\n case 6:\n case 9:\n case 11:\n return 30;\n default:\n return 31;\n }\n}\n\n/**\n * 한달뒤 날짜를 포맷형태로 리턴\n * @param 20200101 or 2020.01.01\n * @param 'YYYY.MM.DD'\n * @returns\n */\nexport const getOneMonthLater = (value?: string, format?: string): string => {\n const str = value ? value.split('.').join('') : '';\n const date = value\n ? new Date(Number(str.substring(0, 4)), Number(str.substring(4, 6)) - 1, Number(str.substring(6, 8)))\n : new Date();\n try {\n return dayjs(new Date(date.setMonth(date.getMonth() + 1))).format(format || 'YYYY.MM.DD');\n } catch (err) {\n console.warn(err);\n\n return '';\n }\n};\n\n/**\n * 날짜 차이를 구한다. 포맷에 맞지 않으면 Not a Number 리턴\n * @param date1 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @param date2 (yyyymmdd or yyyy.mm.dd or yyyy-mm-dd)\n * @returns date1 - date2\n */\nexport const getDateDiff = (\n date1: string | number | dayjs.Dayjs | Date,\n date2: string | number | dayjs.Dayjs | Date\n): number => {\n const diff1 = dayjs(date1);\n const diff2 = dayjs(date2);\n\n /** diff1 - diff2: 현재: 0 */\n return diff1.diff(diff2, 'day');\n};\n\n/**\n * 입력되어진 생년월일 값이 당일 기준으로 미래시점인 경우 false를 반환합니다. (회원체계 기준 9, 0 일 경우 오류)\n * @param front 주민등록번호 앞 6자리\n * @param back 주민등록번호 뒤 첫자리\n * @returns boolean\n */\nexport const validateBirthdate = (front: string, back: string) => {\n const year = parseInt(front.slice(0, 2));\n const month = parseInt(front.slice(2, 4));\n const day = parseInt(front.slice(4, 6));\n let birthYear = 0;\n\n switch (back) {\n case '1':\n case '2':\n case '5':\n case '6':\n birthYear = 1900 + year;\n break;\n case '3':\n case '4':\n case '7':\n case '8':\n birthYear = 2000 + year;\n break;\n case '9':\n case '0':\n // birthYear = 1800 + year;\n return false;\n default:\n return false;\n }\n\n const birthdate = new Date(birthYear, month - 1, day);\n const currdate = new Date();\n\n return birthdate < currdate;\n};\n\n/**\n * 목표 날짜가 비교 날짜 이후 인지 확인하는 함수 (YYYYMMDD 형식)\n * @param targetDate\n * @param compareDate\n * @returns boolean\n */\nexport function isDateAfter(\n targetDate: string | number | dayjs.Dayjs | Date,\n compareDate: string | number | dayjs.Dayjs | Date\n) {\n const targetDateTime = new Date(convertDateFormat(targetDate, 'YYYY-MM-DD')).getTime();\n const compareDateTime = new Date(convertDateFormat(compareDate, 'YYYY-MM-DD')).getTime();\n\n return targetDateTime > compareDateTime;\n}\n\n/**\n * 날짜를 포맷형태로 리턴\n * @param 20200101 string\n * @param 'YYYY.MM.DD\n * @returns 포맷화된 날짜\n */\nexport const convertDateFormat = (value?: string | number | dayjs.Dayjs | Date, format?: string): string => {\n if (!value) {\n return '';\n }\n\n return dayjs(value).format(format || 'YYYY.MM.DD');\n};\n\n/**\n * 주어진 날짜가 오늘 날짜 이후인지 확인합니다.\n *\n * @param {string} dateString - 확인할 날짜 문자열입니다.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 주어진 날짜가 오늘 이후라면 true를 반환합니다.\n */\nexport const isFutureDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const today = dayjs().startOf('day');\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid() && date.isAfter(today);\n};\n\n/**\n * 자주 사용하는 타입들 추가해두었습니다. 필요하신 형태 있으면 추가해주세요.\n */\nexport type DateFormat =\n | 'YYYY-MM-DD'\n | 'YYYY.MM.DD'\n | 'YYYY-MM'\n | 'YYYY-MM-DD HH:mm:ss'\n | 'YYYY.MM.DD HH:mm:ss'\n | 'YYYY-MM-DD HH:mm'\n | 'YYYYMMDD'\n | 'YYYY.M.D'\n | 'YYYY.M'\n | 'YYYY.MM.DD(dd) HH:mm:ss'\n | 'HH:mm:ss'\n | 'YYYY.M.D(dd)'\n | 'HH:mm';\n\ninterface Props {\n /** 날짜 문자열 */\n dateString: string | number | Date | dayjs.Dayjs;\n /** 현재 날짜 포맷 */\n fromFormat?: string;\n /** 컨버팅할 날짜 포맷 */\n toFormat: string;\n}\n\n/**\n * date string 을 입력받고 패턴에 맞게 포맷팅을 변경하는 유틸 함수\n * fromFormat 현재 날짜 포맷\n * toFormat 리턴 날짜 포맷\n */\nexport const convertDateString = ({ dateString, fromFormat, toFormat }: Props) => {\n return dayjs(dateString, fromFormat).format(toFormat);\n};\n\nexport const isDate = (value: unknown) => {\n return value instanceof Date && !isNaN(+value);\n};\n\n/**\n * 날짜 유효성 검사\n *\n * @param {string} dateString - 검사할 날짜 문자열.\n * @param {dayjs.OptionType} [format] - 날짜 문자열의 형식입니다.\n * @returns {boolean} - 유효한 날짜이면 true를 반환하고, 그렇지 않으면 false를 반환합니다.\n */\nexport const isValidDate = (dateString?: string | number | dayjs.Dayjs | Date, format?: dayjs.OptionType) => {\n if (!dateString) {\n return false;\n }\n\n const date = dayjs(dateString, format || 'YYYYMMDD', true);\n\n return date.isValid();\n};\n\nexport type PeriodType =\n | 'thisWeek'\n | 'lastWeek'\n | 'last7Days'\n | 'thisMonth'\n | 'lastMonth'\n | 'last365Days'\n | 'week'\n | 'month'\n | 'today';\n/**\n * @description\n * today 당일\n * week 7일: 오늘 기준 7일 전\n * month 30: 오늘 기준 30일 전\n * thisWeek 이번 주 (일요일 ~ 토요일)\n * lastWeek 지난 주 (일요일 ~ 토요일)\n * last7Days 최근 7일 (오늘 포함)\n * thisMonth 이번 달 (1일 ~ 말일)\n * lastMonth 지난 달 (1일 ~ 말일)\n * last365Days 최근 365일 (오늘 포함)\n * @param periodType\n * @returns\n */\nexport const getPeriodDate = (periodType: PeriodType | 'today') => {\n const lastMonth = dayjs().subtract(1, 'M');\n\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n\n const endDate = new Date(today);\n let startDate: Date;\n\n switch (periodType) {\n case 'today':\n // 당일\n startDate = new Date(today);\n\n return { startDate, endDate };\n\n case 'week':\n // 7일: 오늘 기준 7일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 6);\n\n return { startDate, endDate };\n case 'month':\n // 30일: 오늘 기준 30일 전\n startDate = new Date(today);\n startDate.setDate(startDate.getDate() - 29);\n\n return { startDate, endDate };\n\n case 'thisWeek':\n // 이번 주 (일요일 ~ 토요일)\n return { startDate: dayjs().day(0).toDate(), endDate: dayjs().day(6).toDate() };\n case 'lastWeek':\n // 지난 주 (일요일 ~ 토요일)\n return {\n startDate: dayjs().subtract(1, 'w').day(0).toDate(),\n endDate: dayjs().subtract(1, 'w').day(6).toDate()\n };\n case 'last7Days':\n // 최근 7일 (오늘 포함)\n return { startDate: dayjs().subtract(7, 'd').toDate(), endDate: dayjs().toDate() };\n case 'thisMonth':\n // 이번 달 (1일 ~ 말일)\n return {\n startDate: dayjs().date(1).toDate(),\n endDate: dayjs().date(dayjs().daysInMonth()).toDate()\n };\n case 'lastMonth':\n // 지난 달 (1일 ~ 말일)\n return {\n startDate: lastMonth.date(1).toDate(),\n endDate: lastMonth.date(lastMonth.daysInMonth()).toDate()\n };\n case 'last365Days':\n // 최근 365일 (오늘 포함)\n return { startDate: dayjs().subtract(365, 'd').toDate(), endDate: dayjs().toDate() };\n default:\n return null;\n }\n};\n","import React from 'react';\n\nexport const charFilterEng = (value: string) => value.replace(/[^a-zA-Z]/g, '');\nexport const charFilterKor = (value: string) => value.replace(/[^\\uAC00-\\uD7AF]/g, '');\n\n/**\n * 영문+한글포함 N글자 이상 입력시 트리거 발생\n */\nexport function isOverCharCount(value: string, count: number) {\n // value에서 한글만 추출\n const hangulLength = charFilterKor(value).length;\n\n // value에서 영문만 추출\n const englishLength = charFilterEng(value).length;\n\n //영문 한글 조합일때, count 이상 일경우, 트리거 발생\n if (hangulLength + englishLength >= count) {\n return true;\n }\n\n return false;\n}\n\n/**\n * 배열 keys에 포함된 key를 입력시 true 리턴\n * @param event React.KeyboardEvent<HTMLInputElement>\n * @param keys React.KeyboardEvent<HTMLInputElement>['key'][]\n * @returns boolean\n */\nexport function checkKeys(event: React.KeyboardEvent<HTMLInputElement>, keys: React.KeyboardEvent<HTMLInputElement>['key'][]) {\n if (keys.includes(event.key)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Enter 키 입력시 트리거 발생\n * 일반 엔터키 + numberpad 엔터키\n */\nexport function isEnter(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Enter']) || event.code === 'NumpadEnter') {\n return true;\n }\n\n return false;\n}\n\n\n/**\n * Backspace 키 입력시 트리거 발생\n */\nexport function isBackspace(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Backspace'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowUp 키 입력시 트리거 발생\n */\nexport function isArrowUp(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowUp'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowDown 키 입력시 트리거 발생\n */\nexport function isArrowDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowDown'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowLeft 키 입력시 트리거 발생\n */\nexport function isArrowLeft(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowLeft'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * ArrowRight 키 입력시 트리거 발생\n */\nexport function isArrowRight(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['ArrowRight'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Tab 키 입력시 트리거 발생\n */\nexport function isTab(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Tab'])) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Escape 키 입력시 트리거 발생\n */\nexport function isEscape(event: React.KeyboardEvent<HTMLInputElement>) {\n if (checkKeys(event, ['Escape'])) {\n return true;\n }\n\n return false;\n}\n\n\n/**\n * 한글 N글자 이상 입력시 트리거 발생\n */\nexport function isOverKorCharCount(value: string, count: number) {\n //value에서 한글만 추출\n const hangulLength = charFilterKor(value).length;\n\n //한글 count 초과 일경우, 트리거 발생\n if (hangulLength > count) {\n return true;\n }\n\n return false;\n}\n\n\n\n/**\n * 영문 N글자 이상 입력시 트리거 발생\n */\nexport function isOverEngCharCount(value: string, count: number) {\n\n //value에서 영문만 추출\n const englishLength = charFilterEng(value).length;\n\n //영문 count 초과 일경우, 트리거 발생\n if (englishLength > count) {\n return true;\n }\n\n return false;\n}\n","import { GenderCode } from \"../types/common.types\";\n\nexport const GENDER_LABEL_MAP = {\n '1': '남성',\n '2': '여성',\n '3': '남성',\n '4': '여성',\n '5': '남성',\n '6': '여성',\n '7': '남성',\n '8': '여성'\n} as const;\n\nexport const getGenderName = (genderCode?: GenderCode) => {\n return genderCode ? GENDER_LABEL_MAP[genderCode] : '';\n};\n","import { base64ToBlob } from \"./file-utils\";\n\nexport const getBlobUrl = async (url: string) => {\n let downloadUrl = '';\n\n if (url.startsWith('http')) {\n //url type : http, https\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download ${url}`);\n }\n const blob = await response.blob();\n downloadUrl = window.URL.createObjectURL(blob);\n } else if (url.startsWith('blob')) {\n //url type : blob\n downloadUrl = url;\n } else if (url.startsWith('data')) {\n //url type : data\n downloadUrl = URL.createObjectURL(base64ToBlob(url));\n } else {\n //unknown type\n throw new Error(`unknown type : ${url}`);\n }\n\n return downloadUrl;\n};\nexport const downloadFromNewWindow = async (url: string, fileName: string) => {\n try {\n const aTag = document.createElement('a');\n const downloadUrl = await getBlobUrl(url);\n aTag.href = downloadUrl;\n aTag.download = fileName;\n const newWin = window.open();\n newWin?.document.body.appendChild(aTag);\n aTag.click();\n aTag.remove();\n window.URL.revokeObjectURL(downloadUrl);\n } catch (e) {\n console.error(e);\n throw e;\n }\n};\n\n/**\n * 파일 다운로드 헬퍼 함수\n */\nexport const downloadFromCurrentWindow = async (url: string, fileName: string) => {\n try {\n const a = document.createElement('a');\n const downloadUrl = await getBlobUrl(url);\n a.href = downloadUrl;\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n a.remove();\n window.URL.revokeObjectURL(downloadUrl);\n } catch (e) {\n console.error(e);\n throw e;\n }\n};\n","(function (w, d, s, l, i) {\n w[l] = w[l] || [];\n w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });\n let f = d.getElementsByTagName(s)[0],\n j = d.createElement(s),\n dl = l !== 'dataLayer' ? `&l=${l}` : '';\n j.async = true;\n j.src = `https://www.googletagmanager.com/gtm.js?id=${i}${dl}`;\n f.parentNode.insertBefore(j, f);\n})(window, document, 'script', 'dataLayer', 'GTM-PPT3LJ56');\n","import { isClient } from '../environment-utils.js';\n\nimport gaScript from './ga.js';\n\nexport const loadGaScript = () => {\n if (isClient()) {\n //이미 로드된 경우 return\n if (document.querySelector('script[src*=\"googletagmanager.com/gtm.js\"]')) {\n return;\n }\n console.log('ga script load dynamic');\n const script = document.createElement('script');\n script.innerHTML = `\n ${gaScript}\n `;\n document.head.appendChild(script);\n\n }\n}"]}