@ottimis/ng2-file-upload
Version:
Angular file uploader
1 lines • 62.3 kB
Source Map (JSON)
{"version":3,"file":"ottimis-ng2-file-upload.mjs","sources":["../../../../libs/ng2-file-upload/file-upload/file-like-object.class.ts","../../../../libs/ng2-file-upload/file-upload/file-item.class.ts","../../../../libs/ng2-file-upload/file-upload/file-type.class.ts","../../../../libs/ng2-file-upload/file-upload/file-uploader.class.ts","../../../../libs/ng2-file-upload/file-upload/file-drop.directive.ts","../../../../libs/ng2-file-upload/file-upload/file-select.directive.ts","../../../../libs/ng2-file-upload/file-upload/file-upload.module.ts","../../../../libs/ng2-file-upload/ottimis-ng2-file-upload.ts"],"sourcesContent":["export class FileLikeObject {\n lastModifiedDate: any;\n size: any;\n type?: string;\n name?: string;\n rawFile: HTMLInputElement | File;\n\n constructor(fileOrInput: HTMLInputElement | File) {\n this.rawFile = fileOrInput;\n const fakePathOrObject =\n fileOrInput instanceof HTMLInputElement ? fileOrInput.value : fileOrInput;\n const postfix =\n typeof fakePathOrObject === \"string\" ? \"FakePath\" : \"Object\";\n const method = `_createFrom${postfix}`;\n (this as any)[method](fakePathOrObject);\n }\n\n _createFromFakePath(path: string): void {\n this.lastModifiedDate = void 0;\n this.size = void 0;\n this.type = `like/${path.slice(path.lastIndexOf(\".\") + 1).toLowerCase()}`;\n this.name = path.slice(path.lastIndexOf(\"/\") + path.lastIndexOf(\"\\\\\") + 2);\n }\n\n _createFromObject(object: {\n size: number;\n type: string;\n name: string;\n }): void {\n this.size = object.size;\n this.type = object.type;\n this.name = object.name;\n }\n}\n","import { FileLikeObject } from \"./file-like-object.class\";\nimport {\n FileUploader,\n ParsedResponseHeaders,\n FileUploaderOptions,\n} from \"./file-uploader.class\";\n\nexport class FileItem {\n file: FileLikeObject;\n _file: File;\n alias?: string;\n url = \"/\";\n method?: string;\n headers: any = [];\n withCredentials = true;\n formData: any = [];\n isReady = false;\n isUploading = false;\n isUploaded = false;\n isSuccess = false;\n isCancel = false;\n isError = false;\n progress = 0;\n index?: number;\n _xhr?: XMLHttpRequest;\n _form: any;\n\n protected uploader: FileUploader;\n protected some: File;\n protected options: FileUploaderOptions;\n\n constructor(\n uploader: FileUploader,\n some: File,\n options: FileUploaderOptions\n ) {\n this.uploader = uploader;\n this.some = some;\n this.options = options;\n this.file = new FileLikeObject(some);\n this._file = some;\n if (uploader.options) {\n this.method = uploader.options.method || \"POST\";\n this.alias = uploader.options.itemAlias || \"file\";\n }\n this.url = uploader.options.url;\n }\n\n upload(): void {\n try {\n this.uploader.uploadItem(this);\n } catch (e) {\n this.uploader._onCompleteItem(this, \"\", 0, {});\n this.uploader._onErrorItem(this, \"\", 0, {});\n }\n }\n\n cancel(): void {\n this.uploader.cancelItem(this);\n }\n\n remove(): void {\n this.uploader.removeFromQueue(this);\n }\n\n onBeforeUpload(): void {\n return void 0;\n }\n\n onBuildForm(form: any): any {\n return { form };\n }\n\n onProgress(progress: number): any {\n return { progress };\n }\n\n onSuccess(\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): any {\n return { response, status, headers };\n }\n\n onError(\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): any {\n return { response, status, headers };\n }\n\n onCancel(\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): any {\n return { response, status, headers };\n }\n\n onComplete(\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): any {\n return { response, status, headers };\n }\n\n _onBeforeUpload(): void {\n this.isReady = true;\n this.isUploading = true;\n this.isUploaded = false;\n this.isSuccess = false;\n this.isCancel = false;\n this.isError = false;\n this.progress = 0;\n this.onBeforeUpload();\n }\n\n _onBuildForm(form: any): void {\n this.onBuildForm(form);\n }\n\n _onProgress(progress: number): void {\n this.progress = progress;\n this.onProgress(progress);\n }\n\n _onSuccess(\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): void {\n this.isReady = false;\n this.isUploading = false;\n this.isUploaded = true;\n this.isSuccess = true;\n this.isCancel = false;\n this.isError = false;\n this.progress = 100;\n this.index = undefined;\n this.onSuccess(response, status, headers);\n }\n\n _onError(\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): void {\n this.isReady = false;\n this.isUploading = false;\n this.isUploaded = true;\n this.isSuccess = false;\n this.isCancel = false;\n this.isError = true;\n this.progress = 0;\n this.index = undefined;\n this.onError(response, status, headers);\n }\n\n _onCancel(\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): void {\n this.isReady = false;\n this.isUploading = false;\n this.isUploaded = false;\n this.isSuccess = false;\n this.isCancel = true;\n this.isError = false;\n this.progress = 0;\n this.index = undefined;\n this.onCancel(response, status, headers);\n }\n\n _onComplete(\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): void {\n this.onComplete(response, status, headers);\n\n if (this.uploader.options.removeAfterUpload) {\n this.remove();\n }\n }\n\n _prepareToUploading(): void {\n this.index = this.index || ++this.uploader._nextIndex;\n this.isReady = true;\n }\n}\n","import { FileLikeObject } from \"../index\";\n\nexport class FileType {\n /* MS office */\n // tslint:disable-next-line:variable-name\n static mime_doc: string[] = [\n \"application/msword\",\n \"application/msword\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.template\",\n \"application/vnd.ms-word.document.macroEnabled.12\",\n \"application/vnd.ms-word.template.macroEnabled.12\",\n ];\n // tslint:disable-next-line:variable-name\n static mime_xsl: string[] = [\n \"application/vnd.ms-excel\",\n \"application/vnd.ms-excel\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.template\",\n \"application/vnd.ms-excel.sheet.macroEnabled.12\",\n \"application/vnd.ms-excel.template.macroEnabled.12\",\n \"application/vnd.ms-excel.addin.macroEnabled.12\",\n \"application/vnd.ms-excel.sheet.binary.macroEnabled.12\",\n ];\n // tslint:disable-next-line:variable-name\n static mime_ppt: string[] = [\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.ms-powerpoint\",\n \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\n \"application/vnd.openxmlformats-officedocument.presentationml.template\",\n \"application/vnd.openxmlformats-officedocument.presentationml.slideshow\",\n \"application/vnd.ms-powerpoint.addin.macroEnabled.12\",\n \"application/vnd.ms-powerpoint.presentation.macroEnabled.12\",\n \"application/vnd.ms-powerpoint.presentation.macroEnabled.12\",\n \"application/vnd.ms-powerpoint.slideshow.macroEnabled.12\",\n ];\n\n /* PSD */\n // tslint:disable-next-line:variable-name\n static mime_psd: string[] = [\n \"image/photoshop\",\n \"image/x-photoshop\",\n \"image/psd\",\n \"application/photoshop\",\n \"application/psd\",\n \"zz-application/zz-winassoc-psd\",\n ];\n\n /* Compressed files */\n // tslint:disable-next-line:variable-name\n static mime_compress: string[] = [\n \"application/x-gtar\",\n \"application/x-gcompress\",\n \"application/compress\",\n \"application/x-tar\",\n \"application/x-rar-compressed\",\n \"application/octet-stream\",\n \"application/x-zip-compressed\",\n \"application/zip-compressed\",\n \"application/x-7z-compressed\",\n \"application/gzip\",\n \"application/x-bzip2\",\n ];\n\n static getMimeClass(file: FileLikeObject): string {\n let mimeClass = \"application\";\n if (file?.type && this.mime_psd.indexOf(file.type) !== -1) {\n mimeClass = \"image\";\n } else if (file?.type?.match(\"image.*\")) {\n mimeClass = \"image\";\n } else if (file?.type?.match(\"video.*\")) {\n mimeClass = \"video\";\n } else if (file?.type?.match(\"audio.*\")) {\n mimeClass = \"audio\";\n } else if (file?.type === \"application/pdf\") {\n mimeClass = \"pdf\";\n } else if (file?.type && this.mime_compress.indexOf(file.type) !== -1) {\n mimeClass = \"compress\";\n } else if (file?.type && this.mime_doc.indexOf(file.type) !== -1) {\n mimeClass = \"doc\";\n } else if (file?.type && this.mime_xsl.indexOf(file.type) !== -1) {\n mimeClass = \"xls\";\n } else if (file?.type && this.mime_ppt.indexOf(file.type) !== -1) {\n mimeClass = \"ppt\";\n }\n if (mimeClass === \"application\" && file?.name) {\n mimeClass = this.fileTypeDetection(file.name);\n }\n\n return mimeClass;\n }\n\n static fileTypeDetection(inputFilename: string): string {\n const types: { [key: string]: string } = {\n jpg: \"image\",\n jpeg: \"image\",\n tif: \"image\",\n psd: \"image\",\n bmp: \"image\",\n png: \"image\",\n nef: \"image\",\n tiff: \"image\",\n cr2: \"image\",\n dwg: \"image\",\n cdr: \"image\",\n ai: \"image\",\n indd: \"image\",\n pin: \"image\",\n cdp: \"image\",\n skp: \"image\",\n stp: \"image\",\n \"3dm\": \"image\",\n mp3: \"audio\",\n wav: \"audio\",\n wma: \"audio\",\n mod: \"audio\",\n m4a: \"audio\",\n compress: \"compress\",\n zip: \"compress\",\n rar: \"compress\",\n \"7z\": \"compress\",\n lz: \"compress\",\n z01: \"compress\",\n bz2: \"compress\",\n gz: \"compress\",\n pdf: \"pdf\",\n xls: \"xls\",\n xlsx: \"xls\",\n ods: \"xls\",\n mp4: \"video\",\n avi: \"video\",\n wmv: \"video\",\n mpg: \"video\",\n mts: \"video\",\n flv: \"video\",\n \"3gp\": \"video\",\n vob: \"video\",\n m4v: \"video\",\n mpeg: \"video\",\n m2ts: \"video\",\n mov: \"video\",\n doc: \"doc\",\n docx: \"doc\",\n eps: \"doc\",\n txt: \"doc\",\n odt: \"doc\",\n rtf: \"doc\",\n ppt: \"ppt\",\n pptx: \"ppt\",\n pps: \"ppt\",\n ppsx: \"ppt\",\n odp: \"ppt\",\n };\n\n const chunks = inputFilename.split(\".\");\n if (chunks.length < 2) {\n return \"application\";\n }\n const extension = chunks[chunks.length - 1].toLowerCase();\n if (types[extension] === undefined) {\n return \"application\";\n } else {\n return types[extension];\n }\n }\n}\n","import { EventEmitter } from \"@angular/core\";\nimport { FileLikeObject } from \"./file-like-object.class\";\nimport { FileItem } from \"./file-item.class\";\nimport { FileType } from \"./file-type.class\";\n\nfunction isFile(value: any): boolean {\n return File && value instanceof File;\n}\n\nexport interface Headers {\n name: string;\n value: string;\n}\n\nexport interface ParsedResponseHeaders {\n [headerFieldName: string]: string;\n}\n\nexport interface FilterFunction {\n name: string;\n fn(item: FileLikeObject, options?: FileUploaderOptions): boolean;\n}\n\nexport interface FileUploaderOptions {\n allowedMimeType?: string[];\n allowedFileType?: string[];\n autoUpload?: boolean;\n isHTML5?: boolean;\n filters?: FilterFunction[];\n headers?: Headers[];\n method?: string;\n authToken?: string;\n maxFileSize?: number;\n queueLimit?: number;\n removeAfterUpload?: boolean;\n url: string;\n disableMultipart?: boolean;\n itemAlias?: string;\n authTokenHeader?: string;\n additionalParameter?: { [key: string]: any };\n parametersBeforeFiles?: boolean;\n // eslint-disable-next-line @typescript-eslint/ban-types\n formatDataFunction?: Function;\n formatDataFunctionIsAsync?: boolean;\n}\n\nexport class FileUploader {\n authToken?: string;\n isUploading = false;\n queue: FileItem[] = [];\n progress = 0;\n _nextIndex = 0;\n autoUpload: any;\n authTokenHeader?: string;\n response: EventEmitter<any>;\n\n options: FileUploaderOptions = {\n autoUpload: false,\n isHTML5: true,\n filters: [],\n removeAfterUpload: false,\n disableMultipart: false,\n formatDataFunction: (item: FileItem) => item._file,\n formatDataFunctionIsAsync: false,\n url: \"\",\n };\n\n protected _failFilterIndex?: number;\n\n constructor(options: FileUploaderOptions) {\n this.setOptions(options);\n this.response = new EventEmitter<string>();\n }\n\n setOptions(options: FileUploaderOptions): void {\n this.options = Object.assign(this.options, options);\n\n this.authToken = this.options.authToken;\n this.authTokenHeader = this.options.authTokenHeader || \"Authorization\";\n this.autoUpload = this.options.autoUpload;\n this.options.filters?.unshift({\n name: \"queueLimit\",\n fn: this._queueLimitFilter,\n });\n\n if (this.options.maxFileSize) {\n this.options.filters?.unshift({\n name: \"fileSize\",\n fn: this._fileSizeFilter,\n });\n }\n\n if (this.options.allowedFileType) {\n this.options.filters?.unshift({\n name: \"fileType\",\n fn: this._fileTypeFilter,\n });\n }\n\n if (this.options.allowedMimeType) {\n this.options.filters?.unshift({\n name: \"mimeType\",\n fn: this._mimeTypeFilter,\n });\n }\n\n for (let i = 0; i < this.queue.length; i++) {\n this.queue[i].url = this.options.url;\n }\n }\n\n addToQueue(\n files: File[],\n _options?: FileUploaderOptions,\n filters?: [] | string\n ): void {\n let options = _options;\n const list: File[] = [];\n for (const file of files) {\n list.push(file);\n }\n const arrayOfFilters = this._getFilters(filters);\n const count = this.queue.length;\n const addedFileItems: FileItem[] = [];\n list.map((some: File) => {\n if (!options) {\n options = this.options;\n }\n\n const temp = new FileLikeObject(some);\n if (this._isValidFile(temp, arrayOfFilters, options)) {\n const fileItem = new FileItem(this, some, options);\n addedFileItems.push(fileItem);\n this.queue.push(fileItem);\n this._onAfterAddingFile(fileItem);\n } else {\n if (this._failFilterIndex) {\n const filter = arrayOfFilters[this._failFilterIndex];\n this._onWhenAddingFileFailed(temp, filter, options);\n }\n }\n });\n if (this.queue.length !== count) {\n this._onAfterAddingAll(addedFileItems);\n this.progress = this._getTotalProgress();\n }\n this._render();\n if (this.options.autoUpload) {\n this.uploadAll();\n }\n }\n\n removeFromQueue(value: FileItem): void {\n const index = this.getIndexOfItem(value);\n const item = this.queue[index];\n if (item.isUploading) {\n item.cancel();\n }\n this.queue.splice(index, 1);\n this.progress = this._getTotalProgress();\n }\n\n clearQueue(): void {\n while (this.queue.length) {\n this.queue[0].remove();\n }\n this.progress = 0;\n }\n\n uploadItem(value: FileItem): void {\n const index = this.getIndexOfItem(value);\n const item = this.queue[index];\n const transport = this.options.isHTML5\n ? \"_xhrTransport\"\n : \"_iframeTransport\";\n item._prepareToUploading();\n if (this.isUploading) {\n return;\n }\n this.isUploading = true;\n (this as any)[transport](item);\n }\n\n cancelItem(value: FileItem): void {\n const index = this.getIndexOfItem(value);\n const item = this.queue[index];\n const prop = this.options.isHTML5 ? item._xhr : item._form;\n if (item && item.isUploading) {\n prop.abort();\n }\n }\n\n uploadAll(): void {\n const items = this.getNotUploadedItems().filter(\n (item: FileItem) => !item.isUploading\n );\n if (!items.length) {\n return;\n }\n items.map((item: FileItem) => item._prepareToUploading());\n items[0].upload();\n }\n\n cancelAll(): void {\n const items = this.getNotUploadedItems();\n items.map((item: FileItem) => item.cancel());\n }\n\n isFile(value: any): boolean {\n return isFile(value);\n }\n\n isFileLikeObject(value: any): boolean {\n return value instanceof FileLikeObject;\n }\n\n getIndexOfItem(value: any): number {\n return typeof value === \"number\" ? value : this.queue.indexOf(value);\n }\n\n getNotUploadedItems(): any[] {\n return this.queue.filter((item: FileItem) => !item.isUploaded);\n }\n\n getReadyItems(): any[] {\n return this.queue\n .filter((item: FileItem) => item.isReady && !item.isUploading)\n .sort((item1: any, item2: any) => item1.index - item2.index);\n }\n\n onAfterAddingAll(fileItems: any): any {\n return { fileItems };\n }\n\n onBuildItemForm(fileItem: FileItem, form: any): any {\n return { fileItem, form };\n }\n\n onAfterAddingFile(fileItem: FileItem): any {\n return { fileItem };\n }\n\n onWhenAddingFileFailed(item: FileLikeObject, filter: any, options: any): any {\n return { item, filter, options };\n }\n\n onBeforeUploadItem(fileItem: FileItem): any {\n return { fileItem };\n }\n\n onProgressItem(fileItem: FileItem, progress: any): any {\n return { fileItem, progress };\n }\n\n onProgressAll(progress: any): any {\n return { progress };\n }\n\n onSuccessItem(\n item: FileItem,\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): any {\n return { item, response, status, headers };\n }\n\n onErrorItem(\n item: FileItem,\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): any {\n return { item, response, status, headers };\n }\n\n onCancelItem(\n item: FileItem,\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): any {\n return { item, response, status, headers };\n }\n\n onCompleteItem(\n item: FileItem,\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): any {\n return { item, response, status, headers };\n }\n\n onCompleteAll(): any {\n return void 0;\n }\n\n _mimeTypeFilter(item: FileLikeObject): boolean {\n return !(\n item?.type &&\n this.options.allowedMimeType &&\n this.options.allowedMimeType?.indexOf(item.type) === -1\n );\n }\n\n _fileSizeFilter(item: FileLikeObject): boolean {\n return !(this.options.maxFileSize && item.size > this.options.maxFileSize);\n }\n\n _fileTypeFilter(item: FileLikeObject): boolean {\n return !(\n this.options.allowedFileType &&\n this.options.allowedFileType.indexOf(FileType.getMimeClass(item)) === -1\n );\n }\n\n _onErrorItem(\n item: FileItem,\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): void {\n item._onError(response, status, headers);\n this.onErrorItem(item, response, status, headers);\n }\n\n _onCompleteItem(\n item: FileItem,\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): void {\n item._onComplete(response, status, headers);\n this.onCompleteItem(item, response, status, headers);\n const nextItem = this.getReadyItems()[0];\n this.isUploading = false;\n if (nextItem) {\n nextItem.upload();\n\n return;\n }\n this.onCompleteAll();\n this.progress = this._getTotalProgress();\n this._render();\n }\n\n protected _headersGetter(parsedHeaders: ParsedResponseHeaders): any {\n return (name: any): any => {\n if (name) {\n return parsedHeaders[name.toLowerCase()] || undefined;\n }\n\n return parsedHeaders;\n };\n }\n\n protected _xhrTransport(item: FileItem): any {\n // tslint:disable-next-line:no-this-assignment\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n const xhr = (item._xhr = new XMLHttpRequest());\n let sendable: any;\n this._onBeforeUploadItem(item);\n\n if (typeof item._file.size !== \"number\") {\n throw new TypeError(\"The file specified is no longer valid\");\n }\n if (!this.options.disableMultipart) {\n sendable = new FormData();\n this._onBuildItemForm(item, sendable);\n const appendFile = () =>\n sendable.append(item.alias, item._file, item.file.name);\n if (!this.options.parametersBeforeFiles) {\n appendFile();\n }\n\n // For AWS, Additional Parameters must come BEFORE Files\n if (this.options.additionalParameter !== undefined) {\n Object.keys(this.options.additionalParameter).forEach((key: string) => {\n let paramVal = this.options.additionalParameter?.[key];\n // Allow an additional parameter to include the filename\n if (\n typeof paramVal === \"string\" &&\n paramVal.indexOf(\"{{file_name}}\") >= 0 &&\n item.file?.name\n ) {\n paramVal = paramVal.replace(\"{{file_name}}\", item.file.name);\n }\n sendable.append(key, paramVal);\n });\n }\n\n if (appendFile && this.options.parametersBeforeFiles) {\n appendFile();\n }\n } else {\n if (this.options.formatDataFunction) {\n sendable = this.options.formatDataFunction(item);\n }\n }\n\n xhr.upload.onprogress = (event: any) => {\n const progress = Math.round(\n event.lengthComputable ? (event.loaded * 100) / event.total : 0\n );\n this._onProgressItem(item, progress);\n };\n xhr.onload = () => {\n const headers = this._parseHeaders(xhr.getAllResponseHeaders());\n const response = this._transformResponse(xhr.response, headers);\n const gist = this._isSuccessCode(xhr.status) ? \"Success\" : \"Error\";\n const method = `_on${gist}Item`;\n (this as any)[method](item, response, xhr.status, headers);\n this._onCompleteItem(item, response, xhr.status, headers);\n };\n xhr.onerror = () => {\n const headers = this._parseHeaders(xhr.getAllResponseHeaders());\n const response = this._transformResponse(xhr.response, headers);\n this._onErrorItem(item, response, xhr.status, headers);\n this._onCompleteItem(item, response, xhr.status, headers);\n };\n xhr.onabort = () => {\n const headers = this._parseHeaders(xhr.getAllResponseHeaders());\n const response = this._transformResponse(xhr.response, headers);\n this._onCancelItem(item, response, xhr.status, headers);\n this._onCompleteItem(item, response, xhr.status, headers);\n };\n if (item.method && item.url) {\n xhr.open(item.method, item.url, true);\n }\n xhr.withCredentials = item.withCredentials;\n if (this.options.headers) {\n for (const header of this.options.headers) {\n xhr.setRequestHeader(header.name, header.value);\n }\n }\n if (item.headers.length) {\n for (const header of item.headers) {\n xhr.setRequestHeader(header.name, header.value);\n }\n }\n if (this.authToken && this.authTokenHeader) {\n xhr.setRequestHeader(this.authTokenHeader, this.authToken);\n }\n xhr.onreadystatechange = function () {\n if (xhr.readyState == XMLHttpRequest.DONE) {\n that.response.emit(xhr.responseText);\n }\n };\n if (this.options.formatDataFunctionIsAsync) {\n sendable.then((result: any) => xhr.send(JSON.stringify(result)));\n } else {\n xhr.send(sendable);\n }\n this._render();\n }\n\n protected _getTotalProgress(value = 0): number {\n if (this.options.removeAfterUpload) {\n return value;\n }\n const notUploaded = this.getNotUploadedItems().length;\n const uploaded = notUploaded\n ? this.queue.length - notUploaded\n : this.queue.length;\n const ratio = 100 / this.queue.length;\n const current = (value * ratio) / 100;\n return Math.round(uploaded * ratio + current);\n }\n\n protected _getFilters(\n filters?: FilterFunction[] | string\n ): FilterFunction[] | [] {\n if (!filters) {\n return this.options?.filters || [];\n }\n if (Array.isArray(filters)) {\n return filters;\n }\n if (typeof filters === \"string\") {\n const names = filters.match(/[^\\s,]+/g);\n\n return (\n this.options?.filters ||\n [].filter((filter: any) => names?.indexOf(filter.name) !== -1)\n );\n }\n\n return this.options?.filters || [];\n }\n\n protected _render(): any {\n return void 0;\n }\n\n protected _queueLimitFilter(): boolean {\n return (\n this.options.queueLimit === undefined ||\n this.queue.length < this.options.queueLimit\n );\n }\n\n protected _isValidFile(\n file: FileLikeObject,\n filters: FilterFunction[],\n options: FileUploaderOptions\n ): boolean {\n this._failFilterIndex = -1;\n\n return !filters.length\n ? true\n : filters.every((filter: FilterFunction) => {\n if (this._failFilterIndex) {\n this._failFilterIndex++;\n }\n\n return filter.fn.call(this, file, options);\n });\n }\n\n protected _isSuccessCode(status: number): boolean {\n return (status >= 200 && status < 300) || status === 304;\n }\n\n protected _transformResponse(\n response: string,\n headers: ParsedResponseHeaders\n ): string {\n return response;\n }\n\n protected _parseHeaders(headers: string): ParsedResponseHeaders {\n const parsed: any = {};\n let key: any;\n let val: any;\n let i: any;\n if (!headers) {\n return parsed;\n }\n headers.split(\"\\n\").map((line: any) => {\n i = line.indexOf(\":\");\n key = line.slice(0, i).trim().toLowerCase();\n val = line.slice(i + 1).trim();\n if (key) {\n parsed[key] = parsed[key] ? parsed[key] + \", \" + val : val;\n }\n });\n\n return parsed;\n }\n\n protected _onWhenAddingFileFailed(\n item: FileLikeObject,\n filter: any,\n options: any\n ): void {\n this.onWhenAddingFileFailed(item, filter, options);\n }\n\n protected _onAfterAddingFile(item: FileItem): void {\n this.onAfterAddingFile(item);\n }\n\n protected _onAfterAddingAll(items: any): void {\n this.onAfterAddingAll(items);\n }\n\n protected _onBeforeUploadItem(item: FileItem): void {\n item._onBeforeUpload();\n this.onBeforeUploadItem(item);\n }\n\n protected _onBuildItemForm(item: FileItem, form: any): void {\n item._onBuildForm(form);\n this.onBuildItemForm(item, form);\n }\n\n protected _onProgressItem(item: FileItem, progress: any): void {\n const total = this._getTotalProgress(progress);\n this.progress = total;\n item._onProgress(progress);\n this.onProgressItem(item, progress);\n this.onProgressAll(total);\n this._render();\n }\n\n protected _onSuccessItem(\n item: FileItem,\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): void {\n item._onSuccess(response, status, headers);\n this.onSuccessItem(item, response, status, headers);\n }\n\n protected _onCancelItem(\n item: FileItem,\n response: string,\n status: number,\n headers: ParsedResponseHeaders\n ): void {\n item._onCancel(response, status, headers);\n this.onCancelItem(item, response, status, headers);\n }\n}\n","import {\n Directive,\n EventEmitter,\n ElementRef,\n HostListener,\n Input,\n Output,\n} from \"@angular/core\";\n\nimport { FileUploader, FileUploaderOptions } from \"./file-uploader.class\";\n\n@Directive({ selector: \"[ng2FileDrop]\" })\nexport class FileDropDirective {\n @Input() uploader?: FileUploader;\n @Output() fileOver: EventEmitter<any> = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output() onFileDrop: EventEmitter<File[]> = new EventEmitter<File[]>();\n\n protected element: ElementRef;\n\n constructor(element: ElementRef) {\n this.element = element;\n }\n\n getOptions(): FileUploaderOptions | void {\n return this.uploader?.options;\n }\n\n getFilters(): string {\n return \"\";\n }\n\n @HostListener(\"drop\", [\"$event\"])\n onDrop(event: MouseEvent): void {\n const transfer = this._getTransfer(event);\n if (!transfer) {\n return;\n }\n\n const options = this.getOptions();\n const filters = this.getFilters();\n this._preventAndStop(event);\n if (options) {\n this.uploader?.addToQueue(transfer.files, options, filters);\n }\n this.fileOver.emit(false);\n this.onFileDrop.emit(transfer.files);\n }\n\n @HostListener(\"dragover\", [\"$event\"])\n onDragOver(event: MouseEvent): void {\n const transfer = this._getTransfer(event);\n if (!this._haveFiles(transfer.types)) {\n return;\n }\n\n transfer.dropEffect = \"copy\";\n this._preventAndStop(event);\n this.fileOver.emit(true);\n }\n\n @HostListener(\"dragleave\", [\"$event\"])\n onDragLeave(event: MouseEvent): void {\n if ((this as any).element) {\n if (event.currentTarget === (this as any).element[0]) {\n return;\n }\n }\n\n this._preventAndStop(event);\n this.fileOver.emit(false);\n }\n\n protected _getTransfer(event: any): any {\n return event.dataTransfer\n ? event.dataTransfer\n : event.originalEvent.dataTransfer; // jQuery fix;\n }\n\n protected _preventAndStop(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n }\n\n protected _haveFiles(types: any): boolean {\n if (!types) {\n return false;\n }\n\n if (types.indexOf) {\n return types.indexOf(\"Files\") !== -1;\n } else if (types.contains) {\n return types.contains(\"Files\");\n } else {\n return false;\n }\n }\n}\n","import {\n Directive,\n EventEmitter,\n ElementRef,\n Input,\n HostListener,\n Output,\n} from \"@angular/core\";\n\nimport { FileUploader, FileUploaderOptions } from \"./file-uploader.class\";\n\n@Directive({ selector: \"[ng2FileSelect]\" })\nexport class FileSelectDirective {\n @Input() uploader?: FileUploader;\n // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n @Output() onFileSelected: EventEmitter<File[]> = new EventEmitter<File[]>();\n\n protected element: ElementRef;\n\n constructor(element: ElementRef) {\n this.element = element;\n }\n\n getOptions(): FileUploaderOptions | undefined {\n return this.uploader?.options;\n }\n\n getFilters(): string {\n return \"\";\n }\n\n isEmptyAfterSelection(): boolean {\n return !!this.element.nativeElement.attributes.multiple;\n }\n\n @HostListener(\"change\")\n onChange(): void {\n const files = this.element.nativeElement.files;\n const options = this.getOptions();\n const filters = this.getFilters();\n this.uploader?.addToQueue(files, options, filters);\n\n this.onFileSelected.emit(files);\n if (this.isEmptyAfterSelection()) {\n this.element.nativeElement.value = \"\";\n }\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { FileDropDirective } from \"./file-drop.directive\";\nimport { FileSelectDirective } from \"./file-select.directive\";\n\n@NgModule({\n imports: [CommonModule],\n declarations: [FileDropDirective, FileSelectDirective],\n exports: [FileDropDirective, FileSelectDirective],\n})\nexport class FileUploadModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAAa,cAAc,CAAA;AAOzB,IAAA,WAAA,CAAY,WAAoC,EAAA;AAC9C,QAAA,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC;AAC3B,QAAA,MAAM,gBAAgB,GACpB,WAAW,YAAY,gBAAgB,GAAG,WAAW,CAAC,KAAK,GAAG,WAAW,CAAC;AAC5E,QAAA,MAAM,OAAO,GACX,OAAO,gBAAgB,KAAK,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;AAC/D,QAAA,MAAM,MAAM,GAAG,CAAc,WAAA,EAAA,OAAO,EAAE,CAAC;AACtC,QAAA,IAAY,CAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;KACzC;AAED,IAAA,mBAAmB,CAAC,IAAY,EAAA;AAC9B,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC;AAC/B,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,CAAA,KAAA,EAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;KAC5E;AAED,IAAA,iBAAiB,CAAC,MAIjB,EAAA;AACC,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;KACzB;AACF;;MC1BY,QAAQ,CAAA;AAwBnB,IAAA,WAAA,CACE,QAAsB,EACtB,IAAU,EACV,OAA4B,EAAA;QAvB9B,IAAG,CAAA,GAAA,GAAG,GAAG,CAAC;QAEV,IAAO,CAAA,OAAA,GAAQ,EAAE,CAAC;QAClB,IAAe,CAAA,eAAA,GAAG,IAAI,CAAC;QACvB,IAAQ,CAAA,QAAA,GAAQ,EAAE,CAAC;QACnB,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;QAChB,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;QACpB,IAAU,CAAA,UAAA,GAAG,KAAK,CAAC;QACnB,IAAS,CAAA,SAAA,GAAG,KAAK,CAAC;QAClB,IAAQ,CAAA,QAAA,GAAG,KAAK,CAAC;QACjB,IAAO,CAAA,OAAA,GAAG,KAAK,CAAC;QAChB,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAC;AAcX,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;AACrC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,QAAQ,CAAC,OAAO,EAAE;YACpB,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;YAChD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;AACnD,SAAA;QACD,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;KACjC;IAED,MAAM,GAAA;QACJ,IAAI;AACF,YAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAChC,SAAA;AAAC,QAAA,OAAO,CAAC,EAAE;AACV,YAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7C,SAAA;KACF;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;KAChC;IAED,MAAM,GAAA;AACJ,QAAA,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;KACrC;IAED,cAAc,GAAA;QACZ,OAAO,KAAK,CAAC,CAAC;KACf;AAED,IAAA,WAAW,CAAC,IAAS,EAAA;QACnB,OAAO,EAAE,IAAI,EAAE,CAAC;KACjB;AAED,IAAA,UAAU,CAAC,QAAgB,EAAA;QACzB,OAAO,EAAE,QAAQ,EAAE,CAAC;KACrB;AAED,IAAA,SAAS,CACP,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;AAE9B,QAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KACtC;AAED,IAAA,OAAO,CACL,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;AAE9B,QAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KACtC;AAED,IAAA,QAAQ,CACN,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;AAE9B,QAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KACtC;AAED,IAAA,UAAU,CACR,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;AAE9B,QAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KACtC;IAED,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;QAClB,IAAI,CAAC,cAAc,EAAE,CAAC;KACvB;AAED,IAAA,YAAY,CAAC,IAAS,EAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KACxB;AAED,IAAA,WAAW,CAAC,QAAgB,EAAA;AAC1B,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;KAC3B;AAED,IAAA,UAAU,CACR,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;AAE9B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;KAC3C;AAED,IAAA,QAAQ,CACN,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;AAE9B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;KACzC;AAED,IAAA,SAAS,CACP,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;AAE9B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;AACxB,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;AACrB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;AAClB,QAAA,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;KAC1C;AAED,IAAA,WAAW,CACT,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;QAE9B,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C,QAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,EAAE;YAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;AACf,SAAA;KACF;IAED,mBAAmB,GAAA;AACjB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AACtD,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;KACrB;AACF;;MC/LY,QAAQ,CAAA;IAiEnB,OAAO,YAAY,CAAC,IAAoB,EAAA;QACtC,IAAI,SAAS,GAAG,aAAa,CAAC;AAC9B,QAAA,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACzD,SAAS,GAAG,OAAO,CAAC;AACrB,SAAA;aAAM,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;YACvC,SAAS,GAAG,OAAO,CAAC;AACrB,SAAA;aAAM,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;YACvC,SAAS,GAAG,OAAO,CAAC;AACrB,SAAA;aAAM,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;YACvC,SAAS,GAAG,OAAO,CAAC;AACrB,SAAA;AAAM,aAAA,IAAI,IAAI,EAAE,IAAI,KAAK,iBAAiB,EAAE;YAC3C,SAAS,GAAG,KAAK,CAAC;AACnB,SAAA;AAAM,aAAA,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YACrE,SAAS,GAAG,UAAU,CAAC;AACxB,SAAA;AAAM,aAAA,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAChE,SAAS,GAAG,KAAK,CAAC;AACnB,SAAA;AAAM,aAAA,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAChE,SAAS,GAAG,KAAK,CAAC;AACnB,SAAA;AAAM,aAAA,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE;YAChE,SAAS,GAAG,KAAK,CAAC;AACnB,SAAA;AACD,QAAA,IAAI,SAAS,KAAK,aAAa,IAAI,IAAI,EAAE,IAAI,EAAE;YAC7C,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/C,SAAA;AAED,QAAA,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,iBAAiB,CAAC,aAAqB,EAAA;AAC5C,QAAA,MAAM,KAAK,GAA8B;AACvC,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,EAAE,EAAE,OAAO;AACX,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,QAAQ,EAAE,UAAU;AACpB,YAAA,GAAG,EAAE,UAAU;AACf,YAAA,GAAG,EAAE,UAAU;AACf,YAAA,IAAI,EAAE,UAAU;AAChB,YAAA,EAAE,EAAE,UAAU;AACd,YAAA,GAAG,EAAE,UAAU;AACf,YAAA,GAAG,EAAE,UAAU;AACf,YAAA,EAAE,EAAE,UAAU;AACd,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,GAAG,EAAE,KAAK;AACV,YAAA,IAAI,EAAE,KAAK;AACX,YAAA,GAAG,EAAE,KAAK;SACX,CAAC;QAEF,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACxC,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,YAAA,OAAO,aAAa,CAAC;AACtB,SAAA;AACD,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAC1D,QAAA,IAAI,KAAK,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE;AAClC,YAAA,OAAO,aAAa,CAAC;AACtB,SAAA;AAAM,aAAA;AACL,YAAA,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC;AACzB,SAAA;KACF;;AApKD;AACA;AACO,QAAA,CAAA,QAAQ,GAAa;IAC1B,oBAAoB;IACpB,oBAAoB;IACpB,yEAAyE;IACzE,yEAAyE;IACzE,kDAAkD;IAClD,kDAAkD;CACnD,CAAC;AACF;AACO,QAAA,CAAA,QAAQ,GAAa;IAC1B,0BAA0B;IAC1B,0BAA0B;IAC1B,0BAA0B;IAC1B,mEAAmE;IACnE,sEAAsE;IACtE,gDAAgD;IAChD,mDAAmD;IACnD,gDAAgD;IAChD,uDAAuD;CACxD,CAAC;AACF;AACO,QAAA,CAAA,QAAQ,GAAa;IAC1B,+BAA+B;IAC/B,+BAA+B;IAC/B,+BAA+B;IAC/B,+BAA+B;IAC/B,2EAA2E;IAC3E,uEAAuE;IACvE,wEAAwE;IACxE,qDAAqD;IACrD,4DAA4D;IAC5D,4DAA4D;IAC5D,yDAAyD;CAC1D,CAAC;AAEF;AACA;AACO,QAAA,CAAA,QAAQ,GAAa;IAC1B,iBAAiB;IACjB,mBAAmB;IACnB,WAAW;IACX,uBAAuB;IACvB,iBAAiB;IACjB,gCAAgC;CACjC,CAAC;AAEF;AACA;AACO,QAAA,CAAA,aAAa,GAAa;IAC/B,oBAAoB;IACpB,yBAAyB;IACzB,sBAAsB;IACtB,mBAAmB;IACnB,8BAA8B;IAC9B,0BAA0B;IAC1B,8BAA8B;IAC9B,4BAA4B;IAC5B,6BAA6B;IAC7B,kBAAkB;IAClB,qBAAqB;CACtB;;AC5DH,SAAS,MAAM,CAAC,KAAU,EAAA;AACxB,IAAA,OAAO,IAAI,IAAI,KAAK,YAAY,IAAI,CAAC;AACvC,CAAC;MAuCY,YAAY,CAAA;AAuBvB,IAAA,WAAA,CAAY,OAA4B,EAAA;QArBxC,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;QACpB,IAAK,CAAA,KAAA,GAAe,EAAE,CAAC;QACvB,IAAQ,CAAA,QAAA,GAAG,CAAC,CAAC;QACb,IAAU,CAAA,UAAA,GAAG,CAAC,CAAC;AAKf,QAAA,IAAA,CAAA,OAAO,GAAwB;AAC7B,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,OAAO,EAAE,EAAE;AACX,YAAA,iBAAiB,EAAE,KAAK;AACxB,YAAA,gBAAgB,EAAE,KAAK;YACvB,kBAAkB,EAAE,CAAC,IAAc,KAAK,IAAI,CAAC,KAAK;AAClD,YAAA,yBAAyB,EAAE,KAAK;AAChC,YAAA,GAAG,EAAE,EAAE;SACR,CAAC;AAKA,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACzB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,EAAU,CAAC;KAC5C;AAED,IAAA,UAAU,CAAC,OAA4B,EAAA;AACrC,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACxC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,eAAe,CAAC;QACvE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;AAC1C,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;AAC5B,YAAA,IAAI,EAAE,YAAY;YAClB,EAAE,EAAE,IAAI,CAAC,iBAAiB;AAC3B,SAAA,CAAC,CAAC;AAEH,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;AAC5B,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;AAC5B,gBAAA,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,IAAI,CAAC,eAAe;AACzB,aAAA,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;AAChC,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;AAC5B,gBAAA,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,IAAI,CAAC,eAAe;AACzB,aAAA,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;AAChC,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;AAC5B,gBAAA,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,IAAI,CAAC,eAAe;AACzB,aAAA,CAAC,CAAC;AACJ,SAAA;AAED,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AAC1C,YAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AACtC,SAAA;KACF;AAED,IAAA,UAAU,CACR,KAAa,EACb,QAA8B,EAC9B,OAAqB,EAAA;QAErB,IAAI,OAAO,GAAG,QAAQ,CAAC;QACvB,MAAM,IAAI,GAAW,EAAE,CAAC;AACxB,QAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,SAAA;QACD,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACjD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAChC,MAAM,cAAc,GAAe,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,GAAG,CAAC,CAAC,IAAU,KAAI;YACtB,IAAI,CAAC,OAAO,EAAE;AACZ,gBAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;AACxB,aAAA;AAED,YAAA,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,cAAc,EAAE,OAAO,CAAC,EAAE;gBACpD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACnD,gBAAA,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC9B,gBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC1B,gBAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACnC,aAAA;AAAM,iBAAA;gBACL,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACzB,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;oBACrD,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACrD,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,KAAK,EAAE;AAC/B,YAAA,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;AAC1C,SAAA;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;AACf,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;AAClB,SAAA;KACF;AAED,IAAA,eAAe,CAAC,KAAe,EAAA;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,CAAC,MAAM,EAAE,CAAC;AACf,SAAA;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC5B,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;KAC1C;IAED,UAAU,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACxB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AACxB,SAAA;AACD,QAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;KACnB;AAED,IAAA,UAAU,CAAC,KAAe,EAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO;AACpC,cAAE,eAAe;cACf,kBAAkB,CAAC;QACvB,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,OAAO;AACR,SAAA;AACD,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;AACvB,QAAA,IAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC;KAChC;AAED,IAAA,UAAU,CAAC,KAAe,EAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC/B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;AAC3D,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,WAAW,EAAE;YAC5B,IAAI,CAAC,KAAK,EAAE,CAAC;AACd,SAAA;KACF;IAED,SAAS,GAAA;AACP,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,MAAM,CAC7C,CAAC,IAAc,KAAK,CAAC,IAAI,CAAC,WAAW,CACtC,CAAC;AACF,QAAA,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YACjB,OAAO;AACR,SAAA;AACD,QAAA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAc,KAAK,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;AAC1D,QAAA,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KACnB;IAED,SAAS,GAAA;AACP,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;AACzC,QAAA,KAAK,CAAC,GAAG,CAAC,CAAC,IAAc,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;KAC9C;AAED,IAAA,MAAM,CAAC,KAAU,EAAA;AACf,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;KACtB;AAED,IAAA,gBAAgB,CAAC,KAAU,EAAA;QACzB,OAAO,KAAK,YAAY,cAAc,CAAC;KACxC;AAED,IAAA,cAAc,CAAC,KAAU,EAAA;AACvB,QAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KACtE;IAED,mBAAmB,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAc,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;KAChE;IAED,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,KAAK;AACd,aAAA,MAAM,CAAC,CAAC,IAAc,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AAC7D,aAAA,IAAI,CAAC,CAAC,KAAU,EAAE,KAAU,KAAK,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;KAChE;AAED,IAAA,gBAAgB,CAAC,SAAc,EAAA;QAC7B,OAAO,EAAE,SAAS,EAAE,CAAC;KACtB;IAED,eAAe,CAAC,QAAkB,EAAE,IAAS,EAAA;AAC3C,QAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAC3B;AAED,IAAA,iBAAiB,CAAC,QAAkB,EAAA;QAClC,OAAO,EAAE,QAAQ,EAAE,CAAC;KACrB;AAED,IAAA,sBAAsB,CAAC,IAAoB,EAAE,MAAW,EAAE,OAAY,EAAA;AACpE,QAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KAClC;AAED,IAAA,kBAAkB,CAAC,QAAkB,EAAA;QACnC,OAAO,EAAE,QAAQ,EAAE,CAAC;KACrB;IAED,cAAc,CAAC,QAAkB,EAAE,QAAa,EAAA;AAC9C,QAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;KAC/B;AAED,IAAA,aAAa,CAAC,QAAa,EAAA;QACzB,OAAO,EAAE,QAAQ,EAAE,CAAC;KACrB;AAED,IAAA,aAAa,CACX,IAAc,EACd,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;QAE9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KAC5C;AAED,IAAA,WAAW,CACT,IAAc,EACd,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;QAE9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KAC5C;AAED,IAAA,YAAY,CACV,IAAc,EACd,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;QAE9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KAC5C;AAED,IAAA,cAAc,CACZ,IAAc,EACd,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;QAE9B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;KAC5C;IAED,aAAa,GAAA;QACX,OAAO,KAAK,CAAC,CAAC;KACf;AAED,IAAA,eAAe,CAAC,IAAoB,EAAA;AAClC,QAAA,OAAO,EACL,IAAI,EAAE,IAAI;YACV,IAAI,CAAC,OAAO,CAAC,eAAe;AAC5B,YAAA,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACxD,CAAC;KACH;AAED,IAAA,eAAe,CAAC,IAAoB,EAAA;AAClC,QAAA,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;KAC5E;AAED,IAAA,eAAe,CAAC,IAAoB,EAAA;AAClC,QAAA,OAAO,EACL,IAAI,CAAC,OAAO,CAAC,eAAe;AAC5B,YAAA,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CACzE,CAAC;KACH;AAED,IAAA,YAAY,CACV,IAAc,EACd,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;QAE9B,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;KACnD;AAED,IAAA,eAAe,CACb,IAAc,EACd,QAAgB,EAChB,MAAc,EACd,OAA8B,EAAA;QAE9B,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;AACzB,QAAA,IAAI,QAAQ,EAAE;YACZ,QAAQ,CAAC,MAAM,EAAE,CAAC;YAElB,OAAO;AACR,SAAA;QACD,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;KAChB;AAES,IAAA,cAAc,CAAC,aAAoC,EAAA;QAC3D,OAAO,CAAC,IAAS,KAAS;AACxB,YAAA,IAAI,IAAI,EAAE;gBACR,OAAO,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,SAAS,CAAC;AACvD,aAAA;AAED,YAAA,OAAO,aAAa,CAAC;AACvB,SAAC,CAAC;KACH;AAES,IAAA,aAAa,CAAC,IAAc,EAAA;;;QAGpC,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC,CAAC;AAC/C,QAAA,IAAI,QAAa,CAAC;AAClB,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAE/B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AACvC,YAAA,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;AAC9D,SAAA;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,C