Repository URL to install this package:
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ViewChild } from '@angular/core';
import { PluginView } from 'web-console-core';
import { NGXLogger } from 'web-console-core';
import * as _ from 'lodash';
import { WCNotificationCenter, NotificationType } from 'web-console-ui-kit';
import { SchedulerService } from '@wa-motif-open-api/scheduler-service';
import { GridComponent } from '@progress/kendo-angular-grid';
/** @type {?} */
const LOG_TAG = '[SchedulerSection]';
let SchedulerSectionComponent = class SchedulerSectionComponent {
/**
* @param {?} logger
* @param {?} schedulerService
* @param {?} notificationCenter
*/
constructor(logger, schedulerService, notificationCenter) {
this.logger = logger;
this.schedulerService = schedulerService;
this.notificationCenter = notificationCenter;
//Data
this.scheduledTasksList = [];
this.scheduledTaskExecutionsList = [];
this.statusConfirmationTitleProvider = {
/**
* @param {?} rowData
* @return {?}
*/
getTitle(rowData) {
if (rowData.enabled) {
return "Disable ?";
}
else {
return "Enable ?";
}
}
};
this.logger.debug(LOG_TAG, 'Opening...');
}
/**
* @return {?}
*/
ngOnInit() {
this.logger.debug(LOG_TAG, 'Initializing...');
this.refreshData();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.logger.debug(LOG_TAG, 'ngOnDestroy ');
}
/**
* @private
* @return {?}
*/
loadData() {
this.logger.debug(LOG_TAG, 'loadData');
this.loading = true;
this.schedulerService.getTaskList().subscribe((/**
* @param {?} response
* @return {?}
*/
(response) => {
this.scheduledTasksList = response;
_.forEach(this.scheduledTasksList, (/**
* @param {?} element
* @return {?}
*/
function (element) {
element.created = new Date(element.created);
element.updated = new Date(element.updated);
}));
this.loading = false;
}), (/**
* @param {?} error
* @return {?}
*/
error => {
this.logger.error(LOG_TAG, 'getTaskList failed: ', error);
this.loading = false;
}));
}
/**
* @return {?}
*/
refreshData() {
this.loadData();
}
/**
* @param {?} dataItem
* @return {?}
*/
onDeleteOKPressed(dataItem) {
this.logger.debug(LOG_TAG, 'onDeleteOKPressed token=', dataItem.name);
this.schedulerService.deleteTask(dataItem.name).subscribe((/**
* @param {?} value
* @return {?}
*/
value => {
this.refreshData();
this.notificationCenter.post({
name: 'DeleteScheduledTaskSuccess',
title: 'Delete Scheduled Task',
message: 'The Scheduled Task has been successfully removed',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.notificationCenter.post({
name: 'DeleteScheduledTaskError',
title: 'Delete Scheduled Task',
message: 'The Scheduled Task could not be removed.',
type: NotificationType.Error,
error: error,
closable: true
});
}));
}
/**
* @param {?} dataItem
* @return {?}
*/
onDeleteCancelPressed(dataItem) {
this.logger.debug(LOG_TAG, 'onDeleteCancelPressed');
}
/**
* @return {?}
*/
onRefreshClicked() {
this.refreshData();
}
/**
* @param {?} dataItem
* @return {?}
*/
onStatusTogglePressed(dataItem) {
this.logger.debug(LOG_TAG, 'onStatusTogglePressed dataItem: ', dataItem);
this.changeTaskStatus(dataItem.name, !dataItem.enabled);
}
/**
* @private
* @param {?} taskName
* @param {?} enabled
* @return {?}
*/
changeTaskStatus(taskName, enabled) {
if (enabled) {
this.enabledTask(taskName);
}
else {
this.disableTask(taskName);
}
}
/**
* @private
* @param {?} taskName
* @return {?}
*/
disableTask(taskName) {
this.schedulerService.disableTask(taskName).subscribe((/**
* @param {?} value
* @return {?}
*/
value => {
this.refreshData();
this.notificationCenter.post({
name: 'DisableScheduledTaskSuccess',
title: 'Disable Scheduled Task',
message: 'The Scheduled Task has been successfully disabled',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.notificationCenter.post({
name: 'DisableScheduledTaskError',
title: 'Disable Scheduled Task',
message: 'The Scheduled Task could not be disabled.',
type: NotificationType.Error,
error: error,
closable: true
});
}));
}
/**
* @private
* @param {?} taskName
* @return {?}
*/
enabledTask(taskName) {
this.schedulerService.enableTask(taskName).subscribe((/**
* @param {?} value
* @return {?}
*/
value => {
this.refreshData();
this.notificationCenter.post({
name: 'EnableScheduledTaskSuccess',
title: 'Enable Scheduled Task',
message: 'The Scheduled Task has been successfully enabled',
type: NotificationType.Success
});
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.notificationCenter.post({
name: 'EnableScheduledTaskError',
title: 'Enable Scheduled Task',
message: 'The Scheduled Task could not be enabled.',
type: NotificationType.Error,
error: error,
closable: true
});
}));
}
};
SchedulerSectionComponent.decorators = [
{ type: Component, args: [{
selector: 'wa-scheduler-section',
template: "<wc-dashboard-header [title]=\"'Scheduler Management'\"></wc-dashboard-header>\n<wc-loading-overlay [visible]='loading'></wc-loading-overlay>\n\n<div class=\"row spread\">\n <div class=\"flex-cmd\">\n <kendo-buttongroup look=\"flat\">\n <button\n kendoButton\n [toggleable]=\"false\"\n [icon]=\"'refresh'\"\n (click)=\"onRefreshClicked()\"\n >\n Refresh\n </button>\n </kendo-buttongroup>\n </div>\n</div>\n\n<div class=\"row fill\">\n <div>\n <kendo-grid [data]=\"scheduledTasksList\" [scrollable]=\"true\">\n <kendo-grid-column field=\"created\" title=\"Created\" format=\"{0:dd/MM/yyyy HH:mm:ss}\">\n </kendo-grid-column>\n <kendo-grid-column field=\"updated\" title=\"Updated\" format=\"{0:dd/MM/yyyy HH:mm:ss}\">\n </kendo-grid-column>\n <kendo-grid-column field=\"name\" title=\"Name\" witdh=\"30\">\n </kendo-grid-column>\n <kendo-grid-column field=\"cronPattern\" title=\"Cron\">\n </kendo-grid-column>\n\n <!--\n <kendo-grid-column field=\"enabled\" title=\"Enabled\" witdth=\"20\">\n </kendo-grid-column>\n -->\n\n <kendo-grid-column field=\"enabled\" title=\"Status\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n <wc-grid-editor-command\n [motif-acl]=\"['com.vipera.osgi.foundation.scheduler.api.rest.SchedulerApi:CREATE:enableTask',\n 'com.vipera.osgi.foundation.scheduler.api.rest.SchedulerApi:DELETE:disableTask']\"\n [alignMode]=\"'left'\"\n [rowIndex]=\"rowIndex\" \n [hasConfirmation]=\"true\"\n [confirmationTitleProvider]=\"statusConfirmationTitleProvider\"\n [columnIndex]=\"columnIndex\" \n [column]=\"column\" \n [value]=\"dataItem[column.field]\" \n [dataItem]=\"dataItem\"\n (commandConfirm)=\"onStatusTogglePressed(dataItem)\" \n >\n <span *ngIf=\"dataItem.enabled\" class=\"badge badge-status badge-enabled\">\n ENABLED\n </span>\n <span *ngIf=\"!dataItem.enabled\" class=\"badge badge-status badge-disabled\">\n DISABLED\n </span>\n </wc-grid-editor-command>\n </ng-template>\n </kendo-grid-column>\n\n <kendo-grid-column field=\"serviceName\" title=\"Service\" witdh=\"50\">\n </kendo-grid-column>\n <kendo-grid-column field=\"serviceMethod\" title=\"Method\" witdh=\"50\">\n </kendo-grid-column>\n <kendo-grid-column field=\"failurePolicy\" title=\"On Failure\">\n </kendo-grid-column>\n <kendo-grid-column field=\"clusterExecutionPolicy\" title=\"Cluster Policy\">\n </kendo-grid-column>\n \n <kendo-grid-column title=\"\" width=\"150\" minResizableWidth=\"140\">\n <ng-template kendoGridCellTemplate let-dataItem let-columnIndex=\"columnIndex\" let-rowIndex=\"rowIndex\" let-column=\"column\">\n <wc-grid-editor-command\n motif-acl=\"com.vipera.osgi.foundation.scheduler.api.rest.SchedulerApi:DELETE:deleteTask\"\n motif-acl-hidden=\"true\" \n [alignMode]=\"'end'\"\n [hasConfirmation]=\"true\"\n [confirmationTitle]=\"'Remove ?'\"\n [rowIndex]=\"rowIndex\" \n [columnIndex]=\"columnIndex\" \n [column]=\"column\" \n [commandIcon]=\"'wa-ico-no'\"\n [dataItem]=\"dataItem\"\n (commandConfirm)=\"onDeleteOKPressed(dataItem)\" \n >\n </wc-grid-editor-command>\n </ng-template>\n </kendo-grid-column>\n\n <div *kendoGridDetailTemplate=\"let dataItem\">\n <wa-scheduler-section-task-details [scheduledTask]=\"dataItem.name\"></wa-scheduler-section-task-details>\n </div>\n </kendo-grid>\n\n </div>\n\n</div>\n",
styles: [":host{display:flex;flex:1;flex-direction:column}:host ::ng-deep .grid-btn-editor.wc-table-delete-command{justify-content:center}:host ::ng-deep tr.k-grid-norecords.ng-star-inserted{text-align:left;display:contents}"]
}] }
];
/** @nocollapse */
SchedulerSectionComponent.ctorParameters = () => [
{ type: NGXLogger },
{ type: SchedulerService },
{ type: WCNotificationCenter }
];
SchedulerSectionComponent.propDecorators = {
_grid: [{ type: ViewChild, args: [GridComponent,] }]
};
SchedulerSectionComponent = tslib_1.__decorate([
PluginView('Scheduler', {
iconName: 'wa-ico-scheduler',
userData: {
acl: {
permissions: ['com.vipera.osgi.foundation.scheduler.api.rest.SchedulerApi:READ:getTaskList',
'com.vipera.osgi.foundation.scheduler.api.rest.SchedulerApi:READ:getTaskExecutionsList']
}
}
}),
tslib_1.__metadata("design:paramtypes", [NGXLogger,
SchedulerService,
WCNotificationCenter])
], SchedulerSectionComponent);
export { SchedulerSectionComponent };
if (false) {
/** @type {?} */
SchedulerSectionComponent.prototype._grid;
/** @type {?} */
SchedulerSectionComponent.prototype.scheduledTasksList;
/** @type {?} */
SchedulerSectionComponent.prototype.scheduledTaskExecutionsList;
/** @type {?} */
SchedulerSectionComponent.prototype.loading;
/** @type {?} */
SchedulerSectionComponent.prototype.statusConfirmationTitleProvider;
/**
* @type {?}
* @private
*/
SchedulerSectionComponent.prototype.logger;
/**
* @type {?}
* @private
*/
SchedulerSectionComponent.prototype.schedulerService;
/**
* @type {?}
* @private
*/
SchedulerSectionComponent.prototype.notificationCenter;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLXNlY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbW90aWYtd2ViLWFkbWluLWNvcmUvIiwic291cmNlcyI6WyJsaWIvc2VjdGlvbnMvU2NoZWR1bGVyL2NvbXBvbmVudHMvc2NoZWR1bGVyLXNlY3Rpb24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQW9CLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUUsT0FBTyxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7TUFHdkQsT0FBTyxHQUFHLG9CQUFvQjtJQWdCdkIseUJBQXlCLFNBQXpCLHlCQUF5Qjs7Ozs7O0lBdUJwQyxZQUFvQixNQUFpQixFQUMzQixnQkFBa0MsRUFDbEMsa0JBQXdDO1FBRjlCLFdBQU0sR0FBTixNQUFNLENBQVc7UUFDM0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQXNCOztRQXBCM0MsdUJBQWtCLEdBQXlCLEVBQUUsQ0FBQztRQUM5QyxnQ0FBMkIsR0FBd0MsRUFBRSxDQUFDO1FBTTdFLG9DQUErQixHQUFnQzs7Ozs7WUFDN0QsUUFBUSxDQUFDLE9BQU87Z0JBQ1osSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFDO29CQUNoQixPQUFPLFdBQVcsQ0FBQztpQkFDdEI7cUJBQU07b0JBQ0gsT0FBTyxVQUFVLENBQUM7aUJBQ3JCO1lBQ0wsQ0FBQztTQUNKLENBQUE7UUFRRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7OztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckIsQ0FBQzs7OztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUcsY0FBYyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7Ozs7SUFFTyxRQUFRO1FBQ2QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTOzs7O1FBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUN6RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsUUFBUSxDQUFDO1lBQ25DLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGtCQUFrQjs7OztZQUFFLFVBQVUsT0FBTztnQkFDbEQsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzVDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLENBQUMsRUFBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsQ0FBQzs7OztRQUFFLEtBQUssQ0FBQyxFQUFFO1lBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7OztJQUVNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7Ozs7O0lBRUQsaUJBQWlCLENBQUMsUUFBYTtRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVM7Ozs7UUFBQyxLQUFLLENBQUMsRUFBRTtZQUNoRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDM0IsSUFBSSxFQUFFLDRCQUE0QjtnQkFDbEMsS0FBSyxFQUFFLHVCQUF1QjtnQkFDOUIsT0FBTyxFQUFFLGtEQUFrRDtnQkFDM0QsSUFBSSxFQUFFLGdCQUFnQixDQUFDLE9BQU87YUFDakMsQ0FBQyxDQUFDO1FBRUgsQ0FBQzs7OztRQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDWCxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUMzQixJQUFJLEVBQUUsMEJBQTBCO2dCQUNoQyxLQUFLLEVBQUUsdUJBQXVCO2dCQUM5QixPQUFPLEVBQUUsMENBQTBDO2dCQUNuRCxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsS0FBSztnQkFDNUIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsQ0FBQztJQUNMLENBQUM7Ozs7O0lBRUQscUJBQXFCLENBQUMsUUFBYTtRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUN0RCxDQUFDOzs7O0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7Ozs7O0lBRUQscUJBQXFCLENBQUMsUUFBUTtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsa0NBQWtDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUQsQ0FBQzs7Ozs7OztJQUdPLGdCQUFnQixDQUFDLFFBQWUsRUFBRSxPQUFlO1FBQ3ZELElBQUksT0FBTyxFQUFDO1lBQ1YsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM1QjthQUFNO1lBQ0wsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUM1QjtJQUNILENBQUM7Ozs7OztJQUVPLFdBQVcsQ0FBQyxRQUFlO1FBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUzs7OztRQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzVELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO2dCQUMzQixJQUFJLEVBQUUsNkJBQTZCO2dCQUNuQyxLQUFLLEVBQUUsd0JBQXdCO2dCQUMvQixPQUFPLEVBQUUsbURBQW1EO2dCQUM1RCxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsT0FBTzthQUNqQyxDQUFDLENBQUM7UUFFSCxDQUFDOzs7O1FBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNYLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7Z0JBQzNCLElBQUksRUFBRSwyQkFBMkI7Z0JBQ2pDLEtBQUssRUFBRSx3QkFBd0I7Z0JBQy9CLE9BQU8sRUFBRSwyQ0FBMkM7Z0JBQ3BELElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLO2dCQUM1QixLQUFLLEVBQUUsS0FBSztnQkFDWixRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztRQUNMLENBQUMsRUFBQyxDQUFDO0lBQ0wsQ0FBQzs7Ozs7O0lBRU8sV0FBVyxDQUFDLFFBQWU7UUFDakMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxTQUFTOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUU7WUFDM0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7Z0JBQzNCLElBQUksRUFBRSw0QkFBNEI7Z0JBQ2xDLEtBQUssRUFBRSx1QkFBdUI7Z0JBQzlCLE9BQU8sRUFBRSxrREFBa0Q7Z0JBQzNELElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxPQUFPO2FBQ2pDLENBQUMsQ0FBQztRQUVILENBQUM7Ozs7UUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztnQkFDM0IsSUFBSSxFQUFFLDBCQUEwQjtnQkFDaEMsS0FBSyxFQUFFLHVCQUF1QjtnQkFDOUIsT0FBTyxFQUFFLDBDQUEwQztnQkFDbkQsSUFBSSxFQUFFLGdCQUFnQixDQUFDLEtBQUs7Z0JBQzVCLEtBQUssRUFBRSxLQUFLO2dCQUNaLFFBQVEsRUFBRSxJQUFJO2FBQ2YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDLENBQUM7SUFDTCxDQUFDO0NBRUYsQ0FBQTs7WUFyS0EsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxzQkFBc0I7Z0JBRWhDLHVtSkFBaUQ7O2FBQ2xEOzs7O1lBYlEsU0FBUztZQUdvQyxnQkFBZ0I7WUFEN0Qsb0JBQW9COzs7b0JBdUIxQixTQUFTLFNBQUMsYUFBYTs7QUFGYix5QkFBeUI7SUFUckMsVUFBVSxDQUFDLFdBQVcsRUFBRTtRQUN2QixRQUFRLEVBQUUsa0JBQWtCO1FBQzVCLFFBQVEsRUFBRTtZQUNOLEdBQUcsRUFBRTtnQkFDRCxXQUFXLEVBQUUsQ0FBQyw2RUFBNkU7b0JBQzdFLHVGQUF1RixDQUFDO2FBQ3pHO1NBQ0o7S0FDRixDQUFDOzZDQXdCNEIsU0FBUztRQUNULGdCQUFnQjtRQUNkLG9CQUFvQjtHQXpCdkMseUJBQXlCLENBdUpyQztTQXZKWSx5QkFBeUI7OztJQUVwQywwQ0FBK0M7O0lBRy9DLHVEQUFxRDs7SUFDckQsZ0VBQTZFOztJQUc3RSw0Q0FBaUI7O0lBR2pCLG9FQVFEOzs7OztJQUdhLDJDQUF5Qjs7Ozs7SUFDbkMscURBQTBDOzs7OztJQUMxQyx1REFBZ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBJbnB1dCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQbHVnaW5WaWV3IH0gZnJvbSAnd2ViLWNvbnNvbGUtY29yZSc7XG5pbXBvcnQgeyBOR1hMb2dnZXIgfSBmcm9tICd3ZWItY29uc29sZS1jb3JlJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFdDTm90aWZpY2F0aW9uQ2VudGVyLCBOb3RpZmljYXRpb25UeXBlIH0gZnJvbSAnd2ViLWNvbnNvbGUtdWkta2l0JztcbmltcG9ydCB7IFNjaGVkdWxlZFRhc2ssIFNjaGVkdWxlZFRhc2tFeGVjdXRpb25FbnRpdHksIFNjaGVkdWxlclNlcnZpY2UgfSBmcm9tICdAd2EtbW90aWYtb3Blbi1hcGkvc2NoZWR1bGVyLXNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZENvbXBvbmVudCB9IGZyb20gJ0Bwcm9ncmVzcy9rZW5kby1hbmd1bGFyLWdyaWQnO1xuaW1wb3J0IHsgV0NHcmlkRWRpdG9yQ29tbWFuZHNDb25maWcsIFdDR3JpZEVkaXRvckNvbW1hbmRDb21wb25lbnRFdmVudCwgV0NDb25maXJtYXRpb25UaXRsZVByb3ZpZGVyIH0gZnJvbSAnd2ViLWNvbnNvbGUtdWkta2l0JztcblxuY29uc3QgTE9HX1RBRyA9ICdbU2NoZWR1bGVyU2VjdGlvbl0nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3YS1zY2hlZHVsZXItc2VjdGlvbicsXG4gIHN0eWxlVXJsczogWycuL3NjaGVkdWxlci1zZWN0aW9uLmNvbXBvbmVudC5zY3NzJ10sXG4gIHRlbXBsYXRlVXJsOiAnLi9zY2hlZHVsZXItc2VjdGlvbi5jb21wb25lbnQuaHRtbCdcbn0pXG5AUGx1Z2luVmlldygnU2NoZWR1bGVyJywge1xuICBpY29uTmFtZTogJ3dhLWljby1zY2hlZHVsZXInLFxuICB1c2VyRGF0YToge1xuICAgICAgYWNsOiB7XG4gICAgICAgICAgcGVybWlzc2lvbnM6IFsnY29tLnZpcGVyYS5vc2dpLmZvdW5kYXRpb24uc2NoZWR1bGVyLmFwaS5yZXN0LlNjaGVkdWxlckFwaTpSRUFEOmdldFRhc2tMaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb20udmlwZXJhLm9zZ2kuZm91bmRhdGlvbi5zY2hlZHVsZXIuYXBpLnJlc3QuU2NoZWR1bGVyQXBpOlJFQUQ6Z2V0VGFza0V4ZWN1dGlvbnNMaXN0J11cbiAgICAgIH1cbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBTY2hlZHVsZXJTZWN0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoR3JpZENvbXBvbmVudCkgX2dyaWQ6IEdyaWRDb21wb25lbnQ7XG5cbiAgLy9EYXRhXG4gIHB1YmxpYyBzY2hlZHVsZWRUYXNrc0xpc3Q6IEFycmF5PFNjaGVkdWxlZFRhc2s+ID0gW107XG4gIHB1YmxpYyBzY2hlZHVsZWRUYXNrRXhlY3V0aW9uc0xpc3Q6IEFycmF5PFNjaGVkdWxlZFRhc2tFeGVjdXRpb25FbnRpdHk+ID0gW107XG5cbiAgLy9HcmlkIE9wdGlvbnNcbiAgbG9hZGluZzogYm9vbGVhbjtcblxuXG4gIHN0YXR1c0NvbmZpcm1hdGlvblRpdGxlUHJvdmlkZXI6IFdDQ29uZmlybWF0aW9uVGl0bGVQcm92aWRlciA9IHtcbiAgICBnZXRUaXRsZShyb3dEYXRhKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHJvd0RhdGEuZW5hYmxlZCl7XG4gICAgICAgICAgICByZXR1cm4gXCJEaXNhYmxlID9cIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBcIkVuYWJsZSA/XCI7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGxvZ2dlcjogTkdYTG9nZ2VyLFxuICAgIHByaXZhdGUgc2NoZWR1bGVyU2VydmljZTogU2NoZWR1bGVyU2VydmljZSxcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvbkNlbnRlcjogV0NOb3RpZmljYXRpb25DZW50ZXJcbiAgICAgICAgKSB7XG5cbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnT3BlbmluZy4uLicpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5sb2dnZXIuZGVidWcoTE9HX1RBRywgJ0luaXRpYWxpemluZy4uLicpO1xuICAgIHRoaXMucmVmcmVzaERhdGEoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcgLCAnbmdPbkRlc3Ryb3kgJyk7XG4gIH1cblxuICBwcml2YXRlIGxvYWREYXRhKCkge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdsb2FkRGF0YScpO1xuXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnNjaGVkdWxlclNlcnZpY2UuZ2V0VGFza0xpc3QoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnNjaGVkdWxlZFRhc2tzTGlzdCA9IHJlc3BvbnNlO1xuICAgICAgXy5mb3JFYWNoKHRoaXMuc2NoZWR1bGVkVGFza3NMaXN0LCBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNyZWF0ZWQgPSBuZXcgRGF0ZShlbGVtZW50LmNyZWF0ZWQpO1xuICAgICAgICBlbGVtZW50LnVwZGF0ZWQgPSBuZXcgRGF0ZShlbGVtZW50LnVwZGF0ZWQpO1xuICAgICAgfSk7XG4gICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgdGhpcy5sb2dnZXIuZXJyb3IoTE9HX1RBRywgJ2dldFRhc2tMaXN0IGZhaWxlZDogJywgZXJyb3IpO1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkRGF0YSgpO1xuICB9XG5cbiAgb25EZWxldGVPS1ByZXNzZWQoZGF0YUl0ZW06IGFueSk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdvbkRlbGV0ZU9LUHJlc3NlZCB0b2tlbj0nLCBkYXRhSXRlbS5uYW1lKTtcblxuICAgIHRoaXMuc2NoZWR1bGVyU2VydmljZS5kZWxldGVUYXNrKGRhdGFJdGVtLm5hbWUpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgbmFtZTogJ0RlbGV0ZVNjaGVkdWxlZFRhc2tTdWNjZXNzJyxcbiAgICAgICAgdGl0bGU6ICdEZWxldGUgU2NoZWR1bGVkIFRhc2snLFxuICAgICAgICBtZXNzYWdlOiAnVGhlIFNjaGVkdWxlZCBUYXNrIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZW1vdmVkJyxcbiAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgfSk7XG5cbiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICBuYW1lOiAnRGVsZXRlU2NoZWR1bGVkVGFza0Vycm9yJyxcbiAgICAgICAgdGl0bGU6ICdEZWxldGUgU2NoZWR1bGVkIFRhc2snLFxuICAgICAgICBtZXNzYWdlOiAnVGhlIFNjaGVkdWxlZCBUYXNrIGNvdWxkIG5vdCBiZSByZW1vdmVkLicsXG4gICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuRXJyb3IsXG4gICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgb25EZWxldGVDYW5jZWxQcmVzc2VkKGRhdGFJdGVtOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmxvZ2dlci5kZWJ1ZyhMT0dfVEFHLCAnb25EZWxldGVDYW5jZWxQcmVzc2VkJyk7XG4gIH1cblxuICBvblJlZnJlc2hDbGlja2VkKCkge1xuICAgIHRoaXMucmVmcmVzaERhdGEoKTtcbiAgfVxuXG4gIG9uU3RhdHVzVG9nZ2xlUHJlc3NlZChkYXRhSXRlbSk6IHZvaWQge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKExPR19UQUcsICdvblN0YXR1c1RvZ2dsZVByZXNzZWQgZGF0YUl0ZW06ICcsIGRhdGFJdGVtKTtcbiAgICB0aGlzLmNoYW5nZVRhc2tTdGF0dXMoZGF0YUl0ZW0ubmFtZSwgIWRhdGFJdGVtLmVuYWJsZWQpO1xuICB9XG5cblxuICBwcml2YXRlIGNoYW5nZVRhc2tTdGF0dXModGFza05hbWU6c3RyaW5nLCBlbmFibGVkOmJvb2xlYW4pIHtcbiAgICBpZiAoZW5hYmxlZCl7XG4gICAgICB0aGlzLmVuYWJsZWRUYXNrKHRhc2tOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlVGFzayh0YXNrTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkaXNhYmxlVGFzayh0YXNrTmFtZTpzdHJpbmcpe1xuICAgIHRoaXMuc2NoZWR1bGVyU2VydmljZS5kaXNhYmxlVGFzayh0YXNrTmFtZSkuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgIHRoaXMucmVmcmVzaERhdGEoKTtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICBuYW1lOiAnRGlzYWJsZVNjaGVkdWxlZFRhc2tTdWNjZXNzJyxcbiAgICAgICAgdGl0bGU6ICdEaXNhYmxlIFNjaGVkdWxlZCBUYXNrJyxcbiAgICAgICAgbWVzc2FnZTogJ1RoZSBTY2hlZHVsZWQgVGFzayBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZGlzYWJsZWQnLFxuICAgICAgICB0eXBlOiBOb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3NcbiAgICB9KTtcblxuICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgdGhpcy5ub3RpZmljYXRpb25DZW50ZXIucG9zdCh7XG4gICAgICAgIG5hbWU6ICdEaXNhYmxlU2NoZWR1bGVkVGFza0Vycm9yJyxcbiAgICAgICAgdGl0bGU6ICdEaXNhYmxlIFNjaGVkdWxlZCBUYXNrJyxcbiAgICAgICAgbWVzc2FnZTogJ1RoZSBTY2hlZHVsZWQgVGFzayBjb3VsZCBub3QgYmUgZGlzYWJsZWQuJyxcbiAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5FcnJvcixcbiAgICAgICAgZXJyb3I6IGVycm9yLFxuICAgICAgICBjbG9zYWJsZTogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGVuYWJsZWRUYXNrKHRhc2tOYW1lOnN0cmluZyl7XG4gICAgdGhpcy5zY2hlZHVsZXJTZXJ2aWNlLmVuYWJsZVRhc2sodGFza05hbWUpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLnJlZnJlc2hEYXRhKCk7XG4gICAgICB0aGlzLm5vdGlmaWNhdGlvbkNlbnRlci5wb3N0KHtcbiAgICAgICAgbmFtZTogJ0VuYWJsZVNjaGVkdWxlZFRhc2tTdWNjZXNzJyxcbiAgICAgICAgdGl0bGU6ICdFbmFibGUgU2NoZWR1bGVkIFRhc2snLFxuICAgICAgICBtZXNzYWdlOiAnVGhlIFNjaGVkdWxlZCBUYXNrIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBlbmFibGVkJyxcbiAgICAgICAgdHlwZTogTm90aWZpY2F0aW9uVHlwZS5TdWNjZXNzXG4gICAgfSk7XG5cbiAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgIHRoaXMubm90aWZpY2F0aW9uQ2VudGVyLnBvc3Qoe1xuICAgICAgICBuYW1lOiAnRW5hYmxlU2NoZWR1bGVkVGFza0Vycm9yJyxcbiAgICAgICAgdGl0bGU6ICdFbmFibGUgU2NoZWR1bGVkIFRhc2snLFxuICAgICAgICBtZXNzYWdlOiAnVGhlIFNjaGVkdWxlZCBUYXNrIGNvdWxkIG5vdCBiZSBlbmFibGVkLicsXG4gICAgICAgIHR5cGU6IE5vdGlmaWNhdGlvblR5cGUuRXJyb3IsXG4gICAgICAgIGVycm9yOiBlcnJvcixcbiAgICAgICAgY2xvc2FibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbn1cbiJdfQ==