gridstack 10.3.1 → 11.0.0

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 (121) hide show
  1. package/README.md +37 -3
  2. package/dist/angular/README.md +47 -25
  3. package/dist/angular/{esm2020 → esm2022}/gridstack-angular.mjs +5 -5
  4. package/dist/angular/esm2022/index.mjs +8 -0
  5. package/dist/angular/esm2022/lib/base-widget.mjs +34 -0
  6. package/dist/angular/esm2022/lib/gridstack-item.component.mjs +72 -0
  7. package/dist/angular/esm2022/lib/gridstack.component.mjs +300 -0
  8. package/dist/angular/esm2022/lib/gridstack.module.mjs +39 -0
  9. package/dist/angular/{fesm2020 → fesm2022}/gridstack-angular.mjs +400 -369
  10. package/dist/angular/fesm2022/gridstack-angular.mjs.map +1 -0
  11. package/dist/angular/index.d.ts +4 -5
  12. package/dist/angular/lib/base-widget.d.ts +18 -16
  13. package/dist/angular/lib/gridstack-item.component.d.ts +37 -37
  14. package/dist/angular/lib/gridstack.component.d.ts +135 -129
  15. package/dist/angular/lib/gridstack.module.d.ts +10 -10
  16. package/dist/angular/src/base-widget.ts +10 -2
  17. package/dist/angular/src/gridstack-item.component.ts +11 -7
  18. package/dist/angular/src/gridstack.component.ts +67 -44
  19. package/dist/angular/src/gridstack.module.ts +2 -2
  20. package/dist/dd-base-impl.d.ts +2 -2
  21. package/dist/dd-base-impl.js +2 -2
  22. package/dist/dd-base-impl.js.map +1 -1
  23. package/dist/dd-draggable.d.ts +7 -16
  24. package/dist/dd-draggable.js +22 -34
  25. package/dist/dd-draggable.js.map +1 -1
  26. package/dist/dd-droppable.d.ts +2 -2
  27. package/dist/dd-droppable.js +2 -2
  28. package/dist/dd-droppable.js.map +1 -1
  29. package/dist/dd-element.d.ts +5 -5
  30. package/dist/dd-element.js +2 -2
  31. package/dist/dd-element.js.map +1 -1
  32. package/dist/dd-gridstack.d.ts +4 -4
  33. package/dist/dd-gridstack.js +8 -8
  34. package/dist/dd-gridstack.js.map +1 -1
  35. package/dist/dd-manager.d.ts +2 -2
  36. package/dist/dd-manager.js +2 -2
  37. package/dist/dd-manager.js.map +1 -1
  38. package/dist/dd-resizable-handle.d.ts +2 -2
  39. package/dist/dd-resizable-handle.js +3 -3
  40. package/dist/dd-resizable-handle.js.map +1 -1
  41. package/dist/dd-resizable.d.ts +2 -2
  42. package/dist/dd-resizable.js +4 -4
  43. package/dist/dd-resizable.js.map +1 -1
  44. package/dist/dd-touch.d.ts +2 -2
  45. package/dist/dd-touch.js +2 -2
  46. package/dist/dd-touch.js.map +1 -1
  47. package/dist/es5/dd-base-impl.d.ts +2 -2
  48. package/dist/es5/dd-base-impl.js +2 -2
  49. package/dist/es5/dd-base-impl.js.map +1 -1
  50. package/dist/es5/dd-draggable.d.ts +7 -16
  51. package/dist/es5/dd-draggable.js +19 -29
  52. package/dist/es5/dd-draggable.js.map +1 -1
  53. package/dist/es5/dd-droppable.d.ts +2 -2
  54. package/dist/es5/dd-droppable.js +2 -2
  55. package/dist/es5/dd-droppable.js.map +1 -1
  56. package/dist/es5/dd-element.d.ts +5 -5
  57. package/dist/es5/dd-element.js +2 -2
  58. package/dist/es5/dd-element.js.map +1 -1
  59. package/dist/es5/dd-gridstack.d.ts +4 -4
  60. package/dist/es5/dd-gridstack.js +9 -6
  61. package/dist/es5/dd-gridstack.js.map +1 -1
  62. package/dist/es5/dd-manager.d.ts +2 -2
  63. package/dist/es5/dd-manager.js +2 -2
  64. package/dist/es5/dd-manager.js.map +1 -1
  65. package/dist/es5/dd-resizable-handle.d.ts +2 -2
  66. package/dist/es5/dd-resizable-handle.js +2 -2
  67. package/dist/es5/dd-resizable-handle.js.map +1 -1
  68. package/dist/es5/dd-resizable.d.ts +2 -2
  69. package/dist/es5/dd-resizable.js +2 -2
  70. package/dist/es5/dd-resizable.js.map +1 -1
  71. package/dist/es5/dd-touch.d.ts +2 -2
  72. package/dist/es5/dd-touch.js +2 -2
  73. package/dist/es5/dd-touch.js.map +1 -1
  74. package/dist/es5/gridstack-all.js +1 -1
  75. package/dist/es5/gridstack-all.js.LICENSE.txt +2 -2
  76. package/dist/es5/gridstack-all.js.map +1 -1
  77. package/dist/es5/gridstack-engine.d.ts +2 -2
  78. package/dist/es5/gridstack-engine.js +5 -5
  79. package/dist/es5/gridstack-engine.js.map +1 -1
  80. package/dist/es5/gridstack-poly.js +2 -2
  81. package/dist/es5/gridstack.d.ts +22 -17
  82. package/dist/es5/gridstack.js +158 -141
  83. package/dist/es5/gridstack.js.map +1 -1
  84. package/dist/es5/types.d.ts +16 -8
  85. package/dist/es5/types.js +3 -10
  86. package/dist/es5/types.js.map +1 -1
  87. package/dist/es5/utils.d.ts +6 -2
  88. package/dist/es5/utils.js +36 -3
  89. package/dist/es5/utils.js.map +1 -1
  90. package/dist/gridstack-all.js +1 -1
  91. package/dist/gridstack-all.js.LICENSE.txt +2 -2
  92. package/dist/gridstack-all.js.map +1 -1
  93. package/dist/gridstack-engine.d.ts +2 -2
  94. package/dist/gridstack-engine.js +61 -61
  95. package/dist/gridstack-engine.js.map +1 -1
  96. package/dist/gridstack-extra.css +1 -1
  97. package/dist/gridstack.css +2 -2
  98. package/dist/gridstack.d.ts +22 -17
  99. package/dist/gridstack.js +244 -226
  100. package/dist/gridstack.js.map +1 -1
  101. package/dist/src/gridstack-extra.scss +1 -1
  102. package/dist/src/gridstack.scss +2 -2
  103. package/dist/types.d.ts +16 -8
  104. package/dist/types.js +2 -9
  105. package/dist/types.js.map +1 -1
  106. package/dist/utils.d.ts +6 -2
  107. package/dist/utils.js +50 -20
  108. package/dist/utils.js.map +1 -1
  109. package/doc/CHANGES.md +8 -0
  110. package/doc/README.md +18 -23
  111. package/package.json +1 -1
  112. package/dist/angular/esm2020/lib/base-widget.mjs +0 -30
  113. package/dist/angular/esm2020/lib/gridstack-item.component.mjs +0 -68
  114. package/dist/angular/esm2020/lib/gridstack.component.mjs +0 -280
  115. package/dist/angular/esm2020/lib/gridstack.module.mjs +0 -39
  116. package/dist/angular/esm2020/public-api.mjs +0 -8
  117. package/dist/angular/fesm2015/gridstack-angular.mjs +0 -420
  118. package/dist/angular/fesm2015/gridstack-angular.mjs.map +0 -1
  119. package/dist/angular/fesm2020/gridstack-angular.mjs.map +0 -1
  120. package/dist/angular/package.json +0 -31
  121. package/dist/angular/public-api.d.ts +0 -4
@@ -0,0 +1,300 @@
1
+ /**
2
+ * gridstack.component.ts 11.0.0
3
+ * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license
4
+ */
5
+ import { Component, ContentChildren, EventEmitter, Input, Output, ViewChild, ViewContainerRef, reflectComponentType } from '@angular/core';
6
+ import { GridStack } from 'gridstack';
7
+ import { GridstackItemComponent } from './gridstack-item.component';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/common";
10
+ /**
11
+ * HTML Component Wrapper for gridstack, in combination with GridstackItemComponent for the items
12
+ */
13
+ export class GridstackComponent {
14
+ /** initial options for creation of the grid */
15
+ set options(val) { this._options = val; }
16
+ /** return the current running options */
17
+ get options() { return this._grid?.opts || this._options || {}; }
18
+ /** return the native element that contains grid specific fields as well */
19
+ get el() { return this.elementRef.nativeElement; }
20
+ /** return the GridStack class */
21
+ get grid() { return this._grid; }
22
+ /**
23
+ * stores the selector -> Type mapping, so we can create items dynamically from a string.
24
+ * Unfortunately Ng doesn't provide public access to that mapping.
25
+ */
26
+ static { this.selectorToType = {}; }
27
+ /** add a list of ng Component to be mapped to selector */
28
+ static addComponentToSelectorType(typeList) {
29
+ typeList.forEach(type => GridstackComponent.selectorToType[GridstackComponent.getSelector(type)] = type);
30
+ }
31
+ /** return the ng Component selector */
32
+ static getSelector(type) {
33
+ return reflectComponentType(type).selector;
34
+ }
35
+ constructor(
36
+ // protected readonly zone: NgZone,
37
+ // protected readonly cd: ChangeDetectorRef,
38
+ elementRef) {
39
+ this.elementRef = elementRef;
40
+ /** individual list of GridStackEvent callbacks handlers as output
41
+ * otherwise use this.grid.on('name1 name2 name3', callback) to handle multiple at once
42
+ * see https://github.com/gridstack/gridstack.js/blob/master/demo/events.js#L4
43
+ *
44
+ * Note: camel casing and 'CB' added at the end to prevent @angular-eslint/no-output-native
45
+ * eg: 'change' would trigger the raw CustomEvent so use different name.
46
+ */
47
+ this.addedCB = new EventEmitter();
48
+ this.changeCB = new EventEmitter();
49
+ this.disableCB = new EventEmitter();
50
+ this.dragCB = new EventEmitter();
51
+ this.dragStartCB = new EventEmitter();
52
+ this.dragStopCB = new EventEmitter();
53
+ this.droppedCB = new EventEmitter();
54
+ this.enableCB = new EventEmitter();
55
+ this.removedCB = new EventEmitter();
56
+ this.resizeCB = new EventEmitter();
57
+ this.resizeStartCB = new EventEmitter();
58
+ this.resizeStopCB = new EventEmitter();
59
+ this.el._gridComp = this;
60
+ }
61
+ ngOnInit() {
62
+ // init ourself before any template children are created since we track them below anyway - no need to double create+update widgets
63
+ this.loaded = !!this.options?.children?.length;
64
+ this._grid = GridStack.init(this._options, this.el);
65
+ delete this._options; // GS has it now
66
+ this.checkEmpty();
67
+ }
68
+ /** wait until after all DOM is ready to init gridstack children (after angular ngFor and sub-components run first) */
69
+ ngAfterContentInit() {
70
+ // track whenever the children list changes and update the layout...
71
+ this._sub = this.gridstackItems?.changes.subscribe(() => this.updateAll());
72
+ // ...and do this once at least unless we loaded children already
73
+ if (!this.loaded)
74
+ this.updateAll();
75
+ this.hookEvents(this.grid);
76
+ }
77
+ ngOnDestroy() {
78
+ this.unhookEvents(this._grid);
79
+ this._sub?.unsubscribe();
80
+ this._grid?.destroy();
81
+ delete this._grid;
82
+ delete this.el._gridComp;
83
+ delete this.container;
84
+ delete this.ref;
85
+ }
86
+ /**
87
+ * called when the TEMPLATE list of items changes - get a list of nodes and
88
+ * update the layout accordingly (which will take care of adding/removing items changed by Angular)
89
+ */
90
+ updateAll() {
91
+ if (!this.grid)
92
+ return;
93
+ const layout = [];
94
+ this.gridstackItems?.forEach(item => {
95
+ layout.push(item.options);
96
+ item.clearOptions();
97
+ });
98
+ this.grid.load(layout); // efficient that does diffs only
99
+ }
100
+ /** check if the grid is empty, if so show alternative content */
101
+ checkEmpty() {
102
+ if (!this.grid)
103
+ return;
104
+ const isEmpty = !this.grid.engine.nodes.length;
105
+ if (isEmpty === this.isEmpty)
106
+ return;
107
+ this.isEmpty = isEmpty;
108
+ // this.cd.detectChanges();
109
+ }
110
+ /** get all known events as easy to use Outputs for convenience */
111
+ hookEvents(grid) {
112
+ if (!grid)
113
+ return;
114
+ grid
115
+ .on('added', (event, nodes) => { this.checkEmpty(); this.addedCB.emit({ event, nodes }); })
116
+ .on('change', (event, nodes) => this.changeCB.emit({ event, nodes }))
117
+ .on('disable', (event) => this.disableCB.emit({ event }))
118
+ .on('drag', (event, el) => this.dragCB.emit({ event, el }))
119
+ .on('dragstart', (event, el) => this.dragStartCB.emit({ event, el }))
120
+ .on('dragstop', (event, el) => this.dragStopCB.emit({ event, el }))
121
+ .on('dropped', (event, previousNode, newNode) => this.droppedCB.emit({ event, previousNode, newNode }))
122
+ .on('enable', (event) => this.enableCB.emit({ event }))
123
+ .on('removed', (event, nodes) => { this.checkEmpty(); this.removedCB.emit({ event, nodes }); })
124
+ .on('resize', (event, el) => this.resizeCB.emit({ event, el }))
125
+ .on('resizestart', (event, el) => this.resizeStartCB.emit({ event, el }))
126
+ .on('resizestop', (event, el) => this.resizeStopCB.emit({ event, el }));
127
+ }
128
+ unhookEvents(grid) {
129
+ if (!grid)
130
+ return;
131
+ grid.off('added change disable drag dragstart dragstop dropped enable removed resize resizestart resizestop');
132
+ }
133
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GridstackComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
134
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.6", type: GridstackComponent, selector: "gridstack", inputs: { options: "options", isEmpty: "isEmpty" }, outputs: { addedCB: "addedCB", changeCB: "changeCB", disableCB: "disableCB", dragCB: "dragCB", dragStartCB: "dragStartCB", dragStopCB: "dragStopCB", droppedCB: "droppedCB", enableCB: "enableCB", removedCB: "removedCB", resizeCB: "resizeCB", resizeStartCB: "resizeStartCB", resizeStopCB: "resizeStopCB" }, queries: [{ propertyName: "gridstackItems", predicate: GridstackItemComponent }], viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: `
135
+ <!-- content to show when when grid is empty, like instructions on how to add widgets -->
136
+ <ng-content select="[empty-content]" *ngIf="isEmpty"></ng-content>
137
+ <!-- where dynamic items go -->
138
+ <ng-template #container></ng-template>
139
+ <!-- where template items go -->
140
+ <ng-content></ng-content>
141
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
142
+ }
143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GridstackComponent, decorators: [{
144
+ type: Component,
145
+ args: [{ selector: 'gridstack', template: `
146
+ <!-- content to show when when grid is empty, like instructions on how to add widgets -->
147
+ <ng-content select="[empty-content]" *ngIf="isEmpty"></ng-content>
148
+ <!-- where dynamic items go -->
149
+ <ng-template #container></ng-template>
150
+ <!-- where template items go -->
151
+ <ng-content></ng-content>
152
+ `, styles: [":host{display:block}\n"] }]
153
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { gridstackItems: [{
154
+ type: ContentChildren,
155
+ args: [GridstackItemComponent]
156
+ }], container: [{
157
+ type: ViewChild,
158
+ args: ['container', { read: ViewContainerRef, static: true }]
159
+ }], options: [{
160
+ type: Input
161
+ }], isEmpty: [{
162
+ type: Input
163
+ }], addedCB: [{
164
+ type: Output
165
+ }], changeCB: [{
166
+ type: Output
167
+ }], disableCB: [{
168
+ type: Output
169
+ }], dragCB: [{
170
+ type: Output
171
+ }], dragStartCB: [{
172
+ type: Output
173
+ }], dragStopCB: [{
174
+ type: Output
175
+ }], droppedCB: [{
176
+ type: Output
177
+ }], enableCB: [{
178
+ type: Output
179
+ }], removedCB: [{
180
+ type: Output
181
+ }], resizeCB: [{
182
+ type: Output
183
+ }], resizeStartCB: [{
184
+ type: Output
185
+ }], resizeStopCB: [{
186
+ type: Output
187
+ }] } });
188
+ /**
189
+ * can be used when a new item needs to be created, which we do as a Angular component, or deleted (skip)
190
+ **/
191
+ export function gsCreateNgComponents(host, n, add, isGrid) {
192
+ if (add) {
193
+ //
194
+ // create the component dynamically - see https://angular.io/docs/ts/latest/cookbook/dynamic-component-loader.html
195
+ //
196
+ if (!host)
197
+ return;
198
+ if (isGrid) {
199
+ // TODO: figure out how to create ng component inside regular Div. need to access app injectors...
200
+ // if (!container) {
201
+ // const hostElement: Element = host;
202
+ // const environmentInjector: EnvironmentInjector;
203
+ // grid = createComponent(GridstackComponent, {environmentInjector, hostElement})?.instance;
204
+ // }
205
+ const gridItemComp = host.parentElement?._gridItemComp;
206
+ if (!gridItemComp)
207
+ return;
208
+ // check if gridItem has a child component with 'container' exposed to create under..
209
+ const container = gridItemComp.childWidget?.container || gridItemComp.container;
210
+ const gridRef = container?.createComponent(GridstackComponent);
211
+ const grid = gridRef?.instance;
212
+ if (!grid)
213
+ return;
214
+ grid.ref = gridRef;
215
+ grid.options = n;
216
+ return grid.el;
217
+ }
218
+ else {
219
+ const gridComp = host._gridComp;
220
+ const gridItemRef = gridComp?.container?.createComponent(GridstackItemComponent);
221
+ const gridItem = gridItemRef?.instance;
222
+ if (!gridItem)
223
+ return;
224
+ gridItem.ref = gridItemRef;
225
+ // define what type of component to create as child, OR you can do it GridstackItemComponent template, but this is more generic
226
+ const selector = n.selector;
227
+ const type = selector ? GridstackComponent.selectorToType[selector] : undefined;
228
+ if (type) {
229
+ // shared code to create our selector component
230
+ const createComp = () => {
231
+ const childWidget = gridItem.container?.createComponent(type)?.instance;
232
+ // if proper BaseWidget subclass, save it and load additional data
233
+ if (childWidget && typeof childWidget.serialize === 'function' && typeof childWidget.deserialize === 'function') {
234
+ gridItem.childWidget = childWidget;
235
+ childWidget.deserialize(n);
236
+ }
237
+ };
238
+ const lazyLoad = n.lazyLoad || n.grid?.opts?.lazyLoad && n.lazyLoad !== false;
239
+ if (lazyLoad) {
240
+ if (!n.visibleObservable) {
241
+ n.visibleObservable = new IntersectionObserver(([entry]) => {
242
+ if (entry.isIntersecting) {
243
+ n.visibleObservable?.disconnect();
244
+ delete n.visibleObservable;
245
+ createComp();
246
+ }
247
+ });
248
+ window.setTimeout(() => n.visibleObservable?.observe(gridItem.el)); // wait until callee sets position attributes
249
+ }
250
+ }
251
+ else
252
+ createComp();
253
+ }
254
+ return gridItem.el;
255
+ }
256
+ }
257
+ else {
258
+ //
259
+ // REMOVE - have to call ComponentRef:destroy() for dynamic objects to correctly remove themselves
260
+ // Note: this will destroy all children dynamic components as well: gridItem -> childWidget
261
+ //
262
+ if (isGrid) {
263
+ const grid = n.el?._gridComp;
264
+ if (grid?.ref)
265
+ grid.ref.destroy();
266
+ else
267
+ grid?.ngOnDestroy();
268
+ }
269
+ else {
270
+ const gridItem = n.el?._gridItemComp;
271
+ if (gridItem?.ref)
272
+ gridItem.ref.destroy();
273
+ else
274
+ gridItem?.ngOnDestroy();
275
+ }
276
+ }
277
+ return;
278
+ }
279
+ /**
280
+ * called for each item in the grid - check if additional information needs to be saved.
281
+ * Note: since this is options minus gridstack protected members using Utils.removeInternalForSave(),
282
+ * this typically doesn't need to do anything. However your custom Component @Input() are now supported
283
+ * using BaseWidget.serialize()
284
+ */
285
+ export function gsSaveAdditionalNgInfo(n, w) {
286
+ const gridItem = n.el?._gridItemComp;
287
+ if (gridItem) {
288
+ const input = gridItem.childWidget?.serialize();
289
+ if (input) {
290
+ w.input = input;
291
+ }
292
+ return;
293
+ }
294
+ // else check if Grid
295
+ const grid = n.el?._gridComp;
296
+ if (grid) {
297
+ //.... save any custom data
298
+ }
299
+ }
300
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9saWIvZ3JpZHN0YWNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQW9CLFNBQVMsRUFBRSxlQUFlLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFDakUsTUFBTSxFQUFtQixTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsb0JBQW9CLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBRXJJLE9BQU8sRUFBd0MsU0FBUyxFQUFvRCxNQUFNLFdBQVcsQ0FBQztBQUU5SCxPQUFPLEVBQTJCLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQW9DN0Y7O0dBRUc7QUFnQkgsTUFBTSxPQUFPLGtCQUFrQjtJQU83QiwrQ0FBK0M7SUFDL0MsSUFBb0IsT0FBTyxDQUFDLEdBQXFCLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNFLHlDQUF5QztJQUN6QyxJQUFXLE9BQU8sS0FBdUIsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUF5QjFGLDJFQUEyRTtJQUMzRSxJQUFXLEVBQUUsS0FBMEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFOUUsaUNBQWlDO0lBQ2pDLElBQVcsSUFBSSxLQUE0QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBSy9EOzs7T0FHRzthQUNXLG1CQUFjLEdBQW1CLEVBQUUsQUFBckIsQ0FBc0I7SUFDbEQsMERBQTBEO0lBQ25ELE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxRQUE2QjtRQUNwRSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFF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QUUsQ0FBQztRQUNiLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDaEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLENBQUM7UUFDRCxPQUFPO0lBQ1QsQ0FBQztJQUNELHFCQUFxQjtJQUNyQixNQUFNLElBQUksR0FBSSxDQUFDLENBQUMsRUFBMEIsRUFBRSxTQUFTLENBQUM7SUFDdEQsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNULDJCQUEyQjtJQUM3QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ3JpZHN0YWNrLmNvbXBvbmVudC50cyAxMS4wLjBcbiAqIENvcHlyaWdodCAoYykgMjAyMi0yMDI0IEFsYWluIER1bWVzbnkgLSBzZWUgR3JpZFN0YWNrIHJvb3QgbGljZW5zZVxuICovXG5cbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENvbXBvbmVudCwgQ29udGVudENoaWxkcmVuLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LFxuICBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFR5cGUsIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgcmVmbGVjdENvbXBvbmVudFR5cGUsIENvbXBvbmVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHcmlkSFRNTEVsZW1lbnQsIEdyaWRJdGVtSFRNTEVsZW1lbnQsIEdyaWRTdGFjaywgR3JpZFN0YWNrTm9kZSwgR3JpZFN0YWNrT3B0aW9ucywgR3JpZFN0YWNrV2lkZ2V0IH0gZnJvbSAnZ3JpZHN0YWNrJztcblxuaW1wb3J0IHsgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQsIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgfSBmcm9tICcuL2dyaWRzdGFjay1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCYXNlV2lkZ2V0IH0gZnJvbSAnLi9iYXNlLXdpZGdldCc7XG5cbi8qKiBldmVudHMgaGFuZGxlcnMgZW1pdHRlcnMgc2lnbmF0dXJlIGZvciBkaWZmZXJlbnQgZXZlbnRzICovXG5leHBvcnQgdHlwZSBldmVudENCID0ge2V2ZW50OiBFdmVudH07XG5leHBvcnQgdHlwZSBlbGVtZW50Q0IgPSB7ZXZlbnQ6IEV2ZW50LCBlbDogR3JpZEl0ZW1IVE1MRWxlbWVudH07XG5leHBvcnQgdHlwZSBub2Rlc0NCID0ge2V2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXX07XG5leHBvcnQgdHlwZSBkcm9wcGVkQ0IgPSB7ZXZlbnQ6IEV2ZW50LCBwcmV2aW91c05vZGU6IEdyaWRTdGFja05vZGUsIG5ld05vZGU6IEdyaWRTdGFja05vZGV9O1xuXG5leHBvcnQgdHlwZSBOZ0NvbXBJbnB1dHMgPSB7W2tleTogc3RyaW5nXTogYW55fTtcblxuLyoqIGV4dGVuZHMgdG8gc3RvcmUgTmcgQ29tcG9uZW50IHNlbGVjdG9yLCBpbnN0ZWFkL2luQWRkaXRpb24gdG8gY29udGVudCAqL1xuZXhwb3J0IGludGVyZmFjZSBOZ0dyaWRTdGFja1dpZGdldCBleHRlbmRzIEdyaWRTdGFja1dpZGdldCB7XG4gIC8qKiBBbmd1bGFyIHRhZyBzZWxlY3RvciBmb3IgdGhpcyBjb21wb25lbnQgdG8gY3JlYXRlIGF0IHJ1bnRpbWUgKi9cbiAgc2VsZWN0b3I/OiBzdHJpbmc7XG4gIC8qKiBzZXJpYWxpemVkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQgaW5wdXQgZmllbGRzICovXG4gIGlucHV0PzogTmdDb21wSW5wdXRzO1xuICAvKiogbmVzdGVkIGdyaWQgb3B0aW9ucyAqL1xuICBzdWJHcmlkT3B0cz86IE5nR3JpZFN0YWNrT3B0aW9ucztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTmdHcmlkU3RhY2tOb2RlIGV4dGVuZHMgR3JpZFN0YWNrTm9kZSB7XG4gIHNlbGVjdG9yPzogc3RyaW5nOyAvLyBjb21wb25lbnQgdHlwZSB0byBjcmVhdGUgYXMgY29udGVudFxufVxuZXhwb3J0IGludGVyZmFjZSBOZ0dyaWRTdGFja09wdGlvbnMgZXh0ZW5kcyBHcmlkU3RhY2tPcHRpb25zIHtcbiAgY2hpbGRyZW4/OiBOZ0dyaWRTdGFja1dpZGdldFtdO1xuICBzdWJHcmlkT3B0cz86IE5nR3JpZFN0YWNrT3B0aW9ucztcbn1cblxuLyoqIHN0b3JlIGVsZW1lbnQgdG8gTmcgQ2xhc3MgcG9pbnRlciBiYWNrICovXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRDb21wSFRNTEVsZW1lbnQgZXh0ZW5kcyBHcmlkSFRNTEVsZW1lbnQge1xuICBfZ3JpZENvbXA/OiBHcmlkc3RhY2tDb21wb25lbnQ7XG59XG5cbi8qKiBzZWxlY3RvciBzdHJpbmcgdG8gcnVudGltZSBUeXBlIG1hcHBpbmcgKi9cbmV4cG9ydCB0eXBlIFNlbGVjdG9yVG9UeXBlID0ge1trZXk6IHN0cmluZ106IFR5cGU8T2JqZWN0Pn07XG5cbi8qKlxuICogSFRNTCBDb21wb25lbnQgV3JhcHBlciBmb3IgZ3JpZHN0YWNrLCBpbiBjb21iaW5hdGlvbiB3aXRoIEdyaWRzdGFja0l0ZW1Db21wb25lbnQgZm9yIHRoZSBpdGVtc1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdncmlkc3RhY2snLFxuICB0ZW1wbGF0ZTogYFxuICAgIDwhLS0gY29udGVudCB0byBzaG93IHdoZW4gd2hlbiBncmlkIGlzIGVtcHR5LCBsaWtlIGluc3RydWN0aW9ucyBvbiBob3cgdG8gYWRkIHdpZGdldHMgLS0+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2VtcHR5LWNvbnRlbnRdXCIgKm5nSWY9XCJpc0VtcHR5XCI+PC9uZy1jb250ZW50PlxuICAgIDwhLS0gd2hlcmUgZHluYW1pYyBpdGVtcyBnbyAtLT5cbiAgICA8bmctdGVtcGxhdGUgI2NvbnRhaW5lcj48L25nLXRlbXBsYXRlPlxuICAgIDwhLS0gd2hlcmUgdGVtcGxhdGUgaXRlbXMgZ28gLS0+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfVxuICBgXSxcbiAgLy8gY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsIC8vIElGRiB5b3Ugd2FudCB0byBvcHRpbWl6ZSBhbmQgY29udHJvbCB3aGVuIENoYW5nZURldGVjdGlvbiBuZWVkcyB0byBoYXBwZW4uLi5cbn0pXG5leHBvcnQgY2xhc3MgR3JpZHN0YWNrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKiB0cmFjayBsaXN0IG9mIFRFTVBMQVRFIGdyaWQgaXRlbXMgc28gd2UgY2FuIHN5bmMgYmV0d2VlbiBET00gYW5kIEdTIGludGVybmFscyAqL1xuICBAQ29udGVudENoaWxkcmVuKEdyaWRzdGFja0l0ZW1Db21wb25lbnQpIHB1YmxpYyBncmlkc3RhY2tJdGVtcz86IFF1ZXJ5TGlzdDxHcmlkc3RhY2tJdGVtQ29tcG9uZW50PjtcbiAgLyoqIGNvbnRhaW5lciB0byBhcHBlbmQgaXRlbXMgZHluYW1pY2FsbHkgKi9cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJywgeyByZWFkOiBWaWV3Q29udGFpbmVyUmVmLCBzdGF0aWM6IHRydWV9KSBwdWJsaWMgY29udGFpbmVyPzogVmlld0NvbnRhaW5lclJlZjtcblxuICAvKiogaW5pdGlhbCBvcHRpb25zIGZvciBjcmVhdGlvbiBvZiB0aGUgZ3JpZCAqL1xuICBASW5wdXQoKSBwdWJsaWMgc2V0IG9wdGlvbnModmFsOiBHcmlkU3RhY2tPcHRpb25zKSB7IHRoaXMuX29wdGlvbnMgPSB2YWw7IH1cbiAgLyoqIHJldHVybiB0aGUgY3VycmVudCBydW5uaW5nIG9wdGlvbnMgKi9cbiAgcHVibGljIGdldCBvcHRpb25zKCk6IEdyaWRTdGFja09wdGlvbnMgeyByZXR1cm4gdGhpcy5fZ3JpZD8ub3B0cyB8fCB0aGlzLl9vcHRpb25zIHx8IHt9OyB9XG5cbiAgLyoqIHRydWUgd2hpbGUgbmctY29udGVudCB3aXRoICduby1pdGVtLWNvbnRlbnQnIHNob3VsZCBiZSBzaG93biB3aGVuIGxhc3QgaXRlbSBpcyByZW1vdmVkIGZyb20gYSBncmlkICovXG4gIEBJbnB1dCgpIHB1YmxpYyBpc0VtcHR5PzogYm9vbGVhbjtcblxuICAvKiogaW5kaXZpZHVhbCBsaXN0IG9mIEdyaWRTdGFja0V2ZW50IGNhbGxiYWNrcyBoYW5kbGVycyBhcyBvdXRwdXRcbiAgICogb3RoZXJ3aXNlIHVzZSB0aGlzLmdyaWQub24oJ25hbWUxIG5hbWUyIG5hbWUzJywgY2FsbGJhY2spIHRvIGhhbmRsZSBtdWx0aXBsZSBhdCBvbmNlXG4gICAqIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZ3JpZHN0YWNrL2dyaWRzdGFjay5qcy9ibG9iL21hc3Rlci9kZW1vL2V2ZW50cy5qcyNMNFxuICAgKlxuICAgKiBOb3RlOiBjYW1lbCBjYXNpbmcgYW5kICdDQicgYWRkZWQgYXQgdGhlIGVuZCB0byBwcmV2ZW50IEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gICAqIGVnOiAnY2hhbmdlJyB3b3VsZCB0cmlnZ2VyIHRoZSByYXcgQ3VzdG9tRXZlbnQgc28gdXNlIGRpZmZlcmVudCBuYW1lLlxuICAgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBhZGRlZENCID0gbmV3IEV2ZW50RW1pdHRlcjxub2Rlc0NCPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZUNCID0gbmV3IEV2ZW50RW1pdHRlcjxub2Rlc0NCPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGRpc2FibGVDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZXZlbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBkcmFnQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBkcmFnU3RhcnRDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZWxlbWVudENCPigpO1xuICBAT3V0cHV0KCkgcHVibGljIGRyYWdTdG9wQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBkcm9wcGVkQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGRyb3BwZWRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBlbmFibGVDQiA9IG5ldyBFdmVudEVtaXR0ZXI8ZXZlbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZW1vdmVkQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPG5vZGVzQ0I+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVzaXplQ0IgPSBuZXcgRXZlbnRFbWl0dGVyPGVsZW1lbnRDQj4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyByZXNpemVTdGFydENCID0gbmV3IEV2ZW50RW1pdHRlcjxlbGVtZW50Q0I+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgcmVzaXplU3RvcENCID0gbmV3IEV2ZW50RW1pdHRlcjxlbGVtZW50Q0I+KCk7XG5cbiAgLyoqIHJldHVybiB0aGUgbmF0aXZlIGVsZW1lbnQgdGhhdCBjb250YWlucyBncmlkIHNwZWNpZmljIGZpZWxkcyBhcyB3ZWxsICovXG4gIHB1YmxpYyBnZXQgZWwoKTogR3JpZENvbXBIVE1MRWxlbWVudCB7IHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsgfVxuXG4gIC8qKiByZXR1cm4gdGhlIEdyaWRTdGFjayBjbGFzcyAqL1xuICBwdWJsaWMgZ2V0IGdyaWQoKTogR3JpZFN0YWNrIHwgdW5kZWZpbmVkIHsgcmV0dXJuIHRoaXMuX2dyaWQ7IH1cblxuICAvKiogQ29tcG9uZW50UmVmIG9mIG91cnNlbGYgLSB1c2VkIGJ5IGR5bmFtaWMgb2JqZWN0IHRvIGNvcnJlY3RseSBnZXQgcmVtb3ZlZCAqL1xuICBwdWJsaWMgcmVmOiBDb21wb25lbnRSZWY8R3JpZHN0YWNrQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogc3RvcmVzIHRoZSBzZWxlY3RvciAtPiBUeXBlIG1hcHBpbmcsIHNvIHdlIGNhbiBjcmVhdGUgaXRlbXMgZHluYW1pY2FsbHkgZnJvbSBhIHN0cmluZy5cbiAgICogVW5mb3J0dW5hdGVseSBOZyBkb2Vzbid0IHByb3ZpZGUgcHVibGljIGFjY2VzcyB0byB0aGF0IG1hcHBpbmcuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlbGVjdG9yVG9UeXBlOiBTZWxlY3RvclRvVHlwZSA9IHt9O1xuICAvKiogYWRkIGEgbGlzdCBvZiBuZyBDb21wb25lbnQgdG8gYmUgbWFwcGVkIHRvIHNlbGVjdG9yICovXG4gIHB1YmxpYyBzdGF0aWMgYWRkQ29tcG9uZW50VG9TZWxlY3RvclR5cGUodHlwZUxpc3Q6IEFycmF5PFR5cGU8T2JqZWN0Pj4pIHtcbiAgICB0eXBlTGlzdC5mb3JFYWNoKHR5cGUgPT4gR3JpZHN0YWNrQ29tcG9uZW50LnNlbGVjdG9yVG9UeXBlWyBHcmlkc3RhY2tDb21wb25lbnQuZ2V0U2VsZWN0b3IodHlwZSkgXSA9IHR5cGUpO1xuICB9XG4gIC8qKiByZXR1cm4gdGhlIG5nIENvbXBvbmVudCBzZWxlY3RvciAqL1xuICBwdWJsaWMgc3RhdGljIGdldFNlbGVjdG9yKHR5cGU6IFR5cGU8T2JqZWN0Pik6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlZmxlY3RDb21wb25lbnRUeXBlKHR5cGUpIS5zZWxlY3RvcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBfb3B0aW9ucz86IEdyaWRTdGFja09wdGlvbnM7XG4gIHByb3RlY3RlZCBfZ3JpZD86IEdyaWRTdGFjaztcbiAgcHJvdGVjdGVkIF9zdWI6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGxvYWRlZD86IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gcHJvdGVjdGVkIHJlYWRvbmx5IHpvbmU6IE5nWm9uZSxcbiAgICAvLyBwcm90ZWN0ZWQgcmVhZG9ubHkgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByb3RlY3RlZCByZWFkb25seSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEdyaWRDb21wSFRNTEVsZW1lbnQ+LFxuICApIHtcbiAgICB0aGlzLmVsLl9ncmlkQ29tcCA9IHRoaXM7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gaW5pdCBvdXJzZWxmIGJlZm9yZSBhbnkgdGVtcGxhdGUgY2hpbGRyZW4gYXJlIGNyZWF0ZWQgc2luY2Ugd2UgdHJhY2sgdGhlbSBiZWxvdyBhbnl3YXkgLSBubyBuZWVkIHRvIGRvdWJsZSBjcmVhdGUrdXBkYXRlIHdpZGdldHNcbiAgICB0aGlzLmxvYWRlZCA9ICEhdGhpcy5vcHRpb25zPy5jaGlsZHJlbj8ubGVuZ3RoO1xuICAgIHRoaXMuX2dyaWQgPSBHcmlkU3RhY2suaW5pdCh0aGlzLl9vcHRpb25zLCB0aGlzLmVsKTtcbiAgICBkZWxldGUgdGhpcy5fb3B0aW9uczsgLy8gR1MgaGFzIGl0IG5vd1xuXG4gICAgdGhpcy5jaGVja0VtcHR5KCk7XG4gIH1cblxuICAvKiogd2FpdCB1bnRpbCBhZnRlciBhbGwgRE9NIGlzIHJlYWR5IHRvIGluaXQgZ3JpZHN0YWNrIGNoaWxkcmVuIChhZnRlciBhbmd1bGFyIG5nRm9yIGFuZCBzdWItY29tcG9uZW50cyBydW4gZmlyc3QpICovXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgLy8gdHJhY2sgd2hlbmV2ZXIgdGhlIGNoaWxkcmVuIGxpc3QgY2hhbmdlcyBhbmQgdXBkYXRlIHRoZSBsYXlvdXQuLi5cbiAgICB0aGlzLl9zdWIgPSB0aGlzLmdyaWRzdGFja0l0ZW1zPy5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUFsbCgpKTtcbiAgICAvLyAuLi5hbmQgZG8gdGhpcyBvbmNlIGF0IGxlYXN0IHVubGVzcyB3ZSBsb2FkZWQgY2hpbGRyZW4gYWxyZWFkeVxuICAgIGlmICghdGhpcy5sb2FkZWQpIHRoaXMudXBkYXRlQWxsKCk7XG4gICAgdGhpcy5ob29rRXZlbnRzKHRoaXMuZ3JpZCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy51bmhvb2tFdmVudHModGhpcy5fZ3JpZCk7XG4gICAgdGhpcy5fc3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuX2dyaWQ/LmRlc3Ryb3koKTtcbiAgICBkZWxldGUgdGhpcy5fZ3JpZDtcbiAgICBkZWxldGUgdGhpcy5lbC5fZ3JpZENvbXA7XG4gICAgZGVsZXRlIHRoaXMuY29udGFpbmVyO1xuICAgIGRlbGV0ZSB0aGlzLnJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBjYWxsZWQgd2hlbiB0aGUgVEVNUExBVEUgbGlzdCBvZiBpdGVtcyBjaGFuZ2VzIC0gZ2V0IGEgbGlzdCBvZiBub2RlcyBhbmRcbiAgICogdXBkYXRlIHRoZSBsYXlvdXQgYWNjb3JkaW5nbHkgKHdoaWNoIHdpbGwgdGFrZSBjYXJlIG9mIGFkZGluZy9yZW1vdmluZyBpdGVtcyBjaGFuZ2VkIGJ5IEFuZ3VsYXIpXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlQWxsKCkge1xuICAgIGlmICghdGhpcy5ncmlkKSByZXR1cm47XG4gICAgY29uc3QgbGF5b3V0OiBHcmlkU3RhY2tXaWRnZXRbXSA9IFtdO1xuICAgIHRoaXMuZ3JpZHN0YWNrSXRlbXM/LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICBsYXlvdXQucHVzaChpdGVtLm9wdGlvbnMpO1xuICAgICAgaXRlbS5jbGVhck9wdGlvbnMoKTtcbiAgICB9KTtcbiAgICB0aGlzLmdyaWQubG9hZChsYXlvdXQpOyAvLyBlZmZpY2llbnQgdGhhdCBkb2VzIGRpZmZzIG9ubHlcbiAgfVxuXG4gIC8qKiBjaGVjayBpZiB0aGUgZ3JpZCBpcyBlbXB0eSwgaWYgc28gc2hvdyBhbHRlcm5hdGl2ZSBjb250ZW50ICovXG4gIHB1YmxpYyBjaGVja0VtcHR5KCkge1xuICAgIGlmICghdGhpcy5ncmlkKSByZXR1cm47XG4gICAgY29uc3QgaXNFbXB0eSA9ICF0aGlzLmdyaWQuZW5naW5lLm5vZGVzLmxlbmd0aDtcbiAgICBpZiAoaXNFbXB0eSA9PT0gdGhpcy5pc0VtcHR5KSByZXR1cm47XG4gICAgdGhpcy5pc0VtcHR5ID0gaXNFbXB0eTtcbiAgICAvLyB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKiBnZXQgYWxsIGtub3duIGV2ZW50cyBhcyBlYXN5IHRvIHVzZSBPdXRwdXRzIGZvciBjb252ZW5pZW5jZSAqL1xuICBwcm90ZWN0ZWQgaG9va0V2ZW50cyhncmlkPzogR3JpZFN0YWNrKSB7XG4gICAgaWYgKCFncmlkKSByZXR1cm47XG4gICAgZ3JpZFxuICAgICAgLm9uKCdhZGRlZCcsIChldmVudDogRXZlbnQsIG5vZGVzOiBHcmlkU3RhY2tOb2RlW10pID0+IHsgdGhpcy5jaGVja0VtcHR5KCk7IHRoaXMuYWRkZWRDQi5lbWl0KHtldmVudCwgbm9kZXN9KTsgfSlcbiAgICAgIC5vbignY2hhbmdlJywgKGV2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXSkgPT4gdGhpcy5jaGFuZ2VDQi5lbWl0KHtldmVudCwgbm9kZXN9KSlcbiAgICAgIC5vbignZGlzYWJsZScsIChldmVudDogRXZlbnQpID0+IHRoaXMuZGlzYWJsZUNCLmVtaXQoe2V2ZW50fSkpXG4gICAgICAub24oJ2RyYWcnLCAoZXZlbnQ6IEV2ZW50LCBlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCkgPT4gdGhpcy5kcmFnQ0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgICAub24oJ2RyYWdzdGFydCcsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLmRyYWdTdGFydENCLmVtaXQoe2V2ZW50LCBlbH0pKVxuICAgICAgLm9uKCdkcmFnc3RvcCcsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLmRyYWdTdG9wQ0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgICAub24oJ2Ryb3BwZWQnLCAoZXZlbnQ6IEV2ZW50LCBwcmV2aW91c05vZGU6IEdyaWRTdGFja05vZGUsIG5ld05vZGU6IEdyaWRTdGFja05vZGUpID0+IHRoaXMuZHJvcHBlZENCLmVtaXQoe2V2ZW50LCBwcmV2aW91c05vZGUsIG5ld05vZGV9KSlcbiAgICAgIC5vbignZW5hYmxlJywgKGV2ZW50OiBFdmVudCkgPT4gdGhpcy5lbmFibGVDQi5lbWl0KHtldmVudH0pKVxuICAgICAgLm9uKCdyZW1vdmVkJywgKGV2ZW50OiBFdmVudCwgbm9kZXM6IEdyaWRTdGFja05vZGVbXSkgPT4geyB0aGlzLmNoZWNrRW1wdHkoKTsgdGhpcy5yZW1vdmVkQ0IuZW1pdCh7ZXZlbnQsIG5vZGVzfSk7IH0pXG4gICAgICAub24oJ3Jlc2l6ZScsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLnJlc2l6ZUNCLmVtaXQoe2V2ZW50LCBlbH0pKVxuICAgICAgLm9uKCdyZXNpemVzdGFydCcsIChldmVudDogRXZlbnQsIGVsOiBHcmlkSXRlbUhUTUxFbGVtZW50KSA9PiB0aGlzLnJlc2l6ZVN0YXJ0Q0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gICAgICAub24oJ3Jlc2l6ZXN0b3AnLCAoZXZlbnQ6IEV2ZW50LCBlbDogR3JpZEl0ZW1IVE1MRWxlbWVudCkgPT4gdGhpcy5yZXNpemVTdG9wQ0IuZW1pdCh7ZXZlbnQsIGVsfSkpXG4gIH1cblxuICBwcm90ZWN0ZWQgdW5ob29rRXZlbnRzKGdyaWQ/OiBHcmlkU3RhY2spIHtcbiAgICBpZiAoIWdyaWQpIHJldHVybjtcbiAgICBncmlkLm9mZignYWRkZWQgY2hhbmdlIGRpc2FibGUgZHJhZyBkcmFnc3RhcnQgZHJhZ3N0b3AgZHJvcHBlZCBlbmFibGUgcmVtb3ZlZCByZXNpemUgcmVzaXplc3RhcnQgcmVzaXplc3RvcCcpO1xuICB9XG59XG5cbi8qKlxuICogY2FuIGJlIHVzZWQgd2hlbiBhIG5ldyBpdGVtIG5lZWRzIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHdlIGRvIGFzIGEgQW5ndWxhciBjb21wb25lbnQsIG9yIGRlbGV0ZWQgKHNraXApXG4gKiovXG5leHBvcnQgZnVuY3Rpb24gZ3NDcmVhdGVOZ0NvbXBvbmVudHMoaG9zdDogR3JpZENvbXBIVE1MRWxlbWVudCB8IEhUTUxFbGVtZW50LCBuOiBOZ0dyaWRTdGFja05vZGUsIGFkZDogYm9vbGVhbiwgaXNHcmlkOiBib29sZWFuKTogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQge1xuICBpZiAoYWRkKSB7XG4gICAgLy9cbiAgICAvLyBjcmVhdGUgdGhlIGNvbXBvbmVudCBkeW5hbWljYWxseSAtIHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZG9jcy90cy9sYXRlc3QvY29va2Jvb2svZHluYW1pYy1jb21wb25lbnQtbG9hZGVyLmh0bWxcbiAgICAvL1xuICAgIGlmICghaG9zdCkgcmV0dXJuO1xuICAgIGlmIChpc0dyaWQpIHtcbiAgICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIGNyZWF0ZSBuZyBjb21wb25lbnQgaW5zaWRlIHJlZ3VsYXIgRGl2LiBuZWVkIHRvIGFjY2VzcyBhcHAgaW5qZWN0b3JzLi4uXG4gICAgICAvLyBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgLy8gICBjb25zdCBob3N0RWxlbWVudDogRWxlbWVudCA9IGhvc3Q7XG4gICAgICAvLyAgIGNvbnN0IGVudmlyb25tZW50SW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3I7XG4gICAgICAvLyAgIGdyaWQgPSBjcmVhdGVDb21wb25lbnQoR3JpZHN0YWNrQ29tcG9uZW50LCB7ZW52aXJvbm1lbnRJbmplY3RvciwgaG9zdEVsZW1lbnR9KT8uaW5zdGFuY2U7XG4gICAgICAvLyB9XG5cbiAgICAgIGNvbnN0IGdyaWRJdGVtQ29tcCA9IChob3N0LnBhcmVudEVsZW1lbnQgYXMgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQpPy5fZ3JpZEl0ZW1Db21wO1xuICAgICAgaWYgKCFncmlkSXRlbUNvbXApIHJldHVybjtcbiAgICAgIC8vIGNoZWNrIGlmIGdyaWRJdGVtIGhhcyBhIGNoaWxkIGNvbXBvbmVudCB3aXRoICdjb250YWluZXInIGV4cG9zZWQgdG8gY3JlYXRlIHVuZGVyLi5cbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IChncmlkSXRlbUNvbXAuY2hpbGRXaWRnZXQgYXMgYW55KT8uY29udGFpbmVyIHx8IGdyaWRJdGVtQ29tcC5jb250YWluZXI7XG4gICAgICBjb25zdCBncmlkUmVmID0gY29udGFpbmVyPy5jcmVhdGVDb21wb25lbnQoR3JpZHN0YWNrQ29tcG9uZW50KTtcbiAgICAgIGNvbnN0IGdyaWQgPSBncmlkUmVmPy5pbnN0YW5jZTtcbiAgICAgIGlmICghZ3JpZCkgcmV0dXJuO1xuICAgICAgZ3JpZC5yZWYgPSBncmlkUmVmO1xuICAgICAgZ3JpZC5vcHRpb25zID0gbjtcbiAgICAgIHJldHVybiBncmlkLmVsO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBncmlkQ29tcCA9IChob3N0IGFzIEdyaWRDb21wSFRNTEVsZW1lbnQpLl9ncmlkQ29tcDtcbiAgICAgIGNvbnN0IGdyaWRJdGVtUmVmID0gZ3JpZENvbXA/LmNvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KEdyaWRzdGFja0l0ZW1Db21wb25lbnQpO1xuICAgICAgY29uc3QgZ3JpZEl0ZW0gPSBncmlkSXRlbVJlZj8uaW5zdGFuY2U7XG4gICAgICBpZiAoIWdyaWRJdGVtKSByZXR1cm47XG4gICAgICBncmlkSXRlbS5yZWYgPSBncmlkSXRlbVJlZlxuXG4gICAgICAvLyBkZWZpbmUgd2hhdCB0eXBlIG9mIGNvbXBvbmVudCB0byBjcmVhdGUgYXMgY2hpbGQsIE9SIHlvdSBjYW4gZG8gaXQgR3JpZHN0YWNrSXRlbUNvbXBvbmVudCB0ZW1wbGF0ZSwgYnV0IHRoaXMgaXMgbW9yZSBnZW5lcmljXG4gICAgICBjb25zdCBzZWxlY3RvciA9IG4uc2VsZWN0b3I7XG4gICAgICBjb25zdCB0eXBlID0gc2VsZWN0b3IgPyBHcmlkc3RhY2tDb21wb25lbnQuc2VsZWN0b3JUb1R5cGVbc2VsZWN0b3JdIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgLy8gc2hhcmVkIGNvZGUgdG8gY3JlYXRlIG91ciBzZWxlY3RvciBjb21wb25lbnRcbiAgICAgICAgY29uc3QgY3JlYXRlQ29tcCA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjaGlsZFdpZGdldCA9IGdyaWRJdGVtLmNvbnRhaW5lcj8uY3JlYXRlQ29tcG9uZW50KHR5cGUpPy5pbnN0YW5jZSBhcyBCYXNlV2lkZ2V0O1xuICAgICAgICAgIC8vIGlmIHByb3BlciBCYXNlV2lkZ2V0IHN1YmNsYXNzLCBzYXZlIGl0IGFuZCBsb2FkIGFkZGl0aW9uYWwgZGF0YVxuICAgICAgICAgIGlmIChjaGlsZFdpZGdldCAmJiB0eXBlb2YgY2hpbGRXaWRnZXQuc2VyaWFsaXplID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBjaGlsZFdpZGdldC5kZXNlcmlhbGl6ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZ3JpZEl0ZW0uY2hpbGRXaWRnZXQgPSBjaGlsZFdpZGdldDtcbiAgICAgICAgICAgIGNoaWxkV2lkZ2V0LmRlc2VyaWFsaXplKG4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhenlMb2FkID0gbi5sYXp5TG9hZCB8fCBuLmdyaWQ/Lm9wdHM/LmxhenlMb2FkICYmIG4ubGF6eUxvYWQgIT09IGZhbHNlO1xuICAgICAgICBpZiAobGF6eUxvYWQpIHtcbiAgICAgICAgICBpZiAoIW4udmlzaWJsZU9ic2VydmFibGUpIHtcbiAgICAgICAgICAgIG4udmlzaWJsZU9ic2VydmFibGUgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKFtlbnRyeV0pID0+IHsgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgIG4udmlzaWJsZU9ic2VydmFibGU/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgZGVsZXRlIG4udmlzaWJsZU9ic2VydmFibGU7XG4gICAgICAgICAgICAgIGNyZWF0ZUNvbXAoKTtcbiAgICAgICAgICAgIH19KTtcbiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IG4udmlzaWJsZU9ic2VydmFibGU/Lm9ic2VydmUoZ3JpZEl0ZW0uZWwpKTsgLy8gd2FpdCB1bnRpbCBjYWxsZWUgc2V0cyBwb3NpdGlvbiBhdHRyaWJ1dGVzXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgY3JlYXRlQ29tcCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZ3JpZEl0ZW0uZWw7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgLy8gUkVNT1ZFIC0gaGF2ZSB0byBjYWxsIENvbXBvbmVudFJlZjpkZXN0cm95KCkgZm9yIGR5bmFtaWMgb2JqZWN0cyB0byBjb3JyZWN0bHkgcmVtb3ZlIHRoZW1zZWx2ZXNcbiAgICAvLyBOb3RlOiB0aGlzIHdpbGwgZGVzdHJveSBhbGwgY2hpbGRyZW4gZHluYW1pYyBjb21wb25lbnRzIGFzIHdlbGw6IGdyaWRJdGVtIC0+IGNoaWxkV2lkZ2V0XG4gICAgLy9cbiAgICBpZiAoaXNHcmlkKSB7XG4gICAgICBjb25zdCBncmlkID0gKG4uZWwgYXMgR3JpZENvbXBIVE1MRWxlbWVudCk/Ll9ncmlkQ29tcDtcbiAgICAgIGlmIChncmlkPy5yZWYpIGdyaWQucmVmLmRlc3Ryb3koKTtcbiAgICAgIGVsc2UgZ3JpZD8ubmdPbkRlc3Ryb3koKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ3JpZEl0ZW0gPSAobi5lbCBhcyBHcmlkSXRlbUNvbXBIVE1MRWxlbWVudCk/Ll9ncmlkSXRlbUNvbXA7XG4gICAgICBpZiAoZ3JpZEl0ZW0/LnJlZikgZ3JpZEl0ZW0ucmVmLmRlc3Ryb3koKTtcbiAgICAgIGVsc2UgZ3JpZEl0ZW0/Lm5nT25EZXN0cm95KCk7XG4gICAgfVxuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBjYWxsZWQgZm9yIGVhY2ggaXRlbSBpbiB0aGUgZ3JpZCAtIGNoZWNrIGlmIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gbmVlZHMgdG8gYmUgc2F2ZWQuXG4gKiBOb3RlOiBzaW5jZSB0aGlzIGlzIG9wdGlvbnMgbWludXMgZ3JpZHN0YWNrIHByb3RlY3RlZCBtZW1iZXJzIHVzaW5nIFV0aWxzLnJlbW92ZUludGVybmFsRm9yU2F2ZSgpLFxuICogdGhpcyB0eXBpY2FsbHkgZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLiBIb3dldmVyIHlvdXIgY3VzdG9tIENvbXBvbmVudCBASW5wdXQoKSBhcmUgbm93IHN1cHBvcnRlZFxuICogdXNpbmcgQmFzZVdpZGdldC5zZXJpYWxpemUoKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3NTYXZlQWRkaXRpb25hbE5nSW5mbyhuOiBOZ0dyaWRTdGFja05vZGUsIHc6IE5nR3JpZFN0YWNrV2lkZ2V0KSB7XG4gIGNvbnN0IGdyaWRJdGVtID0gKG4uZWwgYXMgR3JpZEl0ZW1Db21wSFRNTEVsZW1lbnQpPy5fZ3JpZEl0ZW1Db21wO1xuICBpZiAoZ3JpZEl0ZW0pIHtcbiAgICBjb25zdCBpbnB1dCA9IGdyaWRJdGVtLmNoaWxkV2lkZ2V0Py5zZXJpYWxpemUoKTtcbiAgICBpZiAoaW5wdXQpIHtcbiAgICAgIHcuaW5wdXQgPSBpbnB1dDtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGVsc2UgY2hlY2sgaWYgR3JpZFxuICBjb25zdCBncmlkID0gKG4uZWwgYXMgR3JpZENvbXBIVE1MRWxlbWVudCk/Ll9ncmlkQ29tcDtcbiAgaWYgKGdyaWQpIHtcbiAgICAvLy4uLi4gc2F2ZSBhbnkgY3VzdG9tIGRhdGFcbiAgfVxufVxuIl19
@@ -0,0 +1,39 @@
1
+ /**
2
+ * gridstack.component.ts 11.0.0
3
+ * Copyright (c) 2022-2024 Alain Dumesny - see GridStack root license
4
+ */
5
+ import { NgModule } from "@angular/core";
6
+ import { CommonModule } from '@angular/common';
7
+ import { GridStack } from "gridstack";
8
+ import { GridstackComponent, gsCreateNgComponents, gsSaveAdditionalNgInfo } from "./gridstack.component";
9
+ import { GridstackItemComponent } from "./gridstack-item.component";
10
+ import * as i0 from "@angular/core";
11
+ export class GridstackModule {
12
+ constructor() {
13
+ // set globally our method to create the right widget type
14
+ GridStack.addRemoveCB = gsCreateNgComponents;
15
+ GridStack.saveCB = gsSaveAdditionalNgInfo;
16
+ }
17
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GridstackModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
18
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.6", ngImport: i0, type: GridstackModule, declarations: [GridstackComponent,
19
+ GridstackItemComponent], imports: [CommonModule], exports: [GridstackComponent,
20
+ GridstackItemComponent] }); }
21
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GridstackModule, imports: [CommonModule] }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GridstackModule, decorators: [{
24
+ type: NgModule,
25
+ args: [{
26
+ imports: [
27
+ CommonModule,
28
+ ],
29
+ declarations: [
30
+ GridstackComponent,
31
+ GridstackItemComponent,
32
+ ],
33
+ exports: [
34
+ GridstackComponent,
35
+ GridstackItemComponent,
36
+ ],
37
+ }]
38
+ }], ctorParameters: () => [] });
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0YWNrLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2FuZ3VsYXIvcHJvamVjdHMvbGliL3NyYy9saWIvZ3JpZHN0YWNrLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQWVwRSxNQUFNLE9BQU8sZUFBZTtJQUMxQjtRQUNFLDBEQUEwRDtRQUMxRCxTQUFTLENBQUMsV0FBVyxHQUFHLG9CQUFvQixDQUFDO1FBQzdDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsc0JBQXNCLENBQUM7SUFDNUMsQ0FBQzs4R0FMVSxlQUFlOytHQUFmLGVBQWUsaUJBUnhCLGtCQUFrQjtZQUNsQixzQkFBc0IsYUFKdEIsWUFBWSxhQU9aLGtCQUFrQjtZQUNsQixzQkFBc0I7K0dBR2IsZUFBZSxZQVh4QixZQUFZOzsyRkFXSCxlQUFlO2tCQWIzQixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRTt3QkFDUCxZQUFZO3FCQUNiO29CQUNELFlBQVksRUFBRTt3QkFDWixrQkFBa0I7d0JBQ2xCLHNCQUFzQjtxQkFDdkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLGtCQUFrQjt3QkFDbEIsc0JBQXNCO3FCQUN2QjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBncmlkc3RhY2suY29tcG9uZW50LnRzIDExLjAuMFxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjItMjAyNCBBbGFpbiBEdW1lc255IC0gc2VlIEdyaWRTdGFjayByb290IGxpY2Vuc2VcclxuICovXHJcblxyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5pbXBvcnQgeyBHcmlkU3RhY2sgfSBmcm9tIFwiZ3JpZHN0YWNrXCI7XHJcbmltcG9ydCB7IEdyaWRzdGFja0NvbXBvbmVudCwgZ3NDcmVhdGVOZ0NvbXBvbmVudHMsIGdzU2F2ZUFkZGl0aW9uYWxOZ0luZm8gfSBmcm9tIFwiLi9ncmlkc3RhY2suY29tcG9uZW50XCI7XHJcbmltcG9ydCB7IEdyaWRzdGFja0l0ZW1Db21wb25lbnQgfSBmcm9tIFwiLi9ncmlkc3RhY2staXRlbS5jb21wb25lbnRcIjtcclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gIF0sXHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBHcmlkc3RhY2tDb21wb25lbnQsXHJcbiAgICBHcmlkc3RhY2tJdGVtQ29tcG9uZW50LFxyXG4gIF0sXHJcbiAgZXhwb3J0czogW1xyXG4gICAgR3JpZHN0YWNrQ29tcG9uZW50LFxyXG4gICAgR3JpZHN0YWNrSXRlbUNvbXBvbmVudCxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgR3JpZHN0YWNrTW9kdWxlIHtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIC8vIHNldCBnbG9iYWxseSBvdXIgbWV0aG9kIHRvIGNyZWF0ZSB0aGUgcmlnaHQgd2lkZ2V0IHR5cGVcclxuICAgIEdyaWRTdGFjay5hZGRSZW1vdmVDQiA9IGdzQ3JlYXRlTmdDb21wb25lbnRzO1xyXG4gICAgR3JpZFN0YWNrLnNhdmVDQiA9IGdzU2F2ZUFkZGl0aW9uYWxOZ0luZm87XHJcbiAgfVxyXG59XHJcbiJdfQ==