UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

1 lines 61 kB
{"version":3,"file":"ng-zorro-antd-image.mjs","sources":["../../components/image/image-group.component.ts","../../components/image/image-config.ts","../../components/image/utils.ts","../../components/image/image-preview-options.ts","../../components/image/image-preview.component.ts","../../components/image/image-preview-ref.ts","../../components/image/image.service.ts","../../components/image/image.directive.ts","../../components/image/image.module.ts","../../components/image/public-api.ts","../../components/image/ng-zorro-antd-image.ts"],"sourcesContent":["/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { ChangeDetectionStrategy, Component, Input, ViewEncapsulation } from '@angular/core';\n\nimport { NzImageDirective } from './image.directive';\n\n@Component({\n selector: 'nz-image-group',\n exportAs: 'nzImageGroup',\n template: '<ng-content></ng-content>',\n preserveWhitespaces: false,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None\n})\nexport class NzImageGroupComponent {\n @Input() nzScaleStep: number | null = null;\n\n images: NzImageDirective[] = [];\n\n addImage(image: NzImageDirective): void {\n this.images.push(image);\n }\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { NzConfigKey } from 'ng-zorro-antd/core/config';\n\nexport const NZ_CONFIG_MODULE_NAME: NzConfigKey = 'image';\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\n/**\n * fit content details: https://github.com/NG-ZORRO/ng-zorro-antd/pull/6154#issuecomment-745025554\n *\n * calc position x,y point\n *\n * CASE (width <= clientWidth && height <= clientHeight):\n *\n * ------------- clientWidth -------------\n * | |\n * | ------ width ------ |\n * | | | |\n * | | | |\n * client height | |\n * Height | | |\n * | | | |\n * | ------------------- |\n * | |\n * | |\n * ---------------------------------------\n * fixedPosition = { x: 0, y: 0 }\n *\n *\n *\n * CASE (width > clientWidth || height > clientHeight):\n *\n * ------------- clientWidth -------------\n * | | |\n * | top |\n * | | |\n * |--left--|--------------- width -----------------\n * | | |\n * client | |\n * Height | |\n * | | |\n * | | |\n * | height |\n * | | |\n * ---------| |\n * | |\n * | |\n * | |\n * ----------------------------------------\n *\n *\n * - left || top > 0\n * left -> 0 || top -> 0\n *\n * - (left + width) < clientWidth || (top + height) < clientHeight\n * - left | top + width | height < clientWidth | clientHeight -> Back left | top + width | height === clientWidth | clientHeight\n *\n * DEFAULT:\n * - hold position\n *\n */\nexport function getFitContentPosition(params: {\n width: number;\n height: number;\n left: number;\n top: number;\n clientWidth: number;\n clientHeight: number;\n}): { x?: number; y?: number } {\n let fixPos = {};\n\n if (params.width <= params.clientWidth && params.height <= params.clientHeight) {\n fixPos = {\n x: 0,\n y: 0\n };\n }\n\n if (params.width > params.clientWidth || params.height > params.clientHeight) {\n fixPos = {\n x: fitPoint(params.left, params.width, params.clientWidth),\n y: fitPoint(params.top, params.height, params.clientHeight)\n };\n }\n\n return fixPos;\n}\n\nexport function getOffset(node: HTMLElement): { left: number; top: number } {\n const box = node.getBoundingClientRect();\n const docElem = document.documentElement;\n\n // use docElem.scrollLeft to support IE\n return {\n left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || document.body.clientLeft || 0),\n top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || document.body.clientTop || 0)\n };\n}\n\nexport function getClientSize(): { width: number; height: number } {\n const width = document.documentElement.clientWidth;\n const height = window.innerHeight || document.documentElement.clientHeight;\n return {\n width,\n height\n };\n}\n\nfunction fitPoint(start: number, size: number, clientSize: number): number | null {\n const startAddSize = start + size;\n const offsetStart = (size - clientSize) / 2;\n let distance: number | null = null;\n\n if (size > clientSize) {\n if (start > 0) {\n distance = offsetStart;\n }\n if (start < 0 && startAddSize < clientSize) {\n distance = -offsetStart;\n }\n } else {\n if (start < 0 || startAddSize > clientSize) {\n distance = start < 0 ? offsetStart : -offsetStart;\n }\n }\n\n return distance;\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { Direction } from '@angular/cdk/bidi';\n\nexport class NzImagePreviewOptions {\n nzKeyboard?: boolean = true;\n nzNoAnimation?: boolean = false;\n nzMaskClosable?: boolean = true;\n nzCloseOnNavigation?: boolean = true;\n nzZIndex?: number;\n nzZoom?: number;\n nzRotate?: number;\n nzFlipHorizontally?: boolean;\n nzFlipVertically?: boolean;\n nzScaleStep?: number;\n nzDirection?: Direction;\n}\n\nexport interface NzImage {\n src: string;\n srcset?: string;\n alt?: string;\n width?: string | number;\n height?: string | number;\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { AnimationEvent } from '@angular/animations';\nimport { CdkDrag, CdkDragEnd, CdkDragHandle } from '@angular/cdk/drag-drop';\nimport { ESCAPE } from '@angular/cdk/keycodes';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n inject,\n NgZone,\n OnInit,\n ViewChild,\n ViewEncapsulation\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\nimport { filter, takeUntil } from 'rxjs/operators';\n\nimport { fadeMotion } from 'ng-zorro-antd/core/animation';\nimport { NzConfigService } from 'ng-zorro-antd/core/config';\nimport { NzDestroyService } from 'ng-zorro-antd/core/services';\nimport { NzSafeAny } from 'ng-zorro-antd/core/types';\nimport { fromEventOutsideAngular, isNotNil } from 'ng-zorro-antd/core/util';\nimport { NzIconModule } from 'ng-zorro-antd/icon';\n\nimport { NZ_CONFIG_MODULE_NAME } from './image-config';\nimport { NzImage, NzImagePreviewOptions } from './image-preview-options';\nimport { NzImagePreviewRef } from './image-preview-ref';\nimport { NzImageScaleStep, NzImageUrl } from './image.directive';\nimport { getClientSize, getFitContentPosition, getOffset } from './utils';\n\nexport interface NzImageContainerOperation {\n icon: string;\n type: string;\n rotate?: number;\n onClick(): void;\n}\n\nconst initialPosition = {\n x: 0,\n y: 0\n};\n\nexport const NZ_DEFAULT_SCALE_STEP = 0.5;\nconst NZ_DEFAULT_ZOOM = 1;\nconst NZ_DEFAULT_ROTATE = 0;\n\n@Component({\n selector: 'nz-image-preview',\n exportAs: 'nzImagePreview',\n animations: [fadeMotion],\n template: `\n <div class=\"ant-image-preview-mask\"></div>\n\n <div class=\"ant-image-preview-operations-wrapper\">\n @if (images.length > 1) {\n <div\n class=\"ant-image-preview-switch-left\"\n [class.ant-image-preview-switch-left-disabled]=\"index <= 0\"\n (click)=\"onSwitchLeft($event)\"\n >\n <nz-icon nzType=\"left\" nzTheme=\"outline\" />\n </div>\n <div\n class=\"ant-image-preview-switch-right\"\n [class.ant-image-preview-switch-right-disabled]=\"index >= images.length - 1\"\n (click)=\"onSwitchRight($event)\"\n >\n <nz-icon nzType=\"right\" nzTheme=\"outline\" />\n </div>\n }\n\n <ul class=\"ant-image-preview-operations\">\n @if (images.length > 1) {\n <li class=\"ant-image-preview-operations-progress\">{{ index + 1 }} / {{ images.length }}</li>\n }\n\n @for (option of operations; track option) {\n <li\n class=\"ant-image-preview-operations-operation\"\n [class.ant-image-preview-operations-operation-disabled]=\"zoomOutDisabled && option.type === 'zoomOut'\"\n (click)=\"option.onClick()\"\n >\n <nz-icon\n class=\"ant-image-preview-operations-icon\"\n [nzType]=\"option.icon\"\n [nzRotate]=\"option.rotate ?? 0\"\n nzTheme=\"outline\"\n />\n </li>\n }\n </ul>\n </div>\n\n <div\n class=\"ant-image-preview-wrap\"\n tabindex=\"-1\"\n (click)=\"maskClosable && $event.target === $event.currentTarget && onClose()\"\n >\n <div class=\"ant-image-preview\" role=\"dialog\" aria-modal=\"true\">\n <div tabindex=\"0\" aria-hidden=\"true\" class=\"ant-image-preview-focus-trap\"></div>\n <div class=\"ant-image-preview-content\">\n <div class=\"ant-image-preview-body\">\n <div\n class=\"ant-image-preview-img-wrapper\"\n #imagePreviewWrapper\n cdkDrag\n [style.transform]=\"previewImageWrapperTransform\"\n [cdkDragFreeDragPosition]=\"position\"\n (cdkDragEnded)=\"onDragEnd($event)\"\n >\n @for (image of images; track image; let imageIndex = $index) {\n @if (imageIndex === index) {\n <img\n cdkDragHandle\n class=\"ant-image-preview-img\"\n #imgRef\n [attr.src]=\"sanitizerResourceUrl(image.src)\"\n [attr.srcset]=\"image.srcset\"\n [attr.alt]=\"image.alt\"\n [style.width]=\"image.width\"\n [style.height]=\"image.height\"\n [style.transform]=\"previewImageTransform\"\n />\n }\n }\n </div>\n </div>\n </div>\n <div tabindex=\"0\" aria-hidden=\"true\" class=\"ant-image-preview-focus-trap\"></div>\n </div>\n </div>\n `,\n preserveWhitespaces: false,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'ant-image-preview-root',\n '[class.ant-image-preview-moving]': 'isDragging',\n '[style.zIndex]': 'config.nzZIndex',\n '[@.disabled]': 'config.nzNoAnimation',\n '[@fadeMotion]': `visible ? 'enter' : 'leave'`,\n '(@fadeMotion.start)': 'onAnimationStart($event)',\n '(@fadeMotion.done)': 'onAnimationDone($event)'\n },\n imports: [NzIconModule, CdkDragHandle, CdkDrag],\n providers: [NzDestroyService]\n})\nexport class NzImagePreviewComponent implements OnInit {\n readonly _defaultNzZoom = NZ_DEFAULT_ZOOM;\n readonly _defaultNzScaleStep = NZ_DEFAULT_SCALE_STEP;\n readonly _defaultNzRotate = NZ_DEFAULT_ROTATE;\n\n images: NzImage[] = [];\n index = 0;\n isDragging = false;\n visible = true;\n animationStateChanged = new EventEmitter<AnimationEvent>();\n scaleStepMap: Map<NzImageUrl, NzImageScaleStep> = new Map<NzImageUrl, NzImageScaleStep>();\n\n previewImageTransform = '';\n previewImageWrapperTransform = '';\n operations: NzImageContainerOperation[] = [\n {\n icon: 'close',\n onClick: () => {\n this.onClose();\n },\n type: 'close'\n },\n {\n icon: 'zoom-in',\n onClick: () => {\n this.onZoomIn();\n },\n type: 'zoomIn'\n },\n {\n icon: 'zoom-out',\n onClick: () => {\n this.onZoomOut();\n },\n type: 'zoomOut'\n },\n {\n icon: 'rotate-right',\n onClick: () => {\n this.onRotateRight();\n },\n type: 'rotateRight'\n },\n {\n icon: 'rotate-left',\n onClick: () => {\n this.onRotateLeft();\n },\n type: 'rotateLeft'\n },\n {\n icon: 'swap',\n onClick: () => {\n this.onHorizontalFlip();\n },\n type: 'flipHorizontally'\n },\n {\n icon: 'swap',\n onClick: () => {\n this.onVerticalFlip();\n },\n type: 'flipVertically',\n rotate: 90\n }\n ];\n\n zoomOutDisabled = false;\n position = { ...initialPosition };\n previewRef!: NzImagePreviewRef;\n closeClick = new EventEmitter<void>();\n\n @ViewChild('imgRef') imageRef!: ElementRef<HTMLImageElement>;\n @ViewChild('imagePreviewWrapper', { static: true }) imagePreviewWrapper!: ElementRef<HTMLElement>;\n\n private document = inject(DOCUMENT);\n private zoom: number;\n private rotate: number;\n private scaleStep: number;\n private flipHorizontally: boolean;\n private flipVertically: boolean;\n\n get animationDisabled(): boolean {\n return this.config.nzNoAnimation ?? false;\n }\n\n get maskClosable(): boolean {\n const defaultConfig: NzSafeAny = this.nzConfigService.getConfigForComponent(NZ_CONFIG_MODULE_NAME) || {};\n return this.config.nzMaskClosable ?? defaultConfig.nzMaskClosable ?? true;\n }\n\n constructor(\n private ngZone: NgZone,\n private cdr: ChangeDetectorRef,\n public nzConfigService: NzConfigService,\n public config: NzImagePreviewOptions,\n private destroy$: NzDestroyService,\n private sanitizer: DomSanitizer\n ) {\n this.zoom = this.config.nzZoom ?? this._defaultNzZoom;\n this.scaleStep = this.config.nzScaleStep ?? this._defaultNzScaleStep;\n this.rotate = this.config.nzRotate ?? this._defaultNzRotate;\n this.flipHorizontally = this.config.nzFlipHorizontally ?? false;\n this.flipVertically = this.config.nzFlipVertically ?? false;\n this.updateZoomOutDisabled();\n this.updatePreviewImageTransform();\n this.updatePreviewImageWrapperTransform();\n }\n\n ngOnInit(): void {\n fromEventOutsideAngular(this.imagePreviewWrapper.nativeElement, 'mousedown')\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => {\n this.isDragging = true;\n });\n\n fromEventOutsideAngular<WheelEvent>(this.imagePreviewWrapper.nativeElement, 'wheel')\n .pipe(takeUntil(this.destroy$))\n .subscribe(event => {\n this.ngZone.run(() => this.wheelZoomEventHandler(event));\n });\n\n fromEventOutsideAngular<KeyboardEvent>(this.document, 'keydown')\n .pipe(\n filter(event => event.keyCode === ESCAPE),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.ngZone.run(() => {\n this.onClose();\n this.markForCheck();\n });\n });\n }\n\n setImages(images: NzImage[], scaleStepMap?: Map<string, number>): void {\n if (scaleStepMap) this.scaleStepMap = scaleStepMap;\n this.images = images;\n this.markForCheck();\n }\n\n switchTo(index: number): void {\n this.index = index;\n this.markForCheck();\n }\n\n next(): void {\n if (this.index < this.images.length - 1) {\n this.reset();\n this.index++;\n this.updatePreviewImageTransform();\n this.updatePreviewImageWrapperTransform();\n this.updateZoomOutDisabled();\n this.markForCheck();\n }\n }\n\n prev(): void {\n if (this.index > 0) {\n this.reset();\n this.index--;\n this.updatePreviewImageTransform();\n this.updatePreviewImageWrapperTransform();\n this.updateZoomOutDisabled();\n this.markForCheck();\n }\n }\n\n markForCheck(): void {\n this.cdr.markForCheck();\n }\n\n onClose(): void {\n this.visible = false;\n this.closeClick.emit();\n }\n\n onZoomIn(): void {\n const zoomStep =\n this.scaleStepMap.get(this.images[this.index].src ?? this.images[this.index].srcset) ?? this.scaleStep;\n this.zoom += zoomStep;\n this.updatePreviewImageTransform();\n this.updateZoomOutDisabled();\n }\n\n onZoomOut(): void {\n if (this.zoom > 1) {\n const zoomStep =\n this.scaleStepMap.get(this.images[this.index].src ?? this.images[this.index].srcset) ?? this.scaleStep;\n this.zoom -= zoomStep;\n this.updatePreviewImageTransform();\n this.updateZoomOutDisabled();\n\n if (this.zoom <= 1) {\n this.reCenterImage();\n }\n }\n }\n\n onRotateRight(): void {\n this.rotate += 90;\n this.updatePreviewImageTransform();\n }\n\n onRotateLeft(): void {\n this.rotate -= 90;\n this.updatePreviewImageTransform();\n }\n\n onSwitchLeft(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.prev();\n }\n\n onSwitchRight(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.next();\n }\n\n onHorizontalFlip(): void {\n this.flipHorizontally = !this.flipHorizontally;\n this.updatePreviewImageTransform();\n }\n\n onVerticalFlip(): void {\n this.flipVertically = !this.flipVertically;\n this.updatePreviewImageTransform();\n }\n\n wheelZoomEventHandler(event: WheelEvent): void {\n event.preventDefault();\n event.stopPropagation();\n\n this.handlerImageTransformationWhileZoomingWithMouse(event, event.deltaY);\n this.handleImageScaleWhileZoomingWithMouse(event.deltaY);\n\n this.updatePreviewImageWrapperTransform();\n this.updatePreviewImageTransform();\n\n this.markForCheck();\n }\n\n onAnimationStart(event: AnimationEvent): void {\n this.animationStateChanged.emit(event);\n }\n\n onAnimationDone(event: AnimationEvent): void {\n this.animationStateChanged.emit(event);\n }\n\n onDragEnd(event: CdkDragEnd): void {\n this.isDragging = false;\n const width = this.imageRef.nativeElement.offsetWidth * this.zoom;\n const height = this.imageRef.nativeElement.offsetHeight * this.zoom;\n const { left, top } = getOffset(this.imageRef.nativeElement);\n const { width: clientWidth, height: clientHeight } = getClientSize();\n const isRotate = this.rotate % 180 !== 0;\n const fitContentParams = {\n width: isRotate ? height : width,\n height: isRotate ? width : height,\n left,\n top,\n clientWidth,\n clientHeight\n };\n const fitContentPos = getFitContentPosition(fitContentParams);\n if (isNotNil(fitContentPos.x) || isNotNil(fitContentPos.y)) {\n this.position = { ...this.position, ...fitContentPos };\n } else if (!isNotNil(fitContentPos.x) && !isNotNil(fitContentPos.y)) {\n this.position = {\n x: event.source.getFreeDragPosition().x,\n y: event.source.getFreeDragPosition().y\n };\n }\n }\n\n sanitizerResourceUrl(url: string): SafeResourceUrl {\n return this.sanitizer.bypassSecurityTrustResourceUrl(url);\n }\n\n private updatePreviewImageTransform(): void {\n this.previewImageTransform = `scale3d(${this.zoom * (this.flipHorizontally ? -1 : 1)}, ${\n this.zoom * (this.flipVertically ? -1 : 1)\n }, 1) rotate(${this.rotate}deg)`;\n }\n\n private updatePreviewImageWrapperTransform(): void {\n this.previewImageWrapperTransform = `translate3d(${this.position.x}px, ${this.position.y}px, 0)`;\n }\n\n private updateZoomOutDisabled(): void {\n this.zoomOutDisabled = this.zoom <= 1;\n }\n\n private handlerImageTransformationWhileZoomingWithMouse(event: WheelEvent, deltaY: number): void {\n let scaleValue: number;\n const imageElement = this.imageRef.nativeElement;\n\n const elementTransform = getComputedStyle(imageElement).transform;\n const matrixValue = elementTransform.match(/matrix.*\\((.+)\\)/);\n\n if (matrixValue) {\n scaleValue = +matrixValue[1].split(', ')[0];\n } else {\n scaleValue = this.zoom;\n }\n\n const x = (event.clientX - imageElement.getBoundingClientRect().x) / scaleValue;\n const y = (event.clientY - imageElement.getBoundingClientRect().y) / scaleValue;\n const halfOfScaleStepValue = deltaY < 0 ? this.scaleStep / 2 : -this.scaleStep / 2;\n\n this.position.x += -x * halfOfScaleStepValue * 2 + imageElement.offsetWidth * halfOfScaleStepValue;\n this.position.y += -y * halfOfScaleStepValue * 2 + imageElement.offsetHeight * halfOfScaleStepValue;\n }\n\n private handleImageScaleWhileZoomingWithMouse(deltaY: number): void {\n if (this.isZoomedInWithMouseWheel(deltaY)) {\n this.onZoomIn();\n } else {\n this.onZoomOut();\n }\n\n if (this.zoom <= 1) {\n this.reCenterImage();\n }\n }\n\n private isZoomedInWithMouseWheel(delta: number): boolean {\n return delta < 0;\n }\n\n private reset(): void {\n this.zoom = this.config.nzZoom ?? this._defaultNzZoom;\n this.scaleStep = this.config.nzScaleStep ?? this._defaultNzScaleStep;\n this.rotate = this.config.nzRotate ?? this._defaultNzRotate;\n this.flipHorizontally = false;\n this.flipVertically = false;\n this.reCenterImage();\n }\n\n private reCenterImage(): void {\n this.position = { ...initialPosition };\n }\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { ESCAPE, hasModifierKey, LEFT_ARROW, RIGHT_ARROW } from '@angular/cdk/keycodes';\nimport { OverlayRef } from '@angular/cdk/overlay';\nimport { Subject } from 'rxjs';\nimport { filter, switchMap, take, takeUntil } from 'rxjs/operators';\n\nimport { NzImagePreviewOptions } from './image-preview-options';\nimport { NzImagePreviewComponent } from './image-preview.component';\n\nexport class NzImagePreviewRef {\n private destroy$ = new Subject<void>();\n\n constructor(\n public previewInstance: NzImagePreviewComponent,\n private config: NzImagePreviewOptions,\n private overlayRef: OverlayRef\n ) {\n overlayRef\n .keydownEvents()\n .pipe(\n filter(\n event =>\n (this.config.nzKeyboard as boolean) &&\n (event.keyCode === ESCAPE || event.keyCode === LEFT_ARROW || event.keyCode === RIGHT_ARROW) &&\n !hasModifierKey(event)\n )\n )\n .subscribe(event => {\n event.preventDefault();\n if (event.keyCode === ESCAPE) {\n previewInstance.onClose();\n }\n if (event.keyCode === LEFT_ARROW) {\n this.prev();\n }\n if (event.keyCode === RIGHT_ARROW) {\n this.next();\n }\n });\n\n overlayRef.detachments().subscribe(() => {\n this.overlayRef.dispose();\n });\n\n previewInstance.closeClick\n .pipe(\n take(1),\n switchMap(() => previewInstance.animationStateChanged),\n filter(event => event.phaseName === 'done'),\n takeUntil(this.destroy$)\n )\n .subscribe(() => {\n this.close();\n });\n }\n\n switchTo(index: number): void {\n this.previewInstance.switchTo(index);\n }\n\n next(): void {\n this.previewInstance.next();\n }\n\n prev(): void {\n this.previewInstance.prev();\n }\n\n close(): void {\n this.destroy$.next();\n this.overlayRef.dispose();\n }\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { Directionality } from '@angular/cdk/bidi';\nimport { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { Injectable, Injector } from '@angular/core';\n\nimport { ImageConfig, NzConfigService } from 'ng-zorro-antd/core/config';\n\nimport { NZ_CONFIG_MODULE_NAME } from './image-config';\nimport { NzImage, NzImagePreviewOptions } from './image-preview-options';\nimport { NzImagePreviewRef } from './image-preview-ref';\nimport { NzImagePreviewComponent } from './image-preview.component';\nimport { NzImageScaleStep, NzImageUrl } from './image.directive';\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport interface NzImageService {\n preview(images: NzImage[], option?: NzImagePreviewOptions): NzImagePreviewRef;\n}\n\n@Injectable()\n// eslint-disable-next-line @typescript-eslint/no-unsafe-declaration-merging\nexport class NzImageService {\n constructor(\n private overlay: Overlay,\n private injector: Injector,\n private nzConfigService: NzConfigService,\n private directionality: Directionality\n ) {}\n\n preview(\n images: NzImage[],\n options?: NzImagePreviewOptions,\n zoomMap?: Map<NzImageUrl, NzImageScaleStep>\n ): NzImagePreviewRef {\n return this.display(images, options, zoomMap);\n }\n\n private display(\n images: NzImage[],\n config?: NzImagePreviewOptions,\n scaleStepMap?: Map<NzImageUrl, NzImageScaleStep>\n ): NzImagePreviewRef {\n const configMerged = { ...new NzImagePreviewOptions(), ...(config ?? {}) };\n const overlayRef = this.createOverlay(configMerged);\n const previewComponent = this.attachPreviewComponent(overlayRef, configMerged);\n previewComponent.setImages(images, scaleStepMap);\n const previewRef = new NzImagePreviewRef(previewComponent, configMerged, overlayRef);\n\n previewComponent.previewRef = previewRef;\n return previewRef;\n }\n\n private attachPreviewComponent(overlayRef: OverlayRef, config: NzImagePreviewOptions): NzImagePreviewComponent {\n const injector = Injector.create({\n parent: this.injector,\n providers: [\n { provide: OverlayRef, useValue: overlayRef },\n { provide: NzImagePreviewOptions, useValue: config }\n ]\n });\n\n const containerPortal = new ComponentPortal(NzImagePreviewComponent, null, injector);\n const containerRef = overlayRef.attach(containerPortal);\n\n return containerRef.instance;\n }\n\n private createOverlay(config: NzImagePreviewOptions): OverlayRef {\n const globalConfig = (this.nzConfigService.getConfigForComponent(NZ_CONFIG_MODULE_NAME) as ImageConfig) || {};\n const overLayConfig = new OverlayConfig({\n scrollStrategy: this.overlay.scrollStrategies.block(),\n positionStrategy: this.overlay.position().global(),\n disposeOnNavigation: config.nzCloseOnNavigation ?? globalConfig.nzCloseOnNavigation ?? true,\n direction: config.nzDirection || globalConfig.nzDirection || this.directionality.value\n });\n\n return this.overlay.create(overLayConfig);\n }\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { Direction, Directionality } from '@angular/cdk/bidi';\nimport { DOCUMENT } from '@angular/common';\nimport {\n ChangeDetectorRef,\n Directive,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n booleanAttribute,\n inject\n} from '@angular/core';\nimport { Subject, fromEvent } from 'rxjs';\nimport { takeUntil } from 'rxjs/operators';\n\nimport { NzConfigKey, NzConfigService, WithConfig } from 'ng-zorro-antd/core/config';\n\nimport { NzImageGroupComponent } from './image-group.component';\nimport { NZ_DEFAULT_SCALE_STEP } from './image-preview.component';\nimport { NzImageService } from './image.service';\n\nconst NZ_CONFIG_MODULE_NAME: NzConfigKey = 'image';\n\nexport type ImageStatusType = 'error' | 'loading' | 'normal';\nexport type NzImageUrl = string;\nexport type NzImageScaleStep = number;\n\n@Directive({\n selector: 'img[nz-image]',\n exportAs: 'nzImage',\n host: {\n '(click)': 'onPreview()'\n }\n})\nexport class NzImageDirective implements OnInit, OnChanges, OnDestroy {\n readonly _nzModuleName: NzConfigKey = NZ_CONFIG_MODULE_NAME;\n\n @Input() nzSrc = '';\n @Input() nzSrcset = '';\n @Input({ transform: booleanAttribute }) @WithConfig() nzDisablePreview: boolean = false;\n @Input() @WithConfig() nzFallback: string | null = null;\n @Input() @WithConfig() nzPlaceholder: string | null = null;\n @Input() @WithConfig() nzScaleStep: number | null = null;\n\n dir?: Direction;\n backLoadImage!: HTMLImageElement;\n status: ImageStatusType = 'normal';\n private backLoadDestroy$ = new Subject<void>();\n private destroy$ = new Subject<void>();\n private document: Document = inject(DOCUMENT);\n private parentGroup = inject(NzImageGroupComponent, { optional: true });\n\n get previewable(): boolean {\n return !this.nzDisablePreview && this.status !== 'error';\n }\n\n constructor(\n public nzConfigService: NzConfigService,\n private elementRef: ElementRef,\n private nzImageService: NzImageService,\n protected cdr: ChangeDetectorRef,\n private directionality: Directionality\n ) {}\n\n ngOnInit(): void {\n this.backLoad();\n if (this.parentGroup) {\n this.parentGroup.addImage(this);\n }\n if (this.directionality) {\n this.directionality.change?.pipe(takeUntil(this.destroy$)).subscribe((direction: Direction) => {\n this.dir = direction;\n this.cdr.detectChanges();\n });\n this.dir = this.directionality.value;\n }\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n onPreview(): void {\n if (!this.previewable) {\n return;\n }\n\n if (this.parentGroup) {\n // preview inside image group\n const previewAbleImages = this.parentGroup.images.filter(e => e.previewable);\n const previewImages = previewAbleImages.map(e => ({ src: e.nzSrc, srcset: e.nzSrcset }));\n const previewIndex = previewAbleImages.findIndex(el => this === el);\n const scaleStepMap = new Map<NzImageUrl, NzImageScaleStep>();\n previewAbleImages.forEach(imageDirective => {\n scaleStepMap.set(\n imageDirective.nzSrc ?? imageDirective.nzSrcset,\n imageDirective.nzScaleStep ?? this.parentGroup!.nzScaleStep ?? this.nzScaleStep ?? NZ_DEFAULT_SCALE_STEP\n );\n });\n const previewRef = this.nzImageService.preview(\n previewImages,\n {\n nzDirection: this.dir\n },\n scaleStepMap\n );\n previewRef.switchTo(previewIndex);\n } else {\n // preview not inside image group\n const previewImages = [{ src: this.nzSrc, srcset: this.nzSrcset }];\n this.nzImageService.preview(previewImages, {\n nzDirection: this.dir,\n nzScaleStep: this.nzScaleStep ?? NZ_DEFAULT_SCALE_STEP\n });\n }\n }\n\n getElement(): ElementRef<HTMLImageElement> {\n return this.elementRef;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const { nzSrc } = changes;\n if (nzSrc) {\n this.getElement().nativeElement.src = nzSrc.currentValue;\n this.backLoad();\n }\n }\n\n /**\n * use internal Image object handle fallback & placeholder\n *\n * @private\n */\n private backLoad(): void {\n this.backLoadImage = this.document.createElement('img');\n this.backLoadImage.src = this.nzSrc;\n this.backLoadImage.srcset = this.nzSrcset;\n this.status = 'loading';\n\n // unsubscribe last backLoad\n this.backLoadDestroy$.next();\n this.backLoadDestroy$.complete();\n this.backLoadDestroy$ = new Subject();\n if (this.backLoadImage.complete) {\n this.status = 'normal';\n this.getElement().nativeElement.src = this.nzSrc;\n this.getElement().nativeElement.srcset = this.nzSrcset;\n } else {\n if (this.nzPlaceholder) {\n this.getElement().nativeElement.src = this.nzPlaceholder;\n this.getElement().nativeElement.srcset = '';\n } else {\n this.getElement().nativeElement.src = this.nzSrc;\n this.getElement().nativeElement.srcset = this.nzSrcset;\n }\n\n // The `nz-image` directive can be destroyed before the `load` or `error` event is dispatched,\n // so there's no sense to keep capturing `this`.\n fromEvent(this.backLoadImage, 'load')\n .pipe(takeUntil(this.backLoadDestroy$), takeUntil(this.destroy$))\n .subscribe(() => {\n this.status = 'normal';\n this.getElement().nativeElement.src = this.nzSrc;\n this.getElement().nativeElement.srcset = this.nzSrcset;\n });\n\n fromEvent(this.backLoadImage, 'error')\n .pipe(takeUntil(this.backLoadDestroy$), takeUntil(this.destroy$))\n .subscribe(() => {\n this.status = 'error';\n if (this.nzFallback) {\n this.getElement().nativeElement.src = this.nzFallback;\n this.getElement().nativeElement.srcset = '';\n }\n });\n }\n }\n}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nimport { NgModule } from '@angular/core';\n\nimport { NzImageGroupComponent } from './image-group.component';\nimport { NzImagePreviewComponent } from './image-preview.component';\nimport { NzImageDirective } from './image.directive';\nimport { NzImageService } from './image.service';\n\n@NgModule({\n imports: [NzImageDirective, NzImagePreviewComponent, NzImageGroupComponent],\n exports: [NzImageDirective, NzImagePreviewComponent, NzImageGroupComponent],\n providers: [NzImageService]\n})\nexport class NzImageModule {}\n","/**\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE\n */\n\nexport * from './image.directive';\nexport * from './image.service';\nexport * from './image-config';\nexport * from './image-group.component';\nexport * from './image-preview.component';\nexport * from './image-preview-options';\nexport * from './image-preview-ref';\nexport * from './image.module';\nexport * from './utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["NZ_CONFIG_MODULE_NAME","i2.NzImagePreviewOptions","i1","i2","i3","i2.NzImageService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;;AAGG;MAcU,qBAAqB,CAAA;IACvB,WAAW,GAAkB,IAAI;IAE1C,MAAM,GAAuB,EAAE;AAE/B,IAAA,QAAQ,CAAC,KAAuB,EAAA;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;;uGANd,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,8IALtB,2BAA2B,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAK1B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBARjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,QAAQ,EAAE,cAAc;AACxB,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,mBAAmB,EAAE,KAAK;oBAC1B,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC;AAClC,iBAAA;8BAEU,WAAW,EAAA,CAAA;sBAAnB;;;AClBH;;;AAGG;AAII,MAAMA,uBAAqB,GAAgB;;ACPlD;;;AAGG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDG;AACG,SAAU,qBAAqB,CAAC,MAOrC,EAAA;IACC,IAAI,MAAM,GAAG,EAAE;AAEf,IAAA,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE;AAC9E,QAAA,MAAM,GAAG;AACP,YAAA,CAAC,EAAE,CAAC;AACJ,YAAA,CAAC,EAAE;SACJ;;AAGH,IAAA,IAAI,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE;AAC5E,QAAA,MAAM,GAAG;AACP,YAAA,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC;AAC1D,YAAA,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY;SAC3D;;AAGH,IAAA,OAAO,MAAM;AACf;AAEM,SAAU,SAAS,CAAC,IAAiB,EAAA;AACzC,IAAA,MAAM,GAAG,GAAG,IAAI,CAAC,qBAAqB,EAAE;AACxC,IAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe;;IAGxC,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;QACnH,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC;KAC9G;AACH;SAEgB,aAAa,GAAA;AAC3B,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,YAAY;IAC1E,OAAO;QACL,KAAK;QACL;KACD;AACH;AAEA,SAAS,QAAQ,CAAC,KAAa,EAAE,IAAY,EAAE,UAAkB,EAAA;AAC/D,IAAA,MAAM,YAAY,GAAG,KAAK,GAAG,IAAI;IACjC,MAAM,WAAW,GAAG,CAAC,IAAI,GAAG,UAAU,IAAI,CAAC;IAC3C,IAAI,QAAQ,GAAkB,IAAI;AAElC,IAAA,IAAI,IAAI,GAAG,UAAU,EAAE;AACrB,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,QAAQ,GAAG,WAAW;;QAExB,IAAI,KAAK,GAAG,CAAC,IAAI,YAAY,GAAG,UAAU,EAAE;YAC1C,QAAQ,GAAG,CAAC,WAAW;;;SAEpB;QACL,IAAI,KAAK,GAAG,CAAC,IAAI,YAAY,GAAG,UAAU,EAAE;AAC1C,YAAA,QAAQ,GAAG,KAAK,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,WAAW;;;AAIrD,IAAA,OAAO,QAAQ;AACjB;;AC7HA;;;AAGG;MAIU,qBAAqB,CAAA;IAChC,UAAU,GAAa,IAAI;IAC3B,aAAa,GAAa,KAAK;IAC/B,cAAc,GAAa,IAAI;IAC/B,mBAAmB,GAAa,IAAI;AACpC,IAAA,QAAQ;AACR,IAAA,MAAM;AACN,IAAA,QAAQ;AACR,IAAA,kBAAkB;AAClB,IAAA,gBAAgB;AAChB,IAAA,WAAW;AACX,IAAA,WAAW;AACZ;;ACyBD,MAAM,eAAe,GAAG;AACtB,IAAA,CAAC,EAAE,CAAC;AACJ,IAAA,CAAC,EAAE;CACJ;AAEM,MAAM,qBAAqB,GAAG;AACrC,MAAM,eAAe,GAAG,CAAC;AACzB,MAAM,iBAAiB,GAAG,CAAC;MAuGd,uBAAuB,CAAA;AA4FxB,IAAA,MAAA;AACA,IAAA,GAAA;AACD,IAAA,eAAA;AACA,IAAA,MAAA;AACC,IAAA,QAAA;AACA,IAAA,SAAA;IAhGD,cAAc,GAAG,eAAe;IAChC,mBAAmB,GAAG,qBAAqB;IAC3C,gBAAgB,GAAG,iBAAiB;IAE7C,MAAM,GAAc,EAAE;IACtB,KAAK,GAAG,CAAC;IACT,UAAU,GAAG,KAAK;IAClB,OAAO,GAAG,IAAI;AACd,IAAA,qBAAqB,GAAG,IAAI,YAAY,EAAkB;AAC1D,IAAA,YAAY,GAAsC,IAAI,GAAG,EAAgC;IAEzF,qBAAqB,GAAG,EAAE;IAC1B,4BAA4B,GAAG,EAAE;AACjC,IAAA,UAAU,GAAgC;AACxC,QAAA;AACE,YAAA,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,MAAK;gBACZ,IAAI,CAAC,OAAO,EAAE;aACf;AACD,YAAA,IAAI,EAAE;AACP,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,MAAK;gBACZ,IAAI,CAAC,QAAQ,EAAE;aAChB;AACD,YAAA,IAAI,EAAE;AACP,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,MAAK;gBACZ,IAAI,CAAC,SAAS,EAAE;aACjB;AACD,YAAA,IAAI,EAAE;AACP,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,MAAK;gBACZ,IAAI,CAAC,aAAa,EAAE;aACrB;AACD,YAAA,IAAI,EAAE;AACP,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,aAAa;YACnB,OAAO,EAAE,MAAK;gBACZ,IAAI,CAAC,YAAY,EAAE;aACpB;AACD,YAAA,IAAI,EAAE;AACP,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAK;gBACZ,IAAI,CAAC,gBAAgB,EAAE;aACxB;AACD,YAAA,IAAI,EAAE;AACP,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,MAAK;gBACZ,IAAI,CAAC,cAAc,EAAE;aACtB;AACD,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE;AACT;KACF;IAED,eAAe,GAAG,KAAK;AACvB,IAAA,QAAQ,GAAG,EAAE,GAAG,eAAe,EAAE;AACjC,IAAA,UAAU;AACV,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AAEhB,IAAA,QAAQ;AACuB,IAAA,mBAAmB;AAE/D,IAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC3B,IAAA,IAAI;AACJ,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,gBAAgB;AAChB,IAAA,cAAc;AAEtB,IAAA,IAAI,iBAAiB,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,KAAK;;AAG3C,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,MAAM,aAAa,GAAc,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAACA,uBAAqB,CAAC,IAAI,EAAE;QACxG,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,aAAa,CAAC,cAAc,IAAI,IAAI;;IAG3E,WACU,CAAA,MAAc,EACd,GAAsB,EACvB,eAAgC,EAChC,MAA6B,EAC5B,QAA0B,EAC1B,SAAuB,EAAA;QALvB,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAG,CAAA,GAAA,GAAH,GAAG;QACJ,IAAe,CAAA,eAAA,GAAf,eAAe;QACf,IAAM,CAAA,MAAA,GAAN,MAAM;QACL,IAAQ,CAAA,QAAA,GAAR,QAAQ;QACR,IAAS,CAAA,SAAA,GAAT,SAAS;AAEjB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,mBAAmB;AACpE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB;QAC3D,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,kBAAkB,IAAI,KAAK;QAC/D,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,KAAK;QAC3D,IAAI,CAAC,qBAAqB,EAAE;QAC5B,IAAI,CAAC,2BAA2B,EAAE;QAClC,IAAI,CAAC,kCAAkC,EAAE;;IAG3C,QAAQ,GAAA;QACN,uBAAuB,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW;AACxE,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACxB,SAAC,CAAC;QAEJ,uBAAuB,CAAa,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO;AAChF,aAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAC7B,SAAS,CAAC,KAAK,IAAG;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;AAC1D,SAAC,CAAC;AAEJ,QAAA,uBAAuB,CAAgB,IAAI,CAAC,QAAQ,EAAE,SAAS;aAC5D,IAAI,CACH,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,CAAC,EACzC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;aAEzB,SAAS,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAK;gBACnB,IAAI,CAAC,OAAO,EAAE;gBACd,IAAI,CAAC,YAAY,EAAE;AACrB,aAAC,CAAC;AACJ,SAAC,CAAC;;IAGN,SAAS,CAAC,MAAiB,EAAE,YAAkC,EAAA;AAC7D,QAAA,IAAI,YAAY;AAAE,YAAA,IAAI,CAAC,YAAY,GAAG,YAAY;AAClD,QAAA,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,YAAY,EAAE;;AAGrB,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,YAAY,EAAE;;IAGrB,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACvC,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,kCAAkC,EAAE;YACzC,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,YAAY,EAAE;;;IAIvB,IAAI,GAAA;AACF,QAAA,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE;YAClB,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,KAAK,EAAE;YACZ,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,kCAAkC,EAAE;YACzC,IAAI,CAAC,qBAAqB,EAAE;YAC5B,IAAI,CAAC,YAAY,EAAE;;;IAIvB,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;;IAGzB,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;;IAGxB,QAAQ,GAAA;AACN,QAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;AACxG,QAAA,IAAI,CAAC,IAAI,IAAI,QAAQ;QACrB,IAAI,CAAC,2BAA2B,EAAE;QAClC,IAAI,CAAC,qBAAqB,EAAE;;IAG9B,SAAS,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC,EAAE;AACjB,YAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS;AACxG,YAAA,IAAI,CAAC,IAAI,IAAI,QAAQ;YACrB,IAAI,CAAC,2BAA2B,EAAE;YAClC,IAAI,CAAC,qBAAqB,EAAE;AAE5B,YAAA,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;gBAClB,IAAI,CAAC,aAAa,EAAE;;;;IAK1B,aAAa,GAAA;AACX,QAAA,IAAI,CAAC,MAAM,IAAI,EAAE;QACjB,IAAI,CAAC,2BAA2B,EAAE;;IAGpC,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,MAAM,IAAI,EAAE;QACjB,IAAI,CAAC,2BAA2B,EAAE;;AAGpC,IAAA,YAAY,CAAC,KAAiB,EAAA;QAC5B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,IAAI,EAAE;;AAGb,IAAA,aAAa,CAAC,KAAiB,EAAA;QAC7B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,IAAI,EAAE;;IAGb,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,gBAAgB,GAAG,CAAC,IAAI,CAAC,gBAAgB;QAC9C,IAAI,CAAC,2BAA2B,EAAE;;IAGpC,cAAc,GAAA;AACZ,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc;QAC1C,IAAI,CAAC,2BAA2B,EAAE;;AAGpC,IAAA,qBAAqB,CAAC,KAAiB,EAAA;QACrC,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QAEvB,IAAI,CAAC,+CAA+C,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC;AACzE,QAAA,IAAI,CAAC,qCAAqC,CAAC,KAAK,CAAC,MAAM,CAAC;QAExD,IAAI,CAAC,kCAAkC,EAAE;QACzC,IAAI,CAAC,2BAA2B,EAAE;QAElC,IAAI,CAAC,YAAY,EAAE;;AAGrB,IAAA,gBAAgB,CAAC,KAAqB,EAAA;AACpC,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGxC,IAAA,eAAe,CAAC,KAAqB,EAAA;AACnC,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;;AAGxC,IAAA,SAAS,CAAC,KAAiB,EAAA;AACzB,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI;AACjE,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI;AACnE,QAAA,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;AAC5D,QAAA,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,aAAa,EAAE;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC;AACxC,QAAA,MAAM,gBAAgB,GAAG;YACvB,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK;YAChC,MAAM,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM;YACjC,IAAI;YACJ,GAAG;YACH,WAAW;YACX;SACD;AACD,QAAA,MAAM,aAAa,GAAG,qBAAqB,CAAC,gBAAgB,CAAC;AAC7D,QAAA,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;AAC1D,YAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,aAAa,EAAE;;AACjD,aAAA,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE;YACnE,IAAI,CAAC,QAAQ,GAAG;gBACd,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC,CAAC;gBACvC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;aACvC;;;AAIL,IAAA,oBAAoB,CAAC,GAAW,EAAA;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,8BAA8B,CAAC,GAAG,CAAC;;IAGnD,2BAA2B,GAAA;QACjC,IAAI,CAAC,qBAAqB,GAAG,CAAA,QAAA,EAAW,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA,EAAA,EAClF,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,GAAG,CAAC,CAC3C,eAAe,IAAI,CAAC,MAAM,CAAA,IAAA,CAAM;;IAG1B,kCAAkC,GAAA;AACxC,QAAA,IAAI,CAAC,4BAA4B,GAAG,CAAe,YAAA,EAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAA,IAAA,EAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,QAAQ;;IAG1F,qBAAqB,GAAA;QAC3B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;;IAG/B,+CAA+C,CAAC,KAAiB,EAAE,MAAc,EAAA;AACvF,QAAA,IAAI,UAAkB;AACtB,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa;QAEhD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC,SAAS;QACjE,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,kBAAkB,CAAC;QAE9D,IAAI,WAAW,EAAE;AACf,YAAA,UAAU,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;aACtC;AACL,YAAA,UAAU,GAAG,IAAI,CAAC,IAAI;;AAGxB,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,UAAU;AAC/E,QAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,YAAY,CAAC,qBAAqB,EAAE,CAAC,CAAC,IAAI,UAAU;QAC/E,MAAM,oBAAoB,GAAG,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC;AAElF,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,oBAAoB,GAAG,CAAC,GAAG,YAAY,CAAC,WAAW,GAAG,oBAAoB;AAClG,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,oBAAoB,GAAG,CAAC,GAAG,YAAY,CAAC,YAAY,GAAG,oBAAoB;;AAG7F,IAAA,qCAAqC,CAAC,MAAc,EAAA;AAC1D,QAAA,IAAI,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE;YACzC,IAAI,CAAC,QAAQ,EAAE;;aACV;YACL,IAAI,CAAC,SAAS,EAAE;;AAGlB,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE;YAClB,IAAI,CAAC,aAAa,EAAE;;;AAIhB,IAAA,wBAAwB,CAAC,KAAa,EAAA;QAC5C,OAAO,KAAK,GAAG,CAAC;;IAGV,KAAK,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,mBAAmB;AACpE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB;AAC3D,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAC7B,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;QAC3B,IAAI,CAAC,aAAa,EAAE;;IAGd,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAG,eAAe,EAAE;;uGAvV7B,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,qBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAFvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,mBAAA,EAAA,0BAAA,EAAA,kBAAA,EAAA,yBAAA,EAAA,EAAA,UAAA,EAAA,EAAA,gCAAA,EAAA,YAAA,EAAA,cAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,6BAAA,EAAA,EAAA,cAAA,EAAA,wBAAA,EAAA,EAAA,SAAA,EAAA,CAAC,gBAAgB,CAAC,EA/FnB,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,UAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiFT,EAaS,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,0NAAE,aAAa,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EA/FlC,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAC,UAAU,CAAC,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;2FAkGb,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBArGnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,QAAQ,EAAE,gBAAgB;oBAC1B,UAAU,EAAE,CAAC,UAAU,CAAC;AACxB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiFT,EAAA,CAAA;AACD,oBAAA,mBAAmB,EAAE,KAAK;oBAC1B,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,wBAAwB;AAC/B,wBAAA,kCAAkC,EAAE,YAAY;AAChD,wBAAA,gBAAgB,EAAE,iBAAiB;AACnC,wBAAA,cAAc,EAAE,sBAAsB;AACtC,wBAAA,eAAe,EAAE,CAA6B,2BAAA,CAAA;AAC9C,wBAAA,qBAAqB,EAAE,0BAA0B;AACjD,wBAAA,oBAAoB,EAAE;AACvB,qBAAA;AACD,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC;oBAC/C,SAAS,EAAE,CAAC,gBAAgB;AAC7B,iBAAA;oOAyEsB,QAAQ,EAAA,CAAA;sBAA5B,SAAS;uBAAC,QAAQ;gBACiC,mBAAmB,EAAA,CAAA;sBAAtE,SAAS;AAAC,gBAAA,IAAA,EAAA,CAAA,qBAAqB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;;;ACnOpD;;;AAGG;MAUU,iBAAiB,CAAA;AAInB,IAAA,eAAA;AACC,IAAA,MAAA;AACA,IAAA,UAAA;AALF,IAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;AAEtC,IAAA,WAAA,CACS,eAAwC,EACvC,MAA6B,EAC7B,UAAsB,EAAA;QAFvB,IAAe,CAAA,eAAA,GAAf,eAAe;QACd,IAAM,CAAA,MAAA,GAAN,MAAM;QACN,IAAU,CAAA,UAAA,GAAV,UAAU;QAElB;AACG,aAAA,aAAa;aACb,IAAI,CACH,MAAM,CACJ,KAAK,IACF,IAAI,CAAC,MAAM,CAAC,UAAsB;AACnC,aAAC,KAAK,CAAC