@ihabdevteam/core 0.163.0 → 0.164.0

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.
@@ -458,6 +458,9 @@ export declare interface BarData {
458
458
  isToday?: boolean;
459
459
  parts?: number[];
460
460
  partsB?: number[];
461
+ /** 아직 오지 않은 칸 — 막대를 그리지 않고 글씨를 흐리게, 평균·합계에서 뺀다.
462
+ * `a === -1` 이 같은 뜻의 옛 표시인데, **음수가 값인 차트**(baseline)에서는 −1 이 진짜 값일 수 있어 이 칸을 쓴다. */
463
+ future?: boolean;
461
464
  }
462
465
 
463
466
  /**
@@ -1013,6 +1016,8 @@ export declare interface ChartPoint {
1013
1016
  b: number;
1014
1017
  parts?: number[];
1015
1018
  partsB?: number[];
1019
+ /** 아직 오지 않은 날 — `a === -1` 과 같은 뜻이고, 음수를 값으로 쓰는 차트(baseline)에서는 이쪽을 쓴다. */
1020
+ future?: boolean;
1016
1021
  }
1017
1022
 
1018
1023
  /**
@@ -1500,7 +1505,7 @@ export declare function copyText(text: string): Promise<boolean>;
1500
1505
  *
1501
1506
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
1502
1507
  */
1503
- export declare const CORE_VERSION = "0.163.0";
1508
+ export declare const CORE_VERSION = "0.164.0";
1504
1509
 
1505
1510
  /** @public */
1506
1511
  declare const coreDefault: Record<string, unknown>;
@@ -16,24 +16,31 @@ import { useBarChartControl } from './useBarChartControl';
16
16
  // ─── 막대 렌더링 원시 컴포넌트 ───────────────────────────────────
17
17
  /** 막대 값 — 수가 아니면(undefined·NaN·Infinity) 0 */
18
18
  const 수 = (v) => (typeof v === 'number' && Number.isFinite(v) ? v : 0);
19
+ /** 아직 오지 않은 칸인가 — 옛 표시(a === -1)와 새 표시(future)를 함께 본다.
20
+ * 음수가 값인 차트(baseline)에서는 −1 이 진짜 값일 수 있어 `future` 를 쓴다. */
21
+ function 미래칸(d, 옛표시 = true) {
22
+ /* `baseline` 을 쓰는 차트는 −1 이 진짜 값이라 옛 표시를 보지 않는다 — 부르는 쪽이 옛표시=false 로 끈다 */
23
+ return d.future === true || (옛표시 && d.a === -1);
24
+ }
19
25
  function BarChartCanvas({ data, colorA, colorB, labelA, labelB, barWidth = 10, barGap = 1, height = 140, maxOverride, tightMax, seriesColors, seriesLabels, rateLabels, grouped = false, baseline }) {
20
26
  // colorB 미지정 시 단일 계열(A) 모드
21
27
  const single = !colorB;
22
28
  const stacked = !!(seriesColors && seriesColors.length > 0);
23
29
  /* 값이 비었거나(undefined) 수가 아니면 0 으로 친다. 두 계열인데 한 항목의 `b` 가 비면 Math.max 가 NaN 이 되고
24
30
  `NaN || 10` 으로 y축이 데이터와 상관없이 10 에 박혀 막대가 판 위로 넘쳤다(ihab-core-96 이 짚음). */
31
+ /* 기준선 모드에서는 옛 미래 표시(a === -1)를 보지 않는다 — −1 이 진짜 값이다 */
32
+ const 기준 = baseline;
25
33
  const maxVal = useMemo(() => stacked
26
- ? Math.max(0, ...data.filter(d => d.a !== -1).map(d => grouped
34
+ ? Math.max(0, ...data.filter(d => !미래칸(d, 기준 == null)).map(d => grouped
27
35
  /* 나란히 서면 가장 높은 **낱 막대**가 위를 정한다 — 합으로 잡으면 막대가 판의 몇 분의 일로 눌린다 */
28
36
  ? Math.max(0, ...(d.parts ?? []).map(수))
29
37
  : (d.parts ?? []).reduce((s, v) => s + Math.max(0, 수(v)), 0)))
30
- : Math.max(0, ...data.filter(d => d.a !== -1).flatMap(d => single ? [수(d.a)] : [수(d.a), 수(d.b)])), [data, single, stacked, grouped]);
38
+ : Math.max(0, ...data.filter(d => !미래칸(d, 기준 == null)).flatMap(d => single ? [수(d.a)] : [수(d.a), 수(d.b)])), [data, single, stacked, grouped]);
31
39
  /* 기준선 모드: 0 선에서 얼마나 떨어졌는지(|값 − 기준|)가 축을 정한다 — 위아래가 대칭이라야 같은 크기의 오름·내림이 같은 길이로 읽힌다 */
32
- const 기준 = baseline;
33
40
  const 대칭최대 = useMemo(() => {
34
41
  if (기준 == null)
35
42
  return 0;
36
- const 값들 = data.filter(d => d.a !== -1).flatMap(d => stacked ? (d.parts ?? []).map(수) : (single ? [수(d.a)] : [수(d.a), 수(d.b)]));
43
+ const 값들 = data.filter(d => !미래칸(d, 기준 == null)).flatMap(d => stacked ? (d.parts ?? []).map(수) : (single ? [수(d.a)] : [수(d.a), 수(d.b)]));
37
44
  return Math.max(0, ...값들.map(v => Math.abs(v - 기준)));
38
45
  }, [data, 기준, stacked, single]);
39
46
  const padded = useMemo(() => {
@@ -91,7 +98,7 @@ function BarChartCanvas({ data, colorA, colorB, labelA, labelB, barWidth = 10, b
91
98
  return (_jsxs("div", { className: "manager-bar-chart-wrap", style: 묶음간격, children: [_jsx("div", { className: "manager-bar-chart-inner", children: _jsx("div", { className: "manager-bar-chart-scroll", children: _jsxs("div", { className: "manager-bar-chart-area", children: [_jsxs("div", { className: "manager-bar-chart-plot", style: { height: h }, children: [ticks.slice(0, -1).map((t, i) => (
92
99
  /* 눈금선은 **적힌 값의 높이**에 둔다 — 가운데 값을 반올림(최대 3 → '2')하면서 자리는 절반(1.5)에 두어 선과 숫자가 어긋났다 */
93
100
  _jsx("div", { className: `manager-bar-chart-gridline${기준 != null && t === 기준 ? ' manager-bar-chart-gridline--baseline' : ''}`, style: { top: 눈금자리(t) * h }, children: _jsx("span", { className: "manager-bar-chart-gridline__label caption-1", children: t }) }, i))), data.map((d, i) => {
94
- const isFuture = d.a === -1;
101
+ const isFuture = 미래칸(d, 기준 == null);
95
102
  /* 판 높이를 넘지 않는다 — maxOverride(진행률 100)보다 큰 값이 와도 막대가 눈금 위로 삐져나가지 않게 */
96
103
  /* 기준선 모드는 반쪽(h/2)을 쓴다 — 0 선에서 위나 아래로 자란다 */
97
104
  const 반 = h / 2;
@@ -159,7 +166,7 @@ function BarChartCanvas({ data, colorA, colorB, labelA, labelB, barWidth = 10, b
159
166
  });
160
167
  })() })) : (기준 != null ? (_jsx(_Fragment, { children: [{ v: 수(d.a), c: colorA }, ...(single ? [] : [{ v: 수(d.b), c: colorB }])].map(({ v, c }, k) => (_jsxs("div", { className: "manager-bar-chart-slot", style: 막대굵기, children: [_jsx("div", { className: "manager-bar-chart-slot__half manager-bar-chart-slot__half--up", children: v >= 기준 && _jsx("div", { className: "manager-bar-chart-bar manager-bar-chart-bar--full", style: { height: 높이(v), background: c } }) }), _jsx("div", { className: "manager-bar-chart-slot__half manager-bar-chart-slot__half--down", children: v < 기준 && _jsx("div", { className: "manager-bar-chart-bar manager-bar-chart-bar--full manager-bar-chart-bar--down", style: { height: 높이(v), background: c } }) })] }, k))) })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "manager-bar-chart-bar", style: { ...막대굵기, height: ha, background: colorA } }), !single && _jsx("div", { className: "manager-bar-chart-bar", style: { ...막대굵기, height: hb, background: colorB } })] })))) }, i));
161
168
  })] }), _jsx("div", { className: "manager-bar-chart-x-axis", children: data.map((d, i) => {
162
- const isFuture = d.a === -1; // 아직 도래하지 않은 날 — 글씨 흐리게
169
+ const isFuture = 미래칸(d, 기준 == null); // 아직 도래하지 않은 날 — 글씨 흐리게
163
170
  return (_jsxs("span", { className: `manager-bar-chart-x-axis__label${isFuture ? ' manager-bar-chart-x-axis__label--future' : ''}`, children: [_jsxs("span", { className: "caption-1 manager-bar-chart-x-axis__main", children: [d.isToday && _jsx("span", { className: "manager-bar-chart-x-axis__today-dot", style: { background: colorA } }), d.label] }), d.sublabel && _jsx("span", { className: "caption-1", children: d.sublabel })] }, i));
164
171
  }) })] }) }) }), tooltip && (_jsx(DescriptionTooltip, { anchorRect: tooltip.rect, title: tooltip.title, items: tooltip.items, showIndex: false, closeOnOutsideClick: false }))] }));
165
172
  }
@@ -180,18 +187,18 @@ export function BarChartControls({ control }) {
180
187
  * 주 보기의 막대·합계와 월 보기 완료율 주 막대가 **이 한 벌**을 쓴다 — 같은 주가 두 보기에서
181
188
  * 다른 수로 서지 않게(2026-09-12 말귀 검수: 주 보기 25% · 월 보기 38%).
182
189
  */
183
- function 주의날들(data, monday, now) {
190
+ function 주의날들(data, monday, now, 옛표시 = true) {
184
191
  const 오늘 = new Date(now.getFullYear(), now.getMonth(), now.getDate());
185
192
  return Array.from({ length: 7 }, (_, i) => {
186
193
  const dt = new Date(monday);
187
194
  dt.setDate(monday.getDate() + i);
188
195
  const entry = (data[`${dt.getFullYear()}년 ${dt.getMonth() + 1}월`]?.daily ?? [])[dt.getDate() - 1];
189
- const isFuture = entry?.a === -1 || dt > 오늘; // 미래 날 — 평균/막대에서 제외
196
+ const isFuture = (entry != null && 미래칸(entry, 옛표시)) || dt > 오늘; // 미래 날 — 평균/막대에서 제외
190
197
  return { dt, entry, isFuture };
191
198
  });
192
199
  }
193
200
  /** control(기간)에 따라 data를 막대 배열로 변환 */
194
- function barsFromControl(data, control, t, lang) {
201
+ function barsFromControl(data, control, t, lang, 옛표시 = true) {
195
202
  const { period, monthRange, weekRange, weekRanges, DOW } = control;
196
203
  const isKo = lang?.startsWith('ko');
197
204
  const now = getTodayKstDate(); // 칸은 KST 달력 — 오늘·이번 주 표시도 KST 로
@@ -220,19 +227,20 @@ function barsFromControl(data, control, t, lang) {
220
227
  // 시작일이 오늘 이후(또는 미래 달)면 아직 도래하지 않은 주 → 흐리게/막대 미표시
221
228
  isFutureWeek = year > nowY || (year === nowY && (month > nowM || (month === nowM && startDay > nowD)));
222
229
  }
223
- return { ...d, label, sublabel: isKo ? `${KO_ORD[n - 1] ?? n}주` : `Week ${n}`, isToday, a: isFutureWeek ? -1 : d.a, b: isFutureWeek ? 0 : d.b };
230
+ return { ...d, label, sublabel: isKo ? `${KO_ORD[n - 1] ?? n}주` : `Week ${n}`, isToday, future: (d.future === true || isFutureWeek) || undefined, a: isFutureWeek ? -1 : d.a, b: isFutureWeek ? 0 : d.b };
224
231
  });
225
232
  }
226
233
  const opt = weekRanges.find(o => o.value === weekRange);
227
234
  if (!opt)
228
235
  return [];
229
236
  const monday = new Date(opt.year, opt.month - 1, firstMondayOfMonth(opt.year, opt.month - 1) + opt.week * 7);
230
- return 주의날들(data, monday, now).map(({ dt, entry, isFuture }) => {
237
+ return 주의날들(data, monday, now, 옛표시).map(({ dt, entry, isFuture }) => {
231
238
  const dM = dt.getMonth() + 1, dD = dt.getDate(), dY = dt.getFullYear();
232
239
  const sameMonth = dM === opt.month && dY === opt.year;
233
240
  return {
234
241
  label: sameMonth ? `${dD}` : `${dM}/${dD}`,
235
242
  sublabel: DOW[dt.getDay()] ?? '',
243
+ future: isFuture || undefined,
236
244
  a: isFuture ? -1 : (entry && entry.a > 0 ? entry.a : 0),
237
245
  b: isFuture ? 0 : (entry && entry.b > 0 ? entry.b : 0),
238
246
  isToday: dY === nowY && dM === nowM && dD === nowD,
@@ -259,7 +267,7 @@ export default function BarChart({ size = 'medium', barWidth, titleKey, data, co
259
267
  // 외부 control 미지정 시 내부 컨트롤 사용 (단독 차트 하위 호환)
260
268
  const internalControl = useBarChartControl(data);
261
269
  const control = controlProp ?? internalControl;
262
- const rawBars = useMemo(() => barsFromControl(data, control, t, i18n.language), [data, control, t, i18n.language]);
270
+ const rawBars = useMemo(() => barsFromControl(data, control, t, i18n.language, baseline == null), [data, control, t, i18n.language, baseline]);
263
271
  // 완료율 모드: a = 진행률(a/b×100). labelBKey 지정 시 b = 정답률(parts[0]/parts[1]×100) 2계열.
264
272
  // 월 보기의 주 막대는 **그 주 경과한 날의 일별 진행률 평균(미기록일 0%)** — 아래 total 과
265
273
  // 주 보기가 쓰는 같은 셈. 주 합 a/b 로 두면 기록 없는 날(b=0)이 빠져 같은 주가 두 보기에서
@@ -299,7 +307,7 @@ export default function BarChart({ size = 'medium', barWidth, titleKey, data, co
299
307
  };
300
308
  return rawBars.map((d, i) => {
301
309
  let a = d.a === -1 ? -1 : (d.b > 0 ? Math.round((d.a / d.b) * 100) : 0);
302
- if (월 && d.a !== -1) {
310
+ if (월 && !미래칸(d)) {
303
311
  const y = Number(월[1]), m0 = Number(월[2]) - 1;
304
312
  const 지난날 = 주의날들(data, new Date(y, m0, firstMondayOfMonth(y, m0) + i * 7), now).filter(x => !x.isFuture);
305
313
  if (rateAgg === 'weighted') {
@@ -319,7 +327,7 @@ export default function BarChart({ size = 'medium', barWidth, titleKey, data, co
319
327
  }
320
328
  }
321
329
  let 계열 = null;
322
- if (나란히 && d.a !== -1) {
330
+ if (나란히 && !미래칸(d)) {
323
331
  let 날들;
324
332
  if (월) {
325
333
  const y = Number(월[1]), m0 = Number(월[2]) - 1;
@@ -373,7 +381,7 @@ export default function BarChart({ size = 'medium', barWidth, titleKey, data, co
373
381
  /* 기준선 모드는 부호를 살려 더한다 — 오르내림의 **순변화** 가 합계다(양수만 더하면 내린 주가 사라진다).
374
382
  미래 표시(a === -1)는 여기서도 뺀다 — 기준선 모드에서도 -1 은 '아직 오지 않은 칸' 이다(실제 -1 이 나올 수 있으면 그 칸을 자료에서 뺀다). */
375
383
  if (baseline != null) {
376
- return 합칠것.reduce((s, d) => s + (d.a === -1 ? 0 : 수(d.a)) + (labelBKey ? 수(d.b) : 0), 0);
384
+ return 합칠것.reduce((s, d) => s + (미래칸(d, false) ? 0 : 수(d.a) + (labelBKey ? 수(d.b) : 0)), 0);
377
385
  }
378
386
  return 합칠것.reduce((s, d) => s + (d.a > 0 ? d.a : 0) + (labelBKey && d.b > 0 ? d.b : 0), 0);
379
387
  }, [bars, rawBars, rate, rateAgg, avgMode, baseline, labelBKey, control.period, control.monthRange, data]);
@@ -389,7 +397,7 @@ export default function BarChart({ size = 'medium', barWidth, titleKey, data, co
389
397
  const isLarge = size === 'large';
390
398
  const sectionClassName = [isSmall ? 'manager-section--compact' : isLarge ? 'manager-section--full' : undefined, className]
391
399
  .filter(Boolean).join(' ') || undefined;
392
- return (_jsx(ChartSection, { className: sectionClassName, inGrid: inGrid, title: t(titleKey), titleClassName: isSmall ? 'h5 chart-section-title--small' : undefined, headRight: isSmall ? (headExtra ?? undefined) : _jsxs(_Fragment, { children: [!hideControls && _jsx(BarChartControls, { control: control }), headExtra, onDetail && (_jsx("span", { className: "manager-bar-chart-detail-btn", children: _jsx(Button, { htmlType: "button", size: detailSize, type: "dot", icon: "list", ariaLabel: t('trainingStatus.detail', '상세보기'), onClick: onDetail }) }))] }), subRow: _jsxs(_Fragment, { children: [showTotal ? ((rate || avgMode || (!!totalLabelKey && !!totalFormat)) ? (
400
+ return (_jsx(ChartSection, { className: sectionClassName, inGrid: inGrid, title: t(titleKey), titleClassName: isSmall ? 'h5 chart-section-title--small' : undefined, headRight: isSmall ? (headExtra ?? undefined) : _jsxs(_Fragment, { children: [!hideControls && _jsx(BarChartControls, { control: control }), headExtra, onDetail && (_jsx("span", { className: "manager-bar-chart-detail-btn", children: _jsx(Button, { htmlType: "button", size: detailSize, type: "dot", icon: "list", ariaLabel: t('trainingStatus.detail', '상세보기'), showTooltipInfo: t('trainingStatus.detail', '상세보기'), onClick: onDetail }) }))] }), subRow: _jsxs(_Fragment, { children: [showTotal ? ((rate || avgMode || (!!totalLabelKey && !!totalFormat)) ? (
393
401
  // 진행률/평균 모드 또는 totalLabelKey+totalFormat 조합: 라벨(윗줄) + 값(아랫줄). size='small'은 라벨 생략
394
402
  _jsx(ChartTotal, { label: isSmall ? undefined : `${t(control.period === 'week' ? 'manager.chart.weeklyPrefix' : 'manager.chart.monthlyPrefix')} ${t(totalLabelKey ?? labelAKey)}`, children: totalFormat ? (
395
403
  // 숫자는 h0, 단위(시간/분/초 등)는 h5로 분리
@@ -11,6 +11,9 @@ export interface BarData {
11
11
  isToday?: boolean;
12
12
  parts?: number[];
13
13
  partsB?: number[];
14
+ /** 아직 오지 않은 칸 — 막대를 그리지 않고 글씨를 흐리게, 평균·합계에서 뺀다.
15
+ * `a === -1` 이 같은 뜻의 옛 표시인데, **음수가 값인 차트**(baseline)에서는 −1 이 진짜 값일 수 있어 이 칸을 쓴다. */
16
+ future?: boolean;
14
17
  }
15
18
  /** 한 구간(월 등)의 주별/일별 막대 데이터 묶음 */
16
19
  export type MonthBarData = {
@@ -26,6 +29,8 @@ export interface ChartPoint {
26
29
  b: number;
27
30
  parts?: number[];
28
31
  partsB?: number[];
32
+ /** 아직 오지 않은 날 — `a === -1` 과 같은 뜻이고, 음수를 값으로 쓰는 차트(baseline)에서는 이쪽을 쓴다. */
33
+ future?: boolean;
29
34
  }
30
35
  /** 해당 월(0-based)의 첫 월요일 날짜(1~7). 예: 2026-05(금요일 시작) → 4 */
31
36
  export declare function firstMondayOfMonth(year: number, month0: number): number;
@@ -113,6 +113,8 @@ export function buildMonthChartData(points) {
113
113
  const isFuture = isCurMonth && d > today;
114
114
  daily.push({
115
115
  label: String(d),
116
+ /* 미래는 두 표시를 함께 단다 — 음수를 값으로 쓰는 차트(baseline)는 -1 을 진짜 값으로 읽으므로 future 를 본다 */
117
+ ...(isFuture && dayA[d] === 0 && dayB[d] === 0 ? { future: true } : {}),
116
118
  a: isFuture && dayA[d] === 0 && dayB[d] === 0 ? -1 : dayA[d],
117
119
  b: dayB[d],
118
120
  ...(partsLen ? { parts: dayParts[d] } : {}),
@@ -46,4 +46,4 @@
46
46
  *
47
47
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
48
48
  */
49
- export declare const CORE_VERSION = "0.163.0";
49
+ export declare const CORE_VERSION = "0.164.0";
@@ -46,4 +46,4 @@
46
46
  *
47
47
  * 값은 손으로 적고 `test/coreVersion.test.ts` 가 package.json 과 어긋나면 운다.
48
48
  */
49
- export const CORE_VERSION = '0.163.0';
49
+ export const CORE_VERSION = '0.164.0';
package/dist/utils.cjs.js CHANGED
@@ -17,4 +17,4 @@
17
17
  \uC124\uCE58 \uBA85\uB839\uC5B4 (\uC2A4\uD1A0\uB9AC\uC9C0 SDK \uBBF8\uC124\uCE58 \uC2DC):
18
18
  npm install @supabase/supabase-js
19
19
  pnpm add @supabase/supabase-js
20
- `),this.name="StorageNotConfiguredError"}};function Ht(e){Wt(e)}function Yt(e,n){if(!e)return null;const t=Z();return t?.resolvePath?t.resolvePath(e,n):n?`${n}/${e}.mp3`:null}async function jn(e){if(!e)return!1;const n=Z();if(!n)throw new Je("fileExists");if(n.exists)return n.exists(e);try{return await n.resolveUrl(e)!==null}catch{return!1}}async function Ln(e){if(!e)return null;const n=Z();if(!n)throw new Je("getSignedOrPublicUrl");try{return await n.resolveUrl(e)}catch{return null}}async function Kt(e){const n=Z();if(!n)throw new Je("downloadSound");return n.download(e)}function Ut(){return Z()?.noiseBaseUrl??"/sounds/noise"}function Vt(){const e=Number(Z()?.noiseFileGain);return Number.isFinite(e)&&e>0?e:1}function zt(e){const n=AbortSignal.timeout;if(typeof n=="function")return n.call(AbortSignal,e);const t=new AbortController;return setTimeout(()=>t.abort(),e),t.signal}const qe="__ihab_core_tts_config__";function Jt(e){globalThis[qe]=e}function qt(){return globalThis[qe]?.urlResolver??null}function Qt(){return globalThis[qe]?.fallbackUrlResolver??null}const Zt=new Map;function Xt(){Zt.clear()}const Rn="__ihab_core_pronunciation_resolver__";function eo(e){globalThis[Rn]=e}function no(){return globalThis[Rn]??null}let K=null;const ie=new WeakMap,Qe=new WeakMap,Ze=new WeakMap;let On=!1;const kn=e=>Math.max(0,Math.min(1,Number.isFinite(e)?e:0));function to(){if(On||typeof document>"u")return;On=!0;const e=()=>{try{K&&K.state!=="running"&&K.resume()}catch{}};for(const n of["pointerdown","touchend","keydown"])document.addEventListener(n,e,{capture:!0,passive:!0})}function $n(){if(K)return K;try{const e=window.AudioContext||window.webkitAudioContext;return e?(K=new e,to(),K):null}catch{return null}}function oo(){try{K?.resume()}catch{}}function Xe(e,n){const t=ie.get(n);if(t)return t;try{const o=e.createMediaElementSource(n),r=e.createGain(),i=e.createAnalyser();i.fftSize=1024,i.smoothingTimeConstant=.6,r.gain.value=kn(Qe.get(n)??n.volume),o.connect(r),r.connect(i),r.connect(e.destination);try{n.volume=1}catch{}const u={gain:r,analyser:i};return ie.set(n,u),u}catch{return null}}function In(e){if(!e)return Promise.resolve(null);const n=ie.get(e);if(n)return Promise.resolve(n.analyser);const t=$n();if(!t)return Promise.resolve(null);if(t.state==="running")return Promise.resolve(Xe(t,e)?.analyser??null);const o=Ze.get(e);if(o)return o;const r=Promise.resolve().then(()=>t.resume()).then(()=>t.state==="running"?Xe(t,e)?.analyser??null:null).catch(()=>null).finally(()=>{Ze.delete(e)});return Ze.set(e,r),r}function uo(e){if(!e)return null;const n=ie.get(e);if(n)return n.analyser;const t=$n();return t?t.state==="running"?Xe(t,e)?.analyser??null:(In(e),null):null}function ro(e,n){const t=kn(n);Qe.set(e,t);const o=ie.get(e);if(o){try{e.volume!==1&&(e.volume=1)}catch{}const r=o.gain.gain;try{const i=o.gain.context.currentTime;r.cancelScheduledValues(i),r.setTargetAtTime(t,i,.01)}catch{try{r.value=t}catch{}}return"gain"}try{e.volume=t}catch{}return"element"}function io(e){return Qe.get(e)??e.volume}function ao(e,n){e.getFloatTimeDomainData(n);let t=0;for(let o=0;o<n.length;o++){const r=n[o];t+=r*r}return Math.sqrt(t/n.length)}const Mn="__ihab_core_image_config__";function so(e){globalThis[Mn]=e}function Pn(){return globalThis[Mn]??null}const ae="word_image_existence_map_v1";let P=null,se=0,vn=-1,le=null;const je=new Map;function ce(){if(P)return P;try{const e=typeof localStorage<"u"?localStorage.getItem(ae):null,n=e?JSON.parse(e):null;P=n&&typeof n=="object"&&!Array.isArray(n)?n:{}}catch{P={}}return P}let en=null;function lo(){en||(en=setTimeout(()=>{en=null;try{typeof localStorage<"u"&&P&&localStorage.setItem(ae,JSON.stringify(P))}catch{}},200))}function Le(e,n){return`${e}_${n??1}`}async function Fn(e,n){const t=ce(),o=Le(e,n);if(o in t)return t[o];if(je.has(o))return je.get(o);const r=Pn();if(!r)return!1;const i=r(e,n);if(!i)return!1;const u=fetch(i,{method:"HEAD",signal:zt(8e3)}).then(a=>a.status>=500?null:a.ok,()=>null).then(a=>(je.delete(o),a===null?!1:(t[o]=a,se++,lo(),a)));return je.set(o,u),u}function co(e,n){const t=ce(),o=Le(e,n);return o in t?t[o]:void 0}async function Co(e,n={}){const{force:t=!1,concurrency:o=16,onProgress:r}=n,i=ce(),u=t?Array.from(new Set(e)):Array.from(new Set(e)).filter(s=>!(Le(s)in i));let a=0;if(u.length>0){let s=0;const c=Array.from({length:Math.min(o,u.length)},async()=>{for(;s<u.length;){const C=s++,l=u[C],g=Le(l);if(!t&&g in i){a++,r?.(a,u.length);continue}try{await Fn(l)}catch{}a++,r?.(a,u.length)}});await Promise.all(c)}try{typeof localStorage<"u"&&P&&localStorage.setItem(ae,JSON.stringify(P))}catch{}return{checked:u.length,cached:Object.keys(i).length,total:e.length}}function go(){const e=ce();if(vn===se)return le?{...le}:null;const n=Object.values(e);return le=n.length===0?null:{total:n.length,exists:n.filter(Boolean).length},vn=se,le?{...le}:null}function fo(e){const n=ce();Object.assign(n,e),se++;try{typeof localStorage<"u"&&localStorage.setItem(ae,JSON.stringify(n))}catch{}}function ho(){P={},se++;try{typeof localStorage<"u"&&localStorage.removeItem(ae)}catch{}}const A=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],w=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],B=["","\u3131","\u3132","\u3133","\u3134","\u3135","\u3136","\u3137","\u3139","\u313A","\u313B","\u313C","\u313D","\u313E","\u313F","\u3140","\u3141","\u3142","\u3144","\u3145","\u3146","\u3147","\u3148","\u314A","\u314B","\u314C","\u314D","\u314E"];function S(e){if(!e)return null;const n=e.charCodeAt(0)-44032;return n<0||n>=11172?null:{cho:Math.floor(n/588),jung:Math.floor(n%588/28),jong:n%28}}function mo(){const e=new Map;return n=>{let t=e.get(n);return t||(t=[...n].map(o=>S(o)),e.set(n,t)),t}}function x(e,n,t=0){return String.fromCharCode(44032+(e*21+n)*28+t)}function So(e,n){if(!e||!n||e===n||e.length!==n.length)return"random";let t=0,o=null;for(let r=0;r<e.length;r++){const i=S(e[r]),u=S(n[r]);if(!i||!u)return"random";if(i.cho===u.cho&&i.jung===u.jung&&i.jong===u.jong)continue;t++;const a=i.cho!==u.cho,s=i.jung!==u.jung,c=i.jong!==u.jong;(a?1:0)+(s?1:0)+(c?1:0)>1?o="multi":a?o="cho":s?o="jung":o="jong"}return t!==1?"random":o==="cho"?"cho":o==="jung"?"jung":o==="jong"?"jong":"random"}function Gn(e){const n=S(e[0]||"");return n?A[n.cho]:""}function xn(e){return[...e].map(n=>{const t=S(n);return t?A[t.cho]:n}).join("")}function Wn(e){return!!e&&[...e].every(n=>A.includes(n))}function yo(e,n){return n?(e=e.normalize("NFC"),n=n.normalize("NFC"),Wn(n)?xn(e).includes(n):e.toLowerCase().includes(n.toLowerCase())):!0}function Eo(e,n){return Hn(n)(e)}function Hn(e){if(!e)return()=>!0;e=e.normalize("NFC");const n=[...e],t=u=>A.includes(u),o=u=>w.includes(u),r=n.map(u=>t(u)?"cho":o(u)?"jung":S(u)?"syl":"other"),i=n.map(u=>S(u));if(r.includes("other")){const u=e.toLowerCase();return a=>a.normalize("NFC").toLowerCase().includes(u)}return u=>{const a=[...u.normalize("NFC")];for(let s=0;s+n.length<=a.length;s++){let c=!0;for(let C=0;C<n.length;C++){const l=a[s+C],g=r[C];if(g==="cho"){if(Gn(l)!==n[C]){c=!1;break}}else if(g==="jung"){const h=S(l);if(!h||w[h.jung]!==n[C]){c=!1;break}}else{const h=i[C];if(h&&h.jong===0){const m=S(l);if(!m||m.cho!==h.cho||m.jung!==h.jung){c=!1;break}}else if(l!==n[C]){c=!1;break}}}if(c)return!0}return!1}}const Re={3:["\u3131","\u3145"],5:["\u3134","\u3148"],6:["\u3134","\u314E"],9:["\u3139","\u3131"],10:["\u3139","\u3141"],11:["\u3139","\u3142"],12:["\u3139","\u3145"],13:["\u3139","\u314C"],14:["\u3139","\u314D"],15:["\u3139","\u314E"],18:["\u3142","\u3145"]},Yn=Object.fromEntries(Object.entries(Re).map(([e,n])=>[n.join(""),B[Number(e)]]));function Do(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(o&&A[o.cho]===n)return!0}return!1}function To(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(o&&w[o.jung]===n)return!0}return!1}function po(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(!o||o.jong<=0)continue;if(B[o.jong]===n)return!0;const r=Re[o.jong];if(r&&r.includes(n))return!0}return!1}function Ao(e){if(!e)return 0;let n=0;for(const t of e)S(t)&&n++;return n}function wo(e){if(!e)return!1;let n=!1;for(const t of e){const o=S(t);if(o&&(n=!0,o.jong>0))return!1}return n}function bo(e,n){if(e.jong<=0)return!1;if(n.includes(B[e.jong]))return!0;const t=Re[e.jong];return!!t&&t.some(o=>n.includes(o))}function _o(e,n,t){if(!e)return!1;const o=[...e],r=i=>{const u=S(o[i]);if(!u||n.cho&&!n.cho.includes(A[u.cho])||n.jung&&!n.jung.includes(w[u.jung]))return!1;if(n.jongNone){if(u.jong>0)return!1}else if(n.jong&&!bo(u,n.jong))return!1;return!0};if(t==="head")return r(0);if(t==="tail")return r(o.length-1);if(t==="mid"){for(let i=1;i<o.length-1;i++)if(r(i))return!0;return!1}for(let i=0;i<o.length;i++)if(r(i))return!0;return!1}function Kn(e){return e.includes(",")||e.includes("_")}function Un(e){if(e==="")return[{kind:"any"}];if(e.includes("_")){const n=[...e];if(n.length>4)return[{kind:"invalid"}];const t=n[0]??"_",o=n[1]??"_";let r=n.slice(2).join("");if(r.length===2){const i=Yn[r];if(!i)return[{kind:"invalid"}];r=i}return[{kind:"template",cho:t,jung:o,jong:r||"_"}]}return[...e].map(n=>S(n)?{kind:"syllable",ch:n}:A.includes(n)?{kind:"cho",jamo:n}:w.includes(n)?{kind:"jung",jamo:n}:{kind:"invalid"})}function Bo(e,n){switch(n.kind){case"any":return!0;case"syllable":{const t=S(n.ch);if(!t)return e===n.ch;if(t.jong===0){const o=S(e);return!!o&&o.cho===t.cho&&o.jung===t.jung}return e===n.ch}case"cho":{const t=S(e);return!!t&&A[t.cho]===n.jamo}case"jung":{const t=S(e);return!!t&&w[t.jung]===n.jamo}case"template":{const t=S(e);return!(!t||n.cho!=="_"&&A[t.cho]!==n.cho||n.jung!=="_"&&w[t.jung]!==n.jung||n.jong!=="_"&&B[t.jong]!==n.jong)}case"invalid":return!1}}function Vn(e,n){e=e.normalize("NFC"),n=n.normalize("NFC");const t=n.split(",").flatMap(r=>Un(r.trim()));if(t.length===0)return!0;const o=[...e];if(o.length<t.length)return!1;for(let r=0;r+t.length<=o.length;r++)if(t.every((i,u)=>Bo(o[r+u],i)))return!0;return!1}function No(e){const n=e.split(",").flatMap(i=>Un(i.trim())),t=new Set,o=new Set,r=new Set;for(const i of n)switch(i.kind){case"cho":t.add(i.jamo);break;case"jung":o.add(i.jamo);break;case"template":i.cho!=="_"&&t.add(i.cho),i.jung!=="_"&&o.add(i.jung),i.jong!=="_"&&r.add(i.jong);break;case"syllable":{const u=S(i.ch);u&&(t.add(A[u.cho]),o.add(w[u.jung]),u.jong!==0&&r.add(B[u.jong]));break}}return t.size===0&&o.size===0&&r.size===0?null:{cho:t.size?[...t]:null,jung:o.size?[...o]:null,jong:r.size?[...r]:null}}function jo(e){return!!S(e)||A.includes(e)||w.includes(e)}function Lo(e){const n=e.normalize("NFC").trim();if(!n)return{ok:!0};for(const t of n.split(",")){const o=t.trim();if(o!==""){if(o.includes("_")){const r=[...o];if(r.length>4)return{ok:!1};const i=r[0],u=r[1],a=r.slice(2).join(""),s=i===void 0||i==="_"||A.includes(i),c=u===void 0||u==="_"||w.includes(u),C=a===""||a==="_"||B.filter(Boolean).includes(a)||!!Yn[a];if(s&&c&&C)continue;return{ok:!1}}if(![...o].every(jo))return{ok:!1}}}return{ok:!0}}A.length,w.length,B.length;function Ro(e,n){const t=n.normalize("NFC").trim();if(!t||!/[^\s,_]/.test(t))return e;if(Kn(t))return e.filter(s=>Vn(s.word,t));const o=Hn(t),r=[...t].length,i=s=>!!s&&o(s.normalize("NFC").slice(0,r)),u=[],a=[];for(const s of e)(o(s.word)||o(s.pronunciation??""))&&(i(s.word)||i(s.pronunciation??"")?u:a).push(s);return u.concat(a)}const nn="word_pair_index_v2",tn="word_pair_index_sig_v2";let v=null,Ce=null;function zn(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(nn),n=localStorage.getItem(tn);return!e||!n?null:{index:JSON.parse(e),sig:n}}catch{return null}}function Oo(e,n){try{if(typeof localStorage>"u")return;localStorage.setItem(nn,JSON.stringify(e)),localStorage.setItem(tn,n)}catch{}}function ko(e){const n=e.map(o=>`${o.word}|${o.pron??""}`).sort();let t=0;for(const o of n)for(let r=0;r<o.length;r++)t=(t<<5)-t+o.charCodeAt(r)|0;return`${n.length}-${t}`}async function $o(e,n){const t=new Set,o=[];for(const c of e){if(!c.word||t.has(c.word))continue;const C=c.pron||c.word,l=Array.from(C).map(S);l.some(g=>g===null)||l.length===Array.from(c.word).length&&(t.add(c.word),o.push({word:c.word,syls:l}))}const r={},i=o.length,u=new Map;for(const c of o){const C=c.syls.length;u.has(C)||u.set(C,[]),u.get(C).push(c)}let a=0;const s=["cho","jung","jong"];for(const c of u.values()){const C=c[0].syls.length;for(let l=0;l<C;l++)for(const g of s){const h=new Map;for(const m of c){let y="";for(let f=0;f<C;f++){f>0&&(y+="~");const d=m.syls[f];f===l?g==="cho"?y+=`*:${d.jung}:${d.jong}`:g==="jung"?y+=`${d.cho}:*:${d.jong}`:y+=`${d.cho}:${d.jung}:*`:y+=`${d.cho}:${d.jung}:${d.jong}`}let E=h.get(y);E||(E=[],h.set(y,E)),E.push(m)}for(const m of h.values())if(!(m.length<2))for(let y=0;y<m.length;y++){const E=m[y];for(let f=y+1;f<m.length;f++){const d=m[f];E.syls[l][g]!==d.syls[l][g]&&(r[E.word]||(r[E.word]={cho:[],jung:[],jong:[]}),r[d.word]||(r[d.word]={cho:[],jung:[],jong:[]}),r[E.word][g].push(d.word),r[d.word][g].push(E.word))}}}a+=c.length,n?.(a,i),await new Promise(l=>setTimeout(l,0))}return i>0&&n?.(i,i),r}let on=0;async function Io(e,n={}){const t=ko(e);if(!n.force){if(v&&Ce===t)return v;const i=zn();if(i&&i.sig===t)return v=i.index,Ce=t,v}const o=++on,r=await $o(e,n.onProgress);return o===on&&(v=r,Ce=t,Oo(r,t)),r}function Jn(){if(v)return v;const e=zn();return e?(v=e.index,Ce=e.sig,v):null}function Mo(){on+=1,v=null,Ce=null;try{typeof localStorage<"u"&&(localStorage.removeItem(nn),localStorage.removeItem(tn))}catch{}}const Po={\u3131:"\u3131",\u3132:"\u3131",\u314B:"\u3131",\u3133:"\u3131",\u313A:"\u3131",\u3134:"\u3134",\u3135:"\u3134",\u3136:"\u3134",\u3137:"\u3137",\u3145:"\u3137",\u3146:"\u3137",\u3148:"\u3137",\u314A:"\u3137",\u314C:"\u3137",\u314E:"\u3137",\u3139:"\u3139",\u313C:"\u3139",\u313D:"\u3139",\u313E:"\u3139",\u3140:"\u3139",\u3141:"\u3141",\u313B:"\u3141",\u3142:"\u3142",\u314D:"\u3142",\u313F:"\u3142",\u3144:"\u3142",\u3147:"\u3147"},qn={\u314F:{nucleus:"\u314F"},\u3151:{glide:"j",nucleus:"\u314F"},\u3153:{nucleus:"\u3153"},\u3155:{glide:"j",nucleus:"\u3153"},\u3157:{nucleus:"\u3157"},\u315B:{glide:"j",nucleus:"\u3157"},\u315C:{nucleus:"\u315C"},\u3160:{glide:"j",nucleus:"\u315C"},\u3161:{nucleus:"\u3161"},\u3163:{nucleus:"\u3163"},\u3150:{nucleus:"\u3154/\u3150"},\u3152:{glide:"j",nucleus:"\u3154/\u3150"},\u3154:{nucleus:"\u3154/\u3150"},\u3156:{glide:"j",nucleus:"\u3154/\u3150"},\u3158:{glide:"w",nucleus:"\u314F"},\u3159:{glide:"w",nucleus:"\u3154/\u3150"},\u315A:{glide:"w",nucleus:"\u3154/\u3150"},\u315D:{glide:"w",nucleus:"\u3153"},\u315E:{glide:"w",nucleus:"\u3154/\u3150"},\u315F:{glide:"w",nucleus:"\u3163"},\u3162:{glide:"\u0270",nucleus:"\u3163"}};function vo(e,n){return(qn[e]?.glide??"")!==(qn[n]?.glide??"")}function Qn(e){return Po[e]??e}const un={cho:A,jung:w,jong:B},k=e=>Array.isArray(e)?e.length>0:!!e;function rn(e,n){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++){const o=e[t],r=n[t];if(!(!o||!r)&&(o.cho!==r.cho&&A[o.cho]==="\u3147"!=(A[r.cho]==="\u3147")||o.jung!==r.jung&&vo(w[o.jung],w[r.jung])||o.jong!==r.jong&&o.jong===0!=(r.jong===0)))return!0}return!1}function Zn(e,n,t){const o=t.pronOf(e),r=t.decompOf,i=t.sameStructureOnly&&r?r(o):null,u=[];for(const a of n)a!==e&&(t.okSet&&!t.okSet.has(a)||t.pronOf(a)!==o&&(i&&r&&rn(i,r(t.pronOf(a)))||u.push(a)));return u}function Fo(e,n,t){const o=n?.[e];if(!o)return[];const r=t.kind?o[t.kind]??[]:[...o.cho??[],...o.jung??[],...o.jong??[]];return Zn(e,r,t)}function Go(e,n,t,o,r,i,u){const a=["cho","jung","jong"].filter(g=>k(e[g])),s={};for(const g of a){const h=e[g];s[g]=new Set(Array.isArray(h)?h:[h])}const c=r==="pron",C=new Map;for(const g of n){const h=t(i(g));if(h.some(f=>!f))continue;let m=h;if(!c&&(m=t(g),m.length!==h.length||m.some(f=>!f)))continue;const y=h.length,E=C.get(y);E?E.push({w:g,dPron:h,dPos:m}):C.set(y,[{w:g,dPron:h,dPos:m}])}const l=new Map;for(const[g,h]of C){const m=new Map,y=(E,f)=>{const d=E.dPos[f];return d!=null&&a.every(D=>s[D].has(un[D][d[D]]))};for(const E of h){let f;if(u==="head")f=y(E,0)?0:-1;else if(u==="tail")f=y(E,g-1)?g-1:-1;else if(u==="mid"){f=-1;for(let D=1;D<g-1;D++)if(y(E,D)){f=D;break}}else f=E.dPos.findIndex(D=>D!=null&&a.every(p=>s[p].has(un[p][D[p]])));if(f<0)continue;const d=m.get(f);d?d.push(E):m.set(f,[E])}for(const[E,f]of m){const d=a.includes("cho"),D=a.includes("jung"),p=a.includes("jong"),M=b=>{let L="";for(let O=0;O<g;O++){const T=b[O];O===E?L+=(d?"*":T.cho)+"."+(D?"*":T.jung)+"."+(p?"*":T.jong)+".":L+=T.cho+"."+T.jung+"."+T.jong+"."}return L},j=new Map;for(const b of h){const L=M(b.dPron),O=j.get(L);O?O.push(b):j.set(L,[b])}for(const b of f){const L=j.get(M(b.dPron))??[],O=[];for(const T of L){if(T.w===b.w)continue;let $=!0;for(const G of a){const Q=b.dPron[E][G],z=T.dPron[E][G];if(z===Q){$=!1;break}if(c&&s[G].has(un[G][z])){$=!1;break}}$&&(o&&rn(b.dPron,T.dPron)||O.push(T.w))}l.set(b.w,O)}}}return l}const Oe=0,Xn=1,J=2,an=3,xo=4,ke=5,sn=6,$e=7,Wo=8,ln=9,X=10,Ho=11,ge=12,Yo=13,de=14,Ie=15,Me=16,fe=17,Ko=18,I=0,W=1,Uo=3,U=4,cn=5,he=6,F=7,_=8,et=9,nt=10,Pe=11,tt=12,Cn=13,ee=15,ve=16,H=17,ot=18,gn=21,dn=27,Vo=20,zo={1:Oe,2:Xn,4:J,7:an,8:ke,16:sn,17:$e,19:ln,20:X,22:ge,23:de,24:Ie,25:Me,26:fe},Jo={[Uo]:[W,X],[cn]:[U,ge],[et]:[_,Oe],[nt]:[_,sn],[Pe]:[_,$e],[tt]:[_,X],[Cn]:[_,Me],14:[_,fe],[ot]:[H,X]},qo={[he]:J,[ee]:ke},fn={2:W,24:W,3:W,9:W,5:U,6:U,19:F,20:F,22:F,23:F,25:F,27:F,11:_,12:_,13:_,15:_,10:ve,14:H,18:H,26:H},ut={[Oe]:Ie,[an]:Me,[$e]:fe,[ge]:de},rt={[Oe]:Xn,[an]:xo,[$e]:Wo,[ln]:X,[ge]:Yo},Qo=new Set([cn,nt,Pe,tt,Cn,ee,ot]),Zo=new Set(["\uBC1F"]);function Xo(e){const n=(e??"").trim();if(!n)return"";const t=[...n],o=t.map(S);if(o.some(i=>i===null))return n;const r=o;for(let i=0;i<r.length;i++){const u=r[i],a=r[i+1],s=u.jong;if(!a){u.jong=fn[u.jong]??u.jong;break}if(u.jong===I)continue;if(a.cho===Ho){if(a.jung===Vo){if(u.jong===F){u.jong=I,a.cho=ge;continue}if(u.jong===25){u.jong=I,a.cho=de;continue}if(u.jong===Cn){u.jong=_,a.cho=de;continue}}if(u.jong===dn){u.jong=I;continue}const C=qo[u.jong];if(C!==void 0){u.jong=I,a.cho=C;continue}const l=Jo[u.jong];if(l){u.jong=l[0],a.cho=l[1];continue}const g=zo[u.jong];g!==void 0&&(u.jong=I,a.cho=g);continue}if((u.jong===dn||u.jong===he||u.jong===ee)&&ut[a.cho]!==void 0){a.cho=ut[a.cho],u.jong=u.jong===he?U:u.jong===ee?_:I;continue}if((u.jong===dn||u.jong===he||u.jong===ee)&&a.cho===ln){a.cho=X,u.jong=u.jong===he?U:u.jong===ee?_:I;continue}if(a.cho===Ko){if(u.jong===cn){u.jong=U,a.cho=de;continue}if(u.jong===et){u.jong=_,a.cho=Ie;continue}if(u.jong===Pe){u.jong=_,a.cho=fe;continue}const C=fn[u.jong]??u.jong;if(C===W){u.jong=I,a.cho=Ie;continue}if(C===F){u.jong=I,a.cho=Me;continue}if(C===H){u.jong=I,a.cho=fe;continue}}let c=fn[u.jong]??u.jong;s===Pe&&Zo.has(t[i])&&(c=H),u.jong=c,rt[a.cho]!==void 0&&(c===W||c===F||c===H||Qo.has(s))&&(a.cho=rt[a.cho]),(a.cho===J||a.cho===sn)&&(u.jong===W?u.jong=gn:u.jong===F?u.jong=U:u.jong===H&&(u.jong=ve)),a.cho===ke?u.jong===U?u.jong=_:u.jong===ve||u.jong===gn?a.cho=J:u.jong===W?(u.jong=gn,a.cho=J):u.jong===H&&(u.jong=ve,a.cho=J):u.jong===_&&a.cho===J&&(a.cho=ke)}return r.map(i=>x(i.cho,i.jung,i.jong)).join("")}const ne=/[ㄱ-ㅎ]/,eu=/[ㅏ-ㅣ]/;function me(e){e=e.normalize("NFC");for(let n=e.length-1;n>=0;n--){const t=e[n],o=t.charCodeAt(0);if(o>=44032&&o<=55203||ne.test(t)||eu.test(t))return t}return null}function it(e){const n=me(e);if(!n)return"\uAC00";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC774":"\uAC00":ne.test(n)?"\uC774":"\uAC00"}function nu(e){return`${e}${it(e)}`}function at(e){const n=me(e);if(!n)return"\uB97C";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC744":"\uB97C":ne.test(n)?"\uC744":"\uB97C"}function tu(e){return`${e}${at(e)}`}function st(e){const n=me(e);if(!n)return"\uB294";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC740":"\uB294":ne.test(n)?"\uC740":"\uB294"}function ou(e){return`${e}${st(e)}`}function lt(e){const n=me(e);if(!n)return"\uC640";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uACFC":"\uC640":ne.test(n)?"\uACFC":"\uC640"}function uu(e){return`${e}${lt(e)}`}function ct(e){const n=me(e);if(!n)return"\uB85C";const t=n.charCodeAt(0);if(t>=44032&&t<=55203){const o=(t-44032)%28;return o===0||o===8?"\uB85C":"\uC73C\uB85C"}return n==="\u3139"?"\uB85C":ne.test(n)?"\uC73C\uB85C":"\uB85C"}function ru(e){return`${e}${ct(e)}`}function iu(e,n,t){const o=e.slice(),[r]=o.splice(n,1);return o.splice(t,0,r),o}function R(e,n=Math.random){const t=e.slice();for(let o=t.length-1;o>0;o--){const r=Math.floor(n()*(o+1));[t[o],t[r]]=[t[r],t[o]]}return t}function Y(e,n,t=Math.random){return!Array.isArray(e)||e.length===0||n<=0?[]:n>=e.length?R(e,t):R(e,t).slice(0,n)}const Ct={SAME_SOUND_PICK:{difficulty:!0,choseong:!0,group:"discrimination"},SAME_OR_DIFF:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_SAME:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_INCLUDED:{difficulty:!0,choseong:!0,group:"discrimination"},STARTS_WITH_SAME_SOUND:{difficulty:!1,choseong:!0,group:"discrimination"},LISTEN_AND_REMEMBER_ORDER:{difficulty:!1,choseong:!0,group:"attention"},MERGE_2_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_2_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},DROP_1_FROM_2SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_1_FROM_3SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_PART_FROM_COMPOUND:{difficulty:!1,choseong:!0,group:"deletion"},DROP_FINAL_CONSONANT_FROM_1SYLL:{difficulty:!1,choseong:!0,group:"deletion"},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{difficulty:!1,choseong:!0,group:"deletion"},CHANGE_1_SYLL_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_SYLL_IN_3SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_1SYLL:{difficulty:!1,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"}};function au(e){const n=e?Ct[e]?.group:void 0;return n==="synthesis"||n==="deletion"||n==="substitution"?n:null}const hn=A.indexOf("\u3147"),gt={DROP_FINAL_CONSONANT_FROM_1SYLL:{syllables:1,syllable:e=>e.jong>0},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{syllables:1,syllable:e=>e.jong===0&&e.cho!==hn},MERGE_2_SYLLABLES:{syllables:2,syllable:()=>!0},MERGE_3_SYLLABLES:{syllables:3,syllable:()=>!0},MERGE_2_PHONEMES:{syllables:1,syllable:e=>e.jong===0&&e.cho!==hn},MERGE_3_PHONEMES:{syllables:1,syllable:e=>e.jong>0&&!Re[e.jong]&&e.cho!==hn}},su=new Set([]);function lu(e){return e in gt}function cu(e,n){const t=gt[e];if(!t)return!0;const o=[...n];if(o.length!==t.syllables)return!1;const r=S(o[0]);return!!r&&t.syllable(r)}function Cu(e){return su.has(e)}function gu(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uC640":"\uACFC"}function Se(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uB97C":"\uC744"}function mn(e){const n=e.charCodeAt((e.length||1)-1)||0;if(n<44032||n>55203)return"\uB85C";const t=(n-44032)%28;return t===0||t===8?"\uB85C":"\uC73C\uB85C"}function dt(e){const n=e.charAt((e.length||1)-1),t=n.charCodeAt(0)||0;return t>=44032&&t<=55203?(t-44032)%28===0?"\uAC00":"\uC774":/[ㄱ-ㅎ]/.test(n)?"\uC774":"\uAC00"}const Sn={\u3131:"\uAE30\uC5ED",\u3132:"\uC30D\uAE30\uC5ED",\u3134:"\uB2C8\uC740",\u3137:"\uB514\uADFF",\u3138:"\uC30D\uB514\uADFF",\u3139:"\uB9AC\uC744",\u3141:"\uBBF8\uC74C",\u3142:"\uBE44\uC74D",\u3143:"\uC30D\uBE44\uC74D",\u3145:"\uC2DC\uC637",\u3146:"\uC30D\uC2DC\uC637",\u3147:"\uC774\uC751",\u3148:"\uC9C0\uC752",\u3149:"\uC30D\uC9C0\uC752",\u314A:"\uCE58\uC753",\u314B:"\uD0A4\uC754",\u314C:"\uD2F0\uC755",\u314D:"\uD53C\uC756",\u314E:"\uD788\uC757",\u3133:"\uAE30\uC5ED\uC2DC\uC637",\u3135:"\uB2C8\uC740\uC9C0\uC752",\u3136:"\uB2C8\uC740\uD788\uC757",\u313A:"\uB9AC\uC744\uAE30\uC5ED",\u313B:"\uB9AC\uC744\uBBF8\uC74C",\u313C:"\uB9AC\uC744\uBE44\uC74D",\u313D:"\uB9AC\uC744\uC2DC\uC637",\u313E:"\uB9AC\uC744\uD2F0\uC755",\u313F:"\uB9AC\uC744\uD53C\uC756",\u3140:"\uB9AC\uC744\uD788\uC757",\u3144:"\uBE44\uC74D\uC2DC\uC637",\u314F:"\uC544",\u3150:"\uC560",\u3151:"\uC57C",\u3152:"\uC598",\u3153:"\uC5B4",\u3154:"\uC5D0",\u3155:"\uC5EC",\u3156:"\uC608",\u3157:"\uC624",\u3158:"\uC640",\u3159:"\uC65C",\u315A:"\uC678",\u315B:"\uC694",\u315C:"\uC6B0",\u315D:"\uC6CC",\u315E:"\uC6E8",\u315F:"\uC704",\u3160:"\uC720",\u3161:"\uC73C",\u3162:"\uC758",\u3163:"\uC774"};function du(e){if([...e].length!==1)return[e];const n=S(e);if(!n)return[e];const t=[A[n.cho],w[n.jung]];return n.jong!==0&&t.push(B[n.jong]),t}function ft(e,n=!1){const t=e.filter(Boolean);if(t.length<2)return"";const o=a=>Sn[a]??a,r=t.slice(0,-1).map(a=>`"${a}"${gu(o(a))}`).join(" "),i=t[t.length-1],u=`"${i}"${Se(o(i))}`;return`${r} ${u} \uD569\uCE58\uBA74 \uC5B4\uB5A4 ${n?"\uC18C\uB9AC":"\uB2E8\uC5B4"}\uAC00 \uB418\uB098\uC694?`}function fu(e,n){return ft(n,e==="MERGE_2_PHONEMES"||e==="MERGE_3_PHONEMES")}const yn=e=>Sn[e]??e,hu={cho:"\uCD08\uC131",jung:"\uBAA8\uC74C",jong:"\uBC1B\uCE68"};function mu(e,n){const t=(s,c)=>{const C=[...s].length===1?S(s):null,l=[...c].length===1?S(c):null;if(!C||!l)return null;const g=["cho","jung","jong"].filter(h=>C[h]!==l[h]);return g.length===1?{part:g[0],sx:C,sy:l}:null},o=t(e,n)??t(Fe(e),Fe(n));if(!o)return null;const r=o.part==="cho"?A:o.part==="jung"?w:B,i=r[o.sx[o.part]],u=r[o.sy[o.part]],a=o.part==="jong"&&!i?"add":o.part==="jong"&&!u?"remove":"swap";return{part:o.part,from:i,to:u,kind:a}}function Su(e,n){const t=String(n?.word??n?.original??""),o=String(n?.changedFrom??""),r=String(n?.changedTo??"");if(e==="CHANGE_1_PHONEME_IN_1SYLL"||e==="CHANGE_1_PHONEME_IN_2SYLL"){const i=e==="CHANGE_1_PHONEME_IN_1SYLL",u=i?o||t:o,a=mu(u,r);if(a){const s=i?`"${t}"`:`"${t}"\uC758 "${u}"`,c=a.kind==="add"?"\uC5D0":"\uC5D0\uC11C",C=`"${a.from}"${Se(yn(a.from))}`,l=`"${a.to}"${mn(yn(a.to))}`;return a.kind==="add"?`${s}${c} \uBC1B\uCE68 "${a.to}"${Se(yn(a.to))} \uB354\uD558\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:a.kind==="remove"?`${s}${c} \uBC1B\uCE68 ${C} \uBE7C\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:`${s}${c} ${hu[a.part]} ${C} ${l} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`}}return e==="CHANGE_1_PHONEME_IN_1SYLL"?`"${t}"${Se(t)} "${r}"${mn(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:`"${t}"\uC5D0\uC11C "${o}"${Se(o)} "${r}"${mn(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`}function yu(e,n){const t=String(n?.word??n?.original??n?.base??""),o=String(n?.dropped??"");if(e==="DROP_FINAL_CONSONANT_FROM_1SYLL")return`"${t}"\uC5D0\uC11C \uBC1B\uCE68\uC774 \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`;if(e==="REMOVE_CONSONANT_AND_IDENTIFY_PHONEME"){const r=String(n?.missingConsonant??"");return`"${t}"\uC5D0\uC11C "${r}"${dt(r)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB418\uB098\uC694?`}return`"${t}"\uC5D0\uC11C "${o}"${dt(o)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`}function Eu(e,n,t){switch(au(e)){case"synthesis":return fu(e,t);case"substitution":return Su(e,n);case"deletion":return yu(e,n);default:return""}}function Du(e){return e.replace(/"([ㄱ-ㅣ])"(으로|와|과|을|를|이|가|은|는|로)?/g,(n,t,o)=>{const r=Sn[t];if(!r)return n;if(!o)return`"${r}"`;const i=(r.charCodeAt(r.length-1)-44032)%28,u=i!==0;let a=o;return o==="\uC640"||o==="\uACFC"?a=u?"\uACFC":"\uC640":o==="\uC744"||o==="\uB97C"?a=u?"\uC744":"\uB97C":o==="\uC774"||o==="\uAC00"?a=u?"\uC774":"\uAC00":o==="\uC740"||o==="\uB294"?a=u?"\uC740":"\uB294":(o==="\uC73C\uB85C"||o==="\uB85C")&&(a=i===0||i===8?"\uB85C":"\uC73C\uB85C"),`"${r}"${a}`})}const Tu=e=>e==null?[]:Array.isArray(e)?e:[e];function Fe(e){if([...e].length!==1)return"";const n=S(e);if(!n)return"";const t=Qn(B[n.jong]),o=t===""?0:B.indexOf(t);return x(n.cho,n.jung,o<0?0:o)}function En(e,n){return n.get(e)||Fe(e)||e}function Ge(e){return e?k(e.cho)?"cho":k(e.jung)?"jung":k(e.jong)?"jong":null:null}function q(e,n){const t=(r,i)=>!k(r)||Tu(r).includes(i),o=n.jongNone?e.jong===0:t(n.jong,B[e.jong]);return t(n.cho,A[e.cho])&&t(n.jung,w[e.jung])&&o}function te(e,n,t){const o=[...e];if(t!=="pron")return o.map(i=>S(i));const r=[...n.get(e)||e];return r.length!==o.length?o.map(i=>S(i)):r.map(i=>S(i))}function oe(e,n,t,o,r){const i=n==="cho"?A:n==="jung"?w:B,u=e[n],a=[],s=l=>n==="jung"?Au(En(l,r)):En(l,r),c=new Map([[s(t),-1]]),C=R(i.map((l,g)=>g).filter(l=>l!==u&&(n!=="cho"||i[l]!=="\u3147")&&(n!=="jong"||l!==0)));for(const l of C){if(a.length>=o)break;const g=n==="cho"?x(l,e.jung,e.jong):n==="jung"?x(e.cho,l,e.jong):x(e.cho,e.jung,l),h=s(g),m=c.get(h);if(m!==void 0){n==="jung"&&m>=0&&r.has(g)&&!r.has(a[m])&&(a[m]=g);continue}c.set(h,a.length),a.push(g)}return a}const pu={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function Au(e){if([...e].length!==1)return e;const n=S(e);if(!n)return e;const t=pu[w[n.jung]];return t?x(n.cho,w.indexOf(t),n.jong):e}function wu(e,n,t,o,r,i=null){const u=[...e];if(u.length!==2)return null;const a=u.map(l=>S(l));if(a.some(l=>!l))return null;const s=te(e,t,o);if(s.some(l=>!l))return null;const c=Ge(n);let C=c&&n?s.map((l,g)=>q(l,n)?g:-1).filter(l=>l>=0):[0,1];if(i!=null&&(C=C.filter(l=>l!==i)),!C.length)return null;for(const l of R(C)){const g=u[l];if(!r.has(g))continue;const h=oe(a[l],c??"cho",g,40,t),m=[];for(const y of h)if(y!==g&&r.has(y)&&!m.includes(y)&&m.push(y),m.length>=2)break;if(!(m.length<2))return{question:e,distractors:[g,...m]}}return null}function bu(e,n,t,o,r,i=null){const u=[...e];if(u.length!==3)return null;const a=u.map(l=>S(l));if(a.some(l=>!l))return null;const s=te(e,t,o);if(s.some(l=>!l))return null;const c=Ge(n),C=c&&n?s.map((l,g)=>q(l,n)?g:-1).filter(l=>l>=0):[0,1,2];if(!C.length)return null;for(const l of R(C))for(const g of R([0,1,2].filter(h=>h!==l&&(i==null||h===i)))){const h=[0,1,2].filter(d=>d!==g),m=h.map(d=>u[d]).join("");if(!r.has(m))continue;const y=h.indexOf(l),E=oe(a[l],c??"cho",u[l],40,t),f=[];for(const d of E){const D=h.map(M=>u[M]);D[y]=d;const p=D.join("");if(p!==m&&r.has(p)&&!f.includes(p)&&f.push(p),f.length>=2)break}if(!(f.length<2))return{question:e,distractors:[m,...f]}}return null}function _u(e,n,t,o,r,i=null){const u=[...e],a=u.length;if(a<2)return null;const s=[];for(let C=1;C<=a-1;C++)s.push({remain:u.slice(0,C).join(""),dropped:u.slice(C).join(""),droppedEnd:1}),s.push({remain:u.slice(a-C).join(""),dropped:u.slice(0,a-C).join(""),droppedEnd:0});const c=Ge(n);for(const{remain:C,dropped:l,droppedEnd:g}of R(s)){if(i!=null&&g!==i||[...C].length===1&&[...l].length===1||C===e||!r.has(C)||!r.has(l))continue;const h=[...C],m=h.map(f=>S(f));if(m.some(f=>!f))continue;const y=te(C,t,o);if(y.some(f=>!f))continue;const E=c&&n?y.map((f,d)=>q(f,n)?d:-1).filter(f=>f>=0):h.map((f,d)=>d);if(E.length)for(const f of R(E)){const d=oe(m[f],c??"cho",h[f],40,t),D=[];for(const p of d){const M=[...h];M[f]=p;const j=M.join("");if(j!==C&&r.has(j)&&!D.includes(j)&&D.push(j),D.length>=2)break}if(D.length>=2)return{question:e,distractors:[C,...D],dropped:l}}}return null}function Bu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=S(t.get(e)||e);if(!u||u.jong===0)return null;const a=x(u.cho,u.jung,0),s=oe({cho:u.cho,jung:u.jung,jong:0},"cho",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}const Dn=A.indexOf("\u3147");function Nu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=S(t.get(e)||e);if(!u||u.jong!==0||u.cho===Dn)return null;const a=x(Dn,u.jung,0),s=oe({cho:Dn,jung:u.jung,jong:0},"jung",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}function ju(e){const n=new Map;for(const t of e){const o=[...t],r=o.length;if(!(r<2||r>3))for(let i=0;i<r;i++){let u=r+"|"+i+"|";for(let s=0;s<r;s++)u+=s===i?"*":o[s];const a=n.get(u);a?a.push(t):n.set(u,[t])}}return n}function Lu(e,n,t,o,r,i=null,u=null,a=2){const s=[...e],c=s.length;if(c<2||c>3)return null;const C=s.map(d=>S(d));if(C.some(d=>!d))return null;const l=te(e,t,o);if(l.some(d=>!d))return null;const g=d=>t.get(d)??d,h=g(e),m=!!n&&(k(n.cho)||k(n.jung)||k(n.jong)),y=!!u&&(k(u.cho)||k(u.jung)||k(u.jong)),E=d=>{let D=c+"|"+d+"|";for(let p=0;p<c;p++)D+=p===d?"*":s[p];return D};let f;if(i!=null){if(i>=c||m&&!q(l[i],n))return null;f=[i]}else m?f=l.map((d,D)=>q(d,n)?D:-1).filter(d=>d>=0):f=Array.from({length:c},(d,D)=>D);for(const d of R(f)){const D=r.get(E(d))??[],p=[],M=[];for(const T of D){if(T===e)continue;const $=[...T].map(Be=>S(Be)),G=C[d],Q=$[d];if(!G||!Q)continue;let z=0;if(G.cho!==Q.cho&&z++,G.jung!==Q.jung&&z++,G.jong!==Q.jong&&z++,!(z<a||g(T)===h))if(y){const Be=te(T,t,o)[d];Be&&q(Be,u)?p.push(T):M.push(T)}else p.push(T)}if(!p.length)continue;const j=R(p)[0],b=[],L=new Set([h,g(j)]),O=y?M:p.filter(T=>T!==j);for(const T of R(O)){const $=g(T);if(!L.has($)&&(L.add($),b.push(T),b.length>=2))break}if(!y&&b.length<2)for(const T of R(D)){if(T===e||T===j)continue;const $=g(T);if(!L.has($)&&(L.add($),b.push(T),b.length>=2))break}if(!(b.length<2))return{question:e,distractors:[j,...b]}}return null}const Ru=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",n=typeof Ne?.t=="function"?Ne.t("common.unknownError",{defaultValue:e}):void 0;return typeof n=="string"&&n?n:e};function Ou(e,n){if(n===void 0&&(n=Ru()),e instanceof Error)return e.message||n;if(typeof e=="string")return e||n;if(e&&typeof e=="object"){const t=e;for(const o of[t.message,t.error_description,t.error])if(typeof o=="string"&&o)return o}return n}const Tn="\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC774 \uBD88\uC548\uC815\uD569\uB2C8\uB2E4. \uC5F0\uACB0 \uC0C1\uD0DC\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",ku=()=>{const e=typeof Ne?.t=="function"?Ne.t("common.networkError",{defaultValue:Tn}):void 0;return typeof e=="string"&&e?e:Tn};function ht(e){return e?/failed to fetch|load failed|networkerror|network request failed|fetcherror/i.test(e):!1}function $u(e){return ht(e)?ku():e}function Iu(e,n){return e==="id"?void 0:`${e}|${n?"asc":"desc"}`}function Mu(e){const[n,t]=e.split("|");return{key:n,asc:t==="asc"}}function Pu(e){let n=e==null?"":String(e);return!(typeof e=="number"&&Number.isFinite(e))&&/^[=+\-@\t\r]/.test(n)&&(n="'"+n),/[",\n\r]/.test(n)?`"${n.replaceAll('"','""')}"`:n}const vu=1e3;function Fu(e,n){const t=new Blob([n.startsWith("\uFEFF")?n:"\uFEFF"+n],{type:"text/csv;charset=utf-8"}),o=URL.createObjectURL(t),r=document.createElement("a");r.href=o,r.download=e,r.click(),setTimeout(()=>URL.revokeObjectURL(o),vu)}const mt="__ihab_core_word_pool__";function Gu(){typeof window<"u"&&window.dispatchEvent(new CustomEvent("wordpool:update"))}function xu(e,n){const t=new Map;for(const r of e)t.set(r.word,r);const o={entries:e,pairIndex:n??null,byWord:t};globalThis[mt]=o,Gu()}function St(){return globalThis[mt]??null}const ue=globalThis;function pn(e,n){const t=o=>{};try{const o=n();o&&typeof o.catch=="function"&&o.catch(t)}catch(o){t(o)}}function Wu(e){ue.__ihabTrainingTimeLogger=e}function Hu(e){pn("time",()=>ue.__ihabTrainingTimeLogger?.(e))}function Yu(e){ue.__ihabTrainingCompletionLogger=e}function Ku(e){pn("completion",()=>ue.__ihabTrainingCompletionLogger?.(e))}function Uu(e){ue.__ihabCrosswordLogger=e}function Vu(e){pn("crossword",()=>ue.__ihabCrosswordLogger?.(e))}function N(e){return typeof e=="string"?e.trim()||null:typeof e=="number"?String(e):null}function yt(e){for(const n of["correct","isCorrect","heard","judgement"])if(typeof e[n]=="boolean")return e[n];return e.score===1?!0:e.score===0?!1:null}function zu(e){return Array.isArray(e)?e.map((n,t)=>{const o=n??{};return{index:t,itemId:N(o.contextCode)??N(o.itemId)??N(o.itemCode)??N(o.id),question:N(o.question)??N(o.q)??N(o.sentence)??N(o.text)??N(o.prompt)??N(o.word)??N(o.targetSyllable),answer:N(o.answer),selected:N(o.selectedText)??N(o.selected),correct:yt(o)}}):[]}function Ju(e){return e.filter(n=>n.correct===!1)}let Et=null,Dt=null,Tt=null;function qu(e){Et=e}function Qu(e){Dt=e}function Zu(e){Tt=e}async function Xu(e,n){try{return await Et?.(e,n)??null}catch{return null}}async function er(){try{return await Dt?.()??null}catch{return null}}async function nr(e,n){try{return await Tt?.(e,n)??null}catch{return null}}const xe=globalThis;function tr(e){xe.__ihabNoiseSettingsStore=e}async function or(){try{return await xe.__ihabNoiseSettingsStore?.load()??null}catch{return null}}function ur(e){const n=t=>{};try{const t=xe.__ihabNoiseSettingsStore?.save(e);t&&typeof t.catch=="function"&&t.catch(n)}catch(t){n(t)}}function rr(e){try{xe.__ihabNoiseSettingsStore?.applied?.(e)}catch{}}function We(e){const n=new TextEncoder().encode(String(e).normalize("NFC"));let t="";return n.forEach(o=>{t+=o.toString(16).padStart(2,"0")}),t}const ir=We;function ar(e,n){return`${e}/${We(n)}.mp3`}function sr(e={}){const n=e.storagePrefix??"audio-cache",t=e.voice??"ko-f",o=typeof e.speed=="number"?e.speed:1,r=e.filenameSanitizer??We;return async function(i){const u=String(i||"").trim();if(!u)return"";const a=`${r(u)}_${t}.mp3`,s=`${n}/${a}`;try{if(await jn(s)){const c=await Ln(s);if(c)return c}}catch{}if(e.generator)try{const c=await e.generator(u,s,e);if(c)return c}catch{}try{const c=`/api/tts?word=${encodeURIComponent(u)}&voice=${encodeURIComponent(t)}&speed=${encodeURIComponent(String(o))}`;return await fetch(c,{method:"GET"}),`/audio-cache/${a}`}catch{return`/audio-cache/${a}`}}}async function lr(e){if(typeof document<"u"){const n=document.activeElement;let t=null;try{if(t=document.createElement("textarea"),t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.opacity="0",t.style.pointerEvents="none",document.body.appendChild(t),t.focus(),t.select(),t.setSelectionRange(0,e.length),document.execCommand("copy"))return!0}catch{}finally{if(t?.parentNode&&t.parentNode.removeChild(t),n&&n!==document.activeElement&&typeof n.focus=="function"&&n.isConnected)try{n.focus({preventScroll:!0})}catch{}}}try{if(typeof navigator<"u"&&navigator.clipboard&&typeof navigator.clipboard.writeText=="function")return await navigator.clipboard.writeText(e),!0}catch{}return!1}const re="Asia/Seoul",cr=/^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2})(?::(\d{2})(?:\.(\d+))?)?$/;function He(e){let n;if(e instanceof Date)n=e;else if(typeof e=="string"){const t=e.trim(),o=cr.exec(t);n=new Date(o?`${o[1]}T${o[2]}:${o[3]??"00"}${o[4]?`.${o[4].slice(0,3).padEnd(3,"0")}`:""}+09:00`:t)}else n=new Date(e);return Number.isNaN(n.getTime())?null:n}const ye=e=>He(e);function Cr(e){const n=ye(e);return n?n.toLocaleDateString("ko-KR",{timeZone:re,year:"numeric",month:"short",day:"numeric"}):""}function gr(e){const n=ye(e);return n?n.toLocaleString("ko-KR",{timeZone:re,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function dr(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US",o=ye(e);return o?o.toLocaleDateString(t,{timeZone:re,year:"numeric",month:"short",day:"numeric"}):""}function fr(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US",o=ye(e);return o?o.toLocaleString(t,{timeZone:re,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function hr(e){const n=ye(e);return n?n.toLocaleString("ko-KR",{timeZone:re,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):""}function mr(e){if(e==null||e==="")return"";const n=He(e);return n?new Intl.DateTimeFormat("en-GB",{timeZone:re,hour:"2-digit",minute:"2-digit",hour12:!1}).format(n):""}function An(){return Ee(new Date)}function Sr(){return pt(An())}const yr=540*60*1e3;function Er(e,n,t){return new Date(Date.UTC(e,n,t)-yr)}function pt(e){const[n,t,o]=e.split("-").map(Number);return new Date(n,(t||1)-1,o||1)}function Ee(e){if(e==null||e==="")return"";const n=He(e);return n?new Intl.DateTimeFormat("fr-CA",{timeZone:"Asia/Seoul"}).format(n):""}function Dr(e,n){if(!e)return"";const t=He(e);if(!t)return"";const o=t.getTime(),r=Math.max(0,Math.floor((Date.now()-o)/1e3)),i=Math.floor(r/60),u=Math.floor(i/60),a=Math.floor(u/24),s=Math.floor(a/7),c=Math.floor(a/30),C=Math.floor(a/365);return i<1?n("store.time.justNow","\uBC29\uAE08 \uC804"):i<60?n("store.time.minutesAgo",{n:i}):u<24?n("store.time.hoursAgo",{n:u}):a<7?n("store.time.daysAgo",{n:a}):s<5?n("store.time.weeksAgo",{n:s}):a<365?n("store.time.monthsAgo",{n:Math.min(c,11)}):n("store.time.yearsAgo",{n:C})}function Tr(e,n={}){const{sep:t=".",pad:o=!0,trailingDot:r=!1,fallback:i="\u2014"}=n;if(!e)return i;const u=Ee(e instanceof Date?e:String(e));if(!u)return i;const[a,s,c]=u.split("-"),C=o?s:String(Number(s)),l=o?c:String(Number(c));return`${a}${t}${C}${t}${l}${r?".":""}`}function pr(e){const n=e.normalize("NFKC").replace(/\D/g,"");if(/^(050\d|0303)/.test(n)){const o=n.slice(0,12);return o.length<=4?o:o.length<=8?`${o.slice(0,4)}-${o.slice(4)}`:`${o.slice(0,4)}-${o.slice(4,o.length-4)}-${o.slice(o.length-4)}`}if(/^1[5-9]\d{2}/.test(n)&&n.length<=8)return n.length<=4?n:`${n.slice(0,4)}-${n.slice(4)}`;const t=n.slice(0,11);return t.startsWith("02")?t.length<=2?t:t.length<=6?`${t.slice(0,2)}-${t.slice(2)}`:`${t.slice(0,2)}-${t.slice(2,t.length-4)}-${t.slice(t.length-4)}`:t.length<=3?t:t.length<=7?`${t.slice(0,3)}-${t.slice(3)}`:`${t.slice(0,3)}-${t.slice(3,t.length-4)}-${t.slice(t.length-4)}`}function Ar(e){if(e){if(/^\d{4}\.\d{2}\.\d{2}$/.test(e))return e;if(/^\d{8}$/.test(e))return`${e.slice(0,4)}.${e.slice(4,6)}.${e.slice(6,8)}`;if(/^\d{4}-\d{2}-\d{2}$/.test(e))return e.replace(/-/g,".");if(/^\d{4}-\d{2}-\d{2}[T ]/.test(e)){const n=Ee(e);return n?n.replace(/-/g,"."):void 0}}}function wr(e){if(e)return/^\d{4}\.\d{2}\.\d{2}$/.test(e)?e.replace(/\./g,"-"):e}function br(e,n){if(!e)return"-";const t=/^(\d{1,2}):(\d{2})$/.exec(e.trim());if(!t)return e;const o=Number(t[1]),r=Number(t[2]),i=t[1].padStart(2,"0");return r===0?n("date.timeH",{h:o,hh:i,mm:t[2]}):n("date.timeHM",{h:o,hh:i,m:r,mm:t[2]})}function _r(e){return(e??0).toLocaleString("ko-KR")}const Br=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Nr=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uC18C\uC74C \uD658\uACBD \uC18D \uBB38\uC7A5 \uC774\uD574 \uD6C8\uB828"},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30 + 4\uBB38\uC81C"},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30 \uC2EC\uD654 \uD6C8\uB828"},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC21C\uC11C \uBC30\uC5F4 \uD6C8\uB828"}];let wn=null;function jr(e){wn=e}function Lr(){return wn?.topicTypes??Br}function Rr(){return wn?.trainingTypes??Nr}const At="ihab_theme",wt="light";function bt(){try{const e=localStorage.getItem(At);if(e==="light"||e==="dark"||e==="auto")return e}catch{}return wt}function _t(e){const n=e==="light"||e==="dark"||e==="auto"?e:wt;try{document.documentElement.setAttribute("data-theme",n),localStorage.setItem(At,n)}catch{}}function Or(){_t(bt())}const Bt="ihab_font_scale",kr="medium",$r=["medium","large1","large2","large3"];function Nt(){try{const e=localStorage.getItem(Bt);if($r.includes(e))return e}catch{}return kr}function jt(e){try{document.documentElement.setAttribute("data-font-scale",e),localStorage.setItem(Bt,e)}catch{}}function Ir(){jt(Nt())}const De=[],Te=[],pe=[],Ae=[],we={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},be={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Mr={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let bn=null,Lt=null,V=null;function Rt({counts:e,forceRefresh:n}={}){const t=Object.assign({},Mr,e||{}),o=An(),r=Ee(new Date(`${o}T00:00:00+09:00`).getTime()-864e5),i=JSON.stringify(t);if(!n&&Lt===o&&bn===i&&V)return Object.assign(we,V.today),Object.assign(be,V.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:we,yesterday:be};const u={LISTEN_IN_NOISE:Y(De,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:Y(Te,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:Y(pe,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:Y(Ae,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return V&&bn===i&&V.yesterday&&V.yesterday.date===r&&(a=V.yesterday.selection),a||(a={LISTEN_IN_NOISE:Y(De,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:Y(Te,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:Y(pe,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:Y(Ae,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(we,u),Object.assign(be,a),Lt=o,bn=i,V={today:u,yesterday:{date:r,countsKey:i,selection:a}},{today:we,yesterday:be}}function Pr(){return{today:we,yesterday:be}}function vr(){return{LISTEN_IN_NOISE:De,SHORT_STORY:Te,LONG_STORY:pe,ORDERING_SENTENCE:Ae}}let Ye=!1,_e=null;async function Fr(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:Ue&&Ue.tagName.toUpperCase()==="SCRIPT"&&Ue.src||new URL("utils.cjs.js",document.baseURI).href}&&void 0||"/",n=await fetch(`${e}data/allTrainingData.json`);return n.ok?await n.json():null}catch{return null}}async function Ot(){if(!Ye)return _e||(_e=(async()=>{const e=await Fr();if(!e){_e=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}const n={noise:[],short:[],long:[],order:[]};try{for(const t of Object.keys(e||{})){const o=e[t]||[];for(const r of o){if(!r||typeof r!="object")continue;const i=r,u=String(i.training_type||t),a=String(i.category_main_code||i.category_main||i.category_0||""),s=String(i.category_sub_code||i.category_sub||i.category_1||""),c=Object.assign({},i,{training_type:u,category_0:a,category_1:s});u==="LISTEN_IN_NOISE"?n.noise.push(c):u==="SHORT_STORY"?n.short.push(c):u==="LONG_STORY"?n.long.push(c):u==="ORDERING_SENTENCE"&&n.order.push(c)}}}catch{_e=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}De.push(...n.noise),Te.push(...n.short),pe.push(...n.long),Ae.push(...n.order),Ye=!0;try{Rt()}catch{}try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}})(),_e)}function Gr(){return Ye}async function xr(e=3e3){const n=Ot();let t;try{await Promise.race([n,new Promise(o=>{t=setTimeout(o,e)})])}finally{t!==void 0&&clearTimeout(t)}return Ye}const Wr=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uB2E4\uC591\uD55C \uC18C\uC74C \uD658\uACBD\uC5D0\uC11C \uBB38\uC7A5 \uCCAD\uB825\uC744 \uD6C8\uB828\uD569\uB2C8\uB2E4."},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uB2E4\uC218\uC758 \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC5EC\uB7EC\uAC1C\uC758 \uC9E7\uC740 \uBB38\uC7A5\uC744 \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uADF8 \uC21C\uC11C\uC5D0 \uB9DE\uAC8C \uBC30\uC5F4\uD569\uB2C8\uB2E4."}],Hr=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Yr={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};let Ke=null,kt=null,$t=null;function Kr(){const e=St();if(e&&e.entries.length>0){const n=Jn();if(Ke&&kt===e&&$t===n)return Ke;const t=new Set,o=[];for(const r of e.entries)!r.word||t.has(r.word)||(t.add(r.word),o.push({w:r.word,s:r.syllables,p:n?.[r.word]?[...n[r.word].cho??[],...n[r.word].jung??[],...n[r.word].jong??[]]:[],pron:r.pronunciation||r.word,grade:r.grade}));return Ke=o,kt=e,$t=n,Ke}return[]}new Proxy([],{get(e,n){const t=Kr(),o=t[n];return typeof o=="function"?o.bind(t):o}});const Ur={free:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},personal_standard:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},mgr_free:{maxCustomers:5,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},none:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},lite_word:{maxCustomers:10,visitWord:!0,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!1},lite_sentence:{maxCustomers:10,visitWord:!1,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!0},lite:{maxCustomers:10,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},standard:{maxCustomers:30,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},pro:{maxCustomers:50,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0},enterprise:{maxCustomers:1/0,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!0,managerManagement:!0,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!0,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!0,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!0,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0}},Vr={none:0,free:1,personal_standard:2,mgr_free:10,lite_word:11,lite_sentence:11,lite:12,standard:13,pro:14,enterprise:15},zr=new Set(["mgr_free","lite_word","lite_sentence","lite","standard","pro","enterprise"]);function Jr(e){return zr.has(e)}const qr={free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1},personal_standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null},mgr_free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1,trainingItemMax:5,customerMax:5,homeworkSendDaily:1},lite:{sentenceTrainingDaily:5,wordTrainingDaily:5,gameDaily:5,trainingItemMax:10,customerMax:10,homeworkSendDaily:10},standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:30,customerMax:30,homeworkSendDaily:30},pro:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:50,homeworkSendDaily:50},enterprise:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:null,homeworkSendDaily:null}};function Qr(e){const n=(e??"").toLowerCase();return n==="speechear_free"||n==="free"?"free":n.startsWith("manager_free")||n.startsWith("mgr_free")?"mgr_free":n.startsWith("manager_enterprise")?"enterprise":n.startsWith("manager_pro")?"pro":n.startsWith("manager_standard")?"standard":n.startsWith("manager_lite_word")?"lite_word":n.startsWith("manager_lite_sentence")?"lite_sentence":n.startsWith("manager_lite")||n.startsWith("mgr_lite")?"lite":n.startsWith("mgr_standard")?"standard":n.startsWith("mgr_pro")?"pro":n.startsWith("content_")||n.startsWith("speechear_")||n.startsWith("light_")||n==="light"?"personal_standard":"none"}const Zr=5,Xr=5;function ei({rank:e,voteCount:n,quota:t=5}){return e<t&&n>0}const ni={selected:"ALREADY_SELECTED",added:"ALREADY_ADDED",rejected:"ALREADY_REJECTED"},ti="0.163.0";exports.CAPABILITY=Ct,exports.CHOSEONG=A,exports.CORE_VERSION=ti,exports.JONGSEONG=B,exports.JUNGSEONG=w,exports.LONG_STORIES=pe,exports.NETWORK_ERROR_MESSAGE=Tn,exports.NOISE_DATAS=De,exports.ORDER_SETS=Ae,exports.PLAN_FEATURES=Ur,exports.PLAN_LIMITS=qr,exports.SHORT_STORIES=Te,exports.TIER_RANK=Vr,exports.TOPIC_TYPES=Hr,exports.TRAINING_TYPES=Wr,exports.TRAINING_TYPE_I18N_KEY=Yr,exports.WORD_SUGGESTION_ACCOUNT_LIMIT=Xr,exports.WORD_SUGGESTION_EXISTING_ERROR=ni,exports.WORD_SUGGESTION_WEEKLY_QUOTA=Zr,exports.applyFontScale=jt,exports.applyTheme=_t,exports.buildChangeWholeSyllableProblem=Lu,exports.buildDropCompoundProblem=_u,exports.buildDropContrast3Problem=bu,exports.buildDropContrastProblem=wu,exports.buildDropFinalConsonantProblem=Bu,exports.buildMultiPartPosContrast=Go,exports.buildPairIndex=Io,exports.buildRemoveConsonantProblem=Nu,exports.buildSyllableMaskIndex=ju,exports.bulkSetImageExistence=fo,exports.cardQuestionTitle=Eu,exports.checkImageExists=Fn,exports.classifyPairDifficulty=So,exports.clearAudioExistsCache=Xt,exports.clearImageExistenceCache=ho,exports.clearPairIndexCache=Mo,exports.composeSyllable=x,exports.computeDailySelection=Rt,exports.configureImageResolver=so,exports.configureNoiseSettingsStore=tr,exports.configurePronunciationResolver=eo,exports.configureStorage=Ht,exports.configureTTS=Jt,exports.configureTrainingCategories=jr,exports.copyText=lr,exports.createDecompCache=mo,exports.createTTSUrlResolver=sr,exports.dateToDb=wr,exports.downloadCsvText=Fu,exports.downloadSound=Kt,exports.ensureTrainingDataLoaded=xr,exports.escapeCsvField=Pu,exports.fileExists=jn,exports.filterContrastCandidates=Zn,exports.finalToPhoneme=Qn,exports.firstChoseongOf=Gn,exports.formatCount=_r,exports.formatDateKo=Cr,exports.formatDateLocale=dr,exports.formatDateLongKo=gr,exports.formatDateLongLocale=fr,exports.formatDatetimeKo=hr,exports.formatPhone=pr,exports.formatRelativeTime=Dr,exports.formatTimeHM=br,exports.formatYmd=Tr,exports.getAssetBaseUrl=Bn,exports.getDailySelection=Pr,exports.getElementAnalyser=uo,exports.getElementVolume=io,exports.getErrorMessage=Ou,exports.getImageExistenceStats=go,exports.getImageExistsCached=co,exports.getImageResolver=Pn,exports.getNoiseBaseUrl=Ut,exports.getNoiseFileGain=Vt,exports.getPairIndex=Jn,exports.getPlanTier=Qr,exports.getPronunciationResolver=no,exports.getSavedFontScale=Nt,exports.getSavedTheme=bt,exports.getSignedOrPublicUrl=Ln,exports.getTTSFallbackUrlResolver=Qt,exports.getTTSUrlResolver=qt,exports.getTodayKst=An,exports.getTodayKstDate=Sr,exports.getTopicTypes=Lr,exports.getTrainingPools=vr,exports.getTrainingTypes=Rr,exports.getWordPool=St,exports.hasQuestionWordConstraint=lu,exports.hasSel=k,exports.hasStructureContrast=rn,exports.initFontScale=Ir,exports.initTheme=Or,exports.isAllChoseong=Wn,exports.isManagerTier=Jr,exports.isManualOnlyType=Cu,exports.isNetworkErrorMessage=ht,exports.isSyllablePattern=Kn,exports.isThisWeekPick=ei,exports.isTrainingDataLoaded=Gr,exports.isValidQuestionWord=cu,exports.itemCorrectness=yt,exports.jamoToNamesForSpeech=Du,exports.kstStartOfDay=Er,exports.loadGameLeaderboard=nr,exports.loadMyGameRanks=er,exports.loadNoiseSettings=or,exports.loadTrainingData=Ot,exports.logCrossword=Vu,exports.logTrainingCompletion=Ku,exports.logTrainingTime=Hu,exports.matchSyllables=te,exports.matchesChoseongSearch=yo,exports.matchesSyllablePattern=Vn,exports.matchesWordQuery=Eo,exports.mergeQuestionText=ft,exports.minimalPairDistractors=Fo,exports.normalizeDate=Ar,exports.officialSoundPath=ar,exports.parseLocalYmd=pt,exports.parseSortValue=Mu,exports.parseSyllable=S,exports.patternToComposition=No,exports.phonemePartsOf=du,exports.pickEuRo=ct,exports.pickEulReul=at,exports.pickEunNeun=st,exports.pickIga=it,exports.pickWaGwa=lt,exports.prewarmImageCache=Co,exports.primarySelPart=Ge,exports.readLevel=ao,exports.reorderArray=iu,exports.reportAppliedNoiseSettings=rr,exports.resolveAssetUrl=xt,exports.resolveSoundPath=Yt,exports.resumeAudioMeter=oo,exports.routeElementAudio=In,exports.sample=Y,exports.saveNoiseSettings=ur,exports.searchAndRankWords=Ro,exports.setAssetBaseUrl=Gt,exports.setCrosswordLogger=Uu,exports.setElementVolume=ro,exports.setGameLeaderboardLoader=Zu,exports.setGameRanksLoader=Qu,exports.setGameScoreSubmitter=qu,exports.setTrainingCompletionLogger=Yu,exports.setTrainingTimeLogger=Wu,exports.setWordPool=xu,exports.shuffle=R,exports.sortToValue=Iu,exports.soundOf=En,exports.speak=Mt,exports.stopSpeaking=Pt,exports.submitGameScore=Xu,exports.syllMatchesComp=q,exports.syllableContrasts=oe,exports.syllableLength=Ao,exports.syllablePron=Fe,exports.toBase64UrlSafe=ir,exports.toChoseong=xn,exports.toItemResults=zu,exports.toKstHm=mr,exports.toKstYmd=Ee,exports.toStandardPronunciation=Xo,exports.toStorageName=We,exports.toUserErrorMessage=$u,exports.validateSyllableSearchInput=Lo,exports.withEuRo=ru,exports.withEulReul=tu,exports.withEunNeun=ou,exports.withIga=nu,exports.withWaGwa=uu,exports.wordContainsChoseong=Do,exports.wordContainsJongseong=po,exports.wordContainsJungseong=To,exports.wordHasNoCoda=wo,exports.wordHasSyllableMatching=_o,exports.wrongItems=Ju;
20
+ `),this.name="StorageNotConfiguredError"}};function Ht(e){Wt(e)}function Yt(e,n){if(!e)return null;const t=Z();return t?.resolvePath?t.resolvePath(e,n):n?`${n}/${e}.mp3`:null}async function jn(e){if(!e)return!1;const n=Z();if(!n)throw new Je("fileExists");if(n.exists)return n.exists(e);try{return await n.resolveUrl(e)!==null}catch{return!1}}async function Ln(e){if(!e)return null;const n=Z();if(!n)throw new Je("getSignedOrPublicUrl");try{return await n.resolveUrl(e)}catch{return null}}async function Kt(e){const n=Z();if(!n)throw new Je("downloadSound");return n.download(e)}function Ut(){return Z()?.noiseBaseUrl??"/sounds/noise"}function Vt(){const e=Number(Z()?.noiseFileGain);return Number.isFinite(e)&&e>0?e:1}function zt(e){const n=AbortSignal.timeout;if(typeof n=="function")return n.call(AbortSignal,e);const t=new AbortController;return setTimeout(()=>t.abort(),e),t.signal}const qe="__ihab_core_tts_config__";function Jt(e){globalThis[qe]=e}function qt(){return globalThis[qe]?.urlResolver??null}function Qt(){return globalThis[qe]?.fallbackUrlResolver??null}const Zt=new Map;function Xt(){Zt.clear()}const Rn="__ihab_core_pronunciation_resolver__";function eo(e){globalThis[Rn]=e}function no(){return globalThis[Rn]??null}let K=null;const ie=new WeakMap,Qe=new WeakMap,Ze=new WeakMap;let On=!1;const kn=e=>Math.max(0,Math.min(1,Number.isFinite(e)?e:0));function to(){if(On||typeof document>"u")return;On=!0;const e=()=>{try{K&&K.state!=="running"&&K.resume()}catch{}};for(const n of["pointerdown","touchend","keydown"])document.addEventListener(n,e,{capture:!0,passive:!0})}function $n(){if(K)return K;try{const e=window.AudioContext||window.webkitAudioContext;return e?(K=new e,to(),K):null}catch{return null}}function oo(){try{K?.resume()}catch{}}function Xe(e,n){const t=ie.get(n);if(t)return t;try{const o=e.createMediaElementSource(n),r=e.createGain(),i=e.createAnalyser();i.fftSize=1024,i.smoothingTimeConstant=.6,r.gain.value=kn(Qe.get(n)??n.volume),o.connect(r),r.connect(i),r.connect(e.destination);try{n.volume=1}catch{}const u={gain:r,analyser:i};return ie.set(n,u),u}catch{return null}}function In(e){if(!e)return Promise.resolve(null);const n=ie.get(e);if(n)return Promise.resolve(n.analyser);const t=$n();if(!t)return Promise.resolve(null);if(t.state==="running")return Promise.resolve(Xe(t,e)?.analyser??null);const o=Ze.get(e);if(o)return o;const r=Promise.resolve().then(()=>t.resume()).then(()=>t.state==="running"?Xe(t,e)?.analyser??null:null).catch(()=>null).finally(()=>{Ze.delete(e)});return Ze.set(e,r),r}function uo(e){if(!e)return null;const n=ie.get(e);if(n)return n.analyser;const t=$n();return t?t.state==="running"?Xe(t,e)?.analyser??null:(In(e),null):null}function ro(e,n){const t=kn(n);Qe.set(e,t);const o=ie.get(e);if(o){try{e.volume!==1&&(e.volume=1)}catch{}const r=o.gain.gain;try{const i=o.gain.context.currentTime;r.cancelScheduledValues(i),r.setTargetAtTime(t,i,.01)}catch{try{r.value=t}catch{}}return"gain"}try{e.volume=t}catch{}return"element"}function io(e){return Qe.get(e)??e.volume}function ao(e,n){e.getFloatTimeDomainData(n);let t=0;for(let o=0;o<n.length;o++){const r=n[o];t+=r*r}return Math.sqrt(t/n.length)}const Mn="__ihab_core_image_config__";function so(e){globalThis[Mn]=e}function Pn(){return globalThis[Mn]??null}const ae="word_image_existence_map_v1";let P=null,se=0,vn=-1,le=null;const je=new Map;function ce(){if(P)return P;try{const e=typeof localStorage<"u"?localStorage.getItem(ae):null,n=e?JSON.parse(e):null;P=n&&typeof n=="object"&&!Array.isArray(n)?n:{}}catch{P={}}return P}let en=null;function lo(){en||(en=setTimeout(()=>{en=null;try{typeof localStorage<"u"&&P&&localStorage.setItem(ae,JSON.stringify(P))}catch{}},200))}function Le(e,n){return`${e}_${n??1}`}async function Fn(e,n){const t=ce(),o=Le(e,n);if(o in t)return t[o];if(je.has(o))return je.get(o);const r=Pn();if(!r)return!1;const i=r(e,n);if(!i)return!1;const u=fetch(i,{method:"HEAD",signal:zt(8e3)}).then(a=>a.status>=500?null:a.ok,()=>null).then(a=>(je.delete(o),a===null?!1:(t[o]=a,se++,lo(),a)));return je.set(o,u),u}function co(e,n){const t=ce(),o=Le(e,n);return o in t?t[o]:void 0}async function Co(e,n={}){const{force:t=!1,concurrency:o=16,onProgress:r}=n,i=ce(),u=t?Array.from(new Set(e)):Array.from(new Set(e)).filter(s=>!(Le(s)in i));let a=0;if(u.length>0){let s=0;const c=Array.from({length:Math.min(o,u.length)},async()=>{for(;s<u.length;){const C=s++,l=u[C],g=Le(l);if(!t&&g in i){a++,r?.(a,u.length);continue}try{await Fn(l)}catch{}a++,r?.(a,u.length)}});await Promise.all(c)}try{typeof localStorage<"u"&&P&&localStorage.setItem(ae,JSON.stringify(P))}catch{}return{checked:u.length,cached:Object.keys(i).length,total:e.length}}function go(){const e=ce();if(vn===se)return le?{...le}:null;const n=Object.values(e);return le=n.length===0?null:{total:n.length,exists:n.filter(Boolean).length},vn=se,le?{...le}:null}function fo(e){const n=ce();Object.assign(n,e),se++;try{typeof localStorage<"u"&&localStorage.setItem(ae,JSON.stringify(n))}catch{}}function ho(){P={},se++;try{typeof localStorage<"u"&&localStorage.removeItem(ae)}catch{}}const A=["\u3131","\u3132","\u3134","\u3137","\u3138","\u3139","\u3141","\u3142","\u3143","\u3145","\u3146","\u3147","\u3148","\u3149","\u314A","\u314B","\u314C","\u314D","\u314E"],w=["\u314F","\u3150","\u3151","\u3152","\u3153","\u3154","\u3155","\u3156","\u3157","\u3158","\u3159","\u315A","\u315B","\u315C","\u315D","\u315E","\u315F","\u3160","\u3161","\u3162","\u3163"],B=["","\u3131","\u3132","\u3133","\u3134","\u3135","\u3136","\u3137","\u3139","\u313A","\u313B","\u313C","\u313D","\u313E","\u313F","\u3140","\u3141","\u3142","\u3144","\u3145","\u3146","\u3147","\u3148","\u314A","\u314B","\u314C","\u314D","\u314E"];function S(e){if(!e)return null;const n=e.charCodeAt(0)-44032;return n<0||n>=11172?null:{cho:Math.floor(n/588),jung:Math.floor(n%588/28),jong:n%28}}function mo(){const e=new Map;return n=>{let t=e.get(n);return t||(t=[...n].map(o=>S(o)),e.set(n,t)),t}}function x(e,n,t=0){return String.fromCharCode(44032+(e*21+n)*28+t)}function So(e,n){if(!e||!n||e===n||e.length!==n.length)return"random";let t=0,o=null;for(let r=0;r<e.length;r++){const i=S(e[r]),u=S(n[r]);if(!i||!u)return"random";if(i.cho===u.cho&&i.jung===u.jung&&i.jong===u.jong)continue;t++;const a=i.cho!==u.cho,s=i.jung!==u.jung,c=i.jong!==u.jong;(a?1:0)+(s?1:0)+(c?1:0)>1?o="multi":a?o="cho":s?o="jung":o="jong"}return t!==1?"random":o==="cho"?"cho":o==="jung"?"jung":o==="jong"?"jong":"random"}function Gn(e){const n=S(e[0]||"");return n?A[n.cho]:""}function xn(e){return[...e].map(n=>{const t=S(n);return t?A[t.cho]:n}).join("")}function Wn(e){return!!e&&[...e].every(n=>A.includes(n))}function yo(e,n){return n?(e=e.normalize("NFC"),n=n.normalize("NFC"),Wn(n)?xn(e).includes(n):e.toLowerCase().includes(n.toLowerCase())):!0}function Eo(e,n){return Hn(n)(e)}function Hn(e){if(!e)return()=>!0;e=e.normalize("NFC");const n=[...e],t=u=>A.includes(u),o=u=>w.includes(u),r=n.map(u=>t(u)?"cho":o(u)?"jung":S(u)?"syl":"other"),i=n.map(u=>S(u));if(r.includes("other")){const u=e.toLowerCase();return a=>a.normalize("NFC").toLowerCase().includes(u)}return u=>{const a=[...u.normalize("NFC")];for(let s=0;s+n.length<=a.length;s++){let c=!0;for(let C=0;C<n.length;C++){const l=a[s+C],g=r[C];if(g==="cho"){if(Gn(l)!==n[C]){c=!1;break}}else if(g==="jung"){const h=S(l);if(!h||w[h.jung]!==n[C]){c=!1;break}}else{const h=i[C];if(h&&h.jong===0){const m=S(l);if(!m||m.cho!==h.cho||m.jung!==h.jung){c=!1;break}}else if(l!==n[C]){c=!1;break}}}if(c)return!0}return!1}}const Re={3:["\u3131","\u3145"],5:["\u3134","\u3148"],6:["\u3134","\u314E"],9:["\u3139","\u3131"],10:["\u3139","\u3141"],11:["\u3139","\u3142"],12:["\u3139","\u3145"],13:["\u3139","\u314C"],14:["\u3139","\u314D"],15:["\u3139","\u314E"],18:["\u3142","\u3145"]},Yn=Object.fromEntries(Object.entries(Re).map(([e,n])=>[n.join(""),B[Number(e)]]));function Do(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(o&&A[o.cho]===n)return!0}return!1}function To(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(o&&w[o.jung]===n)return!0}return!1}function po(e,n){if(!e||!n)return!1;for(const t of e){const o=S(t);if(!o||o.jong<=0)continue;if(B[o.jong]===n)return!0;const r=Re[o.jong];if(r&&r.includes(n))return!0}return!1}function Ao(e){if(!e)return 0;let n=0;for(const t of e)S(t)&&n++;return n}function wo(e){if(!e)return!1;let n=!1;for(const t of e){const o=S(t);if(o&&(n=!0,o.jong>0))return!1}return n}function bo(e,n){if(e.jong<=0)return!1;if(n.includes(B[e.jong]))return!0;const t=Re[e.jong];return!!t&&t.some(o=>n.includes(o))}function _o(e,n,t){if(!e)return!1;const o=[...e],r=i=>{const u=S(o[i]);if(!u||n.cho&&!n.cho.includes(A[u.cho])||n.jung&&!n.jung.includes(w[u.jung]))return!1;if(n.jongNone){if(u.jong>0)return!1}else if(n.jong&&!bo(u,n.jong))return!1;return!0};if(t==="head")return r(0);if(t==="tail")return r(o.length-1);if(t==="mid"){for(let i=1;i<o.length-1;i++)if(r(i))return!0;return!1}for(let i=0;i<o.length;i++)if(r(i))return!0;return!1}function Kn(e){return e.includes(",")||e.includes("_")}function Un(e){if(e==="")return[{kind:"any"}];if(e.includes("_")){const n=[...e];if(n.length>4)return[{kind:"invalid"}];const t=n[0]??"_",o=n[1]??"_";let r=n.slice(2).join("");if(r.length===2){const i=Yn[r];if(!i)return[{kind:"invalid"}];r=i}return[{kind:"template",cho:t,jung:o,jong:r||"_"}]}return[...e].map(n=>S(n)?{kind:"syllable",ch:n}:A.includes(n)?{kind:"cho",jamo:n}:w.includes(n)?{kind:"jung",jamo:n}:{kind:"invalid"})}function Bo(e,n){switch(n.kind){case"any":return!0;case"syllable":{const t=S(n.ch);if(!t)return e===n.ch;if(t.jong===0){const o=S(e);return!!o&&o.cho===t.cho&&o.jung===t.jung}return e===n.ch}case"cho":{const t=S(e);return!!t&&A[t.cho]===n.jamo}case"jung":{const t=S(e);return!!t&&w[t.jung]===n.jamo}case"template":{const t=S(e);return!(!t||n.cho!=="_"&&A[t.cho]!==n.cho||n.jung!=="_"&&w[t.jung]!==n.jung||n.jong!=="_"&&B[t.jong]!==n.jong)}case"invalid":return!1}}function Vn(e,n){e=e.normalize("NFC"),n=n.normalize("NFC");const t=n.split(",").flatMap(r=>Un(r.trim()));if(t.length===0)return!0;const o=[...e];if(o.length<t.length)return!1;for(let r=0;r+t.length<=o.length;r++)if(t.every((i,u)=>Bo(o[r+u],i)))return!0;return!1}function No(e){const n=e.split(",").flatMap(i=>Un(i.trim())),t=new Set,o=new Set,r=new Set;for(const i of n)switch(i.kind){case"cho":t.add(i.jamo);break;case"jung":o.add(i.jamo);break;case"template":i.cho!=="_"&&t.add(i.cho),i.jung!=="_"&&o.add(i.jung),i.jong!=="_"&&r.add(i.jong);break;case"syllable":{const u=S(i.ch);u&&(t.add(A[u.cho]),o.add(w[u.jung]),u.jong!==0&&r.add(B[u.jong]));break}}return t.size===0&&o.size===0&&r.size===0?null:{cho:t.size?[...t]:null,jung:o.size?[...o]:null,jong:r.size?[...r]:null}}function jo(e){return!!S(e)||A.includes(e)||w.includes(e)}function Lo(e){const n=e.normalize("NFC").trim();if(!n)return{ok:!0};for(const t of n.split(",")){const o=t.trim();if(o!==""){if(o.includes("_")){const r=[...o];if(r.length>4)return{ok:!1};const i=r[0],u=r[1],a=r.slice(2).join(""),s=i===void 0||i==="_"||A.includes(i),c=u===void 0||u==="_"||w.includes(u),C=a===""||a==="_"||B.filter(Boolean).includes(a)||!!Yn[a];if(s&&c&&C)continue;return{ok:!1}}if(![...o].every(jo))return{ok:!1}}}return{ok:!0}}A.length,w.length,B.length;function Ro(e,n){const t=n.normalize("NFC").trim();if(!t||!/[^\s,_]/.test(t))return e;if(Kn(t))return e.filter(s=>Vn(s.word,t));const o=Hn(t),r=[...t].length,i=s=>!!s&&o(s.normalize("NFC").slice(0,r)),u=[],a=[];for(const s of e)(o(s.word)||o(s.pronunciation??""))&&(i(s.word)||i(s.pronunciation??"")?u:a).push(s);return u.concat(a)}const nn="word_pair_index_v2",tn="word_pair_index_sig_v2";let v=null,Ce=null;function zn(){try{if(typeof localStorage>"u")return null;const e=localStorage.getItem(nn),n=localStorage.getItem(tn);return!e||!n?null:{index:JSON.parse(e),sig:n}}catch{return null}}function Oo(e,n){try{if(typeof localStorage>"u")return;localStorage.setItem(nn,JSON.stringify(e)),localStorage.setItem(tn,n)}catch{}}function ko(e){const n=e.map(o=>`${o.word}|${o.pron??""}`).sort();let t=0;for(const o of n)for(let r=0;r<o.length;r++)t=(t<<5)-t+o.charCodeAt(r)|0;return`${n.length}-${t}`}async function $o(e,n){const t=new Set,o=[];for(const c of e){if(!c.word||t.has(c.word))continue;const C=c.pron||c.word,l=Array.from(C).map(S);l.some(g=>g===null)||l.length===Array.from(c.word).length&&(t.add(c.word),o.push({word:c.word,syls:l}))}const r={},i=o.length,u=new Map;for(const c of o){const C=c.syls.length;u.has(C)||u.set(C,[]),u.get(C).push(c)}let a=0;const s=["cho","jung","jong"];for(const c of u.values()){const C=c[0].syls.length;for(let l=0;l<C;l++)for(const g of s){const h=new Map;for(const m of c){let y="";for(let f=0;f<C;f++){f>0&&(y+="~");const d=m.syls[f];f===l?g==="cho"?y+=`*:${d.jung}:${d.jong}`:g==="jung"?y+=`${d.cho}:*:${d.jong}`:y+=`${d.cho}:${d.jung}:*`:y+=`${d.cho}:${d.jung}:${d.jong}`}let E=h.get(y);E||(E=[],h.set(y,E)),E.push(m)}for(const m of h.values())if(!(m.length<2))for(let y=0;y<m.length;y++){const E=m[y];for(let f=y+1;f<m.length;f++){const d=m[f];E.syls[l][g]!==d.syls[l][g]&&(r[E.word]||(r[E.word]={cho:[],jung:[],jong:[]}),r[d.word]||(r[d.word]={cho:[],jung:[],jong:[]}),r[E.word][g].push(d.word),r[d.word][g].push(E.word))}}}a+=c.length,n?.(a,i),await new Promise(l=>setTimeout(l,0))}return i>0&&n?.(i,i),r}let on=0;async function Io(e,n={}){const t=ko(e);if(!n.force){if(v&&Ce===t)return v;const i=zn();if(i&&i.sig===t)return v=i.index,Ce=t,v}const o=++on,r=await $o(e,n.onProgress);return o===on&&(v=r,Ce=t,Oo(r,t)),r}function Jn(){if(v)return v;const e=zn();return e?(v=e.index,Ce=e.sig,v):null}function Mo(){on+=1,v=null,Ce=null;try{typeof localStorage<"u"&&(localStorage.removeItem(nn),localStorage.removeItem(tn))}catch{}}const Po={\u3131:"\u3131",\u3132:"\u3131",\u314B:"\u3131",\u3133:"\u3131",\u313A:"\u3131",\u3134:"\u3134",\u3135:"\u3134",\u3136:"\u3134",\u3137:"\u3137",\u3145:"\u3137",\u3146:"\u3137",\u3148:"\u3137",\u314A:"\u3137",\u314C:"\u3137",\u314E:"\u3137",\u3139:"\u3139",\u313C:"\u3139",\u313D:"\u3139",\u313E:"\u3139",\u3140:"\u3139",\u3141:"\u3141",\u313B:"\u3141",\u3142:"\u3142",\u314D:"\u3142",\u313F:"\u3142",\u3144:"\u3142",\u3147:"\u3147"},qn={\u314F:{nucleus:"\u314F"},\u3151:{glide:"j",nucleus:"\u314F"},\u3153:{nucleus:"\u3153"},\u3155:{glide:"j",nucleus:"\u3153"},\u3157:{nucleus:"\u3157"},\u315B:{glide:"j",nucleus:"\u3157"},\u315C:{nucleus:"\u315C"},\u3160:{glide:"j",nucleus:"\u315C"},\u3161:{nucleus:"\u3161"},\u3163:{nucleus:"\u3163"},\u3150:{nucleus:"\u3154/\u3150"},\u3152:{glide:"j",nucleus:"\u3154/\u3150"},\u3154:{nucleus:"\u3154/\u3150"},\u3156:{glide:"j",nucleus:"\u3154/\u3150"},\u3158:{glide:"w",nucleus:"\u314F"},\u3159:{glide:"w",nucleus:"\u3154/\u3150"},\u315A:{glide:"w",nucleus:"\u3154/\u3150"},\u315D:{glide:"w",nucleus:"\u3153"},\u315E:{glide:"w",nucleus:"\u3154/\u3150"},\u315F:{glide:"w",nucleus:"\u3163"},\u3162:{glide:"\u0270",nucleus:"\u3163"}};function vo(e,n){return(qn[e]?.glide??"")!==(qn[n]?.glide??"")}function Qn(e){return Po[e]??e}const un={cho:A,jung:w,jong:B},k=e=>Array.isArray(e)?e.length>0:!!e;function rn(e,n){if(e.length!==n.length)return!1;for(let t=0;t<e.length;t++){const o=e[t],r=n[t];if(!(!o||!r)&&(o.cho!==r.cho&&A[o.cho]==="\u3147"!=(A[r.cho]==="\u3147")||o.jung!==r.jung&&vo(w[o.jung],w[r.jung])||o.jong!==r.jong&&o.jong===0!=(r.jong===0)))return!0}return!1}function Zn(e,n,t){const o=t.pronOf(e),r=t.decompOf,i=t.sameStructureOnly&&r?r(o):null,u=[];for(const a of n)a!==e&&(t.okSet&&!t.okSet.has(a)||t.pronOf(a)!==o&&(i&&r&&rn(i,r(t.pronOf(a)))||u.push(a)));return u}function Fo(e,n,t){const o=n?.[e];if(!o)return[];const r=t.kind?o[t.kind]??[]:[...o.cho??[],...o.jung??[],...o.jong??[]];return Zn(e,r,t)}function Go(e,n,t,o,r,i,u){const a=["cho","jung","jong"].filter(g=>k(e[g])),s={};for(const g of a){const h=e[g];s[g]=new Set(Array.isArray(h)?h:[h])}const c=r==="pron",C=new Map;for(const g of n){const h=t(i(g));if(h.some(f=>!f))continue;let m=h;if(!c&&(m=t(g),m.length!==h.length||m.some(f=>!f)))continue;const y=h.length,E=C.get(y);E?E.push({w:g,dPron:h,dPos:m}):C.set(y,[{w:g,dPron:h,dPos:m}])}const l=new Map;for(const[g,h]of C){const m=new Map,y=(E,f)=>{const d=E.dPos[f];return d!=null&&a.every(D=>s[D].has(un[D][d[D]]))};for(const E of h){let f;if(u==="head")f=y(E,0)?0:-1;else if(u==="tail")f=y(E,g-1)?g-1:-1;else if(u==="mid"){f=-1;for(let D=1;D<g-1;D++)if(y(E,D)){f=D;break}}else f=E.dPos.findIndex(D=>D!=null&&a.every(p=>s[p].has(un[p][D[p]])));if(f<0)continue;const d=m.get(f);d?d.push(E):m.set(f,[E])}for(const[E,f]of m){const d=a.includes("cho"),D=a.includes("jung"),p=a.includes("jong"),M=b=>{let L="";for(let O=0;O<g;O++){const T=b[O];O===E?L+=(d?"*":T.cho)+"."+(D?"*":T.jung)+"."+(p?"*":T.jong)+".":L+=T.cho+"."+T.jung+"."+T.jong+"."}return L},j=new Map;for(const b of h){const L=M(b.dPron),O=j.get(L);O?O.push(b):j.set(L,[b])}for(const b of f){const L=j.get(M(b.dPron))??[],O=[];for(const T of L){if(T.w===b.w)continue;let $=!0;for(const G of a){const Q=b.dPron[E][G],z=T.dPron[E][G];if(z===Q){$=!1;break}if(c&&s[G].has(un[G][z])){$=!1;break}}$&&(o&&rn(b.dPron,T.dPron)||O.push(T.w))}l.set(b.w,O)}}}return l}const Oe=0,Xn=1,J=2,an=3,xo=4,ke=5,sn=6,$e=7,Wo=8,ln=9,X=10,Ho=11,ge=12,Yo=13,de=14,Ie=15,Me=16,fe=17,Ko=18,I=0,W=1,Uo=3,U=4,cn=5,he=6,F=7,_=8,et=9,nt=10,Pe=11,tt=12,Cn=13,ee=15,ve=16,H=17,ot=18,gn=21,dn=27,Vo=20,zo={1:Oe,2:Xn,4:J,7:an,8:ke,16:sn,17:$e,19:ln,20:X,22:ge,23:de,24:Ie,25:Me,26:fe},Jo={[Uo]:[W,X],[cn]:[U,ge],[et]:[_,Oe],[nt]:[_,sn],[Pe]:[_,$e],[tt]:[_,X],[Cn]:[_,Me],14:[_,fe],[ot]:[H,X]},qo={[he]:J,[ee]:ke},fn={2:W,24:W,3:W,9:W,5:U,6:U,19:F,20:F,22:F,23:F,25:F,27:F,11:_,12:_,13:_,15:_,10:ve,14:H,18:H,26:H},ut={[Oe]:Ie,[an]:Me,[$e]:fe,[ge]:de},rt={[Oe]:Xn,[an]:xo,[$e]:Wo,[ln]:X,[ge]:Yo},Qo=new Set([cn,nt,Pe,tt,Cn,ee,ot]),Zo=new Set(["\uBC1F"]);function Xo(e){const n=(e??"").trim();if(!n)return"";const t=[...n],o=t.map(S);if(o.some(i=>i===null))return n;const r=o;for(let i=0;i<r.length;i++){const u=r[i],a=r[i+1],s=u.jong;if(!a){u.jong=fn[u.jong]??u.jong;break}if(u.jong===I)continue;if(a.cho===Ho){if(a.jung===Vo){if(u.jong===F){u.jong=I,a.cho=ge;continue}if(u.jong===25){u.jong=I,a.cho=de;continue}if(u.jong===Cn){u.jong=_,a.cho=de;continue}}if(u.jong===dn){u.jong=I;continue}const C=qo[u.jong];if(C!==void 0){u.jong=I,a.cho=C;continue}const l=Jo[u.jong];if(l){u.jong=l[0],a.cho=l[1];continue}const g=zo[u.jong];g!==void 0&&(u.jong=I,a.cho=g);continue}if((u.jong===dn||u.jong===he||u.jong===ee)&&ut[a.cho]!==void 0){a.cho=ut[a.cho],u.jong=u.jong===he?U:u.jong===ee?_:I;continue}if((u.jong===dn||u.jong===he||u.jong===ee)&&a.cho===ln){a.cho=X,u.jong=u.jong===he?U:u.jong===ee?_:I;continue}if(a.cho===Ko){if(u.jong===cn){u.jong=U,a.cho=de;continue}if(u.jong===et){u.jong=_,a.cho=Ie;continue}if(u.jong===Pe){u.jong=_,a.cho=fe;continue}const C=fn[u.jong]??u.jong;if(C===W){u.jong=I,a.cho=Ie;continue}if(C===F){u.jong=I,a.cho=Me;continue}if(C===H){u.jong=I,a.cho=fe;continue}}let c=fn[u.jong]??u.jong;s===Pe&&Zo.has(t[i])&&(c=H),u.jong=c,rt[a.cho]!==void 0&&(c===W||c===F||c===H||Qo.has(s))&&(a.cho=rt[a.cho]),(a.cho===J||a.cho===sn)&&(u.jong===W?u.jong=gn:u.jong===F?u.jong=U:u.jong===H&&(u.jong=ve)),a.cho===ke?u.jong===U?u.jong=_:u.jong===ve||u.jong===gn?a.cho=J:u.jong===W?(u.jong=gn,a.cho=J):u.jong===H&&(u.jong=ve,a.cho=J):u.jong===_&&a.cho===J&&(a.cho=ke)}return r.map(i=>x(i.cho,i.jung,i.jong)).join("")}const ne=/[ㄱ-ㅎ]/,eu=/[ㅏ-ㅣ]/;function me(e){e=e.normalize("NFC");for(let n=e.length-1;n>=0;n--){const t=e[n],o=t.charCodeAt(0);if(o>=44032&&o<=55203||ne.test(t)||eu.test(t))return t}return null}function it(e){const n=me(e);if(!n)return"\uAC00";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC774":"\uAC00":ne.test(n)?"\uC774":"\uAC00"}function nu(e){return`${e}${it(e)}`}function at(e){const n=me(e);if(!n)return"\uB97C";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC744":"\uB97C":ne.test(n)?"\uC744":"\uB97C"}function tu(e){return`${e}${at(e)}`}function st(e){const n=me(e);if(!n)return"\uB294";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uC740":"\uB294":ne.test(n)?"\uC740":"\uB294"}function ou(e){return`${e}${st(e)}`}function lt(e){const n=me(e);if(!n)return"\uC640";const t=n.charCodeAt(0);return t>=44032&&t<=55203?(t-44032)%28!==0?"\uACFC":"\uC640":ne.test(n)?"\uACFC":"\uC640"}function uu(e){return`${e}${lt(e)}`}function ct(e){const n=me(e);if(!n)return"\uB85C";const t=n.charCodeAt(0);if(t>=44032&&t<=55203){const o=(t-44032)%28;return o===0||o===8?"\uB85C":"\uC73C\uB85C"}return n==="\u3139"?"\uB85C":ne.test(n)?"\uC73C\uB85C":"\uB85C"}function ru(e){return`${e}${ct(e)}`}function iu(e,n,t){const o=e.slice(),[r]=o.splice(n,1);return o.splice(t,0,r),o}function R(e,n=Math.random){const t=e.slice();for(let o=t.length-1;o>0;o--){const r=Math.floor(n()*(o+1));[t[o],t[r]]=[t[r],t[o]]}return t}function Y(e,n,t=Math.random){return!Array.isArray(e)||e.length===0||n<=0?[]:n>=e.length?R(e,t):R(e,t).slice(0,n)}const Ct={SAME_SOUND_PICK:{difficulty:!0,choseong:!0,group:"discrimination"},SAME_OR_DIFF:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_SAME:{difficulty:!0,choseong:!0,group:"discrimination"},HEAR_AND_PICK_INCLUDED:{difficulty:!0,choseong:!0,group:"discrimination"},STARTS_WITH_SAME_SOUND:{difficulty:!1,choseong:!0,group:"discrimination"},LISTEN_AND_REMEMBER_ORDER:{difficulty:!1,choseong:!0,group:"attention"},MERGE_2_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_SYLLABLES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_2_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},MERGE_3_PHONEMES:{difficulty:!1,choseong:!0,group:"synthesis"},DROP_1_FROM_2SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_1_FROM_3SYLL:{difficulty:!1,choseong:!0,group:"deletion"},DROP_PART_FROM_COMPOUND:{difficulty:!1,choseong:!0,group:"deletion"},DROP_FINAL_CONSONANT_FROM_1SYLL:{difficulty:!1,choseong:!0,group:"deletion"},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{difficulty:!1,choseong:!0,group:"deletion"},CHANGE_1_SYLL_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_SYLL_IN_3SYLL:{difficulty:!0,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_1SYLL:{difficulty:!1,choseong:!0,group:"substitution"},CHANGE_1_PHONEME_IN_2SYLL:{difficulty:!0,choseong:!0,group:"substitution"}};function au(e){const n=e?Ct[e]?.group:void 0;return n==="synthesis"||n==="deletion"||n==="substitution"?n:null}const hn=A.indexOf("\u3147"),gt={DROP_FINAL_CONSONANT_FROM_1SYLL:{syllables:1,syllable:e=>e.jong>0},REMOVE_CONSONANT_AND_IDENTIFY_PHONEME:{syllables:1,syllable:e=>e.jong===0&&e.cho!==hn},MERGE_2_SYLLABLES:{syllables:2,syllable:()=>!0},MERGE_3_SYLLABLES:{syllables:3,syllable:()=>!0},MERGE_2_PHONEMES:{syllables:1,syllable:e=>e.jong===0&&e.cho!==hn},MERGE_3_PHONEMES:{syllables:1,syllable:e=>e.jong>0&&!Re[e.jong]&&e.cho!==hn}},su=new Set([]);function lu(e){return e in gt}function cu(e,n){const t=gt[e];if(!t)return!0;const o=[...n];if(o.length!==t.syllables)return!1;const r=S(o[0]);return!!r&&t.syllable(r)}function Cu(e){return su.has(e)}function gu(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uC640":"\uACFC"}function Se(e){const n=e.charCodeAt((e.length||1)-1)||0;return n<44032||n>55203||(n-44032)%28===0?"\uB97C":"\uC744"}function mn(e){const n=e.charCodeAt((e.length||1)-1)||0;if(n<44032||n>55203)return"\uB85C";const t=(n-44032)%28;return t===0||t===8?"\uB85C":"\uC73C\uB85C"}function dt(e){const n=e.charAt((e.length||1)-1),t=n.charCodeAt(0)||0;return t>=44032&&t<=55203?(t-44032)%28===0?"\uAC00":"\uC774":/[ㄱ-ㅎ]/.test(n)?"\uC774":"\uAC00"}const Sn={\u3131:"\uAE30\uC5ED",\u3132:"\uC30D\uAE30\uC5ED",\u3134:"\uB2C8\uC740",\u3137:"\uB514\uADFF",\u3138:"\uC30D\uB514\uADFF",\u3139:"\uB9AC\uC744",\u3141:"\uBBF8\uC74C",\u3142:"\uBE44\uC74D",\u3143:"\uC30D\uBE44\uC74D",\u3145:"\uC2DC\uC637",\u3146:"\uC30D\uC2DC\uC637",\u3147:"\uC774\uC751",\u3148:"\uC9C0\uC752",\u3149:"\uC30D\uC9C0\uC752",\u314A:"\uCE58\uC753",\u314B:"\uD0A4\uC754",\u314C:"\uD2F0\uC755",\u314D:"\uD53C\uC756",\u314E:"\uD788\uC757",\u3133:"\uAE30\uC5ED\uC2DC\uC637",\u3135:"\uB2C8\uC740\uC9C0\uC752",\u3136:"\uB2C8\uC740\uD788\uC757",\u313A:"\uB9AC\uC744\uAE30\uC5ED",\u313B:"\uB9AC\uC744\uBBF8\uC74C",\u313C:"\uB9AC\uC744\uBE44\uC74D",\u313D:"\uB9AC\uC744\uC2DC\uC637",\u313E:"\uB9AC\uC744\uD2F0\uC755",\u313F:"\uB9AC\uC744\uD53C\uC756",\u3140:"\uB9AC\uC744\uD788\uC757",\u3144:"\uBE44\uC74D\uC2DC\uC637",\u314F:"\uC544",\u3150:"\uC560",\u3151:"\uC57C",\u3152:"\uC598",\u3153:"\uC5B4",\u3154:"\uC5D0",\u3155:"\uC5EC",\u3156:"\uC608",\u3157:"\uC624",\u3158:"\uC640",\u3159:"\uC65C",\u315A:"\uC678",\u315B:"\uC694",\u315C:"\uC6B0",\u315D:"\uC6CC",\u315E:"\uC6E8",\u315F:"\uC704",\u3160:"\uC720",\u3161:"\uC73C",\u3162:"\uC758",\u3163:"\uC774"};function du(e){if([...e].length!==1)return[e];const n=S(e);if(!n)return[e];const t=[A[n.cho],w[n.jung]];return n.jong!==0&&t.push(B[n.jong]),t}function ft(e,n=!1){const t=e.filter(Boolean);if(t.length<2)return"";const o=a=>Sn[a]??a,r=t.slice(0,-1).map(a=>`"${a}"${gu(o(a))}`).join(" "),i=t[t.length-1],u=`"${i}"${Se(o(i))}`;return`${r} ${u} \uD569\uCE58\uBA74 \uC5B4\uB5A4 ${n?"\uC18C\uB9AC":"\uB2E8\uC5B4"}\uAC00 \uB418\uB098\uC694?`}function fu(e,n){return ft(n,e==="MERGE_2_PHONEMES"||e==="MERGE_3_PHONEMES")}const yn=e=>Sn[e]??e,hu={cho:"\uCD08\uC131",jung:"\uBAA8\uC74C",jong:"\uBC1B\uCE68"};function mu(e,n){const t=(s,c)=>{const C=[...s].length===1?S(s):null,l=[...c].length===1?S(c):null;if(!C||!l)return null;const g=["cho","jung","jong"].filter(h=>C[h]!==l[h]);return g.length===1?{part:g[0],sx:C,sy:l}:null},o=t(e,n)??t(Fe(e),Fe(n));if(!o)return null;const r=o.part==="cho"?A:o.part==="jung"?w:B,i=r[o.sx[o.part]],u=r[o.sy[o.part]],a=o.part==="jong"&&!i?"add":o.part==="jong"&&!u?"remove":"swap";return{part:o.part,from:i,to:u,kind:a}}function Su(e,n){const t=String(n?.word??n?.original??""),o=String(n?.changedFrom??""),r=String(n?.changedTo??"");if(e==="CHANGE_1_PHONEME_IN_1SYLL"||e==="CHANGE_1_PHONEME_IN_2SYLL"){const i=e==="CHANGE_1_PHONEME_IN_1SYLL",u=i?o||t:o,a=mu(u,r);if(a){const s=i?`"${t}"`:`"${t}"\uC758 "${u}"`,c=a.kind==="add"?"\uC5D0":"\uC5D0\uC11C",C=`"${a.from}"${Se(yn(a.from))}`,l=`"${a.to}"${mn(yn(a.to))}`;return a.kind==="add"?`${s}${c} \uBC1B\uCE68 "${a.to}"${Se(yn(a.to))} \uB354\uD558\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:a.kind==="remove"?`${s}${c} \uBC1B\uCE68 ${C} \uBE7C\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:`${s}${c} ${hu[a.part]} ${C} ${l} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`}}return e==="CHANGE_1_PHONEME_IN_1SYLL"?`"${t}"${Se(t)} "${r}"${mn(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`:`"${t}"\uC5D0\uC11C "${o}"${Se(o)} "${r}"${mn(r)} \uBC14\uAFB8\uBA74 \uBB34\uC5C7\uC774 \uB418\uB098\uC694?`}function yu(e,n){const t=String(n?.word??n?.original??n?.base??""),o=String(n?.dropped??"");if(e==="DROP_FINAL_CONSONANT_FROM_1SYLL")return`"${t}"\uC5D0\uC11C \uBC1B\uCE68\uC774 \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`;if(e==="REMOVE_CONSONANT_AND_IDENTIFY_PHONEME"){const r=String(n?.missingConsonant??"");return`"${t}"\uC5D0\uC11C "${r}"${dt(r)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uC18C\uB9AC\uAC00 \uB418\uB098\uC694?`}return`"${t}"\uC5D0\uC11C "${o}"${dt(o)} \uC5C6\uC5B4\uC9C0\uBA74 \uC5B4\uB5A4 \uB9D0\uC774 \uB418\uB098\uC694?`}function Eu(e,n,t){switch(au(e)){case"synthesis":return fu(e,t);case"substitution":return Su(e,n);case"deletion":return yu(e,n);default:return""}}function Du(e){return e.replace(/"([ㄱ-ㅣ])"(으로|와|과|을|를|이|가|은|는|로)?/g,(n,t,o)=>{const r=Sn[t];if(!r)return n;if(!o)return`"${r}"`;const i=(r.charCodeAt(r.length-1)-44032)%28,u=i!==0;let a=o;return o==="\uC640"||o==="\uACFC"?a=u?"\uACFC":"\uC640":o==="\uC744"||o==="\uB97C"?a=u?"\uC744":"\uB97C":o==="\uC774"||o==="\uAC00"?a=u?"\uC774":"\uAC00":o==="\uC740"||o==="\uB294"?a=u?"\uC740":"\uB294":(o==="\uC73C\uB85C"||o==="\uB85C")&&(a=i===0||i===8?"\uB85C":"\uC73C\uB85C"),`"${r}"${a}`})}const Tu=e=>e==null?[]:Array.isArray(e)?e:[e];function Fe(e){if([...e].length!==1)return"";const n=S(e);if(!n)return"";const t=Qn(B[n.jong]),o=t===""?0:B.indexOf(t);return x(n.cho,n.jung,o<0?0:o)}function En(e,n){return n.get(e)||Fe(e)||e}function Ge(e){return e?k(e.cho)?"cho":k(e.jung)?"jung":k(e.jong)?"jong":null:null}function q(e,n){const t=(r,i)=>!k(r)||Tu(r).includes(i),o=n.jongNone?e.jong===0:t(n.jong,B[e.jong]);return t(n.cho,A[e.cho])&&t(n.jung,w[e.jung])&&o}function te(e,n,t){const o=[...e];if(t!=="pron")return o.map(i=>S(i));const r=[...n.get(e)||e];return r.length!==o.length?o.map(i=>S(i)):r.map(i=>S(i))}function oe(e,n,t,o,r){const i=n==="cho"?A:n==="jung"?w:B,u=e[n],a=[],s=l=>n==="jung"?Au(En(l,r)):En(l,r),c=new Map([[s(t),-1]]),C=R(i.map((l,g)=>g).filter(l=>l!==u&&(n!=="cho"||i[l]!=="\u3147")&&(n!=="jong"||l!==0)));for(const l of C){if(a.length>=o)break;const g=n==="cho"?x(l,e.jung,e.jong):n==="jung"?x(e.cho,l,e.jong):x(e.cho,e.jung,l),h=s(g),m=c.get(h);if(m!==void 0){n==="jung"&&m>=0&&r.has(g)&&!r.has(a[m])&&(a[m]=g);continue}c.set(h,a.length),a.push(g)}return a}const pu={\u3154:"\u3150",\u3156:"\u3152",\u315A:"\u3159",\u315E:"\u3159"};function Au(e){if([...e].length!==1)return e;const n=S(e);if(!n)return e;const t=pu[w[n.jung]];return t?x(n.cho,w.indexOf(t),n.jong):e}function wu(e,n,t,o,r,i=null){const u=[...e];if(u.length!==2)return null;const a=u.map(l=>S(l));if(a.some(l=>!l))return null;const s=te(e,t,o);if(s.some(l=>!l))return null;const c=Ge(n);let C=c&&n?s.map((l,g)=>q(l,n)?g:-1).filter(l=>l>=0):[0,1];if(i!=null&&(C=C.filter(l=>l!==i)),!C.length)return null;for(const l of R(C)){const g=u[l];if(!r.has(g))continue;const h=oe(a[l],c??"cho",g,40,t),m=[];for(const y of h)if(y!==g&&r.has(y)&&!m.includes(y)&&m.push(y),m.length>=2)break;if(!(m.length<2))return{question:e,distractors:[g,...m]}}return null}function bu(e,n,t,o,r,i=null){const u=[...e];if(u.length!==3)return null;const a=u.map(l=>S(l));if(a.some(l=>!l))return null;const s=te(e,t,o);if(s.some(l=>!l))return null;const c=Ge(n),C=c&&n?s.map((l,g)=>q(l,n)?g:-1).filter(l=>l>=0):[0,1,2];if(!C.length)return null;for(const l of R(C))for(const g of R([0,1,2].filter(h=>h!==l&&(i==null||h===i)))){const h=[0,1,2].filter(d=>d!==g),m=h.map(d=>u[d]).join("");if(!r.has(m))continue;const y=h.indexOf(l),E=oe(a[l],c??"cho",u[l],40,t),f=[];for(const d of E){const D=h.map(M=>u[M]);D[y]=d;const p=D.join("");if(p!==m&&r.has(p)&&!f.includes(p)&&f.push(p),f.length>=2)break}if(!(f.length<2))return{question:e,distractors:[m,...f]}}return null}function _u(e,n,t,o,r,i=null){const u=[...e],a=u.length;if(a<2)return null;const s=[];for(let C=1;C<=a-1;C++)s.push({remain:u.slice(0,C).join(""),dropped:u.slice(C).join(""),droppedEnd:1}),s.push({remain:u.slice(a-C).join(""),dropped:u.slice(0,a-C).join(""),droppedEnd:0});const c=Ge(n);for(const{remain:C,dropped:l,droppedEnd:g}of R(s)){if(i!=null&&g!==i||[...C].length===1&&[...l].length===1||C===e||!r.has(C)||!r.has(l))continue;const h=[...C],m=h.map(f=>S(f));if(m.some(f=>!f))continue;const y=te(C,t,o);if(y.some(f=>!f))continue;const E=c&&n?y.map((f,d)=>q(f,n)?d:-1).filter(f=>f>=0):h.map((f,d)=>d);if(E.length)for(const f of R(E)){const d=oe(m[f],c??"cho",h[f],40,t),D=[];for(const p of d){const M=[...h];M[f]=p;const j=M.join("");if(j!==C&&r.has(j)&&!D.includes(j)&&D.push(j),D.length>=2)break}if(D.length>=2)return{question:e,distractors:[C,...D],dropped:l}}}return null}function Bu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=S(t.get(e)||e);if(!u||u.jong===0)return null;const a=x(u.cho,u.jung,0),s=oe({cho:u.cho,jung:u.jung,jong:0},"cho",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}const Dn=A.indexOf("\u3147");function Nu(e,n,t,o,r,i=null){if([...e].length!==1)return null;const u=S(t.get(e)||e);if(!u||u.jong!==0||u.cho===Dn)return null;const a=x(Dn,u.jung,0),s=oe({cho:Dn,jung:u.jung,jong:0},"jung",a,2,t);return s.length<2?null:{question:e,distractors:[a,...s]}}function ju(e){const n=new Map;for(const t of e){const o=[...t],r=o.length;if(!(r<2||r>3))for(let i=0;i<r;i++){let u=r+"|"+i+"|";for(let s=0;s<r;s++)u+=s===i?"*":o[s];const a=n.get(u);a?a.push(t):n.set(u,[t])}}return n}function Lu(e,n,t,o,r,i=null,u=null,a=2){const s=[...e],c=s.length;if(c<2||c>3)return null;const C=s.map(d=>S(d));if(C.some(d=>!d))return null;const l=te(e,t,o);if(l.some(d=>!d))return null;const g=d=>t.get(d)??d,h=g(e),m=!!n&&(k(n.cho)||k(n.jung)||k(n.jong)),y=!!u&&(k(u.cho)||k(u.jung)||k(u.jong)),E=d=>{let D=c+"|"+d+"|";for(let p=0;p<c;p++)D+=p===d?"*":s[p];return D};let f;if(i!=null){if(i>=c||m&&!q(l[i],n))return null;f=[i]}else m?f=l.map((d,D)=>q(d,n)?D:-1).filter(d=>d>=0):f=Array.from({length:c},(d,D)=>D);for(const d of R(f)){const D=r.get(E(d))??[],p=[],M=[];for(const T of D){if(T===e)continue;const $=[...T].map(Be=>S(Be)),G=C[d],Q=$[d];if(!G||!Q)continue;let z=0;if(G.cho!==Q.cho&&z++,G.jung!==Q.jung&&z++,G.jong!==Q.jong&&z++,!(z<a||g(T)===h))if(y){const Be=te(T,t,o)[d];Be&&q(Be,u)?p.push(T):M.push(T)}else p.push(T)}if(!p.length)continue;const j=R(p)[0],b=[],L=new Set([h,g(j)]),O=y?M:p.filter(T=>T!==j);for(const T of R(O)){const $=g(T);if(!L.has($)&&(L.add($),b.push(T),b.length>=2))break}if(!y&&b.length<2)for(const T of R(D)){if(T===e||T===j)continue;const $=g(T);if(!L.has($)&&(L.add($),b.push(T),b.length>=2))break}if(!(b.length<2))return{question:e,distractors:[j,...b]}}return null}const Ru=()=>{const e="\uC54C \uC218 \uC5C6\uB294 \uC624\uB958",n=typeof Ne?.t=="function"?Ne.t("common.unknownError",{defaultValue:e}):void 0;return typeof n=="string"&&n?n:e};function Ou(e,n){if(n===void 0&&(n=Ru()),e instanceof Error)return e.message||n;if(typeof e=="string")return e||n;if(e&&typeof e=="object"){const t=e;for(const o of[t.message,t.error_description,t.error])if(typeof o=="string"&&o)return o}return n}const Tn="\uB124\uD2B8\uC6CC\uD06C \uC5F0\uACB0\uC774 \uBD88\uC548\uC815\uD569\uB2C8\uB2E4. \uC5F0\uACB0 \uC0C1\uD0DC\uB97C \uD655\uC778\uD55C \uB4A4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574 \uC8FC\uC138\uC694.",ku=()=>{const e=typeof Ne?.t=="function"?Ne.t("common.networkError",{defaultValue:Tn}):void 0;return typeof e=="string"&&e?e:Tn};function ht(e){return e?/failed to fetch|load failed|networkerror|network request failed|fetcherror/i.test(e):!1}function $u(e){return ht(e)?ku():e}function Iu(e,n){return e==="id"?void 0:`${e}|${n?"asc":"desc"}`}function Mu(e){const[n,t]=e.split("|");return{key:n,asc:t==="asc"}}function Pu(e){let n=e==null?"":String(e);return!(typeof e=="number"&&Number.isFinite(e))&&/^[=+\-@\t\r]/.test(n)&&(n="'"+n),/[",\n\r]/.test(n)?`"${n.replaceAll('"','""')}"`:n}const vu=1e3;function Fu(e,n){const t=new Blob([n.startsWith("\uFEFF")?n:"\uFEFF"+n],{type:"text/csv;charset=utf-8"}),o=URL.createObjectURL(t),r=document.createElement("a");r.href=o,r.download=e,r.click(),setTimeout(()=>URL.revokeObjectURL(o),vu)}const mt="__ihab_core_word_pool__";function Gu(){typeof window<"u"&&window.dispatchEvent(new CustomEvent("wordpool:update"))}function xu(e,n){const t=new Map;for(const r of e)t.set(r.word,r);const o={entries:e,pairIndex:n??null,byWord:t};globalThis[mt]=o,Gu()}function St(){return globalThis[mt]??null}const ue=globalThis;function pn(e,n){const t=o=>{};try{const o=n();o&&typeof o.catch=="function"&&o.catch(t)}catch(o){t(o)}}function Wu(e){ue.__ihabTrainingTimeLogger=e}function Hu(e){pn("time",()=>ue.__ihabTrainingTimeLogger?.(e))}function Yu(e){ue.__ihabTrainingCompletionLogger=e}function Ku(e){pn("completion",()=>ue.__ihabTrainingCompletionLogger?.(e))}function Uu(e){ue.__ihabCrosswordLogger=e}function Vu(e){pn("crossword",()=>ue.__ihabCrosswordLogger?.(e))}function N(e){return typeof e=="string"?e.trim()||null:typeof e=="number"?String(e):null}function yt(e){for(const n of["correct","isCorrect","heard","judgement"])if(typeof e[n]=="boolean")return e[n];return e.score===1?!0:e.score===0?!1:null}function zu(e){return Array.isArray(e)?e.map((n,t)=>{const o=n??{};return{index:t,itemId:N(o.contextCode)??N(o.itemId)??N(o.itemCode)??N(o.id),question:N(o.question)??N(o.q)??N(o.sentence)??N(o.text)??N(o.prompt)??N(o.word)??N(o.targetSyllable),answer:N(o.answer),selected:N(o.selectedText)??N(o.selected),correct:yt(o)}}):[]}function Ju(e){return e.filter(n=>n.correct===!1)}let Et=null,Dt=null,Tt=null;function qu(e){Et=e}function Qu(e){Dt=e}function Zu(e){Tt=e}async function Xu(e,n){try{return await Et?.(e,n)??null}catch{return null}}async function er(){try{return await Dt?.()??null}catch{return null}}async function nr(e,n){try{return await Tt?.(e,n)??null}catch{return null}}const xe=globalThis;function tr(e){xe.__ihabNoiseSettingsStore=e}async function or(){try{return await xe.__ihabNoiseSettingsStore?.load()??null}catch{return null}}function ur(e){const n=t=>{};try{const t=xe.__ihabNoiseSettingsStore?.save(e);t&&typeof t.catch=="function"&&t.catch(n)}catch(t){n(t)}}function rr(e){try{xe.__ihabNoiseSettingsStore?.applied?.(e)}catch{}}function We(e){const n=new TextEncoder().encode(String(e).normalize("NFC"));let t="";return n.forEach(o=>{t+=o.toString(16).padStart(2,"0")}),t}const ir=We;function ar(e,n){return`${e}/${We(n)}.mp3`}function sr(e={}){const n=e.storagePrefix??"audio-cache",t=e.voice??"ko-f",o=typeof e.speed=="number"?e.speed:1,r=e.filenameSanitizer??We;return async function(i){const u=String(i||"").trim();if(!u)return"";const a=`${r(u)}_${t}.mp3`,s=`${n}/${a}`;try{if(await jn(s)){const c=await Ln(s);if(c)return c}}catch{}if(e.generator)try{const c=await e.generator(u,s,e);if(c)return c}catch{}try{const c=`/api/tts?word=${encodeURIComponent(u)}&voice=${encodeURIComponent(t)}&speed=${encodeURIComponent(String(o))}`;return await fetch(c,{method:"GET"}),`/audio-cache/${a}`}catch{return`/audio-cache/${a}`}}}async function lr(e){if(typeof document<"u"){const n=document.activeElement;let t=null;try{if(t=document.createElement("textarea"),t.value=e,t.setAttribute("readonly",""),t.style.position="fixed",t.style.top="0",t.style.left="0",t.style.opacity="0",t.style.pointerEvents="none",document.body.appendChild(t),t.focus(),t.select(),t.setSelectionRange(0,e.length),document.execCommand("copy"))return!0}catch{}finally{if(t?.parentNode&&t.parentNode.removeChild(t),n&&n!==document.activeElement&&typeof n.focus=="function"&&n.isConnected)try{n.focus({preventScroll:!0})}catch{}}}try{if(typeof navigator<"u"&&navigator.clipboard&&typeof navigator.clipboard.writeText=="function")return await navigator.clipboard.writeText(e),!0}catch{}return!1}const re="Asia/Seoul",cr=/^(\d{4}-\d{2}-\d{2})[T ](\d{2}:\d{2})(?::(\d{2})(?:\.(\d+))?)?$/;function He(e){let n;if(e instanceof Date)n=e;else if(typeof e=="string"){const t=e.trim(),o=cr.exec(t);n=new Date(o?`${o[1]}T${o[2]}:${o[3]??"00"}${o[4]?`.${o[4].slice(0,3).padEnd(3,"0")}`:""}+09:00`:t)}else n=new Date(e);return Number.isNaN(n.getTime())?null:n}const ye=e=>He(e);function Cr(e){const n=ye(e);return n?n.toLocaleDateString("ko-KR",{timeZone:re,year:"numeric",month:"short",day:"numeric"}):""}function gr(e){const n=ye(e);return n?n.toLocaleString("ko-KR",{timeZone:re,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function dr(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US",o=ye(e);return o?o.toLocaleDateString(t,{timeZone:re,year:"numeric",month:"short",day:"numeric"}):""}function fr(e,n){const t=n.startsWith("ko")?"ko-KR":"en-US",o=ye(e);return o?o.toLocaleString(t,{timeZone:re,year:"numeric",month:"long",day:"numeric",hour:"2-digit",minute:"2-digit"}):""}function hr(e){const n=ye(e);return n?n.toLocaleString("ko-KR",{timeZone:re,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):""}function mr(e){if(e==null||e==="")return"";const n=He(e);return n?new Intl.DateTimeFormat("en-GB",{timeZone:re,hour:"2-digit",minute:"2-digit",hour12:!1}).format(n):""}function An(){return Ee(new Date)}function Sr(){return pt(An())}const yr=540*60*1e3;function Er(e,n,t){return new Date(Date.UTC(e,n,t)-yr)}function pt(e){const[n,t,o]=e.split("-").map(Number);return new Date(n,(t||1)-1,o||1)}function Ee(e){if(e==null||e==="")return"";const n=He(e);return n?new Intl.DateTimeFormat("fr-CA",{timeZone:"Asia/Seoul"}).format(n):""}function Dr(e,n){if(!e)return"";const t=He(e);if(!t)return"";const o=t.getTime(),r=Math.max(0,Math.floor((Date.now()-o)/1e3)),i=Math.floor(r/60),u=Math.floor(i/60),a=Math.floor(u/24),s=Math.floor(a/7),c=Math.floor(a/30),C=Math.floor(a/365);return i<1?n("store.time.justNow","\uBC29\uAE08 \uC804"):i<60?n("store.time.minutesAgo",{n:i}):u<24?n("store.time.hoursAgo",{n:u}):a<7?n("store.time.daysAgo",{n:a}):s<5?n("store.time.weeksAgo",{n:s}):a<365?n("store.time.monthsAgo",{n:Math.min(c,11)}):n("store.time.yearsAgo",{n:C})}function Tr(e,n={}){const{sep:t=".",pad:o=!0,trailingDot:r=!1,fallback:i="\u2014"}=n;if(!e)return i;const u=Ee(e instanceof Date?e:String(e));if(!u)return i;const[a,s,c]=u.split("-"),C=o?s:String(Number(s)),l=o?c:String(Number(c));return`${a}${t}${C}${t}${l}${r?".":""}`}function pr(e){const n=e.normalize("NFKC").replace(/\D/g,"");if(/^(050\d|0303)/.test(n)){const o=n.slice(0,12);return o.length<=4?o:o.length<=8?`${o.slice(0,4)}-${o.slice(4)}`:`${o.slice(0,4)}-${o.slice(4,o.length-4)}-${o.slice(o.length-4)}`}if(/^1[5-9]\d{2}/.test(n)&&n.length<=8)return n.length<=4?n:`${n.slice(0,4)}-${n.slice(4)}`;const t=n.slice(0,11);return t.startsWith("02")?t.length<=2?t:t.length<=6?`${t.slice(0,2)}-${t.slice(2)}`:`${t.slice(0,2)}-${t.slice(2,t.length-4)}-${t.slice(t.length-4)}`:t.length<=3?t:t.length<=7?`${t.slice(0,3)}-${t.slice(3)}`:`${t.slice(0,3)}-${t.slice(3,t.length-4)}-${t.slice(t.length-4)}`}function Ar(e){if(e){if(/^\d{4}\.\d{2}\.\d{2}$/.test(e))return e;if(/^\d{8}$/.test(e))return`${e.slice(0,4)}.${e.slice(4,6)}.${e.slice(6,8)}`;if(/^\d{4}-\d{2}-\d{2}$/.test(e))return e.replace(/-/g,".");if(/^\d{4}-\d{2}-\d{2}[T ]/.test(e)){const n=Ee(e);return n?n.replace(/-/g,"."):void 0}}}function wr(e){if(e)return/^\d{4}\.\d{2}\.\d{2}$/.test(e)?e.replace(/\./g,"-"):e}function br(e,n){if(!e)return"-";const t=/^(\d{1,2}):(\d{2})$/.exec(e.trim());if(!t)return e;const o=Number(t[1]),r=Number(t[2]),i=t[1].padStart(2,"0");return r===0?n("date.timeH",{h:o,hh:i,mm:t[2]}):n("date.timeHM",{h:o,hh:i,m:r,mm:t[2]})}function _r(e){return(e??0).toLocaleString("ko-KR")}const Br=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Nr=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uC18C\uC74C \uD658\uACBD \uC18D \uBB38\uC7A5 \uC774\uD574 \uD6C8\uB828"},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30 + 4\uBB38\uC81C"},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30 \uC2EC\uD654 \uD6C8\uB828"},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC21C\uC11C \uBC30\uC5F4 \uD6C8\uB828"}];let wn=null;function jr(e){wn=e}function Lr(){return wn?.topicTypes??Br}function Rr(){return wn?.trainingTypes??Nr}const At="ihab_theme",wt="light";function bt(){try{const e=localStorage.getItem(At);if(e==="light"||e==="dark"||e==="auto")return e}catch{}return wt}function _t(e){const n=e==="light"||e==="dark"||e==="auto"?e:wt;try{document.documentElement.setAttribute("data-theme",n),localStorage.setItem(At,n)}catch{}}function Or(){_t(bt())}const Bt="ihab_font_scale",kr="medium",$r=["medium","large1","large2","large3"];function Nt(){try{const e=localStorage.getItem(Bt);if($r.includes(e))return e}catch{}return kr}function jt(e){try{document.documentElement.setAttribute("data-font-scale",e),localStorage.setItem(Bt,e)}catch{}}function Ir(){jt(Nt())}const De=[],Te=[],pe=[],Ae=[],we={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},be={LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]},Mr={LISTEN_IN_NOISE:3,SHORT_STORY:2,LONG_STORY:1,ORDERING_SENTENCE:2};let bn=null,Lt=null,V=null;function Rt({counts:e,forceRefresh:n}={}){const t=Object.assign({},Mr,e||{}),o=An(),r=Ee(new Date(`${o}T00:00:00+09:00`).getTime()-864e5),i=JSON.stringify(t);if(!n&&Lt===o&&bn===i&&V)return Object.assign(we,V.today),Object.assign(be,V.yesterday?.selection||{LISTEN_IN_NOISE:[],SHORT_STORY:[],LONG_STORY:[],ORDERING_SENTENCE:[]}),{today:we,yesterday:be};const u={LISTEN_IN_NOISE:Y(De,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:Y(Te,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:Y(pe,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:Y(Ae,Math.max(0,Number(t.ORDERING_SENTENCE)||0))};let a=null;return V&&bn===i&&V.yesterday&&V.yesterday.date===r&&(a=V.yesterday.selection),a||(a={LISTEN_IN_NOISE:Y(De,Math.max(0,Number(t.LISTEN_IN_NOISE)||0)),SHORT_STORY:Y(Te,Math.max(0,Number(t.SHORT_STORY)||0)),LONG_STORY:Y(pe,Math.max(0,Number(t.LONG_STORY)||0)),ORDERING_SENTENCE:Y(Ae,Math.max(0,Number(t.ORDERING_SENTENCE)||0))}),Object.assign(we,u),Object.assign(be,a),Lt=o,bn=i,V={today:u,yesterday:{date:r,countsKey:i,selection:a}},{today:we,yesterday:be}}function Pr(){return{today:we,yesterday:be}}function vr(){return{LISTEN_IN_NOISE:De,SHORT_STORY:Te,LONG_STORY:pe,ORDERING_SENTENCE:Ae}}let Ye=!1,_e=null;async function Fr(){try{const e={url:typeof document>"u"?require("url").pathToFileURL(__filename).href:Ue&&Ue.tagName.toUpperCase()==="SCRIPT"&&Ue.src||new URL("utils.cjs.js",document.baseURI).href}&&void 0||"/",n=await fetch(`${e}data/allTrainingData.json`);return n.ok?await n.json():null}catch{return null}}async function Ot(){if(!Ye)return _e||(_e=(async()=>{const e=await Fr();if(!e){_e=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}const n={noise:[],short:[],long:[],order:[]};try{for(const t of Object.keys(e||{})){const o=e[t]||[];for(const r of o){if(!r||typeof r!="object")continue;const i=r,u=String(i.training_type||t),a=String(i.category_main_code||i.category_main||i.category_0||""),s=String(i.category_sub_code||i.category_sub||i.category_1||""),c=Object.assign({},i,{training_type:u,category_0:a,category_1:s});u==="LISTEN_IN_NOISE"?n.noise.push(c):u==="SHORT_STORY"?n.short.push(c):u==="LONG_STORY"?n.long.push(c):u==="ORDERING_SENTENCE"&&n.order.push(c)}}}catch{_e=null;try{window.dispatchEvent(new Event("speechear.data.error"))}catch{}return}De.push(...n.noise),Te.push(...n.short),pe.push(...n.long),Ae.push(...n.order),Ye=!0;try{Rt()}catch{}try{window.dispatchEvent(new Event("speechear.data.updated"))}catch{}})(),_e)}function Gr(){return Ye}async function xr(e=3e3){const n=Ot();let t;try{await Promise.race([n,new Promise(o=>{t=setTimeout(o,e)})])}finally{t!==void 0&&clearTimeout(t)}return Ye}const Wr=[{key:"LISTEN_IN_NOISE",label:"\uC18C\uC74C \uD558 \uBB38\uC7A5 \uB4E3\uAE30",icon:"party-popper",desc:"\uB2E4\uC591\uD55C \uC18C\uC74C \uD658\uACBD\uC5D0\uC11C \uBB38\uC7A5 \uCCAD\uB825\uC744 \uD6C8\uB828\uD569\uB2C8\uB2E4."},{key:"SHORT_STORY",label:"\uC9E7\uC740 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square",desc:"\uC9E7\uC740 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"LONG_STORY",label:"\uAE34 \uC774\uC57C\uAE30 \uB4E3\uAE30",icon:"message-square-text",desc:"\uAE34 \uC774\uC57C\uAE30\uB97C \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uB2E4\uC218\uC758 \uBB38\uC81C\uB97C \uD480\uC5B4\uBD05\uB2C8\uB2E4."},{key:"ORDERING_SENTENCE",label:"\uBB38\uC7A5 \uC21C\uC11C\uD654 \uD558\uAE30",icon:"align-start-vertical",desc:"\uC5EC\uB7EC\uAC1C\uC758 \uC9E7\uC740 \uBB38\uC7A5\uC744 \uB4E3\uACE0 \uAE30\uC5B5\uD558\uC5EC \uADF8 \uC21C\uC11C\uC5D0 \uB9DE\uAC8C \uBC30\uC5F4\uD569\uB2C8\uB2E4."}],Hr=[{key:"FOOD",label:"\uC74C\uC2DD",icon:"salad",color:"#FF8A65",subs:[{key:"TRKRFD",label:"\uD55C\uAD6D \uC804\uD1B5\uC74C\uC2DD"},{key:"MDKRFD",label:"\uD55C\uAD6D \uD604\uB300\uC74C\uC2DD"},{key:"WRLDFD",label:"\uC138\uACC4\uC758 \uC74C\uC2DD"},{key:"MTRFRT",label:"\uC2DD\uC7AC\uB8CC\uC640 \uACFC\uC77C"},{key:"GEFDKL",label:"\uC74C\uC2DD \uC0C1\uC2DD"}]},{key:"HLTH",label:"\uAC74\uAC15",icon:"heart",color:"#66BB6A",subs:[{key:"HTETHB",label:"\uAC74\uAC15\uD55C \uC2DD\uC2B5\uAD00"},{key:"DISILL",label:"\uBCD1\uACFC \uC9C8\uD658"},{key:"EXCISE",label:"\uC6B4\uB3D9"},{key:"GEHTKL",label:"\uAC74\uAC15\uC0C1\uC2DD"}]},{key:"WETH",label:"\uB0A0\uC528",icon:"sun-medium",color:"#42A5F5",subs:[{key:"GESSKL",label:"\uACC4\uC808\uC0C1\uC2DD"},{key:"SNWRAN",label:"\uB208\uACFC \uBE44"},{key:"WTHFCT",label:"\uC77C\uAE30\uC608\uBCF4"},{key:"GEWTKL",label:"\uB0A0\uC528\uC0C1\uC2DD"}]},{key:"PRSN",label:"\uC778\uBB3C",icon:"user-round",color:"#AB47BC",subs:[{key:"JODYPS",label:"\uC870\uC120\uC2DC\uB300"},{key:"MDKRPS",label:"\uD55C\uAD6D \uADFC\uD604\uB300"},{key:"THKDPS",label:"\uC0BC\uAD6D\uC2DC\uB300"},{key:"WRLART",label:"\uC138\uACC4\uC758 \uC608\uC220\uAC00"},{key:"WRLPSN",label:"\uC138\uACC4\uC758 \uC778\uBB3C"}]},{key:"KRCT",label:"\uD55C\uAD6D\uBB38\uD654",icon:"bow-arrow",color:"#EC407A",subs:[{key:"KRLANG",label:"\uC6B0\uB9AC\uB9D0"},{key:"TRPLCT",label:"\uC804\uD1B5\uB180\uC774"},{key:"HERITG",label:"\uBB38\uD654\uC7AC"},{key:"EVTFES",label:"\uD589\uC0AC\uC640 \uCD95\uC81C"},{key:"GECTKL",label:"\uC0C1\uC2DD"}]},{key:"STRY",label:"\uC774\uC57C\uAE30",icon:"message-circle",color:"#8D6E63",subs:[{key:"FRYTAL",label:"\uB3D9\uD654"},{key:"AMZING",label:"\uC2E0\uAE30\uD55C \uC774\uC57C\uAE30"},{key:"DAYSTR",label:"\uC77C\uC0C1 \uC18D \uC774\uC57C\uAE30"}]},{key:"LOCA",label:"\uC9C0\uC5ED",icon:"map-pin",color:"#26A69A",subs:[{key:"KRLDMK",label:"\uD55C\uAD6D\uC758 \uBA85\uC18C"},{key:"SELNMK",label:"\uC11C\uC6B8\uC758 \uBA85\uC18C"},{key:"WRDTRB",label:"\uC138\uACC4\uC5EC\uD589"},{key:"NAVIGT",label:"\uAE38 \uCC3E\uAE30"}]},{key:"SOAR",label:"\uC0AC\uD68C\uC640 \uC608\uC220",icon:"landmark",color:"#5C6BC0",subs:[{key:"KRSOCI",label:"\uD55C\uAD6D"},{key:"ECONEW",label:"\uACBD\uC81C\uC640 \uB274\uC2A4"},{key:"GENART",label:"\uC608\uC220"},{key:"GELFKL",label:"\uC0DD\uD65C \uC0C1\uC2DD"}]},{key:"NTSC",label:"\uC790\uC5F0\uACFC \uACFC\uD559",icon:"leaf",color:"#9CCC65",subs:[{key:"ANIMAL",label:"\uB3D9\uBB3C"},{key:"PLANTS",label:"\uC2DD\uBB3C"},{key:"ETHPLT",label:"\uC9C0\uAD6C"},{key:"TOLELC",label:"\uB3C4\uAD6C\uC640 \uC804\uC790\uC81C\uD488"},{key:"GESCKL",label:"\uACFC\uD559\uC0C1\uC2DD"}]},{key:"SPRT",label:"\uC2A4\uD3EC\uCE20",icon:"trophy",color:"#FFCA28",subs:[{key:"INVDSP",label:"\uAC1C\uC778\uACBD\uAE30"},{key:"MARART",label:"\uACA9\uD22C\uAE30"},{key:"TEAMSP",label:"\uB2E8\uCCB4\uACBD\uAE30"},{key:"FOOTBL",label:"\uCD95\uAD6C"},{key:"GESPKL",label:"\uC2A4\uD3EC\uCE20 \uC0C1\uC2DD"}]}],Yr={LISTEN_IN_NOISE:"listenInNoise",SHORT_STORY:"shortStory",LONG_STORY:"longStory",ORDERING_SENTENCE:"orderingSentence"};let Ke=null,kt=null,$t=null;function Kr(){const e=St();if(e&&e.entries.length>0){const n=Jn();if(Ke&&kt===e&&$t===n)return Ke;const t=new Set,o=[];for(const r of e.entries)!r.word||t.has(r.word)||(t.add(r.word),o.push({w:r.word,s:r.syllables,p:n?.[r.word]?[...n[r.word].cho??[],...n[r.word].jung??[],...n[r.word].jong??[]]:[],pron:r.pronunciation||r.word,grade:r.grade}));return Ke=o,kt=e,$t=n,Ke}return[]}new Proxy([],{get(e,n){const t=Kr(),o=t[n];return typeof o=="function"?o.bind(t):o}});const Ur={free:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},personal_standard:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},mgr_free:{maxCustomers:5,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},none:{maxCustomers:0,visitWord:!1,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!1,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!1,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:0,crossword:!1,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!1},lite_word:{maxCustomers:10,visitWord:!0,visitSentence:!1,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:0,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!1},lite_sentence:{maxCustomers:10,visitWord:!1,visitSentence:!0,homework:!1,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!1,wordTableSetting:!1,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!1,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:0,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!1,sentenceTrainingView:!0},lite:{maxCustomers:10,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!1,wordTrainingSetting:!1,myWordList:!1,wordListShare:!1,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!1,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!1,wordSearchAddToGroupList:!1,wordDataLevel:1,sentenceDataLevel:1,crossword:!0,crosswordMid:!1,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},standard:{maxCustomers:30,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!1,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:2,sentenceDataLevel:2,crossword:!0,crosswordMid:!0,crosswordHigh:!1,wordTrainingView:!0,sentenceTrainingView:!0},pro:{maxCustomers:50,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!1,managerManagement:!1,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!1,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!1,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!1,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0},enterprise:{maxCustomers:1/0,visitWord:!0,visitSentence:!0,homework:!0,customerStats:!0,managerCustomerSplit:!0,managerManagement:!0,sentenceTrainingSetting:!0,wordTrainingSetting:!0,myWordList:!0,wordListShare:!0,groupTrainingSetting:!0,minimalPairSearch:!0,wordTableSetting:!0,wordTablePrint:!0,addToMyList:!0,addToGroupList:!0,wordSearch:!0,wordSearchPrint:!0,wordSearchAddToMyList:!0,wordSearchAddToGroupList:!0,wordDataLevel:3,sentenceDataLevel:3,crossword:!0,crosswordMid:!0,crosswordHigh:!0,wordTrainingView:!0,sentenceTrainingView:!0}},Vr={none:0,free:1,personal_standard:2,mgr_free:10,lite_word:11,lite_sentence:11,lite:12,standard:13,pro:14,enterprise:15},zr=new Set(["mgr_free","lite_word","lite_sentence","lite","standard","pro","enterprise"]);function Jr(e){return zr.has(e)}const qr={free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1},personal_standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null},mgr_free:{sentenceTrainingDaily:2,wordTrainingDaily:2,gameDaily:1,trainingItemMax:5,customerMax:5,homeworkSendDaily:1},lite:{sentenceTrainingDaily:5,wordTrainingDaily:5,gameDaily:5,trainingItemMax:10,customerMax:10,homeworkSendDaily:10},standard:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:30,customerMax:30,homeworkSendDaily:30},pro:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:50,homeworkSendDaily:50},enterprise:{sentenceTrainingDaily:null,wordTrainingDaily:null,gameDaily:null,trainingItemMax:null,customerMax:null,homeworkSendDaily:null}};function Qr(e){const n=(e??"").toLowerCase();return n==="speechear_free"||n==="free"?"free":n.startsWith("manager_free")||n.startsWith("mgr_free")?"mgr_free":n.startsWith("manager_enterprise")?"enterprise":n.startsWith("manager_pro")?"pro":n.startsWith("manager_standard")?"standard":n.startsWith("manager_lite_word")?"lite_word":n.startsWith("manager_lite_sentence")?"lite_sentence":n.startsWith("manager_lite")||n.startsWith("mgr_lite")?"lite":n.startsWith("mgr_standard")?"standard":n.startsWith("mgr_pro")?"pro":n.startsWith("content_")||n.startsWith("speechear_")||n.startsWith("light_")||n==="light"?"personal_standard":"none"}const Zr=5,Xr=5;function ei({rank:e,voteCount:n,quota:t=5}){return e<t&&n>0}const ni={selected:"ALREADY_SELECTED",added:"ALREADY_ADDED",rejected:"ALREADY_REJECTED"},ti="0.164.0";exports.CAPABILITY=Ct,exports.CHOSEONG=A,exports.CORE_VERSION=ti,exports.JONGSEONG=B,exports.JUNGSEONG=w,exports.LONG_STORIES=pe,exports.NETWORK_ERROR_MESSAGE=Tn,exports.NOISE_DATAS=De,exports.ORDER_SETS=Ae,exports.PLAN_FEATURES=Ur,exports.PLAN_LIMITS=qr,exports.SHORT_STORIES=Te,exports.TIER_RANK=Vr,exports.TOPIC_TYPES=Hr,exports.TRAINING_TYPES=Wr,exports.TRAINING_TYPE_I18N_KEY=Yr,exports.WORD_SUGGESTION_ACCOUNT_LIMIT=Xr,exports.WORD_SUGGESTION_EXISTING_ERROR=ni,exports.WORD_SUGGESTION_WEEKLY_QUOTA=Zr,exports.applyFontScale=jt,exports.applyTheme=_t,exports.buildChangeWholeSyllableProblem=Lu,exports.buildDropCompoundProblem=_u,exports.buildDropContrast3Problem=bu,exports.buildDropContrastProblem=wu,exports.buildDropFinalConsonantProblem=Bu,exports.buildMultiPartPosContrast=Go,exports.buildPairIndex=Io,exports.buildRemoveConsonantProblem=Nu,exports.buildSyllableMaskIndex=ju,exports.bulkSetImageExistence=fo,exports.cardQuestionTitle=Eu,exports.checkImageExists=Fn,exports.classifyPairDifficulty=So,exports.clearAudioExistsCache=Xt,exports.clearImageExistenceCache=ho,exports.clearPairIndexCache=Mo,exports.composeSyllable=x,exports.computeDailySelection=Rt,exports.configureImageResolver=so,exports.configureNoiseSettingsStore=tr,exports.configurePronunciationResolver=eo,exports.configureStorage=Ht,exports.configureTTS=Jt,exports.configureTrainingCategories=jr,exports.copyText=lr,exports.createDecompCache=mo,exports.createTTSUrlResolver=sr,exports.dateToDb=wr,exports.downloadCsvText=Fu,exports.downloadSound=Kt,exports.ensureTrainingDataLoaded=xr,exports.escapeCsvField=Pu,exports.fileExists=jn,exports.filterContrastCandidates=Zn,exports.finalToPhoneme=Qn,exports.firstChoseongOf=Gn,exports.formatCount=_r,exports.formatDateKo=Cr,exports.formatDateLocale=dr,exports.formatDateLongKo=gr,exports.formatDateLongLocale=fr,exports.formatDatetimeKo=hr,exports.formatPhone=pr,exports.formatRelativeTime=Dr,exports.formatTimeHM=br,exports.formatYmd=Tr,exports.getAssetBaseUrl=Bn,exports.getDailySelection=Pr,exports.getElementAnalyser=uo,exports.getElementVolume=io,exports.getErrorMessage=Ou,exports.getImageExistenceStats=go,exports.getImageExistsCached=co,exports.getImageResolver=Pn,exports.getNoiseBaseUrl=Ut,exports.getNoiseFileGain=Vt,exports.getPairIndex=Jn,exports.getPlanTier=Qr,exports.getPronunciationResolver=no,exports.getSavedFontScale=Nt,exports.getSavedTheme=bt,exports.getSignedOrPublicUrl=Ln,exports.getTTSFallbackUrlResolver=Qt,exports.getTTSUrlResolver=qt,exports.getTodayKst=An,exports.getTodayKstDate=Sr,exports.getTopicTypes=Lr,exports.getTrainingPools=vr,exports.getTrainingTypes=Rr,exports.getWordPool=St,exports.hasQuestionWordConstraint=lu,exports.hasSel=k,exports.hasStructureContrast=rn,exports.initFontScale=Ir,exports.initTheme=Or,exports.isAllChoseong=Wn,exports.isManagerTier=Jr,exports.isManualOnlyType=Cu,exports.isNetworkErrorMessage=ht,exports.isSyllablePattern=Kn,exports.isThisWeekPick=ei,exports.isTrainingDataLoaded=Gr,exports.isValidQuestionWord=cu,exports.itemCorrectness=yt,exports.jamoToNamesForSpeech=Du,exports.kstStartOfDay=Er,exports.loadGameLeaderboard=nr,exports.loadMyGameRanks=er,exports.loadNoiseSettings=or,exports.loadTrainingData=Ot,exports.logCrossword=Vu,exports.logTrainingCompletion=Ku,exports.logTrainingTime=Hu,exports.matchSyllables=te,exports.matchesChoseongSearch=yo,exports.matchesSyllablePattern=Vn,exports.matchesWordQuery=Eo,exports.mergeQuestionText=ft,exports.minimalPairDistractors=Fo,exports.normalizeDate=Ar,exports.officialSoundPath=ar,exports.parseLocalYmd=pt,exports.parseSortValue=Mu,exports.parseSyllable=S,exports.patternToComposition=No,exports.phonemePartsOf=du,exports.pickEuRo=ct,exports.pickEulReul=at,exports.pickEunNeun=st,exports.pickIga=it,exports.pickWaGwa=lt,exports.prewarmImageCache=Co,exports.primarySelPart=Ge,exports.readLevel=ao,exports.reorderArray=iu,exports.reportAppliedNoiseSettings=rr,exports.resolveAssetUrl=xt,exports.resolveSoundPath=Yt,exports.resumeAudioMeter=oo,exports.routeElementAudio=In,exports.sample=Y,exports.saveNoiseSettings=ur,exports.searchAndRankWords=Ro,exports.setAssetBaseUrl=Gt,exports.setCrosswordLogger=Uu,exports.setElementVolume=ro,exports.setGameLeaderboardLoader=Zu,exports.setGameRanksLoader=Qu,exports.setGameScoreSubmitter=qu,exports.setTrainingCompletionLogger=Yu,exports.setTrainingTimeLogger=Wu,exports.setWordPool=xu,exports.shuffle=R,exports.sortToValue=Iu,exports.soundOf=En,exports.speak=Mt,exports.stopSpeaking=Pt,exports.submitGameScore=Xu,exports.syllMatchesComp=q,exports.syllableContrasts=oe,exports.syllableLength=Ao,exports.syllablePron=Fe,exports.toBase64UrlSafe=ir,exports.toChoseong=xn,exports.toItemResults=zu,exports.toKstHm=mr,exports.toKstYmd=Ee,exports.toStandardPronunciation=Xo,exports.toStorageName=We,exports.toUserErrorMessage=$u,exports.validateSyllableSearchInput=Lo,exports.withEuRo=ru,exports.withEulReul=tu,exports.withEunNeun=ou,exports.withIga=nu,exports.withWaGwa=uu,exports.wordContainsChoseong=Do,exports.wordContainsJongseong=po,exports.wordContainsJungseong=To,exports.wordHasNoCoda=wo,exports.wordHasSyllableMatching=_o,exports.wrongItems=Ju;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ihabdevteam/core",
3
- "version": "0.163.0",
3
+ "version": "0.164.0",
4
4
  "private": false,
5
5
  "main": "dist/ihabdevteam-core.cjs.js",
6
6
  "module": "dist/packages/core/src/index.js",