UNPKG

io.parrots

Version:

Parrots.io App

395 lines (394 loc) 46 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { Option, AbstractDataEditor, EventUtils, ComponentDialogModel } from 'com.phloxui'; import { DATA_DESTROY_EVENT, DATA_PROMOTE_EVENT, DATA_QUERY_EVENT } from 'com.phloxui'; import { ClassesResource } from '../../share/resource/ClassesResource'; import { VersionHistory } from './VersionHistory.component'; const /** @type {?} */ CONFIG_NAME = 'com.parrots.dataEditor'; /** * @abstract */ export class AbstractParrotsDataEditor extends AbstractDataEditor { /** * @param {?} actionProvider * @param {?} viewProvider * @param {?} dataFactory * @param {?} settingServiceFactory * @param {?} phloxAppService * @param {?} dialogService * @param {?} bgProcessMgr * @param {?} dataClassName * @param {?} configName * @param {?} versionHistoryFactory * @param {?} instConnectionMgr */ constructor(actionProvider, viewProvider, dataFactory, settingServiceFactory, phloxAppService, dialogService, bgProcessMgr, dataClassName, configName, versionHistoryFactory, instConnectionMgr) { super(actionProvider, viewProvider, dataFactory, settingServiceFactory, phloxAppService, dialogService, bgProcessMgr); this.dataClassName = dataClassName; this.setConfigName(configName); this.versionHistoryFactory = versionHistoryFactory; this.instConnectionMgr = instConnectionMgr; this.dataSchemaReloadEvent = new EventEmitter(); this.dataDestroyEvent = new EventEmitter(); this.dataPromoteEvent = new EventEmitter(); this.classesResource = this.instConnectionMgr.createResource(ClassesResource); } /** * @return {?} */ initPage() { // create parrots DataService before call super if (this.dataServiceFactory !== null && this.dataServiceFactory !== undefined) { let /** @type {?} */ dfProm = this.dataServiceFactory.createDataService(this); if (dfProm != null && dfProm !== undefined) { dfProm.then((result) => { this.dataService = result; this.reloadDataSchema(); }); } } super.initPage(); } /** * @return {?} */ reloadDataSchema() { return new Promise((resolve, reject) => { if (this.dataService != null) { this.dataService.loadDataSchema().then((result) => { this.dataSchema = result; resolve(result); this.dataSchemaReloadEvent.emit(result); }, (error) => { reject(error); }); } else { resolve(null); this.dataSchemaReloadEvent.emit(null); } }).catch((error) => { return Promise.reject(error); }); } /** * @param {?} data * @return {?} */ destroyData(data) { if (this.dataService === null || typeof this.dataService === 'undefined') { return Promise.resolve(null); } let /** @type {?} */ prom = this.dataService.destroyData(data); if (prom !== null) { prom.then((resolveData) => { let /** @type {?} */ result = []; if (resolveData !== null && typeof resolveData !== 'undefined') { if (Array.isArray(resolveData)) { for (let /** @type {?} */ item of resolveData) { this.removeData(item); result.push(item); } } else { // delete from data this.removeData(resolveData); result.push(resolveData); } } let /** @type {?} */ data = resolveData; let /** @type {?} */ ev = EventUtils.newCustomEvent(DATA_DESTROY_EVENT, this, data, null); this.dataDestroyEvent.emit(ev); return Promise.resolve(resolveData); }, (error) => { return Promise.reject(error); }); } return prom; } /** * @param {?} data * @return {?} */ promoteData(data) { if (this.dataService === null || typeof this.dataService === 'undefined') { return Promise.resolve(null); } let /** @type {?} */ dataTemp = []; if (Array.isArray(data)) { dataTemp = data; } else { dataTemp.push(data); } let /** @type {?} */ prom = this.dataService.promoteData(data); if (prom !== null) { prom.then((resolveData) => { let /** @type {?} */ result = []; if (resolveData !== null && typeof resolveData !== 'undefined') { if (Array.isArray(resolveData)) { for (let /** @type {?} */ item of resolveData) { // this.removeData(item); //! do promote result.push(item); } } else { // this.removeData(resolveData); //! do promote result.push(resolveData); } } let /** @type {?} */ data = { data: result, original: dataTemp }; let /** @type {?} */ ev = EventUtils.newCustomEvent(DATA_PROMOTE_EVENT, this, data, null); this.dataPromoteEvent.emit(ev); return Promise.resolve(resolveData); }, (error) => { return Promise.reject(error); }); } return prom; } /** * @param {?} data * @param {?} startDateTime * @param {?} endDateTime * @return {?} */ getVersionHistory(data, startDateTime, endDateTime) { let /** @type {?} */ dataTemp = []; if (Array.isArray(data)) { dataTemp = data; } else { dataTemp.push(data); } let /** @type {?} */ uuid = data._uuid; let /** @type {?} */ className = this.getDataClassName(); let /** @type {?} */ prom = this.classesResource.getVersions(uuid, className); if (prom !== null) { return new Promise((resolve, reject) => { prom.then((resolveData) => { try { let /** @type {?} */ result = []; if (resolveData !== null && typeof resolveData !== 'undefined') { for (let /** @type {?} */ item of resolveData.items) { if (startDateTime !== null && startDateTime !== undefined && endDateTime !== null && endDateTime !== undefined) { if ((startDateTime.isBefore(item._created) || startDateTime.equals(item._created)) && (endDateTime.isAfter(item._created) || endDateTime.equals(item._created))) { result.push(item); } } else if (startDateTime !== null && startDateTime !== undefined && (endDateTime === null || endDateTime === undefined)) { if ((startDateTime.isBefore(item._created) || startDateTime.equals(item._created))) { result.push(item); } } else if ((startDateTime === null || startDateTime === undefined) && endDateTime !== null && endDateTime !== undefined) { if ((endDateTime.isAfter(item._created) || endDateTime.equals(item._created))) { result.push(item); } } else { result.push(item); } } } let /** @type {?} */ data = { data: result, original: dataTemp }; let /** @type {?} */ ev = EventUtils.newCustomEvent(DATA_QUERY_EVENT, this, data, null); this.dataQueryEvent.emit(ev); resolve(result); } catch (/** @type {?} */ err) { reject(err); } }, (error) => { reject(error); }); }); } return prom; } /** * @param {?} data * @return {?} */ getLanguageList(data) { if (this.dataService === null || typeof this.dataService === 'undefined') { return Promise.resolve(null); } // let fData = data; let /** @type {?} */ dataTemp = []; if (Array.isArray(data)) { dataTemp = data; } else { dataTemp.push(data); } let /** @type {?} */ filterData = { "filter": "this._lang != null && this._uuid == uuid", "parameters": "java.lang.String uuid", "executeMap": { "uuid": data._uuid } }; let /** @type {?} */ prom = this.dataService.queryData(filterData); if (prom !== null) { return new Promise((resolve, reject) => { prom.then((resolveData) => { let /** @type {?} */ result = []; if (resolveData !== null && typeof resolveData !== 'undefined') { for (let /** @type {?} */ item of resolveData.items) { result.push(item); } } let /** @type {?} */ data = { data: result, original: dataTemp }; let /** @type {?} */ ev = EventUtils.newCustomEvent(DATA_QUERY_EVENT, this, data, null); this.dataQueryEvent.emit(ev); resolve(result); }, (error) => { reject(error); }); }); } return prom; } /** * @param {?} data * @return {?} */ showVersionHistoryDialog(data) { let /** @type {?} */ bodyStyle = ['grey', 'version-body']; let /** @type {?} */ footerStyle = ['grey', 'right', 'version-footer']; let /** @type {?} */ versionHistoryModel = null; if (this.versionHistoryFactory !== null && typeof this.versionHistoryFactory !== 'undefined') { versionHistoryModel = this.versionHistoryFactory.getVersionHistoryModel(data.data); } let /** @type {?} */ closeXHandler = () => { this.dialogService.hideDialog(); }; let /** @type {?} */ closeHandler = () => { this.dialogService.hideDialog(); }; let /** @type {?} */ confirmHandler = () => { this.dialogService.hideDialog(); }; let /** @type {?} */ buttonSet = [new ComponentDialogModel.ButtonModel("CANCEL", null, closeHandler, ['dialog-btn', 'cancel']), new ComponentDialogModel.ButtonModel("CONFIRM", null, confirmHandler, ['dialog-btn', 'confirm'])]; let /** @type {?} */ compoModel = new ComponentDialogModel('Version History', null, 'component', buttonSet, VersionHistory, versionHistoryModel, data, '560pt', '408pt', null, bodyStyle, footerStyle, closeXHandler); return this.dialogService.showComponentDialog(compoModel); } /** * @return {?} */ getDataClassName() { return this.dataClassName; } /** * @param {?} dataClassName * @return {?} */ setDataClassName(dataClassName) { this.dataClassName = dataClassName; } /** * @return {?} */ getConfigName() { return this.configName; } /** * @param {?} configName * @return {?} */ setConfigName(configName) { if (configName !== null && typeof configName !== 'undefined' && configName !== '') { this.configName = CONFIG_NAME + "[" + configName + "]"; } else { this.configName = configName; } } /** * @return {?} */ getDataSchemaReloadEvent() { return this.dataSchemaReloadEvent; } /** * @param {?} dataSchemaReloadEvent * @return {?} */ setDataSchemaReloadEvent(dataSchemaReloadEvent) { this.dataSchemaReloadEvent = dataSchemaReloadEvent; } /** * @return {?} */ getDataDestroyEvent() { return this.dataDestroyEvent; } /** * @param {?} event * @return {?} */ setDataDestroyEvent(event) { this.dataDestroyEvent = event; } /** * @return {?} */ getDataPromoteEvent() { return this.dataPromoteEvent; } /** * @param {?} event * @return {?} */ setDataPromoteEvent(event) { this.dataPromoteEvent = event; } } tslib_1.__decorate([ Option('dataSchemaReload'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractParrotsDataEditor.prototype, "dataSchemaReloadEvent", void 0); tslib_1.__decorate([ Option('dataDestroy'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractParrotsDataEditor.prototype, "dataDestroyEvent", void 0); tslib_1.__decorate([ Option('dataPromote'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractParrotsDataEditor.prototype, "dataPromoteEvent", void 0); function AbstractParrotsDataEditor_tsickle_Closure_declarations() { /** @type {?} */ AbstractParrotsDataEditor.prototype.dataSchemaReloadEvent; /** @type {?} */ AbstractParrotsDataEditor.prototype.dataDestroyEvent; /** @type {?} */ AbstractParrotsDataEditor.prototype.dataPromoteEvent; /** @type {?} */ AbstractParrotsDataEditor.prototype.dataSchema; /** @type {?} */ AbstractParrotsDataEditor.prototype.dataServiceFactory; /** @type {?} */ AbstractParrotsDataEditor.prototype.dataService; /** @type {?} */ AbstractParrotsDataEditor.prototype.versionHistoryFactory; /** @type {?} */ AbstractParrotsDataEditor.prototype.dataClassName; /** @type {?} */ AbstractParrotsDataEditor.prototype.configName; /** @type {?} */ AbstractParrotsDataEditor.prototype.instConnectionMgr; /** @type {?} */ AbstractParrotsDataEditor.prototype.classesResource; } export { DataLangSelectorPane } from './editor.internal/DataLangSelectorPane.component'; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RQYXJyb3RzRGF0YUVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lvLnBhcnJvdHMvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2VkaXRvci9BYnN0cmFjdFBhcnJvdHNEYXRhRWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFpQixZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUQsT0FBTyxFQUNMLE1BQU0sRUFBRSxrQkFBa0IsRUFFMUIsVUFBVSxFQUFFLG9CQUFvQixFQUNqQyxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsa0JBQWtCLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFPdkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUs1RCx1QkFBTSxXQUFXLEdBQVcsd0JBQXdCLENBQUM7Ozs7QUFLckQsTUFBTSxnQ0FBMEMsU0FBUSxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7O0lBb0J4RSxZQUFZLGNBQStDLEVBQUUsWUFBMkMsRUFBRSxXQUFzQyxFQUM5SSxxQkFBeUQsRUFBRSxlQUFvQyxFQUFFLGFBQTRCLEVBQzdILFlBQXNDLEVBQUUsYUFBcUIsRUFBRSxVQUFrQixFQUFFLHFCQUFrRCxFQUNySSxpQkFBNEM7UUFDNUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFdEgsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUvQixJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7UUFDbkQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlC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QUFLLENBQUMsQ0FBQyxDQUFDO2dDQUNuQyxFQUFFLENBQUEsQ0FBQyxhQUFhLEtBQUssSUFBSSxJQUFJLGFBQWEsS0FBSyxTQUFTLElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUEsQ0FBQztvQ0FDN0csRUFBRSxDQUFBLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzt3Q0FDL0UsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3Q0FDMUUsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQ0FDckI7aUNBQ0Y7Z0NBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQSxDQUFDLGFBQWEsS0FBSyxJQUFJLElBQUksYUFBYSxLQUFLLFNBQVMsSUFBSSxDQUFDLFdBQVcsS0FBSyxJQUFJLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUEsQ0FBQztvQ0FDdEgsRUFBRSxDQUFBLENBQUMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3Q0FDaEYsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQ0FDckI7aUNBQ0Y7Z0NBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQSxDQUFDLENBQUMsYUFBYSxLQUFLLElBQUksSUFBSSxhQUFhLEtBQUssU0FBUyxDQUFDLElBQUksV0FBVyxLQUFLLElBQUksSUFBSSxXQUFXLEtBQUssU0FBUyxDQUFDLENBQUEsQ0FBQztvQ0FDdEgsRUFBRSxDQUFBLENBQUMsQ0FBQyxXQUFX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QztRQUN0RSxJQUFJLENBQUMscUJBQXFCLEdBQUcscUJBQXFCLENBQUM7Ozs7O0lBRzlDLG1CQUFtQjtRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDOzs7Ozs7SUFHeEIsbUJBQW1CLENBQUMsS0FBd0I7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7Ozs7SUFHekIsbUJBQW1CO1FBQ3hCLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Ozs7OztJQUd4QixtQkFBbUIsQ0FBQyxLQUF3QjtRQUNqRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztDQUVqQzs7SUE3VUUsTUFBTSxDQUFDLGtCQUFrQixDQUFDO3NDQUNNLFlBQVk7OztJQUM1QyxNQUFNLENBQUMsYUFBYSxDQUFDO3NDQUNNLFlBQVk7OztJQUN2QyxNQUFNLENBQUMsYUFBYSxDQUFDO3NDQUNNLFlBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMFUxQyxxQ0FBYyxrREFBa0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9uSW5pdCwgSW5wdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQge1xyXG4gIE9wdGlvbiwgQWJzdHJhY3REYXRhRWRpdG9yLCBJRGF0YUVkaXRvckFjdGlvblByb3ZpZGVyLCBJRGF0YVNlcnZpY2VGYWN0b3J5LFxuICBJRWRpdG9yU2V0dGluZ1NlcnZpY2VGYWN0b3J5LCBQaGxveEFwcEluZm9TZXJ2aWNlLCBEaWFsb2dTZXJ2aWNlLCBCYWNrZ3JvdW5kUHJvY2Vzc01hbmFnZXIsXG4gIEV2ZW50VXRpbHMsIENvbXBvbmVudERpYWxvZ01vZGVsXHJcbn0gZnJvbSAnY29tLnBobG94dWknO1xuaW1wb3J0IHsgREFUQV9ERVNUUk9ZX0VWRU5ULCBEQVRBX1BST01PVEVfRVZFTlQsIERBVEFfUVVFUllfRVZFTlQgfSBmcm9tICdjb20ucGhsb3h1aSc7XG5pbXBvcnQgeyBJUGFycm90c0RhdGFTZXJ2aWNlIH0gZnJvbSAnLi9JUGFycm90c0RhdGFTZXJ2aWNlJztcbmltcG9ydCB7IFBhcnJvdHNEYXRhU2VydmljZUZhY3RvcnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL1BhcnJvdHNEYXRhU2VydmljZUZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBQYXJyb3RzRGF0YUVkaXRvckFjdGlvblByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vc2VydmljZS9QYXJyb3RzRGF0YUVkaXRvckFjdGlvblByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFycm90c0RhdGFFZGl0b3JWaWV3UHJvdmlkZXIgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL1BhcnJvdHNEYXRhRWRpdG9yVmlld1Byb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgUGFycm90c0VkaXRvclNldHRpbmdTZXJ2aWNlRmFjdG9yeSB9IGZyb20gJy4uLy4uL3NlcnZpY2UvUGFycm90c0VkaXRvclNldHRpbmdTZXJ2aWNlRmFjdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IFBhcnJvdHNEYXRhU2NoZW1hIH0gZnJvbSAnLi4vLi4vc2hhcmUvbW9kZWwvUGFycm90c0RhdGFTY2hlbWEnO1xuaW1wb3J0IHsgQ2xhc3Nlc1Jlc291cmNlIH0gZnJvbSAnLi4vLi4vc2hhcmUvcmVzb3VyY2UvQ2xhc3Nlc1Jlc291cmNlJztcbmltcG9ydCB7IFZlcnNpb25IaXN0b3J5IH0gZnJvbSAnLi9WZXJzaW9uSGlzdG9yeS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSVZlcnNpb25IaXN0b3J5TW9kZWxGYWN0b3J5IH0gZnJvbSAnLi9JVmVyc2lvbkhpc3RvcnlNb2RlbEZhY3RvcnknO1xuaW1wb3J0IHsgSW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlciB9IGZyb20gJy4uLy4uL3NlcnZpY2UvSW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlci5zZXJ2aWNlJztcblxuXG5jb25zdCBDT05GSUdfTkFNRTogc3RyaW5nID0gJ2NvbS5wYXJyb3RzLmRhdGFFZGl0b3InO1xuXG4vKlxuKiAjIyBBYnN0cmFjdFBhcnJvdHNEYXRhRWRpdG9yIGNvbnRhaW5zIGRhdGFDbGFzc05hbWUgYW5kIGNvbmZpZ05hbWUgdGhhdCB1c2UgZm9yIGdlbmVyYXRlIHNldHRpbmdTZXJ2aWNlIG9yIGRhdGFTZXJ2aWNlXG4qL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFycm90c0RhdGFFZGl0b3IgZXh0ZW5kcyBBYnN0cmFjdERhdGFFZGl0b3Ige1xuXG4gIC8vIC0tLSBzZWxmXG4gIEBPcHRpb24oJ2RhdGFTY2hlbWFSZWxvYWQnKVxuICBwcm90ZWN0ZWQgZGF0YVNjaGVtYVJlbG9hZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignZGF0YURlc3Ryb3knKVxuICBwcm90ZWN0ZWQgZGF0YURlc3Ryb3lFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2RhdGFQcm9tb3RlJylcbiAgcHJvdGVjdGVkIGRhdGFQcm9tb3RlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIHByb3RlY3RlZCBkYXRhU2NoZW1hOiBQYXJyb3RzRGF0YVNjaGVtYTtcbiAgcHJvdGVjdGVkIGRhdGFTZXJ2aWNlRmFjdG9yeTogUGFycm90c0RhdGFTZXJ2aWNlRmFjdG9yeTtcbiAgcHJvdGVjdGVkIGRhdGFTZXJ2aWNlOiBJUGFycm90c0RhdGFTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgdmVyc2lvbkhpc3RvcnlGYWN0b3J5OiBJVmVyc2lvbkhpc3RvcnlNb2RlbEZhY3Rvcnk7XG4gIHByb3RlY3RlZCBkYXRhQ2xhc3NOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBjb25maWdOYW1lOiBzdHJpbmc7XG4gIHByb3RlY3RlZCBpbnN0Q29ubmVjdGlvbk1ncjogSW5zdGFuY2VDb25uZWN0aW9uTWFuYWdlcjtcbiAgcHJvdGVjdGVkIGNsYXNzZXNSZXNvdXJjZTogQ2xhc3Nlc1Jlc291cmNlO1xuXG5cbiAgY29uc3RydWN0b3IoYWN0aW9uUHJvdmlkZXI6IFBhcnJvdHNEYXRhRWRpdG9yQWN0aW9uUHJvdmlkZXIsIHZpZXdQcm92aWRlcjogUGFycm90c0RhdGFFZGl0b3JWaWV3UHJvdmlkZXIsIGRhdGFGYWN0b3J5OiBQYXJyb3RzRGF0YVNlcnZpY2VGYWN0b3J5LFxuICAgIHNldHRpbmdTZXJ2aWNlRmFjdG9yeTogUGFycm90c0VkaXRvclNldHRpbmdTZXJ2aWNlRmFjdG9yeSwgcGhsb3hBcHBTZXJ2aWNlOiBQaGxveEFwcEluZm9TZXJ2aWNlLCBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlLFxuICAgIGJnUHJvY2Vzc01ncjogQmFja2dyb3VuZFByb2Nlc3NNYW5hZ2VyLCBkYXRhQ2xhc3NOYW1lOiBzdHJpbmcsIGNvbmZpZ05hbWU6IHN0cmluZywgdmVyc2lvbkhpc3RvcnlGYWN0b3J5OiBJVmVyc2lvbkhpc3RvcnlNb2RlbEZhY3RvcnksXG4gICAgaW5zdENvbm5lY3Rpb25NZ3I6IEluc3RhbmNlQ29ubmVjdGlvbk1hbmFnZXIpIHtcbiAgICBzdXBlcihhY3Rpb25Qcm92aWRlciwgdmlld1Byb3ZpZGVyLCBkYXRhRmFjdG9yeSwgc2V0dGluZ1NlcnZpY2VGYWN0b3J5LCBwaGxveEFwcFNlcnZpY2UsIGRpYWxvZ1NlcnZpY2UsIGJnUHJvY2Vzc01ncik7XG5cbiAgICB0aGlzLmRhdGFDbGFzc05hbWUgPSBkYXRhQ2xhc3NOYW1lO1xuICAgIHRoaXMuc2V0Q29uZmlnTmFtZShjb25maWdOYW1lKTtcblxuICAgIHRoaXMudmVyc2lvbkhpc3RvcnlGYWN0b3J5ID0gdmVyc2lvbkhpc3RvcnlGYWN0b3J5O1xuICAgIHRoaXMuaW5zdENvbm5lY3Rpb25NZ3IgPSBpbnN0Q29ubmVjdGlvbk1ncjtcbiAgICB0aGlzLmRhdGFTY2hlbWFSZWxvYWRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmRhdGFEZXN0cm95RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5kYXRhUHJvbW90ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgdGhpcy5jbGFzc2VzUmVzb3VyY2UgPSB0aGlzLmluc3RDb25uZWN0aW9uTWdyLmNyZWF0ZVJlc291cmNlKENsYXNzZXNSZXNvdXJjZSk7XG5cbiAgfVxuXG4gIC8vIGluaXRQYWdlIHdpdGggcmVsb2FkRGF0YVNjaGVtYVxuICBwcm90ZWN0ZWQgaW5pdFBhZ2UoKTogdm9pZCB7XG4gICAgLy8gY3JlYXRlIHBhcnJvdHMgRGF0YVNlcnZpY2UgYmVmb3JlIGNhbGwgc3VwZXJcbiAgICBpZiAodGhpcy5kYXRhU2VydmljZUZhY3RvcnkgIT09IG51bGwgJiYgdGhpcy5kYXRhU2VydmljZUZhY3RvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGRmUHJvbSA9IHRoaXMuZGF0YVNlcnZpY2VGYWN0b3J5LmNyZWF0ZURhdGFTZXJ2aWNlKHRoaXMpO1xuXG4gICAgICBpZiAoZGZQcm9tICE9IG51bGwgJiYgZGZQcm9tICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGZQcm9tLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIHRoaXMuZGF0YVNlcnZpY2UgPSByZXN1bHQ7XG4gICAgICAgICAgdGhpcy5yZWxvYWREYXRhU2NoZW1hKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyLmluaXRQYWdlKCk7XG4gIH1cblxuICBwdWJsaWMgcmVsb2FkRGF0YVNjaGVtYSgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAodGhpcy5kYXRhU2VydmljZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuZGF0YVNlcnZpY2UubG9hZERhdGFTY2hlbWEoKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICB0aGlzLmRhdGFTY2hlbWEgPSByZXN1bHQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIHRoaXMuZGF0YVNjaGVtYVJlbG9hZEV2ZW50LmVtaXQocmVzdWx0KTtcbiAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgICB0aGlzLmRhdGFTY2hlbWFSZWxvYWRFdmVudC5lbWl0KG51bGwpO1xuICAgICAgfVxuICAgIH0pLmNhdGNoKChlcnJvcjogYW55KSA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3lEYXRhKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG5cbiAgICBpZiAodGhpcy5kYXRhU2VydmljZSA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5kYXRhU2VydmljZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuXG4gICAgbGV0IHByb20gPSB0aGlzLmRhdGFTZXJ2aWNlLmRlc3Ryb3lEYXRhKGRhdGEpO1xuXG4gICAgaWYgKHByb20gIT09IG51bGwpIHtcbiAgICAgIHByb20udGhlbigocmVzb2x2ZURhdGEpID0+IHtcblxuICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgICAgICBpZiAocmVzb2x2ZURhdGEgIT09IG51bGwgJiYgdHlwZW9mIHJlc29sdmVEYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc29sdmVEYXRhKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiByZXNvbHZlRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLnJlbW92ZURhdGEoaXRlbSk7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBkZWxldGUgZnJvbSBkYXRhXG4gICAgICAgICAgICB0aGlzLnJlbW92ZURhdGEocmVzb2x2ZURhdGEpO1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmVzb2x2ZURhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSByZXNvbHZlRGF0YTtcbiAgICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChEQVRBX0RFU1RST1lfRVZFTlQsIHRoaXMsIGRhdGEsIG51bGwpO1xuXG4gICAgICAgIHRoaXMuZGF0YURlc3Ryb3lFdmVudC5lbWl0KGV2KTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc29sdmVEYXRhKTtcbiAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb207XG4gIH1cblxuICBwdWJsaWMgcHJvbW90ZURhdGEoZGF0YTogYW55KTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGlmICh0aGlzLmRhdGFTZXJ2aWNlID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmRhdGFTZXJ2aWNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG5cbiAgICBsZXQgZGF0YVRlbXA6IGFueVtdID0gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIGRhdGFUZW1wID0gZGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YVRlbXAucHVzaChkYXRhKTtcbiAgICB9XG4gICAgbGV0IHByb20gPSB0aGlzLmRhdGFTZXJ2aWNlLnByb21vdGVEYXRhKGRhdGEpO1xuXG4gICAgaWYgKHByb20gIT09IG51bGwpIHtcbiAgICAgIHByb20udGhlbigocmVzb2x2ZURhdGEpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogYW55W10gPSBbXTtcbiAgICAgICAgaWYgKHJlc29sdmVEYXRhICE9PSBudWxsICYmIHR5cGVvZiByZXNvbHZlRGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXNvbHZlRGF0YSkpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgcmVzb2x2ZURhdGEpIHtcbiAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVEYXRhKGl0ZW0pOyAvLyEgZG8gcHJvbW90ZVxuICAgICAgICAgICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZURhdGEocmVzb2x2ZURhdGEpOyAvLyEgZG8gcHJvbW90ZVxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmVzb2x2ZURhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICAgIG9yaWdpbmFsOiBkYXRhVGVtcFxuICAgICAgICB9XG4gICAgICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoREFUQV9QUk9NT1RFX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgICAgICB0aGlzLmRhdGFQcm9tb3RlRXZlbnQuZW1pdChldik7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXNvbHZlRGF0YSk7XG4gICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9tO1xuICB9XG5cbiAgcHVibGljIGdldFZlcnNpb25IaXN0b3J5KGRhdGE6IGFueSwgc3RhcnREYXRlVGltZTogRGF0ZSwgZW5kRGF0ZVRpbWU6IERhdGUpOiBQcm9taXNlPGFueT4ge1xuXG4gICAgbGV0IGRhdGFUZW1wOiBhbnlbXSA9IFtdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBkYXRhVGVtcCA9IGRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRhdGFUZW1wLnB1c2goZGF0YSk7XG4gICAgfVxuXG4gICAgbGV0IHV1aWQ6IHN0cmluZyA9IGRhdGEuX3V1aWQ7XG4gICAgbGV0IGNsYXNzTmFtZTogc3RyaW5nID0gdGhpcy5nZXREYXRhQ2xhc3NOYW1lKCk7XG5cbiAgICBsZXQgcHJvbSA9IHRoaXMuY2xhc3Nlc1Jlc291cmNlLmdldFZlcnNpb25zKHV1aWQsIGNsYXNzTmFtZSk7XG5cbiAgICBpZiAocHJvbSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcHJvbS50aGVuKChyZXNvbHZlRGF0YSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgaWYgKHJlc29sdmVEYXRhICE9PSBudWxsICYmIHR5cGVvZiByZXNvbHZlRGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiByZXNvbHZlRGF0YS5pdGVtcykge1xuICAgICAgICAgICAgICAgIGlmKHN0YXJ0RGF0ZVRpbWUgIT09IG51bGwgJiYgc3RhcnREYXRlVGltZSAhPT0gdW5kZWZpbmVkICYmIGVuZERhdGVUaW1lICE9PSBudWxsICYmIGVuZERhdGVUaW1lICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgaWYoKHN0YXJ0RGF0ZVRpbWUuaXNCZWZvcmUoaXRlbS5fY3JlYXRlZCkgfHwgc3RhcnREYXRlVGltZS5lcXVhbHMoaXRlbS5fY3JlYXRlZCkpICYmXG4gICAgICAgICAgICAgICAgICAgIChlbmREYXRlVGltZS5pc0FmdGVyKGl0ZW0uX2NyZWF0ZWQpIHx8IGVuZERhdGVUaW1lLmVxdWFscyhpdGVtLl9jcmVhdGVkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYoc3RhcnREYXRlVGltZSAhPT0gbnVsbCAmJiBzdGFydERhdGVUaW1lICE9PSB1bmRlZmluZWQgJiYgKGVuZERhdGVUaW1lID09PSBudWxsIHx8IGVuZERhdGVUaW1lID09PSB1bmRlZmluZWQpKXtcbiAgICAgICAgICAgICAgICAgIGlmKChzdGFydERhdGVUaW1lLmlzQmVmb3JlKGl0ZW0uX2NyZWF0ZWQpIHx8IHN0YXJ0RGF0ZVRpbWUuZXF1YWxzKGl0ZW0uX2NyZWF0ZWQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZigoc3RhcnREYXRlVGltZSA9PT0gbnVsbCB8fCBzdGFydERhdGVUaW1lID09PSB1bmRlZmluZWQpICYmIGVuZERhdGVUaW1lICE9PSBudWxsICYmIGVuZERhdGVUaW1lICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgICAgICAgICAgaWYoKGVuZERhdGVUaW1lLmlzQWZ0ZXIoaXRlbS5fY3JlYXRlZCkgfHwgZW5kRGF0ZVRpbWUuZXF1YWxzKGl0ZW0uX2NyZWF0ZWQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZGF0YTogYW55ID0ge1xuICAgICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICAgIG9yaWdpbmFsOiBkYXRhVGVtcFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChEQVRBX1FVRVJZX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgICAgICAgICAgdGhpcy5kYXRhUXVlcnlFdmVudC5lbWl0KGV2KTtcblxuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9tO1xuICB9XG5cbiAgcHVibGljIGdldExhbmd1YWdlTGlzdChkYXRhOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0aGlzLmRhdGFTZXJ2aWNlID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmRhdGFTZXJ2aWNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICB9XG5cbiAgICAvLyBsZXQgZkRhdGEgPSBkYXRhO1xuICAgIGxldCBkYXRhVGVtcDogYW55W10gPSBbXTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgZGF0YVRlbXAgPSBkYXRhO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhVGVtcC5wdXNoKGRhdGEpO1xuICAgIH1cblxuICAgIGxldCBmaWx0ZXJEYXRhID0ge1xuICAgICAgXCJmaWx0ZXJcIjogXCJ0aGlzLl9sYW5nICE9IG51bGwgJiYgdGhpcy5fdXVpZCA9PSB1dWlkXCIsXG4gICAgICBcInBhcmFtZXRlcnNcIjogXCJqYXZhLmxhbmcuU3RyaW5nIHV1aWRcIixcbiAgICAgIFwiZXhlY3V0ZU1hcFwiOiB7XG4gICAgICAgIFwidXVpZFwiOiBkYXRhLl91dWlkXG4gICAgICB9XG4gICAgfTtcbiAgICBsZXQgcHJvbSA9IHRoaXMuZGF0YVNlcnZpY2UucXVlcnlEYXRhKGZpbHRlckRhdGEpO1xuXG4gICAgaWYgKHByb20gIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHByb20udGhlbigocmVzb2x2ZURhdGEpID0+IHtcbiAgICAgICAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IFtdO1xuICAgICAgICAgIGlmIChyZXNvbHZlRGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgcmVzb2x2ZURhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHJlc29sdmVEYXRhLml0ZW1zKSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBkYXRhOiBhbnkgPSB7XG4gICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICBvcmlnaW5hbDogZGF0YVRlbXBcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChEQVRBX1FVRVJZX0VWRU5ULCB0aGlzLCBkYXRhLCBudWxsKTtcblxuICAgICAgICAgIHRoaXMuZGF0YVF1ZXJ5RXZlbnQuZW1pdChldik7XG5cbiAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb207XG4gIH1cblxuICBwdWJsaWMgc2hvd1ZlcnNpb25IaXN0b3J5RGlhbG9nKGRhdGE6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgbGV0IGJvZHlTdHlsZTogc3RyaW5nW10gPSBbJ2dyZXknLCAndmVyc2lvbi1ib2R5J107XG4gICAgbGV0IGZvb3RlclN0eWxlOiBzdHJpbmdbXSA9IFsnZ3JleScsICdyaWdodCcsICd2ZXJzaW9uLWZvb3RlciddO1xuICAgIGxldCB2ZXJzaW9uSGlzdG9yeU1vZGVsOiBhbnkgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMudmVyc2lvbkhpc3RvcnlGYWN0b3J5ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLnZlcnNpb25IaXN0b3J5RmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZlcnNpb25IaXN0b3J5TW9kZWwgPSB0aGlzLnZlcnNpb25IaXN0b3J5RmFjdG9yeS5nZXRWZXJzaW9uSGlzdG9yeU1vZGVsKGRhdGEuZGF0YSk7XG4gICAgfVxuXG4gICAgbGV0IGNsb3NlWEhhbmRsZXI6IEZ1bmN0aW9uID0gKCkgPT4geyB0aGlzLmRpYWxvZ1NlcnZpY2UuaGlkZURpYWxvZygpOyB9O1xuICAgIGxldCBjbG9zZUhhbmRsZXI6IEZ1bmN0aW9uID0gKCkgPT4geyB0aGlzLmRpYWxvZ1NlcnZpY2UuaGlkZURpYWxvZygpOyB9O1xuICAgIGxldCBjb25maXJtSGFuZGxlcjogRnVuY3Rpb24gPSAoKSA9PiB7IHRoaXMuZGlhbG9nU2VydmljZS5oaWRlRGlhbG9nKCk7IH07XG4gICAgbGV0IGJ1dHRvblNldCA9IFtuZXcgQ29tcG9uZW50RGlhbG9nTW9kZWwuQnV0dG9uTW9kZWwoXCJDQU5DRUxcIiwgbnVsbCwgY2xvc2VIYW5kbGVyLCBbJ2RpYWxvZy1idG4nLCAnY2FuY2VsJ10pLFxuICAgIG5ldyBDb21wb25lbnREaWFsb2dNb2RlbC5CdXR0b25Nb2RlbChcIkNPTkZJUk1cIiwgbnVsbCwgY29uZmlybUhhbmRsZXIsIFsnZGlhbG9nLWJ0bicsICdjb25maXJtJ10pXTtcblxuICAgIGxldCBjb21wb01vZGVsID0gbmV3IENvbXBvbmVudERpYWxvZ01vZGVsKCdWZXJzaW9uIEhpc3RvcnknLCBudWxsLCAnY29tcG9uZW50JywgYnV0dG9uU2V0LCBWZXJzaW9uSGlzdG9yeSwgdmVyc2lvbkhpc3RvcnlNb2RlbCwgZGF0YSxcbiAgICAgICc1NjBwdCcsICc0MDhwdCcsIG51bGwsIGJvZHlTdHlsZSwgZm9vdGVyU3R5bGUsIGNsb3NlWEhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIHRoaXMuZGlhbG9nU2VydmljZS5zaG93Q29tcG9uZW50RGlhbG9nKGNvbXBvTW9kZWwpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhQ2xhc3NOYW1lO1xuICB9XG5cbiAgcHVibGljIHNldERhdGFDbGFzc05hbWUoZGF0YUNsYXNzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhQ2xhc3NOYW1lID0gZGF0YUNsYXNzTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25maWdOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb25maWdOYW1lKGNvbmZpZ05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChjb25maWdOYW1lICE9PSBudWxsICYmIHR5cGVvZiBjb25maWdOYW1lICE9PSAndW5kZWZpbmVkJyAmJiBjb25maWdOYW1lICE9PSAnJykge1xuICAgICAgdGhpcy5jb25maWdOYW1lID0gQ09ORklHX05BTUUgKyBcIltcIiArIGNvbmZpZ05hbWUgKyBcIl1cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb25maWdOYW1lID0gY29uZmlnTmFtZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVNjaGVtYVJlbG9hZEV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2NoZW1hUmVsb2FkRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0RGF0YVNjaGVtYVJlbG9hZEV2ZW50KGRhdGFTY2hlbWFSZWxvYWRFdmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFTY2hlbWFSZWxvYWRFdmVudCA9IGRhdGFTY2hlbWFSZWxvYWRFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXRhRGVzdHJveUV2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhRGVzdHJveUV2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldERhdGFEZXN0cm95RXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5kYXRhRGVzdHJveUV2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVByb21vdGVFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVByb21vdGVFdmVudDtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXRhUHJvbW90ZUV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuZGF0YVByb21vdGVFdmVudCA9IGV2ZW50O1xuICB9XG59XG5cbmV4cG9ydCAqIGZyb20gJy4vZWRpdG9yLmludGVybmFsL0RhdGFMYW5nU2VsZWN0b3JQYW5lLmNvbXBvbmVudCc7XG4iXX0=