@schoolbelle/common
Version:
Demo library to showcase Angular packaging format
314 lines (306 loc) • 30.1 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@schoolbelle/common/tokens'), require('@angular/common/http'), require('@schoolbelle/common/services/group'), require('@schoolbelle/common/services/socket'), require('rxjs'), require('lodash')) :
typeof define === 'function' && define.amd ? define('@schoolbelle/common/services/file', ['exports', '@angular/core', '@schoolbelle/common/tokens', '@angular/common/http', '@schoolbelle/common/services/group', '@schoolbelle/common/services/socket', 'rxjs', 'lodash'], factory) :
(factory((global.schoolbelle = global.schoolbelle || {}, global.schoolbelle.common = global.schoolbelle.common || {}, global.schoolbelle.common.services = global.schoolbelle.common.services || {}, global.schoolbelle.common.services.file = {}),global.ng.core,global.schoolbelle.common.tokens,global.ng.common.http,global.schoolbelle.common.services.group,global.schoolbelle.common.services.socket,global.rxjs,null));
}(this, (function (exports,core,tokens,http,group,socket,rxjs,lodash) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FileService = (function () {
function FileService(http$$1, groupService, socketService, serverHost) {
this.http = http$$1;
this.groupService = groupService;
this.socketService = socketService;
this.serverHost = serverHost;
this.uploadStatusChangeEvent = new rxjs.Subject();
this.uploadStatus = new Map();
}
Object.defineProperty(FileService.prototype, "onUploadStatusChange", {
get: /**
* @return {?}
*/ function () {
return this.uploadStatusChangeEvent.asObservable();
},
enumerable: true,
configurable: true
});
/**
* @param {?} key
* @param {?} data
* @return {?}
*/
FileService.prototype.setUploadStatus = /**
* @param {?} key
* @param {?} data
* @return {?}
*/
function (key, data) {
this.uploadStatus.set(key, data);
this.uploadStatusChangeEvent.next(this.caculatePercent());
};
/**
* @param {?} key
* @param {?} data
* @return {?}
*/
FileService.prototype.updateUploadStatus = /**
* @param {?} key
* @param {?} data
* @return {?}
*/
function (key, data) {
var /** @type {?} */ found = this.uploadStatus.get(key);
if (found) {
Object.assign(found, data);
this.uploadStatusChangeEvent.next(this.caculatePercent());
}
};
/**
* @return {?}
*/
FileService.prototype.caculatePercent = /**
* @return {?}
*/
function () {
var _this = this;
var /** @type {?} */ perc = 0;
this.uploadStatus.forEach(function (uploadState, key) {
perc +=
(uploadState.upload * 0.5 +
(typeof uploadState.process === 'undefined'
? 1
: uploadState.process) *
0.5) /
_this.uploadStatus.size;
});
return perc;
};
/**
* @param {?} file
* @param {?} opts
* @return {?}
*/
FileService.prototype.getUrl = /**
* @param {?} file
* @param {?} opts
* @return {?}
*/
function (file, opts) {
return this.http
.post(this.serverHost + '/group/file/sign_url', {
sign_for: 'upload',
name: file.name,
type: file.type,
size: file.size,
process: opts.process
}, {
headers: { Authorization: "Bearer " + this.groupService.token }
})
.toPromise();
};
/**
* @param {?} file
* @param {?=} opts
* @return {?}
*/
FileService.prototype.upload = /**
* @param {?} file
* @param {?=} opts
* @return {?}
*/
function (file, opts) {
var _this = this;
if (opts === void 0) {
opts = { process: false };
}
return new Promise(function (resolve, reject) {
_this.getUrl(file, opts)
.then(function (data) {
_this.setUploadStatus(data.file_id, {
name: file.name,
size: file.size,
type: file.type,
upload: 0,
process: opts.process ? 0 : undefined
});
_this.http
.put(data.signedUrl, file, { reportProgress: true })
.subscribe(function (event) {
console.log(event);
// let perc = Math.round(progressEvent.loaded / progressEvent.total * 100);
// let info = this.uploadStatus.get(data.file_id);
// if (info) info.upload = perc;
// observer.next(perc);
}, reject, function () {
_this.updateUploadStatus(data.file_id, { upload: 100 });
if (opts.process === true)
_this.observeProgress(data.file_id).subscribe(null, reject, function () { return resolve(data.file_id); });
else
resolve(data.file_id);
});
})
.catch(reject);
}).then(function (sbe_file_id) { return _this.register(sbe_file_id); });
};
/**
* @param {?} sbe_file_id
* @return {?}
*/
FileService.prototype.register = /**
* @param {?} sbe_file_id
* @return {?}
*/
function (sbe_file_id) {
return this.http
.post(this.serverHost + '/group/file/register', { file_id: sbe_file_id }, { headers: { Authorization: "Bearer " + this.groupService.token } })
.toPromise();
// .then(response=>response.json());
};
/**
* @param {?} file_id
* @return {?}
*/
FileService.prototype.observeProgress = /**
* @param {?} file_id
* @return {?}
*/
function (file_id) {
var _this = this;
return new rxjs.Observable(function (observer) {
var /** @type {?} */ uploadStatus = _this.uploadStatus.get(file_id);
var /** @type {?} */ process = uploadStatus ? uploadStatus.process : undefined;
if (process === undefined)
observer.error('no processing found');
else if (process === 100)
observer.complete();
else {
_this.socketService.listen('f' + file_id);
var /** @type {?} */ subscription_1 = _this.socketService
.getObservable('f' + file_id)
.subscribe(function (event) {
var /** @type {?} */ data = event.data;
if (data.match(/download \d+/))
process = Math.round(FileService.Weights.download * parseInt(data.replace(/\D/g, '')));
else if (data.match(/convert.low \d+/))
process = Math.round(FileService.Weights.download * 100 +
FileService.Weights.convert *
parseInt(data.replace(/\D/g, '')));
else if (data.match(/upload.low \d+/))
process = Math.round((FileService.Weights.download + FileService.Weights.convert) *
100 +
FileService.Weights.upload * parseInt(data.replace(/\D/g, '')));
_this.updateUploadStatus(file_id, { process: process });
if (process === 100 || data.match('job is done')) {
observer.complete();
_this.socketService.unlisten('f' + file_id);
subscription_1.unsubscribe();
}
else if (data.match('timeout')) {
observer.error('timeout');
subscription_1.unsubscribe();
}
else {
observer.next(process);
}
});
}
});
};
/**
* @param {?} letterFiles
* @param {?=} process
* @return {?}
*/
FileService.prototype.multipleUpload = /**
* @param {?} letterFiles
* @param {?=} process
* @return {?}
*/
function (letterFiles, process) {
var _this = this;
if (process === void 0) {
process = true;
}
this.uploadStatus.clear();
if (process)
this.socketService.connect(true);
var /** @type {?} */ promises = [];
lodash.forEach(letterFiles, function (file, index) {
if (file instanceof File) {
promises.push(_this.upload(file, { process: process }).then(function (fileInfo) {
letterFiles.splice(index, 1, fileInfo);
}));
}
});
return Promise.all(promises).then(function () { return (letterFiles); });
};
/**
* @param {?} uri
* @param {?} name
* @return {?}
*/
FileService.prototype.download = /**
* @param {?} uri
* @param {?} name
* @return {?}
*/
function (uri, name) { };
FileService.Weights = {
download: 0.1,
convert: 0.8,
upload: 0.1
};
FileService.decorators = [
{ type: core.Injectable },
];
/** @nocollapse */
FileService.ctorParameters = function () {
return [
{ type: http.HttpClient, },
{ type: group.GroupService, },
{ type: socket.SocketService, },
{ type: undefined, decorators: [{ type: core.Inject, args: [tokens.REST_SERVER_HOST,] },] },
];
};
return FileService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var FileServiceModule = (function () {
function FileServiceModule() {
}
/**
* @return {?}
*/
FileServiceModule.forRoot = /**
* @return {?}
*/
function () {
return {
ngModule: FileServiceModule,
providers: [FileService]
};
};
FileServiceModule.decorators = [
{ type: core.NgModule, args: [{
imports: [http.HttpClientModule]
},] },
];
return FileServiceModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
exports.FileService = FileService;
exports.FileServiceModule = FileServiceModule;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nob29sYmVsbGUtY29tbW9uLXNlcnZpY2VzLWZpbGUudW1kLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9Ac2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL2ZpbGUvZmlsZS5zZXJ2aWNlLnRzIiwibmc6Ly9Ac2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL2ZpbGUvZmlsZS1zZXJ2aWNlLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJFU1RfU0VSVkVSX0hPU1QgfSBmcm9tICdAc2Nob29sYmVsbGUvY29tbW9uL3Rva2Vucyc7XG5cbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBHcm91cFNlcnZpY2UgfSBmcm9tICdAc2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL2dyb3VwJztcbmltcG9ydCB7IFNvY2tldFNlcnZpY2UgfSBmcm9tICdAc2Nob29sYmVsbGUvY29tbW9uL3NlcnZpY2VzL3NvY2tldCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZvckVhY2ggfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBVcGxvYWRTdGF0dXMgfSBmcm9tICcuL3VwbG9hZC1zdGF0dXMudHlwZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZUluZm9JbnRlcmZhY2Uge1xuICBmaWxlX2lkOiBudW1iZXI7XG4gIHVybDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJpb3JpdHk6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xuICBkb3duc2FtcGxlZDogc3RyaW5nO1xuICB0aHVtYm5haWw6IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZpbGVTZXJ2aWNlIHtcbiAgc3RhdGljIFdlaWdodHMgPSB7XG4gICAgZG93bmxvYWQ6IDAuMSxcbiAgICBjb252ZXJ0OiAwLjgsXG4gICAgdXBsb2FkOiAwLjFcbiAgfTtcbiAgcHJpdmF0ZSB1cGxvYWRTdGF0dXNDaGFuZ2VFdmVudCA9IG5ldyBTdWJqZWN0KCk7XG4gIGdldCBvblVwbG9hZFN0YXR1c0NoYW5nZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnVwbG9hZFN0YXR1c0NoYW5nZUV2ZW50LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIHB1YmxpYyB1cGxvYWRTdGF0dXM6IE1hcDxudW1iZXIsIFVwbG9hZFN0YXR1cz4gPSBuZXcgTWFwKCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHVibGljIGdyb3VwU2VydmljZTogR3JvdXBTZXJ2aWNlLFxuICAgIHB1YmxpYyBzb2NrZXRTZXJ2aWNlOiBTb2NrZXRTZXJ2aWNlLFxuICAgIEBJbmplY3QoUkVTVF9TRVJWRVJfSE9TVCkgcHJpdmF0ZSBzZXJ2ZXJIb3N0OiBzdHJpbmdcbiAgKSB7fVxuICBwcml2YXRlIHNldFVwbG9hZFN0YXR1cyhrZXk6IGFueSwgZGF0YTogVXBsb2FkU3RhdHVzKSB7XG4gICAgdGhpcy51cGxvYWRTdGF0dXMuc2V0KGtleSwgZGF0YSk7XG4gICAgdGhpcy51cGxvYWRTdGF0dXNDaGFuZ2VFdmVudC5uZXh0KHRoaXMuY2FjdWxhdGVQZXJjZW50KCkpO1xuICB9XG4gIHByaXZhdGUgdXBkYXRlVXBsb2FkU3RhdHVzKGtleTogYW55LCBkYXRhOiBQYXJ0aWFsPFVwbG9hZFN0YXR1cz4pIHtcbiAgICBsZXQgZm91bmQgPSB0aGlzLnVwbG9hZFN0YXR1cy5nZXQoa2V5KTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oZm91bmQsIGRhdGEpO1xuICAgICAgdGhpcy51cGxvYWRTdGF0dXNDaGFuZ2VFdmVudC5uZXh0KHRoaXMuY2FjdWxhdGVQZXJjZW50KCkpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNhY3VsYXRlUGVyY2VudCgpIHtcbiAgICBsZXQgcGVyYyA9IDA7XG4gICAgdGhpcy51cGxvYWRTdGF0dXMuZm9yRWFjaCgodXBsb2FkU3RhdGUsIGtleSkgPT4ge1xuICAgICAgcGVyYyArPVxuICAgICAgICAodXBsb2FkU3RhdGUudXBsb2FkICogMC41ICtcbiAgICAgICAgICAodHlwZW9mIHVwbG9hZFN0YXRlLnByb2Nlc3MgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICA/IDFcbiAgICAgICAgICAgIDogdXBsb2FkU3RhdGUucHJvY2VzcykgKlxuICAgICAgICAgICAgMC41KSAvXG4gICAgICAgIHRoaXMudXBsb2FkU3RhdHVzLnNpemU7XG4gICAgfSk7XG4gICAgcmV0dXJuIHBlcmM7XG4gIH1cbiAgcHVibGljIGdldFVybChmaWxlOiBGaWxlLCBvcHRzOiB7IHByb2Nlc3M6IGJvb2xlYW4gfSkge1xuICAgIHJldHVybiB0aGlzLmh0dHBcbiAgICAgIC5wb3N0KFxuICAgICAgICB0aGlzLnNlcnZlckhvc3QgKyAnL2dyb3VwL2ZpbGUvc2lnbl91cmwnLFxuICAgICAgICB7XG4gICAgICAgICAgc2lnbl9mb3I6ICd1cGxvYWQnLFxuICAgICAgICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgc2l6ZTogZmlsZS5zaXplLFxuICAgICAgICAgIHByb2Nlc3M6IG9wdHMucHJvY2Vzc1xuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5ncm91cFNlcnZpY2UudG9rZW59YCB9XG4gICAgICAgIH1cbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuICBwdWJsaWMgdXBsb2FkKFxuICAgIGZpbGU6IEZpbGUsXG4gICAgb3B0czogeyBwcm9jZXNzOiBib29sZWFuIH0gPSB7IHByb2Nlc3M6IGZhbHNlIH1cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5nZXRVcmwoZmlsZSwgb3B0cylcbiAgICAgICAgLnRoZW4oKGRhdGE6IHsgZmlsZV9pZDogbnVtYmVyOyBzaWduZWRVcmw6IHN0cmluZyB9KSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRVcGxvYWRTdGF0dXMoZGF0YS5maWxlX2lkLCB7XG4gICAgICAgICAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgICAgICAgICBzaXplOiBmaWxlLnNpemUsXG4gICAgICAgICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICAgICAgICB1cGxvYWQ6IDAsXG4gICAgICAgICAgICBwcm9jZXNzOiBvcHRzLnByb2Nlc3MgPyAwIDogdW5kZWZpbmVkXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgICAucHV0KGRhdGEuc2lnbmVkVXJsLCBmaWxlLCB7IHJlcG9ydFByb2dyZXNzOiB0cnVlIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICBldmVudCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBwZXJjID0gTWF0aC5yb3VuZChwcm9ncmVzc0V2ZW50LmxvYWRlZCAvIHByb2dyZXNzRXZlbnQudG90YWwgKiAxMDApO1xuICAgICAgICAgICAgICAgIC8vIGxldCBpbmZvID0gdGhpcy51cGxvYWRTdGF0dXMuZ2V0KGRhdGEuZmlsZV9pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGluZm8pIGluZm8udXBsb2FkID0gcGVyYztcbiAgICAgICAgICAgICAgICAvLyBvYnNlcnZlci5uZXh0KHBlcmMpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVVwbG9hZFN0YXR1cyhkYXRhLmZpbGVfaWQsIHsgdXBsb2FkOiAxMDAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdHMucHJvY2VzcyA9PT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZVByb2dyZXNzKGRhdGEuZmlsZV9pZCkuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICAgICAgICAgICgpID0+IHJlc29sdmUoZGF0YS5maWxlX2lkKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBlbHNlIHJlc29sdmUoZGF0YS5maWxlX2lkKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKHJlamVjdCk7XG4gICAgfSkudGhlbigoc2JlX2ZpbGVfaWQ6IG51bWJlcikgPT4gdGhpcy5yZWdpc3RlcihzYmVfZmlsZV9pZCkpO1xuICB9XG4gIHB1YmxpYyByZWdpc3RlcihzYmVfZmlsZV9pZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIHRoaXMuc2VydmVySG9zdCArICcvZ3JvdXAvZmlsZS9yZWdpc3RlcicsXG4gICAgICAgIHsgZmlsZV9pZDogc2JlX2ZpbGVfaWQgfSxcbiAgICAgICAgeyBoZWFkZXJzOiB7IEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0aGlzLmdyb3VwU2VydmljZS50b2tlbn1gIH0gfVxuICAgICAgKVxuICAgICAgLnRvUHJvbWlzZSgpO1xuICAgIC8vIC50aGVuKHJlc3BvbnNlPT5yZXNwb25zZS5qc29uKCkpO1xuICB9XG4gIHByaXZhdGUgb2JzZXJ2ZVByb2dyZXNzKGZpbGVfaWQ6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgdXBsb2FkU3RhdHVzOiBVcGxvYWRTdGF0dXMgPSB0aGlzLnVwbG9hZFN0YXR1cy5nZXQoZmlsZV9pZCk7XG4gICAgICBsZXQgcHJvY2VzcyA9IHVwbG9hZFN0YXR1cyA/IHVwbG9hZFN0YXR1cy5wcm9jZXNzIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHByb2Nlc3MgPT09IHVuZGVmaW5lZCkgb2JzZXJ2ZXIuZXJyb3IoJ25vIHByb2Nlc3NpbmcgZm91bmQnKTtcbiAgICAgIGVsc2UgaWYgKHByb2Nlc3MgPT09IDEwMCkgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICB0aGlzLnNvY2tldFNlcnZpY2UubGlzdGVuKCdmJyArIGZpbGVfaWQpO1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uID0gdGhpcy5zb2NrZXRTZXJ2aWNlXG4gICAgICAgICAgLmdldE9ic2VydmFibGUoJ2YnICsgZmlsZV9pZClcbiAgICAgICAgICAuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGlmIChkYXRhLm1hdGNoKC9kb3dubG9hZCBcXGQrLykpXG4gICAgICAgICAgICAgIHByb2Nlc3MgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgIEZpbGVTZXJ2aWNlLldlaWdodHMuZG93bmxvYWQgKiBwYXJzZUludChkYXRhLnJlcGxhY2UoL1xcRC9nLCAnJykpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBlbHNlIGlmIChkYXRhLm1hdGNoKC9jb252ZXJ0LmxvdyBcXGQrLykpXG4gICAgICAgICAgICAgIHByb2Nlc3MgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgIEZpbGVTZXJ2aWNlLldlaWdodHMuZG93bmxvYWQgKiAxMDAgK1xuICAgICAgICAgICAgICAgICAgRmlsZVNlcnZpY2UuV2VpZ2h0cy5jb252ZXJ0ICpcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VJbnQoZGF0YS5yZXBsYWNlKC9cXEQvZywgJycpKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgZWxzZSBpZiAoZGF0YS5tYXRjaCgvdXBsb2FkLmxvdyBcXGQrLykpXG4gICAgICAgICAgICAgIHByb2Nlc3MgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgIChGaWxlU2VydmljZS5XZWlnaHRzLmRvd25sb2FkICsgRmlsZVNlcnZpY2UuV2VpZ2h0cy5jb252ZXJ0KSAqXG4gICAgICAgICAgICAgICAgICAxMDAgK1xuICAgICAgICAgICAgICAgICAgRmlsZVNlcnZpY2UuV2VpZ2h0cy51cGxvYWQgKiBwYXJzZUludChkYXRhLnJlcGxhY2UoL1xcRC9nLCAnJykpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlVXBsb2FkU3RhdHVzKGZpbGVfaWQsIHsgcHJvY2VzczogcHJvY2VzcyB9KTtcblxuICAgICAgICAgICAgaWYgKHByb2Nlc3MgPT09IDEwMCB8fCBkYXRhLm1hdGNoKCdqb2IgaXMgZG9uZScpKSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgIHRoaXMuc29ja2V0U2VydmljZS51bmxpc3RlbignZicgKyBmaWxlX2lkKTtcbiAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEubWF0Y2goJ3RpbWVvdXQnKSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcigndGltZW91dCcpO1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocHJvY2Vzcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIG11bHRpcGxlVXBsb2FkKFxuICAgIGxldHRlckZpbGVzOiBBcnJheTxGaWxlIHwgRmlsZUluZm9JbnRlcmZhY2U+LFxuICAgIHByb2Nlc3M6IGJvb2xlYW4gPSB0cnVlXG4gICAgLy8gbGlzdDogeyBmaWxlOiBGaWxlOyBwcmlvcml0eTogbnVtYmVyOyBwcm9jZXNzPzogYm9vbGVhbiB9W11cbiAgKTogUHJvbWlzZTxGaWxlSW5mb0ludGVyZmFjZVtdPiB7XG4gICAgdGhpcy51cGxvYWRTdGF0dXMuY2xlYXIoKTtcbiAgICBpZiAocHJvY2VzcykgdGhpcy5zb2NrZXRTZXJ2aWNlLmNvbm5lY3QodHJ1ZSk7XG4gICAgbGV0IHByb21pc2VzID0gW107XG4gICAgZm9yRWFjaChsZXR0ZXJGaWxlcywgKGZpbGUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoZmlsZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChcbiAgICAgICAgICB0aGlzLnVwbG9hZChmaWxlLCB7IHByb2Nlc3M6IHByb2Nlc3MgfSkudGhlbihcbiAgICAgICAgICAgIChmaWxlSW5mbzogRmlsZUluZm9JbnRlcmZhY2UpID0+IHtcbiAgICAgICAgICAgICAgbGV0dGVyRmlsZXMuc3BsaWNlKGluZGV4LCAxLCBmaWxlSW5mbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbigoKSA9PiBsZXR0ZXJGaWxlcyBhcyBGaWxlSW5mb0ludGVyZmFjZVtdKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZCh1cmksIG5hbWUpIHt9XG59XG4iLCJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBGaWxlU2VydmljZSB9IGZyb20gJy4vZmlsZS5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVTZXJ2aWNlTW9kdWxlIHtcbiAgc3RhdGljIGZvclJvb3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBGaWxlU2VydmljZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW0ZpbGVTZXJ2aWNlXVxuICAgIH07XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJodHRwIiwiU3ViamVjdCIsIk9ic2VydmFibGUiLCJmb3JFYWNoIiwiSW5qZWN0YWJsZSIsIkh0dHBDbGllbnQiLCJHcm91cFNlcnZpY2UiLCJTb2NrZXRTZXJ2aWNlIiwiSW5qZWN0IiwiUkVTVF9TRVJWRVJfSE9TVCIsIk5nTW9kdWxlIiwiSHR0cENsaWVudE1vZHVsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBO1FBb0NFLHFCQUNTQSxTQUNBLGNBQ0EsZUFDMkI7WUFIM0IsU0FBSSxHQUFKQSxPQUFJO1lBQ0osaUJBQVksR0FBWixZQUFZO1lBQ1osa0JBQWEsR0FBYixhQUFhO1lBQ2MsZUFBVSxHQUFWLFVBQVU7MkNBVlosSUFBSUMsWUFBTyxFQUFFO2dDQUlFLElBQUksR0FBRyxFQUFFO1NBT3REO1FBVkosc0JBQUksNkNBQW9COzs7Z0JBQXhCO2dCQUNFLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3BEOzs7V0FBQTs7Ozs7O1FBU08scUNBQWU7Ozs7O3NCQUFDLEdBQVEsRUFBRSxJQUFrQjtnQkFDbEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDOzs7Ozs7O1FBRXBELHdDQUFrQjs7Ozs7c0JBQUMsR0FBUSxFQUFFLElBQTJCO2dCQUM5RCxxQkFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksS0FBSyxFQUFFO29CQUNULE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMzQixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDO2lCQUMzRDs7Ozs7UUFFSyxxQ0FBZTs7Ozs7Z0JBQ3JCLHFCQUFJLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsVUFBQyxXQUFXLEVBQUUsR0FBRztvQkFDekMsSUFBSTt3QkFDRixDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsR0FBRzs0QkFDdkIsQ0FBQyxPQUFPLFdBQVcsQ0FBQyxPQUFPLEtBQUssV0FBVztrQ0FDdkMsQ0FBQztrQ0FDRCxXQUFXLENBQUMsT0FBTztnQ0FDckIsR0FBRzs0QkFDUCxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztpQkFDMUIsQ0FBQyxDQUFDO2dCQUNILE9BQU8sSUFBSSxDQUFDOzs7Ozs7O1FBRVAsNEJBQU07Ozs7O3NCQUFDLElBQVUsRUFBRSxJQUEwQjtnQkFDbEQsT0FBTyxJQUFJLENBQUMsSUFBSTtxQkFDYixJQUFJLENBQ0gsSUFBSSxDQUFDLFVBQVUsR0FBRyxzQkFBc0IsRUFDeEM7b0JBQ0UsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtvQkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7b0JBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO29CQUNmLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztpQkFDdEIsRUFDRDtvQkFDRSxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsWUFBVSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQU8sRUFBRTtpQkFDaEUsQ0FDRjtxQkFDQSxTQUFTLEVBQUUsQ0FBQzs7Ozs7OztRQUVWLDRCQUFNOzs7OztzQkFDWCxJQUFVLEVBQ1YsSUFBK0M7O2dCQUEvQyxxQkFBQTtvQkFBQSxTQUErQixPQUFPLEVBQUUsS0FBSyxFQUFFOztnQkFFL0MsT0FBTyxJQUFJLE9BQU8sQ0FBQyxVQUFDLE9BQU8sRUFBRSxNQUFNO29CQUNqQyxLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7eUJBQ3BCLElBQUksQ0FBQyxVQUFDLElBQTRDO3dCQUNqRCxLQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7NEJBQ2pDLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTs0QkFDZixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7NEJBQ2YsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJOzRCQUNmLE1BQU0sRUFBRSxDQUFDOzRCQUNULE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxTQUFTO3lCQUN0QyxDQUFDLENBQUM7d0JBQ0gsS0FBSSxDQUFDLElBQUk7NkJBQ04sR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDOzZCQUNuRCxTQUFTLENBQ1IsVUFBQSxLQUFLOzRCQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7Ozs7O3lCQUtwQixFQUNELE1BQU0sRUFDTjs0QkFDRSxLQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDOzRCQUN2RCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSTtnQ0FDdkIsS0FBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsU0FBUyxDQUMxQyxJQUFJLEVBQ0osTUFBTSxFQUNOLGNBQU0sT0FBQSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFBLENBQzVCLENBQUM7O2dDQUNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQzVCLENBQ0YsQ0FBQztxQkFDTCxDQUFDO3lCQUNELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDbEIsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLFdBQW1CLElBQUssT0FBQSxLQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxHQUFBLENBQUMsQ0FBQzs7Ozs7O1FBRXhELDhCQUFROzs7O3NCQUFDLFdBQW1CO2dCQUNqQyxPQUFPLElBQUksQ0FBQyxJQUFJO3FCQUNiLElBQUksQ0FDSCxJQUFJLENBQUMsVUFBVSxHQUFHLHNCQUFzQixFQUN4QyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsRUFDeEIsRUFBRSxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsWUFBVSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQU8sRUFBRSxFQUFFLENBQ3BFO3FCQUNBLFNBQVMsRUFBRSxDQUFDOzs7Ozs7O1FBR1QscUNBQWU7Ozs7c0JBQUMsT0FBZTs7Z0JBQ3JDLE9BQU8sSUFBSUMsZUFBVSxDQUFDLFVBQUEsUUFBUTtvQkFDNUIscUJBQUksWUFBWSxHQUFpQixLQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDaEUscUJBQUksT0FBTyxHQUFHLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztvQkFDOUQsSUFBSSxPQUFPLEtBQUssU0FBUzt3QkFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7eUJBQzVELElBQUksT0FBTyxLQUFLLEdBQUc7d0JBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO3lCQUN6Qzt3QkFDSCxLQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7d0JBQ3pDLHFCQUFJLGNBQVksR0FBRyxLQUFJLENBQUMsYUFBYTs2QkFDbEMsYUFBYSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUM7NkJBQzVCLFNBQVMsQ0FBQyxVQUFBLEtBQUs7NEJBQ2QscUJBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7NEJBQ3RCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7Z0NBQzVCLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNsQixXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FDakUsQ0FBQztpQ0FDQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUM7Z0NBQ3BDLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUNsQixXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxHQUFHO29DQUNoQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU87d0NBQ3pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUN0QyxDQUFDO2lDQUNDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztnQ0FDbkMsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQ2xCLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPO29DQUN6RCxHQUFHO29DQUNILFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUNqRSxDQUFDOzRCQUVKLEtBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQzs0QkFFdkQsSUFBSSxPQUFPLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0NBQ2hELFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQ0FDcEIsS0FBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDO2dDQUMzQyxjQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7NkJBQzVCO2lDQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRTtnQ0FDaEMsUUFBUSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztnQ0FDMUIsY0FBWSxDQUFDLFdBQVcsRUFBRSxDQUFDOzZCQUM1QjtpQ0FBTTtnQ0FDTCxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzZCQUN4Qjt5QkFDRixDQUFDLENBQUM7cUJBQ047aUJBQ0YsQ0FBQyxDQUFDOzs7Ozs7O1FBRUUsb0NBQWM7Ozs7O3NCQUNuQixXQUE0QyxFQUM1QyxPQUF1Qjs7Z0JBQXZCLHdCQUFBO29CQUFBLGNBQXVCOztnQkFHdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDMUIsSUFBSSxPQUFPO29CQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM5QyxxQkFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO2dCQUNsQkMsY0FBTyxDQUFDLFdBQVcsRUFBRSxVQUFDLElBQUksRUFBRSxLQUFLO29CQUMvQixJQUFJLElBQUksWUFBWSxJQUFJLEVBQUU7d0JBQ3hCLFFBQVEsQ0FBQyxJQUFJLENBQ1gsS0FBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQzFDLFVBQUMsUUFBMkI7NEJBQzFCLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQzt5QkFDeEMsQ0FDRixDQUNGLENBQUM7cUJBQ0g7aUJBQ0YsQ0FBQyxDQUFDO2dCQUNILE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsc0JBQU0sV0FBa0MsSUFBQSxDQUFDLENBQUM7Ozs7Ozs7UUFHdkUsOEJBQVE7Ozs7O3NCQUFDLEdBQUcsRUFBRSxJQUFJOzhCQS9LUjtZQUNmLFFBQVEsRUFBRSxHQUFHO1lBQ2IsT0FBTyxFQUFFLEdBQUc7WUFDWixNQUFNLEVBQUUsR0FBRztTQUNaOztvQkFORkMsZUFBVTs7Ozs7d0JBcEJGQyxlQUFVO3dCQUNWQyxrQkFBWTt3QkFDWkMsb0JBQWE7d0RBbUNqQkMsV0FBTSxTQUFDQyx1QkFBZ0I7OzswQkF4QzVCOzs7Ozs7O0FDQUE7Ozs7OztRQVNTLHlCQUFPOzs7WUFBZDtnQkFDRSxPQUFPO29CQUNMLFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQztpQkFDekIsQ0FBQzthQUNIOztvQkFURkMsYUFBUSxTQUFDO3dCQUNSLE9BQU8sRUFBRSxDQUFDQyxxQkFBZ0IsQ0FBQztxQkFDNUI7O2dDQVBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7In0=