ngx-custom-material-file-input
Version:
File input management for Angular Material
1 lines • 31.9 kB
Source Map (JSON)
{"version":3,"file":"ngx-custom-material-file-input.mjs","sources":["../../../projects/material-file-input/src/lib/models/file-input-config.model.ts","../../../projects/material-file-input/src/lib/models/file-input.model.ts","../../../projects/material-file-input/src/lib/file-input/file-input.base.ts","../../../projects/material-file-input/src/lib/file-input/file-input.component.ts","../../../projects/material-file-input/src/lib/file-input/file-input.component.html","../../../projects/material-file-input/src/lib/pipe/byte-format.pipe.ts","../../../projects/material-file-input/src/lib/validator/file-validator.ts","../../../projects/material-file-input/src/public-api.ts","../../../projects/material-file-input/src/ngx-custom-material-file-input.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Optional token to provide custom configuration to the module\r\n */\r\nexport const NGX_MAT_FILE_INPUT_CONFIG = new InjectionToken<FileInputConfig>(\r\n 'ngx-mat-file-input.config'\r\n);\r\n\r\n/**\r\n * Provide additional configuration to dynamically customize the module injection\r\n */\r\nexport interface FileInputConfig {\r\n /**\r\n * Unit used with the ByteFormatPipe, default value is *Byte*.\r\n * The first letter is used for the short notation.\r\n */\r\n sizeUnit: string;\r\n}\r\n","/**\r\n * The files to be uploaded\r\n */\r\nexport class FileInput {\r\n private _fileNames: string;\r\n\r\n constructor(private _files: File[] | null, private delimiter: string = ', ') {\r\n this._fileNames = (this._files || [])\r\n .map((f: File) => f.name)\r\n .join(delimiter);\r\n }\r\n\r\n get files() {\r\n return this._files || [];\r\n }\r\n\r\n get fileNames(): string {\r\n return this._fileNames;\r\n }\r\n}\r\n","import { FormGroupDirective, NgControl, NgForm } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/** Base class for error state management */\r\nexport class FileInputBase {\r\n private _errorState = false;\r\n\r\n constructor(\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm | null,\r\n public _parentFormGroup: FormGroupDirective | null,\r\n public ngControl: NgControl,\r\n public stateChanges: Subject<void>\r\n ) {}\r\n\r\n /** Determines whether the control is in an error state */\r\n get errorState(): boolean {\r\n const control = this.ngControl?.control || null; \r\n const form = this._parentForm || this._parentFormGroup || null;\r\n\r\n return this._defaultErrorStateMatcher.isErrorState(control, form);\r\n }\r\n\r\n /** Triggers error state update */\r\n updateErrorState() {\r\n const previousState = this._errorState;\r\n this._errorState = this.errorState;\r\n\r\n if (previousState !== this._errorState) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n OnInit,\r\n Input,\r\n ElementRef,\r\n OnDestroy,\r\n HostBinding,\r\n Renderer2,\r\n HostListener,\r\n Optional,\r\n Self,\r\n DoCheck,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NgControl,\r\n NgForm,\r\n FormGroupDirective,\r\n} from '@angular/forms';\r\nimport { MatFormFieldControl } from '@angular/material/form-field';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { FileInputBase } from './file-input.base';\r\nimport { FileInput } from '../models/file-input.model';\r\nimport { Subject } from 'rxjs/internal/Subject';\r\n\r\n@Component({\r\n selector: 'ngx-mat-file-input',\r\n templateUrl: './file-input.component.html',\r\n styleUrls: ['./file-input.component.css'],\r\n providers: [\r\n { provide: MatFormFieldControl, useExisting: FileInputComponent },\r\n ],\r\n standalone: true,\r\n})\r\nexport class FileInputComponent\r\n extends FileInputBase\r\n implements\r\n MatFormFieldControl<FileInput>,\r\n ControlValueAccessor,\r\n OnInit,\r\n OnDestroy,\r\n DoCheck\r\n{\r\n static nextId = 0;\r\n\r\n focused = false;\r\n controlType = 'file-input';\r\n\r\n @Input() autofilled = false;\r\n\r\n private _placeholder: string;\r\n private _required = false;\r\n private _multiple = false;\r\n private _checkDuplicates = false;\r\n private _previewUrls: string[] = [];\r\n private _objectURLs: string[] = [];\r\n private _internalValue: FileInput | null = null;\r\n\r\n @Input() valuePlaceholder: string;\r\n @Input() accept: string | null = null;\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n @Input() defaultIconBase64: string =\r\n 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMTUgMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjdsLTUtNXpNNiAyMFY0aDh2NGg0djEySDZ6bTEwLTEwdjVjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRWOC41YzAtMS40NyAxLjI2LTIuNjQgMi43Ni0yLjQ5IDEuMy4xMyAyLjI0IDEuMzIgMi4yNCAyLjYzVjE1aC0yVjguNWMwLS4yOC0uMjItLjUtLjUtLjVzLS41LjIyLS41LjVWMTVjMCAxLjEuOSAyIDIgMnMyLS45IDItMnYtNWgyeiIvPjwvc3ZnPg==';\r\n\r\n public empty = true;\r\n\r\n override get errorState(): boolean {\r\n const control = this.ngControl?.control || null;\r\n const form = this._parentForm || this._parentFormGroup || null;\r\n const matcher = this.errorStateMatcher || this._defaultErrorStateMatcher;\r\n\r\n return matcher.isErrorState(control, form);\r\n }\r\n\r\n @HostBinding() id = `ngx-mat-file-input-${FileInputComponent.nextId++}`;\r\n @HostBinding('attr.aria-describedby') describedBy = '';\r\n\r\n public setDescribedByIds(ids: string[]) {\r\n this.describedBy = ids.join(' ');\r\n }\r\n\r\n @Input()\r\n get value(): FileInput | null {\r\n return this.empty ? null : this._internalValue;\r\n }\r\n set value(fileInput: FileInput | null) {\r\n this._internalValue = fileInput;\r\n this.empty = !this._internalValue || !this._internalValue.files.length;\r\n\r\n this.stateChanges.next();\r\n this._onChange(this._internalValue);\r\n this.updatePreviewUrls();\r\n }\r\n\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean | string) {\r\n this._multiple = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n @Input()\r\n get checkDuplicates(): boolean {\r\n return this._checkDuplicates;\r\n }\r\n set checkDuplicates(value: boolean | string) {\r\n this._checkDuplicates = coerceBooleanProperty(value);\r\n }\r\n\r\n @Input()\r\n get placeholder() {\r\n return this._placeholder;\r\n }\r\n set placeholder(plh) {\r\n this._placeholder = plh;\r\n this.stateChanges.next();\r\n }\r\n\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(req: boolean | string) {\r\n this._required = coerceBooleanProperty(req);\r\n this.stateChanges.next();\r\n }\r\n\r\n @HostBinding('class.mat-form-field-should-float')\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty || this.valuePlaceholder !== undefined;\r\n }\r\n\r\n @HostBinding('class.file-input-disabled')\r\n get isDisabled() {\r\n return this.disabled;\r\n }\r\n @Input()\r\n get disabled(): boolean {\r\n return this._elementRef.nativeElement.disabled;\r\n }\r\n set disabled(dis: boolean | string) {\r\n const isDisabled = coerceBooleanProperty(dis);\r\n this.setDisabledState(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n get previewUrls(): string[] {\r\n return this._previewUrls;\r\n }\r\n\r\n private _onChange = (_: any) => {};\r\n private _onTouched = () => {};\r\n\r\n get fileNames() {\r\n return this._internalValue\r\n ? this._internalValue.fileNames\r\n : this.valuePlaceholder;\r\n }\r\n\r\n constructor(\r\n private fm: FocusMonitor,\r\n private _elementRef: ElementRef,\r\n private _renderer: Renderer2,\r\n public override _defaultErrorStateMatcher: ErrorStateMatcher,\r\n @Optional()\r\n @Self()\r\n public override ngControl: NgControl,\r\n @Optional() public override _parentForm: NgForm,\r\n @Optional() public override _parentFormGroup: FormGroupDirective\r\n ) {\r\n super(\r\n _defaultErrorStateMatcher,\r\n _parentForm,\r\n _parentFormGroup,\r\n ngControl,\r\n new Subject<void>()\r\n );\r\n\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n\r\n fm.monitor(_elementRef.nativeElement, true).subscribe((origin) => {\r\n this.focused = !!origin;\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n public onContainerClick(event: MouseEvent) {\r\n if (\r\n (event.target as Element).tagName.toLowerCase() !== 'input' &&\r\n !this.disabled\r\n ) {\r\n this._elementRef.nativeElement.querySelector('input').focus();\r\n this.focused = true;\r\n this.open();\r\n }\r\n }\r\n\r\n public writeValue(obj: FileInput | null): void {\r\n this.value = obj;\r\n if (!obj || obj.files.length === 0) {\r\n const inputElement =\r\n this._elementRef.nativeElement.querySelector('input');\r\n if (inputElement) {\r\n inputElement.value = null;\r\n }\r\n }\r\n }\r\n\r\n public registerOnChange(fn: (_: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n public registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n public clear(event?: Event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.value = new FileInput([]);\r\n\r\n const inputElement = this._elementRef.nativeElement.querySelector('input');\r\n if (inputElement) {\r\n inputElement.value = null;\r\n }\r\n }\r\n\r\n @HostListener('change', ['$event'])\r\n change(event: Event) {\r\n const fileList: FileList | null = (<HTMLInputElement>event.target).files;\r\n if (!fileList) return;\r\n\r\n let newFiles = Array.from(fileList);\r\n let currentFiles = this._internalValue?.files || [];\r\n let filesToSet: File[] = [];\r\n\r\n if (this.multiple) {\r\n filesToSet = [...currentFiles];\r\n\r\n for (const newFile of newFiles) {\r\n let isDuplicate = false;\r\n\r\n if (this.checkDuplicates) {\r\n isDuplicate = currentFiles.some(\r\n (existingFile) =>\r\n existingFile.name === newFile.name &&\r\n existingFile.size === newFile.size &&\r\n existingFile.lastModified === newFile.lastModified\r\n );\r\n }\r\n\r\n if (!isDuplicate) {\r\n filesToSet.push(newFile);\r\n } else {\r\n console.warn(`Duplicate file skipped: ${newFile.name}`);\r\n }\r\n }\r\n } else {\r\n filesToSet = newFiles;\r\n }\r\n\r\n this.value = new FileInput(filesToSet);\r\n (<HTMLInputElement>event.target).value = '';\r\n }\r\n\r\n private updatePreviewUrls() {\r\n this._objectURLs.forEach((url) => URL.revokeObjectURL(url));\r\n this._objectURLs = [];\r\n\r\n if (this._internalValue?.files?.length) {\r\n this._previewUrls = this._internalValue.files.map((file) => {\r\n if (file.type.startsWith('image/')) {\r\n const url = URL.createObjectURL(file);\r\n this._objectURLs.push(url);\r\n return url;\r\n } else {\r\n return this.defaultIconBase64;\r\n }\r\n });\r\n } else {\r\n this._previewUrls = [];\r\n }\r\n }\r\n\r\n removeFile(index: number) {\r\n if (!this._internalValue?.files?.length) return;\r\n\r\n const updatedFiles = [...this._internalValue.files];\r\n updatedFiles.splice(index, 1);\r\n this.value = new FileInput(updatedFiles);\r\n }\r\n\r\n @HostListener('focusout')\r\n public blur() {\r\n this.focused = false;\r\n this._onTouched();\r\n }\r\n\r\n public setDisabledState(isDisabled: boolean): void {\r\n this._renderer.setProperty(\r\n this._elementRef.nativeElement,\r\n 'disabled',\r\n isDisabled\r\n );\r\n }\r\n\r\n public open() {\r\n if (!this.disabled) {\r\n this._elementRef.nativeElement.querySelector('input').click();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.multiple = coerceBooleanProperty(this.multiple);\r\n }\r\n\r\n ngOnDestroy() {\r\n this._objectURLs.forEach((url) => URL.revokeObjectURL(url));\r\n this._objectURLs = [];\r\n this.stateChanges.complete();\r\n this.fm.stopMonitoring(this._elementRef.nativeElement);\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (this.ngControl) {\r\n this.updateErrorState();\r\n }\r\n }\r\n}\r\n","<input\r\n #input\r\n [id]=\"id\"\r\n type=\"file\"\r\n [attr.multiple]=\"multiple ? '' : null\"\r\n [attr.accept]=\"accept\"\r\n/>\r\n<span class=\"filename\" [title]=\"fileNames\">{{ fileNames }}</span>\r\n","import { Pipe, PipeTransform, Optional, Inject } from '@angular/core';\r\nimport {\r\n FileInputConfig,\r\n NGX_MAT_FILE_INPUT_CONFIG,\r\n} from '../models/file-input-config.model';\r\n\r\n@Pipe({ name: 'byteFormat', standalone: true })\r\nexport class ByteFormatPipe implements PipeTransform {\r\n private unit: string;\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(NGX_MAT_FILE_INPUT_CONFIG)\r\n private config: FileInputConfig\r\n ) {\r\n this.unit = config ? config.sizeUnit : 'Byte';\r\n }\r\n\r\n transform(value: any, args?: any): any {\r\n if (parseInt(value, 10) >= 0) {\r\n value = this.formatBytes(+value, +args);\r\n }\r\n return value;\r\n }\r\n\r\n private formatBytes(bytes: number, decimals?: number) {\r\n if (bytes === 0) {\r\n return '0 ' + this.unit;\r\n }\r\n const B = this.unit.charAt(0);\r\n const k = 1024;\r\n const dm = decimals || 2;\r\n const sizes = [\r\n this.unit,\r\n 'K' + B,\r\n 'M' + B,\r\n 'G' + B,\r\n 'T' + B,\r\n 'P' + B,\r\n 'E' + B,\r\n 'Z' + B,\r\n 'Y' + B,\r\n ];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n }\r\n}\r\n","import { ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { FileInput } from '../models/file-input.model';\r\n\r\nexport class FileValidator {\r\n /**\r\n * Function to control content of files\r\n *\r\n * @param bytes max number of bytes allowed\r\n *\r\n * @returns Validator function\r\n */\r\n static maxContentSize(bytes: number): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n const size =\r\n control && control.value && control.value.files\r\n ? (control.value as FileInput).files\r\n .map((file) => file.size)\r\n .reduce((acc, fileSize) => acc + fileSize, 0)\r\n : 0;\r\n\r\n const isValid = bytes >= size;\r\n\r\n return isValid\r\n ? null\r\n : {\r\n maxContentSize: {\r\n actualSize: size,\r\n maxSize: bytes,\r\n },\r\n };\r\n };\r\n }\r\n\r\n /**\r\n * Validator function to validate accepted file formats\r\n *\r\n * @param acceptedMimeTypes Array of accepted MIME types (e.g., ['image/jpeg', 'application/pdf'])\r\n * @returns Validator function\r\n */\r\n static acceptedMimeTypes(acceptedMimeTypes: string[]): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const files: File[] = control.value\r\n ? (control.value as FileInput).files\r\n : [];\r\n const invalidFiles: File[] = files.filter(\r\n (file) => !acceptedMimeTypes.includes(file.type)\r\n );\r\n\r\n if (invalidFiles.length > 0) {\r\n return {\r\n acceptedMimeTypes: {\r\n validTypes: acceptedMimeTypes,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n /**\r\n * Validator function to validate the min number of uploaded files\r\n *\r\n * @param minCount Number of minimum files to upload\r\n * @returns Validator function\r\n */\r\n static minFileCount(minCount: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return {\r\n minFileCount: {\r\n minCount: minCount,\r\n actualCount: 0,\r\n },\r\n };\r\n }\r\n\r\n const files: File[] = (control.value as FileInput).files;\r\n\r\n if (files && files.length < minCount) {\r\n return {\r\n minFileCount: {\r\n minCount: minCount,\r\n actualCount: files.length,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n /**\r\n * Validator function to validate the max number of uploaded files\r\n *\r\n * @param maxCount Number of maximum files to upload\r\n * @returns Validator function\r\n */\r\n static maxFileCount(maxCount: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n const files: File[] = control.value\r\n ? (control.value as FileInput).files\r\n : [];\r\n\r\n if (files && files.length > maxCount) {\r\n return {\r\n maxFileCount: {\r\n maxCount: maxCount,\r\n actualCount: files.length,\r\n },\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n}\r\n","/*\n * Public API Surface of material-file-input\n */\n\n// Model & Constant\nexport { NGX_MAT_FILE_INPUT_CONFIG } from './lib/models/file-input-config.model';\nexport { FileInput } from './lib/models/file-input.model';\nexport { FileInputConfig } from './lib/models/file-input-config.model';\n\n// Components\nexport { FileInputComponent } from './lib/file-input/file-input.component';\n\n// Filters\nexport { ByteFormatPipe } from './lib/pipe/byte-format.pipe';\n\n// Utilities\nexport { FileValidator } from './lib/validator/file-validator';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;AAEA;;AAEG;MACU,yBAAyB,GAAG,IAAI,cAAc,CACzD,2BAA2B;;ACN7B;;AAEG;MACU,SAAS,CAAA;IAGpB,WAAA,CAAoB,MAAqB,EAAU,SAAA,GAAoB,IAAI,EAAA;QAAvD,IAAA,CAAA,MAAM,GAAN,MAAM;QAAyB,IAAA,CAAA,SAAS,GAAT,SAAS;QAC1D,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE;aACjC,GAAG,CAAC,CAAC,CAAO,KAAK,CAAC,CAAC,IAAI;aACvB,IAAI,CAAC,SAAS,CAAC;IACpB;AAEA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE;IAC1B;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,UAAU;IACxB;AACD;;ACfD;MACa,aAAa,CAAA;IAGxB,WAAA,CACS,yBAA4C,EAC5C,WAA0B,EAC1B,gBAA2C,EAC3C,SAAoB,EACpB,YAA2B,EAAA;QAJ3B,IAAA,CAAA,yBAAyB,GAAzB,yBAAyB;QACzB,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAChB,IAAA,CAAA,SAAS,GAAT,SAAS;QACT,IAAA,CAAA,YAAY,GAAZ,YAAY;QAPb,IAAA,CAAA,WAAW,GAAG,KAAK;IAQxB;;AAGH,IAAA,IAAI,UAAU,GAAA;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAE9D,OAAO,IAAI,CAAC,yBAAyB,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;IACnE;;IAGA,gBAAgB,GAAA;AACd,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW;AACtC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU;AAElC,QAAA,IAAI,aAAa,KAAK,IAAI,CAAC,WAAW,EAAE;AACtC,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;QAC1B;IACF;AACD;;ACGK,MAAO,kBACX,SAAQ,aAAa,CAAA;aAQd,IAAA,CAAA,MAAM,GAAG,CAAH,CAAK;AAuBlB,IAAA,IAAa,UAAU,GAAA;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI;QAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,yBAAyB;QAExE,OAAO,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;IAC5C;AAKO,IAAA,iBAAiB,CAAC,GAAa,EAAA;QACpC,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;IAClC;AAEA,IAAA,IACI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,cAAc;IAChD;IACA,IAAI,KAAK,CAAC,SAA2B,EAAA;AACnC,QAAA,IAAI,CAAC,cAAc,GAAG,SAAS;AAC/B,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM;AAEtE,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC;QACnC,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA,IAAA,IACI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;IACA,IAAI,QAAQ,CAAC,KAAuB,EAAA;AAClC,QAAA,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC;AAC7C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEA,IAAA,IACI,eAAe,GAAA;QACjB,OAAO,IAAI,CAAC,gBAAgB;IAC9B;IACA,IAAI,eAAe,CAAC,KAAuB,EAAA;AACzC,QAAA,IAAI,CAAC,gBAAgB,GAAG,qBAAqB,CAAC,KAAK,CAAC;IACtD;AAEA,IAAA,IACI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;IAC1B;IACA,IAAI,WAAW,CAAC,GAAG,EAAA;AACjB,QAAA,IAAI,CAAC,YAAY,GAAG,GAAG;AACvB,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEA,IAAA,IACI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;IACA,IAAI,QAAQ,CAAC,GAAqB,EAAA;AAChC,QAAA,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC,GAAG,CAAC;AAC3C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEA,IAAA,IACI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;IAC3E;AAEA,IAAA,IACI,UAAU,GAAA;QACZ,OAAO,IAAI,CAAC,QAAQ;IACtB;AACA,IAAA,IACI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,QAAQ;IAChD;IACA,IAAI,QAAQ,CAAC,GAAqB,EAAA;AAChC,QAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC;AAC7C,QAAA,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC;AACjC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;IAC1B;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;IAC1B;AAKA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC;AACV,cAAE,IAAI,CAAC,cAAc,CAAC;AACtB,cAAE,IAAI,CAAC,gBAAgB;IAC3B;AAEA,IAAA,WAAA,CACU,EAAgB,EAChB,WAAuB,EACvB,SAAoB,EACZ,yBAA4C,EAG5C,SAAoB,EACR,WAAmB,EACnB,gBAAoC,EAAA;AAEhE,QAAA,KAAK,CACH,yBAAyB,EACzB,WAAW,EACX,gBAAgB,EAChB,SAAS,EACT,IAAI,OAAO,EAAQ,CACpB;QAhBO,IAAA,CAAA,EAAE,GAAF,EAAE;QACF,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,SAAS,GAAT,SAAS;QACD,IAAA,CAAA,yBAAyB,GAAzB,yBAAyB;QAGzB,IAAA,CAAA,SAAS,GAAT,SAAS;QACG,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QA7H9C,IAAA,CAAA,OAAO,GAAG,KAAK;QACf,IAAA,CAAA,WAAW,GAAG,YAAY;QAEjB,IAAA,CAAA,UAAU,GAAG,KAAK;QAGnB,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,SAAS,GAAG,KAAK;QACjB,IAAA,CAAA,gBAAgB,GAAG,KAAK;QACxB,IAAA,CAAA,YAAY,GAAa,EAAE;QAC3B,IAAA,CAAA,WAAW,GAAa,EAAE;QAC1B,IAAA,CAAA,cAAc,GAAqB,IAAI;QAGtC,IAAA,CAAA,MAAM,GAAkB,IAAI;QAE5B,IAAA,CAAA,iBAAiB,GACxB,4iBAA4iB;QAEviB,IAAA,CAAA,KAAK,GAAG,IAAI;AAUJ,QAAA,IAAA,CAAA,EAAE,GAAG,CAAA,mBAAA,EAAsB,kBAAkB,CAAC,MAAM,EAAE,EAAE;QACjC,IAAA,CAAA,WAAW,GAAG,EAAE;AA6E9C,QAAA,IAAA,CAAA,SAAS,GAAG,CAAC,CAAM,KAAI,EAAE,CAAC;AAC1B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAK,EAAE,CAAC;AA2B3B,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,aAAa,GAAG,IAAI;QACrC;AAEA,QAAA,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;AAC/D,YAAA,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM;AACvB,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;AAC1B,QAAA,CAAC,CAAC;IACJ;AAEO,IAAA,gBAAgB,CAAC,KAAiB,EAAA;QACvC,IACG,KAAK,CAAC,MAAkB,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO;AAC3D,YAAA,CAAC,IAAI,CAAC,QAAQ,EACd;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE;AAC7D,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;YACnB,IAAI,CAAC,IAAI,EAAE;QACb;IACF;AAEO,IAAA,UAAU,CAAC,GAAqB,EAAA;AACrC,QAAA,IAAI,CAAC,KAAK,GAAG,GAAG;QAChB,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;AAClC,YAAA,MAAM,YAAY,GAChB,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;YACvD,IAAI,YAAY,EAAE;AAChB,gBAAA,YAAY,CAAC,KAAK,GAAG,IAAI;YAC3B;QACF;IACF;AAEO,IAAA,gBAAgB,CAAC,EAAoB,EAAA;AAC1C,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEO,IAAA,iBAAiB,CAAC,EAAO,EAAA;AAC9B,QAAA,IAAI,CAAC,UAAU,GAAG,EAAE;IACtB;AAEO,IAAA,KAAK,CAAC,KAAa,EAAA;QACxB,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,eAAe,EAAE;QACzB;QACA,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,EAAE,CAAC;AAE9B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC;QAC1E,IAAI,YAAY,EAAE;AAChB,YAAA,YAAY,CAAC,KAAK,GAAG,IAAI;QAC3B;IACF;AAGA,IAAA,MAAM,CAAC,KAAY,EAAA;AACjB,QAAA,MAAM,QAAQ,GAAuC,KAAK,CAAC,MAAO,CAAC,KAAK;AACxE,QAAA,IAAI,CAAC,QAAQ;YAAE;QAEf,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QACnC,IAAI,YAAY,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QACnD,IAAI,UAAU,GAAW,EAAE;AAE3B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,UAAU,GAAG,CAAC,GAAG,YAAY,CAAC;AAE9B,YAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;gBAC9B,IAAI,WAAW,GAAG,KAAK;AAEvB,gBAAA,IAAI,IAAI,CAAC,eAAe,EAAE;AACxB,oBAAA,WAAW,GAAG,YAAY,CAAC,IAAI,CAC7B,CAAC,YAAY,KACX,YAAY,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;AAClC,wBAAA,YAAY,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;AAClC,wBAAA,YAAY,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,CACrD;gBACH;gBAEA,IAAI,CAAC,WAAW,EAAE;AAChB,oBAAA,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC1B;qBAAO;oBACL,OAAO,CAAC,IAAI,CAAC,CAAA,wBAAA,EAA2B,OAAO,CAAC,IAAI,CAAA,CAAE,CAAC;gBACzD;YACF;QACF;aAAO;YACL,UAAU,GAAG,QAAQ;QACvB;QAEA,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC;AACnB,QAAA,KAAK,CAAC,MAAO,CAAC,KAAK,GAAG,EAAE;IAC7C;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;QAErB,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;AACtC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;gBACzD,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;oBAClC,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;AACrC,oBAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,oBAAA,OAAO,GAAG;gBACZ;qBAAO;oBACL,OAAO,IAAI,CAAC,iBAAiB;gBAC/B;AACF,YAAA,CAAC,CAAC;QACJ;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;QACxB;IACF;AAEA,IAAA,UAAU,CAAC,KAAa,EAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,MAAM;YAAE;QAEzC,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AACnD,QAAA,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC;IAC1C;IAGO,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QACpB,IAAI,CAAC,UAAU,EAAE;IACnB;AAEO,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,WAAW,CACxB,IAAI,CAAC,WAAW,CAAC,aAAa,EAC9B,UAAU,EACV,UAAU,CACX;IACH;IAEO,IAAI,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE;QAC/D;IACF;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;IACtD;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;QAC5B,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC;IACxD;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,gBAAgB,EAAE;QACzB;IACF;8GA3SW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,IAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAlB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,aAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,QAAA,EAAA,EAAA,UAAA,EAAA,EAAA,IAAA,EAAA,SAAA,EAAA,uBAAA,EAAA,kBAAA,EAAA,mCAAA,EAAA,uBAAA,EAAA,2BAAA,EAAA,iBAAA,EAAA,EAAA,EAAA,SAAA,EALlB;AACT,YAAA,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,kBAAkB,EAAE;AAClE,SAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjCH,uNAQA,EAAA,MAAA,EAAA,CAAA,4PAAA,CAAA,EAAA,CAAA,CAAA;;2FD4Ba,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAT9B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,EAAA,SAAA,EAGnB;AACT,wBAAA,EAAE,OAAO,EAAE,mBAAmB,EAAE,WAAW,oBAAoB,EAAE;AAClE,qBAAA,EAAA,UAAA,EACW,IAAI,EAAA,QAAA,EAAA,uNAAA,EAAA,MAAA,EAAA,CAAA,4PAAA,CAAA,EAAA;;0BAsIb;;0BACA;;0BAEA;;0BACA;;sBA1HF;;sBAUA;;sBACA;;sBACA;;sBACA;;sBAaA;;sBACA,WAAW;uBAAC,uBAAuB;;sBAMnC;;sBAaA;;sBASA;;sBAQA;;sBASA;;sBASA,WAAW;uBAAC,mCAAmC;;sBAK/C,WAAW;uBAAC,2BAA2B;;sBAIvC;;sBA+FA,YAAY;uBAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;;sBAiEjC,YAAY;uBAAC,UAAU;;;MErSb,cAAc,CAAA;AAGzB,IAAA,WAAA,CAGU,MAAuB,EAAA;QAAvB,IAAA,CAAA,MAAM,GAAN,MAAM;AAEd,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM;IAC/C;IAEA,SAAS,CAAC,KAAU,EAAE,IAAU,EAAA;QAC9B,IAAI,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE;YAC5B,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC;QACzC;AACA,QAAA,OAAO,KAAK;IACd;IAEQ,WAAW,CAAC,KAAa,EAAE,QAAiB,EAAA;AAClD,QAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,YAAA,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI;QACzB;QACA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,IAAI;AACd,QAAA,MAAM,EAAE,GAAG,QAAQ,IAAI,CAAC;AACxB,QAAA,MAAM,KAAK,GAAG;AACZ,YAAA,IAAI,CAAC,IAAI;AACT,YAAA,GAAG,GAAG,CAAC;AACP,YAAA,GAAG,GAAG,CAAC;AACP,YAAA,GAAG,GAAG,CAAC;AACP,YAAA,GAAG,GAAG,CAAC;AACP,YAAA,GAAG,GAAG,CAAC;AACP,YAAA,GAAG,GAAG,CAAC;AACP,YAAA,GAAG,GAAG,CAAC;AACP,YAAA,GAAG,GAAG,CAAC;SACR;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;IAC1E;AAtCW,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,kBAKf,yBAAyB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GALxB,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE;;0BAKzC;;0BACA,MAAM;2BAAC,yBAAyB;;;MCTxB,aAAa,CAAA;AACxB;;;;;;AAMG;IACH,OAAO,cAAc,CAAC,KAAa,EAAA;QACjC,OAAO,CAAC,OAAwB,KAAmC;AACjE,YAAA,MAAM,IAAI,GACR,OAAO,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC;AACxC,kBAAG,OAAO,CAAC,KAAmB,CAAC;qBAC1B,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AACvB,qBAAA,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,KAAK,GAAG,GAAG,QAAQ,EAAE,CAAC;kBAC9C,CAAC;AAEP,YAAA,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI;AAE7B,YAAA,OAAO;AACL,kBAAE;AACF,kBAAE;AACE,oBAAA,cAAc,EAAE;AACd,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,OAAO,EAAE,KAAK;AACf,qBAAA;iBACF;AACP,QAAA,CAAC;IACH;AAEA;;;;;AAKG;IACH,OAAO,iBAAiB,CAAC,iBAA2B,EAAA;QAClD,OAAO,CAAC,OAAwB,KAA6B;AAC3D,YAAA,MAAM,KAAK,GAAW,OAAO,CAAC;AAC5B,kBAAG,OAAO,CAAC,KAAmB,CAAC;kBAC7B,EAAE;YACN,MAAM,YAAY,GAAW,KAAK,CAAC,MAAM,CACvC,CAAC,IAAI,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CACjD;AAED,YAAA,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3B,OAAO;AACL,oBAAA,iBAAiB,EAAE;AACjB,wBAAA,UAAU,EAAE,iBAAiB;AAC9B,qBAAA;iBACF;YACH;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;IACH;AAEA;;;;;AAKG;IACH,OAAO,YAAY,CAAC,QAAgB,EAAA;QAClC,OAAO,CAAC,OAAwB,KAA6B;AAC3D,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;gBAClB,OAAO;AACL,oBAAA,YAAY,EAAE;AACZ,wBAAA,QAAQ,EAAE,QAAQ;AAClB,wBAAA,WAAW,EAAE,CAAC;AACf,qBAAA;iBACF;YACH;AAEA,YAAA,MAAM,KAAK,GAAY,OAAO,CAAC,KAAmB,CAAC,KAAK;YAExD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE;gBACpC,OAAO;AACL,oBAAA,YAAY,EAAE;AACZ,wBAAA,QAAQ,EAAE,QAAQ;wBAClB,WAAW,EAAE,KAAK,CAAC,MAAM;AAC1B,qBAAA;iBACF;YACH;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;IACH;AAEA;;;;;AAKG;IACH,OAAO,YAAY,CAAC,QAAgB,EAAA;QAClC,OAAO,CAAC,OAAwB,KAA6B;AAC3D,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;AAClB,gBAAA,OAAO,IAAI;YACb;AAEA,YAAA,MAAM,KAAK,GAAW,OAAO,CAAC;AAC5B,kBAAG,OAAO,CAAC,KAAmB,CAAC;kBAC7B,EAAE;YAEN,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE;gBACpC,OAAO;AACL,oBAAA,YAAY,EAAE;AACZ,wBAAA,QAAQ,EAAE,QAAQ;wBAClB,WAAW,EAAE,KAAK,CAAC,MAAM;AAC1B,qBAAA;iBACF;YACH;AAEA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC;IACH;AACD;;ACxHD;;AAEG;AAEH;;ACJA;;AAEG;;;;"}