sequential-workflow-designer-angular
Version:
Angular wrapper for Sequential Workflow Designer component.
274 lines • 37.6 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { Designer } from 'sequential-workflow-designer';
import * as i0 from "@angular/core";
export class DesignerComponent {
constructor(ngZone, applicationRef) {
this.ngZone = ngZone;
this.applicationRef = applicationRef;
this.onReady = new EventEmitter();
this.onDefinitionChanged = new EventEmitter();
this.onSelectedStepIdChanged = new EventEmitter();
this.onStepUnselectionBlocked = new EventEmitter();
this.onIsToolboxCollapsedChanged = new EventEmitter();
this.onIsEditorCollapsedChanged = new EventEmitter();
this.rootEditorProvider = (definition, context, isReadonly) => {
if (!this.rootEditor) {
throw new Error('Input "rootEditor" is not set');
}
if (typeof this.rootEditor === 'function') {
return this.rootEditor(definition, context, isReadonly);
}
return this.editorProvider(this.rootEditor, {
definition,
context,
isReadonly
});
};
this.stepEditorProvider = (step, context, definition, isReadonly) => {
if (!this.stepEditor) {
throw new Error('Input "stepEditor" is not set');
}
if (typeof this.stepEditor === 'function') {
return this.stepEditor(step, context, definition, isReadonly);
}
return this.editorProvider(this.stepEditor, {
step,
context,
definition,
isReadonly
});
};
}
ngAfterViewInit() {
this.attach();
}
ngOnChanges(changes) {
const isFirstChange = Object.keys(changes).every(key => changes[key].firstChange);
if (isFirstChange) {
return;
}
if (this.designer) {
const isSameDefinition = !changes['definition'] || changes['definition'].currentValue === this.designer.getDefinition();
if (isSameDefinition) {
const isReadonlyChange = changes['isReadonly'];
if (isReadonlyChange && isReadonlyChange.currentValue !== this.designer.isReadonly()) {
this.designer.setIsReadonly(isReadonlyChange.currentValue);
}
const selectedStepIdChange = changes['selectedStepId'];
if (selectedStepIdChange && selectedStepIdChange.currentValue !== this.designer.getSelectedStepId()) {
if (selectedStepIdChange.currentValue) {
this.designer.selectStepById(selectedStepIdChange.currentValue);
}
else {
this.designer.clearSelectedStep();
}
}
const isToolboxCollapsedChange = changes['isToolboxCollapsed'];
if (isToolboxCollapsedChange && isToolboxCollapsedChange.currentValue !== this.designer.isToolboxCollapsed()) {
this.designer.setIsToolboxCollapsed(isToolboxCollapsedChange.currentValue);
}
const isEditorCollapsedChange = changes['isEditorCollapsed'];
if (isEditorCollapsedChange && isEditorCollapsedChange.currentValue !== this.designer.isEditorCollapsed()) {
this.designer.setIsEditorCollapsed(isEditorCollapsedChange.currentValue);
}
// The same reference of the definition = no change.
return;
}
}
this.attach();
}
ngOnDestroy() {
if (this.lastEmbeddedView) {
this.applicationRef.detachView(this.lastEmbeddedView);
this.lastEmbeddedView.destroy();
}
}
attach() {
this.ngZone.runOutsideAngular(() => {
if (!this.placeholder) {
return;
}
if (!this.definition) {
throw new Error('Input "definition" is not set');
}
if (!this.stepsConfiguration) {
throw new Error('Input "stepsConfiguration" is not set');
}
if (this.toolboxConfiguration === undefined) {
throw new Error('Input "toolboxConfiguration" is not set');
}
if (this.controlBar === undefined) {
throw new Error('Input "controlBar" is not set');
}
if (this.designer) {
this.designer.destroy();
this.designer = undefined;
}
let customActionHandler = this.customActionHandler;
if (customActionHandler) {
const cah = customActionHandler;
customActionHandler = (action, step, sequence, context) => {
this.ngZone.run(() => cah(action, step, sequence, context));
};
}
const designer = Designer.create(this.placeholder.nativeElement, this.definition, {
theme: this.theme,
undoStackSize: this.undoStackSize,
editors: this.areEditorsHidden
? false
: {
isCollapsed: this.isEditorCollapsed,
rootEditorProvider: this.rootEditorProvider,
stepEditorProvider: this.stepEditorProvider
},
steps: this.stepsConfiguration,
validator: this.validatorConfiguration,
placeholder: this.placeholderConfiguration,
toolbox: this.toolboxConfiguration
? {
isCollapsed: this.isToolboxCollapsed,
...this.toolboxConfiguration
}
: false,
controlBar: this.controlBar,
contextMenu: this.contextMenu,
keyboard: this.keyboard,
preferenceStorage: this.preferenceStorage,
extensions: this.extensions,
isReadonly: this.isReadonly,
i18n: this.i18n,
uidGenerator: this.uidGenerator,
customActionHandler
});
designer.onReady.subscribe(() => {
this.ngZone.run(() => this.onReady.emit(designer));
});
designer.onDefinitionChanged.subscribe(definition => {
this.ngZone.run(() => this.onDefinitionChanged.emit(definition));
});
designer.onSelectedStepIdChanged.subscribe(stepId => {
this.ngZone.run(() => this.onSelectedStepIdChanged.emit(stepId));
});
designer.onStepUnselectionBlocked.subscribe(targetStepId => {
this.ngZone.run(() => this.onStepUnselectionBlocked.emit(targetStepId));
});
designer.onIsToolboxCollapsedChanged.subscribe(isCollapsed => {
this.ngZone.run(() => this.onIsToolboxCollapsedChanged.emit(isCollapsed));
});
designer.onIsEditorCollapsedChanged.subscribe(isCollapsed => {
this.ngZone.run(() => this.onIsEditorCollapsedChanged.emit(isCollapsed));
});
this.designer = designer;
if (this.selectedStepId) {
this.designer.selectStepById(this.selectedStepId);
}
});
}
editorProvider(templateRef, editor) {
return this.ngZone.run(() => {
if (this.lastEmbeddedView) {
this.applicationRef.detachView(this.lastEmbeddedView);
this.lastEmbeddedView.destroy();
this.lastEmbeddedView = undefined;
}
this.lastEmbeddedView = templateRef.createEmbeddedView({
$implicit: editor
});
this.applicationRef.attachView(this.lastEmbeddedView);
const container = document.createElement('div');
container.className = 'sqd-editor-angular';
for (const node of this.lastEmbeddedView.rootNodes) {
container.appendChild(node);
}
return container;
});
}
}
DesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DesignerComponent, deps: [{ token: i0.NgZone }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Component });
DesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: DesignerComponent, selector: "sqd-designer", inputs: { theme: "theme", undoStackSize: "undoStackSize", definition: "definition", stepsConfiguration: "stepsConfiguration", validatorConfiguration: "validatorConfiguration", placeholderConfiguration: "placeholderConfiguration", toolboxConfiguration: "toolboxConfiguration", controlBar: "controlBar", contextMenu: "contextMenu", keyboard: "keyboard", preferenceStorage: "preferenceStorage", extensions: "extensions", i18n: "i18n", customActionHandler: "customActionHandler", isReadonly: "isReadonly", selectedStepId: "selectedStepId", uidGenerator: "uidGenerator", isToolboxCollapsed: "isToolboxCollapsed", isEditorCollapsed: "isEditorCollapsed", areEditorsHidden: "areEditorsHidden", rootEditor: "rootEditor", stepEditor: "stepEditor" }, outputs: { onReady: "onReady", onDefinitionChanged: "onDefinitionChanged", onSelectedStepIdChanged: "onSelectedStepIdChanged", onStepUnselectionBlocked: "onStepUnselectionBlocked", onIsToolboxCollapsedChanged: "onIsToolboxCollapsedChanged", onIsEditorCollapsedChanged: "onIsEditorCollapsedChanged" }, viewQueries: [{ propertyName: "placeholder", first: true, predicate: ["placeholder"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: DesignerComponent, decorators: [{
type: Component,
args: [{ selector: 'sqd-designer', template: "<div #placeholder class=\"sqd-designer-angular\"></div>\n" }]
}], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ApplicationRef }]; }, propDecorators: { placeholder: [{
type: ViewChild,
args: ['placeholder', { static: true }]
}], theme: [{
type: Input,
args: ['theme']
}], undoStackSize: [{
type: Input,
args: ['undoStackSize']
}], definition: [{
type: Input,
args: ['definition']
}], stepsConfiguration: [{
type: Input,
args: ['stepsConfiguration']
}], validatorConfiguration: [{
type: Input,
args: ['validatorConfiguration']
}], placeholderConfiguration: [{
type: Input,
args: ['placeholderConfiguration']
}], toolboxConfiguration: [{
type: Input,
args: ['toolboxConfiguration']
}], controlBar: [{
type: Input,
args: ['controlBar']
}], contextMenu: [{
type: Input,
args: ['contextMenu']
}], keyboard: [{
type: Input,
args: ['keyboard']
}], preferenceStorage: [{
type: Input,
args: ['preferenceStorage']
}], extensions: [{
type: Input,
args: ['extensions']
}], i18n: [{
type: Input,
args: ['i18n']
}], customActionHandler: [{
type: Input,
args: ['customActionHandler']
}], isReadonly: [{
type: Input,
args: ['isReadonly']
}], selectedStepId: [{
type: Input,
args: ['selectedStepId']
}], uidGenerator: [{
type: Input,
args: ['uidGenerator']
}], isToolboxCollapsed: [{
type: Input,
args: ['isToolboxCollapsed']
}], isEditorCollapsed: [{
type: Input,
args: ['isEditorCollapsed']
}], areEditorsHidden: [{
type: Input,
args: ['areEditorsHidden']
}], rootEditor: [{
type: Input,
args: ['rootEditor']
}], stepEditor: [{
type: Input,
args: ['stepEditor']
}], onReady: [{
type: Output
}], onDefinitionChanged: [{
type: Output
}], onSelectedStepIdChanged: [{
type: Output
}], onStepUnselectionBlocked: [{
type: Output
}], onIsToolboxCollapsedChanged: [{
type: Output
}], onIsEditorCollapsedChanged: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzaWduZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vZGVzaWduZXIvc3JjL2Rlc2lnbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uL2Rlc2lnbmVyL3NyYy9kZXNpZ25lci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBR04sU0FBUyxFQUdULFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxFQUdOLFNBQVMsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBR04sUUFBUSxFQWVSLE1BQU0sOEJBQThCLENBQUM7O0FBcUJ0QyxNQUFNLE9BQU8saUJBQWlCO0lBa0U3QixZQUNrQixNQUFjLEVBQ2QsY0FBOEI7UUFEOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQWRoQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUV2Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBRXJELDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBRTVELDZCQUF3QixHQUFHLElBQUksWUFBWSxFQUFpQixDQUFDO1FBRTdELGdDQUEyQixHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFFMUQsK0JBQTBCLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQWlKeEQsdUJBQWtCLEdBQUcsQ0FBQyxVQUFzQixFQUFFLE9BQTBCLEVBQUUsVUFBbUIsRUFBRSxFQUFFO1lBQ2pILElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7YUFDakQ7WUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUU7Z0JBQzFDLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFD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QkFEaEIsS0FBSzt1QkFBQyxZQUFZO2dCQUdaLElBQUk7c0JBRFYsS0FBSzt1QkFBQyxNQUFNO2dCQUdOLG1CQUFtQjtzQkFEekIsS0FBSzt1QkFBQyxxQkFBcUI7Z0JBR3JCLFVBQVU7c0JBRGhCLEtBQUs7dUJBQUMsWUFBWTtnQkFHWixjQUFjO3NCQURwQixLQUFLO3VCQUFDLGdCQUFnQjtnQkFHaEIsWUFBWTtzQkFEbEIsS0FBSzt1QkFBQyxjQUFjO2dCQUdkLGtCQUFrQjtzQkFEeEIsS0FBSzt1QkFBQyxvQkFBb0I7Z0JBR3BCLGlCQUFpQjtzQkFEdkIsS0FBSzt1QkFBQyxtQkFBbUI7Z0JBSW5CLGdCQUFnQjtzQkFEdEIsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBR2xCLFVBQVU7c0JBRGhCLEtBQUs7dUJBQUMsWUFBWTtnQkFHWixVQUFVO3NCQURoQixLQUFLO3VCQUFDLFlBQVk7Z0JBSUgsT0FBTztzQkFEdEIsTUFBTTtnQkFHUyxtQkFBbUI7c0JBRGxDLE1BQU07Z0JBR1MsdUJBQXVCO3NCQUR0QyxNQUFNO2dCQUdTLHdCQUF3QjtzQkFEdkMsTUFBTTtnQkFHUywyQkFBMkI7c0JBRDFDLE1BQU07Z0JBR1MsMEJBQTBCO3NCQUR6QyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0QWZ0ZXJWaWV3SW5pdCxcblx0QXBwbGljYXRpb25SZWYsXG5cdENvbXBvbmVudCxcblx0RWxlbWVudFJlZixcblx0RW1iZWRkZWRWaWV3UmVmLFxuXHRFdmVudEVtaXR0ZXIsXG5cdElucHV0LFxuXHROZ1pvbmUsXG5cdE9uQ2hhbmdlcyxcblx0T25EZXN0cm95LFxuXHRPdXRwdXQsXG5cdFNpbXBsZUNoYW5nZXMsXG5cdFRlbXBsYXRlUmVmLFxuXHRWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuXHRDdXN0b21BY3Rpb25IYW5kbGVyLFxuXHREZWZpbml0aW9uLFxuXHREZXNpZ25lcixcblx0RGVzaWduZXJFeHRlbnNpb24sXG5cdFJvb3RFZGl0b3JDb250ZXh0LFxuXHRSb290RWRpdG9yUHJvdmlkZXIsXG5cdEtleWJvYXJkQ29uZmlndXJhdGlvbixcblx0U3RlcCxcblx0U3RlcEVkaXRvckNvbnRleHQsXG5cdFN0ZXBFZGl0b3JQcm92aWRlcixcblx0U3RlcHNDb25maWd1cmF0aW9uLFxuXHRUb29sYm94Q29uZmlndXJhdGlvbixcblx0VWlkR2VuZXJhdG9yLFxuXHRWYWxpZGF0b3JDb25maWd1cmF0aW9uLFxuXHRQbGFjZWhvbGRlckNvbmZpZ3VyYXRpb24sXG5cdEkxOG4sXG5cdFByZWZlcmVuY2VTdG9yYWdlXG59IGZyb20gJ3NlcXVlbnRpYWwtd29ya2Zsb3ctZGVzaWduZXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvb3RFZGl0b3JXcmFwcGVyIHtcblx0ZGVmaW5pdGlvbjogRGVmaW5pdGlvbjtcblx0Y29udGV4dDogUm9vdEVkaXRvckNvbnRleHQ7XG5cdGlzUmVhZG9ubHk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RlcEVkaXRvcldyYXBwZXIge1xuXHRzdGVwOiBTdGVwO1xuXHRkZWZpbml0aW9uOiBEZWZpbml0aW9uO1xuXHRjb250ZXh0OiBTdGVwRWRpdG9yQ29udGV4dDtcblx0aXNSZWFkb25seTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgQW5ndWxhclRvb2xib3hDb25maWd1cmF0aW9uID0gT21pdDxUb29sYm94Q29uZmlndXJhdGlvbiwgJ2lzQ29sbGFwc2VkJz47XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ3NxZC1kZXNpZ25lcicsXG5cdHRlbXBsYXRlVXJsOiAnLi9kZXNpZ25lci5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgRGVzaWduZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XG5cdHByaXZhdGUgZGVzaWduZXI/OiBEZXNpZ25lcjtcblx0cHJpdmF0ZSBsYXN0RW1iZWRkZWRWaWV3PzogRW1iZWRkZWRWaWV3UmVmPHVua25vd24+O1xuXG5cdEBWaWV3Q2hpbGQoJ3BsYWNlaG9sZGVyJywgeyBzdGF0aWM6IHRydWUgfSlcblx0cHJpdmF0ZSBwbGFjZWhvbGRlcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG5cdEBJbnB1dCgndGhlbWUnKVxuXHRwdWJsaWMgdGhlbWU/OiBzdHJpbmc7XG5cdEBJbnB1dCgndW5kb1N0YWNrU2l6ZScpXG5cdHB1YmxpYyB1bmRvU3RhY2tTaXplPzogbnVtYmVyO1xuXHRASW5wdXQoJ2RlZmluaXRpb24nKVxuXHRwdWJsaWMgZGVmaW5pdGlvbj86IERlZmluaXRpb247XG5cdEBJbnB1dCgnc3RlcHNDb25maWd1cmF0aW9uJylcblx0cHVibGljIHN0ZXBzQ29uZmlndXJhdGlvbj86IFN0ZXBzQ29uZmlndXJhdGlvbjtcblx0QElucHV0KCd2YWxpZGF0b3JDb25maWd1cmF0aW9uJylcblx0cHVibGljIHZhbGlkYXRvckNvbmZpZ3VyYXRpb24/OiBWYWxpZGF0b3JDb25maWd1cmF0aW9uO1xuXHRASW5wdXQoJ3BsYWNlaG9sZGVyQ29uZmlndXJhdGlvbicpXG5cdHB1YmxpYyBwbGFjZWhvbGRlckNvbmZpZ3VyYXRpb24/OiBQbGFjZWhvbGRlckNvbmZpZ3VyYXRpb247XG5cdEBJbnB1dCgndG9vbGJveENvbmZpZ3VyYXRpb24nKVxuXHRwdWJsaWMgdG9vbGJveENvbmZpZ3VyYXRpb24/OiBBbmd1bGFyVG9vbGJveENvbmZpZ3VyYXRpb24gfCBmYWxzZTtcblx0QElucHV0KCdjb250cm9sQmFyJylcblx0cHVibGljIGNvbnRyb2xCYXI/OiBib29sZWFuO1xuXHRASW5wdXQoJ2NvbnRleHRNZW51Jylcblx0cHVibGljIGNvbnRleHRNZW51PzogYm9vbGVhbjtcblx0QElucHV0KCdrZXlib2FyZCcpXG5cdHB1YmxpYyBrZXlib2FyZD86IGJvb2xlYW4gfCBLZXlib2FyZENvbmZpZ3VyYXRpb247XG5cdEBJbnB1dCgncHJlZmVyZW5jZVN0b3JhZ2UnKVxuXHRwdWJsaWMgcHJlZmVyZW5jZVN0b3JhZ2U/OiBQcmVmZXJlbmNlU3RvcmFnZTtcblx0QElucHV0KCdleHRlbnNpb25zJylcblx0cHVibGljIGV4dGVuc2lvbnM/OiBEZXNpZ25lckV4dGVuc2lvbltdO1xuXHRASW5wdXQoJ2kxOG4nKVxuXHRwdWJsaWMgaTE4bj86IEkxOG47XG5cdEBJbnB1dCgnY3VzdG9tQWN0aW9uSGFuZGxlcicpXG5cdHB1YmxpYyBjdXN0b21BY3Rpb25IYW5kbGVyPzogQ3VzdG9tQWN0aW9uSGFuZGxlcjtcblx0QElucHV0KCdpc1JlYWRvbmx5Jylcblx0cHVibGljIGlzUmVhZG9ubHk/OiBib29sZWFuO1xuXHRASW5wdXQoJ3NlbGVjdGVkU3RlcElkJylcblx0cHVibGljIHNlbGVjdGVkU3RlcElkPzogc3RyaW5nIHwgbnVsbDtcblx0QElucHV0KCd1aWRHZW5lcmF0b3InKVxuXHRwdWJsaWMgdWlkR2VuZXJhdG9yPzogVWlkR2VuZXJhdG9yO1xuXHRASW5wdXQoJ2lzVG9vbGJveENvbGxhcHNlZCcpXG5cdHB1YmxpYyBpc1Rvb2xib3hDb2xsYXBzZWQ/OiBib29sZWFuO1xuXHRASW5wdXQoJ2lzRWRpdG9yQ29sbGFwc2VkJylcblx0cHVibGljIGlzRWRpdG9yQ29sbGFwc2VkPzogYm9vbGVhbjtcblxuXHRASW5wdXQoJ2FyZUVkaXRvcnNIaWRkZW4nKVxuXHRwdWJsaWMgYXJlRWRpdG9yc0hpZGRlbj86IGJvb2xlYW47XG5cdEBJbnB1dCgncm9vdEVkaXRvcicpXG5cdHB1YmxpYyByb290RWRpdG9yPzogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBSb290RWRpdG9yUHJvdmlkZXI7XG5cdEBJbnB1dCgnc3RlcEVkaXRvcicpXG5cdHB1YmxpYyBzdGVwRWRpdG9yPzogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCBTdGVwRWRpdG9yUHJvdmlkZXI7XG5cblx0QE91dHB1dCgpXG5cdHB1YmxpYyByZWFkb25seSBvblJlYWR5ID0gbmV3IEV2ZW50RW1pdHRlcjxEZXNpZ25lcj4oKTtcblx0QE91dHB1dCgpXG5cdHB1YmxpYyByZWFkb25seSBvbkRlZmluaXRpb25DaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxEZWZpbml0aW9uPigpO1xuXHRAT3V0cHV0KClcblx0cHVibGljIHJlYWRvbmx5IG9uU2VsZWN0ZWRTdGVwSWRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmcgfCBudWxsPigpO1xuXHRAT3V0cHV0KClcblx0cHVibGljIHJlYWRvbmx5IG9uU3RlcFVuc2VsZWN0aW9uQmxvY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nIHwgbnVsbD4oKTtcblx0QE91dHB1dCgpXG5cdHB1YmxpYyByZWFkb25seSBvbklzVG9vbGJveENvbGxhcHNlZENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cdEBPdXRwdXQoKVxuXHRwdWJsaWMgcmVhZG9ubHkgb25Jc0VkaXRvckNvbGxhcHNlZENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgbmdab25lOiBOZ1pvbmUsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBhcHBsaWNhdGlvblJlZjogQXBwbGljYXRpb25SZWZcblx0KSB7fVxuXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKSB7XG5cdFx0dGhpcy5hdHRhY2goKTtcblx0fVxuXG5cdHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG5cdFx0Y29uc3QgaXNGaXJzdENoYW5nZSA9IE9iamVjdC5rZXlzKGNoYW5nZXMpLmV2ZXJ5KGtleSA9PiBjaGFuZ2VzW2tleV0uZmlyc3RDaGFuZ2UpO1xuXHRcdGlmIChpc0ZpcnN0Q2hhbmdlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuZGVzaWduZXIpIHtcblx0XHRcdGNvbnN0IGlzU2FtZURlZmluaXRpb24gPSAhY2hhbmdlc1snZGVmaW5pdGlvbiddIHx8IGNoYW5nZXNbJ2RlZmluaXRpb24nXS5jdXJyZW50VmFsdWUgPT09IHRoaXMuZGVzaWduZXIuZ2V0RGVmaW5pdGlvbigpO1xuXHRcdFx0aWYgKGlzU2FtZURlZmluaXRpb24pIHtcblx0XHRcdFx0Y29uc3QgaXNSZWFkb25seUNoYW5nZSA9IGNoYW5nZXNbJ2lzUmVhZG9ubHknXTtcblx0XHRcdFx0aWYgKGlzUmVhZG9ubHlDaGFuZ2UgJiYgaXNSZWFkb25seUNoYW5nZS5jdXJyZW50VmFsdWUgIT09IHRoaXMuZGVzaWduZXIuaXNSZWFkb25seSgpKSB7XG5cdFx0XHRcdFx0dGhpcy5kZXNpZ25lci5zZXRJc1JlYWRvbmx5KGlzUmVhZG9ubHlDaGFuZ2UuY3VycmVudFZhbHVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHNlbGVjdGVkU3RlcElkQ2hhbmdlID0gY2hhbmdlc1snc2VsZWN0ZWRTdGVwSWQnXTtcblx0XHRcdFx0aWYgKHNlbGVjdGVkU3RlcElkQ2hhbmdlICYmIHNlbGVjdGVkU3RlcElkQ2hhbmdlLmN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5kZXNpZ25lci5nZXRTZWxlY3RlZFN0ZXBJZCgpKSB7XG5cdFx0XHRcdFx0aWYgKHNlbGVjdGVkU3RlcElkQ2hhbmdlLmN1cnJlbnRWYWx1ZSkge1xuXHRcdFx0XHRcdFx0dGhpcy5kZXNpZ25lci5zZWxlY3RTdGVwQnlJZChzZWxlY3RlZFN0ZXBJZENoYW5nZS5jdXJyZW50VmFsdWUpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlc2lnbmVyLmNsZWFyU2VsZWN0ZWRTdGVwKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaXNUb29sYm94Q29sbGFwc2VkQ2hhbmdlID0gY2hhbmdlc1snaXNUb29sYm94Q29sbGFwc2VkJ107XG5cdFx0XHRcdGlmIChpc1Rvb2xib3hDb2xsYXBzZWRDaGFuZ2UgJiYgaXNUb29sYm94Q29sbGFwc2VkQ2hhbmdlLmN1cnJlbnRWYWx1ZSAhPT0gdGhpcy5kZXNpZ25lci5pc1Rvb2xib3hDb2xsYXBzZWQoKSkge1xuXHRcdFx0XHRcdHRoaXMuZGVzaWduZXIuc2V0SXNUb29sYm94Q29sbGFwc2VkKGlzVG9vbGJveENvbGxhcHNlZENoYW5nZS5jdXJyZW50VmFsdWUpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgaXNFZGl0b3JDb2xsYXBzZWRDaGFuZ2UgPSBjaGFuZ2VzWydpc0VkaXRvckNvbGxhcHNlZCddO1xuXHRcdFx0XHRpZiAoaXNFZGl0b3JDb2xsYXBzZWRDaGFuZ2UgJiYgaXNFZGl0b3JDb2xsYXBzZWRDaGFuZ2UuY3VycmVudFZhbHVlICE9PSB0aGlzLmRlc2lnbmVyLmlzRWRpdG9yQ29sbGFwc2VkKCkpIHtcblx0XHRcdFx0XHR0aGlzLmRlc2lnbmVyLnNldElzRWRpdG9yQ29sbGFwc2VkKGlzRWRpdG9yQ29sbGFwc2VkQ2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUaGUgc2FtZSByZWZlcmVuY2Ugb2YgdGhlIGRlZmluaXRpb24gPSBubyBjaGFuZ2UuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmF0dGFjaCgpO1xuXHR9XG5cblx0cHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLmxhc3RFbWJlZGRlZFZpZXcpIHtcblx0XHRcdHRoaXMuYXBwbGljYXRpb25SZWYuZGV0YWNoVmlldyh0aGlzLmxhc3RFbWJlZGRlZFZpZXcpO1xuXHRcdFx0dGhpcy5sYXN0RW1iZWRkZWRWaWV3LmRlc3Ryb3koKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGF0dGFjaCgpIHtcblx0XHR0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG5cdFx0XHRpZiAoIXRoaXMucGxhY2Vob2xkZXIpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCF0aGlzLmRlZmluaXRpb24pIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnB1dCBcImRlZmluaXRpb25cIiBpcyBub3Qgc2V0Jyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXRoaXMuc3RlcHNDb25maWd1cmF0aW9uKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignSW5wdXQgXCJzdGVwc0NvbmZpZ3VyYXRpb25cIiBpcyBub3Qgc2V0Jyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy50b29sYm94Q29uZmlndXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignSW5wdXQgXCJ0b29sYm94Q29uZmlndXJhdGlvblwiIGlzIG5vdCBzZXQnKTtcblx0XHRcdH1cblx0XHRcdGlmICh0aGlzLmNvbnRyb2xCYXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IFwiY29udHJvbEJhclwiIGlzIG5vdCBzZXQnKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuZGVzaWduZXIpIHtcblx0XHRcdFx0dGhpcy5kZXNpZ25lci5kZXN0cm95KCk7XG5cdFx0XHRcdHRoaXMuZGVzaWduZXIgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBjdXN0b21BY3Rpb25IYW5kbGVyID0gdGhpcy5jdXN0b21BY3Rpb25IYW5kbGVyO1xuXHRcdFx0aWYgKGN1c3RvbUFjdGlvbkhhbmRsZXIpIHtcblx0XHRcdFx0Y29uc3QgY2FoID0gY3VzdG9tQWN0aW9uSGFuZGxlcjtcblx0XHRcdFx0Y3VzdG9tQWN0aW9uSGFuZGxlciA9IChhY3Rpb24sIHN0ZXAsIHNlcXVlbmNlLCBjb250ZXh0KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5uZ1pvbmUucnVuKCgpID0+IGNhaChhY3Rpb24sIHN0ZXAsIHNlcXVlbmNlLCBjb250ZXh0KSk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGRlc2lnbmVyID0gRGVzaWduZXIuY3JlYXRlKHRoaXMucGxhY2Vob2xkZXIubmF0aXZlRWxlbWVudCwgdGhpcy5kZWZpbml0aW9uLCB7XG5cdFx0XHRcdHRoZW1lOiB0aGlzLnRoZW1lLFxuXHRcdFx0XHR1bmRvU3RhY2tTaXplOiB0aGlzLnVuZG9TdGFja1NpemUsXG5cdFx0XHRcdGVkaXRvcnM6IHRoaXMuYXJlRWRpdG9yc0hpZGRlblxuXHRcdFx0XHRcdD8gZmFsc2Vcblx0XHRcdFx0XHQ6IHtcblx0XHRcdFx0XHRcdFx0aXNDb2xsYXBzZWQ6IHRoaXMuaXNFZGl0b3JDb2xsYXBzZWQsXG5cdFx0XHRcdFx0XHRcdHJvb3RFZGl0b3JQcm92aWRlcjogdGhpcy5yb290RWRpdG9yUHJvdmlkZXIsXG5cdFx0XHRcdFx0XHRcdHN0ZXBFZGl0b3JQcm92aWRlcjogdGhpcy5zdGVwRWRpdG9yUHJvdmlkZXJcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdHN0ZXBzOiB0aGlzLnN0ZXBzQ29uZmlndXJhdGlvbixcblx0XHRcdFx0dmFsaWRhdG9yOiB0aGlzLnZhbGlkYXRvckNvbmZpZ3VyYXRpb24sXG5cdFx0XHRcdHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyQ29uZmlndXJhdGlvbixcblx0XHRcdFx0dG9vbGJveDogdGhpcy50b29sYm94Q29uZmlndXJhdGlvblxuXHRcdFx0XHRcdD8ge1xuXHRcdFx0XHRcdFx0XHRpc0NvbGxhcHNlZDogdGhpcy5pc1Rvb2xib3hDb2xsYXBzZWQsXG5cdFx0XHRcdFx0XHRcdC4uLnRoaXMudG9vbGJveENvbmZpZ3VyYXRpb25cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHQ6IGZhbHNlLFxuXHRcdFx0XHRjb250cm9sQmFyOiB0aGlzLmNvbnRyb2xCYXIsXG5cdFx0XHRcdGNvbnRleHRNZW51OiB0aGlzLmNvbnRleHRNZW51LFxuXHRcdFx0XHRrZXlib2FyZDogdGhpcy5rZXlib2FyZCxcblx0XHRcdFx0cHJlZmVyZW5jZVN0b3JhZ2U6IHRoaXMucHJlZmVyZW5jZVN0b3JhZ2UsXG5cdFx0XHRcdGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9ucyxcblx0XHRcdFx0aXNSZWFkb25seTogdGhpcy5pc1JlYWRvbmx5LFxuXHRcdFx0XHRpMThuOiB0aGlzLmkxOG4sXG5cdFx0XHRcdHVpZEdlbmVyYXRvcjogdGhpcy51aWRHZW5lcmF0b3IsXG5cdFx0XHRcdGN1c3RvbUFjdGlvbkhhbmRsZXJcblx0XHRcdH0pO1xuXHRcdFx0ZGVzaWduZXIub25SZWFkeS5zdWJzY3JpYmUoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vblJlYWR5LmVtaXQoZGVzaWduZXIpKTtcblx0XHRcdH0pO1xuXHRcdFx0ZGVzaWduZXIub25EZWZpbml0aW9uQ2hhbmdlZC5zdWJzY3JpYmUoZGVmaW5pdGlvbiA9PiB7XG5cdFx0XHRcdHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uRGVmaW5pdGlvbkNoYW5nZWQuZW1pdChkZWZpbml0aW9uKSk7XG5cdFx0XHR9KTtcblx0XHRcdGRlc2lnbmVyLm9uU2VsZWN0ZWRTdGVwSWRDaGFuZ2VkLnN1YnNjcmliZShzdGVwSWQgPT4ge1xuXHRcdFx0XHR0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5vblNlbGVjdGVkU3RlcElkQ2hhbmdlZC5lbWl0KHN0ZXBJZCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRkZXNpZ25lci5vblN0ZXBVbnNlbGVjdGlvbkJsb2NrZWQuc3Vic2NyaWJlKHRhcmdldFN0ZXBJZCA9PiB7XG5cdFx0XHRcdHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLm9uU3RlcFVuc2VsZWN0aW9uQmxvY2tlZC5lbWl0KHRhcmdldFN0ZXBJZCkpO1xuXHRcdFx0fSk7XG5cdFx0XHRkZXNpZ25lci5vbklzVG9vbGJveENvbGxhcHNlZENoYW5nZWQuc3Vic2NyaWJlKGlzQ29sbGFwc2VkID0+IHtcblx0XHRcdFx0dGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMub25Jc1Rvb2xib3hDb2xsYXBzZWRDaGFuZ2VkLmVtaXQoaXNDb2xsYXBzZWQpKTtcblx0XHRcdH0pO1xuXHRcdFx0ZGVzaWduZXIub25Jc0VkaXRvckNvbGxhcHNlZENoYW5nZWQuc3Vic2NyaWJlKGlzQ29sbGFwc2VkID0+IHtcblx0XHRcdFx0dGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMub25Jc0VkaXRvckNvbGxhcHNlZENoYW5nZWQuZW1pdChpc0NvbGxhcHNlZCkpO1xuXHRcdFx0fSk7XG5cdFx0XHR0aGlzLmRlc2lnbmVyID0gZGVzaWduZXI7XG5cblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkU3RlcElkKSB7XG5cdFx0XHRcdHRoaXMuZGVzaWduZXIuc2VsZWN0U3RlcEJ5SWQodGhpcy5zZWxlY3RlZFN0ZXBJZCk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIHJlYWRvbmx5IHJvb3RFZGl0b3JQcm92aWRlciA9IChkZWZpbml0aW9uOiBEZWZpbml0aW9uLCBjb250ZXh0OiBSb290RWRpdG9yQ29udGV4dCwgaXNSZWFkb25seTogYm9vbGVhbikgPT4ge1xuXHRcdGlmICghdGhpcy5yb290RWRpdG9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IFwicm9vdEVkaXRvclwiIGlzIG5vdCBzZXQnKTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB0aGlzLnJvb3RFZGl0b3IgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdHJldHVybiB0aGlzLnJvb3RFZGl0b3IoZGVmaW5pdGlvbiwgY29udGV4dCwgaXNSZWFkb25seSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVkaXRvclByb3ZpZGVyPFJvb3RFZGl0b3JXcmFwcGVyPih0aGlzLnJvb3RFZGl0b3IsIHtcblx0XHRcdGRlZmluaXRpb24sXG5cdFx0XHRjb250ZXh0LFxuXHRcdFx0aXNSZWFkb25seVxuXHRcdH0pO1xuXHR9O1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgc3RlcEVkaXRvclByb3ZpZGVyID0gKHN0ZXA6IFN0ZXAsIGNvbnRleHQ6IFN0ZXBFZGl0b3JDb250ZXh0LCBkZWZpbml0aW9uOiBEZWZpbml0aW9uLCBpc1JlYWRvbmx5OiBib29sZWFuKSA9PiB7XG5cdFx0aWYgKCF0aGlzLnN0ZXBFZGl0b3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignSW5wdXQgXCJzdGVwRWRpdG9yXCIgaXMgbm90IHNldCcpO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHRoaXMuc3RlcEVkaXRvciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RlcEVkaXRvcihzdGVwLCBjb250ZXh0LCBkZWZpbml0aW9uLCBpc1JlYWRvbmx5KTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWRpdG9yUHJvdmlkZXI8U3RlcEVkaXRvcldyYXBwZXI+KHRoaXMuc3RlcEVkaXRvciwge1xuXHRcdFx0c3RlcCxcblx0XHRcdGNvbnRleHQsXG5cdFx0XHRkZWZpbml0aW9uLFxuXHRcdFx0aXNSZWFkb25seVxuXHRcdH0pO1xuXHR9O1xuXG5cdHByaXZhdGUgZWRpdG9yUHJvdmlkZXI8RT4odGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmPHVua25vd24+LCBlZGl0b3I6IEUpIHtcblx0XHRyZXR1cm4gdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcblx0XHRcdGlmICh0aGlzLmxhc3RFbWJlZGRlZFZpZXcpIHtcblx0XHRcdFx0dGhpcy5hcHBsaWNhdGlvblJlZi5kZXRhY2hWaWV3KHRoaXMubGFzdEVtYmVkZGVkVmlldyk7XG5cdFx0XHRcdHRoaXMubGFzdEVtYmVkZGVkVmlldy5kZXN0cm95KCk7XG5cdFx0XHRcdHRoaXMubGFzdEVtYmVkZGVkVmlldyA9IHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5sYXN0RW1iZWRkZWRWaWV3ID0gdGVtcGxhdGVSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHtcblx0XHRcdFx0JGltcGxpY2l0OiBlZGl0b3Jcblx0XHRcdH0pO1xuXHRcdFx0dGhpcy5hcHBsaWNhdGlvblJlZi5hdHRhY2hWaWV3KHRoaXMubGFzdEVtYmVkZGVkVmlldyk7XG5cblx0XHRcdGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXHRcdFx0Y29udGFpbmVyLmNsYXNzTmFtZSA9ICdzcWQtZWRpdG9yLWFuZ3VsYXInO1xuXHRcdFx0Zm9yIChjb25zdCBub2RlIG9mIHRoaXMubGFzdEVtYmVkZGVkVmlldy5yb290Tm9kZXMpIHtcblx0XHRcdFx0Y29udGFpbmVyLmFwcGVuZENoaWxkKG5vZGUpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGNvbnRhaW5lcjtcblx0XHR9KTtcblx0fVxufVxuIiwiPGRpdiAjcGxhY2Vob2xkZXIgY2xhc3M9XCJzcWQtZGVzaWduZXItYW5ndWxhclwiPjwvZGl2PlxuIl19