UNPKG

ng-zorro-antd

Version:

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

484 lines 40.7 kB
/** * @fileoverview added by tsickle * Generated from: upload-list.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Alibaba.com All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { animate, style, transition, trigger } from '@angular/animations'; import { Platform } from '@angular/cdk/platform'; import { DOCUMENT } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, Input, NgZone, TemplateRef, ViewEncapsulation } from '@angular/core'; /** @type {?} */ var isImageFileType = (/** * @param {?} type * @return {?} */ function (type) { return !!type && type.indexOf('image/') === 0; }); var ɵ0 = isImageFileType; /** @type {?} */ var MEASURE_SIZE = 200; /** * @record */ function UploadListFile() { } if (false) { /** @type {?|undefined} */ UploadListFile.prototype.isImageUrl; /** @type {?|undefined} */ UploadListFile.prototype.isUploading; /** @type {?|undefined} */ UploadListFile.prototype.iconType; /** @type {?|undefined} */ UploadListFile.prototype.listItemNameCls; /** @type {?|undefined} */ UploadListFile.prototype.showDownload; } var NzUploadListComponent = /** @class */ (function () { // #endregion function NzUploadListComponent(cdr, doc, ngZone, platform) { this.cdr = cdr; this.doc = doc; this.ngZone = ngZone; this.platform = platform; this.locale = {}; } Object.defineProperty(NzUploadListComponent.prototype, "showPic", { get: /** * @private * @return {?} */ function () { return this.listType === 'picture' || this.listType === 'picture-card'; }, enumerable: true, configurable: true }); Object.defineProperty(NzUploadListComponent.prototype, "items", { set: /** * @param {?} list * @return {?} */ function (list) { this.list = list; }, enumerable: true, configurable: true }); /** * @private * @param {?} file * @return {?} */ NzUploadListComponent.prototype.genErr = /** * @private * @param {?} file * @return {?} */ function (file) { if (file.response && typeof file.response === 'string') { return file.response; } return (file.error && file.error.statusText) || this.locale.uploadError; }; /** * @private * @param {?} url * @return {?} */ NzUploadListComponent.prototype.extname = /** * @private * @param {?} url * @return {?} */ function (url) { /** @type {?} */ var temp = url.split('/'); /** @type {?} */ var filename = temp[temp.length - 1]; /** @type {?} */ var filenameWithoutSuffix = filename.split(/#|\?/)[0]; return (/\.[^./\\]*$/.exec(filenameWithoutSuffix) || [''])[0]; }; /** * @param {?} file * @return {?} */ NzUploadListComponent.prototype.isImageUrl = /** * @param {?} file * @return {?} */ function (file) { if (isImageFileType((/** @type {?} */ (file.type)))) { return true; } /** @type {?} */ var url = (/** @type {?} */ ((file.thumbUrl || file.url || ''))); if (!url) { return false; } /** @type {?} */ var extension = this.extname(url); if (/^data:image\//.test(url) || /(webp|svg|png|gif|jpg|jpeg|jfif|bmp|dpg)$/i.test(extension)) { return true; } else if (/^data:/.test(url)) { // other file types of base64 return false; } else if (extension) { // other file types which have extension return false; } return true; }; /** * @private * @param {?} file * @return {?} */ NzUploadListComponent.prototype.getIconType = /** * @private * @param {?} file * @return {?} */ function (file) { if (!this.showPic) { return ''; } if (file.isUploading || (!file.thumbUrl && !file.url)) { return 'uploading'; } else { return 'thumbnail'; } }; /** * @private * @param {?} file * @return {?} */ NzUploadListComponent.prototype.previewImage = /** * @private * @param {?} file * @return {?} */ function (file) { var _this = this; return new Promise((/** * @param {?} resolve * @return {?} */ function (resolve) { if (!isImageFileType(file.type)) { resolve(''); return; } _this.ngZone.runOutsideAngular((/** * @return {?} */ function () { /** @type {?} */ var canvas = _this.doc.createElement('canvas'); canvas.width = MEASURE_SIZE; canvas.height = MEASURE_SIZE; canvas.style.cssText = "position: fixed; left: 0; top: 0; width: " + MEASURE_SIZE + "px; height: " + MEASURE_SIZE + "px; z-index: 9999; display: none;"; _this.doc.body.appendChild(canvas); /** @type {?} */ var ctx = canvas.getContext('2d'); /** @type {?} */ var img = new Image(); img.onload = (/** * @return {?} */ function () { var width = img.width, height = img.height; /** @type {?} */ var drawWidth = MEASURE_SIZE; /** @type {?} */ var drawHeight = MEASURE_SIZE; /** @type {?} */ var offsetX = 0; /** @type {?} */ var offsetY = 0; if (width < height) { drawHeight = height * (MEASURE_SIZE / width); offsetY = -(drawHeight - drawWidth) / 2; } else { drawWidth = width * (MEASURE_SIZE / height); offsetX = -(drawWidth - drawHeight) / 2; } try { (/** @type {?} */ (ctx)).drawImage(img, offsetX, offsetY, drawWidth, drawHeight); } catch (_a) { } /** @type {?} */ var dataURL = canvas.toDataURL(); _this.doc.body.removeChild(canvas); resolve(dataURL); }); img.src = window.URL.createObjectURL(file); })); })); }; /** * @private * @return {?} */ NzUploadListComponent.prototype.genThumb = /** * @private * @return {?} */ function () { var _this = this; if (!this.platform.isBrowser) { return; } /** @type {?} */ var win = (/** @type {?} */ (window)); if (!this.showPic || typeof document === 'undefined' || typeof win === 'undefined' || !win.FileReader || !win.File) { return; } this.list .filter((/** * @param {?} file * @return {?} */ function (file) { return file.originFileObj instanceof File && file.thumbUrl === undefined; })) .forEach((/** * @param {?} file * @return {?} */ function (file) { file.thumbUrl = ''; (_this.previewFile ? _this.previewFile(file).toPromise() : _this.previewImage((/** @type {?} */ (file.originFileObj)))).then((/** * @param {?} dataUrl * @return {?} */ function (dataUrl) { file.thumbUrl = dataUrl; _this.detectChanges(); })); })); }; /** * @private * @param {?} file * @return {?} */ NzUploadListComponent.prototype.listItemNameCls = /** * @private * @param {?} file * @return {?} */ function (file) { var _a; /** @type {?} */ var count = [this.showDownload(file), this.icons.showRemoveIcon].filter((/** * @param {?} x * @return {?} */ function (x) { return x; })).length; return _a = {}, _a["ant-upload-list-item-name"] = true, _a["ant-upload-list-item-name-icon-count-" + count] = true, _a; }; /** * @private * @param {?} file * @return {?} */ NzUploadListComponent.prototype.showDownload = /** * @private * @param {?} file * @return {?} */ function (file) { return !!(this.icons.showDownloadIcon && file.status === 'done'); }; /** * @private * @return {?} */ NzUploadListComponent.prototype.fixData = /** * @private * @return {?} */ function () { var _this = this; this.list.forEach((/** * @param {?} file * @return {?} */ function (file) { file.message = _this.genErr(file); file.linkProps = typeof file.linkProps === 'string' ? JSON.parse(file.linkProps) : file.linkProps; file.isImageUrl = _this.isImageUrl(file); file.iconType = _this.getIconType(file); file.isUploading = file.status === 'uploading'; file.listItemNameCls = _this.listItemNameCls(file); file.showDownload = _this.showDownload(file); })); }; /** * @param {?} file * @param {?} e * @return {?} */ NzUploadListComponent.prototype.handlePreview = /** * @param {?} file * @param {?} e * @return {?} */ function (file, e) { if (!this.onPreview) { return; } e.preventDefault(); return this.onPreview(file); }; /** * @param {?} file * @param {?} e * @return {?} */ NzUploadListComponent.prototype.handleRemove = /** * @param {?} file * @param {?} e * @return {?} */ function (file, e) { e.preventDefault(); if (this.onRemove) { this.onRemove(file); } return; }; /** * @param {?} file * @return {?} */ NzUploadListComponent.prototype.handleDownload = /** * @param {?} file * @return {?} */ function (file) { if (typeof this.onDownload === 'function') { this.onDownload(file); } else if (file.url) { window.open(file.url); } }; /** * @return {?} */ NzUploadListComponent.prototype.detectChanges = /** * @return {?} */ function () { this.fixData(); this.cdr.detectChanges(); }; /** * @return {?} */ NzUploadListComponent.prototype.ngOnChanges = /** * @return {?} */ function () { this.fixData(); this.genThumb(); }; NzUploadListComponent.decorators = [ { type: Component, args: [{ selector: 'nz-upload-list', exportAs: 'nzUploadList', template: "<div\n *ngFor=\"let file of list\"\n class=\"ant-upload-list-item ant-upload-list-item-{{\n file.status\n }} ant-upload-list-item-list-type-{{ listType }}\"\n [attr.data-key]=\"file.key\"\n @itemState\n nz-tooltip\n [nzTooltipTitle]=\"file.status === 'error' ? file.message : null\"\n>\n <ng-template #icon>\n <ng-container [ngSwitch]=\"file.iconType\">\n <div\n *ngSwitchCase=\"'uploading'\"\n class=\"ant-upload-list-item-thumbnail\"\n [class.ant-upload-list-item-file]=\"!file.isUploading\"\n >\n <ng-template\n [ngTemplateOutlet]=\"iconNode\"\n [ngTemplateOutletContext]=\"{ $implicit: file }\"\n ></ng-template>\n </div>\n <a\n *ngSwitchCase=\"'thumbnail'\"\n class=\"ant-upload-list-item-thumbnail\"\n [class.ant-upload-list-item-file]=\"!file.isImageUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [href]=\"file.url || file.thumbUrl\"\n (click)=\"handlePreview(file, $event)\"\n >\n <img\n *ngIf=\"file.isImageUrl; else noImageThumbTpl\"\n class=\"ant-upload-list-item-image\"\n [src]=\"file.thumbUrl || file.url\"\n [attr.alt]=\"file.name\"\n />\n </a>\n <span *ngSwitchDefault class=\"ant-upload-text-icon\">\n <ng-template\n [ngTemplateOutlet]=\"iconNode\"\n [ngTemplateOutletContext]=\"{ $implicit: file }\"\n ></ng-template>\n </span>\n </ng-container>\n <ng-template #noImageThumbTpl>\n <ng-template\n [ngTemplateOutlet]=\"iconNode\"\n [ngTemplateOutletContext]=\"{ $implicit: file }\"\n ></ng-template>\n </ng-template>\n </ng-template>\n <ng-template #iconNode let-file>\n <ng-container *ngIf=\"!iconRender; else iconRender\">\n <ng-container [ngSwitch]=\"listType\">\n <ng-container *ngSwitchCase=\"'picture'\">\n <ng-container *ngIf=\"file.isUploading; else iconNodeFileIcon\">\n <i nz-icon nzType=\"loading\"></i>\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'picture-card'\">\n <ng-container *ngIf=\"file.isUploading; else iconNodeFileIcon\">{{\n locale.uploading\n }}</ng-container>\n </ng-container>\n <i *ngSwitchDefault nz-icon [nzType]=\"file.isUploading ? 'loading' : 'paper-clip'\"></i>\n </ng-container>\n </ng-container>\n <ng-template #iconNodeFileIcon>\n <i nz-icon [nzType]=\"file.isImageUrl ? 'picture' : 'file'\" nzTheme=\"twotone\"></i>\n </ng-template>\n </ng-template>\n <ng-template #downloadOrDelete>\n <span\n *ngIf=\"listType !== 'picture-card'\"\n class=\"ant-upload-list-item-card-actions {{ listType === 'picture' ? 'picture' : '' }}\"\n >\n <a *ngIf=\"file.showDownload\" title=\"{{ locale.downloadFile }}\">\n <ng-template [ngTemplateOutlet]=\"downloadIcon\"></ng-template>\n </a>\n <a *ngIf=\"icons.showRemoveIcon\" title=\"{{ locale.removeFile }}\">\n <ng-template [ngTemplateOutlet]=\"removeIcon\"></ng-template>\n </a>\n </span>\n </ng-template>\n <ng-template #preview>\n <a\n *ngIf=\"file.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n [ngClass]=\"file.listItemNameCls\"\n title=\"{{ file.name }}\"\n [href]=\"file.url\"\n [attr.download]=\"file.linkProps && file.linkProps.download\"\n (click)=\"handlePreview(file, $event)\"\n >{{ file.name }}</a\n >\n <span\n *ngIf=\"!file.url\"\n [ngClass]=\"file.listItemNameCls\"\n title=\"{{ file.name }}\"\n (click)=\"handlePreview(file, $event)\"\n >{{ file.name }}</span\n >\n <ng-template [ngTemplateOutlet]=\"downloadOrDelete\"></ng-template>\n </ng-template>\n <ng-template #removeIcon>\n <i\n *ngIf=\"icons.showRemoveIcon\"\n (click)=\"handleRemove(file, $event)\"\n nz-icon\n nzType=\"delete\"\n title=\"{{ locale.removeFile }}\"\n ></i>\n </ng-template>\n <ng-template #downloadIcon>\n <i\n *ngIf=\"file.showDownload\"\n (click)=\"handleDownload(file)\"\n nz-icon\n nzType=\"download\"\n title=\"{{ locale.downloadFile }}\"\n ></i>\n </ng-template>\n <div class=\"ant-upload-list-item-info\">\n <span>\n <ng-template [ngTemplateOutlet]=\"icon\"></ng-template>\n <ng-template [ngTemplateOutlet]=\"preview\"></ng-template>\n </span>\n </div>\n <span\n *ngIf=\"listType === 'picture-card' && !file.isUploading\"\n class=\"ant-upload-list-item-actions\"\n >\n <a\n *ngIf=\"icons.showPreviewIcon\"\n [href]=\"file.url || file.thumbUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n title=\"{{ locale.previewFile }}\"\n [ngStyle]=\"!(file.url || file.thumbUrl) && { opacity: 0.5, 'pointer-events': 'none' }\"\n (click)=\"handlePreview(file, $event)\"\n >\n <i nz-icon nzType=\"eye\"></i>\n </a>\n <ng-template [ngTemplateOutlet]=\"downloadIcon\"></ng-template>\n <ng-template [ngTemplateOutlet]=\"removeIcon\"></ng-template>\n </span>\n <div *ngIf=\"file.isUploading\" class=\"ant-upload-list-item-progress\">\n <nz-progress\n [nzPercent]=\"file.percent\"\n nzType=\"line\"\n [nzShowInfo]=\"false\"\n [nzStrokeWidth]=\"2\"\n ></nz-progress>\n </div>\n</div>\n", animations: [ trigger('itemState', [ transition(':enter', [style({ height: '0', width: '0', opacity: 0 }), animate(150, style({ height: '*', width: '*', opacity: 1 }))]), transition(':leave', [animate(150, style({ height: '0', width: '0', opacity: 0 }))]) ]) ], host: { '[class.ant-upload-list]': "true", '[class.ant-upload-list-text]': "listType === 'text'", '[class.ant-upload-list-picture]': "listType === 'picture'", '[class.ant-upload-list-picture-card]': "listType === 'picture-card'" }, preserveWhitespaces: false, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ NzUploadListComponent.ctorParameters = function () { return [ { type: ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }, { type: NgZone }, { type: Platform } ]; }; NzUploadListComponent.propDecorators = { locale: [{ type: Input }], listType: [{ type: Input }], items: [{ type: Input }], icons: [{ type: Input }], onPreview: [{ type: Input }], onRemove: [{ type: Input }], onDownload: [{ type: Input }], previewFile: [{ type: Input }], iconRender: [{ type: Input }] }; return NzUploadListComponent; }()); export { NzUploadListComponent }; if (false) { /** @type {?} */ NzUploadListComponent.prototype.list; /** @type {?} */ NzUploadListComponent.prototype.locale; /** @type {?} */ NzUploadListComponent.prototype.listType; /** @type {?} */ NzUploadListComponent.prototype.icons; /** @type {?} */ NzUploadListComponent.prototype.onPreview; /** @type {?} */ NzUploadListComponent.prototype.onRemove; /** @type {?} */ NzUploadListComponent.prototype.onDownload; /** @type {?} */ NzUploadListComponent.prototype.previewFile; /** @type {?} */ NzUploadListComponent.prototype.iconRender; /** * @type {?} * @private */ NzUploadListComponent.prototype.cdr; /** * @type {?} * @private */ NzUploadListComponent.prototype.doc; /** * @type {?} * @private */ NzUploadListComponent.prototype.ngZone; /** * @type {?} * @private */ NzUploadListComponent.prototype.platform; } export { ɵ0 }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC91cGxvYWQvIiwic291cmNlcyI6WyJ1cGxvYWQtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUVOLFdBQVcsRUFDWCxpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7O0lBTWpCLGVBQWU7Ozs7QUFBRyxVQUFDLElBQVksSUFBYyxPQUFBLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQXRDLENBQXNDLENBQUE7OztJQUVuRixZQUFZLEdBQUcsR0FBRzs7OztBQUl4Qiw2QkFNQzs7O0lBTEMsb0NBQXFCOztJQUNyQixxQ0FBc0I7O0lBQ3RCLGtDQUE4Qjs7SUFDOUIseUNBQThCOztJQUM5QixzQ0FBdUI7O0FBR3pCO0lBc01FLGFBQWE7SUFFYiwrQkFDVSxHQUFzQixFQUNKLEdBQWMsRUFDaEMsTUFBYyxFQUNkLFFBQWtCO1FBSGxCLFFBQUcsR0FBSCxHQUFHLENBQW1CO1FBQ0osUUFBRyxHQUFILEdBQUcsQ0FBVztRQUNoQyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQWpMbkIsV0FBTSxHQUFjLEVBQUUsQ0FBQztJQWtMN0IsQ0FBQztJQXRMSixzQkFBWSwwQ0FBTzs7Ozs7UUFB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RSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs7OztnQkEvQ0MsaUJBQWlCO2dEQXNPZCxNQUFNLFNBQUMsUUFBUTtnQkFsT2xCLE1BQU07Z0JBUkMsUUFBUTs7O3lCQTJEZCxLQUFLOzJCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFJTCxLQUFLOzRCQUNMLEtBQUs7MkJBQ0wsS0FBSzs2QkFDTCxLQUFLOzhCQUNMLEtBQUs7NkJBQ0wsS0FBSzs7SUFrTFIsNEJBQUM7Q0FBQSxBQXhORCxJQXdOQztTQXBNWSxxQkFBcUI7OztJQUNoQyxxQ0FBdUI7O0lBTXZCLHVDQUFnQzs7SUFDaEMseUNBQWtDOztJQUtsQyxzQ0FBd0M7O0lBQ3hDLDBDQUErQzs7SUFDL0MseUNBQThDOztJQUM5QywyQ0FBZ0Q7O0lBQ2hELDRDQUErRDs7SUFDL0QsMkNBQXVDOzs7OztJQW1LckMsb0NBQThCOzs7OztJQUM5QixvQ0FBd0M7Ozs7O0lBQ3hDLHVDQUFzQjs7Ozs7SUFDdEIseUNBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEFsaWJhYmEuY29tIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9naXRodWIuY29tL05HLVpPUlJPL25nLXpvcnJvLWFudGQvYmxvYi9tYXN0ZXIvTElDRU5TRVxuICovXG5cbmltcG9ydCB7IGFuaW1hdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ2xhc3NUeXBlLCBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTaG93VXBsb2FkTGlzdEludGVyZmFjZSwgVXBsb2FkRmlsZSwgVXBsb2FkTGlzdFR5cGUgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmNvbnN0IGlzSW1hZ2VGaWxlVHlwZSA9ICh0eXBlOiBzdHJpbmcpOiBib29sZWFuID0+ICEhdHlwZSAmJiB0eXBlLmluZGV4T2YoJ2ltYWdlLycpID09PSAwO1xuXG5jb25zdCBNRUFTVVJFX1NJWkUgPSAyMDA7XG5cbnR5cGUgVXBsb2FkTGlzdEljb25UeXBlID0gJycgfCAndXBsb2FkaW5nJyB8ICd0aHVtYm5haWwnO1xuXG5pbnRlcmZhY2UgVXBsb2FkTGlzdEZpbGUgZXh0ZW5kcyBVcGxvYWRGaWxlIHtcbiAgaXNJbWFnZVVybD86IGJvb2xlYW47XG4gIGlzVXBsb2FkaW5nPzogYm9vbGVhbjtcbiAgaWNvblR5cGU/OiBVcGxvYWRMaXN0SWNvblR5cGU7XG4gIGxpc3RJdGVtTmFtZUNscz86IE5nQ2xhc3NUeXBlO1xuICBzaG93RG93bmxvYWQ/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduei11cGxvYWQtbGlzdCcsXG4gIGV4cG9ydEFzOiAnbnpVcGxvYWRMaXN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwbG9hZC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ2l0ZW1TdGF0ZScsIFtcbiAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtzdHlsZSh7IGhlaWdodDogJzAnLCB3aWR0aDogJzAnLCBvcGFjaXR5OiAwIH0pLCBhbmltYXRlKDE1MCwgc3R5bGUoeyBoZWlnaHQ6ICcqJywgd2lkdGg6ICcqJywgb3BhY2l0eTogMSB9KSldKSxcbiAgICAgIHRyYW5zaXRpb24oJzpsZWF2ZScsIFthbmltYXRlKDE1MCwgc3R5bGUoeyBoZWlnaHQ6ICcwJywgd2lkdGg6ICcwJywgb3BhY2l0eTogMCB9KSldKVxuICAgIF0pXG4gIF0sXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLmFudC11cGxvYWQtbGlzdF0nOiBgdHJ1ZWAsXG4gICAgJ1tjbGFzcy5hbnQtdXBsb2FkLWxpc3QtdGV4dF0nOiBgbGlzdFR5cGUgPT09ICd0ZXh0J2AsXG4gICAgJ1tjbGFzcy5hbnQtdXBsb2FkLWxpc3QtcGljdHVyZV0nOiBgbGlzdFR5cGUgPT09ICdwaWN0dXJlJ2AsXG4gICAgJ1tjbGFzcy5hbnQtdXBsb2FkLWxpc3QtcGljdHVyZS1jYXJkXSc6IGBsaXN0VHlwZSA9PT0gJ3BpY3R1cmUtY2FyZCdgXG4gIH0sXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBOelVwbG9hZExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBsaXN0OiBVcGxvYWRMaXN0RmlsZVtdO1xuXG4gIHByaXZhdGUgZ2V0IHNob3dQaWMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGlzdFR5cGUgPT09ICdwaWN0dXJlJyB8fCB0aGlzLmxpc3RUeXBlID09PSAncGljdHVyZS1jYXJkJztcbiAgfVxuXG4gIEBJbnB1dCgpIGxvY2FsZTogTnpTYWZlQW55ID0ge307XG4gIEBJbnB1dCgpIGxpc3RUeXBlOiBVcGxvYWRMaXN0VHlwZTtcbiAgQElucHV0KClcbiAgc2V0IGl0ZW1zKGxpc3Q6IFVwbG9hZEZpbGVbXSkge1xuICAgIHRoaXMubGlzdCA9IGxpc3Q7XG4gIH1cbiAgQElucHV0KCkgaWNvbnM6IFNob3dVcGxvYWRMaXN0SW50ZXJmYWNlO1xuICBASW5wdXQoKSBvblByZXZpZXc6IChmaWxlOiBVcGxvYWRGaWxlKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblJlbW92ZTogKGZpbGU6IFVwbG9hZEZpbGUpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uRG93bmxvYWQ6IChmaWxlOiBVcGxvYWRGaWxlKSA9PiB2b2lkO1xuICBASW5wdXQoKSBwcmV2aWV3RmlsZTogKGZpbGU6IFVwbG9hZEZpbGUpID0+IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgQElucHV0KCkgaWNvblJlbmRlcjogVGVtcGxhdGVSZWY8dm9pZD47XG5cbiAgcHJpdmF0ZSBnZW5FcnIoZmlsZTogVXBsb2FkRmlsZSk6IHN0cmluZyB7XG4gICAgaWYgKGZpbGUucmVzcG9uc2UgJiYgdHlwZW9mIGZpbGUucmVzcG9uc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmlsZS5yZXNwb25zZTtcbiAgICB9XG4gICAgcmV0dXJuIChmaWxlLmVycm9yICYmIGZpbGUuZXJyb3Iuc3RhdHVzVGV4dCkgfHwgdGhpcy5sb2NhbGUudXBsb2FkRXJyb3I7XG4gIH1cblxuICBwcml2YXRlIGV4dG5hbWUodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRlbXAgPSB1cmwuc3BsaXQoJy8nKTtcbiAgICBjb25zdCBmaWxlbmFtZSA9IHRlbXBbdGVtcC5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBmaWxlbmFtZVdpdGhvdXRTdWZmaXggPSBmaWxlbmFtZS5zcGxpdCgvI3xcXD8vKVswXTtcbiAgICByZXR1cm4gKC9cXC5bXi4vXFxcXF0qJC8uZXhlYyhmaWxlbmFtZVdpdGhvdXRTdWZmaXgpIHx8IFsnJ10pWzBdO1xuICB9XG5cbiAgaXNJbWFnZVVybChmaWxlOiBVcGxvYWRGaWxlKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzSW1hZ2VGaWxlVHlwZShmaWxlLnR5cGUhKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHVybDogc3RyaW5nID0gKGZpbGUudGh1bWJVcmwgfHwgZmlsZS51cmwgfHwgJycpIGFzIHN0cmluZztcbiAgICBpZiAoIXVybCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb24gPSB0aGlzLmV4dG5hbWUodXJsKTtcbiAgICBpZiAoL15kYXRhOmltYWdlXFwvLy50ZXN0KHVybCkgfHwgLyh3ZWJwfHN2Z3xwbmd8Z2lmfGpwZ3xqcGVnfGpmaWZ8Ym1wfGRwZykkL2kudGVzdChleHRlbnNpb24pKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKC9eZGF0YTovLnRlc3QodXJsKSkge1xuICAgICAgLy8gb3RoZXIgZmlsZSB0eXBlcyBvZiBiYXNlNjRcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGV4dGVuc2lvbikge1xuICAgICAgLy8gb3RoZXIgZmlsZSB0eXBlcyB3aGljaCBoYXZlIGV4dGVuc2lvblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SWNvblR5cGUoZmlsZTogVXBsb2FkTGlzdEZpbGUpOiBVcGxvYWRMaXN0SWNvblR5cGUge1xuICAgIGlmICghdGhpcy5zaG93UGljKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChmaWxlLmlzVXBsb2FkaW5nIHx8ICghZmlsZS50aHVtYlVybCAmJiAhZmlsZS51cmwpKSB7XG4gICAgICByZXR1cm4gJ3VwbG9hZGluZyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAndGh1bWJuYWlsJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHByZXZpZXdJbWFnZShmaWxlOiBGaWxlIHwgQmxvYik6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgaWYgKCFpc0ltYWdlRmlsZVR5cGUoZmlsZS50eXBlKSkge1xuICAgICAgICByZXNvbHZlKCcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICBjb25zdCBjYW52YXMgPSB0aGlzLmRvYy5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLndpZHRoID0gTUVBU1VSRV9TSVpFO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gTUVBU1VSRV9TSVpFO1xuICAgICAgICBjYW52YXMuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHRvcDogMDsgd2lkdGg6ICR7TUVBU1VSRV9TSVpFfXB4OyBoZWlnaHQ6ICR7TUVBU1VSRV9TSVpFfXB4OyB6LWluZGV4OiA5OTk5OyBkaXNwbGF5OiBub25lO2A7XG4gICAgICAgIHRoaXMuZG9jLmJvZHkuYXBwZW5kQ2hpbGQoY2FudmFzKTtcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xuICAgICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gaW1nO1xuXG4gICAgICAgICAgbGV0IGRyYXdXaWR0aCA9IE1FQVNVUkVfU0laRTtcbiAgICAgICAgICBsZXQgZHJhd0hlaWdodCA9IE1FQVNVUkVfU0laRTtcbiAgICAgICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICAgICAgbGV0IG9mZnNldFkgPSAwO1xuXG4gICAgICAgICAgaWYgKHdpZHRoIDwgaGVpZ2h0KSB7XG4gICAgICAgICAgICBkcmF3SGVpZ2h0ID0gaGVpZ2h0ICogKE1FQVNVUkVfU0laRSAvIHdpZHRoKTtcbiAgICAgICAgICAgIG9mZnNldFkgPSAtKGRyYXdIZWlnaHQgLSBkcmF3V2lkdGgpIC8gMjtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZHJhd1dpZHRoID0gd2lkdGggKiAoTUVBU1VSRV9TSVpFIC8gaGVpZ2h0KTtcbiAgICAgICAgICAgIG9mZnNldFggPSAtKGRyYXdXaWR0aCAtIGRyYXdIZWlnaHQpIC8gMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY3R4IS5kcmF3SW1hZ2UoaW1nLCBvZmZzZXRYLCBvZmZzZXRZLCBkcmF3V2lkdGgsIGRyYXdIZWlnaHQpO1xuICAgICAgICAgIH0gY2F0Y2gge31cbiAgICAgICAgICBjb25zdCBkYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTCgpO1xuICAgICAgICAgIHRoaXMuZG9jLmJvZHkucmVtb3ZlQ2hpbGQoY2FudmFzKTtcblxuICAgICAgICAgIHJlc29sdmUoZGF0YVVSTCk7XG4gICAgICAgIH07XG4gICAgICAgIGltZy5zcmMgPSB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5UaHVtYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2luID0gd2luZG93IGFzIE56U2FmZUFueTtcbiAgICBpZiAoIXRoaXMuc2hvd1BpYyB8fCB0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiB3aW4gPT09ICd1bmRlZmluZWQnIHx8ICF3aW4uRmlsZVJlYWRlciB8fCAhd2luLkZpbGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5saXN0XG4gICAgICAuZmlsdGVyKGZpbGUgPT4gZmlsZS5vcmlnaW5GaWxlT2JqIGluc3RhbmNlb2YgRmlsZSAmJiBmaWxlLnRodW1iVXJsID09PSB1bmRlZmluZWQpXG4gICAgICAuZm9yRWFjaChmaWxlID0+IHtcbiAgICAgICAgZmlsZS50aHVtYlVybCA9ICcnO1xuICAgICAgICAodGhpcy5wcmV2aWV3RmlsZSA/IHRoaXMucHJldmlld0ZpbGUoZmlsZSkudG9Qcm9taXNlKCkgOiB0aGlzLnByZXZpZXdJbWFnZShmaWxlLm9yaWdpbkZpbGVPYmohKSkudGhlbihkYXRhVXJsID0+IHtcbiAgICAgICAgICBmaWxlLnRodW1iVXJsID0gZGF0YVVybDtcbiAgICAgICAgICB0aGlzLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbGlzdEl0ZW1OYW1lQ2xzKGZpbGU6IFVwbG9hZEZpbGUpOiBOZ0NsYXNzVHlwZSB7XG4gICAgY29uc3QgY291bnQgPSBbdGhpcy5zaG93RG93bmxvYWQoZmlsZSksIHRoaXMuaWNvbnMuc2hvd1JlbW92ZUljb25dLmZpbHRlcih4ID0+IHgpLmxlbmd0aDtcbiAgICByZXR1cm4ge1xuICAgICAgW2BhbnQtdXBsb2FkLWxpc3QtaXRlbS1uYW1lYF06IHRydWUsXG4gICAgICBbYGFudC11cGxvYWQtbGlzdC1pdGVtLW5hbWUtaWNvbi1jb3VudC0ke2NvdW50fWBdOiB0cnVlXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Rvd25sb2FkKGZpbGU6IFVwbG9hZEZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5pY29ucy5zaG93RG93bmxvYWRJY29uICYmIGZpbGUuc3RhdHVzID09PSAnZG9uZScpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaXhEYXRhKCk6IHZvaWQge1xuICAgIHRoaXMubGlzdC5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgZmlsZS5tZXNzYWdlID0gdGhpcy5nZW5FcnIoZmlsZSk7XG4gICAgICBmaWxlLmxpbmtQcm9wcyA9IHR5cGVvZiBmaWxlLmxpbmtQcm9wcyA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGZpbGUubGlua1Byb3BzKSA6IGZpbGUubGlua1Byb3BzO1xuICAgICAgZmlsZS5pc0ltYWdlVXJsID0gdGhpcy5pc0ltYWdlVXJsKGZpbGUpO1xuICAgICAgZmlsZS5pY29uVHlwZSA9IHRoaXMuZ2V0SWNvblR5cGUoZmlsZSk7XG4gICAgICBmaWxlLmlzVXBsb2FkaW5nID0gZmlsZS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnO1xuICAgICAgZmlsZS5saXN0SXRlbU5hbWVDbHMgPSB0aGlzLmxpc3RJdGVtTmFtZUNscyhmaWxlKTtcbiAgICAgIGZpbGUuc2hvd0Rvd25sb2FkID0gdGhpcy5zaG93RG93bmxvYWQoZmlsZSk7XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVQcmV2aWV3KGZpbGU6IFVwbG9hZEZpbGUsIGU6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm9uUHJldmlldykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICByZXR1cm4gdGhpcy5vblByZXZpZXcoZmlsZSk7XG4gIH1cblxuICBoYW5kbGVSZW1vdmUoZmlsZTogVXBsb2FkRmlsZSwgZTogRXZlbnQpOiB2b2lkIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKHRoaXMub25SZW1vdmUpIHtcbiAgICAgIHRoaXMub25SZW1vdmUoZmlsZSk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGhhbmRsZURvd25sb2FkKGZpbGU6IFVwbG9hZEZpbGUpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub25Eb3dubG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhpcy5vbkRvd25sb2FkKGZpbGUpO1xuICAgIH0gZWxzZSBpZiAoZmlsZS51cmwpIHtcbiAgICAgIHdpbmRvdy5vcGVuKGZpbGUudXJsKTtcbiAgICB9XG4gIH1cblxuICAvLyAjZW5kcmVnaW9uXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBOelNhZmVBbnksXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybVxuICApIHt9XG5cbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpeERhdGEoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZpeERhdGEoKTtcbiAgICB0aGlzLmdlblRodW1iKCk7XG4gIH1cbn1cbiJdfQ==