UNPKG

ng-devui

Version:

DevUI components based on Angular

118 lines 21.4 kB
import { Injectable } from '@angular/core'; import { from, merge, of } from 'rxjs'; import { concatMap, last, toArray } from 'rxjs/operators'; import { FileUploader } from './file-uploader.class'; import { UploadStatus } from './file-uploader.types'; import * as i0 from "@angular/core"; export class SliceUploadService { constructor() { this.defaultChunkSize = 1024 * 1024 * 20; // 单位是byte 默认分片大小 20兆。 } isNeedChunk(fileUploaders, uploadOptions) { return (fileUploaders || []).some((item) => item?.file.size > (uploadOptions?.chunkSize || this.defaultChunkSize)); } async sliceUpload(instance, viewInstance) { const fileUploaders = viewInstance.fileUploaders; const customizeFunc = instance.dynamicUploadOptionsFn || instance.setCustomUploadOptions; for (let i = 0; i < fileUploaders.length; i++) { // 判断不需要切片的文件不调用自定义参数方法 const file = fileUploaders[i].file; const isNeedChunk = file.size > (instance.uploadOptions?.chunkSize || this.defaultChunkSize); const fileChunkList = this.createFileChunk(file, fileUploaders[i].uploadOptions || instance.uploadOptions, isNeedChunk ? customizeFunc : undefined); const currentFile = fileUploaders[i]; const uploadObservable = this.uploadChunkList(fileChunkList, currentFile, instance, viewInstance); (await uploadObservable).subscribe((results) => { currentFile.percentage = 100; currentFile.status = UploadStatus.uploaded; const successRes = [ { file: currentFile.file, response: results[0].response, chunkList: results, }, ]; instance.successEvent.emit(successRes); results.forEach((result) => viewInstance.uploadedFilesComponent.addAndOverwriteFile(result.file)); }, (error) => { error.file = currentFile.file; this.chunkRequestError(error, currentFile, instance, viewInstance, false); }); } } async uploadChunkList(fileChunkList, currentFile, instance, viewInstance) { let uploads = []; const chunkPercentage = (1 / fileChunkList.length) * 100; currentFile.status = UploadStatus.uploading; currentFile.percentage = 0; if (instance.uploadOptions.chunkInSequence) { return of(...fileChunkList).pipe(concatMap((uploader) => { let result; if (currentFile.status === UploadStatus.failed) { result = from(Promise.reject(new Error('upload canceled'))); if (uploads.length === 0) { uploads.push(result); } } else { result = from(uploader.send()); result.subscribe(() => { currentFile.percentage = currentFile.percentage + chunkPercentage; }, (error) => this.chunkRequestError(error, currentFile, instance, viewInstance)); uploads.push(result); } return result; }), // last的过滤函数直接返回false,从而使用默认值uploads返回 last(() => false, uploads)); } else { uploads = fileChunkList.map((fileUploader) => { fileUploader.percentage = 0; return from(fileUploader.send()); }); if (uploads.length > 0) { const uploadObservable = merge(...uploads); (await uploadObservable).subscribe((results) => { currentFile.percentage = currentFile.percentage + chunkPercentage; }, (error) => this.chunkRequestError(error, currentFile, instance, viewInstance)); return merge(...uploads).pipe(toArray()); } } return from(Promise.reject(new Error('no files'))); } // 生成分片上传的数组 createFileChunk(file, uploadOptions, uploadOptionsFunc) { const chunkSize = uploadOptions.chunkSize || this.defaultChunkSize; const { name, type, lastModified, size } = file; const fileId = new Date().getTime(); const fileChunkList = []; let fileSliceStart = 0; let chunkedFileIndex = 0; const chunks = Math.ceil(size / chunkSize); while (fileSliceStart < file.size) { chunkedFileIndex = chunkedFileIndex + 1; const currentUploadOptions = uploadOptionsFunc?.(file, uploadOptions, chunkedFileIndex) || uploadOptions; const slicedFile = file.slice(fileSliceStart, fileSliceStart + chunkSize); const newChunkFile = new File([slicedFile], `${fileId}-${chunkedFileIndex}-${chunks}-${size}-${lastModified}-${name}`, { type }); fileChunkList.push(new FileUploader(newChunkFile, currentUploadOptions)); fileSliceStart += chunkSize; } return fileChunkList; } chunkRequestError(error, currentFile, instance, viewInstance, isChunk = true) { currentFile.status = UploadStatus.failed; viewInstance.uploadedFilesComponent.cleanUploadedFiles(); if (isChunk) { instance.errorChunkEvent.emit(error); } else { instance.errorEvent.emit(error); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SliceUploadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SliceUploadService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SliceUploadService, decorators: [{ type: Injectable }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UtdXBsb2FkLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9kZXZ1aS91cGxvYWQvc2xpY2UtdXBsb2FkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBa0IsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBT3JFLE1BQU0sT0FBTyxrQkFBa0I7SUFEL0I7UUFFRSxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLHNCQUFzQjtLQXNJNUQ7SUFwSUMsV0FBVyxDQUFDLGFBQWtDLEVBQUUsYUFBNkI7UUFDM0UsT0FBTyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLGFBQWEsRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUNuSSxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FDZixRQUF5RCxFQUN6RCxZQUFxRTtRQUVyRSxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsYUFBYSxDQUFDO1FBQ2pELE1BQU0sYUFBYSxHQUNoQixRQUFrQyxDQUFDLHNCQUFzQixJQUFLLFFBQW9DLENBQUMsc0JBQXNCLENBQUM7UUFDN0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFB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YyxFQUFFLGNBQWMsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUMxRSxNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxJQUFJLGdCQUFnQixJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNqSSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksWUFBWSxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDekUsY0FBYyxJQUFJLFNBQVMsQ0FBQztRQUM5QixDQUFDO1FBQ0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUVELGlCQUFpQixDQUNmLEtBQVUsRUFDVixXQUF5QixFQUN6QixRQUF5RCxFQUN6RCxZQUFxRSxFQUNyRSxPQUFPLEdBQUcsSUFBSTtRQUVkLFdBQVcsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUN6QyxZQUFZLENBQUMsc0JBQXNCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN6RCxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ1osUUFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQzsrR0F0SVUsa0JBQWtCO21IQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBRDlCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmcm9tLCBtZXJnZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNvbmNhdE1hcCwgbGFzdCwgdG9BcnJheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZpbGVVcGxvYWRlciB9IGZyb20gJy4vZmlsZS11cGxvYWRlci5jbGFzcyc7XG5pbXBvcnQgeyBJVXBsb2FkT3B0aW9ucywgVXBsb2FkU3RhdHVzIH0gZnJvbSAnLi9maWxlLXVwbG9hZGVyLnR5cGVzJztcbmltcG9ydCB7IE11bHRpcGxlVXBsb2FkVmlld0NvbXBvbmVudCB9IGZyb20gJy4vbXVsdGlwbGUtdXBsb2FkLXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7IE11bHRpcGxlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi9tdWx0aXBsZS11cGxvYWQuY29tcG9uZW50JztcbmltcG9ydCB7IFNpbmdsZVVwbG9hZFZpZXdDb21wb25lbnQgfSBmcm9tICcuL3NpbmdsZS11cGxvYWQtdmlldy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2luZ2xlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSAnLi9zaW5nbGUtdXBsb2FkLmNvbXBvbmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTbGljZVVwbG9hZFNlcnZpY2Uge1xuICBkZWZhdWx0Q2h1bmtTaXplID0gMTAyNCAqIDEwMjQgKiAyMDsgLy8g5Y2V5L2N5pivYnl0ZSDpu5jorqTliIbniYflpKflsI8gMjDlhYbjgIJcblxuICBpc05lZWRDaHVuayhmaWxlVXBsb2FkZXJzOiBBcnJheTxGaWxlVXBsb2FkZXI+LCB1cGxvYWRPcHRpb25zOiBJVXBsb2FkT3B0aW9ucykge1xuICAgIHJldHVybiAoZmlsZVVwbG9hZGVycyB8fCBbXSkuc29tZSgoaXRlbTogRmlsZVVwbG9hZGVyKSA9PiBpdGVtPy5maWxlLnNpemUgPiAodXBsb2FkT3B0aW9ucz8uY2h1bmtTaXplIHx8IHRoaXMuZGVmYXVsdENodW5rU2l6ZSkpO1xuICB9XG5cbiAgYXN5bmMgc2xpY2VVcGxvYWQoXG4gICAgaW5zdGFuY2U6IFNpbmdsZVVwbG9hZENvbXBvbmVudCB8IE11bHRpcGxlVXBsb2FkQ29tcG9uZW50LFxuICAgIHZpZXdJbnN0YW5jZTogU2luZ2xlVXBsb2FkVmlld0NvbXBvbmVudCB8IE11bHRpcGxlVXBsb2FkVmlld0NvbXBvbmVudFxuICApIHtcbiAgICBjb25zdCBmaWxlVXBsb2FkZXJzID0gdmlld0luc3RhbmNlLmZpbGVVcGxvYWRlcnM7XG4gICAgY29uc3QgY3VzdG9taXplRnVuYyA9XG4gICAgICAoaW5zdGFuY2UgYXMgU2luZ2xlVXBsb2FkQ29tcG9uZW50KS5keW5hbWljVXBsb2FkT3B0aW9uc0ZuIHx8IChpbnN0YW5jZSBhcyBNdWx0aXBsZVVwbG9hZENvbXBvbmVudCkuc2V0Q3VzdG9tVXBsb2FkT3B0aW9ucztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZpbGVVcGxvYWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIC8vIOWIpOaWreS4jemcgOimgeWIh+eJh+eahOaWh+S7tuS4jeiwg+eUqOiHquWumuS5ieWPguaVsOaWueazlVxuICAgICAgY29uc3QgZmlsZSA9IGZpbGVVcGxvYWRlcnNbaV0uZmlsZTtcbiAgICAgIGNvbnN0IGlzTmVlZENodW5rID0gZmlsZS5zaXplID4gKGluc3RhbmNlLnVwbG9hZE9wdGlvbnM/LmNodW5rU2l6ZSB8fCB0aGlzLmRlZmF1bHRDaHVua1NpemUpO1xuICAgICAgY29uc3QgZmlsZUNodW5rTGlzdCA9IHRoaXMuY3JlYXRlRmlsZUNodW5rKFxuICAgICAgICBmaWxlLFxuICAgICAgICBmaWxlVXBsb2FkZXJzW2ldLnVwbG9hZE9wdGlvbnMgfHwgaW5zdGFuY2UudXBsb2FkT3B0aW9ucyxcbiAgICAgICAgaXNOZWVkQ2h1bmsgPyBjdXN0b21pemVGdW5jIDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgICAgY29uc3QgY3VycmVudEZpbGUgPSBmaWxlVXBsb2FkZXJzW2ldO1xuICAgICAgY29uc3QgdXBsb2FkT2JzZXJ2YWJsZSA9IHRoaXMudXBsb2FkQ2h1bmtMaXN0KGZpbGVDaHVua0xpc3QsIGN1cnJlbnRGaWxlLCBpbnN0YW5jZSwgdmlld0luc3RhbmNlKTtcbiAgICAgIChhd2FpdCB1cGxvYWRPYnNlcnZhYmxlKS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXN1bHRzOiBBcnJheTx7IGZpbGU6IEZpbGU7IHJlc3BvbnNlOiBhbnkgfT4pID0+IHtcbiAgICAgICAgICBjdXJyZW50RmlsZS5wZXJjZW50YWdlID0gMTAwO1xuICAgICAgICAgIGN1cnJlbnRGaWxlLnN0YXR1cyA9IFVwbG9hZFN0YXR1cy51cGxvYWRlZDtcbiAgICAgICAgICBjb25zdCBzdWNjZXNzUmVzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBmaWxlOiBjdXJyZW50RmlsZS5maWxlLFxuICAgICAgICAgICAgICByZXNwb25zZTogcmVzdWx0c1swXS5yZXNwb25zZSxcbiAgICAgICAgICAgICAgY2h1bmtMaXN0OiByZXN1bHRzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICAgIGluc3RhbmNlLnN1Y2Nlc3NFdmVudC5lbWl0KHN1Y2Nlc3NSZXMpO1xuICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB2aWV3SW5zdGFuY2UudXBsb2FkZWRGaWxlc0NvbXBvbmVudC5hZGRBbmRPdmVyd3JpdGVGaWxlKHJlc3VsdC5maWxlKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGVycm9yLmZpbGUgPSBjdXJyZW50RmlsZS5maWxlO1xuICAgICAgICAgIHRoaXMuY2h1bmtSZXF1ZXN0RXJyb3IoZXJyb3IsIGN1cnJlbnRGaWxlLCBpbnN0YW5jZSwgdmlld0luc3RhbmNlLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBsb2FkQ2h1bmtMaXN0KFxuICAgIGZpbGVDaHVua0xpc3Q6IEFycmF5PEZpbGVVcGxvYWRlcj4sXG4gICAgY3VycmVudEZpbGU6IEZpbGVVcGxvYWRlcixcbiAgICBpbnN0YW5jZTogU2luZ2xlVXBsb2FkQ29tcG9uZW50IHwgTXVsdGlwbGVVcGxvYWRDb21wb25lbnQsXG4gICAgdmlld0luc3RhbmNlOiBTaW5nbGVVcGxvYWRWaWV3Q29tcG9uZW50IHwgTXVsdGlwbGVVcGxvYWRWaWV3Q29tcG9uZW50XG4gICkge1xuICAgIGxldCB1cGxvYWRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGNodW5rUGVyY2VudGFnZSA9ICgxIC8gZmlsZUNodW5rTGlzdC5sZW5ndGgpICogMTAwO1xuICAgIGN1cnJlbnRGaWxlLnN0YXR1cyA9IFVwbG9hZFN0YXR1cy51cGxvYWRpbmc7XG4gICAgY3VycmVudEZpbGUucGVyY2VudGFnZSA9IDA7XG4gICAgaWYgKGluc3RhbmNlLnVwbG9hZE9wdGlvbnMuY2h1bmtJblNlcXVlbmNlKSB7XG4gICAgICByZXR1cm4gb2YoLi4uZmlsZUNodW5rTGlzdCkucGlwZShcbiAgICAgICAgY29uY2F0TWFwKCh1cGxvYWRlcikgPT4ge1xuICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgaWYgKGN1cnJlbnRGaWxlLnN0YXR1cyA9PT0gVXBsb2FkU3RhdHVzLmZhaWxlZCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZnJvbShQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ3VwbG9hZCBjYW5jZWxlZCcpKSk7XG4gICAgICAgICAgICBpZiAodXBsb2Fkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgdXBsb2Fkcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGZyb20odXBsb2FkZXIuc2VuZCgpKTtcbiAgICAgICAgICAgIHJlc3VsdC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjdXJyZW50RmlsZS5wZXJjZW50YWdlID0gY3VycmVudEZpbGUucGVyY2VudGFnZSArIGNodW5rUGVyY2VudGFnZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKGVycm9yKSA9PiB0aGlzLmNodW5rUmVxdWVzdEVycm9yKGVycm9yLCBjdXJyZW50RmlsZSwgaW5zdGFuY2UsIHZpZXdJbnN0YW5jZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB1cGxvYWRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSksXG4gICAgICAgIC8vIGxhc3TnmoTov4fmu6Tlh73mlbDnm7TmjqXov5Tlm55mYWxzZe+8jOS7juiAjOS9v+eUqOm7mOiupOWAvHVwbG9hZHPov5Tlm55cbiAgICAgICAgbGFzdCgoKSA9PiBmYWxzZSwgdXBsb2FkcylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHVwbG9hZHMgPSBmaWxlQ2h1bmtMaXN0Lm1hcCgoZmlsZVVwbG9hZGVyKSA9PiB7XG4gICAgICAgIGZpbGVVcGxvYWRlci5wZXJjZW50YWdlID0gMDtcbiAgICAgICAgcmV0dXJuIGZyb20oZmlsZVVwbG9hZGVyLnNlbmQoKSk7XG4gICAgICB9KTtcbiAgICAgIGlmICh1cGxvYWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdXBsb2FkT2JzZXJ2YWJsZSA9IG1lcmdlKC4uLnVwbG9hZHMpO1xuICAgICAgICAoYXdhaXQgdXBsb2FkT2JzZXJ2YWJsZSkuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXN1bHRzKSA9PiB7XG4gICAgICAgICAgICBjdXJyZW50RmlsZS5wZXJjZW50YWdlID0gY3VycmVudEZpbGUucGVyY2VudGFnZSArIGNodW5rUGVyY2VudGFnZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnJvcikgPT4gdGhpcy5jaHVua1JlcXVlc3RFcnJvcihlcnJvciwgY3VycmVudEZpbGUsIGluc3RhbmNlLCB2aWV3SW5zdGFuY2UpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBtZXJnZSguLi51cGxvYWRzKS5waXBlKHRvQXJyYXkoKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmcm9tKFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignbm8gZmlsZXMnKSkpO1xuICB9XG5cbiAgLy8g55Sf5oiQ5YiG54mH5LiK5Lyg55qE5pWw57uEXG4gIGNyZWF0ZUZpbGVDaHVuayhmaWxlOiBGaWxlLCB1cGxvYWRPcHRpb25zOiBJVXBsb2FkT3B0aW9ucywgdXBsb2FkT3B0aW9uc0Z1bmM/OiBGdW5jdGlvbikge1xuICAgIGNvbnN0IGNodW5rU2l6ZSA9IHVwbG9hZE9wdGlvbnMuY2h1bmtTaXplIHx8IHRoaXMuZGVmYXVsdENodW5rU2l6ZTtcbiAgICBjb25zdCB7IG5hbWUsIHR5cGUsIGxhc3RNb2RpZmllZCwgc2l6ZSB9ID0gZmlsZTtcbiAgICBjb25zdCBmaWxlSWQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICBjb25zdCBmaWxlQ2h1bmtMaXN0OiBBcnJheTxGaWxlVXBsb2FkZXI+ID0gW107XG4gICAgbGV0IGZpbGVTbGljZVN0YXJ0ID0gMDtcbiAgICBsZXQgY2h1bmtlZEZpbGVJbmRleCA9IDA7XG4gICAgY29uc3QgY2h1bmtzID0gTWF0aC5jZWlsKHNpemUgLyBjaHVua1NpemUpO1xuICAgIHdoaWxlIChmaWxlU2xpY2VTdGFydCA8IGZpbGUuc2l6ZSkge1xuICAgICAgY2h1bmtlZEZpbGVJbmRleCA9IGNodW5rZWRGaWxlSW5kZXggKyAxO1xuICAgICAgY29uc3QgY3VycmVudFVwbG9hZE9wdGlvbnMgPSB1cGxvYWRPcHRpb25zRnVuYz8uKGZpbGUsIHVwbG9hZE9wdGlvbnMsIGNodW5rZWRGaWxlSW5kZXgpIHx8IHVwbG9hZE9wdGlvbnM7XG4gICAgICBjb25zdCBzbGljZWRGaWxlID0gZmlsZS5zbGljZShmaWxlU2xpY2VTdGFydCwgZmlsZVNsaWNlU3RhcnQgKyBjaHVua1NpemUpO1xuICAgICAgY29uc3QgbmV3Q2h1bmtGaWxlID0gbmV3IEZpbGUoW3NsaWNlZEZpbGVdLCBgJHtmaWxlSWR9LSR7Y2h1bmtlZEZpbGVJbmRleH0tJHtjaHVua3N9LSR7c2l6ZX0tJHtsYXN0TW9kaWZpZWR9LSR7bmFtZX1gLCB7IHR5cGUgfSk7XG4gICAgICBmaWxlQ2h1bmtMaXN0LnB1c2gobmV3IEZpbGVVcGxvYWRlcihuZXdDaHVua0ZpbGUsIGN1cnJlbnRVcGxvYWRPcHRpb25zKSk7XG4gICAgICBmaWxlU2xpY2VTdGFydCArPSBjaHVua1NpemU7XG4gICAgfVxuICAgIHJldHVybiBmaWxlQ2h1bmtMaXN0O1xuICB9XG5cbiAgY2h1bmtSZXF1ZXN0RXJyb3IoXG4gICAgZXJyb3I6IGFueSxcbiAgICBjdXJyZW50RmlsZTogRmlsZVVwbG9hZGVyLFxuICAgIGluc3RhbmNlOiBTaW5nbGVVcGxvYWRDb21wb25lbnQgfCBNdWx0aXBsZVVwbG9hZENvbXBvbmVudCxcbiAgICB2aWV3SW5zdGFuY2U6IFNpbmdsZVVwbG9hZFZpZXdDb21wb25lbnQgfCBNdWx0aXBsZVVwbG9hZFZpZXdDb21wb25lbnQsXG4gICAgaXNDaHVuayA9IHRydWVcbiAgKSB7XG4gICAgY3VycmVudEZpbGUuc3RhdHVzID0gVXBsb2FkU3RhdHVzLmZhaWxlZDtcbiAgICB2aWV3SW5zdGFuY2UudXBsb2FkZWRGaWxlc0NvbXBvbmVudC5jbGVhblVwbG9hZGVkRmlsZXMoKTtcbiAgICBpZiAoaXNDaHVuaykge1xuICAgICAgaW5zdGFuY2UuZXJyb3JDaHVua0V2ZW50LmVtaXQoZXJyb3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpbnN0YW5jZS5lcnJvckV2ZW50LmVtaXQoZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIl19