UNPKG

ngx-image-cropper

Version:
198 lines 29.4 kB
import { signal } from '@angular/core'; import { checkCropperPosition } from '../utils/cropper-position.utils'; export class CropperState { constructor() { this.cropper = signal({ x1: 0, x2: 0, y1: 0, y2: 0 }); this.maxSize = signal({ width: 0, height: 0 }); this.transform = {}; this.options = { format: 'png', output: 'blob', autoCrop: true, maintainAspectRatio: true, aspectRatio: 1, resetCropOnAspectRatioChange: true, resizeToWidth: 0, resizeToHeight: 0, cropperMinWidth: 0, cropperMinHeight: 0, cropperMaxHeight: 0, cropperMaxWidth: 0, cropperStaticWidth: 0, cropperStaticHeight: 0, canvasRotation: 0, roundCropper: false, onlyScaleDown: false, imageQuality: 92, backgroundColor: undefined, containWithinAspectRatio: false, hideResizeSquares: false, alignImage: 'center', cropperFrameAriaLabel: undefined, checkImageType: true }; // Internal this.cropperScaledMinWidth = 20; this.cropperScaledMinHeight = 20; this.cropperScaledMaxWidth = 20; this.cropperScaledMaxHeight = 20; this.stepSize = 3; } setOptionsFromChanges(changes) { if (changes['options']?.currentValue) { this.setOptions(changes['options'].currentValue); } const options = Object.entries(changes) .filter(([key]) => key in this.options) .reduce((acc, [key, change]) => ({ ...acc, [key]: change.currentValue }), {}); if (Object.keys(options).length > 0) { this.setOptions(options); } } setOptions(options) { this.options = { ...this.options, ...(options || {}) }; this.validateOptions(); if (!this.loadedImage?.transformed.image.complete || !this.maxSize) { return; } let positionPossiblyChanged = false; if ((this.options.maintainAspectRatio && options['aspectRatio']) || 'maintainAspectRatio' in options) { this.setCropperScaledMinSize(); this.setCropperScaledMaxSize(); if (this.options.maintainAspectRatio && (this.options.resetCropOnAspectRatioChange || !this.aspectRatioIsCorrect())) { this.cropper.set(this.maxSizeCropperPosition()); positionPossiblyChanged = true; } } else { if (options['cropperMinWidth'] || options['cropperMinHeight']) { this.setCropperScaledMinSize(); positionPossiblyChanged = true; } if (options['cropperMaxWidth'] || options['cropperMaxHeight']) { this.setCropperScaledMaxSize(); positionPossiblyChanged = true; } if (options['cropperStaticWidth'] || options['cropperStaticHeight']) { positionPossiblyChanged = true; } } if (positionPossiblyChanged) { this.cropper.update((cropper) => checkCropperPosition(cropper, this, false)); } } validateOptions() { if (this.options.maintainAspectRatio && !this.options.aspectRatio) { throw new Error('`aspectRatio` should > 0 when `maintainAspectRatio` is enabled'); } } setMaxSize(width, height) { this.maxSize.set({ width, height }); this.setCropperScaledMinSize(); this.setCropperScaledMaxSize(); } setCropperScaledMinSize() { if (this.loadedImage?.transformed.size) { this.setCropperScaledMinWidth(); this.setCropperScaledMinHeight(); } else { this.cropperScaledMinWidth = 20; this.cropperScaledMinHeight = 20; } } setCropperScaledMinWidth() { this.cropperScaledMinWidth = this.options.cropperMinWidth > 0 ? Math.max(20, this.options.cropperMinWidth / this.loadedImage.transformed.size.width * this.maxSize().width) : 20; } setCropperScaledMinHeight() { if (this.options.maintainAspectRatio) { this.cropperScaledMinHeight = Math.max(20, this.cropperScaledMinWidth / this.options.aspectRatio); } else if (this.options.cropperMinHeight > 0) { this.cropperScaledMinHeight = Math.max(20, this.options.cropperMinHeight / this.loadedImage.transformed.size.height * this.maxSize().height); } else { this.cropperScaledMinHeight = 20; } } setCropperScaledMaxSize() { if (this.loadedImage?.transformed.size) { const ratio = this.loadedImage.transformed.size.width / this.maxSize().width; this.cropperScaledMaxWidth = this.options.cropperMaxWidth > 20 ? this.options.cropperMaxWidth / ratio : this.maxSize().width; this.cropperScaledMaxHeight = this.options.cropperMaxHeight > 20 ? this.options.cropperMaxHeight / ratio : this.maxSize().height; if (this.options.maintainAspectRatio) { if (this.cropperScaledMaxWidth > this.cropperScaledMaxHeight * this.options.aspectRatio) { this.cropperScaledMaxWidth = this.cropperScaledMaxHeight * this.options.aspectRatio; } else if (this.cropperScaledMaxWidth < this.cropperScaledMaxHeight * this.options.aspectRatio) { this.cropperScaledMaxHeight = this.cropperScaledMaxWidth / this.options.aspectRatio; } } } else { this.cropperScaledMaxWidth = this.maxSize().width; this.cropperScaledMaxHeight = this.maxSize().height; } } equalsCropperPosition(cropper) { const localCropper = this.cropper(); return localCropper == null && cropper == null || localCropper != null && cropper != null && localCropper.x1.toFixed(3) === cropper.x1.toFixed(3) && localCropper.y1.toFixed(3) === cropper.y1.toFixed(3) && localCropper.x2.toFixed(3) === cropper.x2.toFixed(3) && localCropper.y2.toFixed(3) === cropper.y2.toFixed(3); } equalsTransformTranslate(transform) { return (this.transform.translateH ?? 0) === (transform.translateH ?? 0) && (this.transform.translateV ?? 0) === (transform.translateV ?? 0); } equalsTransform(transform) { return this.equalsTransformTranslate(transform) && (this.transform.scale ?? 1) === (transform.scale ?? 1) && (this.transform.rotate ?? 0) === (transform.rotate ?? 0) && (this.transform.flipH ?? false) === (transform.flipH ?? false) && (this.transform.flipV ?? false) === (transform.flipV ?? false); } aspectRatioIsCorrect() { const localCropper = this.cropper(); const currentCropAspectRatio = (localCropper.x2 - localCropper.x1) / (localCropper.y2 - localCropper.y1); return currentCropAspectRatio === this.options.aspectRatio; } resizeCropperPosition(oldMaxSize) { if (oldMaxSize.width !== this.maxSize().width || oldMaxSize.height !== this.maxSize().height) { this.cropper.update(cropper => ({ x1: cropper.x1 * this.maxSize().width / oldMaxSize.width, x2: cropper.x2 * this.maxSize().width / oldMaxSize.width, y1: cropper.y1 * this.maxSize().height / oldMaxSize.height, y2: cropper.y2 * this.maxSize().height / oldMaxSize.height })); } } maxSizeCropperPosition() { return { x1: 0, y1: 0, x2: this.maxSize().width, y2: this.maxSize().height }; } toCropInput() { return { cropper: this.cropper(), maxSize: this.maxSize(), transform: this.transform, loadedImage: this.loadedImage, options: { ...this.options } }; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcHBlci5zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1pbWFnZS1jcm9wcGVyL3NyYy9saWIvY29tcG9uZW50L2Nyb3BwZXIuc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFdkUsTUFBTSxPQUFPLFlBQVk7SUFBekI7UUFFVyxZQUFPLEdBQUcsTUFBTSxDQUFrQixFQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1FBR3pFLFlBQU8sR0FBRyxNQUFNLENBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELGNBQVMsR0FBbUIsRUFBRSxDQUFDO1FBQy9CLFlBQU8sR0FBbUI7WUFDeEIsTUFBTSxFQUFFLEtBQUs7WUFDYixNQUFNLEVBQUUsTUFBTTtZQUNkLFFBQVEsRUFBRSxJQUFJO1lBQ2QsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixXQUFXLEVBQUUsQ0FBQztZQUNkLDRCQUE0QixFQUFFLElBQUk7WUFDbEMsYUFBYSxFQUFFLENBQUM7WUFDaEIsY0FBYyxFQUFFLENBQUM7WUFDakIsZUFBZSxFQUFFLENBQUM7WUFDbEIsZ0JBQWdCLEVBQUUsQ0FBQztZQUNuQixnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLGVBQWUsRUFBRSxDQUFDO1lBQ2xCLGtCQUFrQixFQUFFLENBQUM7WUFDckIsbUJBQW1CLEVBQUUsQ0FBQztZQUN0QixjQUFjLEVBQUUsQ0FBQztZQUNqQixZQUFZLEVBQUUsS0FBSztZQUNuQixhQUFhLEVBQUUsS0FBSztZQUNwQixZ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O2dCQUM5QixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLO2dCQUN4RCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLO2dCQUN4RCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNO2dCQUMxRCxFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNO2FBQzNELENBQUMsQ0FBQyxDQUFDO1FBQ04sQ0FBQztJQUNILENBQUM7SUFFRCxzQkFBc0I7UUFDcEIsT0FBTztZQUNMLEVBQUUsRUFBRSxDQUFDO1lBQ0wsRUFBRSxFQUFFLENBQUM7WUFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUs7WUFDeEIsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7WUFDekIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFZO1lBQzlCLE9BQU8sRUFBRSxFQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQztTQUMzQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3JvcElucHV0LCBDcm9wcGVyT3B0aW9ucywgQ3JvcHBlclBvc2l0aW9uLCBEaW1lbnNpb25zLCBJbWFnZVRyYW5zZm9ybSwgTG9hZGVkSW1hZ2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IHNpZ25hbCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgY2hlY2tDcm9wcGVyUG9zaXRpb24gfSBmcm9tICcuLi91dGlscy9jcm9wcGVyLXBvc2l0aW9uLnV0aWxzJztcblxuZXhwb3J0IGNsYXNzIENyb3BwZXJTdGF0ZSB7XG5cbiAgcmVhZG9ubHkgY3JvcHBlciA9IHNpZ25hbDxDcm9wcGVyUG9zaXRpb24+KHt4MTogMCwgeDI6IDAsIHkxOiAwLCB5MjogMH0pO1xuXG4gIGxvYWRlZEltYWdlPzogTG9hZGVkSW1hZ2U7XG4gIG1heFNpemUgPSBzaWduYWw8RGltZW5zaW9ucz4oeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0pO1xuICB0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtID0ge307XG4gIG9wdGlvbnM6IENyb3BwZXJPcHRpb25zID0ge1xuICAgIGZvcm1hdDogJ3BuZycsXG4gICAgb3V0cHV0OiAnYmxvYicsXG4gICAgYXV0b0Nyb3A6IHRydWUsXG4gICAgbWFpbnRhaW5Bc3BlY3RSYXRpbzogdHJ1ZSxcbiAgICBhc3BlY3RSYXRpbzogMSxcbiAgICByZXNldENyb3BPbkFzcGVjdFJhdGlvQ2hhbmdlOiB0cnVlLFxuICAgIHJlc2l6ZVRvV2lkdGg6IDAsXG4gICAgcmVzaXplVG9IZWlnaHQ6IDAsXG4gICAgY3JvcHBlck1pbldpZHRoOiAwLFxuICAgIGNyb3BwZXJNaW5IZWlnaHQ6IDAsXG4gICAgY3JvcHBlck1heEhlaWdodDogMCxcbiAgICBjcm9wcGVyTWF4V2lkdGg6IDAsXG4gICAgY3JvcHBlclN0YXRpY1dpZHRoOiAwLFxuICAgIGNyb3BwZXJTdGF0aWNIZWlnaHQ6IDAsXG4gICAgY2FudmFzUm90YXRpb246IDAsXG4gICAgcm91bmRDcm9wcGVyOiBmYWxzZSxcbiAgICBvbmx5U2NhbGVEb3duOiBmYWxzZSxcbiAgICBpbWFnZVF1YWxpdHk6IDkyLFxuICAgIGJhY2tncm91bmRDb2xvcjogdW5kZWZpbmVkLFxuICAgIGNvbnRhaW5XaXRoaW5Bc3BlY3RSYXRpbzogZmFsc2UsXG4gICAgaGlkZVJlc2l6ZVNxdWFyZXM6IGZhbHNlLFxuICAgIGFsaWduSW1hZ2U6ICdjZW50ZXInLFxuICAgIGNyb3BwZXJGcmFtZUFyaWFMYWJlbDogdW5kZWZpbmVkLFxuICAgIGNoZWNrSW1hZ2VUeXBlOiB0cnVlXG4gIH07XG5cbiAgLy8gSW50ZXJuYWxcbiAgY3JvcHBlclNjYWxlZE1pbldpZHRoID0gMjA7XG4gIGNyb3BwZXJTY2FsZWRNaW5IZWlnaHQgPSAyMDtcbiAgY3JvcHBlclNjYWxlZE1heFdpZHRoID0gMjA7XG4gIGNyb3BwZXJTY2FsZWRNYXhIZWlnaHQgPSAyMDtcbiAgc3RlcFNpemUgPSAzO1xuXG4gIHNldE9wdGlvbnNGcm9tQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ29wdGlvbnMnXT8uY3VycmVudFZhbHVlKSB7XG4gICAgICB0aGlzLnNldE9wdGlvbnMoY2hhbmdlc1snb3B0aW9ucyddLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG9wdGlvbnMgPSBPYmplY3QuZW50cmllcyhjaGFuZ2VzKVxuICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleSBpbiB0aGlzLm9wdGlvbnMpXG4gICAgICAucmVkdWNlKChhY2MsIFtrZXksIGNoYW5nZV0pID0+ICh7XG4gICAgICAgIC4uLmFjYyxcbiAgICAgICAgW2tleV06IGNoYW5nZS5jdXJyZW50VmFsdWVcbiAgICAgIH0pLCB7fSBhcyBQYXJ0aWFsPENyb3BwZXJPcHRpb25zPik7XG4gICAgaWYgKE9iamVjdC5rZXlzKG9wdGlvbnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICBzZXRPcHRpb25zKG9wdGlvbnM6IFBhcnRpYWw8Q3JvcHBlck9wdGlvbnM+KTogdm9pZCB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgLi4uKG9wdGlvbnMgfHwge30pXG4gICAgfTtcbiAgICB0aGlzLnZhbGlkYXRlT3B0aW9ucygpO1xuXG4gICAgaWYgKCF0aGlzLmxvYWRlZEltYWdlPy50cmFuc2Zvcm1lZC5pbWFnZS5jb21wbGV0ZSB8fCAhdGhpcy5tYXhTaXplKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBvc2l0aW9uUG9zc2libHlDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKCh0aGlzLm9wdGlvbnMubWFpbnRhaW5Bc3BlY3RSYXRpbyAmJiBvcHRpb25zWydhc3BlY3RSYXRpbyddKSB8fCAnbWFpbnRhaW5Bc3BlY3RSYXRpbycgaW4gb3B0aW9ucykge1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWluU2l6ZSgpO1xuICAgICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWF4U2l6ZSgpO1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvICYmICh0aGlzLm9wdGlvbnMucmVzZXRDcm9wT25Bc3BlY3RSYXRpb0NoYW5nZSB8fCAhdGhpcy5hc3BlY3RSYXRpb0lzQ29ycmVjdCgpKSkge1xuICAgICAgICB0aGlzLmNyb3BwZXIuc2V0KHRoaXMubWF4U2l6ZUNyb3BwZXJQb3NpdGlvbigpKTtcbiAgICAgICAgcG9zaXRpb25Qb3NzaWJseUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9uc1snY3JvcHBlck1pbldpZHRoJ10gfHwgb3B0aW9uc1snY3JvcHBlck1pbkhlaWdodCddKSB7XG4gICAgICAgIHRoaXMuc2V0Q3JvcHBlclNjYWxlZE1pblNpemUoKTtcbiAgICAgICAgcG9zaXRpb25Qb3NzaWJseUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnNbJ2Nyb3BwZXJNYXhXaWR0aCddIHx8IG9wdGlvbnNbJ2Nyb3BwZXJNYXhIZWlnaHQnXSkge1xuICAgICAgICB0aGlzLnNldENyb3BwZXJTY2FsZWRNYXhTaXplKCk7XG4gICAgICAgIHBvc2l0aW9uUG9zc2libHlDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChvcHRpb25zWydjcm9wcGVyU3RhdGljV2lkdGgnXSB8fCBvcHRpb25zWydjcm9wcGVyU3RhdGljSGVpZ2h0J10pIHtcbiAgICAgICAgcG9zaXRpb25Qb3NzaWJseUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvblBvc3NpYmx5Q2hhbmdlZCkge1xuICAgICAgdGhpcy5jcm9wcGVyLnVwZGF0ZSgoY3JvcHBlcikgPT4gY2hlY2tDcm9wcGVyUG9zaXRpb24oY3JvcHBlciwgdGhpcywgZmFsc2UpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHZhbGlkYXRlT3B0aW9ucygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5vcHRpb25zLm1haW50YWluQXNwZWN0UmF0aW8gJiYgIXRoaXMub3B0aW9ucy5hc3BlY3RSYXRpbykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdgYXNwZWN0UmF0aW9gIHNob3VsZCA+IDAgd2hlbiBgbWFpbnRhaW5Bc3BlY3RSYXRpb2AgaXMgZW5hYmxlZCcpO1xuICAgIH1cbiAgfVxuXG4gIHNldE1heFNpemUod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1heFNpemUuc2V0KHsgd2lkdGgsIGhlaWdodCB9KTtcbiAgICB0aGlzLnNldENyb3BwZXJTY2FsZWRNaW5TaXplKCk7XG4gICAgdGhpcy5zZXRDcm9wcGVyU2NhbGVkTWF4U2l6ZSgpO1xuICB9XG5cbiAgc2V0Q3JvcHBlclNjYWxlZE1pblNpemUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZGVkSW1hZ2U/LnRyYW5zZm9ybWVkLnNpemUpIHtcbiAgICAgIHRoaXMuc2V0Q3JvcHBlclNjYWxlZE1pbldpZHRoKCk7XG4gICAgICB0aGlzLnNldENyb3BwZXJTY2FsZWRNaW5IZWlnaHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcm9wcGVyU2NhbGVkTWluV2lkdGggPSAyMDtcbiAgICAgIHRoaXMuY3JvcHBlclNjYWxlZE1pbkhlaWdodCA9IDIwO1xuICAgIH1cbiAgfVxuXG4gIHNldENyb3BwZXJTY2FsZWRNaW5XaWR0aCgpOiB2b2lkIHtcbiAgICB0aGlzLmNyb3BwZXJTY2FsZWRNaW5XaWR0aCA9IHRoaXMub3B0aW9ucy5jcm9wcGVyTWluV2lkdGggPiAwXG4gICAgICA/IE1hdGgubWF4KDIwLCB0aGlzLm9wdGlvbnMuY3JvcHBlck1pbldpZHRoIC8gdGhpcy5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAqIHRoaXMubWF4U2l6ZSgpLndpZHRoKVxuICAgICAgOiAyMDtcbiAgfVxuXG4gIHNldENyb3BwZXJTY2FsZWRNaW5IZWlnaHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgICB0aGlzLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQgPSBNYXRoLm1heCgyMCwgdGhpcy5jcm9wcGVyU2NhbGVkTWluV2lkdGggLyB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW8pO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25zLmNyb3BwZXJNaW5IZWlnaHQgPiAwKSB7XG4gICAgICB0aGlzLmNyb3BwZXJTY2FsZWRNaW5IZWlnaHQgPSBNYXRoLm1heChcbiAgICAgICAgMjAsXG4gICAgICAgIHRoaXMub3B0aW9ucy5jcm9wcGVyTWluSGVpZ2h0IC8gdGhpcy5sb2FkZWRJbWFnZSEudHJhbnNmb3JtZWQuc2l6ZS5oZWlnaHQgKiB0aGlzLm1heFNpemUoKS5oZWlnaHRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JvcHBlclNjYWxlZE1pbkhlaWdodCA9IDIwO1xuICAgIH1cbiAgfVxuXG4gIHNldENyb3BwZXJTY2FsZWRNYXhTaXplKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvYWRlZEltYWdlPy50cmFuc2Zvcm1lZC5zaXplKSB7XG4gICAgICBjb25zdCByYXRpbyA9IHRoaXMubG9hZGVkSW1hZ2UudHJhbnNmb3JtZWQuc2l6ZS53aWR0aCAvIHRoaXMubWF4U2l6ZSgpLndpZHRoO1xuICAgICAgdGhpcy5jcm9wcGVyU2NhbGVkTWF4V2lkdGggPSB0aGlzLm9wdGlvbnMuY3JvcHBlck1heFdpZHRoID4gMjAgPyB0aGlzLm9wdGlvbnMuY3JvcHBlck1heFdpZHRoIC8gcmF0aW8gOiB0aGlzLm1heFNpemUoKS53aWR0aDtcbiAgICAgIHRoaXMuY3JvcHBlclNjYWxlZE1heEhlaWdodCA9IHRoaXMub3B0aW9ucy5jcm9wcGVyTWF4SGVpZ2h0ID4gMjAgPyB0aGlzLm9wdGlvbnMuY3JvcHBlck1heEhlaWdodCAvIHJhdGlvIDogdGhpcy5tYXhTaXplKCkuaGVpZ2h0O1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYWludGFpbkFzcGVjdFJhdGlvKSB7XG4gICAgICAgIGlmICh0aGlzLmNyb3BwZXJTY2FsZWRNYXhXaWR0aCA+IHRoaXMuY3JvcHBlclNjYWxlZE1heEhlaWdodCAqIHRoaXMub3B0aW9ucy5hc3BlY3RSYXRpbykge1xuICAgICAgICAgIHRoaXMuY3JvcHBlclNjYWxlZE1heFdpZHRoID0gdGhpcy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0ICogdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3JvcHBlclNjYWxlZE1heFdpZHRoIDwgdGhpcy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0ICogdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvKSB7XG4gICAgICAgICAgdGhpcy5jcm9wcGVyU2NhbGVkTWF4SGVpZ2h0ID0gdGhpcy5jcm9wcGVyU2NhbGVkTWF4V2lkdGggLyB0aGlzLm9wdGlvbnMuYXNwZWN0UmF0aW87XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jcm9wcGVyU2NhbGVkTWF4V2lkdGggPSB0aGlzLm1heFNpemUoKS53aWR0aDtcbiAgICAgIHRoaXMuY3JvcHBlclNjYWxlZE1heEhlaWdodCA9IHRoaXMubWF4U2l6ZSgpLmhlaWdodDtcbiAgICB9XG4gIH1cblxuICBlcXVhbHNDcm9wcGVyUG9zaXRpb24oY3JvcHBlcj86IENyb3BwZXJQb3NpdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGxvY2FsQ3JvcHBlciA9IHRoaXMuY3JvcHBlcigpO1xuICAgIHJldHVybiBsb2NhbENyb3BwZXIgPT0gbnVsbCAmJiBjcm9wcGVyID09IG51bGxcbiAgICAgIHx8IGxvY2FsQ3JvcHBlciAhPSBudWxsICYmIGNyb3BwZXIgIT0gbnVsbFxuICAgICAgJiYgbG9jYWxDcm9wcGVyLngxLnRvRml4ZWQoMykgPT09IGNyb3BwZXIueDEudG9GaXhlZCgzKVxuICAgICAgJiYgbG9jYWxDcm9wcGVyLnkxLnRvRml4ZWQoMykgPT09IGNyb3BwZXIueTEudG9GaXhlZCgzKVxuICAgICAgJiYgbG9jYWxDcm9wcGVyLngyLnRvRml4ZWQoMykgPT09IGNyb3BwZXIueDIudG9GaXhlZCgzKVxuICAgICAgJiYgbG9jYWxDcm9wcGVyLnkyLnRvRml4ZWQoMykgPT09IGNyb3BwZXIueTIudG9GaXhlZCgzKTtcbiAgfVxuXG4gIGVxdWFsc1RyYW5zZm9ybVRyYW5zbGF0ZSh0cmFuc2Zvcm06IEltYWdlVHJhbnNmb3JtKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVIID8/IDApID09PSAodHJhbnNmb3JtLnRyYW5zbGF0ZUggPz8gMClcbiAgICAgICYmICh0aGlzLnRyYW5zZm9ybS50cmFuc2xhdGVWID8/IDApID09PSAodHJhbnNmb3JtLnRyYW5zbGF0ZVYgPz8gMCk7XG4gIH1cblxuICBlcXVhbHNUcmFuc2Zvcm0odHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmVxdWFsc1RyYW5zZm9ybVRyYW5zbGF0ZSh0cmFuc2Zvcm0pXG4gICAgICAmJiAodGhpcy50cmFuc2Zvcm0uc2NhbGUgPz8gMSkgPT09ICh0cmFuc2Zvcm0uc2NhbGUgPz8gMSlcbiAgICAgICYmICh0aGlzLnRyYW5zZm9ybS5yb3RhdGUgPz8gMCkgPT09ICh0cmFuc2Zvcm0ucm90YXRlID8/IDApXG4gICAgICAmJiAodGhpcy50cmFuc2Zvcm0uZmxpcEggPz8gZmFsc2UpID09PSAodHJhbnNmb3JtLmZsaXBIID8/IGZhbHNlKVxuICAgICAgJiYgKHRoaXMudHJhbnNmb3JtLmZsaXBWID8/IGZhbHNlKSA9PT0gKHRyYW5zZm9ybS5mbGlwViA/PyBmYWxzZSk7XG4gIH1cblxuICBhc3BlY3RSYXRpb0lzQ29ycmVjdCgpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb2NhbENyb3BwZXIgPSB0aGlzLmNyb3BwZXIoKTtcbiAgICBjb25zdCBjdXJyZW50Q3JvcEFzcGVjdFJhdGlvID0gKGxvY2FsQ3JvcHBlci54MiAtIGxvY2FsQ3JvcHBlci54MSkgLyAobG9jYWxDcm9wcGVyLnkyIC0gbG9jYWxDcm9wcGVyLnkxKTtcbiAgICByZXR1cm4gY3VycmVudENyb3BBc3BlY3RSYXRpbyA9PT0gdGhpcy5vcHRpb25zLmFzcGVjdFJhdGlvO1xuICB9XG5cbiAgcmVzaXplQ3JvcHBlclBvc2l0aW9uKG9sZE1heFNpemU6IERpbWVuc2lvbnMpOiB2b2lkIHtcbiAgICBpZiAob2xkTWF4U2l6ZS53aWR0aCAhPT0gdGhpcy5tYXhTaXplKCkud2lkdGggfHwgb2xkTWF4U2l6ZS5oZWlnaHQgIT09IHRoaXMubWF4U2l6ZSgpLmhlaWdodCkge1xuICAgICAgdGhpcy5jcm9wcGVyLnVwZGF0ZShjcm9wcGVyID0+ICh7XG4gICAgICAgIHgxOiBjcm9wcGVyLngxICogdGhpcy5tYXhTaXplKCkud2lkdGggLyBvbGRNYXhTaXplLndpZHRoLFxuICAgICAgICB4MjogY3JvcHBlci54MiAqIHRoaXMubWF4U2l6ZSgpLndpZHRoIC8gb2xkTWF4U2l6ZS53aWR0aCxcbiAgICAgICAgeTE6IGNyb3BwZXIueTEgKiB0aGlzLm1heFNpemUoKS5oZWlnaHQgLyBvbGRNYXhTaXplLmhlaWdodCxcbiAgICAgICAgeTI6IGNyb3BwZXIueTIgKiB0aGlzLm1heFNpemUoKS5oZWlnaHQgLyBvbGRNYXhTaXplLmhlaWdodFxuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuXG4gIG1heFNpemVDcm9wcGVyUG9zaXRpb24oKTogQ3JvcHBlclBvc2l0aW9uIHtcbiAgICByZXR1cm4ge1xuICAgICAgeDE6IDAsXG4gICAgICB5MTogMCxcbiAgICAgIHgyOiB0aGlzLm1heFNpemUoKS53aWR0aCxcbiAgICAgIHkyOiB0aGlzLm1heFNpemUoKS5oZWlnaHRcbiAgICB9O1xuICB9XG5cbiAgdG9Dcm9wSW5wdXQoKTogQ3JvcElucHV0IHtcbiAgICByZXR1cm4ge1xuICAgICAgY3JvcHBlcjogdGhpcy5jcm9wcGVyKCksXG4gICAgICBtYXhTaXplOiB0aGlzLm1heFNpemUoKSxcbiAgICAgIHRyYW5zZm9ybTogdGhpcy50cmFuc2Zvcm0sXG4gICAgICBsb2FkZWRJbWFnZTogdGhpcy5sb2FkZWRJbWFnZSEsXG4gICAgICBvcHRpb25zOiB7Li4udGhpcy5vcHRpb25zfVxuICAgIH07XG4gIH1cbn1cbiJdfQ==