@ux-aspects/ux-aspects
Version:
Open source user interface framework for building modern, responsive, mobile big data applications
89 lines • 15 kB
JavaScript
import { CdkDropList, CDK_DROP_LIST, moveItemInArray, transferArrayItem, } from '@angular/cdk/drag-drop';
import { Directive, EventEmitter, Input, Output } from '@angular/core';
import { BehaviorSubject, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import * as i0 from "@angular/core";
export class ReorderableDirective extends CdkDropList {
constructor() {
super(...arguments);
/**
* This event will be triggered when the order changes and will contain an updated dataset containing the items
* in their current order. This should be used when the list of items is generated using ngFor to ensure the
* data remains in the same order for both the `uxReorderable` and `ngFor` directives.
*/
this.reorderableModelChange = new EventEmitter();
/** This event is triggered when a user begins dragging an item. The event will contain the element being moved. */
this.reorderStart = new EventEmitter();
/** This event is triggered when the item being dragged is returned to the same location as it began. The event will contain the element that was being moved. */
this.reorderCancel = new EventEmitter();
/** This event is triggered when a user has relocated an item. The event will contain the element that was moved. */
this.reorderEnd = new EventEmitter();
this._destroy$ = new Subject();
}
/**
* The name of the reorderable group which this container belongs to `uxReorderable` elements which belong to
* the same group can have items dragged between them. Only required if multiple drop containers are being created.
*/
set reorderableGroup(group) {
const groups = ReorderableDirective._groups$.value;
this._reorderableGroup = group;
ReorderableDirective._groups$.next({
...groups,
[group]: [...(groups[group] ?? []), this.id],
});
}
get reorderableGroup() {
return this._reorderableGroup;
}
/** Determines if reordering is disabled. */
set reorderingDisabled(isDisabled) {
this.disabled = isDisabled;
}
/** Store all the group ids so we can identify which lists can interact */
static { this._groups$ = new BehaviorSubject({}); }
ngOnInit() {
this.dropped.pipe(takeUntil(this._destroy$)).subscribe((dropEvent) => {
if (dropEvent.previousContainer === dropEvent.container) {
moveItemInArray(this.reorderableModel, dropEvent.previousIndex, dropEvent.currentIndex);
}
else {
const previousContainer = dropEvent.previousContainer;
const currentContainer = dropEvent.container;
transferArrayItem(previousContainer.reorderableModel, currentContainer.reorderableModel, dropEvent.previousIndex, dropEvent.currentIndex);
}
this.reorderableModelChange.emit(this.reorderableModel);
});
// if the available groups are updated we need to update the lists we can drag to
ReorderableDirective._groups$
.pipe(takeUntil(this._destroy$))
.subscribe(groups => (this.connectedTo = (groups[this.reorderableGroup] ?? []).filter(group => group !== this.id)));
}
ngOnDestroy() {
this._destroy$.next();
this._destroy$.complete();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ReorderableDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ReorderableDirective, selector: "[uxReorderable]", inputs: { reorderableModel: "reorderableModel", reorderableGroup: "reorderableGroup", reorderingDisabled: "reorderingDisabled" }, outputs: { reorderableModelChange: "reorderableModelChange", reorderStart: "reorderStart", reorderCancel: "reorderCancel", reorderEnd: "reorderEnd" }, providers: [{ provide: CDK_DROP_LIST, useExisting: ReorderableDirective }], usesInheritance: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ReorderableDirective, decorators: [{
type: Directive,
args: [{
selector: '[uxReorderable]',
providers: [{ provide: CDK_DROP_LIST, useExisting: ReorderableDirective }],
}]
}], propDecorators: { reorderableModel: [{
type: Input
}], reorderableGroup: [{
type: Input
}], reorderingDisabled: [{
type: Input
}], reorderableModelChange: [{
type: Output
}], reorderStart: [{
type: Output
}], reorderCancel: [{
type: Output
}], reorderEnd: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVvcmRlcmFibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RpcmVjdGl2ZXMvcmVvcmRlcmFibGUvcmVvcmRlcmFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGVBQWUsRUFDZixpQkFBaUIsR0FDcEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBTTNDLE1BQU0sT0FBTyxvQkFBd0IsU0FBUSxXQUFjO0lBSjNEOztRQXdDSTs7OztXQUlHO1FBQ08sMkJBQXNCLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUVoRSxtSEFBbUg7UUFDekcsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUU3RCxpS0FBaUs7UUFDdkosa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUU5RCxvSEFBb0g7UUFDMUcsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBSzFDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0tBd0NwRDtJQXBGRzs7O09BR0c7SUFDSCxJQUFhLGdCQUFnQixDQUFDLEtBQWE7UUFDdkMsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDL0IsR0FBRyxNQUFNO1lBQ1QsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUMvQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQztJQUlELDRDQUE0QztJQUM1QyxJQUFhLGtCQUFrQixDQUFDLFVBQW1CO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFrQkQsMEVBQTBFO2FBQ2xELGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBMkIsRUFBRSxDQUFDLEFBQXBELENBQXFEO0lBSXJGLFFBQVE7UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBeUIsRUFBRSxFQUFFO1lBQ2pGLElBQUksU0FBUyxDQUFDLGlCQUFpQixLQUFLLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEQsZUFBZSxDQUNYLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsU0FBUyxDQUFDLGFBQWEsRUFDdkIsU0FBUyxDQUFDLFlBQVksQ0FDekIsQ0FBQztZQUNOLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxpQkFBNEMsQ0FBQztnQkFDakYsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsU0FBb0MsQ0FBQztnQkFFeEUsaUJBQWlCLENBQ2IsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQ2xDLGdCQUFnQixDQUFDLGdCQUFnQixFQUNqQyxTQUFTLENBQUMsYUFBYSxFQUN2QixTQUFTLENBQUMsWUFBWSxDQUN6QixDQUFDO1lBQ04sQ0FBQztZQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxpRkFBaUY7UUFDakYsb0JBQW9CLENBQUMsUUFBUTthQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQ04sTUFBTSxDQUFDLEVBQUUsQ0FDTCxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUM1RCxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsRUFBRSxDQUM3QixDQUFDLENBQ1QsQ0FBQztJQUNWLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlCLENBQUM7K0dBOUZRLG9CQUFvQjttR0FBcEIsb0JBQW9CLG1VQUZsQixDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQzs7NEZBRWpFLG9CQUFvQjtrQkFKaEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxzQkFBc0IsRUFBRSxDQUFDO2lCQUM3RTs4QkFVWSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBTU8sZ0JBQWdCO3NCQUE1QixLQUFLO2dCQWlCTyxrQkFBa0I7c0JBQTlCLEtBQUs7Z0JBU0ksc0JBQXNCO3NCQUEvQixNQUFNO2dCQUdHLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0csYUFBYTtzQkFBdEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDZGtEcmFnRHJvcCxcbiAgICBDZGtEcm9wTGlzdCxcbiAgICBDREtfRFJPUF9MSVNULFxuICAgIG1vdmVJdGVtSW5BcnJheSxcbiAgICB0cmFuc2ZlckFycmF5SXRlbSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1t1eFJlb3JkZXJhYmxlXScsXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDREtfRFJPUF9MSVNULCB1c2VFeGlzdGluZzogUmVvcmRlcmFibGVEaXJlY3RpdmUgfV0sXG59KVxuZXhwb3J0IGNsYXNzIFJlb3JkZXJhYmxlRGlyZWN0aXZlPFQ+IGV4dGVuZHMgQ2RrRHJvcExpc3Q8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBwcm92aWRlIHRoZSBgdXhSZW9yZGVyYWJsZWAgZGlyZWN0aXZlIHdpdGggYSBkYXRhc2V0IHRoYXQgcmVwcmVzZW50cyB0aGUgaXRlbXMgdGhhdCBjYW4gYmUgcmVvcmRlcmVkLlxuICAgICAqIFRoaXMgY2FuIHVzZWQgYXMgYSB0d28gd2F5IGJpbmRpbmcgd2hpY2ggd2lsbCBlbnN1cmUgdGhlIGRhdGFzZXQgYWx3YXlzIHJlZmxlY3RzIHRoZSBjdXJyZW50IG9yZGVyIG9mIGl0ZW1zIGluIHRoZSBsaXN0LlxuICAgICAqIEVhY2ggbGlzdCBpdGVtIHNob3VsZCBoYXZlIGEgYHV4UmVvcmRlcmFibGVNb2RlbGAgZGlyZWN0aXZlIGFwcGxpZWQsIHdpdGggYSB2YWx1ZSBpbmRpY2F0aW5nIHdoaWNoIGl0ZW0gaW4gdGhlIGRhdGFzZXQgaXQgcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBsaXN0IGlzIGdlbmVyYXRlZCB1c2luZyBgbmdGb3JgIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBzYW1lIGRhdGFzZXQuXG4gICAgICogSWYgdGhlcmUgaXMgbm8gZGF0YXNldCByZXByZXNlbnRpbmcgdGhlIGl0ZW1zIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuXG4gICAgICovXG4gICAgQElucHV0KCkgcmVvcmRlcmFibGVNb2RlbDogQXJyYXk8VD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVvcmRlcmFibGUgZ3JvdXAgd2hpY2ggdGhpcyBjb250YWluZXIgYmVsb25ncyB0byBgdXhSZW9yZGVyYWJsZWAgZWxlbWVudHMgd2hpY2ggYmVsb25nIHRvXG4gICAgICogdGhlIHNhbWUgZ3JvdXAgY2FuIGhhdmUgaXRlbXMgZHJhZ2dlZCBiZXR3ZWVuIHRoZW0uIE9ubHkgcmVxdWlyZWQgaWYgbXVsdGlwbGUgZHJvcCBjb250YWluZXJzIGFyZSBiZWluZyBjcmVhdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNldCByZW9yZGVyYWJsZUdyb3VwKGdyb3VwOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gUmVvcmRlcmFibGVEaXJlY3RpdmUuX2dyb3VwcyQudmFsdWU7XG4gICAgICAgIHRoaXMuX3Jlb3JkZXJhYmxlR3JvdXAgPSBncm91cDtcblxuICAgICAgICBSZW9yZGVyYWJsZURpcmVjdGl2ZS5fZ3JvdXBzJC5uZXh0KHtcbiAgICAgICAgICAgIC4uLmdyb3VwcyxcbiAgICAgICAgICAgIFtncm91cF06IFsuLi4oZ3JvdXBzW2dyb3VwXSA/PyBbXSksIHRoaXMuaWRdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgcmVvcmRlcmFibGVHcm91cCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVvcmRlcmFibGVHcm91cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW9yZGVyYWJsZUdyb3VwOiBzdHJpbmc7XG5cbiAgICAvKiogRGV0ZXJtaW5lcyBpZiByZW9yZGVyaW5nIGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpIHNldCByZW9yZGVyaW5nRGlzYWJsZWQoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIG9yZGVyIGNoYW5nZXMgYW5kIHdpbGwgY29udGFpbiBhbiB1cGRhdGVkIGRhdGFzZXQgY29udGFpbmluZyB0aGUgaXRlbXNcbiAgICAgKiBpbiB0aGVpciBjdXJyZW50IG9yZGVyLiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGxpc3Qgb2YgaXRlbXMgaXMgZ2VuZXJhdGVkIHVzaW5nIG5nRm9yIHRvIGVuc3VyZSB0aGVcbiAgICAgKiBkYXRhIHJlbWFpbnMgaW4gdGhlIHNhbWUgb3JkZXIgZm9yIGJvdGggdGhlIGB1eFJlb3JkZXJhYmxlYCBhbmQgYG5nRm9yYCBkaXJlY3RpdmVzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByZW9yZGVyYWJsZU1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxUPj4oKTtcblxuICAgIC8qKiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIGEgdXNlciBiZWdpbnMgZHJhZ2dpbmcgYW4gaXRlbS4gVGhlIGV2ZW50IHdpbGwgY29udGFpbiB0aGUgZWxlbWVudCBiZWluZyBtb3ZlZC4gKi9cbiAgICBAT3V0cHV0KCkgcmVvcmRlclN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW9yZGVyRXZlbnQ8VD4+KCk7XG5cbiAgICAvKiogVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgaXRlbSBiZWluZyBkcmFnZ2VkIGlzIHJldHVybmVkIHRvIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGl0IGJlZ2FuLiBUaGUgZXZlbnQgd2lsbCBjb250YWluIHRoZSBlbGVtZW50IHRoYXQgd2FzIGJlaW5nIG1vdmVkLiAqL1xuICAgIEBPdXRwdXQoKSByZW9yZGVyQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxSZW9yZGVyRXZlbnQ8VD4+KCk7XG5cbiAgICAvKiogVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiBhIHVzZXIgaGFzIHJlbG9jYXRlZCBhbiBpdGVtLiBUaGUgZXZlbnQgd2lsbCBjb250YWluIHRoZSBlbGVtZW50IHRoYXQgd2FzIG1vdmVkLiAqL1xuICAgIEBPdXRwdXQoKSByZW9yZGVyRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxSZW9yZGVyRXZlbnQ8VD4+KCk7XG5cbiAgICAvKiogU3RvcmUgYWxsIHRoZSBncm91cCBpZHMgc28gd2UgY2FuIGlkZW50aWZ5IHdoaWNoIGxpc3RzIGNhbiBpbnRlcmFjdCAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IF9ncm91cHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+KHt9KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRyb3BwZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKGRyb3BFdmVudDogQ2RrRHJhZ0Ryb3A8VD4pID0+IHtcbiAgICAgICAgICAgIGlmIChkcm9wRXZlbnQucHJldmlvdXNDb250YWluZXIgPT09IGRyb3BFdmVudC5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBtb3ZlSXRlbUluQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVvcmRlcmFibGVNb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgZHJvcEV2ZW50LnByZXZpb3VzSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGRyb3BFdmVudC5jdXJyZW50SW5kZXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0NvbnRhaW5lciA9IGRyb3BFdmVudC5wcmV2aW91c0NvbnRhaW5lciBhcyBSZW9yZGVyYWJsZURpcmVjdGl2ZTxUPjtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gZHJvcEV2ZW50LmNvbnRhaW5lciBhcyBSZW9yZGVyYWJsZURpcmVjdGl2ZTxUPjtcblxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQXJyYXlJdGVtKFxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbnRhaW5lci5yZW9yZGVyYWJsZU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLnJlb3JkZXJhYmxlTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGRyb3BFdmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICAgICAgICAgICAgICBkcm9wRXZlbnQuY3VycmVudEluZGV4XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW9yZGVyYWJsZU1vZGVsQ2hhbmdlLmVtaXQodGhpcy5yZW9yZGVyYWJsZU1vZGVsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgdGhlIGF2YWlsYWJsZSBncm91cHMgYXJlIHVwZGF0ZWQgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGxpc3RzIHdlIGNhbiBkcmFnIHRvXG4gICAgICAgIFJlb3JkZXJhYmxlRGlyZWN0aXZlLl9ncm91cHMkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICBncm91cHMgPT5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuY29ubmVjdGVkVG8gPSAoZ3JvdXBzW3RoaXMucmVvcmRlcmFibGVHcm91cF0gPz8gW10pLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0+IGdyb3VwICE9PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlb3JkZXJFdmVudDxUID0gdW5rbm93bj4ge1xuICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgbW9kZWw6IFQ7XG59XG4iXX0=