@sd-angular/core 19.0.0-beta.86 → 19.0.0-beta.87
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +716 -716
- package/assets/fonts/fonts.scss +115 -115
- package/assets/scss/bootstrap-4.6.2/_alert.scss +52 -52
- package/assets/scss/bootstrap-4.6.2/_badge.scss +54 -54
- package/assets/scss/bootstrap-4.6.2/_breadcrumb.scss +42 -42
- package/assets/scss/bootstrap-4.6.2/_button-group.scss +163 -163
- package/assets/scss/bootstrap-4.6.2/_buttons.scss +142 -142
- package/assets/scss/bootstrap-4.6.2/_card.scss +286 -286
- package/assets/scss/bootstrap-4.6.2/_carousel.scss +200 -200
- package/assets/scss/bootstrap-4.6.2/_close.scss +40 -40
- package/assets/scss/bootstrap-4.6.2/_code.scss +48 -48
- package/assets/scss/bootstrap-4.6.2/_custom-forms.scss +526 -526
- package/assets/scss/bootstrap-4.6.2/_dropdown.scss +192 -192
- package/assets/scss/bootstrap-4.6.2/_forms.scss +347 -347
- package/assets/scss/bootstrap-4.6.2/_functions.scss +190 -190
- package/assets/scss/bootstrap-4.6.2/_grid.scss +73 -73
- package/assets/scss/bootstrap-4.6.2/_images.scss +42 -42
- package/assets/scss/bootstrap-4.6.2/_input-group.scss +211 -211
- package/assets/scss/bootstrap-4.6.2/_jumbotron.scss +17 -17
- package/assets/scss/bootstrap-4.6.2/_list-group.scss +154 -154
- package/assets/scss/bootstrap-4.6.2/_media.scss +8 -8
- package/assets/scss/bootstrap-4.6.2/_mixins.scss +47 -47
- package/assets/scss/bootstrap-4.6.2/_modal.scss +240 -240
- package/assets/scss/bootstrap-4.6.2/_nav.scss +125 -125
- package/assets/scss/bootstrap-4.6.2/_navbar.scss +332 -332
- package/assets/scss/bootstrap-4.6.2/_pagination.scss +74 -74
- package/assets/scss/bootstrap-4.6.2/_popover.scss +170 -170
- package/assets/scss/bootstrap-4.6.2/_print.scss +132 -132
- package/assets/scss/bootstrap-4.6.2/_progress.scss +47 -47
- package/assets/scss/bootstrap-4.6.2/_reboot.scss +484 -484
- package/assets/scss/bootstrap-4.6.2/_root.scss +19 -19
- package/assets/scss/bootstrap-4.6.2/_spinners.scss +65 -65
- package/assets/scss/bootstrap-4.6.2/_tables.scss +185 -185
- package/assets/scss/bootstrap-4.6.2/_toasts.scss +46 -46
- package/assets/scss/bootstrap-4.6.2/_tooltip.scss +115 -115
- package/assets/scss/bootstrap-4.6.2/_transitions.scss +26 -26
- package/assets/scss/bootstrap-4.6.2/_type.scss +125 -125
- package/assets/scss/bootstrap-4.6.2/_utilities.scss +18 -18
- package/assets/scss/bootstrap-4.6.2/_variables.scss +1150 -1150
- package/assets/scss/bootstrap-4.6.2/bootstrap-grid.scss +30 -30
- package/assets/scss/bootstrap-4.6.2/bootstrap-reboot.scss +12 -12
- package/assets/scss/bootstrap-4.6.2/bootstrap.scss +44 -44
- package/assets/scss/bootstrap-4.6.2/mixins/_alert.scss +13 -13
- package/assets/scss/bootstrap-4.6.2/mixins/_background-variant.scss +23 -23
- package/assets/scss/bootstrap-4.6.2/mixins/_badge.scss +17 -17
- package/assets/scss/bootstrap-4.6.2/mixins/_border-radius.scss +76 -76
- package/assets/scss/bootstrap-4.6.2/mixins/_box-shadow.scss +20 -20
- package/assets/scss/bootstrap-4.6.2/mixins/_breakpoints.scss +123 -123
- package/assets/scss/bootstrap-4.6.2/mixins/_buttons.scss +110 -110
- package/assets/scss/bootstrap-4.6.2/mixins/_caret.scss +62 -62
- package/assets/scss/bootstrap-4.6.2/mixins/_clearfix.scss +7 -7
- package/assets/scss/bootstrap-4.6.2/mixins/_deprecate.scss +10 -10
- package/assets/scss/bootstrap-4.6.2/mixins/_float.scss +14 -14
- package/assets/scss/bootstrap-4.6.2/mixins/_forms.scss +195 -195
- package/assets/scss/bootstrap-4.6.2/mixins/_gradients.scss +45 -45
- package/assets/scss/bootstrap-4.6.2/mixins/_grid-framework.scss +80 -80
- package/assets/scss/bootstrap-4.6.2/mixins/_grid.scss +69 -69
- package/assets/scss/bootstrap-4.6.2/mixins/_hover.scss +37 -37
- package/assets/scss/bootstrap-4.6.2/mixins/_image.scss +36 -36
- package/assets/scss/bootstrap-4.6.2/mixins/_list-group.scss +21 -21
- package/assets/scss/bootstrap-4.6.2/mixins/_lists.scss +7 -7
- package/assets/scss/bootstrap-4.6.2/mixins/_nav-divider.scss +11 -11
- package/assets/scss/bootstrap-4.6.2/mixins/_pagination.scss +22 -22
- package/assets/scss/bootstrap-4.6.2/mixins/_reset-text.scss +17 -17
- package/assets/scss/bootstrap-4.6.2/mixins/_resize.scss +6 -6
- package/assets/scss/bootstrap-4.6.2/mixins/_screen-reader.scss +34 -34
- package/assets/scss/bootstrap-4.6.2/mixins/_size.scss +7 -7
- package/assets/scss/bootstrap-4.6.2/mixins/_table-row.scss +39 -39
- package/assets/scss/bootstrap-4.6.2/mixins/_text-emphasis.scss +17 -17
- package/assets/scss/bootstrap-4.6.2/mixins/_text-hide.scss +11 -11
- package/assets/scss/bootstrap-4.6.2/mixins/_text-truncate.scss +8 -8
- package/assets/scss/bootstrap-4.6.2/mixins/_transition.scss +26 -26
- package/assets/scss/bootstrap-4.6.2/mixins/_visibility.scss +8 -8
- package/assets/scss/bootstrap-4.6.2/utilities/_align.scss +8 -8
- package/assets/scss/bootstrap-4.6.2/utilities/_background.scss +19 -19
- package/assets/scss/bootstrap-4.6.2/utilities/_borders.scss +75 -75
- package/assets/scss/bootstrap-4.6.2/utilities/_clearfix.scss +3 -3
- package/assets/scss/bootstrap-4.6.2/utilities/_display.scss +26 -26
- package/assets/scss/bootstrap-4.6.2/utilities/_embed.scss +39 -39
- package/assets/scss/bootstrap-4.6.2/utilities/_flex.scss +51 -51
- package/assets/scss/bootstrap-4.6.2/utilities/_float.scss +11 -11
- package/assets/scss/bootstrap-4.6.2/utilities/_interactions.scss +5 -5
- package/assets/scss/bootstrap-4.6.2/utilities/_overflow.scss +5 -5
- package/assets/scss/bootstrap-4.6.2/utilities/_position.scss +32 -32
- package/assets/scss/bootstrap-4.6.2/utilities/_screenreaders.scss +11 -11
- package/assets/scss/bootstrap-4.6.2/utilities/_shadows.scss +6 -6
- package/assets/scss/bootstrap-4.6.2/utilities/_sizing.scss +20 -20
- package/assets/scss/bootstrap-4.6.2/utilities/_spacing.scss +73 -73
- package/assets/scss/bootstrap-4.6.2/utilities/_stretched-link.scss +19 -19
- package/assets/scss/bootstrap-4.6.2/utilities/_text.scss +72 -72
- package/assets/scss/bootstrap-4.6.2/utilities/_visibility.scss +13 -13
- package/assets/scss/bootstrap-4.6.2/vendor/_rfs.scss +228 -228
- package/assets/scss/core/print.scss +47 -47
- package/assets/scss/core/scrollbar.scss +30 -30
- package/assets/scss/core/typography.scss +121 -121
- package/components/anchor/index.d.ts +1 -0
- package/components/anchor/src/components/anchor-item/anchor-item.component.d.ts +8 -11
- package/components/anchor/src/components/anchor-vertical/anchor-list/anchor-list.component.d.ts +12 -13
- package/components/anchor/src/components/main/main.component.d.ts +13 -18
- package/components/anchor/src/models/anchor.model.d.ts +7 -0
- package/components/anchor/src/models/index.d.ts +1 -0
- package/components/editor/src/models/image-upload.plugin.model.d.ts +1 -3
- package/fesm2022/sd-angular-core-components-anchor-v2.mjs +4 -4
- package/fesm2022/sd-angular-core-components-anchor-v2.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-anchor.mjs +115 -210
- package/fesm2022/sd-angular-core-components-anchor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-avatar.mjs +2 -2
- package/fesm2022/sd-angular-core-components-avatar.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-chart.mjs +40 -40
- package/fesm2022/sd-angular-core-components-chart.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-editor.mjs +3 -1
- package/fesm2022/sd-angular-core-components-editor.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-quick-action.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-tab-router.mjs +4 -4
- package/fesm2022/sd-angular-core-components-tab-router.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-table.mjs +6 -6
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-components-upload-file.mjs +4 -4
- package/fesm2022/sd-angular-core-components-upload-file.mjs.map +1 -1
- package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-models.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-select.mjs +2 -2
- package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-authom.mjs.map +1 -1
- package/fesm2022/sd-angular-core-modules-layout.mjs +16 -12
- package/fesm2022/sd-angular-core-modules-layout.mjs.map +1 -1
- package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-api.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-cache.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-confirm.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-firebase.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-license.mjs.map +1 -1
- package/fesm2022/sd-angular-core-services-storage.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-extensions.mjs.map +1 -1
- package/fesm2022/sd-angular-core-utilities-models.mjs.map +1 -1
- package/fesm2022/sd-angular-core.mjs.map +1 -1
- package/package.json +62 -62
- package/sd-angular-core-19.0.0-beta.87.tgz +0 -0
- package/components/anchor/src/components/anchor-horizontal/anchor-list/anchor-list.component.d.ts +0 -16
- package/components/anchor/src/services/anchor.service.d.ts +0 -12
- package/components/anchor/src/services/index.d.ts +0 -1
- package/sd-angular-core-19.0.0-beta.86.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-editor.mjs","sources":["../../../projects/sd-angular/components/editor/src/configurations/editor.configuration.ts","../../../projects/sd-angular/components/editor/src/plugins/image-upload/utils/validate.utils.ts","../../../projects/sd-angular/components/editor/src/plugins/image-upload/utils/batch.utils.ts","../../../projects/sd-angular/components/editor/src/plugins/image-upload/utils/style.utils.ts","../../../projects/sd-angular/components/editor/src/plugins/image-upload/image-upload.plugin.ts","../../../projects/sd-angular/components/editor/src/editor.component.ts","../../../projects/sd-angular/components/editor/src/editor.component.html","../../../projects/sd-angular/components/editor/sd-angular-core-components-editor.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport interface SdEditorUploadFileDetail {\r\n idOrKey: string;\r\n cdn: string;\r\n name?: string;\r\n}\r\n\r\nexport type SdEditorUploadFileFuncUpload = (files: File[]) => Promise<SdEditorUploadFileDetail[]>;\r\n\r\nexport interface ISdEditorConfiguration {\r\n key?: string;\r\n upload: SdEditorUploadFileFuncUpload;\r\n}\r\n\r\nexport const SD_EDITOR_CONFIGURATION = new InjectionToken<ISdEditorConfiguration>(\r\n 'sd.editor.configuration'\r\n);\r\n","import { FileLoader } from 'ckeditor5';\r\nimport { SdEditorImageUploadValidation } from '../../../models';\r\n\r\n// Dựa vào file để detect định dạng thay vì chỉ check tên\r\n// Tránh user gửi file không đúng, ví dụ file docx nhưng đổi tên thành ảnh docx.jpg\r\nconst detectFormatFromBytes = async (file: File): Promise<string> => {\r\n const buffer = await file.slice(0, 12).arrayBuffer();\r\n const b = new Uint8Array(buffer);\r\n\r\n if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) return 'jpg';\r\n if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) return 'png';\r\n if (b[0] === 0x52 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x46 && b[8] === 0x57) return 'webp';\r\n if (b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x38) return 'gif';\r\n if (b[4] === 0x66 && b[5] === 0x74 && b[6] === 0x79 && b[7] === 0x70) {\r\n const brand = String.fromCharCode(b[8], b[9], b[10], b[11]);\r\n if (brand === 'avif') return 'avif';\r\n if (brand.startsWith('hei')) return 'heic';\r\n }\r\n return '';\r\n};\r\n\r\nconst getImageInfo = async (file: File): Promise<{ width: number; height: number; sizeMB: number; format: string }> => {\r\n const sizeMB = file.size / (1024 * 1024);\r\n const loadDimensions = new Promise<{ width: number; height: number }>(resolve => {\r\n const url = URL.createObjectURL(file);\r\n const img = new window.Image();\r\n img.onload = () => {\r\n URL.revokeObjectURL(url);\r\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\r\n };\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n resolve({ width: 0, height: 0 });\r\n };\r\n img.src = url;\r\n });\r\n const [format, { width, height }] = await Promise.all([detectFormatFromBytes(file), loadDimensions]);\r\n return { width, height, sizeMB, format };\r\n};\r\n\r\nconst validateImageFile = async (\r\n file: File,\r\n validation: SdEditorImageUploadValidation,\r\n onWarning?: (message: string) => void\r\n): Promise<boolean> => {\r\n const { width, height, sizeMB, format } = await getImageInfo(file);\r\n\r\n if (validation.allowedFormats !== undefined) {\r\n const normalizedFormats = validation.allowedFormats.map((f: string) => {\r\n const fmt = f.replace(/^\\./, '').toLowerCase();\r\n return fmt === 'jpeg' ? 'jpg' : fmt;\r\n });\r\n if (!normalizedFormats.includes(format)) {\r\n onWarning?.(`Định dạng file \".${format}\" không được phép. Các định dạng hợp lệ: ${normalizedFormats.join(', ')}`);\r\n return false;\r\n }\r\n }\r\n if (validation.maxSizeMB !== undefined && sizeMB > validation.maxSizeMB) {\r\n onWarning?.(`Dung lượng file ${sizeMB.toFixed(2)}MB vượt quá giới hạn ${validation.maxSizeMB}MB`);\r\n return false;\r\n }\r\n if (validation.minWidth !== undefined && width < validation.minWidth) {\r\n onWarning?.(`Chiều rộng ảnh ${width}px nhỏ hơn giới hạn tối thiểu ${validation.minWidth}px`);\r\n return false;\r\n }\r\n if (validation.minHeight !== undefined && height < validation.minHeight) {\r\n onWarning?.(`Chiều cao ảnh ${height}px nhỏ hơn giới hạn tối thiểu ${validation.minHeight}px`);\r\n return false;\r\n }\r\n if (validation.maxWidth !== undefined && width > validation.maxWidth) {\r\n onWarning?.(`Chiều rộng ảnh ${width}px vượt quá giới hạn ${validation.maxWidth}px`);\r\n return false;\r\n }\r\n if (validation.maxHeight !== undefined && height > validation.maxHeight) {\r\n onWarning?.(`Chiều cao ảnh ${height}px vượt quá giới hạn ${validation.maxHeight}px`);\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const validateAndGetFile = async (\r\n loader: FileLoader,\r\n validation?: SdEditorImageUploadValidation,\r\n onWarning?: (message: string) => void\r\n): Promise<File> => {\r\n const file = (await loader.file) as File | null;\r\n if (!file) {\r\n throw new Error('No file found');\r\n }\r\n if (validation) {\r\n const valid = await validateImageFile(file, validation, onWarning);\r\n if (!valid) {\r\n throw new Error('Image validation failed');\r\n }\r\n }\r\n return file;\r\n};\r\n","import { ClassicEditor } from 'ckeditor5';\r\nimport { SdEditorOption } from '../../../models';\r\nimport { SdEditorUploadFileDetail, SdEditorUploadFileFuncUpload } from '../../../configurations';\r\n\r\nexport const getBatchConfig = (option: SdEditorOption): { batchSize: number; maxConcurrent: number } => {\r\n const imageConfig = option?.imageConfig;\r\n return {\r\n batchSize: Math.max(1, imageConfig?.batchSize ?? 2),\r\n maxConcurrent: Math.max(1, imageConfig?.maxConcurrentUploads ?? 2),\r\n };\r\n};\r\n\r\nexport const getActiveBlobUrls = (editor: ClassicEditor): Set<string> => {\r\n const urls = new Set<string>();\r\n const root = editor.model.document.getRoot();\r\n if (!root) return urls;\r\n for (const item of editor.model.createRangeIn(root).getItems()) {\r\n if (item.is('element', 'imageBlock') || item.is('element', 'imageInline')) {\r\n const src = item.getAttribute('src') as string;\r\n if (src?.startsWith('blob:')) urls.add(src);\r\n }\r\n }\r\n return urls;\r\n};\r\n\r\nexport const filterActivePendingFiles = (\r\n pendingFiles: Map<string, File>,\r\n activeBlobUrls: Set<string>\r\n): Array<[string, File]> => {\r\n const toUpload: Array<[string, File]> = [];\r\n for (const [blobUrl, file] of pendingFiles) {\r\n if (activeBlobUrls.has(blobUrl)) {\r\n toUpload.push([blobUrl, file]);\r\n } else {\r\n URL.revokeObjectURL(blobUrl);\r\n pendingFiles.delete(blobUrl);\r\n }\r\n }\r\n return toUpload;\r\n};\r\n\r\nexport const runBatchUploads = async (\r\n toUpload: Array<[string, File]>,\r\n uploadFn: SdEditorUploadFileFuncUpload,\r\n batchSize: number,\r\n maxConcurrent: number\r\n): Promise<{ replacements: Map<string, SdEditorUploadFileDetail>; failedBatches: Array<[string, File][]> }> => {\r\n const batches: Array<[string, File][]> = [];\r\n for (let i = 0; i < toUpload.length; i += batchSize) {\r\n batches.push(toUpload.slice(i, i + batchSize));\r\n }\r\n\r\n const replacements = new Map<string, SdEditorUploadFileDetail>();\r\n const failedBatches: Array<[string, File][]> = [];\r\n\r\n let head = 0;\r\n const runWorker = async () => {\r\n while (head < batches.length) {\r\n const batch = batches[head++];\r\n try {\r\n const details = await uploadFn(batch.map(([, file]) => file));\r\n if (details.length !== batch.length) {\r\n throw new Error(`API returned ${details.length} results for ${batch.length} files`);\r\n }\r\n batch.forEach(([blobUrl], idx) => {\r\n replacements.set(blobUrl, details[idx]);\r\n URL.revokeObjectURL(blobUrl);\r\n });\r\n } catch {\r\n failedBatches.push(batch);\r\n }\r\n }\r\n };\r\n\r\n await Promise.all(Array.from({ length: Math.min(maxConcurrent, batches.length) }, runWorker));\r\n\r\n return { replacements, failedBatches };\r\n};\r\n\r\nexport const applyReplacementsToEditor = (editor: ClassicEditor, replacements: Map<string, SdEditorUploadFileDetail>): void => {\r\n if (replacements.size === 0) return;\r\n\r\n editor.model.change(writer => {\r\n const root = editor.model.document.getRoot()!;\r\n for (const item of editor.model.createRangeIn(root).getItems()) {\r\n if (!item.is('element', 'imageBlock') && !item.is('element', 'imageInline')) continue;\r\n const detail = replacements.get(item.getAttribute('src') as string);\r\n if (detail) writer.setAttribute('src', detail.cdn, item);\r\n }\r\n });\r\n};\r\n","const parseStyle = (style: string): Map<string, string> => {\r\n const map = new Map<string, string>();\r\n for (const decl of style.split(';')) {\r\n const colon = decl.indexOf(':');\r\n if (colon === -1) continue;\r\n const key = decl.slice(0, colon).trim();\r\n const value = decl.slice(colon + 1).trim();\r\n if (key && value) map.set(key, value);\r\n }\r\n return map;\r\n};\r\n\r\nconst serializeStyle = (map: Map<string, string>): string =>\r\n [...map.entries()].map(([k, v]) => `${k}:${v}`).join(';');\r\n\r\nexport const countTextLength = (content: string): number => {\r\n if (!content) return 0;\r\n const doc = new DOMParser().parseFromString(content, 'text/html');\r\n doc.querySelectorAll('img, figure').forEach(el => el.remove());\r\n return doc.body.textContent?.length ?? 0;\r\n};\r\n\r\nexport const imageClassesToInlineStyles = (html: string): string => {\r\n if (!html) return html;\r\n\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n doc.querySelectorAll('figure.image').forEach(figure => {\r\n const styleMap = parseStyle(figure.getAttribute('style') || '');\r\n const classList = figure.classList;\r\n const hasResizeWidth = styleMap.has('width') && /\\d/.test(styleMap.get('width')!);\r\n\r\n styleMap.set('display', 'block');\r\n styleMap.set('max-width', '100%');\r\n\r\n if (classList.contains('image-style-align-left')) {\r\n if (hasResizeWidth && styleMap.get('width') === '100%') {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 auto 0 0');\r\n } else {\r\n styleMap.set('float', 'left');\r\n styleMap.set('margin', '0 1em 0 0');\r\n }\r\n } else if (classList.contains('image-style-align-right')) {\r\n if (hasResizeWidth && styleMap.get('width') === '100%') {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 0 0 auto');\r\n } else {\r\n styleMap.set('float', 'right');\r\n styleMap.set('margin', '0 0 0 1em');\r\n }\r\n } else if (classList.contains('image-style-block-align-left')) {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 auto 0 0');\r\n } else if (classList.contains('image-style-block-align-right')) {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 0 0 auto');\r\n } else {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 auto');\r\n }\r\n\r\n if (!hasResizeWidth) styleMap.set('width', 'fit-content');\r\n figure.setAttribute('style', serializeStyle(styleMap));\r\n\r\n if (hasResizeWidth) {\r\n const img = figure.querySelector('img');\r\n if (img) {\r\n const imgStyle = parseStyle(img.getAttribute('style') || '');\r\n imgStyle.set('width', '100%');\r\n imgStyle.set('height', 'auto');\r\n img.setAttribute('style', serializeStyle(imgStyle));\r\n }\r\n }\r\n });\r\n\r\n return doc.body.innerHTML;\r\n};\r\n","import { SdEditorImageConfig, SdEditorImageUploadValidation } from '../../models';\r\nimport { SdEditorUploadFileDetail, SdEditorUploadFileFuncUpload } from '../../configurations';\r\nimport { FileRepository, Image, ImageResize, ImageStyle, ImageToolbar, ImageUpload, Plugin, FileLoader } from 'ckeditor5';\r\nimport { validateAndGetFile } from './utils';\r\n\r\ntype GetOptionFn =\r\n | (() => {\r\n imageConfig?: SdEditorImageConfig;\r\n uploadFn?: SdEditorUploadFileFuncUpload;\r\n onWarning?: (message: string) => void;\r\n })\r\n | undefined;\r\n\r\ninterface ImageMeta {\r\n name?: string;\r\n fileName?: string;\r\n idOrKey?: string;\r\n lazyLoad: boolean;\r\n}\r\n\r\nclass UploadQueue {\r\n #queue: Array<() => void> = [];\r\n #running = 0;\r\n readonly maxConcurrent: number;\r\n\r\n constructor(maxConcurrent: number) {\r\n this.maxConcurrent = maxConcurrent;\r\n }\r\n\r\n async run<T>(task: () => Promise<T>): Promise<T> {\r\n if (this.#running >= this.maxConcurrent) {\r\n await new Promise<void>(resolve => {\r\n this.#queue.push(resolve);\r\n });\r\n }\r\n this.#running++;\r\n try {\r\n return await task();\r\n } finally {\r\n this.#running--;\r\n this.#queue.shift()?.();\r\n }\r\n }\r\n}\r\n\r\nclass BatchUploadScheduler {\r\n #pending: Array<{ file: File; resolve: (d: SdEditorUploadFileDetail) => void; reject: (e: unknown) => void }> = [];\r\n #timer: ReturnType<typeof setTimeout> | null = null;\r\n readonly #batchSize: number;\r\n readonly #uploadFn: SdEditorUploadFileFuncUpload;\r\n readonly #queue: UploadQueue;\r\n\r\n constructor(batchSize: number, uploadFn: SdEditorUploadFileFuncUpload, queue: UploadQueue) {\r\n this.#batchSize = batchSize;\r\n this.#uploadFn = uploadFn;\r\n this.#queue = queue;\r\n }\r\n\r\n enqueue(file: File): Promise<SdEditorUploadFileDetail> {\r\n return new Promise((resolve, reject) => {\r\n this.#pending.push({ file, resolve, reject });\r\n if (this.#timer) {\r\n clearTimeout(this.#timer);\r\n }\r\n if (this.#pending.length >= this.#batchSize) {\r\n this.#timer = null;\r\n this.#flush();\r\n } else {\r\n this.#timer = setTimeout(() => this.#flush(), 50);\r\n }\r\n });\r\n }\r\n\r\n destroy() {\r\n if (this.#timer !== null) {\r\n clearTimeout(this.#timer);\r\n this.#timer = null;\r\n }\r\n this.#pending.splice(0).forEach(p => p.reject(new Error('Upload cancelled')));\r\n }\r\n\r\n #flush() {\r\n this.#timer = null;\r\n const all = this.#pending.splice(0);\r\n if (all.length === 0) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < all.length; i += this.#batchSize) {\r\n const batch = all.slice(i, i + this.#batchSize);\r\n this.#queue\r\n .run(() => this.#uploadFn(batch.map(p => p.file)))\r\n .then(details => {\r\n batch.forEach((p, idx) => {\r\n if (details && details[idx]) {\r\n p.resolve(details[idx]);\r\n } else {\r\n p.reject(new Error('Upload failed: Missing details from server'));\r\n }\r\n });\r\n })\r\n .catch(err => {\r\n batch.forEach(p => p.reject(err));\r\n });\r\n }\r\n }\r\n}\r\n\r\nclass DeferredImageUploadAdapter {\r\n #loader: FileLoader;\r\n #pendingFiles: Map<string, File>;\r\n #imageMetaMap: Map<string, ImageMeta>;\r\n #validation: SdEditorImageUploadValidation | undefined;\r\n #onWarning: ((message: string) => void) | undefined;\r\n #lazyLoad: boolean;\r\n #currentBlobUrl: string | null = null;\r\n\r\n constructor(\r\n loader: FileLoader,\r\n pendingFiles: Map<string, File>,\r\n imageMetaMap: Map<string, ImageMeta>,\r\n options: {\r\n validation?: SdEditorImageUploadValidation;\r\n onWarning?: (message: string) => void;\r\n lazyLoad: boolean;\r\n }\r\n ) {\r\n this.#loader = loader;\r\n this.#pendingFiles = pendingFiles;\r\n this.#imageMetaMap = imageMetaMap;\r\n this.#validation = options.validation;\r\n this.#onWarning = options.onWarning;\r\n this.#lazyLoad = options.lazyLoad;\r\n }\r\n\r\n upload = async (): Promise<{ default: string }> => {\r\n const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning);\r\n if (!file) throw new Error('Image validation failed');\r\n this.#currentBlobUrl = URL.createObjectURL(file);\r\n this.#pendingFiles.set(this.#currentBlobUrl, file);\r\n this.#imageMetaMap.set(this.#currentBlobUrl, { fileName: file.name, lazyLoad: this.#lazyLoad });\r\n return { default: this.#currentBlobUrl };\r\n };\r\n\r\n abort() {\r\n if (this.#currentBlobUrl) {\r\n URL.revokeObjectURL(this.#currentBlobUrl);\r\n this.#pendingFiles.delete(this.#currentBlobUrl);\r\n this.#imageMetaMap.delete(this.#currentBlobUrl);\r\n }\r\n }\r\n}\r\n\r\nclass ImmediateImageUploadAdapter {\r\n #loader: FileLoader;\r\n #validation: SdEditorImageUploadValidation | undefined;\r\n #onWarning: ((message: string) => void) | undefined;\r\n #scheduler: BatchUploadScheduler;\r\n #imageMetaMap: Map<string, ImageMeta>;\r\n #lazyLoad: boolean;\r\n\r\n constructor(\r\n loader: FileLoader,\r\n scheduler: BatchUploadScheduler,\r\n imageMetaMap: Map<string, ImageMeta>,\r\n options: {\r\n validation?: SdEditorImageUploadValidation;\r\n onWarning?: (message: string) => void;\r\n lazyLoad: boolean;\r\n }\r\n ) {\r\n this.#loader = loader;\r\n this.#scheduler = scheduler;\r\n this.#imageMetaMap = imageMetaMap;\r\n this.#validation = options.validation;\r\n this.#onWarning = options.onWarning;\r\n this.#lazyLoad = options.lazyLoad;\r\n }\r\n\r\n upload = async (): Promise<{ default: string }> => {\r\n const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning);\r\n if (!file) throw new Error('Image validation failed');\r\n const detail = await this.#scheduler.enqueue(file);\r\n this.#imageMetaMap.set(detail.cdn, {\r\n name: detail.name,\r\n fileName: file.name,\r\n idOrKey: detail.idOrKey,\r\n lazyLoad: this.#lazyLoad,\r\n });\r\n return { default: detail.cdn };\r\n };\r\n\r\n abort() {}\r\n}\r\n\r\nexport class EditorImageUploadPlugin extends Plugin {\r\n pendingFiles = new Map<string, File>();\r\n uploadQueue!: UploadQueue;\r\n #batchScheduler: BatchUploadScheduler | undefined;\r\n #imageMetaMap = new Map<string, ImageMeta>();\r\n\r\n setMeta(cdnUrl: string, meta: { name?: string; idOrKey?: string; lazyLoad: boolean }): void {\r\n this.#imageMetaMap.set(cdnUrl, { name: meta.name, idOrKey: meta.idOrKey, lazyLoad: meta.lazyLoad });\r\n }\r\n\r\n static get pluginName() {\r\n return 'EditorImageUploadPlugin' as const;\r\n }\r\n\r\n static get requires() {\r\n return [FileRepository, Image, ImageResize, ImageUpload, ImageStyle, ImageToolbar] as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n const getOption = editor.config.get('getOption') as GetOptionFn;\r\n const maxConcurrent = getOption?.()?.imageConfig?.maxConcurrentUploads ?? 2;\r\n this.uploadQueue = new UploadQueue(maxConcurrent);\r\n\r\n this.#registerSchemaAndConverters();\r\n this.#listenForSrcChanges();\r\n\r\n editor.editing.view.document.on(\r\n 'clipboardInput',\r\n (evt: any, data: any) => {\r\n const dataTransfer = data.dataTransfer;\r\n if (!dataTransfer) return;\r\n const hasImageFiles = Array.from<File>(dataTransfer.files ?? []).some(f => f.type.startsWith('image/'));\r\n const hasImageInHtml = /<img[\\s>]/i.test(dataTransfer.getData('text/html') ?? '');\r\n if (hasImageFiles || hasImageInHtml) {\r\n evt.stop();\r\n }\r\n },\r\n { priority: 'highest' }\r\n );\r\n\r\n const uploadImageCommand = editor.commands.get('uploadImage');\r\n if (uploadImageCommand) {\r\n uploadImageCommand.on(\r\n 'execute',\r\n (evt: any, args: any[]) => {\r\n const options = args[0] || {};\r\n const option = getOption?.();\r\n const maxPerSelection = option?.imageConfig?.maxImagesPerSelection;\r\n\r\n if (maxPerSelection !== undefined) {\r\n const files: File[] = Array.isArray(options?.file) ? options.file : options?.file ? [options.file] : [];\r\n if (files.length > maxPerSelection) {\r\n option?.onWarning?.(`Chỉ được phép chọn tối đa ${maxPerSelection} ảnh mỗi lần`);\r\n evt.stop();\r\n }\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n }\r\n\r\n editor.once('ready', () => {\r\n const notification = (editor.plugins as any).get('Notification');\r\n notification?.on(\r\n 'show:warning',\r\n (evt: any) => {\r\n evt.stop();\r\n },\r\n { priority: 'highest' }\r\n );\r\n });\r\n\r\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: FileLoader) => {\r\n const option = getOption?.();\r\n const imageConfig = option?.imageConfig;\r\n const uploadMode = imageConfig?.uploadMode ?? 'deferred';\r\n const validation = imageConfig?.validation;\r\n const onWarning = option?.onWarning;\r\n const lazyLoad = imageConfig?.lazyLoad ?? true;\r\n\r\n if (uploadMode === 'deferred') {\r\n return new DeferredImageUploadAdapter(loader, this.pendingFiles, this.#imageMetaMap, { validation, onWarning, lazyLoad });\r\n }\r\n\r\n if (!this.#batchScheduler) {\r\n const uploadFn = option?.uploadFn;\r\n if (uploadFn) {\r\n const batchSize = imageConfig?.batchSize ?? 2;\r\n this.#batchScheduler = new BatchUploadScheduler(batchSize, uploadFn, this.uploadQueue);\r\n }\r\n }\r\n\r\n if (!this.#batchScheduler) {\r\n throw new Error('No upload function configured');\r\n }\r\n return new ImmediateImageUploadAdapter(loader, this.#batchScheduler, this.#imageMetaMap, { validation, onWarning, lazyLoad });\r\n };\r\n }\r\n\r\n override destroy() {\r\n super.destroy();\r\n this.#batchScheduler?.destroy();\r\n for (const blobUrl of this.pendingFiles.keys()) {\r\n URL.revokeObjectURL(blobUrl);\r\n }\r\n this.pendingFiles.clear();\r\n this.#imageMetaMap.clear();\r\n }\r\n\r\n #registerSchemaAndConverters() {\r\n const editor = this.editor;\r\n const schema = editor.model.schema;\r\n\r\n for (const type of ['imageBlock', 'imageInline'] as const) {\r\n if (schema.isRegistered(type)) {\r\n schema.extend(type, { allowAttributes: ['loading', 'imageId'] });\r\n }\r\n }\r\n\r\n // Downcast: model → HTML view\r\n editor.conversion.for('downcast').add((dispatcher: any) => {\r\n for (const [modelAttr, htmlAttr] of [\r\n ['loading', 'loading'],\r\n ['imageId', 'id'],\r\n ] as const) {\r\n const handleAttribute = (isBlock: boolean) => (evt: any, data: any, conversionApi: any) => {\r\n if (!conversionApi.consumable.consume(data.item, evt.name)) return;\r\n\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n const viewImg = isBlock ? this.#findImg(viewElement) : viewElement;\r\n\r\n if (!viewImg) return;\r\n\r\n if (data.attributeNewValue != null) {\r\n conversionApi.writer.setAttribute(htmlAttr, String(data.attributeNewValue), viewImg);\r\n } else {\r\n conversionApi.writer.removeAttribute(htmlAttr, viewImg);\r\n }\r\n };\r\n\r\n dispatcher.on(`attribute:${modelAttr}:imageBlock`, handleAttribute(true));\r\n dispatcher.on(`attribute:${modelAttr}:imageInline`, handleAttribute(false));\r\n }\r\n });\r\n\r\n // Upcast: HTML → model\r\n editor.conversion.for('upcast').add((dispatcher: any) => {\r\n dispatcher.on(\r\n 'element:figure',\r\n (_evt: any, data: any, conversionApi: any) => {\r\n if (!data.viewItem.hasClass('image')) return;\r\n const modelElement = data.modelRange?.start?.nodeAfter;\r\n if (!modelElement) return;\r\n const viewImg = this.#findImg(data.viewItem);\r\n if (!viewImg) return;\r\n this.#transferHtmlAttrsToModel(viewImg, modelElement, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n dispatcher.on(\r\n 'element:img',\r\n (_evt: any, data: any, conversionApi: any) => {\r\n const modelElement = data.modelRange?.start?.nodeAfter;\r\n if (!modelElement) return;\r\n this.#transferHtmlAttrsToModel(data.viewItem, modelElement, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n });\r\n }\r\n\r\n #listenForSrcChanges() {\r\n const editor = this.editor;\r\n\r\n editor.model.document.on('change', () => {\r\n const changes = editor.model.document.differ.getChanges();\r\n const updates: Array<{ element: any; meta: ImageMeta }> = [];\r\n\r\n for (const change of changes) {\r\n if (change.type !== 'attribute' || change.attributeKey !== 'src') continue;\r\n const newSrc = (change as any).attributeNewValue as string;\r\n const meta = this.#imageMetaMap.get(newSrc);\r\n if (!meta) continue;\r\n\r\n const node = (change as any).range?.start?.nodeAfter;\r\n if (node?.is('element')) {\r\n updates.push({ element: node, meta });\r\n this.#imageMetaMap.delete(newSrc);\r\n }\r\n }\r\n\r\n if (updates.length === 0) return;\r\n\r\n editor.model.enqueueChange('transparent' as any, (writer: any) => {\r\n for (const { element, meta } of updates) {\r\n if (meta.name || meta.fileName) {\r\n writer.setAttribute('alt', meta.name || this.#generateAlt(meta.fileName), element);\r\n }\r\n\r\n if (meta.lazyLoad) {\r\n writer.setAttribute('loading', 'lazy', element);\r\n }\r\n\r\n if (meta.idOrKey) {\r\n writer.setAttribute('imageId', meta.idOrKey, element);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n #findImg(viewElement: any): any {\r\n if (!viewElement) return null;\r\n if (viewElement.is?.('element', 'img')) return viewElement;\r\n for (const child of viewElement.getChildren?.() ?? []) {\r\n if ((child as any).is?.('element', 'img')) return child;\r\n }\r\n return null;\r\n }\r\n\r\n #transferHtmlAttrsToModel(viewImg: any, modelElement: any, conversionApi: any) {\r\n const schema = this.editor.model.schema;\r\n if (viewImg.hasAttribute('loading') && schema.checkAttribute(modelElement, 'loading')) {\r\n conversionApi.writer.setAttribute('loading', viewImg.getAttribute('loading'), modelElement);\r\n }\r\n if (viewImg.hasAttribute('id') && schema.checkAttribute(modelElement, 'imageId')) {\r\n conversionApi.writer.setAttribute('imageId', viewImg.getAttribute('id'), modelElement);\r\n }\r\n }\r\n\r\n #generateAlt(fileName?: string): string {\r\n if (!fileName) return 'Image';\r\n const nameWithoutExt = fileName.replace(/\\.[^.]+$/, '');\r\n const result = nameWithoutExt\r\n .replace(/[_\\-\\.]+/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n return result || 'Image';\r\n }\r\n}\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { AsyncValidatorFn, FormGroup, NgForm, ValidatorFn } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\nimport {\r\n Alignment,\r\n Bold,\r\n ClassicEditor,\r\n Essentials,\r\n FontColor,\r\n FontSize,\r\n Italic,\r\n List,\r\n Paragraph,\r\n Underline,\r\n Undo,\r\n Widget,\r\n} from 'ckeditor5';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\nimport * as uuid from 'uuid';\r\nimport { ISdEditorConfiguration, SD_EDITOR_CONFIGURATION, SdEditorUploadFileFuncUpload } from './configurations';\r\nimport { SdNotifyService } from '@sd-angular/core/services';\r\nimport { EditorImageUploadPlugin } from './plugins/image-upload/image-upload.plugin';\r\nimport { EditorOption, SdEditorOption } from './models';\r\nimport { HandleSdCustomValidator, SdCustomValidator, SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport {\r\n applyReplacementsToEditor,\r\n countTextLength,\r\n filterActivePendingFiles,\r\n getActiveBlobUrls,\r\n getBatchConfig,\r\n imageClassesToInlineStyles,\r\n runBatchUploads,\r\n} from './plugins/image-upload/utils';\r\n\r\n@Component({\r\n selector: 'sd-editor',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CKEditorModule, SdLabel, MatFormFieldModule, MatIconModule, MatTooltipModule],\r\n templateUrl: './editor.component.html',\r\n styleUrls: ['./editor.component.scss', './plugins/image-upload/image-upload.plugin.scss'],\r\n})\r\nexport class SdEditor {\r\n // Injected\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #cdRef = inject(ChangeDetectorRef);\r\n readonly #uploadConfig = inject<ISdEditorConfiguration | ISdEditorConfiguration[]>(SD_EDITOR_CONFIGURATION, { optional: true });\r\n readonly #notifyService = inject(SdNotifyService);\r\n\r\n // Input\r\n readonly option = input<SdEditorOption>({});\r\n readonly height = input<string>('250px');\r\n readonly maxHeight = input<string>('250px');\r\n readonly maxlength = input<number | undefined>(undefined);\r\n readonly label = input<string | undefined>();\r\n readonly helperText = input<string | undefined>();\r\n readonly required = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n readonly hideInlineError = input(false, { transform: booleanAttribute });\r\n readonly inlineError = input<string | undefined>();\r\n readonly placeholder = input<string | undefined>();\r\n readonly validator = input<SdCustomValidator | undefined>();\r\n readonly form = input<FormGroup | undefined, any>(undefined, {\r\n transform: (val: any): FormGroup | undefined => {\r\n if (!val) return undefined;\r\n if (val instanceof NgForm) return val.form;\r\n if (val instanceof FormGroup) return val;\r\n if (val?.form instanceof FormGroup) return val.form;\r\n return undefined;\r\n },\r\n });\r\n readonly key = input<string | undefined>(undefined);\r\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n readonly autoId = computed(() => (this.autoIdInput() ? `forms-editor-${this.autoIdInput()}` : undefined));\r\n readonly name = input<string>(uuid.v4());\r\n readonly valueModel = model<string>('', { alias: 'model' });\r\n\r\n // Output\r\n readonly sdChange = output<string>();\r\n readonly sdBlur = output<FocusEvent>();\r\n readonly sdFocus = output<FocusEvent>();\r\n\r\n // State\r\n readonly _textLength = signal(0);\r\n readonly formControl = new SdFormControl();\r\n readonly isOverLimit = computed(() => {\r\n const max = this.maxlength();\r\n return max !== undefined && this._textLength() > max;\r\n });\r\n\r\n get errorMessage(): string | undefined {\r\n const errors = this.formControl.errors;\r\n if (!errors) return undefined;\r\n if (errors['required']) return 'Vui lòng nhập nội dung';\r\n if (errors['maxlength']) return `Số ký tự tối đa: ${this.maxlength()}`;\r\n if (errors['customValidator']) return errors['customValidator'] as string;\r\n if (errors['inlineError']) return this.inlineError();\r\n return undefined;\r\n }\r\n\r\n readonly Editor = ClassicEditor;\r\n #editor: ClassicEditor | undefined;\r\n readonly #contentChangeSubject = new Subject<string>();\r\n\r\n readonly editorConfig = computed<EditorOption>(() => {\r\n const opt = this.option();\r\n const uploadFn = this.#buildUploadFn();\r\n const enableImageUpload = !!uploadFn;\r\n\r\n const plugins: any[] = [Essentials, FontColor, FontSize, Paragraph, Bold, Italic, Underline, List, Undo, Widget, Alignment];\r\n if (enableImageUpload) plugins.push(EditorImageUploadPlugin);\r\n\r\n const toolbarItems = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n '|',\r\n 'alignment:left',\r\n 'alignment:center',\r\n 'alignment:right',\r\n 'alignment:justify',\r\n '|',\r\n 'bulletedList',\r\n 'numberedList',\r\n ];\r\n if (enableImageUpload) toolbarItems.push('|', 'uploadImage');\r\n\r\n const config: EditorOption = {\r\n licenseKey: 'GPL',\r\n getOption: () => ({\r\n ...opt,\r\n uploadFn,\r\n onWarning: (msg: string) => this.#notifyService.warning(msg),\r\n }),\r\n plugins,\r\n toolbar: { items: toolbarItems, shouldNotGroupWhenFull: true },\r\n placeholder: this.placeholder(),\r\n fontColor: { columns: 5, documentColors: 10, colorPicker: { format: 'hex' } },\r\n fontSize: { options: [10, 11, 12, 14, 16, 18, 20], supportAllValues: true },\r\n };\r\n\r\n if (enableImageUpload) {\r\n config.image = {\r\n resizeUnit: '%',\r\n resizeOptions: [\r\n { name: 'resizeImage:100', value: '100', label: '100%' },\r\n { name: 'resizeImage:75', value: '75', label: '75%' },\r\n { name: 'resizeImage:50', value: '50', label: '50%' },\r\n { name: 'resizeImage:25', value: '25', label: '25%' },\r\n { name: 'resizeImage:original', value: null, label: 'Original' },\r\n ],\r\n toolbar: ['resizeImage', '|', 'imageStyle:alignBlockLeft', 'imageStyle:alignCenter', 'imageStyle:alignBlockRight'],\r\n };\r\n }\r\n\r\n return config;\r\n });\r\n\r\n constructor() {\r\n this.#validateDuplicateConfigKeys();\r\n this.#setupEffects();\r\n this.#setupSubscriptions();\r\n this.#setupDestroy();\r\n }\r\n\r\n // Public API\r\n onReady = (editor: ClassicEditor) => {\r\n this.#editor = editor;\r\n\r\n const currentValue = this.valueModel();\r\n if (currentValue) this.#setContent(currentValue);\r\n if (this.formControl.disabled) editor.enableReadOnlyMode('sd-editor');\r\n if (this.readonly()) editor.enableReadOnlyMode('sd-editor-readonly');\r\n\r\n editor.model.document.registerPostFixer(writer => {\r\n let changed = false;\r\n for (const change of editor.model.document.differ.getChanges()) {\r\n if (change.type === 'insert' && (change.name === 'imageBlock' || change.name === 'imageInline')) {\r\n const element = (change as any).position.nodeAfter;\r\n if (element && !element.hasAttribute('resizedWidth')) {\r\n writer.setAttribute('resizedWidth', '100%', element);\r\n changed = true;\r\n }\r\n }\r\n }\r\n return changed;\r\n });\r\n\r\n editor.model.document.on('change:data', () => this.#contentChangeSubject.next(editor.getData()));\r\n editor.editing.view.document.on('focus', evt => this.sdFocus.emit((evt as any).domEvent as FocusEvent));\r\n editor.editing.view.document.on('blur', evt => {\r\n this.sdBlur.emit((evt as any).domEvent as FocusEvent);\r\n this.formControl.markAsTouched();\r\n this.#cdRef.markForCheck();\r\n });\r\n };\r\n\r\n focusEditor = () => this.#editor?.editing?.view?.focus?.();\r\n\r\n #uploadImages = async (): Promise<void> => {\r\n const uploadMode = this.option()?.imageConfig?.uploadMode;\r\n if (uploadMode !== 'deferred') return;\r\n\r\n const uploadFn = this.#buildUploadFn();\r\n if (!uploadFn) {\r\n throw new Error('No upload function configured for image upload');\r\n }\r\n\r\n const plugin = this.#editor?.plugins?.get(EditorImageUploadPlugin) as EditorImageUploadPlugin | undefined;\r\n if (!plugin || plugin.pendingFiles.size === 0) return;\r\n\r\n const { batchSize, maxConcurrent } = getBatchConfig(this.option());\r\n const activeBlobUrls = this.#editor ? getActiveBlobUrls(this.#editor) : new Set<string>();\r\n const toUpload = filterActivePendingFiles(plugin.pendingFiles, activeBlobUrls);\r\n\r\n // Capture trước await để tránh race condition: ảnh được chèn trong lúc chờ API\r\n const processedBlobUrls = new Set(toUpload.map(([blobUrl]) => blobUrl));\r\n const { replacements, failedBatches } = await runBatchUploads(toUpload, uploadFn, batchSize, maxConcurrent);\r\n\r\n if (this.#editor) {\r\n const lazyLoad = this.option()?.imageConfig?.lazyLoad ?? true;\r\n for (const detail of replacements.values()) {\r\n plugin.setMeta(detail.cdn, { name: detail.name, idOrKey: detail.idOrKey, lazyLoad });\r\n }\r\n applyReplacementsToEditor(this.#editor, replacements);\r\n }\r\n\r\n // Chỉ xóa đúng các entries đã được xử lý\r\n for (const blobUrl of processedBlobUrls) {\r\n plugin.pendingFiles.delete(blobUrl);\r\n }\r\n \r\n for (const [blobUrl, file] of failedBatches.flat()) {\r\n plugin.pendingFiles.set(blobUrl, file);\r\n }\r\n\r\n if (failedBatches.length > 0) {\r\n throw new Error(`Upload failed for ${failedBatches.flat().length} image(s)`);\r\n }\r\n };\r\n\r\n upload = async (): Promise<string> => {\r\n await this.#uploadImages();\r\n return this.#getContent();\r\n };\r\n\r\n // Setup\r\n #setupEffects = () => {\r\n effect(() => {\r\n this.disabled() ? this.formControl.disable({ emitEvent: false }) : this.formControl.enable({ emitEvent: false });\r\n });\r\n\r\n effect(() => {\r\n if (!this.#editor) return;\r\n this.readonly() ? this.#editor.enableReadOnlyMode('sd-editor-readonly') : this.#editor.disableReadOnlyMode('sd-editor-readonly');\r\n });\r\n\r\n effect(() => {\r\n const val = this.valueModel();\r\n if (this.formControl.value !== val) {\r\n this.formControl.setValue(val, { emitEvent: false });\r\n if (this.#editor) this.#setContent(val);\r\n }\r\n });\r\n\r\n effect(() => this.form()?.addControl(this.name(), this.formControl));\r\n\r\n effect(() => {\r\n this.required();\r\n this.maxlength();\r\n this.inlineError();\r\n this.validator();\r\n this.#updateValidators();\r\n });\r\n };\r\n\r\n #setupSubscriptions = () => {\r\n this.formControl.valueChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((val: string) => {\r\n const v = val ?? '';\r\n this.valueModel.set(v);\r\n this._textLength.set(countTextLength(v));\r\n if (this.#editor) {\r\n this.#setContent(v);\r\n }\r\n });\r\n\r\n this.formControl.sdChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => this.#cdRef.markForCheck());\r\n\r\n this.#contentChangeSubject.pipe(debounceTime(100), takeUntilDestroyed(this.#destroyRef)).subscribe(content => {\r\n const out = imageClassesToInlineStyles(content);\r\n this._textLength.set(countTextLength(out));\r\n\r\n if (this.formControl.value !== out) this.formControl.setValue(out, { emitEvent: false });\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n this.formControl.sdChanges.next(true);\r\n this.valueModel.set(out);\r\n this.sdChange.emit(out);\r\n });\r\n };\r\n\r\n #setupDestroy = () => {\r\n this.#destroyRef.onDestroy(() => {\r\n this.form()?.removeControl(this.name());\r\n this.#editor?.destroy?.();\r\n });\r\n };\r\n\r\n // Helpers\r\n #setContent = (content: string) => this.#editor?.setData?.(content);\r\n\r\n #getContent = (): string => (this.#editor ? imageClassesToInlineStyles(this.#editor.getData()) : '');\r\n\r\n #getConfigurations = (): ISdEditorConfiguration[] => {\r\n const config = this.#uploadConfig;\r\n if (!config) return [];\r\n return Array.isArray(config) ? config : [config];\r\n };\r\n\r\n #validateDuplicateConfigKeys(): void {\r\n const config = this.#uploadConfig;\r\n if (!config) return;\r\n const configurations = Array.isArray(config) ? config : [config];\r\n const seen = new Set<string>();\r\n for (const cfg of configurations) {\r\n const normalizedKey = cfg.key === undefined ? '__undefined__' : cfg.key;\r\n if (seen.has(normalizedKey)) {\r\n const label = cfg.key === undefined ? 'undefined' : cfg.key;\r\n throw new Error(`[sd-editor] Duplicate upload configuration key detected: ${label}`);\r\n }\r\n seen.add(normalizedKey);\r\n }\r\n }\r\n\r\n #getSelectedConfig = (): ISdEditorConfiguration | undefined => {\r\n const configurations = this.#getConfigurations();\r\n if (!configurations.length) return undefined;\r\n return configurations.find(cfg => cfg.key === this.key());\r\n };\r\n\r\n #buildUploadFn = (): SdEditorUploadFileFuncUpload | undefined =>\r\n this.option()?.imageConfig?.uploadFn ?? this.#getSelectedConfig()?.upload;\r\n\r\n #updateValidators = () => {\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n\r\n if (this.required()) {\r\n validators.push(() => (this._textLength() ? null : { required: true }));\r\n }\r\n\r\n const max = this.maxlength();\r\n if (max !== undefined) {\r\n validators.push(() => (this._textLength() > max ? { maxlength: { requiredLength: max, actualLength: this._textLength() } } : null));\r\n }\r\n\r\n const inl = this.inlineError();\r\n if (inl) {\r\n validators.push(() => ({ inlineError: true }));\r\n }\r\n\r\n const val = this.validator();\r\n if (val) {\r\n asyncValidators.push(HandleSdCustomValidator(val));\r\n }\r\n\r\n this.formControl.setValidators(validators.length ? validators : null);\r\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n };\r\n}\r\n","@let lbl = label();\r\n@let hText = helperText();\r\n@let hideErr = hideInlineError();\r\n@let errMsg = errorMessage;\r\n@let req = required();\r\n@let maxLen = maxlength();\r\n@let showCounter = !!maxLen && !formControl.disabled && !hideErr;\r\n\r\n@if (lbl) {\r\n <sd-label [label]=\"lbl\" [required]=\"req\" [helperText]=\"hText\"></sd-label>\r\n}\r\n\r\n<div\r\n class=\"sd-editor\"\r\n [class.sd-editor--readonly]=\"readonly()\"\r\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\r\n [class.has-counter]=\"showCounter\"\r\n [style.--sd-editor-content-min-height]=\"height()\"\r\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\r\n [attr.data-autoId]=\"autoId()\">\r\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\r\n\r\n @if (showCounter) {\r\n <div class=\"sd-editor-counter-row\">\r\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ maxLen }} </span>\r\n </div>\r\n }\r\n\r\n @if (hideErr && errMsg && formControl.touched) {\r\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\">error</mat-icon>\r\n }\r\n</div>\r\n\r\n<div class=\"sd-editor-footer\">\r\n @if (!hideErr && errMsg && formControl.touched) {\r\n <mat-error>{{ errMsg }}</mat-error>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-editor.mjs","sources":["../../../projects/sd-angular/components/editor/src/configurations/editor.configuration.ts","../../../projects/sd-angular/components/editor/src/plugins/image-upload/utils/validate.utils.ts","../../../projects/sd-angular/components/editor/src/plugins/image-upload/utils/batch.utils.ts","../../../projects/sd-angular/components/editor/src/plugins/image-upload/utils/style.utils.ts","../../../projects/sd-angular/components/editor/src/plugins/image-upload/image-upload.plugin.ts","../../../projects/sd-angular/components/editor/src/editor.component.ts","../../../projects/sd-angular/components/editor/src/editor.component.html","../../../projects/sd-angular/components/editor/sd-angular-core-components-editor.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\nexport interface SdEditorUploadFileDetail {\r\n idOrKey: string;\r\n cdn: string;\r\n name?: string;\r\n}\r\n\r\nexport type SdEditorUploadFileFuncUpload = (files: File[]) => Promise<SdEditorUploadFileDetail[]>;\r\n\r\nexport interface ISdEditorConfiguration {\r\n key?: string;\r\n upload: SdEditorUploadFileFuncUpload;\r\n}\r\n\r\nexport const SD_EDITOR_CONFIGURATION = new InjectionToken<ISdEditorConfiguration>(\r\n 'sd.editor.configuration'\r\n);\r\n","import { FileLoader } from 'ckeditor5';\r\nimport { SdEditorImageUploadValidation } from '../../../models';\r\n\r\n// Dựa vào file để detect định dạng thay vì chỉ check tên\r\n// Tránh user gửi file không đúng, ví dụ file docx nhưng đổi tên thành ảnh docx.jpg\r\nconst detectFormatFromBytes = async (file: File): Promise<string> => {\r\n const buffer = await file.slice(0, 12).arrayBuffer();\r\n const b = new Uint8Array(buffer);\r\n\r\n if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) return 'jpg';\r\n if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) return 'png';\r\n if (b[0] === 0x52 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x46 && b[8] === 0x57) return 'webp';\r\n if (b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x38) return 'gif';\r\n if (b[4] === 0x66 && b[5] === 0x74 && b[6] === 0x79 && b[7] === 0x70) {\r\n const brand = String.fromCharCode(b[8], b[9], b[10], b[11]);\r\n if (brand === 'avif') return 'avif';\r\n if (brand.startsWith('hei')) return 'heic';\r\n }\r\n return '';\r\n};\r\n\r\nconst getImageInfo = async (file: File): Promise<{ width: number; height: number; sizeMB: number; format: string }> => {\r\n const sizeMB = file.size / (1024 * 1024);\r\n const loadDimensions = new Promise<{ width: number; height: number }>(resolve => {\r\n const url = URL.createObjectURL(file);\r\n const img = new window.Image();\r\n img.onload = () => {\r\n URL.revokeObjectURL(url);\r\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\r\n };\r\n img.onerror = () => {\r\n URL.revokeObjectURL(url);\r\n resolve({ width: 0, height: 0 });\r\n };\r\n img.src = url;\r\n });\r\n const [format, { width, height }] = await Promise.all([detectFormatFromBytes(file), loadDimensions]);\r\n return { width, height, sizeMB, format };\r\n};\r\n\r\nconst validateImageFile = async (\r\n file: File,\r\n validation: SdEditorImageUploadValidation,\r\n onWarning?: (message: string) => void\r\n): Promise<boolean> => {\r\n const { width, height, sizeMB, format } = await getImageInfo(file);\r\n\r\n if (validation.allowedFormats !== undefined) {\r\n const normalizedFormats = validation.allowedFormats.map((f: string) => {\r\n const fmt = f.replace(/^\\./, '').toLowerCase();\r\n return fmt === 'jpeg' ? 'jpg' : fmt;\r\n });\r\n if (!normalizedFormats.includes(format)) {\r\n onWarning?.(`Định dạng file \".${format}\" không được phép. Các định dạng hợp lệ: ${normalizedFormats.join(', ')}`);\r\n return false;\r\n }\r\n }\r\n if (validation.maxSizeMB !== undefined && sizeMB > validation.maxSizeMB) {\r\n onWarning?.(`Dung lượng file ${sizeMB.toFixed(2)}MB vượt quá giới hạn ${validation.maxSizeMB}MB`);\r\n return false;\r\n }\r\n if (validation.minWidth !== undefined && width < validation.minWidth) {\r\n onWarning?.(`Chiều rộng ảnh ${width}px nhỏ hơn giới hạn tối thiểu ${validation.minWidth}px`);\r\n return false;\r\n }\r\n if (validation.minHeight !== undefined && height < validation.minHeight) {\r\n onWarning?.(`Chiều cao ảnh ${height}px nhỏ hơn giới hạn tối thiểu ${validation.minHeight}px`);\r\n return false;\r\n }\r\n if (validation.maxWidth !== undefined && width > validation.maxWidth) {\r\n onWarning?.(`Chiều rộng ảnh ${width}px vượt quá giới hạn ${validation.maxWidth}px`);\r\n return false;\r\n }\r\n if (validation.maxHeight !== undefined && height > validation.maxHeight) {\r\n onWarning?.(`Chiều cao ảnh ${height}px vượt quá giới hạn ${validation.maxHeight}px`);\r\n return false;\r\n }\r\n return true;\r\n};\r\n\r\nexport const validateAndGetFile = async (\r\n loader: FileLoader,\r\n validation?: SdEditorImageUploadValidation,\r\n onWarning?: (message: string) => void\r\n): Promise<File> => {\r\n const file = (await loader.file) as File | null;\r\n if (!file) {\r\n throw new Error('No file found');\r\n }\r\n if (validation) {\r\n const valid = await validateImageFile(file, validation, onWarning);\r\n if (!valid) {\r\n throw new Error('Image validation failed');\r\n }\r\n }\r\n return file;\r\n};\r\n","import { ClassicEditor } from 'ckeditor5';\r\nimport { SdEditorOption } from '../../../models';\r\nimport { SdEditorUploadFileDetail, SdEditorUploadFileFuncUpload } from '../../../configurations';\r\n\r\nexport const getBatchConfig = (option: SdEditorOption): { batchSize: number; maxConcurrent: number } => {\r\n const imageConfig = option?.imageConfig;\r\n return {\r\n batchSize: Math.max(1, imageConfig?.batchSize ?? 2),\r\n maxConcurrent: Math.max(1, imageConfig?.maxConcurrentUploads ?? 2),\r\n };\r\n};\r\n\r\nexport const getActiveBlobUrls = (editor: ClassicEditor): Set<string> => {\r\n const urls = new Set<string>();\r\n const root = editor.model.document.getRoot();\r\n if (!root) return urls;\r\n for (const item of editor.model.createRangeIn(root).getItems()) {\r\n if (item.is('element', 'imageBlock') || item.is('element', 'imageInline')) {\r\n const src = item.getAttribute('src') as string;\r\n if (src?.startsWith('blob:')) urls.add(src);\r\n }\r\n }\r\n return urls;\r\n};\r\n\r\nexport const filterActivePendingFiles = (\r\n pendingFiles: Map<string, File>,\r\n activeBlobUrls: Set<string>\r\n): Array<[string, File]> => {\r\n const toUpload: Array<[string, File]> = [];\r\n for (const [blobUrl, file] of pendingFiles) {\r\n if (activeBlobUrls.has(blobUrl)) {\r\n toUpload.push([blobUrl, file]);\r\n } else {\r\n URL.revokeObjectURL(blobUrl);\r\n pendingFiles.delete(blobUrl);\r\n }\r\n }\r\n return toUpload;\r\n};\r\n\r\nexport const runBatchUploads = async (\r\n toUpload: Array<[string, File]>,\r\n uploadFn: SdEditorUploadFileFuncUpload,\r\n batchSize: number,\r\n maxConcurrent: number\r\n): Promise<{ replacements: Map<string, SdEditorUploadFileDetail>; failedBatches: Array<[string, File][]> }> => {\r\n const batches: Array<[string, File][]> = [];\r\n for (let i = 0; i < toUpload.length; i += batchSize) {\r\n batches.push(toUpload.slice(i, i + batchSize));\r\n }\r\n\r\n const replacements = new Map<string, SdEditorUploadFileDetail>();\r\n const failedBatches: Array<[string, File][]> = [];\r\n\r\n let head = 0;\r\n const runWorker = async () => {\r\n while (head < batches.length) {\r\n const batch = batches[head++];\r\n try {\r\n const details = await uploadFn(batch.map(([, file]) => file));\r\n if (details.length !== batch.length) {\r\n throw new Error(`API returned ${details.length} results for ${batch.length} files`);\r\n }\r\n batch.forEach(([blobUrl], idx) => {\r\n replacements.set(blobUrl, details[idx]);\r\n URL.revokeObjectURL(blobUrl);\r\n });\r\n } catch {\r\n failedBatches.push(batch);\r\n }\r\n }\r\n };\r\n\r\n await Promise.all(Array.from({ length: Math.min(maxConcurrent, batches.length) }, runWorker));\r\n\r\n return { replacements, failedBatches };\r\n};\r\n\r\nexport const applyReplacementsToEditor = (editor: ClassicEditor, replacements: Map<string, SdEditorUploadFileDetail>): void => {\r\n if (replacements.size === 0) return;\r\n\r\n editor.model.change(writer => {\r\n const root = editor.model.document.getRoot()!;\r\n for (const item of editor.model.createRangeIn(root).getItems()) {\r\n if (!item.is('element', 'imageBlock') && !item.is('element', 'imageInline')) continue;\r\n const detail = replacements.get(item.getAttribute('src') as string);\r\n if (detail) writer.setAttribute('src', detail.cdn, item);\r\n }\r\n });\r\n};\r\n","const parseStyle = (style: string): Map<string, string> => {\r\n const map = new Map<string, string>();\r\n for (const decl of style.split(';')) {\r\n const colon = decl.indexOf(':');\r\n if (colon === -1) continue;\r\n const key = decl.slice(0, colon).trim();\r\n const value = decl.slice(colon + 1).trim();\r\n if (key && value) map.set(key, value);\r\n }\r\n return map;\r\n};\r\n\r\nconst serializeStyle = (map: Map<string, string>): string =>\r\n [...map.entries()].map(([k, v]) => `${k}:${v}`).join(';');\r\n\r\nexport const countTextLength = (content: string): number => {\r\n if (!content) return 0;\r\n const doc = new DOMParser().parseFromString(content, 'text/html');\r\n doc.querySelectorAll('img, figure').forEach(el => el.remove());\r\n return doc.body.textContent?.length ?? 0;\r\n};\r\n\r\nexport const imageClassesToInlineStyles = (html: string): string => {\r\n if (!html) return html;\r\n\r\n const doc = new DOMParser().parseFromString(html, 'text/html');\r\n doc.querySelectorAll('figure.image').forEach(figure => {\r\n const styleMap = parseStyle(figure.getAttribute('style') || '');\r\n const classList = figure.classList;\r\n const hasResizeWidth = styleMap.has('width') && /\\d/.test(styleMap.get('width')!);\r\n\r\n styleMap.set('display', 'block');\r\n styleMap.set('max-width', '100%');\r\n\r\n if (classList.contains('image-style-align-left')) {\r\n if (hasResizeWidth && styleMap.get('width') === '100%') {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 auto 0 0');\r\n } else {\r\n styleMap.set('float', 'left');\r\n styleMap.set('margin', '0 1em 0 0');\r\n }\r\n } else if (classList.contains('image-style-align-right')) {\r\n if (hasResizeWidth && styleMap.get('width') === '100%') {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 0 0 auto');\r\n } else {\r\n styleMap.set('float', 'right');\r\n styleMap.set('margin', '0 0 0 1em');\r\n }\r\n } else if (classList.contains('image-style-block-align-left')) {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 auto 0 0');\r\n } else if (classList.contains('image-style-block-align-right')) {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 0 0 auto');\r\n } else {\r\n styleMap.delete('float');\r\n styleMap.set('margin', '0 auto');\r\n }\r\n\r\n if (!hasResizeWidth) styleMap.set('width', 'fit-content');\r\n figure.setAttribute('style', serializeStyle(styleMap));\r\n\r\n if (hasResizeWidth) {\r\n const img = figure.querySelector('img');\r\n if (img) {\r\n const imgStyle = parseStyle(img.getAttribute('style') || '');\r\n imgStyle.set('width', '100%');\r\n imgStyle.set('height', 'auto');\r\n img.setAttribute('style', serializeStyle(imgStyle));\r\n }\r\n }\r\n });\r\n\r\n return doc.body.innerHTML;\r\n};\r\n","import { SdEditorImageConfig, SdEditorImageUploadValidation } from '../../models';\r\nimport { SdEditorUploadFileDetail, SdEditorUploadFileFuncUpload } from '../../configurations';\r\nimport { FileRepository, Image, ImageResize, ImageStyle, ImageToolbar, ImageUpload, Plugin, FileLoader } from 'ckeditor5';\r\nimport { validateAndGetFile } from './utils';\r\n\r\ntype GetOptionFn =\r\n | (() => {\r\n imageConfig?: SdEditorImageConfig;\r\n uploadFn?: SdEditorUploadFileFuncUpload;\r\n onWarning?: (message: string) => void;\r\n })\r\n | undefined;\r\n\r\ninterface ImageMeta {\r\n name?: string;\r\n fileName?: string;\r\n idOrKey?: string;\r\n lazyLoad: boolean;\r\n}\r\n\r\nclass UploadQueue {\r\n #queue: Array<() => void> = [];\r\n #running = 0;\r\n readonly maxConcurrent: number;\r\n\r\n constructor(maxConcurrent: number) {\r\n this.maxConcurrent = maxConcurrent;\r\n }\r\n\r\n async run<T>(task: () => Promise<T>): Promise<T> {\r\n if (this.#running >= this.maxConcurrent) {\r\n await new Promise<void>(resolve => {\r\n this.#queue.push(resolve);\r\n });\r\n }\r\n this.#running++;\r\n try {\r\n return await task();\r\n } finally {\r\n this.#running--;\r\n this.#queue.shift()?.();\r\n }\r\n }\r\n}\r\n\r\nclass BatchUploadScheduler {\r\n #pending: Array<{ file: File; resolve: (d: SdEditorUploadFileDetail) => void; reject: (e: unknown) => void }> = [];\r\n #timer: ReturnType<typeof setTimeout> | null = null;\r\n readonly #batchSize: number;\r\n readonly #uploadFn: SdEditorUploadFileFuncUpload;\r\n readonly #queue: UploadQueue;\r\n\r\n constructor(batchSize: number, uploadFn: SdEditorUploadFileFuncUpload, queue: UploadQueue) {\r\n this.#batchSize = batchSize;\r\n this.#uploadFn = uploadFn;\r\n this.#queue = queue;\r\n }\r\n\r\n enqueue(file: File): Promise<SdEditorUploadFileDetail> {\r\n return new Promise((resolve, reject) => {\r\n this.#pending.push({ file, resolve, reject });\r\n if (this.#timer) {\r\n clearTimeout(this.#timer);\r\n }\r\n if (this.#pending.length >= this.#batchSize) {\r\n this.#timer = null;\r\n this.#flush();\r\n } else {\r\n this.#timer = setTimeout(() => this.#flush(), 50);\r\n }\r\n });\r\n }\r\n\r\n destroy() {\r\n if (this.#timer !== null) {\r\n clearTimeout(this.#timer);\r\n this.#timer = null;\r\n }\r\n this.#pending.splice(0).forEach(p => p.reject(new Error('Upload cancelled')));\r\n }\r\n\r\n #flush() {\r\n this.#timer = null;\r\n const all = this.#pending.splice(0);\r\n if (all.length === 0) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < all.length; i += this.#batchSize) {\r\n const batch = all.slice(i, i + this.#batchSize);\r\n this.#queue\r\n .run(() => this.#uploadFn(batch.map(p => p.file)))\r\n .then(details => {\r\n batch.forEach((p, idx) => {\r\n if (details && details[idx]) {\r\n p.resolve(details[idx]);\r\n } else {\r\n p.reject(new Error('Upload failed: Missing details from server'));\r\n }\r\n });\r\n })\r\n .catch(err => {\r\n batch.forEach(p => p.reject(err));\r\n });\r\n }\r\n }\r\n}\r\n\r\nclass DeferredImageUploadAdapter {\r\n #loader: FileLoader;\r\n #pendingFiles: Map<string, File>;\r\n #imageMetaMap: Map<string, ImageMeta>;\r\n #validation: SdEditorImageUploadValidation | undefined;\r\n #onWarning: ((message: string) => void) | undefined;\r\n #lazyLoad: boolean;\r\n #currentBlobUrl: string | null = null;\r\n\r\n constructor(\r\n loader: FileLoader,\r\n pendingFiles: Map<string, File>,\r\n imageMetaMap: Map<string, ImageMeta>,\r\n options: {\r\n validation?: SdEditorImageUploadValidation;\r\n onWarning?: (message: string) => void;\r\n lazyLoad: boolean;\r\n }\r\n ) {\r\n this.#loader = loader;\r\n this.#pendingFiles = pendingFiles;\r\n this.#imageMetaMap = imageMetaMap;\r\n this.#validation = options.validation;\r\n this.#onWarning = options.onWarning;\r\n this.#lazyLoad = options.lazyLoad;\r\n }\r\n\r\n upload = async (): Promise<{ default: string }> => {\r\n const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning);\r\n if (!file) throw new Error('Image validation failed');\r\n this.#currentBlobUrl = URL.createObjectURL(file);\r\n this.#pendingFiles.set(this.#currentBlobUrl, file);\r\n this.#imageMetaMap.set(this.#currentBlobUrl, { fileName: file.name, lazyLoad: this.#lazyLoad });\r\n return { default: this.#currentBlobUrl };\r\n };\r\n\r\n abort() {\r\n if (this.#currentBlobUrl) {\r\n URL.revokeObjectURL(this.#currentBlobUrl);\r\n this.#pendingFiles.delete(this.#currentBlobUrl);\r\n this.#imageMetaMap.delete(this.#currentBlobUrl);\r\n }\r\n }\r\n}\r\n\r\nclass ImmediateImageUploadAdapter {\r\n #loader: FileLoader;\r\n #validation: SdEditorImageUploadValidation | undefined;\r\n #onWarning: ((message: string) => void) | undefined;\r\n #scheduler: BatchUploadScheduler;\r\n #imageMetaMap: Map<string, ImageMeta>;\r\n #lazyLoad: boolean;\r\n\r\n constructor(\r\n loader: FileLoader,\r\n scheduler: BatchUploadScheduler,\r\n imageMetaMap: Map<string, ImageMeta>,\r\n options: {\r\n validation?: SdEditorImageUploadValidation;\r\n onWarning?: (message: string) => void;\r\n lazyLoad: boolean;\r\n }\r\n ) {\r\n this.#loader = loader;\r\n this.#scheduler = scheduler;\r\n this.#imageMetaMap = imageMetaMap;\r\n this.#validation = options.validation;\r\n this.#onWarning = options.onWarning;\r\n this.#lazyLoad = options.lazyLoad;\r\n }\r\n\r\n upload = async (): Promise<{ default: string }> => {\r\n const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning);\r\n if (!file) throw new Error('Image validation failed');\r\n const detail = await this.#scheduler.enqueue(file);\r\n this.#imageMetaMap.set(detail.cdn, {\r\n name: detail.name,\r\n fileName: file.name,\r\n idOrKey: detail.idOrKey,\r\n lazyLoad: this.#lazyLoad,\r\n });\r\n return { default: detail.cdn };\r\n };\r\n\r\n abort() {}\r\n}\r\n\r\nexport class EditorImageUploadPlugin extends Plugin {\r\n pendingFiles = new Map<string, File>();\r\n uploadQueue!: UploadQueue;\r\n #batchScheduler: BatchUploadScheduler | undefined;\r\n #imageMetaMap = new Map<string, ImageMeta>();\r\n\r\n setMeta(cdnUrl: string, meta: { name?: string; idOrKey?: string; lazyLoad: boolean }): void {\r\n this.#imageMetaMap.set(cdnUrl, { name: meta.name, idOrKey: meta.idOrKey, lazyLoad: meta.lazyLoad });\r\n }\r\n\r\n static get pluginName() {\r\n return 'EditorImageUploadPlugin' as const;\r\n }\r\n\r\n static get requires() {\r\n return [FileRepository, Image, ImageResize, ImageUpload, ImageStyle, ImageToolbar] as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n const getOption = editor.config.get('getOption') as GetOptionFn;\r\n const maxConcurrent = getOption?.()?.imageConfig?.maxConcurrentUploads ?? 2;\r\n this.uploadQueue = new UploadQueue(maxConcurrent);\r\n\r\n this.#registerSchemaAndConverters();\r\n this.#listenForSrcChanges();\r\n\r\n editor.editing.view.document.on(\r\n 'clipboardInput',\r\n (evt: any, data: any) => {\r\n const dataTransfer = data.dataTransfer;\r\n if (!dataTransfer) return;\r\n const hasImageFiles = Array.from<File>(dataTransfer.files ?? []).some(f => f.type.startsWith('image/'));\r\n const hasImageInHtml = /<img[\\s>]/i.test(dataTransfer.getData('text/html') ?? '');\r\n if (hasImageFiles || hasImageInHtml) {\r\n evt.stop();\r\n }\r\n },\r\n { priority: 'highest' }\r\n );\r\n\r\n const uploadImageCommand = editor.commands.get('uploadImage');\r\n if (uploadImageCommand) {\r\n uploadImageCommand.on(\r\n 'execute',\r\n (evt: any, args: any[]) => {\r\n const options = args[0] || {};\r\n const option = getOption?.();\r\n const maxPerSelection = option?.imageConfig?.maxImagesPerSelection;\r\n\r\n if (maxPerSelection !== undefined) {\r\n const files: File[] = Array.isArray(options?.file) ? options.file : options?.file ? [options.file] : [];\r\n if (files.length > maxPerSelection) {\r\n option?.onWarning?.(`Chỉ được phép chọn tối đa ${maxPerSelection} ảnh mỗi lần`);\r\n evt.stop();\r\n }\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n }\r\n\r\n editor.once('ready', () => {\r\n const notification = (editor.plugins as any).get('Notification');\r\n notification?.on(\r\n 'show:warning',\r\n (evt: any) => {\r\n evt.stop();\r\n },\r\n { priority: 'highest' }\r\n );\r\n });\r\n\r\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: FileLoader) => {\r\n const option = getOption?.();\r\n const imageConfig = option?.imageConfig;\r\n const uploadMode = imageConfig?.uploadMode ?? 'deferred';\r\n const validation = imageConfig?.validation;\r\n const onWarning = option?.onWarning;\r\n const lazyLoad = imageConfig?.lazyLoad ?? true;\r\n\r\n if (uploadMode === 'deferred') {\r\n return new DeferredImageUploadAdapter(loader, this.pendingFiles, this.#imageMetaMap, { validation, onWarning, lazyLoad });\r\n }\r\n\r\n if (!this.#batchScheduler) {\r\n const uploadFn = option?.uploadFn;\r\n if (uploadFn) {\r\n const batchSize = imageConfig?.batchSize ?? 2;\r\n this.#batchScheduler = new BatchUploadScheduler(batchSize, uploadFn, this.uploadQueue);\r\n }\r\n }\r\n\r\n if (!this.#batchScheduler) {\r\n throw new Error('No upload function configured');\r\n }\r\n return new ImmediateImageUploadAdapter(loader, this.#batchScheduler, this.#imageMetaMap, { validation, onWarning, lazyLoad });\r\n };\r\n }\r\n\r\n override destroy() {\r\n super.destroy();\r\n this.#batchScheduler?.destroy();\r\n for (const blobUrl of this.pendingFiles.keys()) {\r\n URL.revokeObjectURL(blobUrl);\r\n }\r\n this.pendingFiles.clear();\r\n this.#imageMetaMap.clear();\r\n }\r\n\r\n #registerSchemaAndConverters() {\r\n const editor = this.editor;\r\n const schema = editor.model.schema;\r\n\r\n for (const type of ['imageBlock', 'imageInline'] as const) {\r\n if (schema.isRegistered(type)) {\r\n schema.extend(type, { allowAttributes: ['loading', 'imageId'] });\r\n }\r\n }\r\n\r\n // Downcast: model → HTML view\r\n editor.conversion.for('downcast').add((dispatcher: any) => {\r\n for (const [modelAttr, htmlAttr] of [\r\n ['loading', 'loading'],\r\n ['imageId', 'id'],\r\n ] as const) {\r\n const handleAttribute = (isBlock: boolean) => (evt: any, data: any, conversionApi: any) => {\r\n if (!conversionApi.consumable.consume(data.item, evt.name)) return;\r\n\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n const viewImg = isBlock ? this.#findImg(viewElement) : viewElement;\r\n\r\n if (!viewImg) return;\r\n\r\n if (data.attributeNewValue != null) {\r\n conversionApi.writer.setAttribute(htmlAttr, String(data.attributeNewValue), viewImg);\r\n } else {\r\n conversionApi.writer.removeAttribute(htmlAttr, viewImg);\r\n }\r\n };\r\n\r\n dispatcher.on(`attribute:${modelAttr}:imageBlock`, handleAttribute(true));\r\n dispatcher.on(`attribute:${modelAttr}:imageInline`, handleAttribute(false));\r\n }\r\n });\r\n\r\n // Upcast: HTML → model\r\n editor.conversion.for('upcast').add((dispatcher: any) => {\r\n dispatcher.on(\r\n 'element:figure',\r\n (_evt: any, data: any, conversionApi: any) => {\r\n if (!data.viewItem.hasClass('image')) return;\r\n const modelElement = data.modelRange?.start?.nodeAfter;\r\n if (!modelElement) return;\r\n const viewImg = this.#findImg(data.viewItem);\r\n if (!viewImg) return;\r\n this.#transferHtmlAttrsToModel(viewImg, modelElement, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n dispatcher.on(\r\n 'element:img',\r\n (_evt: any, data: any, conversionApi: any) => {\r\n const modelElement = data.modelRange?.start?.nodeAfter;\r\n if (!modelElement) return;\r\n this.#transferHtmlAttrsToModel(data.viewItem, modelElement, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n });\r\n }\r\n\r\n #listenForSrcChanges() {\r\n const editor = this.editor;\r\n\r\n editor.model.document.on('change', () => {\r\n const changes = editor.model.document.differ.getChanges();\r\n const updates: Array<{ element: any; meta: ImageMeta }> = [];\r\n\r\n for (const change of changes) {\r\n if (change.type !== 'attribute' || change.attributeKey !== 'src') continue;\r\n const newSrc = (change as any).attributeNewValue as string;\r\n const meta = this.#imageMetaMap.get(newSrc);\r\n if (!meta) continue;\r\n\r\n const node = (change as any).range?.start?.nodeAfter;\r\n if (node?.is('element')) {\r\n updates.push({ element: node, meta });\r\n this.#imageMetaMap.delete(newSrc);\r\n }\r\n }\r\n\r\n if (updates.length === 0) return;\r\n\r\n editor.model.enqueueChange('transparent' as any, (writer: any) => {\r\n for (const { element, meta } of updates) {\r\n if (meta.name || meta.fileName) {\r\n writer.setAttribute('alt', meta.name || this.#generateAlt(meta.fileName), element);\r\n }\r\n\r\n if (meta.lazyLoad) {\r\n writer.setAttribute('loading', 'lazy', element);\r\n }\r\n\r\n if (meta.idOrKey) {\r\n writer.setAttribute('imageId', meta.idOrKey, element);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n #findImg(viewElement: any): any {\r\n if (!viewElement) return null;\r\n if (viewElement.is?.('element', 'img')) return viewElement;\r\n for (const child of viewElement.getChildren?.() ?? []) {\r\n if ((child as any).is?.('element', 'img')) return child;\r\n }\r\n return null;\r\n }\r\n\r\n #transferHtmlAttrsToModel(viewImg: any, modelElement: any, conversionApi: any) {\r\n const schema = this.editor.model.schema;\r\n if (viewImg.hasAttribute('loading') && schema.checkAttribute(modelElement, 'loading')) {\r\n conversionApi.writer.setAttribute('loading', viewImg.getAttribute('loading'), modelElement);\r\n }\r\n if (viewImg.hasAttribute('id') && schema.checkAttribute(modelElement, 'imageId')) {\r\n conversionApi.writer.setAttribute('imageId', viewImg.getAttribute('id'), modelElement);\r\n }\r\n }\r\n\r\n #generateAlt(fileName?: string): string {\r\n if (!fileName) return 'Image';\r\n const nameWithoutExt = fileName.replace(/\\.[^.]+$/, '');\r\n const result = nameWithoutExt\r\n .replace(/[_\\-\\.]+/g, ' ')\r\n .replace(/\\s+/g, ' ')\r\n .trim();\r\n return result || 'Image';\r\n }\r\n}\r\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n computed,\r\n effect,\r\n inject,\r\n input,\r\n model,\r\n output,\r\n signal,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { AsyncValidatorFn, FormGroup, NgForm, ValidatorFn } from '@angular/forms';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\nimport {\r\n Alignment,\r\n Bold,\r\n ClassicEditor,\r\n Essentials,\r\n FontColor,\r\n FontSize,\r\n Italic,\r\n List,\r\n Paragraph,\r\n Underline,\r\n Undo,\r\n Widget,\r\n} from 'ckeditor5';\r\nimport { Subject } from 'rxjs';\r\nimport { debounceTime } from 'rxjs/operators';\r\nimport * as uuid from 'uuid';\r\nimport { ISdEditorConfiguration, SD_EDITOR_CONFIGURATION, SdEditorUploadFileFuncUpload } from './configurations';\r\nimport { SdNotifyService } from '@sd-angular/core/services';\r\nimport { EditorImageUploadPlugin } from './plugins/image-upload/image-upload.plugin';\r\nimport { EditorOption, SdEditorOption } from './models';\r\nimport { HandleSdCustomValidator, SdCustomValidator, SdFormControl } from '@sd-angular/core/forms/models';\r\nimport { SdLabel } from '@sd-angular/core/forms/label';\r\nimport {\r\n applyReplacementsToEditor,\r\n countTextLength,\r\n filterActivePendingFiles,\r\n getActiveBlobUrls,\r\n getBatchConfig,\r\n imageClassesToInlineStyles,\r\n runBatchUploads,\r\n} from './plugins/image-upload/utils';\r\n\r\n@Component({\r\n selector: 'sd-editor',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [CKEditorModule, SdLabel, MatFormFieldModule, MatIconModule, MatTooltipModule],\r\n templateUrl: './editor.component.html',\r\n styleUrls: ['./editor.component.scss', './plugins/image-upload/image-upload.plugin.scss'],\r\n})\r\nexport class SdEditor {\r\n // Injected\r\n readonly #destroyRef = inject(DestroyRef);\r\n readonly #cdRef = inject(ChangeDetectorRef);\r\n readonly #uploadConfig = inject<ISdEditorConfiguration | ISdEditorConfiguration[]>(SD_EDITOR_CONFIGURATION, { optional: true });\r\n readonly #notifyService = inject(SdNotifyService);\r\n\r\n // Input\r\n readonly option = input<SdEditorOption>({});\r\n readonly height = input<string>('250px');\r\n readonly maxHeight = input<string>('250px');\r\n readonly maxlength = input<number | undefined>(undefined);\r\n readonly label = input<string | undefined>();\r\n readonly helperText = input<string | undefined>();\r\n readonly required = input(false, { transform: booleanAttribute });\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n readonly readonly = input(false, { transform: booleanAttribute });\r\n readonly hideInlineError = input(false, { transform: booleanAttribute });\r\n readonly inlineError = input<string | undefined>();\r\n readonly placeholder = input<string | undefined>();\r\n readonly validator = input<SdCustomValidator | undefined>();\r\n readonly form = input<FormGroup | undefined, any>(undefined, {\r\n transform: (val: any): FormGroup | undefined => {\r\n if (!val) return undefined;\r\n if (val instanceof NgForm) return val.form;\r\n if (val instanceof FormGroup) return val;\r\n if (val?.form instanceof FormGroup) return val.form;\r\n return undefined;\r\n },\r\n });\r\n readonly key = input<string | undefined>(undefined);\r\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\r\n readonly autoId = computed(() => (this.autoIdInput() ? `forms-editor-${this.autoIdInput()}` : undefined));\r\n readonly name = input<string>(uuid.v4());\r\n readonly valueModel = model<string>('', { alias: 'model' });\r\n\r\n // Output\r\n readonly sdChange = output<string>();\r\n readonly sdBlur = output<FocusEvent>();\r\n readonly sdFocus = output<FocusEvent>();\r\n\r\n // State\r\n readonly _textLength = signal(0);\r\n readonly formControl = new SdFormControl();\r\n readonly isOverLimit = computed(() => {\r\n const max = this.maxlength();\r\n return max !== undefined && this._textLength() > max;\r\n });\r\n\r\n get errorMessage(): string | undefined {\r\n const errors = this.formControl.errors;\r\n if (!errors) return undefined;\r\n if (errors['required']) return 'Vui lòng nhập nội dung';\r\n if (errors['maxlength']) return `Số ký tự tối đa: ${this.maxlength()}`;\r\n if (errors['customValidator']) return errors['customValidator'] as string;\r\n if (errors['inlineError']) return this.inlineError();\r\n return undefined;\r\n }\r\n\r\n readonly Editor = ClassicEditor;\r\n #editor: ClassicEditor | undefined;\r\n readonly #contentChangeSubject = new Subject<string>();\r\n\r\n readonly editorConfig = computed<EditorOption>(() => {\r\n const opt = this.option();\r\n const uploadFn = this.#buildUploadFn();\r\n const enableImageUpload = !!uploadFn;\r\n\r\n const plugins: any[] = [Essentials, FontColor, FontSize, Paragraph, Bold, Italic, Underline, List, Undo, Widget, Alignment];\r\n if (enableImageUpload) plugins.push(EditorImageUploadPlugin);\r\n\r\n const toolbarItems = [\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n '|',\r\n 'alignment:left',\r\n 'alignment:center',\r\n 'alignment:right',\r\n 'alignment:justify',\r\n '|',\r\n 'bulletedList',\r\n 'numberedList',\r\n ];\r\n if (enableImageUpload) toolbarItems.push('|', 'uploadImage');\r\n\r\n const config: EditorOption = {\r\n licenseKey: 'GPL',\r\n getOption: () => ({\r\n ...opt,\r\n uploadFn,\r\n onWarning: (msg: string) => this.#notifyService.warning(msg),\r\n }),\r\n plugins,\r\n toolbar: { items: toolbarItems, shouldNotGroupWhenFull: true },\r\n placeholder: this.placeholder(),\r\n fontColor: { columns: 5, documentColors: 10, colorPicker: { format: 'hex' } },\r\n fontSize: { options: [10, 11, 12, 14, 16, 18, 20], supportAllValues: true },\r\n };\r\n\r\n if (enableImageUpload) {\r\n config.image = {\r\n resizeUnit: '%',\r\n resizeOptions: [\r\n { name: 'resizeImage:100', value: '100', label: '100%' },\r\n { name: 'resizeImage:75', value: '75', label: '75%' },\r\n { name: 'resizeImage:50', value: '50', label: '50%' },\r\n { name: 'resizeImage:25', value: '25', label: '25%' },\r\n { name: 'resizeImage:original', value: null, label: 'Original' },\r\n ],\r\n toolbar: ['resizeImage', '|', 'imageStyle:alignBlockLeft', 'imageStyle:alignCenter', 'imageStyle:alignBlockRight'],\r\n };\r\n }\r\n\r\n return config;\r\n });\r\n\r\n constructor() {\r\n this.#validateDuplicateConfigKeys();\r\n this.#setupEffects();\r\n this.#setupSubscriptions();\r\n this.#setupDestroy();\r\n }\r\n\r\n // Public API\r\n onReady = (editor: ClassicEditor) => {\r\n this.#editor = editor;\r\n\r\n const currentValue = this.valueModel();\r\n if (currentValue) this.#setContent(currentValue);\r\n if (this.formControl.disabled) editor.enableReadOnlyMode('sd-editor');\r\n if (this.readonly()) editor.enableReadOnlyMode('sd-editor-readonly');\r\n\r\n editor.model.document.registerPostFixer(writer => {\r\n let changed = false;\r\n for (const change of editor.model.document.differ.getChanges()) {\r\n if (change.type === 'insert' && (change.name === 'imageBlock' || change.name === 'imageInline')) {\r\n const element = (change as any).position.nodeAfter;\r\n if (element && !element.hasAttribute('resizedWidth')) {\r\n writer.setAttribute('resizedWidth', '100%', element);\r\n changed = true;\r\n }\r\n }\r\n }\r\n return changed;\r\n });\r\n\r\n editor.model.document.on('change:data', () => this.#contentChangeSubject.next(editor.getData()));\r\n editor.editing.view.document.on('focus', evt => this.sdFocus.emit((evt as any).domEvent as FocusEvent));\r\n editor.editing.view.document.on('blur', evt => {\r\n this.sdBlur.emit((evt as any).domEvent as FocusEvent);\r\n this.formControl.markAsTouched();\r\n this.#cdRef.markForCheck();\r\n });\r\n };\r\n\r\n focusEditor = () => this.#editor?.editing?.view?.focus?.();\r\n\r\n #uploadImages = async (): Promise<void> => {\r\n const uploadMode = this.option()?.imageConfig?.uploadMode ?? 'deferred';\r\n // Early return nếu không phải 'deferred' mode.\r\n // Nếu trước đó là mode \"deferred\" mà mong muốn chuyển sang mode \"immediate\", dev chưa cần refactor code phía caller mà không ảnh hưởng đến logic.\r\n if (uploadMode !== 'deferred') return;\r\n\r\n const uploadFn = this.#buildUploadFn();\r\n if (!uploadFn) {\r\n throw new Error('No upload function configured for image upload');\r\n }\r\n\r\n const plugin = this.#editor?.plugins?.get(EditorImageUploadPlugin) as EditorImageUploadPlugin | undefined;\r\n if (!plugin || plugin.pendingFiles.size === 0) return;\r\n\r\n const { batchSize, maxConcurrent } = getBatchConfig(this.option());\r\n const activeBlobUrls = this.#editor ? getActiveBlobUrls(this.#editor) : new Set<string>();\r\n const toUpload = filterActivePendingFiles(plugin.pendingFiles, activeBlobUrls);\r\n\r\n // Capture trước await để tránh race condition: ảnh được chèn trong lúc chờ API\r\n const processedBlobUrls = new Set(toUpload.map(([blobUrl]) => blobUrl));\r\n const { replacements, failedBatches } = await runBatchUploads(toUpload, uploadFn, batchSize, maxConcurrent);\r\n\r\n if (this.#editor) {\r\n const lazyLoad = this.option()?.imageConfig?.lazyLoad ?? true;\r\n for (const detail of replacements.values()) {\r\n plugin.setMeta(detail.cdn, { name: detail.name, idOrKey: detail.idOrKey, lazyLoad });\r\n }\r\n applyReplacementsToEditor(this.#editor, replacements);\r\n }\r\n\r\n // Chỉ xóa đúng các entries đã được xử lý\r\n for (const blobUrl of processedBlobUrls) {\r\n plugin.pendingFiles.delete(blobUrl);\r\n }\r\n\r\n for (const [blobUrl, file] of failedBatches.flat()) {\r\n plugin.pendingFiles.set(blobUrl, file);\r\n }\r\n\r\n if (failedBatches.length > 0) {\r\n throw new Error(`Upload failed for ${failedBatches.flat().length} image(s)`);\r\n }\r\n };\r\n\r\n upload = async (): Promise<string> => {\r\n await this.#uploadImages();\r\n return this.#getContent();\r\n };\r\n\r\n // Setup\r\n #setupEffects = () => {\r\n effect(() => {\r\n this.disabled() ? this.formControl.disable({ emitEvent: false }) : this.formControl.enable({ emitEvent: false });\r\n });\r\n\r\n effect(() => {\r\n if (!this.#editor) return;\r\n this.readonly() ? this.#editor.enableReadOnlyMode('sd-editor-readonly') : this.#editor.disableReadOnlyMode('sd-editor-readonly');\r\n });\r\n\r\n effect(() => {\r\n const val = this.valueModel();\r\n if (this.formControl.value !== val) {\r\n this.formControl.setValue(val, { emitEvent: false });\r\n if (this.#editor) this.#setContent(val);\r\n }\r\n });\r\n\r\n effect(() => this.form()?.addControl(this.name(), this.formControl));\r\n\r\n effect(() => {\r\n this.required();\r\n this.maxlength();\r\n this.inlineError();\r\n this.validator();\r\n this.#updateValidators();\r\n });\r\n };\r\n\r\n #setupSubscriptions = () => {\r\n this.formControl.valueChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((val: string) => {\r\n const v = val ?? '';\r\n this.valueModel.set(v);\r\n this._textLength.set(countTextLength(v));\r\n if (this.#editor) {\r\n this.#setContent(v);\r\n }\r\n });\r\n\r\n this.formControl.sdChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => this.#cdRef.markForCheck());\r\n\r\n this.#contentChangeSubject.pipe(debounceTime(100), takeUntilDestroyed(this.#destroyRef)).subscribe(content => {\r\n const out = imageClassesToInlineStyles(content);\r\n this._textLength.set(countTextLength(out));\r\n\r\n if (this.formControl.value !== out) this.formControl.setValue(out, { emitEvent: false });\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n this.formControl.sdChanges.next(true);\r\n this.valueModel.set(out);\r\n this.sdChange.emit(out);\r\n });\r\n };\r\n\r\n #setupDestroy = () => {\r\n this.#destroyRef.onDestroy(() => {\r\n this.form()?.removeControl(this.name());\r\n this.#editor?.destroy?.();\r\n });\r\n };\r\n\r\n // Helpers\r\n #setContent = (content: string) => this.#editor?.setData?.(content);\r\n\r\n #getContent = (): string => (this.#editor ? imageClassesToInlineStyles(this.#editor.getData()) : '');\r\n\r\n #getConfigurations = (): ISdEditorConfiguration[] => {\r\n const config = this.#uploadConfig;\r\n if (!config) return [];\r\n return Array.isArray(config) ? config : [config];\r\n };\r\n\r\n #validateDuplicateConfigKeys(): void {\r\n const config = this.#uploadConfig;\r\n if (!config) return;\r\n const configurations = Array.isArray(config) ? config : [config];\r\n const seen = new Set<string>();\r\n for (const cfg of configurations) {\r\n const normalizedKey = cfg.key === undefined ? '__undefined__' : cfg.key;\r\n if (seen.has(normalizedKey)) {\r\n const label = cfg.key === undefined ? 'undefined' : cfg.key;\r\n throw new Error(`[sd-editor] Duplicate upload configuration key detected: ${label}`);\r\n }\r\n seen.add(normalizedKey);\r\n }\r\n }\r\n\r\n #getSelectedConfig = (): ISdEditorConfiguration | undefined => {\r\n const configurations = this.#getConfigurations();\r\n if (!configurations.length) return undefined;\r\n return configurations.find(cfg => cfg.key === this.key());\r\n };\r\n\r\n #buildUploadFn = (): SdEditorUploadFileFuncUpload | undefined =>\r\n this.option()?.imageConfig?.uploadFn ?? this.#getSelectedConfig()?.upload;\r\n\r\n #updateValidators = () => {\r\n const validators: ValidatorFn[] = [];\r\n const asyncValidators: AsyncValidatorFn[] = [];\r\n\r\n if (this.required()) {\r\n validators.push(() => (this._textLength() ? null : { required: true }));\r\n }\r\n\r\n const max = this.maxlength();\r\n if (max !== undefined) {\r\n validators.push(() => (this._textLength() > max ? { maxlength: { requiredLength: max, actualLength: this._textLength() } } : null));\r\n }\r\n\r\n const inl = this.inlineError();\r\n if (inl) {\r\n validators.push(() => ({ inlineError: true }));\r\n }\r\n\r\n const val = this.validator();\r\n if (val) {\r\n asyncValidators.push(HandleSdCustomValidator(val));\r\n }\r\n\r\n this.formControl.setValidators(validators.length ? validators : null);\r\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\r\n this.formControl.updateValueAndValidity({ emitEvent: false });\r\n };\r\n}\r\n","@let lbl = label();\r\n@let hText = helperText();\r\n@let hideErr = hideInlineError();\r\n@let errMsg = errorMessage;\r\n@let req = required();\r\n@let maxLen = maxlength();\r\n@let showCounter = !!maxLen && !formControl.disabled && !hideErr;\r\n\r\n@if (lbl) {\r\n <sd-label [label]=\"lbl\" [required]=\"req\" [helperText]=\"hText\"></sd-label>\r\n}\r\n\r\n<div\r\n class=\"sd-editor\"\r\n [class.sd-editor--readonly]=\"readonly()\"\r\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\r\n [class.has-counter]=\"showCounter\"\r\n [style.--sd-editor-content-min-height]=\"height()\"\r\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\r\n [attr.data-autoId]=\"autoId()\">\r\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\r\n\r\n @if (showCounter) {\r\n <div class=\"sd-editor-counter-row\">\r\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ maxLen }} </span>\r\n </div>\r\n }\r\n\r\n @if (hideErr && errMsg && formControl.touched) {\r\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\">error</mat-icon>\r\n }\r\n</div>\r\n\r\n<div class=\"sd-editor-footer\">\r\n @if (!hideErr && errMsg && formControl.touched) {\r\n <mat-error>{{ errMsg }}</mat-error>\r\n }\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;MAea,uBAAuB,GAAG,IAAI,cAAc,CACvD,yBAAyB;;ACb3B;AACA;AACA,MAAM,qBAAqB,GAAG,OAAO,IAAU,KAAqB;AAClE,IAAA,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;AACpD,IAAA,MAAM,CAAC,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC;AAEhC,IAAA,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;AAAE,QAAA,OAAO,KAAK;IACjE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;AAAE,QAAA,OAAO,KAAK;AAClF,IAAA,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;AAAE,QAAA,OAAO,MAAM;IACpG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;AAAE,QAAA,OAAO,KAAK;AAClF,IAAA,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;QACpE,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,MAAM;AAAE,YAAA,OAAO,MAAM;AACnC,QAAA,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,MAAM;IAC5C;AACA,IAAA,OAAO,EAAE;AACX,CAAC;AAED,MAAM,YAAY,GAAG,OAAO,IAAU,KAAgF;IACpH,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,CAAC;AACxC,IAAA,MAAM,cAAc,GAAG,IAAI,OAAO,CAAoC,OAAO,IAAG;QAC9E,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,QAAA,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE;AAC9B,QAAA,GAAG,CAAC,MAAM,GAAG,MAAK;AAChB,YAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;AACxB,YAAA,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;AACjE,QAAA,CAAC;AACD,QAAA,GAAG,CAAC,OAAO,GAAG,MAAK;AACjB,YAAA,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC;YACxB,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAClC,QAAA,CAAC;AACD,QAAA,GAAG,CAAC,GAAG,GAAG,GAAG;AACf,IAAA,CAAC,CAAC;IACF,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,CAAC;IACpG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;AAC1C,CAAC;AAED,MAAM,iBAAiB,GAAG,OACxB,IAAU,EACV,UAAyC,EACzC,SAAqC,KACjB;AACpB,IAAA,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;AAElE,IAAA,IAAI,UAAU,CAAC,cAAc,KAAK,SAAS,EAAE;QAC3C,MAAM,iBAAiB,GAAG,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAS,KAAI;AACpE,YAAA,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE;YAC9C,OAAO,GAAG,KAAK,MAAM,GAAG,KAAK,GAAG,GAAG;AACrC,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACvC,YAAA,SAAS,GAAG,CAAA,iBAAA,EAAoB,MAAM,CAAA,yCAAA,EAA4C,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA,CAAE,CAAC;AACjH,YAAA,OAAO,KAAK;QACd;IACF;AACA,IAAA,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE;AACvE,QAAA,SAAS,GAAG,CAAA,gBAAA,EAAmB,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB,UAAU,CAAC,SAAS,CAAA,EAAA,CAAI,CAAC;AACjG,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE;QACpE,SAAS,GAAG,CAAA,eAAA,EAAkB,KAAK,CAAA,8BAAA,EAAiC,UAAU,CAAC,QAAQ,CAAA,EAAA,CAAI,CAAC;AAC5F,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE;QACvE,SAAS,GAAG,CAAA,cAAA,EAAiB,MAAM,CAAA,8BAAA,EAAiC,UAAU,CAAC,SAAS,CAAA,EAAA,CAAI,CAAC;AAC7F,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE;QACpE,SAAS,GAAG,CAAA,eAAA,EAAkB,KAAK,CAAA,qBAAA,EAAwB,UAAU,CAAC,QAAQ,CAAA,EAAA,CAAI,CAAC;AACnF,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,UAAU,CAAC,SAAS,KAAK,SAAS,IAAI,MAAM,GAAG,UAAU,CAAC,SAAS,EAAE;QACvE,SAAS,GAAG,CAAA,cAAA,EAAiB,MAAM,CAAA,qBAAA,EAAwB,UAAU,CAAC,SAAS,CAAA,EAAA,CAAI,CAAC;AACpF,QAAA,OAAO,KAAK;IACd;AACA,IAAA,OAAO,IAAI;AACb,CAAC;AAEM,MAAM,kBAAkB,GAAG,OAChC,MAAkB,EAClB,UAA0C,EAC1C,SAAqC,KACpB;IACjB,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,IAAI,CAAgB;IAC/C,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC;IAClC;IACA,IAAI,UAAU,EAAE;QACd,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,CAAC;QAClE,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;QAC5C;IACF;AACA,IAAA,OAAO,IAAI;AACb,CAAC;;AC5FM,MAAM,cAAc,GAAG,CAAC,MAAsB,KAAkD;AACrG,IAAA,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW;IACvC,OAAO;AACL,QAAA,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,IAAI,CAAC,CAAC;AACnD,QAAA,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,EAAE,oBAAoB,IAAI,CAAC,CAAC;KACnE;AACH,CAAC;AAEM,MAAM,iBAAiB,GAAG,CAAC,MAAqB,KAAiB;AACtE,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE;AAC5C,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AACtB,IAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;AAC9D,QAAA,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE;YACzE,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAW;AAC9C,YAAA,IAAI,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAC7C;IACF;AACA,IAAA,OAAO,IAAI;AACb,CAAC;AAEM,MAAM,wBAAwB,GAAG,CACtC,YAA+B,EAC/B,cAA2B,KACF;IACzB,MAAM,QAAQ,GAA0B,EAAE;IAC1C,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,YAAY,EAAE;AAC1C,QAAA,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAC/B,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAChC;aAAO;AACL,YAAA,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;AAC5B,YAAA,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;QAC9B;IACF;AACA,IAAA,OAAO,QAAQ;AACjB,CAAC;AAEM,MAAM,eAAe,GAAG,OAC7B,QAA+B,EAC/B,QAAsC,EACtC,SAAiB,EACjB,aAAqB,KACuF;IAC5G,MAAM,OAAO,GAA4B,EAAE;AAC3C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE;AACnD,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;IAChD;AAEA,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoC;IAChE,MAAM,aAAa,GAA4B,EAAE;IAEjD,IAAI,IAAI,GAAG,CAAC;AACZ,IAAA,MAAM,SAAS,GAAG,YAAW;AAC3B,QAAA,OAAO,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE;AAC5B,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;AAC7B,YAAA,IAAI;gBACF,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;gBAC7D,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE;AACnC,oBAAA,MAAM,IAAI,KAAK,CAAC,CAAA,aAAA,EAAgB,OAAO,CAAC,MAAM,CAAA,aAAA,EAAgB,KAAK,CAAC,MAAM,CAAA,MAAA,CAAQ,CAAC;gBACrF;gBACA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,KAAI;oBAC/B,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AACvC,oBAAA,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;AAC9B,gBAAA,CAAC,CAAC;YACJ;AAAE,YAAA,MAAM;AACN,gBAAA,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3B;QACF;AACF,IAAA,CAAC;IAED,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;AAE7F,IAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE;AACxC,CAAC;AAEM,MAAM,yBAAyB,GAAG,CAAC,MAAqB,EAAE,YAAmD,KAAU;AAC5H,IAAA,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE;AAE7B,IAAA,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,IAAG;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAG;AAC7C,QAAA,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;AAC9D,YAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC;gBAAE;AAC7E,YAAA,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAW,CAAC;AACnE,YAAA,IAAI,MAAM;gBAAE,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC;QAC1D;AACF,IAAA,CAAC,CAAC;AACJ,CAAC;;AC1FD,MAAM,UAAU,GAAG,CAAC,KAAa,KAAyB;AACxD,IAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkB;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAC/B,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE;AAClB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE;AACvC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;QAC1C,IAAI,GAAG,IAAI,KAAK;AAAE,YAAA,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;IACvC;AACA,IAAA,OAAO,GAAG;AACZ,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,GAAwB,KAC9C,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAEpD,MAAM,eAAe,GAAG,CAAC,OAAe,KAAY;AACzD,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,CAAC;AACtB,IAAA,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,WAAW,CAAC;AACjE,IAAA,GAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC;IAC9D,OAAO,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;AAC1C,CAAC;AAEM,MAAM,0BAA0B,GAAG,CAAC,IAAY,KAAY;AACjE,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AAEtB,IAAA,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC;IAC9D,GAAG,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,MAAM,IAAG;AACpD,QAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC/D,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;QAClC,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;AAEjF,QAAA,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC;AAChC,QAAA,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC;AAEjC,QAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE;YAChD,IAAI,cAAc,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE;AACtD,gBAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;AACxB,gBAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC;YACtC;iBAAO;AACL,gBAAA,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;AAC7B,gBAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC;YACrC;QACF;AAAO,aAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE;YACxD,IAAI,cAAc,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE;AACtD,gBAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;AACxB,gBAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC;YACtC;iBAAO;AACL,gBAAA,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;AAC9B,gBAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC;YACrC;QACF;AAAO,aAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,8BAA8B,CAAC,EAAE;AAC7D,YAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;AACxB,YAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC;QACtC;AAAO,aAAA,IAAI,SAAS,CAAC,QAAQ,CAAC,+BAA+B,CAAC,EAAE;AAC9D,YAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;AACxB,YAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC;QACtC;aAAO;AACL,YAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;AACxB,YAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAClC;AAEA,QAAA,IAAI,CAAC,cAAc;AAAE,YAAA,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC;QACzD,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;QAEtD,IAAI,cAAc,EAAE;YAClB,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;YACvC,IAAI,GAAG,EAAE;AACP,gBAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AAC5D,gBAAA,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;AAC7B,gBAAA,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAC9B,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;YACrD;QACF;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS;AAC3B,CAAC;;ACxDD,MAAM,WAAW,CAAA;IACf,MAAM,GAAsB,EAAE;IAC9B,QAAQ,GAAG,CAAC;AACH,IAAA,aAAa;AAEtB,IAAA,WAAA,CAAY,aAAqB,EAAA;AAC/B,QAAA,IAAI,CAAC,aAAa,GAAG,aAAa;IACpC;IAEA,MAAM,GAAG,CAAI,IAAsB,EAAA;QACjC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,aAAa,EAAE;AACvC,YAAA,MAAM,IAAI,OAAO,CAAO,OAAO,IAAG;AAChC,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;AAC3B,YAAA,CAAC,CAAC;QACJ;QACA,IAAI,CAAC,QAAQ,EAAE;AACf,QAAA,IAAI;YACF,OAAO,MAAM,IAAI,EAAE;QACrB;gBAAU;YACR,IAAI,CAAC,QAAQ,EAAE;AACf,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI;QACzB;IACF;AACD;AAED,MAAM,oBAAoB,CAAA;IACxB,QAAQ,GAAwG,EAAE;IAClH,MAAM,GAAyC,IAAI;AAC1C,IAAA,UAAU;AACV,IAAA,SAAS;AACT,IAAA,MAAM;AAEf,IAAA,WAAA,CAAY,SAAiB,EAAE,QAAsC,EAAE,KAAkB,EAAA;AACvF,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ;AACzB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;IACrB;AAEA,IAAA,OAAO,CAAC,IAAU,EAAA;QAChB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7C,YAAA,IAAI,IAAI,CAAC,MAAM,EAAE;AACf,gBAAA,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;YAC3B;YACA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE;AAC3C,gBAAA,IAAI,CAAC,MAAM,GAAG,IAAI;gBAClB,IAAI,CAAC,MAAM,EAAE;YACf;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC;YACnD;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE;AACxB,YAAA,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;AACzB,YAAA,IAAI,CAAC,MAAM,GAAG,IAAI;QACpB;QACA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC/E;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;QAClB,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACnC,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;YACpB;QACF;AAEA,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE;AACpD,YAAA,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;AAC/C,YAAA,IAAI,CAAC;iBACF,GAAG,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;iBAChD,IAAI,CAAC,OAAO,IAAG;gBACd,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,KAAI;AACvB,oBAAA,IAAI,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;wBAC3B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBACzB;yBAAO;wBACL,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;oBACnE;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC;iBACA,KAAK,CAAC,GAAG,IAAG;AACX,gBAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACnC,YAAA,CAAC,CAAC;QACN;IACF;AACD;AAED,MAAM,0BAA0B,CAAA;AAC9B,IAAA,OAAO;AACP,IAAA,aAAa;AACb,IAAA,aAAa;AACb,IAAA,WAAW;AACX,IAAA,UAAU;AACV,IAAA,SAAS;IACT,eAAe,GAAkB,IAAI;AAErC,IAAA,WAAA,CACE,MAAkB,EAClB,YAA+B,EAC/B,YAAoC,EACpC,OAIC,EAAA;AAED,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AACrB,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY;AACjC,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY;AACjC,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU;AACrC,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS;AACnC,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ;IACnC;IAEA,MAAM,GAAG,YAAyC;AAChD,QAAA,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;AACtF,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;QACrD,IAAI,CAAC,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;QAChD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC;QAClD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAC/F,QAAA,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE;AAC1C,IAAA,CAAC;IAED,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,YAAA,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC;YACzC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;YAC/C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;QACjD;IACF;AACD;AAED,MAAM,2BAA2B,CAAA;AAC/B,IAAA,OAAO;AACP,IAAA,WAAW;AACX,IAAA,UAAU;AACV,IAAA,UAAU;AACV,IAAA,aAAa;AACb,IAAA,SAAS;AAET,IAAA,WAAA,CACE,MAAkB,EAClB,SAA+B,EAC/B,YAAoC,EACpC,OAIC,EAAA;AAED,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AACrB,QAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,YAAY;AACjC,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,UAAU;AACrC,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS;AACnC,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ;IACnC;IAEA,MAAM,GAAG,YAAyC;AAChD,QAAA,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC;AACtF,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;QAClD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE;YACjC,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,SAAS;AACzB,SAAA,CAAC;AACF,QAAA,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE;AAChC,IAAA,CAAC;AAED,IAAA,KAAK,KAAI;AACV;AAEK,MAAO,uBAAwB,SAAQ,MAAM,CAAA;AACjD,IAAA,YAAY,GAAG,IAAI,GAAG,EAAgB;AACtC,IAAA,WAAW;AACX,IAAA,eAAe;AACf,IAAA,aAAa,GAAG,IAAI,GAAG,EAAqB;IAE5C,OAAO,CAAC,MAAc,EAAE,IAA4D,EAAA;QAClF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;IACrG;AAEA,IAAA,WAAW,UAAU,GAAA;AACnB,QAAA,OAAO,yBAAkC;IAC3C;AAEA,IAAA,WAAW,QAAQ,GAAA;AACjB,QAAA,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,CAAU;IAC7F;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;QAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAgB;QAC/D,MAAM,aAAa,GAAG,SAAS,IAAI,EAAE,WAAW,EAAE,oBAAoB,IAAI,CAAC;QAC3E,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,aAAa,CAAC;QAEjD,IAAI,CAAC,4BAA4B,EAAE;QACnC,IAAI,CAAC,oBAAoB,EAAE;AAE3B,QAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAC7B,gBAAgB,EAChB,CAAC,GAAQ,EAAE,IAAS,KAAI;AACtB,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;AACtC,YAAA,IAAI,CAAC,YAAY;gBAAE;AACnB,YAAA,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAO,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACvG,YAAA,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;AACjF,YAAA,IAAI,aAAa,IAAI,cAAc,EAAE;gBACnC,GAAG,CAAC,IAAI,EAAE;YACZ;AACF,QAAA,CAAC,EACD,EAAE,QAAQ,EAAE,SAAS,EAAE,CACxB;QAED,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;QAC7D,IAAI,kBAAkB,EAAE;YACtB,kBAAkB,CAAC,EAAE,CACnB,SAAS,EACT,CAAC,GAAQ,EAAE,IAAW,KAAI;gBACxB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;AAC7B,gBAAA,MAAM,MAAM,GAAG,SAAS,IAAI;AAC5B,gBAAA,MAAM,eAAe,GAAG,MAAM,EAAE,WAAW,EAAE,qBAAqB;AAElE,gBAAA,IAAI,eAAe,KAAK,SAAS,EAAE;AACjC,oBAAA,MAAM,KAAK,GAAW,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;AACvG,oBAAA,IAAI,KAAK,CAAC,MAAM,GAAG,eAAe,EAAE;wBAClC,MAAM,EAAE,SAAS,GAAG,6BAA6B,eAAe,CAAA,YAAA,CAAc,CAAC;wBAC/E,GAAG,CAAC,IAAI,EAAE;oBACZ;gBACF;AACF,YAAA,CAAC,EACD,EAAE,QAAQ,EAAE,MAAM,EAAE,CACrB;QACH;AAEA,QAAA,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAK;YACxB,MAAM,YAAY,GAAI,MAAM,CAAC,OAAe,CAAC,GAAG,CAAC,cAAc,CAAC;YAChE,YAAY,EAAE,EAAE,CACd,cAAc,EACd,CAAC,GAAQ,KAAI;gBACX,GAAG,CAAC,IAAI,EAAE;AACZ,YAAA,CAAC,EACD,EAAE,QAAQ,EAAE,SAAS,EAAE,CACxB;AACH,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,mBAAmB,GAAG,CAAC,MAAkB,KAAI;AAChF,YAAA,MAAM,MAAM,GAAG,SAAS,IAAI;AAC5B,YAAA,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW;AACvC,YAAA,MAAM,UAAU,GAAG,WAAW,EAAE,UAAU,IAAI,UAAU;AACxD,YAAA,MAAM,UAAU,GAAG,WAAW,EAAE,UAAU;AAC1C,YAAA,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS;AACnC,YAAA,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,IAAI,IAAI;AAE9C,YAAA,IAAI,UAAU,KAAK,UAAU,EAAE;gBAC7B,OAAO,IAAI,0BAA0B,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;YAC3H;AAEA,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzB,gBAAA,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ;gBACjC,IAAI,QAAQ,EAAE;AACZ,oBAAA,MAAM,SAAS,GAAG,WAAW,EAAE,SAAS,IAAI,CAAC;AAC7C,oBAAA,IAAI,CAAC,eAAe,GAAG,IAAI,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC;gBACxF;YACF;AAEA,YAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;AACzB,gBAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;YAClD;YACA,OAAO,IAAI,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAC/H,QAAA,CAAC;IACH;IAES,OAAO,GAAA;QACd,KAAK,CAAC,OAAO,EAAE;AACf,QAAA,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE;QAC/B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;AAC9C,YAAA,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;QAC9B;AACA,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;IAC5B;IAEA,4BAA4B,GAAA;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;AAC1B,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM;QAElC,KAAK,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,aAAa,CAAU,EAAE;AACzD,YAAA,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE;AAC7B,gBAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,eAAe,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,CAAC;YAClE;QACF;;AAGA,QAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,UAAe,KAAI;AACxD,YAAA,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI;gBAClC,CAAC,SAAS,EAAE,SAAS,CAAC;gBACtB,CAAC,SAAS,EAAE,IAAI,CAAC;AACT,aAAA,EAAE;AACV,gBAAA,MAAM,eAAe,GAAG,CAAC,OAAgB,KAAK,CAAC,GAAQ,EAAE,IAAS,EAAE,aAAkB,KAAI;AACxF,oBAAA,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC;wBAAE;AAE5D,oBAAA,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AACjE,oBAAA,MAAM,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,WAAW;AAElE,oBAAA,IAAI,CAAC,OAAO;wBAAE;AAEd,oBAAA,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,EAAE;AAClC,wBAAA,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAC;oBACtF;yBAAO;wBACL,aAAa,CAAC,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC;oBACzD;AACF,gBAAA,CAAC;AAED,gBAAA,UAAU,CAAC,EAAE,CAAC,CAAA,UAAA,EAAa,SAAS,CAAA,WAAA,CAAa,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;AACzE,gBAAA,UAAU,CAAC,EAAE,CAAC,CAAA,UAAA,EAAa,SAAS,CAAA,YAAA,CAAc,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;YAC7E;AACF,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,UAAe,KAAI;AACtD,YAAA,UAAU,CAAC,EAAE,CACX,gBAAgB,EAChB,CAAC,IAAS,EAAE,IAAS,EAAE,aAAkB,KAAI;gBAC3C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE;gBACtC,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS;AACtD,gBAAA,IAAI,CAAC,YAAY;oBAAE;gBACnB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC5C,gBAAA,IAAI,CAAC,OAAO;oBAAE;gBACd,IAAI,CAAC,yBAAyB,CAAC,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC;AACtE,YAAA,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB;AAED,YAAA,UAAU,CAAC,EAAE,CACX,aAAa,EACb,CAAC,IAAS,EAAE,IAAS,EAAE,aAAkB,KAAI;gBAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS;AACtD,gBAAA,IAAI,CAAC,YAAY;oBAAE;gBACnB,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,aAAa,CAAC;AAC5E,YAAA,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB;AACH,QAAA,CAAC,CAAC;IACJ;IAEA,oBAAoB,GAAA;AAClB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;QAE1B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAK;AACtC,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE;YACzD,MAAM,OAAO,GAA6C,EAAE;AAE5D,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC5B,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK;oBAAE;AAClE,gBAAA,MAAM,MAAM,GAAI,MAAc,CAAC,iBAA2B;gBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AAC3C,gBAAA,IAAI,CAAC,IAAI;oBAAE;gBAEX,MAAM,IAAI,GAAI,MAAc,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS;AACpD,gBAAA,IAAI,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE;oBACvB,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACrC,oBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;gBACnC;YACF;AAEA,YAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE;YAE1B,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,aAAoB,EAAE,CAAC,MAAW,KAAI;gBAC/D,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE;oBACvC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;wBAC9B,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;oBACpF;AAEA,oBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;wBACjB,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC;oBACjD;AAEA,oBAAA,IAAI,IAAI,CAAC,OAAO,EAAE;wBAChB,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;oBACvD;gBACF;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,QAAQ,CAAC,WAAgB,EAAA;AACvB,QAAA,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,IAAI;QAC7B,IAAI,WAAW,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,CAAC;AAAE,YAAA,OAAO,WAAW;QAC1D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,WAAW,IAAI,IAAI,EAAE,EAAE;YACrD,IAAK,KAAa,CAAC,EAAE,GAAG,SAAS,EAAE,KAAK,CAAC;AAAE,gBAAA,OAAO,KAAK;QACzD;AACA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,yBAAyB,CAAC,OAAY,EAAE,YAAiB,EAAE,aAAkB,EAAA;QAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM;AACvC,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE;AACrF,YAAA,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,YAAY,CAAC;QAC7F;AACA,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC,EAAE;AAChF,YAAA,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC;QACxF;IACF;AAEA,IAAA,YAAY,CAAC,QAAiB,EAAA;AAC5B,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,OAAO;QAC7B,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG;AACZ,aAAA,OAAO,CAAC,WAAW,EAAE,GAAG;AACxB,aAAA,OAAO,CAAC,MAAM,EAAE,GAAG;AACnB,aAAA,IAAI,EAAE;QACT,OAAO,MAAM,IAAI,OAAO;IAC1B;AACD;;MCvXY,QAAQ,CAAA;;AAEV,IAAA,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC;AAChC,IAAA,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAClC,aAAa,GAAG,MAAM,CAAoD,uBAAuB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACtH,IAAA,cAAc,GAAG,MAAM,CAAC,eAAe,CAAC;;AAGxC,IAAA,MAAM,GAAG,KAAK,CAAiB,EAAE,CAAC;AAClC,IAAA,MAAM,GAAG,KAAK,CAAS,OAAO,CAAC;AAC/B,IAAA,SAAS,GAAG,KAAK,CAAS,OAAO,CAAC;AAClC,IAAA,SAAS,GAAG,KAAK,CAAqB,SAAS,CAAC;IAChD,KAAK,GAAG,KAAK,EAAsB;IACnC,UAAU,GAAG,KAAK,EAAsB;IACxC,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IACxD,eAAe,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC/D,WAAW,GAAG,KAAK,EAAsB;IACzC,WAAW,GAAG,KAAK,EAAsB;IACzC,SAAS,GAAG,KAAK,EAAiC;AAClD,IAAA,IAAI,GAAG,KAAK,CAA6B,SAAS,EAAE;AAC3D,QAAA,SAAS,EAAE,CAAC,GAAQ,KAA2B;AAC7C,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,SAAS;YAC1B,IAAI,GAAG,YAAY,MAAM;gBAAE,OAAO,GAAG,CAAC,IAAI;YAC1C,IAAI,GAAG,YAAY,SAAS;AAAE,gBAAA,OAAO,GAAG;AACxC,YAAA,IAAI,GAAG,EAAE,IAAI,YAAY,SAAS;gBAAE,OAAO,GAAG,CAAC,IAAI;AACnD,YAAA,OAAO,SAAS;QAClB,CAAC;AACF,KAAA,CAAC;AACO,IAAA,GAAG,GAAG,KAAK,CAAqB,SAAS,CAAC;IAC1C,WAAW,GAAG,KAAK,CAA4B,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC9E,MAAM,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,CAAA,aAAA,EAAgB,IAAI,CAAC,WAAW,EAAE,CAAA,CAAE,GAAG,SAAS,CAAC,CAAC;IAChG,IAAI,GAAG,KAAK,CAAS,IAAI,CAAC,EAAE,EAAE,CAAC;IAC/B,UAAU,GAAG,KAAK,CAAS,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;;IAGlD,QAAQ,GAAG,MAAM,EAAU;IAC3B,MAAM,GAAG,MAAM,EAAc;IAC7B,OAAO,GAAG,MAAM,EAAc;;AAG9B,IAAA,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC;AACvB,IAAA,WAAW,GAAG,IAAI,aAAa,EAAE;AACjC,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;QAC5B,OAAO,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG;AACtD,IAAA,CAAC,CAAC;AAEF,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM;AACtC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,SAAS;QAC7B,IAAI,MAAM,CAAC,UAAU,CAAC;AAAE,YAAA,OAAO,wBAAwB;QACvD,IAAI,MAAM,CAAC,WAAW,CAAC;AAAE,YAAA,OAAO,oBAAoB,IAAI,CAAC,SAAS,EAAE,EAAE;QACtE,IAAI,MAAM,CAAC,iBAAiB,CAAC;AAAE,YAAA,OAAO,MAAM,CAAC,iBAAiB,CAAW;QACzE,IAAI,MAAM,CAAC,aAAa,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,WAAW,EAAE;AACpD,QAAA,OAAO,SAAS;IAClB;IAES,MAAM,GAAG,aAAa;AAC/B,IAAA,OAAO;AACE,IAAA,qBAAqB,GAAG,IAAI,OAAO,EAAU;AAE7C,IAAA,YAAY,GAAG,QAAQ,CAAe,MAAK;AAClD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE;AACzB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACtC,QAAA,MAAM,iBAAiB,GAAG,CAAC,CAAC,QAAQ;QAEpC,MAAM,OAAO,GAAU,CAAC,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC;AAC3H,QAAA,IAAI,iBAAiB;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,uBAAuB,CAAC;AAE5D,QAAA,MAAM,YAAY,GAAG;YACnB,MAAM;YACN,QAAQ;YACR,WAAW;YACX,GAAG;YACH,UAAU;YACV,WAAW;YACX,GAAG;YACH,gBAAgB;YAChB,kBAAkB;YAClB,iBAAiB;YACjB,mBAAmB;YACnB,GAAG;YACH,cAAc;YACd,cAAc;SACf;AACD,QAAA,IAAI,iBAAiB;AAAE,YAAA,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;AAE5D,QAAA,MAAM,MAAM,GAAiB;AAC3B,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,SAAS,EAAE,OAAO;AAChB,gBAAA,GAAG,GAAG;gBACN,QAAQ;AACR,gBAAA,SAAS,EAAE,CAAC,GAAW,KAAK,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC;aAC7D,CAAC;YACF,OAAO;YACP,OAAO,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,IAAI,EAAE;AAC9D,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAC/B,YAAA,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;YAC7E,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,gBAAgB,EAAE,IAAI,EAAE;SAC5E;QAED,IAAI,iBAAiB,EAAE;YACrB,MAAM,CAAC,KAAK,GAAG;AACb,gBAAA,UAAU,EAAE,GAAG;AACf,gBAAA,aAAa,EAAE;oBACb,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;oBACxD,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;oBACrD,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;oBACrD,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;oBACrD,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE;AACjE,iBAAA;gBACD,OAAO,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE,2BAA2B,EAAE,wBAAwB,EAAE,4BAA4B,CAAC;aACnH;QACH;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,CAAC;AAEF,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,4BAA4B,EAAE;QACnC,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,mBAAmB,EAAE;QAC1B,IAAI,CAAC,aAAa,EAAE;IACtB;;AAGA,IAAA,OAAO,GAAG,CAAC,MAAqB,KAAI;AAClC,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;AAErB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE;AACtC,QAAA,IAAI,YAAY;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC;AAChD,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ;AAAE,YAAA,MAAM,CAAC,kBAAkB,CAAC,WAAW,CAAC;QACrE,IAAI,IAAI,CAAC,QAAQ,EAAE;AAAE,YAAA,MAAM,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;QAEpE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,IAAG;YAC/C,IAAI,OAAO,GAAG,KAAK;AACnB,YAAA,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE;gBAC9D,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,KAAK,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,EAAE;AAC/F,oBAAA,MAAM,OAAO,GAAI,MAAc,CAAC,QAAQ,CAAC,SAAS;oBAClD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE;wBACpD,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC;wBACpD,OAAO,GAAG,IAAI;oBAChB;gBACF;YACF;AACA,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAChG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAE,GAAW,CAAC,QAAsB,CAAC,CAAC;AACvG,QAAA,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,IAAG;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,GAAW,CAAC,QAAsB,CAAC;AACrD,YAAA,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE;AAChC,YAAA,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAC5B,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,WAAW,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI;IAE1D,aAAa,GAAG,YAA0B;AACxC,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,UAAU,IAAI,UAAU;;;QAGvE,IAAI,UAAU,KAAK,UAAU;YAAE;AAE/B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;QACtC,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;QACnE;AAEA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,uBAAuB,CAAwC;QACzG,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC;YAAE;AAE/C,QAAA,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAClE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAU;QACzF,MAAM,QAAQ,GAAG,wBAAwB,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC;;AAG9E,QAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC;AACvE,QAAA,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,CAAC;AAE3G,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,IAAI,IAAI;YAC7D,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE;gBAC1C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtF;AACA,YAAA,yBAAyB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC;QACvD;;AAGA,QAAA,KAAK,MAAM,OAAO,IAAI,iBAAiB,EAAE;AACvC,YAAA,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;QACrC;AAEA,QAAA,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE;YAClD,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC;QACxC;AAEA,QAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5B,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,kBAAA,EAAqB,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,CAAA,SAAA,CAAW,CAAC;QAC9E;AACF,IAAA,CAAC;IAED,MAAM,GAAG,YAA4B;AACnC,QAAA,MAAM,IAAI,CAAC,aAAa,EAAE;AAC1B,QAAA,OAAO,IAAI,CAAC,WAAW,EAAE;AAC3B,IAAA,CAAC;;IAGD,aAAa,GAAG,MAAK;QACnB,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAClH,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE;YACnB,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,oBAAoB,CAAC;AAClI,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;YAC7B,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG,EAAE;AAClC,gBAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBACpD,IAAI,IAAI,CAAC,OAAO;AAAE,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;YACzC;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,QAAQ,EAAE;YACf,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,iBAAiB,EAAE;AAC1B,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,mBAAmB,GAAG,MAAK;QACzB,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAW,KAAI;AACjG,YAAA,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;AACxC,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,gBAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;YACrB;AACF,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAEjH,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,IAAG;AAC3G,YAAA,MAAM,GAAG,GAAG,0BAA0B,CAAC,OAAO,CAAC;YAC/C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAE1C,YAAA,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,KAAK,GAAG;AAAE,gBAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YACxF,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC7D,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;AACxB,YAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;AACzB,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,aAAa,GAAG,MAAK;AACnB,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,MAAK;YAC9B,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACvC,YAAA,IAAI,CAAC,OAAO,EAAE,OAAO,IAAI;AAC3B,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;;AAGD,IAAA,WAAW,GAAG,CAAC,OAAe,KAAK,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAEnE,WAAW,GAAG,OAAe,IAAI,CAAC,OAAO,GAAG,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;IAEpG,kBAAkB,GAAG,MAA+B;AAClD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa;AACjC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;AACtB,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAClD,IAAA,CAAC;IAED,4BAA4B,GAAA;AAC1B,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa;AACjC,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAChE,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,QAAA,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE;AAChC,YAAA,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,KAAK,SAAS,GAAG,eAAe,GAAG,GAAG,CAAC,GAAG;AACvE,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE;AAC3B,gBAAA,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,KAAK,SAAS,GAAG,WAAW,GAAG,GAAG,CAAC,GAAG;AAC3D,gBAAA,MAAM,IAAI,KAAK,CAAC,4DAA4D,KAAK,CAAA,CAAE,CAAC;YACtF;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;QACzB;IACF;IAEA,kBAAkB,GAAG,MAAyC;AAC5D,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,EAAE;QAChD,IAAI,CAAC,cAAc,CAAC,MAAM;AAAE,YAAA,OAAO,SAAS;AAC5C,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;AAC3D,IAAA,CAAC;AAED,IAAA,cAAc,GAAG,MACf,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,QAAQ,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE,MAAM;IAE3E,iBAAiB,GAAG,MAAK;QACvB,MAAM,UAAU,GAAkB,EAAE;QACpC,MAAM,eAAe,GAAuB,EAAE;AAE9C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;AAC5B,QAAA,IAAI,GAAG,KAAK,SAAS,EAAE;AACrB,YAAA,UAAU,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,GAAG,GAAG,GAAG,EAAE,SAAS,EAAE,EAAE,cAAc,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;QACrI;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;QAC9B,IAAI,GAAG,EAAE;AACP,YAAA,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD;AAEA,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;QAC5B,IAAI,GAAG,EAAE;YACP,eAAe,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QACpD;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;AACrE,QAAA,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,eAAe,CAAC,MAAM,GAAG,eAAe,GAAG,IAAI,CAAC;QACpF,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AAC/D,IAAA,CAAC;wGA5UU,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC7DrB,i5CAsCA,EAAA,MAAA,EAAA,CAAA,ixDAAA,EAAA,0kEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDmBY,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,4BAAA,EAAA,oBAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,YAAA,EAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAI3E,QAAQ,EAAA,UAAA,EAAA,CAAA;kBARpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,cACT,IAAI,EAAA,eAAA,EACC,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC,CAAC,cAAc,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,gBAAgB,CAAC,EAAA,QAAA,EAAA,i5CAAA,EAAA,MAAA,EAAA,CAAA,ixDAAA,EAAA,0kEAAA,CAAA,EAAA;;;AEzDzF;;AAEG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-components-quick-action.mjs","sources":["../../../projects/sd-angular/components/quick-action/src/quick-action.component.ts","../../../projects/sd-angular/components/quick-action/src/quick-action.component.html","../../../projects/sd-angular/components/quick-action/sd-angular-core-components-quick-action.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\
|
|
1
|
+
{"version":3,"file":"sd-angular-core-components-quick-action.mjs","sources":["../../../projects/sd-angular/components/quick-action/src/quick-action.component.ts","../../../projects/sd-angular/components/quick-action/src/quick-action.component.html","../../../projects/sd-angular/components/quick-action/sd-angular-core-components-quick-action.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport { Component, Input } from '@angular/core';\n\n@Component({\n selector: 'sd-quick-action',\n templateUrl: './quick-action.component.html',\n styleUrls: ['./quick-action.component.scss'],\n standalone: true,\n imports: [CommonModule],\n})\nexport class SdQuickAction {\n isOpened = false;\n @Input('isOpened') set _isOpened(isOpened: '' | boolean | undefined | null) {\n this.isOpened = !!isOpened;\n }\n constructor() {}\n open = () => {\n this.isOpened = true;\n };\n\n close = () => {\n this.isOpened = false;\n };\n}\n","<div class=\"c-quick-action d-flex align-items-center gap-16\" [class.active]=\"isOpened\">\r\n <div class=\"flex-1 T14R\">\r\n <ng-content select=\"[sdMessage]\"></ng-content>\r\n </div>\r\n <ng-content select=\"[sdAction]\"></ng-content>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAUa,aAAa,CAAA;IACxB,QAAQ,GAAG,KAAK;IAChB,IAAuB,SAAS,CAAC,QAAyC,EAAA;AACxE,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ;IAC5B;AACA,IAAA,WAAA,GAAA,EAAe;IACf,IAAI,GAAG,MAAK;AACV,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACtB,IAAA,CAAC;IAED,KAAK,GAAG,MAAK;AACX,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACvB,IAAA,CAAC;wGAZU,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,CAAA,UAAA,EAAA,WAAA,CAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECV1B,qQAMA,EAAA,MAAA,EAAA,CAAA,8ZAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDEY,YAAY,EAAA,CAAA,EAAA,CAAA;;4FAEX,aAAa,EAAA,UAAA,EAAA,CAAA;kBAPzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iBAAiB,EAAA,UAAA,EAGf,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,CAAC,EAAA,QAAA,EAAA,qQAAA,EAAA,MAAA,EAAA,CAAA,8ZAAA,CAAA,EAAA;wDAIA,SAAS,EAAA,CAAA;sBAA/B,KAAK;uBAAC,UAAU;;;AEZnB;;AAEG;;;;"}
|
|
@@ -277,11 +277,11 @@ class SdTabRouterNavComponent {
|
|
|
277
277
|
moveItemInArray(this.tabs, event.previousIndex, event.currentIndex);
|
|
278
278
|
};
|
|
279
279
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterNavComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
280
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: SdTabRouterNavComponent, isStandalone: true, selector: "sd-tab-router-nav", inputs: { tabs: "tabs" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "tabRouterNav", first: true, predicate: ["tabRouterNav"], descendants: true }], ngImport: i0, template: "<div\
|
|
280
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.21", type: SdTabRouterNavComponent, isStandalone: true, selector: "sd-tab-router-nav", inputs: { tabs: "tabs" }, host: { listeners: { "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "tabRouterNav", first: true, predicate: ["tabRouterNav"], descendants: true }], ngImport: i0, template: "<div\n #tabRouterNav\n cdkDropList\n cdkDropListLockAxis=\"x\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onDrop($event)\"\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\n [class.d-none]=\"tabs.length > 1\">\n <ng-container *ngFor=\"let tab of tabs\">\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef?.nativeElement\"></sd-tab-router-item>\n </ng-container>\n</div>\n", styles: [".tab-router__nav{background:#f9f9f9;overflow:hidden}.tab-router__nav--compact::ng-deep .tab-router__name{display:none}.tab-router__nav--compact::ng-deep .tab-router__icon{margin:0!important}.tab-router__nav--compact::ng-deep .tab-router__item--active{min-width:240px}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__icon{margin-right:8px!important}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__name{display:-webkit-box}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "component", type: SdTabRouterItemComponent, selector: "sd-tab-router-item", inputs: ["tab"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
281
281
|
}
|
|
282
282
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterNavComponent, decorators: [{
|
|
283
283
|
type: Component,
|
|
284
|
-
args: [{ selector: 'sd-tab-router-nav', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, DragDropModule, SdTabRouterItemComponent], template: "<div\
|
|
284
|
+
args: [{ selector: 'sd-tab-router-nav', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, DragDropModule, SdTabRouterItemComponent], template: "<div\n #tabRouterNav\n cdkDropList\n cdkDropListLockAxis=\"x\"\n cdkDropListOrientation=\"horizontal\"\n (cdkDropListDropped)=\"onDrop($event)\"\n class=\"tab-router__nav tab-router__nav--{{ mode }} d-flex align-items-center flex-nowrap\"\n [class.d-none]=\"tabs.length > 1\">\n <ng-container *ngFor=\"let tab of tabs\">\n <sd-tab-router-item [tab]=\"tab\" cdkDrag [cdkDragBoundary]=\"elementRef?.nativeElement\"></sd-tab-router-item>\n </ng-container>\n</div>\n", styles: [".tab-router__nav{background:#f9f9f9;overflow:hidden}.tab-router__nav--compact::ng-deep .tab-router__name{display:none}.tab-router__nav--compact::ng-deep .tab-router__icon{margin:0!important}.tab-router__nav--compact::ng-deep .tab-router__item--active{min-width:240px}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__icon{margin-right:8px!important}.tab-router__nav--compact::ng-deep .tab-router__item--active .tab-router__name{display:-webkit-box}\n"] }]
|
|
285
285
|
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }], propDecorators: { tabRouterNav: [{
|
|
286
286
|
type: ViewChild,
|
|
287
287
|
args: ['tabRouterNav']
|
|
@@ -507,11 +507,11 @@ class SdTabRouterOutletComponent {
|
|
|
507
507
|
return null;
|
|
508
508
|
};
|
|
509
509
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterOutletComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
510
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdTabRouterOutletComponent, isStandalone: true, selector: "sd-tab-router-outlet", viewQueries: [{ propertyName: "tabRouterNav", first: true, predicate: ["tabRouterNav"], descendants: true }], ngImport: i0, template: "<sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\
|
|
510
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.21", type: SdTabRouterOutletComponent, isStandalone: true, selector: "sd-tab-router-outlet", viewQueries: [{ propertyName: "tabRouterNav", first: true, predicate: ["tabRouterNav"], descendants: true }], ngImport: i0, template: "<sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\n\n<div class=\"tab-router__list\">\n @for (tab of tabs(); track tab.key) {\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\n <div class=\"tab-router__content\">\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </div>\n </div>\n } @empty {\n <div class=\"tab-router__empty\">\n </div>\n }\n</div>", styles: [":host{display:flex;flex-direction:column;width:100%;height:calc(100vh - 64px)}:host ::ng-deep .sd-loading{max-width:100%;max-height:100%}.tab-router__list{flex:1}.tab-router__pane{display:none;position:relative;height:100%;width:100%}.tab-router__pane.active{display:block}.tab-router__content{position:absolute;inset:0;overflow:auto;height:100%;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "component", type: SdTabRouterNavComponent, selector: "sd-tab-router-nav", inputs: ["tabs"] }] });
|
|
511
511
|
}
|
|
512
512
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.21", ngImport: i0, type: SdTabRouterOutletComponent, decorators: [{
|
|
513
513
|
type: Component,
|
|
514
|
-
args: [{ selector: 'sd-tab-router-outlet', standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule, SdTabRouterNavComponent], template: "<sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\
|
|
514
|
+
args: [{ selector: 'sd-tab-router-outlet', standalone: true, imports: [CommonModule, MatIconModule, MatTooltipModule, SdTabRouterNavComponent], template: "<sd-tab-router-nav [tabs]=\"tabs()\" #tabRouterNav></sd-tab-router-nav>\n\n<div class=\"tab-router__list\">\n @for (tab of tabs(); track tab.key) {\n <div class=\"tab-router__pane\" [class.active]=\"tab.isActive\" [id]=\"tab.key\">\n <div class=\"tab-router__content\">\n <ng-container *ngComponentOutlet=\"tab.component; injector: tab.injector\"></ng-container>\n </div>\n </div>\n } @empty {\n <div class=\"tab-router__empty\">\n </div>\n }\n</div>", styles: [":host{display:flex;flex-direction:column;width:100%;height:calc(100vh - 64px)}:host ::ng-deep .sd-loading{max-width:100%;max-height:100%}.tab-router__list{flex:1}.tab-router__pane{display:none;position:relative;height:100%;width:100%}.tab-router__pane.active{display:block}.tab-router__content{position:absolute;inset:0;overflow:auto;height:100%;width:100%}\n"] }]
|
|
515
515
|
}], ctorParameters: () => [], propDecorators: { tabRouterNav: [{
|
|
516
516
|
type: ViewChild,
|
|
517
517
|
args: ['tabRouterNav']
|