UNPKG

ng-yunzai-mobile

Version:

1. 适配yunzai_uni_app_x

292 lines 25.8 kB
/** * @fileoverview added by tsickle * Generated from: img-cropper/yz-img-cropper/yz-img-cropper.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; import { ToastService } from "ng-zorro-antd-mobile"; import imageCompression from "browser-image-compression"; export class YzImgCropperComponent { /** * @param {?} dialogRef * @param {?} _toast * @param {?} data */ constructor(dialogRef, _toast, data) { this.dialogRef = dialogRef; this._toast = _toast; this.data = data; this.cropperStyle = { height: window.innerHeight - 142 + 'px', width: '100%', padding: 0, display: 'flex', 'align-items': 'center', 'justify-content': 'center', 'align-content': 'center', 'flex-wrap': 'wrap' }; this.imageChangedEvent = null; this.imageBase64 = null; this.imageBlobFile = null; this.croppedImage = null; this.showImg = false; this.imgInfo = { width: 0, height: 0 }; this.canvasRotation = 0; this.transform = {}; this.scale = 1; // 图片压缩进度 this.percent = 0; } /** * @return {?} */ ngOnInit() { if (this.data.imgFile) { this.fileChangeEvent(this.data.imgFile); } else { this._toast.info('请选择上传图片!'); } } /** * @param {?} event * @return {?} */ fileChangeEvent(event) { if (this.data.fileType == 'FileEvent' || !this.data.fileType) { this.imageChangedEvent = event; this.imageBase64 = null; this.imageBlobFile = null; } else if (this.data.fileType == 'Base64') { this.imageChangedEvent = null; this.imageBase64 = event; this.imageBlobFile = null; } else if (this.data.fileType == 'BlobFile') { this.imageChangedEvent = null; this.imageBase64 = null; this.imageBlobFile = event; } } // 每次裁剪图像时发出 /** * @param {?} event * @return {?} */ imageCropped(event) { this.croppedImage = event.base64; this.imgInfo = event; } // 选择错误的文件类型时发出(仅允许png、gif和jpg) /** * @return {?} */ loadImageFailed() { this._toast.info(`图片选择失败!`); } // 还原图片大小 /** * @return {?} */ resetImage() { this.scale = 1; this.canvasRotation = 0; this.transform = {}; } // 取消裁剪 /** * @return {?} */ cancelCropper() { this.imageChangedEvent = null; this.imageBase64 = null; this.imageBlobFile = null; this.croppedImage = null; this.showImg = false; this.percent = 0; this.imgInfo = { width: 0, height: 0 }; this.dialogRef.close(); this.resetImage(); } // 裁剪完毕=>压缩图片 /** * @return {?} */ confirmCropper() { if (!this.croppedImage) return; this.dataURLtoFile(this.croppedImage, 'img_name'); } /** * @param {?} dataurl * @param {?} filename * @return {?} */ dataURLtoFile(dataurl, filename) { /** @type {?} */ const arr = dataurl.split(','); /** @type {?} */ const mime = arr[0].match(/:(.*?);/)[1]; /** @type {?} */ const bstr = atob(arr[1]); /** @type {?} */ let n = bstr.length; /** @type {?} */ const u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } /** @type {?} */ const file = new File([u8arr], filename, { type: mime }); this.compressImage(file); } // 图片压缩 https://www.npmjs.com/package/browser-image-compression /** * @param {?} imageFile * @return {?} */ compressImage(imageFile) { return tslib_1.__awaiter(this, void 0, void 0, function* () { /** @type {?} */ const options = { maxSizeMB: this.data.maxSizeMB, maxWidthOrHeight: this.data.maxWidthOrHeight, fileType: `image/${this.data.format}`, useWebWorker: true, onProgress: (/** * @param {?} res * @return {?} */ (res) => { this.percent = res; }) }; try { /** @type {?} */ const compressedFile = yield imageCompression(imageFile, options); this.blobToBase64(compressedFile, (/** * @param {?} dataurl * @return {?} */ (dataurl) => { this.dialogRef.close(dataurl); })); this.cancelCropper(); } catch (error) { console.error('图片压缩失败!'); } }); } /** * @param {?} blob * @param {?} callback * @return {?} */ blobToBase64(blob, callback) { /** @type {?} */ const fileReader = new FileReader(); fileReader.onload = (/** * @param {?} e * @return {?} */ (e) => { callback(e.target['result']); }); fileReader.readAsDataURL(blob); } } YzImgCropperComponent.decorators = [ { type: Component, args: [{ selector: 'yz-img-cropper', template: "<yz-loading-mask *ngIf=\"percent>0 && percent<100\"></yz-loading-mask>\r\n<div class=\"yz-img-cropper\">\r\n\r\n <image-cropper\r\n *ngIf=\"!showImg\"\r\n [imageChangedEvent]=\"imageChangedEvent\"\r\n [imageBase64]=\"imageBase64\"\r\n [imageFile]=\"imageBlobFile\"\r\n [containWithinAspectRatio]=\"data.containWithinAspectRatio\"\r\n [maintainAspectRatio]=\"true\"\r\n [format]=\"data.format\"\r\n [onlyScaleDown]=\"true\"\r\n [aspectRatio]=\"data.aspectRatio\"\r\n [imageQuality]=\"data.imageQuality\"\r\n [transform]=\"transform\"\r\n [canvasRotation]=\"canvasRotation\"\r\n (imageCropped)=\"imageCropped($event)\"\r\n (loadImageFailed)=\"loadImageFailed()\"\r\n [ngStyle]=\"cropperStyle\"\r\n ></image-cropper>\r\n\r\n <!-- \u88C1\u526A\u540E\u7684\u56FE\u7247-->\r\n <div *ngIf=\"showImg\" class=\"yz-img-cropper-img\" [ngStyle]=\"cropperStyle\">\r\n <img [src]=\"croppedImage\"/>\r\n <b>\u50CF\u7D20\uFF1A{{imgInfo.width}}*{{imgInfo.height}}</b>\r\n </div>\r\n\r\n <div class=\"yz-img-cropper-btn\">\r\n <div Button [type]=\"'primary'\" *ngIf=\"!showImg\" (onClick)=\"showImg=true\">\u786E\u5B9A</div>\r\n <!--\u53D6\u6D88\u88C1\u526A-->\r\n <div Button *ngIf=\"!showImg\" (onClick)=\"cancelCropper()\">\u53D6\u6D88</div>\r\n\r\n <div Button [type]=\"'primary'\" *ngIf=\"showImg\" (onClick)=\"confirmCropper()\">\u5B8C\u6210</div>\r\n <!-- \u91CD\u65B0\u88C1\u526A-->\r\n <div Button *ngIf=\"showImg\" (onClick)=\"showImg=false\">\u53D6\u6D88</div>\r\n </div>\r\n\r\n</div>\r\n", styles: ["::ng-deep .yz-img-cropper-panel{position:fixed!important;top:0;left:0;z-index:10;width:100%;height:100%;background:#fff;max-width:unset!important}::ng-deep .yz-img-cropper-panel .mat-dialog-container{padding:0;border-radius:0;transform:none!important}::ng-deep .yz-img-cropper-btn{margin:16px}::ng-deep .yz-img-cropper-btn .am-button{margin-bottom:16px}.yz-img-cropper-img{width:100%;background:#fff}.yz-img-cropper-img img{display:block;max-width:100%;margin:0 auto 16px}.yz-img-cropper-img b{font-size:16px;text-align:center;display:block}"] }] } ]; /** @nocollapse */ YzImgCropperComponent.ctorParameters = () => [ { type: MatDialogRef }, { type: ToastService }, { type: ComponentOption, decorators: [{ type: Inject, args: [MAT_DIALOG_DATA,] }] } ]; if (false) { /** @type {?} */ YzImgCropperComponent.prototype.cropperStyle; /** @type {?} */ YzImgCropperComponent.prototype.imageChangedEvent; /** @type {?} */ YzImgCropperComponent.prototype.imageBase64; /** @type {?} */ YzImgCropperComponent.prototype.imageBlobFile; /** @type {?} */ YzImgCropperComponent.prototype.croppedImage; /** @type {?} */ YzImgCropperComponent.prototype.showImg; /** @type {?} */ YzImgCropperComponent.prototype.imgInfo; /** @type {?} */ YzImgCropperComponent.prototype.canvasRotation; /** @type {?} */ YzImgCropperComponent.prototype.transform; /** @type {?} */ YzImgCropperComponent.prototype.scale; /** @type {?} */ YzImgCropperComponent.prototype.percent; /** @type {?} */ YzImgCropperComponent.prototype.dialogRef; /** * @type {?} * @private */ YzImgCropperComponent.prototype._toast; /** @type {?} */ YzImgCropperComponent.prototype.data; } // 组件参数 export class ComponentOption { constructor() { // 上传的图片文件 this.fileType = 'FileEvent'; // 上传的图片文件类型 'FileEvent' | 'Base64' | 'BlobFile' // 上传的图片文件类型 'FileEvent' | 'Base64' | 'BlobFile' this.containWithinAspectRatio = false; // 设置为true时,将在图像周围添加填充以使其适合纵横比,默认false // 设置为true时,将在图像周围添加填充以使其适合纵横比,默认false this.format = 'png'; // 输出格式(png、jpeg、webp、bmp、ico)(并非所有浏览器都支持所有类型,始终支持png,其他为可选),默认png // 输出格式(png、jpeg、webp、bmp、ico)(并非所有浏览器都支持所有类型,始终支持png,其他为可选),默认png this.imageQuality = 92; // 这仅适用于使用jpeg或webp作为输出格式时。输入介于0和100之间的数字将决定输出图像的质量,默认92。 // 这仅适用于使用jpeg或webp作为输出格式时。输入介于0和100之间的数字将决定输出图像的质量,默认92。 this.aspectRatio = 1 / 1; // 图片宽度/高度比(例如,正方形为1/1,4/3,16/9…),默认1/1 // 图片宽度/高度比(例如,正方形为1/1,4/3,16/9…),默认1/1 this.maxSizeMB = 1; // 裁剪压缩后的图片大小的最大值,默认1MB // 裁剪压缩后的图片大小的最大值,默认1MB this.maxWidthOrHeight = 100; // 裁剪压缩后的图片的最大宽度或高度,默认100 } } if (false) { /** @type {?} */ ComponentOption.prototype.imgFile; /** @type {?} */ ComponentOption.prototype.fileType; /** @type {?} */ ComponentOption.prototype.containWithinAspectRatio; /** @type {?} */ ComponentOption.prototype.format; /** @type {?} */ ComponentOption.prototype.imageQuality; /** @type {?} */ ComponentOption.prototype.aspectRatio; /** @type {?} */ ComponentOption.prototype.maxSizeMB; /** @type {?} */ ComponentOption.prototype.maxWidthOrHeight; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieXotaW1nLWNyb3BwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmcteXVuemFpLW1vYmlsZS8iLCJzb3VyY2VzIjpbImltZy1jcm9wcGVyL3l6LWltZy1jcm9wcGVyL3l6LWltZy1jcm9wcGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUV4RCxPQUFPLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLGdCQUFnQixNQUFNLDJCQUEyQixDQUFDO0FBT3pELE1BQU0sT0FBTyxxQkFBcUI7Ozs7OztJQStCaEMsWUFBbUIsU0FBOEMsRUFDN0MsTUFBb0IsRUFDSSxJQUFxQjtRQUY5QyxjQUFTLEdBQVQsU0FBUyxDQUFxQztRQUM3QyxXQUFNLEdBQU4sTUFBTSxDQUFjO1FBQ0ksU0FBSSxHQUFKLElBQUksQ0FBaUI7UUEvQmpFLGlCQUFZLEdBQUc7WUFDYixNQUFNLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxHQUFHLEdBQUcsSUFBSTtZQUN2QyxLQUFLLEVBQUUsTUFBTTtZQUNiLE9BQU8sRUFBRSxDQUFDO1lBQ1YsT0FBTyxFQUFFLE1BQU07WUFDZixhQUFhLEVBQUUsUUFBUTtZQUN2QixpQkFBaUIsRUFBRSxRQUFRO1lBQzNCLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLFdBQVcsRUFBRSxNQUFNO1NBQ3BCLENBQUM7UUFFRixzQkFBaUIsR0FBUSxJQUFJLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxJQUFJLENBQUM7UUFDM0Isa0JBQWEsR0FBUyxJQUFJLENBQUM7UUFFM0IsaUJBQVksR0FBUSxJQUFJLENBQUM7UUFDekIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixZQUFPLEdBQUc7WUFDUixLQUFL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QUMsa0VBQWtFOztRQUMzRixpQkFBWSxHQUFZLEVBQUUsQ0FBQyxDQUFDLHlEQUF5RDs7UUFDckYsZ0JBQVcsR0FBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsdUNBQXVDOztRQUNyRSxjQUFTLEdBQVksQ0FBQyxDQUFDLENBQUMsdUJBQXVCOztRQUMvQyxxQkFBZ0IsR0FBWSxHQUFHLENBQUMsQ0FBQyx5QkFBeUI7SUFDNUQsQ0FBQztDQUFBOzs7SUFSQyxrQ0FBYTs7SUFDYixtQ0FBZ0M7O0lBQ2hDLG1EQUEyQzs7SUFDM0MsaUNBQXdCOztJQUN4Qix1Q0FBMkI7O0lBQzNCLHNDQUE2Qjs7SUFDN0Isb0NBQXVCOztJQUN2QiwyQ0FBZ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0ltYWdlQ3JvcHBlZEV2ZW50LCBJbWFnZVRyYW5zZm9ybX0gZnJvbSBcIm5neC1pbWFnZS1jcm9wcGVyXCI7XHJcbmltcG9ydCB7TUFUX0RJQUxPR19EQVRBLCBNYXREaWFsb2dSZWZ9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtUb2FzdFNlcnZpY2V9IGZyb20gXCJuZy16b3Jyby1hbnRkLW1vYmlsZVwiO1xyXG5pbXBvcnQgaW1hZ2VDb21wcmVzc2lvbiBmcm9tIFwiYnJvd3Nlci1pbWFnZS1jb21wcmVzc2lvblwiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICd5ei1pbWctY3JvcHBlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3l6LWltZy1jcm9wcGVyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi95ei1pbWctY3JvcHBlci5jb21wb25lbnQubGVzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBZekltZ0Nyb3BwZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBjcm9wcGVyU3R5bGUgPSB7XHJcbiAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCAtIDE0MiArICdweCcsXHJcbiAgICB3aWR0aDogJzEwMCUnLFxyXG4gICAgcGFkZGluZzogMCxcclxuICAgIGRpc3BsYXk6ICdmbGV4JyxcclxuICAgICdhbGlnbi1pdGVtcyc6ICdjZW50ZXInLFxyXG4gICAgJ2p1c3RpZnktY29udGVudCc6ICdjZW50ZXInLFxyXG4gICAgJ2FsaWduLWNvbnRlbnQnOiAnY2VudGVyJyxcclxuICAgICdmbGV4LXdyYXAnOiAnd3JhcCdcclxuICB9O1xyXG5cclxuICBpbWFnZUNoYW5nZWRFdmVudDogYW55ID0gbnVsbDtcclxuICBpbWFnZUJhc2U2NDogc3RyaW5nID0gbnVsbDtcclxuICBpbWFnZUJsb2JGaWxlOiBCbG9iID0gbnVsbDtcclxuXHJcbiAgY3JvcHBlZEltYWdlOiBhbnkgPSBudWxsO1xyXG4gIHNob3dJbWc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpbWdJbmZvID0ge1xyXG4gICAgd2lkdGg6IDAsXHJcbiAgICBoZWlnaHQ6IDBcclxuICB9O1xyXG5cclxuICBjYW52YXNSb3RhdGlvbiA9IDA7XHJcbiAgdHJhbnNmb3JtOiBJbWFnZVRyYW5zZm9ybSA9IHt9O1xyXG4gIHNjYWxlID0gMTtcclxuXHJcbiAgLy8g5Zu+54mH5Y6L57yp6L+b5bqmXHJcbiAgcGVyY2VudCA9IDA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxZekltZ0Nyb3BwZXJDb21wb25lbnQ+LFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RvYXN0OiBUb2FzdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBDb21wb25lbnRPcHRpb24pIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMuZGF0YS5pbWdGaWxlKSB7XHJcbiAgICAgIHRoaXMuZmlsZUNoYW5nZUV2ZW50KHRoaXMuZGF0YS5pbWdGaWxlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX3RvYXN0LmluZm8oJ+ivt+mAieaLqeS4iuS8oOWbvueJh++8gScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZmlsZUNoYW5nZUV2ZW50KGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRhdGEuZmlsZVR5cGUgPT0gJ0ZpbGVFdmVudCcgfHwgIXRoaXMuZGF0YS5maWxlVHlwZSkge1xyXG4gICAgICB0aGlzLmltYWdlQ2hhbmdlZEV2ZW50ID0gZXZlbnQ7XHJcbiAgICAgIHRoaXMuaW1hZ2VCYXNlNjQgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlQmxvYkZpbGUgPSBudWxsO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuZmlsZVR5cGUgPT0gJ0Jhc2U2NCcpIHtcclxuICAgICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IG51bGw7XHJcbiAgICAgIHRoaXMuaW1hZ2VCYXNlNjQgPSBldmVudDtcclxuICAgICAgdGhpcy5pbWFnZUJsb2JGaWxlID0gbnVsbDtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmZpbGVUeXBlID09ICdCbG9iRmlsZScpIHtcclxuICAgICAgdGhpcy5pbWFnZUNoYW5nZWRFdmVudCA9IG51bGw7XHJcbiAgICAgIHRoaXMuaW1hZ2VCYXNlNjQgPSBudWxsO1xyXG4gICAgICB0aGlzLmltYWdlQmxvYkZpbGUgPSBldmVudDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIOavj+asoeijgeWJquWbvuWDj+aXtuWPkeWHulxyXG4gIGltYWdlQ3JvcHBlZChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpIHtcclxuICAgIHRoaXMuY3JvcHBlZEltYWdlID0gZXZlbnQuYmFzZTY0O1xyXG4gICAgdGhpcy5pbWdJbmZvID0gZXZlbnQ7XHJcbiAgfVxyXG5cclxuICAvLyDpgInmi6nplJnor6/nmoTmlofku7bnsbvlnovml7blj5Hlh7rvvIjku4XlhYHorrhwbmfjgIFnaWblkoxqcGfvvIlcclxuICBsb2FkSW1hZ2VGYWlsZWQoKSB7XHJcbiAgICB0aGlzLl90b2FzdC5pbmZvKGDlm77niYfpgInmi6nlpLHotKXvvIFgKTtcclxuICB9XHJcblxyXG5cclxuICAvLyDov5jljp/lm77niYflpKflsI9cclxuICByZXNldEltYWdlKCkge1xyXG4gICAgdGhpcy5zY2FsZSA9IDE7XHJcbiAgICB0aGlzLmNhbnZhc1JvdGF0aW9uID0gMDtcclxuICAgIHRoaXMudHJhbnNmb3JtID0ge307XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8g5Y+W5raI6KOB5YmqXHJcbiAgY2FuY2VsQ3JvcHBlcigpIHtcclxuICAgIHRoaXMuaW1hZ2VDaGFuZ2VkRXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5pbWFnZUJhc2U2NCA9IG51bGw7XHJcbiAgICB0aGlzLmltYWdlQmxvYkZpbGUgPSBudWxsO1xyXG5cclxuICAgIHRoaXMuY3JvcHBlZEltYWdlID0gbnVsbDtcclxuICAgIHRoaXMuc2hvd0ltZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZXJjZW50ID0gMDtcclxuICAgIHRoaXMuaW1nSW5mbyA9IHtcclxuICAgICAgd2lkdGg6IDAsXHJcbiAgICAgIGhlaWdodDogMFxyXG4gICAgfTtcclxuICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XHJcbiAgICB0aGlzLnJlc2V0SW1hZ2UoKTtcclxuICB9XHJcblxyXG4gIC8vIOijgeWJquWujOavlT0+5Y6L57yp5Zu+54mHXHJcbiAgY29uZmlybUNyb3BwZXIoKSB7XHJcbiAgICBpZighdGhpcy5jcm9wcGVkSW1hZ2UpIHJldHVybjtcclxuICAgIHRoaXMuZGF0YVVSTHRvRmlsZSh0aGlzLmNyb3BwZWRJbWFnZSwgJ2ltZ19uYW1lJyk7XHJcbiAgfVxyXG5cclxuICBkYXRhVVJMdG9GaWxlKGRhdGF1cmwsIGZpbGVuYW1lKSB7XHJcbiAgICBjb25zdCBhcnIgPSBkYXRhdXJsLnNwbGl0KCcsJyk7XHJcbiAgICBjb25zdCBtaW1lID0gYXJyWzBdLm1hdGNoKC86KC4qPyk7LylbMV07XHJcbiAgICBjb25zdCBic3RyID0gYXRvYihhcnJbMV0pO1xyXG4gICAgbGV0IG4gPSBic3RyLmxlbmd0aDtcclxuICAgIGNvbnN0IHU4YXJyID0gbmV3IFVpbnQ4QXJyYXkobik7XHJcbiAgICB3aGlsZSAobi0tKSB7XHJcbiAgICAgIHU4YXJyW25dID0gYnN0ci5jaGFyQ29kZUF0KG4pO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZmlsZSA9IG5ldyBGaWxlKFt1OGFycl0sIGZpbGVuYW1lLCB7dHlwZTogbWltZX0pO1xyXG4gICAgdGhpcy5jb21wcmVzc0ltYWdlKGZpbGUpO1xyXG4gIH1cclxuXHJcbiAgLy8g5Zu+54mH5Y6L57ypIGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2Jyb3dzZXItaW1hZ2UtY29tcHJlc3Npb25cclxuICBhc3luYyBjb21wcmVzc0ltYWdlKGltYWdlRmlsZSkge1xyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcclxuICAgICAgbWF4U2l6ZU1COiB0aGlzLmRhdGEubWF4U2l6ZU1CLFxyXG4gICAgICBtYXhXaWR0aE9ySGVpZ2h0OiB0aGlzLmRhdGEubWF4V2lkdGhPckhlaWdodCxcclxuICAgICAgZmlsZVR5cGU6IGBpbWFnZS8ke3RoaXMuZGF0YS5mb3JtYXR9YCxcclxuICAgICAgdXNlV2ViV29ya2VyOiB0cnVlLFxyXG4gICAgICBvblByb2dyZXNzOiAocmVzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5wZXJjZW50ID0gcmVzO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY29tcHJlc3NlZEZpbGUgPSBhd2FpdCBpbWFnZUNvbXByZXNzaW9uKGltYWdlRmlsZSwgb3B0aW9ucyk7XHJcbiAgICAgIHRoaXMuYmxvYlRvQmFzZTY0KGNvbXByZXNzZWRGaWxlLCAoZGF0YXVybCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKGRhdGF1cmwpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5jYW5jZWxDcm9wcGVyKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCflm77niYfljovnvKnlpLHotKXvvIEnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJsb2JUb0Jhc2U2NChibG9iLCBjYWxsYmFjaykge1xyXG4gICAgY29uc3QgZmlsZVJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XHJcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9IChlKSA9PiB7XHJcbiAgICAgIGNhbGxiYWNrKGUudGFyZ2V0WydyZXN1bHQnXSk7XHJcbiAgICB9O1xyXG4gICAgZmlsZVJlYWRlci5yZWFkQXNEYXRhVVJMKGJsb2IpO1xyXG4gIH1cclxufVxyXG5cclxuLy8g57uE5Lu25Y+C5pWwXHJcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRPcHRpb24ge1xyXG4gIGltZ0ZpbGU6IGFueTsgLy8g5LiK5Lyg55qE5Zu+54mH5paH5Lu2XHJcbiAgZmlsZVR5cGU/OiBzdHJpbmcgPSAnRmlsZUV2ZW50JzsgLy8g5LiK5Lyg55qE5Zu+54mH5paH5Lu257G75Z6LICdGaWxlRXZlbnQnIHwgJ0Jhc2U2NCcgfCAnQmxvYkZpbGUnXHJcbiAgY29udGFpbldpdGhpbkFzcGVjdFJhdGlvPzogYm9vbGVhbiA9IGZhbHNlOyAvLyDorr7nva7kuLp0cnVl5pe277yM5bCG5Zyo5Zu+5YOP5ZGo5Zu05re75Yqg5aGr5YWF5Lul5L2/5YW26YCC5ZCI57q15qiq5q+ULOm7mOiupGZhbHNlXHJcbiAgZm9ybWF0Pzogc3RyaW5nID0gJ3BuZyc7IC8vIOi+k+WHuuagvOW8j++8iHBuZ+OAgWpwZWfjgIF3ZWJw44CBYm1w44CBaWNv77yJ77yI5bm26Z2e5omA5pyJ5rWP6KeI5Zmo6YO95pSv5oyB5omA5pyJ57G75Z6L77yM5aeL57uI5pSv5oyBcG5n77yM5YW25LuW5Li65Y+v6YCJ77yJ77yM6buY6K6kcG5nXHJcbiAgaW1hZ2VRdWFsaXR5PzogbnVtYmVyID0gOTI7IC8vIOi/meS7hemAgueUqOS6juS9v+eUqGpwZWfmiJZ3ZWJw5L2c5Li66L6T5Ye65qC85byP5pe244CC6L6T5YWl5LuL5LqOMOWSjDEwMOS5i+mXtOeahOaVsOWtl+WwhuWGs+Wumui+k+WHuuWbvuWDj+eahOi0qOmHj++8jOm7mOiupDky44CCXHJcbiAgYXNwZWN0UmF0aW8/OiBudW1iZXIgPSAxIC8gMTsgLy8g5Zu+54mH5a695bqmL+mrmOW6puavlO+8iOS+i+Wmgu+8jOato+aWueW9ouS4ujEvMe+8jDQvM++8jDE2LznigKbvvInvvIzpu5jorqQxLzFcclxuICBtYXhTaXplTUI/OiBudW1iZXIgPSAxOyAvLyDoo4HliarljovnvKnlkI7nmoTlm77niYflpKflsI/nmoTmnIDlpKflgLzvvIzpu5jorqQxTUJcclxuICBtYXhXaWR0aE9ySGVpZ2h0PzogbnVtYmVyID0gMTAwOyAvLyDoo4HliarljovnvKnlkI7nmoTlm77niYfnmoTmnIDlpKflrr3luqbmiJbpq5jluqbvvIzpu5jorqQxMDBcclxufVxyXG4iXX0=