@libs-ui/services-grid-layout 0.2.357-19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -0
- package/canvas/grid-layout-canvas.component.d.ts +107 -0
- package/defines/gridster-config.define.d.ts +21 -0
- package/esm2022/canvas/grid-layout-canvas.component.mjs +193 -0
- package/esm2022/defines/gridster-config.define.mjs +123 -0
- package/esm2022/grid-layout.service.mjs +433 -0
- package/esm2022/index.mjs +10 -0
- package/esm2022/interfaces/grid-layout.interface.mjs +2 -0
- package/esm2022/libs-ui-services-grid-layout.mjs +5 -0
- package/esm2022/tree.service.mjs +180 -0
- package/fesm2022/libs-ui-services-grid-layout.mjs +933 -0
- package/fesm2022/libs-ui-services-grid-layout.mjs.map +1 -0
- package/grid-layout.service.d.ts +157 -0
- package/index.d.ts +3 -0
- package/interfaces/grid-layout.interface.d.ts +171 -0
- package/package.json +29 -0
- package/tree.service.d.ts +59 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { CompactType, DisplayGrid, GridType } from 'gridster18';
|
|
2
|
+
/**
|
|
3
|
+
* Cấu hình gridster cho lưới CẤP TRANG.
|
|
4
|
+
*
|
|
5
|
+
* Mọi giá trị dưới đây đều đến từ một lỗi đã đo được trên sản phẩm thật, không phải chọn theo cảm
|
|
6
|
+
* tính. Đổi bất kỳ dòng nào có dấu 🔴 sẽ làm sống lại đúng lỗi ghi trong comment.
|
|
7
|
+
*/
|
|
8
|
+
export const gridLayoutRootConfig = () => ({
|
|
9
|
+
// 🔴 VerticalFixed — CẤM đổi sang Fit hay ScrollVertical.
|
|
10
|
+
// `Fit` chia đều chiều cao khung cho số hàng đang dùng, nên card khai `rows: 2` phình từ 124px lên
|
|
11
|
+
// 247px. `ScrollVertical` KHÔNG đọc `fixedRowHeight` (mã lib: chỉ `Fixed` và `VerticalFixed` đọc).
|
|
12
|
+
gridType: GridType.VerticalFixed,
|
|
13
|
+
// 🔴 None — CẤM quay lại CompactUp.
|
|
14
|
+
// `CompactUp` hút mọi khối lên sát nhau NGAY sau mỗi thao tác, nên:
|
|
15
|
+
// · kéo mép dưới cho khối cao thêm → chỗ khối dưới vừa nhường bị hút lấp lại tức thì, cú kéo bị
|
|
16
|
+
// `checkGridCollision` báo va chạm rồi HOÀN NGUYÊN (khối đứng im dù kéo);
|
|
17
|
+
// · kéo thả đổi vị trí → khối vừa nhường chỗ bị hút về ngay, khối đang kéo không có chỗ đặt và
|
|
18
|
+
// treo lơ lửng giữa hai khối.
|
|
19
|
+
// Muốn dồn khít thì gọi `sapGon()` của service.
|
|
20
|
+
compactType: CompactType.None,
|
|
21
|
+
displayGrid: DisplayGrid.OnDragAndResize,
|
|
22
|
+
// 🔴 pushItems: true — CẤM để false.
|
|
23
|
+
// `swap` của lib CHỈ hoán vị được HAI KHỐI CÙNG KÍCH THƯỚC (mã lib `checkSwap`: tính diffX/diffY
|
|
24
|
+
// rồi hoán vị, lệch kích thước thì `checkCollision` báo va chạm và hoàn nguyên). Khối 3x2 gặp
|
|
25
|
+
// container 7x5 nên không swap được, mà `pushItems: false` cũng không cho container nhường đường
|
|
26
|
+
// → BẾ TẮC: khối đang kéo không đặt được ở đâu.
|
|
27
|
+
pushItems: true,
|
|
28
|
+
// chỉ đẩy XUỐNG: đẩy ngang làm xô lệch bố cục cột người dùng vừa đặt
|
|
29
|
+
pushDirections: { north: false, east: false, south: true, west: false },
|
|
30
|
+
pushResizeItems: true,
|
|
31
|
+
swap: true,
|
|
32
|
+
swapWhileDragging: true,
|
|
33
|
+
draggable: {
|
|
34
|
+
enabled: true,
|
|
35
|
+
// 🔴 KHÔNG được bỏ. Không có nó thì gridster vào chế độ kéo ngay từ `mousedown`, nên chỉ bấm
|
|
36
|
+
// CHỌN một khối là nó đã nhích theo dù chuột đứng yên. Lib tự huỷ kéo khi nhả chuột trước mốc
|
|
37
|
+
// này nên cú bấm chọn vẫn ăn nguyên vẹn.
|
|
38
|
+
delayStart: 160,
|
|
39
|
+
// 🔴 `checkDragHandleClass` duyệt DOM từ chỗ bấm NGƯỢC LÊN CHA, và trên MỖI node nó kiểm
|
|
40
|
+
// `dragHandleClass` TRƯỚC `ignoreContentClass`. Vì vậy một phần tử KHÔNG được mang cả hai class
|
|
41
|
+
// 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.
|
|
42
|
+
ignoreContentClass: 'libs-ui-grid-layout-block-parent-drag',
|
|
43
|
+
ignoreContent: true,
|
|
44
|
+
dragHandleClass: 'libs-ui-grid-layout-drag-handle',
|
|
45
|
+
},
|
|
46
|
+
resizable: {
|
|
47
|
+
enabled: true,
|
|
48
|
+
// đủ 8 hướng như cửa sổ thường; chỉ có góc dưới-phải thì quá khó trúng
|
|
49
|
+
handles: { s: true, e: true, n: true, w: true, se: true, ne: true, sw: true, nw: true },
|
|
50
|
+
},
|
|
51
|
+
margin: 12,
|
|
52
|
+
outerMargin: true,
|
|
53
|
+
outerMarginBottom: 40,
|
|
54
|
+
minCols: 12,
|
|
55
|
+
maxCols: 12,
|
|
56
|
+
minRows: 2,
|
|
57
|
+
// 🔴 KHÔNG giới hạn chiều cao khối. Lib có BA trần mặc định phải vô hiệu hoá CÙNG LÚC, thiếu một
|
|
58
|
+
// cái là vẫn bị chặn: `maxItemRows: 50` · `maxItemCols: 50` · `maxItemArea: 2500` (trần DIỆN TÍCH
|
|
59
|
+
// cols × rows — khó thấy nhất: khối 12 cột chỉ cần 209 hàng là đụng trần dù hai trần kia còn dư).
|
|
60
|
+
// `maxRows` là trần của CẢ LƯỚI, cũng phải nới theo.
|
|
61
|
+
maxRows: 5000,
|
|
62
|
+
maxItemRows: 5000,
|
|
63
|
+
maxItemCols: 12,
|
|
64
|
+
maxItemArea: 60000,
|
|
65
|
+
// 🔴 Trần LỚP CHỒNG. Mặc định của lib là 2 — quá thấp: khi bật chồng khối, thư viện gán mỗi khối
|
|
66
|
+
// một lớp riêng để chúng khác nhau, nên chỉ 3 khối là đã đụng trần và các khối sau lại rơi về
|
|
67
|
+
// cùng lớp, tức chồng nhau bị chặn trở lại.
|
|
68
|
+
maxLayerIndex: 5000,
|
|
69
|
+
setGridSize: true,
|
|
70
|
+
fixedRowHeight: 56,
|
|
71
|
+
defaultItemCols: 3,
|
|
72
|
+
defaultItemRows: 2,
|
|
73
|
+
minItemRows: 1,
|
|
74
|
+
mobileBreakpoint: -1,
|
|
75
|
+
});
|
|
76
|
+
/**
|
|
77
|
+
* Cấu hình cho lưới LỒNG (ruột một container).
|
|
78
|
+
*
|
|
79
|
+
* Kế thừa lưới trang rồi ghi đè phần khác biệt. Ba điểm quan trọng nhất: `setGridSize` phải TẮT,
|
|
80
|
+
* tay cầm phải mang TÊN RIÊNG, và tự-cuộn-khi-kéo phải TẮT.
|
|
81
|
+
*/
|
|
82
|
+
export const gridLayoutNestedConfig = () => ({
|
|
83
|
+
...gridLayoutRootConfig(),
|
|
84
|
+
// 🔴 PHẢI tắt cho lưới lồng. `setGridSize` làm gridster tự ghi style width/height lên CHÍNH nó,
|
|
85
|
+
// sinh vòng lặp đo-rồi-ghi với ResizeObserver của khung ngoài (khung đổi → onResize xoá style →
|
|
86
|
+
// setGridSize ghi lại) → lưới con co dần về 64x64px trong khung 868px.
|
|
87
|
+
setGridSize: false,
|
|
88
|
+
// khe 2px: khối con là các dòng thông tin của CÙNG một card, khe rộng làm chúng trông như card rời
|
|
89
|
+
margin: 2,
|
|
90
|
+
// Lưới lồng KHÔNG tự chừa lề — lề là của VỎ container (`containerPadding`), không phải của lưới.
|
|
91
|
+
// Đặt ở vỏ thì ruột co lại đúng bằng phần còn lại, tay cầm resize của khối con luôn nằm trong tầm
|
|
92
|
+
// chuột (người dùng chốt 28/08/2026: "lưới cha có padding chứ ko phải con").
|
|
93
|
+
outerMargin: false,
|
|
94
|
+
outerMarginBottom: 0,
|
|
95
|
+
// hàng 16px cho bước kéo mịn, và sàn 1 hàng = 16px nên khối co được nhỏ hơn nhiều
|
|
96
|
+
fixedRowHeight: 16,
|
|
97
|
+
minRows: 1,
|
|
98
|
+
minItemRows: 1,
|
|
99
|
+
defaultItemCols: 2,
|
|
100
|
+
defaultItemRows: 2,
|
|
101
|
+
// 🔴 Tay cầm RIÊNG — CẤM dùng chung tên với lưới trang.
|
|
102
|
+
// `checkDragHandleClass` trả `true` ở node ĐẦU TIÊN có `dragHandleClass`. Dùng chung một tên thì
|
|
103
|
+
// lưới CHA cũng nhận ra tay cầm của khối con và nhấc luôn container.
|
|
104
|
+
draggable: {
|
|
105
|
+
...gridLayoutRootConfig().draggable,
|
|
106
|
+
dragHandleClass: 'libs-ui-grid-layout-drag-handle-child',
|
|
107
|
+
},
|
|
108
|
+
// 🔴 KÉO MÉP thì khối dưới ĐỨNG YÊN, chỉ khoảng trống giữa hai khối co giãn. Bật (kế thừa từ lưới
|
|
109
|
+
// trang) thì mỗi cú kéo đẩy dồn cả cột xuống — người dùng chỉ muốn một khối to hơn một chút mà cả
|
|
110
|
+
// card dài ra. `pushItems` vẫn giữ: nó lo việc KÉO THẢ đổi chỗ, khác việc đổi kích thước.
|
|
111
|
+
pushResizeItems: false,
|
|
112
|
+
// 🔴 Tắt tự cuộn khi kéo tới sát mép. Lib thấy chuột gần biên là cuộn lưới theo
|
|
113
|
+
// (`scrollSensitivity`), nhưng lưới con nằm trong card có `overflow: hidden` — cuộn ở đây đẩy khối
|
|
114
|
+
// con ra NGOÀI khung container rồi kẹt luôn ở đó.
|
|
115
|
+
disableScrollHorizontal: true,
|
|
116
|
+
disableScrollVertical: true,
|
|
117
|
+
});
|
|
118
|
+
/**
|
|
119
|
+
* Cây rỗng dùng khi chưa có dữ liệu — mặt phẳng vẽ ra một lưới trống thay vì vỡ.
|
|
120
|
+
* Xảy ra trong nhịp giữa lúc component dựng và lúc `init()` chạy.
|
|
121
|
+
*/
|
|
122
|
+
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=
|