@libs-ui/components-drag-drop 0.2.200 → 0.2.202
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -31,17 +31,13 @@ export class LibsUiComponentsDragContainerDirective extends LibsUiComponentsDrag
|
|
|
31
31
|
super();
|
|
32
32
|
const element = this.elementRef.nativeElement;
|
|
33
33
|
const container = { element };
|
|
34
|
-
this.dragDropService.Container.
|
|
35
|
-
data.set(this.groupID(), container);
|
|
36
|
-
return data;
|
|
37
|
-
});
|
|
34
|
+
this.dragDropService.Container().set(this.groupID(), container);
|
|
38
35
|
effect(() => {
|
|
39
36
|
if (!this.rootElementScroll()) {
|
|
40
37
|
return;
|
|
41
38
|
}
|
|
42
39
|
untracked(() => {
|
|
43
40
|
set(container, 'elementScroll', this.rootElementScroll());
|
|
44
|
-
this.dragDropService.Container.update(containerMap => new Map(containerMap));
|
|
45
41
|
});
|
|
46
42
|
});
|
|
47
43
|
effect(() => {
|
|
@@ -463,4 +459,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
463
459
|
standalone: true,
|
|
464
460
|
}]
|
|
465
461
|
}], ctorParameters: () => [] });
|
|
466
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmFnLWRyb3Avc3JjL2RyYWctZHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWEsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBTzlFLE1BQU0sT0FBTyxzQ0FBdUMsU0FBUSxtQ0FBbUM7SUFDN0YsbUJBQW1CO0lBQ1gsT0FBTyxHQUFHLE1BQU0sQ0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLFVBQVUsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFNUMsZ0JBQWdCO0lBQ1Asb0JBQW9CLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDeEMsSUFBSSxHQUFHLEtBQUssQ0FBdUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEcsYUFBYSxHQUFHLEtBQUssRUFBNkIsQ0FBQztJQUNuRCxpQkFBaUIsR0FBRyxLQUFLLENBQXVELFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssSUFB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QWUsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUM5QyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDdkIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQztnQkFDcEUsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLENBQUM7b0JBRTVDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7Z0JBQzdFLENBQUM7Z0JBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMseUNBQXlDLENBQUMsQ0FBQztZQUMzRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO3dHQXRnQlUsc0NBQXNDOzRGQUF0QyxzQ0FBc0M7OzRGQUF0QyxzQ0FBc0M7a0JBTGxELFNBQVM7bUJBQUM7b0JBQ1QsOERBQThEO29CQUM5RCxRQUFRLEVBQUUsMENBQTBDO29CQUNwRCxVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBEaXJlY3RpdmUsIE9uRGVzdHJveSwgZWZmZWN0LCBpbnB1dCwgbW9kZWwsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lciwgY2xvbmVEZWVwLCBnZXQsIHNldCwgdXVpZCB9IGZyb20gXCJAbGlicy11aS91dGlsc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBzdHlsZUNvbnRhaW5lciB9IGZyb20gXCIuL2RlZmluZXMvY3NzLmRlZmluZVwiO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0RyYWdTY3JvbGxEaXJlY3RpdmUgfSBmcm9tIFwiLi9kcmFnLXNjcm9sbC5kaXJlY3RpdmVcIjtcbmltcG9ydCB7IElEcmFnRHJvcEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJRHJhZ0VuZCwgSURyYWdMZWF2ZSwgSURyYWdPdmVyLCBJRHJhZ1N0YXJ0LCBJRHJhZ2dpbmcsIElEcm9wIH0gZnJvbSBcIi4vaW50ZXJmYWNlcy9ldmVudC5pbnRlcmZhY2VcIjtcbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogXCJbTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmVdXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIExpYnNVaUNvbXBvbmVudHNEcmFnQ29udGFpbmVyRGlyZWN0aXZlIGV4dGVuZHMgTGlic1VpQ29tcG9uZW50c0RyYWdTY3JvbGxEaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAvLyAjcmVnaW9uIFBST1BFUlRZXG4gIHByaXZhdGUgZ3JvdXBJRCA9IHNpZ25hbDxzdHJpbmc+KHV1aWQoKSk7XG4gIHByaXZhdGUgaXNEcmFnT3ZlciA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgLy8gI3JlZ2lvbiBJTlBVVFxuICByZWFkb25seSBkaXNhYmxlRHJhZ0NvbnRhaW5lciA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IG1vZGUgPSBpbnB1dDxzdHJpbmcsICdtb3ZlJyB8ICdjb3B5JyB8ICdkZWVwQ29weSc+KCdtb3ZlJywgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/ICdtb3ZlJyB9KTtcbiAgcmVhZG9ubHkgZGlyZWN0aW9uRHJhZyA9IGlucHV0PCdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCc+KCk7XG4gIHJlYWRvbmx5IHZpZXdFbmNhcHN1bGF0aW9uID0gaW5wdXQ8J2VtdWxhdGVkJyB8ICdub25lJywgJ2VtdWxhdGVkJyB8ICdub25lJyB8IHVuZGVmaW5lZD4oJ2VtdWxhdGVkJywgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/ICdlbXVsYXRlZCcgfSk7XG4gIHJlYWRvbmx5IGFjY2VwdERyYWdTYW1lR3JvdXAgPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/IGZhbHNlIH0pO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KHRydWUsIHsgdHJhbnNmb3JtOiB2YWx1ZSA9PiB2YWx1ZSA/PyB0cnVlIH0pO1xuICByZWFkb25seSBncm91cE5hbWUgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJ2dyb3VwRHJhZ0FuZERyb3BEZWZhdWx0JywgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/ICdncm91cERyYWdBbmREcm9wRGVmYXVsdCcgfSk7IC8vIG7hur91IGPDoWMgZ3JvdXAgY8OzIHTDqm4gdHLDuW5nIG5oYXUgc+G6vSDEkcaw4bujYyBkcm9wXG4gIHJlYWRvbmx5IGRyb3BUb0dyb3VwTmFtZSA9IGlucHV0PEFycmF5PHN0cmluZz4gfCBudWxsPihudWxsKTsgLy8gbuG6v3UgaXRlbSB0cm9uZyBjw6FjIGdyb3VwIEEgxJHGsOG7o2MgZHJvcCB2w6BvIGdyb3VwIEIgbmjGsG5nIGdyb3VwIEIga2jDtG5nIMSRxrDhu6NjIGRyb3AgdsOgbyBncm91cCBBXG4gIHJlYWRvbmx5IGl0ZW1zID0gbW9kZWwucmVxdWlyZWQ8QXJyYXk8dW5rbm93bj4+KCk7XG4gIHJlYWRvbmx5IHN0eWxlc092ZXJyaWRlID0gaW5wdXQ8QXJyYXk8eyBjbGFzc05hbWU6IHN0cmluZywgc3R5bGVzOiBzdHJpbmcgfT4+KCk7XG5cbiAgLy8gI3JlZ2lvbiBPVVRQVVRcbiAgcmVhZG9ubHkgb3V0RHJhZ1N0YXJ0Q29udGFpbmVyID0gb3V0cHV0PElEcmFnU3RhcnQ+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdPdmVyQ29udGFpbmVyID0gb3V0cHV0PElEcmFnT3Zlcj4oKTtcbiAgcmVhZG9ubHkgb3V0RHJhZ0xlYXZlQ29udGFpbmVyID0gb3V0cHV0PElEcmFnTGVhdmU+KCk7XG4gIHJlYWRvbmx5IG91dERyYWdFbmRDb250YWluZXIgPSBvdXRwdXQ8SURyYWdFbmQ+KCk7XG4gIHJlYWRvbmx5IG91dERyb3BwZWRDb250YWluZXIgPSBvdXRwdXQ8SURyb3A+KCk7XG4gIHJlYWRvbmx5IG91dERyb3BwZWRDb250YWluZXJFbXB0eSA9IG91dHB1dDxJRHJvcD4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElEcmFnRHJvcEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgY29uc3QgY29udGFpbmVyID0geyBlbGVtZW50IH07XG5cbiAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5Db250YWluZXIudXBkYXRlKGRhdGEgPT4ge1xuICAgICAgZGF0YS5zZXQodGhpcy5ncm91cElEKCksIGNvbnRhaW5lcik7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBzZXQoY29udGFpbmVyLCAnZWxlbWVudFNjcm9sbCcsIHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSk7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNvbnRhaW5lci51cGRhdGUoY29udGFpbmVyTWFwID0+IG5ldyBNYXAoY29udGFpbmVyTWFwKSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXJlY3Rpb25EcmFnKCkgJiYgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpICYmIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm91dEZ1bmN0aW9uQ29udHJvbC5lbWl0KHsgc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnOiAoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkgfSk7XG5cbiAgICB0aGlzLm91dERyb3BwZWRDb250YWluZXIuc3Vic2NyaWJlKGV2ZW50RHJvcHBlZCA9PiB7XG4gICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3BDb250YWluZXIubmV4dChldmVudERyb3BwZWQpO1xuICAgIH0pO1xuICAgIHRoaXMub25EZXN0cm95LnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAoaW5kZXhTcGxpY2VMaXN0VG8gPiAtMSkge1xuICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4U3BsaWNlTGlzdFRvLCAxKTtcbiAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNvbnRhaW5lcigpLmRlbGV0ZSh0aGlzLmdyb3VwSUQoKSk7XG4gICAgfSk7XG4gICAgY29uc3QgZWxlbWVudENvbnRhaW5lciA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgdGhpcy5pbml0U3R5bGVBbmRBdHRyaWJ1dGUoZWxlbWVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25JdGVtSW5pdC5waXBlKGRlYm91bmNlVGltZSgyNTApLCBmaWx0ZXIoZ3JvdXBOYW1lID0+IGdyb3VwTmFtZSA9PT0gdGhpcy5ncm91cE5hbWUoKSksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB0aGlzLmluaXRTdHlsZUFuZEF0dHJpYnV0ZShlbGVtZW50Q29udGFpbmVyKSk7XG4gICAgY29uc3Qgc3R5bGVUYWcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG5cbiAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IHN0eWxlQ29udGFpbmVyKCh0aGlzLnN0eWxlc092ZXJyaWRlKCkgfHwgW10pLCB0aGlzLnZpZXdFbmNhcHN1bGF0aW9uKCksIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICBlbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICBlbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NDb250YWluZXJEZWZpbmUpO1xuXG4gICAgY29uc3QgaGFuZGxlckRyYWdTdGFydCA9IChldmVudERyYWdTdGFydDogSURyYWdTdGFydCkgPT4ge1xuXG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyLCB0cnVlKTtcbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSA9PT0gZXZlbnREcmFnU3RhcnQuZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgdGhpcy5vdXREcmFnU3RhcnRDb250YWluZXIuZW1pdCh7IC4uLmV2ZW50RHJhZ1N0YXJ0LCBpdGVtRHJhZ0luZm86IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbyB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgc3RvcmVJbmRleCA9IHsgaW5kZXhEcmFnOiAtMSwgaW5kZXhEcmFnT3ZlcjogLTEgfTtcbiAgICBsZXQgaW5kZXhTcGxpY2VMaXN0VG8gPSAtMTtcbiAgICBjb25zdCBoYW5kbGVyRHJhZ092ZXIgPSAoZXZlbnREcmFnT3ZlcjogSURyYWdPdmVyKSA9PiB7XG4gICAgICBjb25zdCB7IGVsZW1lbnREcmFnLCBlbGVtZW50RHJhZ092ZXIgfSA9IGV2ZW50RHJhZ092ZXI7XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkgfHwgIXRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLmNoZWNrRWxlbWVudE92ZXJBY2NlcHRFbGVtZW50RHJhZyh0aGlzLmdyb3VwTmFtZSgpLCBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwTmFtZScpLCBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2Ryb3BUb0dyb3VwTmFtZScpKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleERyYWcgPSBOdW1iZXIoZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdpbmRleCcpKS52YWx1ZU9mKCk7XG4gICAgICBjb25zdCBpbmRleERyYWdPdmVyID0gTnVtYmVyKGVsZW1lbnREcmFnT3Zlci5nZXRBdHRyaWJ1dGUoJ2luZGV4JykpLnZhbHVlT2YoKTtcbiAgICAgIGNvbnN0IGlkR3JvdXBFbGVtZW50RHJhZyA9IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpO1xuICAgICAgY29uc3QgaWRHcm91cEVsZW1lbnREcmFnT3ZlciA9IGVsZW1lbnREcmFnT3Zlci5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKTtcblxuICAgICAgaWYgKCh0aGlzLmdyb3VwSUQoKSAhPT0gaWRHcm91cEVsZW1lbnREcmFnKSB8fCAoaWRHcm91cEVsZW1lbnREcmFnICE9PSBpZEdyb3VwRWxlbWVudERyYWdPdmVyKSkgeyAvLyB44butIGzDvSBjaG8gaXRlbSBkcmFnIG92ZXIgcXVhIDEgaXRlbSBraMOhYyBjb250YWluZXJcbiAgICAgICAgaWYgKGlkR3JvdXBFbGVtZW50RHJhZ092ZXIgPT09IHRoaXMuZ3JvdXBJRCgpICYmIHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLm1vZGUoKSA9PT0gJ2RlZXBDb3B5JyA/IGNsb25lRGVlcCh0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8/Lml0ZW0pIDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvPy5pdGVtO1xuXG4gICAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICAgICAgaWYgKGluZGV4U3BsaWNlTGlzdFRvID49IDApIHtcbiAgICAgICAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4U3BsaWNlTGlzdFRvLCAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleERyYWdPdmVyLCAwLCBpdGVtKTtcbiAgICAgICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIsIGZhbHNlLCBpbmRleFNwbGljZUxpc3RUbyk7XG4gICAgICAgICAgaW5kZXhTcGxpY2VMaXN0VG8gPSBpbmRleERyYWdPdmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRoaXMuYWNjZXB0RHJhZ1NhbWVHcm91cCgpIHx8IGluZGV4RHJhZyA8IDAgfHwgaW5kZXhEcmFnT3ZlciA8IDAgfHwgIXRoaXMuaXRlbXMoKS5sZW5ndGggfHwgaW5kZXhEcmFnID4gdGhpcy5pdGVtcygpLmxlbmd0aCB8fCBpbmRleERyYWdPdmVyID4gdGhpcy5pdGVtcygpLmxlbmd0aCB8fCAoc3RvcmVJbmRleC5pbmRleERyYWcgPT09IGluZGV4RHJhZyAmJiBzdG9yZUluZGV4LmluZGV4RHJhZ092ZXIgPT09IGluZGV4RHJhZ092ZXIpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIHjhu60gbMO9IGNobyBpdGVtIGRyYWcgb3ZlciBxdWEgMSBpdGVtIGPDuW5nIGNvbnRhaW5lclxuICAgICAgY29uc3QgaXRlbURyYWcgPSB0aGlzLml0ZW1zKClbaW5kZXhEcmFnXTtcblxuICAgICAgdGhpcy5zZXRBbmltYXRpb25FbGVtZW50RHJhZ092ZXIoaW5kZXhEcmFnLCBpbmRleERyYWdPdmVyLCBlbGVtZW50RHJhZ092ZXIpO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWcgPSBpbmRleERyYWc7XG4gICAgICBzdG9yZUluZGV4LmluZGV4RHJhZ092ZXIgPSBpbmRleERyYWdPdmVyO1xuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcmFnLCAxKTtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJhZ092ZXIsIDAsIGl0ZW1EcmFnKTtcbiAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICB9KTtcbiAgICAgIGVsZW1lbnREcmFnLnNldEF0dHJpYnV0ZSgnaW5kZXgnLCBpbmRleERyYWdPdmVyLnRvU3RyaW5nKCkpO1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJlbW92ZVBsYWNlaG9sZGVyRHJhZyA9IChldmVudERyYWc6IElEcmFnRW5kLCBpc0RyYWdnaW5nPzogYm9vbGVhbikgPT4ge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsU2Nyb2xsVG9FbGVtZW50KCkpO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWcgPSAtMTtcbiAgICAgIHN0b3JlSW5kZXguaW5kZXhEcmFnT3ZlciA9IC0xO1xuICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG5cbiAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudERyYWcubW91c2VQb3NpdGlvbiwgKHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSB8fCBlbGVtZW50Q29udGFpbmVyKSkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRFbGVtZW50SW5kZXggPSBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZpbmRJbmRleCgoY2hpbGQpID0+IGNoaWxkLmNsYXNzTGlzdC5jb250YWlucygnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJykpO1xuXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnRJbmRleCA+PSAwICYmIHRoaXMuZ3JvdXBJRCgpICE9PSBldmVudERyYWcuZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgICB0aGlzLml0ZW1zLnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgICAgICBpdGVtcy5zcGxpY2UoY2hpbGRFbGVtZW50SW5kZXgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaW5kZXhTcGxpY2VMaXN0VG8gPSAtMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyLCBpc0RyYWdnaW5nKTtcbiAgICAgICAgdGhpcy5zZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4U3BsaWNlTGlzdFRvID49IDApIHtcbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleFNwbGljZUxpc3RUbywgMSk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICAgIH0pO1xuICAgICAgICBpbmRleFNwbGljZUxpc3RUbyA9IC0xO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVyRHJhZ2dpbmcgPSAoZXZlbnREcmFnZ2luZzogSURyYWdnaW5nKSA9PiB7XG4gICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyKTtcbiAgICAgIGNvbnN0IHsgZWxlbWVudERyYWcgfSA9IGV2ZW50RHJhZ2dpbmc7XG4gICAgICBjb25zdCBmaWVsZElkSXRlbSA9IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZmllbGRfaWQnKTtcbiAgICAgIGNvbnN0IGlkSXRlbURyYWcgPSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2l0ZW1faWQnKTtcblxuICAgICAgaWYgKGZpZWxkSWRJdGVtICYmIGlkSXRlbURyYWcgJiYgdGhpcy5pdGVtcygpLmZpbmQoaXRlbSA9PiBnZXQoaXRlbSwgZmllbGRJZEl0ZW0pID09PSBpZEl0ZW1EcmFnKSkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICAgICAgY29uc3QgY2hpbGRFbGVtZW50ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5maW5kKChjaGlsZCkgPT4gY2hpbGQuZ2V0QXR0cmlidXRlKCdpdGVtX2lkJykgPT09IGlkSXRlbURyYWcpO1xuXG4gICAgICAgIGlmICh0aGlzLml0ZW1zKCkgPT09IGV2ZW50RHJhZ2dpbmcuaXRlbURyYWdJbmZvPy5pdGVtc0RyYWcoKSAmJiBjaGlsZEVsZW1lbnQgJiYgIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tZHJvcC1wbGFjZWhvbGRlcicpICYmICFjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLlRhcmdldEl0ZW1EcmFnRmxhZykpIHtcbiAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLlRhcmdldEl0ZW1EcmFnRmxhZywgJ3RydWUnKTtcbiAgICAgICAgICB0aGlzLmdyb3VwSUQuc2V0KGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpIHx8ICcnKTtcbiAgICAgICAgICBzdHlsZVRhZy5yZW1vdmUoKTtcbiAgICAgICAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IHN0eWxlQ29udGFpbmVyKCh0aGlzLnN0eWxlc092ZXJyaWRlKCkgfHwgW10pLCB0aGlzLnZpZXdFbmNhcHN1bGF0aW9uKCksIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICAgICAgICBlbGVtZW50Q29udGFpbmVyLmFwcGVuZENoaWxkKHN0eWxlVGFnKTtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpID09PSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSAmJiAhdGhpcy5hY2NlcHREcmFnU2FtZUdyb3VwKCkpIHtcbiAgICAgICAgdGhpcy5jaGVja0FuZFNjcm9sbEVsZW1lbnRUb1Bvc2l0aW9uKGV2ZW50RHJhZ2dpbmcsIHRoaXMuaWdub3JlQXV0b1Njcm9sbCgpIHx8ICF0aGlzLmFjY2VwdERyYWdTYW1lR3JvdXAoKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKGV2ZW50RHJhZ2dpbmcubW91c2VQb3NpdGlvbiwgKHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSB8fCBlbGVtZW50Q29udGFpbmVyKSkpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNEcmFnT3ZlcigpKSB7XG4gICAgICAgICAgdGhpcy5pc0RyYWdPdmVyLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vdXREcmFnTGVhdmVDb250YWluZXIuZW1pdCh7IC4uLmV2ZW50RHJhZ2dpbmcsIGVsZW1lbnREcmFnTGVhdmU6IGVsZW1lbnRDb250YWluZXIgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVtb3ZlUGxhY2Vob2xkZXJEcmFnKGV2ZW50RHJhZ2dpbmcsIHRydWUpO1xuICAgICAgfVxuICAgICAgdGhpcy5jaGVja0FuZFNjcm9sbEVsZW1lbnRUb1Bvc2l0aW9uKGV2ZW50RHJhZ2dpbmcsIHRoaXMuaWdub3JlQXV0b1Njcm9sbCgpKTtcblxuICAgICAgLy8gxJBv4bqhbiBjb2RlIHjhu60gbMO9IGNobyB2aeG7h2Mga8OpbyBt4buZdCBlbGVtZW50IHbDoG8gMSBjb250YWluZXIgbmjGsG5nIGNvbnRhaW5lciBraMO0bmcgY8OzIGl0ZW0gaG/hurdjIGl0ZW0gZHJhZyBraMO0bmcgb3ZlciBxdWEgaXRlbSB0cm9uZyBjb250YWluZXJcbiAgICAgIGlmICghdGhpcy5pc0RyYWdPdmVyKCkpIHtcbiAgICAgICAgZWxlbWVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1jb250YWluZXItZHJhZ292ZXInKTtcbiAgICAgICAgdGhpcy5pc0RyYWdPdmVyLnNldCh0cnVlKTtcbiAgICAgICAgdGhpcy5vdXREcmFnT3ZlckNvbnRhaW5lci5lbWl0KHsgLi4uZXZlbnREcmFnZ2luZywgZWxlbWVudERyYWdPdmVyOiBlbGVtZW50Q29udGFpbmVyIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXZlbnREcmFnT3ZlciA9IHsgLi4uZXZlbnREcmFnZ2luZywgZWxlbWVudERyYWdPdmVyOiBlbGVtZW50Q29udGFpbmVyIH07XG5cbiAgICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgICBldmVudERyYWdPdmVyLmVsZW1lbnREcmFnT3ZlciA9IHtcbiAgICAgICAgICBnZXRBdHRyaWJ1dGU6IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChuYW1lID09PSAnZ3JvdXBJRCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBJRCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5hbWUgIT09ICdpbmRleCcpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBhcyB1bmtub3duIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdPdmVyLm5leHQoZXZlbnREcmFnT3Zlcik7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICAgIGxldCBjaGlsZEVsZW1lbnQgPSBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZpbmQoKGNoaWxkKSA9PiBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKGV2ZW50RHJhZ2dpbmcubW91c2VQb3NpdGlvbiwgY2hpbGQpKTtcblxuICAgICAgaWYgKGNoaWxkRWxlbWVudCkgeyAvLyBu4bq/dSB0w6xtIHRo4bqleSB0aMOsIHPhur0gbmjhuq1uIHF1YSBz4buxIGtp4buHbiBj4bunYSBkcmFnLWl0ZW0uZGlyZWN0aXZlIGVtaXRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2hpbGRFbGVtZW50ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5wb3AoKTtcblxuICAgICAgaWYgKGNoaWxkRWxlbWVudCkge1xuICAgICAgICBldmVudERyYWdPdmVyLmVsZW1lbnREcmFnT3ZlciA9IGNoaWxkRWxlbWVudDtcbiAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnT3Zlci5uZXh0KGV2ZW50RHJhZ092ZXIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVyRHJhZ0VuZCA9IChldmVudERyYWdFbmQ6IElEcmFnRW5kKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCByZWN0ID0gdW5kZWZpbmVkO1xuXG4gICAgICBpZiAodGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIpIHtcbiAgICAgICAgcmVjdCA9ICh0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkgfHwgZWxlbWVudENvbnRhaW5lcik/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgfVxuICAgICAgcmVtb3ZlUGxhY2Vob2xkZXJEcmFnKGV2ZW50RHJhZ0VuZCk7XG4gICAgICBjb25zdCB7IGVsZW1lbnREcmFnLCBtb3VzZVBvc2l0aW9uLCBpdGVtRHJhZ0luZm8gfSA9IGV2ZW50RHJhZ0VuZDtcblxuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpID09PSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICB0aGlzLm91dERyYWdFbmRDb250YWluZXIuZW1pdCh7IC4uLmV2ZW50RHJhZ0VuZCB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihtb3VzZVBvc2l0aW9uLCB0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkgfHwgZWxlbWVudENvbnRhaW5lciwgcmVjdCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZXZlbnREcm9wID0geyBlbGVtZW50RHJhZzogZWxlbWVudERyYWcsIGVsZW1lbnREcm9wOiBlbGVtZW50Q29udGFpbmVyLCBpdGVtRHJhZ0luZm86IGl0ZW1EcmFnSW5mbyB9O1xuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpIHx8ICF0aGlzLmRyYWdEcm9wU2VydmljZS5jaGVja0VsZW1lbnRPdmVyQWNjZXB0RWxlbWVudERyYWcodGhpcy5ncm91cE5hbWUoKSwgZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cE5hbWUnKSwgZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdkcm9wVG9Hcm91cE5hbWUnKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZmluZCgoY2hpbGQpID0+IGNoZWNrTW91c2VPdmVySW5Db250YWluZXIobW91c2VQb3NpdGlvbiwgY2hpbGQpKTtcblxuICAgICAgaWYgKGNoaWxkRWxlbWVudCkge1xuICAgICAgICBldmVudERyb3AuZWxlbWVudERyb3AgPSBjaGlsZEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJvcC5uZXh0KGV2ZW50RHJvcCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZXZlbnREcm9wLmVsZW1lbnREcm9wID0ge1xuICAgICAgICBnZXRBdHRyaWJ1dGU6IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBpZiAobmFtZSA9PT0gJ2Ryb3BDb250YWluZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5hbWUgPT09ICdncm91cElEJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBJRCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobmFtZSAhPT0gJ2luZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGNoaWxkcmVuRWxlbWVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0gYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJvcC5uZXh0KGV2ZW50RHJvcCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZXJEcm9wID0gKGV2ZW50RHJvcDogSURyb3ApID0+IHtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBlbGVtZW50RHJhZywgZWxlbWVudERyb3AsIGl0ZW1EcmFnSW5mbyB9ID0gZXZlbnREcm9wO1xuXG4gICAgICBpZiAodGhpcy5ncm91cElEKCkgPT09IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpICYmIHRoaXMuZ3JvdXBJRCgpID09PSBlbGVtZW50RHJvcC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICBpZiAoaXRlbURyYWdJbmZvKSB7XG4gICAgICAgICAgaXRlbURyYWdJbmZvLmluZGV4RHJvcCA9IE51bWJlcihlbGVtZW50RHJvcC5nZXRBdHRyaWJ1dGUoJ2luZGV4JykpLnZhbHVlT2YoKTtcbiAgICAgICAgICBpdGVtRHJhZ0luZm8uaXRlbXNEcm9wID0gdGhpcy5pdGVtcztcbiAgICAgICAgICBpdGVtRHJhZ0luZm8uY29udGFpbmVyRHJvcCA9IGVsZW1lbnRDb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWNjZXB0RHJhZ1NhbWVHcm91cCgpKSB7XG4gICAgICAgICAgdGhpcy5vdXREcm9wcGVkQ29udGFpbmVyLmVtaXQoZXZlbnREcm9wKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMoZWxlbWVudENvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbGVtZW50KGVsZW1lbnRDb250YWluZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSAhPT0gZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdncm91cElEJykgfHwgZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykgPT09IGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4RHJhZ092ZXIgPSB0aGlzLmdyb3VwSUQoKSAhPT0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykgPyBOdW1iZXIoZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdpbmRleCcpKS52YWx1ZU9mKCkgOiBOdW1iZXIoZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdpbmRleCcpKS52YWx1ZU9mKCkgLSAoZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdkcm9wQ29udGFpbmVyJykgPyAwIDogMSk7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5tb2RlKCkgPT09ICdkZWVwQ29weScgPyBjbG9uZURlZXAoaXRlbURyYWdJbmZvPy5pdGVtKSA6IGl0ZW1EcmFnSW5mbz8uaXRlbTtcblxuICAgICAgaWYgKGl0ZW1EcmFnSW5mbykge1xuICAgICAgICBpdGVtRHJhZ0luZm8uaW5kZXhEcm9wID0gaW5kZXhEcmFnT3ZlcjtcbiAgICAgICAgaXRlbURyYWdJbmZvLml0ZW1zRHJvcCA9IHRoaXMuaXRlbXM7XG4gICAgICAgIGl0ZW1EcmFnSW5mby5jb250YWluZXJEcm9wID0gZWxlbWVudENvbnRhaW5lcjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLml0ZW1zKCkubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMub3V0RHJvcHBlZENvbnRhaW5lckVtcHR5LmVtaXQoZXZlbnREcm9wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcmFnT3ZlciwgMCwgaXRlbSk7XG4gICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgfSk7XG4gICAgICBpZiAoaXRlbURyYWdJbmZvICYmIGl0ZW1EcmFnSW5mby5pdGVtc01vdmUgJiYgaXRlbURyYWdJbmZvLml0ZW1zTW92ZSgpKSB7XG4gICAgICAgIGl0ZW1EcmFnSW5mby5pdGVtc0RyYWcuc2V0KFsuLi5pdGVtRHJhZ0luZm8uaXRlbXNNb3ZlKCldKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyKSk7XG4gICAgICB9XG4gICAgICB0aGlzLm91dERyb3BwZWRDb250YWluZXIuZW1pdChldmVudERyb3ApO1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXIpO1xuICAgICAgdGhpcy5zZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcik7XG4gICAgfTtcblxuICAgIFt7XG4gICAgICBuYW1lOiAnT25EcmFnU3RhcnQnLFxuICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ1N0YXJ0LFxuICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJhZ1N0YXJ0XG4gICAgfSwge1xuICAgICAgbmFtZTogJ09uRHJhZ092ZXInLFxuICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ092ZXIsXG4gICAgICBmdW5jdGlvbkNhbGw6IGhhbmRsZXJEcmFnT3ZlcixcbiAgICAgIGRlYm91bmNlVGltZTogNVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdPbkRyYWdnaW5nJyxcbiAgICAgIGV2ZW50OiB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdnaW5nLFxuICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJhZ2dpbmdcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnT25EcmFnRW5kJyxcbiAgICAgIGV2ZW50OiB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdFbmQsXG4gICAgICBmdW5jdGlvbkNhbGw6IGhhbmRsZXJEcmFnRW5kXG4gICAgfSwge1xuICAgICAgbmFtZTogJ09uRHJvcCcsXG4gICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25Ecm9wLFxuICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJvcFxuICAgIH1cbiAgICBdLmZvckVhY2goKGl0ZW06IHsgbmFtZTogc3RyaW5nOyBkZWJvdW5jZVRpbWU/OiBudW1iZXI7IGV2ZW50OiBPYnNlcnZhYmxlPHVua25vd24+OyBmdW5jdGlvbkNhbGw6IG9iamVjdCB9KSA9PiAoaXRlbS5ldmVudC5waXBlKGRlYm91bmNlVGltZShpdGVtLmRlYm91bmNlVGltZSB8fCAwKSwgdGFrZVVudGlsKHRoaXMub25EZXN0cm95KSkuc3Vic2NyaWJlKGl0ZW0uZnVuY3Rpb25DYWxsKSkpO1xuICB9XG5cbiAgLyogKi9cbiAgcHJpdmF0ZSBhc3luYyBzZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHNldEl0ZW1EcmFnPzogYm9vbGVhbiwgaW5kZXhJbnNlcnQ/OiBudW1iZXIpIHtcbiAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICBsZXQgaW5kZXggPSAtMTtcblxuICAgIGVsZW1lbnRDb250YWluZXIuc2V0QXR0cmlidXRlKCdncm91cElEJywgdGhpcy5ncm91cElEKCkpO1xuICAgIGVsZW1lbnRDb250YWluZXIucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicpO1xuXG4gICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgZWxlbWVudENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVEcmFnQ29udGFpbmVyJywgYCR7dGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpfWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncm91cE5hbWUoKSkge1xuICAgICAgZWxlbWVudENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2dyb3VwTmFtZScsIHRoaXMuZ3JvdXBOYW1lKCkgfHwgJycpO1xuICAgIH1cbiAgICBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZvckVhY2goKGNoaWxkRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuaGFzQXR0cmlidXRlKCdncm91cE5hbWUnKSB8fCBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdncm91cE5hbWUnKSA9PT0gdGhpcy5ncm91cE5hbWUoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdncm91cElEJywgdGhpcy5ncm91cElEKCkpO1xuICAgICAgfVxuICAgICAgaWYgKGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSAhPT0gdGhpcy5ncm91cElEKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2luZGV4JywgYCR7aW5kZXh9YCk7XG4gICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicpO1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicsIGAke3RoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKX1gKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmdyb3VwTmFtZSgpICYmICFjaGlsZEVsZW1lbnQuaGFzQXR0cmlidXRlKCdncm91cE5hbWUnKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdncm91cE5hbWUnLCB0aGlzLmdyb3VwTmFtZSgpIHx8ICcnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCBgJHt0aGlzLnBsYWNlaG9sZGVyKCl9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kcm9wVG9Hcm91cE5hbWUoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdkcm9wVG9Hcm91cE5hbWUnLCBgJHt0aGlzLmRyb3BUb0dyb3VwTmFtZSgpPy5qb2luKCc7Jyl9YCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXhJbnNlcnQgPT09IGluZGV4ICYmIHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICBpZiAoIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInKSkge1xuICAgICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKSkge1xuICAgICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2V0SXRlbURyYWcgJiYgY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSh0aGlzLmRyYWdEcm9wU2VydmljZS5UYXJnZXRJdGVtRHJhZ0ZsYWcpICYmIHRoaXMuaXRlbXMoKS5sZW5ndGggPj0gaW5kZXgpIHtcbiAgICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICAgIGlmICghY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tb3JpZ2luLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLW9yaWdpbi1wbGFjZWhvbGRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbyA9IHsgaXRlbTogdGhpcy5pdGVtcygpW2luZGV4XSBhcyBvYmplY3QsIGluZGV4RHJhZzogaW5kZXgsIGl0ZW1zRHJhZzogdGhpcy5pdGVtcywgY29udGFpbmVyRHJhZzogZWxlbWVudENvbnRhaW5lciwgaXRlbXNNb3ZlOiBzaWduYWwoWy4uLnRoaXMuaXRlbXMoKV0pIH07XG4gICAgICAgIGlmICh0aGlzLm1vZGUoKSA9PT0gJ21vdmUnKSB7XG4gICAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvLml0ZW1zTW92ZT8udXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluaXRTdHlsZUFuZEF0dHJpYnV0ZShlbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCwgaGFzUmVtb3ZlQXR0cmlidXRlID0gZmFsc2UsKSB7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgaWYgKGhhc1JlbW92ZUF0dHJpYnV0ZSkge1xuICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXIpO1xuICAgIH1cbiAgICB0aGlzLnNldEluZGV4RWxlbWVudChlbGVtZW50Q29udGFpbmVyKTtcbiAgfTtcblxuICBwcml2YXRlIHNldEFuaW1hdGlvbkVsZW1lbnREcmFnT3ZlcihpbmRleERyYWc6IG51bWJlciwgaW5kZXhEcmFnT3ZlcjogbnVtYmVyLCBlbGVtZW50RHJhZ092ZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgaWYgKCF0aGlzLmRpcmVjdGlvbkRyYWcoKSB8fCAhZWxlbWVudERyYWdPdmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRpcmVjdGlvbkRyYWcoKSA9PT0gJ3ZlcnRpY2FsJykge1xuICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLWJvdHRvbScpO1xuICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLXRvcCcpO1xuICAgICAgaWYgKGluZGV4RHJhZyA+IGluZGV4RHJhZ092ZXIpIHtcbiAgICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLWJvdHRvbScpO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4RHJhZyA8IGluZGV4RHJhZ092ZXIpIHtcbiAgICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLXRvcCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLWxlZnQnKTtcbiAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtcmlnaHQnKTtcbiAgICBpZiAoaW5kZXhEcmFnID4gaW5kZXhEcmFnT3Zlcikge1xuICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLXJpZ2h0Jyk7XG4gICAgfVxuICAgIGlmIChpbmRleERyYWcgPCBpbmRleERyYWdPdmVyKSB7XG4gICAgICBlbGVtZW50RHJhZ092ZXIuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS10cmFuc2xhdGUtbGVmdCcpO1xuICAgIH1cblxuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQpIHtcbiAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcbiAgICBsZXQgaW5kZXggPSAtMTtcblxuICAgIEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZm9yRWFjaCgoY2hpbGRFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpICE9PSB0aGlzLmdyb3VwSUQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpbmRleCArPSAxO1xuICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnaW5kZXgnLCBgJHtpbmRleH1gKTtcbiAgICB9KTtcblxuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBpZ25vcmVSZW1vdmVDbGFzc0l0ZW1PcmlnaW5QbGFjZWhvbGRlcj86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjaGlsZHJlbkVsZW1lbnQgPSBlbGVtZW50Q29udGFpbmVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUodGhpcy5kcmFnRHJvcFNlcnZpY2UuQ2xhc3NJdGVtRGVmaW5lKSBhcyB1bmtub3duIGFzIEFycmF5PEhUTUxFbGVtZW50PjtcblxuICAgIGVsZW1lbnRDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtY29udGFpbmVyLWRyYWdvdmVyJyk7XG4gICAgQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5mb3JFYWNoKChjaGlsZEVsZW1lbnQpID0+IHtcbiAgICAgIGlmIChjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdncm91cElEJykgIT09IHRoaXMuZ3JvdXBJRCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2luZGV4Jyk7XG4gICAgICBpZiAoIXRoaXMuZHJvcFRvR3JvdXBOYW1lKCkgfHwgIXRoaXMuZHJvcFRvR3JvdXBOYW1lKCk/Lmxlbmd0aCkge1xuICAgICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkcm9wVG9Hcm91cE5hbWUnKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5wbGFjZWhvbGRlcigpKSB7XG4gICAgICAgIGNoaWxkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wbGFjZWhvbGRlcigpKSB7XG4gICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIGlmICghaWdub3JlUmVtb3ZlQ2xhc3NJdGVtT3JpZ2luUGxhY2Vob2xkZXIpIHtcblxuICAgICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLW9yaWdpbi1wbGFjZWhvbGRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNoaWxkRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICB9XG59XG4iXX0=
|
|
462
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1kcm9wLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9kcmFnLWRyb3Avc3JjL2RyYWctZHJvcC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQWEsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1DQUFtQyxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBTzlFLE1BQU0sT0FBTyxzQ0FBdUMsU0FBUSxtQ0FBbUM7SUFDN0YsbUJBQW1CO0lBQ1gsT0FBTyxHQUFHLE1BQU0sQ0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ2pDLFVBQVUsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFFNUMsZ0JBQWdCO0lBQ1Asb0JBQW9CLEdBQUcsS0FBSyxFQUFXLENBQUM7SUFDeEMsSUFBSSxHQUFHLEtBQUssQ0FBdUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDcEcsYUFBYSxHQUFHLEtBQUssRUFBNkIsQ0FBQztJQUNuRCxpQkFBaUIsR0FBRyxLQUFLLENBQXVELFVBQVUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3pJLG1CQUFtQixHQUFHLEtBQUssQ0FBK0IsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDekcsV0FBVyxHQUFHLEtBQUssQ0FBK0IsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0YsU0FBUyxHQUFHLEtBQUssQ0FBNkIseUJBQXlCLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUkseUJBQXlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsK0NBQStDO0lBQ3JMLGVBQWUsR0FBRyxLQUFLLENBQXVCLElBQUksQ0FBQyxDQUFDLENBQUMsNkZBQTZGO0lBQ2xKLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFrQixDQUFDO0lBQ3pDLGNBQWMsR0FBRyxLQUFLLEVBQWdELENBQUM7SUFFaEYsaUJBQWlCO0lBQ1IscUJBQXFCLEdBQUcsTUFBTSxFQUFjLENBQUM7SUFDN0Msb0JBQW9CLEdBQUcsTUFBTSxFQUFhLENBQUM7SUFDM0MscUJBQXFCLEdBQUcsTUFBTSxFQUFjLENBQUM7SUFDN0MsbUJBQW1CLEdBQUcsTUFBTSxFQUFZLENBQUM7SUFDekMsbUJBQW1CLEdBQUcsTUFBTSxFQUFTLENBQUM7SUFDdEMsd0JBQXdCLEdBQUcsTUFBTSxFQUFTLENBQUM7SUFDM0Msa0JBQWtCLEdBQUcsTUFBTSxFQUFpQyxDQUFDO0lBRXRFO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUFDUixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQTRCLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUU5QixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFaEUsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixPQUFPO1lBQ1QsQ0FBQztZQUNELFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUM1RCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUSxlQUFlO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSw4QkFBOEIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsOEJBQThCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFM0ksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtZQUNoRCxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDNUIsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtvQkFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDbkMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7Z0JBQ3BCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQTRCLENBQUM7UUFFdEUsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUN0TSxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRWpELFFBQVEsQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQy9HLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN2QyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUUxRSxNQUFNLGdCQUFnQixHQUFHLENBQUMsY0FBMEIsRUFBRSxFQUFFO1lBRXRELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxjQUFjLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUMxRSxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxjQUFjLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMxRyxDQUFDO1FBQ0gsQ0FBQyxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLGVBQWUsR0FBRyxDQUFDLGFBQXdCLEVBQUUsRUFBRTtZQUNuRCxNQUFNLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxHQUFHLGFBQWEsQ0FBQztZQUV2RCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNqTSxPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEUsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5RSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0QsTUFBTSxzQkFBc0IsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXZFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixLQUFLLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDLHFEQUFxRDtnQkFDckosSUFBSSxzQkFBc0IsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7b0JBQ3BFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDO29CQUV2SSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDeEIsSUFBSSxpQkFBaUIsSUFBSSxDQUFDLEVBQUUsQ0FBQzs0QkFDM0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDckMsQ0FBQzt3QkFDRCxLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7d0JBQ3JDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO29CQUNwQixDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsOEJBQThCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7b0JBQ2hGLGlCQUFpQixHQUFHLGFBQWEsQ0FBQztnQkFDcEMsQ0FBQztnQkFFRCxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLGFBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUM5UCxPQUFPO1lBQ1QsQ0FBQztZQUNELHFEQUFxRDtZQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFFekMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDNUUsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7WUFDakMsVUFBVSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDekMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hCLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixLQUFLLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDO1FBRUYsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLFNBQW1CLEVBQUUsVUFBb0IsRUFBRSxFQUFFO1lBQzFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1lBQzlDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDMUIsVUFBVSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBa0MsQ0FBQztZQUV2SSxJQUFJLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN4RyxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQWMsZUFBZSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTdKLElBQUksaUJBQWlCLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsS0FBSyxTQUFTLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUMvRixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDbkMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUM7b0JBQ3BCLENBQUMsQ0FBQyxDQUFDO29CQUNILGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixDQUFDO2dCQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUV2QyxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksaUJBQWlCLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUN4QixLQUFLLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNuQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDcEIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUMsQ0FBQztRQUVGLE1BQU0sZUFBZSxHQUFHLENBQUMsYUFBd0IsRUFBRSxFQUFFO1lBQ25ELElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxhQUFhLENBQUM7WUFDdEMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN6RCxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXZELElBQUksV0FBVyxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNsRyxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBa0MsQ0FBQztnQkFDdkksTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBYyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBRTVILElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLGFBQWEsQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksWUFBWSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMseUNBQXlDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7b0JBQ25PLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDM0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDNUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNsQixRQUFRLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztvQkFDL0csZ0JBQWdCLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN2QyxJQUFJLENBQUMsOEJBQThCLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzlELENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO2dCQUNoQyxPQUFPO1lBQ1QsQ0FBQztZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO2dCQUMxRixJQUFJLENBQUMsK0JBQStCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUMsQ0FBQztnQkFDNUcsT0FBTztZQUNULENBQUM7WUFFRCxJQUFJLENBQUMseUJBQXlCLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM1RyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO29CQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztnQkFDNUYsQ0FBQztnQkFFRCxPQUFPLHFCQUFxQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLCtCQUErQixDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBRTdFLDRJQUE0STtZQUM1SSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLGFBQWEsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFDRCxNQUFNLGFBQWEsR0FBRyxFQUFFLEdBQUcsYUFBYSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1lBRTlFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3pCLGFBQWEsQ0FBQyxlQUFlLEdBQUc7b0JBQzlCLFlBQVksRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFO3dCQUM3QixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQzs0QkFDdkIsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ3hCLENBQUM7d0JBQ0QsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7NEJBQ3JCLE9BQU8sSUFBSSxDQUFDO3dCQUNkLENBQUM7d0JBRUQsT0FBTyxDQUFDLENBQUM7b0JBQ1gsQ0FBQztpQkFDd0IsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUVwRCxPQUFPO1lBQ1QsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFrQyxDQUFDO1lBQ3ZJLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQWMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFM0ksSUFBSSxZQUFZLEVBQUUsQ0FBQyxDQUFDLG9FQUFvRTtnQkFDdEYsT0FBTztZQUNULENBQUM7WUFDRCxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBYyxlQUFlLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUU5RCxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixhQUFhLENBQUMsZUFBZSxHQUFHLFlBQVksQ0FBQztnQkFDN0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDSCxDQUFDLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxDQUFDLFlBQXNCLEVBQUUsRUFBRTtZQUNoRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7Z0JBQ2hDLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDO1lBRXJCLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksZ0JBQWdCLENBQUMsRUFBRSxxQkFBcUIsRUFBRSxDQUFDO1lBQ2pGLENBQUM7WUFDRCxxQkFBcUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNwQyxNQUFNLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FBRyxZQUFZLENBQUM7WUFFbEUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO2dCQUMzRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQ3JELENBQUM7WUFDRCxJQUFJLENBQUMseUJBQXlCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLGdCQUFnQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ2xHLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxTQUFTLEdBQUcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLENBQUM7WUFFMUcsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsaUNBQWlDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDak0sT0FBTztZQUNULENBQUM7WUFFRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBa0MsQ0FBQztZQUN2SSxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFjLGVBQWUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMseUJBQXlCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFL0gsSUFBSSxZQUFZLEVBQUUsQ0FBQztnQkFDakIsU0FBUyxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFNUMsT0FBTztZQUNULENBQUM7WUFDRCxTQUFTLENBQUMsV0FBVyxHQUFHO2dCQUN0QixZQUFZLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtvQkFDN0IsSUFBSSxJQUFJLEtBQUssZUFBZSxFQUFFLENBQUM7d0JBQzdCLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBQ0QsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7d0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUN4QixDQUFDO29CQUNELElBQUksSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO3dCQUNyQixPQUFPLElBQUksQ0FBQztvQkFDZCxDQUFDO29CQUVELE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQztnQkFDaEMsQ0FBQzthQUN3QixDQUFDO1lBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLFNBQWdCLEVBQUUsRUFBRTtZQUN2QyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7Z0JBQ2hDLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEdBQUcsU0FBUyxDQUFDO1lBRTdELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDckgsSUFBSSxZQUFZLEVBQUUsQ0FBQztvQkFDakIsWUFBWSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUM3RSxZQUFZLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ3BDLFlBQVksQ0FBQyxhQUFhLEdBQUcsZ0JBQWdCLENBQUM7Z0JBQ2hELENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO2dCQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZDLE9BQU87WUFDVCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDMUksT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssV0FBVyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL08sTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQztZQUU3RixJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUNqQixZQUFZLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQztnQkFDdkMsWUFBWSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUNwQyxZQUFZLENBQUMsYUFBYSxHQUFHLGdCQUFnQixDQUFDO1lBQ2hELENBQUM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDeEIsS0FBSyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztZQUNwQixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksWUFBWSxJQUFJLFlBQVksQ0FBQyxTQUFTLElBQUksWUFBWSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZFLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekMsQ0FBQyxDQUFDO1FBRUYsQ0FBQztnQkFDQyxJQUFJLEVBQUUsYUFBYTtnQkFDbkIsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVztnQkFDdkMsWUFBWSxFQUFFLGdCQUFnQjthQUMvQixFQUFFO2dCQUNELElBQUksRUFBRSxZQUFZO2dCQUNsQixLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVO2dCQUN0QyxZQUFZLEVBQUUsZUFBZTtnQkFDN0IsWUFBWSxFQUFFLENBQUM7YUFDaEIsRUFBRTtnQkFDRCxJQUFJLEVBQUUsWUFBWTtnQkFDbEIsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVTtnQkFDdEMsWUFBWSxFQUFFLGVBQWU7YUFDOUIsRUFBRTtnQkFDRCxJQUFJLEVBQUUsV0FBVztnQkFDakIsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUztnQkFDckMsWUFBWSxFQUFFLGNBQWM7YUFDN0IsRUFBRTtnQkFDRCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNO2dCQUNsQyxZQUFZLEVBQUUsV0FBVzthQUMxQjtTQUNBLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBK0YsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbE8sQ0FBQztJQUVELEtBQUs7SUFDRyxLQUFLLENBQUMsOEJBQThCLENBQUMsZ0JBQTZCLEVBQUUsV0FBcUIsRUFBRSxXQUFvQjtRQUNySCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBa0MsQ0FBQztRQUN2SSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVmLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDekQsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFekQsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQ2hDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQztZQUNyQixnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBYyxlQUFlLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUNoRSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDO2dCQUMzRyxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQ0QsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUM1RCxPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssSUFBSSxDQUFDLENBQUM7WUFDWCxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDL0MsWUFBWSxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3JELElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztnQkFDaEMsWUFBWSxDQUFDLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0RixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hFLFlBQVksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNqRSxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDdkIsWUFBWSxDQUFDLFlBQVksQ0FBQyxhQUFhLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3BFLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO2dCQUMzQixZQUFZLENBQUMsWUFBWSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdkYsQ0FBQztZQUNELElBQUksV0FBVyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDaEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLG9DQUFvQyxDQUFDLEVBQUUsQ0FBQztvQkFDM0UsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsb0NBQW9DLENBQUMsQ0FBQztnQkFDbkUsQ0FBQztnQkFDRCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMseUNBQXlDLENBQUMsRUFBRSxDQUFDO29CQUNoRixZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2dCQUN4RSxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksV0FBVyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxNQUFNLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ3RILElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLENBQUM7d0JBQzNFLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7b0JBQ25FLENBQUM7b0JBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLDJDQUEyQyxDQUFDLEVBQUUsQ0FBQzt3QkFDbEYsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQztvQkFDMUUsQ0FBQztnQkFDSCxDQUFDO2dCQUVELElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzVMLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFO3dCQUMxRCxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzt3QkFDdkIsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUE7b0JBQ25CLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8scUJBQXFCLENBQUMsZ0JBQTZCLEVBQUUsa0JBQWtCLEdBQUcsS0FBSztRQUNyRixJQUFJLENBQUMsOEJBQThCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN0RCxJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQUEsQ0FBQztJQUVNLDJCQUEyQixDQUFDLFNBQWlCLEVBQUUsYUFBcUIsRUFBRSxlQUE0QjtRQUN4RyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDOUMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUN4QyxlQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1lBQzVFLGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDekUsSUFBSSxTQUFTLEdBQUcsYUFBYSxFQUFFLENBQUM7Z0JBQzlCLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxDQUFDLENBQUM7WUFDM0UsQ0FBQztZQUNELElBQUksU0FBUyxHQUFHLGFBQWEsRUFBRSxDQUFDO2dCQUM5QixlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7WUFFRCxPQUFPO1FBQ1QsQ0FBQztRQUVELGVBQWUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDMUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUMzRSxJQUFJLFNBQVMsR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUM5QixlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxJQUFJLFNBQVMsR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUM5QixlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFFSCxDQUFDO0lBRU8sZUFBZSxDQUFDLGdCQUE2QjtRQUNuRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBa0MsQ0FBQztRQUN2SSxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVmLEtBQUssQ0FBQyxJQUFJLENBQWMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDaEUsSUFBSSxZQUFZLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUM1RCxPQUFPO1lBQ1QsQ0FBQztZQUNELEtBQUssSUFBSSxDQUFDLENBQUM7WUFDWCxZQUFZLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsZ0JBQTZCLEVBQUUsc0NBQWdEO1FBQ3RHLE1BQU0sZUFBZSxHQUFHLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFrQyxDQUFDO1FBRXZJLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUMxRSxLQUFLLENBQUMsSUFBSSxDQUFjLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFlBQVksRUFBRSxFQUFFO1lBQ2hFLElBQUksWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDNUQsT0FBTztZQUNULENBQUM7WUFDRCxZQUFZLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0JBQy9ELFlBQVksQ0FBQyxlQUFlLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN4QixZQUFZLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUN2QixZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO2dCQUNwRSxJQUFJLENBQUMsc0NBQXNDLEVBQUUsQ0FBQztvQkFFNUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsMkNBQTJDLENBQUMsQ0FBQztnQkFDN0UsQ0FBQztnQkFDRCxZQUFZLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1lBQzNFLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLENBQUM7d0dBamdCVSxzQ0FBc0M7NEZBQXRDLHNDQUFzQzs7NEZBQXRDLHNDQUFzQztrQkFMbEQsU0FBUzttQkFBQztvQkFDVCw4REFBOEQ7b0JBQzlELFFBQVEsRUFBRSwwQ0FBMEM7b0JBQ3BELFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgT25EZXN0cm95LCBlZmZlY3QsIGlucHV0LCBtb2RlbCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyLCBjbG9uZURlZXAsIGdldCwgc2V0LCB1dWlkIH0gZnJvbSBcIkBsaWJzLXVpL3V0aWxzXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBkZWJvdW5jZVRpbWUsIGZpbHRlciwgdGFrZVVudGlsIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IHN0eWxlQ29udGFpbmVyIH0gZnJvbSBcIi4vZGVmaW5lcy9jc3MuZGVmaW5lXCI7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzRHJhZ1Njcm9sbERpcmVjdGl2ZSB9IGZyb20gXCIuL2RyYWctc2Nyb2xsLmRpcmVjdGl2ZVwiO1xuaW1wb3J0IHsgSURyYWdEcm9wRnVuY3Rpb25Db250cm9sRXZlbnQsIElEcmFnRW5kLCBJRHJhZ0xlYXZlLCBJRHJhZ092ZXIsIElEcmFnU3RhcnQsIElEcmFnZ2luZywgSURyb3AgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2V2ZW50LmludGVyZmFjZVwiO1xuQERpcmVjdGl2ZSh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiBcIltMaWJzVWlDb21wb25lbnRzRHJhZ0NvbnRhaW5lckRpcmVjdGl2ZV1cIixcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0RyYWdDb250YWluZXJEaXJlY3RpdmUgZXh0ZW5kcyBMaWJzVWlDb21wb25lbnRzRHJhZ1Njcm9sbERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8vICNyZWdpb24gUFJPUEVSVFlcbiAgcHJpdmF0ZSBncm91cElEID0gc2lnbmFsPHN0cmluZz4odXVpZCgpKTtcbiAgcHJpdmF0ZSBpc0RyYWdPdmVyID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAvLyAjcmVnaW9uIElOUFVUXG4gIHJlYWRvbmx5IGRpc2FibGVEcmFnQ29udGFpbmVyID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgbW9kZSA9IGlucHV0PHN0cmluZywgJ21vdmUnIHwgJ2NvcHknIHwgJ2RlZXBDb3B5Jz4oJ21vdmUnLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ21vdmUnIH0pO1xuICByZWFkb25seSBkaXJlY3Rpb25EcmFnID0gaW5wdXQ8J2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJz4oKTtcbiAgcmVhZG9ubHkgdmlld0VuY2Fwc3VsYXRpb24gPSBpbnB1dDwnZW11bGF0ZWQnIHwgJ25vbmUnLCAnZW11bGF0ZWQnIHwgJ25vbmUnIHwgdW5kZWZpbmVkPignZW11bGF0ZWQnLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ2VtdWxhdGVkJyB9KTtcbiAgcmVhZG9ubHkgYWNjZXB0RHJhZ1NhbWVHcm91cCA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gZmFsc2UgfSk7XG4gIHJlYWRvbmx5IHBsYWNlaG9sZGVyID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4odHJ1ZSwgeyB0cmFuc2Zvcm06IHZhbHVlID0+IHZhbHVlID8/IHRydWUgfSk7XG4gIHJlYWRvbmx5IGdyb3VwTmFtZSA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignZ3JvdXBEcmFnQW5kRHJvcERlZmF1bHQnLCB7IHRyYW5zZm9ybTogdmFsdWUgPT4gdmFsdWUgPz8gJ2dyb3VwRHJhZ0FuZERyb3BEZWZhdWx0JyB9KTsgLy8gbuG6v3UgY8OhYyBncm91cCBjw7MgdMOqbiB0csO5bmcgbmhhdSBz4bq9IMSRxrDhu6NjIGRyb3BcbiAgcmVhZG9ubHkgZHJvcFRvR3JvdXBOYW1lID0gaW5wdXQ8QXJyYXk8c3RyaW5nPiB8IG51bGw+KG51bGwpOyAvLyBu4bq/dSBpdGVtIHRyb25nIGPDoWMgZ3JvdXAgQSDEkcaw4bujYyBkcm9wIHbDoG8gZ3JvdXAgQiBuaMawbmcgZ3JvdXAgQiBraMO0bmcgxJHGsOG7o2MgZHJvcCB2w6BvIGdyb3VwIEFcbiAgcmVhZG9ubHkgaXRlbXMgPSBtb2RlbC5yZXF1aXJlZDxBcnJheTx1bmtub3duPj4oKTtcbiAgcmVhZG9ubHkgc3R5bGVzT3ZlcnJpZGUgPSBpbnB1dDxBcnJheTx7IGNsYXNzTmFtZTogc3RyaW5nLCBzdHlsZXM6IHN0cmluZyB9Pj4oKTtcblxuICAvLyAjcmVnaW9uIE9VVFBVVFxuICByZWFkb25seSBvdXREcmFnU3RhcnRDb250YWluZXIgPSBvdXRwdXQ8SURyYWdTdGFydD4oKTtcbiAgcmVhZG9ubHkgb3V0RHJhZ092ZXJDb250YWluZXIgPSBvdXRwdXQ8SURyYWdPdmVyPigpO1xuICByZWFkb25seSBvdXREcmFnTGVhdmVDb250YWluZXIgPSBvdXRwdXQ8SURyYWdMZWF2ZT4oKTtcbiAgcmVhZG9ubHkgb3V0RHJhZ0VuZENvbnRhaW5lciA9IG91dHB1dDxJRHJhZ0VuZD4oKTtcbiAgcmVhZG9ubHkgb3V0RHJvcHBlZENvbnRhaW5lciA9IG91dHB1dDxJRHJvcD4oKTtcbiAgcmVhZG9ubHkgb3V0RHJvcHBlZENvbnRhaW5lckVtcHR5ID0gb3V0cHV0PElEcm9wPigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbkNvbnRyb2wgPSBvdXRwdXQ8SURyYWdEcm9wRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgY29udGFpbmVyID0geyBlbGVtZW50IH07XG5cbiAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5Db250YWluZXIoKS5zZXQodGhpcy5ncm91cElEKCksIGNvbnRhaW5lcik7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgc2V0KGNvbnRhaW5lciwgJ2VsZW1lbnRTY3JvbGwnLCB0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlyZWN0aW9uRHJhZygpICYmIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSAmJiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vdXRGdW5jdGlvbkNvbnRyb2wuZW1pdCh7IHNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZzogKCkgPT4gdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIH0pO1xuXG4gICAgdGhpcy5vdXREcm9wcGVkQ29udGFpbmVyLnN1YnNjcmliZShldmVudERyb3BwZWQgPT4ge1xuICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25Ecm9wQ29udGFpbmVyLm5leHQoZXZlbnREcm9wcGVkKTtcbiAgICB9KTtcbiAgICB0aGlzLm9uRGVzdHJveS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKGluZGV4U3BsaWNlTGlzdFRvID4gLTEpIHtcbiAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleFNwbGljZUxpc3RUbywgMSk7XG4gICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc107XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5Db250YWluZXIoKS5kZWxldGUodGhpcy5ncm91cElEKCkpO1xuICAgIH0pO1xuICAgIGNvbnN0IGVsZW1lbnRDb250YWluZXIgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgIHRoaXMuaW5pdFN0eWxlQW5kQXR0cmlidXRlKGVsZW1lbnRDb250YWluZXIsIHRydWUpO1xuICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uSXRlbUluaXQucGlwZShkZWJvdW5jZVRpbWUoMjUwKSwgZmlsdGVyKGdyb3VwTmFtZSA9PiBncm91cE5hbWUgPT09IHRoaXMuZ3JvdXBOYW1lKCkpLCB0YWtlVW50aWwodGhpcy5vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5pbml0U3R5bGVBbmRBdHRyaWJ1dGUoZWxlbWVudENvbnRhaW5lcikpO1xuICAgIGNvbnN0IHN0eWxlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXG4gICAgc3R5bGVUYWcudGV4dENvbnRlbnQgPSBzdHlsZUNvbnRhaW5lcigodGhpcy5zdHlsZXNPdmVycmlkZSgpIHx8IFtdKSwgdGhpcy52aWV3RW5jYXBzdWxhdGlvbigpLCB0aGlzLmdyb3VwSUQoKSk7XG4gICAgZWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG4gICAgZWxlbWVudENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzQ29udGFpbmVyRGVmaW5lKTtcblxuICAgIGNvbnN0IGhhbmRsZXJEcmFnU3RhcnQgPSAoZXZlbnREcmFnU3RhcnQ6IElEcmFnU3RhcnQpID0+IHtcblxuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICBpZiAodGhpcy5ncm91cElEKCkgPT09IGV2ZW50RHJhZ1N0YXJ0LmVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpKSB7XG4gICAgICAgIHRoaXMub3V0RHJhZ1N0YXJ0Q29udGFpbmVyLmVtaXQoeyAuLi5ldmVudERyYWdTdGFydCwgaXRlbURyYWdJbmZvOiB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8gfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHN0b3JlSW5kZXggPSB7IGluZGV4RHJhZzogLTEsIGluZGV4RHJhZ092ZXI6IC0xIH07XG4gICAgbGV0IGluZGV4U3BsaWNlTGlzdFRvID0gLTE7XG4gICAgY29uc3QgaGFuZGxlckRyYWdPdmVyID0gKGV2ZW50RHJhZ092ZXI6IElEcmFnT3ZlcikgPT4ge1xuICAgICAgY29uc3QgeyBlbGVtZW50RHJhZywgZWxlbWVudERyYWdPdmVyIH0gPSBldmVudERyYWdPdmVyO1xuXG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpIHx8ICF0aGlzLmRyYWdEcm9wU2VydmljZS5jaGVja0VsZW1lbnRPdmVyQWNjZXB0RWxlbWVudERyYWcodGhpcy5ncm91cE5hbWUoKSwgZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cE5hbWUnKSwgZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdkcm9wVG9Hcm91cE5hbWUnKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5kZXhEcmFnID0gTnVtYmVyKGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpO1xuICAgICAgY29uc3QgaW5kZXhEcmFnT3ZlciA9IE51bWJlcihlbGVtZW50RHJhZ092ZXIuZ2V0QXR0cmlidXRlKCdpbmRleCcpKS52YWx1ZU9mKCk7XG4gICAgICBjb25zdCBpZEdyb3VwRWxlbWVudERyYWcgPSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKTtcbiAgICAgIGNvbnN0IGlkR3JvdXBFbGVtZW50RHJhZ092ZXIgPSBlbGVtZW50RHJhZ092ZXIuZ2V0QXR0cmlidXRlKCdncm91cElEJyk7XG5cbiAgICAgIGlmICgodGhpcy5ncm91cElEKCkgIT09IGlkR3JvdXBFbGVtZW50RHJhZykgfHwgKGlkR3JvdXBFbGVtZW50RHJhZyAhPT0gaWRHcm91cEVsZW1lbnREcmFnT3ZlcikpIHsgLy8geOG7rSBsw70gY2hvIGl0ZW0gZHJhZyBvdmVyIHF1YSAxIGl0ZW0ga2jDoWMgY29udGFpbmVyXG4gICAgICAgIGlmIChpZEdyb3VwRWxlbWVudERyYWdPdmVyID09PSB0aGlzLmdyb3VwSUQoKSAmJiB0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5tb2RlKCkgPT09ICdkZWVwQ29weScgPyBjbG9uZURlZXAodGhpcy5kcmFnRHJvcFNlcnZpY2UuSXRlbURyYWdJbmZvPy5pdGVtKSA6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mbz8uaXRlbTtcblxuICAgICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICAgIGlmIChpbmRleFNwbGljZUxpc3RUbyA+PSAwKSB7XG4gICAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpbmRleFNwbGljZUxpc3RUbywgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhEcmFnT3ZlciwgMCwgaXRlbSk7XG4gICAgICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZUVsZW1lbnRBbmRJdGVtRHJhZyhlbGVtZW50Q29udGFpbmVyLCBmYWxzZSwgaW5kZXhTcGxpY2VMaXN0VG8pO1xuICAgICAgICAgIGluZGV4U3BsaWNlTGlzdFRvID0gaW5kZXhEcmFnT3ZlcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmFjY2VwdERyYWdTYW1lR3JvdXAoKSB8fCBpbmRleERyYWcgPCAwIHx8IGluZGV4RHJhZ092ZXIgPCAwIHx8ICF0aGlzLml0ZW1zKCkubGVuZ3RoIHx8IGluZGV4RHJhZyA+IHRoaXMuaXRlbXMoKS5sZW5ndGggfHwgaW5kZXhEcmFnT3ZlciA+IHRoaXMuaXRlbXMoKS5sZW5ndGggfHwgKHN0b3JlSW5kZXguaW5kZXhEcmFnID09PSBpbmRleERyYWcgJiYgc3RvcmVJbmRleC5pbmRleERyYWdPdmVyID09PSBpbmRleERyYWdPdmVyKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB44butIGzDvSBjaG8gaXRlbSBkcmFnIG92ZXIgcXVhIDEgaXRlbSBjw7luZyBjb250YWluZXJcbiAgICAgIGNvbnN0IGl0ZW1EcmFnID0gdGhpcy5pdGVtcygpW2luZGV4RHJhZ107XG5cbiAgICAgIHRoaXMuc2V0QW5pbWF0aW9uRWxlbWVudERyYWdPdmVyKGluZGV4RHJhZywgaW5kZXhEcmFnT3ZlciwgZWxlbWVudERyYWdPdmVyKTtcbiAgICAgIHN0b3JlSW5kZXguaW5kZXhEcmFnID0gaW5kZXhEcmFnO1xuICAgICAgc3RvcmVJbmRleC5pbmRleERyYWdPdmVyID0gaW5kZXhEcmFnT3ZlcjtcbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJhZywgMSk7XG4gICAgICAgIGl0ZW1zLnNwbGljZShpbmRleERyYWdPdmVyLCAwLCBpdGVtRHJhZyk7XG4gICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgfSk7XG4gICAgICBlbGVtZW50RHJhZy5zZXRBdHRyaWJ1dGUoJ2luZGV4JywgaW5kZXhEcmFnT3Zlci50b1N0cmluZygpKTtcbiAgICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZW1vdmVQbGFjZWhvbGRlckRyYWcgPSAoZXZlbnREcmFnOiBJRHJhZ0VuZCwgaXNEcmFnZ2luZz86IGJvb2xlYW4pID0+IHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbFNjcm9sbFRvRWxlbWVudCgpKTtcbiAgICAgIHN0b3JlSW5kZXguaW5kZXhEcmFnID0gLTE7XG4gICAgICBzdG9yZUluZGV4LmluZGV4RHJhZ092ZXIgPSAtMTtcbiAgICAgIGNvbnN0IGNoaWxkcmVuRWxlbWVudCA9IGVsZW1lbnRDb250YWluZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0aGlzLmRyYWdEcm9wU2VydmljZS5DbGFzc0l0ZW1EZWZpbmUpIGFzIHVua25vd24gYXMgQXJyYXk8SFRNTEVsZW1lbnQ+O1xuXG4gICAgICBpZiAoIWNoZWNrTW91c2VPdmVySW5Db250YWluZXIoZXZlbnREcmFnLm1vdXNlUG9zaXRpb24sICh0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkgfHwgZWxlbWVudENvbnRhaW5lcikpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRWxlbWVudEluZGV4ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5maW5kSW5kZXgoKGNoaWxkKSA9PiBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tZHJvcC1wbGFjZWhvbGRlcicpKTtcblxuICAgICAgICBpZiAoY2hpbGRFbGVtZW50SW5kZXggPj0gMCAmJiB0aGlzLmdyb3VwSUQoKSAhPT0gZXZlbnREcmFnLmVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpKSB7XG4gICAgICAgICAgdGhpcy5pdGVtcy51cGRhdGUoaXRlbXMgPT4ge1xuICAgICAgICAgICAgaXRlbXMuc3BsaWNlKGNoaWxkRWxlbWVudEluZGV4LCAxKTtcbiAgICAgICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGluZGV4U3BsaWNlTGlzdFRvID0gLTE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZXMoZWxlbWVudENvbnRhaW5lciwgaXNEcmFnZ2luZyk7XG4gICAgICAgIHRoaXMuc2V0SW5kZXhFbGVtZW50KGVsZW1lbnRDb250YWluZXIpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleFNwbGljZUxpc3RUbyA+PSAwKSB7XG4gICAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXhTcGxpY2VMaXN0VG8sIDEpO1xuICAgICAgICAgIHJldHVybiBbLi4uaXRlbXNdO1xuICAgICAgICB9KTtcbiAgICAgICAgaW5kZXhTcGxpY2VMaXN0VG8gPSAtMTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlckRyYWdnaW5nID0gKGV2ZW50RHJhZ2dpbmc6IElEcmFnZ2luZykgPT4ge1xuICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcik7XG4gICAgICBjb25zdCB7IGVsZW1lbnREcmFnIH0gPSBldmVudERyYWdnaW5nO1xuICAgICAgY29uc3QgZmllbGRJZEl0ZW0gPSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2ZpZWxkX2lkJyk7XG4gICAgICBjb25zdCBpZEl0ZW1EcmFnID0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdpdGVtX2lkJyk7XG5cbiAgICAgIGlmIChmaWVsZElkSXRlbSAmJiBpZEl0ZW1EcmFnICYmIHRoaXMuaXRlbXMoKS5maW5kKGl0ZW0gPT4gZ2V0KGl0ZW0sIGZpZWxkSWRJdGVtKSA9PT0gaWRJdGVtRHJhZykpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgICAgIGNvbnN0IGNoaWxkRWxlbWVudCA9IEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZmluZCgoY2hpbGQpID0+IGNoaWxkLmdldEF0dHJpYnV0ZSgnaXRlbV9pZCcpID09PSBpZEl0ZW1EcmFnKTtcblxuICAgICAgICBpZiAodGhpcy5pdGVtcygpID09PSBldmVudERyYWdnaW5nLml0ZW1EcmFnSW5mbz8uaXRlbXNEcmFnKCkgJiYgY2hpbGRFbGVtZW50ICYmICFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLWRyb3AtcGxhY2Vob2xkZXInKSAmJiAhY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSh0aGlzLmRyYWdEcm9wU2VydmljZS5UYXJnZXRJdGVtRHJhZ0ZsYWcpKSB7XG4gICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSh0aGlzLmRyYWdEcm9wU2VydmljZS5UYXJnZXRJdGVtRHJhZ0ZsYWcsICd0cnVlJyk7XG4gICAgICAgICAgdGhpcy5ncm91cElELnNldChlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSB8fCAnJyk7XG4gICAgICAgICAgc3R5bGVUYWcucmVtb3ZlKCk7XG4gICAgICAgICAgc3R5bGVUYWcudGV4dENvbnRlbnQgPSBzdHlsZUNvbnRhaW5lcigodGhpcy5zdHlsZXNPdmVycmlkZSgpIHx8IFtdKSwgdGhpcy52aWV3RW5jYXBzdWxhdGlvbigpLCB0aGlzLmdyb3VwSUQoKSk7XG4gICAgICAgICAgZWxlbWVudENvbnRhaW5lci5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG4gICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lciwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykgJiYgIXRoaXMuYWNjZXB0RHJhZ1NhbWVHcm91cCgpKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBbmRTY3JvbGxFbGVtZW50VG9Qb3NpdGlvbihldmVudERyYWdnaW5nLCB0aGlzLmlnbm9yZUF1dG9TY3JvbGwoKSB8fCAhdGhpcy5hY2NlcHREcmFnU2FtZUdyb3VwKCkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudERyYWdnaW5nLm1vdXNlUG9zaXRpb24sICh0aGlzLnJvb3RFbGVtZW50U2Nyb2xsKCkgfHwgZWxlbWVudENvbnRhaW5lcikpKSB7XG4gICAgICAgIGlmICh0aGlzLmlzRHJhZ092ZXIoKSkge1xuICAgICAgICAgIHRoaXMuaXNEcmFnT3Zlci5zZXQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMub3V0RHJhZ0xlYXZlQ29udGFpbmVyLmVtaXQoeyAuLi5ldmVudERyYWdnaW5nLCBlbGVtZW50RHJhZ0xlYXZlOiBlbGVtZW50Q29udGFpbmVyIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbW92ZVBsYWNlaG9sZGVyRHJhZyhldmVudERyYWdnaW5nLCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tBbmRTY3JvbGxFbGVtZW50VG9Qb3NpdGlvbihldmVudERyYWdnaW5nLCB0aGlzLmlnbm9yZUF1dG9TY3JvbGwoKSk7XG5cbiAgICAgIC8vIMSQb+G6oW4gY29kZSB44butIGzDvSBjaG8gdmnhu4djIGvDqW8gbeG7mXQgZWxlbWVudCB2w6BvIDEgY29udGFpbmVyIG5oxrBuZyBjb250YWluZXIga2jDtG5nIGPDsyBpdGVtIGhv4bq3YyBpdGVtIGRyYWcga2jDtG5nIG92ZXIgcXVhIGl0ZW0gdHJvbmcgY29udGFpbmVyXG4gICAgICBpZiAoIXRoaXMuaXNEcmFnT3ZlcigpKSB7XG4gICAgICAgIGVsZW1lbnRDb250YWluZXIuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtY29udGFpbmVyLWRyYWdvdmVyJyk7XG4gICAgICAgIHRoaXMuaXNEcmFnT3Zlci5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMub3V0RHJhZ092ZXJDb250YWluZXIuZW1pdCh7IC4uLmV2ZW50RHJhZ2dpbmcsIGVsZW1lbnREcmFnT3ZlcjogZWxlbWVudENvbnRhaW5lciB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2ZW50RHJhZ092ZXIgPSB7IC4uLmV2ZW50RHJhZ2dpbmcsIGVsZW1lbnREcmFnT3ZlcjogZWxlbWVudENvbnRhaW5lciB9O1xuXG4gICAgICBpZiAoIXRoaXMuaXRlbXMoKS5sZW5ndGgpIHtcbiAgICAgICAgZXZlbnREcmFnT3Zlci5lbGVtZW50RHJhZ092ZXIgPSB7XG4gICAgICAgICAgZ2V0QXR0cmlidXRlOiAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2dyb3VwSUQnKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmdyb3VwSUQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChuYW1lICE9PSAnaW5kZXgnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYXMgdW5rbm93biBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnT3Zlci5uZXh0KGV2ZW50RHJhZ092ZXIpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgICBsZXQgY2hpbGRFbGVtZW50ID0gQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5maW5kKChjaGlsZCkgPT4gY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lcihldmVudERyYWdnaW5nLm1vdXNlUG9zaXRpb24sIGNoaWxkKSk7XG5cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQpIHsgLy8gbuG6v3UgdMOsbSB0aOG6pXkgdGjDrCBz4bq9IG5o4bqtbiBxdWEgc+G7sSBraeG7h24gY+G7p2EgZHJhZy1pdGVtLmRpcmVjdGl2ZSBlbWl0XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoaWxkRWxlbWVudCA9IEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkucG9wKCk7XG5cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQpIHtcbiAgICAgICAgZXZlbnREcmFnT3Zlci5lbGVtZW50RHJhZ092ZXIgPSBjaGlsZEVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJhZ092ZXIubmV4dChldmVudERyYWdPdmVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlckRyYWdFbmQgPSAoZXZlbnREcmFnRW5kOiBJRHJhZ0VuZCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgcmVjdCA9IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHRoaXMucm9vdEVsZW1lbnRTY3JvbGwoKSB8fCBlbGVtZW50Q29udGFpbmVyKSB7XG4gICAgICAgIHJlY3QgPSAodGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIpPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIH1cbiAgICAgIHJlbW92ZVBsYWNlaG9sZGVyRHJhZyhldmVudERyYWdFbmQpO1xuICAgICAgY29uc3QgeyBlbGVtZW50RHJhZywgbW91c2VQb3NpdGlvbiwgaXRlbURyYWdJbmZvIH0gPSBldmVudERyYWdFbmQ7XG5cbiAgICAgIGlmICh0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyYWcuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgdGhpcy5vdXREcmFnRW5kQ29udGFpbmVyLmVtaXQoeyAuLi5ldmVudERyYWdFbmQgfSk7XG4gICAgICB9XG4gICAgICBpZiAoIWNoZWNrTW91c2VPdmVySW5Db250YWluZXIobW91c2VQb3NpdGlvbiwgdGhpcy5yb290RWxlbWVudFNjcm9sbCgpIHx8IGVsZW1lbnRDb250YWluZXIsIHJlY3QpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2ZW50RHJvcCA9IHsgZWxlbWVudERyYWc6IGVsZW1lbnREcmFnLCBlbGVtZW50RHJvcDogZWxlbWVudENvbnRhaW5lciwgaXRlbURyYWdJbmZvOiBpdGVtRHJhZ0luZm8gfTtcblxuICAgICAgaWYgKHRoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKSB8fCAhdGhpcy5kcmFnRHJvcFNlcnZpY2UuY2hlY2tFbGVtZW50T3ZlckFjY2VwdEVsZW1lbnREcmFnKHRoaXMuZ3JvdXBOYW1lKCksIGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJyksIGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJykpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgICBjb25zdCBjaGlsZEVsZW1lbnQgPSBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZpbmQoKGNoaWxkKSA9PiBjaGVja01vdXNlT3ZlckluQ29udGFpbmVyKG1vdXNlUG9zaXRpb24sIGNoaWxkKSk7XG5cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQpIHtcbiAgICAgICAgZXZlbnREcm9wLmVsZW1lbnREcm9wID0gY2hpbGRFbGVtZW50O1xuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3AubmV4dChldmVudERyb3ApO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGV2ZW50RHJvcC5lbGVtZW50RHJvcCA9IHtcbiAgICAgICAgZ2V0QXR0cmlidXRlOiAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgaWYgKG5hbWUgPT09ICdkcm9wQ29udGFpbmVyJykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChuYW1lID09PSAnZ3JvdXBJRCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdyb3VwSUQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5hbWUgIT09ICdpbmRleCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBjaGlsZHJlbkVsZW1lbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9IGFzIHVua25vd24gYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyb3AubmV4dChldmVudERyb3ApO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVyRHJvcCA9IChldmVudERyb3A6IElEcm9wKSA9PiB7XG4gICAgICBpZiAodGhpcy5kaXNhYmxlRHJhZ0NvbnRhaW5lcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgZWxlbWVudERyYWcsIGVsZW1lbnREcm9wLCBpdGVtRHJhZ0luZm8gfSA9IGV2ZW50RHJvcDtcblxuICAgICAgaWYgKHRoaXMuZ3JvdXBJRCgpID09PSBlbGVtZW50RHJhZy5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSAmJiB0aGlzLmdyb3VwSUQoKSA9PT0gZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdncm91cElEJykpIHtcbiAgICAgICAgaWYgKGl0ZW1EcmFnSW5mbykge1xuICAgICAgICAgIGl0ZW1EcmFnSW5mby5pbmRleERyb3AgPSBOdW1iZXIoZWxlbWVudERyb3AuZ2V0QXR0cmlidXRlKCdpbmRleCcpKS52YWx1ZU9mKCk7XG4gICAgICAgICAgaXRlbURyYWdJbmZvLml0ZW1zRHJvcCA9IHRoaXMuaXRlbXM7XG4gICAgICAgICAgaXRlbURyYWdJbmZvLmNvbnRhaW5lckRyb3AgPSBlbGVtZW50Q29udGFpbmVyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjY2VwdERyYWdTYW1lR3JvdXAoKSkge1xuICAgICAgICAgIHRoaXMub3V0RHJvcHBlZENvbnRhaW5lci5lbWl0KGV2ZW50RHJvcCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVzKGVsZW1lbnRDb250YWluZXIpO1xuICAgICAgICB0aGlzLnNldEluZGV4RWxlbWVudChlbGVtZW50Q29udGFpbmVyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5ncm91cElEKCkgIT09IGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpIHx8IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpID09PSBlbGVtZW50RHJvcC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleERyYWdPdmVyID0gdGhpcy5ncm91cElEKCkgIT09IGVsZW1lbnREcmFnLmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpID8gTnVtYmVyKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpIDogTnVtYmVyKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnaW5kZXgnKSkudmFsdWVPZigpIC0gKGVsZW1lbnREcm9wLmdldEF0dHJpYnV0ZSgnZHJvcENvbnRhaW5lcicpID8gMCA6IDEpO1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMubW9kZSgpID09PSAnZGVlcENvcHknID8gY2xvbmVEZWVwKGl0ZW1EcmFnSW5mbz8uaXRlbSkgOiBpdGVtRHJhZ0luZm8/Lml0ZW07XG5cbiAgICAgIGlmIChpdGVtRHJhZ0luZm8pIHtcbiAgICAgICAgaXRlbURyYWdJbmZvLmluZGV4RHJvcCA9IGluZGV4RHJhZ092ZXI7XG4gICAgICAgIGl0ZW1EcmFnSW5mby5pdGVtc0Ryb3AgPSB0aGlzLml0ZW1zO1xuICAgICAgICBpdGVtRHJhZ0luZm8uY29udGFpbmVyRHJvcCA9IGVsZW1lbnRDb250YWluZXI7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5pdGVtcygpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLm91dERyb3BwZWRDb250YWluZXJFbXB0eS5lbWl0KGV2ZW50RHJvcCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaXRlbXMudXBkYXRlKGl0ZW1zID0+IHtcbiAgICAgICAgaXRlbXMuc3BsaWNlKGluZGV4RHJhZ092ZXIsIDAsIGl0ZW0pO1xuICAgICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGl0ZW1EcmFnSW5mbyAmJiBpdGVtRHJhZ0luZm8uaXRlbXNNb3ZlICYmIGl0ZW1EcmFnSW5mby5pdGVtc01vdmUoKSkge1xuICAgICAgICBpdGVtRHJhZ0luZm8uaXRlbXNEcmFnLnNldChbLi4uaXRlbURyYWdJbmZvLml0ZW1zTW92ZSgpXSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRBdHRyaWJ1dGVFbGVtZW50QW5kSXRlbURyYWcoZWxlbWVudENvbnRhaW5lcikpO1xuICAgICAgfVxuICAgICAgdGhpcy5vdXREcm9wcGVkQ29udGFpbmVyLmVtaXQoZXZlbnREcm9wKTtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyKTtcbiAgICAgIHRoaXMuc2V0SW5kZXhFbGVtZW50KGVsZW1lbnRDb250YWluZXIpO1xuICAgIH07XG5cbiAgICBbe1xuICAgICAgbmFtZTogJ09uRHJhZ1N0YXJ0JyxcbiAgICAgIGV2ZW50OiB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdTdGFydCxcbiAgICAgIGZ1bmN0aW9uQ2FsbDogaGFuZGxlckRyYWdTdGFydFxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdPbkRyYWdPdmVyJyxcbiAgICAgIGV2ZW50OiB0aGlzLmRyYWdEcm9wU2VydmljZS5PbkRyYWdPdmVyLFxuICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJhZ092ZXIsXG4gICAgICBkZWJvdW5jZVRpbWU6IDVcbiAgICB9LCB7XG4gICAgICBuYW1lOiAnT25EcmFnZ2luZycsXG4gICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnZ2luZyxcbiAgICAgIGZ1bmN0aW9uQ2FsbDogaGFuZGxlckRyYWdnaW5nXG4gICAgfSwge1xuICAgICAgbmFtZTogJ09uRHJhZ0VuZCcsXG4gICAgICBldmVudDogdGhpcy5kcmFnRHJvcFNlcnZpY2UuT25EcmFnRW5kLFxuICAgICAgZnVuY3Rpb25DYWxsOiBoYW5kbGVyRHJhZ0VuZFxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdPbkRyb3AnLFxuICAgICAgZXZlbnQ6IHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLk9uRHJvcCxcbiAgICAgIGZ1bmN0aW9uQ2FsbDogaGFuZGxlckRyb3BcbiAgICB9XG4gICAgXS5mb3JFYWNoKChpdGVtOiB7IG5hbWU6IHN0cmluZzsgZGVib3VuY2VUaW1lPzogbnVtYmVyOyBldmVudDogT2JzZXJ2YWJsZTx1bmtub3duPjsgZnVuY3Rpb25DYWxsOiBvYmplY3QgfSkgPT4gKGl0ZW0uZXZlbnQucGlwZShkZWJvdW5jZVRpbWUoaXRlbS5kZWJvdW5jZVRpbWUgfHwgMCksIHRha2VVbnRpbCh0aGlzLm9uRGVzdHJveSkpLnN1YnNjcmliZShpdGVtLmZ1bmN0aW9uQ2FsbCkpKTtcbiAgfVxuXG4gIC8qICovXG4gIHByaXZhdGUgYXN5bmMgc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50LCBzZXRJdGVtRHJhZz86IGJvb2xlYW4sIGluZGV4SW5zZXJ0PzogbnVtYmVyKSB7XG4gICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgbGV0IGluZGV4ID0gLTE7XG5cbiAgICBlbGVtZW50Q29udGFpbmVyLnNldEF0dHJpYnV0ZSgnZ3JvdXBJRCcsIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICBlbGVtZW50Q29udGFpbmVyLnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInKTtcblxuICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgIGVsZW1lbnRDb250YWluZXIuc2V0QXR0cmlidXRlKCdkaXNhYmxlRHJhZ0NvbnRhaW5lcicsIGAke3RoaXMuZGlzYWJsZURyYWdDb250YWluZXIoKX1gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JvdXBOYW1lKCkpIHtcbiAgICAgIGVsZW1lbnRDb250YWluZXIuc2V0QXR0cmlidXRlKCdncm91cE5hbWUnLCB0aGlzLmdyb3VwTmFtZSgpIHx8ICcnKTtcbiAgICB9XG4gICAgQXJyYXkuZnJvbTxIVE1MRWxlbWVudD4oY2hpbGRyZW5FbGVtZW50KS5mb3JFYWNoKChjaGlsZEVsZW1lbnQpID0+IHtcbiAgICAgIGlmICghY2hpbGRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZ3JvdXBOYW1lJykgfHwgY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJykgPT09IHRoaXMuZ3JvdXBOYW1lKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZ3JvdXBJRCcsIHRoaXMuZ3JvdXBJRCgpKTtcbiAgICAgIH1cbiAgICAgIGlmIChjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdncm91cElEJykgIT09IHRoaXMuZ3JvdXBJRCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluZGV4ICs9IDE7XG4gICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKCdpbmRleCcsIGAke2luZGV4fWApO1xuICAgICAgY2hpbGRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInKTtcbiAgICAgIGlmICh0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZURyYWdDb250YWluZXInLCBgJHt0aGlzLmRpc2FibGVEcmFnQ29udGFpbmVyKCl9YCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ncm91cE5hbWUoKSAmJiAhY2hpbGRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZ3JvdXBOYW1lJykpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZ3JvdXBOYW1lJywgdGhpcy5ncm91cE5hbWUoKSB8fCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wbGFjZWhvbGRlcigpKSB7XG4gICAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgYCR7dGhpcy5wbGFjZWhvbGRlcigpfWApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZHJvcFRvR3JvdXBOYW1lKCkpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJywgYCR7dGhpcy5kcm9wVG9Hcm91cE5hbWUoKT8uam9pbignOycpfWApO1xuICAgICAgfVxuICAgICAgaWYgKGluZGV4SW5zZXJ0ID09PSBpbmRleCAmJiB0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNldEl0ZW1EcmFnICYmIGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUodGhpcy5kcmFnRHJvcFNlcnZpY2UuVGFyZ2V0SXRlbURyYWdGbGFnKSAmJiB0aGlzLml0ZW1zKCkubGVuZ3RoID49IGluZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLnBsYWNlaG9sZGVyKCkpIHtcbiAgICAgICAgICBpZiAoIWNoaWxkRWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInKSkge1xuICAgICAgICAgICAgY2hpbGRFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tcGxhY2Vob2xkZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLW9yaWdpbi1wbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1vcmlnaW4tcGxhY2Vob2xkZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyYWdEcm9wU2VydmljZS5JdGVtRHJhZ0luZm8gPSB7IGl0ZW06IHRoaXMuaXRlbXMoKVtpbmRleF0gYXMgb2JqZWN0LCBpbmRleERyYWc6IGluZGV4LCBpdGVtc0RyYWc6IHRoaXMuaXRlbXMsIGNvbnRhaW5lckRyYWc6IGVsZW1lbnRDb250YWluZXIsIGl0ZW1zTW92ZTogc2lnbmFsKFsuLi50aGlzLml0ZW1zKCldKSB9O1xuICAgICAgICBpZiAodGhpcy5tb2RlKCkgPT09ICdtb3ZlJykge1xuICAgICAgICAgIHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkl0ZW1EcmFnSW5mby5pdGVtc01vdmU/LnVwZGF0ZShpdGVtcyA9PiB7XG4gICAgICAgICAgICBpdGVtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgcmV0dXJuIFsuLi5pdGVtc11cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3R5bGVBbmRBdHRyaWJ1dGUoZWxlbWVudENvbnRhaW5lcjogSFRNTEVsZW1lbnQsIGhhc1JlbW92ZUF0dHJpYnV0ZSA9IGZhbHNlLCkge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlRWxlbWVudEFuZEl0ZW1EcmFnKGVsZW1lbnRDb250YWluZXIpO1xuICAgIGlmIChoYXNSZW1vdmVBdHRyaWJ1dGUpIHtcbiAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyKTtcbiAgICB9XG4gICAgdGhpcy5zZXRJbmRleEVsZW1lbnQoZWxlbWVudENvbnRhaW5lcik7XG4gIH07XG5cbiAgcHJpdmF0ZSBzZXRBbmltYXRpb25FbGVtZW50RHJhZ092ZXIoaW5kZXhEcmFnOiBudW1iZXIsIGluZGV4RHJhZ092ZXI6IG51bWJlciwgZWxlbWVudERyYWdPdmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGlmICghdGhpcy5kaXJlY3Rpb25EcmFnKCkgfHwgIWVsZW1lbnREcmFnT3Zlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5kaXJlY3Rpb25EcmFnKCkgPT09ICd2ZXJ0aWNhbCcpIHtcbiAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1ib3R0b20nKTtcbiAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS10b3AnKTtcbiAgICAgIGlmIChpbmRleERyYWcgPiBpbmRleERyYWdPdmVyKSB7XG4gICAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1ib3R0b20nKTtcbiAgICAgIH1cbiAgICAgIGlmIChpbmRleERyYWcgPCBpbmRleERyYWdPdmVyKSB7XG4gICAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS10b3AnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QucmVtb3ZlKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1sZWZ0Jyk7XG4gICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLXJpZ2h0Jyk7XG4gICAgaWYgKGluZGV4RHJhZyA+IGluZGV4RHJhZ092ZXIpIHtcbiAgICAgIGVsZW1lbnREcmFnT3Zlci5jbGFzc0xpc3QuYWRkKCdsaWJzLXVpLWRyYWctZHJvcC1pdGVtLXRyYW5zbGF0ZS1yaWdodCcpO1xuICAgIH1cbiAgICBpZiAoaW5kZXhEcmFnIDwgaW5kZXhEcmFnT3Zlcikge1xuICAgICAgZWxlbWVudERyYWdPdmVyLmNsYXNzTGlzdC5hZGQoJ2xpYnMtdWktZHJhZy1kcm9wLWl0ZW0tdHJhbnNsYXRlLWxlZnQnKTtcbiAgICB9XG5cbiAgfVxuXG4gIHByaXZhdGUgc2V0SW5kZXhFbGVtZW50KGVsZW1lbnRDb250YWluZXI6IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG4gICAgbGV0IGluZGV4ID0gLTE7XG5cbiAgICBBcnJheS5mcm9tPEhUTUxFbGVtZW50PihjaGlsZHJlbkVsZW1lbnQpLmZvckVhY2goKGNoaWxkRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2dyb3VwSUQnKSAhPT0gdGhpcy5ncm91cElEKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW5kZXggKz0gMTtcbiAgICAgIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2luZGV4JywgYCR7aW5kZXh9YCk7XG4gICAgfSk7XG5cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlQXR0cmlidXRlcyhlbGVtZW50Q29udGFpbmVyOiBIVE1MRWxlbWVudCwgaWdub3JlUmVtb3ZlQ2xhc3NJdGVtT3JpZ2luUGxhY2Vob2xkZXI/OiBib29sZWFuKSB7XG4gICAgY29uc3QgY2hpbGRyZW5FbGVtZW50ID0gZWxlbWVudENvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRoaXMuZHJhZ0Ryb3BTZXJ2aWNlLkNsYXNzSXRlbURlZmluZSkgYXMgdW5rbm93biBhcyBBcnJheTxIVE1MRWxlbWVudD47XG5cbiAgICBlbGVtZW50Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoJ2xpYnMtdWktZHJhZy1kcm9wLWNvbnRhaW5lci1kcmFnb3ZlcicpO1xuICAgIEFycmF5LmZyb208SFRNTEVsZW1lbnQ+KGNoaWxkcmVuRWxlbWVudCkuZm9yRWFjaCgoY2hpbGRFbGVtZW50KSA9PiB7XG4gICAgICBpZiAoY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZ3JvdXBJRCcpICE9PSB0aGlzLmdyb3VwSUQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdpbmRleCcpO1xuICAgICAgaWYgKCF0aGlzLmRyb3BUb0dyb3VwTmFtZSgpIHx8ICF0aGlzLmRyb3BUb0dyb3VwTmFtZSgpPy5sZW5ndGgpIHtcbiAgICAgICAgY2hpbGRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZHJvcFRvR3JvdXBOYW1lJyk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdwbGFjZWhvbGRlcicpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucGxhY2Vob2xkZXIoKSkge1xuICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1wbGFjZWhvbGRlcicpO1xuICAgICAgICBpZiAoIWlnbm9yZVJlbW92ZUNsYXNzSXRlbU9yaWdpblBsYWNlaG9sZGVyKSB7XG5cbiAgICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1vcmlnaW4tcGxhY2Vob2xkZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjaGlsZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbGlicy11aS1kcmFnLWRyb3AtaXRlbS1kcm9wLXBsYWNlaG9sZGVyJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfVxufVxuIl19
|
|
@@ -356,17 +356,13 @@ class LibsUiComponentsDragContainerDirective extends LibsUiComponentsDragScrollD
|
|
|
356
356
|
super();
|
|
357
357
|
const element = this.elementRef.nativeElement;
|
|
358
358
|
const container = { element };
|
|
359
|
-
this.dragDropService.Container.
|
|
360
|
-
data.set(this.groupID(), container);
|
|
361
|
-
return data;
|
|
362
|
-
});
|
|
359
|
+
this.dragDropService.Container().set(this.groupID(), container);
|
|
363
360
|
effect(() => {
|
|
364
361
|
if (!this.rootElementScroll()) {
|
|
365
362
|
return;
|
|
366
363
|
}
|
|
367
364
|
untracked(() => {
|
|
368
365
|
set(container, 'elementScroll', this.rootElementScroll());
|
|
369
|
-
this.dragDropService.Container.update(containerMap => new Map(containerMap));
|
|
370
366
|
});
|
|
371
367
|
});
|
|
372
368
|
effect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-drag-drop.mjs","sources":["../../../../../libs-ui/components/drag-drop/src/defines/css.define.ts","../../../../../libs-ui/components/drag-drop/src/drag-drop.service.ts","../../../../../libs-ui/components/drag-drop/src/drag-scroll.directive.ts","../../../../../libs-ui/components/drag-drop/src/drag-drop.directive.ts","../../../../../libs-ui/components/drag-drop/src/drag-item-in-container-virtual-scroll.directive.ts","../../../../../libs-ui/components/drag-drop/src/drag-item.directive.ts","../../../../../libs-ui/components/drag-drop/src/demo/demo.component.ts","../../../../../libs-ui/components/drag-drop/src/libs-ui-components-drag-drop.ts"],"sourcesContent":["export const styleContainer = (config: Array<{ className: string, styles: string }>, viewEncapsulation: 'emulated' | 'none', groupID: string): string => {\n const defaultConfig = [{\n className: 'libs-ui-drag-drop-container',\n styles: `display:block;`\n },\n {\n className: 'libs-ui-drag-drop-item',\n styles: `\n cursor:move;`\n },\n {\n className: 'libs-ui-drag-drop-item-placeholder',\n styles: `visibility: hidden;`\n },\n {\n className: 'libs-ui-drag-drop-item-origin-placeholder',\n styles: `visibility: hidden;`\n },\n {\n className: 'libs-ui-drag-drop-item-drop-placeholder',\n styles: `visibility: hidden;`\n },\n {\n className: 'libs-ui-drag-drop-item-dragging',\n styles: `cursor:move; user-select: none; `\n },\n {\n className: 'libs-ui-drag-drop-item-disable',\n styles: ` cursor:not-allowed;`\n },\n {\n className: 'libs-ui-drag-drop-item-translate-bottom',\n styles: `position:relative;animation: translateBottom 0.35s 1 ease;`\n },\n {\n className: 'libs-ui-drag-drop-item-translate-top',\n styles: `position:relative;animation: translateTop 0.35s 1 ease;`\n },\n {\n className: 'libs-ui-drag-drop-item-translate-left',\n styles: `position:relative;animation: translateLeft 0.35s 1 ease;`\n },\n {\n className: 'libs-ui-drag-drop-item-translate-right',\n styles: `position:relative;animation: translateRight 0.35s 1 ease;`\n }];\n\n config.forEach(item => {\n const itemExits = defaultConfig.find(defaultItem => defaultItem.className === item.className);\n\n if (itemExits) {\n itemExits.styles = item.styles;\n\n return;\n }\n defaultConfig.push(item);\n });\n const groupAttr = viewEncapsulation ? `[groupID~=\"${groupID}\"]` : '';\n let styles = '';\n\n defaultConfig.forEach((item) => {\n const style = `${groupAttr}.${item.className}{${item.styles}}`;\n\n styles = `${styles}${style}\\n`;\n });\n\n styles = ` @keyframes translateTop {\n 0% {\n transform: translateY(30px);\n }\n \n 100% {\n transform: translateX(0);\n }\n }\n \n @keyframes translateBottom {\n 0% {\n transform: translateY(-30px);\n }\n \n 100% {\n transform: translateX(0px);\n }\n }\n @keyframes translateLeft {\n 0% {\n transform: translateX(30px);\n }\n \n 100% {\n transform: translateX(0);\n }\n }\n \n @keyframes translateRight {\n 0% {\n transform: translateX(-30px);\n }\n \n 100% {\n transform: translateX(0px);\n }\n }\n ${styles}`.replace(/\\n+/g, '');\n\n return styles;\n};","import { Injectable, WritableSignal, signal } from \"@angular/core\";\nimport { Subject } from \"rxjs\";\nimport { IDragEnd, IDragItemInContainerVirtualScroll, IDragLeave, IDragOver, IDragStart, IDragging, IDrop, IItemDragInfo } from \"./interfaces/event.interface\";\n@Injectable({\n providedIn: 'any'\n})\n\nexport class MoLibsSharedDragDropService {\n private itemsClick = new Array<HTMLElement>();\n private onDragItemInContainerVirtualScroll = new Subject<IDragItemInContainerVirtualScroll>();\n private itemDragInfo?: IItemDragInfo;\n private container = signal(new Map<string, { element: HTMLElement; elementScroll?: HTMLElement }>());\n private targetItemDragFlag = 'item-drag-target';\n private classContainerDefine = 'libs-ui-drag-drop-container';\n private classItemDefine = 'libs-ui-drag-drop-item';\n private onDragging = new Subject<IDragging>();\n private onDragStart = new Subject<IDragStart>();\n private onDragEnd = new Subject<IDragEnd>();\n private onDragOver = new Subject<IDragOver>();\n private onDragLeave = new Subject<IDragLeave>();\n private onDrop = new Subject<IDrop>();\n private onDropContainer = new Subject<IDrop>();\n private onItemInit = new Subject<string>();\n\n public get OnDragItemInContainerVirtualScroll(): Subject<IDragItemInContainerVirtualScroll> {\n return this.onDragItemInContainerVirtualScroll;\n }\n\n public set ItemDragInfo(data: IItemDragInfo | undefined) {\n this.itemDragInfo = data;\n }\n\n public get ItemDragInfo(): IItemDragInfo | undefined {\n return this.itemDragInfo;\n }\n\n public get Container(): WritableSignal<Map<string, { element: HTMLElement; elementScroll?: HTMLElement }>> {\n return this.container;\n }\n\n public get TargetItemDragFlag() {\n return this.targetItemDragFlag;\n }\n\n public get ClassContainerDefine() {\n return this.classContainerDefine;\n }\n\n public get ClassItemDefine() {\n return this.classItemDefine;\n }\n\n public get OnDragging() {\n return this.onDragging;\n }\n\n public get OnDragOver() {\n return this.onDragOver;\n }\n\n public get OnDragLeave() {\n return this.onDragLeave;\n }\n\n public get OnDragStart() {\n return this.onDragStart;\n }\n\n public get OnDragEnd() {\n return this.onDragEnd;\n }\n\n public get OnDropContainer() {\n return this.onDropContainer;\n }\n\n public get OnDrop() {\n return this.onDrop;\n }\n\n public get OnItemInit() {\n return this.onItemInit;\n }\n\n public get ItemClick(): Array<HTMLElement> {\n return [...this.itemsClick];\n }\n\n public set ItemClick(item: HTMLElement) {\n this.itemsClick.push(item);\n }\n\n public resetItemClick() {\n this.itemsClick.length = 0;\n }\n\n public checkElementOverAcceptElementDrag(groupNameOfContainer: string | null, groupNameOfElementDrag: string | null, groupNameOfDropTo: string | null): boolean {\n if (groupNameOfContainer !== groupNameOfElementDrag && !groupNameOfDropTo) {\n return false;\n }\n\n if (groupNameOfDropTo !== null && !groupNameOfDropTo.toString().split(';').includes(groupNameOfContainer || 'undefinedName')) {\n return false;\n }\n\n return true;\n }\n}","import { AfterViewInit, Directive, ElementRef, OnDestroy, inject, input, signal } from \"@angular/core\";\nimport { IPageInfo, VirtualScrollerComponent } from \"@iharbeck/ngx-virtual-scroller\";\nimport { IBoundingClientRect } from \"@libs-ui/interfaces-types\";\nimport { checkMouseOverInContainer, cloneIBoundingClientRect, get } from \"@libs-ui/utils\";\nimport { Subject, takeUntil } from \"rxjs\";\nimport { MoLibsSharedDragDropService } from \"./drag-drop.service\";\nimport { IDragging } from \"./interfaces/event.interface\";\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiComponentsDragScrollDirective]\",\n standalone: true\n})\nexport class LibsUiComponentsDragScrollDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n private stopScroll = signal<boolean>(false);\n private virtualScrollPageInfo = signal<IPageInfo | undefined>(undefined);\n protected intervalScrollToElement = signal<number | undefined>(undefined);\n protected onDestroy = new Subject<void>();\n\n // #region INPUT\n readonly ignoreAutoScroll = input<boolean>();\n readonly widthZoneDetect = input<number, number | undefined>(16, { transform: value => value ?? 16 });\n readonly movementLength = input<number, number | undefined>(6, { transform: value => value ?? 6 });\n readonly rootElementScroll = input<HTMLElement>();\n readonly virtualScrollerComponent = input<VirtualScrollerComponent>();\n\n // #region INJECT\n protected elementRef = inject(ElementRef);\n protected dragDropService = inject(MoLibsSharedDragDropService);\n\n ngAfterViewInit(): void {\n this.dragDropService.OnDragging.pipe(takeUntil(this.onDestroy)).subscribe((eventDragging) => this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll()));\n this.dragDropService.OnDragEnd.pipe(takeUntil(this.onDestroy)).subscribe(() => {\n clearInterval(this.intervalScrollToElement());\n if (this.virtualScrollPageInfo()) {\n const firstElement = get(this.virtualScrollerComponent(), 'element')?.nativeElement.firstElementChild;\n const isHorizontal = get(this.virtualScrollerComponent(), '_horizontal');\n if (isHorizontal) {\n firstElement.style.transform = `scaleX(${this.virtualScrollPageInfo()?.scrollEndPosition})`;\n }\n if (!isHorizontal) {\n firstElement.style.transform = `scaleY(${this.virtualScrollPageInfo()?.scrollEndPosition})`;\n }\n this.virtualScrollPageInfo.set(undefined);\n }\n this.stopScroll.set(false);\n });\n this.dragDropService.OnDragStart.pipe(takeUntil(this.onDestroy)).subscribe(() => {\n if (this.virtualScrollerComponent) {\n this.virtualScrollerComponent()?.scrollToIndex(0);\n }\n });\n if (!this.virtualScrollerComponent) {\n return;\n }\n this.virtualScrollerComponent()?.vsChange.pipe(takeUntil(this.onDestroy)).subscribe(pageInfo => {\n const items = get(this.virtualScrollerComponent, '_items');\n\n if (items && items.length === pageInfo.endIndex) {\n this.virtualScrollPageInfo.set(pageInfo);\n const elementSetScroll = this.rootElementScroll() || this.elementRef.nativeElement;\n const isHorizontal = get(this.virtualScrollerComponent, '_horizontal');\n\n if (isHorizontal && pageInfo.scrollEndPosition < elementSetScroll.offsetWidth + elementSetScroll.scrollLeft + 3) {\n this.stopScroll.set(true);\n clearInterval(this.intervalScrollToElement());\n\n return;\n }\n\n if (!isHorizontal && pageInfo.scrollEndPosition < elementSetScroll.offsetHeight + elementSetScroll.scrollTop + 3) {\n this.stopScroll.set(true);\n clearInterval(this.intervalScrollToElement());\n\n return;\n }\n }\n this.stopScroll.set(false);\n });\n }\n\n /* FUNCTIONS */\n protected checkAndScrollElementToPosition(eventDragging: IDragging, ignoreAutoScroll?: boolean) {\n let elementSetScroll = this.rootElementScroll() || this.elementRef.nativeElement;\n\n if (ignoreAutoScroll || !checkMouseOverInContainer(eventDragging.mousePosition, elementSetScroll)) {\n return;\n }\n const rectElement = cloneIBoundingClientRect(this.elementRef.nativeElement.getBoundingClientRect());\n\n if (this.rootElementScroll()) {\n const rectElementScroll = this.rootElementScroll()?.getBoundingClientRect() as IBoundingClientRect;\n\n rectElement.left = rectElementScroll.left;\n rectElement.top = rectElementScroll.top;\n }\n\n const { width, height, top, left } = rectElement;\n const { clientX, clientY } = eventDragging.mousePosition;\n const limitLeft = left + elementSetScroll.offsetWidth;\n const limitTop = top + elementSetScroll.offsetHeight;\n\n clearInterval(this.intervalScrollToElement());\n if ((clientX < left || clientX > left + width) && (clientY < top || clientY > top + height)) {\n return;\n }\n\n this.intervalScrollToElement.set(setInterval(() => {\n elementSetScroll = (this.rootElementScroll() || this.elementRef.nativeElement);\n let directionTop = 0;\n let directionLeft = 0;\n\n if (top <= clientY && clientY <= top + this.widthZoneDetect()) {\n elementSetScroll.scrollTop -= this.movementLength();\n directionTop = -1;\n }\n\n if (limitTop - this.widthZoneDetect() <= clientY && clientY <= limitTop) {\n if (this.stopScroll()) {\n return;\n }\n elementSetScroll.scrollTop += this.movementLength();\n directionTop = 1;\n }\n\n if ((limitLeft - this.widthZoneDetect() <= clientX) && (clientX <= limitLeft)) {\n if (this.stopScroll()) {\n return;\n }\n elementSetScroll.scrollLeft += this.movementLength();\n directionLeft = +1;\n\n }\n if (left <= clientX && clientX <= left + this.widthZoneDetect()) {\n elementSetScroll.scrollLeft -= this.movementLength();\n directionLeft = -1;\n }\n\n if (elementSetScroll.scrollLeft && (elementSetScroll.scrollLeft + elementSetScroll.offsetWidth >= elementSetScroll.scrollWidth)) {\n elementSetScroll.scrollLeft -= elementSetScroll.scrollLeft + elementSetScroll.offsetWidth - elementSetScroll.scrollWidth;\n }\n\n if (elementSetScroll.scrollTop && (elementSetScroll.scrollTop + elementSetScroll.offsetHeight >= elementSetScroll.scrollHeight)) {\n elementSetScroll.scrollTop -= elementSetScroll.scrollTop + elementSetScroll.offsetHeight - elementSetScroll.scrollHeight;\n }\n\n if ((directionTop < 0 && !elementSetScroll.scrollTop) || (!elementSetScroll.scrollLeft && directionLeft < 0) || (directionTop && elementSetScroll.scrollHeight <= elementSetScroll.scrollTop + elementSetScroll.offsetHeight + 3) || (directionLeft && elementSetScroll.scrollWidth <= elementSetScroll.scrollLeft + elementSetScroll.offsetWidth + 3)) {\n return clearInterval(this.intervalScrollToElement());\n }\n }, 10));\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","import { AfterViewInit, Directive, OnDestroy, effect, input, model, output, signal, untracked } from \"@angular/core\";\nimport { checkMouseOverInContainer, cloneDeep, get, set, uuid } from \"@libs-ui/utils\";\nimport { Observable, debounceTime, filter, takeUntil } from \"rxjs\";\nimport { styleContainer } from \"./defines/css.define\";\nimport { LibsUiComponentsDragScrollDirective } from \"./drag-scroll.directive\";\nimport { IDragDropFunctionControlEvent, IDragEnd, IDragLeave, IDragOver, IDragStart, IDragging, IDrop } from \"./interfaces/event.interface\";\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiComponentsDragContainerDirective]\",\n standalone: true,\n})\nexport class LibsUiComponentsDragContainerDirective extends LibsUiComponentsDragScrollDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n private groupID = signal<string>(uuid());\n private isDragOver = signal<boolean>(false);\n\n // #region INPUT\n readonly disableDragContainer = input<boolean>();\n readonly mode = input<string, 'move' | 'copy' | 'deepCopy'>('move', { transform: value => value ?? 'move' });\n readonly directionDrag = input<'horizontal' | 'vertical'>();\n readonly viewEncapsulation = input<'emulated' | 'none', 'emulated' | 'none' | undefined>('emulated', { transform: value => value ?? 'emulated' });\n readonly acceptDragSameGroup = input<boolean, boolean | undefined>(false, { transform: value => value ?? false });\n readonly placeholder = input<boolean, boolean | undefined>(true, { transform: value => value ?? true });\n readonly groupName = input<string, string | undefined>('groupDragAndDropDefault', { transform: value => value ?? 'groupDragAndDropDefault' }); // nếu các group có tên trùng nhau sẽ được drop\n readonly dropToGroupName = input<Array<string> | null>(null); // nếu item trong các group A được drop vào group B nhưng group B không được drop vào group A\n readonly items = model.required<Array<unknown>>();\n readonly stylesOverride = input<Array<{ className: string, styles: string }>>();\n\n // #region OUTPUT\n readonly outDragStartContainer = output<IDragStart>();\n readonly outDragOverContainer = output<IDragOver>();\n readonly outDragLeaveContainer = output<IDragLeave>();\n readonly outDragEndContainer = output<IDragEnd>();\n readonly outDroppedContainer = output<IDrop>();\n readonly outDroppedContainerEmpty = output<IDrop>();\n readonly outFunctionControl = output<IDragDropFunctionControlEvent>();\n\n constructor() {\n super();\n const element = this.elementRef.nativeElement as HTMLElement;\n\n const container = { element };\n\n this.dragDropService.Container.update(data => {\n data.set(this.groupID(), container);\n return data;\n });\n\n effect(() => {\n if (!this.rootElementScroll()) {\n return;\n }\n untracked(() => {\n set(container, 'elementScroll', this.rootElementScroll());\n this.dragDropService.Container.update(containerMap => new Map(containerMap));\n });\n });\n\n effect(() => {\n if (this.directionDrag() && this.elementRef.nativeElement) {\n this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);\n }\n });\n effect(() => {\n if (this.disableDragContainer() && this.elementRef.nativeElement) {\n this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);\n }\n });\n }\n\n override ngAfterViewInit(): void {\n this.outFunctionControl.emit({ setAttributeElementAndItemDrag: () => this.setAttributeElementAndItemDrag(this.elementRef.nativeElement) });\n\n this.outDroppedContainer.subscribe(eventDropped => {\n this.dragDropService.OnDropContainer.next(eventDropped);\n });\n this.onDestroy.subscribe(() => {\n if (indexSpliceListTo > -1) {\n this.items.update(items => {\n items.splice(indexSpliceListTo, 1);\n return [...items];\n });\n }\n\n this.dragDropService.Container().delete(this.groupID());\n });\n const elementContainer = this.elementRef.nativeElement as HTMLElement;\n\n this.initStyleAndAttribute(elementContainer, true);\n this.dragDropService.OnItemInit.pipe(debounceTime(250), filter(groupName => groupName === this.groupName()), takeUntil(this.onDestroy)).subscribe(() => this.initStyleAndAttribute(elementContainer));\n const styleTag = document.createElement(\"style\");\n\n styleTag.textContent = styleContainer((this.stylesOverride() || []), this.viewEncapsulation(), this.groupID());\n elementContainer.appendChild(styleTag);\n elementContainer.classList.add(this.dragDropService.ClassContainerDefine);\n\n const handlerDragStart = (eventDragStart: IDragStart) => {\n\n this.setAttributeElementAndItemDrag(elementContainer, true);\n if (this.groupID() === eventDragStart.elementDrag.getAttribute('groupID')) {\n this.outDragStartContainer.emit({ ...eventDragStart, itemDragInfo: this.dragDropService.ItemDragInfo });\n }\n };\n\n const storeIndex = { indexDrag: -1, indexDragOver: -1 };\n let indexSpliceListTo = -1;\n const handlerDragOver = (eventDragOver: IDragOver) => {\n const { elementDrag, elementDragOver } = eventDragOver;\n\n if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {\n return;\n }\n const indexDrag = Number(elementDrag.getAttribute('index')).valueOf();\n const indexDragOver = Number(elementDragOver.getAttribute('index')).valueOf();\n const idGroupElementDrag = elementDrag.getAttribute('groupID');\n const idGroupElementDragOver = elementDragOver.getAttribute('groupID');\n\n if ((this.groupID() !== idGroupElementDrag) || (idGroupElementDrag !== idGroupElementDragOver)) { // xử lý cho item drag over qua 1 item khác container\n if (idGroupElementDragOver === this.groupID() && this.placeholder()) {\n const item = this.mode() === 'deepCopy' ? cloneDeep(this.dragDropService.ItemDragInfo?.item) : this.dragDropService.ItemDragInfo?.item;\n\n this.items.update(items => {\n if (indexSpliceListTo >= 0) {\n items.splice(indexSpliceListTo, 1);\n }\n items.splice(indexDragOver, 0, item);\n return [...items];\n });\n this.setAttributeElementAndItemDrag(elementContainer, false, indexSpliceListTo);\n indexSpliceListTo = indexDragOver;\n }\n\n return;\n }\n\n if (!this.acceptDragSameGroup() || indexDrag < 0 || indexDragOver < 0 || !this.items().length || indexDrag > this.items().length || indexDragOver > this.items().length || (storeIndex.indexDrag === indexDrag && storeIndex.indexDragOver === indexDragOver)) {\n return;\n }\n // xử lý cho item drag over qua 1 item cùng container\n const itemDrag = this.items()[indexDrag];\n\n this.setAnimationElementDragOver(indexDrag, indexDragOver, elementDragOver);\n storeIndex.indexDrag = indexDrag;\n storeIndex.indexDragOver = indexDragOver;\n this.items.update(items => {\n items.splice(indexDrag, 1);\n items.splice(indexDragOver, 0, itemDrag);\n return [...items];\n });\n elementDrag.setAttribute('index', indexDragOver.toString());\n this.setAttributeElementAndItemDrag(elementContainer);\n };\n\n const removePlaceholderDrag = (eventDrag: IDragEnd, isDragging?: boolean) => {\n clearInterval(this.intervalScrollToElement());\n storeIndex.indexDrag = -1;\n storeIndex.indexDragOver = -1;\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n\n if (!checkMouseOverInContainer(eventDrag.mousePosition, (this.rootElementScroll() || elementContainer))) {\n const childElementIndex = Array.from<HTMLElement>(childrenElement).findIndex((child) => child.classList.contains('libs-ui-drag-drop-item-drop-placeholder'));\n\n if (childElementIndex >= 0 && this.groupID() !== eventDrag.elementDrag.getAttribute('groupID')) {\n this.items.update(items => {\n items.splice(childElementIndex, 1);\n return [...items];\n });\n indexSpliceListTo = -1;\n }\n\n this.removeAttributes(elementContainer, isDragging);\n this.setIndexElement(elementContainer);\n\n return;\n }\n if (indexSpliceListTo >= 0) {\n this.items.update(items => {\n items.splice(indexSpliceListTo, 1);\n return [...items];\n });\n indexSpliceListTo = -1;\n }\n };\n\n const handlerDragging = (eventDragging: IDragging) => {\n this.setAttributeElementAndItemDrag(elementContainer);\n const { elementDrag } = eventDragging;\n const fieldIdItem = elementDrag.getAttribute('field_id');\n const idItemDrag = elementDrag.getAttribute('item_id');\n\n if (fieldIdItem && idItemDrag && this.items().find(item => get(item, fieldIdItem) === idItemDrag)) {\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n const childElement = Array.from<HTMLElement>(childrenElement).find((child) => child.getAttribute('item_id') === idItemDrag);\n\n if (this.items() === eventDragging.itemDragInfo?.itemsDrag() && childElement && !childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder') && !childElement.getAttribute(this.dragDropService.TargetItemDragFlag)) {\n childElement.setAttribute(this.dragDropService.TargetItemDragFlag, 'true');\n this.groupID.set(elementDrag.getAttribute('groupID') || '');\n styleTag.remove();\n styleTag.textContent = styleContainer((this.stylesOverride() || []), this.viewEncapsulation(), this.groupID());\n elementContainer.appendChild(styleTag);\n this.setAttributeElementAndItemDrag(elementContainer, true);\n }\n }\n\n if (this.disableDragContainer()) {\n return;\n }\n\n if (this.groupID() === elementDrag.getAttribute('groupID') && !this.acceptDragSameGroup()) {\n this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll() || !this.acceptDragSameGroup());\n return;\n }\n\n if (!checkMouseOverInContainer(eventDragging.mousePosition, (this.rootElementScroll() || elementContainer))) {\n if (this.isDragOver()) {\n this.isDragOver.set(false);\n this.outDragLeaveContainer.emit({ ...eventDragging, elementDragLeave: elementContainer });\n }\n\n return removePlaceholderDrag(eventDragging, true);\n }\n this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll());\n\n // Đoạn code xử lý cho việc kéo một element vào 1 container nhưng container không có item hoặc item drag không over qua item trong container\n if (!this.isDragOver()) {\n elementContainer.classList.add('libs-ui-drag-drop-container-dragover');\n this.isDragOver.set(true);\n this.outDragOverContainer.emit({ ...eventDragging, elementDragOver: elementContainer });\n }\n const eventDragOver = { ...eventDragging, elementDragOver: elementContainer };\n\n if (!this.items().length) {\n eventDragOver.elementDragOver = {\n getAttribute: (name: string) => {\n if (name === 'groupID') {\n return this.groupID();\n }\n if (name !== 'index') {\n return null;\n }\n\n return 0;\n }\n } as unknown as HTMLElement;\n this.dragDropService.OnDragOver.next(eventDragOver);\n\n return;\n }\n\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n let childElement = Array.from<HTMLElement>(childrenElement).find((child) => checkMouseOverInContainer(eventDragging.mousePosition, child));\n\n if (childElement) { // nếu tìm thấy thì sẽ nhận qua sự kiện của drag-item.directive emit\n return;\n }\n childElement = Array.from<HTMLElement>(childrenElement).pop();\n\n if (childElement) {\n eventDragOver.elementDragOver = childElement;\n this.dragDropService.OnDragOver.next(eventDragOver);\n }\n };\n\n const handlerDragEnd = (eventDragEnd: IDragEnd) => {\n if (this.disableDragContainer()) {\n return;\n }\n let rect = undefined;\n\n if (this.rootElementScroll() || elementContainer) {\n rect = (this.rootElementScroll() || elementContainer)?.getBoundingClientRect();\n }\n removePlaceholderDrag(eventDragEnd);\n const { elementDrag, mousePosition, itemDragInfo } = eventDragEnd;\n\n if (this.groupID() === elementDrag.getAttribute('groupID')) {\n this.outDragEndContainer.emit({ ...eventDragEnd });\n }\n if (!checkMouseOverInContainer(mousePosition, this.rootElementScroll() || elementContainer, rect)) {\n return;\n }\n const eventDrop = { elementDrag: elementDrag, elementDrop: elementContainer, itemDragInfo: itemDragInfo };\n\n if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {\n return;\n }\n\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n const childElement = Array.from<HTMLElement>(childrenElement).find((child) => checkMouseOverInContainer(mousePosition, child));\n\n if (childElement) {\n eventDrop.elementDrop = childElement;\n this.dragDropService.OnDrop.next(eventDrop);\n\n return;\n }\n eventDrop.elementDrop = {\n getAttribute: (name: string) => {\n if (name === 'dropContainer') {\n return true;\n }\n if (name === 'groupID') {\n return this.groupID();\n }\n if (name !== 'index') {\n return null;\n }\n\n return childrenElement.length;\n }\n } as unknown as HTMLElement;\n this.dragDropService.OnDrop.next(eventDrop);\n };\n\n const handlerDrop = (eventDrop: IDrop) => {\n if (this.disableDragContainer()) {\n return;\n }\n const { elementDrag, elementDrop, itemDragInfo } = eventDrop;\n\n if (this.groupID() === elementDrag.getAttribute('groupID') && this.groupID() === elementDrop.getAttribute('groupID')) {\n if (itemDragInfo) {\n itemDragInfo.indexDrop = Number(elementDrop.getAttribute('index')).valueOf();\n itemDragInfo.itemsDrop = this.items;\n itemDragInfo.containerDrop = elementContainer;\n }\n if (this.acceptDragSameGroup()) {\n this.outDroppedContainer.emit(eventDrop);\n }\n this.removeAttributes(elementContainer);\n this.setIndexElement(elementContainer);\n return;\n }\n\n if (this.groupID() !== elementDrop.getAttribute('groupID') || elementDrag.getAttribute('groupID') === elementDrop.getAttribute('groupID')) {\n return;\n }\n const indexDragOver = this.groupID() !== elementDrag.getAttribute('groupID') ? Number(elementDrop.getAttribute('index')).valueOf() : Number(elementDrop.getAttribute('index')).valueOf() - (elementDrop.getAttribute('dropContainer') ? 0 : 1);\n const item = this.mode() === 'deepCopy' ? cloneDeep(itemDragInfo?.item) : itemDragInfo?.item;\n\n if (itemDragInfo) {\n itemDragInfo.indexDrop = indexDragOver;\n itemDragInfo.itemsDrop = this.items;\n itemDragInfo.containerDrop = elementContainer;\n }\n\n if (!this.items().length) {\n this.outDroppedContainerEmpty.emit(eventDrop);\n }\n\n this.items.update(items => {\n items.splice(indexDragOver, 0, item);\n return [...items];\n });\n if (itemDragInfo && itemDragInfo.itemsMove && itemDragInfo.itemsMove()) {\n itemDragInfo.itemsDrag.set([...itemDragInfo.itemsMove()]);\n setTimeout(() => this.setAttributeElementAndItemDrag(elementContainer));\n }\n this.outDroppedContainer.emit(eventDrop);\n this.removeAttributes(elementContainer);\n this.setIndexElement(elementContainer);\n };\n\n [{\n name: 'OnDragStart',\n event: this.dragDropService.OnDragStart,\n functionCall: handlerDragStart\n }, {\n name: 'OnDragOver',\n event: this.dragDropService.OnDragOver,\n functionCall: handlerDragOver,\n debounceTime: 5\n }, {\n name: 'OnDragging',\n event: this.dragDropService.OnDragging,\n functionCall: handlerDragging\n }, {\n name: 'OnDragEnd',\n event: this.dragDropService.OnDragEnd,\n functionCall: handlerDragEnd\n }, {\n name: 'OnDrop',\n event: this.dragDropService.OnDrop,\n functionCall: handlerDrop\n }\n ].forEach((item: { name: string; debounceTime?: number; event: Observable<unknown>; functionCall: object }) => (item.event.pipe(debounceTime(item.debounceTime || 0), takeUntil(this.onDestroy)).subscribe(item.functionCall)));\n }\n\n /* */\n private async setAttributeElementAndItemDrag(elementContainer: HTMLElement, setItemDrag?: boolean, indexInsert?: number) {\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n let index = -1;\n\n elementContainer.setAttribute('groupID', this.groupID());\n elementContainer.removeAttribute('disableDragContainer');\n\n if (this.disableDragContainer()) {\n elementContainer.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);\n }\n if (this.groupName()) {\n elementContainer.setAttribute('groupName', this.groupName() || '');\n }\n Array.from<HTMLElement>(childrenElement).forEach((childElement) => {\n if (!childElement.hasAttribute('groupName') || childElement.getAttribute('groupName') === this.groupName()) {\n childElement.setAttribute('groupID', this.groupID());\n }\n if (childElement.getAttribute('groupID') !== this.groupID()) {\n return;\n }\n index += 1;\n childElement.setAttribute('index', `${index}`);\n childElement.removeAttribute('disableDragContainer');\n if (this.disableDragContainer()) {\n childElement.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);\n }\n if (this.groupName() && !childElement.hasAttribute('groupName')) {\n childElement.setAttribute('groupName', this.groupName() || '');\n }\n if (this.placeholder()) {\n childElement.setAttribute('placeholder', `${this.placeholder()}`);\n }\n if (this.dropToGroupName()) {\n childElement.setAttribute('dropToGroupName', `${this.dropToGroupName()?.join(';')}`);\n }\n if (indexInsert === index && this.placeholder()) {\n if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {\n childElement.classList.add('libs-ui-drag-drop-item-placeholder');\n }\n if (!childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder')) {\n childElement.classList.add('libs-ui-drag-drop-item-drop-placeholder');\n }\n }\n\n if (setItemDrag && childElement.getAttribute(this.dragDropService.TargetItemDragFlag) && this.items().length >= index) {\n if (this.placeholder()) {\n if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {\n childElement.classList.add('libs-ui-drag-drop-item-placeholder');\n }\n if (!childElement.classList.contains('libs-ui-drag-drop-item-origin-placeholder')) {\n childElement.classList.add('libs-ui-drag-drop-item-origin-placeholder');\n }\n }\n\n this.dragDropService.ItemDragInfo = { item: this.items()[index] as object, indexDrag: index, itemsDrag: this.items, containerDrag: elementContainer, itemsMove: signal([...this.items()]) };\n if (this.mode() === 'move') {\n this.dragDropService.ItemDragInfo.itemsMove?.update(items => {\n items.splice(index, 1);\n return [...items]\n });\n }\n }\n });\n }\n\n private initStyleAndAttribute(elementContainer: HTMLElement, hasRemoveAttribute = false,) {\n this.setAttributeElementAndItemDrag(elementContainer);\n if (hasRemoveAttribute) {\n this.removeAttributes(elementContainer);\n }\n this.setIndexElement(elementContainer);\n };\n\n private setAnimationElementDragOver(indexDrag: number, indexDragOver: number, elementDragOver: HTMLElement) {\n if (!this.directionDrag() || !elementDragOver) {\n return;\n }\n if (this.directionDrag() === 'vertical') {\n elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-bottom');\n elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-top');\n if (indexDrag > indexDragOver) {\n elementDragOver.classList.add('libs-ui-drag-drop-item-translate-bottom');\n }\n if (indexDrag < indexDragOver) {\n elementDragOver.classList.add('libs-ui-drag-drop-item-translate-top');\n }\n\n return;\n }\n\n elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-left');\n elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-right');\n if (indexDrag > indexDragOver) {\n elementDragOver.classList.add('libs-ui-drag-drop-item-translate-right');\n }\n if (indexDrag < indexDragOver) {\n elementDragOver.classList.add('libs-ui-drag-drop-item-translate-left');\n }\n\n }\n\n private setIndexElement(elementContainer: HTMLElement) {\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n let index = -1;\n\n Array.from<HTMLElement>(childrenElement).forEach((childElement) => {\n if (childElement.getAttribute('groupID') !== this.groupID()) {\n return;\n }\n index += 1;\n childElement.setAttribute('index', `${index}`);\n });\n\n }\n\n private removeAttributes(elementContainer: HTMLElement, ignoreRemoveClassItemOriginPlaceholder?: boolean) {\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n\n elementContainer.classList.remove('libs-ui-drag-drop-container-dragover');\n Array.from<HTMLElement>(childrenElement).forEach((childElement) => {\n if (childElement.getAttribute('groupID') !== this.groupID()) {\n return;\n }\n childElement.removeAttribute('index');\n if (!this.dropToGroupName() || !this.dropToGroupName()?.length) {\n childElement.removeAttribute('dropToGroupName');\n }\n if (!this.placeholder()) {\n childElement.removeAttribute('placeholder');\n }\n if (this.placeholder()) {\n childElement.classList.remove('libs-ui-drag-drop-item-placeholder');\n if (!ignoreRemoveClassItemOriginPlaceholder) {\n\n childElement.classList.remove('libs-ui-drag-drop-item-origin-placeholder');\n }\n childElement.classList.remove('libs-ui-drag-drop-item-drop-placeholder');\n }\n });\n\n }\n}\n","import { AfterViewInit, Directive, OnDestroy, inject, output } from \"@angular/core\";\nimport { IBoundingClientRect } from \"@libs-ui/interfaces-types\";\nimport { cloneIBoundingClientRect, getViewport } from \"@libs-ui/utils\";\nimport { Subject, fromEvent, takeUntil, tap } from \"rxjs\";\nimport { MoLibsSharedDragDropService } from \"./drag-drop.service\";\nimport { IDragEnd } from \"./interfaces/event.interface\";\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiDragItemInContainerVirtualScrollDirective]\",\n standalone: true,\n\n})\nexport class LibsUiDragItemInContainerVirtualScrollDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n protected onDestroy = new Subject<void>();\n\n // #region OUTPUT\n readonly outDragEndContainer = output<IDragEnd>();\n\n // #region INJECT\n protected dragDropService = inject(MoLibsSharedDragDropService);\n\n ngAfterViewInit(): void {\n const addClass = ()=>{\n document.body.classList.remove('!select-none');\n document.body.classList.remove('!cursor-move');\n };\n const removeClass = ()=>{\n document.body.classList.add('!select-none');\n document.body.classList.add('!cursor-move');\n };\n this.dragDropService.OnDragEnd.pipe(takeUntil(this.onDestroy)).subscribe(e => {\n this.outDragEndContainer.emit(e);\n });\n this.dragDropService.OnDragItemInContainerVirtualScroll.pipe(takeUntil(this.onDestroy)).subscribe(dragItemInContainerVirtualScrollEvent => {\n addClass();\n const stopEventMouse = (mouseEvent: MouseEvent) => {\n if (!dragItemInContainerVirtualScrollEvent.ignoreStopEvent) {\n mouseEvent.preventDefault();\n mouseEvent.stopPropagation();\n }\n };\n const documentMouseUp = fromEvent<MouseEvent>(document, 'mouseup')\n .pipe(tap((eventMouseUp) => {\n this.updateMouseEventsWhenMoveOverIframe('auto');\n stopEventMouse(eventMouseUp);\n const mousePosition = { clientX: eventMouseUp.clientX, clientY: eventMouseUp.clientY };\n\n if (dragItemInContainerVirtualScrollEvent.dragBoundary && dragItemInContainerVirtualScrollEvent.dragBoundaryAcceptMouseLeaveContainer) {\n const result = this.getClientPosition(dragItemInContainerVirtualScrollEvent.elementDrag, mousePosition, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop, dragItemInContainerVirtualScrollEvent.dragBoundary, dragItemInContainerVirtualScrollEvent.elementContainer);\n\n mousePosition.clientX = result.clientX;\n mousePosition.clientY = result.clientY;\n }\n const dragEndEvent = { mousePosition, elementDrag: dragItemInContainerVirtualScrollEvent.elementDrag, itemDragInfo: this.dragDropService.ItemDragInfo };\n\n this.dragDropService.ItemDragInfo = undefined;\n this.dragDropService.OnDragEnd.next(dragEndEvent);\n dragItemInContainerVirtualScrollEvent.elementDrag.remove();\n removeClass();\n }));\n\n fromEvent<MouseEvent>(document, 'mousemove').pipe(tap((eventMousemove) => {\n stopEventMouse(eventMousemove);\n const { clientX, clientY } = eventMousemove;\n const mousePosition = { clientX, clientY };\n\n const result = this.getClientPosition(dragItemInContainerVirtualScrollEvent.elementDrag, mousePosition, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop, dragItemInContainerVirtualScrollEvent.dragBoundary, dragItemInContainerVirtualScrollEvent.elementContainer);\n const elementKeepContainer = result.elementKeepContainer;\n const left = result.clientX - dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft;\n const top = result.clientY - dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop;\n\n if (dragItemInContainerVirtualScrollEvent.dragBoundary && dragItemInContainerVirtualScrollEvent.dragBoundaryAcceptMouseLeaveContainer) {\n if (clientX < result.viewport.left) {\n mousePosition.clientX = result.viewport.left;\n }\n if (clientX > result.viewport.width) {\n mousePosition.clientX = result.viewport.width;\n }\n if (clientY < result.viewport.top) {\n mousePosition.clientY = result.viewport.top;\n }\n if (clientY > result.viewport.height) {\n mousePosition.clientY = result.viewport.height;\n }\n }\n dragItemInContainerVirtualScrollEvent.elementDrag.style.left = `${left}px`;\n dragItemInContainerVirtualScrollEvent.elementDrag.style.top = `${top}px`;\n\n this.dragDropService.OnDragging.next({ mousePosition, elementDrag: dragItemInContainerVirtualScrollEvent.elementDrag, elementKeepContainer, itemDragInfo: this.dragDropService.ItemDragInfo });\n }), takeUntil((documentMouseUp)), takeUntil(this.onDestroy)).subscribe();\n\n });\n }\n\n /* FUNCTIONS */\n\n protected getClientPosition(element: HTMLElement, mousePosition: { clientX: number; clientY: number; }, distanceStartElementAndMouseLeft: number, distanceStartElementAndMouseTop: number, dragBoundary?: boolean, elementContainer?: HTMLElement): { clientX: number; clientY: number; elementKeepContainer: boolean; viewport: IBoundingClientRect } {\n let viewport = getViewport() as IBoundingClientRect;\n const rectElement = element.getBoundingClientRect();\n const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');\n const containerItem = elementContainer || containerById?.elementScroll || containerById?.element || document.body;\n let { clientX, clientY } = mousePosition;\n\n viewport.left = 0;\n viewport.top = 0;\n if (dragBoundary) {\n viewport = cloneIBoundingClientRect(containerItem.getBoundingClientRect());\n viewport.height = viewport.top + viewport.height;\n viewport.width = viewport.left + viewport.width;\n }\n let elementKeepContainer = false;\n\n if (clientX > viewport.width && clientY > viewport.height || clientX < viewport.left && clientY < viewport.top) {\n elementKeepContainer = true;\n }\n\n if ((clientX + (rectElement.width - distanceStartElementAndMouseLeft)) > viewport.width) {\n clientX -= (clientX + (rectElement.width - distanceStartElementAndMouseLeft) - viewport.width);\n }\n if ((clientY + (rectElement.height - distanceStartElementAndMouseTop)) > viewport.height) {\n clientY -= (clientY + (rectElement.height - distanceStartElementAndMouseTop) - viewport.height);\n }\n if ((clientX - distanceStartElementAndMouseLeft) < (dragBoundary && containerItem ? viewport.left : 0)) {\n clientX = (dragBoundary && containerItem ? viewport.left : 0) + distanceStartElementAndMouseLeft;\n }\n if ((clientY - distanceStartElementAndMouseTop) < (dragBoundary && containerItem ? viewport.top : 0)) {\n clientY = (dragBoundary && containerItem ? viewport.top : 0) + distanceStartElementAndMouseTop;\n }\n\n return { clientX, clientY, elementKeepContainer, viewport };\n }\n\n protected updateMouseEventsWhenMoveOverIframe(pointerEvents: 'none' | 'auto') {\n const frames = document.getElementsByTagName(\"iframe\");\n\n if (!frames?.length) {\n return;\n }\n\n for (let i = 0; i < frames.length; ++i) {\n frames[i].style.pointerEvents = pointerEvents;\n }\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AfterViewInit, Directive, ElementRef, OnDestroy, effect, inject, input, output, signal } from \"@angular/core\";\nimport { IBoundingClientRect } from \"@libs-ui/interfaces-types\";\nimport { checkMouseOverInContainer, checkViewInScreen, get, getDragEventByElement, getViewport } from \"@libs-ui/utils\";\nimport { fromEvent, takeUntil, tap, throttleTime } from \"rxjs\";\nimport { LibsUiDragItemInContainerVirtualScrollDirective } from \"./drag-item-in-container-virtual-scroll.directive\";\nimport { IDragEnd, IDragLeave, IDragOver, IDragStart, IDrop } from \"./interfaces/event.interface\";\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiDragItemDirective]\",\n standalone: true\n})\nexport class LibsUiDragItemDirective extends LibsUiDragItemInContainerVirtualScrollDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n private isDragOver = signal<boolean>(false);\n private isDragging = signal<boolean>(false);\n\n // #region INPUT\n //setup 3 field phía dưới nếu đang sử dụng item trong virtual-scroll \n readonly fieldId = input<string>('');\n readonly item = input<any>(undefined);\n readonly itemInContainerVirtualScroll = input<boolean>();\n //----------------------------------\n readonly throttleTimeHandlerDraggingEvent = input<number, number | undefined>(0, { transform: value => value || 0 });\n readonly ignoreStopEvent = input<boolean>();\n readonly onlyMouseDownStopEvent = input<boolean>();\n readonly dragRootElement = input<boolean>();\n readonly dragBoundary = input<boolean>();\n readonly dragBoundaryAcceptMouseLeaveContainer = input<boolean>();\n readonly elementContainer = input<HTMLElement>();\n readonly zIndex = input<number, number | undefined>(1300, { transform: value => value ?? 1300 });\n readonly disable = input<boolean>();\n\n // #region OUTPUT\n readonly outDragStart = output<IDragStart>();\n readonly outDragOver = output<IDragOver>();\n readonly outDragLeave = output<IDragLeave>();\n readonly outDragEnd = output<IDragEnd>();\n readonly outDropped = output<IDrop>();\n\n // #region INJECT\n private elementRef = inject(ElementRef);\n\n constructor() {\n super();\n effect(() => {\n if (!this.elementRef?.nativeElement) {\n return;\n }\n const element = this.elementRef.nativeElement as HTMLElement;\n\n element.classList.remove(`${this.dragDropService.ClassItemDefine}-disable`);\n if (this.disable() && !element.classList.contains(`${this.dragDropService.ClassItemDefine}-disable`)) {\n element.classList.add(`${this.dragDropService.ClassItemDefine}-disable`);\n }\n });\n }\n\n override ngAfterViewInit() {\n const element = this.elementRef.nativeElement as HTMLElement;\n if (this.fieldId()) {\n element.setAttribute('field_id', this.fieldId());\n if (this.item()) {\n element.setAttribute('item_id', get(this.item(), this.fieldId()));\n }\n }\n element.classList.add(this.dragDropService.ClassItemDefine);\n this.dragDropService.OnDragging.pipe(throttleTime(this.throttleTimeHandlerDraggingEvent()), takeUntil(this.onDestroy)).subscribe((eventDragging) => {\n if (this.disable() || element.getAttribute('disableDragContainer') || (this.fieldId() && this.item() && eventDragging.elementDrag.getAttribute('item_id') === get(this.item(), this.fieldId()))) {\n return;\n }\n const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');\n\n if (containerById) {\n if (eventDragging.elementKeepContainer || !this.dragDropService.checkElementOverAcceptElementDrag(containerById.element.getAttribute('groupName'), eventDragging.elementDrag.getAttribute('groupName'), eventDragging.elementDrag.getAttribute('dropToGroupName'))) {\n return;\n }\n }\n if (checkMouseOverInContainer(eventDragging.mousePosition, element) && element !== eventDragging.elementDrag && containerById && checkViewInScreen(containerById.element, element, containerById.elementScroll)) {\n if (this.isDragOver()) {\n return;\n }\n const eventDragOver = { ...eventDragging, elementDragOver: element };\n\n this.dragDropService.OnDragOver.next(eventDragOver);\n this.outDragOver.emit(eventDragOver);\n this.isDragOver.set(true);\n\n return;\n }\n\n if (this.isDragOver()) {\n const eventDragLeave = { ...eventDragging, elementDragLeave: element };\n this.isDragOver.set(false);\n this.dragDropService.OnDragLeave.next(eventDragLeave);\n this.outDragLeave.emit(eventDragLeave);\n }\n });\n\n this.dragDropService.OnDropContainer.pipe(takeUntil(this.onDestroy)).subscribe((eventDrop) => {\n if (eventDrop.elementDrop !== element) {\n return;\n }\n const dropEvent = { elementDrag: eventDrop.elementDrag, elementDrop: element, itemDragInfo: eventDrop.itemDragInfo };\n\n this.outDropped.emit(dropEvent);\n });\n const styleTag = document.createElement(\"style\");\n\n styleTag.textContent = `.libs-ui-drag-drop-item-dragging{cursor:move}`;\n let nodeClone = element;\n let distanceStartElementAndMouseLeft = -1;\n let distanceStartElementAndMouseTop = -1;\n let contextMenu = false;\n const stopEventMouse = (mouseEvent: MouseEvent) => {\n if (!this.ignoreStopEvent()) {\n mouseEvent.preventDefault();\n mouseEvent.stopPropagation();\n }\n };\n const updatePositionElementRootAndRemoveNodeClone = () => {\n if (this.dragRootElement()) {\n const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');\n\n const containerItem = this.elementContainer() || containerById?.elementScroll || containerById?.element || document.body;\n const rectContainer = containerItem.getBoundingClientRect();\n const rectNodeClone = nodeClone.getBoundingClientRect();\n const numberSub = Number((getComputedStyle(containerItem).border.match(/\\d+px/gi) || ['0'])[0].replace(/\\D+/ig, '')).valueOf();\n\n element.style.left = (rectNodeClone.left - rectContainer.left - numberSub) + 'px';\n element.style.top = (rectNodeClone.top - rectContainer.top - numberSub) + 'px';\n element.classList.remove('opacity-0');\n }\n distanceStartElementAndMouseLeft = -1;\n distanceStartElementAndMouseTop = -1;\n nodeClone.remove();\n };\n\n fromEvent(document, 'contextmenu').pipe(\n tap(() => {\n if (this.isDragging()) {\n updatePositionElementRootAndRemoveNodeClone();\n }\n contextMenu = true;\n\n }),\n takeUntil(this.onDestroy)\n ).subscribe();\n\n let ignoreMousedown = false;\n\n getDragEventByElement({\n elementMouseDown: element,\n functionMouseDown: (event: MouseEvent) => {\n this.dragDropService.ItemClick = element;\n contextMenu = false;\n this.updateMouseEventsWhenMoveOverIframe('none');\n if ((this.disable() || element.getAttribute('disableDragContainer') || !this.isDragging() || this.itemInContainerVirtualScroll()) && !this.onlyMouseDownStopEvent()) {\n return;\n }\n stopEventMouse(event);\n },\n functionMouseMove: (event: MouseEvent) => {\n stopEventMouse(event);\n },\n functionMouseUp: (event: MouseEvent) => {\n this.updateMouseEventsWhenMoveOverIframe('auto');\n this.dragDropService.resetItemClick();\n stopEventMouse(event);\n if (this.disable() || element.getAttribute('disableDragContainer') || contextMenu || !this.isDragging()) {\n contextMenu = false;\n\n return;\n }\n contextMenu = false;\n this.isDragging.set(false);\n element.removeAttribute(this.dragDropService.TargetItemDragFlag);\n if (this.itemInContainerVirtualScroll()) {\n return;\n }\n const mousePosition = { clientX: event.clientX, clientY: event.clientY };\n\n if (this.dragBoundary() && this.dragBoundaryAcceptMouseLeaveContainer()) {\n const result = this.getClientPosition(element, mousePosition, distanceStartElementAndMouseLeft, distanceStartElementAndMouseTop, this.dragBoundary(), this.elementContainer());\n\n mousePosition.clientX = result.clientX;\n mousePosition.clientY = result.clientY;\n }\n const dragEndEvent = { mousePosition, elementDrag: element, itemDragInfo: this.dragDropService.ItemDragInfo };\n\n this.dragDropService.ItemDragInfo = undefined;\n this.dragDropService.OnDragEnd.next(dragEndEvent);\n this.outDragEnd.emit(dragEndEvent);\n\n nodeClone.classList.remove('libs-ui-drag-drop-item-dragging');\n styleTag.remove();\n\n updatePositionElementRootAndRemoveNodeClone();\n },\n onDestroy: this.onDestroy\n }).pipe(tap((dragMouseEvent: MouseEvent) => {\n const rectElement = element.getBoundingClientRect();\n const viewport = getViewport() as IBoundingClientRect;\n\n if (this.disable() || element.getAttribute('disableDragContainer') || !dragMouseEvent.clientX || (!ignoreMousedown && dragMouseEvent.type === 'mousedown' && rectElement.height + rectElement.top >= viewport.height)) {\n\n return;\n }\n const { clientX, clientY } = dragMouseEvent;\n\n if (distanceStartElementAndMouseLeft === -1) {\n distanceStartElementAndMouseLeft = clientX - rectElement.left;\n }\n\n if (distanceStartElementAndMouseTop === -1) {\n distanceStartElementAndMouseTop = clientY - rectElement.top;\n }\n })).subscribe(dragMouseEvent => {\n if (this.dragDropService.ItemClick.filter(item => item !== element).some(item => element.contains(item))) {\n return;\n }\n if (this.disable() || element.getAttribute('disableDragContainer') || !dragMouseEvent.clientX || dragMouseEvent.type === 'mousedown' || contextMenu || (this.itemInContainerVirtualScroll() && this.isDragging())) {\n return;\n }\n ignoreMousedown = true;\n const { clientX, clientY } = dragMouseEvent;\n const mousePosition = { clientX, clientY };\n const rectElement = element.getBoundingClientRect();\n\n if (!this.isDragging()) {\n this.isDragging.set(true);\n const eventDragStart = { mousePosition, elementDrag: element, itemDragInfo: this.dragDropService.ItemDragInfo };\n\n element.setAttribute(this.dragDropService.TargetItemDragFlag, 'true');\n this.dragDropService.OnDragStart.next(eventDragStart);\n eventDragStart.itemDragInfo = this.dragDropService.ItemDragInfo;\n this.outDragStart.emit(eventDragStart);\n\n nodeClone = element.cloneNode(true) as HTMLElement;\n nodeClone.style.zIndex = `${this.zIndex()}`;\n nodeClone.classList.add('!fixed');\n nodeClone.classList.remove('libs-ui-drag-drop-item-origin-placeholder');\n nodeClone.classList.remove('libs-ui-drag-drop-item-placeholder');\n nodeClone.appendChild(styleTag);\n nodeClone.classList.add('libs-ui-drag-drop-item-dragging');\n nodeClone.style.width = `${rectElement.width}px`;\n nodeClone.style.height = `${rectElement.height}px`;\n nodeClone.style.left = `${-999}px`;\n nodeClone.style.top = `${-999}px`;\n document.body.append(nodeClone);\n if (this.dragRootElement()) {\n element.classList.add('opacity-0');\n }\n\n if (this.itemInContainerVirtualScroll()) {\n this.dragDropService.OnDragItemInContainerVirtualScroll.next({\n itemDragInfo: this.dragDropService.ItemDragInfo,\n elementDrag: nodeClone,\n distanceStartElementAndMouseTop,\n distanceStartElementAndMouseLeft,\n elementContainer: this.elementContainer(),\n dragBoundary: this.dragBoundary(),\n dragBoundaryAcceptMouseLeaveContainer: this.dragBoundaryAcceptMouseLeaveContainer(),\n ignoreStopEvent: this.ignoreStopEvent()\n });\n\n return;\n }\n }\n const result = this.getClientPosition(nodeClone, mousePosition, distanceStartElementAndMouseLeft, distanceStartElementAndMouseTop, this.dragBoundary(), this.elementContainer());\n\n const elementKeepContainer = result.elementKeepContainer;\n const left = result.clientX - distanceStartElementAndMouseLeft;\n const top = result.clientY - distanceStartElementAndMouseTop;\n\n if (this.dragBoundary() && this.dragBoundaryAcceptMouseLeaveContainer()) {\n if (clientX < result.viewport.left) {\n mousePosition.clientX = result.viewport.left;\n }\n if (clientX > result.viewport.width) {\n mousePosition.clientX = result.viewport.width;\n }\n if (clientY < result.viewport.top) {\n mousePosition.clientY = result.viewport.top;\n }\n if (clientY > result.viewport.height) {\n mousePosition.clientY = result.viewport.height;\n }\n }\n nodeClone.style.left = `${left}px`;\n nodeClone.style.top = `${top}px`;\n\n const eventDragging = { mousePosition, elementDrag: nodeClone, elementKeepContainer, itemDragInfo: this.dragDropService.ItemDragInfo };\n\n this.dragDropService.OnDragging.next(eventDragging);\n });\n }\n}","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsDragContainerDirective } from '../drag-drop.directive';\nimport { LibsUiDragItemDirective } from '../drag-item.directive';\n\ninterface Task {\n id: number;\n title: string;\n description: string;\n status: 'todo' | 'in-progress' | 'done';\n}\n\ninterface Column {\n id: string;\n title: string;\n items: Task[];\n}\n\n@Component({\n selector: 'lib-drag-drop-demo',\n standalone: true,\n imports: [\n CommonModule,\n LibsUiComponentsDragContainerDirective,\n LibsUiDragItemDirective,\n LibsUiComponentsButtonsButtonComponent\n ],\n template: `\n <div class=\"page-container\">\n <header>\n <h1>Demo Drag and Drop Component</h1>\n <p>Angular component library for drag and drop functionality</p>\n </header>\n\n <main>\n <section class=\"intro-section\">\n <h2>Introduction</h2>\n <p>\n <code>@libs-ui/components-drag-drop</code> is a powerful Angular component that enables drag and drop functionality with features like virtual scrolling, multi-selection, and custom boundaries.\n </p>\n </section>\n\n <section class=\"installation-section\">\n <h2>Installation</h2>\n <p>To install the library, use npm or yarn:</p>\n \n <div class=\"install-command\">\n <pre>\n <code>npm install @libs-ui/components-drag-drop</code>\n <libs_ui-components-buttons-button\n [label]=\"'Copy'\"\n (outClick)=\"copyToClipboard('npm install @libs-ui/components-drag-drop')\" />\n </pre>\n </div>\n \n <p>Or with yarn:</p>\n \n <div class=\"install-command\">\n <pre>\n <code>yarn add @libs-ui/components-drag-drop</code>\n <libs_ui-components-buttons-button\n [label]=\"'Copy'\"\n (outClick)=\"copyToClipboard('yarn add @libs-ui/components-drag-drop')\" />\n </pre>\n </div>\n </section>\n\n <section class=\"demo-section\">\n <h2>Live Demo</h2>\n <div class=\"demo-container\">\n <!-- Basic List Demo -->\n <div class=\"demo-example\">\n <h3>Basic List</h3>\n <div class=\"list-container\">\n <div LibsUiComponentsDragContainerDirective \n [(items)]=\"basicItems\"\n [acceptDragSameGroup]=\"true\">\n @for (item of basicItems; track item) {\n <div class=\"list-item\"\n LibsUiDragItemDirective>\n <span class=\"item-icon\">📋</span>\n <span class=\"item-text\">{{ item }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Kanban Board Demo -->\n <div class=\"demo-example\">\n <h3>Kanban Board</h3>\n <div class=\"kanban-board\">\n @for (column of columns; track column) {\n <div class=\"kanban-column\"\n LibsUiComponentsDragContainerDirective \n [(items)]=\"column.items\"\n [groupName]=\"column.id\"\n [dropToGroupName]=\"columnsIds\"\n [acceptDragSameGroup]=\"true\">\n <h4>{{ column.title }}</h4>\n @for (item of column.items; track item) {\n <div class=\"kanban-item\"\n LibsUiDragItemDirective>\n <div class=\"kanban-item-header\">\n <span class=\"item-title\">{{ item.title }}</span>\n <span class=\"item-status\" [class]=\"'status-' + item.status\">\n {{ item.status }}\n </span>\n </div>\n <p class=\"item-description\">{{ item.description }}</p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Nested Containers Demo -->\n <div class=\"demo-example\">\n <h3>Nested Containers copy</h3>\n <div class=\"nested-container\">\n <div LibsUiComponentsDragContainerDirective \n [(items)]=\"nestedItems\"\n [groupName]=\"'parent'\"\n [mode]=\"'copy'\"\n [acceptDragSameGroup]=\"true\">\n @for (item of nestedItems; track item) {\n <div class=\"nested-item\"\n LibsUiDragItemDirective>\n <div class=\"nested-item-header\">\n <span class=\"item-title\">{{ item.title }}</span>\n </div>\n <div class=\"nested-item-content\">\n <div LibsUiComponentsDragContainerDirective \n [(items)]=\"item.subItems\"\n [groupName]=\"'child'\"\n [acceptDragSameGroup]=\"true\">\n @for (subItem of item.subItems; track subItem) {\n <div class=\"sub-item\"\n LibsUiDragItemDirective>\n {{ subItem }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"api-doc-section\">\n <h2>API Documentation</h2>\n \n <h3>Inputs</h3>\n <div class=\"table-container\">\n <table class=\"api-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Type</th>\n <th>Default</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (input of inputsDoc; track input.name) {\n <tr>\n <td><code>{{input.name}}</code></td>\n <td><code>{{input.type}}</code></td>\n <td>{{input.default}}</td>\n <td>{{input.description}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <h3>Outputs</h3>\n <div class=\"table-container\">\n <table class=\"api-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Type</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (output of outputsDoc; track output.name) {\n <tr>\n <td><code>{{output.name}}</code></td>\n <td><code>{{output.type}}</code></td>\n <td>{{output.description}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n\n <section class=\"interfaces-section\">\n <h2>Interfaces</h2>\n <div class=\"interface-docs\">\n @for (interfaceItem of interfacesDoc; track interfaceItem.name) {\n <div class=\"interface-item\">\n <h3>{{interfaceItem.name}}</h3>\n <pre><code>{{interfaceItem.code}}</code></pre>\n <p>{{interfaceItem.description}}</p>\n </div>\n }\n </div>\n </section>\n\n <section class=\"features-section\">\n <h2>Features</h2>\n <ul>\n @for (feature of features; track feature.id) {\n <li>\n <span class=\"feature-icon\">{{feature.icon}}</span>\n <div class=\"feature-info\">\n <h3>{{feature.title}}</h3>\n <p>{{feature.description}}</p>\n </div>\n </li>\n }\n </ul>\n </section>\n\n <section class=\"usage-section\">\n <h2>Usage</h2>\n <div class=\"code-examples\">\n @for (example of codeExamples; track example.id) {\n <div class=\"code-example\">\n <h3>{{example.title}}</h3>\n <pre><code [innerHTML]=\"example.code\"></code></pre>\n </div>\n }\n </div>\n </section>\n </main>\n </div>\n `,\n styles: [`\n .page-container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n line-height: 1.6;\n color: #333;\n }\n \n header {\n text-align: center;\n padding: 40px 0;\n background-color: #ffffff;\n border-radius: 8px;\n margin-bottom: 30px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n }\n \n header h1 {\n font-size: 2.5rem;\n color: #2c3e50;\n margin-bottom: 10px;\n }\n \n header p {\n font-size: 1.2rem;\n color: #7f8c8d;\n }\n \n section {\n background-color: #ffffff;\n border-radius: 8px;\n padding: 30px;\n margin-bottom: 30px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n }\n \n h2 {\n font-size: 1.8rem;\n color: #2c3e50;\n margin-bottom: 20px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n }\n \n h3 {\n font-size: 1.4rem;\n color: #34495e;\n margin-bottom: 15px;\n }\n\n h4 {\n font-size: 1.2rem;\n color: #34495e;\n margin-bottom: 10px;\n }\n \n p {\n margin-bottom: 15px;\n }\n \n code {\n font-family: 'Courier New', Courier, monospace;\n background-color: #f7f7f7;\n padding: 2px 5px;\n border-radius: 3px;\n font-size: 0.9em;\n }\n \n pre {\n background-color: #f7f7f7;\n padding: 15px;\n border-radius: 5px;\n overflow-x: auto;\n margin-bottom: 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n \n pre code {\n background-color: transparent;\n padding: 0;\n }\n\n /* Installation section styles */\n .installation-section .install-command {\n position: relative;\n margin-bottom: 20px;\n }\n \n .installation-section .copy-button {\n position: absolute;\n top: 10px;\n right: 10px;\n background: #3498db;\n color: white;\n border: none;\n border-radius: 4px;\n padding: 5px 10px;\n font-size: 0.9rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n \n .installation-section .copy-button:hover {\n background: #2980b9;\n }\n\n /* Demo section styles */\n .demo-container {\n display: grid;\n grid-template-columns: 1fr;\n gap: 30px;\n }\n\n .demo-example {\n background: #f7f7f7;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n }\n\n /* List styles */\n .list-container {\n max-width: 400px;\n margin: 20px auto;\n }\n\n .list-item {\n padding: 12px;\n margin: 8px 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n }\n\n .list-item:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n }\n\n .item-icon {\n margin-right: 12px;\n font-size: 1.2em;\n }\n\n /* Kanban styles */\n .kanban-board {\n display: flex;\n gap: 20px;\n padding: 20px;\n overflow-x: auto;\n }\n\n .kanban-column {\n flex: 1;\n min-width: 300px;\n background: #f5f5f5;\n padding: 15px;\n border-radius: 8px;\n }\n\n .kanban-item {\n background: white;\n padding: 12px;\n margin: 8px 0;\n border-radius: 6px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n }\n\n .kanban-item-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .item-title {\n font-weight: 500;\n }\n\n .item-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.8em;\n }\n\n .status-todo {\n background: #ffebee;\n color: #c62828;\n }\n\n .status-in-progress {\n background: #fff3e0;\n color: #ef6c00;\n }\n\n .status-done {\n background: #e8f5e9;\n color: #2e7d32;\n }\n\n .item-description {\n font-size: 0.9em;\n color: #666;\n }\n\n /* Nested containers styles */\n .nested-container {\n max-width: 800px;\n margin: 0 auto;\n }\n\n .nested-item {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n margin: 12px 0;\n overflow: hidden;\n }\n\n .nested-item-header {\n padding: 12px;\n background: #f5f5f5;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .nested-item-content {\n padding: 12px;\n }\n\n .sub-item {\n padding: 8px;\n margin: 4px 0;\n background: #f9f9f9;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n }\n\n /* API documentation styles */\n .api-doc-section {\n margin-bottom: 40px;\n }\n \n .table-container {\n overflow-x: auto;\n margin-bottom: 30px;\n }\n \n .api-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 20px;\n }\n \n .api-table th,\n .api-table td {\n padding: 12px 15px;\n text-align: left;\n border-bottom: 1px solid #e1e1e1;\n }\n \n .api-table th {\n background-color: #f5f5f5;\n font-weight: bold;\n }\n \n .api-table tbody tr:hover {\n background-color: #f9f9f9;\n }\n\n /* Features section */\n .features-section ul {\n list-style: none;\n }\n \n .features-section li {\n display: flex;\n margin-bottom: 25px;\n align-items: flex-start;\n }\n \n .feature-icon {\n font-size: 2rem;\n margin-right: 20px;\n min-width: 40px;\n text-align: center;\n }\n \n .feature-info {\n flex: 1;\n }\n\n /* Code examples */\n .code-examples {\n display: grid;\n grid-template-columns: 1fr;\n gap: 20px;\n }\n \n @media (min-width: 768px) {\n .code-examples {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n \n @media (min-width: 992px) {\n .code-examples {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n \n .code-example {\n border: 1px solid #ecf0f1;\n border-radius: 5px;\n padding: 15px;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n header {\n padding: 30px 0;\n }\n \n header h1 {\n font-size: 2rem;\n }\n \n section {\n padding: 20px;\n }\n \n .kanban-board {\n flex-direction: column;\n }\n \n .kanban-column {\n min-width: 100%;\n }\n \n .feature-icon {\n font-size: 1.5rem;\n margin-right: 15px;\n }\n }\n `]\n})\nexport class LibsUiDragDropDemoComponent {\n // Basic List Items\n basicItems = [\n 'Task 1',\n 'Task 2',\n 'Task 3',\n 'Task 4',\n 'Task 5'\n ];\n\n // Kanban Board Columns\n columnsIds = ['todo', 'in-progress', 'done'];\n columns: Column[] = [\n {\n id: 'todo',\n title: 'To Do',\n items: [\n {\n id: 1,\n title: 'Implement drag and drop',\n description: 'Add drag and drop functionality to the component',\n status: 'todo'\n },\n {\n id: 2,\n title: 'Add animations',\n description: 'Implement smooth animations for drag and drop',\n status: 'todo'\n }\n ]\n },\n {\n id: 'in-progress',\n title: 'In Progress',\n items: [\n {\n id: 3,\n title: 'Fix styling issues',\n description: 'Resolve CSS conflicts in the component',\n status: 'in-progress'\n }\n ]\n },\n {\n id: 'done',\n title: 'Done',\n items: [\n {\n id: 4,\n title: 'Setup project structure',\n description: 'Initialize the project with necessary configurations',\n status: 'done'\n }\n ]\n }\n ];\n\n // Nested Items\n nestedItems = [\n {\n id: 1,\n title: 'Project A',\n subItems: ['Task 1', 'Task 2', 'Task 3']\n },\n {\n id: 2,\n title: 'Project B',\n subItems: ['Task 4', 'Task 5']\n },\n {\n id: 3,\n title: 'Project C',\n subItems: ['Task 6', 'Task 7', 'Task 8']\n }\n ];\n\n // API Documentation\n inputsDoc = [\n {\n name: 'items',\n type: 'Array<unknown>',\n default: '[]',\n description: 'Array of items to be displayed in the container'\n },\n {\n name: 'mode',\n type: \"'move' | 'copy' | 'deepCopy'\",\n default: \"'move'\",\n description: 'Mode for drag and drop operations'\n },\n {\n name: 'directionDrag',\n type: \"'horizontal' | 'vertical'\",\n default: 'undefined',\n description: 'Direction of drag movement'\n },\n {\n name: 'viewEncapsulation',\n type: \"'emulated' | 'none'\",\n default: \"'emulated'\",\n description: 'View encapsulation mode for styling'\n },\n {\n name: 'disableDragContainer',\n type: 'boolean',\n default: 'undefined',\n description: 'Whether to disable drag operations for the container'\n },\n {\n name: 'acceptDragSameGroup',\n type: 'boolean',\n default: 'false',\n description: 'Whether to accept drag operations within the same group'\n },\n {\n name: 'placeholder',\n type: 'boolean',\n default: 'true',\n description: 'Whether to show placeholder during drag'\n },\n {\n name: 'groupName',\n type: 'string',\n default: \"'groupDragAndDropDefault'\",\n description: 'Name of the group for drag and drop operations'\n },\n {\n name: 'dropToGroupName',\n type: 'Array<string> | null',\n default: 'null',\n description: 'List of group names that can accept drops from this container'\n },\n {\n name: 'stylesOverride',\n type: 'Array<{ className: string, styles: string }>',\n default: 'undefined',\n description: 'Custom styles to override default drag-drop styling'\n }\n ];\n\n outputsDoc = [\n {\n name: 'outDragStartContainer',\n type: 'IDragStart',\n description: 'Event emitted when dragging starts in the container'\n },\n {\n name: 'outDragOverContainer',\n type: 'IDragOver',\n description: 'Event emitted when dragging over the container'\n },\n {\n name: 'outDragLeaveContainer',\n type: 'IDragLeave',\n description: 'Event emitted when dragging leaves the container'\n },\n {\n name: 'outDragEndContainer',\n type: 'IDragEnd',\n description: 'Event emitted when dragging ends in the container'\n },\n {\n name: 'outDroppedContainer',\n type: 'IDrop',\n description: 'Event emitted when an item is dropped in the container'\n },\n {\n name: 'outDroppedContainerEmpty',\n type: 'IDrop',\n description: 'Event emitted when an item is dropped in an empty container'\n },\n {\n name: 'outFunctionControl',\n type: 'IDragDropFunctionControlEvent',\n description: 'Event emitted to control drag-drop functionality'\n }\n ];\n\n // Interface Documentation\n interfacesDoc = [\n {\n name: 'IDragging',\n code: `interface IDragging {\n mousePosition: IMousePosition;\n elementDrag: HTMLElement;\n elementKeepContainer?: boolean;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag operation events, containing information about the dragged element and mouse position'\n },\n {\n name: 'IDragStart',\n code: `interface IDragStart {\n mousePosition: IMousePosition;\n elementDrag: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag start events, triggered when dragging begins'\n },\n {\n name: 'IDragOver',\n code: `interface IDragOver {\n mousePosition: IMousePosition;\n elementDrag: HTMLElement;\n elementDragOver: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag over events, triggered when an element is dragged over another element'\n },\n {\n name: 'IDragLeave',\n code: `interface IDragLeave {\n elementDrag: HTMLElement;\n elementDragLeave: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag leave events, triggered when a dragged element leaves another element'\n },\n {\n name: 'IDragEnd',\n code: `interface IDragEnd {\n mousePosition: IMousePosition;\n elementDrag: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag end events, triggered when dragging ends'\n },\n {\n name: 'IDrop',\n code: `interface IDrop {\n elementDrag: HTMLElement;\n elementDrop: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drop events, triggered when an element is dropped'\n },\n {\n name: 'IItemDragInfo',\n code: `interface IItemDragInfo {\n item: object;\n itemsMove?: WritableSignal<Array<unknown>>;\n indexDrag?: number;\n indexDrop?: number;\n itemsDrag: WritableSignal<Array<unknown>>;\n itemsDrop?: WritableSignal<Array<unknown>>;\n containerDrag?: HTMLElement;\n containerDrop?: HTMLElement;\n}`,\n description: 'Interface containing information about the dragged item and its containers'\n },\n {\n name: 'IDragItemInContainerVirtualScroll',\n code: `interface IDragItemInContainerVirtualScroll {\n itemDragInfo?: IItemDragInfo;\n elementDrag: HTMLElement;\n distanceStartElementAndMouseTop: number;\n distanceStartElementAndMouseLeft: number;\n elementContainer?: HTMLElement;\n dragBoundary?: boolean;\n dragBoundaryAcceptMouseLeaveContainer?: boolean;\n ignoreStopEvent?: boolean;\n}`,\n description: 'Interface for virtual scrolling drag operations, containing information about drag boundaries and container elements'\n },\n {\n name: 'IMousePosition',\n code: `interface IMousePosition {\n clientX: number;\n clientY: number;\n}`,\n description: 'Interface representing mouse position coordinates'\n },\n {\n name: 'IDragDropFunctionControlEvent',\n code: `interface IDragDropFunctionControlEvent {\n setAttributeElementAndItemDrag: () => Promise<void>;\n}`,\n description: 'Interface for drag and drop control functions'\n }\n ];\n\n // Features\n features = [\n {\n id: 1,\n icon: '🔄',\n title: 'Flexible Drag and Drop',\n description: 'Support for container-to-container dragging with customizable group names and drop zones'\n },\n {\n id: 2,\n icon: '📜',\n title: 'Virtual Scrolling',\n description: 'Efficient handling of large lists with virtual scrolling support'\n },\n {\n id: 3,\n icon: '🎯',\n title: 'Custom Boundaries',\n description: 'Define custom drag boundaries and drop zones for precise control'\n },\n {\n id: 4,\n icon: '🎨',\n title: 'Styling Options',\n description: 'Customizable styles for drag items and containers'\n }\n ];\n\n // Code Examples\n codeExamples = [\n {\n id: 1,\n title: 'Basic Usage',\n code: `<div LibsUiComponentsDragContainerDirective \n [(items)]=\"items\"\n [groupName]=\"'myGroup'\"\n [acceptDragSameGroup]=\"true\">\n @for (item of items; track item) {\n <div LibsUiDragItemDirective>\n {{ item }}\n </div>\n }\n</div>`\n },\n {\n id: 2,\n title: 'Container-to-Container',\n code: `<div LibsUiComponentsDragContainerDirective \n [(items)]=\"sourceItems\"\n [groupName]=\"'source'\">\n @for (item of sourceItems; track item) {\n <div LibsUiDragItemDirective>\n {{ item }}\n </div>\n }\n</div>\n\n<div LibsUiComponentsDragContainerDirective \n [(items)]=\"targetItems\"\n [groupName]=\"'target'\"\n [dropToGroupName]=\"['source']\">\n @for (item of targetItems; track item) {\n <div LibsUiDragItemDirective>\n {{ item }}\n </div>\n }\n</div>`\n }];\n\n /**\n * Copy text to clipboard\n */\n copyToClipboard(text: string) {\n navigator.clipboard.writeText(text).then(\n () => {\n alert('Copied to clipboard');\n },\n (err) => {\n console.error('Could not copy text: ', err);\n }\n );\n }\n} ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-drag-drop.mjs","sources":["../../../../../libs-ui/components/drag-drop/src/defines/css.define.ts","../../../../../libs-ui/components/drag-drop/src/drag-drop.service.ts","../../../../../libs-ui/components/drag-drop/src/drag-scroll.directive.ts","../../../../../libs-ui/components/drag-drop/src/drag-drop.directive.ts","../../../../../libs-ui/components/drag-drop/src/drag-item-in-container-virtual-scroll.directive.ts","../../../../../libs-ui/components/drag-drop/src/drag-item.directive.ts","../../../../../libs-ui/components/drag-drop/src/demo/demo.component.ts","../../../../../libs-ui/components/drag-drop/src/libs-ui-components-drag-drop.ts"],"sourcesContent":["export const styleContainer = (config: Array<{ className: string, styles: string }>, viewEncapsulation: 'emulated' | 'none', groupID: string): string => {\n const defaultConfig = [{\n className: 'libs-ui-drag-drop-container',\n styles: `display:block;`\n },\n {\n className: 'libs-ui-drag-drop-item',\n styles: `\n cursor:move;`\n },\n {\n className: 'libs-ui-drag-drop-item-placeholder',\n styles: `visibility: hidden;`\n },\n {\n className: 'libs-ui-drag-drop-item-origin-placeholder',\n styles: `visibility: hidden;`\n },\n {\n className: 'libs-ui-drag-drop-item-drop-placeholder',\n styles: `visibility: hidden;`\n },\n {\n className: 'libs-ui-drag-drop-item-dragging',\n styles: `cursor:move; user-select: none; `\n },\n {\n className: 'libs-ui-drag-drop-item-disable',\n styles: ` cursor:not-allowed;`\n },\n {\n className: 'libs-ui-drag-drop-item-translate-bottom',\n styles: `position:relative;animation: translateBottom 0.35s 1 ease;`\n },\n {\n className: 'libs-ui-drag-drop-item-translate-top',\n styles: `position:relative;animation: translateTop 0.35s 1 ease;`\n },\n {\n className: 'libs-ui-drag-drop-item-translate-left',\n styles: `position:relative;animation: translateLeft 0.35s 1 ease;`\n },\n {\n className: 'libs-ui-drag-drop-item-translate-right',\n styles: `position:relative;animation: translateRight 0.35s 1 ease;`\n }];\n\n config.forEach(item => {\n const itemExits = defaultConfig.find(defaultItem => defaultItem.className === item.className);\n\n if (itemExits) {\n itemExits.styles = item.styles;\n\n return;\n }\n defaultConfig.push(item);\n });\n const groupAttr = viewEncapsulation ? `[groupID~=\"${groupID}\"]` : '';\n let styles = '';\n\n defaultConfig.forEach((item) => {\n const style = `${groupAttr}.${item.className}{${item.styles}}`;\n\n styles = `${styles}${style}\\n`;\n });\n\n styles = ` @keyframes translateTop {\n 0% {\n transform: translateY(30px);\n }\n \n 100% {\n transform: translateX(0);\n }\n }\n \n @keyframes translateBottom {\n 0% {\n transform: translateY(-30px);\n }\n \n 100% {\n transform: translateX(0px);\n }\n }\n @keyframes translateLeft {\n 0% {\n transform: translateX(30px);\n }\n \n 100% {\n transform: translateX(0);\n }\n }\n \n @keyframes translateRight {\n 0% {\n transform: translateX(-30px);\n }\n \n 100% {\n transform: translateX(0px);\n }\n }\n ${styles}`.replace(/\\n+/g, '');\n\n return styles;\n};","import { Injectable, WritableSignal, signal } from \"@angular/core\";\nimport { Subject } from \"rxjs\";\nimport { IDragEnd, IDragItemInContainerVirtualScroll, IDragLeave, IDragOver, IDragStart, IDragging, IDrop, IItemDragInfo } from \"./interfaces/event.interface\";\n@Injectable({\n providedIn: 'any'\n})\n\nexport class MoLibsSharedDragDropService {\n private itemsClick = new Array<HTMLElement>();\n private onDragItemInContainerVirtualScroll = new Subject<IDragItemInContainerVirtualScroll>();\n private itemDragInfo?: IItemDragInfo;\n private container = signal(new Map<string, { element: HTMLElement; elementScroll?: HTMLElement }>());\n private targetItemDragFlag = 'item-drag-target';\n private classContainerDefine = 'libs-ui-drag-drop-container';\n private classItemDefine = 'libs-ui-drag-drop-item';\n private onDragging = new Subject<IDragging>();\n private onDragStart = new Subject<IDragStart>();\n private onDragEnd = new Subject<IDragEnd>();\n private onDragOver = new Subject<IDragOver>();\n private onDragLeave = new Subject<IDragLeave>();\n private onDrop = new Subject<IDrop>();\n private onDropContainer = new Subject<IDrop>();\n private onItemInit = new Subject<string>();\n\n public get OnDragItemInContainerVirtualScroll(): Subject<IDragItemInContainerVirtualScroll> {\n return this.onDragItemInContainerVirtualScroll;\n }\n\n public set ItemDragInfo(data: IItemDragInfo | undefined) {\n this.itemDragInfo = data;\n }\n\n public get ItemDragInfo(): IItemDragInfo | undefined {\n return this.itemDragInfo;\n }\n\n public get Container(): WritableSignal<Map<string, { element: HTMLElement; elementScroll?: HTMLElement }>> {\n return this.container;\n }\n\n public get TargetItemDragFlag() {\n return this.targetItemDragFlag;\n }\n\n public get ClassContainerDefine() {\n return this.classContainerDefine;\n }\n\n public get ClassItemDefine() {\n return this.classItemDefine;\n }\n\n public get OnDragging() {\n return this.onDragging;\n }\n\n public get OnDragOver() {\n return this.onDragOver;\n }\n\n public get OnDragLeave() {\n return this.onDragLeave;\n }\n\n public get OnDragStart() {\n return this.onDragStart;\n }\n\n public get OnDragEnd() {\n return this.onDragEnd;\n }\n\n public get OnDropContainer() {\n return this.onDropContainer;\n }\n\n public get OnDrop() {\n return this.onDrop;\n }\n\n public get OnItemInit() {\n return this.onItemInit;\n }\n\n public get ItemClick(): Array<HTMLElement> {\n return [...this.itemsClick];\n }\n\n public set ItemClick(item: HTMLElement) {\n this.itemsClick.push(item);\n }\n\n public resetItemClick() {\n this.itemsClick.length = 0;\n }\n\n public checkElementOverAcceptElementDrag(groupNameOfContainer: string | null, groupNameOfElementDrag: string | null, groupNameOfDropTo: string | null): boolean {\n if (groupNameOfContainer !== groupNameOfElementDrag && !groupNameOfDropTo) {\n return false;\n }\n\n if (groupNameOfDropTo !== null && !groupNameOfDropTo.toString().split(';').includes(groupNameOfContainer || 'undefinedName')) {\n return false;\n }\n\n return true;\n }\n}","import { AfterViewInit, Directive, ElementRef, OnDestroy, inject, input, signal } from \"@angular/core\";\nimport { IPageInfo, VirtualScrollerComponent } from \"@iharbeck/ngx-virtual-scroller\";\nimport { IBoundingClientRect } from \"@libs-ui/interfaces-types\";\nimport { checkMouseOverInContainer, cloneIBoundingClientRect, get } from \"@libs-ui/utils\";\nimport { Subject, takeUntil } from \"rxjs\";\nimport { MoLibsSharedDragDropService } from \"./drag-drop.service\";\nimport { IDragging } from \"./interfaces/event.interface\";\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiComponentsDragScrollDirective]\",\n standalone: true\n})\nexport class LibsUiComponentsDragScrollDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n private stopScroll = signal<boolean>(false);\n private virtualScrollPageInfo = signal<IPageInfo | undefined>(undefined);\n protected intervalScrollToElement = signal<number | undefined>(undefined);\n protected onDestroy = new Subject<void>();\n\n // #region INPUT\n readonly ignoreAutoScroll = input<boolean>();\n readonly widthZoneDetect = input<number, number | undefined>(16, { transform: value => value ?? 16 });\n readonly movementLength = input<number, number | undefined>(6, { transform: value => value ?? 6 });\n readonly rootElementScroll = input<HTMLElement>();\n readonly virtualScrollerComponent = input<VirtualScrollerComponent>();\n\n // #region INJECT\n protected elementRef = inject(ElementRef);\n protected dragDropService = inject(MoLibsSharedDragDropService);\n\n ngAfterViewInit(): void {\n this.dragDropService.OnDragging.pipe(takeUntil(this.onDestroy)).subscribe((eventDragging) => this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll()));\n this.dragDropService.OnDragEnd.pipe(takeUntil(this.onDestroy)).subscribe(() => {\n clearInterval(this.intervalScrollToElement());\n if (this.virtualScrollPageInfo()) {\n const firstElement = get(this.virtualScrollerComponent(), 'element')?.nativeElement.firstElementChild;\n const isHorizontal = get(this.virtualScrollerComponent(), '_horizontal');\n if (isHorizontal) {\n firstElement.style.transform = `scaleX(${this.virtualScrollPageInfo()?.scrollEndPosition})`;\n }\n if (!isHorizontal) {\n firstElement.style.transform = `scaleY(${this.virtualScrollPageInfo()?.scrollEndPosition})`;\n }\n this.virtualScrollPageInfo.set(undefined);\n }\n this.stopScroll.set(false);\n });\n this.dragDropService.OnDragStart.pipe(takeUntil(this.onDestroy)).subscribe(() => {\n if (this.virtualScrollerComponent) {\n this.virtualScrollerComponent()?.scrollToIndex(0);\n }\n });\n if (!this.virtualScrollerComponent) {\n return;\n }\n this.virtualScrollerComponent()?.vsChange.pipe(takeUntil(this.onDestroy)).subscribe(pageInfo => {\n const items = get(this.virtualScrollerComponent, '_items');\n\n if (items && items.length === pageInfo.endIndex) {\n this.virtualScrollPageInfo.set(pageInfo);\n const elementSetScroll = this.rootElementScroll() || this.elementRef.nativeElement;\n const isHorizontal = get(this.virtualScrollerComponent, '_horizontal');\n\n if (isHorizontal && pageInfo.scrollEndPosition < elementSetScroll.offsetWidth + elementSetScroll.scrollLeft + 3) {\n this.stopScroll.set(true);\n clearInterval(this.intervalScrollToElement());\n\n return;\n }\n\n if (!isHorizontal && pageInfo.scrollEndPosition < elementSetScroll.offsetHeight + elementSetScroll.scrollTop + 3) {\n this.stopScroll.set(true);\n clearInterval(this.intervalScrollToElement());\n\n return;\n }\n }\n this.stopScroll.set(false);\n });\n }\n\n /* FUNCTIONS */\n protected checkAndScrollElementToPosition(eventDragging: IDragging, ignoreAutoScroll?: boolean) {\n let elementSetScroll = this.rootElementScroll() || this.elementRef.nativeElement;\n\n if (ignoreAutoScroll || !checkMouseOverInContainer(eventDragging.mousePosition, elementSetScroll)) {\n return;\n }\n const rectElement = cloneIBoundingClientRect(this.elementRef.nativeElement.getBoundingClientRect());\n\n if (this.rootElementScroll()) {\n const rectElementScroll = this.rootElementScroll()?.getBoundingClientRect() as IBoundingClientRect;\n\n rectElement.left = rectElementScroll.left;\n rectElement.top = rectElementScroll.top;\n }\n\n const { width, height, top, left } = rectElement;\n const { clientX, clientY } = eventDragging.mousePosition;\n const limitLeft = left + elementSetScroll.offsetWidth;\n const limitTop = top + elementSetScroll.offsetHeight;\n\n clearInterval(this.intervalScrollToElement());\n if ((clientX < left || clientX > left + width) && (clientY < top || clientY > top + height)) {\n return;\n }\n\n this.intervalScrollToElement.set(setInterval(() => {\n elementSetScroll = (this.rootElementScroll() || this.elementRef.nativeElement);\n let directionTop = 0;\n let directionLeft = 0;\n\n if (top <= clientY && clientY <= top + this.widthZoneDetect()) {\n elementSetScroll.scrollTop -= this.movementLength();\n directionTop = -1;\n }\n\n if (limitTop - this.widthZoneDetect() <= clientY && clientY <= limitTop) {\n if (this.stopScroll()) {\n return;\n }\n elementSetScroll.scrollTop += this.movementLength();\n directionTop = 1;\n }\n\n if ((limitLeft - this.widthZoneDetect() <= clientX) && (clientX <= limitLeft)) {\n if (this.stopScroll()) {\n return;\n }\n elementSetScroll.scrollLeft += this.movementLength();\n directionLeft = +1;\n\n }\n if (left <= clientX && clientX <= left + this.widthZoneDetect()) {\n elementSetScroll.scrollLeft -= this.movementLength();\n directionLeft = -1;\n }\n\n if (elementSetScroll.scrollLeft && (elementSetScroll.scrollLeft + elementSetScroll.offsetWidth >= elementSetScroll.scrollWidth)) {\n elementSetScroll.scrollLeft -= elementSetScroll.scrollLeft + elementSetScroll.offsetWidth - elementSetScroll.scrollWidth;\n }\n\n if (elementSetScroll.scrollTop && (elementSetScroll.scrollTop + elementSetScroll.offsetHeight >= elementSetScroll.scrollHeight)) {\n elementSetScroll.scrollTop -= elementSetScroll.scrollTop + elementSetScroll.offsetHeight - elementSetScroll.scrollHeight;\n }\n\n if ((directionTop < 0 && !elementSetScroll.scrollTop) || (!elementSetScroll.scrollLeft && directionLeft < 0) || (directionTop && elementSetScroll.scrollHeight <= elementSetScroll.scrollTop + elementSetScroll.offsetHeight + 3) || (directionLeft && elementSetScroll.scrollWidth <= elementSetScroll.scrollLeft + elementSetScroll.offsetWidth + 3)) {\n return clearInterval(this.intervalScrollToElement());\n }\n }, 10));\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}\n","import { AfterViewInit, Directive, OnDestroy, effect, input, model, output, signal, untracked } from \"@angular/core\";\nimport { checkMouseOverInContainer, cloneDeep, get, set, uuid } from \"@libs-ui/utils\";\nimport { Observable, debounceTime, filter, takeUntil } from \"rxjs\";\nimport { styleContainer } from \"./defines/css.define\";\nimport { LibsUiComponentsDragScrollDirective } from \"./drag-scroll.directive\";\nimport { IDragDropFunctionControlEvent, IDragEnd, IDragLeave, IDragOver, IDragStart, IDragging, IDrop } from \"./interfaces/event.interface\";\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiComponentsDragContainerDirective]\",\n standalone: true,\n})\nexport class LibsUiComponentsDragContainerDirective extends LibsUiComponentsDragScrollDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n private groupID = signal<string>(uuid());\n private isDragOver = signal<boolean>(false);\n\n // #region INPUT\n readonly disableDragContainer = input<boolean>();\n readonly mode = input<string, 'move' | 'copy' | 'deepCopy'>('move', { transform: value => value ?? 'move' });\n readonly directionDrag = input<'horizontal' | 'vertical'>();\n readonly viewEncapsulation = input<'emulated' | 'none', 'emulated' | 'none' | undefined>('emulated', { transform: value => value ?? 'emulated' });\n readonly acceptDragSameGroup = input<boolean, boolean | undefined>(false, { transform: value => value ?? false });\n readonly placeholder = input<boolean, boolean | undefined>(true, { transform: value => value ?? true });\n readonly groupName = input<string, string | undefined>('groupDragAndDropDefault', { transform: value => value ?? 'groupDragAndDropDefault' }); // nếu các group có tên trùng nhau sẽ được drop\n readonly dropToGroupName = input<Array<string> | null>(null); // nếu item trong các group A được drop vào group B nhưng group B không được drop vào group A\n readonly items = model.required<Array<unknown>>();\n readonly stylesOverride = input<Array<{ className: string, styles: string }>>();\n\n // #region OUTPUT\n readonly outDragStartContainer = output<IDragStart>();\n readonly outDragOverContainer = output<IDragOver>();\n readonly outDragLeaveContainer = output<IDragLeave>();\n readonly outDragEndContainer = output<IDragEnd>();\n readonly outDroppedContainer = output<IDrop>();\n readonly outDroppedContainerEmpty = output<IDrop>();\n readonly outFunctionControl = output<IDragDropFunctionControlEvent>();\n\n constructor() {\n super();\n const element = this.elementRef.nativeElement as HTMLElement;\n const container = { element };\n\n this.dragDropService.Container().set(this.groupID(), container);\n\n effect(() => {\n if (!this.rootElementScroll()) {\n return;\n }\n untracked(() => {\n set(container, 'elementScroll', this.rootElementScroll());\n });\n });\n\n effect(() => {\n if (this.directionDrag() && this.elementRef.nativeElement) {\n this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);\n }\n });\n effect(() => {\n if (this.disableDragContainer() && this.elementRef.nativeElement) {\n this.setAttributeElementAndItemDrag(this.elementRef.nativeElement);\n }\n });\n }\n\n override ngAfterViewInit(): void {\n this.outFunctionControl.emit({ setAttributeElementAndItemDrag: () => this.setAttributeElementAndItemDrag(this.elementRef.nativeElement) });\n\n this.outDroppedContainer.subscribe(eventDropped => {\n this.dragDropService.OnDropContainer.next(eventDropped);\n });\n this.onDestroy.subscribe(() => {\n if (indexSpliceListTo > -1) {\n this.items.update(items => {\n items.splice(indexSpliceListTo, 1);\n return [...items];\n });\n }\n\n this.dragDropService.Container().delete(this.groupID());\n });\n const elementContainer = this.elementRef.nativeElement as HTMLElement;\n\n this.initStyleAndAttribute(elementContainer, true);\n this.dragDropService.OnItemInit.pipe(debounceTime(250), filter(groupName => groupName === this.groupName()), takeUntil(this.onDestroy)).subscribe(() => this.initStyleAndAttribute(elementContainer));\n const styleTag = document.createElement(\"style\");\n\n styleTag.textContent = styleContainer((this.stylesOverride() || []), this.viewEncapsulation(), this.groupID());\n elementContainer.appendChild(styleTag);\n elementContainer.classList.add(this.dragDropService.ClassContainerDefine);\n\n const handlerDragStart = (eventDragStart: IDragStart) => {\n\n this.setAttributeElementAndItemDrag(elementContainer, true);\n if (this.groupID() === eventDragStart.elementDrag.getAttribute('groupID')) {\n this.outDragStartContainer.emit({ ...eventDragStart, itemDragInfo: this.dragDropService.ItemDragInfo });\n }\n };\n\n const storeIndex = { indexDrag: -1, indexDragOver: -1 };\n let indexSpliceListTo = -1;\n const handlerDragOver = (eventDragOver: IDragOver) => {\n const { elementDrag, elementDragOver } = eventDragOver;\n\n if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {\n return;\n }\n const indexDrag = Number(elementDrag.getAttribute('index')).valueOf();\n const indexDragOver = Number(elementDragOver.getAttribute('index')).valueOf();\n const idGroupElementDrag = elementDrag.getAttribute('groupID');\n const idGroupElementDragOver = elementDragOver.getAttribute('groupID');\n\n if ((this.groupID() !== idGroupElementDrag) || (idGroupElementDrag !== idGroupElementDragOver)) { // xử lý cho item drag over qua 1 item khác container\n if (idGroupElementDragOver === this.groupID() && this.placeholder()) {\n const item = this.mode() === 'deepCopy' ? cloneDeep(this.dragDropService.ItemDragInfo?.item) : this.dragDropService.ItemDragInfo?.item;\n\n this.items.update(items => {\n if (indexSpliceListTo >= 0) {\n items.splice(indexSpliceListTo, 1);\n }\n items.splice(indexDragOver, 0, item);\n return [...items];\n });\n this.setAttributeElementAndItemDrag(elementContainer, false, indexSpliceListTo);\n indexSpliceListTo = indexDragOver;\n }\n\n return;\n }\n\n if (!this.acceptDragSameGroup() || indexDrag < 0 || indexDragOver < 0 || !this.items().length || indexDrag > this.items().length || indexDragOver > this.items().length || (storeIndex.indexDrag === indexDrag && storeIndex.indexDragOver === indexDragOver)) {\n return;\n }\n // xử lý cho item drag over qua 1 item cùng container\n const itemDrag = this.items()[indexDrag];\n\n this.setAnimationElementDragOver(indexDrag, indexDragOver, elementDragOver);\n storeIndex.indexDrag = indexDrag;\n storeIndex.indexDragOver = indexDragOver;\n this.items.update(items => {\n items.splice(indexDrag, 1);\n items.splice(indexDragOver, 0, itemDrag);\n return [...items];\n });\n elementDrag.setAttribute('index', indexDragOver.toString());\n this.setAttributeElementAndItemDrag(elementContainer);\n };\n\n const removePlaceholderDrag = (eventDrag: IDragEnd, isDragging?: boolean) => {\n clearInterval(this.intervalScrollToElement());\n storeIndex.indexDrag = -1;\n storeIndex.indexDragOver = -1;\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n\n if (!checkMouseOverInContainer(eventDrag.mousePosition, (this.rootElementScroll() || elementContainer))) {\n const childElementIndex = Array.from<HTMLElement>(childrenElement).findIndex((child) => child.classList.contains('libs-ui-drag-drop-item-drop-placeholder'));\n\n if (childElementIndex >= 0 && this.groupID() !== eventDrag.elementDrag.getAttribute('groupID')) {\n this.items.update(items => {\n items.splice(childElementIndex, 1);\n return [...items];\n });\n indexSpliceListTo = -1;\n }\n\n this.removeAttributes(elementContainer, isDragging);\n this.setIndexElement(elementContainer);\n\n return;\n }\n if (indexSpliceListTo >= 0) {\n this.items.update(items => {\n items.splice(indexSpliceListTo, 1);\n return [...items];\n });\n indexSpliceListTo = -1;\n }\n };\n\n const handlerDragging = (eventDragging: IDragging) => {\n this.setAttributeElementAndItemDrag(elementContainer);\n const { elementDrag } = eventDragging;\n const fieldIdItem = elementDrag.getAttribute('field_id');\n const idItemDrag = elementDrag.getAttribute('item_id');\n\n if (fieldIdItem && idItemDrag && this.items().find(item => get(item, fieldIdItem) === idItemDrag)) {\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n const childElement = Array.from<HTMLElement>(childrenElement).find((child) => child.getAttribute('item_id') === idItemDrag);\n\n if (this.items() === eventDragging.itemDragInfo?.itemsDrag() && childElement && !childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder') && !childElement.getAttribute(this.dragDropService.TargetItemDragFlag)) {\n childElement.setAttribute(this.dragDropService.TargetItemDragFlag, 'true');\n this.groupID.set(elementDrag.getAttribute('groupID') || '');\n styleTag.remove();\n styleTag.textContent = styleContainer((this.stylesOverride() || []), this.viewEncapsulation(), this.groupID());\n elementContainer.appendChild(styleTag);\n this.setAttributeElementAndItemDrag(elementContainer, true);\n }\n }\n\n if (this.disableDragContainer()) {\n return;\n }\n\n if (this.groupID() === elementDrag.getAttribute('groupID') && !this.acceptDragSameGroup()) {\n this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll() || !this.acceptDragSameGroup());\n return;\n }\n\n if (!checkMouseOverInContainer(eventDragging.mousePosition, (this.rootElementScroll() || elementContainer))) {\n if (this.isDragOver()) {\n this.isDragOver.set(false);\n this.outDragLeaveContainer.emit({ ...eventDragging, elementDragLeave: elementContainer });\n }\n\n return removePlaceholderDrag(eventDragging, true);\n }\n this.checkAndScrollElementToPosition(eventDragging, this.ignoreAutoScroll());\n\n // Đoạn code xử lý cho việc kéo một element vào 1 container nhưng container không có item hoặc item drag không over qua item trong container\n if (!this.isDragOver()) {\n elementContainer.classList.add('libs-ui-drag-drop-container-dragover');\n this.isDragOver.set(true);\n this.outDragOverContainer.emit({ ...eventDragging, elementDragOver: elementContainer });\n }\n const eventDragOver = { ...eventDragging, elementDragOver: elementContainer };\n\n if (!this.items().length) {\n eventDragOver.elementDragOver = {\n getAttribute: (name: string) => {\n if (name === 'groupID') {\n return this.groupID();\n }\n if (name !== 'index') {\n return null;\n }\n\n return 0;\n }\n } as unknown as HTMLElement;\n this.dragDropService.OnDragOver.next(eventDragOver);\n\n return;\n }\n\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n let childElement = Array.from<HTMLElement>(childrenElement).find((child) => checkMouseOverInContainer(eventDragging.mousePosition, child));\n\n if (childElement) { // nếu tìm thấy thì sẽ nhận qua sự kiện của drag-item.directive emit\n return;\n }\n childElement = Array.from<HTMLElement>(childrenElement).pop();\n\n if (childElement) {\n eventDragOver.elementDragOver = childElement;\n this.dragDropService.OnDragOver.next(eventDragOver);\n }\n };\n\n const handlerDragEnd = (eventDragEnd: IDragEnd) => {\n if (this.disableDragContainer()) {\n return;\n }\n let rect = undefined;\n\n if (this.rootElementScroll() || elementContainer) {\n rect = (this.rootElementScroll() || elementContainer)?.getBoundingClientRect();\n }\n removePlaceholderDrag(eventDragEnd);\n const { elementDrag, mousePosition, itemDragInfo } = eventDragEnd;\n\n if (this.groupID() === elementDrag.getAttribute('groupID')) {\n this.outDragEndContainer.emit({ ...eventDragEnd });\n }\n if (!checkMouseOverInContainer(mousePosition, this.rootElementScroll() || elementContainer, rect)) {\n return;\n }\n const eventDrop = { elementDrag: elementDrag, elementDrop: elementContainer, itemDragInfo: itemDragInfo };\n\n if (this.disableDragContainer() || !this.dragDropService.checkElementOverAcceptElementDrag(this.groupName(), elementDrag.getAttribute('groupName'), elementDrag.getAttribute('dropToGroupName'))) {\n return;\n }\n\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n const childElement = Array.from<HTMLElement>(childrenElement).find((child) => checkMouseOverInContainer(mousePosition, child));\n\n if (childElement) {\n eventDrop.elementDrop = childElement;\n this.dragDropService.OnDrop.next(eventDrop);\n\n return;\n }\n eventDrop.elementDrop = {\n getAttribute: (name: string) => {\n if (name === 'dropContainer') {\n return true;\n }\n if (name === 'groupID') {\n return this.groupID();\n }\n if (name !== 'index') {\n return null;\n }\n\n return childrenElement.length;\n }\n } as unknown as HTMLElement;\n this.dragDropService.OnDrop.next(eventDrop);\n };\n\n const handlerDrop = (eventDrop: IDrop) => {\n if (this.disableDragContainer()) {\n return;\n }\n const { elementDrag, elementDrop, itemDragInfo } = eventDrop;\n\n if (this.groupID() === elementDrag.getAttribute('groupID') && this.groupID() === elementDrop.getAttribute('groupID')) {\n if (itemDragInfo) {\n itemDragInfo.indexDrop = Number(elementDrop.getAttribute('index')).valueOf();\n itemDragInfo.itemsDrop = this.items;\n itemDragInfo.containerDrop = elementContainer;\n }\n if (this.acceptDragSameGroup()) {\n this.outDroppedContainer.emit(eventDrop);\n }\n this.removeAttributes(elementContainer);\n this.setIndexElement(elementContainer);\n return;\n }\n\n if (this.groupID() !== elementDrop.getAttribute('groupID') || elementDrag.getAttribute('groupID') === elementDrop.getAttribute('groupID')) {\n return;\n }\n const indexDragOver = this.groupID() !== elementDrag.getAttribute('groupID') ? Number(elementDrop.getAttribute('index')).valueOf() : Number(elementDrop.getAttribute('index')).valueOf() - (elementDrop.getAttribute('dropContainer') ? 0 : 1);\n const item = this.mode() === 'deepCopy' ? cloneDeep(itemDragInfo?.item) : itemDragInfo?.item;\n\n if (itemDragInfo) {\n itemDragInfo.indexDrop = indexDragOver;\n itemDragInfo.itemsDrop = this.items;\n itemDragInfo.containerDrop = elementContainer;\n }\n\n if (!this.items().length) {\n this.outDroppedContainerEmpty.emit(eventDrop);\n }\n\n this.items.update(items => {\n items.splice(indexDragOver, 0, item);\n return [...items];\n });\n if (itemDragInfo && itemDragInfo.itemsMove && itemDragInfo.itemsMove()) {\n itemDragInfo.itemsDrag.set([...itemDragInfo.itemsMove()]);\n setTimeout(() => this.setAttributeElementAndItemDrag(elementContainer));\n }\n this.outDroppedContainer.emit(eventDrop);\n this.removeAttributes(elementContainer);\n this.setIndexElement(elementContainer);\n };\n\n [{\n name: 'OnDragStart',\n event: this.dragDropService.OnDragStart,\n functionCall: handlerDragStart\n }, {\n name: 'OnDragOver',\n event: this.dragDropService.OnDragOver,\n functionCall: handlerDragOver,\n debounceTime: 5\n }, {\n name: 'OnDragging',\n event: this.dragDropService.OnDragging,\n functionCall: handlerDragging\n }, {\n name: 'OnDragEnd',\n event: this.dragDropService.OnDragEnd,\n functionCall: handlerDragEnd\n }, {\n name: 'OnDrop',\n event: this.dragDropService.OnDrop,\n functionCall: handlerDrop\n }\n ].forEach((item: { name: string; debounceTime?: number; event: Observable<unknown>; functionCall: object }) => (item.event.pipe(debounceTime(item.debounceTime || 0), takeUntil(this.onDestroy)).subscribe(item.functionCall)));\n }\n\n /* */\n private async setAttributeElementAndItemDrag(elementContainer: HTMLElement, setItemDrag?: boolean, indexInsert?: number) {\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n let index = -1;\n\n elementContainer.setAttribute('groupID', this.groupID());\n elementContainer.removeAttribute('disableDragContainer');\n\n if (this.disableDragContainer()) {\n elementContainer.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);\n }\n if (this.groupName()) {\n elementContainer.setAttribute('groupName', this.groupName() || '');\n }\n Array.from<HTMLElement>(childrenElement).forEach((childElement) => {\n if (!childElement.hasAttribute('groupName') || childElement.getAttribute('groupName') === this.groupName()) {\n childElement.setAttribute('groupID', this.groupID());\n }\n if (childElement.getAttribute('groupID') !== this.groupID()) {\n return;\n }\n index += 1;\n childElement.setAttribute('index', `${index}`);\n childElement.removeAttribute('disableDragContainer');\n if (this.disableDragContainer()) {\n childElement.setAttribute('disableDragContainer', `${this.disableDragContainer()}`);\n }\n if (this.groupName() && !childElement.hasAttribute('groupName')) {\n childElement.setAttribute('groupName', this.groupName() || '');\n }\n if (this.placeholder()) {\n childElement.setAttribute('placeholder', `${this.placeholder()}`);\n }\n if (this.dropToGroupName()) {\n childElement.setAttribute('dropToGroupName', `${this.dropToGroupName()?.join(';')}`);\n }\n if (indexInsert === index && this.placeholder()) {\n if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {\n childElement.classList.add('libs-ui-drag-drop-item-placeholder');\n }\n if (!childElement.classList.contains('libs-ui-drag-drop-item-drop-placeholder')) {\n childElement.classList.add('libs-ui-drag-drop-item-drop-placeholder');\n }\n }\n\n if (setItemDrag && childElement.getAttribute(this.dragDropService.TargetItemDragFlag) && this.items().length >= index) {\n if (this.placeholder()) {\n if (!childElement.classList.contains('libs-ui-drag-drop-item-placeholder')) {\n childElement.classList.add('libs-ui-drag-drop-item-placeholder');\n }\n if (!childElement.classList.contains('libs-ui-drag-drop-item-origin-placeholder')) {\n childElement.classList.add('libs-ui-drag-drop-item-origin-placeholder');\n }\n }\n\n this.dragDropService.ItemDragInfo = { item: this.items()[index] as object, indexDrag: index, itemsDrag: this.items, containerDrag: elementContainer, itemsMove: signal([...this.items()]) };\n if (this.mode() === 'move') {\n this.dragDropService.ItemDragInfo.itemsMove?.update(items => {\n items.splice(index, 1);\n return [...items]\n });\n }\n }\n });\n }\n\n private initStyleAndAttribute(elementContainer: HTMLElement, hasRemoveAttribute = false,) {\n this.setAttributeElementAndItemDrag(elementContainer);\n if (hasRemoveAttribute) {\n this.removeAttributes(elementContainer);\n }\n this.setIndexElement(elementContainer);\n };\n\n private setAnimationElementDragOver(indexDrag: number, indexDragOver: number, elementDragOver: HTMLElement) {\n if (!this.directionDrag() || !elementDragOver) {\n return;\n }\n if (this.directionDrag() === 'vertical') {\n elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-bottom');\n elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-top');\n if (indexDrag > indexDragOver) {\n elementDragOver.classList.add('libs-ui-drag-drop-item-translate-bottom');\n }\n if (indexDrag < indexDragOver) {\n elementDragOver.classList.add('libs-ui-drag-drop-item-translate-top');\n }\n\n return;\n }\n\n elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-left');\n elementDragOver.classList.remove('libs-ui-drag-drop-item-translate-right');\n if (indexDrag > indexDragOver) {\n elementDragOver.classList.add('libs-ui-drag-drop-item-translate-right');\n }\n if (indexDrag < indexDragOver) {\n elementDragOver.classList.add('libs-ui-drag-drop-item-translate-left');\n }\n\n }\n\n private setIndexElement(elementContainer: HTMLElement) {\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n let index = -1;\n\n Array.from<HTMLElement>(childrenElement).forEach((childElement) => {\n if (childElement.getAttribute('groupID') !== this.groupID()) {\n return;\n }\n index += 1;\n childElement.setAttribute('index', `${index}`);\n });\n\n }\n\n private removeAttributes(elementContainer: HTMLElement, ignoreRemoveClassItemOriginPlaceholder?: boolean) {\n const childrenElement = elementContainer.getElementsByClassName(this.dragDropService.ClassItemDefine) as unknown as Array<HTMLElement>;\n\n elementContainer.classList.remove('libs-ui-drag-drop-container-dragover');\n Array.from<HTMLElement>(childrenElement).forEach((childElement) => {\n if (childElement.getAttribute('groupID') !== this.groupID()) {\n return;\n }\n childElement.removeAttribute('index');\n if (!this.dropToGroupName() || !this.dropToGroupName()?.length) {\n childElement.removeAttribute('dropToGroupName');\n }\n if (!this.placeholder()) {\n childElement.removeAttribute('placeholder');\n }\n if (this.placeholder()) {\n childElement.classList.remove('libs-ui-drag-drop-item-placeholder');\n if (!ignoreRemoveClassItemOriginPlaceholder) {\n\n childElement.classList.remove('libs-ui-drag-drop-item-origin-placeholder');\n }\n childElement.classList.remove('libs-ui-drag-drop-item-drop-placeholder');\n }\n });\n\n }\n}\n","import { AfterViewInit, Directive, OnDestroy, inject, output } from \"@angular/core\";\nimport { IBoundingClientRect } from \"@libs-ui/interfaces-types\";\nimport { cloneIBoundingClientRect, getViewport } from \"@libs-ui/utils\";\nimport { Subject, fromEvent, takeUntil, tap } from \"rxjs\";\nimport { MoLibsSharedDragDropService } from \"./drag-drop.service\";\nimport { IDragEnd } from \"./interfaces/event.interface\";\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiDragItemInContainerVirtualScrollDirective]\",\n standalone: true,\n\n})\nexport class LibsUiDragItemInContainerVirtualScrollDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n protected onDestroy = new Subject<void>();\n\n // #region OUTPUT\n readonly outDragEndContainer = output<IDragEnd>();\n\n // #region INJECT\n protected dragDropService = inject(MoLibsSharedDragDropService);\n\n ngAfterViewInit(): void {\n const addClass = ()=>{\n document.body.classList.remove('!select-none');\n document.body.classList.remove('!cursor-move');\n };\n const removeClass = ()=>{\n document.body.classList.add('!select-none');\n document.body.classList.add('!cursor-move');\n };\n this.dragDropService.OnDragEnd.pipe(takeUntil(this.onDestroy)).subscribe(e => {\n this.outDragEndContainer.emit(e);\n });\n this.dragDropService.OnDragItemInContainerVirtualScroll.pipe(takeUntil(this.onDestroy)).subscribe(dragItemInContainerVirtualScrollEvent => {\n addClass();\n const stopEventMouse = (mouseEvent: MouseEvent) => {\n if (!dragItemInContainerVirtualScrollEvent.ignoreStopEvent) {\n mouseEvent.preventDefault();\n mouseEvent.stopPropagation();\n }\n };\n const documentMouseUp = fromEvent<MouseEvent>(document, 'mouseup')\n .pipe(tap((eventMouseUp) => {\n this.updateMouseEventsWhenMoveOverIframe('auto');\n stopEventMouse(eventMouseUp);\n const mousePosition = { clientX: eventMouseUp.clientX, clientY: eventMouseUp.clientY };\n\n if (dragItemInContainerVirtualScrollEvent.dragBoundary && dragItemInContainerVirtualScrollEvent.dragBoundaryAcceptMouseLeaveContainer) {\n const result = this.getClientPosition(dragItemInContainerVirtualScrollEvent.elementDrag, mousePosition, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop, dragItemInContainerVirtualScrollEvent.dragBoundary, dragItemInContainerVirtualScrollEvent.elementContainer);\n\n mousePosition.clientX = result.clientX;\n mousePosition.clientY = result.clientY;\n }\n const dragEndEvent = { mousePosition, elementDrag: dragItemInContainerVirtualScrollEvent.elementDrag, itemDragInfo: this.dragDropService.ItemDragInfo };\n\n this.dragDropService.ItemDragInfo = undefined;\n this.dragDropService.OnDragEnd.next(dragEndEvent);\n dragItemInContainerVirtualScrollEvent.elementDrag.remove();\n removeClass();\n }));\n\n fromEvent<MouseEvent>(document, 'mousemove').pipe(tap((eventMousemove) => {\n stopEventMouse(eventMousemove);\n const { clientX, clientY } = eventMousemove;\n const mousePosition = { clientX, clientY };\n\n const result = this.getClientPosition(dragItemInContainerVirtualScrollEvent.elementDrag, mousePosition, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft, dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop, dragItemInContainerVirtualScrollEvent.dragBoundary, dragItemInContainerVirtualScrollEvent.elementContainer);\n const elementKeepContainer = result.elementKeepContainer;\n const left = result.clientX - dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseLeft;\n const top = result.clientY - dragItemInContainerVirtualScrollEvent.distanceStartElementAndMouseTop;\n\n if (dragItemInContainerVirtualScrollEvent.dragBoundary && dragItemInContainerVirtualScrollEvent.dragBoundaryAcceptMouseLeaveContainer) {\n if (clientX < result.viewport.left) {\n mousePosition.clientX = result.viewport.left;\n }\n if (clientX > result.viewport.width) {\n mousePosition.clientX = result.viewport.width;\n }\n if (clientY < result.viewport.top) {\n mousePosition.clientY = result.viewport.top;\n }\n if (clientY > result.viewport.height) {\n mousePosition.clientY = result.viewport.height;\n }\n }\n dragItemInContainerVirtualScrollEvent.elementDrag.style.left = `${left}px`;\n dragItemInContainerVirtualScrollEvent.elementDrag.style.top = `${top}px`;\n\n this.dragDropService.OnDragging.next({ mousePosition, elementDrag: dragItemInContainerVirtualScrollEvent.elementDrag, elementKeepContainer, itemDragInfo: this.dragDropService.ItemDragInfo });\n }), takeUntil((documentMouseUp)), takeUntil(this.onDestroy)).subscribe();\n\n });\n }\n\n /* FUNCTIONS */\n\n protected getClientPosition(element: HTMLElement, mousePosition: { clientX: number; clientY: number; }, distanceStartElementAndMouseLeft: number, distanceStartElementAndMouseTop: number, dragBoundary?: boolean, elementContainer?: HTMLElement): { clientX: number; clientY: number; elementKeepContainer: boolean; viewport: IBoundingClientRect } {\n let viewport = getViewport() as IBoundingClientRect;\n const rectElement = element.getBoundingClientRect();\n const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');\n const containerItem = elementContainer || containerById?.elementScroll || containerById?.element || document.body;\n let { clientX, clientY } = mousePosition;\n\n viewport.left = 0;\n viewport.top = 0;\n if (dragBoundary) {\n viewport = cloneIBoundingClientRect(containerItem.getBoundingClientRect());\n viewport.height = viewport.top + viewport.height;\n viewport.width = viewport.left + viewport.width;\n }\n let elementKeepContainer = false;\n\n if (clientX > viewport.width && clientY > viewport.height || clientX < viewport.left && clientY < viewport.top) {\n elementKeepContainer = true;\n }\n\n if ((clientX + (rectElement.width - distanceStartElementAndMouseLeft)) > viewport.width) {\n clientX -= (clientX + (rectElement.width - distanceStartElementAndMouseLeft) - viewport.width);\n }\n if ((clientY + (rectElement.height - distanceStartElementAndMouseTop)) > viewport.height) {\n clientY -= (clientY + (rectElement.height - distanceStartElementAndMouseTop) - viewport.height);\n }\n if ((clientX - distanceStartElementAndMouseLeft) < (dragBoundary && containerItem ? viewport.left : 0)) {\n clientX = (dragBoundary && containerItem ? viewport.left : 0) + distanceStartElementAndMouseLeft;\n }\n if ((clientY - distanceStartElementAndMouseTop) < (dragBoundary && containerItem ? viewport.top : 0)) {\n clientY = (dragBoundary && containerItem ? viewport.top : 0) + distanceStartElementAndMouseTop;\n }\n\n return { clientX, clientY, elementKeepContainer, viewport };\n }\n\n protected updateMouseEventsWhenMoveOverIframe(pointerEvents: 'none' | 'auto') {\n const frames = document.getElementsByTagName(\"iframe\");\n\n if (!frames?.length) {\n return;\n }\n\n for (let i = 0; i < frames.length; ++i) {\n frames[i].style.pointerEvents = pointerEvents;\n }\n }\n\n ngOnDestroy(): void {\n this.onDestroy.next();\n this.onDestroy.complete();\n }\n}","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { AfterViewInit, Directive, ElementRef, OnDestroy, effect, inject, input, output, signal } from \"@angular/core\";\nimport { IBoundingClientRect } from \"@libs-ui/interfaces-types\";\nimport { checkMouseOverInContainer, checkViewInScreen, get, getDragEventByElement, getViewport } from \"@libs-ui/utils\";\nimport { fromEvent, takeUntil, tap, throttleTime } from \"rxjs\";\nimport { LibsUiDragItemInContainerVirtualScrollDirective } from \"./drag-item-in-container-virtual-scroll.directive\";\nimport { IDragEnd, IDragLeave, IDragOver, IDragStart, IDrop } from \"./interfaces/event.interface\";\n\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: \"[LibsUiDragItemDirective]\",\n standalone: true\n})\nexport class LibsUiDragItemDirective extends LibsUiDragItemInContainerVirtualScrollDirective implements AfterViewInit, OnDestroy {\n // #region PROPERTY\n private isDragOver = signal<boolean>(false);\n private isDragging = signal<boolean>(false);\n\n // #region INPUT\n //setup 3 field phía dưới nếu đang sử dụng item trong virtual-scroll \n readonly fieldId = input<string>('');\n readonly item = input<any>(undefined);\n readonly itemInContainerVirtualScroll = input<boolean>();\n //----------------------------------\n readonly throttleTimeHandlerDraggingEvent = input<number, number | undefined>(0, { transform: value => value || 0 });\n readonly ignoreStopEvent = input<boolean>();\n readonly onlyMouseDownStopEvent = input<boolean>();\n readonly dragRootElement = input<boolean>();\n readonly dragBoundary = input<boolean>();\n readonly dragBoundaryAcceptMouseLeaveContainer = input<boolean>();\n readonly elementContainer = input<HTMLElement>();\n readonly zIndex = input<number, number | undefined>(1300, { transform: value => value ?? 1300 });\n readonly disable = input<boolean>();\n\n // #region OUTPUT\n readonly outDragStart = output<IDragStart>();\n readonly outDragOver = output<IDragOver>();\n readonly outDragLeave = output<IDragLeave>();\n readonly outDragEnd = output<IDragEnd>();\n readonly outDropped = output<IDrop>();\n\n // #region INJECT\n private elementRef = inject(ElementRef);\n\n constructor() {\n super();\n effect(() => {\n if (!this.elementRef?.nativeElement) {\n return;\n }\n const element = this.elementRef.nativeElement as HTMLElement;\n\n element.classList.remove(`${this.dragDropService.ClassItemDefine}-disable`);\n if (this.disable() && !element.classList.contains(`${this.dragDropService.ClassItemDefine}-disable`)) {\n element.classList.add(`${this.dragDropService.ClassItemDefine}-disable`);\n }\n });\n }\n\n override ngAfterViewInit() {\n const element = this.elementRef.nativeElement as HTMLElement;\n if (this.fieldId()) {\n element.setAttribute('field_id', this.fieldId());\n if (this.item()) {\n element.setAttribute('item_id', get(this.item(), this.fieldId()));\n }\n }\n element.classList.add(this.dragDropService.ClassItemDefine);\n this.dragDropService.OnDragging.pipe(throttleTime(this.throttleTimeHandlerDraggingEvent()), takeUntil(this.onDestroy)).subscribe((eventDragging) => {\n if (this.disable() || element.getAttribute('disableDragContainer') || (this.fieldId() && this.item() && eventDragging.elementDrag.getAttribute('item_id') === get(this.item(), this.fieldId()))) {\n return;\n }\n const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');\n\n if (containerById) {\n if (eventDragging.elementKeepContainer || !this.dragDropService.checkElementOverAcceptElementDrag(containerById.element.getAttribute('groupName'), eventDragging.elementDrag.getAttribute('groupName'), eventDragging.elementDrag.getAttribute('dropToGroupName'))) {\n return;\n }\n }\n if (checkMouseOverInContainer(eventDragging.mousePosition, element) && element !== eventDragging.elementDrag && containerById && checkViewInScreen(containerById.element, element, containerById.elementScroll)) {\n if (this.isDragOver()) {\n return;\n }\n const eventDragOver = { ...eventDragging, elementDragOver: element };\n\n this.dragDropService.OnDragOver.next(eventDragOver);\n this.outDragOver.emit(eventDragOver);\n this.isDragOver.set(true);\n\n return;\n }\n\n if (this.isDragOver()) {\n const eventDragLeave = { ...eventDragging, elementDragLeave: element };\n this.isDragOver.set(false);\n this.dragDropService.OnDragLeave.next(eventDragLeave);\n this.outDragLeave.emit(eventDragLeave);\n }\n });\n\n this.dragDropService.OnDropContainer.pipe(takeUntil(this.onDestroy)).subscribe((eventDrop) => {\n if (eventDrop.elementDrop !== element) {\n return;\n }\n const dropEvent = { elementDrag: eventDrop.elementDrag, elementDrop: element, itemDragInfo: eventDrop.itemDragInfo };\n\n this.outDropped.emit(dropEvent);\n });\n const styleTag = document.createElement(\"style\");\n\n styleTag.textContent = `.libs-ui-drag-drop-item-dragging{cursor:move}`;\n let nodeClone = element;\n let distanceStartElementAndMouseLeft = -1;\n let distanceStartElementAndMouseTop = -1;\n let contextMenu = false;\n const stopEventMouse = (mouseEvent: MouseEvent) => {\n if (!this.ignoreStopEvent()) {\n mouseEvent.preventDefault();\n mouseEvent.stopPropagation();\n }\n };\n const updatePositionElementRootAndRemoveNodeClone = () => {\n if (this.dragRootElement()) {\n const containerById = this.dragDropService.Container().get(element.getAttribute('groupID') || '');\n\n const containerItem = this.elementContainer() || containerById?.elementScroll || containerById?.element || document.body;\n const rectContainer = containerItem.getBoundingClientRect();\n const rectNodeClone = nodeClone.getBoundingClientRect();\n const numberSub = Number((getComputedStyle(containerItem).border.match(/\\d+px/gi) || ['0'])[0].replace(/\\D+/ig, '')).valueOf();\n\n element.style.left = (rectNodeClone.left - rectContainer.left - numberSub) + 'px';\n element.style.top = (rectNodeClone.top - rectContainer.top - numberSub) + 'px';\n element.classList.remove('opacity-0');\n }\n distanceStartElementAndMouseLeft = -1;\n distanceStartElementAndMouseTop = -1;\n nodeClone.remove();\n };\n\n fromEvent(document, 'contextmenu').pipe(\n tap(() => {\n if (this.isDragging()) {\n updatePositionElementRootAndRemoveNodeClone();\n }\n contextMenu = true;\n\n }),\n takeUntil(this.onDestroy)\n ).subscribe();\n\n let ignoreMousedown = false;\n\n getDragEventByElement({\n elementMouseDown: element,\n functionMouseDown: (event: MouseEvent) => {\n this.dragDropService.ItemClick = element;\n contextMenu = false;\n this.updateMouseEventsWhenMoveOverIframe('none');\n if ((this.disable() || element.getAttribute('disableDragContainer') || !this.isDragging() || this.itemInContainerVirtualScroll()) && !this.onlyMouseDownStopEvent()) {\n return;\n }\n stopEventMouse(event);\n },\n functionMouseMove: (event: MouseEvent) => {\n stopEventMouse(event);\n },\n functionMouseUp: (event: MouseEvent) => {\n this.updateMouseEventsWhenMoveOverIframe('auto');\n this.dragDropService.resetItemClick();\n stopEventMouse(event);\n if (this.disable() || element.getAttribute('disableDragContainer') || contextMenu || !this.isDragging()) {\n contextMenu = false;\n\n return;\n }\n contextMenu = false;\n this.isDragging.set(false);\n element.removeAttribute(this.dragDropService.TargetItemDragFlag);\n if (this.itemInContainerVirtualScroll()) {\n return;\n }\n const mousePosition = { clientX: event.clientX, clientY: event.clientY };\n\n if (this.dragBoundary() && this.dragBoundaryAcceptMouseLeaveContainer()) {\n const result = this.getClientPosition(element, mousePosition, distanceStartElementAndMouseLeft, distanceStartElementAndMouseTop, this.dragBoundary(), this.elementContainer());\n\n mousePosition.clientX = result.clientX;\n mousePosition.clientY = result.clientY;\n }\n const dragEndEvent = { mousePosition, elementDrag: element, itemDragInfo: this.dragDropService.ItemDragInfo };\n\n this.dragDropService.ItemDragInfo = undefined;\n this.dragDropService.OnDragEnd.next(dragEndEvent);\n this.outDragEnd.emit(dragEndEvent);\n\n nodeClone.classList.remove('libs-ui-drag-drop-item-dragging');\n styleTag.remove();\n\n updatePositionElementRootAndRemoveNodeClone();\n },\n onDestroy: this.onDestroy\n }).pipe(tap((dragMouseEvent: MouseEvent) => {\n const rectElement = element.getBoundingClientRect();\n const viewport = getViewport() as IBoundingClientRect;\n\n if (this.disable() || element.getAttribute('disableDragContainer') || !dragMouseEvent.clientX || (!ignoreMousedown && dragMouseEvent.type === 'mousedown' && rectElement.height + rectElement.top >= viewport.height)) {\n\n return;\n }\n const { clientX, clientY } = dragMouseEvent;\n\n if (distanceStartElementAndMouseLeft === -1) {\n distanceStartElementAndMouseLeft = clientX - rectElement.left;\n }\n\n if (distanceStartElementAndMouseTop === -1) {\n distanceStartElementAndMouseTop = clientY - rectElement.top;\n }\n })).subscribe(dragMouseEvent => {\n if (this.dragDropService.ItemClick.filter(item => item !== element).some(item => element.contains(item))) {\n return;\n }\n if (this.disable() || element.getAttribute('disableDragContainer') || !dragMouseEvent.clientX || dragMouseEvent.type === 'mousedown' || contextMenu || (this.itemInContainerVirtualScroll() && this.isDragging())) {\n return;\n }\n ignoreMousedown = true;\n const { clientX, clientY } = dragMouseEvent;\n const mousePosition = { clientX, clientY };\n const rectElement = element.getBoundingClientRect();\n\n if (!this.isDragging()) {\n this.isDragging.set(true);\n const eventDragStart = { mousePosition, elementDrag: element, itemDragInfo: this.dragDropService.ItemDragInfo };\n\n element.setAttribute(this.dragDropService.TargetItemDragFlag, 'true');\n this.dragDropService.OnDragStart.next(eventDragStart);\n eventDragStart.itemDragInfo = this.dragDropService.ItemDragInfo;\n this.outDragStart.emit(eventDragStart);\n\n nodeClone = element.cloneNode(true) as HTMLElement;\n nodeClone.style.zIndex = `${this.zIndex()}`;\n nodeClone.classList.add('!fixed');\n nodeClone.classList.remove('libs-ui-drag-drop-item-origin-placeholder');\n nodeClone.classList.remove('libs-ui-drag-drop-item-placeholder');\n nodeClone.appendChild(styleTag);\n nodeClone.classList.add('libs-ui-drag-drop-item-dragging');\n nodeClone.style.width = `${rectElement.width}px`;\n nodeClone.style.height = `${rectElement.height}px`;\n nodeClone.style.left = `${-999}px`;\n nodeClone.style.top = `${-999}px`;\n document.body.append(nodeClone);\n if (this.dragRootElement()) {\n element.classList.add('opacity-0');\n }\n\n if (this.itemInContainerVirtualScroll()) {\n this.dragDropService.OnDragItemInContainerVirtualScroll.next({\n itemDragInfo: this.dragDropService.ItemDragInfo,\n elementDrag: nodeClone,\n distanceStartElementAndMouseTop,\n distanceStartElementAndMouseLeft,\n elementContainer: this.elementContainer(),\n dragBoundary: this.dragBoundary(),\n dragBoundaryAcceptMouseLeaveContainer: this.dragBoundaryAcceptMouseLeaveContainer(),\n ignoreStopEvent: this.ignoreStopEvent()\n });\n\n return;\n }\n }\n const result = this.getClientPosition(nodeClone, mousePosition, distanceStartElementAndMouseLeft, distanceStartElementAndMouseTop, this.dragBoundary(), this.elementContainer());\n\n const elementKeepContainer = result.elementKeepContainer;\n const left = result.clientX - distanceStartElementAndMouseLeft;\n const top = result.clientY - distanceStartElementAndMouseTop;\n\n if (this.dragBoundary() && this.dragBoundaryAcceptMouseLeaveContainer()) {\n if (clientX < result.viewport.left) {\n mousePosition.clientX = result.viewport.left;\n }\n if (clientX > result.viewport.width) {\n mousePosition.clientX = result.viewport.width;\n }\n if (clientY < result.viewport.top) {\n mousePosition.clientY = result.viewport.top;\n }\n if (clientY > result.viewport.height) {\n mousePosition.clientY = result.viewport.height;\n }\n }\n nodeClone.style.left = `${left}px`;\n nodeClone.style.top = `${top}px`;\n\n const eventDragging = { mousePosition, elementDrag: nodeClone, elementKeepContainer, itemDragInfo: this.dragDropService.ItemDragInfo };\n\n this.dragDropService.OnDragging.next(eventDragging);\n });\n }\n}","import { CommonModule } from '@angular/common';\nimport { Component } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { LibsUiComponentsDragContainerDirective } from '../drag-drop.directive';\nimport { LibsUiDragItemDirective } from '../drag-item.directive';\n\ninterface Task {\n id: number;\n title: string;\n description: string;\n status: 'todo' | 'in-progress' | 'done';\n}\n\ninterface Column {\n id: string;\n title: string;\n items: Task[];\n}\n\n@Component({\n selector: 'lib-drag-drop-demo',\n standalone: true,\n imports: [\n CommonModule,\n LibsUiComponentsDragContainerDirective,\n LibsUiDragItemDirective,\n LibsUiComponentsButtonsButtonComponent\n ],\n template: `\n <div class=\"page-container\">\n <header>\n <h1>Demo Drag and Drop Component</h1>\n <p>Angular component library for drag and drop functionality</p>\n </header>\n\n <main>\n <section class=\"intro-section\">\n <h2>Introduction</h2>\n <p>\n <code>@libs-ui/components-drag-drop</code> is a powerful Angular component that enables drag and drop functionality with features like virtual scrolling, multi-selection, and custom boundaries.\n </p>\n </section>\n\n <section class=\"installation-section\">\n <h2>Installation</h2>\n <p>To install the library, use npm or yarn:</p>\n \n <div class=\"install-command\">\n <pre>\n <code>npm install @libs-ui/components-drag-drop</code>\n <libs_ui-components-buttons-button\n [label]=\"'Copy'\"\n (outClick)=\"copyToClipboard('npm install @libs-ui/components-drag-drop')\" />\n </pre>\n </div>\n \n <p>Or with yarn:</p>\n \n <div class=\"install-command\">\n <pre>\n <code>yarn add @libs-ui/components-drag-drop</code>\n <libs_ui-components-buttons-button\n [label]=\"'Copy'\"\n (outClick)=\"copyToClipboard('yarn add @libs-ui/components-drag-drop')\" />\n </pre>\n </div>\n </section>\n\n <section class=\"demo-section\">\n <h2>Live Demo</h2>\n <div class=\"demo-container\">\n <!-- Basic List Demo -->\n <div class=\"demo-example\">\n <h3>Basic List</h3>\n <div class=\"list-container\">\n <div LibsUiComponentsDragContainerDirective \n [(items)]=\"basicItems\"\n [acceptDragSameGroup]=\"true\">\n @for (item of basicItems; track item) {\n <div class=\"list-item\"\n LibsUiDragItemDirective>\n <span class=\"item-icon\">📋</span>\n <span class=\"item-text\">{{ item }}</span>\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Kanban Board Demo -->\n <div class=\"demo-example\">\n <h3>Kanban Board</h3>\n <div class=\"kanban-board\">\n @for (column of columns; track column) {\n <div class=\"kanban-column\"\n LibsUiComponentsDragContainerDirective \n [(items)]=\"column.items\"\n [groupName]=\"column.id\"\n [dropToGroupName]=\"columnsIds\"\n [acceptDragSameGroup]=\"true\">\n <h4>{{ column.title }}</h4>\n @for (item of column.items; track item) {\n <div class=\"kanban-item\"\n LibsUiDragItemDirective>\n <div class=\"kanban-item-header\">\n <span class=\"item-title\">{{ item.title }}</span>\n <span class=\"item-status\" [class]=\"'status-' + item.status\">\n {{ item.status }}\n </span>\n </div>\n <p class=\"item-description\">{{ item.description }}</p>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n <!-- Nested Containers Demo -->\n <div class=\"demo-example\">\n <h3>Nested Containers copy</h3>\n <div class=\"nested-container\">\n <div LibsUiComponentsDragContainerDirective \n [(items)]=\"nestedItems\"\n [groupName]=\"'parent'\"\n [mode]=\"'copy'\"\n [acceptDragSameGroup]=\"true\">\n @for (item of nestedItems; track item) {\n <div class=\"nested-item\"\n LibsUiDragItemDirective>\n <div class=\"nested-item-header\">\n <span class=\"item-title\">{{ item.title }}</span>\n </div>\n <div class=\"nested-item-content\">\n <div LibsUiComponentsDragContainerDirective \n [(items)]=\"item.subItems\"\n [groupName]=\"'child'\"\n [acceptDragSameGroup]=\"true\">\n @for (subItem of item.subItems; track subItem) {\n <div class=\"sub-item\"\n LibsUiDragItemDirective>\n {{ subItem }}\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n </section>\n\n <section class=\"api-doc-section\">\n <h2>API Documentation</h2>\n \n <h3>Inputs</h3>\n <div class=\"table-container\">\n <table class=\"api-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Type</th>\n <th>Default</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (input of inputsDoc; track input.name) {\n <tr>\n <td><code>{{input.name}}</code></td>\n <td><code>{{input.type}}</code></td>\n <td>{{input.default}}</td>\n <td>{{input.description}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n\n <h3>Outputs</h3>\n <div class=\"table-container\">\n <table class=\"api-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Type</th>\n <th>Description</th>\n </tr>\n </thead>\n <tbody>\n @for (output of outputsDoc; track output.name) {\n <tr>\n <td><code>{{output.name}}</code></td>\n <td><code>{{output.type}}</code></td>\n <td>{{output.description}}</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </section>\n\n <section class=\"interfaces-section\">\n <h2>Interfaces</h2>\n <div class=\"interface-docs\">\n @for (interfaceItem of interfacesDoc; track interfaceItem.name) {\n <div class=\"interface-item\">\n <h3>{{interfaceItem.name}}</h3>\n <pre><code>{{interfaceItem.code}}</code></pre>\n <p>{{interfaceItem.description}}</p>\n </div>\n }\n </div>\n </section>\n\n <section class=\"features-section\">\n <h2>Features</h2>\n <ul>\n @for (feature of features; track feature.id) {\n <li>\n <span class=\"feature-icon\">{{feature.icon}}</span>\n <div class=\"feature-info\">\n <h3>{{feature.title}}</h3>\n <p>{{feature.description}}</p>\n </div>\n </li>\n }\n </ul>\n </section>\n\n <section class=\"usage-section\">\n <h2>Usage</h2>\n <div class=\"code-examples\">\n @for (example of codeExamples; track example.id) {\n <div class=\"code-example\">\n <h3>{{example.title}}</h3>\n <pre><code [innerHTML]=\"example.code\"></code></pre>\n </div>\n }\n </div>\n </section>\n </main>\n </div>\n `,\n styles: [`\n .page-container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 20px;\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n line-height: 1.6;\n color: #333;\n }\n \n header {\n text-align: center;\n padding: 40px 0;\n background-color: #ffffff;\n border-radius: 8px;\n margin-bottom: 30px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n }\n \n header h1 {\n font-size: 2.5rem;\n color: #2c3e50;\n margin-bottom: 10px;\n }\n \n header p {\n font-size: 1.2rem;\n color: #7f8c8d;\n }\n \n section {\n background-color: #ffffff;\n border-radius: 8px;\n padding: 30px;\n margin-bottom: 30px;\n box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);\n }\n \n h2 {\n font-size: 1.8rem;\n color: #2c3e50;\n margin-bottom: 20px;\n padding-bottom: 10px;\n border-bottom: 2px solid #ecf0f1;\n }\n \n h3 {\n font-size: 1.4rem;\n color: #34495e;\n margin-bottom: 15px;\n }\n\n h4 {\n font-size: 1.2rem;\n color: #34495e;\n margin-bottom: 10px;\n }\n \n p {\n margin-bottom: 15px;\n }\n \n code {\n font-family: 'Courier New', Courier, monospace;\n background-color: #f7f7f7;\n padding: 2px 5px;\n border-radius: 3px;\n font-size: 0.9em;\n }\n \n pre {\n background-color: #f7f7f7;\n padding: 15px;\n border-radius: 5px;\n overflow-x: auto;\n margin-bottom: 20px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n }\n \n pre code {\n background-color: transparent;\n padding: 0;\n }\n\n /* Installation section styles */\n .installation-section .install-command {\n position: relative;\n margin-bottom: 20px;\n }\n \n .installation-section .copy-button {\n position: absolute;\n top: 10px;\n right: 10px;\n background: #3498db;\n color: white;\n border: none;\n border-radius: 4px;\n padding: 5px 10px;\n font-size: 0.9rem;\n cursor: pointer;\n transition: background 0.2s;\n }\n \n .installation-section .copy-button:hover {\n background: #2980b9;\n }\n\n /* Demo section styles */\n .demo-container {\n display: grid;\n grid-template-columns: 1fr;\n gap: 30px;\n }\n\n .demo-example {\n background: #f7f7f7;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n }\n\n /* List styles */\n .list-container {\n max-width: 400px;\n margin: 20px auto;\n }\n\n .list-item {\n padding: 12px;\n margin: 8px 0;\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 6px;\n display: flex;\n align-items: center;\n transition: transform 0.2s, box-shadow 0.2s;\n }\n\n .list-item:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n }\n\n .item-icon {\n margin-right: 12px;\n font-size: 1.2em;\n }\n\n /* Kanban styles */\n .kanban-board {\n display: flex;\n gap: 20px;\n padding: 20px;\n overflow-x: auto;\n }\n\n .kanban-column {\n flex: 1;\n min-width: 300px;\n background: #f5f5f5;\n padding: 15px;\n border-radius: 8px;\n }\n\n .kanban-item {\n background: white;\n padding: 12px;\n margin: 8px 0;\n border-radius: 6px;\n box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n }\n\n .kanban-item-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .item-title {\n font-weight: 500;\n }\n\n .item-status {\n padding: 4px 8px;\n border-radius: 4px;\n font-size: 0.8em;\n }\n\n .status-todo {\n background: #ffebee;\n color: #c62828;\n }\n\n .status-in-progress {\n background: #fff3e0;\n color: #ef6c00;\n }\n\n .status-done {\n background: #e8f5e9;\n color: #2e7d32;\n }\n\n .item-description {\n font-size: 0.9em;\n color: #666;\n }\n\n /* Nested containers styles */\n .nested-container {\n max-width: 800px;\n margin: 0 auto;\n }\n\n .nested-item {\n background: white;\n border: 1px solid #e0e0e0;\n border-radius: 8px;\n margin: 12px 0;\n overflow: hidden;\n }\n\n .nested-item-header {\n padding: 12px;\n background: #f5f5f5;\n border-bottom: 1px solid #e0e0e0;\n }\n\n .nested-item-content {\n padding: 12px;\n }\n\n .sub-item {\n padding: 8px;\n margin: 4px 0;\n background: #f9f9f9;\n border: 1px solid #e0e0e0;\n border-radius: 4px;\n }\n\n /* API documentation styles */\n .api-doc-section {\n margin-bottom: 40px;\n }\n \n .table-container {\n overflow-x: auto;\n margin-bottom: 30px;\n }\n \n .api-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 20px;\n }\n \n .api-table th,\n .api-table td {\n padding: 12px 15px;\n text-align: left;\n border-bottom: 1px solid #e1e1e1;\n }\n \n .api-table th {\n background-color: #f5f5f5;\n font-weight: bold;\n }\n \n .api-table tbody tr:hover {\n background-color: #f9f9f9;\n }\n\n /* Features section */\n .features-section ul {\n list-style: none;\n }\n \n .features-section li {\n display: flex;\n margin-bottom: 25px;\n align-items: flex-start;\n }\n \n .feature-icon {\n font-size: 2rem;\n margin-right: 20px;\n min-width: 40px;\n text-align: center;\n }\n \n .feature-info {\n flex: 1;\n }\n\n /* Code examples */\n .code-examples {\n display: grid;\n grid-template-columns: 1fr;\n gap: 20px;\n }\n \n @media (min-width: 768px) {\n .code-examples {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n \n @media (min-width: 992px) {\n .code-examples {\n grid-template-columns: repeat(3, 1fr);\n }\n }\n \n .code-example {\n border: 1px solid #ecf0f1;\n border-radius: 5px;\n padding: 15px;\n }\n\n /* Responsive adjustments */\n @media (max-width: 768px) {\n header {\n padding: 30px 0;\n }\n \n header h1 {\n font-size: 2rem;\n }\n \n section {\n padding: 20px;\n }\n \n .kanban-board {\n flex-direction: column;\n }\n \n .kanban-column {\n min-width: 100%;\n }\n \n .feature-icon {\n font-size: 1.5rem;\n margin-right: 15px;\n }\n }\n `]\n})\nexport class LibsUiDragDropDemoComponent {\n // Basic List Items\n basicItems = [\n 'Task 1',\n 'Task 2',\n 'Task 3',\n 'Task 4',\n 'Task 5'\n ];\n\n // Kanban Board Columns\n columnsIds = ['todo', 'in-progress', 'done'];\n columns: Column[] = [\n {\n id: 'todo',\n title: 'To Do',\n items: [\n {\n id: 1,\n title: 'Implement drag and drop',\n description: 'Add drag and drop functionality to the component',\n status: 'todo'\n },\n {\n id: 2,\n title: 'Add animations',\n description: 'Implement smooth animations for drag and drop',\n status: 'todo'\n }\n ]\n },\n {\n id: 'in-progress',\n title: 'In Progress',\n items: [\n {\n id: 3,\n title: 'Fix styling issues',\n description: 'Resolve CSS conflicts in the component',\n status: 'in-progress'\n }\n ]\n },\n {\n id: 'done',\n title: 'Done',\n items: [\n {\n id: 4,\n title: 'Setup project structure',\n description: 'Initialize the project with necessary configurations',\n status: 'done'\n }\n ]\n }\n ];\n\n // Nested Items\n nestedItems = [\n {\n id: 1,\n title: 'Project A',\n subItems: ['Task 1', 'Task 2', 'Task 3']\n },\n {\n id: 2,\n title: 'Project B',\n subItems: ['Task 4', 'Task 5']\n },\n {\n id: 3,\n title: 'Project C',\n subItems: ['Task 6', 'Task 7', 'Task 8']\n }\n ];\n\n // API Documentation\n inputsDoc = [\n {\n name: 'items',\n type: 'Array<unknown>',\n default: '[]',\n description: 'Array of items to be displayed in the container'\n },\n {\n name: 'mode',\n type: \"'move' | 'copy' | 'deepCopy'\",\n default: \"'move'\",\n description: 'Mode for drag and drop operations'\n },\n {\n name: 'directionDrag',\n type: \"'horizontal' | 'vertical'\",\n default: 'undefined',\n description: 'Direction of drag movement'\n },\n {\n name: 'viewEncapsulation',\n type: \"'emulated' | 'none'\",\n default: \"'emulated'\",\n description: 'View encapsulation mode for styling'\n },\n {\n name: 'disableDragContainer',\n type: 'boolean',\n default: 'undefined',\n description: 'Whether to disable drag operations for the container'\n },\n {\n name: 'acceptDragSameGroup',\n type: 'boolean',\n default: 'false',\n description: 'Whether to accept drag operations within the same group'\n },\n {\n name: 'placeholder',\n type: 'boolean',\n default: 'true',\n description: 'Whether to show placeholder during drag'\n },\n {\n name: 'groupName',\n type: 'string',\n default: \"'groupDragAndDropDefault'\",\n description: 'Name of the group for drag and drop operations'\n },\n {\n name: 'dropToGroupName',\n type: 'Array<string> | null',\n default: 'null',\n description: 'List of group names that can accept drops from this container'\n },\n {\n name: 'stylesOverride',\n type: 'Array<{ className: string, styles: string }>',\n default: 'undefined',\n description: 'Custom styles to override default drag-drop styling'\n }\n ];\n\n outputsDoc = [\n {\n name: 'outDragStartContainer',\n type: 'IDragStart',\n description: 'Event emitted when dragging starts in the container'\n },\n {\n name: 'outDragOverContainer',\n type: 'IDragOver',\n description: 'Event emitted when dragging over the container'\n },\n {\n name: 'outDragLeaveContainer',\n type: 'IDragLeave',\n description: 'Event emitted when dragging leaves the container'\n },\n {\n name: 'outDragEndContainer',\n type: 'IDragEnd',\n description: 'Event emitted when dragging ends in the container'\n },\n {\n name: 'outDroppedContainer',\n type: 'IDrop',\n description: 'Event emitted when an item is dropped in the container'\n },\n {\n name: 'outDroppedContainerEmpty',\n type: 'IDrop',\n description: 'Event emitted when an item is dropped in an empty container'\n },\n {\n name: 'outFunctionControl',\n type: 'IDragDropFunctionControlEvent',\n description: 'Event emitted to control drag-drop functionality'\n }\n ];\n\n // Interface Documentation\n interfacesDoc = [\n {\n name: 'IDragging',\n code: `interface IDragging {\n mousePosition: IMousePosition;\n elementDrag: HTMLElement;\n elementKeepContainer?: boolean;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag operation events, containing information about the dragged element and mouse position'\n },\n {\n name: 'IDragStart',\n code: `interface IDragStart {\n mousePosition: IMousePosition;\n elementDrag: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag start events, triggered when dragging begins'\n },\n {\n name: 'IDragOver',\n code: `interface IDragOver {\n mousePosition: IMousePosition;\n elementDrag: HTMLElement;\n elementDragOver: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag over events, triggered when an element is dragged over another element'\n },\n {\n name: 'IDragLeave',\n code: `interface IDragLeave {\n elementDrag: HTMLElement;\n elementDragLeave: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag leave events, triggered when a dragged element leaves another element'\n },\n {\n name: 'IDragEnd',\n code: `interface IDragEnd {\n mousePosition: IMousePosition;\n elementDrag: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drag end events, triggered when dragging ends'\n },\n {\n name: 'IDrop',\n code: `interface IDrop {\n elementDrag: HTMLElement;\n elementDrop: HTMLElement;\n itemDragInfo?: IItemDragInfo;\n}`,\n description: 'Interface for drop events, triggered when an element is dropped'\n },\n {\n name: 'IItemDragInfo',\n code: `interface IItemDragInfo {\n item: object;\n itemsMove?: WritableSignal<Array<unknown>>;\n indexDrag?: number;\n indexDrop?: number;\n itemsDrag: WritableSignal<Array<unknown>>;\n itemsDrop?: WritableSignal<Array<unknown>>;\n containerDrag?: HTMLElement;\n containerDrop?: HTMLElement;\n}`,\n description: 'Interface containing information about the dragged item and its containers'\n },\n {\n name: 'IDragItemInContainerVirtualScroll',\n code: `interface IDragItemInContainerVirtualScroll {\n itemDragInfo?: IItemDragInfo;\n elementDrag: HTMLElement;\n distanceStartElementAndMouseTop: number;\n distanceStartElementAndMouseLeft: number;\n elementContainer?: HTMLElement;\n dragBoundary?: boolean;\n dragBoundaryAcceptMouseLeaveContainer?: boolean;\n ignoreStopEvent?: boolean;\n}`,\n description: 'Interface for virtual scrolling drag operations, containing information about drag boundaries and container elements'\n },\n {\n name: 'IMousePosition',\n code: `interface IMousePosition {\n clientX: number;\n clientY: number;\n}`,\n description: 'Interface representing mouse position coordinates'\n },\n {\n name: 'IDragDropFunctionControlEvent',\n code: `interface IDragDropFunctionControlEvent {\n setAttributeElementAndItemDrag: () => Promise<void>;\n}`,\n description: 'Interface for drag and drop control functions'\n }\n ];\n\n // Features\n features = [\n {\n id: 1,\n icon: '🔄',\n title: 'Flexible Drag and Drop',\n description: 'Support for container-to-container dragging with customizable group names and drop zones'\n },\n {\n id: 2,\n icon: '📜',\n title: 'Virtual Scrolling',\n description: 'Efficient handling of large lists with virtual scrolling support'\n },\n {\n id: 3,\n icon: '🎯',\n title: 'Custom Boundaries',\n description: 'Define custom drag boundaries and drop zones for precise control'\n },\n {\n id: 4,\n icon: '🎨',\n title: 'Styling Options',\n description: 'Customizable styles for drag items and containers'\n }\n ];\n\n // Code Examples\n codeExamples = [\n {\n id: 1,\n title: 'Basic Usage',\n code: `<div LibsUiComponentsDragContainerDirective \n [(items)]=\"items\"\n [groupName]=\"'myGroup'\"\n [acceptDragSameGroup]=\"true\">\n @for (item of items; track item) {\n <div LibsUiDragItemDirective>\n {{ item }}\n </div>\n }\n</div>`\n },\n {\n id: 2,\n title: 'Container-to-Container',\n code: `<div LibsUiComponentsDragContainerDirective \n [(items)]=\"sourceItems\"\n [groupName]=\"'source'\">\n @for (item of sourceItems; track item) {\n <div LibsUiDragItemDirective>\n {{ item }}\n </div>\n }\n</div>\n\n<div LibsUiComponentsDragContainerDirective \n [(items)]=\"targetItems\"\n [groupName]=\"'target'\"\n [dropToGroupName]=\"['source']\">\n @for (item of targetItems; track item) {\n <div LibsUiDragItemDirective>\n {{ item }}\n </div>\n }\n</div>`\n }];\n\n /**\n * Copy text to clipboard\n */\n copyToClipboard(text: string) {\n navigator.clipboard.writeText(text).then(\n () => {\n alert('Copied to clipboard');\n },\n (err) => {\n console.error('Could not copy text: ', err);\n }\n );\n }\n} ","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-drag-drop",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.202",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/core": "^18.2.0",
|
|
6
|
-
"@libs-ui/utils": "^0.2.
|
|
6
|
+
"@libs-ui/utils": "^0.2.202",
|
|
7
7
|
"rxjs": "~7.8.0",
|
|
8
|
-
"@libs-ui/interfaces-types": "^0.2.
|
|
8
|
+
"@libs-ui/interfaces-types": "^0.2.202",
|
|
9
9
|
"@iharbeck/ngx-virtual-scroller": "15.2.0"
|
|
10
10
|
},
|
|
11
11
|
"sideEffects": false,
|