ngx-edge-slider 2.1.4 → 2.1.6

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.
Files changed (56) hide show
  1. package/esm2022/lib/component/simple-slider.component.mjs +215 -0
  2. package/esm2022/lib/engine/slider-engine.service.mjs +288 -0
  3. package/esm2022/lib/models/slider-config.model.mjs +18 -0
  4. package/esm2022/lib/models/slider-state.model.mjs +17 -0
  5. package/esm2022/lib/ngx-edge-slider.module.mjs +16 -0
  6. package/esm2022/lib/plugins/autoplay/autoplay.plugin.mjs +47 -0
  7. package/esm2022/lib/plugins/draggable/draggable.plugin.mjs +67 -0
  8. package/esm2022/lib/plugins/navigation/navigation.plugin.mjs +80 -0
  9. package/esm2022/lib/plugins/pagination/pagination.plugin.mjs +50 -0
  10. package/esm2022/lib/plugins/slider-plugin.mjs +2 -0
  11. package/esm2022/lib/safe-url.pipe.mjs +19 -0
  12. package/esm2022/lib/store/slider-store.service.mjs +34 -0
  13. package/esm2022/ngx-edge-slider.mjs +5 -0
  14. package/esm2022/public-api.mjs +20 -0
  15. package/fesm2022/ngx-edge-slider.mjs +824 -0
  16. package/fesm2022/ngx-edge-slider.mjs.map +1 -0
  17. package/index.d.ts +5 -0
  18. package/lib/component/simple-slider.component.d.ts +60 -0
  19. package/lib/engine/slider-engine.service.d.ts +53 -0
  20. package/lib/models/slider-config.model.d.ts +34 -0
  21. package/lib/models/slider-state.model.d.ts +22 -0
  22. package/lib/ngx-edge-slider.module.d.ts +7 -0
  23. package/lib/plugins/autoplay/autoplay.plugin.d.ts +18 -0
  24. package/lib/plugins/draggable/draggable.plugin.d.ts +20 -0
  25. package/lib/plugins/navigation/navigation.plugin.d.ts +19 -0
  26. package/lib/plugins/pagination/pagination.plugin.d.ts +17 -0
  27. package/lib/plugins/slider-plugin.d.ts +16 -0
  28. package/lib/safe-url.pipe.d.ts +10 -0
  29. package/lib/store/slider-store.service.d.ts +11 -0
  30. package/package.json +28 -16
  31. package/{src/public-api.ts → public-api.d.ts} +12 -25
  32. package/ng-package.json +0 -7
  33. package/ngx-edge-slider-2.1.3.tgz +0 -0
  34. package/ngx-edge-slider-2.1.4.tgz +0 -0
  35. package/src/lib/assets/icons/arrow-black.svg +0 -3
  36. package/src/lib/assets/icons/arrow-gray.svg +0 -3
  37. package/src/lib/component/simple-slider.component.html +0 -46
  38. package/src/lib/component/simple-slider.component.scss +0 -589
  39. package/src/lib/component/simple-slider.component.ts +0 -237
  40. package/src/lib/engine/slider-engine.service.ts +0 -349
  41. package/src/lib/models/slider-config.model.ts +0 -54
  42. package/src/lib/models/slider-state.model.ts +0 -48
  43. package/src/lib/ngx-edge-slider.module.ts +0 -8
  44. package/src/lib/plugins/autoplay/autoplay.plugin.ts +0 -52
  45. package/src/lib/plugins/draggable/draggable.plugin.ts +0 -73
  46. package/src/lib/plugins/navigation/navigation.component.scss +0 -0
  47. package/src/lib/plugins/navigation/navigation.plugin.ts +0 -90
  48. package/src/lib/plugins/pagination/pagination.plugin.ts +0 -61
  49. package/src/lib/plugins/slider-plugin.ts +0 -20
  50. package/src/lib/plugins/thumbs/thumbs-scroll.plugin.ts +0 -40
  51. package/src/lib/safe-url.pipe.ts +0 -11
  52. package/src/lib/simple-slider.directive.ts +0 -15
  53. package/src/lib/store/slider-store.service.ts +0 -35
  54. package/tsconfig.lib.json +0 -13
  55. package/tsconfig.lib.prod.json +0 -11
  56. package/tsconfig.spec.json +0 -15
@@ -0,0 +1,215 @@
1
+ import { Component, ChangeDetectionStrategy, Input, EventEmitter, Output, ViewChild, ViewEncapsulation, } from "@angular/core";
2
+ import { Subject, takeUntil } from "rxjs";
3
+ import { SliderEngine } from "../engine/slider-engine.service";
4
+ import { SliderStore } from "../store/slider-store.service";
5
+ import { SliderAutoplayPlugin } from "../plugins/autoplay/autoplay.plugin";
6
+ import { SliderDraggablePlugin } from "../plugins/draggable/draggable.plugin";
7
+ import { SliderNavigationPlugin } from "../plugins/navigation/navigation.plugin";
8
+ import { SliderPaginationPlugin } from "../plugins/pagination/pagination.plugin";
9
+ import { CommonModule } from "@angular/common";
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../engine/slider-engine.service";
12
+ import * as i2 from "../store/slider-store.service";
13
+ import * as i3 from "../plugins/draggable/draggable.plugin";
14
+ import * as i4 from "../plugins/pagination/pagination.plugin";
15
+ import * as i5 from "../plugins/navigation/navigation.plugin";
16
+ import * as i6 from "../plugins/autoplay/autoplay.plugin";
17
+ import * as i7 from "@angular/common";
18
+ export class SimpleSliderComponent {
19
+ engine;
20
+ store;
21
+ draggable;
22
+ pagination;
23
+ navigation;
24
+ autoplay;
25
+ config;
26
+ slideTemplate;
27
+ navigationTemplate;
28
+ paginationTemplate;
29
+ slideChange = new EventEmitter();
30
+ isDraggingPointer = false;
31
+ dragStartX = 0;
32
+ dragStartY = 0;
33
+ lastIndex = -1;
34
+ lastSlidesRef = null;
35
+ destroy$ = new Subject();
36
+ state$;
37
+ sliderHost;
38
+ constructor(engine, store, draggable, pagination, navigation, autoplay) {
39
+ this.engine = engine;
40
+ this.store = store;
41
+ this.draggable = draggable;
42
+ this.pagination = pagination;
43
+ this.navigation = navigation;
44
+ this.autoplay = autoplay;
45
+ }
46
+ ngOnInit() {
47
+ this.state$ = this.store.view$;
48
+ this.state$.pipe(takeUntil(this.destroy$)).subscribe((state) => {
49
+ if (state.currentSlide !== this.lastIndex) {
50
+ this.lastIndex = state.currentSlide;
51
+ this.slideChange.emit(state.currentSlide);
52
+ }
53
+ });
54
+ this.lastSlidesRef = this.config?.slides ?? null;
55
+ this.resolvePlugins(this.config);
56
+ }
57
+ ngAfterViewInit() {
58
+ if (this.sliderHost?.nativeElement) {
59
+ this.engine.attachContainer(this.sliderHost.nativeElement);
60
+ }
61
+ }
62
+ ngOnChanges(changes) {
63
+ if (!changes["config"] || !this.config)
64
+ return;
65
+ const newSlidesRef = this.config.slides ?? null;
66
+ if (newSlidesRef !== this.lastSlidesRef) {
67
+ this.lastSlidesRef = newSlidesRef;
68
+ this.engine.destroy();
69
+ this.resolvePlugins(this.config);
70
+ }
71
+ }
72
+ ngOnDestroy() {
73
+ this.destroySlider();
74
+ }
75
+ goTo(index) {
76
+ this.engine.selectSlide(index); // add this line
77
+ //this.slideChange.emit(index);
78
+ }
79
+ destroySlider() {
80
+ this.destroy$.next();
81
+ this.destroy$.complete();
82
+ this.engine.destroy();
83
+ } // destroys plugins and clears store
84
+ onNext() {
85
+ this.engine.next();
86
+ }
87
+ onPrevious() {
88
+ this.engine.previous();
89
+ }
90
+ selectSlide(index) {
91
+ this.engine.selectSlide(index);
92
+ }
93
+ onRecalculate() {
94
+ this.engine.recalculate();
95
+ }
96
+ // Navigation
97
+ /** Expose navigation observables safely */
98
+ get canPrev$() {
99
+ if (!this.navigation) {
100
+ console.warn("Navigation plugin is not enabled.");
101
+ return null;
102
+ }
103
+ return this.navigation.canPrev$;
104
+ }
105
+ get canNext$() {
106
+ if (!this.navigation) {
107
+ console.warn("Navigation plugin is not enabled.");
108
+ return null;
109
+ }
110
+ return this.navigation.canNext$;
111
+ }
112
+ /** Expose next/prev methods */
113
+ next() {
114
+ this.navigation?.next();
115
+ }
116
+ prev() {
117
+ this.navigation?.prev();
118
+ }
119
+ /** Expose pagination observable */
120
+ get pager$() {
121
+ if (!this.pagination) {
122
+ console.warn("Pagination plugin is not enabled for this slider.");
123
+ return null;
124
+ }
125
+ return this.pagination.pager$;
126
+ }
127
+ /** Expose a goToSlide method */
128
+ goToSlide(index) {
129
+ this.pagination.goToSlide(index);
130
+ }
131
+ // Handle Pointers
132
+ onPointerDown(event) {
133
+ // Only start drag if not clicking a nav button
134
+ if (event.target.closest(".nav-btn")) {
135
+ return; // ignore
136
+ }
137
+ this.dragStartX = event.clientX;
138
+ this.dragStartY = event.clientY;
139
+ this.isDraggingPointer = false;
140
+ // Do not capture yet; wait until movement exceeds threshold
141
+ this.engine.handleDragStart(event);
142
+ }
143
+ onPointerMove(event) {
144
+ const dx = Math.abs(event.clientX - this.dragStartX);
145
+ const dy = Math.abs(event.clientY - this.dragStartY);
146
+ if (!this.isDraggingPointer && (dx > 5 || dy > 5)) {
147
+ this.isDraggingPointer = true;
148
+ // Now start capturing pointer so dragging works outside the slider bounds
149
+ event.currentTarget.setPointerCapture(event.pointerId);
150
+ }
151
+ if (this.isDraggingPointer) {
152
+ this.engine.handleDragMove(event);
153
+ }
154
+ }
155
+ onPointerUp(event) {
156
+ if (!event)
157
+ return;
158
+ if (!this.isDraggingPointer) {
159
+ const target = event.target;
160
+ // Only select the slide if click is not on an interactive child
161
+ const slideEl = target.closest(".slide");
162
+ if (slideEl && !target.closest("button, video, a")) {
163
+ const indexAttr = slideEl.getAttribute("data-index");
164
+ const index = indexAttr ? parseInt(indexAttr, 10) : null;
165
+ if (index !== null)
166
+ this.engine.selectSlide(index);
167
+ }
168
+ }
169
+ this.engine.handleDragEnd();
170
+ this.isDraggingPointer = false;
171
+ // Release pointer capture if it was captured
172
+ try {
173
+ event.currentTarget.releasePointerCapture(event.pointerId);
174
+ }
175
+ catch { }
176
+ }
177
+ resolvePlugins(config) {
178
+ const runtimePlugins = [];
179
+ const cfg = config.plugins ?? {}; // <-- safe fallback
180
+ if (cfg.draggable)
181
+ runtimePlugins.push(this.draggable);
182
+ if (cfg.pagination)
183
+ runtimePlugins.push(this.pagination);
184
+ if (cfg.navigation)
185
+ runtimePlugins.push(this.navigation);
186
+ if (cfg.autoplay) {
187
+ this.autoplay.setConfig(cfg.autoplay);
188
+ runtimePlugins.push(this.autoplay);
189
+ }
190
+ this.engine.init({ ...config, plugins: undefined }, runtimePlugins);
191
+ if (cfg.navigation) {
192
+ setTimeout(() => this.navigation?.updateArrows?.());
193
+ }
194
+ }
195
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleSliderComponent, deps: [{ token: i1.SliderEngine }, { token: i2.SliderStore }, { token: i3.SliderDraggablePlugin }, { token: i4.SliderPaginationPlugin }, { token: i5.SliderNavigationPlugin }, { token: i6.SliderAutoplayPlugin }], target: i0.ɵɵFactoryTarget.Component });
196
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: SimpleSliderComponent, isStandalone: true, selector: "app-simple-slider", inputs: { config: "config", slideTemplate: "slideTemplate", navigationTemplate: "navigationTemplate", paginationTemplate: "paginationTemplate" }, outputs: { slideChange: "slideChange" }, providers: [SliderEngine, SliderStore, SliderDraggablePlugin, SliderPaginationPlugin, SliderNavigationPlugin, SliderAutoplayPlugin], viewQueries: [{ propertyName: "sliderHost", first: true, predicate: ["sliderHost"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: draggable.isDraggingPointer ? 'none' : 'transform 0.3s ease',\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i7.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
197
+ }
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SimpleSliderComponent, decorators: [{
199
+ type: Component,
200
+ args: [{ selector: "app-simple-slider", changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule], providers: [SliderEngine, SliderStore, SliderDraggablePlugin, SliderPaginationPlugin, SliderNavigationPlugin, SliderAutoplayPlugin], template: "<ng-container *ngIf=\"state$ | async as state\">\r\n <div\r\n class=\"slider\"\r\n #sliderHost\r\n [class.slider-vertical]=\"state.vertical\"\r\n [class.slider-draggable]=\"state.isDragging\"\r\n [class.slider--main]=\"!config.isThumbs\"\r\n [class.slider--thumbs]=\"config.isThumbs\"\r\n *ngIf=\"state.visibleSlides?.length > 0 && state.isVisible\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerUp($event)\">\r\n <div\r\n class=\"slider__wrapper\"\r\n [ngStyle]=\"{\r\n transform: state.translate,\r\n transition: draggable.isDraggingPointer ? 'none' : 'transform 0.3s ease',\r\n display: 'flex',\r\n 'flex-direction': state.vertical ? 'column' : 'row',\r\n 'justify-content': state.visibleSlides?.length < state.slidesPerView ? 'center' : 'flex-start',\r\n gap: (state.slidesPerView > 1 ? state.gap || 0 : 0) + 'px',\r\n }\">\r\n <div\r\n *ngFor=\"let slide of state.visibleSlides; let i = index\"\r\n class=\"slide\"\r\n [attr.data-index]=\"i\"\r\n [class.slide--current]=\"state.selectedSlide === i\"\r\n [style.flex]=\"\r\n !config.isThumbs\r\n ? '0 0 calc(' +\r\n 100 / state.slidesPerView +\r\n '% - ' +\r\n ((state.gap || 0) * (state.slidesPerView - 1)) / state.slidesPerView +\r\n 'px)'\r\n : '0 0 ' + thumbSize + 'px'\r\n \"\r\n [style.width]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n [style.height]=\"config.isThumbs ? thumbSize + 'px' : null\"\r\n (click)=\"engine.selectSlide(i)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"slideTemplate ? slideTemplate : defaultSlideTemplate; context: { slide: slide, index: i }\"></ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-container>\r\n" }]
201
+ }], ctorParameters: () => [{ type: i1.SliderEngine }, { type: i2.SliderStore }, { type: i3.SliderDraggablePlugin }, { type: i4.SliderPaginationPlugin }, { type: i5.SliderNavigationPlugin }, { type: i6.SliderAutoplayPlugin }], propDecorators: { config: [{
202
+ type: Input
203
+ }], slideTemplate: [{
204
+ type: Input
205
+ }], navigationTemplate: [{
206
+ type: Input
207
+ }], paginationTemplate: [{
208
+ type: Input
209
+ }], slideChange: [{
210
+ type: Output
211
+ }], sliderHost: [{
212
+ type: ViewChild,
213
+ args: ["sliderHost", { static: false }]
214
+ }] } });
215
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXNsaWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRnZS1zbGlkZXIvc3JjL2xpYi9jb21wb25lbnQvc2ltcGxlLXNsaWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRnZS1zbGlkZXIvc3JjL2xpYi9jb21wb25lbnQvc2ltcGxlLXNsaWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUd2QixLQUFLLEVBQ0wsWUFBWSxFQUNaLE1BQU0sRUFJTixTQUFTLEVBR1QsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBYyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXRELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7Ozs7QUFZL0MsTUFBTSxPQUFPLHFCQUFxQjtJQWtCdEI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBdEJELE1BQU0sQ0FBZ0I7SUFDdEIsYUFBYSxDQUFvQjtJQUNqQyxrQkFBa0IsQ0FBb0I7SUFDdEMsa0JBQWtCLENBQW9CO0lBQ3JDLFdBQVcsR0FBRyxJQUFJLFlB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Y0FDekIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLGFBQ1osQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLHFCQUFxQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUFFLG9CQUFvQixDQUFDOzRQQUcxSCxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBVXFDLFVBQVU7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIE9uSW5pdCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBJbnB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBWaWV3Q2hpbGQsXHJcbiAgRWxlbWVudFJlZixcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFNsaWRlclZpZXdTdGF0ZSB9IGZyb20gXCIuLi9tb2RlbHMvc2xpZGVyLXN0YXRlLm1vZGVsXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFNsaWRlckNvbmZpZyB9IGZyb20gXCIuLi9tb2RlbHMvc2xpZGVyLWNvbmZpZy5tb2RlbFwiO1xyXG5pbXBvcnQgeyBTbGlkZXJFbmdpbmUgfSBmcm9tIFwiLi4vZW5naW5lL3NsaWRlci1lbmdpbmUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlkZXJTdG9yZSB9IGZyb20gXCIuLi9zdG9yZS9zbGlkZXItc3RvcmUuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBTbGlkZXJBdXRvcGxheVBsdWdpbiB9IGZyb20gXCIuLi9wbHVnaW5zL2F1dG9wbGF5L2F1dG9wbGF5LnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJEcmFnZ2FibGVQbHVnaW4gfSBmcm9tIFwiLi4vcGx1Z2lucy9kcmFnZ2FibGUvZHJhZ2dhYmxlLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJOYXZpZ2F0aW9uUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJQYWdpbmF0aW9uUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvcGFnaW5hdGlvbi9wYWdpbmF0aW9uLnBsdWdpblwiO1xyXG5pbXBvcnQgeyBQYWdlciwgU2xpZGVyUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvc2xpZGVyLXBsdWdpblwiO1xyXG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtc2ltcGxlLXNsaWRlclwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vc2ltcGxlLXNsaWRlci5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vc2ltcGxlLXNsaWRlci5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICBwcm92aWRlcnM6IFtTbGlkZXJFbmdpbmUsIFNsaWRlclN0b3JlLCBTbGlkZXJEcmFnZ2FibGVQbHVnaW4sIFNsaWRlclBhZ2luYXRpb25QbHVnaW4sIFNsaWRlck5hdmlnYXRpb25QbHVnaW4sIFNsaWRlckF1dG9wbGF5UGx1Z2luXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpbXBsZVNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGNvbmZpZyE6IFNsaWRlckNvbmZpZztcclxuICBASW5wdXQoKSBzbGlkZVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSBuYXZpZ2F0aW9uVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIHBhZ2luYXRpb25UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQE91dHB1dCgpIHNsaWRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIHByaXZhdGUgaXNEcmFnZ2luZ1BvaW50ZXIgPSBmYWxzZTtcclxuICBwcml2YXRlIGRyYWdTdGFydFggPSAwO1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0WSA9IDA7XHJcbiAgcHJpdmF0ZSBsYXN0SW5kZXggPSAtMTtcclxuICBwcml2YXRlIGxhc3RTbGlkZXNSZWY6IGFueVtdIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gIHN0YXRlJCE6IE9ic2VydmFibGU8U2xpZGVyVmlld1N0YXRlPjtcclxuICBAVmlld0NoaWxkKFwic2xpZGVySG9zdFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgc2xpZGVySG9zdD86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZW5naW5lOiBTbGlkZXJFbmdpbmUsXHJcbiAgICBwcml2YXRlIHN0b3JlOiBTbGlkZXJTdG9yZSxcclxuICAgIHByaXZhdGUgZHJhZ2dhYmxlOiBTbGlkZXJEcmFnZ2FibGVQbHVnaW4sXHJcbiAgICBwcml2YXRlIHBhZ2luYXRpb246IFNsaWRlclBhZ2luYXRpb25QbHVnaW4sXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb246IFNsaWRlck5hdmlnYXRpb25QbHVnaW4sXHJcbiAgICBwcml2YXRlIGF1dG9wbGF5OiBTbGlkZXJBdXRvcGxheVBsdWdpbixcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5zdGF0ZSQgPSB0aGlzLnN0b3JlLnZpZXckO1xyXG5cclxuICAgIHRoaXMuc3RhdGUkLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XHJcbiAgICAgIGlmIChzdGF0ZS5jdXJyZW50U2xpZGUgIT09IHRoaXMubGFzdEluZGV4KSB7XHJcbiAgICAgICAgdGhpcy5sYXN0SW5kZXggPSBzdGF0ZS5jdXJyZW50U2xpZGU7XHJcbiAgICAgICAgdGhpcy5zbGlkZUNoYW5nZS5lbWl0KHN0YXRlLmN1cnJlbnRTbGlkZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5sYXN0U2xpZGVzUmVmID0gdGhpcy5jb25maWc/LnNsaWRlcyA/PyBudWxsO1xyXG4gICAgdGhpcy5yZXNvbHZlUGx1Z2lucyh0aGlzLmNvbmZpZyk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnNsaWRlckhvc3Q/Lm5hdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgdGhpcy5lbmdpbmUuYXR0YWNoQ29udGFpbmVyKHRoaXMuc2xpZGVySG9zdC5uYXRpdmVFbGVtZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICghY2hhbmdlc1tcImNvbmZpZ1wiXSB8fCAhdGhpcy5jb25maWcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBuZXdTbGlkZXNSZWYgPSB0aGlzLmNvbmZpZy5zbGlkZXMgPz8gbnVsbDtcclxuXHJcbiAgICBpZiAobmV3U2xpZGVzUmVmICE9PSB0aGlzLmxhc3RTbGlkZXNSZWYpIHtcclxuICAgICAgdGhpcy5sYXN0U2xpZGVzUmVmID0gbmV3U2xpZGVzUmVmO1xyXG4gICAgICB0aGlzLmVuZ2luZS5kZXN0cm95KCk7XHJcbiAgICAgIHRoaXMucmVzb2x2ZVBsdWdpbnModGhpcy5jb25maWcpO1xyXG4gICAgfVxyXG4gIH1cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZGVzdHJveVNsaWRlcigpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdvVG8oaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5lbmdpbmUuc2VsZWN0U2xpZGUoaW5kZXgpOyAvLyBhZGQgdGhpcyBsaW5lXHJcbiAgICAvL3RoaXMuc2xpZGVDaGFuZ2UuZW1pdChpbmRleCk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95U2xpZGVyKCkge1xyXG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgICB0aGlzLmVuZ2luZS5kZXN0cm95KCk7XHJcbiAgfSAvLyBkZXN0cm95cyBwbHVnaW5zIGFuZCBjbGVhcnMgc3RvcmVcclxuXHJcbiAgb25OZXh0KCkge1xyXG4gICAgdGhpcy5lbmdpbmUubmV4dCgpO1xyXG4gIH1cclxuICBvblByZXZpb3VzKCkge1xyXG4gICAgdGhpcy5lbmdpbmUucHJldmlvdXMoKTtcclxuICB9XHJcbiAgc2VsZWN0U2xpZGUoaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5lbmdpbmUuc2VsZWN0U2xpZGUoaW5kZXgpO1xyXG4gIH1cclxuICBvblJlY2FsY3VsYXRlKCkge1xyXG4gICAgdGhpcy5lbmdpbmUucmVjYWxjdWxhdGUoKTtcclxuICB9XHJcbiAgLy8gTmF2aWdhdGlvblxyXG4gIC8qKiBFeHBvc2UgbmF2aWdhdGlvbiBvYnNlcnZhYmxlcyBzYWZlbHkgKi9cclxuICBnZXQgY2FuUHJldiQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLm5hdmlnYXRpb24pIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiTmF2aWdhdGlvbiBwbHVnaW4gaXMgbm90IGVuYWJsZWQuXCIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb24uY2FuUHJldiQ7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FuTmV4dCQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLm5hdmlnYXRpb24pIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiTmF2aWdhdGlvbiBwbHVnaW4gaXMgbm90IGVuYWJsZWQuXCIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb24uY2FuTmV4dCQ7XHJcbiAgfVxyXG5cclxuICAvKiogRXhwb3NlIG5leHQvcHJldiBtZXRob2RzICovXHJcbiAgcHVibGljIG5leHQoKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb24/Lm5leHQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBwcmV2KCkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uPy5wcmV2KCk7XHJcbiAgfVxyXG5cclxuICAvKiogRXhwb3NlIHBhZ2luYXRpb24gb2JzZXJ2YWJsZSAqL1xyXG4gIGdldCBwYWdlciQoKTogT2JzZXJ2YWJsZTxQYWdlciB8IG51bGw+IHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMucGFnaW5hdGlvbikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJQYWdpbmF0aW9uIHBsdWdpbiBpcyBub3QgZW5hYmxlZCBmb3IgdGhpcyBzbGlkZXIuXCIpO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnBhZ2luYXRpb24ucGFnZXIkO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV4cG9zZSBhIGdvVG9TbGlkZSBtZXRob2QgKi9cclxuICBwdWJsaWMgZ29Ub1NsaWRlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIHRoaXMucGFnaW5hdGlvbi5nb1RvU2xpZGUoaW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSGFuZGxlIFBvaW50ZXJzXHJcblxyXG4gIG9uUG9pbnRlckRvd24oZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgLy8gT25seSBzdGFydCBkcmFnIGlmIG5vdCBjbGlja2luZyBhIG5hdiBidXR0b25cclxuICAgIGlmICgoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFwiLm5hdi1idG5cIikpIHtcclxuICAgICAgcmV0dXJuOyAvLyBpZ25vcmVcclxuICAgIH1cclxuICAgIHRoaXMuZHJhZ1N0YXJ0WCA9IGV2ZW50LmNsaWVudFg7XHJcbiAgICB0aGlzLmRyYWdTdGFydFkgPSBldmVudC5jbGllbnRZO1xyXG4gICAgdGhpcy5pc0RyYWdnaW5nUG9pbnRlciA9IGZhbHNlO1xyXG5cclxuICAgIC8vIERvIG5vdCBjYXB0dXJlIHlldDsgd2FpdCB1bnRpbCBtb3ZlbWVudCBleGNlZWRzIHRocmVzaG9sZFxyXG4gICAgdGhpcy5lbmdpbmUuaGFuZGxlRHJhZ1N0YXJ0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIG9uUG9pbnRlck1vdmUoZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgY29uc3QgZHggPSBNYXRoLmFicyhldmVudC5jbGllbnRYIC0gdGhpcy5kcmFnU3RhcnRYKTtcclxuICAgIGNvbnN0IGR5ID0gTWF0aC5hYnMoZXZlbnQuY2xpZW50WSAtIHRoaXMuZHJhZ1N0YXJ0WSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmdQb2ludGVyICYmIChkeCA+IDUgfHwgZHkgPiA1KSkge1xyXG4gICAgICB0aGlzLmlzRHJhZ2dpbmdQb2ludGVyID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIE5vdyBzdGFydCBjYXB0dXJpbmcgcG9pbnRlciBzbyBkcmFnZ2luZyB3b3JrcyBvdXRzaWRlIHRoZSBzbGlkZXIgYm91bmRzXHJcbiAgICAgIChldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5zZXRQb2ludGVyQ2FwdHVyZShldmVudC5wb2ludGVySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmdQb2ludGVyKSB7XHJcbiAgICAgIHRoaXMuZW5naW5lLmhhbmRsZURyYWdNb3ZlKGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUG9pbnRlclVwKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgIGlmICghZXZlbnQpIHJldHVybjtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ1BvaW50ZXIpIHtcclxuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgLy8gT25seSBzZWxlY3QgdGhlIHNsaWRlIGlmIGNsaWNrIGlzIG5vdCBvbiBhbiBpbnRlcmFjdGl2ZSBjaGlsZFxyXG4gICAgICBjb25zdCBzbGlkZUVsID0gdGFyZ2V0LmNsb3Nlc3QoXCIuc2xpZGVcIik7XHJcbiAgICAgIGlmIChzbGlkZUVsICYmICF0YXJnZXQuY2xvc2VzdChcImJ1dHRvbiwgdmlkZW8sIGFcIikpIHtcclxuICAgICAgICBjb25zdCBpbmRleEF0dHIgPSBzbGlkZUVsLmdldEF0dHJpYnV0ZShcImRhdGEtaW5kZXhcIik7XHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleEF0dHIgPyBwYXJzZUludChpbmRleEF0dHIsIDEwKSA6IG51bGw7XHJcbiAgICAgICAgaWYgKGluZGV4ICE9PSBudWxsKSB0aGlzLmVuZ2luZS5zZWxlY3RTbGlkZShpbmRleCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVuZ2luZS5oYW5kbGVEcmFnRW5kKCk7XHJcbiAgICB0aGlzLmlzRHJhZ2dpbmdQb2ludGVyID0gZmFsc2U7XHJcblxyXG4gICAgLy8gUmVsZWFzZSBwb2ludGVyIGNhcHR1cmUgaWYgaXQgd2FzIGNhcHR1cmVkXHJcbiAgICB0cnkge1xyXG4gICAgICAoZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudCkucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2ZW50LnBvaW50ZXJJZCk7XHJcbiAgICB9IGNhdGNoIHt9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlc29sdmVQbHVnaW5zKGNvbmZpZzogU2xpZGVyQ29uZmlnKSB7XHJcbiAgICBjb25zdCBydW50aW1lUGx1Z2luczogU2xpZGVyUGx1Z2luW10gPSBbXTtcclxuXHJcbiAgICBjb25zdCBjZmcgPSBjb25maWcucGx1Z2lucyA/PyB7fTsgLy8gPC0tIHNhZmUgZmFsbGJhY2tcclxuXHJcbiAgICBpZiAoY2ZnLmRyYWdnYWJsZSkgcnVudGltZVBsdWdpbnMucHVzaCh0aGlzLmRyYWdnYWJsZSk7XHJcbiAgICBpZiAoY2ZnLnBhZ2luYXRpb24pIHJ1bnRpbWVQbHVnaW5zLnB1c2godGhpcy5wYWdpbmF0aW9uKTtcclxuICAgIGlmIChjZmcubmF2aWdhdGlvbikgcnVudGltZVBsdWdpbnMucHVzaCh0aGlzLm5hdmlnYXRpb24pO1xyXG5cclxuICAgIGlmIChjZmcuYXV0b3BsYXkpIHtcclxuICAgICAgdGhpcy5hdXRvcGxheS5zZXRDb25maWcoY2ZnLmF1dG9wbGF5KTtcclxuICAgICAgcnVudGltZVBsdWdpbnMucHVzaCh0aGlzLmF1dG9wbGF5KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmVuZ2luZS5pbml0KHsgLi4uY29uZmlnLCBwbHVnaW5zOiB1bmRlZmluZWQgfSwgcnVudGltZVBsdWdpbnMpO1xyXG5cclxuICAgIGlmIChjZmcubmF2aWdhdGlvbikge1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubmF2aWdhdGlvbj8udXBkYXRlQXJyb3dzPy4oKSk7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJzdGF0ZSQgfCBhc3luYyBhcyBzdGF0ZVwiPlxyXG4gIDxkaXZcclxuICAgIGNsYXNzPVwic2xpZGVyXCJcclxuICAgICNzbGlkZXJIb3N0XHJcbiAgICBbY2xhc3Muc2xpZGVyLXZlcnRpY2FsXT1cInN0YXRlLnZlcnRpY2FsXCJcclxuICAgIFtjbGFzcy5zbGlkZXItZHJhZ2dhYmxlXT1cInN0YXRlLmlzRHJhZ2dpbmdcIlxyXG4gICAgW2NsYXNzLnNsaWRlci0tbWFpbl09XCIhY29uZmlnLmlzVGh1bWJzXCJcclxuICAgIFtjbGFzcy5zbGlkZXItLXRodW1ic109XCJjb25maWcuaXNUaHVtYnNcIlxyXG4gICAgKm5nSWY9XCJzdGF0ZS52aXNpYmxlU2xpZGVzPy5sZW5ndGggPiAwICYmIHN0YXRlLmlzVmlzaWJsZVwiXHJcbiAgICAocG9pbnRlcmRvd24pPVwib25Qb2ludGVyRG93bigkZXZlbnQpXCJcclxuICAgIChwb2ludGVybW92ZSk9XCJvblBvaW50ZXJNb3ZlKCRldmVudClcIlxyXG4gICAgKHBvaW50ZXJ1cCk9XCJvblBvaW50ZXJVcCgkZXZlbnQpXCJcclxuICAgIChwb2ludGVyY2FuY2VsKT1cIm9uUG9pbnRlclVwKCRldmVudClcIj5cclxuICAgIDxkaXZcclxuICAgICAgY2xhc3M9XCJzbGlkZXJfX3dyYXBwZXJcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgdHJhbnNmb3JtOiBzdGF0ZS50cmFuc2xhdGUsXHJcbiAgICAgICAgdHJhbnNpdGlvbjogZHJhZ2dhYmxlLmlzRHJhZ2dpbmdQb2ludGVyID8gJ25vbmUnIDogJ3RyYW5zZm9ybSAwLjNzIGVhc2UnLFxyXG4gICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcclxuICAgICAgICAnZmxleC1kaXJlY3Rpb24nOiBzdGF0ZS52ZXJ0aWNhbCA/ICdjb2x1bW4nIDogJ3JvdycsXHJcbiAgICAgICAgJ2p1c3RpZnktY29udGVudCc6IHN0YXRlLnZpc2libGVTbGlkZXM/Lmxlbmd0aCA8IHN0YXRlLnNsaWRlc1BlclZpZXcgPyAnY2VudGVyJyA6ICdmbGV4LXN0YXJ0JyxcclxuICAgICAgICBnYXA6IChzdGF0ZS5zbGlkZXNQZXJWaWV3ID4gMSA/IHN0YXRlLmdhcCB8fCAwIDogMCkgKyAncHgnLFxyXG4gICAgICB9XCI+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICAqbmdGb3I9XCJsZXQgc2xpZGUgb2Ygc3RhdGUudmlzaWJsZVNsaWRlczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgY2xhc3M9XCJzbGlkZVwiXHJcbiAgICAgICAgW2F0dHIuZGF0YS1pbmRleF09XCJpXCJcclxuICAgICAgICBbY2xhc3Muc2xpZGUtLWN1cnJlbnRdPVwic3RhdGUuc2VsZWN0ZWRTbGlkZSA9PT0gaVwiXHJcbiAgICAgICAgW3N0eWxlLmZsZXhdPVwiXHJcbiAgICAgICAgICAhY29uZmlnLmlzVGh1bWJzXHJcbiAgICAgICAgICAgID8gJzAgMCBjYWxjKCcgK1xyXG4gICAgICAgICAgICAgIDEwMCAvIHN0YXRlLnNsaWRlc1BlclZpZXcgK1xyXG4gICAgICAgICAgICAgICclIC0gJyArXHJcbiAgICAgICAgICAgICAgKChzdGF0ZS5nYXAgfHwgMCkgKiAoc3RhdGUuc2xpZGVzUGVyVmlldyAtIDEpKSAvIHN0YXRlLnNsaWRlc1BlclZpZXcgK1xyXG4gICAgICAgICAgICAgICdweCknXHJcbiAgICAgICAgICAgIDogJzAgMCAnICsgdGh1bWJTaXplICsgJ3B4J1xyXG4gICAgICAgIFwiXHJcbiAgICAgICAgW3N0eWxlLndpZHRoXT1cImNvbmZpZy5pc1RodW1icyA/IHRodW1iU2l6ZSArICdweCcgOiBudWxsXCJcclxuICAgICAgICBbc3R5bGUuaGVpZ2h0XT1cImNvbmZpZy5pc1RodW1icyA/IHRodW1iU2l6ZSArICdweCcgOiBudWxsXCJcclxuICAgICAgICAoY2xpY2spPVwiZW5naW5lLnNlbGVjdFNsaWRlKGkpXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzbGlkZVRlbXBsYXRlID8gc2xpZGVUZW1wbGF0ZSA6IGRlZmF1bHRTbGlkZVRlbXBsYXRlOyBjb250ZXh0OiB7IHNsaWRlOiBzbGlkZSwgaW5kZXg6IGkgfVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19
@@ -0,0 +1,288 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { fromEvent, merge, Subject, auditTime, takeUntil } from "rxjs";
3
+ import { DEFAULT_CONFIG } from "../models/slider-config.model";
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../store/slider-store.service";
6
+ export class SliderEngine {
7
+ store;
8
+ config;
9
+ plugins = [];
10
+ syncThumbsEngine;
11
+ // RX lifecycle
12
+ destroy$ = new Subject();
13
+ // Container-based breakpoints
14
+ containerEl;
15
+ ro;
16
+ measuredSlideSizePx;
17
+ constructor(store) {
18
+ this.store = store;
19
+ }
20
+ /* ---------------- Public API ---------------- */
21
+ init(config, plugins = []) {
22
+ this.config = { ...DEFAULT_CONFIG, ...config, plugins: { ...(config.plugins ?? {}) } };
23
+ this.plugins = plugins;
24
+ this.plugins.forEach((p) => p.init?.(this));
25
+ this.setupViewportSignals();
26
+ this.applyBreakpoint();
27
+ this.clampIndicesAfterLayoutChange();
28
+ this.recalculate();
29
+ }
30
+ /** Call this from the component once you have the slider host element */
31
+ attachContainer(el) {
32
+ this.containerEl = el;
33
+ // Observe container size changes (robust in grids/sidebars/tabs)
34
+ this.ro?.disconnect();
35
+ this.ro = new ResizeObserver(() => {
36
+ // We reuse the same debounced layout handler
37
+ this.onLayoutSignal();
38
+ });
39
+ this.ro.observe(el);
40
+ this.measureSlideSize();
41
+ // Apply immediately based on real container width
42
+ this.onLayoutSignal();
43
+ }
44
+ measureSlideSize() {
45
+ if (!this.containerEl)
46
+ return;
47
+ const firstSlide = this.containerEl.querySelector(".slide");
48
+ if (!firstSlide)
49
+ return;
50
+ const rect = firstSlide.getBoundingClientRect();
51
+ if (rect.width > 0)
52
+ this.measuredSlideSizePx = rect.width;
53
+ }
54
+ destroy() {
55
+ // Stop Rx streams
56
+ this.destroy$.next();
57
+ this.destroy$.complete();
58
+ // Disconnect ResizeObserver
59
+ this.ro?.disconnect();
60
+ this.ro = undefined;
61
+ this.containerEl = undefined;
62
+ // Plugin cleanup
63
+ this.plugins.forEach((p) => p.destroy?.());
64
+ this.plugins = [];
65
+ // Reset store
66
+ this.store.reset();
67
+ }
68
+ next() {
69
+ this.goTo(this.store.snapshot.currentSlide + this.slideStep());
70
+ this.plugins.forEach((p) => p.onNext?.());
71
+ }
72
+ previous() {
73
+ this.goTo(this.store.snapshot.currentSlide - this.slideStep());
74
+ this.plugins.forEach((p) => p.onPrevious?.());
75
+ }
76
+ getContainerEl() {
77
+ return this.containerEl;
78
+ }
79
+ selectSlide(index) {
80
+ const slidesPerView = this.store.snapshot.slidesPerView;
81
+ // 1️⃣ Mark selected
82
+ this.store.update({ selectedSlide: index });
83
+ // 2️⃣ Calculate page start
84
+ let pageStart = Math.floor(index / slidesPerView) * slidesPerView;
85
+ // 3️⃣ Clamp to maxStartIndex
86
+ pageStart = Math.min(pageStart, this.maxStartIndex);
87
+ // 4️⃣ If synced with thumbs, also clamp to their max index
88
+ if (this.syncThumbsEngine) {
89
+ const thumbMaxIndex = this.syncThumbsEngine.getMaxStartIndex();
90
+ pageStart = Math.min(pageStart, thumbMaxIndex);
91
+ }
92
+ // 5️⃣ Move main slider
93
+ if (pageStart !== this.store.snapshot.currentSlide) {
94
+ this.goToSlide(pageStart);
95
+ }
96
+ // 6️⃣ Notify plugins
97
+ this.plugins.forEach((p) => p.onSlideClick?.(index));
98
+ }
99
+ /* ---------------- Drag ---------------- */
100
+ handleDragStart(event) {
101
+ this.store.update({ isDragging: true });
102
+ this.plugins.forEach((p) => p.onDragStart?.(event));
103
+ }
104
+ handleDragMove(event) {
105
+ this.plugins.forEach((p) => p.onDragMove?.(event));
106
+ }
107
+ handleDragEnd() {
108
+ this.store.update({ isDragging: false });
109
+ this.plugins.forEach((p) => p.onDragEnd?.());
110
+ }
111
+ goTo(index) {
112
+ this.goToSlide(index); // reuse your existing private method
113
+ }
114
+ /* ---------------- Internals ---------------- */
115
+ goToSlide(index) {
116
+ const clamped = Math.max(0, Math.min(index, this.maxStartIndex));
117
+ // console.log("[Engine] goToSlide index:", index, "clamped:", clamped);
118
+ this.store.update({ currentSlide: clamped });
119
+ this.recalculate();
120
+ // NOTE: calling onSlideClick here is a bit semantically odd (since it’s not always a click),
121
+ // but I preserved your behavior.
122
+ this.plugins.forEach((p) => p.onSlideClick?.(index));
123
+ }
124
+ recalculate() {
125
+ if (this.store.snapshot.isDragging)
126
+ return; // skip during drag
127
+ const slides = this.config.slides ?? [];
128
+ const maxStartIndex = this.getMaxStartIndex();
129
+ const current = this.store.snapshot.currentSlide;
130
+ this.store.update({
131
+ visibleSlides: slides,
132
+ translate: this.translate(current),
133
+ pager: this.buildPager(),
134
+ maxStartIndex,
135
+ canPrev: current > 0,
136
+ canNext: current < maxStartIndex,
137
+ });
138
+ }
139
+ translate(index) {
140
+ const axis = this.config.vertical ? "Y" : "X";
141
+ const containerSize = this.containerEl
142
+ ? this.config.vertical
143
+ ? this.containerEl.clientHeight
144
+ : this.containerEl.clientWidth
145
+ : this.config.vertical
146
+ ? window.innerHeight
147
+ : window.innerWidth;
148
+ const gap = this.store.snapshot.gap ?? 0;
149
+ const spv = this.store.snapshot.slidesPerView;
150
+ const slideSize = this.config.isThumbs && this.measuredSlideSizePx
151
+ ? this.measuredSlideSizePx
152
+ : spv > 0
153
+ ? (containerSize - gap * (spv - 1)) / spv
154
+ : containerSize;
155
+ // move by "pageStart * (slideSize + gap)"
156
+ const offset = index * (slideSize + gap);
157
+ return `translate${axis}(-${offset}px)`;
158
+ }
159
+ /** Debounced layout signals for resize/orientation/container changes */
160
+ setupViewportSignals() {
161
+ // If you want "only after resizing stops", replace auditTime with debounceTime(120)
162
+ const resize$ = fromEvent(window, "resize", { passive: true });
163
+ const orientation$ = fromEvent(window, "orientationchange", { passive: true });
164
+ merge(resize$, orientation$)
165
+ .pipe(auditTime(80), // good compromise: responsive without over-recalc
166
+ takeUntil(this.destroy$))
167
+ .subscribe(() => this.onLayoutSignal());
168
+ }
169
+ onLayoutSignal() {
170
+ const beforeSlidesPerView = this.store.snapshot.slidesPerView;
171
+ const beforeVisible = this.store.snapshot.isVisible;
172
+ this.applyBreakpoint();
173
+ const afterSlidesPerView = this.store.snapshot.slidesPerView;
174
+ const afterVisible = this.store.snapshot.isVisible;
175
+ if (beforeSlidesPerView !== afterSlidesPerView || beforeVisible !== afterVisible) {
176
+ this.clampIndicesAfterLayoutChange();
177
+ }
178
+ this.measureSlideSize();
179
+ this.recalculate();
180
+ }
181
+ getBreakpointWidth() {
182
+ if (this.containerEl) {
183
+ // Prefer clientWidth (layout), fallback to rect width
184
+ return this.containerEl.clientWidth || this.containerEl.getBoundingClientRect().width || window.innerWidth;
185
+ }
186
+ return window.innerWidth;
187
+ }
188
+ applyBreakpoint() {
189
+ const width = this.getBreakpointWidth();
190
+ const bp = this.config.breakpoints;
191
+ let override;
192
+ let device = "desktop";
193
+ if (width < 768) {
194
+ override = bp?.mobile;
195
+ device = "mobile";
196
+ }
197
+ else if (width < 1024) {
198
+ override = bp?.tablet;
199
+ device = "tablet";
200
+ }
201
+ else {
202
+ override = bp?.desktop;
203
+ device = "desktop";
204
+ }
205
+ // Merge overrides
206
+ this.config = { ...this.config, ...override };
207
+ this.store.update({
208
+ slidesPerView: this.config.slidesPerView,
209
+ gap: this.config.gap ?? 0, // ✅ NEW
210
+ isVisible: this.config.showOn?.[device] ?? true,
211
+ });
212
+ }
213
+ clampIndicesAfterLayoutChange() {
214
+ const max = this.getMaxStartIndex();
215
+ const current = this.store.snapshot.currentSlide;
216
+ const selected = this.store.snapshot.selectedSlide;
217
+ const clampedCurrent = Math.max(0, Math.min(current, max));
218
+ const clampedSelected = selected === -1 ? -1 : Math.max(0, Math.min(selected, (this.config.slides?.length ?? 0) - 1));
219
+ this.store.update({
220
+ currentSlide: clampedCurrent,
221
+ selectedSlide: clampedSelected,
222
+ });
223
+ }
224
+ buildPager() {
225
+ const totalSlides = this.config.slides.length;
226
+ const currentSlide = this.store.snapshot.selectedSlide !== -1 ? this.store.snapshot.selectedSlide : this.store.snapshot.currentSlide;
227
+ const maxVisibleDots = 5;
228
+ let start = Math.max(0, currentSlide - Math.floor(maxVisibleDots / 2));
229
+ let end = start + maxVisibleDots;
230
+ if (end > totalSlides) {
231
+ end = totalSlides;
232
+ start = Math.max(0, end - maxVisibleDots);
233
+ }
234
+ const visibleDots = Array.from({ length: end - start }, (_, i) => start + i);
235
+ const activeDotIndex = visibleDots.indexOf(currentSlide);
236
+ return {
237
+ currentPage: currentSlide,
238
+ totalPages: totalSlides,
239
+ visibleDots,
240
+ activeDotIndex,
241
+ };
242
+ }
243
+ slideStep() {
244
+ return this.store.snapshot.slidesPerView;
245
+ }
246
+ get maxStartIndex() {
247
+ const total = this.config.slides?.length ?? 0;
248
+ return Math.max(0, total - this.store.snapshot.slidesPerView);
249
+ }
250
+ getMaxStartIndex() {
251
+ const total = this.config.slides?.length ?? 0;
252
+ const spv = this.store.snapshot.slidesPerView || 1;
253
+ return Math.max(0, total - spv);
254
+ }
255
+ /* -------- Plugin-safe API -------- */
256
+ getState() {
257
+ return this.store.snapshot;
258
+ }
259
+ getStateObservable() {
260
+ return this.store.view$;
261
+ }
262
+ setState(patch) {
263
+ this.store.update(patch);
264
+ }
265
+ getConfig() {
266
+ return this.config;
267
+ }
268
+ /** Link this slider to thumbs */
269
+ syncWithThumbs(thumbsEngine) {
270
+ this.syncThumbsEngine = thumbsEngine;
271
+ }
272
+ /* -------- Read-only helpers -------- */
273
+ getSlidesPerView() {
274
+ return this.store.snapshot.slidesPerView;
275
+ }
276
+ getCurrentSlide() {
277
+ return this.store.snapshot.currentSlide;
278
+ }
279
+ getSelectedSlide() {
280
+ return this.store.snapshot.selectedSlide;
281
+ }
282
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderEngine, deps: [{ token: i1.SliderStore }], target: i0.ɵɵFactoryTarget.Injectable });
283
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderEngine });
284
+ }
285
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SliderEngine, decorators: [{
286
+ type: Injectable
287
+ }], ctorParameters: () => [{ type: i1.SliderStore }] });
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWVuZ2luZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkZ2Utc2xpZGVyL3NyYy9saWIvZW5naW5lL3NsaWRlci1lbmdpbmUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZFLE9BQU8sRUFBZ0IsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7OztBQU03RSxNQUFNLE9BQU8sWUFBWTtJQWNIO0lBYlosTUFBTSxDQUFnQjtJQUN0QixPQUFPLEdBQW1CLEVBQUUsQ0FBQztJQUM3QixnQkFBZ0IsQ0FBZ0I7SUFFeEMsZUFBZTtJQUNQLFFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXZDLDhCQUE4QjtJQUN0QixXQUFXLENBQWU7SUFDMUIsRUFBRSxDQUFrQjtJQUVwQixtQkFBbUIsQ0FBVTtJQUVyQyxZQUFvQixLQUFrQjtRQUFsQixVQUFLLEdBQUwsS0FBSyxDQUFhO0lBQUcsQ0FBQztJQUUxQyxrREFBa0Q7SUFFbEQsSUFBSSxDQUFDLE1BQW9CLEVBQUUsVUFBMEIsRUFBRTtRQUNyRCxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsR0FBRyxjQUFjLEVBQUUsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZGLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBRXZCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENB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UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELGlDQUFpQztJQUNqQyxjQUFjLENBQUMsWUFBMEI7UUFDdkMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQztJQUN2QyxDQUFDO0lBRUQseUNBQXlDO0lBRXpDLGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO0lBQzNDLENBQUM7SUFFRCxlQUFlO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDMUMsQ0FBQztJQUVELGdCQUFnQjtRQUNkLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO0lBQzNDLENBQUM7d0dBblZVLFlBQVk7NEdBQVosWUFBWTs7NEZBQVosWUFBWTtrQkFEeEIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBmcm9tRXZlbnQsIG1lcmdlLCBTdWJqZWN0LCBhdWRpdFRpbWUsIHRha2VVbnRpbCB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IFNsaWRlckNvbmZpZywgREVGQVVMVF9DT05GSUcgfSBmcm9tIFwiLi4vbW9kZWxzL3NsaWRlci1jb25maWcubW9kZWxcIjtcclxuaW1wb3J0IHsgU2xpZGVyVmlld1N0YXRlIH0gZnJvbSBcIi4uL21vZGVscy9zbGlkZXItc3RhdGUubW9kZWxcIjtcclxuaW1wb3J0IHsgU2xpZGVyUGx1Z2luIH0gZnJvbSBcIi4uL3BsdWdpbnMvc2xpZGVyLXBsdWdpblwiO1xyXG5pbXBvcnQgeyBTbGlkZXJTdG9yZSB9IGZyb20gXCIuLi9zdG9yZS9zbGlkZXItc3RvcmUuc2VydmljZVwiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgU2xpZGVyRW5naW5lIHtcclxuICBwcml2YXRlIGNvbmZpZyE6IFNsaWRlckNvbmZpZztcclxuICBwcml2YXRlIHBsdWdpbnM6IFNsaWRlclBsdWdpbltdID0gW107XHJcbiAgcHJpdmF0ZSBzeW5jVGh1bWJzRW5naW5lPzogU2xpZGVyRW5naW5lO1xyXG5cclxuICAvLyBSWCBsaWZlY3ljbGVcclxuICBwcml2YXRlIGRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgLy8gQ29udGFpbmVyLWJhc2VkIGJyZWFrcG9pbnRzXHJcbiAgcHJpdmF0ZSBjb250YWluZXJFbD86IEhUTUxFbGVtZW50O1xyXG4gIHByaXZhdGUgcm8/OiBSZXNpemVPYnNlcnZlcjtcclxuXHJcbiAgcHJpdmF0ZSBtZWFzdXJlZFNsaWRlU2l6ZVB4PzogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHN0b3JlOiBTbGlkZXJTdG9yZSkge31cclxuXHJcbiAgLyogLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgQVBJIC0tLS0tLS0tLS0tLS0tLS0gKi9cclxuXHJcbiAgaW5pdChjb25maWc6IFNsaWRlckNvbmZpZywgcGx1Z2luczogU2xpZGVyUGx1Z2luW10gPSBbXSkge1xyXG4gICAgdGhpcy5jb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi5jb25maWcsIHBsdWdpbnM6IHsgLi4uKGNvbmZpZy5wbHVnaW5zID8/IHt9KSB9IH07XHJcbiAgICB0aGlzLnBsdWdpbnMgPSBwbHVnaW5zO1xyXG5cclxuICAgIHRoaXMucGx1Z2lucy5mb3JFYWNoKChwKSA9PiBwLmluaXQ/Lih0aGlzKSk7XHJcblxyXG4gICAgdGhpcy5zZXR1cFZpZXdwb3J0U2lnbmFscygpO1xyXG4gICAgdGhpcy5hcHBseUJyZWFrcG9pbnQoKTtcclxuICAgIHRoaXMuY2xhbXBJbmRpY2VzQWZ0ZXJMYXlvdXRDaGFuZ2UoKTtcclxuICAgIHRoaXMucmVjYWxjdWxhdGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBDYWxsIHRoaXMgZnJvbSB0aGUgY29tcG9uZW50IG9uY2UgeW91IGhhdmUgdGhlIHNsaWRlciBob3N0IGVsZW1lbnQgKi9cclxuICBhdHRhY2hDb250YWluZXIoZWw6IEhUTUxFbGVtZW50KSB7XHJcbiAgICB0aGlzLmNvbnRhaW5lckVsID0gZWw7XHJcblxyXG4gICAgLy8gT2JzZXJ2ZSBjb250YWluZXIgc2l6ZSBjaGFuZ2VzIChyb2J1c3QgaW4gZ3JpZHMvc2lkZWJhcnMvdGFicylcclxuICAgIHRoaXMucm8/LmRpc2Nvbm5lY3QoKTtcclxuICAgIHRoaXMucm8gPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xyXG4gICAgICAvLyBXZSByZXVzZSB0aGUgc2FtZSBkZWJvdW5jZWQgbGF5b3V0IGhhbmRsZXJcclxuICAgICAgdGhpcy5vbkxheW91dFNpZ25hbCgpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJvLm9ic2VydmUoZWwpO1xyXG5cclxuICAgIHRoaXMubWVhc3VyZVNsaWRlU2l6ZSgpO1xyXG4gICAgLy8gQXBwbHkgaW1tZWRpYXRlbHkgYmFzZWQgb24gcmVhbCBjb250YWluZXIgd2lkdGhcclxuICAgIHRoaXMub25MYXlvdXRTaWduYWwoKTtcclxuICB9XHJcbiAgcHJpdmF0ZSBtZWFzdXJlU2xpZGVTaXplKCkge1xyXG4gICAgaWYgKCF0aGlzLmNvbnRhaW5lckVsKSByZXR1cm47XHJcbiAgICBjb25zdCBmaXJzdFNsaWRlID0gdGhpcy5jb250YWluZXJFbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcIi5zbGlkZVwiKTtcclxuICAgIGlmICghZmlyc3RTbGlkZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgcmVjdCA9IGZpcnN0U2xpZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICBpZiAocmVjdC53aWR0aCA+IDApIHRoaXMubWVhc3VyZWRTbGlkZVNpemVQeCA9IHJlY3Qud2lkdGg7XHJcbiAgfVxyXG4gIGRlc3Ryb3koKSB7XHJcbiAgICAvLyBTdG9wIFJ4IHN0cmVhbXNcclxuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xyXG5cclxuICAgIC8vIERpc2Nvbm5lY3QgUmVzaXplT2JzZXJ2ZXJcclxuICAgIHRoaXMucm8/LmRpc2Nvbm5lY3QoKTtcclxuICAgIHRoaXMucm8gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmNvbnRhaW5lckVsID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8vIFBsdWdpbiBjbGVhbnVwXHJcbiAgICB0aGlzLnBsdWdpbnMuZm9yRWFjaCgocCkgPT4gcC5kZXN0cm95Py4oKSk7XHJcbiAgICB0aGlzLnBsdWdpbnMgPSBbXTtcclxuXHJcbiAgICAvLyBSZXNldCBzdG9yZVxyXG4gICAgdGhpcy5zdG9yZS5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgbmV4dCgpIHtcclxuICAgIHRoaXMuZ29Ubyh0aGlzLnN0b3JlLnNuYXBzaG90LmN1cnJlbnRTbGlkZSArIHRoaXMuc2xpZGVTdGVwKCkpO1xyXG4gICAgdGhpcy5wbHVnaW5zLmZvckVhY2goKHApID0+IHAub25OZXh0Py4oKSk7XHJcbiAgfVxyXG5cclxuICBwcmV2aW91cygpIHtcclxuICAgIHRoaXMuZ29Ubyh0aGlzLnN0b3JlLnNuYXBzaG90LmN1cnJlbnRTbGlkZSAtIHRoaXMuc2xpZGVTdGVwKCkpO1xyXG4gICAgdGhpcy5wbHVnaW5zLmZvckVhY2goKHApID0+IHAub25QcmV2aW91cz8uKCkpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0Q29udGFpbmVyRWwoKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuY29udGFpbmVyRWw7XHJcbiAgfVxyXG4gIHNlbGVjdFNsaWRlKGluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHNsaWRlc1BlclZpZXcgPSB0aGlzLnN0b3JlLnNuYXBzaG90LnNsaWRlc1BlclZpZXc7XHJcblxyXG4gICAgLy8gMe+4j+KDoyBNYXJrIHNlbGVjdGVkXHJcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZSh7IHNlbGVjdGVkU2xpZGU6IGluZGV4IH0pO1xyXG5cclxuICAgIC8vIDLvuI/ig6MgQ2FsY3VsYXRlIHBhZ2Ugc3RhcnRcclxuICAgIGxldCBwYWdlU3RhcnQgPSBNYXRoLmZsb29yKGluZGV4IC8gc2xpZGVzUGVyVmlldykgKiBzbGlkZXNQZXJWaWV3O1xyXG5cclxuICAgIC8vIDPvuI/ig6MgQ2xhbXAgdG8gbWF4U3RhcnRJbmRleFxyXG4gICAgcGFnZVN0YXJ0ID0gTWF0aC5taW4ocGFnZVN0YXJ0LCB0aGlzLm1heFN0YXJ0SW5kZXgpO1xyXG5cclxuICAgIC8vIDTvuI/ig6MgSWYgc3luY2VkIHdpdGggdGh1bWJzLCBhbHNvIGNsYW1wIHRvIHRoZWlyIG1heCBpbmRleFxyXG4gICAgaWYgKHRoaXMuc3luY1RodW1ic0VuZ2luZSkge1xyXG4gICAgICBjb25zdCB0aHVtYk1heEluZGV4ID0gdGhpcy5zeW5jVGh1bWJzRW5naW5lLmdldE1heFN0YXJ0SW5kZXgoKTtcclxuICAgICAgcGFnZVN0YXJ0ID0gTWF0aC5taW4ocGFnZVN0YXJ0LCB0aHVtYk1heEluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyA177iP4oOjIE1vdmUgbWFpbiBzbGlkZXJcclxuICAgIGlmIChwYWdlU3RhcnQgIT09IHRoaXMuc3RvcmUuc25hcHNob3QuY3VycmVudFNsaWRlKSB7XHJcbiAgICAgIHRoaXMuZ29Ub1NsaWRlKHBhZ2VTdGFydCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gNu+4j+KDoyBOb3RpZnkgcGx1Z2luc1xyXG4gICAgdGhpcy5wbHVnaW5zLmZvckVhY2goKHApID0+IHAub25TbGlkZUNsaWNrPy4oaW5kZXgpKTtcclxuICB9XHJcblxyXG4gIC8qIC0tLS0tLS0tLS0tLS0tLS0gRHJhZyAtLS0tLS0tLS0tLS0tLS0tICovXHJcblxyXG4gIGhhbmRsZURyYWdTdGFydChldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZSh7IGlzRHJhZ2dpbmc6IHRydWUgfSk7XHJcbiAgICB0aGlzLnBsdWdpbnMuZm9yRWFjaCgocCkgPT4gcC5vbkRyYWdTdGFydD8uKGV2ZW50KSk7XHJcbiAgfVxyXG4gIGhhbmRsZURyYWdNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgIHRoaXMucGx1Z2lucy5mb3JFYWNoKChwKSA9PiBwLm9uRHJhZ01vdmU/LihldmVudCkpO1xyXG4gIH1cclxuICBoYW5kbGVEcmFnRW5kKCkge1xyXG4gICAgdGhpcy5zdG9yZS51cGRhdGUoeyBpc0RyYWdnaW5nOiBmYWxzZSB9KTtcclxuICAgIHRoaXMucGx1Z2lucy5mb3JFYWNoKChwKSA9PiBwLm9uRHJhZ0VuZD8uKCkpO1xyXG4gIH1cclxuICBwdWJsaWMgZ29UbyhpbmRleDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLmdvVG9TbGlkZShpbmRleCk7IC8vIHJldXNlIHlvdXIgZXhpc3RpbmcgcHJpdmF0ZSBtZXRob2RcclxuICB9XHJcbiAgLyogLS0tLS0tLS0tLS0tLS0tLSBJbnRlcm5hbHMgLS0tLS0tLS0tLS0tLS0tLSAqL1xyXG5cclxuICBwcml2YXRlIGdvVG9TbGlkZShpbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBjbGFtcGVkID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIHRoaXMubWF4U3RhcnRJbmRleCkpO1xyXG4gICAgLy8gY29uc29sZS5sb2coXCJbRW5naW5lXSBnb1RvU2xpZGUgaW5kZXg6XCIsIGluZGV4LCBcImNsYW1wZWQ6XCIsIGNsYW1wZWQpO1xyXG5cclxuICAgIHRoaXMuc3RvcmUudXBkYXRlKHsgY3VycmVudFNsaWRlOiBjbGFtcGVkIH0pO1xyXG4gICAgdGhpcy5yZWNhbGN1bGF0ZSgpO1xyXG5cclxuICAgIC8vIE5PVEU6IGNhbGxpbmcgb25TbGlkZUNsaWNrIGhlcmUgaXMgYSBiaXQgc2VtYW50aWNhbGx5IG9kZCAoc2luY2UgaXTigJlzIG5vdCBhbHdheXMgYSBjbGljayksXHJcbiAgICAvLyBidXQgSSBwcmVzZXJ2ZWQgeW91ciBiZWhhdmlvci5cclxuICAgIHRoaXMucGx1Z2lucy5mb3JFYWNoKChwKSA9PiBwLm9uU2xpZGVDbGljaz8uKGluZGV4KSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVjYWxjdWxhdGUoKSB7XHJcbiAgICBpZiAodGhpcy5zdG9yZS5zbmFwc2hvdC5pc0RyYWdnaW5nKSByZXR1cm47IC8vIHNraXAgZHVyaW5nIGRyYWdcclxuICAgIGNvbnN0IHNsaWRlcyA9IHRoaXMuY29uZmlnLnNsaWRlcyA/PyBbXTtcclxuICAgIGNvbnN0IG1heFN0YXJ0SW5kZXggPSB0aGlzLmdldE1heFN0YXJ0SW5kZXgoKTtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnN0b3JlLnNuYXBzaG90LmN1cnJlbnRTbGlkZTtcclxuXHJcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZSh7XHJcbiAgICAgIHZpc2libGVTbGlkZXM6IHNsaWRlcyxcclxuICAgICAgdHJhbnNsYXRlOiB0aGlzLnRyYW5zbGF0ZShjdXJyZW50KSxcclxuICAgICAgcGFnZXI6IHRoaXMuYnVpbGRQYWdlcigpLFxyXG4gICAgICBtYXhTdGFydEluZGV4LFxyXG4gICAgICBjYW5QcmV2OiBjdXJyZW50ID4gMCxcclxuICAgICAgY2FuTmV4dDogY3VycmVudCA8IG1heFN0YXJ0SW5kZXgsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJhbnNsYXRlKGluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgYXhpcyA9IHRoaXMuY29uZmlnLnZlcnRpY2FsID8gXCJZXCIgOiBcIlhcIjtcclxuXHJcbiAgICBjb25zdCBjb250YWluZXJTaXplID0gdGhpcy5jb250YWluZXJFbFxyXG4gICAgICA/IHRoaXMuY29uZmlnLnZlcnRpY2FsXHJcbiAgICAgICAgPyB0aGlzLmNvbnRhaW5lckVsLmNsaWVudEhlaWdodFxyXG4gICAgICAgIDogdGhpcy5jb250YWluZXJFbC5jbGllbnRXaWR0aFxyXG4gICAgICA6IHRoaXMuY29uZmlnLnZlcnRpY2FsXHJcbiAgICAgICAgPyB3aW5kb3cuaW5uZXJIZWlnaHRcclxuICAgICAgICA6IHdpbmRvdy5pbm5lcldpZHRoO1xyXG5cclxuICAgIGNvbnN0IGdhcCA9IHRoaXMuc3RvcmUuc25hcHNob3QuZ2FwID8/IDA7XHJcblxyXG4gICAgY29uc3Qgc3B2ID0gdGhpcy5zdG9yZS5zbmFwc2hvdC5zbGlkZXNQZXJWaWV3O1xyXG4gICAgY29uc3Qgc2xpZGVTaXplID1cclxuICAgICAgdGhpcy5jb25maWcuaXNUaHVtYnMgJiYgdGhpcy5tZWFzdXJlZFNsaWRlU2l6ZVB4XHJcbiAgICAgICAgPyB0aGlzLm1lYXN1cmVkU2xpZGVTaXplUHhcclxuICAgICAgICA6IHNwdiA+IDBcclxuICAgICAgICAgID8gKGNvbnRhaW5lclNpemUgLSBnYXAgKiAoc3B2IC0gMSkpIC8gc3B2XHJcbiAgICAgICAgICA6IGNvbnRhaW5lclNpemU7XHJcblxyXG4gICAgLy8gbW92ZSBieSBcInBhZ2VTdGFydCAqIChzbGlkZVNpemUgKyBnYXApXCJcclxuICAgIGNvbnN0IG9mZnNldCA9IGluZGV4ICogKHNsaWRlU2l6ZSArIGdhcCk7XHJcblxyXG4gICAgcmV0dXJuIGB0cmFuc2xhdGUke2F4aXN9KC0ke29mZnNldH1weClgO1xyXG4gIH1cclxuXHJcbiAgLyoqIERlYm91bmNlZCBsYXlvdXQgc2lnbmFscyBmb3IgcmVzaXplL29yaWVudGF0aW9uL2NvbnRhaW5lciBjaGFuZ2VzICovXHJcbiAgcHJpdmF0ZSBzZXR1cFZpZXdwb3J0U2lnbmFscygpIHtcclxuICAgIC8vIElmIHlvdSB3YW50IFwib25seSBhZnRlciByZXNpemluZyBzdG9wc1wiLCByZXBsYWNlIGF1ZGl0VGltZSB3aXRoIGRlYm91bmNlVGltZSgxMjApXHJcbiAgICBjb25zdCByZXNpemUkID0gZnJvbUV2ZW50KHdpbmRvdywgXCJyZXNpemVcIiwgeyBwYXNzaXZlOiB0cnVlIH0gYXMgYW55KTtcclxuICAgIGNvbnN0IG9yaWVudGF0aW9uJCA9IGZyb21FdmVudCh3aW5kb3csIFwib3JpZW50YXRpb25jaGFuZ2VcIiwgeyBwYXNzaXZlOiB0cnVlIH0gYXMgYW55KTtcclxuXHJcbiAgICBtZXJnZShyZXNpemUkLCBvcmllbnRhdGlvbiQpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGF1ZGl0VGltZSg4MCksIC8vIGdvb2QgY29tcHJvbWlzZTogcmVzcG9uc2l2ZSB3aXRob3V0IG92ZXItcmVjYWxjXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkxheW91dFNpZ25hbCgpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25MYXlvdXRTaWduYWwoKSB7XHJcbiAgICBjb25zdCBiZWZvcmVTbGlkZXNQZXJWaWV3ID0gdGhpcy5zdG9yZS5zbmFwc2hvdC5zbGlkZXNQZXJWaWV3O1xyXG4gICAgY29uc3QgYmVmb3JlVmlzaWJsZSA9IHRoaXMuc3RvcmUuc25hcHNob3QuaXNWaXNpYmxlO1xyXG5cclxuICAgIHRoaXMuYXBwbHlCcmVha3BvaW50KCk7XHJcblxyXG4gICAgY29uc3QgYWZ0ZXJTbGlkZXNQZXJWaWV3ID0gdGhpcy5zdG9yZS5zbmFwc2hvdC5zbGlkZXNQZXJWaWV3O1xyXG4gICAgY29uc3QgYWZ0ZXJWaXNpYmxlID0gdGhpcy5zdG9yZS5zbmFwc2hvdC5pc1Zpc2libGU7XHJcblxyXG4gICAgaWYgKGJlZm9yZVNsaWRlc1BlclZpZXcgIT09IGFmdGVyU2xpZGVzUGVyVmlldyB8fCBiZWZvcmVWaXNpYmxlICE9PSBhZnRlclZpc2libGUpIHtcclxuICAgICAgdGhpcy5jbGFtcEluZGljZXNBZnRlckxheW91dENoYW5nZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubWVhc3VyZVNsaWRlU2l6ZSgpO1xyXG5cclxuICAgIHRoaXMucmVjYWxjdWxhdGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QnJlYWtwb2ludFdpZHRoKCk6IG51bWJlciB7XHJcbiAgICBpZiAodGhpcy5jb250YWluZXJFbCkge1xyXG4gICAgICAvLyBQcmVmZXIgY2xpZW50V2lkdGggKGxheW91dCksIGZhbGxiYWNrIHRvIHJlY3Qgd2lkdGhcclxuICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyRWwuY2xpZW50V2lkdGggfHwgdGhpcy5jb250YWluZXJFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB8fCB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICAgIH1cclxuICAgIHJldHVybiB3aW5kb3cuaW5uZXJXaWR0aDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXBwbHlCcmVha3BvaW50KCkge1xyXG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldEJyZWFrcG9pbnRXaWR0aCgpO1xyXG4gICAgY29uc3QgYnAgPSB0aGlzLmNvbmZpZy5icmVha3BvaW50cztcclxuXHJcbiAgICBsZXQgb3ZlcnJpZGU6IFBhcnRpYWw8U2xpZGVyQ29uZmlnPiB8IHVuZGVmaW5lZDtcclxuICAgIGxldCBkZXZpY2U6IFwibW9iaWxlXCIgfCBcInRhYmxldFwiIHwgXCJkZXNrdG9wXCIgPSBcImRlc2t0b3BcIjtcclxuXHJcbiAgICBpZiAod2lkdGggPCA3NjgpIHtcclxuICAgICAgb3ZlcnJpZGUgPSBicD8ubW9iaWxlO1xyXG4gICAgICBkZXZpY2UgPSBcIm1vYmlsZVwiO1xyXG4gICAgfSBlbHNlIGlmICh3aWR0aCA8IDEwMjQpIHtcclxuICAgICAgb3ZlcnJpZGUgPSBicD8udGFibGV0O1xyXG4gICAgICBkZXZpY2UgPSBcInRhYmxldFwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb3ZlcnJpZGUgPSBicD8uZGVza3RvcDtcclxuICAgICAgZGV2aWNlID0gXCJkZXNrdG9wXCI7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTWVyZ2Ugb3ZlcnJpZGVzXHJcbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5jb25maWcsIC4uLm92ZXJyaWRlIH07XHJcblxyXG4gICAgdGhpcy5zdG9yZS51cGRhdGUoe1xyXG4gICAgICBzbGlkZXNQZXJWaWV3OiB0aGlzLmNvbmZpZy5zbGlkZXNQZXJWaWV3LFxyXG4gICAgICBnYXA6IHRoaXMuY29uZmlnLmdhcCA/PyAwLCAvLyDinIUgTkVXXHJcbiAgICAgIGlzVmlzaWJsZTogdGhpcy5jb25maWcuc2hvd09uPy5bZGV2aWNlXSA/PyB0cnVlLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsYW1wSW5kaWNlc0FmdGVyTGF5b3V0Q2hhbmdlKCkge1xyXG4gICAgY29uc3QgbWF4ID0gdGhpcy5nZXRNYXhTdGFydEluZGV4KCk7XHJcblxyXG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMuc3RvcmUuc25hcHNob3QuY3VycmVudFNsaWRlO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnN0b3JlLnNuYXBzaG90LnNlbGVjdGVkU2xpZGU7XHJcblxyXG4gICAgY29uc3QgY2xhbXBlZEN1cnJlbnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjdXJyZW50LCBtYXgpKTtcclxuICAgIGNvbnN0IGNsYW1wZWRTZWxlY3RlZCA9IHNlbGVjdGVkID09PSAtMSA/IC0xIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oc2VsZWN0ZWQsICh0aGlzLmNvbmZpZy5zbGlkZXM/Lmxlbmd0aCA/PyAwKSAtIDEpKTtcclxuXHJcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZSh7XHJcbiAgICAgIGN1cnJlbnRTbGlkZTogY2xhbXBlZEN1cnJlbnQsXHJcbiAgICAgIHNlbGVjdGVkU2xpZGU6IGNsYW1wZWRTZWxlY3RlZCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZFBhZ2VyKCkge1xyXG4gICAgY29uc3QgdG90YWxTbGlkZXMgPSB0aGlzLmNvbmZpZy5zbGlkZXMubGVuZ3RoO1xyXG4gICAgY29uc3QgY3VycmVudFNsaWRlID0gdGhpcy5zdG9yZS5zbmFwc2hvdC5zZWxlY3RlZFNsaWRlICE9PSAtMSA/IHRoaXMuc3RvcmUuc25hcHNob3Quc2VsZWN0ZWRTbGlkZSA6IHRoaXMuc3RvcmUuc25hcHNob3QuY3VycmVudFNsaWRlO1xyXG5cclxuICAgIGNvbnN0IG1heFZpc2libGVEb3RzID0gNTtcclxuXHJcbiAgICBsZXQgc3RhcnQgPSBNYXRoLm1heCgwLCBjdXJyZW50U2xpZGUgLSBNYXRoLmZsb29yKG1heFZpc2libGVEb3RzIC8gMikpO1xyXG4gICAgbGV0IGVuZCA9IHN0YXJ0ICsgbWF4VmlzaWJsZURvdHM7XHJcblxyXG4gICAgaWYgKGVuZCA+IHRvdGFsU2xpZGVzKSB7XHJcbiAgICAgIGVuZCA9IHRvdGFsU2xpZGVzO1xyXG4gICAgICBzdGFydCA9IE1hdGgubWF4KDAsIGVuZCAtIG1heFZpc2libGVEb3RzKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB2aXNpYmxlRG90cyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGVuZCAtIHN0YXJ0IH0sIChfLCBpKSA9PiBzdGFydCArIGkpO1xyXG4gICAgY29uc3QgYWN0aXZlRG90SW5kZXggPSB2aXNpYmxlRG90cy5pbmRleE9mKGN1cnJlbnRTbGlkZSk7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgY3VycmVudFBhZ2U6IGN1cnJlbnRTbGlkZSxcclxuICAgICAgdG90YWxQYWdlczogdG90YWxTbGlkZXMsXHJcbiAgICAgIHZpc2libGVEb3RzLFxyXG4gICAgICBhY3RpdmVEb3RJbmRleCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNsaWRlU3RlcCgpIHtcclxuICAgIHJldHVybiB0aGlzLnN0b3JlLnNuYXBzaG90LnNsaWRlc1BlclZpZXc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBtYXhTdGFydEluZGV4KCkge1xyXG4gICAgY29uc3QgdG90YWwgPSB0aGlzLmNvbmZpZy5zbGlkZXM/Lmxlbmd0aCA/PyAwO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRvdGFsIC0gdGhpcy5zdG9yZS5zbmFwc2hvdC5zbGlkZXNQZXJWaWV3KTtcclxuICB9XHJcbiAgZ2V0TWF4U3RhcnRJbmRleCgpIHtcclxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5jb25maWcuc2xpZGVzPy5sZW5ndGggPz8gMDtcclxuICAgIGNvbnN0IHNwdiA9IHRoaXMuc3RvcmUuc25hcHNob3Quc2xpZGVzUGVyVmlldyB8fCAxO1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRvdGFsIC0gc3B2KTtcclxuICB9XHJcbiAgLyogLS0tLS0tLS0gUGx1Z2luLXNhZmUgQVBJIC0tLS0tLS0tICovXHJcblxyXG4gIGdldFN0YXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuc25hcHNob3Q7XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0ZU9ic2VydmFibGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZS52aWV3JDtcclxuICB9XHJcblxyXG4gIHNldFN0YXRlKHBhdGNoOiBQYXJ0aWFsPFNsaWRlclZpZXdTdGF0ZT4pIHtcclxuICAgIHRoaXMuc3RvcmUudXBkYXRlKHBhdGNoKTtcclxuICB9XHJcblxyXG4gIGdldENvbmZpZygpIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcclxuICB9XHJcblxyXG4gIC8qKiBMaW5rIHRoaXMgc2xpZGVyIHRvIHRodW1icyAqL1xyXG4gIHN5bmNXaXRoVGh1bWJzKHRodW1ic0VuZ2luZTogU2xpZGVyRW5naW5lKSB7XHJcbiAgICB0aGlzLnN5bmNUaHVtYnNFbmdpbmUgPSB0aHVtYnNFbmdpbmU7XHJcbiAgfVxyXG5cclxuICAvKiAtLS0tLS0tLSBSZWFkLW9ubHkgaGVscGVycyAtLS0tLS0tLSAqL1xyXG5cclxuICBnZXRTbGlkZXNQZXJWaWV3KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zbmFwc2hvdC5zbGlkZXNQZXJWaWV3O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VycmVudFNsaWRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zbmFwc2hvdC5jdXJyZW50U2xpZGU7XHJcbiAgfVxyXG5cclxuICBnZXRTZWxlY3RlZFNsaWRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5zbmFwc2hvdC5zZWxlY3RlZFNsaWRlO1xyXG4gIH1cclxufVxyXG4iXX0=
@@ -0,0 +1,18 @@
1
+ export const DEFAULT_CONFIG = {
2
+ slides: [],
3
+ slidesPerView: 1,
4
+ slidesToSlide: 1,
5
+ loop: 0,
6
+ vertical: false,
7
+ changeToClickedSlide: false,
8
+ isThumbs: false,
9
+ plugins: {
10
+ draggable: false,
11
+ pagination: false,
12
+ navigation: false,
13
+ autoplay: undefined,
14
+ },
15
+ gap: 0,
16
+ showOn: { mobile: true, tablet: true, desktop: true },
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGVyLWNvbmZpZy5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1lZGdlLXNsaWRlci9zcmMvbGliL21vZGVscy9zbGlkZXItY29uZmlnLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW9DQSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLE1BQU0sRUFBRSxFQUFFO0lBQ1YsYUFBYSxFQUFFLENBQUM7SUFDaEIsYUFBYSxFQUFFLENBQUM7SUFDaEIsSUFBSSxFQUFFLENBQUM7SUFDUCxRQUFRLEVBQUUsS0FBSztJQUNmLG9CQUFvQixFQUFFLEtBQUs7SUFDM0IsUUFBUSxFQUFFLEtBQUs7SUFDZixPQUFPLEVBQUU7UUFDUCxTQUFTLEVBQUUsS0FBSztRQUNoQixVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsS0FBSztRQUNqQixRQUFRLEVBQUUsU0FBUztLQUNwQjtJQUNELEdBQUcsRUFBRSxDQUFDO0lBRU4sTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQXV0b3BsYXlQbHVnaW5Db25maWcge1xyXG4gIGRlbGF5PzogbnVtYmVyO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgU2xpZGVyUGx1Z2luQ29uZmlnIHtcclxuICBkcmFnZ2FibGU/OiBib29sZWFuO1xyXG4gIGF1dG9wbGF5PzogeyBkZWxheT86IG51bWJlciB9O1xyXG4gIG5hdmlnYXRpb24/OiBib29sZWFuO1xyXG4gIHBhZ2luYXRpb24/OiBib29sZWFuO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgU2xpZGVyQ29uZmlnIHtcclxuICBzbGlkZXM6IGFueVtdO1xyXG4gIHNsaWRlc1BlclZpZXc6IG51bWJlcjtcclxuICBzbGlkZXNUb1NsaWRlPzogbnVtYmVyO1xyXG4gIGxvb3A/OiAwIHwgMSB8IDI7XHJcbiAgdmVydGljYWw/OiBib29sZWFuO1xyXG4gIGNoYW5nZVRvQ2xpY2tlZFNsaWRlPzogYm9vbGVhbjtcclxuICBpc1RodW1icz86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBORVc6IGdhcCBiZXR3ZWVuIHNsaWRlcyBpbiBweCAqL1xyXG4gIGdhcD86IG51bWJlcjtcclxuXHJcbiAgYnJlYWtwb2ludHM/OiB7XHJcbiAgICBtb2JpbGU/OiBQYXJ0aWFsPFNsaWRlckNvbmZpZz47XHJcbiAgICB0YWJsZXQ/OiBQYXJ0aWFsPFNsaWRlckNvbmZpZz47XHJcbiAgICBkZXNrdG9wPzogUGFydGlhbDxTbGlkZXJDb25maWc+O1xyXG4gIH07XHJcblxyXG4gIHBsdWdpbnM/OiBTbGlkZXJQbHVnaW5Db25maWc7XHJcblxyXG4gIHNob3dPbj86IHtcclxuICAgIG1vYmlsZT86IGJvb2xlYW47XHJcbiAgICB0YWJsZXQ/OiBib29sZWFuO1xyXG4gICAgZGVza3RvcD86IGJvb2xlYW47XHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQ09ORklHOiBTbGlkZXJDb25maWcgPSB7XHJcbiAgc2xpZGVzOiBbXSxcclxuICBzbGlkZXNQZXJWaWV3OiAxLFxyXG4gIHNsaWRlc1RvU2xpZGU6IDEsXHJcbiAgbG9vcDogMCxcclxuICB2ZXJ0aWNhbDogZmFsc2UsXHJcbiAgY2hhbmdlVG9DbGlja2VkU2xpZGU6IGZhbHNlLFxyXG4gIGlzVGh1bWJzOiBmYWxzZSxcclxuICBwbHVnaW5zOiB7XHJcbiAgICBkcmFnZ2FibGU6IGZhbHNlLFxyXG4gICAgcGFnaW5hdGlvbjogZmFsc2UsXHJcbiAgICBuYXZpZ2F0aW9uOiBmYWxzZSxcclxuICAgIGF1dG9wbGF5OiB1bmRlZmluZWQsXHJcbiAgfSxcclxuICBnYXA6IDAsXHJcblxyXG4gIHNob3dPbjogeyBtb2JpbGU6IHRydWUsIHRhYmxldDogdHJ1ZSwgZGVza3RvcDogdHJ1ZSB9LFxyXG59O1xyXG4iXX0=