@libs-ui/services-grid-layout 0.2.357-20 → 0.2.357-22
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/canvas/grid-layout-canvas.component.d.ts +112 -4
- package/defines/collision.define.d.ts +56 -0
- package/drag-controller.d.ts +34 -0
- package/esm2022/canvas/grid-layout-canvas.component.mjs +387 -8
- package/esm2022/defines/collision.define.mjs +329 -0
- package/esm2022/defines/gridster-config.define.mjs +4 -5
- package/esm2022/drag-controller.mjs +89 -0
- package/esm2022/grid-layout.service.mjs +245 -3
- package/esm2022/index.mjs +3 -1
- package/esm2022/interfaces/grid-layout.interface.mjs +1 -1
- package/esm2022/tree.service.mjs +20 -1
- package/fesm2022/libs-ui-services-grid-layout.mjs +1066 -14
- package/fesm2022/libs-ui-services-grid-layout.mjs.map +1 -1
- package/grid-layout.service.d.ts +100 -0
- package/index.d.ts +2 -0
- package/interfaces/grid-layout.interface.d.ts +108 -0
- package/package.json +3 -3
- package/tree.service.d.ts +4 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import { uuid } from '@libs-ui/utils';
|
|
2
|
+
/**
|
|
3
|
+
* Checks whether the rectangular region [x, x + cols) x [y, y + rows)
|
|
4
|
+
* is completely vacant among existing items.
|
|
5
|
+
*/
|
|
6
|
+
export const isRegionFree = (children, x, y, cols, rows, ignoredId) => {
|
|
7
|
+
for (const child of children) {
|
|
8
|
+
if (ignoredId && child.id === ignoredId) {
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
const hOverlap = !(child.x + child.cols <= x || child.x >= x + cols);
|
|
12
|
+
const vOverlap = !(child.y + child.rows <= y || child.y >= y + rows);
|
|
13
|
+
if (hOverlap && vOverlap) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return true;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Computes optimal (col, row) inside a group container.
|
|
21
|
+
* Snaps flush to adjacent card right edge if slot is vacant.
|
|
22
|
+
*/
|
|
23
|
+
export const findSnapPositionInsideGroup = (children, rawCol, rawRow, innerCols, innerRows, totalCols = 24) => {
|
|
24
|
+
let bestCandidate;
|
|
25
|
+
for (const child of children) {
|
|
26
|
+
const rightEdge = child.x + child.cols;
|
|
27
|
+
const canFit = rightEdge + innerCols <= totalCols;
|
|
28
|
+
const isFree = canFit && isRegionFree(children, rightEdge, child.y, innerCols, innerRows);
|
|
29
|
+
if (!isFree) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
const nearX = Math.abs(rawCol - rightEdge) <= 2 || (rawCol >= child.x + Math.floor(child.cols / 2) && rawCol <= rightEdge + 1);
|
|
33
|
+
const nearY = Math.abs(rawRow - child.y) <= 2;
|
|
34
|
+
if (nearX && nearY) {
|
|
35
|
+
const dist = Math.abs(rawCol - rightEdge) + Math.abs(rawRow - child.y);
|
|
36
|
+
if (!bestCandidate || dist < bestCandidate.dist) {
|
|
37
|
+
bestCandidate = { col: rightEdge, row: child.y, dist };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (bestCandidate) {
|
|
42
|
+
return { col: bestCandidate.col, row: bestCandidate.row };
|
|
43
|
+
}
|
|
44
|
+
const clampedCol = Math.max(0, Math.min(totalCols - innerCols, rawCol));
|
|
45
|
+
const clampedRow = Math.max(0, rawRow);
|
|
46
|
+
return { col: clampedCol, row: clampedRow };
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Adjusts position of pair if horizontal overlap occurs.
|
|
50
|
+
*/
|
|
51
|
+
const adjustItemPair = (a, b) => {
|
|
52
|
+
const hOverlap = !(a.x + a.cols <= b.x || a.x >= b.x + b.cols);
|
|
53
|
+
if (hOverlap && b.y < a.y + a.rows) {
|
|
54
|
+
b.y = a.y + a.rows;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Resolves vertical collisions when inserting a new card at (newNode.x, newNode.y).
|
|
61
|
+
* Any existing card that horizontally overlaps and whose vertical span overlaps
|
|
62
|
+
* or is below the insertion point is pushed down so there is no overlap.
|
|
63
|
+
*/
|
|
64
|
+
export const resolveCollisionsAndInsert = (children, newNode) => {
|
|
65
|
+
const items = [...children];
|
|
66
|
+
for (const item of items) {
|
|
67
|
+
const hOverlap = !(item.x + item.cols <= newNode.x || item.x >= newNode.x + newNode.cols);
|
|
68
|
+
const vOverlap = !(item.y + item.rows <= newNode.y || item.y >= newNode.y + newNode.rows);
|
|
69
|
+
if (hOverlap && vOverlap) {
|
|
70
|
+
item.y = newNode.y + newNode.rows;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
items.sort((a, b) => a.y - b.y);
|
|
74
|
+
let changed = true;
|
|
75
|
+
while (changed) {
|
|
76
|
+
changed = false;
|
|
77
|
+
for (let i = 0; i < items.length; i++) {
|
|
78
|
+
for (let j = i + 1; j < items.length; j++) {
|
|
79
|
+
changed = adjustItemPair(items[i], items[j]) || changed;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
children.push(newNode);
|
|
84
|
+
};
|
|
85
|
+
export function parseDropPayload(activePayload, dataTransfer) {
|
|
86
|
+
if (activePayload) {
|
|
87
|
+
return activePayload;
|
|
88
|
+
}
|
|
89
|
+
if (dataTransfer) {
|
|
90
|
+
try {
|
|
91
|
+
const raw = dataTransfer.getData('application/json');
|
|
92
|
+
if (raw) {
|
|
93
|
+
return JSON.parse(raw);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
export const findHoveredGroup = (elements, canvasContainer, root) => {
|
|
103
|
+
const rootGridster = canvasContainer.querySelector('gridster');
|
|
104
|
+
for (const el of elements) {
|
|
105
|
+
const gridsterEl = (el.tagName.toLowerCase() === 'gridster' ? el : el.closest('gridster'));
|
|
106
|
+
if (gridsterEl && gridsterEl !== rootGridster) {
|
|
107
|
+
const outerItem = gridsterEl.closest('gridster-item');
|
|
108
|
+
const rootItems = rootGridster ? Array.from(rootGridster.querySelectorAll(':scope > gridster-item')) : [];
|
|
109
|
+
const idx = outerItem ? rootItems.indexOf(outerItem) : -1;
|
|
110
|
+
if (idx >= 0 && root.children?.[idx]) {
|
|
111
|
+
return { groupNode: root.children[idx], groupGridster: gridsterEl };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (const el of elements) {
|
|
116
|
+
const itemEl = el.tagName.toLowerCase() === 'gridster-item' ? el : el.closest('gridster-item');
|
|
117
|
+
if (!itemEl) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const rootItems = rootGridster ? Array.from(rootGridster.querySelectorAll(':scope > gridster-item')) : [];
|
|
121
|
+
const idx = rootItems.indexOf(itemEl);
|
|
122
|
+
if (idx >= 0 && root.children?.[idx]) {
|
|
123
|
+
const node = root.children[idx];
|
|
124
|
+
if ((node.children?.length ?? 0) > 0) {
|
|
125
|
+
return { groupNode: node, groupGridster: itemEl.querySelector('gridster') ?? itemEl };
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return undefined;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Calculates snapped spatial coordinates and pixel dimensions for drop ghost preview box.
|
|
133
|
+
*/
|
|
134
|
+
export const calculateDropGhost = (event, canvasContainer, root, payload, totalCols = 24) => {
|
|
135
|
+
if (typeof document === 'undefined' || !canvasContainer) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
const cardTitle = payload.title || 'Thẻ';
|
|
139
|
+
const cardIconClass = payload.iconClass;
|
|
140
|
+
const cardIconText = payload.iconText;
|
|
141
|
+
const payloadAny = payload;
|
|
142
|
+
let defaultCols = typeof payload.cols === 'number'
|
|
143
|
+
? payload.cols
|
|
144
|
+
: (typeof payloadAny['defaultCols'] === 'number' ? payloadAny['defaultCols'] : (totalCols >= 24 ? 12 : 6));
|
|
145
|
+
let defaultRows = typeof payload.rows === 'number'
|
|
146
|
+
? payload.rows
|
|
147
|
+
: (typeof payloadAny['defaultRows'] === 'number' ? payloadAny['defaultRows'] : 4);
|
|
148
|
+
if (typeof payloadAny['resolveNode'] === 'function') {
|
|
149
|
+
try {
|
|
150
|
+
const sample = payloadAny['resolveNode'](false);
|
|
151
|
+
if (sample) {
|
|
152
|
+
if (typeof sample.cols === 'number') {
|
|
153
|
+
defaultCols = sample.cols;
|
|
154
|
+
}
|
|
155
|
+
if (typeof sample.rows === 'number') {
|
|
156
|
+
defaultRows = sample.rows;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// fallback to default cols and rows
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const stageEl = canvasContainer.querySelector('#bi-canvas-stage') ?? canvasContainer;
|
|
165
|
+
const stageRect = stageEl.getBoundingClientRect();
|
|
166
|
+
const rootGridster = stageEl.querySelector('gridster');
|
|
167
|
+
const gridsterEl = rootGridster ?? stageEl;
|
|
168
|
+
const gridsterRect = gridsterEl.getBoundingClientRect();
|
|
169
|
+
const unscaledWidth = gridsterEl.offsetWidth || gridsterEl.clientWidth || 0;
|
|
170
|
+
const zoom = (gridsterRect.width && unscaledWidth > 0)
|
|
171
|
+
? Math.max(0.2, Math.min(3, gridsterRect.width / unscaledWidth))
|
|
172
|
+
: 1;
|
|
173
|
+
const elements = typeof document.elementsFromPoint === 'function'
|
|
174
|
+
? document.elementsFromPoint(event.clientX, event.clientY)
|
|
175
|
+
: [];
|
|
176
|
+
const hovered = findHoveredGroup(elements, canvasContainer, root);
|
|
177
|
+
const stageMouseX = (event.clientX - stageRect.left) / zoom;
|
|
178
|
+
const stageMouseY = (event.clientY - stageRect.top) / zoom;
|
|
179
|
+
if (hovered) {
|
|
180
|
+
const { groupNode, groupGridster } = hovered;
|
|
181
|
+
const groupGridsterRect = groupGridster.getBoundingClientRect();
|
|
182
|
+
const groupStageLeft = (groupGridsterRect.left - stageRect.left) / zoom;
|
|
183
|
+
const groupStageTop = (groupGridsterRect.top - stageRect.top) / zoom;
|
|
184
|
+
let innerCols = defaultCols;
|
|
185
|
+
let innerRows = defaultRows;
|
|
186
|
+
if (typeof payloadAny['resolveNode'] === 'function') {
|
|
187
|
+
try {
|
|
188
|
+
const sampleInside = payloadAny['resolveNode'](true);
|
|
189
|
+
if (sampleInside) {
|
|
190
|
+
if (typeof sampleInside.cols === 'number') {
|
|
191
|
+
innerCols = sampleInside.cols;
|
|
192
|
+
}
|
|
193
|
+
if (typeof sampleInside.rows === 'number') {
|
|
194
|
+
innerRows = sampleInside.rows;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// fallback to default cols and rows
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
innerCols = Math.min(innerCols, totalCols);
|
|
203
|
+
const groupWidth = groupGridster.clientWidth || (groupGridsterRect.width / zoom) || 400;
|
|
204
|
+
const colStep = (groupWidth + 2) / totalCols;
|
|
205
|
+
const rowStep = 18;
|
|
206
|
+
const relX = (event.clientX - groupGridsterRect.left) / zoom + groupGridster.scrollLeft;
|
|
207
|
+
const relY = (event.clientY - groupGridsterRect.top) / zoom + groupGridster.scrollTop;
|
|
208
|
+
const rawCol = Math.floor(relX / colStep);
|
|
209
|
+
const rawRow = Math.floor(relY / rowStep);
|
|
210
|
+
const snap = findSnapPositionInsideGroup(groupNode.children ?? [], rawCol, rawRow, innerCols, innerRows, totalCols);
|
|
211
|
+
return {
|
|
212
|
+
col: snap.col,
|
|
213
|
+
row: snap.row,
|
|
214
|
+
cols: innerCols,
|
|
215
|
+
rows: innerRows,
|
|
216
|
+
pixelLeft: groupStageLeft + snap.col * colStep,
|
|
217
|
+
pixelTop: groupStageTop + snap.row * rowStep,
|
|
218
|
+
pixelWidth: Math.max(30, innerCols * colStep - 2),
|
|
219
|
+
pixelHeight: Math.max(20, innerRows * rowStep - 2),
|
|
220
|
+
isInsideGroup: true,
|
|
221
|
+
targetParentId: groupNode.id,
|
|
222
|
+
groupTitle: 'Khối ghép',
|
|
223
|
+
cardTitle,
|
|
224
|
+
cardIconClass,
|
|
225
|
+
cardIconText,
|
|
226
|
+
hoveredGridster: groupGridster,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const margin = 12;
|
|
230
|
+
const rowStep = 68;
|
|
231
|
+
const gridsterWidth = unscaledWidth || gridsterEl.clientWidth || 1200;
|
|
232
|
+
const colStep = Math.max(20, (gridsterWidth - margin) / totalCols);
|
|
233
|
+
const gridsterStageLeft = (gridsterRect.left - stageRect.left) / zoom;
|
|
234
|
+
const gridsterStageTop = (gridsterRect.top - stageRect.top) / zoom;
|
|
235
|
+
const relX = stageMouseX - gridsterStageLeft + gridsterEl.scrollLeft - margin;
|
|
236
|
+
const relY = stageMouseY - gridsterStageTop + gridsterEl.scrollTop - margin;
|
|
237
|
+
const itemCols = Math.min(defaultCols, totalCols);
|
|
238
|
+
const col = Math.max(0, Math.min(totalCols - itemCols, Math.floor(relX / colStep)));
|
|
239
|
+
const row = Math.max(0, Math.floor(relY / rowStep));
|
|
240
|
+
return {
|
|
241
|
+
col,
|
|
242
|
+
row,
|
|
243
|
+
cols: itemCols,
|
|
244
|
+
rows: defaultRows,
|
|
245
|
+
pixelLeft: gridsterStageLeft + margin + col * colStep,
|
|
246
|
+
pixelTop: gridsterStageTop + margin + row * rowStep,
|
|
247
|
+
pixelWidth: itemCols * colStep - margin,
|
|
248
|
+
pixelHeight: defaultRows * rowStep - margin,
|
|
249
|
+
isInsideGroup: false,
|
|
250
|
+
cardTitle,
|
|
251
|
+
cardIconClass,
|
|
252
|
+
cardIconText,
|
|
253
|
+
hoveredGridster: rootGridster ?? undefined,
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
/** Tìm khối theo id trong cây, đi sâu vào mọi container. */
|
|
257
|
+
export const findNodeRecursive = (root, id) => {
|
|
258
|
+
if (root.id === id) {
|
|
259
|
+
return root;
|
|
260
|
+
}
|
|
261
|
+
for (const child of root.children ?? []) {
|
|
262
|
+
const found = findNodeRecursive(child, id);
|
|
263
|
+
if (found) {
|
|
264
|
+
return found;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return undefined;
|
|
268
|
+
};
|
|
269
|
+
/** Tìm khối CHA trực tiếp của một khối, đi sâu vào mọi container. */
|
|
270
|
+
export const findParentRecursive = (root, id) => {
|
|
271
|
+
for (const child of root.children ?? []) {
|
|
272
|
+
if (child.id === id) {
|
|
273
|
+
return root;
|
|
274
|
+
}
|
|
275
|
+
const found = findParentRecursive(child, id);
|
|
276
|
+
if (found) {
|
|
277
|
+
return found;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return undefined;
|
|
281
|
+
};
|
|
282
|
+
/**
|
|
283
|
+
* Thả khối vào đúng ô mà ghost đang chỉ, đẩy các khối va chạm xuống dưới.
|
|
284
|
+
*
|
|
285
|
+
* Ghost đang nằm trong một container (`isInsideGroup`) thì thả vào ruột container đó; không tìm thấy
|
|
286
|
+
* container thì trả `false` chứ KHÔNG rơi về lưới gốc — thả nhầm cấp khó nhận ra hơn là không thả.
|
|
287
|
+
*/
|
|
288
|
+
export const dropNodeAtCoordinates = (root, ghost, newNode) => {
|
|
289
|
+
const nodeToAdd = {
|
|
290
|
+
...newNode,
|
|
291
|
+
id: newNode.id ?? uuid(),
|
|
292
|
+
x: ghost.col,
|
|
293
|
+
y: ghost.row,
|
|
294
|
+
cols: ghost.cols,
|
|
295
|
+
rows: ghost.rows,
|
|
296
|
+
};
|
|
297
|
+
if (ghost.isInsideGroup && ghost.targetParentId) {
|
|
298
|
+
const parentNode = findNodeRecursive(root, ghost.targetParentId);
|
|
299
|
+
if (!parentNode) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
parentNode.children = parentNode.children ?? [];
|
|
303
|
+
resolveCollisionsAndInsert(parentNode.children, nodeToAdd);
|
|
304
|
+
return true;
|
|
305
|
+
}
|
|
306
|
+
root.children = root.children ?? [];
|
|
307
|
+
resolveCollisionsAndInsert(root.children, nodeToAdd);
|
|
308
|
+
return true;
|
|
309
|
+
};
|
|
310
|
+
/** Khối có phải CONTAINER không — tức có khối con bên trong. */
|
|
311
|
+
export const isContainerNode = (node) => (node.children?.length ?? 0) > 0;
|
|
312
|
+
/** Khối có nằm LỒNG bên trong một container không (không phải con trực tiếp của gốc). */
|
|
313
|
+
export const isNodeNestedInside = (root, nodeId) => {
|
|
314
|
+
if (!root?.children) {
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
return !root.children.some((child) => child.id === nodeId);
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
320
|
+
* Có được đổi khối đơn ↔ container không.
|
|
321
|
+
*
|
|
322
|
+
* 🔴 Ba hàm cờ này PHẢI là nguồn duy nhất cho cả thanh công cụ của thư viện lẫn menu do nơi dùng tự
|
|
323
|
+
* dựng. Trước đây nơi dùng phải chép lại quy tắc để dựng menu trước lúc render, và hai bản lệch nhau
|
|
324
|
+
* mỗi khi thư viện đổi trần lồng cấp mà không có gì báo.
|
|
325
|
+
*/
|
|
326
|
+
export const canToggleTypeNode = (root, node) => isContainerNode(node) || !isNodeNestedInside(root, node.id);
|
|
327
|
+
/** Có được thêm khối vào BÊN TRONG khối này không. */
|
|
328
|
+
export const canAddInsideNode = (root, node) => isContainerNode(node) && !isNodeNestedInside(root, node.id);
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGlzaW9uLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvY29sbGlzaW9uLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEM7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQzFCLFFBQWtDLEVBQ2xDLENBQVMsRUFDVCxDQUFTLEVBQ1QsSUFBWSxFQUNaLElBQVksRUFDWixTQUFrQixFQUNULEVBQUU7SUFDWCxLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQzdCLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxFQUFFLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEMsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNyRSxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUVyRSxJQUFJLFFBQVEsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUN6QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxDQUN6QyxRQUFrQyxFQUNsQyxNQUFjLEVBQ2QsTUFBYyxFQUNkLFNBQWlCLEVBQ2pCLFNBQWlCLEVBQ2pCLFNBQVMsR0FBRyxFQUFFLEVBQ2dCLEVBQUU7SUFDaEMsSUFBSSxhQUFxRSxDQUFDO0lBRTFFLEtBQUssTUFBTSxLQUFLLElBQUksUUFBUSxFQUFFLENBQUM7UUFDN0IsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLFNBQVMsR0FBRyxTQUFTLElBQUksU0FBUyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUxRixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixTQUFTO1FBQ1gsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxNQUFNLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9ILE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFOUMsSUFBSSxLQUFLLElBQUksS0FBSyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXZFLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEQsYUFBYSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN6RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUV2QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDOUMsQ0FBQyxDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLGNBQWMsR0FBRyxDQUFDLENBQW9CLEVBQUUsQ0FBb0IsRUFBVyxFQUFFO0lBQzdFLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRS9ELElBQUksUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsQ0FDeEMsUUFBa0MsRUFDbEMsT0FBMEIsRUFDcEIsRUFBRTtJQUNSLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztJQUU1QixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFGLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFGLElBQUksUUFBUSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3BDLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztJQUVuQixPQUFPLE9BQU8sRUFBRSxDQUFDO1FBQ2YsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUMxQyxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsZ0JBQWdCLENBQUksYUFBNEIsRUFBRSxZQUFpQztJQUNqRyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQztZQUNILE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUVyRCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQU0sQ0FBQztZQUM5QixDQUFDO1FBQ0gsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQU9ELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLENBQzlCLFFBQW1CLEVBQ25CLGVBQTRCLEVBQzVCLElBQXVCLEVBQ0ssRUFBRTtJQUM5QixNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRS9ELEtBQUssTUFBTSxFQUFFLElBQUksUUFBUSxFQUFFLENBQUM7UUFDMUIsTUFBTSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUF1QixDQUFDO1FBRWpILElBQUksVUFBVSxJQUFJLFVBQVUsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDMUcsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUxRCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE9BQU8sRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDdEUsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9GLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMxRyxNQUFNLEdBQUcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckMsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUF3QixJQUFLLE1BQXNCLEVBQUUsQ0FBQztZQUNqSSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQ2hDLEtBQWdCLEVBQ2hCLGVBQTRCLEVBQzVCLElBQXVCLEVBQ3ZCLE9BQXlDLEVBQ3pDLFNBQVMsR0FBRyxFQUFFLEVBQ3NCLEVBQUU7SUFDdEMsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4RCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7SUFDekMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQztJQUN4QyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3RDLE1BQU0sVUFBVSxHQUFHLE9BQWtDLENBQUM7SUFDdEQsSUFBSSxXQUFXLEdBQUcsT0FBTyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFDaEQsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJO1FBQ2QsQ0FBQyxDQUFDLENBQUMsT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBRSxVQUFVLENBQUMsYUFBYSxDQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pILElBQUksV0FBVyxHQUFHLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRO1FBQ2hELENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSTtRQUNkLENBQUMsQ0FBQyxDQUFDLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUUsVUFBVSxDQUFDLGFBQWEsQ0FBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoRyxJQUFJLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFJLFVBQVUsQ0FBQyxhQUFhLENBQTJELENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0csSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFBQyxDQUFDO2dCQUNuRSxJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztnQkFBQyxDQUFDO1lBQ3JFLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1Asb0NBQW9DO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxPQUFPLEdBQUksZUFBZSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBd0IsSUFBSSxlQUFlLENBQUM7SUFDN0csTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFFbEQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQXVCLENBQUM7SUFDN0UsTUFBTSxVQUFVLEdBQUcsWUFBWSxJQUFJLE9BQU8sQ0FBQztJQUMzQyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUN4RCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsV0FBVyxJQUFJLFVBQVUsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO0lBQzVFLE1BQU0sSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFTixNQUFNLFFBQVEsR0FBRyxPQUFPLFFBQVEsQ0FBQyxpQkFBaUIsS0FBSyxVQUFVO1FBQy9ELENBQUMsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzFELENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDUCxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWxFLE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzVELE1BQU0sV0FBVyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRTNELElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUM3QyxNQUFNLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ2hFLE1BQU0sY0FBYyxHQUFHLENBQUMsaUJBQWlCLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDeEUsTUFBTSxhQUFhLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUVyRSxJQUFJLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFDNUIsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUFDO1FBQzVCLElBQUksT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDcEQsSUFBSSxDQUFDO2dCQUNILE1BQU0sWUFBWSxHQUFJLFVBQVUsQ0FBQyxhQUFhLENBQTJELENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hILElBQUksWUFBWSxFQUFFLENBQUM7b0JBQ2pCLElBQUksT0FBTyxZQUFZLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUFDLENBQUM7b0JBQzdFLElBQUksT0FBTyxZQUFZLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO3dCQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDO29CQUFDLENBQUM7Z0JBQy9FLENBQUM7WUFDSCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLG9DQUFvQztZQUN0QyxDQUFDO1FBQ0gsQ0FBQztRQUNELFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUzQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsV0FBVyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztRQUN4RixNQUFNLE9BQU8sR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUN4RixNQUFNLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUM7UUFDdEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQ3RDLFNBQVMsQ0FBQyxRQUFRLElBQUksRUFBRSxFQUN4QixNQUFNLEVBQ04sTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxDQUNWLENBQUM7UUFFRixPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLFNBQVM7WUFDZixJQUFJLEVBQUUsU0FBUztZQUNmLFNBQVMsRUFBRSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPO1lBQzlDLFFBQVEsRUFBRSxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPO1lBQzVDLFVBQVUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxTQUFTLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNqRCxXQUFXLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsU0FBUyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDbEQsYUFBYSxFQUFFLElBQUk7WUFDbkIsY0FBYyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1lBQzVCLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFNBQVM7WUFDVCxhQUFhO1lBQ2IsWUFBWTtZQUNaLGVBQWUsRUFBRSxhQUE0QjtTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNsQixNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDbkIsTUFBTSxhQUFhLEdBQUcsYUFBYSxJQUFJLFVBQVUsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEUsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNuRSxNQUFNLElBQUksR0FBRyxXQUFXLEdBQUcsaUJBQWlCLEdBQUcsVUFBVSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDOUUsTUFBTSxJQUFJLEdBQUcsV0FBVyxHQUFHLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO0lBQzVFLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUVwRCxPQUFPO1FBQ0wsR0FBRztRQUNILEdBQUc7UUFDSCxJQUFJLEVBQUUsUUFBUTtRQUNkLElBQUksRUFBRSxXQUFXO1FBQ2pCLFNBQVMsRUFBRSxpQkFBaUIsR0FBRyxNQUFNLEdBQUcsR0FBRyxHQUFHLE9BQU87UUFDckQsUUFBUSxFQUFFLGdCQUFnQixHQUFHLE1BQU0sR0FBRyxHQUFHLEdBQUcsT0FBTztRQUNuRCxVQUFVLEVBQUUsUUFBUSxHQUFHLE9BQU8sR0FBRyxNQUFNO1FBQ3ZDLFdBQVcsRUFBRSxXQUFXLEdBQUcsT0FBTyxHQUFHLE1BQU07UUFDM0MsYUFBYSxFQUFFLEtBQUs7UUFDcEIsU0FBUztRQUNULGFBQWE7UUFDYixZQUFZO1FBQ1osZUFBZSxFQUFHLFlBQTRCLElBQUksU0FBUztLQUM1RCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBR0YsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBdUIsRUFBRSxFQUFVLEVBQWlDLEVBQUU7SUFDdEcsSUFBSSxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFM0MsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUFFRixxRUFBcUU7QUFDckUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxJQUF1QixFQUFFLEVBQVUsRUFBaUMsRUFBRTtJQUN4RyxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxFQUFFLENBQUM7UUFDeEMsSUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUU3QyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1YsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FDbkMsSUFBdUIsRUFDdkIsS0FBNkIsRUFDN0IsT0FBNkIsRUFDcEIsRUFBRTtJQUNYLE1BQU0sU0FBUyxHQUFzQjtRQUNuQyxHQUFHLE9BQU87UUFDVixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxJQUFJLEVBQUU7UUFDeEIsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ1osQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHO1FBQ1osSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtLQUNqQixDQUFDO0lBRUYsSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNoRCxNQUFNLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxVQUFVLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2hELDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFM0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztJQUNwQywwQkFBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBR0YsZ0VBQWdFO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLElBQXVCLEVBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRXRHLHlGQUF5RjtBQUN6RixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLElBQW1DLEVBQUUsTUFBYyxFQUFXLEVBQUU7SUFDakcsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQztRQUNwQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxJQUFtQyxFQUFFLElBQXVCLEVBQVcsRUFBRSxDQUN6RyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTlELHNEQUFzRDtBQUN0RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLElBQW1DLEVBQUUsSUFBdUIsRUFBVyxFQUFFLENBQ3hHLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBUX2dyaWRMYXlvdXRfZHJvcEdob3N0LFxuICBUX2dyaWRMYXlvdXRfZXh0ZXJuYWxEcmFnUGF5bG9hZCxcbiAgVF9ncmlkTGF5b3V0X25ld05vZGUsXG4gIFRfZ3JpZExheW91dF9ub2RlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL2dyaWQtbGF5b3V0LmludGVyZmFjZSc7XG5pbXBvcnQgeyB1dWlkIH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSByZWN0YW5ndWxhciByZWdpb24gW3gsIHggKyBjb2xzKSB4IFt5LCB5ICsgcm93cylcbiAqIGlzIGNvbXBsZXRlbHkgdmFjYW50IGFtb25nIGV4aXN0aW5nIGl0ZW1zLlxuICovXG5leHBvcnQgY29uc3QgaXNSZWdpb25GcmVlID0gKFxuICBjaGlsZHJlbjogQXJyYXk8VF9ncmlkTGF5b3V0X25vZGU+LFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgY29sczogbnVtYmVyLFxuICByb3dzOiBudW1iZXIsXG4gIGlnbm9yZWRJZD86IHN0cmluZyxcbik6IGJvb2xlYW4gPT4ge1xuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgaWYgKGlnbm9yZWRJZCAmJiBjaGlsZC5pZCA9PT0gaWdub3JlZElkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaE92ZXJsYXAgPSAhKGNoaWxkLnggKyBjaGlsZC5jb2xzIDw9IHggfHwgY2hpbGQueCA+PSB4ICsgY29scyk7XG4gICAgY29uc3Qgdk92ZXJsYXAgPSAhKGNoaWxkLnkgKyBjaGlsZC5yb3dzIDw9IHkgfHwgY2hpbGQueSA+PSB5ICsgcm93cyk7XG5cbiAgICBpZiAoaE92ZXJsYXAgJiYgdk92ZXJsYXApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgb3B0aW1hbCAoY29sLCByb3cpIGluc2lkZSBhIGdyb3VwIGNvbnRhaW5lci5cbiAqIFNuYXBzIGZsdXNoIHRvIGFkamFjZW50IGNhcmQgcmlnaHQgZWRnZSBpZiBzbG90IGlzIHZhY2FudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZpbmRTbmFwUG9zaXRpb25JbnNpZGVHcm91cCA9IChcbiAgY2hpbGRyZW46IEFycmF5PFRfZ3JpZExheW91dF9ub2RlPixcbiAgcmF3Q29sOiBudW1iZXIsXG4gIHJhd1JvdzogbnVtYmVyLFxuICBpbm5lckNvbHM6IG51bWJlcixcbiAgaW5uZXJSb3dzOiBudW1iZXIsXG4gIHRvdGFsQ29scyA9IDI0LFxuKTogeyBjb2w6IG51bWJlcjsgcm93OiBudW1iZXIgfSA9PiB7XG4gIGxldCBiZXN0Q2FuZGlkYXRlOiB7IGNvbDogbnVtYmVyOyByb3c6IG51bWJlcjsgZGlzdDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgIGNvbnN0IHJpZ2h0RWRnZSA9IGNoaWxkLnggKyBjaGlsZC5jb2xzO1xuICAgIGNvbnN0IGNhbkZpdCA9IHJpZ2h0RWRnZSArIGlubmVyQ29scyA8PSB0b3RhbENvbHM7XG4gICAgY29uc3QgaXNGcmVlID0gY2FuRml0ICYmIGlzUmVnaW9uRnJlZShjaGlsZHJlbiwgcmlnaHRFZGdlLCBjaGlsZC55LCBpbm5lckNvbHMsIGlubmVyUm93cyk7XG5cbiAgICBpZiAoIWlzRnJlZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbmVhclggPSBNYXRoLmFicyhyYXdDb2wgLSByaWdodEVkZ2UpIDw9IDIgfHwgKHJhd0NvbCA+PSBjaGlsZC54ICsgTWF0aC5mbG9vcihjaGlsZC5jb2xzIC8gMikgJiYgcmF3Q29sIDw9IHJpZ2h0RWRnZSArIDEpO1xuICAgIGNvbnN0IG5lYXJZID0gTWF0aC5hYnMocmF3Um93IC0gY2hpbGQueSkgPD0gMjtcblxuICAgIGlmIChuZWFyWCAmJiBuZWFyWSkge1xuICAgICAgY29uc3QgZGlzdCA9IE1hdGguYWJzKHJhd0NvbCAtIHJpZ2h0RWRnZSkgKyBNYXRoLmFicyhyYXdSb3cgLSBjaGlsZC55KTtcblxuICAgICAgaWYgKCFiZXN0Q2FuZGlkYXRlIHx8IGRpc3QgPCBiZXN0Q2FuZGlkYXRlLmRpc3QpIHtcbiAgICAgICAgYmVzdENhbmRpZGF0ZSA9IHsgY29sOiByaWdodEVkZ2UsIHJvdzogY2hpbGQueSwgZGlzdCB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChiZXN0Q2FuZGlkYXRlKSB7XG4gICAgcmV0dXJuIHsgY29sOiBiZXN0Q2FuZGlkYXRlLmNvbCwgcm93OiBiZXN0Q2FuZGlkYXRlLnJvdyB9O1xuICB9XG5cbiAgY29uc3QgY2xhbXBlZENvbCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRvdGFsQ29scyAtIGlubmVyQ29scywgcmF3Q29sKSk7XG4gIGNvbnN0IGNsYW1wZWRSb3cgPSBNYXRoLm1heCgwLCByYXdSb3cpO1xuXG4gIHJldHVybiB7IGNvbDogY2xhbXBlZENvbCwgcm93OiBjbGFtcGVkUm93IH07XG59O1xuXG4vKipcbiAqIEFkanVzdHMgcG9zaXRpb24gb2YgcGFpciBpZiBob3Jpem9udGFsIG92ZXJsYXAgb2NjdXJzLlxuICovXG5jb25zdCBhZGp1c3RJdGVtUGFpciA9IChhOiBUX2dyaWRMYXlvdXRfbm9kZSwgYjogVF9ncmlkTGF5b3V0X25vZGUpOiBib29sZWFuID0+IHtcbiAgY29uc3QgaE92ZXJsYXAgPSAhKGEueCArIGEuY29scyA8PSBiLnggfHwgYS54ID49IGIueCArIGIuY29scyk7XG5cbiAgaWYgKGhPdmVybGFwICYmIGIueSA8IGEueSArIGEucm93cykge1xuICAgIGIueSA9IGEueSArIGEucm93cztcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBSZXNvbHZlcyB2ZXJ0aWNhbCBjb2xsaXNpb25zIHdoZW4gaW5zZXJ0aW5nIGEgbmV3IGNhcmQgYXQgKG5ld05vZGUueCwgbmV3Tm9kZS55KS5cbiAqIEFueSBleGlzdGluZyBjYXJkIHRoYXQgaG9yaXpvbnRhbGx5IG92ZXJsYXBzIGFuZCB3aG9zZSB2ZXJ0aWNhbCBzcGFuIG92ZXJsYXBzXG4gKiBvciBpcyBiZWxvdyB0aGUgaW5zZXJ0aW9uIHBvaW50IGlzIHB1c2hlZCBkb3duIHNvIHRoZXJlIGlzIG5vIG92ZXJsYXAuXG4gKi9cbmV4cG9ydCBjb25zdCByZXNvbHZlQ29sbGlzaW9uc0FuZEluc2VydCA9IChcbiAgY2hpbGRyZW46IEFycmF5PFRfZ3JpZExheW91dF9ub2RlPixcbiAgbmV3Tm9kZTogVF9ncmlkTGF5b3V0X25vZGUsXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgaXRlbXMgPSBbLi4uY2hpbGRyZW5dO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGNvbnN0IGhPdmVybGFwID0gIShpdGVtLnggKyBpdGVtLmNvbHMgPD0gbmV3Tm9kZS54IHx8IGl0ZW0ueCA+PSBuZXdOb2RlLnggKyBuZXdOb2RlLmNvbHMpO1xuICAgIGNvbnN0IHZPdmVybGFwID0gIShpdGVtLnkgKyBpdGVtLnJvd3MgPD0gbmV3Tm9kZS55IHx8IGl0ZW0ueSA+PSBuZXdOb2RlLnkgKyBuZXdOb2RlLnJvd3MpO1xuXG4gICAgaWYgKGhPdmVybGFwICYmIHZPdmVybGFwKSB7XG4gICAgICBpdGVtLnkgPSBuZXdOb2RlLnkgKyBuZXdOb2RlLnJvd3M7XG4gICAgfVxuICB9XG5cbiAgaXRlbXMuc29ydCgoYSwgYikgPT4gYS55IC0gYi55KTtcbiAgbGV0IGNoYW5nZWQgPSB0cnVlO1xuXG4gIHdoaWxlIChjaGFuZ2VkKSB7XG4gICAgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IGl0ZW1zLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNoYW5nZWQgPSBhZGp1c3RJdGVtUGFpcihpdGVtc1tpXSwgaXRlbXNbal0pIHx8IGNoYW5nZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hpbGRyZW4ucHVzaChuZXdOb2RlKTtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURyb3BQYXlsb2FkPFQ+KGFjdGl2ZVBheWxvYWQ6IFQgfCB1bmRlZmluZWQsIGRhdGFUcmFuc2ZlcjogRGF0YVRyYW5zZmVyIHwgbnVsbCk6IFQgfCB1bmRlZmluZWQge1xuICBpZiAoYWN0aXZlUGF5bG9hZCkge1xuICAgIHJldHVybiBhY3RpdmVQYXlsb2FkO1xuICB9XG4gIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gZGF0YVRyYW5zZmVyLmdldERhdGEoJ2FwcGxpY2F0aW9uL2pzb24nKTtcblxuICAgICAgaWYgKHJhdykge1xuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyYXcpIGFzIFQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmludGVyZmFjZSBJX2hvdmVyZWRHcm91cCB7XG4gIGdyb3VwTm9kZTogVF9ncmlkTGF5b3V0X25vZGU7XG4gIGdyb3VwR3JpZHN0ZXI6IEhUTUxFbGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgZmluZEhvdmVyZWRHcm91cCA9IChcbiAgZWxlbWVudHM6IEVsZW1lbnRbXSxcbiAgY2FudmFzQ29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgcm9vdDogVF9ncmlkTGF5b3V0X25vZGUsXG4pOiBJX2hvdmVyZWRHcm91cCB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IHJvb3RHcmlkc3RlciA9IGNhbnZhc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdncmlkc3RlcicpO1xuXG4gIGZvciAoY29uc3QgZWwgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBncmlkc3RlckVsID0gKGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dyaWRzdGVyJyA/IGVsIDogZWwuY2xvc2VzdCgnZ3JpZHN0ZXInKSkgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgaWYgKGdyaWRzdGVyRWwgJiYgZ3JpZHN0ZXJFbCAhPT0gcm9vdEdyaWRzdGVyKSB7XG4gICAgICBjb25zdCBvdXRlckl0ZW0gPSBncmlkc3RlckVsLmNsb3Nlc3QoJ2dyaWRzdGVyLWl0ZW0nKTtcbiAgICAgIGNvbnN0IHJvb3RJdGVtcyA9IHJvb3RHcmlkc3RlciA/IEFycmF5LmZyb20ocm9vdEdyaWRzdGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJzpzY29wZSA+IGdyaWRzdGVyLWl0ZW0nKSkgOiBbXTtcbiAgICAgIGNvbnN0IGlkeCA9IG91dGVySXRlbSA/IHJvb3RJdGVtcy5pbmRleE9mKG91dGVySXRlbSkgOiAtMTtcblxuICAgICAgaWYgKGlkeCA+PSAwICYmIHJvb3QuY2hpbGRyZW4/LltpZHhdKSB7XG4gICAgICAgIHJldHVybiB7IGdyb3VwTm9kZTogcm9vdC5jaGlsZHJlbltpZHhdLCBncm91cEdyaWRzdGVyOiBncmlkc3RlckVsIH07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBlbCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IGl0ZW1FbCA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2dyaWRzdGVyLWl0ZW0nID8gZWwgOiBlbC5jbG9zZXN0KCdncmlkc3Rlci1pdGVtJyk7XG4gICAgaWYgKCFpdGVtRWwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByb290SXRlbXMgPSByb290R3JpZHN0ZXIgPyBBcnJheS5mcm9tKHJvb3RHcmlkc3Rlci5xdWVyeVNlbGVjdG9yQWxsKCc6c2NvcGUgPiBncmlkc3Rlci1pdGVtJykpIDogW107XG4gICAgY29uc3QgaWR4ID0gcm9vdEl0ZW1zLmluZGV4T2YoaXRlbUVsKTtcbiAgICBpZiAoaWR4ID49IDAgJiYgcm9vdC5jaGlsZHJlbj8uW2lkeF0pIHtcbiAgICAgIGNvbnN0IG5vZGUgPSByb290LmNoaWxkcmVuW2lkeF07XG4gICAgICBpZiAoKG5vZGUuY2hpbGRyZW4/Lmxlbmd0aCA/PyAwKSA+IDApIHtcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBOb2RlOiBub2RlLCBncm91cEdyaWRzdGVyOiAoaXRlbUVsLnF1ZXJ5U2VsZWN0b3IoJ2dyaWRzdGVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSA/PyAoaXRlbUVsIGFzIEhUTUxFbGVtZW50KSB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgc25hcHBlZCBzcGF0aWFsIGNvb3JkaW5hdGVzIGFuZCBwaXhlbCBkaW1lbnNpb25zIGZvciBkcm9wIGdob3N0IHByZXZpZXcgYm94LlxuICovXG5leHBvcnQgY29uc3QgY2FsY3VsYXRlRHJvcEdob3N0ID0gKFxuICBldmVudDogRHJhZ0V2ZW50LFxuICBjYW52YXNDb250YWluZXI6IEhUTUxFbGVtZW50LFxuICByb290OiBUX2dyaWRMYXlvdXRfbm9kZSxcbiAgcGF5bG9hZDogVF9ncmlkTGF5b3V0X2V4dGVybmFsRHJhZ1BheWxvYWQsXG4gIHRvdGFsQ29scyA9IDI0LFxuKTogVF9ncmlkTGF5b3V0X2Ryb3BHaG9zdCB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgPT09ICd1bmRlZmluZWQnIHx8ICFjYW52YXNDb250YWluZXIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgY2FyZFRpdGxlID0gcGF5bG9hZC50aXRsZSB8fCAnVGjhursnO1xuICBjb25zdCBjYXJkSWNvbkNsYXNzID0gcGF5bG9hZC5pY29uQ2xhc3M7XG4gIGNvbnN0IGNhcmRJY29uVGV4dCA9IHBheWxvYWQuaWNvblRleHQ7XG4gIGNvbnN0IHBheWxvYWRBbnkgPSBwYXlsb2FkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBsZXQgZGVmYXVsdENvbHMgPSB0eXBlb2YgcGF5bG9hZC5jb2xzID09PSAnbnVtYmVyJ1xuICAgID8gcGF5bG9hZC5jb2xzXG4gICAgOiAodHlwZW9mIHBheWxvYWRBbnlbJ2RlZmF1bHRDb2xzJ10gPT09ICdudW1iZXInID8gKHBheWxvYWRBbnlbJ2RlZmF1bHRDb2xzJ10gYXMgbnVtYmVyKSA6ICh0b3RhbENvbHMgPj0gMjQgPyAxMiA6IDYpKTtcbiAgbGV0IGRlZmF1bHRSb3dzID0gdHlwZW9mIHBheWxvYWQucm93cyA9PT0gJ251bWJlcidcbiAgICA/IHBheWxvYWQucm93c1xuICAgIDogKHR5cGVvZiBwYXlsb2FkQW55WydkZWZhdWx0Um93cyddID09PSAnbnVtYmVyJyA/IChwYXlsb2FkQW55WydkZWZhdWx0Um93cyddIGFzIG51bWJlcikgOiA0KTtcblxuICBpZiAodHlwZW9mIHBheWxvYWRBbnlbJ3Jlc29sdmVOb2RlJ10gPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FtcGxlID0gKHBheWxvYWRBbnlbJ3Jlc29sdmVOb2RlJ10gYXMgKGluc2lkZTogYm9vbGVhbikgPT4gVF9ncmlkTGF5b3V0X25ld05vZGUgfCB1bmRlZmluZWQpKGZhbHNlKTtcbiAgICAgIGlmIChzYW1wbGUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzYW1wbGUuY29scyA9PT0gJ251bWJlcicpIHsgZGVmYXVsdENvbHMgPSBzYW1wbGUuY29sczsgfVxuICAgICAgICBpZiAodHlwZW9mIHNhbXBsZS5yb3dzID09PSAnbnVtYmVyJykgeyBkZWZhdWx0Um93cyA9IHNhbXBsZS5yb3dzOyB9XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBmYWxsYmFjayB0byBkZWZhdWx0IGNvbHMgYW5kIHJvd3NcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdGFnZUVsID0gKGNhbnZhc0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCcjYmktY2FudmFzLXN0YWdlJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSA/PyBjYW52YXNDb250YWluZXI7XG4gIGNvbnN0IHN0YWdlUmVjdCA9IHN0YWdlRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgY29uc3Qgcm9vdEdyaWRzdGVyID0gc3RhZ2VFbC5xdWVyeVNlbGVjdG9yKCdncmlkc3RlcicpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY29uc3QgZ3JpZHN0ZXJFbCA9IHJvb3RHcmlkc3RlciA/PyBzdGFnZUVsO1xuICBjb25zdCBncmlkc3RlclJlY3QgPSBncmlkc3RlckVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICBjb25zdCB1bnNjYWxlZFdpZHRoID0gZ3JpZHN0ZXJFbC5vZmZzZXRXaWR0aCB8fCBncmlkc3RlckVsLmNsaWVudFdpZHRoIHx8IDA7XG4gIGNvbnN0IHpvb20gPSAoZ3JpZHN0ZXJSZWN0LndpZHRoICYmIHVuc2NhbGVkV2lkdGggPiAwKVxuICAgID8gTWF0aC5tYXgoMC4yLCBNYXRoLm1pbigzLCBncmlkc3RlclJlY3Qud2lkdGggLyB1bnNjYWxlZFdpZHRoKSlcbiAgICA6IDE7XG5cbiAgY29uc3QgZWxlbWVudHMgPSB0eXBlb2YgZG9jdW1lbnQuZWxlbWVudHNGcm9tUG9pbnQgPT09ICdmdW5jdGlvbidcbiAgICA/IGRvY3VtZW50LmVsZW1lbnRzRnJvbVBvaW50KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpXG4gICAgOiBbXTtcbiAgY29uc3QgaG92ZXJlZCA9IGZpbmRIb3ZlcmVkR3JvdXAoZWxlbWVudHMsIGNhbnZhc0NvbnRhaW5lciwgcm9vdCk7XG5cbiAgY29uc3Qgc3RhZ2VNb3VzZVggPSAoZXZlbnQuY2xpZW50WCAtIHN0YWdlUmVjdC5sZWZ0KSAvIHpvb207XG4gIGNvbnN0IHN0YWdlTW91c2VZID0gKGV2ZW50LmNsaWVudFkgLSBzdGFnZVJlY3QudG9wKSAvIHpvb207XG5cbiAgaWYgKGhvdmVyZWQpIHtcbiAgICBjb25zdCB7IGdyb3VwTm9kZSwgZ3JvdXBHcmlkc3RlciB9ID0gaG92ZXJlZDtcbiAgICBjb25zdCBncm91cEdyaWRzdGVyUmVjdCA9IGdyb3VwR3JpZHN0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgZ3JvdXBTdGFnZUxlZnQgPSAoZ3JvdXBHcmlkc3RlclJlY3QubGVmdCAtIHN0YWdlUmVjdC5sZWZ0KSAvIHpvb207XG4gICAgY29uc3QgZ3JvdXBTdGFnZVRvcCA9IChncm91cEdyaWRzdGVyUmVjdC50b3AgLSBzdGFnZVJlY3QudG9wKSAvIHpvb207XG5cbiAgICBsZXQgaW5uZXJDb2xzID0gZGVmYXVsdENvbHM7XG4gICAgbGV0IGlubmVyUm93cyA9IGRlZmF1bHRSb3dzO1xuICAgIGlmICh0eXBlb2YgcGF5bG9hZEFueVsncmVzb2x2ZU5vZGUnXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2FtcGxlSW5zaWRlID0gKHBheWxvYWRBbnlbJ3Jlc29sdmVOb2RlJ10gYXMgKGluc2lkZTogYm9vbGVhbikgPT4gVF9ncmlkTGF5b3V0X25ld05vZGUgfCB1bmRlZmluZWQpKHRydWUpO1xuICAgICAgICBpZiAoc2FtcGxlSW5zaWRlKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBzYW1wbGVJbnNpZGUuY29scyA9PT0gJ251bWJlcicpIHsgaW5uZXJDb2xzID0gc2FtcGxlSW5zaWRlLmNvbHM7IH1cbiAgICAgICAgICBpZiAodHlwZW9mIHNhbXBsZUluc2lkZS5yb3dzID09PSAnbnVtYmVyJykgeyBpbm5lclJvd3MgPSBzYW1wbGVJbnNpZGUucm93czsgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZmFsbGJhY2sgdG8gZGVmYXVsdCBjb2xzIGFuZCByb3dzXG4gICAgICB9XG4gICAgfVxuICAgIGlubmVyQ29scyA9IE1hdGgubWluKGlubmVyQ29scywgdG90YWxDb2xzKTtcblxuICAgIGNvbnN0IGdyb3VwV2lkdGggPSBncm91cEdyaWRzdGVyLmNsaWVudFdpZHRoIHx8IChncm91cEdyaWRzdGVyUmVjdC53aWR0aCAvIHpvb20pIHx8IDQwMDtcbiAgICBjb25zdCBjb2xTdGVwID0gKGdyb3VwV2lkdGggKyAyKSAvIHRvdGFsQ29scztcbiAgICBjb25zdCByb3dTdGVwID0gMTg7XG4gICAgY29uc3QgcmVsWCA9IChldmVudC5jbGllbnRYIC0gZ3JvdXBHcmlkc3RlclJlY3QubGVmdCkgLyB6b29tICsgZ3JvdXBHcmlkc3Rlci5zY3JvbGxMZWZ0O1xuICAgIGNvbnN0IHJlbFkgPSAoZXZlbnQuY2xpZW50WSAtIGdyb3VwR3JpZHN0ZXJSZWN0LnRvcCkgLyB6b29tICsgZ3JvdXBHcmlkc3Rlci5zY3JvbGxUb3A7XG4gICAgY29uc3QgcmF3Q29sID0gTWF0aC5mbG9vcihyZWxYIC8gY29sU3RlcCk7XG4gICAgY29uc3QgcmF3Um93ID0gTWF0aC5mbG9vcihyZWxZIC8gcm93U3RlcCk7XG4gICAgY29uc3Qgc25hcCA9IGZpbmRTbmFwUG9zaXRpb25JbnNpZGVHcm91cChcbiAgICAgIGdyb3VwTm9kZS5jaGlsZHJlbiA/PyBbXSxcbiAgICAgIHJhd0NvbCxcbiAgICAgIHJhd1JvdyxcbiAgICAgIGlubmVyQ29scyxcbiAgICAgIGlubmVyUm93cyxcbiAgICAgIHRvdGFsQ29scyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbDogc25hcC5jb2wsXG4gICAgICByb3c6IHNuYXAucm93LFxuICAgICAgY29sczogaW5uZXJDb2xzLFxuICAgICAgcm93czogaW5uZXJSb3dzLFxuICAgICAgcGl4ZWxMZWZ0OiBncm91cFN0YWdlTGVmdCArIHNuYXAuY29sICogY29sU3RlcCxcbiAgICAgIHBpeGVsVG9wOiBncm91cFN0YWdlVG9wICsgc25hcC5yb3cgKiByb3dTdGVwLFxuICAgICAgcGl4ZWxXaWR0aDogTWF0aC5tYXgoMzAsIGlubmVyQ29scyAqIGNvbFN0ZXAgLSAyKSxcbiAgICAgIHBpeGVsSGVpZ2h0OiBNYXRoLm1heCgyMCwgaW5uZXJSb3dzICogcm93U3RlcCAtIDIpLFxuICAgICAgaXNJbnNpZGVHcm91cDogdHJ1ZSxcbiAgICAgIHRhcmdldFBhcmVudElkOiBncm91cE5vZGUuaWQsXG4gICAgICBncm91cFRpdGxlOiAnS2jhu5FpIGdow6lwJyxcbiAgICAgIGNhcmRUaXRsZSxcbiAgICAgIGNhcmRJY29uQ2xhc3MsXG4gICAgICBjYXJkSWNvblRleHQsXG4gICAgICBob3ZlcmVkR3JpZHN0ZXI6IGdyb3VwR3JpZHN0ZXIgYXMgSFRNTEVsZW1lbnQsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1hcmdpbiA9IDEyO1xuICBjb25zdCByb3dTdGVwID0gNjg7XG4gIGNvbnN0IGdyaWRzdGVyV2lkdGggPSB1bnNjYWxlZFdpZHRoIHx8IGdyaWRzdGVyRWwuY2xpZW50V2lkdGggfHwgMTIwMDtcbiAgY29uc3QgY29sU3RlcCA9IE1hdGgubWF4KDIwLCAoZ3JpZHN0ZXJXaWR0aCAtIG1hcmdpbikgLyB0b3RhbENvbHMpO1xuICBjb25zdCBncmlkc3RlclN0YWdlTGVmdCA9IChncmlkc3RlclJlY3QubGVmdCAtIHN0YWdlUmVjdC5sZWZ0KSAvIHpvb207XG4gIGNvbnN0IGdyaWRzdGVyU3RhZ2VUb3AgPSAoZ3JpZHN0ZXJSZWN0LnRvcCAtIHN0YWdlUmVjdC50b3ApIC8gem9vbTtcbiAgY29uc3QgcmVsWCA9IHN0YWdlTW91c2VYIC0gZ3JpZHN0ZXJTdGFnZUxlZnQgKyBncmlkc3RlckVsLnNjcm9sbExlZnQgLSBtYXJnaW47XG4gIGNvbnN0IHJlbFkgPSBzdGFnZU1vdXNlWSAtIGdyaWRzdGVyU3RhZ2VUb3AgKyBncmlkc3RlckVsLnNjcm9sbFRvcCAtIG1hcmdpbjtcbiAgY29uc3QgaXRlbUNvbHMgPSBNYXRoLm1pbihkZWZhdWx0Q29scywgdG90YWxDb2xzKTtcbiAgY29uc3QgY29sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odG90YWxDb2xzIC0gaXRlbUNvbHMsIE1hdGguZmxvb3IocmVsWCAvIGNvbFN0ZXApKSk7XG4gIGNvbnN0IHJvdyA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IocmVsWSAvIHJvd1N0ZXApKTtcblxuICByZXR1cm4ge1xuICAgIGNvbCxcbiAgICByb3csXG4gICAgY29sczogaXRlbUNvbHMsXG4gICAgcm93czogZGVmYXVsdFJvd3MsXG4gICAgcGl4ZWxMZWZ0OiBncmlkc3RlclN0YWdlTGVmdCArIG1hcmdpbiArIGNvbCAqIGNvbFN0ZXAsXG4gICAgcGl4ZWxUb3A6IGdyaWRzdGVyU3RhZ2VUb3AgKyBtYXJnaW4gKyByb3cgKiByb3dTdGVwLFxuICAgIHBpeGVsV2lkdGg6IGl0ZW1Db2xzICogY29sU3RlcCAtIG1hcmdpbixcbiAgICBwaXhlbEhlaWdodDogZGVmYXVsdFJvd3MgKiByb3dTdGVwIC0gbWFyZ2luLFxuICAgIGlzSW5zaWRlR3JvdXA6IGZhbHNlLFxuICAgIGNhcmRUaXRsZSxcbiAgICBjYXJkSWNvbkNsYXNzLFxuICAgIGNhcmRJY29uVGV4dCxcbiAgICBob3ZlcmVkR3JpZHN0ZXI6IChyb290R3JpZHN0ZXIgYXMgSFRNTEVsZW1lbnQpID8/IHVuZGVmaW5lZCxcbiAgfTtcbn07XG5cblxuLyoqIFTDrG0ga2jhu5FpIHRoZW8gaWQgdHJvbmcgY8OieSwgxJFpIHPDonUgdsOgbyBt4buNaSBjb250YWluZXIuICovXG5leHBvcnQgY29uc3QgZmluZE5vZGVSZWN1cnNpdmUgPSAocm9vdDogVF9ncmlkTGF5b3V0X25vZGUsIGlkOiBzdHJpbmcpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChyb290LmlkID09PSBpZCkge1xuICAgIHJldHVybiByb290O1xuICB9XG5cbiAgZm9yIChjb25zdCBjaGlsZCBvZiByb290LmNoaWxkcmVuID8/IFtdKSB7XG4gICAgY29uc3QgZm91bmQgPSBmaW5kTm9kZVJlY3Vyc2l2ZShjaGlsZCwgaWQpO1xuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKiBUw6xtIGto4buRaSBDSEEgdHLhu7FjIHRp4bq/cCBj4bunYSBt4buZdCBraOG7kWksIMSRaSBzw6J1IHbDoG8gbeG7jWkgY29udGFpbmVyLiAqL1xuZXhwb3J0IGNvbnN0IGZpbmRQYXJlbnRSZWN1cnNpdmUgPSAocm9vdDogVF9ncmlkTGF5b3V0X25vZGUsIGlkOiBzdHJpbmcpOiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCA9PiB7XG4gIGZvciAoY29uc3QgY2hpbGQgb2Ygcm9vdC5jaGlsZHJlbiA/PyBbXSkge1xuICAgIGlmIChjaGlsZC5pZCA9PT0gaWQpIHtcbiAgICAgIHJldHVybiByb290O1xuICAgIH1cblxuICAgIGNvbnN0IGZvdW5kID0gZmluZFBhcmVudFJlY3Vyc2l2ZShjaGlsZCwgaWQpO1xuXG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogVGjhuqMga2jhu5FpIHbDoG8gxJHDum5nIMO0IG3DoCBnaG9zdCDEkWFuZyBjaOG7iSwgxJHhuql5IGPDoWMga2jhu5FpIHZhIGNo4bqhbSB4deG7kW5nIGTGsOG7m2kuXG4gKlxuICogR2hvc3QgxJFhbmcgbuG6sW0gdHJvbmcgbeG7mXQgY29udGFpbmVyIChgaXNJbnNpZGVHcm91cGApIHRow6wgdGjhuqMgdsOgbyBydeG7mXQgY29udGFpbmVyIMSRw7M7IGtow7RuZyB0w6xtIHRo4bqleVxuICogY29udGFpbmVyIHRow6wgdHLhuqMgYGZhbHNlYCBjaOG7qSBLSMOUTkcgcsahaSB24buBIGzGsOG7m2kgZ+G7kWMg4oCUIHRo4bqjIG5o4bqnbSBj4bqlcCBraMOzIG5o4bqtbiByYSBoxqFuIGzDoCBraMO0bmcgdGjhuqMuXG4gKi9cbmV4cG9ydCBjb25zdCBkcm9wTm9kZUF0Q29vcmRpbmF0ZXMgPSAoXG4gIHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlLFxuICBnaG9zdDogVF9ncmlkTGF5b3V0X2Ryb3BHaG9zdCxcbiAgbmV3Tm9kZTogVF9ncmlkTGF5b3V0X25ld05vZGVcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCBub2RlVG9BZGQ6IFRfZ3JpZExheW91dF9ub2RlID0ge1xuICAgIC4uLm5ld05vZGUsXG4gICAgaWQ6IG5ld05vZGUuaWQgPz8gdXVpZCgpLFxuICAgIHg6IGdob3N0LmNvbCxcbiAgICB5OiBnaG9zdC5yb3csXG4gICAgY29sczogZ2hvc3QuY29scyxcbiAgICByb3dzOiBnaG9zdC5yb3dzLFxuICB9O1xuXG4gIGlmIChnaG9zdC5pc0luc2lkZUdyb3VwICYmIGdob3N0LnRhcmdldFBhcmVudElkKSB7XG4gICAgY29uc3QgcGFyZW50Tm9kZSA9IGZpbmROb2RlUmVjdXJzaXZlKHJvb3QsIGdob3N0LnRhcmdldFBhcmVudElkKTtcblxuICAgIGlmICghcGFyZW50Tm9kZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBwYXJlbnROb2RlLmNoaWxkcmVuID0gcGFyZW50Tm9kZS5jaGlsZHJlbiA/PyBbXTtcbiAgICByZXNvbHZlQ29sbGlzaW9uc0FuZEluc2VydChwYXJlbnROb2RlLmNoaWxkcmVuLCBub2RlVG9BZGQpO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByb290LmNoaWxkcmVuID0gcm9vdC5jaGlsZHJlbiA/PyBbXTtcbiAgcmVzb2x2ZUNvbGxpc2lvbnNBbmRJbnNlcnQocm9vdC5jaGlsZHJlbiwgbm9kZVRvQWRkKTtcblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cblxuLyoqIEto4buRaSBjw7MgcGjhuqNpIENPTlRBSU5FUiBraMO0bmcg4oCUIHThu6ljIGPDsyBraOG7kWkgY29uIGLDqm4gdHJvbmcuICovXG5leHBvcnQgY29uc3QgaXNDb250YWluZXJOb2RlID0gKG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKTogYm9vbGVhbiA9PiAobm9kZS5jaGlsZHJlbj8ubGVuZ3RoID8/IDApID4gMDtcblxuLyoqIEto4buRaSBjw7MgbuG6sW0gTOG7kk5HIGLDqm4gdHJvbmcgbeG7mXQgY29udGFpbmVyIGtow7RuZyAoa2jDtG5nIHBo4bqjaSBjb24gdHLhu7FjIHRp4bq/cCBj4bunYSBn4buRYykuICovXG5leHBvcnQgY29uc3QgaXNOb2RlTmVzdGVkSW5zaWRlID0gKHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkLCBub2RlSWQ6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIXJvb3Q/LmNoaWxkcmVuKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICFyb290LmNoaWxkcmVuLnNvbWUoKGNoaWxkKSA9PiBjaGlsZC5pZCA9PT0gbm9kZUlkKTtcbn07XG5cbi8qKlxuICogQ8OzIMSRxrDhu6NjIMSR4buVaSBraOG7kWkgxJHGoW4g4oaUIGNvbnRhaW5lciBraMO0bmcuXG4gKlxuICog8J+UtCBCYSBow6BtIGPhu50gbsOgeSBQSOG6okkgbMOgIG5ndeG7k24gZHV5IG5o4bqldCBjaG8gY+G6oyB0aGFuaCBjw7RuZyBj4bulIGPhu6dhIHRoxrAgdmnhu4duIGzhuqtuIG1lbnUgZG8gbsahaSBkw7luZyB04buxXG4gKiBk4buxbmcuIFRyxrDhu5tjIMSRw6J5IG7GoWkgZMO5bmcgcGjhuqNpIGNow6lwIGzhuqFpIHF1eSB04bqvYyDEkeG7gyBk4buxbmcgbWVudSB0csaw4bubYyBsw7pjIHJlbmRlciwgdsOgIGhhaSBi4bqjbiBs4buHY2ggbmhhdVxuICogbeG7l2kga2hpIHRoxrAgdmnhu4duIMSR4buVaSB0cuG6p24gbOG7k25nIGPhuqVwIG3DoCBraMO0bmcgY8OzIGfDrCBiw6FvLlxuICovXG5leHBvcnQgY29uc3QgY2FuVG9nZ2xlVHlwZU5vZGUgPSAocm9vdDogVF9ncmlkTGF5b3V0X25vZGUgfCB1bmRlZmluZWQsIG5vZGU6IFRfZ3JpZExheW91dF9ub2RlKTogYm9vbGVhbiA9PlxuICBpc0NvbnRhaW5lck5vZGUobm9kZSkgfHwgIWlzTm9kZU5lc3RlZEluc2lkZShyb290LCBub2RlLmlkKTtcblxuLyoqIEPDsyDEkcaw4bujYyB0aMOqbSBraOG7kWkgdsOgbyBCw4pOIFRST05HIGto4buRaSBuw6B5IGtow7RuZy4gKi9cbmV4cG9ydCBjb25zdCBjYW5BZGRJbnNpZGVOb2RlID0gKHJvb3Q6IFRfZ3JpZExheW91dF9ub2RlIHwgdW5kZWZpbmVkLCBub2RlOiBUX2dyaWRMYXlvdXRfbm9kZSk6IGJvb2xlYW4gPT5cbiAgaXNDb250YWluZXJOb2RlKG5vZGUpICYmICFpc05vZGVOZXN0ZWRJbnNpZGUocm9vdCwgbm9kZS5pZCk7XG4iXX0=
|
|
@@ -32,10 +32,9 @@ export const gridLayoutRootConfig = () => ({
|
|
|
32
32
|
swapWhileDragging: true,
|
|
33
33
|
draggable: {
|
|
34
34
|
enabled: true,
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
|
|
38
|
-
delayStart: 160,
|
|
35
|
+
// delayStart: 0 vì kéo qua tay cầm chuyên dụng (dragHandleClass) và ignoreContent: true.
|
|
36
|
+
// Khi người dùng bấm vào thanh tay cầm là chủ động kéo, không cần trễ 160ms tránh huỷ kéo.
|
|
37
|
+
delayStart: 0,
|
|
39
38
|
// 🔴 `checkDragHandleClass` duyệt DOM từ chỗ bấm NGƯỢC LÊN CHA, và trên MỖI node nó kiểm
|
|
40
39
|
// `dragHandleClass` TRƯỚC `ignoreContentClass`. Vì vậy một phần tử KHÔNG được mang cả hai class
|
|
41
40
|
// cùng lúc — mang cả hai thì lib gặp tay cầm trước, trả `true`, class chặn không tới lượt.
|
|
@@ -120,4 +119,4 @@ export const gridLayoutNestedConfig = () => ({
|
|
|
120
119
|
* Xảy ra trong nhịp giữa lúc component dựng và lúc `init()` chạy.
|
|
121
120
|
*/
|
|
122
121
|
export const emptyRootNode = () => ({ id: 'root', x: 0, y: 0, cols: 12, rows: 0, children: [] });
|
|
123
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItY29uZmlnLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvZ3JpZHN0ZXItY29uZmlnLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBa0IsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2hGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDekQsMERBQTBEO0lBQzFELG1HQUFtRztJQUNuRyxtR0FBbUc7SUFDbkcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhO0lBRWhDLG9DQUFvQztJQUNwQyxvRUFBb0U7SUFDcEUsaUdBQWlHO0lBQ2pHLDZFQUE2RTtJQUM3RSxnR0FBZ0c7SUFDaEcsaUNBQWlDO0lBQ2pDLGdEQUFnRDtJQUNoRCxXQUFXLEVBQUUsV0FBVyxDQUFDLElBQUk7SUFDN0IsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlO0lBRXhDLHFDQUFxQztJQUNyQyxpR0FBaUc7SUFDakcsOEZBQThGO0lBQzlGLGlHQUFpRztJQUNqRyxnREFBZ0Q7SUFDaEQsU0FBUyxFQUFFLElBQUk7SUFDZixxRUFBcUU7SUFDckUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUN2RSxlQUFlLEVBQUUsSUFBSTtJQUNyQixJQUFJLEVBQUUsSUFBSTtJQUNWLGlCQUFpQixFQUFFLElBQUk7SUFFdkIsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLElBQUk7UUFDYiw2RkFBNkY7UUFDN0YsOEZBQThGO1FBQzlGLHlDQUF5QztRQUN6QyxVQUFVLEVBQUUsR0FBRztRQUNmLHlGQUF5RjtRQUN6RixnR0FBZ0c7UUFDaEcsMkZBQTJGO1FBQzNGLGtCQUFrQixFQUFFLHVDQUF1QztRQUMzRCxhQUFhLEVBQUUsSUFBSTtRQUNuQixlQUFlLEVBQUUsaUNBQWlDO0tBQ25EO0lBRUQsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLElBQUk7UUFDYix1RUFBdUU7UUFDdkUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFO0tBQ3hGO0lBRUQsTUFBTSxFQUFFLEVBQUU7SUFDVixXQUFXLEVBQUUsSUFBSTtJQUNqQixpQkFBaUIsRUFBRSxFQUFFO0lBQ3JCLE9BQU8sRUFBRSxFQUFFO0lBQ1gsT0FBTyxFQUFFLEVBQUU7SUFDWCxPQUFPLEVBQUUsQ0FBQztJQUVWLGlHQUFpRztJQUNqRyxrR0FBa0c7SUFDbEcsa0dBQWtHO0lBQ2xHLHFEQUFxRDtJQUNyRCxPQUFPLEVBQUUsSUFBSTtJQUNiLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFFbEIsaUdBQWlHO0lBQ2pHLDhGQUE4RjtJQUM5Riw0Q0FBNEM7SUFDNUMsYUFBYSxFQUFFLElBQUk7SUFFbkIsV0FBVyxFQUFFLElBQUk7SUFDakIsY0FBYyxFQUFFLEVBQUU7SUFDbEIsZUFBZSxFQUFFLENBQUM7SUFDbEIsZUFBZSxFQUFFLENBQUM7SUFDbEIsV0FBVyxFQUFFLENBQUM7SUFDZCxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7Q0FDckIsQ0FBQyxDQUFDO0FBRUg7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxHQUFtQixFQUFFLENBQUMsQ0FBQztJQUMzRCxHQUFHLG9CQUFvQixFQUFFO0lBRXpCLGdHQUFnRztJQUNoRyxnR0FBZ0c7SUFDaEcsdUVBQXVFO0lBQ3ZFLFdBQVcsRUFBRSxLQUFLO0lBRWxCLG1HQUFtRztJQUNuRyxNQUFNLEVBQUUsQ0FBQztJQUNULGlHQUFpRztJQUNqRyxrR0FBa0c7SUFDbEcsNkVBQTZFO0lBQzdFLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLGlCQUFpQixFQUFFLENBQUM7SUFFcEIsa0ZBQWtGO0lBQ2xGLGNBQWMsRUFBRSxFQUFFO0lBQ2xCLE9BQU8sRUFBRSxDQUFDO0lBQ1YsV0FBVyxFQUFFLENBQUM7SUFDZCxlQUFlLEVBQUUsQ0FBQztJQUNsQixlQUFlLEVBQUUsQ0FBQztJQUVsQix3REFBd0Q7SUFDeEQsaUdBQWlHO0lBQ2pHLHFFQUFxRTtJQUNyRSxTQUFTLEVBQUU7UUFDVCxHQUFHLG9CQUFvQixFQUFFLENBQUMsU0FBUztRQUNuQyxlQUFlLEVBQUUsdUNBQXVDO0tBQ3pEO0lBRUQsa0dBQWtHO0lBQ2xHLGtHQUFrRztJQUNsRywwRkFBMEY7SUFDMUYsZUFBZSxFQUFFLEtBQUs7SUFFdEIsZ0ZBQWdGO0lBQ2hGLG1HQUFtRztJQUNuRyxrREFBa0Q7SUFDbEQsdUJBQXVCLEVBQUUsSUFBSTtJQUM3QixxQkFBcUIsRUFBRSxJQUFJO0NBQzVCLENBQUMsQ0FBQztBQUVIOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFzQixFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBhY3RUeXBlLCBEaXNwbGF5R3JpZCwgR3JpZHN0ZXJDb25maWcsIEdyaWRUeXBlIH0gZnJvbSAnZ3JpZHN0ZXIxOCc7XG5pbXBvcnQgeyBUX2dyaWRMYXlvdXRfbm9kZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvZ3JpZC1sYXlvdXQuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBD4bqldSBow6xuaCBncmlkc3RlciBjaG8gbMaw4bubaSBD4bqkUCBUUkFORy5cbiAqXG4gKiBN4buNaSBnacOhIHRy4buLIGTGsOG7m2kgxJHDonkgxJHhu4F1IMSR4bq/biB04burIG3hu5l0IGzhu5dpIMSRw6MgxJFvIMSRxrDhu6NjIHRyw6puIHPhuqNuIHBo4bqpbSB0aOG6rXQsIGtow7RuZyBwaOG6o2kgY2jhu41uIHRoZW8gY+G6o21cbiAqIHTDrW5oLiDEkOG7lWkgYuG6pXQga+G7syBkw7JuZyBuw6BvIGPDsyBk4bqldSDwn5S0IHPhur0gbMOgbSBz4buRbmcgbOG6oWkgxJHDum5nIGzhu5dpIGdoaSB0cm9uZyBjb21tZW50LlxuICovXG5leHBvcnQgY29uc3QgZ3JpZExheW91dFJvb3RDb25maWcgPSAoKTogR3JpZHN0ZXJDb25maWcgPT4gKHtcbiAgLy8g8J+UtCBWZXJ0aWNhbEZpeGVkIOKAlCBD4bqkTSDEkeG7lWkgc2FuZyBGaXQgaGF5IFNjcm9sbFZlcnRpY2FsLlxuICAvLyBgRml0YCBjaGlhIMSR4buBdSBjaGnhu4F1IGNhbyBraHVuZyBjaG8gc+G7kSBow6BuZyDEkWFuZyBkw7luZywgbsOqbiBjYXJkIGtoYWkgYHJvd3M6IDJgIHBow6xuaCB04burIDEyNHB4IGzDqm5cbiAgLy8gMjQ3cHguIGBTY3JvbGxWZXJ0aWNhbGAgS0jDlE5HIMSR4buNYyBgZml4ZWRSb3dIZWlnaHRgIChtw6MgbGliOiBjaOG7iSBgRml4ZWRgIHbDoCBgVmVydGljYWxGaXhlZGAgxJHhu41jKS5cbiAgZ3JpZFR5cGU6IEdyaWRUeXBlLlZlcnRpY2FsRml4ZWQsXG5cbiAgLy8g8J+UtCBOb25lIOKAlCBD4bqkTSBxdWF5IGzhuqFpIENvbXBhY3RVcC5cbiAgLy8gYENvbXBhY3RVcGAgaMO6dCBt4buNaSBraOG7kWkgbMOqbiBzw6F0IG5oYXUgTkdBWSBzYXUgbeG7l2kgdGhhbyB0w6FjLCBuw6puOlxuICAvLyAgwrcga8OpbyBtw6lwIGTGsOG7m2kgY2hvIGto4buRaSBjYW8gdGjDqm0g4oaSIGNo4buXIGto4buRaSBkxrDhu5tpIHbhu6thIG5oxrDhu51uZyBi4buLIGjDunQgbOG6pXAgbOG6oWkgdOG7qWMgdGjDrCwgY8O6IGvDqW8gYuG7i1xuICAvLyAgICBgY2hlY2tHcmlkQ29sbGlzaW9uYCBiw6FvIHZhIGNo4bqhbSBy4buTaSBIT8OATiBOR1VZw4pOIChraOG7kWkgxJHhu6luZyBpbSBkw7kga8Opbyk7XG4gIC8vICDCtyBrw6lvIHRo4bqjIMSR4buVaSB24buLIHRyw60g4oaSIGto4buRaSB24burYSBuaMaw4budbmcgY2jhu5cgYuG7iyBow7p0IHbhu4EgbmdheSwga2jhu5FpIMSRYW5nIGvDqW8ga2jDtG5nIGPDsyBjaOG7lyDEkeG6t3QgdsOgXG4gIC8vICAgIHRyZW8gbMahIGzhu61uZyBnaeG7r2EgaGFpIGto4buRaS5cbiAgLy8gTXXhu5FuIGThu5NuIGtow610IHRow6wgZ+G7jWkgYHNhcEdvbigpYCBj4bunYSBzZXJ2aWNlLlxuICBjb21wYWN0VHlwZTogQ29tcGFjdFR5cGUuTm9uZSxcbiAgZGlzcGxheUdyaWQ6IERpc3BsYXlHcmlkLk9uRHJhZ0FuZFJlc2l6ZSxcblxuICAvLyDwn5S0IHB1c2hJdGVtczogdHJ1ZSDigJQgQ+G6pE0gxJHhu4MgZmFsc2UuXG4gIC8vIGBzd2FwYCBj4bunYSBsaWIgQ0jhu4ggaG/DoW4gduG7iyDEkcaw4bujYyBIQUkgS0jhu5BJIEPDmU5HIEvDjUNIIFRIxq/hu5pDIChtw6MgbGliIGBjaGVja1N3YXBgOiB0w61uaCBkaWZmWC9kaWZmWVxuICAvLyBy4buTaSBob8OhbiB24buLLCBs4buHY2gga8OtY2ggdGjGsOG7m2MgdGjDrCBgY2hlY2tDb2xsaXNpb25gIGLDoW8gdmEgY2jhuqFtIHbDoCBob8OgbiBuZ3V5w6puKS4gS2jhu5FpIDN4MiBn4bq3cFxuICAvLyBjb250YWluZXIgN3g1IG7Dqm4ga2jDtG5nIHN3YXAgxJHGsOG7o2MsIG3DoCBgcHVzaEl0ZW1zOiBmYWxzZWAgY8Wpbmcga2jDtG5nIGNobyBjb250YWluZXIgbmjGsOG7nW5nIMSRxrDhu51uZ1xuICAvLyDihpIgQuG6viBU4bquQzoga2jhu5FpIMSRYW5nIGvDqW8ga2jDtG5nIMSR4bq3dCDEkcaw4bujYyDhu58gxJHDonUuXG4gIHB1c2hJdGVtczogdHJ1ZSxcbiAgLy8gY2jhu4kgxJHhuql5IFhV4buQTkc6IMSR4bqpeSBuZ2FuZyBsw6BtIHjDtCBs4buHY2ggYuG7kSBj4bulYyBj4buZdCBuZ8aw4budaSBkw7luZyB24burYSDEkeG6t3RcbiAgcHVzaERpcmVjdGlvbnM6IHsgbm9ydGg6IGZhbHNlLCBlYXN0OiBmYWxzZSwgc291dGg6IHRydWUsIHdlc3Q6IGZhbHNlIH0sXG4gIHB1c2hSZXNpemVJdGVtczogdHJ1ZSxcbiAgc3dhcDogdHJ1ZSxcbiAgc3dhcFdoaWxlRHJhZ2dpbmc6IHRydWUsXG5cbiAgZHJhZ2dhYmxlOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvLyDwn5S0IEtIw5RORyDEkcaw4bujYyBi4buPLiBLaMO0bmcgY8OzIG7DsyB0aMOsIGdyaWRzdGVyIHbDoG8gY2jhur8gxJHhu5kga8OpbyBuZ2F5IHThu6sgYG1vdXNlZG93bmAsIG7Dqm4gY2jhu4kgYuG6pW1cbiAgICAvLyBDSOG7jE4gbeG7mXQga2jhu5FpIGzDoCBuw7MgxJHDoyBuaMOtY2ggdGhlbyBkw7kgY2h14buZdCDEkeG7qW5nIHnDqm4uIExpYiB04buxIGh14bu3IGvDqW8ga2hpIG5o4bqjIGNodeG7mXQgdHLGsOG7m2MgbeG7kWNcbiAgICAvLyBuw6B5IG7Dqm4gY8O6IGLhuqVtIGNo4buNbiB24bqrbiDEg24gbmd1ecOqbiB24bq5bi5cbiAgICBkZWxheVN0YXJ0OiAxNjAsXG4gICAgLy8g8J+UtCBgY2hlY2tEcmFnSGFuZGxlQ2xhc3NgIGR1eeG7h3QgRE9NIHThu6sgY2jhu5cgYuG6pW0gTkfGr+G7okMgTMOKTiBDSEEsIHbDoCB0csOqbiBN4buWSSBub2RlIG7DsyBraeG7g21cbiAgICAvLyBgZHJhZ0hhbmRsZUNsYXNzYCBUUsav4buaQyBgaWdub3JlQ29udGVudENsYXNzYC4gVsOsIHbhuq15IG3hu5l0IHBo4bqnbiB04butIEtIw5RORyDEkcaw4bujYyBtYW5nIGPhuqMgaGFpIGNsYXNzXG4gICAgLy8gY8O5bmcgbMO6YyDigJQgbWFuZyBj4bqjIGhhaSB0aMOsIGxpYiBn4bq3cCB0YXkgY+G6p20gdHLGsOG7m2MsIHRy4bqjIGB0cnVlYCwgY2xhc3MgY2jhurduIGtow7RuZyB04bubaSBsxrDhu6N0LlxuICAgIGlnbm9yZUNvbnRlbnRDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtYmxvY2stcGFyZW50LWRyYWcnLFxuICAgIGlnbm9yZUNvbnRlbnQ6IHRydWUsXG4gICAgZHJhZ0hhbmRsZUNsYXNzOiAnbGlicy11aS1ncmlkLWxheW91dC1kcmFnLWhhbmRsZScsXG4gIH0sXG5cbiAgcmVzaXphYmxlOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvLyDEkeG7pyA4IGjGsOG7m25nIG5oxrAgY+G7rWEgc+G7lSB0aMaw4budbmc7IGNo4buJIGPDsyBnw7NjIGTGsOG7m2ktcGjhuqNpIHRow6wgcXXDoSBraMOzIHRyw7puZ1xuICAgIGhhbmRsZXM6IHsgczogdHJ1ZSwgZTogdHJ1ZSwgbjogdHJ1ZSwgdzogdHJ1ZSwgc2U6IHRydWUsIG5lOiB0cnVlLCBzdzogdHJ1ZSwgbnc6IHRydWUgfSxcbiAgfSxcblxuICBtYXJnaW46IDEyLFxuICBvdXRlck1hcmdpbjogdHJ1ZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDQwLFxuICBtaW5Db2xzOiAxMixcbiAgbWF4Q29sczogMTIsXG4gIG1pblJvd3M6IDIsXG5cbiAgLy8g8J+UtCBLSMOUTkcgZ2nhu5tpIGjhuqFuIGNoaeG7gXUgY2FvIGto4buRaS4gTGliIGPDsyBCQSB0cuG6p24gbeG6t2MgxJHhu4tuaCBwaOG6o2kgdsO0IGhp4buHdSBob8OhIEPDmU5HIEzDmkMsIHRoaeG6v3UgbeG7mXRcbiAgLy8gY8OhaSBsw6AgduG6q24gYuG7iyBjaOG6t246IGBtYXhJdGVtUm93czogNTBgIMK3IGBtYXhJdGVtQ29sczogNTBgIMK3IGBtYXhJdGVtQXJlYTogMjUwMGAgKHRy4bqnbiBESeG7hk4gVMONQ0hcbiAgLy8gY29scyDDlyByb3dzIOKAlCBraMOzIHRo4bqleSBuaOG6pXQ6IGto4buRaSAxMiBj4buZdCBjaOG7iSBj4bqnbiAyMDkgaMOgbmcgbMOgIMSR4bulbmcgdHLhuqduIGTDuSBoYWkgdHLhuqduIGtpYSBjw7JuIGTGsCkuXG4gIC8vIGBtYXhSb3dzYCBsw6AgdHLhuqduIGPhu6dhIEPhuqIgTMav4buaSSwgY8WpbmcgcGjhuqNpIG7hu5tpIHRoZW8uXG4gIG1heFJvd3M6IDUwMDAsXG4gIG1heEl0ZW1Sb3dzOiA1MDAwLFxuICBtYXhJdGVtQ29sczogMTIsXG4gIG1heEl0ZW1BcmVhOiA2MDAwMCxcblxuICAvLyDwn5S0IFRy4bqnbiBM4buaUCBDSOG7kk5HLiBN4bq3YyDEkeG7i25oIGPhu6dhIGxpYiBsw6AgMiDigJQgcXXDoSB0aOG6pXA6IGtoaSBi4bqtdCBjaOG7k25nIGto4buRaSwgdGjGsCB2aeG7h24gZ8OhbiBt4buXaSBraOG7kWlcbiAgLy8gbeG7mXQgbOG7m3AgcmnDqm5nIMSR4buDIGNow7puZyBraMOhYyBuaGF1LCBuw6puIGNo4buJIDMga2jhu5FpIGzDoCDEkcOjIMSR4bulbmcgdHLhuqduIHbDoCBjw6FjIGto4buRaSBzYXUgbOG6oWkgcsahaSB24buBXG4gIC8vIGPDuW5nIGzhu5twLCB04bupYyBjaOG7k25nIG5oYXUgYuG7iyBjaOG6t24gdHLhu58gbOG6oWkuXG4gIG1heExheWVySW5kZXg6IDUwMDAsXG5cbiAgc2V0R3JpZFNpemU6IHRydWUsXG4gIGZpeGVkUm93SGVpZ2h0OiA1NixcbiAgZGVmYXVsdEl0ZW1Db2xzOiAzLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG4gIG1pbkl0ZW1Sb3dzOiAxLFxuICBtb2JpbGVCcmVha3BvaW50OiAtMSxcbn0pO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIGNobyBsxrDhu5tpIEzhu5JORyAocnXhu5l0IG3hu5l0IGNvbnRhaW5lcikuXG4gKlxuICogS+G6vyB0aOG7q2EgbMaw4bubaSB0cmFuZyBy4buTaSBnaGkgxJHDqCBwaOG6p24ga2jDoWMgYmnhu4d0LiBCYSDEkWnhu4NtIHF1YW4gdHLhu41uZyBuaOG6pXQ6IGBzZXRHcmlkU2l6ZWAgcGjhuqNpIFThuq5ULFxuICogdGF5IGPhuqdtIHBo4bqjaSBtYW5nIFTDik4gUknDik5HLCB2w6AgdOG7sS1jdeG7mW4ta2hpLWvDqW8gcGjhuqNpIFThuq5ULlxuICovXG5leHBvcnQgY29uc3QgZ3JpZExheW91dE5lc3RlZENvbmZpZyA9ICgpOiBHcmlkc3RlckNvbmZpZyA9PiAoe1xuICAuLi5ncmlkTGF5b3V0Um9vdENvbmZpZygpLFxuXG4gIC8vIPCflLQgUEjhuqJJIHThuq90IGNobyBsxrDhu5tpIGzhu5NuZy4gYHNldEdyaWRTaXplYCBsw6BtIGdyaWRzdGVyIHThu7EgZ2hpIHN0eWxlIHdpZHRoL2hlaWdodCBsw6puIENIw41OSCBuw7MsXG4gIC8vIHNpbmggdsOybmcgbOG6t3AgxJFvLXLhu5NpLWdoaSB24bubaSBSZXNpemVPYnNlcnZlciBj4bunYSBraHVuZyBuZ2/DoGkgKGtodW5nIMSR4buVaSDihpIgb25SZXNpemUgeG/DoSBzdHlsZSDihpJcbiAgLy8gc2V0R3JpZFNpemUgZ2hpIGzhuqFpKSDihpIgbMaw4bubaSBjb24gY28gZOG6p24gduG7gSA2NHg2NHB4IHRyb25nIGtodW5nIDg2OHB4LlxuICBzZXRHcmlkU2l6ZTogZmFsc2UsXG5cbiAgLy8ga2hlIDJweDoga2jhu5FpIGNvbiBsw6AgY8OhYyBkw7JuZyB0aMO0bmcgdGluIGPhu6dhIEPDmU5HIG3hu5l0IGNhcmQsIGtoZSBy4buZbmcgbMOgbSBjaMO6bmcgdHLDtG5nIG5oxrAgY2FyZCBy4budaVxuICBtYXJnaW46IDIsXG4gIC8vIEzGsOG7m2kgbOG7k25nIEtIw5RORyB04buxIGNo4burYSBs4buBIOKAlCBs4buBIGzDoCBj4bunYSBW4buOIGNvbnRhaW5lciAoYGNvbnRhaW5lclBhZGRpbmdgKSwga2jDtG5nIHBo4bqjaSBj4bunYSBsxrDhu5tpLlxuICAvLyDEkOG6t3Qg4bufIHbhu48gdGjDrCBydeG7mXQgY28gbOG6oWkgxJHDum5nIGLhurFuZyBwaOG6p24gY8OybiBs4bqhaSwgdGF5IGPhuqdtIHJlc2l6ZSBj4bunYSBraOG7kWkgY29uIGx1w7RuIG7hurFtIHRyb25nIHThuqdtXG4gIC8vIGNodeG7mXQgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2OiBcImzGsOG7m2kgY2hhIGPDsyBwYWRkaW5nIGNo4bupIGtvIHBo4bqjaSBjb25cIikuXG4gIG91dGVyTWFyZ2luOiBmYWxzZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDAsXG5cbiAgLy8gaMOgbmcgMTZweCBjaG8gYsaw4bubYyBrw6lvIG3hu4tuLCB2w6Agc8OgbiAxIGjDoG5nID0gMTZweCBuw6puIGto4buRaSBjbyDEkcaw4bujYyBuaOG7jyBoxqFuIG5oaeG7gXVcbiAgZml4ZWRSb3dIZWlnaHQ6IDE2LFxuICBtaW5Sb3dzOiAxLFxuICBtaW5JdGVtUm93czogMSxcbiAgZGVmYXVsdEl0ZW1Db2xzOiAyLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG5cbiAgLy8g8J+UtCBUYXkgY+G6p20gUknDik5HIOKAlCBD4bqkTSBkw7luZyBjaHVuZyB0w6puIHbhu5tpIGzGsOG7m2kgdHJhbmcuXG4gIC8vIGBjaGVja0RyYWdIYW5kbGVDbGFzc2AgdHLhuqMgYHRydWVgIOG7nyBub2RlIMSQ4bqmVSBUScOKTiBjw7MgYGRyYWdIYW5kbGVDbGFzc2AuIETDuW5nIGNodW5nIG3hu5l0IHTDqm4gdGjDrFxuICAvLyBsxrDhu5tpIENIQSBjxaluZyBuaOG6rW4gcmEgdGF5IGPhuqdtIGPhu6dhIGto4buRaSBjb24gdsOgIG5o4bqlYyBsdcO0biBjb250YWluZXIuXG4gIGRyYWdnYWJsZToge1xuICAgIC4uLmdyaWRMYXlvdXRSb290Q29uZmlnKCkuZHJhZ2dhYmxlLFxuICAgIGRyYWdIYW5kbGVDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtZHJhZy1oYW5kbGUtY2hpbGQnLFxuICB9LFxuXG4gIC8vIPCflLQgS8OJTyBNw4lQIHRow6wga2jhu5FpIGTGsOG7m2kgxJDhu6hORyBZw4pOLCBjaOG7iSBraG/huqNuZyB0cuG7kW5nIGdp4buvYSBoYWkga2jhu5FpIGNvIGdpw6NuLiBC4bqtdCAoa+G6vyB0aOG7q2EgdOG7qyBsxrDhu5tpXG4gIC8vIHRyYW5nKSB0aMOsIG3hu5dpIGPDuiBrw6lvIMSR4bqpeSBk4buTbiBj4bqjIGPhu5l0IHh14buRbmcg4oCUIG5nxrDhu51pIGTDuW5nIGNo4buJIG114buRbiBt4buZdCBraOG7kWkgdG8gaMahbiBt4buZdCBjaMO6dCBtw6AgY+G6o1xuICAvLyBjYXJkIGTDoGkgcmEuIGBwdXNoSXRlbXNgIHbhuqtuIGdp4buvOiBuw7MgbG8gdmnhu4djIEvDiU8gVEjhuqIgxJHhu5VpIGNo4buXLCBraMOhYyB2aeG7h2MgxJHhu5VpIGvDrWNoIHRoxrDhu5tjLlxuICBwdXNoUmVzaXplSXRlbXM6IGZhbHNlLFxuXG4gIC8vIPCflLQgVOG6r3QgdOG7sSBjdeG7mW4ga2hpIGvDqW8gdOG7m2kgc8OhdCBtw6lwLiBMaWIgdGjhuqV5IGNodeG7mXQgZ+G6p24gYmnDqm4gbMOgIGN14buZbiBsxrDhu5tpIHRoZW9cbiAgLy8gKGBzY3JvbGxTZW5zaXRpdml0eWApLCBuaMawbmcgbMaw4bubaSBjb24gbuG6sW0gdHJvbmcgY2FyZCBjw7MgYG92ZXJmbG93OiBoaWRkZW5gIOKAlCBjdeG7mW4g4bufIMSRw6J5IMSR4bqpeSBraOG7kWlcbiAgLy8gY29uIHJhIE5HT8OASSBraHVuZyBjb250YWluZXIgcuG7k2kga+G6uXQgbHXDtG4g4bufIMSRw7MuXG4gIGRpc2FibGVTY3JvbGxIb3Jpem9udGFsOiB0cnVlLFxuICBkaXNhYmxlU2Nyb2xsVmVydGljYWw6IHRydWUsXG59KTtcblxuLyoqXG4gKiBDw6J5IHLhu5duZyBkw7luZyBraGkgY2jGsGEgY8OzIGThu68gbGnhu4d1IOKAlCBt4bq3dCBwaOG6s25nIHbhur0gcmEgbeG7mXQgbMaw4bubaSB0cuG7kW5nIHRoYXkgdsOsIHbhu6EuXG4gKiBY4bqjeSByYSB0cm9uZyBuaOG7i3AgZ2nhu69hIGzDumMgY29tcG9uZW50IGThu7FuZyB2w6AgbMO6YyBgaW5pdCgpYCBjaOG6oXkuXG4gKi9cbmV4cG9ydCBjb25zdCBlbXB0eVJvb3ROb2RlID0gKCk6IFRfZ3JpZExheW91dF9ub2RlID0+ICh7IGlkOiAncm9vdCcsIHg6IDAsIHk6IDAsIGNvbHM6IDEyLCByb3dzOiAwLCBjaGlsZHJlbjogW10gfSk7XG4iXX0=
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItY29uZmlnLmRlZmluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvc2VydmljZXMvZ3JpZC1sYXlvdXQvc3JjL2RlZmluZXMvZ3JpZHN0ZXItY29uZmlnLmRlZmluZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBa0IsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR2hGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDekQsMERBQTBEO0lBQzFELG1HQUFtRztJQUNuRyxtR0FBbUc7SUFDbkcsUUFBUSxFQUFFLFFBQVEsQ0FBQyxhQUFhO0lBRWhDLG9DQUFvQztJQUNwQyxvRUFBb0U7SUFDcEUsaUdBQWlHO0lBQ2pHLDZFQUE2RTtJQUM3RSxnR0FBZ0c7SUFDaEcsaUNBQWlDO0lBQ2pDLGdEQUFnRDtJQUNoRCxXQUFXLEVBQUUsV0FBVyxDQUFDLElBQUk7SUFDN0IsV0FBVyxFQUFFLFdBQVcsQ0FBQyxlQUFlO0lBRXhDLHFDQUFxQztJQUNyQyxpR0FBaUc7SUFDakcsOEZBQThGO0lBQzlGLGlHQUFpRztJQUNqRyxnREFBZ0Q7SUFDaEQsU0FBUyxFQUFFLElBQUk7SUFDZixxRUFBcUU7SUFDckUsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUN2RSxlQUFlLEVBQUUsSUFBSTtJQUNyQixJQUFJLEVBQUUsSUFBSTtJQUNWLGlCQUFpQixFQUFFLElBQUk7SUFFdkIsU0FBUyxFQUFFO1FBQ1QsT0FBTyxFQUFFLElBQUk7UUFDYix5RkFBeUY7UUFDekYsMkZBQTJGO1FBQzNGLFVBQVUsRUFBRSxDQUFDO1FBQ2IseUZBQXlGO1FBQ3pGLGdHQUFnRztRQUNoRywyRkFBMkY7UUFDM0Ysa0JBQWtCLEVBQUUsdUNBQXVDO1FBQzNELGFBQWEsRUFBRSxJQUFJO1FBQ25CLGVBQWUsRUFBRSxpQ0FBaUM7S0FDbkQ7SUFFRCxTQUFTLEVBQUU7UUFDVCxPQUFPLEVBQUUsSUFBSTtRQUNiLHVFQUF1RTtRQUN2RSxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUU7S0FDeEY7SUFFRCxNQUFNLEVBQUUsRUFBRTtJQUNWLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGlCQUFpQixFQUFFLEVBQUU7SUFDckIsT0FBTyxFQUFFLEVBQUU7SUFDWCxPQUFPLEVBQUUsRUFBRTtJQUNYLE9BQU8sRUFBRSxDQUFDO0lBRVYsaUdBQWlHO0lBQ2pHLGtHQUFrRztJQUNsRyxrR0FBa0c7SUFDbEcscURBQXFEO0lBQ3JELE9BQU8sRUFBRSxJQUFJO0lBQ2IsV0FBVyxFQUFFLElBQUk7SUFDakIsV0FBVyxFQUFFLEVBQUU7SUFDZixXQUFXLEVBQUUsS0FBSztJQUVsQixpR0FBaUc7SUFDakcsOEZBQThGO0lBQzlGLDRDQUE0QztJQUM1QyxhQUFhLEVBQUUsSUFBSTtJQUVuQixXQUFXLEVBQUUsSUFBSTtJQUNqQixjQUFjLEVBQUUsRUFBRTtJQUNsQixlQUFlLEVBQUUsQ0FBQztJQUNsQixlQUFlLEVBQUUsQ0FBQztJQUNsQixXQUFXLEVBQUUsQ0FBQztJQUNkLGdCQUFnQixFQUFFLENBQUMsQ0FBQztDQUNyQixDQUFDLENBQUM7QUFFSDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQW1CLEVBQUUsQ0FBQyxDQUFDO0lBQzNELEdBQUcsb0JBQW9CLEVBQUU7SUFFekIsZ0dBQWdHO0lBQ2hHLGdHQUFnRztJQUNoRyx1RUFBdUU7SUFDdkUsV0FBVyxFQUFFLEtBQUs7SUFFbEIsbUdBQW1HO0lBQ25HLE1BQU0sRUFBRSxDQUFDO0lBQ1QsaUdBQWlHO0lBQ2pHLGtHQUFrRztJQUNsRyw2RUFBNkU7SUFDN0UsV0FBVyxFQUFFLEtBQUs7SUFDbEIsaUJBQWlCLEVBQUUsQ0FBQztJQUVwQixrRkFBa0Y7SUFDbEYsY0FBYyxFQUFFLEVBQUU7SUFDbEIsT0FBTyxFQUFFLENBQUM7SUFDVixXQUFXLEVBQUUsQ0FBQztJQUNkLGVBQWUsRUFBRSxDQUFDO0lBQ2xCLGVBQWUsRUFBRSxDQUFDO0lBRWxCLHdEQUF3RDtJQUN4RCxpR0FBaUc7SUFDakcscUVBQXFFO0lBQ3JFLFNBQVMsRUFBRTtRQUNULEdBQUcsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTO1FBQ25DLGVBQWUsRUFBRSx1Q0FBdUM7S0FDekQ7SUFFRCxrR0FBa0c7SUFDbEcsa0dBQWtHO0lBQ2xHLDBGQUEwRjtJQUMxRixlQUFlLEVBQUUsS0FBSztJQUV0QixnRkFBZ0Y7SUFDaEYsbUdBQW1HO0lBQ25HLGtEQUFrRDtJQUNsRCx1QkFBdUIsRUFBRSxJQUFJO0lBQzdCLHFCQUFxQixFQUFFLElBQUk7Q0FDNUIsQ0FBQyxDQUFDO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEdBQXNCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGFjdFR5cGUsIERpc3BsYXlHcmlkLCBHcmlkc3RlckNvbmZpZywgR3JpZFR5cGUgfSBmcm9tICdncmlkc3RlcjE4JztcbmltcG9ydCB7IFRfZ3JpZExheW91dF9ub2RlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9ncmlkLWxheW91dC5pbnRlcmZhY2UnO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIGdyaWRzdGVyIGNobyBsxrDhu5tpIEPhuqRQIFRSQU5HLlxuICpcbiAqIE3hu41pIGdpw6EgdHLhu4sgZMaw4bubaSDEkcOieSDEkeG7gXUgxJHhur9uIHThu6sgbeG7mXQgbOG7l2kgxJHDoyDEkW8gxJHGsOG7o2MgdHLDqm4gc+G6o24gcGjhuqltIHRo4bqtdCwga2jDtG5nIHBo4bqjaSBjaOG7jW4gdGhlbyBj4bqjbVxuICogdMOtbmguIMSQ4buVaSBi4bqldCBr4buzIGTDsm5nIG7DoG8gY8OzIGThuqV1IPCflLQgc+G6vSBsw6BtIHPhu5FuZyBs4bqhaSDEkcO6bmcgbOG7l2kgZ2hpIHRyb25nIGNvbW1lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBncmlkTGF5b3V0Um9vdENvbmZpZyA9ICgpOiBHcmlkc3RlckNvbmZpZyA9PiAoe1xuICAvLyDwn5S0IFZlcnRpY2FsRml4ZWQg4oCUIEPhuqRNIMSR4buVaSBzYW5nIEZpdCBoYXkgU2Nyb2xsVmVydGljYWwuXG4gIC8vIGBGaXRgIGNoaWEgxJHhu4F1IGNoaeG7gXUgY2FvIGtodW5nIGNobyBz4buRIGjDoG5nIMSRYW5nIGTDuW5nLCBuw6puIGNhcmQga2hhaSBgcm93czogMmAgcGjDrG5oIHThu6sgMTI0cHggbMOqblxuICAvLyAyNDdweC4gYFNjcm9sbFZlcnRpY2FsYCBLSMOUTkcgxJHhu41jIGBmaXhlZFJvd0hlaWdodGAgKG3DoyBsaWI6IGNo4buJIGBGaXhlZGAgdsOgIGBWZXJ0aWNhbEZpeGVkYCDEkeG7jWMpLlxuICBncmlkVHlwZTogR3JpZFR5cGUuVmVydGljYWxGaXhlZCxcblxuICAvLyDwn5S0IE5vbmUg4oCUIEPhuqRNIHF1YXkgbOG6oWkgQ29tcGFjdFVwLlxuICAvLyBgQ29tcGFjdFVwYCBow7p0IG3hu41pIGto4buRaSBsw6puIHPDoXQgbmhhdSBOR0FZIHNhdSBt4buXaSB0aGFvIHTDoWMsIG7Dqm46XG4gIC8vICDCtyBrw6lvIG3DqXAgZMaw4bubaSBjaG8ga2jhu5FpIGNhbyB0aMOqbSDihpIgY2jhu5cga2jhu5FpIGTGsOG7m2kgduG7q2EgbmjGsOG7nW5nIGLhu4sgaMO6dCBs4bqlcCBs4bqhaSB04bupYyB0aMOsLCBjw7oga8OpbyBi4buLXG4gIC8vICAgIGBjaGVja0dyaWRDb2xsaXNpb25gIGLDoW8gdmEgY2jhuqFtIHLhu5NpIEhPw4BOIE5HVVnDik4gKGto4buRaSDEkeG7qW5nIGltIGTDuSBrw6lvKTtcbiAgLy8gIMK3IGvDqW8gdGjhuqMgxJHhu5VpIHbhu4sgdHLDrSDihpIga2jhu5FpIHbhu6thIG5oxrDhu51uZyBjaOG7lyBi4buLIGjDunQgduG7gSBuZ2F5LCBraOG7kWkgxJFhbmcga8OpbyBraMO0bmcgY8OzIGNo4buXIMSR4bq3dCB2w6BcbiAgLy8gICAgdHJlbyBsxqEgbOG7rW5nIGdp4buvYSBoYWkga2jhu5FpLlxuICAvLyBNdeG7kW4gZOG7k24ga2jDrXQgdGjDrCBn4buNaSBgc2FwR29uKClgIGPhu6dhIHNlcnZpY2UuXG4gIGNvbXBhY3RUeXBlOiBDb21wYWN0VHlwZS5Ob25lLFxuICBkaXNwbGF5R3JpZDogRGlzcGxheUdyaWQuT25EcmFnQW5kUmVzaXplLFxuXG4gIC8vIPCflLQgcHVzaEl0ZW1zOiB0cnVlIOKAlCBD4bqkTSDEkeG7gyBmYWxzZS5cbiAgLy8gYHN3YXBgIGPhu6dhIGxpYiBDSOG7iCBob8OhbiB24buLIMSRxrDhu6NjIEhBSSBLSOG7kEkgQ8OZTkcgS8ONQ0ggVEjGr+G7mkMgKG3DoyBsaWIgYGNoZWNrU3dhcGA6IHTDrW5oIGRpZmZYL2RpZmZZXG4gIC8vIHLhu5NpIGhvw6FuIHbhu4ssIGzhu4djaCBrw61jaCB0aMaw4bubYyB0aMOsIGBjaGVja0NvbGxpc2lvbmAgYsOhbyB2YSBjaOG6oW0gdsOgIGhvw6BuIG5ndXnDqm4pLiBLaOG7kWkgM3gyIGfhurdwXG4gIC8vIGNvbnRhaW5lciA3eDUgbsOqbiBraMO0bmcgc3dhcCDEkcaw4bujYywgbcOgIGBwdXNoSXRlbXM6IGZhbHNlYCBjxaluZyBraMO0bmcgY2hvIGNvbnRhaW5lciBuaMaw4budbmcgxJHGsOG7nW5nXG4gIC8vIOKGkiBC4bq+IFThuq5DOiBraOG7kWkgxJFhbmcga8OpbyBraMO0bmcgxJHhurd0IMSRxrDhu6NjIOG7nyDEkcOidS5cbiAgcHVzaEl0ZW1zOiB0cnVlLFxuICAvLyBjaOG7iSDEkeG6qXkgWFXhu5BORzogxJHhuql5IG5nYW5nIGzDoG0geMO0IGzhu4djaCBi4buRIGPhu6VjIGPhu5l0IG5nxrDhu51pIGTDuW5nIHbhu6thIMSR4bq3dFxuICBwdXNoRGlyZWN0aW9uczogeyBub3J0aDogZmFsc2UsIGVhc3Q6IGZhbHNlLCBzb3V0aDogdHJ1ZSwgd2VzdDogZmFsc2UgfSxcbiAgcHVzaFJlc2l6ZUl0ZW1zOiB0cnVlLFxuICBzd2FwOiB0cnVlLFxuICBzd2FwV2hpbGVEcmFnZ2luZzogdHJ1ZSxcblxuICBkcmFnZ2FibGU6IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIC8vIGRlbGF5U3RhcnQ6IDAgdsOsIGvDqW8gcXVhIHRheSBj4bqnbSBjaHV5w6puIGThu6VuZyAoZHJhZ0hhbmRsZUNsYXNzKSB2w6AgaWdub3JlQ29udGVudDogdHJ1ZS5cbiAgICAvLyBLaGkgbmfGsOG7nWkgZMO5bmcgYuG6pW0gdsOgbyB0aGFuaCB0YXkgY+G6p20gbMOgIGNo4bunIMSR4buZbmcga8Opbywga2jDtG5nIGPhuqduIHRy4buFIDE2MG1zIHRyw6FuaCBodeG7tyBrw6lvLlxuICAgIGRlbGF5U3RhcnQ6IDAsXG4gICAgLy8g8J+UtCBgY2hlY2tEcmFnSGFuZGxlQ2xhc3NgIGR1eeG7h3QgRE9NIHThu6sgY2jhu5cgYuG6pW0gTkfGr+G7okMgTMOKTiBDSEEsIHbDoCB0csOqbiBN4buWSSBub2RlIG7DsyBraeG7g21cbiAgICAvLyBgZHJhZ0hhbmRsZUNsYXNzYCBUUsav4buaQyBgaWdub3JlQ29udGVudENsYXNzYC4gVsOsIHbhuq15IG3hu5l0IHBo4bqnbiB04butIEtIw5RORyDEkcaw4bujYyBtYW5nIGPhuqMgaGFpIGNsYXNzXG4gICAgLy8gY8O5bmcgbMO6YyDigJQgbWFuZyBj4bqjIGhhaSB0aMOsIGxpYiBn4bq3cCB0YXkgY+G6p20gdHLGsOG7m2MsIHRy4bqjIGB0cnVlYCwgY2xhc3MgY2jhurduIGtow7RuZyB04bubaSBsxrDhu6N0LlxuICAgIGlnbm9yZUNvbnRlbnRDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtYmxvY2stcGFyZW50LWRyYWcnLFxuICAgIGlnbm9yZUNvbnRlbnQ6IHRydWUsXG4gICAgZHJhZ0hhbmRsZUNsYXNzOiAnbGlicy11aS1ncmlkLWxheW91dC1kcmFnLWhhbmRsZScsXG4gIH0sXG5cbiAgcmVzaXphYmxlOiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAvLyDEkeG7pyA4IGjGsOG7m25nIG5oxrAgY+G7rWEgc+G7lSB0aMaw4budbmc7IGNo4buJIGPDsyBnw7NjIGTGsOG7m2ktcGjhuqNpIHRow6wgcXXDoSBraMOzIHRyw7puZ1xuICAgIGhhbmRsZXM6IHsgczogdHJ1ZSwgZTogdHJ1ZSwgbjogdHJ1ZSwgdzogdHJ1ZSwgc2U6IHRydWUsIG5lOiB0cnVlLCBzdzogdHJ1ZSwgbnc6IHRydWUgfSxcbiAgfSxcblxuICBtYXJnaW46IDEyLFxuICBvdXRlck1hcmdpbjogdHJ1ZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDQwLFxuICBtaW5Db2xzOiAxMixcbiAgbWF4Q29sczogMTIsXG4gIG1pblJvd3M6IDIsXG5cbiAgLy8g8J+UtCBLSMOUTkcgZ2nhu5tpIGjhuqFuIGNoaeG7gXUgY2FvIGto4buRaS4gTGliIGPDsyBCQSB0cuG6p24gbeG6t2MgxJHhu4tuaCBwaOG6o2kgdsO0IGhp4buHdSBob8OhIEPDmU5HIEzDmkMsIHRoaeG6v3UgbeG7mXRcbiAgLy8gY8OhaSBsw6AgduG6q24gYuG7iyBjaOG6t246IGBtYXhJdGVtUm93czogNTBgIMK3IGBtYXhJdGVtQ29sczogNTBgIMK3IGBtYXhJdGVtQXJlYTogMjUwMGAgKHRy4bqnbiBESeG7hk4gVMONQ0hcbiAgLy8gY29scyDDlyByb3dzIOKAlCBraMOzIHRo4bqleSBuaOG6pXQ6IGto4buRaSAxMiBj4buZdCBjaOG7iSBj4bqnbiAyMDkgaMOgbmcgbMOgIMSR4bulbmcgdHLhuqduIGTDuSBoYWkgdHLhuqduIGtpYSBjw7JuIGTGsCkuXG4gIC8vIGBtYXhSb3dzYCBsw6AgdHLhuqduIGPhu6dhIEPhuqIgTMav4buaSSwgY8WpbmcgcGjhuqNpIG7hu5tpIHRoZW8uXG4gIG1heFJvd3M6IDUwMDAsXG4gIG1heEl0ZW1Sb3dzOiA1MDAwLFxuICBtYXhJdGVtQ29sczogMTIsXG4gIG1heEl0ZW1BcmVhOiA2MDAwMCxcblxuICAvLyDwn5S0IFRy4bqnbiBM4buaUCBDSOG7kk5HLiBN4bq3YyDEkeG7i25oIGPhu6dhIGxpYiBsw6AgMiDigJQgcXXDoSB0aOG6pXA6IGtoaSBi4bqtdCBjaOG7k25nIGto4buRaSwgdGjGsCB2aeG7h24gZ8OhbiBt4buXaSBraOG7kWlcbiAgLy8gbeG7mXQgbOG7m3AgcmnDqm5nIMSR4buDIGNow7puZyBraMOhYyBuaGF1LCBuw6puIGNo4buJIDMga2jhu5FpIGzDoCDEkcOjIMSR4bulbmcgdHLhuqduIHbDoCBjw6FjIGto4buRaSBzYXUgbOG6oWkgcsahaSB24buBXG4gIC8vIGPDuW5nIGzhu5twLCB04bupYyBjaOG7k25nIG5oYXUgYuG7iyBjaOG6t24gdHLhu58gbOG6oWkuXG4gIG1heExheWVySW5kZXg6IDUwMDAsXG5cbiAgc2V0R3JpZFNpemU6IHRydWUsXG4gIGZpeGVkUm93SGVpZ2h0OiA1NixcbiAgZGVmYXVsdEl0ZW1Db2xzOiAzLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG4gIG1pbkl0ZW1Sb3dzOiAxLFxuICBtb2JpbGVCcmVha3BvaW50OiAtMSxcbn0pO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIGNobyBsxrDhu5tpIEzhu5JORyAocnXhu5l0IG3hu5l0IGNvbnRhaW5lcikuXG4gKlxuICogS+G6vyB0aOG7q2EgbMaw4bubaSB0cmFuZyBy4buTaSBnaGkgxJHDqCBwaOG6p24ga2jDoWMgYmnhu4d0LiBCYSDEkWnhu4NtIHF1YW4gdHLhu41uZyBuaOG6pXQ6IGBzZXRHcmlkU2l6ZWAgcGjhuqNpIFThuq5ULFxuICogdGF5IGPhuqdtIHBo4bqjaSBtYW5nIFTDik4gUknDik5HLCB2w6AgdOG7sS1jdeG7mW4ta2hpLWvDqW8gcGjhuqNpIFThuq5ULlxuICovXG5leHBvcnQgY29uc3QgZ3JpZExheW91dE5lc3RlZENvbmZpZyA9ICgpOiBHcmlkc3RlckNvbmZpZyA9PiAoe1xuICAuLi5ncmlkTGF5b3V0Um9vdENvbmZpZygpLFxuXG4gIC8vIPCflLQgUEjhuqJJIHThuq90IGNobyBsxrDhu5tpIGzhu5NuZy4gYHNldEdyaWRTaXplYCBsw6BtIGdyaWRzdGVyIHThu7EgZ2hpIHN0eWxlIHdpZHRoL2hlaWdodCBsw6puIENIw41OSCBuw7MsXG4gIC8vIHNpbmggdsOybmcgbOG6t3AgxJFvLXLhu5NpLWdoaSB24bubaSBSZXNpemVPYnNlcnZlciBj4bunYSBraHVuZyBuZ2/DoGkgKGtodW5nIMSR4buVaSDihpIgb25SZXNpemUgeG/DoSBzdHlsZSDihpJcbiAgLy8gc2V0R3JpZFNpemUgZ2hpIGzhuqFpKSDihpIgbMaw4bubaSBjb24gY28gZOG6p24gduG7gSA2NHg2NHB4IHRyb25nIGtodW5nIDg2OHB4LlxuICBzZXRHcmlkU2l6ZTogZmFsc2UsXG5cbiAgLy8ga2hlIDJweDoga2jhu5FpIGNvbiBsw6AgY8OhYyBkw7JuZyB0aMO0bmcgdGluIGPhu6dhIEPDmU5HIG3hu5l0IGNhcmQsIGtoZSBy4buZbmcgbMOgbSBjaMO6bmcgdHLDtG5nIG5oxrAgY2FyZCBy4budaVxuICBtYXJnaW46IDIsXG4gIC8vIEzGsOG7m2kgbOG7k25nIEtIw5RORyB04buxIGNo4burYSBs4buBIOKAlCBs4buBIGzDoCBj4bunYSBW4buOIGNvbnRhaW5lciAoYGNvbnRhaW5lclBhZGRpbmdgKSwga2jDtG5nIHBo4bqjaSBj4bunYSBsxrDhu5tpLlxuICAvLyDEkOG6t3Qg4bufIHbhu48gdGjDrCBydeG7mXQgY28gbOG6oWkgxJHDum5nIGLhurFuZyBwaOG6p24gY8OybiBs4bqhaSwgdGF5IGPhuqdtIHJlc2l6ZSBj4bunYSBraOG7kWkgY29uIGx1w7RuIG7hurFtIHRyb25nIHThuqdtXG4gIC8vIGNodeG7mXQgKG5nxrDhu51pIGTDuW5nIGNo4buRdCAyOC8wOC8yMDI2OiBcImzGsOG7m2kgY2hhIGPDsyBwYWRkaW5nIGNo4bupIGtvIHBo4bqjaSBjb25cIikuXG4gIG91dGVyTWFyZ2luOiBmYWxzZSxcbiAgb3V0ZXJNYXJnaW5Cb3R0b206IDAsXG5cbiAgLy8gaMOgbmcgMTZweCBjaG8gYsaw4bubYyBrw6lvIG3hu4tuLCB2w6Agc8OgbiAxIGjDoG5nID0gMTZweCBuw6puIGto4buRaSBjbyDEkcaw4bujYyBuaOG7jyBoxqFuIG5oaeG7gXVcbiAgZml4ZWRSb3dIZWlnaHQ6IDE2LFxuICBtaW5Sb3dzOiAxLFxuICBtaW5JdGVtUm93czogMSxcbiAgZGVmYXVsdEl0ZW1Db2xzOiAyLFxuICBkZWZhdWx0SXRlbVJvd3M6IDIsXG5cbiAgLy8g8J+UtCBUYXkgY+G6p20gUknDik5HIOKAlCBD4bqkTSBkw7luZyBjaHVuZyB0w6puIHbhu5tpIGzGsOG7m2kgdHJhbmcuXG4gIC8vIGBjaGVja0RyYWdIYW5kbGVDbGFzc2AgdHLhuqMgYHRydWVgIOG7nyBub2RlIMSQ4bqmVSBUScOKTiBjw7MgYGRyYWdIYW5kbGVDbGFzc2AuIETDuW5nIGNodW5nIG3hu5l0IHTDqm4gdGjDrFxuICAvLyBsxrDhu5tpIENIQSBjxaluZyBuaOG6rW4gcmEgdGF5IGPhuqdtIGPhu6dhIGto4buRaSBjb24gdsOgIG5o4bqlYyBsdcO0biBjb250YWluZXIuXG4gIGRyYWdnYWJsZToge1xuICAgIC4uLmdyaWRMYXlvdXRSb290Q29uZmlnKCkuZHJhZ2dhYmxlLFxuICAgIGRyYWdIYW5kbGVDbGFzczogJ2xpYnMtdWktZ3JpZC1sYXlvdXQtZHJhZy1oYW5kbGUtY2hpbGQnLFxuICB9LFxuXG4gIC8vIPCflLQgS8OJTyBNw4lQIHRow6wga2jhu5FpIGTGsOG7m2kgxJDhu6hORyBZw4pOLCBjaOG7iSBraG/huqNuZyB0cuG7kW5nIGdp4buvYSBoYWkga2jhu5FpIGNvIGdpw6NuLiBC4bqtdCAoa+G6vyB0aOG7q2EgdOG7qyBsxrDhu5tpXG4gIC8vIHRyYW5nKSB0aMOsIG3hu5dpIGPDuiBrw6lvIMSR4bqpeSBk4buTbiBj4bqjIGPhu5l0IHh14buRbmcg4oCUIG5nxrDhu51pIGTDuW5nIGNo4buJIG114buRbiBt4buZdCBraOG7kWkgdG8gaMahbiBt4buZdCBjaMO6dCBtw6AgY+G6o1xuICAvLyBjYXJkIGTDoGkgcmEuIGBwdXNoSXRlbXNgIHbhuqtuIGdp4buvOiBuw7MgbG8gdmnhu4djIEvDiU8gVEjhuqIgxJHhu5VpIGNo4buXLCBraMOhYyB2aeG7h2MgxJHhu5VpIGvDrWNoIHRoxrDhu5tjLlxuICBwdXNoUmVzaXplSXRlbXM6IGZhbHNlLFxuXG4gIC8vIPCflLQgVOG6r3QgdOG7sSBjdeG7mW4ga2hpIGvDqW8gdOG7m2kgc8OhdCBtw6lwLiBMaWIgdGjhuqV5IGNodeG7mXQgZ+G6p24gYmnDqm4gbMOgIGN14buZbiBsxrDhu5tpIHRoZW9cbiAgLy8gKGBzY3JvbGxTZW5zaXRpdml0eWApLCBuaMawbmcgbMaw4bubaSBjb24gbuG6sW0gdHJvbmcgY2FyZCBjw7MgYG92ZXJmbG93OiBoaWRkZW5gIOKAlCBjdeG7mW4g4bufIMSRw6J5IMSR4bqpeSBraOG7kWlcbiAgLy8gY29uIHJhIE5HT8OASSBraHVuZyBjb250YWluZXIgcuG7k2kga+G6uXQgbHXDtG4g4bufIMSRw7MuXG4gIGRpc2FibGVTY3JvbGxIb3Jpem9udGFsOiB0cnVlLFxuICBkaXNhYmxlU2Nyb2xsVmVydGljYWw6IHRydWUsXG59KTtcblxuLyoqXG4gKiBDw6J5IHLhu5duZyBkw7luZyBraGkgY2jGsGEgY8OzIGThu68gbGnhu4d1IOKAlCBt4bq3dCBwaOG6s25nIHbhur0gcmEgbeG7mXQgbMaw4bubaSB0cuG7kW5nIHRoYXkgdsOsIHbhu6EuXG4gKiBY4bqjeSByYSB0cm9uZyBuaOG7i3AgZ2nhu69hIGzDumMgY29tcG9uZW50IGThu7FuZyB2w6AgbMO6YyBgaW5pdCgpYCBjaOG6oXkuXG4gKi9cbmV4cG9ydCBjb25zdCBlbXB0eVJvb3ROb2RlID0gKCk6IFRfZ3JpZExheW91dF9ub2RlID0+ICh7IGlkOiAncm9vdCcsIHg6IDAsIHk6IDAsIGNvbHM6IDEyLCByb3dzOiAwLCBjaGlsZHJlbjogW10gfSk7XG4iXX0=
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { calculateDropGhost } from './defines/collision.define';
|
|
2
|
+
/** Lớp CSS bật ô li của một lưới trong lúc người dùng đang kéo khối vào. */
|
|
3
|
+
const LOP_HIEN_O_LI = 'display-grid';
|
|
4
|
+
/**
|
|
5
|
+
* Giữ trạng thái một lượt kéo khối từ palette bên ngoài vào mặt phẳng.
|
|
6
|
+
*
|
|
7
|
+
* Việc nó lo: bật ô li của lưới đang được kéo tới (lưới gốc, và lưới của container khi con trỏ đi
|
|
8
|
+
* vào trong), tắt đúng lúc, và trả về ghost để nơi dùng vẽ khung xem trước.
|
|
9
|
+
*
|
|
10
|
+
* 🔴 Tự bật/tắt ô li bằng tay ở nơi dùng là chỗ rất dễ sót: kéo ra khỏi container rồi mà quên tắt
|
|
11
|
+
* thì ô li của nó nằm lại trên màn, kéo sang lưới khác lại chồng thêm một lớp nữa.
|
|
12
|
+
*/
|
|
13
|
+
export class LibsUiGridLayoutDragController {
|
|
14
|
+
payload;
|
|
15
|
+
hoveredElement;
|
|
16
|
+
rootGridsterElement;
|
|
17
|
+
/** Payload của khối đang được kéo; `undefined` khi không có lượt kéo nào. */
|
|
18
|
+
get ActivePayload() {
|
|
19
|
+
return this.payload;
|
|
20
|
+
}
|
|
21
|
+
/** Gọi ở `dragstart` của thẻ trong palette. */
|
|
22
|
+
onDragStart(payload) {
|
|
23
|
+
this.payload = payload;
|
|
24
|
+
}
|
|
25
|
+
/** Gọi ở `dragend` — dọn sạch mọi ô li đang bật. */
|
|
26
|
+
onDragEnd(container) {
|
|
27
|
+
this.payload = undefined;
|
|
28
|
+
this.cleanupAll(container);
|
|
29
|
+
}
|
|
30
|
+
/** Tắt ô li của container đang hover. */
|
|
31
|
+
cleanupHoveredGroup() {
|
|
32
|
+
if (!this.hoveredElement) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this.hoveredElement.classList.remove(LOP_HIEN_O_LI);
|
|
36
|
+
this.hoveredElement = undefined;
|
|
37
|
+
}
|
|
38
|
+
/** Tắt ô li của lưới gốc, và quét sạch lớp còn sót trong khung chứa. */
|
|
39
|
+
cleanupRootGrid(container) {
|
|
40
|
+
if (this.rootGridsterElement) {
|
|
41
|
+
this.rootGridsterElement.classList.remove(LOP_HIEN_O_LI);
|
|
42
|
+
this.rootGridsterElement = undefined;
|
|
43
|
+
}
|
|
44
|
+
container?.querySelectorAll(`gridster.${LOP_HIEN_O_LI}`).forEach((el) => el.classList.remove(LOP_HIEN_O_LI));
|
|
45
|
+
}
|
|
46
|
+
/** Tắt toàn bộ ô li đang bật. */
|
|
47
|
+
cleanupAll(container) {
|
|
48
|
+
this.cleanupHoveredGroup();
|
|
49
|
+
this.cleanupRootGrid(container);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Gọi ở `dragover` của khung chứa mặt phẳng. Trả ghost để nơi dùng vẽ khung xem trước, đồng thời
|
|
53
|
+
* tự bật ô li của lưới đang được kéo tới.
|
|
54
|
+
*/
|
|
55
|
+
onDragOver(event, container, root, totalCols) {
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
if (event.dataTransfer) {
|
|
58
|
+
event.dataTransfer.dropEffect = 'copy';
|
|
59
|
+
}
|
|
60
|
+
if (!container || !root || !this.payload) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
this.showRootGrid(container);
|
|
64
|
+
const ghost = calculateDropGhost(event, container, root, this.payload, totalCols);
|
|
65
|
+
if (!ghost?.isInsideGroup || !ghost.hoveredGridster) {
|
|
66
|
+
this.cleanupHoveredGroup();
|
|
67
|
+
return ghost;
|
|
68
|
+
}
|
|
69
|
+
if (this.hoveredElement !== ghost.hoveredGridster) {
|
|
70
|
+
this.cleanupHoveredGroup();
|
|
71
|
+
ghost.hoveredGridster.classList.add(LOP_HIEN_O_LI);
|
|
72
|
+
this.hoveredElement = ghost.hoveredGridster;
|
|
73
|
+
}
|
|
74
|
+
return ghost;
|
|
75
|
+
}
|
|
76
|
+
/** Bật ô li của lưới CẤP TRANG trong suốt lượt kéo, tắt lưới cũ nếu khung chứa đã đổi. */
|
|
77
|
+
showRootGrid(container) {
|
|
78
|
+
const rootGridster = container.querySelector('gridster') ?? undefined;
|
|
79
|
+
if (!rootGridster) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (this.rootGridsterElement && this.rootGridsterElement !== rootGridster) {
|
|
83
|
+
this.rootGridsterElement.classList.remove(LOP_HIEN_O_LI);
|
|
84
|
+
}
|
|
85
|
+
rootGridster.classList.add(LOP_HIEN_O_LI);
|
|
86
|
+
this.rootGridsterElement = rootGridster;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZy1jb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9zZXJ2aWNlcy9ncmlkLWxheW91dC9zcmMvZHJhZy1jb250cm9sbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLDRFQUE0RTtBQUM1RSxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUM7QUFFckM7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sOEJBQThCO0lBQ2pDLE9BQU8sQ0FBb0M7SUFDM0MsY0FBYyxDQUFlO0lBQzdCLG1CQUFtQixDQUFlO0lBRTFDLDZFQUE2RTtJQUM3RSxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELCtDQUErQztJQUMvQyxXQUFXLENBQUMsT0FBeUM7UUFDbkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVELG9EQUFvRDtJQUNwRCxTQUFTLENBQUMsU0FBdUI7UUFDL0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQseUNBQXlDO0lBQ3pDLG1CQUFtQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3pCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsZUFBZSxDQUFDLFNBQXVCO1FBQ3JDLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDekQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsU0FBUyxFQUFFLGdCQUFnQixDQUFDLFlBQVksYUFBYSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDL0csQ0FBQztJQUVELGlDQUFpQztJQUNqQyxVQUFVLENBQUMsU0FBdUI7UUFDaEMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsVUFBVSxDQUNSLEtBQWdCLEVBQ2hCLFNBQWtDLEVBQ2xDLElBQW1DLEVBQ25DLFNBQWtCO1FBRWxCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDekMsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0IsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVsRixJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUUzQixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLEtBQUssQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUM7UUFDOUMsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELDBGQUEwRjtJQUNsRixZQUFZLENBQUMsU0FBc0I7UUFDekMsTUFBTSxZQUFZLEdBQUksU0FBUyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQXdCLElBQUksU0FBUyxDQUFDO1FBRTlGLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxZQUFZLEVBQUUsQ0FBQztZQUMxRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFlBQVksQ0FBQztJQUMxQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBUX2dyaWRMYXlvdXRfZHJvcEdob3N0LFxuICBUX2dyaWRMYXlvdXRfZXh0ZXJuYWxEcmFnUGF5bG9hZCxcbiAgVF9ncmlkTGF5b3V0X25vZGUsXG59IGZyb20gJy4vaW50ZXJmYWNlcy9ncmlkLWxheW91dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgY2FsY3VsYXRlRHJvcEdob3N0IH0gZnJvbSAnLi9kZWZpbmVzL2NvbGxpc2lvbi5kZWZpbmUnO1xuXG4vKiogTOG7m3AgQ1NTIGLhuq10IMO0IGxpIGPhu6dhIG3hu5l0IGzGsOG7m2kgdHJvbmcgbMO6YyBuZ8aw4budaSBkw7luZyDEkWFuZyBrw6lvIGto4buRaSB2w6BvLiAqL1xuY29uc3QgTE9QX0hJRU5fT19MSSA9ICdkaXNwbGF5LWdyaWQnO1xuXG4vKipcbiAqIEdp4buvIHRy4bqhbmcgdGjDoWkgbeG7mXQgbMaw4bujdCBrw6lvIGto4buRaSB04burIHBhbGV0dGUgYsOqbiBuZ2/DoGkgdsOgbyBt4bq3dCBwaOG6s25nLlxuICpcbiAqIFZp4buHYyBuw7MgbG86IGLhuq10IMO0IGxpIGPhu6dhIGzGsOG7m2kgxJFhbmcgxJHGsOG7o2Mga8OpbyB04bubaSAobMaw4bubaSBn4buRYywgdsOgIGzGsOG7m2kgY+G7p2EgY29udGFpbmVyIGtoaSBjb24gdHLhu48gxJFpXG4gKiB2w6BvIHRyb25nKSwgdOG6r3QgxJHDum5nIGzDumMsIHbDoCB0cuG6oyB24buBIGdob3N0IMSR4buDIG7GoWkgZMO5bmcgduG6vSBraHVuZyB4ZW0gdHLGsOG7m2MuXG4gKlxuICog8J+UtCBU4buxIGLhuq10L3Thuq90IMO0IGxpIGLhurFuZyB0YXkg4bufIG7GoWkgZMO5bmcgbMOgIGNo4buXIHLhuqV0IGThu4Ugc8OzdDoga8OpbyByYSBraOG7j2kgY29udGFpbmVyIHLhu5NpIG3DoCBxdcOqbiB04bqvdFxuICogdGjDrCDDtCBsaSBj4bunYSBuw7MgbuG6sW0gbOG6oWkgdHLDqm4gbcOgbiwga8OpbyBzYW5nIGzGsOG7m2kga2jDoWMgbOG6oWkgY2jhu5NuZyB0aMOqbSBt4buZdCBs4bubcCBu4buvYS5cbiAqL1xuZXhwb3J0IGNsYXNzIExpYnNVaUdyaWRMYXlvdXREcmFnQ29udHJvbGxlciB7XG4gIHByaXZhdGUgcGF5bG9hZD86IFRfZ3JpZExheW91dF9leHRlcm5hbERyYWdQYXlsb2FkO1xuICBwcml2YXRlIGhvdmVyZWRFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcm9vdEdyaWRzdGVyRWxlbWVudD86IEhUTUxFbGVtZW50O1xuXG4gIC8qKiBQYXlsb2FkIGPhu6dhIGto4buRaSDEkWFuZyDEkcaw4bujYyBrw6lvOyBgdW5kZWZpbmVkYCBraGkga2jDtG5nIGPDsyBsxrDhu6N0IGvDqW8gbsOgby4gKi9cbiAgZ2V0IEFjdGl2ZVBheWxvYWQoKTogVF9ncmlkTGF5b3V0X2V4dGVybmFsRHJhZ1BheWxvYWQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnBheWxvYWQ7XG4gIH1cblxuICAvKiogR+G7jWkg4bufIGBkcmFnc3RhcnRgIGPhu6dhIHRo4bq7IHRyb25nIHBhbGV0dGUuICovXG4gIG9uRHJhZ1N0YXJ0KHBheWxvYWQ6IFRfZ3JpZExheW91dF9leHRlcm5hbERyYWdQYXlsb2FkKTogdm9pZCB7XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgfVxuXG4gIC8qKiBH4buNaSDhu58gYGRyYWdlbmRgIOKAlCBk4buNbiBz4bqhY2ggbeG7jWkgw7QgbGkgxJFhbmcgYuG6rXQuICovXG4gIG9uRHJhZ0VuZChjb250YWluZXI/OiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMucGF5bG9hZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsZWFudXBBbGwoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKiBU4bqvdCDDtCBsaSBj4bunYSBjb250YWluZXIgxJFhbmcgaG92ZXIuICovXG4gIGNsZWFudXBIb3ZlcmVkR3JvdXAoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhvdmVyZWRFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaG92ZXJlZEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShMT1BfSElFTl9PX0xJKTtcbiAgICB0aGlzLmhvdmVyZWRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFThuq90IMO0IGxpIGPhu6dhIGzGsOG7m2kgZ+G7kWMsIHbDoCBxdcOpdCBz4bqhY2ggbOG7m3AgY8OybiBzw7N0IHRyb25nIGtodW5nIGNo4bupYS4gKi9cbiAgY2xlYW51cFJvb3RHcmlkKGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm9vdEdyaWRzdGVyRWxlbWVudCkge1xuICAgICAgdGhpcy5yb290R3JpZHN0ZXJFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoTE9QX0hJRU5fT19MSSk7XG4gICAgICB0aGlzLnJvb3RHcmlkc3RlckVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbChgZ3JpZHN0ZXIuJHtMT1BfSElFTl9PX0xJfWApLmZvckVhY2goKGVsKSA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKExPUF9ISUVOX09fTEkpKTtcbiAgfVxuXG4gIC8qKiBU4bqvdCB0b8OgbiBi4buZIMO0IGxpIMSRYW5nIGLhuq10LiAqL1xuICBjbGVhbnVwQWxsKGNvbnRhaW5lcj86IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwSG92ZXJlZEdyb3VwKCk7XG4gICAgdGhpcy5jbGVhbnVwUm9vdEdyaWQoY29udGFpbmVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBH4buNaSDhu58gYGRyYWdvdmVyYCBj4bunYSBraHVuZyBjaOG7qWEgbeG6t3QgcGjhurNuZy4gVHLhuqMgZ2hvc3QgxJHhu4MgbsahaSBkw7luZyB24bq9IGtodW5nIHhlbSB0csaw4bubYywgxJHhu5NuZyB0aOG7nWlcbiAgICogdOG7sSBi4bqtdCDDtCBsaSBj4bunYSBsxrDhu5tpIMSRYW5nIMSRxrDhu6NjIGvDqW8gdOG7m2kuXG4gICAqL1xuICBvbkRyYWdPdmVyKFxuICAgIGV2ZW50OiBEcmFnRXZlbnQsXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCxcbiAgICByb290OiBUX2dyaWRMYXlvdXRfbm9kZSB8IHVuZGVmaW5lZCxcbiAgICB0b3RhbENvbHM/OiBudW1iZXJcbiAgKTogVF9ncmlkTGF5b3V0X2Ryb3BHaG9zdCB8IHVuZGVmaW5lZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAoZXZlbnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgICBldmVudC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JztcbiAgICB9XG4gICAgaWYgKCFjb250YWluZXIgfHwgIXJvb3QgfHwgIXRoaXMucGF5bG9hZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgdGhpcy5zaG93Um9vdEdyaWQoY29udGFpbmVyKTtcblxuICAgIGNvbnN0IGdob3N0ID0gY2FsY3VsYXRlRHJvcEdob3N0KGV2ZW50LCBjb250YWluZXIsIHJvb3QsIHRoaXMucGF5bG9hZCwgdG90YWxDb2xzKTtcblxuICAgIGlmICghZ2hvc3Q/LmlzSW5zaWRlR3JvdXAgfHwgIWdob3N0LmhvdmVyZWRHcmlkc3Rlcikge1xuICAgICAgdGhpcy5jbGVhbnVwSG92ZXJlZEdyb3VwKCk7XG5cbiAgICAgIHJldHVybiBnaG9zdDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ob3ZlcmVkRWxlbWVudCAhPT0gZ2hvc3QuaG92ZXJlZEdyaWRzdGVyKSB7XG4gICAgICB0aGlzLmNsZWFudXBIb3ZlcmVkR3JvdXAoKTtcbiAgICAgIGdob3N0LmhvdmVyZWRHcmlkc3Rlci5jbGFzc0xpc3QuYWRkKExPUF9ISUVOX09fTEkpO1xuICAgICAgdGhpcy5ob3ZlcmVkRWxlbWVudCA9IGdob3N0LmhvdmVyZWRHcmlkc3RlcjtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2hvc3Q7XG4gIH1cblxuICAvKiogQuG6rXQgw7QgbGkgY+G7p2EgbMaw4bubaSBD4bqkUCBUUkFORyB0cm9uZyBzdeG7kXQgbMaw4bujdCBrw6lvLCB04bqvdCBsxrDhu5tpIGPFqSBu4bq/dSBraHVuZyBjaOG7qWEgxJHDoyDEkeG7lWkuICovXG4gIHByaXZhdGUgc2hvd1Jvb3RHcmlkKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBjb25zdCByb290R3JpZHN0ZXIgPSAoY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ2dyaWRzdGVyJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsKSA/PyB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIXJvb3RHcmlkc3Rlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJvb3RHcmlkc3RlckVsZW1lbnQgJiYgdGhpcy5yb290R3JpZHN0ZXJFbGVtZW50ICE9PSByb290R3JpZHN0ZXIpIHtcbiAgICAgIHRoaXMucm9vdEdyaWRzdGVyRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKExPUF9ISUVOX09fTEkpO1xuICAgIH1cbiAgICByb290R3JpZHN0ZXIuY2xhc3NMaXN0LmFkZChMT1BfSElFTl9PX0xJKTtcbiAgICB0aGlzLnJvb3RHcmlkc3RlckVsZW1lbnQgPSByb290R3JpZHN0ZXI7XG4gIH1cbn1cbiJdfQ==
|