UNPKG

@rg-software/angular-archwizard

Version:
161 lines 19.3 kB
import { ContentChild, EventEmitter, HostBinding, Input, Output, Directive } from '@angular/core'; import { WizardStepSymbolDirective } from '../directives/wizard-step-symbol.directive'; import { WizardStepTitleDirective } from '../directives/wizard-step-title.directive'; import * as i0 from "@angular/core"; /** * Basic functionality every type of wizard step needs to provide * * @author Marc Arndt */ /* tslint:disable-next-line directive-class-suffix */ export class WizardStep { constructor() { /** * A symbol property, which contains an optional symbol for the step inside the navigation bar. * Takes effect when `stepSymbolTemplate` is not defined or null. */ this.navigationSymbol = { symbol: '' }; /** * A boolean describing if the wizard step is currently selected */ this.selected = false; /** * A boolean describing if the wizard step has been completed */ this.completed = false; /** * A boolean describing if the wizard step is shown as completed when the wizard is presented to the user * * Users will typically use `CompletedStepDirective` to set this flag */ this.initiallyCompleted = false; /** * A boolean describing if the wizard step is being edited after being competed * * This flag can only be true when `selected` is true. */ this.editing = false; /** * A boolean describing, if the wizard step should be selected by default, i.e. after the wizard has been initialized as the initial step */ this.defaultSelected = false; /** * A boolean describing if the wizard step is an optional step */ this.optional = false; /** * A function or boolean deciding, if this step can be entered */ this.canEnter = true; /** * A function or boolean deciding, if this step can be exited */ this.canExit = true; /** * This [[EventEmitter]] is called when the step is entered. * The bound method should be used to do initialization work. */ this.stepEnter = new EventEmitter(); /** * This [[EventEmitter]] is called when the step is exited. * The bound method can be used to do cleanup work. */ this.stepExit = new EventEmitter(); } /** * Returns true if this wizard step should be visible to the user. * If the step should be visible to the user false is returned, otherwise true */ get hidden() { return !this.selected; } /** * This method returns true, if this wizard step can be transitioned with a given direction. * Transitioned in this case means either entered or exited, depending on the given `condition` parameter. * * @param condition A condition variable, deciding if the step can be transitioned * @param direction The direction in which this step should be transitioned * @returns A [[Promise]] containing `true`, if this step can transitioned in the given direction * @throws An `Error` is thrown if `condition` is neither a function nor a boolean */ static canTransitionStep(condition, direction) { if (typeof (condition) === typeof (true)) { return Promise.resolve(condition); } else if (condition instanceof Function) { return Promise.resolve(condition(direction)); } else { return Promise.reject(new Error(`Input value '${condition}' is neither a boolean nor a function`)); } } /** * A function called when the step is entered * * @param direction The direction in which the step is entered */ enter(direction) { this.stepEnter.emit(direction); } /** * A function called when the step is exited * * @param direction The direction in which the step is exited */ exit(direction) { this.stepExit.emit(direction); } /** * This method returns true, if this wizard step can be entered from the given direction. * Because this method depends on the value `canEnter`, it will throw an error, if `canEnter` is neither a boolean * nor a function. * * @param direction The direction in which this step should be entered * @returns A [[Promise]] containing `true`, if the step can be entered in the given direction, false otherwise * @throws An `Error` is thrown if `anEnter` is neither a function nor a boolean */ canEnterStep(direction) { return WizardStep.canTransitionStep(this.canEnter, direction); } /** * This method returns true, if this wizard step can be exited into given direction. * Because this method depends on the value `canExit`, it will throw an error, if `canExit` is neither a boolean * nor a function. * * @param direction The direction in which this step should be left * @returns A [[Promise]] containing `true`, if the step can be exited in the given direction, false otherwise * @throws An `Error` is thrown if `canExit` is neither a function nor a boolean */ canExitStep(direction) { return WizardStep.canTransitionStep(this.canExit, direction); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: WizardStep, deps: [], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.1.0", type: WizardStep, inputs: { stepId: "stepId", stepTitle: "stepTitle", navigationSymbol: "navigationSymbol", canEnter: "canEnter", canExit: "canExit" }, outputs: { stepEnter: "stepEnter", stepExit: "stepExit" }, host: { properties: { "hidden": "this.hidden" } }, queries: [{ propertyName: "stepTitleTemplate", first: true, predicate: WizardStepTitleDirective, descendants: true }, { propertyName: "stepSymbolTemplate", first: true, predicate: WizardStepSymbolDirective, descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.0", ngImport: i0, type: WizardStep, decorators: [{ type: Directive }], propDecorators: { stepTitleTemplate: [{ type: ContentChild, args: [WizardStepTitleDirective] }], stepSymbolTemplate: [{ type: ContentChild, args: [WizardStepSymbolDirective] }], stepId: [{ type: Input }], stepTitle: [{ type: Input }], navigationSymbol: [{ type: Input }], canEnter: [{ type: Input }], canExit: [{ type: Input }], stepEnter: [{ type: Output }], stepExit: [{ type: Output }], hidden: [{ type: HostBinding, args: ['hidden'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLXN0ZXAuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi91dGlsL3dpemFyZC1zdGVwLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFDckYsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sMkNBQTJDLENBQUM7O0FBSW5GOzs7O0dBSUc7QUFFSCxxREFBcUQ7QUFDckQsTUFBTSxPQUFnQixVQUFVO0lBRmhDO1FBK0JFOzs7V0FHRztRQUVJLHFCQUFnQixHQUFxQixFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUV6RDs7V0FFRztRQUNJLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFeEI7O1dBRUc7UUFDSSxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRXpCOzs7O1dBSUc7UUFDSSx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFFbEM7Ozs7V0FJRztRQUNJLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFdkI7O1dBRUc7UUFDSSxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQUUvQjs7V0FFRztRQUNJLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFFeEI7O1dBRUc7UUFFSSxhQUFRLEdBQTZHLElBQUksQ0FBQztRQUVqSTs7V0FFRztRQUVJLFlBQU8sR0FBNkcsSUFBSSxDQUFDO1FBRWhJOzs7V0FHRztRQUVJLGNBQVMsR0FBa0MsSUFBSSxZQUFZLEVBQW1CLENBQUM7UUFFdEY7OztXQUdHO1FBRUksYUFBUSxHQUFrQyxJQUFJLFlBQVksRUFBbUIsQ0FBQztLQTRFdEY7SUExRUM7OztPQUdHO0lBQ0gsSUFDVyxNQUFNO1FBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDeEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssTUFBTSxDQUFDLGlCQUFpQixDQUFDLFNBRVMsRUFDVCxTQUEwQjtRQUN6RCxJQUFJLE9BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxPQUFNLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQW9CLENBQUMsQ0FBQztTQUM5QzthQUFNLElBQUksU0FBUyxZQUFZLFFBQVEsRUFBRTtZQUN4QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7U0FDOUM7YUFBTTtZQUNMLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsU0FBUyx1Q0FBdUMsQ0FBQyxDQUFDLENBQUM7U0FDcEc7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLEtBQUssQ0FBQyxTQUEwQjtRQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLElBQUksQ0FBQyxTQUEwQjtRQUNwQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxZQUFZLENBQUMsU0FBMEI7UUFDNUMsT0FBTyxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxXQUFXLENBQUMsU0FBMEI7UUFDM0MsT0FBTyxVQUFVLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDOzhHQXpLbUIsVUFBVTtrR0FBVixVQUFVLDZUQU1oQix3QkFBd0IscUZBT3hCLHlCQUF5Qjs7MkZBYm5CLFVBQVU7a0JBRi9CLFNBQVM7OEJBU0QsaUJBQWlCO3NCQUR2QixZQUFZO3VCQUFDLHdCQUF3QjtnQkFRL0Isa0JBQWtCO3NCQUR4QixZQUFZO3VCQUFDLHlCQUF5QjtnQkFPaEMsTUFBTTtzQkFEWixLQUFLO2dCQVFDLFNBQVM7c0JBRGYsS0FBSztnQkFRQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBeUNDLFFBQVE7c0JBRGQsS0FBSztnQkFPQyxPQUFPO3NCQURiLEtBQUs7Z0JBUUMsU0FBUztzQkFEZixNQUFNO2dCQVFBLFFBQVE7c0JBRGQsTUFBTTtnQkFRSSxNQUFNO3NCQURoQixXQUFXO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZW50Q2hpbGQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcsIElucHV0LCBPdXRwdXQsIERpcmVjdGl2ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtXaXphcmRTdGVwU3ltYm9sRGlyZWN0aXZlfSBmcm9tICcuLi9kaXJlY3RpdmVzL3dpemFyZC1zdGVwLXN5bWJvbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHtXaXphcmRTdGVwVGl0bGVEaXJlY3RpdmV9IGZyb20gJy4uL2RpcmVjdGl2ZXMvd2l6YXJkLXN0ZXAtdGl0bGUuZGlyZWN0aXZlJztcbmltcG9ydCB7TW92aW5nRGlyZWN0aW9ufSBmcm9tICcuL21vdmluZy1kaXJlY3Rpb24uZW51bSc7XG5pbXBvcnQge05hdmlnYXRpb25TeW1ib2x9IGZyb20gJy4vbmF2aWdhdGlvbi1zeW1ib2wuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBCYXNpYyBmdW5jdGlvbmFsaXR5IGV2ZXJ5IHR5cGUgb2Ygd2l6YXJkIHN0ZXAgbmVlZHMgdG8gcHJvdmlkZVxuICpcbiAqIEBhdXRob3IgTWFyYyBBcm5kdFxuICovXG5ARGlyZWN0aXZlKClcbi8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBkaXJlY3RpdmUtY2xhc3Mtc3VmZml4ICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgV2l6YXJkU3RlcCB7XG4gIC8qKlxuICAgKiBBIHN0ZXAgdGl0bGUgcHJvcGVydHksIHdoaWNoIGNvbnRhaW5zIHRoZSB2aXNpYmxlIGhlYWRlciB0aXRsZSBvZiB0aGUgc3RlcC5cbiAgICogVGhpcyB0aXRsZSBpcyB0aGVuIHNob3duIGluc2lkZSB0aGUgbmF2aWdhdGlvbiBiYXIuXG4gICAqIENvbXBhcmVkIHRvIGBzdGVwVGl0bGVgIHRoaXMgcHJvcGVydHkgY2FuIGNvbnRhaW4gYW55IGh0bWwgY29udGVudCBhbmQgbm90IG9ubHkgcGxhaW4gdGV4dFxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChXaXphcmRTdGVwVGl0bGVEaXJlY3RpdmUpXG4gIHB1YmxpYyBzdGVwVGl0bGVUZW1wbGF0ZTogV2l6YXJkU3RlcFRpdGxlRGlyZWN0aXZlO1xuXG4gIC8qKlxuICAgKiBBIHN0ZXAgc3ltYm9sIHByb3BlcnR5IHRoYXQsIGlmIGRlZmluZWQsIG92ZXJyaWRlcyBgbmF2aWdhdGlvblN5bWJvbGAuXG4gICAqIEFsbG93cyB0byBkaXNwbGF5IGFyYml0cmFyeSBjb250ZW50IGFzIGEgc3RlcCBzeW1ib2wgaW5zdGVhZCBvZiBwbGFpbiB0ZXh0LlxuICAgKi9cbiAgQENvbnRlbnRDaGlsZChXaXphcmRTdGVwU3ltYm9sRGlyZWN0aXZlKVxuICBwdWJsaWMgc3RlcFN5bWJvbFRlbXBsYXRlOiBXaXphcmRTdGVwU3ltYm9sRGlyZWN0aXZlO1xuXG4gIC8qKlxuICAgKiBBIHN0ZXAgaWQsIHVuaXF1ZSB0byB0aGUgc3RlcFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHN0ZXBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIHN0ZXAgdGl0bGUgcHJvcGVydHksIHdoaWNoIGNvbnRhaW5zIHRoZSB2aXNpYmxlIGhlYWRlciB0aXRsZSBvZiB0aGUgc3RlcC5cbiAgICogVGhpcyB0aXRsZSBpcyBvbmx5IHNob3duIGluc2lkZSB0aGUgbmF2aWdhdGlvbiBiYXIsIGlmIGBzdGVwVGl0bGVUZW1wbGF0ZWAgaXMgbm90IGRlZmluZWQgb3IgbnVsbC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzdGVwVGl0bGU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBzeW1ib2wgcHJvcGVydHksIHdoaWNoIGNvbnRhaW5zIGFuIG9wdGlvbmFsIHN5bWJvbCBmb3IgdGhlIHN0ZXAgaW5zaWRlIHRoZSBuYXZpZ2F0aW9uIGJhci5cbiAgICogVGFrZXMgZWZmZWN0IHdoZW4gYHN0ZXBTeW1ib2xUZW1wbGF0ZWAgaXMgbm90IGRlZmluZWQgb3IgbnVsbC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBuYXZpZ2F0aW9uU3ltYm9sOiBOYXZpZ2F0aW9uU3ltYm9sID0ge3N5bWJvbDogJyd9O1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGVzY3JpYmluZyBpZiB0aGUgd2l6YXJkIHN0ZXAgaXMgY3VycmVudGx5IHNlbGVjdGVkXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0ZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRlc2NyaWJpbmcgaWYgdGhlIHdpemFyZCBzdGVwIGhhcyBiZWVuIGNvbXBsZXRlZFxuICAgKi9cbiAgcHVibGljIGNvbXBsZXRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGVzY3JpYmluZyBpZiB0aGUgd2l6YXJkIHN0ZXAgaXMgc2hvd24gYXMgY29tcGxldGVkIHdoZW4gdGhlIHdpemFyZCBpcyBwcmVzZW50ZWQgdG8gdGhlIHVzZXJcbiAgICpcbiAgICogVXNlcnMgd2lsbCB0eXBpY2FsbHkgdXNlIGBDb21wbGV0ZWRTdGVwRGlyZWN0aXZlYCB0byBzZXQgdGhpcyBmbGFnXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGx5Q29tcGxldGVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXNjcmliaW5nIGlmIHRoZSB3aXphcmQgc3RlcCBpcyBiZWluZyBlZGl0ZWQgYWZ0ZXIgYmVpbmcgY29tcGV0ZWRcbiAgICpcbiAgICogVGhpcyBmbGFnIGNhbiBvbmx5IGJlIHRydWUgd2hlbiBgc2VsZWN0ZWRgIGlzIHRydWUuXG4gICAqL1xuICBwdWJsaWMgZWRpdGluZyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGVzY3JpYmluZywgaWYgdGhlIHdpemFyZCBzdGVwIHNob3VsZCBiZSBzZWxlY3RlZCBieSBkZWZhdWx0LCBpLmUuIGFmdGVyIHRoZSB3aXphcmQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYXMgdGhlIGluaXRpYWwgc3RlcFxuICAgKi9cbiAgcHVibGljIGRlZmF1bHRTZWxlY3RlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGVzY3JpYmluZyBpZiB0aGUgd2l6YXJkIHN0ZXAgaXMgYW4gb3B0aW9uYWwgc3RlcFxuICAgKi9cbiAgcHVibGljIG9wdGlvbmFsID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gb3IgYm9vbGVhbiBkZWNpZGluZywgaWYgdGhpcyBzdGVwIGNhbiBiZSBlbnRlcmVkXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2FuRW50ZXI6ICgoZGlyZWN0aW9uOiBNb3ZpbmdEaXJlY3Rpb24pID0+IGJvb2xlYW4pIHwgKChkaXJlY3Rpb246IE1vdmluZ0RpcmVjdGlvbikgPT4gUHJvbWlzZTxib29sZWFuPikgfCBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiBvciBib29sZWFuIGRlY2lkaW5nLCBpZiB0aGlzIHN0ZXAgY2FuIGJlIGV4aXRlZFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGNhbkV4aXQ6ICgoZGlyZWN0aW9uOiBNb3ZpbmdEaXJlY3Rpb24pID0+IGJvb2xlYW4pIHwgKChkaXJlY3Rpb246IE1vdmluZ0RpcmVjdGlvbikgPT4gUHJvbWlzZTxib29sZWFuPikgfCBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogVGhpcyBbW0V2ZW50RW1pdHRlcl1dIGlzIGNhbGxlZCB3aGVuIHRoZSBzdGVwIGlzIGVudGVyZWQuXG4gICAqIFRoZSBib3VuZCBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgdG8gZG8gaW5pdGlhbGl6YXRpb24gd29yay5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc3RlcEVudGVyOiBFdmVudEVtaXR0ZXI8TW92aW5nRGlyZWN0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8TW92aW5nRGlyZWN0aW9uPigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIFtbRXZlbnRFbWl0dGVyXV0gaXMgY2FsbGVkIHdoZW4gdGhlIHN0ZXAgaXMgZXhpdGVkLlxuICAgKiBUaGUgYm91bmQgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRvIGNsZWFudXAgd29yay5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc3RlcEV4aXQ6IEV2ZW50RW1pdHRlcjxNb3ZpbmdEaXJlY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxNb3ZpbmdEaXJlY3Rpb24+KCk7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHdpemFyZCBzdGVwIHNob3VsZCBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyLlxuICAgKiBJZiB0aGUgc3RlcCBzaG91bGQgYmUgdmlzaWJsZSB0byB0aGUgdXNlciBmYWxzZSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRydWVcbiAgICovXG4gIEBIb3N0QmluZGluZygnaGlkZGVuJylcbiAgcHVibGljIGdldCBoaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnNlbGVjdGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaWYgdGhpcyB3aXphcmQgc3RlcCBjYW4gYmUgdHJhbnNpdGlvbmVkIHdpdGggYSBnaXZlbiBkaXJlY3Rpb24uXG4gICAqIFRyYW5zaXRpb25lZCBpbiB0aGlzIGNhc2UgbWVhbnMgZWl0aGVyIGVudGVyZWQgb3IgZXhpdGVkLCBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIGBjb25kaXRpb25gIHBhcmFtZXRlci5cbiAgICpcbiAgICogQHBhcmFtIGNvbmRpdGlvbiBBIGNvbmRpdGlvbiB2YXJpYWJsZSwgZGVjaWRpbmcgaWYgdGhlIHN0ZXAgY2FuIGJlIHRyYW5zaXRpb25lZFxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhpcyBzdGVwIHNob3VsZCBiZSB0cmFuc2l0aW9uZWRcbiAgICogQHJldHVybnMgQSBbW1Byb21pc2VdXSBjb250YWluaW5nIGB0cnVlYCwgaWYgdGhpcyBzdGVwIGNhbiB0cmFuc2l0aW9uZWQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvblxuICAgKiBAdGhyb3dzIEFuIGBFcnJvcmAgaXMgdGhyb3duIGlmIGBjb25kaXRpb25gIGlzIG5laXRoZXIgYSBmdW5jdGlvbiBub3IgYSBib29sZWFuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjYW5UcmFuc2l0aW9uU3RlcChjb25kaXRpb246ICgoZGlyZWN0aW9uOiBNb3ZpbmdEaXJlY3Rpb24pID0+IGJvb2xlYW4pIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRpcmVjdGlvbjogTW92aW5nRGlyZWN0aW9uKSA9PiBQcm9taXNlPGJvb2xlYW4+KSB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBNb3ZpbmdEaXJlY3Rpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodHlwZW9mKGNvbmRpdGlvbikgPT09IHR5cGVvZih0cnVlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25kaXRpb24gYXMgYm9vbGVhbik7XG4gICAgfSBlbHNlIGlmIChjb25kaXRpb24gaW5zdGFuY2VvZiBGdW5jdGlvbikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjb25kaXRpb24oZGlyZWN0aW9uKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYElucHV0IHZhbHVlICcke2NvbmRpdGlvbn0nIGlzIG5laXRoZXIgYSBib29sZWFuIG5vciBhIGZ1bmN0aW9uYCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBzdGVwIGlzIGVudGVyZWRcbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIGluIHdoaWNoIHRoZSBzdGVwIGlzIGVudGVyZWRcbiAgICovXG4gIHB1YmxpYyBlbnRlcihkaXJlY3Rpb246IE1vdmluZ0RpcmVjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuc3RlcEVudGVyLmVtaXQoZGlyZWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBzdGVwIGlzIGV4aXRlZFxuICAgKlxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHN0ZXAgaXMgZXhpdGVkXG4gICAqL1xuICBwdWJsaWMgZXhpdChkaXJlY3Rpb246IE1vdmluZ0RpcmVjdGlvbikge1xuICAgIHRoaXMuc3RlcEV4aXQuZW1pdChkaXJlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaWYgdGhpcyB3aXphcmQgc3RlcCBjYW4gYmUgZW50ZXJlZCBmcm9tIHRoZSBnaXZlbiBkaXJlY3Rpb24uXG4gICAqIEJlY2F1c2UgdGhpcyBtZXRob2QgZGVwZW5kcyBvbiB0aGUgdmFsdWUgYGNhbkVudGVyYCwgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciwgaWYgYGNhbkVudGVyYCBpcyBuZWl0aGVyIGEgYm9vbGVhblxuICAgKiBub3IgYSBmdW5jdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIGluIHdoaWNoIHRoaXMgc3RlcCBzaG91bGQgYmUgZW50ZXJlZFxuICAgKiBAcmV0dXJucyBBIFtbUHJvbWlzZV1dIGNvbnRhaW5pbmcgYHRydWVgLCBpZiB0aGUgc3RlcCBjYW4gYmUgZW50ZXJlZCBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLCBmYWxzZSBvdGhlcndpc2VcbiAgICogQHRocm93cyBBbiBgRXJyb3JgIGlzIHRocm93biBpZiBgYW5FbnRlcmAgaXMgbmVpdGhlciBhIGZ1bmN0aW9uIG5vciBhIGJvb2xlYW5cbiAgICovXG4gIHB1YmxpYyBjYW5FbnRlclN0ZXAoZGlyZWN0aW9uOiBNb3ZpbmdEaXJlY3Rpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gV2l6YXJkU3RlcC5jYW5UcmFuc2l0aW9uU3RlcCh0aGlzLmNhbkVudGVyLCBkaXJlY3Rpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgaWYgdGhpcyB3aXphcmQgc3RlcCBjYW4gYmUgZXhpdGVkIGludG8gZ2l2ZW4gZGlyZWN0aW9uLlxuICAgKiBCZWNhdXNlIHRoaXMgbWV0aG9kIGRlcGVuZHMgb24gdGhlIHZhbHVlIGBjYW5FeGl0YCwgaXQgd2lsbCB0aHJvdyBhbiBlcnJvciwgaWYgYGNhbkV4aXRgIGlzIG5laXRoZXIgYSBib29sZWFuXG4gICAqIG5vciBhIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gZGlyZWN0aW9uIFRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhpcyBzdGVwIHNob3VsZCBiZSBsZWZ0XG4gICAqIEByZXR1cm5zIEEgW1tQcm9taXNlXV0gY29udGFpbmluZyBgdHJ1ZWAsIGlmIHRoZSBzdGVwIGNhbiBiZSBleGl0ZWQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqIEB0aHJvd3MgQW4gYEVycm9yYCBpcyB0aHJvd24gaWYgYGNhbkV4aXRgIGlzIG5laXRoZXIgYSBmdW5jdGlvbiBub3IgYSBib29sZWFuXG4gICAqL1xuICBwdWJsaWMgY2FuRXhpdFN0ZXAoZGlyZWN0aW9uOiBNb3ZpbmdEaXJlY3Rpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gV2l6YXJkU3RlcC5jYW5UcmFuc2l0aW9uU3RlcCh0aGlzLmNhbkV4aXQsIGRpcmVjdGlvbik7XG4gIH1cbn1cbiJdfQ==