ngx-uploader-may
Version:
Angular file uploader with drag and drop capability and upload progress
539 lines (530 loc) • 49.8 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/common/http'), require('@angular/common')) :
typeof define === 'function' && define.amd ? define('ngx-uploader-may', ['exports', '@angular/core', '@angular/common/http', '@angular/common'], factory) :
(factory((global['ngx-uploader-may'] = {}),global.ng.core,global.ng.common.http,global.ng.common));
}(this, (function (exports,i0,http,common) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NgxUploaderMayService = /** @class */ (function () {
function NgxUploaderMayService() {
}
NgxUploaderMayService.decorators = [
{ type: i0.Injectable, args: [{
providedIn: 'root'
},] }
];
/** @nocollapse */
NgxUploaderMayService.ctorParameters = function () { return []; };
/** @nocollapse */ NgxUploaderMayService.ngInjectableDef = i0.defineInjectable({ factory: function NgxUploaderMayService_Factory() { return new NgxUploaderMayService(); }, token: NgxUploaderMayService, providedIn: "root" });
return NgxUploaderMayService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NgxUploaderMayComponent = /** @class */ (function () {
function NgxUploaderMayComponent(http$$1) {
this.http = http$$1;
this._maxAllowedFiles = 5;
this.onError = new i0.EventEmitter();
this.onUpload = new i0.EventEmitter();
this.onSuccess = new i0.EventEmitter();
this.isFileDragEnter = false;
this.files = [];
this.isUploading = false;
}
Object.defineProperty(NgxUploaderMayComponent.prototype, "allowedExtensions", {
set: /**
* @param {?} extensions
* @return {?}
*/ function (extensions) {
this._allowedExtensions = extensions;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "allowedSize", {
set: /**
* @param {?} size
* @return {?}
*/ function (size) {
this._allowedSize = size;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "maxAllowedFiles", {
set: /**
* @param {?} size
* @return {?}
*/ function (size) {
this._maxAllowedFiles = size;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "formData", {
set: /**
* @param {?} formData
* @return {?}
*/ function (formData) {
this._formData = formData;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "formDataUploadKey", {
set: /**
* @param {?} key
* @return {?}
*/ function (key) {
this._formDataUploadKey = key;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "uploadUrl", {
set: /**
* @param {?} url
* @return {?}
*/ function (url) {
this._uploadUrl = url;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "uploadReqMethod", {
set: /**
* @param {?} method
* @return {?}
*/ function (method) {
this._uploadReqMethod = method;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NgxUploaderMayComponent.prototype, "isMulti", {
set: /**
* @param {?} multi
* @return {?}
*/ function (multi) {
this._isMulti = multi;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.onClickUploaderBtn = /**
* @return {?}
*/
function () {
/** @type {?} */
var el = ( /** @type {?} */(this.inputFileField.nativeElement));
el.click();
};
/**
* @param {?} e
* @return {?}
*/
NgxUploaderMayComponent.prototype.onFileDragOverEnter = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
e.stopPropagation();
this.setOnFileDragged(true);
};
/**
* @param {?} e
* @return {?}
*/
NgxUploaderMayComponent.prototype.onFileDragLeaveEnd = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
e.stopPropagation();
this.setOnFileDragged(false);
};
/**
* @param {?} e
* @return {?}
*/
NgxUploaderMayComponent.prototype.onFileDrop = /**
* @param {?} e
* @return {?}
*/
function (e) {
e.preventDefault();
e.stopPropagation();
this.setOnFileDragged(false);
this.onAttachedFile(e["dataTransfer"].files);
};
/**
* @param {?} isDragged
* @return {?}
*/
NgxUploaderMayComponent.prototype.setOnFileDragged = /**
* @param {?} isDragged
* @return {?}
*/
function (isDragged) {
this.isFileDragEnter = isDragged;
};
/**
* @param {?} files
* @return {?}
*/
NgxUploaderMayComponent.prototype.onAttachedFile = /**
* @param {?} files
* @return {?}
*/
function (files) {
var _this = this;
this.clearFiles();
console.log(this.files);
if (!this._uploadUrl) {
throw new Error("Upload URL not provided");
}
if (files.length < 1) {
return false;
}
if (this._isMulti && files.length > this._maxAllowedFiles) {
this.onError.emit(["Maximum allowed files count is " + this._maxAllowedFiles]);
return false;
}
if (!this._isMulti && files.length > 1) {
this.onError.emit(["Uploader not configured to upload multiple files"]);
return false;
}
if (this._isMulti) {
for (var i = 0; i < files.length; i++) {
/** @type {?} */
var f = new UploadFile();
f.file = files.item(i);
this.files.push(f);
}
}
else {
/** @type {?} */
var f = new UploadFile();
f.file = files.item(0);
this.files.push(f);
}
//Remove input values after assign
this.clearFileInput();
this.files.forEach(function (uf) {
_this.validate(uf);
});
if (this.files.filter(function (u) { return u.isValid == false; }).length > 0) {
this.onError.emit(this.files.filter(function (u) { return u.isValid == false; }).map(function (u) { return u.invalidMessage; }));
this.clearFiles();
}
else {
this.files.forEach(function (uf) {
_this.uploadFile(uf);
});
}
};
/**
* @param {?} uploadFile
* @return {?}
*/
NgxUploaderMayComponent.prototype.validate = /**
* @param {?} uploadFile
* @return {?}
*/
function (uploadFile) {
var _this = this;
/** @type {?} */
var errors = [];
if (this._allowedExtensions && this._allowedExtensions.filter(function (s) { return s === _this.getFileExtension(uploadFile.file); }).length == 0) {
errors.push("File type not support");
}
if (this._allowedSize && this.getFileSizeMB(uploadFile.file) > this._allowedSize) {
errors.push("File is too large");
}
uploadFile.invalidMessage = errors.join();
if (errors.length > 0) {
uploadFile.isValid = false;
}
else {
uploadFile.isValid = true;
}
};
/**
* @param {?} uploadFile
* @return {?}
*/
NgxUploaderMayComponent.prototype.uploadFile = /**
* @param {?} uploadFile
* @return {?}
*/
function (uploadFile) {
var _this = this;
this.isUploading = true;
uploadFile.fileLabel = uploadFile.file.name;
uploadFile.fileSizeLabel = this.getFileSizeLabel(this.getFileSizeMB(uploadFile.file));
uploadFile.uploadProgress = 0;
/** @type {?} */
var formData = this.createFormData(uploadFile.file);
/** @type {?} */
var req = new http.HttpRequest(this._uploadReqMethod || "POST", this._uploadUrl, formData, {
reportProgress: true
});
this.http.request(req).subscribe(function (event) {
if (event.type === http.HttpEventType.UploadProgress) {
/** @type {?} */
var percentDone = Math.round(100 * event.loaded / event.total);
if (percentDone >= 100) {
uploadFile.uploadProgress = 98;
}
else {
uploadFile.uploadProgress = percentDone;
}
}
else if (event instanceof http.HttpResponse) {
uploadFile.uploadProgress = 100;
if (event.status == 200 || event.status == 201) {
_this.onUploadSuccess(event, uploadFile);
}
}
}, function (error) {
uploadFile.uploadProgress = 100;
_this.onUploadError(error, uploadFile);
});
};
/**
* @param {?} response
* @param {?} uf
* @return {?}
*/
NgxUploaderMayComponent.prototype.onUploadSuccess = /**
* @param {?} response
* @param {?} uf
* @return {?}
*/
function (response, uf) {
uf.isSuccess = true;
uf.serverResponse = response;
this.onUpload.emit(uf.serverResponse);
if (this.isAllFilesUploadDone()) {
this.publishValue();
}
};
/**
* @param {?} error
* @param {?} uf
* @return {?}
*/
NgxUploaderMayComponent.prototype.onUploadError = /**
* @param {?} error
* @param {?} uf
* @return {?}
*/
function (error, uf) {
uf.isSuccess = false;
uf.serverResponse = error.error;
this.onUpload.emit(uf.serverResponse);
if (this.isAllFilesUploadDone()) {
this.publishValue();
}
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.publishValue = /**
* @return {?}
*/
function () {
this.isUploading = false;
this.clearFileInput();
this.onSuccess.emit(this.files.map(function (uf) { return uf.serverResponse; }));
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.isAllFilesUploadDone = /**
* @return {?}
*/
function () {
return !(this.files.filter(function (uf) { return uf.uploadProgress < 100; }).length > 0);
};
/**
* @param {?} file
* @return {?}
*/
NgxUploaderMayComponent.prototype.createFormData = /**
* @param {?} file
* @return {?}
*/
function (file) {
if (!this._formDataUploadKey) {
throw new Error("Empty form data upload key. Please use upload-form-key in your directive.");
}
if (this._formData) {
/** @type {?} */
var formData_1 = new FormData();
this._formData.forEach(function (val, key) {
formData_1.append(key, val);
});
formData_1.append(this._formDataUploadKey, file);
return formData_1;
}
else {
/** @type {?} */
var formData = new FormData();
formData.append(this._formDataUploadKey, file);
return formData;
}
};
/**
* @param {?} file
* @return {?}
*/
NgxUploaderMayComponent.prototype.getFileExtension = /**
* @param {?} file
* @return {?}
*/
function (file) {
return file.name.split(".").pop();
};
/**
* @param {?} file
* @return {?}
*/
NgxUploaderMayComponent.prototype.getFileSizeMB = /**
* @param {?} file
* @return {?}
*/
function (file) {
return file.size / (1e+6);
};
/**
* @param {?} fileSizeMb
* @return {?}
*/
NgxUploaderMayComponent.prototype.getFileSizeLabel = /**
* @param {?} fileSizeMb
* @return {?}
*/
function (fileSizeMb) {
if (fileSizeMb > 1 && fileSizeMb < 1000) {
return fileSizeMb.toFixed(2) + "Mb";
}
else if (fileSizeMb < 1) {
return (fileSizeMb * 1000).toFixed(2) + "Kb";
}
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.clearFileInput = /**
* @return {?}
*/
function () {
this.inputFileField.nativeElement.value = "";
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.clearFiles = /**
* @return {?}
*/
function () {
this.files = [];
};
/**
* @return {?}
*/
NgxUploaderMayComponent.prototype.reset = /**
* @return {?}
*/
function () {
this.clearFiles();
this.clearFileInput();
this.isFileDragEnter = false;
this.isUploading = false;
};
NgxUploaderMayComponent.decorators = [
{ type: i0.Component, args: [{
selector: 'ngx-uploader-may',
template: "<div class=\"__ngx-uploader\">\n <div class=\"upload-area\">\n <div class=\"placeholder-area\">\n <img src=\"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDU4Ljk5OSA1OC45OTkiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDU4Ljk5OSA1OC45OTk7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iNTEycHgiIGhlaWdodD0iNTEycHgiPgo8Zz4KCTxwYXRoIGQ9Ik0xOS40NzksMTIuMDE5YzAuMjU2LDAsMC41MTItMC4wOTgsMC43MDctMC4yOTNsOC4zMTMtOC4zMTN2MzUuNTg2YzAsMC41NTMsMC40NDcsMSwxLDFzMS0wLjQ0NywxLTFWMy40MTNsOC4yNzIsOC4yNzIgICBjMC4zOTEsMC4zOTEsMS4wMjMsMC4zOTEsMS40MTQsMHMwLjM5MS0xLjAyMywwLTEuNDE0bC05Ljk3OC05Ljk3OGMtMC4wOTItMC4wOTMtMC4yMDMtMC4xNjYtMC4zMjctMC4yMTcgICBjLTAuMjQ0LTAuMTAxLTAuNTE5LTAuMTAxLTAuNzY0LDBjLTAuMTIzLDAuMDUxLTAuMjM0LDAuMTI1LTAuMzI2LDAuMjE3TDE4Ljc3MiwxMC4zMTJjLTAuMzkxLDAuMzkxLTAuMzkxLDEuMDIzLDAsMS40MTQgICBDMTguOTY3LDExLjkyMiwxOS4yMjMsMTIuMDE5LDE5LjQ3OSwxMi4wMTl6IiBmaWxsPSIjZDVkNWQ1Ii8+Cgk8cGF0aCBkPSJNMzYuNDk5LDE1Ljk5OWMtMC41NTMsMC0xLDAuNDQ3LTEsMXMwLjQ0NywxLDEsMWgxM3YzOWgtNDB2LTM5aDEzYzAuNTUzLDAsMS0wLjQ0NywxLTFzLTAuNDQ3LTEtMS0xaC0xNXY0M2g0NHYtNDNIMzYuNDk5ICAgeiIgZmlsbD0iI2Q1ZDVkNSIvPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+CjxnPgo8L2c+Cjwvc3ZnPgo=\" />\n <p>\n Drag files to upload\n </p>\n </div>\n <button type=\"button\" [disabled]=\"isUploading\" [ngClass]=\"{'on-file-drag': isFileDragEnter}\" (click)=\"onClickUploaderBtn()\" (drop)=\"onFileDrop($event)\" (dragover)=\"onFileDragOverEnter($event)\" (dragenter)=\"onFileDragOverEnter($event)\" (dragleave)=\"onFileDragLeaveEnd($event)\" (dragend)=\"onFileDragLeaveEnd($event)\"></button>\n </div>\n <input #uploadField type=\"file\" (change)=\"onAttachedFile($event.target.files)\" [attr.multiple]=\"_isMulti ? '' : null\">\n <div *ngFor=\"let item of files\" class=\"upload-progress-container\">\n <small>{{item.fileSizeLabel}}</small>\n <div class=\"upload-progress-bar\">\n <div class=\"upload-progress\" [ngStyle]=\"{'width': item.uploadProgress+'%'}\" [ngClass]=\"{'upload-progress-red': item.uploadProgress==100 && !item.isSuccess}\"></div>\n </div>\n <div class=\"progress-text\">\n <small>{{item.uploadProgress}}%</small>\n <small>\n <img *ngIf=\"item.uploadProgress==100 && item.isSuccess\" src=\"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDUxMiA1MTIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDUxMiA1MTI7IiB4bWw6c3BhY2U9InByZXNlcnZlIiB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNnB4Ij4KPGc+Cgk8Zz4KCQk8cGF0aCBkPSJNNDM3LjAxOSw3NC45OEMzODguNjY3LDI2LjYyOSwzMjQuMzgsMCwyNTYsMEMxODcuNjE5LDAsMTIzLjMzMiwyNi42MjksNzQuOTgsNzQuOThDMjYuNjI5LDEyMy4zMzIsMCwxODcuNjIsMCwyNTYgICAgczI2LjYyOSwxMzIuNjY3LDc0Ljk4LDE4MS4wMTlDMTIzLjMzMiw0ODUuMzcxLDE4Ny42Miw1MTIsMjU2LDUxMnMxMzIuNjY3LTI2LjYyOSwxODEuMDE5LTc0Ljk4ICAgIEM0ODUuMzcxLDM4OC42NjcsNTEyLDMyNC4zOCw1MTIsMjU2UzQ4NS4zNzEsMTIzLjMzMyw0MzcuMDE5LDc0Ljk4eiBNMzc4LjMwNiwxOTUuMDczTDIzNS4yNDEsMzM4LjEzOSAgICBjLTIuOTI5LDIuOTI5LTYuNzY4LDQuMzkzLTEwLjYwNiw0LjM5M2MtMy44MzksMC03LjY3OC0xLjQ2NC0xMC42MDctNC4zOTNsLTgwLjMzNC04MC4zMzNjLTUuODU4LTUuODU3LTUuODU4LTE1LjM1NCwwLTIxLjIxMyAgICBjNS44NTctNS44NTgsMTUuMzU1LTUuODU4LDIxLjIxMywwbDY5LjcyOCw2OS43MjdsMTMyLjQ1OC0xMzIuNDZjNS44NTctNS44NTgsMTUuMzU1LTUuODU4LDIxLjIxMywwICAgIEMzODQuMTY0LDE3OS43MTgsMzg0LjE2NCwxODkuMjE1LDM3OC4zMDYsMTk1LjA3M3oiIGZpbGw9IiMzMmM3NDEiLz4KCTwvZz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\" />\n <img *ngIf=\"item.uploadProgress==100 && !item.isSuccess\" src=\"data:image/svg+xml;utf8;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8IS0tIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTkuMC4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgLS0+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDUyIDUyIiBzdHlsZT0iZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCA1MiA1MjsiIHhtbDpzcGFjZT0icHJlc2VydmUiIHdpZHRoPSIxNnB4IiBoZWlnaHQ9IjE2cHgiPgo8Zz4KCTxwYXRoIGQ9Ik0yNiwwQzExLjY2NCwwLDAsMTEuNjYzLDAsMjZzMTEuNjY0LDI2LDI2LDI2czI2LTExLjY2MywyNi0yNlM0MC4zMzYsMCwyNiwweiBNMjYsNTBDMTIuNzY3LDUwLDIsMzkuMjMzLDIsMjYgICBTMTIuNzY3LDIsMjYsMnMyNCwxMC43NjcsMjQsMjRTMzkuMjMzLDUwLDI2LDUweiIgZmlsbD0iI0Q4MDAyNyIvPgoJPHBhdGggZD0iTTM1LjcwNywxNi4yOTNjLTAuMzkxLTAuMzkxLTEuMDIzLTAuMzkxLTEuNDE0LDBMMjYsMjQuNTg2bC04LjI5My04LjI5M2MtMC4zOTEtMC4zOTEtMS4wMjMtMC4zOTEtMS40MTQsMCAgIHMtMC4zOTEsMS4wMjMsMCwxLjQxNEwyNC41ODYsMjZsLTguMjkzLDguMjkzYy0wLjM5MSwwLjM5MS0wLjM5MSwxLjAyMywwLDEuNDE0QzE2LjQ4OCwzNS45MDIsMTYuNzQ0LDM2LDE3LDM2ICAgczAuNTEyLTAuMDk4LDAuNzA3LTAuMjkzTDI2LDI3LjQxNGw4LjI5Myw4LjI5M0MzNC40ODgsMzUuOTAyLDM0Ljc0NCwzNiwzNSwzNnMwLjUxMi0wLjA5OCwwLjcwNy0wLjI5MyAgIGMwLjM5MS0wLjM5MSwwLjM5MS0xLjAyMywwLTEuNDE0TDI3LjQxNCwyNmw4LjI5My04LjI5M0MzNi4wOTgsMTcuMzE2LDM2LjA5OCwxNi42ODQsMzUuNzA3LDE2LjI5M3oiIGZpbGw9IiNEODAwMjciLz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8Zz4KPC9nPgo8L3N2Zz4K\" />\n {{item.fileLabel}}\n </small>\n </div>\n </div>\n</div>",
styles: [".__ngx-uploader input{display:none}.__ngx-uploader .upload-area{padding:5rem;background-color:#fafafa;position:relative;border:1.5px dashed #d5d5d5}.__ngx-uploader .upload-area .placeholder-area{display:flex;align-items:center;justify-content:center;flex-direction:column;position:absolute;top:0;left:0;right:0;bottom:0}.__ngx-uploader .upload-area .placeholder-area img{width:30px;margin-bottom:10px}.__ngx-uploader .upload-area button{position:absolute;top:0;left:0;right:0;bottom:0;background:0 0;border:none;cursor:pointer;width:100%;padding:0}.__ngx-uploader .upload-area button:focus{outline:0}.__ngx-uploader .upload-area button:active{box-shadow:inset 0 1px 20px -3px rgba(16,83,158,.72)}.__ngx-uploader .upload-area button:hover{background:rgba(11,116,150,.1)}.__ngx-uploader .upload-area button.on-file-drag{background:rgba(0,0,0,.5)}.__ngx-uploader .upload-progress-container{margin-top:15px}.__ngx-uploader .upload-progress-container p{margin-bottom:5px}.__ngx-uploader .upload-progress-container .upload-progress-bar{background-color:#e2e7ee;height:5px;margin-bottom:5px;border-radius:4px}.__ngx-uploader .upload-progress-container .upload-progress-bar .upload-progress{height:100%;width:0;background-color:#1991eb;transition:width .6s;border-radius:4px}.__ngx-uploader .upload-progress-container .upload-progress-bar .upload-progress.upload-progress-red{background-color:#c50000}.__ngx-uploader .upload-progress-container .progress-text,.__ngx-uploader .upload-progress-container .progress-text small{display:flex;align-items:center;justify-content:space-between;flex-direction:row}.__ngx-uploader .upload-progress-container .progress-text small img{margin-right:5px}"]
}] }
];
/** @nocollapse */
NgxUploaderMayComponent.ctorParameters = function () {
return [
{ type: http.HttpClient }
];
};
NgxUploaderMayComponent.propDecorators = {
inputFileField: [{ type: i0.ViewChild, args: ['uploadField',] }],
allowedExtensions: [{ type: i0.Input, args: ["allowed-extensions",] }],
allowedSize: [{ type: i0.Input, args: ["allowed-size",] }],
maxAllowedFiles: [{ type: i0.Input, args: ["max-allowed-files",] }],
formData: [{ type: i0.Input, args: ["form-data",] }],
formDataUploadKey: [{ type: i0.Input, args: ["upload-form-key",] }],
uploadUrl: [{ type: i0.Input, args: ["upload-url",] }],
uploadReqMethod: [{ type: i0.Input, args: ["request-method",] }],
isMulti: [{ type: i0.Input, args: ["is-multi",] }],
onError: [{ type: i0.Output, args: ["onError",] }],
onUpload: [{ type: i0.Output, args: ["onUpload",] }],
onSuccess: [{ type: i0.Output, args: ["onSuccess",] }]
};
return NgxUploaderMayComponent;
}());
var UploadFile = /** @class */ (function () {
function UploadFile() {
}
return UploadFile;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
var NgxUploaderMayModule = /** @class */ (function () {
function NgxUploaderMayModule() {
}
NgxUploaderMayModule.decorators = [
{ type: i0.NgModule, args: [{
declarations: [NgxUploaderMayComponent],
imports: [
common.CommonModule,
http.HttpClientModule
],
exports: [NgxUploaderMayComponent]
},] }
];
return NgxUploaderMayModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
exports.NgxUploaderMayService = NgxUploaderMayService;
exports.NgxUploaderMayComponent = NgxUploaderMayComponent;
exports.UploadFile = UploadFile;
exports.NgxUploaderMayModule = NgxUploaderMayModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXVwbG9hZGVyLW1heS51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC11cGxvYWRlci1tYXkvbGliL25neC11cGxvYWRlci1tYXkuc2VydmljZS50cyIsIm5nOi8vbmd4LXVwbG9hZGVyLW1heS9saWIvbmd4LXVwbG9hZGVyLW1heS5jb21wb25lbnQudHMiLCJuZzovL25neC11cGxvYWRlci1tYXkvbGliL25neC11cGxvYWRlci1tYXkubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTmd4VXBsb2FkZXJNYXlTZXJ2aWNlIHtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIGZvcndhcmRSZWYsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiwgQ29udHJvbFZhbHVlQWNjZXNzb3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwUmVxdWVzdCwgSHR0cEV2ZW50VHlwZSwgSHR0cFJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtdXBsb2FkZXItbWF5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC11cGxvYWRlci1tYXkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9uZ3gtdXBsb2FkZXItbWF5LmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTmd4VXBsb2FkZXJNYXlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG5cbiAgQFZpZXdDaGlsZCgndXBsb2FkRmllbGQnKSBpbnB1dEZpbGVGaWVsZDogRWxlbWVudFJlZjtcblxuICBfYWxsb3dlZEV4dGVuc2lvbnM6IEFycmF5PHN0cmluZz47XG4gIEBJbnB1dChcImFsbG93ZWQtZXh0ZW5zaW9uc1wiKVxuICBzZXQgYWxsb3dlZEV4dGVuc2lvbnMoZXh0ZW5zaW9uczogQXJyYXk8c3RyaW5nPikge1xuICAgIHRoaXMuX2FsbG93ZWRFeHRlbnNpb25zID0gZXh0ZW5zaW9ucztcbiAgfVxuXG4gIF9hbGxvd2VkU2l6ZTogbnVtYmVyO1xuICBASW5wdXQoXCJhbGxvd2VkLXNpemVcIilcbiAgc2V0IGFsbG93ZWRTaXplKHNpemU6IG51bWJlcikge1xuICAgIHRoaXMuX2FsbG93ZWRTaXplID0gc2l6ZTtcbiAgfVxuXG4gIF9tYXhBbGxvd2VkRmlsZXM6IG51bWJlciA9IDU7XG4gIEBJbnB1dChcIm1heC1hbGxvd2VkLWZpbGVzXCIpXG4gIHNldCBtYXhBbGxvd2VkRmlsZXMoc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4QWxsb3dlZEZpbGVzID0gc2l6ZTtcbiAgfVxuXG4gIF9mb3JtRGF0YTogRm9ybURhdGE7XG4gIEBJbnB1dChcImZvcm0tZGF0YVwiKVxuICBzZXQgZm9ybURhdGEoZm9ybURhdGE6IEZvcm1EYXRhKSB7XG4gICAgdGhpcy5fZm9ybURhdGEgPSBmb3JtRGF0YTtcbiAgfVxuXG4gIF9mb3JtRGF0YVVwbG9hZEtleTogc3RyaW5nO1xuICBASW5wdXQoXCJ1cGxvYWQtZm9ybS1rZXlcIilcbiAgc2V0IGZvcm1EYXRhVXBsb2FkS2V5KGtleTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZm9ybURhdGFVcGxvYWRLZXkgPSBrZXk7XG4gIH1cblxuICBfdXBsb2FkVXJsOiBzdHJpbmc7XG4gIEBJbnB1dChcInVwbG9hZC11cmxcIilcbiAgc2V0IHVwbG9hZFVybCh1cmw6IHN0cmluZykge1xuICAgIHRoaXMuX3VwbG9hZFVybCA9IHVybDtcbiAgfVxuXG4gIF91cGxvYWRSZXFNZXRob2Q6IHN0cmluZztcbiAgQElucHV0KFwicmVxdWVzdC1tZXRob2RcIilcbiAgc2V0IHVwbG9hZFJlcU1ldGhvZChtZXRob2Q6IHN0cmluZykge1xuICAgIHRoaXMuX3VwbG9hZFJlcU1ldGhvZCA9IG1ldGhvZDtcbiAgfVxuXG4gIF9pc011bHRpOiBib29sZWFuO1xuICBASW5wdXQoXCJpcy1tdWx0aVwiKVxuICBzZXQgaXNNdWx0aShtdWx0aTogYm9vbGVhbikge1xuICAgIHRoaXMuX2lzTXVsdGkgPSBtdWx0aTtcbiAgfVxuXG4gIEBPdXRwdXQoXCJvbkVycm9yXCIpIG9uRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJvblVwbG9hZFwiKSBvblVwbG9hZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dChcIm9uU3VjY2Vzc1wiKSBvblN1Y2Nlc3MgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgaXNGaWxlRHJhZ0VudGVyOiBib29sZWFuID0gZmFsc2U7XG4gIGZpbGVzOkFycmF5PFVwbG9hZEZpbGU+ID0gW107XG4gIGlzVXBsb2FkaW5nOmJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICB9XG5cbiAgb25DbGlja1VwbG9hZGVyQnRuKCkge1xuICAgIGxldCBlbDogSFRNTEVsZW1lbnQgPSB0aGlzLmlucHV0RmlsZUZpZWxkLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWwuY2xpY2soKTtcbiAgfVxuXG4gIG9uRmlsZURyYWdPdmVyRW50ZXIoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2V0T25GaWxlRHJhZ2dlZCh0cnVlKTtcbiAgfVxuXG4gIG9uRmlsZURyYWdMZWF2ZUVuZChlKSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZXRPbkZpbGVEcmFnZ2VkKGZhbHNlKTtcbiAgfVxuXG4gIG9uRmlsZURyb3AoZSkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuc2V0T25GaWxlRHJhZ2dlZChmYWxzZSk7XG4gICAgdGhpcy5vbkF0dGFjaGVkRmlsZShlW1wiZGF0YVRyYW5zZmVyXCJdLmZpbGVzKTtcbiAgfVxuXG4gIHNldE9uRmlsZURyYWdnZWQoaXNEcmFnZ2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc0ZpbGVEcmFnRW50ZXIgPSBpc0RyYWdnZWQ7XG4gIH1cblxuXG4gIG9uQXR0YWNoZWRGaWxlKGZpbGVzOiBGaWxlTGlzdCkge1xuICAgIHRoaXMuY2xlYXJGaWxlcygpO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKHRoaXMuZmlsZXMpO1xuXG4gICAgaWYgKCF0aGlzLl91cGxvYWRVcmwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlVwbG9hZCBVUkwgbm90IHByb3ZpZGVkXCIpO1xuICAgIH1cblxuICAgIGlmIChmaWxlcy5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYodGhpcy5faXNNdWx0aSAmJiBmaWxlcy5sZW5ndGggPiB0aGlzLl9tYXhBbGxvd2VkRmlsZXMpe1xuICAgICAgdGhpcy5vbkVycm9yLmVtaXQoW1wiTWF4aW11bSBhbGxvd2VkIGZpbGVzIGNvdW50IGlzIFwiKyB0aGlzLl9tYXhBbGxvd2VkRmlsZXNdKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZighdGhpcy5faXNNdWx0aSAmJiBmaWxlcy5sZW5ndGggPiAxKXtcbiAgICAgIHRoaXMub25FcnJvci5lbWl0KFtcIlVwbG9hZGVyIG5vdCBjb25maWd1cmVkIHRvIHVwbG9hZCBtdWx0aXBsZSBmaWxlc1wiXSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIFxuICAgIGlmKHRoaXMuX2lzTXVsdGkpe1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgZiA9IG5ldyBVcGxvYWRGaWxlKCk7XG4gICAgICAgIGYuZmlsZSA9IGZpbGVzLml0ZW0oaSk7XG4gICAgICAgIHRoaXMuZmlsZXMucHVzaChmKTtcbiAgICAgIH1cbiAgICB9ZWxzZXtcbiAgICAgIGxldCBmID0gbmV3IFVwbG9hZEZpbGUoKTtcbiAgICAgIGYuZmlsZSA9IGZpbGVzLml0ZW0oMCk7XG4gICAgICB0aGlzLmZpbGVzLnB1c2goZik7XG4gICAgfVxuICAgIC8vUmVtb3ZlIGlucHV0IHZhbHVlcyBhZnRlciBhc3NpZ25cbiAgICB0aGlzLmNsZWFyRmlsZUlucHV0KCk7XG5cbiAgICB0aGlzLmZpbGVzLmZvckVhY2godWYgPT57XG4gICAgICB0aGlzLnZhbGlkYXRlKHVmKTtcbiAgICB9KTtcblxuICAgIGlmKHRoaXMuZmlsZXMuZmlsdGVyKHUgPT4gdS5pc1ZhbGlkID09IGZhbHNlKS5sZW5ndGggPiAwKXtcbiAgICAgIHRoaXMub25FcnJvci5lbWl0KHRoaXMuZmlsZXMuZmlsdGVyKHUgPT4gdS5pc1ZhbGlkID09IGZhbHNlKS5tYXAodSA9PiB1LmludmFsaWRNZXNzYWdlKSk7XG4gICAgICB0aGlzLmNsZWFyRmlsZXMoKTtcbiAgICB9ZWxzZXtcbiAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaCh1ZiA9PntcbiAgICAgICAgdGhpcy51cGxvYWRGaWxlKHVmKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHZhbGlkYXRlKHVwbG9hZEZpbGU6IFVwbG9hZEZpbGUpIHtcbiAgICBsZXQgZXJyb3JzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgaWYgKHRoaXMuX2FsbG93ZWRFeHRlbnNpb25zICYmIHRoaXMuX2FsbG93ZWRFeHRlbnNpb25zLmZpbHRlcihzID0+IHMgPT09IHRoaXMuZ2V0RmlsZUV4dGVuc2lvbih1cGxvYWRGaWxlLmZpbGUpKS5sZW5ndGggPT0gMCkge1xuICAgICAgZXJyb3JzLnB1c2goXCJGaWxlIHR5cGUgbm90IHN1cHBvcnRcIik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FsbG93ZWRTaXplICYmIHRoaXMuZ2V0RmlsZVNpemVNQih1cGxvYWRGaWxlLmZpbGUpID4gdGhpcy5fYWxsb3dlZFNpemUpIHtcbiAgICAgIGVycm9ycy5wdXNoKFwiRmlsZSBpcyB0b28gbGFyZ2VcIik7XG4gICAgfVxuICAgIHVwbG9hZEZpbGUuaW52YWxpZE1lc3NhZ2UgPSBlcnJvcnMuam9pbigpO1xuXG4gICAgaWYoZXJyb3JzLmxlbmd0aCA+IDApe1xuICAgICAgdXBsb2FkRmlsZS5pc1ZhbGlkID0gZmFsc2U7XG4gICAgfWVsc2V7XG4gICAgICB1cGxvYWRGaWxlLmlzVmFsaWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHVwbG9hZEZpbGUodXBsb2FkRmlsZTogVXBsb2FkRmlsZSkge1xuICAgIHRoaXMuaXNVcGxvYWRpbmcgPSB0cnVlO1xuICAgIHVwbG9hZEZpbGUuZmlsZUxhYmVsID0gIHVwbG9hZEZpbGUuZmlsZS5uYW1lO1xuICAgIHVwbG9hZEZpbGUuZmlsZVNpemVMYWJlbCA9IHRoaXMuZ2V0RmlsZVNpemVMYWJlbCh0aGlzLmdldEZpbGVTaXplTUIodXBsb2FkRmlsZS5maWxlKSk7XG4gICAgdXBsb2FkRmlsZS51cGxvYWRQcm9ncmVzcyA9IDA7XG4gICAgbGV0IGZvcm1EYXRhID0gdGhpcy5jcmVhdGVGb3JtRGF0YSh1cGxvYWRGaWxlLmZpbGUpO1xuXG4gICAgY29uc3QgcmVxID0gbmV3IEh0dHBSZXF1ZXN0KHRoaXMuX3VwbG9hZFJlcU1ldGhvZCB8fCBcIlBPU1RcIiwgdGhpcy5fdXBsb2FkVXJsLCBmb3JtRGF0YSwge1xuICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHRydWVcbiAgICB9KTtcblxuICAgIHRoaXMuaHR0cC5yZXF1ZXN0KHJlcSkuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC50eXBlID09PSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzKSB7XG4gICAgICAgIGNvbnN0IHBlcmNlbnREb25lID0gTWF0aC5yb3VuZCgxMDAgKiBldmVudC5sb2FkZWQgLyBldmVudC50b3RhbCk7XG4gICAgICAgIGlmKHBlcmNlbnREb25lID49IDEwMCl7XG4gICAgICAgICAgdXBsb2FkRmlsZS51cGxvYWRQcm9ncmVzcyA9IDk4O1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICB1cGxvYWRGaWxlLnVwbG9hZFByb2dyZXNzID0gcGVyY2VudERvbmU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcbiAgICAgICAgdXBsb2FkRmlsZS51cGxvYWRQcm9ncmVzcyA9IDEwMDtcbiAgICAgICAgaWYgKGV2ZW50LnN0YXR1cyA9PSAyMDAgfHwgZXZlbnQuc3RhdHVzID09IDIwMSkge1xuICAgICAgICAgIHRoaXMub25VcGxvYWRTdWNjZXNzKGV2ZW50LHVwbG9hZEZpbGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICAgIGVycm9yID0+IHtcbiAgICAgICAgdXBsb2FkRmlsZS51cGxvYWRQcm9ncmVzcyA9IDEwMDtcbiAgICAgICAgdGhpcy5vblVwbG9hZEVycm9yKGVycm9yLCB1cGxvYWRGaWxlKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgb25VcGxvYWRTdWNjZXNzKHJlc3BvbnNlOmFueSwgdWY6VXBsb2FkRmlsZSl7XG4gICAgdWYuaXNTdWNjZXNzID0gdHJ1ZTtcbiAgICB1Zi5zZXJ2ZXJSZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMub25VcGxvYWQuZW1pdCh1Zi5zZXJ2ZXJSZXNwb25zZSk7XG4gICAgaWYodGhpcy5pc0FsbEZpbGVzVXBsb2FkRG9uZSgpKXtcbiAgICAgIHRoaXMucHVibGlzaFZhbHVlKCk7XG4gICAgfVxuICB9XG5cbiAgb25VcGxvYWRFcnJvcihlcnJvcjphbnksIHVmOlVwbG9hZEZpbGUpe1xuICAgIHVmLmlzU3VjY2VzcyA9IGZhbHNlO1xuICAgIHVmLnNlcnZlclJlc3BvbnNlID0gZXJyb3IuZXJyb3I7XG4gICAgdGhpcy5vblVwbG9hZC5lbWl0KHVmLnNlcnZlclJlc3BvbnNlKTtcbiAgICBpZih0aGlzLmlzQWxsRmlsZXNVcGxvYWREb25lKCkpe1xuICAgICAgdGhpcy5wdWJsaXNoVmFsdWUoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaXNoVmFsdWUoKXtcbiAgICB0aGlzLmlzVXBsb2FkaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jbGVhckZpbGVJbnB1dCgpO1xuICAgIHRoaXMub25TdWNjZXNzLmVtaXQodGhpcy5maWxlcy5tYXAodWYgPT4gdWYuc2VydmVyUmVzcG9uc2UpKTtcbiAgfVxuXG4gIGlzQWxsRmlsZXNVcGxvYWREb25lKCl7XG4gICAgcmV0dXJuICEodGhpcy5maWxlcy5maWx0ZXIodWYgPT4gdWYudXBsb2FkUHJvZ3Jlc3MgPCAxMDApLmxlbmd0aCA+IDApO1xuICB9XG5cbiAgY3JlYXRlRm9ybURhdGEoZmlsZTogRmlsZSkge1xuICAgIGlmICghdGhpcy5fZm9ybURhdGFVcGxvYWRLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkVtcHR5IGZvcm0gZGF0YSB1cGxvYWQga2V5LiBQbGVhc2UgdXNlIHVwbG9hZC1mb3JtLWtleSBpbiB5b3VyIGRpcmVjdGl2ZS5cIik7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mb3JtRGF0YSkge1xuICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICB0aGlzLl9mb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSkgPT57XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbCk7XG4gICAgICB9KTtcbiAgICAgIGZvcm1EYXRhLmFwcGVuZCh0aGlzLl9mb3JtRGF0YVVwbG9hZEtleSwgZmlsZSk7XG4gICAgICByZXR1cm4gZm9ybURhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgZm9ybURhdGEuYXBwZW5kKHRoaXMuX2Zvcm1EYXRhVXBsb2FkS2V5LCBmaWxlKTtcbiAgICAgIHJldHVybiBmb3JtRGF0YTtcbiAgICB9XG4gIH1cblxuICBnZXRGaWxlRXh0ZW5zaW9uKGZpbGU6IEZpbGUpIHtcbiAgICByZXR1cm4gZmlsZS5uYW1lLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgfVxuXG4gIGdldEZpbGVTaXplTUIoZmlsZTogRmlsZSkge1xuICAgIHJldHVybiBmaWxlLnNpemUgLyAoMWUrNik7XG4gIH1cblxuICBnZXRGaWxlU2l6ZUxhYmVsKGZpbGVTaXplTWI6IG51bWJlcikge1xuICAgIGlmIChmaWxlU2l6ZU1iID4gMSAmJiBmaWxlU2l6ZU1iIDwgMTAwMCkge1xuICAgICAgcmV0dXJuIGZpbGVTaXplTWIudG9GaXhlZCgyKSArIFwiTWJcIjtcbiAgICB9IGVsc2UgaWYgKGZpbGVTaXplTWIgPCAxKSB7XG4gICAgICByZXR1cm4gKGZpbGVTaXplTWIgKiAxMDAwKS50b0ZpeGVkKDIpICsgXCJLYlwiO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyRmlsZUlucHV0KCkge1xuICAgIHRoaXMuaW5wdXRGaWxlRmllbGQubmF0aXZlRWxlbWVudC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBjbGVhckZpbGVzKCl7XG4gICAgdGhpcy5maWxlcyA9IFtdO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCl7XG4gICAgdGhpcy5jbGVhckZpbGVzKCk7XG4gICAgdGhpcy5jbGVhckZpbGVJbnB1dCgpO1xuICAgIHRoaXMuaXNGaWxlRHJhZ0VudGVyID0gZmFsc2U7XG4gICAgdGhpcy5pc1VwbG9hZGluZyA9IGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVcGxvYWRGaWxle1xuICBmaWxlOkZpbGU7XG4gIHVwbG9hZFByb2dyZXNzOm51bWJlcjtcbiAgZmlsZUxhYmVsOnN0cmluZztcbiAgZmlsZVNpemVMYWJlbDpzdHJpbmc7XG4gIGlzU3VjY2Vzczpib29sZWFuO1xuICBpc1ZhbGlkOmJvb2xlYW47XG4gIGludmFsaWRNZXNzYWdlOnN0cmluZztcbiAgc2VydmVyUmVzcG9uc2U6YW55O1xufVxuIiwiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5neFVwbG9hZGVyTWF5Q29tcG9uZW50IH0gZnJvbSAnLi9uZ3gtdXBsb2FkZXItbWF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbTmd4VXBsb2FkZXJNYXlDb21wb25lbnRdLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEh0dHBDbGllbnRNb2R1bGVcbiAgXSxcbiAgZXhwb3J0czogW05neFVwbG9hZGVyTWF5Q29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBOZ3hVcGxvYWRlck1heU1vZHVsZSB7IH1cbiJdLCJuYW1lcyI6WyJJbmplY3RhYmxlIiwiaHR0cCIsIkV2ZW50RW1pdHRlciIsIkh0dHBSZXF1ZXN0IiwiSHR0cEV2ZW50VHlwZSIsIkh0dHBSZXNwb25zZSIsIkNvbXBvbmVudCIsIkh0dHBDbGllbnQiLCJWaWV3Q2hpbGQiLCJJbnB1dCIsIk91dHB1dCIsIk5nTW9kdWxlIiwiQ29tbW9uTW9kdWxlIiwiSHR0cENsaWVudE1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO1FBT0U7U0FBaUI7O29CQUxsQkEsYUFBVSxTQUFDO3dCQUNWLFVBQVUsRUFBRSxNQUFNO3FCQUNuQjs7Ozs7b0NBSkQ7S0FFQTs7Ozs7O0FDRkE7UUFzRUUsaUNBQW9CQyxPQUFnQjtZQUFoQixTQUFJLEdBQUpBLE9BQUksQ0FBWTtZQTVDcEMs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