angular-material-datatransfer-lib
Version:
A HTML5 datatransfer UI for handling upload and download of multiple simultaneous files.
411 lines • 37.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: lib/io/uploaders/resumablejs.uploader.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import * as Resumable from 'resumablejs';
import { BaseUploader } from './base.uploader';
import { ConfigService } from '../../services/config.service';
import { LoggerService } from '../../services/logger.service';
import { GuidUtil } from '../../utils/guid.util';
import { CryptoService } from '../../services/crypto.service';
import { TransferStatus } from '../../enums/transfer-status.enum';
import { DatatransferItem } from '../../models/datatransfer-item.model';
import { SizeContainer } from '../../models/size-container.model';
import { DecimalByteUnit } from '../../enums/decimal-byte-unit.enum';
import { ProgressContainer } from '../../models/progress-container.model';
import { TransferType } from '../../enums/transfer-type.enum';
var ResumableJsUploader = /** @class */ (function (_super) {
tslib_1.__extends(ResumableJsUploader, _super);
function ResumableJsUploader(logger, guidUtil, cryptoService) {
var _this = _super.call(this, logger, guidUtil, cryptoService) || this;
_this.logger = logger;
_this.guidUtil = guidUtil;
_this.cryptoService = cryptoService;
_this.r = undefined;
_this.preprocessFileFn = undefined;
_this.preprocessChunkFn = undefined;
_this.initResumable();
return _this;
}
/**
* @private
* @return {?}
*/
ResumableJsUploader.prototype.initResumable = /**
* @private
* @return {?}
*/
function () {
/**
* @param {?} file
* @param {?} event
* @return {?}
*/
function generateId(file, event) {
/** @type {?} */
var that = (/** @type {?} */ (this));
return that.generateUniqueIdentifier();
}
/**
* @param {?} resumableChunk
* @return {?}
*/
function preprocessChunkInlineFn(resumableChunk) {
/** @type {?} */
var that = (/** @type {?} */ (this));
if (typeof that.preprocessChunkFn === 'function') {
that.preprocessChunkFn(resumableChunk);
}
else {
resumableChunk.preprocessFinished();
}
}
/**
* @param {?} resumableFile
* @return {?}
*/
function preprocessFileInlineFn(resumableFile) {
/** @type {?} */
var that = (/** @type {?} */ (this));
if (typeof that.preprocessFileFn === 'function') {
that.changeItemStatus(resumableFile.internalItem, TransferStatus.Preprocessing);
that.preprocessFileFn(resumableFile);
}
else {
if (ConfigService.settings.core.preprocessHashEnabled && ConfigService.settings.core.preprocessHashChecked) {
that.changeItemStatus(resumableFile.internalItem, TransferStatus.Preprocessing);
/** @type {?} */
var continueCallback = (/**
* @return {?}
*/
function () {
resumableFile.preprocessFinished();
});
/** @type {?} */
var cancelCallback = (/**
* @return {?}
*/
function () {
resumableFile.cancel();
that.changeItemStatus(resumableFile.internalItem, TransferStatus.Finished, resumableFile.internalItem.message);
that.r.uploadNextChunk();
});
that.preprocessHash(resumableFile.internalItem, resumableFile.file, continueCallback, cancelCallback);
}
else {
resumableFile.preprocessFinished();
}
}
}
ConfigService.settings.resumablejs.generateUniqueIdentifier = generateId.bind(this);
if (typeof ConfigService.settings.resumablejs.preprocess === 'function') {
// clones the function with '{}' acting as it's new 'this' parameter
this.preprocessChunkFn = ConfigService.settings.resumablejs.preprocess.bind({});
}
ConfigService.settings.resumablejs.preprocess = preprocessChunkInlineFn.bind(this);
if (typeof ConfigService.settings.resumablejs.preprocessFile === 'function') {
// clones the function with '{}' acting as it's new 'this' parameter
this.preprocessFileFn = ConfigService.settings.resumablejs.preprocessFile.bind({});
}
ConfigService.settings.resumablejs.preprocessFile = preprocessFileInlineFn.bind(this);
// @ts-ignore: ignore type checking
this.r = new Resumable(ConfigService.settings.resumablejs);
this.r.on('fileAdded', (/**
* @param {?} file
* @param {?} event
* @return {?}
*/
function (file, event) {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('fileAdded', file);
/** @type {?} */
var newItem = new DatatransferItem({
id: file.uniqueIdentifier,
name: file.fileName,
path: file.relativePath.substr(0, file.relativePath.length - file.fileName.length),
sizeContainer: new SizeContainer({ decimalByteUnit: DecimalByteUnit.Byte, decimalByteUnitSize: file.size }),
progressContainer: new ProgressContainer(file.size),
transferType: TransferType.Upload,
status: TransferStatus.Ready,
externalItem: file
});
file.internalItem = newItem;
that.addItem(newItem);
}).bind(this));
this.r.on('fileProgress', (/**
* @param {?} file
* @param {?} message
* @return {?}
*/
function (file, message) {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('fileProgress', file.progress());
that.changeItemStatus(file.internalItem, TransferStatus.Uploading);
that.updateItemProgress(file.internalItem, file.progress());
that.updateOverallProgress(that.transferType, that.r.progress());
}).bind(this));
this.r.on('fileSuccess', (/**
* @param {?} file
* @param {?} message
* @return {?}
*/
function (file, message) {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('fileSuccess', file);
that.changeItemStatus(file.internalItem, TransferStatus.Finished, message);
}).bind(this));
this.r.on('fileError', (/**
* @param {?} file
* @param {?} message
* @return {?}
*/
function (file, message) {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('fileError', file, message);
that.changeItemStatus(file.internalItem, TransferStatus.Failed, message);
}).bind(this));
this.r.on('uploadStart', (/**
* @return {?}
*/
function () {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('uploadStart', that.r);
that._isWorking = true;
that.updateZone();
that.updateOverallProgress(that.transferType, that.r.progress());
that.updateOverallSize(that.r.getSize());
}).bind(this));
this.r.on('chunkingComplete', (/**
* @return {?}
*/
function () {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('chunkingComplete');
}).bind(this));
this.r.on('pause', (/**
* @return {?}
*/
function () {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('pause');
that._isWorking = false;
that.updateZone();
}).bind(this));
this.r.on('cancel', (/**
* @return {?}
*/
function () {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('cancel');
that._isWorking = false;
that.updateZone();
}).bind(this));
this.r.on('complete', (/**
* @return {?}
*/
function () {
/** @type {?} */
var that = (/** @type {?} */ (this));
// that.logger.log('complete', that.r);
that._isWorking = false;
that.updateZone();
}).bind(this));
};
/**
* @param {?} element
* @param {?} isDirectory
* @return {?}
*/
ResumableJsUploader.prototype.assignBrowse = /**
* @param {?} element
* @param {?} isDirectory
* @return {?}
*/
function (element, isDirectory) {
this.r.assignBrowse(element, isDirectory);
};
/**
* @param {?} element
* @return {?}
*/
ResumableJsUploader.prototype.assignDrop = /**
* @param {?} element
* @return {?}
*/
function (element) {
this.r.assignDrop(element);
};
/**
* @param {?} oldPath
* @param {?} newPath
* @return {?}
*/
ResumableJsUploader.prototype.editPath = /**
* @param {?} oldPath
* @param {?} newPath
* @return {?}
*/
function (oldPath, newPath) {
_super.prototype.editPath.call(this, oldPath, newPath);
this.r.files.forEach((/**
* @param {?} file
* @param {?} index
* @return {?}
*/
function (file, index) {
/** @type {?} */
var internalItem = (/** @type {?} */ (file.internalItem));
if (internalItem.status === TransferStatus.Ready && internalItem.path === oldPath) {
file.relativePath = newPath + file.fileName;
internalItem.path = newPath;
}
}));
};
/**
* @param {?} item
* @param {?} name
* @return {?}
*/
ResumableJsUploader.prototype.editFilename = /**
* @param {?} item
* @param {?} name
* @return {?}
*/
function (item, name) {
_super.prototype.editFilename.call(this, item, name);
item.externalItem.fileName = name;
item.externalItem.relativePath = item.path + name;
item.name = name;
};
/**
* @return {?}
*/
ResumableJsUploader.prototype.startAll = /**
* @return {?}
*/
function () {
this.r.upload();
};
/**
* @return {?}
*/
ResumableJsUploader.prototype.pauseAll = /**
* @return {?}
*/
function () {
// reset preprocessState
this.r.files.forEach((/**
* @param {?} file
* @param {?} index
* @return {?}
*/
function (file, index) {
if (file.preprocessState === 1) {
file.preprocessState = 0;
}
}));
this.r.pause();
};
/**
* @return {?}
*/
ResumableJsUploader.prototype.removeAll = /**
* @return {?}
*/
function () {
var _this = this;
/** @type {?} */
var tempFiles = this.r.files.slice();
tempFiles.forEach((/**
* @param {?} file
* @param {?} index
* @return {?}
*/
function (file, index) {
/** @type {?} */
var that = (/** @type {?} */ (_this));
that.r.removeFile(file);
}));
this._isWorking = false;
};
/**
* @param {?} item
* @return {?}
*/
ResumableJsUploader.prototype.removeItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
this.r.removeFile(item.externalItem);
if (this.r.files.length <= 0) {
this._isWorking = false;
}
};
/**
* @param {?} item
* @return {?}
*/
ResumableJsUploader.prototype.retryItem = /**
* @param {?} item
* @return {?}
*/
function (item) {
item.externalItem.retry();
};
ResumableJsUploader.decorators = [
{ type: Injectable }
];
/** @nocollapse */
ResumableJsUploader.ctorParameters = function () { return [
{ type: LoggerService },
{ type: GuidUtil },
{ type: CryptoService }
]; };
return ResumableJsUploader;
}(BaseUploader));
export { ResumableJsUploader };
if (false) {
/**
* @type {?}
* @private
*/
ResumableJsUploader.prototype.r;
/**
* @type {?}
* @private
*/
ResumableJsUploader.prototype.preprocessFileFn;
/**
* @type {?}
* @private
*/
ResumableJsUploader.prototype.preprocessChunkFn;
/**
* @type {?}
* @protected
*/
ResumableJsUploader.prototype.logger;
/**
* @type {?}
* @protected
*/
ResumableJsUploader.prototype.guidUtil;
/**
* @type {?}
* @protected
*/
ResumableJsUploader.prototype.cryptoService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1hYmxlanMudXBsb2FkZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9hbmd1bGFyLW1hdGVyaWFsLWRhdGF0cmFuc2Zlci1saWIvIiwic291cmNlcyI6WyJsaWIvaW8vdXBsb2FkZXJzL3Jlc3VtYWJsZWpzLnVwbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDOUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFxQixNQUFNLHNDQUFzQyxDQUFDO0FBQzNGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRTlEO0lBQ3lDLCtDQUFZO0lBTWpELDZCQUFzQixNQUFxQixFQUNyQixRQUFrQixFQUNsQixhQUE0QjtRQUZsRCxZQUdJLGtCQUFNLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLFNBRXpDO1FBTHFCLFlBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsY0FBUSxHQUFSLFFBQVEs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QUM7UUFDNUIsQ0FBQyxFQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDOzs7OztJQUVNLHdDQUFVOzs7O0lBQWpCLFVBQWtCLElBQXVCO1FBQ3JDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7U0FDM0I7SUFDTCxDQUFDOzs7OztJQUVNLHVDQUFTOzs7O0lBQWhCLFVBQWlCLElBQXVCO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDOUIsQ0FBQzs7Z0JBaE1KLFVBQVU7Ozs7Z0JBVkYsYUFBYTtnQkFDYixRQUFRO2dCQUNSLGFBQWE7O0lBeU10QiwwQkFBQztDQUFBLEFBak1ELENBQ3lDLFlBQVksR0FnTXBEO1NBaE1ZLG1CQUFtQjs7Ozs7O0lBRTVCLGdDQUEyQzs7Ozs7SUFDM0MsK0NBQXFDOzs7OztJQUNyQyxnREFBc0M7Ozs7O0lBRTFCLHFDQUErQjs7Ozs7SUFDL0IsdUNBQTRCOzs7OztJQUM1Qiw0Q0FBc0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCAqIGFzIFJlc3VtYWJsZSBmcm9tICdyZXN1bWFibGVqcyc7XHJcbmltcG9ydCB7IEJhc2VVcGxvYWRlciB9IGZyb20gJy4vYmFzZS51cGxvYWRlcic7XHJcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb25maWcuc2VydmljZSc7XHJcbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2dnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IEd1aWRVdGlsIH0gZnJvbSAnLi4vLi4vdXRpbHMvZ3VpZC51dGlsJztcclxuaW1wb3J0IHsgQ3J5cHRvU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NyeXB0by5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNmZXJTdGF0dXMgfSBmcm9tICcuLi8uLi9lbnVtcy90cmFuc2Zlci1zdGF0dXMuZW51bSc7XHJcbmltcG9ydCB7IERhdGF0cmFuc2Zlckl0ZW0sIElEYXRhdHJhbnNmZXJJdGVtIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGF0cmFuc2Zlci1pdGVtLm1vZGVsJztcclxuaW1wb3J0IHsgU2l6ZUNvbnRhaW5lciB9IGZyb20gJy4uLy4uL21vZGVscy9zaXplLWNvbnRhaW5lci5tb2RlbCc7XHJcbmltcG9ydCB7IERlY2ltYWxCeXRlVW5pdCB9IGZyb20gJy4uLy4uL2VudW1zL2RlY2ltYWwtYnl0ZS11bml0LmVudW0nO1xyXG5pbXBvcnQgeyBQcm9ncmVzc0NvbnRhaW5lciB9IGZyb20gJy4uLy4uL21vZGVscy9wcm9ncmVzcy1jb250YWluZXIubW9kZWwnO1xyXG5pbXBvcnQgeyBUcmFuc2ZlclR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy90cmFuc2Zlci10eXBlLmVudW0nO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUmVzdW1hYmxlSnNVcGxvYWRlciBleHRlbmRzIEJhc2VVcGxvYWRlciB7XHJcblxyXG4gICAgcHJpdmF0ZSByOiBSZXN1bWFibGUuUmVzdW1hYmxlID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBwcmVwcm9jZXNzRmlsZUZuID0gdW5kZWZpbmVkO1xyXG4gICAgcHJpdmF0ZSBwcmVwcm9jZXNzQ2h1bmtGbiA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbG9nZ2VyOiBMb2dnZXJTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgcHJvdGVjdGVkIGd1aWRVdGlsOiBHdWlkVXRpbCxcclxuICAgICAgICAgICAgICAgIHByb3RlY3RlZCBjcnlwdG9TZXJ2aWNlOiBDcnlwdG9TZXJ2aWNlKSB7XHJcbiAgICAgICAgc3VwZXIobG9nZ2VyLCBndWlkVXRpbCwgY3J5cHRvU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5pbml0UmVzdW1hYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpbml0UmVzdW1hYmxlKCk6IHZvaWQge1xyXG4gICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlSWQoZmlsZSwgZXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgcmV0dXJuIHRoYXQuZ2VuZXJhdGVVbmlxdWVJZGVudGlmaWVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jdGlvbiBwcmVwcm9jZXNzQ2h1bmtJbmxpbmVGbihyZXN1bWFibGVDaHVuaykge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoYXQucHJlcHJvY2Vzc0NodW5rRm4gPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgICAgIHRoYXQucHJlcHJvY2Vzc0NodW5rRm4ocmVzdW1hYmxlQ2h1bmspO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmVzdW1hYmxlQ2h1bmsucHJlcHJvY2Vzc0ZpbmlzaGVkKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZ1bmN0aW9uIHByZXByb2Nlc3NGaWxlSW5saW5lRm4ocmVzdW1hYmxlRmlsZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoYXQucHJlcHJvY2Vzc0ZpbGVGbiA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAgICAgdGhhdC5jaGFuZ2VJdGVtU3RhdHVzKHJlc3VtYWJsZUZpbGUuaW50ZXJuYWxJdGVtLCBUcmFuc2ZlclN0YXR1cy5QcmVwcm9jZXNzaW5nKTtcclxuICAgICAgICAgICAgICAgIHRoYXQucHJlcHJvY2Vzc0ZpbGVGbihyZXN1bWFibGVGaWxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChDb25maWdTZXJ2aWNlLnNldHRpbmdzLmNvcmUucHJlcHJvY2Vzc0hhc2hFbmFibGVkICYmIENvbmZpZ1NlcnZpY2Uuc2V0dGluZ3MuY29yZS5wcmVwcm9jZXNzSGFzaENoZWNrZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMocmVzdW1hYmxlRmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLlByZXByb2Nlc3NpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRpbnVlQ2FsbGJhY2sgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdW1hYmxlRmlsZS5wcmVwcm9jZXNzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbENhbGxiYWNrID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtYWJsZUZpbGUuY2FuY2VsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuY2hhbmdlSXRlbVN0YXR1cyhyZXN1bWFibGVGaWxlLmludGVybmFsSXRlbSwgVHJhbnNmZXJTdGF0dXMuRmluaXNoZWQsIHJlc3VtYWJsZUZpbGUuaW50ZXJuYWxJdGVtLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGF0LnIudXBsb2FkTmV4dENodW5rKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICB0aGF0LnByZXByb2Nlc3NIYXNoKHJlc3VtYWJsZUZpbGUuaW50ZXJuYWxJdGVtLCByZXN1bWFibGVGaWxlLmZpbGUsIGNvbnRpbnVlQ2FsbGJhY2ssIGNhbmNlbENhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdW1hYmxlRmlsZS5wcmVwcm9jZXNzRmluaXNoZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcy5nZW5lcmF0ZVVuaXF1ZUlkZW50aWZpZXIgPSBnZW5lcmF0ZUlkLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcy5wcmVwcm9jZXNzID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIC8vIGNsb25lcyB0aGUgZnVuY3Rpb24gd2l0aCAne30nIGFjdGluZyBhcyBpdCdzIG5ldyAndGhpcycgcGFyYW1ldGVyXHJcbiAgICAgICAgICAgIHRoaXMucHJlcHJvY2Vzc0NodW5rRm4gPSBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLnByZXByb2Nlc3MuYmluZCh7fSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIENvbmZpZ1NlcnZpY2Uuc2V0dGluZ3MucmVzdW1hYmxlanMucHJlcHJvY2VzcyA9IHByZXByb2Nlc3NDaHVua0lubGluZUZuLmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcy5wcmVwcm9jZXNzRmlsZSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICAvLyBjbG9uZXMgdGhlIGZ1bmN0aW9uIHdpdGggJ3t9JyBhY3RpbmcgYXMgaXQncyBuZXcgJ3RoaXMnIHBhcmFtZXRlclxyXG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NGaWxlRm4gPSBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLnByZXByb2Nlc3NGaWxlLmJpbmQoe30pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBDb25maWdTZXJ2aWNlLnNldHRpbmdzLnJlc3VtYWJsZWpzLnByZXByb2Nlc3NGaWxlID0gcHJlcHJvY2Vzc0ZpbGVJbmxpbmVGbi5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICAvLyBAdHMtaWdub3JlOiBpZ25vcmUgdHlwZSBjaGVja2luZ1xyXG4gICAgICAgIHRoaXMuciA9IG5ldyBSZXN1bWFibGUoQ29uZmlnU2VydmljZS5zZXR0aW5ncy5yZXN1bWFibGVqcyk7XHJcblxyXG4gICAgICAgIHRoaXMuci5vbignZmlsZUFkZGVkJywgZnVuY3Rpb24oZmlsZSwgZXZlbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdmaWxlQWRkZWQnLCBmaWxlKTtcclxuICAgICAgICAgICAgY29uc3QgbmV3SXRlbSA9IG5ldyBEYXRhdHJhbnNmZXJJdGVtKHtcclxuICAgICAgICAgICAgICAgIGlkOiBmaWxlLnVuaXF1ZUlkZW50aWZpZXIsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiBmaWxlLmZpbGVOYW1lLFxyXG4gICAgICAgICAgICAgICAgcGF0aDogZmlsZS5yZWxhdGl2ZVBhdGguc3Vic3RyKDAsIGZpbGUucmVsYXRpdmVQYXRoLmxlbmd0aCAtIGZpbGUuZmlsZU5hbWUubGVuZ3RoKSxcclxuICAgICAgICAgICAgICAgIHNpemVDb250YWluZXI6IG5ldyBTaXplQ29udGFpbmVyKHsgZGVjaW1hbEJ5dGVVbml0OiBEZWNpbWFsQnl0ZVVuaXQuQnl0ZSwgZGVjaW1hbEJ5dGVVbml0U2l6ZTogZmlsZS5zaXplIH0pLFxyXG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NDb250YWluZXI6IG5ldyBQcm9ncmVzc0NvbnRhaW5lcihmaWxlLnNpemUpLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJUeXBlOiBUcmFuc2ZlclR5cGUuVXBsb2FkLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBUcmFuc2ZlclN0YXR1cy5SZWFkeSxcclxuICAgICAgICAgICAgICAgIGV4dGVybmFsSXRlbTogZmlsZVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgZmlsZS5pbnRlcm5hbEl0ZW0gPSBuZXdJdGVtO1xyXG4gICAgICAgICAgICB0aGF0LmFkZEl0ZW0obmV3SXRlbSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ2ZpbGVQcm9ncmVzcycsIGZ1bmN0aW9uKGZpbGUsIG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdmaWxlUHJvZ3Jlc3MnLCBmaWxlLnByb2dyZXNzKCkpO1xyXG4gICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMoZmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLlVwbG9hZGluZyk7XHJcbiAgICAgICAgICAgIHRoYXQudXBkYXRlSXRlbVByb2dyZXNzKGZpbGUuaW50ZXJuYWxJdGVtLCBmaWxlLnByb2dyZXNzKCkpO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZU92ZXJhbGxQcm9ncmVzcyh0aGF0LnRyYW5zZmVyVHlwZSwgdGhhdC5yLnByb2dyZXNzKCkpO1xyXG4gICAgICAgIH0uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5yLm9uKCdmaWxlU3VjY2VzcycsIGZ1bmN0aW9uKGZpbGUsIG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdmaWxlU3VjY2VzcycsIGZpbGUpO1xyXG4gICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMoZmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLkZpbmlzaGVkLCBtZXNzYWdlKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbignZmlsZUVycm9yJywgZnVuY3Rpb24oZmlsZSwgbWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2ZpbGVFcnJvcicsIGZpbGUsIG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB0aGF0LmNoYW5nZUl0ZW1TdGF0dXMoZmlsZS5pbnRlcm5hbEl0ZW0sIFRyYW5zZmVyU3RhdHVzLkZhaWxlZCwgbWVzc2FnZSk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ3VwbG9hZFN0YXJ0JywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIC8vIHRoYXQubG9nZ2VyLmxvZygndXBsb2FkU3RhcnQnLCB0aGF0LnIpO1xyXG4gICAgICAgICAgICB0aGF0Ll9pc1dvcmtpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGF0LnVwZGF0ZVpvbmUoKTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVPdmVyYWxsUHJvZ3Jlc3ModGhhdC50cmFuc2ZlclR5cGUsIHRoYXQuci5wcm9ncmVzcygpKTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVPdmVyYWxsU2l6ZSh0aGF0LnIuZ2V0U2l6ZSgpKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbignY2h1bmtpbmdDb21wbGV0ZScsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2NodW5raW5nQ29tcGxldGUnKTtcclxuICAgICAgICB9LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuci5vbigncGF1c2UnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgLy8gdGhhdC5sb2dnZXIubG9nKCdwYXVzZScpO1xyXG4gICAgICAgICAgICB0aGF0Ll9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVab25lKCk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ2NhbmNlbCcsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCB0aGF0ID0gdGhpcyBhcyBSZXN1bWFibGVKc1VwbG9hZGVyO1xyXG4gICAgICAgICAgICAvLyB0aGF0LmxvZ2dlci5sb2coJ2NhbmNlbCcpO1xyXG4gICAgICAgICAgICB0aGF0Ll9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVab25lKCk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLnIub24oJ2NvbXBsZXRlJywgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzIGFzIFJlc3VtYWJsZUpzVXBsb2FkZXI7XHJcbiAgICAgICAgICAgIC8vIHRoYXQubG9nZ2VyLmxvZygnY29tcGxldGUnLCB0aGF0LnIpO1xyXG4gICAgICAgICAgICB0aGF0Ll9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhhdC51cGRhdGVab25lKCk7XHJcbiAgICAgICAgfS5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgYXNzaWduQnJvd3NlKGVsZW1lbnQsIGlzRGlyZWN0b3J5KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yLmFzc2lnbkJyb3dzZShlbGVtZW50LCBpc0RpcmVjdG9yeSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGFzc2lnbkRyb3AoZWxlbWVudCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuci5hc3NpZ25Ecm9wKGVsZW1lbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBlZGl0UGF0aChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIHN1cGVyLmVkaXRQYXRoKG9sZFBhdGgsIG5ld1BhdGgpO1xyXG4gICAgICAgIHRoaXMuci5maWxlcy5mb3JFYWNoKChmaWxlOiBhbnksIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGludGVybmFsSXRlbSA9IGZpbGUuaW50ZXJuYWxJdGVtIGFzIElEYXRhdHJhbnNmZXJJdGVtO1xyXG4gICAgICAgICAgICBpZiAoaW50ZXJuYWxJdGVtLnN0YXR1cyA9PT0gVHJhbnNmZXJTdGF0dXMuUmVhZHkgJiYgaW50ZXJuYWxJdGVtLnBhdGggPT09IG9sZFBhdGgpIHtcclxuICAgICAgICAgICAgICAgIGZpbGUucmVsYXRpdmVQYXRoID0gbmV3UGF0aCArIGZpbGUuZmlsZU5hbWU7XHJcbiAgICAgICAgICAgICAgICBpbnRlcm5hbEl0ZW0ucGF0aCA9IG5ld1BhdGg7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZWRpdEZpbGVuYW1lKGl0ZW06IElEYXRhdHJhbnNmZXJJdGVtLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5lZGl0RmlsZW5hbWUoaXRlbSwgbmFtZSk7XHJcbiAgICAgICAgaXRlbS5leHRlcm5hbEl0ZW0uZmlsZU5hbWUgPSBuYW1lO1xyXG4gICAgICAgIGl0ZW0uZXh0ZXJuYWxJdGVtLnJlbGF0aXZlUGF0aCA9IGl0ZW0ucGF0aCArIG5hbWU7XHJcbiAgICAgICAgaXRlbS5uYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgc3RhcnRBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5yLnVwbG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBwYXVzZUFsbCgpOiB2b2lkIHtcclxuICAgICAgICAvLyByZXNldCBwcmVwcm9jZXNzU3RhdGVcclxuICAgICAgICB0aGlzLnIuZmlsZXMuZm9yRWFjaCgoZmlsZTogYW55LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZmlsZS5wcmVwcm9jZXNzU3RhdGUgPT09IDEpIHtcclxuICAgICAgICAgICAgICAgIGZpbGUucHJlcHJvY2Vzc1N0YXRlID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuci5wYXVzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyByZW1vdmVBbGwoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGVtcEZpbGVzID0gdGhpcy5yLmZpbGVzLnNsaWNlKCk7XHJcbiAgICAgICAgdGVtcEZpbGVzLmZvckVhY2goKGZpbGU6IGFueSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdGhhdCA9IHRoaXMgYXMgUmVzdW1hYmxlSnNVcGxvYWRlcjtcclxuICAgICAgICAgICAgdGhhdC5yLnJlbW92ZUZpbGUoZmlsZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5faXNXb3JraW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJlbW92ZUl0ZW0oaXRlbTogSURhdGF0cmFuc2Zlckl0ZW0pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnIucmVtb3ZlRmlsZShpdGVtLmV4dGVybmFsSXRlbSk7XHJcbiAgICAgICAgaWYgKHRoaXMuci5maWxlcy5sZW5ndGggPD0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLl9pc1dvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHJldHJ5SXRlbShpdGVtOiBJRGF0YXRyYW5zZmVySXRlbSk6IHZvaWQge1xyXG4gICAgICAgIGl0ZW0uZXh0ZXJuYWxJdGVtLnJldHJ5KCk7XHJcbiAgICB9XHJcbn1cclxuIl19