@libs-ui/components-inputs-calculator 0.2.356-8 → 0.2.357-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -1,37 +1,47 @@
|
|
|
1
1
|
# @libs-ui/components-inputs-calculator
|
|
2
2
|
|
|
3
|
-
> Component Calculator nâng cao
|
|
3
|
+
> Component Calculator nâng cao cho phép xây dựng biểu thức toán học dạng token, kết hợp số, toán tử và trường dữ liệu động.
|
|
4
4
|
|
|
5
5
|
## Giới thiệu
|
|
6
6
|
|
|
7
|
-
`LibsUiComponentsInputsCalculatorComponent` là một standalone
|
|
7
|
+
`LibsUiComponentsInputsCalculatorComponent` là một Angular standalone component dùng để soạn thảo công thức tính toán theo dạng token trực quan. Người dùng có thể nhập số, chọn toán tử (+, -, *, /) và chèn các trường dữ liệu động từ hệ thống (fields) vào biểu thức. Component hỗ trợ đầy đủ thao tác bàn phím, xóa thông minh theo vị trí cursor, validation và cung cấp interface điều khiển từ bên ngoài qua `outFunctionControl`.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Tính năng
|
|
10
10
|
|
|
11
|
-
- ✅ **Token-based Input**: Hiển thị biểu thức dưới dạng các khối
|
|
12
|
-
- ✅ **Dynamic Fields**: Tích hợp
|
|
13
|
-
- ✅ **Keyboard Shortcuts**: Hỗ trợ
|
|
14
|
-
- ✅ **Smart Editing**:
|
|
15
|
-
- ✅ **
|
|
16
|
-
- ✅ **
|
|
11
|
+
- ✅ **Token-based Input**: Hiển thị biểu thức dưới dạng các khối token trực quan (giá trị, toán tử, field).
|
|
12
|
+
- ✅ **Dynamic Fields**: Tích hợp Popover + List để chọn trường dữ liệu động từ hệ thống.
|
|
13
|
+
- ✅ **Keyboard Shortcuts**: Hỗ trợ phím số, phím toán tử (+, -, *, /) và Enter để xác nhận từng token.
|
|
14
|
+
- ✅ **Smart Editing**: Backspace xóa token phía trước, Delete xóa token phía sau so với vị trí cursor.
|
|
15
|
+
- ✅ **Dynamic Input Width**: Tự động co giãn độ rộng ô nhập theo nội dung đang gõ.
|
|
16
|
+
- ✅ **FunctionControl API**: Cung cấp `checkIsValid()` và `getData()` để điều khiển từ component cha.
|
|
17
|
+
- ✅ **Validation**: Hỗ trợ hiển thị lỗi khi biểu thức trống qua `validRequired`.
|
|
18
|
+
- ✅ **OnPush + Signals**: Tối ưu hiệu năng với Angular Signals và `ChangeDetectionStrategy.OnPush`.
|
|
17
19
|
|
|
18
20
|
## Khi nào sử dụng
|
|
19
21
|
|
|
20
|
-
-
|
|
21
|
-
- Cấu hình
|
|
22
|
-
-
|
|
22
|
+
- Cần cho phép người dùng xây dựng công thức tính toán tùy chỉnh (formula editor).
|
|
23
|
+
- Cấu hình biểu thức tính lương, doanh thu, KPI hoặc các chỉ số nghiệp vụ.
|
|
24
|
+
- Kết hợp các trường dữ liệu từ hệ thống (fields) vào biểu thức toán học.
|
|
25
|
+
- Yêu cầu giao diện nhập liệu toán học an toàn, ngăn chặn nhập text tự do không hợp lệ.
|
|
26
|
+
- Cần validator và lấy dữ liệu biểu thức từ bên ngoài component qua FunctionControl.
|
|
23
27
|
|
|
24
28
|
## Cài đặt
|
|
25
29
|
|
|
26
30
|
```bash
|
|
27
|
-
# npm
|
|
28
31
|
npm install @libs-ui/components-inputs-calculator
|
|
29
32
|
```
|
|
30
33
|
|
|
31
34
|
## Import
|
|
32
35
|
|
|
33
36
|
```typescript
|
|
34
|
-
import {
|
|
37
|
+
import {
|
|
38
|
+
LibsUiComponentsInputsCalculatorComponent,
|
|
39
|
+
IInputCalculatorConfigField,
|
|
40
|
+
IInputCalculatorExpression,
|
|
41
|
+
IInputCalculatorFunctionControlEvent,
|
|
42
|
+
IInputCalculatorValid,
|
|
43
|
+
IInputCalculatorField,
|
|
44
|
+
} from '@libs-ui/components-inputs-calculator';
|
|
35
45
|
|
|
36
46
|
@Component({
|
|
37
47
|
standalone: true,
|
|
@@ -41,86 +51,284 @@ import { LibsUiComponentsInputsCalculatorComponent } from '@libs-ui/components-i
|
|
|
41
51
|
export class YourComponent {}
|
|
42
52
|
```
|
|
43
53
|
|
|
44
|
-
## Ví dụ
|
|
54
|
+
## Ví dụ sử dụng
|
|
45
55
|
|
|
46
|
-
### Cơ bản
|
|
56
|
+
### Ví dụ 1 — Cơ bản (chỉ cần configField)
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
// your.component.ts
|
|
60
|
+
import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
|
|
61
|
+
import {
|
|
62
|
+
LibsUiComponentsInputsCalculatorComponent,
|
|
63
|
+
IInputCalculatorConfigField,
|
|
64
|
+
IInputCalculatorExpression,
|
|
65
|
+
} from '@libs-ui/components-inputs-calculator';
|
|
66
|
+
import { returnListObject } from '@libs-ui/services-http-request';
|
|
67
|
+
import { escapeHtml } from '@libs-ui/utils';
|
|
68
|
+
|
|
69
|
+
@Component({
|
|
70
|
+
selector: 'app-your',
|
|
71
|
+
templateUrl: './your.component.html',
|
|
72
|
+
standalone: true,
|
|
73
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
74
|
+
imports: [LibsUiComponentsInputsCalculatorComponent],
|
|
75
|
+
})
|
|
76
|
+
export class YourComponent {
|
|
77
|
+
private readonly fields = [
|
|
78
|
+
{ key: 'revenue', name: 'Doanh thu', icon: 'libs-ui-icon-coin' },
|
|
79
|
+
{ key: 'cost', name: 'Chi phí', icon: 'libs-ui-icon-calculator' },
|
|
80
|
+
{ key: 'quantity', name: 'Số lượng', icon: 'libs-ui-icon-archive' },
|
|
81
|
+
];
|
|
82
|
+
|
|
83
|
+
readonly calculatorConfig: IInputCalculatorConfigField = {
|
|
84
|
+
label: 'Chọn trường dữ liệu',
|
|
85
|
+
placeholderInputList: 'Tìm kiếm tham số...',
|
|
86
|
+
listConfig: {
|
|
87
|
+
type: 'group',
|
|
88
|
+
httpRequestData: signal({
|
|
89
|
+
objectInstance: returnListObject(this.fields),
|
|
90
|
+
argumentsValue: [],
|
|
91
|
+
functionName: 'list',
|
|
92
|
+
}),
|
|
93
|
+
configTemplateGroup: signal({
|
|
94
|
+
fieldKey: 'key',
|
|
95
|
+
getLabelItem: (item) => escapeHtml(item.name),
|
|
96
|
+
singleSelectItem: true,
|
|
97
|
+
}),
|
|
98
|
+
},
|
|
99
|
+
getFieldSelected: (key: string) => this.fields.find((f) => f.key === key),
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
protected handlerSaveExpressions(event: Event): void {
|
|
103
|
+
event.stopPropagation();
|
|
104
|
+
// xử lý dữ liệu biểu thức
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
protected handlerChangeExpressions(expressions: IInputCalculatorExpression[]): void {
|
|
108
|
+
console.log('Biểu thức đã lưu:', expressions);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
47
112
|
|
|
48
113
|
```html
|
|
114
|
+
<!-- your.component.html -->
|
|
49
115
|
<libs_ui-components-inputs-calculator
|
|
50
116
|
[configField]="calculatorConfig"
|
|
51
|
-
(outChangeExpressions)="
|
|
117
|
+
(outChangeExpressions)="handlerChangeExpressions($event)" />
|
|
52
118
|
```
|
|
53
119
|
|
|
54
|
-
|
|
120
|
+
---
|
|
121
|
+
|
|
122
|
+
### Ví dụ 2 — Khởi tạo với biểu thức có sẵn
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
// your.component.ts
|
|
126
|
+
readonly initialExpressions: IInputCalculatorExpression[] = [
|
|
127
|
+
{ type: 'field', data: 'revenue' },
|
|
128
|
+
{ type: 'operation', data: '-' },
|
|
129
|
+
{ type: 'field', data: 'cost' },
|
|
130
|
+
];
|
|
131
|
+
```
|
|
55
132
|
|
|
56
133
|
```html
|
|
134
|
+
<!-- your.component.html -->
|
|
57
135
|
<libs_ui-components-inputs-calculator
|
|
58
136
|
[configField]="calculatorConfig"
|
|
59
|
-
[expressions]="initialExpressions"
|
|
137
|
+
[expressions]="initialExpressions"
|
|
138
|
+
[placeholder]="'Nhập công thức của bạn...'"
|
|
139
|
+
(outChangeExpressions)="handlerChangeExpressions($event)" />
|
|
60
140
|
```
|
|
61
141
|
|
|
62
|
-
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### Ví dụ 3 — Điều khiển từ bên ngoài qua FunctionControl
|
|
145
|
+
|
|
146
|
+
```typescript
|
|
147
|
+
// your.component.ts
|
|
148
|
+
import { signal } from '@angular/core';
|
|
149
|
+
import {
|
|
150
|
+
IInputCalculatorFunctionControlEvent,
|
|
151
|
+
IInputCalculatorExpression,
|
|
152
|
+
} from '@libs-ui/components-inputs-calculator';
|
|
153
|
+
|
|
154
|
+
readonly calculatorControls = signal<IInputCalculatorFunctionControlEvent | null>(null);
|
|
155
|
+
|
|
156
|
+
protected handlerFunctionControl(event: IInputCalculatorFunctionControlEvent): void {
|
|
157
|
+
event.stopPropagation?.();
|
|
158
|
+
this.calculatorControls.set(event);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
protected async handlerValidate(event: Event): Promise<void> {
|
|
162
|
+
event.stopPropagation();
|
|
163
|
+
const isValid = await this.calculatorControls()?.checkIsValid();
|
|
164
|
+
console.log('Biểu thức hợp lệ:', isValid);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
protected handlerGetData(event: Event): void {
|
|
168
|
+
event.stopPropagation();
|
|
169
|
+
const data: IInputCalculatorExpression[] | undefined = this.calculatorControls()?.getData();
|
|
170
|
+
console.log('Dữ liệu hiện tại:', data);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
63
173
|
|
|
64
|
-
|
|
174
|
+
```html
|
|
175
|
+
<!-- your.component.html -->
|
|
176
|
+
<libs_ui-components-inputs-calculator
|
|
177
|
+
[configField]="calculatorConfig"
|
|
178
|
+
[ignoreButtonSave]="true"
|
|
179
|
+
(outFunctionControl)="calculatorControls.set($event)" />
|
|
65
180
|
|
|
66
|
-
|
|
181
|
+
<button (click)="handlerValidate($event)">Kiểm tra hợp lệ</button>
|
|
182
|
+
<button (click)="handlerGetData($event)">Lấy dữ liệu</button>
|
|
183
|
+
```
|
|
67
184
|
|
|
68
|
-
|
|
69
|
-
| ------------------------ | ----------------------------------- | ------------------------- | ----------------------------------------- |
|
|
70
|
-
| `[classContainerButton]` | `string` | `''` | Class CSS cho container chứa các nút bấm. |
|
|
71
|
-
| `[classContainerInput]` | `string` | `''` | Class CSS cho vùng hiển thị biểu thức. |
|
|
72
|
-
| `[classInclude]` | `string` | `''` | Class CSS cho wrapper ngoài cùng. |
|
|
73
|
-
| `[configField]` | `IInputCalculatorConfigField` | - | **Bắt buộc**. Cấu hình chọn field. |
|
|
74
|
-
| `[expressions]` | `Array<IInputCalculatorExpression>` | `[]` | Danh sách biểu thức mặc định. |
|
|
75
|
-
| `[ignoreButtonSave]` | `boolean` | `false` | Ẩn/hiện nút Save mặc định. |
|
|
76
|
-
| `[labelButtonSave]` | `string` | `'i18n_save_calculation'` | Nhãn nút Save. |
|
|
77
|
-
| `[placeholder]` | `string` | `'i18n_enter_params'` | Placeholder khi trống. |
|
|
78
|
-
| `[validRequired]` | `IInputCalculatorValid` | - | Cấu hình validation rỗng. |
|
|
79
|
-
| `[zIndex]` | `number` | `10` | Z-index cho popover list. |
|
|
185
|
+
---
|
|
80
186
|
|
|
81
|
-
|
|
187
|
+
### Ví dụ 4 — Validation bắt buộc nhập
|
|
82
188
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
189
|
+
```typescript
|
|
190
|
+
// your.component.ts
|
|
191
|
+
readonly requiredValidation = { message: 'i18n_expression_required' };
|
|
192
|
+
```
|
|
87
193
|
|
|
88
|
-
|
|
194
|
+
```html
|
|
195
|
+
<!-- your.component.html -->
|
|
196
|
+
<libs_ui-components-inputs-calculator
|
|
197
|
+
[configField]="calculatorConfig"
|
|
198
|
+
[validRequired]="requiredValidation"
|
|
199
|
+
(outChangeExpressions)="handlerChangeExpressions($event)" />
|
|
200
|
+
```
|
|
89
201
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
### Ví dụ 5 — Ẩn nút Save, tùy chỉnh class
|
|
205
|
+
|
|
206
|
+
```html
|
|
207
|
+
<libs_ui-components-inputs-calculator
|
|
208
|
+
[configField]="calculatorConfig"
|
|
209
|
+
[ignoreButtonSave]="true"
|
|
210
|
+
[classInclude]="'shadow-md'"
|
|
211
|
+
[classContainerInput]="'min-h-[200px]'"
|
|
212
|
+
[classContainerButton]="'mt-4'"
|
|
213
|
+
(outChangeExpressions)="handlerChangeExpressions($event)" />
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## @Input()
|
|
217
|
+
|
|
218
|
+
| Input | Type | Default | Mô tả | Ví dụ |
|
|
219
|
+
|---|---|---|---|---|
|
|
220
|
+
| `[classContainerButton]` | `string` | `''` | Class CSS bổ sung cho container chứa các nút bấm (bàn phím số và toán tử). | `[classContainerButton]="'mt-4'"` |
|
|
221
|
+
| `[classContainerInput]` | `string` | `''` | Class CSS bổ sung cho vùng hiển thị và nhập biểu thức. | `[classContainerInput]="'min-h-[200px]'"` |
|
|
222
|
+
| `[classInclude]` | `string` | `''` | Class CSS bổ sung cho wrapper ngoài cùng của toàn bộ component. | `[classInclude]="'shadow-md rounded-xl'"` |
|
|
223
|
+
| `[configField]` | `IInputCalculatorConfigField` | `undefined` | Cấu hình cho việc hiển thị và chọn các trường dữ liệu động. Bao gồm listConfig và hàm `getFieldSelected`. | `[configField]="calculatorConfig"` |
|
|
224
|
+
| `[expressions]` | `IInputCalculatorExpression[]` | `[]` | Danh sách biểu thức khởi tạo ban đầu. Component sẽ clone sâu array này khi `ngOnInit`. | `[expressions]="initialExpressions"` |
|
|
225
|
+
| `[ignoreButtonSave]` | `boolean` | `false` | Khi `true`, ẩn nút Save mặc định ở cuối component. Dùng khi muốn lưu theo cách khác qua FunctionControl. | `[ignoreButtonSave]="true"` |
|
|
226
|
+
| `[labelButtonSave]` | `string` | `'i18n_save_calculation'` | Nhãn hiển thị trên nút Save. Hỗ trợ i18n key. | `[labelButtonSave]="'Lưu công thức'"` |
|
|
227
|
+
| `[placeholder]` | `string` | `'i18n_enter_params'` | Văn bản placeholder hiển thị khi biểu thức còn trống. Hỗ trợ i18n key. | `[placeholder]="'Nhập công thức...'"` |
|
|
228
|
+
| `[validRequired]` | `IInputCalculatorValid` | `undefined` | Cấu hình validation: hiển thị thông báo lỗi khi biểu thức rỗng. | `[validRequired]="{ message: 'i18n_required' }"` |
|
|
229
|
+
| `[zIndex]` | `number` | `10` | Z-index cho Popover hiển thị danh sách fields khi chọn trường dữ liệu. | `[zIndex]="100"` |
|
|
230
|
+
|
|
231
|
+
## @Output()
|
|
232
|
+
|
|
233
|
+
| Output | Type | Mô tả | Handler TS | Binding HTML |
|
|
234
|
+
|---|---|---|---|---|
|
|
235
|
+
| `(outChangeExpressions)` | `IInputCalculatorExpression[]` | Phát ra danh sách biểu thức hiện tại khi người dùng nhấn nút Save. Chỉ phát khi có thay đổi so với lần Save trước. | `handlerChangeExpressions(expressions: IInputCalculatorExpression[]): void { event.stopPropagation(); this.savedExpressions.set(expressions); }` | `(outChangeExpressions)="handlerChangeExpressions($event)"` |
|
|
236
|
+
| `(outFunctionControl)` | `IInputCalculatorFunctionControlEvent` | Phát ra ngay khi component khởi tạo (`ngOnInit`), cung cấp interface để điều khiển component từ bên ngoài. | `handlerFunctionControl(control: IInputCalculatorFunctionControlEvent): void { this.calculatorControls.set(control); }` | `(outFunctionControl)="calculatorControls.set($event)"` |
|
|
237
|
+
|
|
238
|
+
## FunctionControl Methods
|
|
239
|
+
|
|
240
|
+
Nhận về qua output `(outFunctionControl)`. Lưu vào signal rồi gọi khi cần:
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
readonly calculatorControls = signal<IInputCalculatorFunctionControlEvent | null>(null);
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
| Method | Signature | Mô tả |
|
|
247
|
+
|---|---|---|
|
|
248
|
+
| `checkIsValid()` | `() => Promise<boolean>` | Kiểm tra tính hợp lệ của biểu thức. Trả về `false` nếu biểu thức rỗng và `validRequired` được cấu hình. Đồng thời hiển thị thông báo lỗi trên UI. |
|
|
249
|
+
| `getData()` | `() => IInputCalculatorExpression[]` | Lấy bản sao sâu (deep clone) của danh sách biểu thức hiện tại mà không cần nhấn nút Save. |
|
|
94
250
|
|
|
95
251
|
## Types & Interfaces
|
|
96
252
|
|
|
97
253
|
```typescript
|
|
98
|
-
|
|
254
|
+
import {
|
|
255
|
+
IInputCalculatorExpression,
|
|
256
|
+
IInputCalculatorConfigField,
|
|
257
|
+
IInputCalculatorFunctionControlEvent,
|
|
258
|
+
IInputCalculatorValid,
|
|
259
|
+
IInputCalculatorField,
|
|
260
|
+
} from '@libs-ui/components-inputs-calculator';
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
/**
|
|
265
|
+
* Một phần tử trong biểu thức toán học.
|
|
266
|
+
* - type 'value': giá trị số hoặc text được nhập trực tiếp (VD: "100", "2.5")
|
|
267
|
+
* - type 'field': tham chiếu đến một trường dữ liệu động từ hệ thống (VD: key "revenue")
|
|
268
|
+
* - type 'operation': toán tử toán học ('+', '-', '*', '/', '(', ')')
|
|
269
|
+
*/
|
|
270
|
+
interface IInputCalculatorExpression {
|
|
99
271
|
type: 'value' | 'field' | 'operation';
|
|
100
272
|
data: string | number;
|
|
101
273
|
}
|
|
102
274
|
|
|
103
|
-
|
|
275
|
+
/**
|
|
276
|
+
* Cấu hình cho việc chọn và hiển thị các trường dữ liệu động.
|
|
277
|
+
*/
|
|
278
|
+
interface IInputCalculatorConfigField {
|
|
279
|
+
/** Nhãn nút chọn field, hiển thị ở dưới vùng nhập. Mặc định: 'i18n_select_field' */
|
|
104
280
|
label?: string;
|
|
281
|
+
/** Placeholder cho ô tìm kiếm trong danh sách field */
|
|
105
282
|
placeholderInputList?: string;
|
|
283
|
+
/** Cấu hình danh sách hiển thị từ @libs-ui/components-list */
|
|
106
284
|
listConfig: IListConfigItem;
|
|
285
|
+
/** Callback lấy thông tin hiển thị (name, icon) của field theo key */
|
|
107
286
|
getFieldSelected: (field: string) => IInputCalculatorField | undefined;
|
|
108
287
|
}
|
|
109
288
|
|
|
110
|
-
|
|
289
|
+
/**
|
|
290
|
+
* Thông tin hiển thị của một field trong biểu thức.
|
|
291
|
+
*/
|
|
292
|
+
interface IInputCalculatorField {
|
|
293
|
+
key?: string;
|
|
294
|
+
name?: string;
|
|
295
|
+
icon?: string;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Interface điều khiển component từ bên ngoài (nhận qua outFunctionControl).
|
|
300
|
+
*/
|
|
301
|
+
interface IInputCalculatorFunctionControlEvent {
|
|
111
302
|
checkIsValid: () => Promise<boolean>;
|
|
112
303
|
getData: () => Array<IInputCalculatorExpression>;
|
|
113
304
|
}
|
|
114
305
|
|
|
115
|
-
|
|
116
|
-
|
|
306
|
+
/**
|
|
307
|
+
* Cấu hình validation cho biểu thức.
|
|
308
|
+
*/
|
|
309
|
+
interface IInputCalculatorValid {
|
|
310
|
+
message?: string;
|
|
117
311
|
}
|
|
118
312
|
```
|
|
119
313
|
|
|
120
|
-
##
|
|
314
|
+
## Lưu ý quan trọng
|
|
315
|
+
|
|
316
|
+
⚠️ **`configField` là cấu hình cốt lõi**: Mặc dù không bắt buộc về mặt TypeScript, component sẽ không hiển thị đúng nút chọn field và không resolve được tên/icon của field trong biểu thức nếu thiếu `configField`. Luôn truyền vào khi dùng trong production.
|
|
317
|
+
|
|
318
|
+
⚠️ **`outFunctionControl` phát ngay khi ngOnInit**: Output này được emit ngay trong `ngOnInit`, không phải do tương tác người dùng. Cần lưu vào signal hoặc biến class ngay khi nhận. Không dùng `async pipe` hay subscribe muộn.
|
|
121
319
|
|
|
122
|
-
|
|
320
|
+
⚠️ **`outChangeExpressions` chỉ phát khi nhấn nút Save**: Component không phát liên tục khi người dùng chỉnh sửa. Nếu muốn lấy dữ liệu tức thời mà không cần nhấn Save, dùng `getData()` từ FunctionControl. Để ẩn nút Save và tự quản lý, đặt `[ignoreButtonSave]="true"`.
|
|
123
321
|
|
|
124
|
-
|
|
322
|
+
⚠️ **Xóa token bằng bàn phím**: Khi ô nhập đang trống và focus, `Backspace` xóa token ngay phía trước vị trí cursor, `Delete` xóa token ngay phía sau. Đây là hành vi có chủ đích để tối ưu trải nghiệm chỉnh sửa.
|
|
323
|
+
|
|
324
|
+
⚠️ **Toán tử qua bàn phím**: Gõ `+`, `-`, `*`, `/` trong ô nhập sẽ tự động được chuyển thành token toán tử (type: `'operation'`) thay vì nhập text. Component dùng `keyup` event để bắt và xử lý.
|
|
325
|
+
|
|
326
|
+
⚠️ **Deep clone `expressions`**: Component thực hiện `cloneDeep` trên `expressions` input khi khởi tạo. Thay đổi array gốc bên ngoài sau khi component đã init sẽ không có tác dụng — cần re-render component nếu muốn reset.
|
|
327
|
+
|
|
328
|
+
## Demo
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
npx nx serve core-ui
|
|
332
|
+
```
|
|
125
333
|
|
|
126
|
-
|
|
334
|
+
Truy cập: `http://localhost:4500/components/inputs/calculator`
|
|
@@ -13,9 +13,9 @@ export declare class LibsUiComponentsInputsCalculatorComponent implements OnInit
|
|
|
13
13
|
protected listExpressions: import("@angular/core").WritableSignal<IInputCalculatorExpression[]>;
|
|
14
14
|
protected isChangeExpression: import("@angular/core").WritableSignal<boolean>;
|
|
15
15
|
protected error: import("@angular/core").WritableSignal<IInputCalculatorValid | undefined>;
|
|
16
|
-
private inputRef;
|
|
17
|
-
private timeOut;
|
|
18
|
-
private tooltipFunctionControl;
|
|
16
|
+
private readonly inputRef;
|
|
17
|
+
private readonly timeOut;
|
|
18
|
+
private readonly tooltipFunctionControl;
|
|
19
19
|
readonly expressions: import("@angular/core").InputSignal<IInputCalculatorExpression[]>;
|
|
20
20
|
readonly zIndex: import("@angular/core").InputSignal<number>;
|
|
21
21
|
readonly placeholder: import("@angular/core").InputSignal<string>;
|
|
@@ -82,7 +82,7 @@ export class LibsUiComponentsInputsCalculatorComponent {
|
|
|
82
82
|
if (value) {
|
|
83
83
|
value = isDelete ? value : value - 1;
|
|
84
84
|
}
|
|
85
|
-
return value
|
|
85
|
+
return value || position;
|
|
86
86
|
}
|
|
87
87
|
if (typeof value === 'undefined') {
|
|
88
88
|
value = this.listExpressions().length;
|
|
@@ -180,13 +180,13 @@ export class LibsUiComponentsInputsCalculatorComponent {
|
|
|
180
180
|
}
|
|
181
181
|
async validate() {
|
|
182
182
|
this.error.set(undefined);
|
|
183
|
-
if (!this.validRequired()
|
|
183
|
+
if (!this.validRequired()?.message) {
|
|
184
184
|
return true;
|
|
185
185
|
}
|
|
186
186
|
if (!this.listExpressions().length) {
|
|
187
187
|
this.error.set({ message: this.validRequired()?.message });
|
|
188
188
|
}
|
|
189
|
-
return this.listExpressions().length
|
|
189
|
+
return !!this.listExpressions().length;
|
|
190
190
|
}
|
|
191
191
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsCalculatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
192
192
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsCalculatorComponent, isStandalone: true, selector: "libs_ui-components-inputs-calculator", inputs: { expressions: { classPropertyName: "expressions", publicName: "expressions", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, labelButtonSave: { classPropertyName: "labelButtonSave", publicName: "labelButtonSave", isSignal: true, isRequired: false, transformFunction: null }, configField: { classPropertyName: "configField", publicName: "configField", isSignal: true, isRequired: false, transformFunction: null }, ignoreButtonSave: { classPropertyName: "ignoreButtonSave", publicName: "ignoreButtonSave", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classContainerInput: { classPropertyName: "classContainerInput", publicName: "classContainerInput", isSignal: true, isRequired: false, transformFunction: null }, classContainerButton: { classPropertyName: "classContainerButton", publicName: "classContainerButton", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outChangeExpressions: "outChangeExpressions", outFunctionControl: "outFunctionControl" }, viewQueries: [{ propertyName: "inputRef", predicate: ["inputRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"w-full\">\n <div class=\"p-[8px] rounded-[12px] bg-[#f8f9fa] {{ classInclude() }}\">\n <div class=\"mb-[8px] {{ classContainerInput() }}\">\n <div\n #calculatorInput\n class=\"py-[10px] px-[12px] libs-ui-font-h5r rounded-[8px] bg-[#ffffff] min-h-[160px] h-full border-[1px] {{ error()?.message ? 'libs-ui-border-error-general' : isFocus() ? 'border-[var(--libs-ui-color-light-1)]' : 'border-[#ffffff]' }}\"\n (mouseup)=\"handlerClickInput($event)\">\n <ul class=\"before:content-[''] before:table after:content-[''] after:table after:clear-both\">\n @for (item of listExpressions(); track $index; let i = $index) {\n <li class=\"float-left mb-[8px]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none text-center\"\n [class.ml-[-8px]]=\"i === 0\"\n [style.width.px]=\"inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(i)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n @switch (item.type) {\n @case ('operation') {\n <li class=\"float-left mb-[8px] text-center w-[24px] h-[24px] rounded-[4px] p-[4px] bg-[var(--libs-ui-color-light-2)]\">\n @switch (item.data) {\n @case ('/') {\n <i class=\"libs-ui-icon-divide text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('-') {\n <i class=\"libs-ui-icon-minus text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('+') {\n <i class=\"libs-ui-icon-add text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('*') {\n <i class=\"libs-ui-icon-close text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n }\n </li>\n }\n @case ('value') {\n <li class=\"float-left mb-[8px] text-center rounded-[4px] h-[24px] px-[8px] bg-[#E6E7EA] flex items-center max-w-[calc(100%-8px)]\">\n <libs_ui-components-popover [type]=\"'text'\">{{ item.data }}</libs_ui-components-popover>\n </li>\n }\n @case ('field') {\n @if ({ fieldSelected: item.data | LibsUiComponentsInputsCalculatorGetFieldSelectedPipe: configField()?.getFieldSelected }; as data) {\n <li class=\"float-left mb-[8px]\">\n <libs_ui-components-buttons-button\n class=\"max-w-[172px] block\"\n [label]=\"data.fieldSelected?.name || 'i18n_field_error'\"\n [classInclude]=\"'!justify-center !py-[2px] !px-[7px] !w-full'\"\n [classIconLeft]=\"data.fieldSelected?.icon || 'libs-ui-icon-tooltip-outline'\"\n [classIconRight]=\"'libs-ui-icon-move-right rotate-90'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [zIndex]=\"zIndex()\"\n [type]=\"data.fieldSelected ? 'button-primary' : 'button-danger-high'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: false,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: i, key: item.data },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, i)\" />\n </li>\n }\n }\n }\n }\n <li class=\"float-left mb-[8px] max-w-[100%]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none max-w-[100%] {{ listExpressions().length ? 'text-center' : '' }}\"\n [style.width.px]=\"listExpressions().length ? (inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput) : 150\"\n [placeholder]=\"!listExpressions().length ? (placeholder() | translate) : ''\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(listExpressions().length)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n </ul>\n </div>\n @if (error()?.message) {\n <div class=\"libs-ui-text-error mt-[8px] libs-ui-font-h7r\">\n @let constHtmlMessage = error()?.message || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n </div>\n <div class=\"grid grid-cols-4 gap-[8px] {{ classContainerButton() }}\">\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"configField()?.label || 'i18n_select_field'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: true,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: -1 },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, -1)\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-violet'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'Fx'\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-danger-high'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'C'\"\n (outClick)=\"handlerClick($event, 'c')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'('\"\n (outClick)=\"handlerClick($event, '(')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"')'\"\n (outClick)=\"handlerClick($event, ')')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-divide'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '/')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'1'\"\n (outClick)=\"handlerClick($event, '1')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'2'\"\n (outClick)=\"handlerClick($event, '2')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'3'\"\n (outClick)=\"handlerClick($event, '3')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClick($event, '*')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'4'\"\n (outClick)=\"handlerClick($event, '4')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'5'\"\n (outClick)=\"handlerClick($event, '5')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'6'\"\n (outClick)=\"handlerClick($event, '6')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-minus'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '-')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'7'\"\n (outClick)=\"handlerClick($event, '7')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'8'\"\n (outClick)=\"handlerClick($event, '8')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'9'\"\n (outClick)=\"handlerClick($event, '9')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n (outClick)=\"handlerClick($event, '+')\" />\n </div>\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"'0'\"\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n (outClick)=\"handlerClick($event, '0')\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'.'\"\n (outClick)=\"handlerClick($event, '.')\" />\n </div>\n </div>\n </div>\n @if (!ignoreButtonSave()) {\n <div class=\"mt-[16px]\">\n <libs_ui-components-buttons-button\n [label]=\"labelButtonSave()\"\n [disable]=\"!isChangeExpression()\"\n [classInclude]=\"'justify-center w-full'\"\n (outClick)=\"handlerSave($event)\" />\n </div>\n }\n</div>\n\n<ng-template\n #listViewRef\n let-data=\"itemContext\">\n <libs_ui-components-list\n [zIndex]=\"zIndex()\"\n [config]=\"configField()?.listConfig\"\n [maxItemShow]=\"6\"\n [clickExactly]=\"false\"\n [searchConfig]=\"{ noBorder: true, placeholder: configField()?.placeholderInputList || 'i18n_search' }\"\n [multiKeySelected]=\"data.key ? [data.key] : []\"\n (outSelectMultiKey)=\"handlerSelectedField($event, data.index)\"></libs_ui-components-list>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "templateRefNotSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outKeySearch", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }, { kind: "pipe", type: LibsUiComponentsInputsCalculatorGetFieldSelectedPipe, name: "LibsUiComponentsInputsCalculatorGetFieldSelectedPipe" }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsCalculatorGetWidthInputPipe, name: "LibsUiComponentsInputsCalculatorGetWidthInputPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
@@ -195,4 +195,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
195
195
|
type: Component,
|
|
196
196
|
args: [{ selector: 'libs_ui-components-inputs-calculator', standalone: true, imports: [TranslateModule, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsListComponent, LibsUiComponentsInputsCalculatorGetFieldSelectedPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsInputsCalculatorGetWidthInputPipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"w-full\">\n <div class=\"p-[8px] rounded-[12px] bg-[#f8f9fa] {{ classInclude() }}\">\n <div class=\"mb-[8px] {{ classContainerInput() }}\">\n <div\n #calculatorInput\n class=\"py-[10px] px-[12px] libs-ui-font-h5r rounded-[8px] bg-[#ffffff] min-h-[160px] h-full border-[1px] {{ error()?.message ? 'libs-ui-border-error-general' : isFocus() ? 'border-[var(--libs-ui-color-light-1)]' : 'border-[#ffffff]' }}\"\n (mouseup)=\"handlerClickInput($event)\">\n <ul class=\"before:content-[''] before:table after:content-[''] after:table after:clear-both\">\n @for (item of listExpressions(); track $index; let i = $index) {\n <li class=\"float-left mb-[8px]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none text-center\"\n [class.ml-[-8px]]=\"i === 0\"\n [style.width.px]=\"inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(i)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n @switch (item.type) {\n @case ('operation') {\n <li class=\"float-left mb-[8px] text-center w-[24px] h-[24px] rounded-[4px] p-[4px] bg-[var(--libs-ui-color-light-2)]\">\n @switch (item.data) {\n @case ('/') {\n <i class=\"libs-ui-icon-divide text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('-') {\n <i class=\"libs-ui-icon-minus text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('+') {\n <i class=\"libs-ui-icon-add text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('*') {\n <i class=\"libs-ui-icon-close text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n }\n </li>\n }\n @case ('value') {\n <li class=\"float-left mb-[8px] text-center rounded-[4px] h-[24px] px-[8px] bg-[#E6E7EA] flex items-center max-w-[calc(100%-8px)]\">\n <libs_ui-components-popover [type]=\"'text'\">{{ item.data }}</libs_ui-components-popover>\n </li>\n }\n @case ('field') {\n @if ({ fieldSelected: item.data | LibsUiComponentsInputsCalculatorGetFieldSelectedPipe: configField()?.getFieldSelected }; as data) {\n <li class=\"float-left mb-[8px]\">\n <libs_ui-components-buttons-button\n class=\"max-w-[172px] block\"\n [label]=\"data.fieldSelected?.name || 'i18n_field_error'\"\n [classInclude]=\"'!justify-center !py-[2px] !px-[7px] !w-full'\"\n [classIconLeft]=\"data.fieldSelected?.icon || 'libs-ui-icon-tooltip-outline'\"\n [classIconRight]=\"'libs-ui-icon-move-right rotate-90'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [zIndex]=\"zIndex()\"\n [type]=\"data.fieldSelected ? 'button-primary' : 'button-danger-high'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: false,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: i, key: item.data },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, i)\" />\n </li>\n }\n }\n }\n }\n <li class=\"float-left mb-[8px] max-w-[100%]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none max-w-[100%] {{ listExpressions().length ? 'text-center' : '' }}\"\n [style.width.px]=\"listExpressions().length ? (inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput) : 150\"\n [placeholder]=\"!listExpressions().length ? (placeholder() | translate) : ''\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(listExpressions().length)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n </ul>\n </div>\n @if (error()?.message) {\n <div class=\"libs-ui-text-error mt-[8px] libs-ui-font-h7r\">\n @let constHtmlMessage = error()?.message || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n </div>\n <div class=\"grid grid-cols-4 gap-[8px] {{ classContainerButton() }}\">\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"configField()?.label || 'i18n_select_field'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: true,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: -1 },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, -1)\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-violet'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'Fx'\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-danger-high'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'C'\"\n (outClick)=\"handlerClick($event, 'c')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'('\"\n (outClick)=\"handlerClick($event, '(')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"')'\"\n (outClick)=\"handlerClick($event, ')')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-divide'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '/')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'1'\"\n (outClick)=\"handlerClick($event, '1')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'2'\"\n (outClick)=\"handlerClick($event, '2')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'3'\"\n (outClick)=\"handlerClick($event, '3')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClick($event, '*')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'4'\"\n (outClick)=\"handlerClick($event, '4')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'5'\"\n (outClick)=\"handlerClick($event, '5')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'6'\"\n (outClick)=\"handlerClick($event, '6')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-minus'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '-')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'7'\"\n (outClick)=\"handlerClick($event, '7')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'8'\"\n (outClick)=\"handlerClick($event, '8')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'9'\"\n (outClick)=\"handlerClick($event, '9')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n (outClick)=\"handlerClick($event, '+')\" />\n </div>\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"'0'\"\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n (outClick)=\"handlerClick($event, '0')\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'.'\"\n (outClick)=\"handlerClick($event, '.')\" />\n </div>\n </div>\n </div>\n @if (!ignoreButtonSave()) {\n <div class=\"mt-[16px]\">\n <libs_ui-components-buttons-button\n [label]=\"labelButtonSave()\"\n [disable]=\"!isChangeExpression()\"\n [classInclude]=\"'justify-center w-full'\"\n (outClick)=\"handlerSave($event)\" />\n </div>\n }\n</div>\n\n<ng-template\n #listViewRef\n let-data=\"itemContext\">\n <libs_ui-components-list\n [zIndex]=\"zIndex()\"\n [config]=\"configField()?.listConfig\"\n [maxItemShow]=\"6\"\n [clickExactly]=\"false\"\n [searchConfig]=\"{ noBorder: true, placeholder: configField()?.placeholderInputList || 'i18n_search' }\"\n [multiKeySelected]=\"data.key ? [data.key] : []\"\n (outSelectMultiKey)=\"handlerSelectedField($event, data.index)\"></libs_ui-components-list>\n</ng-template>\n" }]
|
|
197
197
|
}] });
|
|
198
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL2NhbGN1bGF0b3Ivc3JjL2NhbGN1bGF0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9jYWxjdWxhdG9yL3NyYy9jYWxjdWxhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBeUIsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRyxPQUFPLEVBQWdDLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0csT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsb0RBQW9ELEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RyxPQUFPLEVBQUUsaURBQWlELEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7O0FBRWpHOzs7R0FHRztBQVNILE1BQU0sT0FBTyx5Q0FBeUM7SUFDMUMsVUFBVSxHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFDbkQsT0FBTyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNqQyxlQUFlLEdBQUcsTUFBTSxDQUFvQyxFQUFFLENBQUMsQ0FBQztJQUNoRSxrQkFBa0IsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDNUMsS0FB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QUFDLENBQUM7UUFDN0QsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdEQsQ0FBQzt3R0FoTlUseUNBQXlDOzRGQUF6Qyx5Q0FBeUMsc3VEQ3ZCdEQsMm1aQW9TQSwyQ0RoUlksZUFBZSw0RkFBRSxzQ0FBc0Msc2pCQUFFLDZCQUE2QixzaENBQUUsb0RBQW9ELDZGQUFFLGdDQUFnQywrZkFBRSxpREFBaUQ7OzRGQUdoTyx5Q0FBeUM7a0JBUnJELFNBQVM7K0JBRUUsc0NBQXNDLGNBRXBDLElBQUksV0FDUCxDQUFDLGVBQWUsRUFBRSxzQ0FBc0MsRUFBRSw2QkFBNkIsRUFBRSxvREFBb0QsRUFBRSxnQ0FBZ0MsRUFBRSxpREFBaUQsQ0FBQyxtQkFDM04sdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGlucHV0LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJTGlzdERhdGFFbWl0TXVsdGlLZXksIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IElFdmVudCB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBVdGlsc0tleUNvZGVDb25zdGFudCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUlucHV0Q2FsY3VsYXRvckNvbmZpZ0ZpZWxkLCBJSW5wdXRDYWxjdWxhdG9yRXhwcmVzc2lvbiwgSUlucHV0Q2FsY3VsYXRvckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJSW5wdXRDYWxjdWxhdG9yVmFsaWQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c0NhbGN1bGF0b3JHZXRGaWVsZFNlbGVjdGVkUGlwZSB9IGZyb20gJy4vcGlwZXMvZ2V0LWZpZWxkLXNlbGVjdGVkLnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c0NhbGN1bGF0b3JHZXRXaWR0aElucHV0UGlwZSB9IGZyb20gJy4vcGlwZXMvZ2V0LXdpZHRoLWlucHV0LnBpcGUnO1xuXG4vKipcbiAqIENvbXBvbmVudCBDYWxjdWxhdG9yIG7Dom5nIGNhbyBo4buXIHRy4bujIG5o4bqtcCBsaeG7h3UgYmnhu4N1IHRo4bupYyB0b8OhbiBo4buNYy5cbiAqIEvhur90IGjhu6NwIGdp4buvYSBjw6FjIHRyxrDhu51uZyBk4buvIGxp4buHdSDEkeG7mW5nIChmaWVsZHMpLCBnacOhIHRy4buLIHTEqW5oIHbDoCB0b8OhbiB04butLlxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWNhbGN1bGF0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsY3VsYXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0lucHV0c0NhbGN1bGF0b3JHZXRGaWVsZFNlbGVjdGVkUGlwZSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNDYWxjdWxhdG9yR2V0V2lkdGhJbnB1dFBpcGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c0NhbGN1bGF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcm90ZWN0ZWQgaW5kZXhGb2N1cyA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBpc0ZvY3VzID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxpc3RFeHByZXNzaW9ucyA9IHNpZ25hbDxBcnJheTxJSW5wdXRDYWxjdWxhdG9yRXhwcmVzc2lvbj4+KFtdKTtcbiAgcHJvdGVjdGVkIGlzQ2hhbmdlRXhwcmVzc2lvbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBlcnJvciA9IHNpZ25hbDxJSW5wdXRDYWxjdWxhdG9yVmFsaWQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJpdmF0ZSBpbnB1dFJlZiA9IHZpZXdDaGlsZHJlbjxFbGVtZW50UmVmPignaW5wdXRSZWYnKTtcbiAgcHJpdmF0ZSB0aW1lT3V0ID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSB0b29sdGlwRnVuY3Rpb25Db250cm9sID0gc2lnbmFsPE1hcDxudW1iZXIsIElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+PihuZXcgTWFwKCkpO1xuXG4gIHJlYWRvbmx5IGV4cHJlc3Npb25zID0gaW5wdXQ8QXJyYXk8SUlucHV0Q2FsY3VsYXRvckV4cHJlc3Npb24+PihbXSk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oMTApO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJ2kxOG5fZW50ZXJfcGFyYW1zJyk7XG4gIHJlYWRvbmx5IGxhYmVsQnV0dG9uU2F2ZSA9IGlucHV0PHN0cmluZz4oJ2kxOG5fc2F2ZV9jYWxjdWxhdGlvbicpO1xuICByZWFkb25seSBjb25maWdGaWVsZCA9IGlucHV0PElJbnB1dENhbGN1bGF0b3JDb25maWdGaWVsZD4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQnV0dG9uU2F2ZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NDb250YWluZXJJbnB1dCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzQ29udGFpbmVyQnV0dG9uID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCAnJyB9KTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElJbnB1dENhbGN1bGF0b3JWYWxpZD4oKTtcblxuICByZWFkb25seSBvdXRDaGFuZ2VFeHByZXNzaW9ucyA9IG91dHB1dDxBcnJheTxJSW5wdXRDYWxjdWxhdG9yRXhwcmVzc2lvbj4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJSW5wdXRDYWxjdWxhdG9yRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5saXN0RXhwcmVzc2lvbnMuc2V0KGNsb25lRGVlcCh0aGlzLmV4cHJlc3Npb25zKCkpKTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUlucHV0Q2FsY3VsYXRvckZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICBnZXREYXRhOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjbG9uZURlZXAodGhpcy5saXN0RXhwcmVzc2lvbnMoKSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrKGV2ZW50OiBFdmVudCwgYnV0dG9uOiAnKycgfCAnLScgfCAnKicgfCAnLycgfCAnYycgfCAnLicgfCAnKCcgfCAnKScgfCAnMCcgfCAnMScgfCAnMicgfCAnMycgfCAnNCcgfCAnNScgfCAnNicgfCAnNycgfCAnOCcgfCAnOScpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBleHByZXNzaW9uOiBJSW5wdXRDYWxjdWxhdG9yRXhwcmVzc2lvbiA9IHsgdHlwZTogJ2ZpZWxkJywgZGF0YTogYnV0dG9uIH07XG5cbiAgICBpZiAoYnV0dG9uID09PSAnYycpIHtcbiAgICAgIGlmICghdGhpcy5saXN0RXhwcmVzc2lvbnMoKS5sZW5ndGggfHwgdGhpcy5pbmRleEZvY3VzKCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRXhwcmVzc2lvbnModW5kZWZpbmVkLCB0eXBlb2YgdGhpcy5pbmRleEZvY3VzKCkgIT09ICd1bmRlZmluZWQnID8gKHRoaXMuaW5kZXhGb2N1cygpIHx8IDEpIC0gMSA6IHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIHN3aXRjaCAoYnV0dG9uKSB7XG4gICAgICBjYXNlICcrJzpcbiAgICAgIGNhc2UgJy0nOlxuICAgICAgY2FzZSAnKic6XG4gICAgICBjYXNlICcvJzpcbiAgICAgICAgZXhwcmVzc2lvbi50eXBlID0gJ29wZXJhdGlvbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZXhwcmVzc2lvbi50eXBlID0gJ3ZhbHVlJztcbiAgICB9XG4gICAgdGhpcy51cGRhdGVFeHByZXNzaW9ucyhleHByZXNzaW9uLCB0eXBlb2YgdGhpcy5pbmRleEZvY3VzKCkgIT09ICd1bmRlZmluZWQnID8gdGhpcy5pbmRleEZvY3VzKCkgfHwgMCA6IHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRXhwcmVzc2lvbnMoaXRlbTogSUlucHV0Q2FsY3VsYXRvckV4cHJlc3Npb24gfCB1bmRlZmluZWQsIHBvc2l0aW9uOiBudW1iZXIsIGlzRGVsZXRlPzogYm9vbGVhbikge1xuICAgIHRoaXMuaXNDaGFuZ2VFeHByZXNzaW9uLnNldCh0cnVlKTtcbiAgICB0aGlzLmxpc3RFeHByZXNzaW9ucy51cGRhdGUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICB2YWx1ZS5zcGxpY2UocG9zaXRpb24gfHwgMCwgMCwgaXRlbSk7XG4gICAgICB9XG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgdmFsdWUuc3BsaWNlKHBvc2l0aW9uIHx8IDAsIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gWy4uLnZhbHVlXTtcbiAgICB9KTtcblxuICAgIHRoaXMuaW5kZXhGb2N1cy51cGRhdGUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdmFsdWUgPSBpc0RlbGV0ZSA/IHZhbHVlIDogdmFsdWUgLSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlID8gdmFsdWUgOiBwb3NpdGlvbjtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5saXN0RXhwcmVzc2lvbnMoKS5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgdmFsdWUrKztcblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIGNvbnN0IGluZGV4Rm9jdXMgPSB0aGlzLmluZGV4Rm9jdXMoKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBpbmRleEZvY3VzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLmlucHV0UmVmKClbaW5kZXhGb2N1c10/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9LCAxMDApO1xuICAgIHRoaXMudmFsaWRhdGUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRXZlbnRLZXlVcElucHV0KGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGtleUNvZGUgPSAoZXZlbnQgYXMgSUV2ZW50KS5rZXlDb2RlO1xuICAgIGNvbnN0IHZhbHVlID0gKGV2ZW50IGFzIElFdmVudCkudGFyZ2V0LnZhbHVlO1xuICAgIGNvbnN0IHNoaWZ0S2V5ID0gKGV2ZW50IGFzIElFdmVudCkuc2hpZnRLZXk7XG5cbiAgICBpZiAoKChbVXRpbHNLZXlDb2RlQ29uc3RhbnQuRVFVQUxTLCBVdGlsc0tleUNvZGVDb25zdGFudC5FSUdIVF0uaW5jbHVkZXMoa2V5Q29kZSkgJiYgc2hpZnRLZXkpIHx8IChbVXRpbHNLZXlDb2RlQ29uc3RhbnQuREFTSCwgVXRpbHNLZXlDb2RlQ29uc3RhbnQuU0xBU0hdLmluY2x1ZGVzKGtleUNvZGUpICYmICFzaGlmdEtleSkpICYmIHZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgKGV2ZW50IGFzIElFdmVudCkudGFyZ2V0LnZhbHVlID0gJyc7XG5cbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUV4cHJlc3Npb25zKHsgdHlwZTogJ29wZXJhdGlvbicsIGRhdGE6IHZhbHVlIH0sIHRoaXMuaW5kZXhGb2N1cygpIHx8IHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckV2ZW50S2V5SW5wdXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qga2V5Q29kZSA9IChldmVudCBhcyBJRXZlbnQpLmtleUNvZGU7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQgYXMgSUV2ZW50KS50YXJnZXQudmFsdWU7XG5cbiAgICBpZiAoa2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuQkFDS1NQQUNFKSB7XG4gICAgICBpZiAoIXZhbHVlICYmIHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoICYmICh0aGlzLmluZGV4Rm9jdXMoKSB8fCAwKSA+IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRXhwcmVzc2lvbnModW5kZWZpbmVkLCAodGhpcy5pbmRleEZvY3VzKCkgfHwgMCkgLSAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGtleUNvZGUgPT09IFV0aWxzS2V5Q29kZUNvbnN0YW50LkRFTEVURSkge1xuICAgICAgaWYgKCF2YWx1ZSAmJiB0aGlzLmxpc3RFeHByZXNzaW9ucygpLmxlbmd0aCAmJiAodGhpcy5pbmRleEZvY3VzKCkgfHwgMCkgPCB0aGlzLmxpc3RFeHByZXNzaW9ucygpLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVFeHByZXNzaW9ucyh1bmRlZmluZWQsIHRoaXMuaW5kZXhGb2N1cygpIHx8IDAsIHRydWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuRU5URVIpIHtcbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAoZXZlbnQgYXMgSUV2ZW50KS50YXJnZXQudmFsdWUgPSAnJztcblxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVFeHByZXNzaW9ucyh7IHR5cGU6ICd2YWx1ZScsIGRhdGE6IHZhbHVlIH0sIHRoaXMuaW5kZXhGb2N1cygpIHx8IHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckZvY3VzQW5kQmx1cklucHV0KGluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIGluZGV4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5pbmRleEZvY3VzLnNldChpbmRleCk7XG4gICAgICB0aGlzLmlzRm9jdXMuc2V0KHRydWUpO1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZU91dCgpKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRpbWVPdXQuc2V0KFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNGb2N1cy5zZXQoZmFsc2UpO1xuICAgICAgfSwgMjUwKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrSW5wdXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLmlzRm9jdXMoKSkge1xuICAgICAgdGhpcy5pbnB1dFJlZigpW3RoaXMuaW5wdXRSZWYoKS5sZW5ndGggLSAxXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJTYXZlKGV2ZW50OiBFdmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuaXNDaGFuZ2VFeHByZXNzaW9uLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdXRDaGFuZ2VFeHByZXNzaW9ucy5lbWl0KGNsb25lRGVlcCh0aGlzLmxpc3RFeHByZXNzaW9ucygpKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNlbGVjdGVkRmllbGQoZXZlbnQ6IElMaXN0RGF0YUVtaXRNdWx0aUtleSB8IHVuZGVmaW5lZCwgaW5kZXg6IG51bWJlcikge1xuICAgIGlmICghZXZlbnQ/LmtleXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLmxpc3RFeHByZXNzaW9ucy51cGRhdGUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcbiAgICAgICAgICBpZiAoaSA9PT0gaW5kZXgpIHtcbiAgICAgICAgICAgIGlmIChpdGVtLmRhdGEgIT09IGV2ZW50LmtleXNbMF0pIHtcbiAgICAgICAgICAgICAgdGhpcy50b29sdGlwRnVuY3Rpb25Db250cm9sKCkuZ2V0KGluZGV4KT8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0uZGF0YSA9IGV2ZW50LmtleXNbMF0gYXMgc3RyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi52YWx1ZV07XG4gICAgICB9KTtcbiAgICAgIHRoaXMuaXNDaGFuZ2VFeHByZXNzaW9uLnNldCh0cnVlKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUV4cHJlc3Npb25zKHsgdHlwZTogJ2ZpZWxkJywgZGF0YTogZXZlbnQua2V5c1swXSBhcyBzdHJpbmcgfSwgdHlwZW9mIHRoaXMuaW5kZXhGb2N1cygpICE9PSAndW5kZWZpbmVkJyA/IHRoaXMuaW5kZXhGb2N1cygpIHx8IDAgOiB0aGlzLmxpc3RFeHByZXNzaW9ucygpLmxlbmd0aCk7XG4gICAgdGhpcy50b29sdGlwRnVuY3Rpb25Db250cm9sKCkuZ2V0KGluZGV4KT8ucmVtb3ZlUG9wb3Zlck92ZXJsYXkoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25Db250cm9sQnV0dG9uKGV2ZW50OiBJUG9wb3ZlckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy50b29sdGlwRnVuY3Rpb25Db250cm9sLnVwZGF0ZSgodmFsdWUpID0+IHtcbiAgICAgIHZhbHVlLnNldChpbmRleCwgZXZlbnQpO1xuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlKCkge1xuICAgIHRoaXMuZXJyb3Iuc2V0KHVuZGVmaW5lZCk7XG4gICAgaWYgKCF0aGlzLnZhbGlkUmVxdWlyZWQoKSB8fCAhdGhpcy52YWxpZFJlcXVpcmVkKCk/Lm1lc3NhZ2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoKSB7XG4gICAgICB0aGlzLmVycm9yLnNldCh7IG1lc3NhZ2U6IHRoaXMudmFsaWRSZXF1aXJlZCgpPy5tZXNzYWdlIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmxpc3RFeHByZXNzaW9ucygpLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICA8ZGl2IGNsYXNzPVwicC1bOHB4XSByb3VuZGVkLVsxMnB4XSBiZy1bI2Y4ZjlmYV0ge3sgY2xhc3NJbmNsdWRlKCkgfX1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItWzhweF0ge3sgY2xhc3NDb250YWluZXJJbnB1dCgpIH19XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNjYWxjdWxhdG9ySW5wdXRcbiAgICAgICAgY2xhc3M9XCJweS1bMTBweF0gcHgtWzEycHhdIGxpYnMtdWktZm9udC1oNXIgcm91bmRlZC1bOHB4XSBiZy1bI2ZmZmZmZl0gbWluLWgtWzE2MHB4XSBoLWZ1bGwgYm9yZGVyLVsxcHhdIHt7IGVycm9yKCk/Lm1lc3NhZ2UgPyAnbGlicy11aS1ib3JkZXItZXJyb3ItZ2VuZXJhbCcgOiBpc0ZvY3VzKCkgPyAnYm9yZGVyLVt2YXIoLS1saWJzLXVpLWNvbG9yLWxpZ2h0LTEpXScgOiAnYm9yZGVyLVsjZmZmZmZmXScgfX1cIlxuICAgICAgICAobW91c2V1cCk9XCJoYW5kbGVyQ2xpY2tJbnB1dCgkZXZlbnQpXCI+XG4gICAgICAgIDx1bCBjbGFzcz1cImJlZm9yZTpjb250ZW50LVsnJ10gYmVmb3JlOnRhYmxlIGFmdGVyOmNvbnRlbnQtWycnXSBhZnRlcjp0YWJsZSBhZnRlcjpjbGVhci1ib3RoXCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBsaXN0RXhwcmVzc2lvbnMoKTsgdHJhY2sgJGluZGV4OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgPGxpIGNsYXNzPVwiZmxvYXQtbGVmdCBtYi1bOHB4XVwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAjaW5wdXRSZWZcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtYmxvY2sgaC1bMjRweF0gb3V0bGluZS1ub25lIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWwtWy04cHhdXT1cImkgPT09IDBcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJpbnB1dFJlZi52YWx1ZSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNDYWxjdWxhdG9yR2V0V2lkdGhJbnB1dFBpcGU6IGNhbGN1bGF0b3JJbnB1dFwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlckV2ZW50S2V5SW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cImhhbmRsZXJFdmVudEtleVVwSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImhhbmRsZXJGb2N1c0FuZEJsdXJJbnB1dChpKVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlckZvY3VzQW5kQmx1cklucHV0KHVuZGVmaW5lZClcIiAvPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIEBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICBAY2FzZSAoJ29wZXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJmbG9hdC1sZWZ0IG1iLVs4cHhdIHRleHQtY2VudGVyIHctWzI0cHhdIGgtWzI0cHhdIHJvdW5kZWQtWzRweF0gcC1bNHB4XSBiZy1bdmFyKC0tbGlicy11aS1jb2xvci1saWdodC0yKV1cIj5cbiAgICAgICAgICAgICAgICAgIEBzd2l0Y2ggKGl0ZW0uZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tZGl2aWRlIHRleHQtWzE2cHhdIGJlZm9yZTohdGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kZWZhdWx0KV1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCctJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLW1pbnVzIHRleHQtWzE2cHhdIGJlZm9yZTohdGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kZWZhdWx0KV1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCcrJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWFkZCB0ZXh0LVsxNnB4XSBiZWZvcmU6IXRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jbG9zZSB0ZXh0LVsxNnB4XSBiZWZvcmU6IXRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAY2FzZSAoJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZsb2F0LWxlZnQgbWItWzhweF0gdGV4dC1jZW50ZXIgcm91bmRlZC1bNHB4XSBoLVsyNHB4XSBweC1bOHB4XSBiZy1bI0U2RTdFQV0gZmxleCBpdGVtcy1jZW50ZXIgbWF4LXctW2NhbGMoMTAwJS04cHgpXVwiPlxuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiPnt7IGl0ZW0uZGF0YSB9fTwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAY2FzZSAoJ2ZpZWxkJykge1xuICAgICAgICAgICAgICAgIEBpZiAoeyBmaWVsZFNlbGVjdGVkOiBpdGVtLmRhdGEgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzQ2FsY3VsYXRvckdldEZpZWxkU2VsZWN0ZWRQaXBlOiBjb25maWdGaWVsZCgpPy5nZXRGaWVsZFNlbGVjdGVkIH07IGFzIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZsb2F0LWxlZnQgbWItWzhweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF4LXctWzE3MnB4XSBibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImRhdGEuZmllbGRTZWxlY3RlZD8ubmFtZSB8fCAnaTE4bl9maWVsZF9lcnJvcidcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFqdXN0aWZ5LWNlbnRlciAhcHktWzJweF0gIXB4LVs3cHhdICF3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJkYXRhLmZpZWxkU2VsZWN0ZWQ/Lmljb24gfHwgJ2xpYnMtdWktaWNvbi10b29sdGlwLW91dGxpbmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZGF0YS5maWVsZFNlbGVjdGVkID8gJ2J1dHRvbi1wcmltYXJ5JyA6ICdidXR0b24tZGFuZ2VyLWhpZ2gnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnY2xpY2stdG9nZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiB6SW5kZXgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJvcmRlcldpZHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IDIwNDgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDQ4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25EaXN0YW5jZTogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGxpc3RWaWV3UmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQ29udGV4dDogeyBpbmRleDogaSwga2V5OiBpdGVtLmRhdGEgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTogJyFyb3VuZGVkLVs0cHhdICF3LVsyNzJweF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogeyBtb2RlOiAnc3RhcnQnLCBkaXN0YW5jZTogMCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sQnV0dG9uKCRldmVudCwgaSlcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgPGxpIGNsYXNzPVwiZmxvYXQtbGVmdCBtYi1bOHB4XSBtYXgtdy1bMTAwJV1cIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAjaW5wdXRSZWZcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImlubGluZS1ibG9jayBoLVsyNHB4XSBvdXRsaW5lLW5vbmUgbWF4LXctWzEwMCVdIHt7IGxpc3RFeHByZXNzaW9ucygpLmxlbmd0aCA/ICd0ZXh0LWNlbnRlcicgOiAnJyB9fVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJsaXN0RXhwcmVzc2lvbnMoKS5sZW5ndGggPyAoaW5wdXRSZWYudmFsdWUgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzQ2FsY3VsYXRvckdldFdpZHRoSW5wdXRQaXBlOiBjYWxjdWxhdG9ySW5wdXQpIDogMTUwXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIiFsaXN0RXhwcmVzc2lvbnMoKS5sZW5ndGggPyAocGxhY2Vob2xkZXIoKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZXJFdmVudEtleUlucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXApPVwiaGFuZGxlckV2ZW50S2V5VXBJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cImhhbmRsZXJGb2N1c0FuZEJsdXJJbnB1dChsaXN0RXhwcmVzc2lvbnMoKS5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlckZvY3VzQW5kQmx1cklucHV0KHVuZGVmaW5lZClcIiAvPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAoZXJyb3IoKT8ubWVzc2FnZSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10ZXh0LWVycm9yIG10LVs4cHhdIGxpYnMtdWktZm9udC1oN3JcIj5cbiAgICAgICAgICBAbGV0IGNvbnN0SHRtbE1lc3NhZ2UgPSBlcnJvcigpPy5tZXNzYWdlIHx8ICcgJztcbiAgICAgICAgICB7eyBjb25zdEh0bWxNZXNzYWdlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy00IGdhcC1bOHB4XSB7eyBjbGFzc0NvbnRhaW5lckJ1dHRvbigpIH19XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsxLzRdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnRmllbGQoKT8ubGFiZWwgfHwgJ2kxOG5fc2VsZWN0X2ZpZWxkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbcG9wb3Zlcl09XCJ7XG4gICAgICAgICAgICBtb2RlOiAnY2xpY2stdG9nZ2xlJyxcbiAgICAgICAgICAgIGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmU6IHRydWUsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgekluZGV4OiB6SW5kZXgoKSxcbiAgICAgICAgICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7fSxcbiAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFyZW50Qm9yZGVyV2lkdGg6IDAsXG4gICAgICAgICAgICAgIG1heEhlaWdodDogMjA0OCxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IDIwNDgsXG4gICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2JvdHRvbScsXG4gICAgICAgICAgICAgIGRpcmVjdGlvbkRpc3RhbmNlOiAyLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZTogbGlzdFZpZXdSZWYsXG4gICAgICAgICAgICAgIGl0ZW1Db250ZXh0OiB7IGluZGV4OiAtMSB9LFxuICAgICAgICAgICAgICB3aGl0ZVRoZW1lOiB0cnVlLFxuICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOiAnIXJvdW5kZWQtWzRweF0gIXctWzI3MnB4XScsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7IG1vZGU6ICdzdGFydCcsIGRpc3RhbmNlOiAwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xCdXR0b24oJGV2ZW50LCAtMSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVs0LzRdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXZpb2xldCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIidGeCdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsxXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1kYW5nZXItaGlnaCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIidDJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICdjJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsyXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIicoJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICcoJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVszXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIicpJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICcpJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVs0XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1zZWNvbmRhcnknXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZGl2aWRlJ1wiXG4gICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJy8nKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzFdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJzEnXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJzEnKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzJdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJzInXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJzInKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzNdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJzMnXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJzMnKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzRdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXNlY29uZGFyeSdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNsb3NlJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICcqJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsxXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIic0J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICc0JylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsyXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIic1J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICc1JylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVszXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIic2J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICc2JylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVs0XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1zZWNvbmRhcnknXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tbWludXMnXCJcbiAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnLScpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1bMV1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtsYWJlbF09XCInNydcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnNycpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1bMl1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtsYWJlbF09XCInOCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnOCcpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1bM11cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtsYWJlbF09XCInOSdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnOScpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1bNF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tYWRkJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICcrJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsxLzRdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiJzAnXCJcbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJzAnKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzQvNF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtsYWJlbF09XCInLidcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnLicpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgQGlmICghaWdub3JlQnV0dG9uU2F2ZSgpKSB7XG4gICAgPGRpdiBjbGFzcz1cIm10LVsxNnB4XVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICBbbGFiZWxdPVwibGFiZWxCdXR0b25TYXZlKClcIlxuICAgICAgICBbZGlzYWJsZV09XCIhaXNDaGFuZ2VFeHByZXNzaW9uKClcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidqdXN0aWZ5LWNlbnRlciB3LWZ1bGwnXCJcbiAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTYXZlKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICNsaXN0Vmlld1JlZlxuICBsZXQtZGF0YT1cIml0ZW1Db250ZXh0XCI+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdFxuICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgIFtjb25maWddPVwiY29uZmlnRmllbGQoKT8ubGlzdENvbmZpZ1wiXG4gICAgW21heEl0ZW1TaG93XT1cIjZcIlxuICAgIFtjbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgIFtzZWFyY2hDb25maWddPVwieyBub0JvcmRlcjogdHJ1ZSwgcGxhY2Vob2xkZXI6IGNvbmZpZ0ZpZWxkKCk/LnBsYWNlaG9sZGVySW5wdXRMaXN0IHx8ICdpMThuX3NlYXJjaCcgfVwiXG4gICAgW211bHRpS2V5U2VsZWN0ZWRdPVwiZGF0YS5rZXkgPyBbZGF0YS5rZXldIDogW11cIlxuICAgIChvdXRTZWxlY3RNdWx0aUtleSk9XCJoYW5kbGVyU2VsZWN0ZWRGaWVsZCgkZXZlbnQsIGRhdGEuaW5kZXgpXCI+PC9saWJzX3VpLWNvbXBvbmVudHMtbGlzdD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsY3VsYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL2NhbGN1bGF0b3Ivc3JjL2NhbGN1bGF0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9jYWxjdWxhdG9yL3NyYy9jYWxjdWxhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVILE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVGLE9BQU8sRUFBeUIsNkJBQTZCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRyxPQUFPLEVBQWdDLGdDQUFnQyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFN0csT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsb0RBQW9ELEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RyxPQUFPLEVBQUUsaURBQWlELEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7O0FBRWpHOzs7R0FHRztBQVNILE1BQU0sT0FBTyx5Q0FBeUM7SUFDMUMsVUFBVSxHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7SUFDbkQsT0FBTyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNqQyxlQUFlLEdBQUcsTUFBTSxDQUFvQyxFQUFFLENBQUMsQ0FBQztJQUNoRSxrQkFBa0IsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUM7SUFDNUMsS0FB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Q0FBQyxNQUFNLENBQUM7SUFDekMsQ0FBQzt3R0FoTlUseUNBQXlDOzRGQUF6Qyx5Q0FBeUMsc3VEQ3ZCdEQsMm1aQW9TQSwyQ0RoUlksZUFBZSw0RkFBRSxzQ0FBc0Msc2pCQUFFLDZCQUE2QixzaENBQUUsb0RBQW9ELDZGQUFFLGdDQUFnQywrZkFBRSxpREFBaUQ7OzRGQUdoTyx5Q0FBeUM7a0JBUnJELFNBQVM7K0JBRUUsc0NBQXNDLGNBRXBDLElBQUksV0FDUCxDQUFDLGVBQWUsRUFBRSxzQ0FBc0MsRUFBRSw2QkFBNkIsRUFBRSxvREFBb0QsRUFBRSxnQ0FBZ0MsRUFBRSxpREFBaUQsQ0FBQyxtQkFDM04sdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGlucHV0LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJTGlzdERhdGFFbWl0TXVsdGlLZXksIExpYnNVaUNvbXBvbmVudHNMaXN0Q29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIExpYnNVaUNvbXBvbmVudHNQb3BvdmVyQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1wb3BvdmVyJztcbmltcG9ydCB7IElFdmVudCB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBVdGlsc0tleUNvZGVDb25zdGFudCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgSUlucHV0Q2FsY3VsYXRvckNvbmZpZ0ZpZWxkLCBJSW5wdXRDYWxjdWxhdG9yRXhwcmVzc2lvbiwgSUlucHV0Q2FsY3VsYXRvckZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJSW5wdXRDYWxjdWxhdG9yVmFsaWQgfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c0NhbGN1bGF0b3JHZXRGaWVsZFNlbGVjdGVkUGlwZSB9IGZyb20gJy4vcGlwZXMvZ2V0LWZpZWxkLXNlbGVjdGVkLnBpcGUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c0NhbGN1bGF0b3JHZXRXaWR0aElucHV0UGlwZSB9IGZyb20gJy4vcGlwZXMvZ2V0LXdpZHRoLWlucHV0LnBpcGUnO1xuXG4vKipcbiAqIENvbXBvbmVudCBDYWxjdWxhdG9yIG7Dom5nIGNhbyBo4buXIHRy4bujIG5o4bqtcCBsaeG7h3UgYmnhu4N1IHRo4bupYyB0b8OhbiBo4buNYy5cbiAqIEvhur90IGjhu6NwIGdp4buvYSBjw6FjIHRyxrDhu51uZyBk4buvIGxp4buHdSDEkeG7mW5nIChmaWVsZHMpLCBnacOhIHRy4buLIHTEqW5oIHbDoCB0b8OhbiB04butLlxuICovXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLWNhbGN1bGF0b3InLFxuICB0ZW1wbGF0ZVVybDogJy4vY2FsY3VsYXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtUcmFuc2xhdGVNb2R1bGUsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzTGlzdENvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0lucHV0c0NhbGN1bGF0b3JHZXRGaWVsZFNlbGVjdGVkUGlwZSwgTGlic1VpQ29tcG9uZW50c1BvcG92ZXJDb21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNJbnB1dHNDYWxjdWxhdG9yR2V0V2lkdGhJbnB1dFBpcGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c0NhbGN1bGF0b3JDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcm90ZWN0ZWQgaW5kZXhGb2N1cyA9IHNpZ25hbDxudW1iZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBpc0ZvY3VzID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJvdGVjdGVkIGxpc3RFeHByZXNzaW9ucyA9IHNpZ25hbDxBcnJheTxJSW5wdXRDYWxjdWxhdG9yRXhwcmVzc2lvbj4+KFtdKTtcbiAgcHJvdGVjdGVkIGlzQ2hhbmdlRXhwcmVzc2lvbiA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG4gIHByb3RlY3RlZCBlcnJvciA9IHNpZ25hbDxJSW5wdXRDYWxjdWxhdG9yVmFsaWQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpbnB1dFJlZiA9IHZpZXdDaGlsZHJlbjxFbGVtZW50UmVmPignaW5wdXRSZWYnKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0aW1lT3V0ID0gc2lnbmFsPG51bWJlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSByZWFkb25seSB0b29sdGlwRnVuY3Rpb25Db250cm9sID0gc2lnbmFsPE1hcDxudW1iZXIsIElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQ+PihuZXcgTWFwKCkpO1xuXG4gIHJlYWRvbmx5IGV4cHJlc3Npb25zID0gaW5wdXQ8QXJyYXk8SUlucHV0Q2FsY3VsYXRvckV4cHJlc3Npb24+PihbXSk7XG4gIHJlYWRvbmx5IHpJbmRleCA9IGlucHV0PG51bWJlcj4oMTApO1xuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJ2kxOG5fZW50ZXJfcGFyYW1zJyk7XG4gIHJlYWRvbmx5IGxhYmVsQnV0dG9uU2F2ZSA9IGlucHV0PHN0cmluZz4oJ2kxOG5fc2F2ZV9jYWxjdWxhdGlvbicpO1xuICByZWFkb25seSBjb25maWdGaWVsZCA9IGlucHV0PElJbnB1dENhbGN1bGF0b3JDb25maWdGaWVsZD4oKTtcbiAgcmVhZG9ubHkgaWdub3JlQnV0dG9uU2F2ZSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgY2xhc3NJbmNsdWRlID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCAnJyB9KTtcbiAgcmVhZG9ubHkgY2xhc3NDb250YWluZXJJbnB1dCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywgeyB0cmFuc2Zvcm06ICh2YWx1ZSkgPT4gdmFsdWUgfHwgJycgfSk7XG4gIHJlYWRvbmx5IGNsYXNzQ29udGFpbmVyQnV0dG9uID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7IHRyYW5zZm9ybTogKHZhbHVlKSA9PiB2YWx1ZSB8fCAnJyB9KTtcbiAgcmVhZG9ubHkgdmFsaWRSZXF1aXJlZCA9IGlucHV0PElJbnB1dENhbGN1bGF0b3JWYWxpZD4oKTtcblxuICByZWFkb25seSBvdXRDaGFuZ2VFeHByZXNzaW9ucyA9IG91dHB1dDxBcnJheTxJSW5wdXRDYWxjdWxhdG9yRXhwcmVzc2lvbj4+KCk7XG4gIHJlYWRvbmx5IG91dEZ1bmN0aW9uQ29udHJvbCA9IG91dHB1dDxJSW5wdXRDYWxjdWxhdG9yRnVuY3Rpb25Db250cm9sRXZlbnQ+KCk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5saXN0RXhwcmVzc2lvbnMuc2V0KGNsb25lRGVlcCh0aGlzLmV4cHJlc3Npb25zKCkpKTtcbiAgICB0aGlzLm91dEZ1bmN0aW9uQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogSUlucHV0Q2FsY3VsYXRvckZ1bmN0aW9uQ29udHJvbEV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2hlY2tJc1ZhbGlkOiB0aGlzLnZhbGlkYXRlLmJpbmQodGhpcyksXG4gICAgICBnZXREYXRhOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBjbG9uZURlZXAodGhpcy5saXN0RXhwcmVzc2lvbnMoKSk7XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNsaWNrKGV2ZW50OiBFdmVudCwgYnV0dG9uOiAnKycgfCAnLScgfCAnKicgfCAnLycgfCAnYycgfCAnLicgfCAnKCcgfCAnKScgfCAnMCcgfCAnMScgfCAnMicgfCAnMycgfCAnNCcgfCAnNScgfCAnNicgfCAnNycgfCAnOCcgfCAnOScpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBjb25zdCBleHByZXNzaW9uOiBJSW5wdXRDYWxjdWxhdG9yRXhwcmVzc2lvbiA9IHsgdHlwZTogJ2ZpZWxkJywgZGF0YTogYnV0dG9uIH07XG5cbiAgICBpZiAoYnV0dG9uID09PSAnYycpIHtcbiAgICAgIGlmICghdGhpcy5saXN0RXhwcmVzc2lvbnMoKS5sZW5ndGggfHwgdGhpcy5pbmRleEZvY3VzKCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRXhwcmVzc2lvbnModW5kZWZpbmVkLCB0eXBlb2YgdGhpcy5pbmRleEZvY3VzKCkgIT09ICd1bmRlZmluZWQnID8gKHRoaXMuaW5kZXhGb2N1cygpIHx8IDEpIC0gMSA6IHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIHN3aXRjaCAoYnV0dG9uKSB7XG4gICAgICBjYXNlICcrJzpcbiAgICAgIGNhc2UgJy0nOlxuICAgICAgY2FzZSAnKic6XG4gICAgICBjYXNlICcvJzpcbiAgICAgICAgZXhwcmVzc2lvbi50eXBlID0gJ29wZXJhdGlvbic7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZXhwcmVzc2lvbi50eXBlID0gJ3ZhbHVlJztcbiAgICB9XG4gICAgdGhpcy51cGRhdGVFeHByZXNzaW9ucyhleHByZXNzaW9uLCB0eXBlb2YgdGhpcy5pbmRleEZvY3VzKCkgIT09ICd1bmRlZmluZWQnID8gdGhpcy5pbmRleEZvY3VzKCkgfHwgMCA6IHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRXhwcmVzc2lvbnMoaXRlbTogSUlucHV0Q2FsY3VsYXRvckV4cHJlc3Npb24gfCB1bmRlZmluZWQsIHBvc2l0aW9uOiBudW1iZXIsIGlzRGVsZXRlPzogYm9vbGVhbikge1xuICAgIHRoaXMuaXNDaGFuZ2VFeHByZXNzaW9uLnNldCh0cnVlKTtcbiAgICB0aGlzLmxpc3RFeHByZXNzaW9ucy51cGRhdGUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICB2YWx1ZS5zcGxpY2UocG9zaXRpb24gfHwgMCwgMCwgaXRlbSk7XG4gICAgICB9XG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgdmFsdWUuc3BsaWNlKHBvc2l0aW9uIHx8IDAsIDEpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gWy4uLnZhbHVlXTtcbiAgICB9KTtcblxuICAgIHRoaXMuaW5kZXhGb2N1cy51cGRhdGUoKHZhbHVlKSA9PiB7XG4gICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgdmFsdWUgPSBpc0RlbGV0ZSA/IHZhbHVlIDogdmFsdWUgLSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlIHx8IHBvc2l0aW9uO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmxpc3RFeHByZXNzaW9ucygpLmxlbmd0aDtcblxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICB2YWx1ZSsrO1xuXG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSk7XG4gICAgY29uc3QgaW5kZXhGb2N1cyA9IHRoaXMuaW5kZXhGb2N1cygpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGluZGV4Rm9jdXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMuaW5wdXRSZWYoKVtpbmRleEZvY3VzXT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH0sIDEwMCk7XG4gICAgdGhpcy52YWxpZGF0ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJFdmVudEtleVVwSW5wdXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3Qga2V5Q29kZSA9IChldmVudCBhcyBJRXZlbnQpLmtleUNvZGU7XG4gICAgY29uc3QgdmFsdWUgPSAoZXZlbnQgYXMgSUV2ZW50KS50YXJnZXQudmFsdWU7XG4gICAgY29uc3Qgc2hpZnRLZXkgPSAoZXZlbnQgYXMgSUV2ZW50KS5zaGlmdEtleTtcblxuICAgIGlmICgoKFtVdGlsc0tleUNvZGVDb25zdGFudC5FUVVBTFMsIFV0aWxzS2V5Q29kZUNvbnN0YW50LkVJR0hUXS5pbmNsdWRlcyhrZXlDb2RlKSAmJiBzaGlmdEtleSkgfHwgKFtVdGlsc0tleUNvZGVDb25zdGFudC5EQVNILCBVdGlsc0tleUNvZGVDb25zdGFudC5TTEFTSF0uaW5jbHVkZXMoa2V5Q29kZSkgJiYgIXNoaWZ0S2V5KSkgJiYgdmFsdWUubGVuZ3RoID09PSAxKSB7XG4gICAgICAoZXZlbnQgYXMgSUV2ZW50KS50YXJnZXQudmFsdWUgPSAnJztcblxuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlRXhwcmVzc2lvbnMoeyB0eXBlOiAnb3BlcmF0aW9uJywgZGF0YTogdmFsdWUgfSwgdGhpcy5pbmRleEZvY3VzKCkgfHwgdGhpcy5saXN0RXhwcmVzc2lvbnMoKS5sZW5ndGgpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRXZlbnRLZXlJbnB1dChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCBrZXlDb2RlID0gKGV2ZW50IGFzIElFdmVudCkua2V5Q29kZTtcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudCBhcyBJRXZlbnQpLnRhcmdldC52YWx1ZTtcblxuICAgIGlmIChrZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UpIHtcbiAgICAgIGlmICghdmFsdWUgJiYgdGhpcy5saXN0RXhwcmVzc2lvbnMoKS5sZW5ndGggJiYgKHRoaXMuaW5kZXhGb2N1cygpIHx8IDApID4gMCkge1xuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVFeHByZXNzaW9ucyh1bmRlZmluZWQsICh0aGlzLmluZGV4Rm9jdXMoKSB8fCAwKSAtIDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5Q29kZSA9PT0gVXRpbHNLZXlDb2RlQ29uc3RhbnQuREVMRVRFKSB7XG4gICAgICBpZiAoIXZhbHVlICYmIHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoICYmICh0aGlzLmluZGV4Rm9jdXMoKSB8fCAwKSA8IHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUV4cHJlc3Npb25zKHVuZGVmaW5lZCwgdGhpcy5pbmRleEZvY3VzKCkgfHwgMCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrZXlDb2RlID09PSBVdGlsc0tleUNvZGVDb25zdGFudC5FTlRFUikge1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIChldmVudCBhcyBJRXZlbnQpLnRhcmdldC52YWx1ZSA9ICcnO1xuXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUV4cHJlc3Npb25zKHsgdHlwZTogJ3ZhbHVlJywgZGF0YTogdmFsdWUgfSwgdGhpcy5pbmRleEZvY3VzKCkgfHwgdGhpcy5saXN0RXhwcmVzc2lvbnMoKS5sZW5ndGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRm9jdXNBbmRCbHVySW5wdXQoaW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgaW5kZXggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLmluZGV4Rm9jdXMuc2V0KGluZGV4KTtcbiAgICAgIHRoaXMuaXNGb2N1cy5zZXQodHJ1ZSk7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lT3V0KCkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGltZU91dC5zZXQoXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0ZvY3VzLnNldChmYWxzZSk7XG4gICAgICB9LCAyNTApXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyQ2xpY2tJbnB1dChldmVudDogRXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAoIXRoaXMuaXNGb2N1cygpKSB7XG4gICAgICB0aGlzLmlucHV0UmVmKClbdGhpcy5pbnB1dFJlZigpLmxlbmd0aCAtIDFdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgaGFuZGxlclNhdmUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5pc0NoYW5nZUV4cHJlc3Npb24uc2V0KGZhbHNlKTtcbiAgICB0aGlzLm91dENoYW5nZUV4cHJlc3Npb25zLmVtaXQoY2xvbmVEZWVwKHRoaXMubGlzdEV4cHJlc3Npb25zKCkpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyU2VsZWN0ZWRGaWVsZChldmVudDogSUxpc3REYXRhRW1pdE11bHRpS2V5IHwgdW5kZWZpbmVkLCBpbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKCFldmVudD8ua2V5cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgIHRoaXMubGlzdEV4cHJlc3Npb25zLnVwZGF0ZSgodmFsdWUpID0+IHtcbiAgICAgICAgdmFsdWUuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgIGlmIChpID09PSBpbmRleCkge1xuICAgICAgICAgICAgaWYgKGl0ZW0uZGF0YSAhPT0gZXZlbnQua2V5c1swXSkge1xuICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBGdW5jdGlvbkNvbnRyb2woKS5nZXQoaW5kZXgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5kYXRhID0gZXZlbnQua2V5c1swXSBhcyBzdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gWy4uLnZhbHVlXTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5pc0NoYW5nZUV4cHJlc3Npb24uc2V0KHRydWUpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXBkYXRlRXhwcmVzc2lvbnMoeyB0eXBlOiAnZmllbGQnLCBkYXRhOiBldmVudC5rZXlzWzBdIGFzIHN0cmluZyB9LCB0eXBlb2YgdGhpcy5pbmRleEZvY3VzKCkgIT09ICd1bmRlZmluZWQnID8gdGhpcy5pbmRleEZvY3VzKCkgfHwgMCA6IHRoaXMubGlzdEV4cHJlc3Npb25zKCkubGVuZ3RoKTtcbiAgICB0aGlzLnRvb2x0aXBGdW5jdGlvbkNvbnRyb2woKS5nZXQoaW5kZXgpPy5yZW1vdmVQb3BvdmVyT3ZlcmxheSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJGdW5jdGlvbkNvbnRyb2xCdXR0b24oZXZlbnQ6IElQb3BvdmVyRnVuY3Rpb25Db250cm9sRXZlbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnRvb2x0aXBGdW5jdGlvbkNvbnRyb2wudXBkYXRlKCh2YWx1ZSkgPT4ge1xuICAgICAgdmFsdWUuc2V0KGluZGV4LCBldmVudCk7XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdmFsaWRhdGUoKSB7XG4gICAgdGhpcy5lcnJvci5zZXQodW5kZWZpbmVkKTtcbiAgICBpZiAoIXRoaXMudmFsaWRSZXF1aXJlZCgpPy5tZXNzYWdlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmxpc3RFeHByZXNzaW9ucygpLmxlbmd0aCkge1xuICAgICAgdGhpcy5lcnJvci5zZXQoeyBtZXNzYWdlOiB0aGlzLnZhbGlkUmVxdWlyZWQoKT8ubWVzc2FnZSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gISF0aGlzLmxpc3RFeHByZXNzaW9ucygpLmxlbmd0aDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInctZnVsbFwiPlxuICA8ZGl2IGNsYXNzPVwicC1bOHB4XSByb3VuZGVkLVsxMnB4XSBiZy1bI2Y4ZjlmYV0ge3sgY2xhc3NJbmNsdWRlKCkgfX1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItWzhweF0ge3sgY2xhc3NDb250YWluZXJJbnB1dCgpIH19XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICNjYWxjdWxhdG9ySW5wdXRcbiAgICAgICAgY2xhc3M9XCJweS1bMTBweF0gcHgtWzEycHhdIGxpYnMtdWktZm9udC1oNXIgcm91bmRlZC1bOHB4XSBiZy1bI2ZmZmZmZl0gbWluLWgtWzE2MHB4XSBoLWZ1bGwgYm9yZGVyLVsxcHhdIHt7IGVycm9yKCk/Lm1lc3NhZ2UgPyAnbGlicy11aS1ib3JkZXItZXJyb3ItZ2VuZXJhbCcgOiBpc0ZvY3VzKCkgPyAnYm9yZGVyLVt2YXIoLS1saWJzLXVpLWNvbG9yLWxpZ2h0LTEpXScgOiAnYm9yZGVyLVsjZmZmZmZmXScgfX1cIlxuICAgICAgICAobW91c2V1cCk9XCJoYW5kbGVyQ2xpY2tJbnB1dCgkZXZlbnQpXCI+XG4gICAgICAgIDx1bCBjbGFzcz1cImJlZm9yZTpjb250ZW50LVsnJ10gYmVmb3JlOnRhYmxlIGFmdGVyOmNvbnRlbnQtWycnXSBhZnRlcjp0YWJsZSBhZnRlcjpjbGVhci1ib3RoXCI+XG4gICAgICAgICAgQGZvciAoaXRlbSBvZiBsaXN0RXhwcmVzc2lvbnMoKTsgdHJhY2sgJGluZGV4OyBsZXQgaSA9ICRpbmRleCkge1xuICAgICAgICAgICAgPGxpIGNsYXNzPVwiZmxvYXQtbGVmdCBtYi1bOHB4XVwiPlxuICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAjaW5wdXRSZWZcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJpbmxpbmUtYmxvY2sgaC1bMjRweF0gb3V0bGluZS1ub25lIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MubWwtWy04cHhdXT1cImkgPT09IDBcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJpbnB1dFJlZi52YWx1ZSB8IExpYnNVaUNvbXBvbmVudHNJbnB1dHNDYWxjdWxhdG9yR2V0V2lkdGhJbnB1dFBpcGU6IGNhbGN1bGF0b3JJbnB1dFwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiaGFuZGxlckV2ZW50S2V5SW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGtleXVwKT1cImhhbmRsZXJFdmVudEtleVVwSW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzKT1cImhhbmRsZXJGb2N1c0FuZEJsdXJJbnB1dChpKVwiXG4gICAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlckZvY3VzQW5kQmx1cklucHV0KHVuZGVmaW5lZClcIiAvPlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIEBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICBAY2FzZSAoJ29wZXJhdGlvbicpIHtcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJmbG9hdC1sZWZ0IG1iLVs4cHhdIHRleHQtY2VudGVyIHctWzI0cHhdIGgtWzI0cHhdIHJvdW5kZWQtWzRweF0gcC1bNHB4XSBiZy1bdmFyKC0tbGlicy11aS1jb2xvci1saWdodC0yKV1cIj5cbiAgICAgICAgICAgICAgICAgIEBzd2l0Y2ggKGl0ZW0uZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoJy8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJsaWJzLXVpLWljb24tZGl2aWRlIHRleHQtWzE2cHhdIGJlZm9yZTohdGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kZWZhdWx0KV1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCctJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLW1pbnVzIHRleHQtWzE2cHhdIGJlZm9yZTohdGV4dC1bdmFyKC0tbGlicy11aS1jb2xvci1kZWZhdWx0KV1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKCcrJykge1xuICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwibGlicy11aS1pY29uLWFkZCB0ZXh0LVsxNnB4XSBiZWZvcmU6IXRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlICgnKicpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImxpYnMtdWktaWNvbi1jbG9zZSB0ZXh0LVsxNnB4XSBiZWZvcmU6IXRleHQtW3ZhcigtLWxpYnMtdWktY29sb3ItZGVmYXVsdCldXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAY2FzZSAoJ3ZhbHVlJykge1xuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZsb2F0LWxlZnQgbWItWzhweF0gdGV4dC1jZW50ZXIgcm91bmRlZC1bNHB4XSBoLVsyNHB4XSBweC1bOHB4XSBiZy1bI0U2RTdFQV0gZmxleCBpdGVtcy1jZW50ZXIgbWF4LXctW2NhbGMoMTAwJS04cHgpXVwiPlxuICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1wb3BvdmVyIFt0eXBlXT1cIid0ZXh0J1wiPnt7IGl0ZW0uZGF0YSB9fTwvbGlic191aS1jb21wb25lbnRzLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAY2FzZSAoJ2ZpZWxkJykge1xuICAgICAgICAgICAgICAgIEBpZiAoeyBmaWVsZFNlbGVjdGVkOiBpdGVtLmRhdGEgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzQ2FsY3VsYXRvckdldEZpZWxkU2VsZWN0ZWRQaXBlOiBjb25maWdGaWVsZCgpPy5nZXRGaWVsZFNlbGVjdGVkIH07IGFzIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImZsb2F0LWxlZnQgbWItWzhweF1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF4LXctWzE3MnB4XSBibG9ja1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImRhdGEuZmllbGRTZWxlY3RlZD8ubmFtZSB8fCAnaTE4bl9maWVsZF9lcnJvcidcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFqdXN0aWZ5LWNlbnRlciAhcHktWzJweF0gIXB4LVs3cHhdICF3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJkYXRhLmZpZWxkU2VsZWN0ZWQ/Lmljb24gfHwgJ2xpYnMtdWktaWNvbi10b29sdGlwLW91dGxpbmUnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiJ2xpYnMtdWktaWNvbi1tb3ZlLXJpZ2h0IHJvdGF0ZS05MCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW3pJbmRleF09XCJ6SW5kZXgoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiZGF0YS5maWVsZFNlbGVjdGVkID8gJ2J1dHRvbi1wcmltYXJ5JyA6ICdidXR0b24tZGFuZ2VyLWhpZ2gnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiAnY2xpY2stdG9nZ2xlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgekluZGV4OiB6SW5kZXgoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEJvcmRlcldpZHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IDIwNDgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAyMDQ4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246ICdib3R0b20nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb25EaXN0YW5jZTogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGxpc3RWaWV3UmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtQ29udGV4dDogeyBpbmRleDogaSwga2V5OiBpdGVtLmRhdGEgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpdGVUaGVtZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlQXJyb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSW5jbHVkZTogJyFyb3VuZGVkLVs0cHhdICF3LVsyNzJweF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogeyBtb2RlOiAnc3RhcnQnLCBkaXN0YW5jZTogMCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25Db250cm9sQnV0dG9uKCRldmVudCwgaSlcIiAvPlxuICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgPGxpIGNsYXNzPVwiZmxvYXQtbGVmdCBtYi1bOHB4XSBtYXgtdy1bMTAwJV1cIj5cbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAjaW5wdXRSZWZcbiAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImlubGluZS1ibG9jayBoLVsyNHB4XSBvdXRsaW5lLW5vbmUgbWF4LXctWzEwMCVdIHt7IGxpc3RFeHByZXNzaW9ucygpLmxlbmd0aCA/ICd0ZXh0LWNlbnRlcicgOiAnJyB9fVwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJsaXN0RXhwcmVzc2lvbnMoKS5sZW5ndGggPyAoaW5wdXRSZWYudmFsdWUgfCBMaWJzVWlDb21wb25lbnRzSW5wdXRzQ2FsY3VsYXRvckdldFdpZHRoSW5wdXRQaXBlOiBjYWxjdWxhdG9ySW5wdXQpIDogMTUwXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIiFsaXN0RXhwcmVzc2lvbnMoKS5sZW5ndGggPyAocGxhY2Vob2xkZXIoKSB8IHRyYW5zbGF0ZSkgOiAnJ1wiXG4gICAgICAgICAgICAgIChrZXlkb3duKT1cImhhbmRsZXJFdmVudEtleUlucHV0KCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5dXApPVwiaGFuZGxlckV2ZW50S2V5VXBJbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cImhhbmRsZXJGb2N1c0FuZEJsdXJJbnB1dChsaXN0RXhwcmVzc2lvbnMoKS5sZW5ndGgpXCJcbiAgICAgICAgICAgICAgKGJsdXIpPVwiaGFuZGxlckZvY3VzQW5kQmx1cklucHV0KHVuZGVmaW5lZClcIiAvPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvdWw+XG4gICAgICA8L2Rpdj5cbiAgICAgIEBpZiAoZXJyb3IoKT8ubWVzc2FnZSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS10ZXh0LWVycm9yIG10LVs4cHhdIGxpYnMtdWktZm9udC1oN3JcIj5cbiAgICAgICAgICBAbGV0IGNvbnN0SHRtbE1lc3NhZ2UgPSBlcnJvcigpPy5tZXNzYWdlIHx8ICcgJztcbiAgICAgICAgICB7eyBjb25zdEh0bWxNZXNzYWdlIHwgdHJhbnNsYXRlIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy00IGdhcC1bOHB4XSB7eyBjbGFzc0NvbnRhaW5lckJ1dHRvbigpIH19XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsxLzRdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiY29uZmlnRmllbGQoKT8ubGFiZWwgfHwgJ2kxOG5fc2VsZWN0X2ZpZWxkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbcG9wb3Zlcl09XCJ7XG4gICAgICAgICAgICBtb2RlOiAnY2xpY2stdG9nZ2xlJyxcbiAgICAgICAgICAgIGlnbm9yZUhpZGRlblBvcG92ZXJDb250ZW50V2hlbk1vdXNlTGVhdmU6IHRydWUsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgekluZGV4OiB6SW5kZXgoKSxcbiAgICAgICAgICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7fSxcbiAgICAgICAgICAgICAgd2lkdGhCeVBhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFyZW50Qm9yZGVyV2lkdGg6IDAsXG4gICAgICAgICAgICAgIG1heEhlaWdodDogMjA0OCxcbiAgICAgICAgICAgICAgbWF4V2lkdGg6IDIwNDgsXG4gICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2JvdHRvbScsXG4gICAgICAgICAgICAgIGRpcmVjdGlvbkRpc3RhbmNlOiAyLFxuICAgICAgICAgICAgICB0ZW1wbGF0ZTogbGlzdFZpZXdSZWYsXG4gICAgICAgICAgICAgIGl0ZW1Db250ZXh0OiB7IGluZGV4OiAtMSB9LFxuICAgICAgICAgICAgICB3aGl0ZVRoZW1lOiB0cnVlLFxuICAgICAgICAgICAgICBpZ25vcmVBcnJvdzogdHJ1ZSxcbiAgICAgICAgICAgICAgY2xhc3NJbmNsdWRlOiAnIXJvdW5kZWQtWzRweF0gIXctWzI3MnB4XScsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7IG1vZGU6ICdzdGFydCcsIGRpc3RhbmNlOiAwIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cIlxuICAgICAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbkNvbnRyb2xCdXR0b24oJGV2ZW50LCAtMSlcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVs0LzRdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXZpb2xldCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIidGeCdcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsxXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1kYW5nZXItaGlnaCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIidDJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICdjJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsyXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIicoJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICcoJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVszXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIicpJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICcpJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVs0XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1zZWNvbmRhcnknXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tZGl2aWRlJ1wiXG4gICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJy8nKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzFdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJzEnXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJzEnKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzJdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJzInXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJzInKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzNdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJzMnXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJzMnKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzRdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXNlY29uZGFyeSdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNsb3NlJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICcqJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsxXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIic0J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICc0JylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsyXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIic1J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICc1JylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVszXVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi10aGlyZCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyF3LWZ1bGwgIWp1c3RpZnktY2VudGVyJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIic2J1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICc2JylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVs0XVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1zZWNvbmRhcnknXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tbWludXMnXCJcbiAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnLScpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1bMV1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtsYWJlbF09XCInNydcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnNycpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1bMl1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtsYWJlbF09XCInOCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnOCcpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1bM11cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtsYWJlbF09XCInOSdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnOScpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1bNF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICBbaWNvbk9ubHlUeXBlXT1cInRydWVcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tYWRkJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJDbGljaygkZXZlbnQsICcrJylcIiAvPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLVsxLzRdXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbbGFiZWxdPVwiJzAnXCJcbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLXRoaXJkJ1wiXG4gICAgICAgICAgW2NsYXNzSW5jbHVkZV09XCInIXctZnVsbCAhanVzdGlmeS1jZW50ZXInXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudCwgJzAnKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtWzQvNF1cIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tdGhpcmQnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichdy1mdWxsICFqdXN0aWZ5LWNlbnRlcidcIlxuICAgICAgICAgIFtsYWJlbF09XCInLidcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ2xpY2soJGV2ZW50LCAnLicpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgQGlmICghaWdub3JlQnV0dG9uU2F2ZSgpKSB7XG4gICAgPGRpdiBjbGFzcz1cIm10LVsxNnB4XVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICBbbGFiZWxdPVwibGFiZWxCdXR0b25TYXZlKClcIlxuICAgICAgICBbZGlzYWJsZV09XCIhaXNDaGFuZ2VFeHByZXNzaW9uKClcIlxuICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidqdXN0aWZ5LWNlbnRlciB3LWZ1bGwnXCJcbiAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJTYXZlKCRldmVudClcIiAvPlxuICAgIDwvZGl2PlxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlXG4gICNsaXN0Vmlld1JlZlxuICBsZXQtZGF0YT1cIml0ZW1Db250ZXh0XCI+XG4gIDxsaWJzX3VpLWNvbXBvbmVudHMtbGlzdFxuICAgIFt6SW5kZXhdPVwiekluZGV4KClcIlxuICAgIFtjb25maWddPVwiY29uZmlnRmllbGQoKT8ubGlzdENvbmZpZ1wiXG4gICAgW21heEl0ZW1TaG93XT1cIjZcIlxuICAgIFtjbGlja0V4YWN0bHldPVwiZmFsc2VcIlxuICAgIFtzZWFyY2hDb25maWddPVwieyBub0JvcmRlcjogdHJ1ZSwgcGxhY2Vob2xkZXI6IGNvbmZpZ0ZpZWxkKCk/LnBsYWNlaG9sZGVySW5wdXRMaXN0IHx8ICdpMThuX3NlYXJjaCcgfVwiXG4gICAgW211bHRpS2V5U2VsZWN0ZWRdPVwiZGF0YS5rZXkgPyBbZGF0YS5rZXldIDogW11cIlxuICAgIChvdXRTZWxlY3RNdWx0aUtleSk9XCJoYW5kbGVyU2VsZWN0ZWRGaWVsZCgkZXZlbnQsIGRhdGEuaW5kZXgpXCI+PC9saWJzX3VpLWNvbXBvbmVudHMtbGlzdD5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Pipe, signal, viewChildren, input, output,
|
|
2
|
+
import { Pipe, signal, viewChildren, input, output, Component, ChangeDetectionStrategy } from '@angular/core';
|
|
3
3
|
import { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';
|
|
4
4
|
import { LibsUiComponentsListComponent } from '@libs-ui/components-list';
|
|
5
5
|
import { LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';
|
|
@@ -119,7 +119,7 @@ class LibsUiComponentsInputsCalculatorComponent {
|
|
|
119
119
|
if (value) {
|
|
120
120
|
value = isDelete ? value : value - 1;
|
|
121
121
|
}
|
|
122
|
-
return value
|
|
122
|
+
return value || position;
|
|
123
123
|
}
|
|
124
124
|
if (typeof value === 'undefined') {
|
|
125
125
|
value = this.listExpressions().length;
|
|
@@ -217,13 +217,13 @@ class LibsUiComponentsInputsCalculatorComponent {
|
|
|
217
217
|
}
|
|
218
218
|
async validate() {
|
|
219
219
|
this.error.set(undefined);
|
|
220
|
-
if (!this.validRequired()
|
|
220
|
+
if (!this.validRequired()?.message) {
|
|
221
221
|
return true;
|
|
222
222
|
}
|
|
223
223
|
if (!this.listExpressions().length) {
|
|
224
224
|
this.error.set({ message: this.validRequired()?.message });
|
|
225
225
|
}
|
|
226
|
-
return this.listExpressions().length
|
|
226
|
+
return !!this.listExpressions().length;
|
|
227
227
|
}
|
|
228
228
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsCalculatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
229
229
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsCalculatorComponent, isStandalone: true, selector: "libs_ui-components-inputs-calculator", inputs: { expressions: { classPropertyName: "expressions", publicName: "expressions", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, labelButtonSave: { classPropertyName: "labelButtonSave", publicName: "labelButtonSave", isSignal: true, isRequired: false, transformFunction: null }, configField: { classPropertyName: "configField", publicName: "configField", isSignal: true, isRequired: false, transformFunction: null }, ignoreButtonSave: { classPropertyName: "ignoreButtonSave", publicName: "ignoreButtonSave", isSignal: true, isRequired: false, transformFunction: null }, classInclude: { classPropertyName: "classInclude", publicName: "classInclude", isSignal: true, isRequired: false, transformFunction: null }, classContainerInput: { classPropertyName: "classContainerInput", publicName: "classContainerInput", isSignal: true, isRequired: false, transformFunction: null }, classContainerButton: { classPropertyName: "classContainerButton", publicName: "classContainerButton", isSignal: true, isRequired: false, transformFunction: null }, validRequired: { classPropertyName: "validRequired", publicName: "validRequired", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outChangeExpressions: "outChangeExpressions", outFunctionControl: "outFunctionControl" }, viewQueries: [{ propertyName: "inputRef", predicate: ["inputRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"w-full\">\n <div class=\"p-[8px] rounded-[12px] bg-[#f8f9fa] {{ classInclude() }}\">\n <div class=\"mb-[8px] {{ classContainerInput() }}\">\n <div\n #calculatorInput\n class=\"py-[10px] px-[12px] libs-ui-font-h5r rounded-[8px] bg-[#ffffff] min-h-[160px] h-full border-[1px] {{ error()?.message ? 'libs-ui-border-error-general' : isFocus() ? 'border-[var(--libs-ui-color-light-1)]' : 'border-[#ffffff]' }}\"\n (mouseup)=\"handlerClickInput($event)\">\n <ul class=\"before:content-[''] before:table after:content-[''] after:table after:clear-both\">\n @for (item of listExpressions(); track $index; let i = $index) {\n <li class=\"float-left mb-[8px]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none text-center\"\n [class.ml-[-8px]]=\"i === 0\"\n [style.width.px]=\"inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(i)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n @switch (item.type) {\n @case ('operation') {\n <li class=\"float-left mb-[8px] text-center w-[24px] h-[24px] rounded-[4px] p-[4px] bg-[var(--libs-ui-color-light-2)]\">\n @switch (item.data) {\n @case ('/') {\n <i class=\"libs-ui-icon-divide text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('-') {\n <i class=\"libs-ui-icon-minus text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('+') {\n <i class=\"libs-ui-icon-add text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('*') {\n <i class=\"libs-ui-icon-close text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n }\n </li>\n }\n @case ('value') {\n <li class=\"float-left mb-[8px] text-center rounded-[4px] h-[24px] px-[8px] bg-[#E6E7EA] flex items-center max-w-[calc(100%-8px)]\">\n <libs_ui-components-popover [type]=\"'text'\">{{ item.data }}</libs_ui-components-popover>\n </li>\n }\n @case ('field') {\n @if ({ fieldSelected: item.data | LibsUiComponentsInputsCalculatorGetFieldSelectedPipe: configField()?.getFieldSelected }; as data) {\n <li class=\"float-left mb-[8px]\">\n <libs_ui-components-buttons-button\n class=\"max-w-[172px] block\"\n [label]=\"data.fieldSelected?.name || 'i18n_field_error'\"\n [classInclude]=\"'!justify-center !py-[2px] !px-[7px] !w-full'\"\n [classIconLeft]=\"data.fieldSelected?.icon || 'libs-ui-icon-tooltip-outline'\"\n [classIconRight]=\"'libs-ui-icon-move-right rotate-90'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [zIndex]=\"zIndex()\"\n [type]=\"data.fieldSelected ? 'button-primary' : 'button-danger-high'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: false,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: i, key: item.data },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, i)\" />\n </li>\n }\n }\n }\n }\n <li class=\"float-left mb-[8px] max-w-[100%]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none max-w-[100%] {{ listExpressions().length ? 'text-center' : '' }}\"\n [style.width.px]=\"listExpressions().length ? (inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput) : 150\"\n [placeholder]=\"!listExpressions().length ? (placeholder() | translate) : ''\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(listExpressions().length)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n </ul>\n </div>\n @if (error()?.message) {\n <div class=\"libs-ui-text-error mt-[8px] libs-ui-font-h7r\">\n @let constHtmlMessage = error()?.message || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n </div>\n <div class=\"grid grid-cols-4 gap-[8px] {{ classContainerButton() }}\">\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"configField()?.label || 'i18n_select_field'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: true,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: -1 },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, -1)\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-violet'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'Fx'\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-danger-high'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'C'\"\n (outClick)=\"handlerClick($event, 'c')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'('\"\n (outClick)=\"handlerClick($event, '(')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"')'\"\n (outClick)=\"handlerClick($event, ')')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-divide'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '/')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'1'\"\n (outClick)=\"handlerClick($event, '1')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'2'\"\n (outClick)=\"handlerClick($event, '2')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'3'\"\n (outClick)=\"handlerClick($event, '3')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClick($event, '*')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'4'\"\n (outClick)=\"handlerClick($event, '4')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'5'\"\n (outClick)=\"handlerClick($event, '5')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'6'\"\n (outClick)=\"handlerClick($event, '6')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-minus'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '-')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'7'\"\n (outClick)=\"handlerClick($event, '7')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'8'\"\n (outClick)=\"handlerClick($event, '8')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'9'\"\n (outClick)=\"handlerClick($event, '9')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n (outClick)=\"handlerClick($event, '+')\" />\n </div>\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"'0'\"\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n (outClick)=\"handlerClick($event, '0')\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'.'\"\n (outClick)=\"handlerClick($event, '.')\" />\n </div>\n </div>\n </div>\n @if (!ignoreButtonSave()) {\n <div class=\"mt-[16px]\">\n <libs_ui-components-buttons-button\n [label]=\"labelButtonSave()\"\n [disable]=\"!isChangeExpression()\"\n [classInclude]=\"'justify-center w-full'\"\n (outClick)=\"handlerSave($event)\" />\n </div>\n }\n</div>\n\n<ng-template\n #listViewRef\n let-data=\"itemContext\">\n <libs_ui-components-list\n [zIndex]=\"zIndex()\"\n [config]=\"configField()?.listConfig\"\n [maxItemShow]=\"6\"\n [clickExactly]=\"false\"\n [searchConfig]=\"{ noBorder: true, placeholder: configField()?.placeholderInputList || 'i18n_search' }\"\n [multiKeySelected]=\"data.key ? [data.key] : []\"\n (outSelectMultiKey)=\"handlerSelectedField($event, data.index)\"></libs_ui-components-list>\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: LibsUiComponentsButtonsButtonComponent, selector: "libs_ui-components-buttons-button", inputs: ["flagMouse", "type", "buttonCustom", "sizeButton", "label", "disable", "isPending", "imageLeft", "classInclude", "classIconLeft", "classIconRight", "classLabel", "iconOnlyType", "popover", "ignoreStopPropagationEvent", "zIndex", "widthLabelPopover", "styleIconLeft", "styleButton", "ignoreFocusWhenInputTab", "ignoreSetClickWhenShowPopover", "ignorePointerEvent", "isActive", "isHandlerEnterDocumentClickButton"], outputs: ["outClick", "outPopoverEvent", "outFunctionsControl"] }, { kind: "component", type: LibsUiComponentsListComponent, selector: "libs_ui-components-list", inputs: ["hiddenInputSearch", "dropdownTabKeyActive", "keySearch", "paddingLeftItem", "config", "autoSelectedFirstItemCallOutsideBefore", "isSearchOnline", "disable", "disableLabel", "labelConfig", "searchConfig", "searchPadding", "dividerClassInclude", "hasDivider", "buttonsOther", "hasButtonUnSelectOption", "clickExactly", "backgroundListCustom", "maxItemShow", "keySelected", "multiKeySelected", "keysDisableItem", "keysHiddenItem", "focusInputSearch", "skipFocusInputWhenKeySearchStoreUndefined", "functionGetItemsAutoAddList", "validRequired", "showValidateBottom", "zIndex", "loadingIconSize", "templateRefSearchNoData", "templateRefNotSearchNoData", "resetKeyWhenSelectAllKeyDropdown", "ignoreClassDisableDefaultWhenUseKeysDisableItem"], outputs: ["outSelectKey", "outSelectMultiKey", "outUnSelectMultiKey", "outClickButtonOther", "outFieldKey", "outChangeView", "outKeySearch", "outLoading", "outFunctionsControl", "outChangStageFlagMousePopover", "outLoadItemsComplete"] }, { kind: "pipe", type: LibsUiComponentsInputsCalculatorGetFieldSelectedPipe, name: "LibsUiComponentsInputsCalculatorGetFieldSelectedPipe" }, { kind: "component", type: LibsUiComponentsPopoverComponent, selector: "libs_ui-components-popover,[LibsUiComponentsPopoverDirective]", inputs: ["debugId", "flagMouse", "type", "mode", "config", "ignoreShowPopover", "elementRefCustom", "initEventInElementRefCustom", "classInclude", "ignoreHiddenPopoverContentWhenMouseLeave", "ignoreStopPropagationEvent", "ignoreCursorPointerModeLikeClick", "isAddContentToParentDocument", "ignoreClickOutside"], outputs: ["outEvent", "outChangStageFlagMouse", "outEventPopoverContent", "outFunctionsControl"] }, { kind: "pipe", type: LibsUiComponentsInputsCalculatorGetWidthInputPipe, name: "LibsUiComponentsInputsCalculatorGetWidthInputPipe" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"libs-ui-components-inputs-calculator.mjs","sources":["../../../../../../libs-ui/components/inputs/calculator/src/pipes/get-field-selected.pipe.ts","../../../../../../libs-ui/components/inputs/calculator/src/pipes/get-width-input.pipe.ts","../../../../../../libs-ui/components/inputs/calculator/src/calculator.component.ts","../../../../../../libs-ui/components/inputs/calculator/src/calculator.component.html","../../../../../../libs-ui/components/inputs/calculator/src/libs-ui-components-inputs-calculator.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { IInputCalculatorField } from '../interfaces';\n\n@Pipe({\n name: 'LibsUiComponentsInputsCalculatorGetFieldSelectedPipe',\n standalone: true,\n})\nexport class LibsUiComponentsInputsCalculatorGetFieldSelectedPipe implements PipeTransform {\n transform(fieldId: string | number, getFieldSelected?: (key: string) => IInputCalculatorField | undefined): IInputCalculatorField | undefined {\n return getFieldSelected?.(typeof fieldId === 'number' ? fieldId.toString() : fieldId);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'LibsUiComponentsInputsCalculatorGetWidthInputPipe',\n standalone: true,\n})\nexport class LibsUiComponentsInputsCalculatorGetWidthInputPipe implements PipeTransform {\n transform(text: string, element: HTMLDivElement): number {\n if (!text) {\n return 8;\n }\n const div = document.createElement('span');\n\n div.textContent = text;\n element.appendChild(div);\n const width = div.offsetWidth + 8;\n\n div.remove();\n\n return width;\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, input, OnInit, output, signal, viewChildren } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IListDataEmitMultiKey, LibsUiComponentsListComponent } from '@libs-ui/components-list';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { cloneDeep, UtilsKeyCodeConstant } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IInputCalculatorConfigField, IInputCalculatorExpression, IInputCalculatorFunctionControlEvent, IInputCalculatorValid } from './interfaces';\nimport { LibsUiComponentsInputsCalculatorGetFieldSelectedPipe } from './pipes/get-field-selected.pipe';\nimport { LibsUiComponentsInputsCalculatorGetWidthInputPipe } from './pipes/get-width-input.pipe';\n\n/**\n * Component Calculator nâng cao hỗ trợ nhập liệu biểu thức toán học.\n * Kết hợp giữa các trường dữ liệu động (fields), giá trị tĩnh và toán tử.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-calculator',\n templateUrl: './calculator.component.html',\n standalone: true,\n imports: [TranslateModule, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsListComponent, LibsUiComponentsInputsCalculatorGetFieldSelectedPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsInputsCalculatorGetWidthInputPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsCalculatorComponent implements OnInit {\n protected indexFocus = signal<number | undefined>(undefined);\n protected isFocus = signal<boolean>(false);\n protected listExpressions = signal<Array<IInputCalculatorExpression>>([]);\n protected isChangeExpression = signal<boolean>(false);\n protected error = signal<IInputCalculatorValid | undefined>(undefined);\n\n private inputRef = viewChildren<ElementRef>('inputRef');\n private timeOut = signal<number | undefined>(undefined);\n private tooltipFunctionControl = signal<Map<number, IPopoverFunctionControlEvent>>(new Map());\n\n readonly expressions = input<Array<IInputCalculatorExpression>>([]);\n readonly zIndex = input<number>(10);\n readonly placeholder = input<string>('i18n_enter_params');\n readonly labelButtonSave = input<string>('i18n_save_calculation');\n readonly configField = input<IInputCalculatorConfigField>();\n readonly ignoreButtonSave = input<boolean>(false);\n readonly classInclude = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly classContainerInput = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly classContainerButton = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly validRequired = input<IInputCalculatorValid>();\n\n readonly outChangeExpressions = output<Array<IInputCalculatorExpression>>();\n readonly outFunctionControl = output<IInputCalculatorFunctionControlEvent>();\n\n ngOnInit() {\n this.listExpressions.set(cloneDeep(this.expressions()));\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): IInputCalculatorFunctionControlEvent {\n return {\n checkIsValid: this.validate.bind(this),\n getData: () => {\n return cloneDeep(this.listExpressions());\n },\n };\n }\n\n protected handlerClick(event: Event, button: '+' | '-' | '*' | '/' | 'c' | '.' | '(' | ')' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') {\n event.stopPropagation();\n const expression: IInputCalculatorExpression = { type: 'field', data: button };\n\n if (button === 'c') {\n if (!this.listExpressions().length || this.indexFocus() === 0) {\n return;\n }\n return this.updateExpressions(undefined, typeof this.indexFocus() !== 'undefined' ? (this.indexFocus() || 1) - 1 : this.listExpressions().length - 1);\n }\n switch (button) {\n case '+':\n case '-':\n case '*':\n case '/':\n expression.type = 'operation';\n break;\n default:\n expression.type = 'value';\n }\n this.updateExpressions(expression, typeof this.indexFocus() !== 'undefined' ? this.indexFocus() || 0 : this.listExpressions().length);\n }\n\n private updateExpressions(item: IInputCalculatorExpression | undefined, position: number, isDelete?: boolean) {\n this.isChangeExpression.set(true);\n this.listExpressions.update((value) => {\n if (item) {\n value.splice(position || 0, 0, item);\n }\n if (!item) {\n value.splice(position || 0, 1);\n }\n\n return [...value];\n });\n\n this.indexFocus.update((value) => {\n if (!item) {\n if (value) {\n value = isDelete ? value : value - 1;\n }\n\n return value ? value : position;\n }\n if (typeof value === 'undefined') {\n value = this.listExpressions().length;\n\n return value;\n }\n value++;\n\n return value;\n });\n const indexFocus = this.indexFocus();\n\n setTimeout(() => {\n if (typeof indexFocus !== 'undefined') {\n this.inputRef()[indexFocus]?.nativeElement.focus();\n }\n }, 100);\n this.validate();\n }\n\n protected handlerEventKeyUpInput(event: Event) {\n const keyCode = (event as IEvent).keyCode;\n const value = (event as IEvent).target.value;\n const shiftKey = (event as IEvent).shiftKey;\n\n if ((([UtilsKeyCodeConstant.EQUALS, UtilsKeyCodeConstant.EIGHT].includes(keyCode) && shiftKey) || ([UtilsKeyCodeConstant.DASH, UtilsKeyCodeConstant.SLASH].includes(keyCode) && !shiftKey)) && value.length === 1) {\n (event as IEvent).target.value = '';\n\n return this.updateExpressions({ type: 'operation', data: value }, this.indexFocus() || this.listExpressions().length);\n }\n }\n\n protected handlerEventKeyInput(event: Event) {\n const keyCode = (event as IEvent).keyCode;\n const value = (event as IEvent).target.value;\n\n if (keyCode === UtilsKeyCodeConstant.BACKSPACE) {\n if (!value && this.listExpressions().length && (this.indexFocus() || 0) > 0) {\n return this.updateExpressions(undefined, (this.indexFocus() || 0) - 1);\n }\n }\n if (keyCode === UtilsKeyCodeConstant.DELETE) {\n if (!value && this.listExpressions().length && (this.indexFocus() || 0) < this.listExpressions().length) {\n return this.updateExpressions(undefined, this.indexFocus() || 0, true);\n }\n }\n if (keyCode === UtilsKeyCodeConstant.ENTER) {\n if (value) {\n (event as IEvent).target.value = '';\n\n return this.updateExpressions({ type: 'value', data: value }, this.indexFocus() || this.listExpressions().length);\n }\n }\n }\n\n protected handlerFocusAndBlurInput(index: number | undefined) {\n if (typeof index !== 'undefined') {\n this.indexFocus.set(index);\n this.isFocus.set(true);\n clearTimeout(this.timeOut());\n\n return;\n }\n this.timeOut.set(\n setTimeout(() => {\n this.isFocus.set(false);\n }, 250)\n );\n }\n\n protected handlerClickInput(event: Event) {\n event.stopPropagation();\n if (!this.isFocus()) {\n this.inputRef()[this.inputRef().length - 1].nativeElement.focus();\n }\n }\n\n protected handlerSave(event: Event) {\n event.stopPropagation();\n this.isChangeExpression.set(false);\n this.outChangeExpressions.emit(cloneDeep(this.listExpressions()));\n }\n\n protected handlerSelectedField(event: IListDataEmitMultiKey | undefined, index: number) {\n if (!event?.keys.length) {\n return;\n }\n if (index >= 0) {\n this.listExpressions.update((value) => {\n value.forEach((item, i) => {\n if (i === index) {\n if (item.data !== event.keys[0]) {\n this.tooltipFunctionControl().get(index)?.removePopoverOverlay();\n }\n item.data = event.keys[0] as string;\n }\n });\n\n return [...value];\n });\n this.isChangeExpression.set(true);\n\n return;\n }\n this.updateExpressions({ type: 'field', data: event.keys[0] as string }, typeof this.indexFocus() !== 'undefined' ? this.indexFocus() || 0 : this.listExpressions().length);\n this.tooltipFunctionControl().get(index)?.removePopoverOverlay();\n }\n\n protected handlerFunctionControlButton(event: IPopoverFunctionControlEvent, index: number) {\n this.tooltipFunctionControl.update((value) => {\n value.set(index, event);\n\n return value;\n });\n }\n\n private async validate() {\n this.error.set(undefined);\n if (!this.validRequired() || !this.validRequired()?.message) {\n return true;\n }\n if (!this.listExpressions().length) {\n this.error.set({ message: this.validRequired()?.message });\n }\n\n return this.listExpressions().length ? true : false;\n }\n}\n","<div class=\"w-full\">\n <div class=\"p-[8px] rounded-[12px] bg-[#f8f9fa] {{ classInclude() }}\">\n <div class=\"mb-[8px] {{ classContainerInput() }}\">\n <div\n #calculatorInput\n class=\"py-[10px] px-[12px] libs-ui-font-h5r rounded-[8px] bg-[#ffffff] min-h-[160px] h-full border-[1px] {{ error()?.message ? 'libs-ui-border-error-general' : isFocus() ? 'border-[var(--libs-ui-color-light-1)]' : 'border-[#ffffff]' }}\"\n (mouseup)=\"handlerClickInput($event)\">\n <ul class=\"before:content-[''] before:table after:content-[''] after:table after:clear-both\">\n @for (item of listExpressions(); track $index; let i = $index) {\n <li class=\"float-left mb-[8px]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none text-center\"\n [class.ml-[-8px]]=\"i === 0\"\n [style.width.px]=\"inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(i)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n @switch (item.type) {\n @case ('operation') {\n <li class=\"float-left mb-[8px] text-center w-[24px] h-[24px] rounded-[4px] p-[4px] bg-[var(--libs-ui-color-light-2)]\">\n @switch (item.data) {\n @case ('/') {\n <i class=\"libs-ui-icon-divide text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('-') {\n <i class=\"libs-ui-icon-minus text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('+') {\n <i class=\"libs-ui-icon-add text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('*') {\n <i class=\"libs-ui-icon-close text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n }\n </li>\n }\n @case ('value') {\n <li class=\"float-left mb-[8px] text-center rounded-[4px] h-[24px] px-[8px] bg-[#E6E7EA] flex items-center max-w-[calc(100%-8px)]\">\n <libs_ui-components-popover [type]=\"'text'\">{{ item.data }}</libs_ui-components-popover>\n </li>\n }\n @case ('field') {\n @if ({ fieldSelected: item.data | LibsUiComponentsInputsCalculatorGetFieldSelectedPipe: configField()?.getFieldSelected }; as data) {\n <li class=\"float-left mb-[8px]\">\n <libs_ui-components-buttons-button\n class=\"max-w-[172px] block\"\n [label]=\"data.fieldSelected?.name || 'i18n_field_error'\"\n [classInclude]=\"'!justify-center !py-[2px] !px-[7px] !w-full'\"\n [classIconLeft]=\"data.fieldSelected?.icon || 'libs-ui-icon-tooltip-outline'\"\n [classIconRight]=\"'libs-ui-icon-move-right rotate-90'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [zIndex]=\"zIndex()\"\n [type]=\"data.fieldSelected ? 'button-primary' : 'button-danger-high'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: false,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: i, key: item.data },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, i)\" />\n </li>\n }\n }\n }\n }\n <li class=\"float-left mb-[8px] max-w-[100%]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none max-w-[100%] {{ listExpressions().length ? 'text-center' : '' }}\"\n [style.width.px]=\"listExpressions().length ? (inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput) : 150\"\n [placeholder]=\"!listExpressions().length ? (placeholder() | translate) : ''\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(listExpressions().length)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n </ul>\n </div>\n @if (error()?.message) {\n <div class=\"libs-ui-text-error mt-[8px] libs-ui-font-h7r\">\n @let constHtmlMessage = error()?.message || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n </div>\n <div class=\"grid grid-cols-4 gap-[8px] {{ classContainerButton() }}\">\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"configField()?.label || 'i18n_select_field'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: true,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: -1 },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, -1)\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-violet'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'Fx'\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-danger-high'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'C'\"\n (outClick)=\"handlerClick($event, 'c')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'('\"\n (outClick)=\"handlerClick($event, '(')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"')'\"\n (outClick)=\"handlerClick($event, ')')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-divide'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '/')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'1'\"\n (outClick)=\"handlerClick($event, '1')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'2'\"\n (outClick)=\"handlerClick($event, '2')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'3'\"\n (outClick)=\"handlerClick($event, '3')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClick($event, '*')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'4'\"\n (outClick)=\"handlerClick($event, '4')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'5'\"\n (outClick)=\"handlerClick($event, '5')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'6'\"\n (outClick)=\"handlerClick($event, '6')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-minus'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '-')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'7'\"\n (outClick)=\"handlerClick($event, '7')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'8'\"\n (outClick)=\"handlerClick($event, '8')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'9'\"\n (outClick)=\"handlerClick($event, '9')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n (outClick)=\"handlerClick($event, '+')\" />\n </div>\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"'0'\"\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n (outClick)=\"handlerClick($event, '0')\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'.'\"\n (outClick)=\"handlerClick($event, '.')\" />\n </div>\n </div>\n </div>\n @if (!ignoreButtonSave()) {\n <div class=\"mt-[16px]\">\n <libs_ui-components-buttons-button\n [label]=\"labelButtonSave()\"\n [disable]=\"!isChangeExpression()\"\n [classInclude]=\"'justify-center w-full'\"\n (outClick)=\"handlerSave($event)\" />\n </div>\n }\n</div>\n\n<ng-template\n #listViewRef\n let-data=\"itemContext\">\n <libs_ui-components-list\n [zIndex]=\"zIndex()\"\n [config]=\"configField()?.listConfig\"\n [maxItemShow]=\"6\"\n [clickExactly]=\"false\"\n [searchConfig]=\"{ noBorder: true, placeholder: configField()?.placeholderInputList || 'i18n_search' }\"\n [multiKeySelected]=\"data.key ? [data.key] : []\"\n (outSelectMultiKey)=\"handlerSelectedField($event, data.index)\"></libs_ui-components-list>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"libs-ui-components-inputs-calculator.mjs","sources":["../../../../../../libs-ui/components/inputs/calculator/src/pipes/get-field-selected.pipe.ts","../../../../../../libs-ui/components/inputs/calculator/src/pipes/get-width-input.pipe.ts","../../../../../../libs-ui/components/inputs/calculator/src/calculator.component.ts","../../../../../../libs-ui/components/inputs/calculator/src/calculator.component.html","../../../../../../libs-ui/components/inputs/calculator/src/libs-ui-components-inputs-calculator.ts"],"sourcesContent":["import { Pipe, PipeTransform } from '@angular/core';\nimport { IInputCalculatorField } from '../interfaces';\n\n@Pipe({\n name: 'LibsUiComponentsInputsCalculatorGetFieldSelectedPipe',\n standalone: true,\n})\nexport class LibsUiComponentsInputsCalculatorGetFieldSelectedPipe implements PipeTransform {\n transform(fieldId: string | number, getFieldSelected?: (key: string) => IInputCalculatorField | undefined): IInputCalculatorField | undefined {\n return getFieldSelected?.(typeof fieldId === 'number' ? fieldId.toString() : fieldId);\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n@Pipe({\n name: 'LibsUiComponentsInputsCalculatorGetWidthInputPipe',\n standalone: true,\n})\nexport class LibsUiComponentsInputsCalculatorGetWidthInputPipe implements PipeTransform {\n transform(text: string, element: HTMLDivElement): number {\n if (!text) {\n return 8;\n }\n const div = document.createElement('span');\n\n div.textContent = text;\n element.appendChild(div);\n const width = div.offsetWidth + 8;\n\n div.remove();\n\n return width;\n }\n}\n","import { ChangeDetectionStrategy, Component, ElementRef, input, OnInit, output, signal, viewChildren } from '@angular/core';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IListDataEmitMultiKey, LibsUiComponentsListComponent } from '@libs-ui/components-list';\nimport { IPopoverFunctionControlEvent, LibsUiComponentsPopoverComponent } from '@libs-ui/components-popover';\nimport { IEvent } from '@libs-ui/interfaces-types';\nimport { cloneDeep, UtilsKeyCodeConstant } from '@libs-ui/utils';\nimport { TranslateModule } from '@ngx-translate/core';\nimport { IInputCalculatorConfigField, IInputCalculatorExpression, IInputCalculatorFunctionControlEvent, IInputCalculatorValid } from './interfaces';\nimport { LibsUiComponentsInputsCalculatorGetFieldSelectedPipe } from './pipes/get-field-selected.pipe';\nimport { LibsUiComponentsInputsCalculatorGetWidthInputPipe } from './pipes/get-width-input.pipe';\n\n/**\n * Component Calculator nâng cao hỗ trợ nhập liệu biểu thức toán học.\n * Kết hợp giữa các trường dữ liệu động (fields), giá trị tĩnh và toán tử.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-inputs-calculator',\n templateUrl: './calculator.component.html',\n standalone: true,\n imports: [TranslateModule, LibsUiComponentsButtonsButtonComponent, LibsUiComponentsListComponent, LibsUiComponentsInputsCalculatorGetFieldSelectedPipe, LibsUiComponentsPopoverComponent, LibsUiComponentsInputsCalculatorGetWidthInputPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LibsUiComponentsInputsCalculatorComponent implements OnInit {\n protected indexFocus = signal<number | undefined>(undefined);\n protected isFocus = signal<boolean>(false);\n protected listExpressions = signal<Array<IInputCalculatorExpression>>([]);\n protected isChangeExpression = signal<boolean>(false);\n protected error = signal<IInputCalculatorValid | undefined>(undefined);\n\n private readonly inputRef = viewChildren<ElementRef>('inputRef');\n private readonly timeOut = signal<number | undefined>(undefined);\n private readonly tooltipFunctionControl = signal<Map<number, IPopoverFunctionControlEvent>>(new Map());\n\n readonly expressions = input<Array<IInputCalculatorExpression>>([]);\n readonly zIndex = input<number>(10);\n readonly placeholder = input<string>('i18n_enter_params');\n readonly labelButtonSave = input<string>('i18n_save_calculation');\n readonly configField = input<IInputCalculatorConfigField>();\n readonly ignoreButtonSave = input<boolean>(false);\n readonly classInclude = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly classContainerInput = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly classContainerButton = input<string, string | undefined>('', { transform: (value) => value || '' });\n readonly validRequired = input<IInputCalculatorValid>();\n\n readonly outChangeExpressions = output<Array<IInputCalculatorExpression>>();\n readonly outFunctionControl = output<IInputCalculatorFunctionControlEvent>();\n\n ngOnInit() {\n this.listExpressions.set(cloneDeep(this.expressions()));\n this.outFunctionControl.emit(this.FunctionsControl);\n }\n\n public get FunctionsControl(): IInputCalculatorFunctionControlEvent {\n return {\n checkIsValid: this.validate.bind(this),\n getData: () => {\n return cloneDeep(this.listExpressions());\n },\n };\n }\n\n protected handlerClick(event: Event, button: '+' | '-' | '*' | '/' | 'c' | '.' | '(' | ')' | '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9') {\n event.stopPropagation();\n const expression: IInputCalculatorExpression = { type: 'field', data: button };\n\n if (button === 'c') {\n if (!this.listExpressions().length || this.indexFocus() === 0) {\n return;\n }\n return this.updateExpressions(undefined, typeof this.indexFocus() !== 'undefined' ? (this.indexFocus() || 1) - 1 : this.listExpressions().length - 1);\n }\n switch (button) {\n case '+':\n case '-':\n case '*':\n case '/':\n expression.type = 'operation';\n break;\n default:\n expression.type = 'value';\n }\n this.updateExpressions(expression, typeof this.indexFocus() !== 'undefined' ? this.indexFocus() || 0 : this.listExpressions().length);\n }\n\n private updateExpressions(item: IInputCalculatorExpression | undefined, position: number, isDelete?: boolean) {\n this.isChangeExpression.set(true);\n this.listExpressions.update((value) => {\n if (item) {\n value.splice(position || 0, 0, item);\n }\n if (!item) {\n value.splice(position || 0, 1);\n }\n\n return [...value];\n });\n\n this.indexFocus.update((value) => {\n if (!item) {\n if (value) {\n value = isDelete ? value : value - 1;\n }\n\n return value || position;\n }\n if (typeof value === 'undefined') {\n value = this.listExpressions().length;\n\n return value;\n }\n value++;\n\n return value;\n });\n const indexFocus = this.indexFocus();\n\n setTimeout(() => {\n if (typeof indexFocus !== 'undefined') {\n this.inputRef()[indexFocus]?.nativeElement.focus();\n }\n }, 100);\n this.validate();\n }\n\n protected handlerEventKeyUpInput(event: Event) {\n const keyCode = (event as IEvent).keyCode;\n const value = (event as IEvent).target.value;\n const shiftKey = (event as IEvent).shiftKey;\n\n if ((([UtilsKeyCodeConstant.EQUALS, UtilsKeyCodeConstant.EIGHT].includes(keyCode) && shiftKey) || ([UtilsKeyCodeConstant.DASH, UtilsKeyCodeConstant.SLASH].includes(keyCode) && !shiftKey)) && value.length === 1) {\n (event as IEvent).target.value = '';\n\n return this.updateExpressions({ type: 'operation', data: value }, this.indexFocus() || this.listExpressions().length);\n }\n }\n\n protected handlerEventKeyInput(event: Event) {\n const keyCode = (event as IEvent).keyCode;\n const value = (event as IEvent).target.value;\n\n if (keyCode === UtilsKeyCodeConstant.BACKSPACE) {\n if (!value && this.listExpressions().length && (this.indexFocus() || 0) > 0) {\n return this.updateExpressions(undefined, (this.indexFocus() || 0) - 1);\n }\n }\n if (keyCode === UtilsKeyCodeConstant.DELETE) {\n if (!value && this.listExpressions().length && (this.indexFocus() || 0) < this.listExpressions().length) {\n return this.updateExpressions(undefined, this.indexFocus() || 0, true);\n }\n }\n if (keyCode === UtilsKeyCodeConstant.ENTER) {\n if (value) {\n (event as IEvent).target.value = '';\n\n return this.updateExpressions({ type: 'value', data: value }, this.indexFocus() || this.listExpressions().length);\n }\n }\n }\n\n protected handlerFocusAndBlurInput(index: number | undefined) {\n if (typeof index !== 'undefined') {\n this.indexFocus.set(index);\n this.isFocus.set(true);\n clearTimeout(this.timeOut());\n\n return;\n }\n this.timeOut.set(\n setTimeout(() => {\n this.isFocus.set(false);\n }, 250)\n );\n }\n\n protected handlerClickInput(event: Event) {\n event.stopPropagation();\n if (!this.isFocus()) {\n this.inputRef()[this.inputRef().length - 1].nativeElement.focus();\n }\n }\n\n protected handlerSave(event: Event) {\n event.stopPropagation();\n this.isChangeExpression.set(false);\n this.outChangeExpressions.emit(cloneDeep(this.listExpressions()));\n }\n\n protected handlerSelectedField(event: IListDataEmitMultiKey | undefined, index: number) {\n if (!event?.keys.length) {\n return;\n }\n if (index >= 0) {\n this.listExpressions.update((value) => {\n value.forEach((item, i) => {\n if (i === index) {\n if (item.data !== event.keys[0]) {\n this.tooltipFunctionControl().get(index)?.removePopoverOverlay();\n }\n item.data = event.keys[0] as string;\n }\n });\n\n return [...value];\n });\n this.isChangeExpression.set(true);\n\n return;\n }\n this.updateExpressions({ type: 'field', data: event.keys[0] as string }, typeof this.indexFocus() !== 'undefined' ? this.indexFocus() || 0 : this.listExpressions().length);\n this.tooltipFunctionControl().get(index)?.removePopoverOverlay();\n }\n\n protected handlerFunctionControlButton(event: IPopoverFunctionControlEvent, index: number) {\n this.tooltipFunctionControl.update((value) => {\n value.set(index, event);\n\n return value;\n });\n }\n\n private async validate() {\n this.error.set(undefined);\n if (!this.validRequired()?.message) {\n return true;\n }\n if (!this.listExpressions().length) {\n this.error.set({ message: this.validRequired()?.message });\n }\n\n return !!this.listExpressions().length;\n }\n}\n","<div class=\"w-full\">\n <div class=\"p-[8px] rounded-[12px] bg-[#f8f9fa] {{ classInclude() }}\">\n <div class=\"mb-[8px] {{ classContainerInput() }}\">\n <div\n #calculatorInput\n class=\"py-[10px] px-[12px] libs-ui-font-h5r rounded-[8px] bg-[#ffffff] min-h-[160px] h-full border-[1px] {{ error()?.message ? 'libs-ui-border-error-general' : isFocus() ? 'border-[var(--libs-ui-color-light-1)]' : 'border-[#ffffff]' }}\"\n (mouseup)=\"handlerClickInput($event)\">\n <ul class=\"before:content-[''] before:table after:content-[''] after:table after:clear-both\">\n @for (item of listExpressions(); track $index; let i = $index) {\n <li class=\"float-left mb-[8px]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none text-center\"\n [class.ml-[-8px]]=\"i === 0\"\n [style.width.px]=\"inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(i)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n @switch (item.type) {\n @case ('operation') {\n <li class=\"float-left mb-[8px] text-center w-[24px] h-[24px] rounded-[4px] p-[4px] bg-[var(--libs-ui-color-light-2)]\">\n @switch (item.data) {\n @case ('/') {\n <i class=\"libs-ui-icon-divide text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('-') {\n <i class=\"libs-ui-icon-minus text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('+') {\n <i class=\"libs-ui-icon-add text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n @case ('*') {\n <i class=\"libs-ui-icon-close text-[16px] before:!text-[var(--libs-ui-color-default)]\"></i>\n }\n }\n </li>\n }\n @case ('value') {\n <li class=\"float-left mb-[8px] text-center rounded-[4px] h-[24px] px-[8px] bg-[#E6E7EA] flex items-center max-w-[calc(100%-8px)]\">\n <libs_ui-components-popover [type]=\"'text'\">{{ item.data }}</libs_ui-components-popover>\n </li>\n }\n @case ('field') {\n @if ({ fieldSelected: item.data | LibsUiComponentsInputsCalculatorGetFieldSelectedPipe: configField()?.getFieldSelected }; as data) {\n <li class=\"float-left mb-[8px]\">\n <libs_ui-components-buttons-button\n class=\"max-w-[172px] block\"\n [label]=\"data.fieldSelected?.name || 'i18n_field_error'\"\n [classInclude]=\"'!justify-center !py-[2px] !px-[7px] !w-full'\"\n [classIconLeft]=\"data.fieldSelected?.icon || 'libs-ui-icon-tooltip-outline'\"\n [classIconRight]=\"'libs-ui-icon-move-right rotate-90'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [zIndex]=\"zIndex()\"\n [type]=\"data.fieldSelected ? 'button-primary' : 'button-danger-high'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: false,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: i, key: item.data },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, i)\" />\n </li>\n }\n }\n }\n }\n <li class=\"float-left mb-[8px] max-w-[100%]\">\n <input\n #inputRef\n type=\"text\"\n class=\"inline-block h-[24px] outline-none max-w-[100%] {{ listExpressions().length ? 'text-center' : '' }}\"\n [style.width.px]=\"listExpressions().length ? (inputRef.value | LibsUiComponentsInputsCalculatorGetWidthInputPipe: calculatorInput) : 150\"\n [placeholder]=\"!listExpressions().length ? (placeholder() | translate) : ''\"\n (keydown)=\"handlerEventKeyInput($event)\"\n (keyup)=\"handlerEventKeyUpInput($event)\"\n (focus)=\"handlerFocusAndBlurInput(listExpressions().length)\"\n (blur)=\"handlerFocusAndBlurInput(undefined)\" />\n </li>\n </ul>\n </div>\n @if (error()?.message) {\n <div class=\"libs-ui-text-error mt-[8px] libs-ui-font-h7r\">\n @let constHtmlMessage = error()?.message || ' ';\n {{ constHtmlMessage | translate }}\n </div>\n }\n </div>\n <div class=\"grid grid-cols-4 gap-[8px] {{ classContainerButton() }}\">\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"configField()?.label || 'i18n_select_field'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [popover]=\"{\n mode: 'click-toggle',\n ignoreHiddenPopoverContentWhenMouseLeave: true,\n config: {\n zIndex: zIndex(),\n animationConfig: {},\n widthByParent: true,\n parentBorderWidth: 0,\n maxHeight: 2048,\n maxWidth: 2048,\n direction: 'bottom',\n directionDistance: 2,\n template: listViewRef,\n itemContext: { index: -1 },\n whiteTheme: true,\n ignoreArrow: true,\n classInclude: '!rounded-[4px] !w-[272px]',\n position: { mode: 'start', distance: 0 },\n },\n }\"\n (outFunctionsControl)=\"handlerFunctionControlButton($event, -1)\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-violet'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'Fx'\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-danger-high'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'C'\"\n (outClick)=\"handlerClick($event, 'c')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'('\"\n (outClick)=\"handlerClick($event, '(')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"')'\"\n (outClick)=\"handlerClick($event, ')')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-divide'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '/')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'1'\"\n (outClick)=\"handlerClick($event, '1')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'2'\"\n (outClick)=\"handlerClick($event, '2')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'3'\"\n (outClick)=\"handlerClick($event, '3')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-close'\"\n (outClick)=\"handlerClick($event, '*')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'4'\"\n (outClick)=\"handlerClick($event, '4')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'5'\"\n (outClick)=\"handlerClick($event, '5')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'6'\"\n (outClick)=\"handlerClick($event, '6')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [classIconLeft]=\"'libs-ui-icon-minus'\"\n [iconOnlyType]=\"true\"\n (outClick)=\"handlerClick($event, '-')\" />\n </div>\n <div class=\"col-[1]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'7'\"\n (outClick)=\"handlerClick($event, '7')\" />\n </div>\n <div class=\"col-[2]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'8'\"\n (outClick)=\"handlerClick($event, '8')\" />\n </div>\n <div class=\"col-[3]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'9'\"\n (outClick)=\"handlerClick($event, '9')\" />\n </div>\n <div class=\"col-[4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-secondary'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [iconOnlyType]=\"true\"\n [classIconLeft]=\"'libs-ui-icon-add'\"\n (outClick)=\"handlerClick($event, '+')\" />\n </div>\n <div class=\"col-[1/4]\">\n <libs_ui-components-buttons-button\n [label]=\"'0'\"\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n (outClick)=\"handlerClick($event, '0')\" />\n </div>\n <div class=\"col-[4/4]\">\n <libs_ui-components-buttons-button\n [type]=\"'button-third'\"\n [classInclude]=\"'!w-full !justify-center'\"\n [label]=\"'.'\"\n (outClick)=\"handlerClick($event, '.')\" />\n </div>\n </div>\n </div>\n @if (!ignoreButtonSave()) {\n <div class=\"mt-[16px]\">\n <libs_ui-components-buttons-button\n [label]=\"labelButtonSave()\"\n [disable]=\"!isChangeExpression()\"\n [classInclude]=\"'justify-center w-full'\"\n (outClick)=\"handlerSave($event)\" />\n </div>\n }\n</div>\n\n<ng-template\n #listViewRef\n let-data=\"itemContext\">\n <libs_ui-components-list\n [zIndex]=\"zIndex()\"\n [config]=\"configField()?.listConfig\"\n [maxItemShow]=\"6\"\n [clickExactly]=\"false\"\n [searchConfig]=\"{ noBorder: true, placeholder: configField()?.placeholderInputList || 'i18n_search' }\"\n [multiKeySelected]=\"data.key ? [data.key] : []\"\n (outSelectMultiKey)=\"handlerSelectedField($event, data.index)\"></libs_ui-components-list>\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libs-ui/components-inputs-calculator",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.357-0",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/core": ">=18.0.0",
|
|
6
6
|
"@ngx-translate/core": "^15.0.0",
|
|
7
|
-
"@libs-ui/components-buttons-button": "0.2.
|
|
8
|
-
"@libs-ui/components-list": "0.2.
|
|
9
|
-
"@libs-ui/interfaces-types": "0.2.
|
|
10
|
-
"@libs-ui/utils": "0.2.
|
|
11
|
-
"@libs-ui/components-popover": "0.2.
|
|
7
|
+
"@libs-ui/components-buttons-button": "0.2.357-0",
|
|
8
|
+
"@libs-ui/components-list": "0.2.357-0",
|
|
9
|
+
"@libs-ui/interfaces-types": "0.2.357-0",
|
|
10
|
+
"@libs-ui/utils": "0.2.357-0",
|
|
11
|
+
"@libs-ui/components-popover": "0.2.357-0"
|
|
12
12
|
},
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"module": "fesm2022/libs-ui-components-inputs-calculator.mjs",
|