io.parrots
Version:
Parrots.io App
395 lines (394 loc) • 46 kB
JavaScript
/**
* @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=