@libs-ui/services-grid-layout 0.2.357-19
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.
- package/README.md +109 -0
- package/canvas/grid-layout-canvas.component.d.ts +107 -0
- package/defines/gridster-config.define.d.ts +21 -0
- package/esm2022/canvas/grid-layout-canvas.component.mjs +193 -0
- package/esm2022/defines/gridster-config.define.mjs +123 -0
- package/esm2022/grid-layout.service.mjs +433 -0
- package/esm2022/index.mjs +10 -0
- package/esm2022/interfaces/grid-layout.interface.mjs +2 -0
- package/esm2022/libs-ui-services-grid-layout.mjs +5 -0
- package/esm2022/tree.service.mjs +180 -0
- package/fesm2022/libs-ui-services-grid-layout.mjs +933 -0
- package/fesm2022/libs-ui-services-grid-layout.mjs.map +1 -0
- package/grid-layout.service.d.ts +157 -0
- package/index.d.ts +3 -0
- package/interfaces/grid-layout.interface.d.ts +171 -0
- package/package.json +29 -0
- package/tree.service.d.ts +59 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import { DestroyRef, Injectable, inject, signal } from '@angular/core';
|
|
2
|
+
import { cloneDeep } from '@libs-ui/utils';
|
|
3
|
+
import { take } from 'rxjs';
|
|
4
|
+
import { gridLayoutNestedConfig, gridLayoutRootConfig } from './defines/gridster-config.define';
|
|
5
|
+
import { LibsUiGridLayoutTreeService } from './tree.service';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
/**
|
|
8
|
+
* Dựng một mặt phẳng kéo thả và tự gắn component của nơi dùng lên từng khối.
|
|
9
|
+
*
|
|
10
|
+
* Nơi dùng chỉ cần đưa vào: loại component muốn dựng
|
|
11
|
+
* (`nodeComponentType`) và cây dữ liệu (`data`). Toàn bộ việc vẽ lưới, kéo thả, đổi kích thước,
|
|
12
|
+
* lồng container và dọn dẹp do thư viện lo.
|
|
13
|
+
*
|
|
14
|
+
* 🔴 Đây là service theo TỪNG mặt phẳng, KHÔNG `providedIn: 'root'`. Khai trong `providers` của
|
|
15
|
+
* component dùng nó; hai mặt phẳng trên cùng một màn phải là hai thực thể riêng, dùng chung thì
|
|
16
|
+
* `componentRefs` của mặt phẳng này bị mặt phẳng kia dọn mất.
|
|
17
|
+
*/
|
|
18
|
+
export class LibsUiGridLayoutService {
|
|
19
|
+
// 🔴 TỰ TẠO, không `inject`. Nơi dùng chỉ phải viết `providers: [LibsUiGridLayoutService]` —
|
|
20
|
+
// không phải biết bên trong thư viện còn service nào khác (người dùng chốt 28/08/2026).
|
|
21
|
+
// `TreeService` không giữ trạng thái dùng chung nên mỗi mặt phẳng một bản là đúng.
|
|
22
|
+
treeService = new LibsUiGridLayoutTreeService();
|
|
23
|
+
/** Lượt tải component đang chờ, theo id khối — để huỷ khi khối bị gỡ giữa chừng. */
|
|
24
|
+
pendingLoads = new Map();
|
|
25
|
+
constructor() {
|
|
26
|
+
// 🔴 Service khai trong `providers` của component nên Angular huỷ nó cùng component — thư viện
|
|
27
|
+
// tự dọn ở đây, nơi dùng KHÔNG phải gọi `destroy()` trong `ngOnDestroy` (người dùng chốt
|
|
28
|
+
// 28/08/2026). Bắt nhớ một bước dọn dẹp là kiểu API dễ quên, và quên thì rò rỉ bộ nhớ im lặng.
|
|
29
|
+
inject(DestroyRef).onDestroy(() => this.destroy());
|
|
30
|
+
}
|
|
31
|
+
config;
|
|
32
|
+
componentRefs = new Map();
|
|
33
|
+
rootNode = signal(undefined);
|
|
34
|
+
editMode = signal(false);
|
|
35
|
+
/** tăng mỗi lần cây đổi — component con đọc để biết phải tính lại */
|
|
36
|
+
version = signal(0);
|
|
37
|
+
/**
|
|
38
|
+
* Signal chỉ đọc để nơi dùng theo dõi.
|
|
39
|
+
*
|
|
40
|
+
* 🔴 Là THUỘC TÍNH, không phải getter. Getter trả signal thì chỗ đọc phải viết `Version()()` —
|
|
41
|
+
* quên cặp ngoặc thứ hai là computed KHÔNG phụ thuộc vào nó, cây đổi mà lưới đứng im, và
|
|
42
|
+
* TypeScript không hề báo lỗi (đo 28/08/2026: thêm khối không hiện, sắp gọn không nhúc nhích).
|
|
43
|
+
*/
|
|
44
|
+
Root = this.rootNode.asReadonly();
|
|
45
|
+
IsEditMode = this.editMode.asReadonly();
|
|
46
|
+
/** tăng mỗi lần cây hoặc cấu hình đổi */
|
|
47
|
+
Version = this.version.asReadonly();
|
|
48
|
+
/**
|
|
49
|
+
* trần số cấp container lồng nhau — canvas đọc để biết có cho chuyển thành container không */
|
|
50
|
+
maxContainerDepth() {
|
|
51
|
+
return this.config?.maxContainerDepth ?? 1;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* lề trong của container, px — canvas đọc để đặt padding lên vỏ container */
|
|
55
|
+
containerPadding() {
|
|
56
|
+
return this.config?.containerPadding ?? 12;
|
|
57
|
+
}
|
|
58
|
+
/** Khởi tạo mặt phẳng. Gọi lại sẽ dọn sạch component cũ rồi dựng lại từ đầu. */
|
|
59
|
+
init(config) {
|
|
60
|
+
this.destroy();
|
|
61
|
+
this.config = config;
|
|
62
|
+
this.assignOverlapLayers(config.data);
|
|
63
|
+
// 🔴 Nhân bản như `refresh()`: `init()` lại (đổi chế độ, bật/tắt chồng khối) trên CÙNG object cây
|
|
64
|
+
// thì `@for` không dựng lại `gridster-item`, nên `layerIndex` vừa gán không tới `$item` và khối
|
|
65
|
+
// vẫn không đè nhau được (đo 28/08/2026: `item.layerIndex` = 1|2|3|4|7 mà `$item.layerIndex`
|
|
66
|
+
// toàn `undefined`).
|
|
67
|
+
this.rootNode.set(this.shallowCloneTree(config.data));
|
|
68
|
+
this.editMode.set(config.isEditMode ?? false);
|
|
69
|
+
this.version.update((v) => v + 1);
|
|
70
|
+
}
|
|
71
|
+
setEditMode(value) {
|
|
72
|
+
this.editMode.set(value);
|
|
73
|
+
// 🔴 PHẢI bơm `version`: `gridsterOptions()` đọc `editMode` để bật/tắt kéo–thả, mà computed
|
|
74
|
+
// `gridOptions` bên canvas chỉ chạy lại khi `Version` đổi. Thiếu dòng này thì đổi chế độ xong
|
|
75
|
+
// gridster vẫn giữ options cũ — chuyển sang XEM mà khối vẫn kéo được.
|
|
76
|
+
this.version.update((v) => v + 1);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Bật/tắt cho khối chồng lên nhau — KHÔNG dựng lại mặt phẳng.
|
|
80
|
+
*
|
|
81
|
+
* Trước đây nơi dùng phải gọi `init()` lại để đổi cờ này, mà `init()` huỷ sạch rồi dựng lại mọi
|
|
82
|
+
* component nội dung — lãng phí, và người dùng thấy màn chớp (người dùng chốt 28/08/2026).
|
|
83
|
+
*/
|
|
84
|
+
setAllowOverlap(value) {
|
|
85
|
+
if (!this.config) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
this.config = { ...this.config, allowOverlap: value };
|
|
89
|
+
const root = this.rootNode();
|
|
90
|
+
if (!root) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// 🔴 Gán lớp vào CÂY ĐANG VẼ (`rootNode`), KHÔNG phải `config.data`.
|
|
94
|
+
// `init()` đã clone `config.data` sang `rootNode` nên hai object KHÁC nhau; gán vào `config.data`
|
|
95
|
+
// thì `refresh()` clone lại từ `rootNode` — lớp vừa gán không tới `gridster-item` nào, `z-index`
|
|
96
|
+
// của mọi khối đứng ở `1` và khối nào vẽ sau thì nằm trên: chồng khối "lúc được lúc không"
|
|
97
|
+
// (đo 04/09/2026: `item.layerIndex` undefined, `getLayerIndex()` = 0 cho cả 8 khối).
|
|
98
|
+
this.assignOverlapLayers(root);
|
|
99
|
+
// Thay tham chiếu cây để `layerIndex` vừa gán tới được `$item` của gridster; component nội dung
|
|
100
|
+
// KHÔNG bị dựng lại vì `attachNode` nhận ra id cũ và chỉ `setInput`.
|
|
101
|
+
this.refresh();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
*
|
|
105
|
+
* Cấu hình gridster cho một cấp lưới.
|
|
106
|
+
*
|
|
107
|
+
* @param depth 0 = lưới cấp trang, ≥ 1 = lưới lồng trong container
|
|
108
|
+
*/
|
|
109
|
+
buildGridsterOptions(depth, itemChangeCallback) {
|
|
110
|
+
const base = depth === 0 ? gridLayoutRootConfig() : gridLayoutNestedConfig();
|
|
111
|
+
const config = this.config;
|
|
112
|
+
if (!config) {
|
|
113
|
+
return base;
|
|
114
|
+
}
|
|
115
|
+
const isFreeMode = config.mode === "free" /* E_gridLayout_mode_string.free */;
|
|
116
|
+
const canEdit = this.editMode();
|
|
117
|
+
const canOverlap = isFreeMode || (config.allowOverlap ?? false);
|
|
118
|
+
return {
|
|
119
|
+
...base,
|
|
120
|
+
...(config.cols ? { minCols: config.cols, maxCols: config.cols, maxItemCols: config.cols } : {}),
|
|
121
|
+
...(config.rowHeight && depth === 0 ? { fixedRowHeight: config.rowHeight } : {}),
|
|
122
|
+
// Khe và chiều cao hàng khác nhau theo cấp: lưới trang thoáng, lưới lồng khít.
|
|
123
|
+
...(depth === 0 && config.margin !== undefined ? { margin: config.margin } : {}),
|
|
124
|
+
...(depth > 0 && config.nestedMargin !== undefined ? { margin: config.nestedMargin } : {}),
|
|
125
|
+
...(depth > 0 && config.nestedRowHeight !== undefined ? { fixedRowHeight: config.nestedRowHeight } : {}),
|
|
126
|
+
...(depth === 0 && config.outerMargin !== undefined ? { outerMargin: config.outerMargin } : {}),
|
|
127
|
+
...(depth === 0 && config.outerMarginBottom !== undefined ? { outerMarginBottom: config.outerMarginBottom } : {}),
|
|
128
|
+
...(config.minItemRows !== undefined ? { minItemRows: config.minItemRows } : {}),
|
|
129
|
+
...(config.defaultItemCols !== undefined ? { defaultItemCols: config.defaultItemCols } : {}),
|
|
130
|
+
...(config.defaultItemRows !== undefined ? { defaultItemRows: config.defaultItemRows } : {}),
|
|
131
|
+
// 🔴 Chế độ XEM phải TẮT hẳn kéo và đổi kích thước.
|
|
132
|
+
// `base` luôn để `enabled: true`; không ghi đè theo `editMode` thì người xem vẫn kéo được khối
|
|
133
|
+
// và đổi bố cục của người khác (người dùng báo 28/08/2026: "đang xem mà vẫn kéo thả thay đổi
|
|
134
|
+
// vị trí và thêm khối được").
|
|
135
|
+
draggable: { ...base.draggable, enabled: canEdit },
|
|
136
|
+
resizable: { ...base.resizable, enabled: canEdit },
|
|
137
|
+
// Chế độ tự do LUÔN cho chồng; chế độ lưới thì theo cờ của nơi dùng.
|
|
138
|
+
allowMultiLayer: canOverlap,
|
|
139
|
+
// 🔴 Bật `allowMultiLayer` MỘT MÌNH không đủ. Mã lib so `layerIndex` của hai khối: KHÁC nhau
|
|
140
|
+
// thì cho đè, GIỐNG nhau vẫn báo va chạm. Khối không khai `layerIndex` đều rơi về
|
|
141
|
+
// `defaultLayerIndex` — tức cùng lớp, và vẫn bị đẩy nhau như lưới thường (người dùng báo
|
|
142
|
+
// 28/08/2026: "bật chồng khối nhưng khi kéo thì các khối vẫn di chuyển theo").
|
|
143
|
+
// Cho chồng thì phải TẮT đẩy khối, nếu không khối bị dạt đi trước khi kịp đè lên nhau.
|
|
144
|
+
...(canOverlap ? { pushItems: false, pushResizeItems: false, swap: false, swapWhileDragging: false } : {}),
|
|
145
|
+
itemChangeCallback: (item) => {
|
|
146
|
+
// 🔴 Khối vừa thao tác phải lên LỚP TRÊN CÙNG.
|
|
147
|
+
// `layerIndex` gán một lần theo thứ tự cây lúc khởi tạo, nên khối kéo lên chỉ nổi TRONG LÚC
|
|
148
|
+
// kéo (nhờ `z-index: 30` của lớp `gridster-item-moving`); thả tay ra là về lớp cũ và bị khối
|
|
149
|
+
// đứng sau trong cây đè ngược lên (người dùng báo 28/08/2026, đo được: kéo z=30, thả về
|
|
150
|
+
// z=10 trong khi hai khối kế bên đang z=11 và z=12).
|
|
151
|
+
if (canOverlap) {
|
|
152
|
+
this.raiseToTopLayer(item);
|
|
153
|
+
}
|
|
154
|
+
this.version.update((v) => v + 1);
|
|
155
|
+
itemChangeCallback?.();
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
*
|
|
161
|
+
* Gắn component của nơi dùng lên một khối.
|
|
162
|
+
*
|
|
163
|
+
* @param host chỗ gắn RIÊNG của ô đó — mỗi khối một `ViewContainerRef`, dùng chung một cái thì
|
|
164
|
+
* mọi component bị dồn hết vào một ô.
|
|
165
|
+
*/
|
|
166
|
+
attachNode(node, depth, host) {
|
|
167
|
+
const config = this.config;
|
|
168
|
+
if (!config) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const existing = this.componentRefs.get(node.id);
|
|
172
|
+
if (existing) {
|
|
173
|
+
this.applyInputs(existing, node, depth);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// Khối tự khai thì hỏi nó; không thì hỏi hàm phân giải chung. Cả hai đều nhận `node` để đọc
|
|
177
|
+
// được `data.type` mà quyết định trả component nào.
|
|
178
|
+
const stream = (node.getComponentOutlet ?? config.getComponentOutlet)?.(node);
|
|
179
|
+
if (!stream) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// 🔴 Huỷ lượt tải CŨ của đúng khối này trước khi mở lượt mới.
|
|
183
|
+
// Khối bị gỡ rồi gắn lại (đổi bố cục, sắp gọn) trong lúc `import()` chưa xong thì lượt cũ vẫn
|
|
184
|
+
// chạy tiếp và dựng component vào một `ViewContainerRef` đã chết.
|
|
185
|
+
this.pendingLoads.get(node.id)?.unsubscribe();
|
|
186
|
+
const sub = stream.pipe(take(1)).subscribe((componentType) => {
|
|
187
|
+
this.pendingLoads.delete(node.id);
|
|
188
|
+
// Khối có thể đã bị xoá trong lúc chờ tải — dựng vào đây là rò rỉ.
|
|
189
|
+
if (!this.treeService.findById(this.rootNode() ?? node, node.id)) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const ref = host.createComponent(componentType);
|
|
193
|
+
this.applyInputs(ref, node, depth);
|
|
194
|
+
this.componentRefs.set(node.id, ref);
|
|
195
|
+
});
|
|
196
|
+
this.pendingLoads.set(node.id, sub);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Gỡ component của một khối và huỷ nó. */
|
|
200
|
+
detachNode(nodeId) {
|
|
201
|
+
// Khối bị gỡ khi component của nó còn đang tải — phải huỷ lượt tải, không thì nó dựng vào một
|
|
202
|
+
// `ViewContainerRef` đã chết.
|
|
203
|
+
this.pendingLoads.get(nodeId)?.unsubscribe();
|
|
204
|
+
this.pendingLoads.delete(nodeId);
|
|
205
|
+
const ref = this.componentRefs.get(nodeId);
|
|
206
|
+
if (!ref) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
ref.destroy();
|
|
210
|
+
this.componentRefs.delete(nodeId);
|
|
211
|
+
}
|
|
212
|
+
destroy() {
|
|
213
|
+
for (const sub of this.pendingLoads.values()) {
|
|
214
|
+
sub.unsubscribe();
|
|
215
|
+
}
|
|
216
|
+
for (const ref of this.componentRefs.values()) {
|
|
217
|
+
ref.destroy();
|
|
218
|
+
}
|
|
219
|
+
this.pendingLoads.clear();
|
|
220
|
+
this.componentRefs.clear();
|
|
221
|
+
this.config = undefined;
|
|
222
|
+
}
|
|
223
|
+
// ─────────────────────────────────────────────────────────────────────────────────────────
|
|
224
|
+
// Nhóm hàm cho nơi dùng CHỦ ĐỘNG gọi — không phải chờ người dùng bấm nút trên khối.
|
|
225
|
+
// Sửa cây thì dùng thẳng `TreeService` rồi gọi `refresh()` — xem demo trong core-ui.
|
|
226
|
+
// ─────────────────────────────────────────────────────────────────────────────────────────
|
|
227
|
+
/**
|
|
228
|
+
* Báo cho service biết cây vừa đổi từ bên ngoài (thêm/xoá khối, sắp gọn, nạp bố cục khác).
|
|
229
|
+
*
|
|
230
|
+
* 🔴 PHẢI thay THAM CHIẾU của node gốc, không chỉ bơm `version`.
|
|
231
|
+
* `@for … track item.id` giữ nguyên object khi id không đổi, nên `<gridster-item [item]="…">` vẫn
|
|
232
|
+
* nhận đúng object cũ và gridster không hề biết `x/y/cols/rows/layerIndex` vừa bị sửa. Bơm mỗi
|
|
233
|
+
* `version` thì computed chạy lại nhưng trả về CÙNG mảng cũ — lưới đứng im (đo 28/08/2026: bấm
|
|
234
|
+
* "Sắp gọn" cây đã dồn khít mà màn hình không nhúc nhích; bật chồng khối mà `$item.layerIndex`
|
|
235
|
+
* vẫn trống).
|
|
236
|
+
*
|
|
237
|
+
* Nhân bản NÔNG cả node gốc và danh sách con là đủ: mảng mới → `@for` dựng lại item, object con
|
|
238
|
+
* mới → gridster đọc lại toàn bộ toạ độ.
|
|
239
|
+
*/
|
|
240
|
+
refresh(event) {
|
|
241
|
+
const root = event?.root ?? this.rootNode();
|
|
242
|
+
if (!root) {
|
|
243
|
+
this.version.update((v) => v + 1);
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (this.config) {
|
|
247
|
+
this.config = { ...this.config, data: root };
|
|
248
|
+
}
|
|
249
|
+
this.rootNode.set(this.shallowCloneTree(root));
|
|
250
|
+
this.version.update((v) => v + 1);
|
|
251
|
+
}
|
|
252
|
+
/** Nhân bản nông theo cả chiều sâu: mỗi node và mảng `children` thành tham chiếu mới. */
|
|
253
|
+
/**
|
|
254
|
+
* Nhân bản SÂU cả cây — dùng cho `exportLayout()`.
|
|
255
|
+
*
|
|
256
|
+
* 🔴 BỎ `getComponentOutlet` khỏi bản sao: nó là một HÀM, không tuần tự hoá được nên gửi xuống
|
|
257
|
+
* backend là hỏng (`JSON.stringify` nuốt mất, `structuredClone` ném lỗi). Nạp lại thì hàm phân
|
|
258
|
+
* giải chung của cấu hình lo — component suy ra từ `data.type`, không cần lưu.
|
|
259
|
+
*/
|
|
260
|
+
deepCloneTree(node) {
|
|
261
|
+
const copy = { ...node };
|
|
262
|
+
// Cắt hàm phân giải — xem chú thích trên.
|
|
263
|
+
delete copy.getComponentOutlet;
|
|
264
|
+
const { children, data, ...rest } = copy;
|
|
265
|
+
return {
|
|
266
|
+
...rest,
|
|
267
|
+
...(data === undefined ? {} : { data: cloneDeep(data) }),
|
|
268
|
+
...(children ? { children: children.map((child) => this.deepCloneTree(child)) } : {}),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
shallowCloneTree(node) {
|
|
272
|
+
if (!node.children?.length) {
|
|
273
|
+
return { ...node };
|
|
274
|
+
}
|
|
275
|
+
return { ...node, children: node.children.map((child) => this.shallowCloneTree(child)) };
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Gán `layerIndex` khác nhau cho từng khối khi bật chồng khối.
|
|
279
|
+
*
|
|
280
|
+
* 🔴 `allowMultiLayer: true` MỘT MÌNH không cho khối đè nhau. Mã lib so `layerIndex` của hai khối:
|
|
281
|
+
* KHÁC nhau thì cho đè, GIỐNG nhau vẫn báo va chạm. Khối không khai `layerIndex` đều rơi về
|
|
282
|
+
* `defaultLayerIndex` — tức CÙNG lớp, nên kéo vào nhau là bị chặn y như lưới thường (người dùng
|
|
283
|
+
* báo 28/08/2026: "bật chồng khối nhưng khi kéo thì các khối vẫn di chuyển theo").
|
|
284
|
+
*
|
|
285
|
+
* Nơi dùng tự khai `layerIndex` thì giữ nguyên; ai không khai thì thư viện xếp mỗi khối một lớp
|
|
286
|
+
* theo thứ tự, đủ để mọi cặp đều khác lớp.
|
|
287
|
+
*/
|
|
288
|
+
assignOverlapLayers(root) {
|
|
289
|
+
const config = this.config;
|
|
290
|
+
const canOverlap = config?.mode === "free" /* E_gridLayout_mode_string.free */ || (config?.allowOverlap ?? false);
|
|
291
|
+
if (!canOverlap) {
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
let layer = 0;
|
|
295
|
+
const walk = (node) => {
|
|
296
|
+
for (const child of node.children ?? []) {
|
|
297
|
+
if (child.layerIndex === undefined) {
|
|
298
|
+
layer += 1;
|
|
299
|
+
child.layerIndex = layer;
|
|
300
|
+
}
|
|
301
|
+
walk(child);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
walk(root);
|
|
305
|
+
}
|
|
306
|
+
/** Đưa một khối lên trên tất cả: lớp của nó = lớp lớn nhất đang có + 1. */
|
|
307
|
+
raiseToTopLayer(item) {
|
|
308
|
+
const root = this.rootNode();
|
|
309
|
+
if (!root) {
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
let topLayer = 0;
|
|
313
|
+
const walk = (node) => {
|
|
314
|
+
for (const child of node.children ?? []) {
|
|
315
|
+
topLayer = Math.max(topLayer, child.layerIndex ?? 0);
|
|
316
|
+
walk(child);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
walk(root);
|
|
320
|
+
// `item` gridster trả về CHÍNH là object node của cây (truyền thẳng qua `[item]`), nên gán vào
|
|
321
|
+
// đây là cây cũng đổi theo.
|
|
322
|
+
const node = item;
|
|
323
|
+
if (node.layerIndex === topLayer) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
node.layerIndex = topLayer + 1;
|
|
327
|
+
}
|
|
328
|
+
// ─────────────────────────────────────────────────────────────────────────────────────────
|
|
329
|
+
// SỬA CÂY — thư viện đã giữ cây nên bạn KHÔNG phải truyền nó vào.
|
|
330
|
+
// Mọi hàm dưới đây tự vẽ lại; không cần gọi `refresh()`.
|
|
331
|
+
// ─────────────────────────────────────────────────────────────────────────────────────────
|
|
332
|
+
/**
|
|
333
|
+
* Thêm một khối.
|
|
334
|
+
*
|
|
335
|
+
* @param item khối mới — KHÔNG cần `id` (thư viện sinh) và `x`/`y` (tự đặt xuống hàng trống).
|
|
336
|
+
* @param parentId container muốn thêm vào; bỏ trống thì thêm vào mặt phẳng gốc.
|
|
337
|
+
* @returns khối vừa tạo (kèm `id` vừa sinh), hoặc `undefined` khi không tìm thấy container.
|
|
338
|
+
*/
|
|
339
|
+
addBlock(item, parentId) {
|
|
340
|
+
const root = this.rootNode();
|
|
341
|
+
const added = root ? this.treeService.addChild(root, parentId ?? root.id, item) : undefined;
|
|
342
|
+
if (added) {
|
|
343
|
+
this.refresh();
|
|
344
|
+
}
|
|
345
|
+
return added;
|
|
346
|
+
}
|
|
347
|
+
/** Xoá một khối. Xoá container là xoá cả ruột. Trả `false` khi không xoá được (vd khối gốc). */
|
|
348
|
+
removeBlock(id) {
|
|
349
|
+
const root = this.rootNode();
|
|
350
|
+
const done = root ? this.treeService.removeById(root, id) : false;
|
|
351
|
+
if (done) {
|
|
352
|
+
this.refresh();
|
|
353
|
+
}
|
|
354
|
+
return done;
|
|
355
|
+
}
|
|
356
|
+
/** Biến khối đơn thành CONTAINER — nội dung cũ thành khối con đầu tiên, không mất dữ liệu. */
|
|
357
|
+
toContainer(id) {
|
|
358
|
+
const root = this.rootNode();
|
|
359
|
+
const done = root ? this.treeService.toContainer(root, id, this.config?.cols ?? 12) : false;
|
|
360
|
+
if (done) {
|
|
361
|
+
this.refresh();
|
|
362
|
+
}
|
|
363
|
+
return done;
|
|
364
|
+
}
|
|
365
|
+
/** Đưa CONTAINER về khối đơn — khối con được nâng lên cấp trên, không bị xoá. */
|
|
366
|
+
toSingle(id) {
|
|
367
|
+
const root = this.rootNode();
|
|
368
|
+
const done = root ? this.treeService.toSingle(root, id) : false;
|
|
369
|
+
if (done) {
|
|
370
|
+
this.refresh();
|
|
371
|
+
}
|
|
372
|
+
return done;
|
|
373
|
+
}
|
|
374
|
+
/** Dồn khối khít lên trên, lấp hết chỗ trống. Đệ quy vào container. */
|
|
375
|
+
compact() {
|
|
376
|
+
const root = this.rootNode();
|
|
377
|
+
if (!root) {
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
this.treeService.compact(root, this.config?.cols ?? 12);
|
|
381
|
+
this.refresh();
|
|
382
|
+
}
|
|
383
|
+
/**
|
|
384
|
+
* Bố cục HIỆN TẠI, đã cắt mọi tham chiếu — gửi thẳng xuống backend được.
|
|
385
|
+
*
|
|
386
|
+
* Dùng khi bấm nút Lưu. Khác `Root()` ở chỗ đây là bản SAO: nơi dùng có sửa gì trên kết quả cũng
|
|
387
|
+
* không đụng tới cây mà thư viện đang vẽ.
|
|
388
|
+
*
|
|
389
|
+
* @returns `undefined` khi mặt phẳng chưa `init()`.
|
|
390
|
+
*/
|
|
391
|
+
exportLayout() {
|
|
392
|
+
const root = this.rootNode();
|
|
393
|
+
return root ? this.deepCloneTree(root) : undefined;
|
|
394
|
+
}
|
|
395
|
+
/** Tìm một khối theo id. */
|
|
396
|
+
findBlock(id) {
|
|
397
|
+
const root = this.rootNode();
|
|
398
|
+
return root ? this.treeService.findById(root, id) : undefined;
|
|
399
|
+
}
|
|
400
|
+
/** Tìm khối cha trực tiếp của một khối. */
|
|
401
|
+
findParentBlock(id) {
|
|
402
|
+
const root = this.rootNode();
|
|
403
|
+
return root ? this.treeService.findParent(root, id) : undefined;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Cổng DUY NHẤT cho canvas của thư viện. Nơi dùng KHÔNG gọi tới đây.
|
|
407
|
+
*
|
|
408
|
+
* Mọi thứ canvas cần đều là `private` để không lọt ra API công khai; gom vào một getter theo đúng
|
|
409
|
+
* khuôn `FunctionsControl` của bộ quy ước, thay vì để rải rác hàm public mà người ngoài tưởng
|
|
410
|
+
* mình phải gọi (người dùng chốt 28/08/2026).
|
|
411
|
+
*/
|
|
412
|
+
get FunctionsControl() {
|
|
413
|
+
return {
|
|
414
|
+
maxContainerDepth: () => this.maxContainerDepth(),
|
|
415
|
+
containerPadding: () => this.containerPadding(),
|
|
416
|
+
gridsterOptions: (depth, cb) => this.buildGridsterOptions(depth, cb),
|
|
417
|
+
attachNode: (node, depth, host) => this.attachNode(node, depth, host),
|
|
418
|
+
detachNode: (nodeId) => this.detachNode(nodeId),
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
applyInputs(ref, node, depth) {
|
|
422
|
+
ref.setInput('data', node.data);
|
|
423
|
+
ref.setInput('node', node);
|
|
424
|
+
ref.setInput('isEditMode', this.editMode());
|
|
425
|
+
ref.setInput('depth', depth);
|
|
426
|
+
}
|
|
427
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiGridLayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
428
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiGridLayoutService });
|
|
429
|
+
}
|
|
430
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiGridLayoutService, decorators: [{
|
|
431
|
+
type: Injectable
|
|
432
|
+
}], ctorParameters: () => [] });
|
|
433
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1sYXlvdXQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2dyaWQtbGF5b3V0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixVQUFVLEVBQUUsVUFBVSxFQUFvQixNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNoRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFTN0Q7Ozs7Ozs7Ozs7R0FVRztBQUVILE1BQU0sT0FBTyx1QkFBdUI7SUFDbEMsNkZBQTZGO0lBQzdGLHdGQUF3RjtJQUN4RixtRkFBbUY7SUFDbEUsV0FBVyxHQUFHLElBQUksMkJBQTJCLEVBQUUsQ0FBQztJQUNqRSxvRkFBb0Y7SUFDbkUsWUFBWSxHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO0lBRWhFO1FBQ0UsK0ZBQStGO1FBQy9GLHlGQUF5RjtRQUN6RiwrRkFBK0Y7UUFDL0YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRU8sTUFBTSxDQUF1QjtJQUNwQixhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWlDLENBQUM7SUFFekQsUUFBUSxHQUFHLE1BQU0sQ0FBZ0MsU0FBUyxDQUFDLENBQUM7SUFDNUQsUUFBUSxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNuRCxxRUFBcUU7SUFDcEQsT0FBTyxH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QixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMvQyxlQUFlLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBZSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN6RixVQUFVLEVBQUUsQ0FBQyxJQUF1QixFQUFFLEtBQWEsRUFBRSxJQUFzQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQ2xILFVBQVUsRUFBRSxDQUFDLE1BQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7U0FDeEQsQ0FBQztJQUNKLENBQUM7SUFFTyxXQUFXLENBQUMsR0FBMEIsRUFBRSxJQUF1QixFQUFFLEtBQWE7UUFDcEYsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNCLEdBQUcsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7d0dBbmZVLHVCQUF1Qjs0R0FBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQURuQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50UmVmLCBEZXN0cm95UmVmLCBJbmplY3RhYmxlLCBWaWV3Q29udGFpbmVyUmVmLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgR3JpZHN0ZXJDb25maWcsIEdyaWRzdGVySXRlbSB9IGZyb20gJ2dyaWRzdGVyMTgnO1xuaW1wb3J0IHsgY2xvbmVEZWVwIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBncmlkTGF5b3V0TmVzdGVkQ29uZmlnLCBncmlkTGF5b3V0Um9vdENvbmZpZyB9IGZyb20gJy4vZGVmaW5lcy9ncmlkc3Rlci1jb25maWcuZGVmaW5lJztcbmltcG9ydCB7IExpYnNVaUdyaWRMYXlvdXRUcmVlU2VydmljZSB9IGZyb20gJy4vdHJlZS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEVfZ3JpZExheW91dF9tb2RlX3N0cmluZyxcbiAgVF9ncmlkTGF5b3V0X2NoYW5nZUV2ZW50LFxuICBUX2dyaWRMYXlvdXRfbmV3Tm9kZSxcbiAgVF9ncmlkTGF5b3V0X2NvbmZpZyxcbiAgVF9ncmlkTGF5b3V0X25vZGUsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9ncmlkLWxheW91dC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEThu7FuZyBt4buZdCBt4bq3dCBwaOG6s25nIGvDqW8gdGjhuqMgdsOgIHThu7EgZ+G6r24gY29tcG9uZW50IGPhu6dhIG7GoWkgZMO5bmcgbMOqbiB04burbmcga2jhu5FpLlxuICpcbiAqIE7GoWkgZMO5bmcgY2jhu4kgY+G6p24gxJHGsGEgdsOgbzogbG/huqFpIGNvbXBvbmVudCBtdeG7kW4gZOG7sW5nXG4gKiAoYG5vZGVDb21wb25lbnRUeXBlYCkgdsOgIGPDonkgZOG7ryBsaeG7h3UgKGBkYXRhYCkuIFRvw6BuIGLhu5kgdmnhu4djIHbhur0gbMaw4bubaSwga8OpbyB0aOG6oywgxJHhu5VpIGvDrWNoIHRoxrDhu5tjLFxuICogbOG7k25nIGNvbnRhaW5lciB2w6AgZOG7jW4gZOG6uXAgZG8gdGjGsCB2aeG7h24gbG8uXG4gKlxuICog8J+UtCDEkMOieSBsw6Agc2VydmljZSB0aGVvIFThu6pORyBt4bq3dCBwaOG6s25nLCBLSMOUTkcgYHByb3ZpZGVkSW46ICdyb290J2AuIEtoYWkgdHJvbmcgYHByb3ZpZGVyc2AgY+G7p2FcbiAqIGNvbXBvbmVudCBkw7luZyBuw7M7IGhhaSBt4bq3dCBwaOG6s25nIHRyw6puIGPDuW5nIG3hu5l0IG3DoG4gcGjhuqNpIGzDoCBoYWkgdGjhu7FjIHRo4buDIHJpw6puZywgZMO5bmcgY2h1bmcgdGjDrFxuICogYGNvbXBvbmVudFJlZnNgIGPhu6dhIG3hurd0IHBo4bqzbmcgbsOgeSBi4buLIG3hurd0IHBo4bqzbmcga2lhIGThu41uIG3huqV0LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTGlic1VpR3JpZExheW91dFNlcnZpY2Uge1xuICAvLyDwn5S0IFThu7AgVOG6oE8sIGtow7RuZyBgaW5qZWN0YC4gTsahaSBkw7luZyBjaOG7iSBwaOG6o2kgdmnhur90IGBwcm92aWRlcnM6IFtMaWJzVWlHcmlkTGF5b3V0U2VydmljZV1gIOKAlFxuICAvLyBraMO0bmcgcGjhuqNpIGJp4bq/dCBiw6puIHRyb25nIHRoxrAgdmnhu4duIGPDsm4gc2VydmljZSBuw6BvIGtow6FjIChuZ8aw4budaSBkw7luZyBjaOG7kXQgMjgvMDgvMjAyNikuXG4gIC8vIGBUcmVlU2VydmljZWAga2jDtG5nIGdp4buvIHRy4bqhbmcgdGjDoWkgZMO5bmcgY2h1bmcgbsOqbiBt4buXaSBt4bq3dCBwaOG6s25nIG3hu5l0IGLhuqNuIGzDoCDEkcO6bmcuXG4gIHByaXZhdGUgcmVhZG9ubHkgdHJlZVNlcnZpY2UgPSBuZXcgTGlic1VpR3JpZExheW91dFRyZWVTZXJ2aWNlKCk7XG4gIC8qKiBMxrDhu6N0IHThuqNpIGNvbXBvbmVudCDEkWFuZyBjaOG7nSwgdGhlbyBpZCBraOG7kWkg4oCUIMSR4buDIGh14bu3IGtoaSBraOG7kWkgYuG7iyBn4buhIGdp4buvYSBjaOG7q25nLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmdMb2FkcyA9IG5ldyBNYXA8c3RyaW5nLCBTdWJzY3JpcHRpb24+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8g8J+UtCBTZXJ2aWNlIGtoYWkgdHJvbmcgYHByb3ZpZGVyc2AgY+G7p2EgY29tcG9uZW50IG7Dqm4gQW5ndWxhciBodeG7tyBuw7MgY8O5bmcgY29tcG9uZW50IOKAlCB0aMawIHZp4buHblxuICAgIC8vIHThu7EgZOG7jW4g4bufIMSRw6J5LCBuxqFpIGTDuW5nIEtIw5RORyBwaOG6o2kgZ+G7jWkgYGRlc3Ryb3koKWAgdHJvbmcgYG5nT25EZXN0cm95YCAobmfGsOG7nWkgZMO5bmcgY2jhu5F0XG4gICAgLy8gMjgvMDgvMjAyNikuIELhuq90IG5o4bubIG3hu5l0IGLGsOG7m2MgZOG7jW4gZOG6uXAgbMOgIGtp4buDdSBBUEkgZOG7hSBxdcOqbiwgdsOgIHF1w6puIHRow6wgcsOyIHLhu4kgYuG7mSBuaOG7myBpbSBs4bq3bmcuXG4gICAgaW5qZWN0KERlc3Ryb3lSZWYpLm9uRGVzdHJveSgoKSA9PiB0aGlzLmRlc3Ryb3koKSk7XG4gIH1cblxuICBwcml2YXRlIGNvbmZpZz86IFRfZ3JpZExheW91dF9jb25maWc7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29tcG9uZW50UmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnRSZWY8dW5rbm93bj4+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByb290Tm9kZSA9IHNpZ25hbDxUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlZGl0TW9kZSA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIC8qKiB0xINuZyBt4buXaSBs4bqnbiBjw6J5IMSR4buVaSDigJQgY29tcG9uZW50IGNvbiDEkeG7jWMgxJHhu4MgYmnhur90IHBo4bqjaSB0w61uaCBs4bqhaSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHZlcnNpb24gPSBzaWduYWw8bnVtYmVyPigwKTtcblxuICAvKipcbiAgICogU2lnbmFsIGNo4buJIMSR4buNYyDEkeG7gyBuxqFpIGTDuW5nIHRoZW8gZMO1aS5cbiAgICpcbiAgICog8J+UtCBMw6AgVEhV4buYQyBUw41OSCwga2jDtG5nIHBo4bqjaSBnZXR0ZXIuIEdldHRlciB0cuG6oyBzaWduYWwgdGjDrCBjaOG7lyDEkeG7jWMgcGjhuqNpIHZp4bq/dCBgVmVyc2lvbigpKClgIOKAlFxuICAgKiBxdcOqbiBj4bq3cCBuZ2/hurdjIHRo4bupIGhhaSBsw6AgY29tcHV0ZWQgS0jDlE5HIHBo4bulIHRodeG7mWMgdsOgbyBuw7MsIGPDonkgxJHhu5VpIG3DoCBsxrDhu5tpIMSR4bupbmcgaW0sIHbDoFxuICAgKiBUeXBlU2NyaXB0IGtow7RuZyBo4buBIGLDoW8gbOG7l2kgKMSRbyAyOC8wOC8yMDI2OiB0aMOqbSBraOG7kWkga2jDtG5nIGhp4buHbiwgc+G6r3AgZ+G7jW4ga2jDtG5nIG5ow7pjIG5ow61jaCkuXG4gICAqL1xuICByZWFkb25seSBSb290ID0gdGhpcy5yb290Tm9kZS5hc1JlYWRvbmx5KCk7XG4gIHJlYWRvbmx5IElzRWRpdE1vZGUgPSB0aGlzLmVkaXRNb2RlLmFzUmVhZG9ubHkoKTtcbiAgLyoqIHTEg25nIG3hu5dpIGzhuqduIGPDonkgaG/hurdjIGPhuqV1IGjDrG5oIMSR4buVaSAqL1xuICByZWFkb25seSBWZXJzaW9uID0gdGhpcy52ZXJzaW9uLmFzUmVhZG9ubHkoKTtcblxuICAvKipcbiAgICogdHLhuqduIHPhu5EgY+G6pXAgY29udGFpbmVyIGzhu5NuZyBuaGF1IOKAlCBjYW52YXMgxJHhu41jIMSR4buDIGJp4bq/dCBjw7MgY2hvIGNodXnhu4NuIHRow6BuaCBjb250YWluZXIga2jDtG5nICovXG4gIHByaXZhdGUgbWF4Q29udGFpbmVyRGVwdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc/Lm1heENvbnRhaW5lckRlcHRoID8/IDE7XG4gIH1cblxuICAvKipcbiAgICogbOG7gSB0cm9uZyBj4bunYSBjb250YWluZXIsIHB4IOKAlCBjYW52YXMgxJHhu41jIMSR4buDIMSR4bq3dCBwYWRkaW5nIGzDqm4gduG7jyBjb250YWluZXIgKi9cbiAgcHJpdmF0ZSBjb250YWluZXJQYWRkaW5nKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnPy5jb250YWluZXJQYWRkaW5nID8/IDEyO1xuICB9XG5cbiAgLyoqIEto4bufaSB04bqhbyBt4bq3dCBwaOG6s25nLiBH4buNaSBs4bqhaSBz4bq9IGThu41uIHPhuqFjaCBjb21wb25lbnQgY8WpIHLhu5NpIGThu7FuZyBs4bqhaSB04burIMSR4bqndS4gKi9cbiAgaW5pdChjb25maWc6IFRfZ3JpZExheW91dF9jb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmFzc2lnbk92ZXJsYXBMYXllcnMoY29uZmlnLmRhdGEpO1xuICAgIC8vIPCflLQgTmjDom4gYuG6o24gbmjGsCBgcmVmcmVzaCgpYDogYGluaXQoKWAgbOG6oWkgKMSR4buVaSBjaOG6vyDEkeG7mSwgYuG6rXQvdOG6r3QgY2jhu5NuZyBraOG7kWkpIHRyw6puIEPDmU5HIG9iamVjdCBjw6J5XG4gICAgLy8gdGjDrCBgQGZvcmAga2jDtG5nIGThu7FuZyBs4bqhaSBgZ3JpZHN0ZXItaXRlbWAsIG7Dqm4gYGxheWVySW5kZXhgIHbhu6thIGfDoW4ga2jDtG5nIHThu5tpIGAkaXRlbWAgdsOgIGto4buRaVxuICAgIC8vIHbhuqtuIGtow7RuZyDEkcOoIG5oYXUgxJHGsOG7o2MgKMSRbyAyOC8wOC8yMDI2OiBgaXRlbS5sYXllckluZGV4YCA9IDF8MnwzfDR8NyBtw6AgYCRpdGVtLmxheWVySW5kZXhgXG4gICAgLy8gdG/DoG4gYHVuZGVmaW5lZGApLlxuICAgIHRoaXMucm9vdE5vZGUuc2V0KHRoaXMuc2hhbGxvd0Nsb25lVHJlZShjb25maWcuZGF0YSkpO1xuICAgIHRoaXMuZWRpdE1vZGUuc2V0KGNvbmZpZy5pc0VkaXRNb2RlID8/IGZhbHNlKTtcbiAgICB0aGlzLnZlcnNpb24udXBkYXRlKCh2KSA9PiB2ICsgMSk7XG4gIH1cblxuICBzZXRFZGl0TW9kZSh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdE1vZGUuc2V0KHZhbHVlKTtcbiAgICAvLyDwn5S0IFBI4bqiSSBixqFtIGB2ZXJzaW9uYDogYGdyaWRzdGVyT3B0aW9ucygpYCDEkeG7jWMgYGVkaXRNb2RlYCDEkeG7gyBi4bqtdC904bqvdCBrw6lv4oCTdGjhuqMsIG3DoCBjb21wdXRlZFxuICAgIC8vIGBncmlkT3B0aW9uc2AgYsOqbiBjYW52YXMgY2jhu4kgY2jhuqF5IGzhuqFpIGtoaSBgVmVyc2lvbmAgxJHhu5VpLiBUaGnhur91IGTDsm5nIG7DoHkgdGjDrCDEkeG7lWkgY2jhur8gxJHhu5kgeG9uZ1xuICAgIC8vIGdyaWRzdGVyIHbhuqtuIGdp4buvIG9wdGlvbnMgY8WpIOKAlCBjaHV54buDbiBzYW5nIFhFTSBtw6Aga2jhu5FpIHbhuqtuIGvDqW8gxJHGsOG7o2MuXG4gICAgdGhpcy52ZXJzaW9uLnVwZGF0ZSgodikgPT4gdiArIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIELhuq10L3Thuq90IGNobyBraOG7kWkgY2jhu5NuZyBsw6puIG5oYXUg4oCUIEtIw5RORyBk4buxbmcgbOG6oWkgbeG6t3QgcGjhurNuZy5cbiAgICpcbiAgICogVHLGsOG7m2MgxJHDonkgbsahaSBkw7luZyBwaOG6o2kgZ+G7jWkgYGluaXQoKWAgbOG6oWkgxJHhu4MgxJHhu5VpIGPhu50gbsOgeSwgbcOgIGBpbml0KClgIGh14bu3IHPhuqFjaCBy4buTaSBk4buxbmcgbOG6oWkgbeG7jWlcbiAgICogY29tcG9uZW50IG7hu5lpIGR1bmcg4oCUIGzDo25nIHBow60sIHbDoCBuZ8aw4budaSBkw7luZyB0aOG6pXkgbcOgbiBjaOG7m3AgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2KS5cbiAgICovXG4gIHNldEFsbG93T3ZlcmxhcCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZyA9IHsgLi4udGhpcy5jb25maWcsIGFsbG93T3ZlcmxhcDogdmFsdWUgfTtcblxuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG5cbiAgICBpZiAoIXJvb3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDwn5S0IEfDoW4gbOG7m3AgdsOgbyBDw4JZIMSQQU5HIFbhurwgKGByb290Tm9kZWApLCBLSMOUTkcgcGjhuqNpIGBjb25maWcuZGF0YWAuXG4gICAgLy8gYGluaXQoKWAgxJHDoyBjbG9uZSBgY29uZmlnLmRhdGFgIHNhbmcgYHJvb3ROb2RlYCBuw6puIGhhaSBvYmplY3QgS0jDgUMgbmhhdTsgZ8OhbiB2w6BvIGBjb25maWcuZGF0YWBcbiAgICAvLyB0aMOsIGByZWZyZXNoKClgIGNsb25lIGzhuqFpIHThu6sgYHJvb3ROb2RlYCDigJQgbOG7m3AgduG7q2EgZ8OhbiBraMO0bmcgdOG7m2kgYGdyaWRzdGVyLWl0ZW1gIG7DoG8sIGB6LWluZGV4YFxuICAgIC8vIGPhu6dhIG3hu41pIGto4buRaSDEkeG7qW5nIOG7nyBgMWAgdsOgIGto4buRaSBuw6BvIHbhur0gc2F1IHRow6wgbuG6sW0gdHLDqm46IGNo4buTbmcga2jhu5FpIFwibMO6YyDEkcaw4bujYyBsw7pjIGtow7RuZ1wiXG4gICAgLy8gKMSRbyAwNC8wOS8yMDI2OiBgaXRlbS5sYXllckluZGV4YCB1bmRlZmluZWQsIGBnZXRMYXllckluZGV4KClgID0gMCBjaG8gY+G6oyA4IGto4buRaSkuXG4gICAgdGhpcy5hc3NpZ25PdmVybGFwTGF5ZXJzKHJvb3QpO1xuICAgIC8vIFRoYXkgdGhhbSBjaGnhur91IGPDonkgxJHhu4MgYGxheWVySW5kZXhgIHbhu6thIGfDoW4gdOG7m2kgxJHGsOG7o2MgYCRpdGVtYCBj4bunYSBncmlkc3RlcjsgY29tcG9uZW50IG7hu5lpIGR1bmdcbiAgICAvLyBLSMOUTkcgYuG7iyBk4buxbmcgbOG6oWkgdsOsIGBhdHRhY2hOb2RlYCBuaOG6rW4gcmEgaWQgY8WpIHbDoCBjaOG7iSBgc2V0SW5wdXRgLlxuICAgIHRoaXMucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEPhuqV1IGjDrG5oIGdyaWRzdGVyIGNobyBt4buZdCBj4bqlcCBsxrDhu5tpLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwdGggMCA9IGzGsOG7m2kgY+G6pXAgdHJhbmcsIOKJpSAxID0gbMaw4bubaSBs4buTbmcgdHJvbmcgY29udGFpbmVyXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkR3JpZHN0ZXJPcHRpb25zKGRlcHRoOiBudW1iZXIsIGl0ZW1DaGFuZ2VDYWxsYmFjaz86ICgpID0+IHZvaWQpOiBHcmlkc3RlckNvbmZpZyB7XG4gICAgY29uc3QgYmFzZSA9IGRlcHRoID09PSAwID8gZ3JpZExheW91dFJvb3RDb25maWcoKSA6IGdyaWRMYXlvdXROZXN0ZWRDb25maWcoKTtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcblxuICAgIGlmICghY29uZmlnKSB7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0ZyZWVNb2RlID0gY29uZmlnLm1vZGUgPT09IEVfZ3JpZExheW91dF9tb2RlX3N0cmluZy5mcmVlO1xuICAgIGNvbnN0IGNhbkVkaXQgPSB0aGlzLmVkaXRNb2RlKCk7XG4gICAgY29uc3QgY2FuT3ZlcmxhcCA9IGlzRnJlZU1vZGUgfHwgKGNvbmZpZy5hbGxvd092ZXJsYXAgPz8gZmFsc2UpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICAuLi4oY29uZmlnLmNvbHMgPyB7IG1pbkNvbHM6IGNvbmZpZy5jb2xzLCBtYXhDb2xzOiBjb25maWcuY29scywgbWF4SXRlbUNvbHM6IGNvbmZpZy5jb2xzIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLnJvd0hlaWdodCAmJiBkZXB0aCA9PT0gMCA/IHsgZml4ZWRSb3dIZWlnaHQ6IGNvbmZpZy5yb3dIZWlnaHQgfSA6IHt9KSxcbiAgICAgIC8vIEtoZSB2w6AgY2hp4buBdSBjYW8gaMOgbmcga2jDoWMgbmhhdSB0aGVvIGPhuqVwOiBsxrDhu5tpIHRyYW5nIHRob8OhbmcsIGzGsOG7m2kgbOG7k25nIGtow610LlxuICAgICAgLi4uKGRlcHRoID09PSAwICYmIGNvbmZpZy5tYXJnaW4gIT09IHVuZGVmaW5lZCA/IHsgbWFyZ2luOiBjb25maWcubWFyZ2luIH0gOiB7fSksXG4gICAgICAuLi4oZGVwdGggPiAwICYmIGNvbmZpZy5uZXN0ZWRNYXJnaW4gIT09IHVuZGVmaW5lZCA/IHsgbWFyZ2luOiBjb25maWcubmVzdGVkTWFyZ2luIH0gOiB7fSksXG4gICAgICAuLi4oZGVwdGggPiAwICYmIGNvbmZpZy5uZXN0ZWRSb3dIZWlnaHQgIT09IHVuZGVmaW5lZCA/IHsgZml4ZWRSb3dIZWlnaHQ6IGNvbmZpZy5uZXN0ZWRSb3dIZWlnaHQgfSA6IHt9KSxcbiAgICAgIC4uLihkZXB0aCA9PT0gMCAmJiBjb25maWcub3V0ZXJNYXJnaW4gIT09IHVuZGVmaW5lZCA/IHsgb3V0ZXJNYXJnaW46IGNvbmZpZy5vdXRlck1hcmdpbiB9IDoge30pLFxuICAgICAgLi4uKGRlcHRoID09PSAwICYmIGNvbmZpZy5vdXRlck1hcmdpbkJvdHRvbSAhPT0gdW5kZWZpbmVkID8geyBvdXRlck1hcmdpbkJvdHRvbTogY29uZmlnLm91dGVyTWFyZ2luQm90dG9tIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLm1pbkl0ZW1Sb3dzICE9PSB1bmRlZmluZWQgPyB7IG1pbkl0ZW1Sb3dzOiBjb25maWcubWluSXRlbVJvd3MgfSA6IHt9KSxcbiAgICAgIC4uLihjb25maWcuZGVmYXVsdEl0ZW1Db2xzICE9PSB1bmRlZmluZWQgPyB7IGRlZmF1bHRJdGVtQ29sczogY29uZmlnLmRlZmF1bHRJdGVtQ29scyB9IDoge30pLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SXRlbVJvd3MgIT09IHVuZGVmaW5lZCA/IHsgZGVmYXVsdEl0ZW1Sb3dzOiBjb25maWcuZGVmYXVsdEl0ZW1Sb3dzIH0gOiB7fSksXG5cbiAgICAgIC8vIPCflLQgQ2jhur8gxJHhu5kgWEVNIHBo4bqjaSBU4bquVCBo4bqzbiBrw6lvIHbDoCDEkeG7lWkga8OtY2ggdGjGsOG7m2MuXG4gICAgICAvLyBgYmFzZWAgbHXDtG4gxJHhu4MgYGVuYWJsZWQ6IHRydWVgOyBraMO0bmcgZ2hpIMSRw6ggdGhlbyBgZWRpdE1vZGVgIHRow6wgbmfGsOG7nWkgeGVtIHbhuqtuIGvDqW8gxJHGsOG7o2Mga2jhu5FpXG4gICAgICAvLyB2w6AgxJHhu5VpIGLhu5EgY+G7pWMgY+G7p2EgbmfGsOG7nWkga2jDoWMgKG5nxrDhu51pIGTDuW5nIGLDoW8gMjgvMDgvMjAyNjogXCLEkWFuZyB4ZW0gbcOgIHbhuqtuIGvDqW8gdGjhuqMgdGhheSDEkeG7lWlcbiAgICAgIC8vIHbhu4sgdHLDrSB2w6AgdGjDqm0ga2jhu5FpIMSRxrDhu6NjXCIpLlxuICAgICAgZHJhZ2dhYmxlOiB7IC4uLmJhc2UuZHJhZ2dhYmxlLCBlbmFibGVkOiBjYW5FZGl0IH0sXG4gICAgICByZXNpemFibGU6IHsgLi4uYmFzZS5yZXNpemFibGUsIGVuYWJsZWQ6IGNhbkVkaXQgfSxcblxuICAgICAgLy8gQ2jhur8gxJHhu5kgdOG7sSBkbyBMVcOUTiBjaG8gY2jhu5NuZzsgY2jhur8gxJHhu5kgbMaw4bubaSB0aMOsIHRoZW8gY+G7nSBj4bunYSBuxqFpIGTDuW5nLlxuICAgICAgYWxsb3dNdWx0aUxheWVyOiBjYW5PdmVybGFwLFxuICAgICAgLy8g8J+UtCBC4bqtdCBgYWxsb3dNdWx0aUxheWVyYCBN4buYVCBNw4xOSCBraMO0bmcgxJHhu6cuIE3DoyBsaWIgc28gYGxheWVySW5kZXhgIGPhu6dhIGhhaSBraOG7kWk6IEtIw4FDIG5oYXVcbiAgICAgIC8vIHRow6wgY2hvIMSRw6gsIEdJ4buQTkcgbmhhdSB24bqrbiBiw6FvIHZhIGNo4bqhbS4gS2jhu5FpIGtow7RuZyBraGFpIGBsYXllckluZGV4YCDEkeG7gXUgcsahaSB24buBXG4gICAgICAvLyBgZGVmYXVsdExheWVySW5kZXhgIOKAlCB04bupYyBjw7luZyBs4bubcCwgdsOgIHbhuqtuIGLhu4sgxJHhuql5IG5oYXUgbmjGsCBsxrDhu5tpIHRoxrDhu51uZyAobmfGsOG7nWkgZMO5bmcgYsOhb1xuICAgICAgLy8gMjgvMDgvMjAyNjogXCJi4bqtdCBjaOG7k25nIGto4buRaSBuaMawbmcga2hpIGvDqW8gdGjDrCBjw6FjIGto4buRaSB24bqrbiBkaSBjaHV54buDbiB0aGVvXCIpLlxuICAgICAgLy8gQ2hvIGNo4buTbmcgdGjDrCBwaOG6o2kgVOG6rlQgxJHhuql5IGto4buRaSwgbuG6v3Uga2jDtG5nIGto4buRaSBi4buLIGThuqF0IMSRaSB0csaw4bubYyBraGkga+G7i3AgxJHDqCBsw6puIG5oYXUuXG4gICAgICAuLi4oY2FuT3ZlcmxhcCA/IHsgcHVzaEl0ZW1zOiBmYWxzZSwgcHVzaFJlc2l6ZUl0ZW1zOiBmYWxzZSwgc3dhcDogZmFsc2UsIHN3YXBXaGlsZURyYWdnaW5nOiBmYWxzZSB9IDoge30pLFxuXG4gICAgICBpdGVtQ2hhbmdlQ2FsbGJhY2s6IChpdGVtOiBHcmlkc3Rlckl0ZW0pID0+IHtcbiAgICAgICAgLy8g8J+UtCBLaOG7kWkgduG7q2EgdGhhbyB0w6FjIHBo4bqjaSBsw6puIEzhu5pQIFRSw4pOIEPDmU5HLlxuICAgICAgICAvLyBgbGF5ZXJJbmRleGAgZ8OhbiBt4buZdCBs4bqnbiB0aGVvIHRo4bupIHThu7EgY8OieSBsw7pjIGto4bufaSB04bqhbywgbsOqbiBraOG7kWkga8OpbyBsw6puIGNo4buJIG7hu5VpIFRST05HIEzDmkNcbiAgICAgICAgLy8ga8OpbyAobmjhu50gYHotaW5kZXg6IDMwYCBj4bunYSBs4bubcCBgZ3JpZHN0ZXItaXRlbS1tb3ZpbmdgKTsgdGjhuqMgdGF5IHJhIGzDoCB24buBIGzhu5twIGPFqSB2w6AgYuG7iyBraOG7kWlcbiAgICAgICAgLy8gxJHhu6luZyBzYXUgdHJvbmcgY8OieSDEkcOoIG5nxrDhu6NjIGzDqm4gKG5nxrDhu51pIGTDuW5nIGLDoW8gMjgvMDgvMjAyNiwgxJFvIMSRxrDhu6NjOiBrw6lvIHo9MzAsIHRo4bqjIHbhu4FcbiAgICAgICAgLy8gej0xMCB0cm9uZyBraGkgaGFpIGto4buRaSBr4bq/IGLDqm4gxJFhbmcgej0xMSB2w6Agej0xMikuXG4gICAgICAgIGlmIChjYW5PdmVybGFwKSB7XG4gICAgICAgICAgdGhpcy5yYWlzZVRvVG9wTGF5ZXIoaXRlbSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnNpb24udXBkYXRlKCh2KSA9PiB2ICsgMSk7XG4gICAgICAgIGl0ZW1DaGFuZ2VDYWxsYmFjaz8uKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogR+G6r24gY29tcG9uZW50IGPhu6dhIG7GoWkgZMO5bmcgbMOqbiBt4buZdCBraOG7kWkuXG4gICAqXG4gICAqIEBwYXJhbSBob3N0IGNo4buXIGfhuq9uIFJJw4pORyBj4bunYSDDtCDEkcOzIOKAlCBt4buXaSBraOG7kWkgbeG7mXQgYFZpZXdDb250YWluZXJSZWZgLCBkw7luZyBjaHVuZyBt4buZdCBjw6FpIHRow6xcbiAgICogICBt4buNaSBjb21wb25lbnQgYuG7iyBk4buTbiBo4bq/dCB2w6BvIG3hu5l0IMO0LlxuICAgKi9cbiAgcHJpdmF0ZSBhdHRhY2hOb2RlKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlLCBkZXB0aDogbnVtYmVyLCBob3N0OiBWaWV3Q29udGFpbmVyUmVmKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG5cbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5jb21wb25lbnRSZWZzLmdldChub2RlLmlkKTtcblxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgdGhpcy5hcHBseUlucHV0cyhleGlzdGluZywgbm9kZSwgZGVwdGgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gS2jhu5FpIHThu7Ega2hhaSB0aMOsIGjhu49pIG7Dszsga2jDtG5nIHRow6wgaOG7j2kgaMOgbSBwaMOibiBnaeG6o2kgY2h1bmcuIEPhuqMgaGFpIMSR4buBdSBuaOG6rW4gYG5vZGVgIMSR4buDIMSR4buNY1xuICAgIC8vIMSRxrDhu6NjIGBkYXRhLnR5cGVgIG3DoCBxdXnhur90IMSR4buLbmggdHLhuqMgY29tcG9uZW50IG7DoG8uXG4gICAgY29uc3Qgc3RyZWFtID0gKG5vZGUuZ2V0Q29tcG9uZW50T3V0bGV0ID8/IGNvbmZpZy5nZXRDb21wb25lbnRPdXRsZXQpPy4obm9kZSk7XG5cbiAgICBpZiAoIXN0cmVhbSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIPCflLQgSHXhu7cgbMaw4bujdCB04bqjaSBDxaggY+G7p2EgxJHDum5nIGto4buRaSBuw6B5IHRyxrDhu5tjIGtoaSBt4bufIGzGsOG7o3QgbeG7m2kuXG4gICAgLy8gS2jhu5FpIGLhu4sgZ+G7oSBy4buTaSBn4bqvbiBs4bqhaSAoxJHhu5VpIGLhu5EgY+G7pWMsIHPhuq9wIGfhu41uKSB0cm9uZyBsw7pjIGBpbXBvcnQoKWAgY2jGsGEgeG9uZyB0aMOsIGzGsOG7o3QgY8WpIHbhuqtuXG4gICAgLy8gY2jhuqF5IHRp4bq/cCB2w6AgZOG7sW5nIGNvbXBvbmVudCB2w6BvIG3hu5l0IGBWaWV3Q29udGFpbmVyUmVmYCDEkcOjIGNo4bq/dC5cbiAgICB0aGlzLnBlbmRpbmdMb2Fkcy5nZXQobm9kZS5pZCk/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBzdWIgPSBzdHJlYW0ucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKGNvbXBvbmVudFR5cGUpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZ0xvYWRzLmRlbGV0ZShub2RlLmlkKTtcblxuICAgICAgLy8gS2jhu5FpIGPDsyB0aOG7gyDEkcOjIGLhu4sgeG/DoSB0cm9uZyBsw7pjIGNo4budIHThuqNpIOKAlCBk4buxbmcgdsOgbyDEkcOieSBsw6AgcsOyIHLhu4kuXG4gICAgICBpZiAoIXRoaXMudHJlZVNlcnZpY2UuZmluZEJ5SWQodGhpcy5yb290Tm9kZSgpID8/IG5vZGUsIG5vZGUuaWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVmID0gaG9zdC5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50VHlwZSk7XG5cbiAgICAgIHRoaXMuYXBwbHlJbnB1dHMocmVmLCBub2RlLCBkZXB0aCk7XG4gICAgICB0aGlzLmNvbXBvbmVudFJlZnMuc2V0KG5vZGUuaWQsIHJlZik7XG4gICAgfSk7XG5cbiAgICB0aGlzLnBlbmRpbmdMb2Fkcy5zZXQobm9kZS5pZCwgc3ViKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBH4buhIGNvbXBvbmVudCBj4bunYSBt4buZdCBraOG7kWkgdsOgIGh14bu3IG7Dsy4gKi9cbiAgcHJpdmF0ZSBkZXRhY2hOb2RlKG5vZGVJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gS2jhu5FpIGLhu4sgZ+G7oSBraGkgY29tcG9uZW50IGPhu6dhIG7DsyBjw7JuIMSRYW5nIHThuqNpIOKAlCBwaOG6o2kgaHXhu7cgbMaw4bujdCB04bqjaSwga2jDtG5nIHRow6wgbsOzIGThu7FuZyB2w6BvIG3hu5l0XG4gICAgLy8gYFZpZXdDb250YWluZXJSZWZgIMSRw6MgY2jhur90LlxuICAgIHRoaXMucGVuZGluZ0xvYWRzLmdldChub2RlSWQpPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGVuZGluZ0xvYWRzLmRlbGV0ZShub2RlSWQpO1xuXG4gICAgY29uc3QgcmVmID0gdGhpcy5jb21wb25lbnRSZWZzLmdldChub2RlSWQpO1xuXG4gICAgaWYgKCFyZWYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZWYuZGVzdHJveSgpO1xuICAgIHRoaXMuY29tcG9uZW50UmVmcy5kZWxldGUobm9kZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLnBlbmRpbmdMb2Fkcy52YWx1ZXMoKSkge1xuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZWYgb2YgdGhpcy5jb21wb25lbnRSZWZzLnZhbHVlcygpKSB7XG4gICAgICByZWYuZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0xvYWRzLmNsZWFyKCk7XG4gICAgdGhpcy5jb21wb25lbnRSZWZzLmNsZWFyKCk7XG4gICAgdGhpcy5jb25maWcgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gTmjDs20gaMOgbSBjaG8gbsahaSBkw7luZyBDSOG7piDEkOG7mE5HIGfhu41pIOKAlCBraMO0bmcgcGjhuqNpIGNo4budIG5nxrDhu51pIGTDuW5nIGLhuqVtIG7DunQgdHLDqm4ga2jhu5FpLlxuICAvLyBT4butYSBjw6J5IHRow6wgZMO5bmcgdGjhurNuZyBgVHJlZVNlcnZpY2VgIHLhu5NpIGfhu41pIGByZWZyZXNoKClgIOKAlCB4ZW0gZGVtbyB0cm9uZyBjb3JlLXVpLlxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQsOhbyBjaG8gc2VydmljZSBiaeG6v3QgY8OieSB24burYSDEkeG7lWkgdOG7qyBiw6puIG5nb8OgaSAodGjDqm0veG/DoSBraOG7kWksIHPhuq9wIGfhu41uLCBu4bqhcCBi4buRIGPhu6VjIGtow6FjKS5cbiAgICpcbiAgICog8J+UtCBQSOG6okkgdGhheSBUSEFNIENISeG6vlUgY+G7p2Egbm9kZSBn4buRYywga2jDtG5nIGNo4buJIGLGoW0gYHZlcnNpb25gLlxuICAgKiBgQGZvciDigKYgdHJhY2sgaXRlbS5pZGAgZ2nhu68gbmd1ecOqbiBvYmplY3Qga2hpIGlkIGtow7RuZyDEkeG7lWksIG7Dqm4gYDxncmlkc3Rlci1pdGVtIFtpdGVtXT1cIuKAplwiPmAgduG6q25cbiAgICogbmjhuq1uIMSRw7puZyBvYmplY3QgY8WpIHbDoCBncmlkc3RlciBraMO0bmcgaOG7gSBiaeG6v3QgYHgveS9jb2xzL3Jvd3MvbGF5ZXJJbmRleGAgduG7q2EgYuG7iyBz4butYS4gQsahbSBt4buXaVxuICAgKiBgdmVyc2lvbmAgdGjDrCBjb21wdXRlZCBjaOG6oXkgbOG6oWkgbmjGsG5nIHRy4bqjIHbhu4EgQ8OZTkcgbeG6o25nIGPFqSDigJQgbMaw4bubaSDEkeG7qW5nIGltICjEkW8gMjgvMDgvMjAyNjogYuG6pW1cbiAgICogXCJT4bqvcCBn4buNblwiIGPDonkgxJHDoyBk4buTbiBraMOtdCBtw6AgbcOgbiBow6xuaCBraMO0bmcgbmjDumMgbmjDrWNoOyBi4bqtdCBjaOG7k25nIGto4buRaSBtw6AgYCRpdGVtLmxheWVySW5kZXhgXG4gICAqIHbhuqtuIHRy4buRbmcpLlxuICAgKlxuICAgKiBOaMOibiBi4bqjbiBOw5RORyBj4bqjIG5vZGUgZ+G7kWMgdsOgIGRhbmggc8OhY2ggY29uIGzDoCDEkeG7pzogbeG6o25nIG3hu5tpIOKGkiBgQGZvcmAgZOG7sW5nIGzhuqFpIGl0ZW0sIG9iamVjdCBjb25cbiAgICogbeG7m2kg4oaSIGdyaWRzdGVyIMSR4buNYyBs4bqhaSB0b8OgbiBi4buZIHRv4bqhIMSR4buZLlxuICAgKi9cbiAgcmVmcmVzaChldmVudD86IFRfZ3JpZExheW91dF9jaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IHJvb3QgPSBldmVudD8ucm9vdCA/PyB0aGlzLnJvb3ROb2RlKCk7XG5cbiAgICBpZiAoIXJvb3QpIHtcbiAgICAgIHRoaXMudmVyc2lvbi51cGRhdGUoKHYpID0+IHYgKyAxKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5jb25maWcgPSB7IC4uLnRoaXMuY29uZmlnLCBkYXRhOiByb290IH07XG4gICAgfVxuXG4gICAgdGhpcy5yb290Tm9kZS5zZXQodGhpcy5zaGFsbG93Q2xvbmVUcmVlKHJvb3QpKTtcbiAgICB0aGlzLnZlcnNpb24udXBkYXRlKCh2KSA9PiB2ICsgMSk7XG4gIH1cblxuICAvKiogTmjDom4gYuG6o24gbsO0bmcgdGhlbyBj4bqjIGNoaeG7gXUgc8OidTogbeG7l2kgbm9kZSB2w6AgbeG6o25nIGBjaGlsZHJlbmAgdGjDoG5oIHRoYW0gY2hp4bq/dSBt4bubaS4gKi9cbiAgLyoqXG4gICAqIE5ow6JuIGLhuqNuIFPDglUgY+G6oyBjw6J5IOKAlCBkw7luZyBjaG8gYGV4cG9ydExheW91dCgpYC5cbiAgICpcbiAgICog8J+UtCBC4buOIGBnZXRDb21wb25lbnRPdXRsZXRgIGto4buPaSBi4bqjbiBzYW86IG7DsyBsw6AgbeG7mXQgSMOATSwga2jDtG5nIHR14bqnbiB04buxIGhvw6EgxJHGsOG7o2MgbsOqbiBn4butaSB4deG7kW5nXG4gICAqIGJhY2tlbmQgbMOgIGjhu49uZyAoYEpTT04uc3RyaW5naWZ5YCBudeG7kXQgbeG6pXQsIGBzdHJ1Y3R1cmVkQ2xvbmVgIG7DqW0gbOG7l2kpLiBO4bqhcCBs4bqhaSB0aMOsIGjDoG0gcGjDom5cbiAgICogZ2nhuqNpIGNodW5nIGPhu6dhIGPhuqV1IGjDrG5oIGxvIOKAlCBjb21wb25lbnQgc3V5IHJhIHThu6sgYGRhdGEudHlwZWAsIGtow7RuZyBj4bqnbiBsxrB1LlxuICAgKi9cbiAgcHJpdmF0ZSBkZWVwQ2xvbmVUcmVlKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKTogVF9ncmlkTGF5b3V0X25vZGUge1xuICAgIGNvbnN0IGNvcHk6IFRfZ3JpZExheW91dF9ub2RlID0geyAuLi5ub2RlIH07XG5cbiAgICAvLyBD4bqvdCBow6BtIHBow6JuIGdp4bqjaSDigJQgeGVtIGNow7ogdGjDrWNoIHRyw6puLlxuICAgIGRlbGV0ZSBjb3B5LmdldENvbXBvbmVudE91dGxldDtcblxuICAgIGNvbnN0IHsgY2hpbGRyZW4sIGRhdGEsIC4uLnJlc3QgfSA9IGNvcHk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdCxcbiAgICAgIC4uLihkYXRhID09PSB1bmRlZmluZWQgPyB7fSA6IHsgZGF0YTogY2xvbmVEZWVwKGRhdGEpIH0pLFxuICAgICAgLi4uKGNoaWxkcmVuID8geyBjaGlsZHJlbjogY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gdGhpcy5kZWVwQ2xvbmVUcmVlKGNoaWxkKSkgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzaGFsbG93Q2xvbmVUcmVlKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKTogVF9ncmlkTGF5b3V0X25vZGUge1xuICAgIGlmICghbm9kZS5jaGlsZHJlbj8ubGVuZ3RoKSB7XG4gICAgICByZXR1cm4geyAuLi5ub2RlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgLi4ubm9kZSwgY2hpbGRyZW46IG5vZGUuY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gdGhpcy5zaGFsbG93Q2xvbmVUcmVlKGNoaWxkKSkgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHw6FuIGBsYXllckluZGV4YCBraMOhYyBuaGF1IGNobyB04burbmcga2jhu5FpIGtoaSBi4bqtdCBjaOG7k25nIGto4buRaS5cbiAgICpcbiAgICog8J+UtCBgYWxsb3dNdWx0aUxheWVyOiB0cnVlYCBN4buYVCBNw4xOSCBraMO0bmcgY2hvIGto4buRaSDEkcOoIG5oYXUuIE3DoyBsaWIgc28gYGxheWVySW5kZXhgIGPhu6dhIGhhaSBraOG7kWk6XG4gICAqIEtIw4FDIG5oYXUgdGjDrCBjaG8gxJHDqCwgR0nhu5BORyBuaGF1IHbhuqtuIGLDoW8gdmEgY2jhuqFtLiBLaOG7kWkga2jDtG5nIGtoYWkgYGxheWVySW5kZXhgIMSR4buBdSByxqFpIHbhu4FcbiAgICogYGRlZmF1bHRMYXllckluZGV4YCDigJQgdOG7qWMgQ8OZTkcgbOG7m3AsIG7Dqm4ga8OpbyB2w6BvIG5oYXUgbMOgIGLhu4sgY2jhurduIHkgbmjGsCBsxrDhu5tpIHRoxrDhu51uZyAobmfGsOG7nWkgZMO5bmdcbiAgICogYsOhbyAyOC8wOC8yMDI2OiBcImLhuq10IGNo4buTbmcga2jhu5FpIG5oxrBuZyBraGkga8OpbyB0aMOsIGPDoWMga2jhu5FpIHbhuqtuIGRpIGNodXnhu4NuIHRoZW9cIikuXG4gICAqXG4gICAqIE7GoWkgZMO5bmcgdOG7sSBraGFpIGBsYXllckluZGV4YCB0aMOsIGdp4buvIG5ndXnDqm47IGFpIGtow7RuZyBraGFpIHRow6wgdGjGsCB2aeG7h24geOG6v3AgbeG7l2kga2jhu5FpIG3hu5l0IGzhu5twXG4gICAqIHRoZW8gdGjhu6kgdOG7sSwgxJHhu6cgxJHhu4MgbeG7jWkgY+G6t3AgxJHhu4F1IGtow6FjIGzhu5twLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3NpZ25PdmVybGFwTGF5ZXJzKHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgY2FuT3ZlcmxhcCA9IGNvbmZpZz8ubW9kZSA9PT0gRV9ncmlkTGF5b3V0X21vZGVfc3RyaW5nLmZyZWUgfHwgKGNvbmZpZz8uYWxsb3dPdmVybGFwID8/IGZhbHNlKTtcblxuICAgIGlmICghY2FuT3ZlcmxhcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBsYXllciA9IDA7XG4gICAgY29uc3Qgd2FsayA9IChub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSk6IHZvaWQgPT4ge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuID8/IFtdKSB7XG4gICAgICAgIGlmIChjaGlsZC5sYXllckluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBsYXllciArPSAxO1xuICAgICAgICAgIGNoaWxkLmxheWVySW5kZXggPSBsYXllcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHdhbGsoY2hpbGQpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3YWxrKHJvb3QpO1xuXG4gIH1cblxuICAvKiogxJDGsGEgbeG7mXQga2jhu5FpIGzDqm4gdHLDqm4gdOG6pXQgY+G6ozogbOG7m3AgY+G7p2EgbsOzID0gbOG7m3AgbOG7m24gbmjhuqV0IMSRYW5nIGPDsyArIDEuICovXG4gIHByaXZhdGUgcmFpc2VUb1RvcExheWVyKGl0ZW06IEdyaWRzdGVySXRlbSk6IHZvaWQge1xuICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3ROb2RlKCk7XG5cbiAgICBpZiAoIXJvb3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdG9wTGF5ZXIgPSAwO1xuICAgIGNvbnN0IHdhbGsgPSAobm9kZTogVF9ncmlkTGF5b3V0X25vZGUpOiB2b2lkID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbiA/PyBbXSkge1xuICAgICAgICB0b3BMYXllciA9IE1hdGgubWF4KHRvcExheWVyLCBjaGlsZC5sYXllckluZGV4ID8/IDApO1xuICAgICAgICB3YWxrKGNoaWxkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd2Fsayhyb290KTtcblxuICAgIC8vIGBpdGVtYCBncmlkc3RlciB0cuG6oyB24buBIENIw41OSCBsw6Agb2JqZWN0IG5vZGUgY+G7p2EgY8OieSAodHJ1eeG7gW4gdGjhurNuZyBxdWEgYFtpdGVtXWApLCBuw6puIGfDoW4gdsOgb1xuICAgIC8vIMSRw6J5IGzDoCBjw6J5IGPFqW5nIMSR4buVaSB0aGVvLlxuICAgIGNvbnN0IG5vZGUgPSBpdGVtIGFzIHVua25vd24gYXMgVF9ncmlkTGF5b3V0X25vZGU7XG5cbiAgICBpZiAobm9kZS5sYXllckluZGV4ID09PSB0b3BMYXllcikge1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5sYXllckluZGV4ID0gdG9wTGF5ZXIgKyAxO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFPhu6xBIEPDglkg4oCUIHRoxrAgdmnhu4duIMSRw6MgZ2nhu68gY8OieSBuw6puIGLhuqFuIEtIw5RORyBwaOG6o2kgdHJ1eeG7gW4gbsOzIHbDoG8uXG4gIC8vIE3hu41pIGjDoG0gZMaw4bubaSDEkcOieSB04buxIHbhur0gbOG6oWk7IGtow7RuZyBj4bqnbiBn4buNaSBgcmVmcmVzaCgpYC5cbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRow6ptIG3hu5l0IGto4buRaS5cbiAgICpcbiAgICogQHBhcmFtIGl0ZW0ga2jhu5FpIG3hu5tpIOKAlCBLSMOUTkcgY+G6p24gYGlkYCAodGjGsCB2aeG7h24gc2luaCkgdsOgIGB4YC9geWAgKHThu7EgxJHhurd0IHh14buRbmcgaMOgbmcgdHLhu5FuZykuXG4gICAqIEBwYXJhbSBwYXJlbnRJZCBjb250YWluZXIgbXXhu5FuIHRow6ptIHbDoG87IGLhu48gdHLhu5FuZyB0aMOsIHRow6ptIHbDoG8gbeG6t3QgcGjhurNuZyBn4buRYy5cbiAgICogQHJldHVybnMga2jhu5FpIHbhu6thIHThuqFvIChrw6htIGBpZGAgduG7q2Egc2luaCksIGhv4bq3YyBgdW5kZWZpbmVkYCBraGkga2jDtG5nIHTDrG0gdGjhuqV5IGNvbnRhaW5lci5cbiAgICovXG4gIGFkZEJsb2NrKGl0ZW06IFRfZ3JpZExheW91dF9uZXdOb2RlLCBwYXJlbnRJZD86IHN0cmluZyk6IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290Tm9kZSgpO1xuICAgIGNvbnN0IGFkZGVkID0gcm9vdCA/IHRoaXMudHJlZVNlcnZpY2UuYWRkQ2hpbGQocm9vdCwgcGFyZW50SWQgPz8gcm9vdC5pZCwgaXRlbSkgOiB1bmRlZmluZWQ7XG5cbiAgICBpZiAoYWRkZWQpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHJldHVybiBhZGRlZDtcbiAgfVxuXG4gIC8qKiBYb8OhIG3hu5l0IGto4buRaS4gWG/DoSBjb250YWluZXIgbMOgIHhvw6EgY+G6oyBydeG7mXQuIFRy4bqjIGBmYWxzZWAga2hpIGtow7RuZyB4b8OhIMSRxrDhu6NjICh2ZCBraOG7kWkgZ+G7kWMpLiAqL1xuICByZW1vdmVCbG9jayhpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcbiAgICBjb25zdCBkb25lID0gcm9vdCA/IHRoaXMudHJlZVNlcnZpY2UucmVtb3ZlQnlJZChyb290LCBpZCkgOiBmYWxzZTtcblxuICAgIGlmIChkb25lKSB7XG4gICAgICB0aGlzLnJlZnJlc2goKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG9uZTtcbiAgfVxuXG4gIC8qKiBCaeG6v24ga2jhu5FpIMSRxqFuIHRow6BuaCBDT05UQUlORVIg4oCUIG7hu5lpIGR1bmcgY8WpIHRow6BuaCBraOG7kWkgY29uIMSR4bqndSB0acOqbiwga2jDtG5nIG3huqV0IGThu68gbGnhu4d1LiAqL1xuICB0b0NvbnRhaW5lcihpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcbiAgICBjb25zdCBkb25lID0gcm9vdCA/IHRoaXMudHJlZVNlcnZpY2UudG9Db250YWluZXIocm9vdCwgaWQsIHRoaXMuY29uZmlnPy5jb2xzID8/IDEyKSA6IGZhbHNlO1xuXG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cblxuICAgIHJldHVybiBkb25lO1xuICB9XG5cbiAgLyoqIMSQxrBhIENPTlRBSU5FUiB24buBIGto4buRaSDEkcahbiDigJQga2jhu5FpIGNvbiDEkcaw4bujYyBuw6JuZyBsw6puIGPhuqVwIHRyw6puLCBraMO0bmcgYuG7iyB4b8OhLiAqL1xuICB0b1NpbmdsZShpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcbiAgICBjb25zdCBkb25lID0gcm9vdCA/IHRoaXMudHJlZVNlcnZpY2UudG9TaW5nbGUocm9vdCwgaWQpIDogZmFsc2U7XG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvbmU7XG4gIH1cblxuICAvKiogROG7k24ga2jhu5FpIGtow610IGzDqm4gdHLDqm4sIGzhuqVwIGjhur90IGNo4buXIHRy4buRbmcuIMSQ4buHIHF1eSB2w6BvIGNvbnRhaW5lci4gKi9cbiAgY29tcGFjdCgpOiB2b2lkIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290Tm9kZSgpO1xuXG4gICAgaWYgKCFyb290KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmVlU2VydmljZS5jb21wYWN0KHJvb3QsIHRoaXMuY29uZmlnPy5jb2xzID8/IDEyKTtcbiAgICB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBC4buRIGPhu6VjIEhJ4buGTiBU4bqgSSwgxJHDoyBj4bqvdCBt4buNaSB0aGFtIGNoaeG6v3Ug4oCUIGfhu61pIHRo4bqzbmcgeHXhu5FuZyBiYWNrZW5kIMSRxrDhu6NjLlxuICAgKlxuICAgKiBEw7luZyBraGkgYuG6pW0gbsO6dCBMxrB1LiBLaMOhYyBgUm9vdCgpYCDhu58gY2jhu5cgxJHDonkgbMOgIGLhuqNuIFNBTzogbsahaSBkw7luZyBjw7Mgc+G7rWEgZ8OsIHRyw6puIGvhur90IHF14bqjIGPFqW5nXG4gICAqIGtow7RuZyDEkeG7pW5nIHThu5tpIGPDonkgbcOgIHRoxrAgdmnhu4duIMSRYW5nIHbhur0uXG4gICAqXG4gICAqIEByZXR1cm5zIGB1bmRlZmluZWRgIGtoaSBt4bq3dCBwaOG6s25nIGNoxrBhIGBpbml0KClgLlxuICAgKi9cbiAgZXhwb3J0TGF5b3V0KCk6IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290Tm9kZSgpO1xuXG4gICAgcmV0dXJuIHJvb3QgPyB0aGlzLmRlZXBDbG9uZVRyZWUocm9vdCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVMOsbSBt4buZdCBraOG7kWkgdGhlbyBpZC4gKi9cbiAgZmluZEJsb2NrKGlkOiBzdHJpbmcpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdE5vZGUoKTtcblxuICAgIHJldHVybiByb290ID8gdGhpcy50cmVlU2VydmljZS5maW5kQnlJZChyb290LCBpZCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVMOsbSBraOG7kWkgY2hhIHRy4buxYyB0aeG6v3AgY+G7p2EgbeG7mXQga2jhu5FpLiAqL1xuICBmaW5kUGFyZW50QmxvY2soaWQ6IHN0cmluZyk6IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByb290ID0gdGhpcy5yb290Tm9kZSgpO1xuXG4gICAgcmV0dXJuIHJvb3QgPyB0aGlzLnRyZWVTZXJ2aWNlLmZpbmRQYXJlbnQocm9vdCwgaWQpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEPhu5VuZyBEVVkgTkjhuqRUIGNobyBjYW52YXMgY+G7p2EgdGjGsCB2aeG7h24uIE7GoWkgZMO5bmcgS0jDlE5HIGfhu41pIHThu5tpIMSRw6J5LlxuICAgKlxuICAgKiBN4buNaSB0aOG7qSBjYW52YXMgY+G6p24gxJHhu4F1IGzDoCBgcHJpdmF0ZWAgxJHhu4Mga2jDtG5nIGzhu410IHJhIEFQSSBjw7RuZyBraGFpOyBnb20gdsOgbyBt4buZdCBnZXR0ZXIgdGhlbyDEkcO6bmdcbiAgICoga2h1w7RuIGBGdW5jdGlvbnNDb250cm9sYCBj4bunYSBi4buZIHF1eSDGsOG7m2MsIHRoYXkgdsOsIMSR4buDIHLhuqNpIHLDoWMgaMOgbSBwdWJsaWMgbcOgIG5nxrDhu51pIG5nb8OgaSB0xrDhu59uZ1xuICAgKiBtw6xuaCBwaOG6o2kgZ+G7jWkgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2KS5cbiAgICovXG4gIGdldCBGdW5jdGlvbnNDb250cm9sKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtYXhDb250YWluZXJEZXB0aDogKCkgPT4gdGhpcy5tYXhDb250YWluZXJEZXB0aCgpLFxuICAgICAgY29udGFpbmVyUGFkZGluZzogKCkgPT4gdGhpcy5jb250YWluZXJQYWRkaW5nKCksXG4gICAgICBncmlkc3Rlck9wdGlvbnM6IChkZXB0aDogbnVtYmVyLCBjYj86ICgpID0+IHZvaWQpID0+IHRoaXMuYnVpbGRHcmlkc3Rlck9wdGlvbnMoZGVwdGgsIGNiKSxcbiAgICAgIGF0dGFjaE5vZGU6IChub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSwgZGVwdGg6IG51bWJlciwgaG9zdDogVmlld0NvbnRhaW5lclJlZikgPT4gdGhpcy5hdHRhY2hOb2RlKG5vZGUsIGRlcHRoLCBob3N0KSxcbiAgICAgIGRldGFjaE5vZGU6IChub2RlSWQ6IHN0cmluZykgPT4gdGhpcy5kZXRhY2hOb2RlKG5vZGVJZCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlJbnB1dHMocmVmOiBDb21wb25lbnRSZWY8dW5rbm93bj4sIG5vZGU6IFRfZ3JpZExheW91dF9ub2RlLCBkZXB0aDogbnVtYmVyKTogdm9pZCB7XG4gICAgcmVmLnNldElucHV0KCdkYXRhJywgbm9kZS5kYXRhKTtcbiAgICByZWYuc2V0SW5wdXQoJ25vZGUnLCBub2RlKTtcbiAgICByZWYuc2V0SW5wdXQoJ2lzRWRpdE1vZGUnLCB0aGlzLmVkaXRNb2RlKCkpO1xuICAgIHJlZi5zZXRJbnB1dCgnZGVwdGgnLCBkZXB0aCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Bề mặt CÔNG KHAI — chỉ những gì nơi dùng thật sự cần.
|
|
2
|
+
//
|
|
3
|
+
// `LibsUiGridLayoutTreeService` CỐ Ý không xuất: mọi thao tác trên cây đã có mặt trên
|
|
4
|
+
// `LibsUiGridLayoutService` với chữ ký gọn hơn (không phải truyền `root` — thư viện đang giữ nó).
|
|
5
|
+
// Cấu hình gridster cũng không xuất: nó đã được vá theo hàng chục lỗi đo trên sản phẩm thật, để nơi
|
|
6
|
+
// dùng sửa lại là mở đường cho chính những lỗi đó quay về.
|
|
7
|
+
export * from './grid-layout.service';
|
|
8
|
+
export * from './canvas/grid-layout-canvas.component';
|
|
9
|
+
export * from './interfaces/grid-layout.interface';
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL3NlcnZpY2VzL2dyaWQtbGF5b3V0L3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3REFBd0Q7QUFDeEQsRUFBRTtBQUNGLHNGQUFzRjtBQUN0RixrR0FBa0c7QUFDbEcsb0dBQW9HO0FBQ3BHLDJEQUEyRDtBQUMzRCxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyxvQ0FBb0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIELhu4EgbeG6t3QgQ8OUTkcgS0hBSSDigJQgY2jhu4kgbmjhu69uZyBnw6wgbsahaSBkw7luZyB0aOG6rXQgc+G7sSBj4bqnbi5cbi8vXG4vLyBgTGlic1VpR3JpZExheW91dFRyZWVTZXJ2aWNlYCBD4buQIMOdIGtow7RuZyB4deG6pXQ6IG3hu41pIHRoYW8gdMOhYyB0csOqbiBjw6J5IMSRw6MgY8OzIG3hurd0IHRyw6puXG4vLyBgTGlic1VpR3JpZExheW91dFNlcnZpY2VgIHbhu5tpIGNo4buvIGvDvSBn4buNbiBoxqFuIChraMO0bmcgcGjhuqNpIHRydXnhu4FuIGByb290YCDigJQgdGjGsCB2aeG7h24gxJFhbmcgZ2nhu68gbsOzKS5cbi8vIEPhuqV1IGjDrG5oIGdyaWRzdGVyIGPFqW5nIGtow7RuZyB4deG6pXQ6IG7DsyDEkcOjIMSRxrDhu6NjIHbDoSB0aGVvIGjDoG5nIGNo4bulYyBs4buXaSDEkW8gdHLDqm4gc+G6o24gcGjhuqltIHRo4bqtdCwgxJHhu4MgbsahaVxuLy8gZMO5bmcgc+G7rWEgbOG6oWkgbMOgIG3hu58gxJHGsOG7nW5nIGNobyBjaMOtbmggbmjhu69uZyBs4buXaSDEkcOzIHF1YXkgduG7gS5cbmV4cG9ydCAqIGZyb20gJy4vZ3JpZC1sYXlvdXQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhbnZhcy9ncmlkLWxheW91dC1jYW52YXMuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcy9ncmlkLWxheW91dC5pbnRlcmZhY2UnO1xuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC1sYXlvdXQuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9zZXJ2aWNlcy9ncmlkLWxheW91dC9zcmMvaW50ZXJmYWNlcy9ncmlkLWxheW91dC5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqIENo4bq/IMSR4buZIHPhuq9wIHjhur9wIGto4buRaSB0csOqbiBt4bq3dCBwaOG6s25nICovXG5leHBvcnQgY29uc3QgZW51bSBFX2dyaWRMYXlvdXRfbW9kZV9zdHJpbmcge1xuICAvKiogQsOhbSBsxrDhu5tpOiBraOG7kWkgdGjhurNuZyBow6BuZywgdOG7sSDEkeG6qXkgbmhhdSwgc+G6r3AgZ+G7jW4gxJHGsOG7o2MgKi9cbiAgZ3JpZCA9ICdncmlkJyxcbiAgLyoqIFThu7EgZG86IGto4buRaSDEkeG6t3Qg4bufIHRv4bqhIMSR4buZIGLhuqV0IGvhu7MsIGNo4buTbmcgbMOqbiBuaGF1IHRob+G6o2kgbcOhaSAqL1xuICBmcmVlID0gJ2ZyZWUnLFxufVxuXG4vKiogTeG7mXQga2jhu5FpIHRyw6puIG3hurd0IHBo4bqzbmcuIGBjaGlsZHJlbmAga2jDoWMgcuG7l25nIHRow6wga2jhu5FpIGzDoCBDT05UQUlORVIsIHJ14buZdCBuw7MgbMOgIG3hu5l0IGzGsOG7m2kgY29uLiAqL1xuZXhwb3J0IHR5cGUgVF9ncmlkTGF5b3V0X25vZGUgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBj4buZdCBi4bqvdCDEkeG6p3UgKGNo4bq/IMSR4buZIGzGsOG7m2kpIOKAlCBweCB0aGVvIHRy4bulYyBYIChjaOG6vyDEkeG7mSB04buxIGRvKSAqL1xuICB4OiBudW1iZXI7XG4gIC8qKiBow6BuZyBi4bqvdCDEkeG6p3UgKGNo4bq/IMSR4buZIGzGsOG7m2kpIOKAlCBweCB0aGVvIHRy4bulYyBZIChjaOG6vyDEkeG7mSB04buxIGRvKSAqL1xuICB5OiBudW1iZXI7XG4gIC8qKiBz4buRIGPhu5l0IGNoaeG6v20gKGNo4bq/IMSR4buZIGzGsOG7m2kpIOKAlCBweCBjaGnhu4F1IHLhu5luZyAoY2jhur8gxJHhu5kgdOG7sSBkbykgKi9cbiAgY29sczogbnVtYmVyO1xuICAvKiogc+G7kSBow6BuZyBjaGnhur9tIChjaOG6vyDEkeG7mSBsxrDhu5tpKSDigJQgcHggY2hp4buBdSBjYW8gKGNo4bq/IMSR4buZIHThu7EgZG8pICovXG4gIHJvd3M6IG51bWJlcjtcbiAgLyoqXG4gICAqIEzhu5twIGNo4buTbmcuIEhhaSBraOG7kWkgQ0jhu5JORyBuaGF1IMSRxrDhu6NjIGtoaSBraMOhYyBgbGF5ZXJJbmRleGAgdsOgIGBhbGxvd092ZXJsYXBgIGLhuq10LlxuICAgKiBC4buPIHRy4buRbmcgdGjDrCBt4buNaSBraOG7kWkgY8O5bmcgbOG7m3AgMCDigJQgY2jhu5NuZyBuaGF1IGLhu4sgY2jhurduIG5oxrAgbMaw4bubaSB0aMaw4budbmcuXG4gICAqL1xuICBsYXllckluZGV4PzogbnVtYmVyO1xuICAvKioga2jhu5FpIGNvbjsga2jDoWMgcuG7l25nIHRow6wgxJHDonkgbMOgIGNvbnRhaW5lciAqL1xuICBjaGlsZHJlbj86IEFycmF5PFRfZ3JpZExheW91dF9ub2RlPjtcbiAgLyoqXG4gICAqIENvbXBvbmVudCB24bq9IFJJw4pORyBjaG8ga2jhu5FpIG7DoHksIHRy4bqjIHbhu4EgZOG6oW5nIE9ic2VydmFibGUgxJHhu4MgTEFaWSBMT0FEIHRo4bqtdCBz4buxLlxuICAgKiBC4buPIHRy4buRbmcgdGjDrCBt4bq3dCBwaOG6s25nIGjhu49pIGBnZXRDb21wb25lbnRPdXRsZXRgIGNodW5nIGPhu6dhIGPhuqV1IGjDrG5oLlxuICAgKlxuICAgKiBgYGB0c1xuICAgKiBnZXRDb21wb25lbnRPdXRsZXQ6IChub2RlKSA9PiBmcm9tKGltcG9ydCgnLi9jaGFydC1jYXJkLmNvbXBvbmVudCcpLnRoZW4oKGMpID0+IGMuQ2hhcnRDYXJkQ29tcG9uZW50KSlcbiAgICogYGBgXG4gICAqL1xuICBnZXRDb21wb25lbnRPdXRsZXQ/OiAobm9kZTogVF9ncmlkTGF5b3V0X25vZGUpID0+IE9ic2VydmFibGU8VHlwZTx1bmtub3duPj47XG4gIC8qKiBk4buvIGxp4buHdSByacOqbmcgY+G7p2EgbsahaSBkw7luZyDigJQgdGjGsCB2aeG7h24gS0jDlE5HIMSR4buNYywgY2h1eeG7g24gbmd1ecOqbiB2w6BvIGlucHV0IGBkYXRhYCBj4bunYSBjb21wb25lbnQgKi9cbiAgZGF0YT86IHVua25vd247XG59O1xuXG4vKipcbiAqIMSQaSBrw6htIHPhu7Ega2nhu4duIGPhu6dhIG3hu5l0IE7DmlQgYnVpbHQtaW4gdHLDqm4ga2jhu5FpLlxuICpcbiAqIFRoxrAgdmnhu4duIENIxq9BIGzDoG0gZ8OsIGtoaSBi4bqvbiDigJQgbsOzIGNo4buJIGLDoW8gXCJuZ8aw4budaSBkw7luZyB24burYSBi4bqlbSBuw7p0IG7DoHlcIi4gTsahaSBkw7luZyBxdXnhur90IMSR4buLbmg6XG4gKiAtIGPhuqduIGjhu49pIHRyxrDhu5tjIChtb2RhbCB4w6FjIG5o4bqtbiwgZ+G7jWkgQVBJIGtp4buDbSB0cmEpIOKGkiBo4buPaSB4b25nIHLhu5NpIGfhu41pIGBjb25maXJtKClgO1xuICogLSBraMO0bmcgY+G6p24gaOG7j2kg4oaSIGfhu41pIGBjb25maXJtKClgIG5nYXk7XG4gKiAtIGtow7RuZyBjaG8gcGjDqXAg4oaSIGtow7RuZyBn4buNaSBnw6wgY+G6oy5cbiAqXG4gKiBgYGB0c1xuICogcHJvdGVjdGVkIGhhbmRsZXJSZW1vdmUoZXZlbnQ6IFRfZ3JpZExheW91dF9hY3Rpb25FdmVudCk6IHZvaWQge1xuICogICB0aGlzLmRpYWxvZy5jb25maXJtKCdYb8OhIGto4buRaSBuw6B5PycpLnN1YnNjcmliZSgoZG9uZ1kpID0+IGRvbmdZICYmIGV2ZW50LmNvbmZpcm0oKSk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgVF9ncmlkTGF5b3V0X2FjdGlvbkV2ZW50ID0ge1xuICAvKioga2jhu5FpIG5nxrDhu51pIGTDuW5nIHbhu6thIGLhuqVtIG7DunQgKi9cbiAgbm9kZUlkOiBzdHJpbmc7XG4gIC8qKiBraOG7kWkgxJHDsywga2hpIGLhuqFuIGPhuqduIMSR4buNYyBgZGF0YWAgxJHhu4MgcXV54bq/dCDEkeG7i25oICh2ZCBraOG7kWkgxJFhbmcgY8OzIGThu68gbGnhu4d1IHRow6wgbeG7m2kgaOG7j2kpICovXG4gIG5vZGU6IFRfZ3JpZExheW91dF9ub2RlO1xuICAvKipcbiAgICogR+G7jWkgxJHhu4MgdGjGsCB2aeG7h24gdGjhu7FjIGhp4buHbiB0aGFvIHTDoWMuIEtow7RuZyBn4buNaSA9IGtow7RuZyBsw6BtIGfDrC5cbiAgICpcbiAgICogQHJldHVybnMgYGZhbHNlYCBraGkgdGhhbyB0w6FjIGtow7RuZyB0aOG7sWMgaGnhu4duIMSRxrDhu6NjIChraOG7kWkgxJHDoyBi4buLIHhvw6EsIGNo4bqhbSB0cuG6p24gbOG7k25nIGPhuqVw4oCmKS5cbiAgICovXG4gIGNvbmZpcm06ICgpID0+IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIEto4buRaSBN4buaSSB0cnV54buBbiB2w6BvIGBhZGRDaGlsZGAuIEtow6FjIGBUX2dyaWRMYXlvdXRfbm9kZWAg4bufIGJhIGNo4buXIGRvIHRoxrAgdmnhu4duIHThu7EgbG86XG4gKiAtIGBpZGAgdOG7sSBzaW5oIChtw6MgbcOheSBkw7luZyDEkeG7gyB0cmEgY+G7qXUsIGtow7RuZyBwaOG6o2kgdGjhu6kgbmfGsOG7nWkgZMO5bmcgbmdoxKkgcmEpLFxuICogLSBgeGAgwrcgYHlgIHThu7EgxJHhurd0IHh14buRbmcgaMOgbmcgdHLhu5FuZyBr4bq/IHRp4bq/cC5cbiAqL1xuZXhwb3J0IHR5cGUgVF9ncmlkTGF5b3V0X25ld05vZGUgPSBPbWl0PFRfZ3JpZExheW91dF9ub2RlLCAnaWQnIHwgJ3gnIHwgJ3knPiAmIHtcbiAgLyoqIMSR4buDIHRy4buRbmcgdGjDrCB0aMawIHZp4buHbiBzaW5oOyBjaOG7iSB0cnV54buBbiBraGkgYuG6oW4gQ+G6pk4gbeG7mXQgaWQgY+G7kSDEkeG7i25oICh2ZCBraMO0aSBwaOG7pWMgdOG7qyBi4bqjbiBsxrB1KSAqL1xuICBpZD86IHN0cmluZztcbiAgeD86IG51bWJlcjtcbiAgeT86IG51bWJlcjtcbn07XG5cbi8qKlxuICogxJBpIGvDqG0gc+G7sSBraeG7h24gYuG6pW0gbsO6dCBUSMOKTSB0csOqbiBt4buZdCBjb250YWluZXIuXG4gKlxuICogS2jDoWMgYFRfZ3JpZExheW91dF9hY3Rpb25FdmVudGAg4bufIGNo4buXIGBjb25maXJtYCBuaOG6rW4ga2jhu5FpIG114buRbiB0aMOqbTogdGjGsCB2aeG7h24ga2jDtG5nIGJp4bq/dCBz4bqjbiBwaOG6qW1cbiAqIGPhu6dhIGLhuqFuIGPDsyBuaOG7r25nIGxv4bqhaSBraOG7kWkgbsOgbywgbsOqbiBi4bqhbiBt4bufIG1lbnUgY2jhu41uIGxv4bqhaSBy4buTaSB0cnV54buBbiBraOG7kWkgxJHDoyBk4buxbmcgdsOgbyDEkcOieS5cbiAqL1xuZXhwb3J0IHR5cGUgVF9ncmlkTGF5b3V0X2FkZEV2ZW50ID0ge1xuICAvKiogY29udGFpbmVyIG5nxrDhu51pIGTDuW5nIG114buRbiB0aMOqbSBraOG7kWkgdsOgbyAqL1xuICBub2RlSWQ6IHN0cmluZztcbiAgbm9kZTogVF9ncmlkTGF5b3V0X25vZGU7XG4gIC8qKiBAcmV0dXJucyBraOG7kWkgduG7q2EgdOG6oW8gKGvDqG0gYGlkYCB0aMawIHZp4buHbiBzaW5oKSwgaG/hurdjIGB1bmRlZmluZWRgIG7hur91IGtow7RuZyB0aMOqbSDEkcaw4bujYyAqL1xuICBjb25maXJtOiAoaXRlbTogVF9ncmlkTGF5b3V0X25ld05vZGUpID0+IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiDEkOG6p3UgdsOgbyBtw6AgdGjGsCB2aeG7h24gdHJ1eeG7gW4gY2hvIGNvbXBvbmVudCBj4bunYSBuxqFpIGTDuW5nLlxuICogQ29tcG9uZW50IELhuq5UIEJV4buYQyBraGFpIMSR4bunIGJhIGlucHV0IG7DoHkgKGTDuW5nIGBpbnB1dCgpYCksIHRoaeG6v3UgY8OhaSBuw6BvIHRow6wgYHNldElucHV0YCBuw6ltIGzhu5dpLlxuICovXG5leHBvcnQgdHlwZSBUX2dyaWRMYXlvdXRfbm9kZUlucHV0czxURGF0YSA9IHVua25vd24+ID0ge1xuICAvKiogxJHDum5nIGBub2RlLmRhdGFgIGPhu6dhIGto4buRaSDigJQgdGjhu6kgbsahaSBkw7luZyBj4bqnbiBuaOG6pXQsIG7Dqm4gxJHhu4MgxJHhuqd1ICovXG4gIGRhdGE6IFREYXRhO1xuICAvKiogY+G6oyBraOG7kWksIGtoaSBj4bqnbiBiaeG6v3QgaWQgwrcga8OtY2ggdGjGsOG7m2MgwrcgY8OzIHBo4bqjaSBjb250YWluZXIga2jDtG5nICovXG4gIG5vZGU6IFRfZ3JpZExheW91dF9ub2RlO1xuICAvKiogxJFhbmcg4bufIGNo4bq/IMSR4buZIHPhu61hIGhheSBjaOG7iSB4ZW0gKi9cbiAgaXNFZGl0TW9kZTogYm9vbGVhbjtcbiAgLyoqIMSR4buZIHPDonU6IDAgPSBn4buRYywgMSA9IGto4buRaSBj4bqlcCB0cmFuZywgMiA9IGto4buRaSB0cm9uZyBjb250YWluZXIgKi9cbiAgZGVwdGg6IG51bWJlcjtcbn07XG5cbi8qKiBD4bqldSBow6xuaCBraOG7n2kgdOG6oW8gbeG7mXQgbeG6t3QgcGjhurNuZyBrw6lvIHRo4bqjICovXG5leHBvcnQgdHlwZSBUX2dyaWRMYXlvdXRfY29uZmlnID0ge1xuICAvKipcbiAgICogSMOgbSBQSMOCTiBHSeG6okkgY29tcG9uZW50IGNobyBt4buZdCBraOG7kWkg4oCUIGNo4buXIGLhuqFuIG1hcCB04burIGThu68gbGnhu4d1IHNlcnZlciBzYW5nIGdpYW8gZGnhu4duLlxuICAgKlxuICAgKiBN4bq3dCBwaOG6s25nIGfhu41pIGjDoG0gbsOgeSBjaG8gTeG7lkkga2jhu5FpIGtow7RuZyB04buxIGtoYWkgYGdldENvbXBvbmVudE91dGxldGAuIFRy4bqjIGBPYnNlcnZhYmxlYCBuw6puXG4gICAqIGBpbXBvcnQoKWAgxJHhu5luZyBjaOG6oXkgxJHGsOG7o2M6IGLDsyBtw6MgY+G7p2EgdOG7q25nIGxv4bqhaSBraOG7kWkgY2jhu4kgdOG6o2kga2hpIG3DoG4gdGjhuq10IHPhu7EgY8OzIGto4buRaSBsb+G6oWkgxJHDsy5cbiAgICpcbiAgICogYGBgdHNcbiAgICogZ2V0Q29tcG9uZW50T3V0bGV0OiAobm9kZSkgPT4ge1xuICAgKiAgIGNvbnN0IHsgdHlwZSB9ID0gbm9kZS5kYXRhIGFzIHsgdHlwZTogc3RyaW5nIH07XG4gICAqXG4gICAqICAgaWYgKHR5cGUgPT09ICdjaGFydCcpIHtcbiAgICogICAgIHJldHVybiBmcm9tKGltcG9ydCgnLi9jaGFydC1jYXJkLmNvbXBvbmVudCcpLnRoZW4oKGMpID0+IGMuQ2hhcnRDYXJkQ29tcG9uZW50KSk7XG4gICAqICAgfVxuICAgKlxuICAgKiAgIHJldHVybiBmcm9tKGltcG9ydCgnLi90ZXh0LWNhcmQuY29tcG9uZW50JykudGhlbigoYykgPT4gYy5UZXh0Q2FyZENvbXBvbmVudCkpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q29tcG9uZW50T3V0bGV0PzogKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKSA9PiBPYnNlcnZhYmxlPFR5cGU8dW5rbm93bj4+O1xuICAvKiogY8OieSBraOG7kWkgYmFuIMSR4bqndSAqL1xuICBkYXRhOiBUX2dyaWRMYXlvdXRfbm9kZTtcbiAgbW9kZT86IEVfZ3JpZExheW91dF9tb2RlX3N0cmluZztcbiAgaXNFZGl0TW9kZT86IGJvb2xlYW47XG4gIC8qKiBz4buRIGPhu5l0IGPhu6dhIGzGsOG7m2kgKGNo4bq/IMSR4buZIGzGsOG7m2kpLiBN4bq3YyDEkeG7i25oIDEyICovXG4gIGNvbHM/OiBudW1iZXI7XG4gIC8qKiBjaGnhu4F1IGNhbyBt4buZdCBow6BuZywgcHggKGNo4bq/IMSR4buZIGzGsOG7m2kpLiBN4bq3YyDEkeG7i25oIDU2ICovXG4gIHJvd0hlaWdodD86IG51bWJlcjtcbiAgLyoqIGtoZSBnaeG7r2EgaGFpIGto4buRaSDhu58gbMaw4bubaSBD4bqkUCBUUkFORywgcHguIE3hurdjIMSR4buLbmggMTIgKi9cbiAgbWFyZ2luPzogbnVtYmVyO1xuICAvKioga2hlIGdp4buvYSBoYWkga2jhu5FpIGLDqm4gVFJPTkcgY29udGFpbmVyLCBweC4gTeG6t2MgxJHhu4tuaCAyIOKAlCBraOG7kWkgY29uIGzDoCBkw7JuZyB0aMO0bmcgdGluIGPhu6dhIGPDuW5nXG4gICAqICBt4buZdCBjYXJkLCBraGUgcuG7mW5nIGzDoG0gY2jDum5nIHRyw7RuZyBuaMawIGNhcmQgcuG7nWkgbmhhdSAqL1xuICBuZXN0ZWRNYXJnaW4/OiBudW1iZXI7XG4gIC8qKiBjaGnhu4F1IGNhbyBt4buZdCBow6BuZyBiw6puIFRST05HIGNvbnRhaW5lciwgcHguIE3hurdjIMSR4buLbmggMTYg4oCUIGjDoG5nIG5o4buPIGNobyBixrDhu5tjIGvDqW8gbeG7i24gKi9cbiAgbmVzdGVkUm93SGVpZ2h0PzogbnVtYmVyO1xuICAvKipcbiAgICogTOG7gSB0cm9uZyBj4bunYSBDT05UQUlORVIsIHB4IOKAlCDDoXAgxJHhu4F1IGLhu5FuIGNoaeG7gXUuIE3hurdjIMSR4buLbmggMTIuXG4gICAqXG4gICAqIENo4buJIGNvbnRhaW5lciBjw7MgbOG7gSBuw6B5OyBraOG7kWkgxJHGoW4ga2jDtG5nIGPDsywgdsOsIG7DsyBraMO0bmcgY2jhu6lhIGfDrCBiw6puIHRyb25nLlxuICAgKlxuICAgKiDwn5S0IEtIw5RORyBuw6puIMSR4buDIDA6IHRheSBj4bqnbSDEkeG7lWkga8OtY2ggdGjGsOG7m2MgY+G7p2Ega2jhu5FpIGNvbiBu4bqxbSBzw6F0IGJpw6puIGNvbnRhaW5lciwga2jDtG5nIGNo4burYSBs4buBXG4gICAqIHRow6wgY2h14buZdCBraMO0bmcgdHLDum5nIMSRxrDhu6NjIG7DsyB2w6Aga2jhu5FpIGNvbiBt4bqldCBsdcO0biBraOG6oyBuxINuZyByZXNpemUuXG4gICAqL1xuICBjb250YWluZXJQYWRkaW5nPzogbnVtYmVyO1xuICAvKiogdmnhu4FuIG5nb8OgaSBxdWFuaCBsxrDhu5tpIGPhuqVwIHRyYW5nLiBN4bq3YyDEkeG7i25oIGLhuq10ICovXG4gIG91dGVyTWFyZ2luPzogYm9vbGVhbjtcbiAgLyoqIGNo4burYSB0aMOqbSBiYW8gbmhpw6p1IHB4IGTGsOG7m2kgxJHDoXkgbMaw4bubaSBj4bqlcCB0cmFuZy4gTeG6t2MgxJHhu4tuaCA0MCAqL1xuICBvdXRlck1hcmdpbkJvdHRvbT86IG51bWJlcjtcbiAgLyoqIHPhu5EgaMOgbmcgdOG7kWkgdGhp4buDdSBt4buZdCBraOG7kWkgxJHGsOG7o2MgY28gbOG6oWkuIE3hurdjIMSR4buLbmggMiAqL1xuICBtaW5JdGVtUm93cz86IG51bWJlcjtcbiAgLyoqIGvDrWNoIHRoxrDhu5tjIG3hurdjIMSR4buLbmggY+G7p2Ega2jhu5FpIG3hu5tpLCB0w61uaCB0aGVvIMO0IGzGsOG7m2kuIE3hurdjIMSR4buLbmggMyBj4buZdCDDlyAyIGjDoG5nICovXG4gIGRlZmF1bHRJdGVtQ29scz86IG51bWJlcjtcbiAgZGVmYXVsdEl0ZW1Sb3dzPzogbnVtYmVyO1xuICAvKipcbiAgICogQ2hvIHBow6lwIGhhaSBraOG7kWkgS0jDgUMgYGxheWVySW5kZXhgIG7hurFtIGNo4buTbmcgbmhhdS5cbiAgICogQ2jhur8gxJHhu5kgYHR1RG9gIGx1w7RuIGLhuq10LCBraMO0bmcgxJHhu41jIGPhu50gbsOgeS5cbiAgICovXG4gIGFsbG93T3ZlcmxhcD86IGJvb2xlYW47XG4gIC8qKiB0cuG6p24gc+G7kSBj4bqlcCBjb250YWluZXIgbOG7k25nIG5oYXUuIE3hurdjIMSR4buLbmggMSAoY29udGFpbmVyIGtow7RuZyBjaOG7qWEgY29udGFpbmVyKSAqL1xuICBtYXhDb250YWluZXJEZXB0aD86IG51bWJlcjtcbn07XG5cbi8qKiBT4buxIGtp4buHbiB0aMawIHZp4buHbiBi4bqvbiByYSBraGkgYuG7kSBj4bulYyDEkeG7lWkgKi9cbmV4cG9ydCB0eXBlIFRfZ3JpZExheW91dF9jaGFuZ2VFdmVudCA9IHtcbiAgcm9vdDogVF9ncmlkTGF5b3V0X25vZGU7XG4gIC8qKiBraOG7kWkgduG7q2EgYuG7iyB0w6FjIMSR4buZbmc7IGLhu48gdHLhu5FuZyBraGkgxJHhu5VpIGRp4buHbiBy4buZbmcgKHPhuq9wIGfhu41uLCBu4bqhcCBs4bqhaSkgKi9cbiAgbm9kZUlkPzogc3RyaW5nO1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlicy11aS1zZXJ2aWNlcy1ncmlkLWxheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2xpYnMtdWktc2VydmljZXMtZ3JpZC1sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|