@libs-ui/components-inputs-multi-language 0.2.355-9 → 0.2.356-1
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 +174 -2
- package/esm2022/items/items.component.mjs +2 -2
- package/esm2022/multi-language.component.mjs +12 -3
- package/fesm2022/libs-ui-components-inputs-multi-language.mjs +12 -3
- package/fesm2022/libs-ui-components-inputs-multi-language.mjs.map +1 -1
- package/multi-language.component.d.ts +3 -1
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -1,3 +1,175 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Multi-Language Input Component
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`@libs-ui/components-inputs-multi-language` là một component mạnh mẽ hỗ trợ nhập liệu đa ngôn ngữ và đa tiền tệ trong các ứng dụng Angular. Component này cung cấp giao diện linh hoạt cho phép người dùng quản lý nội dung giữa nhiều ngôn ngữ khác nhau, hỗ trợ cả định dạng văn bản thuần túy, số học và trình chỉnh sửa văn bản giàu tính năng (Quill).
|
|
4
|
+
|
|
5
|
+
## Tính năng nổi bật
|
|
6
|
+
|
|
7
|
+
- 🌍 **Đa ngôn ngữ**: Hỗ trợ nhập liệu cho nhiều ngôn ngữ đồng thời, tự động quản lý danh sách ngôn ngữ kích hoạt.
|
|
8
|
+
- 💰 **Đa tiền tệ**: Chế độ `integer` cho phép nhập liệu các giá trị tiền tệ đi kèm với đơn vị tiền tệ tương ứng.
|
|
9
|
+
- 🛠️ **Đa dạng kiểu View**: Hỗ trợ `text`, `number`, `integer`, `float`, `editor` (Quill) và `textarea`.
|
|
10
|
+
- ✅ **Validation tích hợp**: Kiểm tra tính hợp lệ của dữ liệu (bắt buộc, độ dài tối thiểu/tối đa) cho từng ngôn ngữ.
|
|
11
|
+
- 🔄 **Quản lý linh hoạt**: Thêm/Xóa ngôn ngữ dễ dàng qua giao diện người dùng.
|
|
12
|
+
- 📱 **Responsive Layout**: Hỗ trợ hiển thị theo hàng (`row`) hoặc cột (`column`).
|
|
13
|
+
- 🎨 **Tùy biến giao diện**: Dễ dàng tùy chỉnh class CSS thông qua các inputs.
|
|
14
|
+
|
|
15
|
+
## Cài đặt
|
|
16
|
+
|
|
17
|
+
Sử dụng npm hoặc yarn để cài đặt:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @libs-ui/components-inputs-multi-language
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Cách sử dụng
|
|
24
|
+
|
|
25
|
+
### Import Module
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import { LibsUiComponentsInputsMultiLanguageComponent } from '@libs-ui/components-inputs-multi-language';
|
|
29
|
+
|
|
30
|
+
@Component({
|
|
31
|
+
standalone: true,
|
|
32
|
+
imports: [LibsUiComponentsInputsMultiLanguageComponent],
|
|
33
|
+
// ...
|
|
34
|
+
})
|
|
35
|
+
export class YourComponent {}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Ví dụ cơ bản (Nhập liệu văn bản)
|
|
39
|
+
|
|
40
|
+
```html
|
|
41
|
+
<libs_ui-components-inputs-multi_language
|
|
42
|
+
[(dataLanguage)]="myData"
|
|
43
|
+
[placeholder]="'Nhập tiêu đề...'"
|
|
44
|
+
[titleField]="'Tiêu đề'"></libs_ui-components-inputs-multi_language>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Ví dụ nâng cao (Đa tiền tệ)
|
|
48
|
+
|
|
49
|
+
```html
|
|
50
|
+
<libs_ui-components-inputs-multi_language
|
|
51
|
+
[viewType]="'integer'"
|
|
52
|
+
[(dataLanguage)]="priceData"
|
|
53
|
+
[titleField]="'Giá sản phẩm'"></libs_ui-components-inputs-multi_language>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## API Reference
|
|
57
|
+
|
|
58
|
+
### Inputs
|
|
59
|
+
|
|
60
|
+
| Thuộc tính | Kiểu dữ liệu | Mặc định | Mô tả |
|
|
61
|
+
| :----------------------------- | :------------------------- | :------------------- | :----------------------------------------------------------------------- |
|
|
62
|
+
| `acceptNegativeValue` | `boolean` | `undefined` | Cho phép nhập số âm. |
|
|
63
|
+
| `classIncludeKey` | `string` | `'libs-ui-font-h4r'` | Class cho phần hiển thị key (label). |
|
|
64
|
+
| `classIncludeValue` | `string` | `'libs-ui-font-h4s'` | Class cho phần hiển thị value. |
|
|
65
|
+
| `countCharacters` | `boolean` | `undefined` | Hiển thị bộ đếm ký tự. |
|
|
66
|
+
| `data` | `Array<IDataItem>` | `[]` | **(Model)** Cấu hình các item nhập liệu bên trong. |
|
|
67
|
+
| `dataLanguage` | `IDataMultiLanguage` | `{}` | **(Model)** Dữ liệu ngôn ngữ hiện tại. |
|
|
68
|
+
| `extendClass` | `string` | `undefined` | Class mở rộng cho container chính. |
|
|
69
|
+
| `extendClassContent` | `string` | `undefined` | Class mở rộng cho phần nội dung input. |
|
|
70
|
+
| `ignoreAdd` | `boolean` | `undefined` | Ẩn nút thêm ngôn ngữ mới. |
|
|
71
|
+
| `ignoreRemove` | `boolean` | `undefined` | Ẩn nút xóa ngôn ngữ. |
|
|
72
|
+
| `keyHeader` | `string` | `undefined` | Key dùng để hiển thị header (nếu có). |
|
|
73
|
+
| `maxValueNumber` | `number` | `undefined` | Giá trị tối đa cho input số. |
|
|
74
|
+
| `multiLine` | `boolean` | `undefined` | Cho phép nhập nhiều dòng (textarea). |
|
|
75
|
+
| `onlyAcceptNegativeValue` | `boolean` | `undefined` | Chỉ chấp nhận giá trị âm. |
|
|
76
|
+
| `optionsLanguage` | `Array<IOption>` | `langOptions()` | Danh sách các tùy chọn ngôn ngữ/tiền tệ. |
|
|
77
|
+
| `placeholder` | `string` | `undefined` | Placeholder cho các input. |
|
|
78
|
+
| `readonly` | `boolean` | `false` | Chế độ chỉ đọc. |
|
|
79
|
+
| `singleLanguage` | `boolean` | `undefined` | Đơn ngôn ngữ (chỉ hiển thị 1 ngôn ngữ mặc định). |
|
|
80
|
+
| `textArea` | `boolean` | `undefined` | Sử dụng textarea thay vì input text. |
|
|
81
|
+
| `titleField` | `string` | `undefined` | Tiêu đề chung cho các trường nhập liệu. |
|
|
82
|
+
| `validMaxLength` | `IValidLength` | `{ length: 0 }` | Cấu hình độ dài tối đa cho validation. |
|
|
83
|
+
| `validMinLength` | `IValidLength` | `undefined` | Cấu hình độ dài tối thiểu cho validation. |
|
|
84
|
+
| `validOneDefaultMultiLanguage` | `string` | `undefined` | Key ngôn ngữ mặc định bắt buộc nhập nếu chỉ nhập 1 ngôn ngữ |
|
|
85
|
+
| `validRequired` | `IValidRequired` | `validRequired()` | Cấu hình validation bắt buộc. |
|
|
86
|
+
| `valueUpDownNumber` | `number` | `undefined` | Bước nhảy cho nút tăng giảm giá trị số. |
|
|
87
|
+
| `viewContent` | `boolean` | `undefined` | Chỉ hiển thị nội dung (view mode), không phải input. |
|
|
88
|
+
| `viewPosition` | `'row' \| 'column'` | `'row'` | Hướng hiển thị của label và input. |
|
|
89
|
+
| `viewType` | `TYPE_VIEW_MULTI_LANGUAGE` | `'text'` | Kiểu hiển thị: `text`, `integer`, `number`, `editor`, `float`, `bigint`. |
|
|
90
|
+
| `zIndex` | `number` | `undefined` | Z-index cho các thành phần dropdown/popover. |
|
|
91
|
+
|
|
92
|
+
### Outputs
|
|
93
|
+
|
|
94
|
+
| Sự kiện | Kiểu dữ liệu | Mô tả |
|
|
95
|
+
| :---------------------- | :---------------------------------------- | :------------------------------------------------------------------------- |
|
|
96
|
+
| `outChangeTypeLanguage` | `boolean` | Phát ra khi thay đổi loại ngôn ngữ (đơn/đa). |
|
|
97
|
+
| `outChangeValueInput` | `void` | Phát ra khi giá trị trong bất kỳ input nào thay đổi. |
|
|
98
|
+
| `outEventMultiLanguage` | `IEventMultiLanguage` | Phát ra khi có hành động thêm hoặc xóa ngôn ngữ. |
|
|
99
|
+
| `outFunctionsControl` | `IInputMultiLanguageFunctionControlEvent` | Cung cấp các phương thức điều khiển component (`checkIsValid`, `getData`). |
|
|
100
|
+
|
|
101
|
+
## Types & Interfaces
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
export interface IDataItem {
|
|
105
|
+
keyBindData?: string;
|
|
106
|
+
placeholder?: string;
|
|
107
|
+
type?: string;
|
|
108
|
+
header?: IConfigMultiLanguageHeader;
|
|
109
|
+
isOneValue?: boolean;
|
|
110
|
+
classIncludeInput?: string;
|
|
111
|
+
titleField?: string;
|
|
112
|
+
isCountCharacters?: boolean;
|
|
113
|
+
validRequired?: IValidRequired;
|
|
114
|
+
dataMultiLanguage?: IDataMultiLanguage;
|
|
115
|
+
validRequiredLangDefault?: IValidRequired;
|
|
116
|
+
validRequiredDefault?: IValidRequired;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface IConfigMultiLanguageHeader {
|
|
120
|
+
title?: string;
|
|
121
|
+
isShowInput?: boolean;
|
|
122
|
+
validRequired?: {
|
|
123
|
+
isRequired?: boolean;
|
|
124
|
+
};
|
|
125
|
+
keyBindData?: string;
|
|
126
|
+
dataDefault?:
|
|
127
|
+
| IDataMultiLanguage
|
|
128
|
+
| {
|
|
129
|
+
total?: IDataMultiLanguage;
|
|
130
|
+
};
|
|
131
|
+
type?: string;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export interface IDataMultiLanguage {
|
|
135
|
+
[param: string]: IDataLanguage | string | number;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface IDataLanguage {
|
|
139
|
+
[param: string]: string | number;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export interface IEventMultiLanguage {
|
|
143
|
+
action: 'add' | 'remove';
|
|
144
|
+
data: IDataMultiLanguage;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export type TYPE_VIEW_MULTI_LANGUAGE = 'text' | 'integer' | 'number' | 'editor' | 'float' | 'bigint';
|
|
148
|
+
|
|
149
|
+
export interface IInputMultiLanguageFunctionControlEvent {
|
|
150
|
+
checkIsValid: () => Promise<boolean>;
|
|
151
|
+
getData: () => Promise<IDataMultiLanguage[] | IDataMultiLanguage | undefined>;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export interface IOption {
|
|
155
|
+
label: string;
|
|
156
|
+
key: string;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export interface ICurrencyUnit {
|
|
160
|
+
label: string;
|
|
161
|
+
id: string;
|
|
162
|
+
type: string;
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
## Tech Stack
|
|
167
|
+
|
|
168
|
+
- **Framework**: Angular 18+
|
|
169
|
+
- **Styling**: Tailwind CSS
|
|
170
|
+
- **Utilities**: `@libs-ui/utils`
|
|
171
|
+
- **I18n**: `@ngx-translate/core`
|
|
172
|
+
|
|
173
|
+
## License
|
|
174
|
+
|
|
175
|
+
MIT
|
|
@@ -141,10 +141,10 @@ export class LibsUiComponentsInputsMultiLanguageItemsComponent {
|
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageItemsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
144
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageItemsComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language-items", inputs: { configItems: { classPropertyName: "configItems", publicName: "configItems", isSignal: true, isRequired: false, transformFunction: null }, dataMultiLanguage: { classPropertyName: "dataMultiLanguage", publicName: "dataMultiLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, labelAddItem: { classPropertyName: "labelAddItem", publicName: "labelAddItem", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dataMultiLanguage: "dataMultiLanguageChange", outClick: "outClick", outFunctionControl: "outFunctionControl", outChangeValue: "outChangeValue" }, ngImport: i0, template: "<div class=\"mt-[4px]\">\n @for (item of dataMultiLanguage(); track item) {\n <div\n class=\"flex w-full\"\n [class.mt-[12px]]=\"!$first\">\n <div\n class=\"libs-ui-border-general\"\n [class.w-full]=\"dataMultiLanguage().length < 2\"\n [class.w-[calc(100%-28px)]]=\"dataMultiLanguage().length > 1\">\n @if (configHeader(); as configHeader) {\n <div class=\"flex bg-[#e6eef5] px-[12px] py-[4px]\">\n <div class=\"libs-ui-font-h6m h-[32px] flex items-center\">\n @let constHtmlTitle = configHeader.title ?? ' ';\n {{ constHtmlTitle | translate }}\n </div>\n <div\n (click)=\"handlerClick($event)\"\n class=\"pl-[8px]\">\n @if (configHeader.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: item; as itemMap) {\n <libs_ui-components-inputs-valid\n [(item)]=\"itemMap\"\n [dataType]=\"configHeader.type && configHeader.type === 'number' ? 'int' : 'string'\"\n [fieldNameBind]=\"langDefault()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"{ isRequired: configItems()[0].validRequired?.isRequired ?? false }\"\n [placeholder]=\"'i18n_enter_value'\"\n [acceptNegativeValue]=\"acceptNegativeValue() ?? true\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [maxValueNumber]=\"maxValueNumber()\"\n [fixedFloat]=\"15\"\n (outValueChange)=\"handlerChangeValue($event, 'input')\"\n (outFunctionsControl)=\"handlerFunctionsControlInputValid($event)\" />\n }\n </div>\n </div>\n <div class=\"px-[12px] pt-[8px] pb-[12px] flex w-full\">\n <libs_ui-components-inputs-multi_language\n class=\"w-full\"\n [singleLanguage]=\"singleLanguage() || false\"\n [multiLine]=\"false\"\n [titleField]=\"configItems()[0].titleField || ''\"\n [keyHeader]=\"configHeader.keyBindData ?? ''\"\n [placeholder]=\"'i18n_import_content'\"\n [classIncludeValue]=\"'libs-ui-font-h4r'\"\n [data]=\"dataMultiKey()[$index]\"\n [validRequired]=\"validRequiredWhenInputHasValue() || configItems()[0].validRequired\"\n [dataLanguage]=\"item\"\n [zIndex]=\"1203\"\n [acceptNegativeValue]=\"acceptNegativeValue() ?? true\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [viewType]=\"configItems()[0].type ? (configItems()[0].type === 'number' ? 'number' : configItems()[0].type === 'float' ? 'float' : 'text') : 'text'\"\n (outEventMultiLanguage)=\"handlerChangeValue()\"\n (outChangeValueInput)=\"handlerChangeValue()\"\n (outFunctionsControl)=\"handlerFunctionsControlInputLanguage($event)\" />\n </div>\n }\n </div>\n @if (!$first) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0 ml-[8px] mt-[12px]'\"\n (outClick)=\"handlerRemove($index)\" />\n }\n </div>\n }\n @if (!ignoreAdd()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n [label]=\"labelAddItem() || ''\"\n (outClick)=\"handlerAdd()\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsInputsMultiLanguageComponent, selector: "libs_ui-components-inputs-multi_language", inputs: ["zIndex", "viewType", "singleLanguage", "data", "validRequired", "ignoreAdd", "titleField", "keyHeader", "textArea", "placeholder", "extendClass", "extendClassContent", "viewPosition", "ignoreRemove", "validMaxLength", "validMinLength", "countCharacters", "viewContent", "classIncludeKey", "classIncludeValue", "dataLanguage", "multiLine", "readonly", "acceptNegativeValue", "valueUpDownNumber", "maxValueNumber", "onlyAcceptNegativeValue"], outputs: ["dataChange", "ignoreAddChange", "extendClassChange", "dataLanguageChange", "outEventMultiLanguage", "outChangeTypeLanguage", "outFunctionsControl", "outChangeValueInput"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
144
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: LibsUiComponentsInputsMultiLanguageItemsComponent, isStandalone: true, selector: "libs_ui-components-inputs-multi_language-items", inputs: { configItems: { classPropertyName: "configItems", publicName: "configItems", isSignal: true, isRequired: false, transformFunction: null }, dataMultiLanguage: { classPropertyName: "dataMultiLanguage", publicName: "dataMultiLanguage", isSignal: true, isRequired: false, transformFunction: null }, zIndex: { classPropertyName: "zIndex", publicName: "zIndex", isSignal: true, isRequired: false, transformFunction: null }, ignoreAdd: { classPropertyName: "ignoreAdd", publicName: "ignoreAdd", isSignal: true, isRequired: false, transformFunction: null }, labelAddItem: { classPropertyName: "labelAddItem", publicName: "labelAddItem", isSignal: true, isRequired: false, transformFunction: null }, singleLanguage: { classPropertyName: "singleLanguage", publicName: "singleLanguage", isSignal: true, isRequired: false, transformFunction: null }, acceptNegativeValue: { classPropertyName: "acceptNegativeValue", publicName: "acceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null }, valueUpDownNumber: { classPropertyName: "valueUpDownNumber", publicName: "valueUpDownNumber", isSignal: true, isRequired: false, transformFunction: null }, maxValueNumber: { classPropertyName: "maxValueNumber", publicName: "maxValueNumber", isSignal: true, isRequired: false, transformFunction: null }, onlyAcceptNegativeValue: { classPropertyName: "onlyAcceptNegativeValue", publicName: "onlyAcceptNegativeValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dataMultiLanguage: "dataMultiLanguageChange", outClick: "outClick", outFunctionControl: "outFunctionControl", outChangeValue: "outChangeValue" }, ngImport: i0, template: "<div class=\"mt-[4px]\">\n @for (item of dataMultiLanguage(); track item) {\n <div\n class=\"flex w-full\"\n [class.mt-[12px]]=\"!$first\">\n <div\n class=\"libs-ui-border-general\"\n [class.w-full]=\"dataMultiLanguage().length < 2\"\n [class.w-[calc(100%-28px)]]=\"dataMultiLanguage().length > 1\">\n @if (configHeader(); as configHeader) {\n <div class=\"flex bg-[#e6eef5] px-[12px] py-[4px]\">\n <div class=\"libs-ui-font-h6m h-[32px] flex items-center\">\n @let constHtmlTitle = configHeader.title ?? ' ';\n {{ constHtmlTitle | translate }}\n </div>\n <div\n (click)=\"handlerClick($event)\"\n class=\"pl-[8px]\">\n @if (configHeader.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: item; as itemMap) {\n <libs_ui-components-inputs-valid\n [(item)]=\"itemMap\"\n [dataType]=\"configHeader.type && configHeader.type === 'number' ? 'int' : 'string'\"\n [fieldNameBind]=\"langDefault()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"{ isRequired: configItems()[0].validRequired?.isRequired ?? false }\"\n [placeholder]=\"'i18n_enter_value'\"\n [acceptNegativeValue]=\"acceptNegativeValue() ?? true\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [maxValueNumber]=\"maxValueNumber()\"\n [fixedFloat]=\"15\"\n (outValueChange)=\"handlerChangeValue($event, 'input')\"\n (outFunctionsControl)=\"handlerFunctionsControlInputValid($event)\" />\n }\n </div>\n </div>\n <div class=\"px-[12px] pt-[8px] pb-[12px] flex w-full\">\n <libs_ui-components-inputs-multi_language\n class=\"w-full\"\n [singleLanguage]=\"singleLanguage() || false\"\n [multiLine]=\"false\"\n [titleField]=\"configItems()[0].titleField || ''\"\n [keyHeader]=\"configHeader.keyBindData ?? ''\"\n [placeholder]=\"'i18n_import_content'\"\n [classIncludeValue]=\"'libs-ui-font-h4r'\"\n [data]=\"dataMultiKey()[$index]\"\n [validRequired]=\"validRequiredWhenInputHasValue() || configItems()[0].validRequired\"\n [dataLanguage]=\"item\"\n [zIndex]=\"1203\"\n [acceptNegativeValue]=\"acceptNegativeValue() ?? true\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [viewType]=\"configItems()[0].type ? (configItems()[0].type === 'number' ? 'number' : configItems()[0].type === 'float' ? 'float' : 'text') : 'text'\"\n (outEventMultiLanguage)=\"handlerChangeValue()\"\n (outChangeValueInput)=\"handlerChangeValue()\"\n (outFunctionsControl)=\"handlerFunctionsControlInputLanguage($event)\" />\n </div>\n }\n </div>\n @if (!$first) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0 ml-[8px] mt-[12px]'\"\n (outClick)=\"handlerRemove($index)\" />\n }\n </div>\n }\n @if (!ignoreAdd()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n [label]=\"labelAddItem() || ''\"\n (outClick)=\"handlerAdd()\" />\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: LibsUiComponentsInputsMultiLanguageGetItemPipe, name: "LibsUiComponentsInputsMultiLanguageGetItemPipe" }, { kind: "component", type: LibsUiComponentsInputsValidComponent, selector: "libs_ui-components-inputs-valid", inputs: ["item", "labelConfig", "emitEmptyInDataTypeNumber", "ignoreBlockInputMaxValue", "fieldNameBind", "showCount", "typeComponentSelectItem", "valueComponentSelectItem", "disableComponentSelectItem", "tagInput", "dataType", "typeInput", "modeInput", "resetAutoCompletePassword", "textAreaEnterNotNewLine", "fixedFloat", "acceptNegativeValue", "valueUpDownNumber", "ignoreWidthInput100", "classIncludeInput", "classContainerInput", "readonly", "disable", "noBorder", "backgroundNone", "useColorModeExist", "placeholder", "keepPlaceholderOnly", "classContainerBottomInput", "autoRemoveEmoji", "defaultHeight", "maxHeightTextArea", "minHeightTextArea", "ignoreShowError", "borderError", "iconLeftClass", "popoverContentIconLeft", "iconRightClass", "popoverContentIconRight", "zIndexPopoverContent", "unitsLeft", "configUnitLeft", "keySelectedUnitLeft", "unitsRight", "configUnitRight", "keySelectedUnitRight", "maxValueNumber", "minValueNumber", "ignoreContentLeft", "ignoreContentRight", "isBaselineStyle", "valuePatternShowError", "validPattern", "validRequired", "validMinLength", "validMinValue", "validMaxValue", "validMaxLength", "functionValid", "maxLength", "positionMessageErrorStartInput", "classInclude", "resize", "templateLeftBottomInput", "templateRightBottomInput", "onlyAcceptNegativeValue", "autoAddZeroLessThan10InTypeInt", "maxLengthNumberCount", "classMessageErrorInclude", "ignoreStopPropagationEvent", "ignoreUnitRightClassReadOnly", "paddingRightCustomSpecific", "focusTimeOut", "debounceTimeValidate"], outputs: ["itemChange", "outValueChange", "outSelect", "outIconLeft", "outIconRight", "outClickButtonLabel", "outSwitchEventLabel", "outLabelRightClick", "outEnterInputEvent", "outHeightAreaChange", "outFunctionsControl", "outFocusAndBlur", "outChangeValueByButtonUpDown"] }, { kind: "component", type: LibsUiComponentsInputsMultiLanguageComponent, selector: "libs_ui-components-inputs-multi_language", inputs: ["optionsLanguage", "zIndex", "viewType", "singleLanguage", "data", "validRequired", "ignoreAdd", "titleField", "keyHeader", "textArea", "placeholder", "extendClass", "extendClassContent", "viewPosition", "ignoreRemove", "validMaxLength", "validMinLength", "countCharacters", "viewContent", "classIncludeKey", "classIncludeValue", "dataLanguage", "multiLine", "readonly", "acceptNegativeValue", "valueUpDownNumber", "maxValueNumber", "onlyAcceptNegativeValue", "validOneDefaultMultiLanguage"], outputs: ["dataChange", "ignoreAddChange", "extendClassChange", "dataLanguageChange", "outEventMultiLanguage", "outChangeTypeLanguage", "outFunctionsControl", "outChangeValueInput"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
145
145
|
}
|
|
146
146
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsMultiLanguageItemsComponent, decorators: [{
|
|
147
147
|
type: Component,
|
|
148
148
|
args: [{ selector: 'libs_ui-components-inputs-multi_language-items', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule, LibsUiComponentsInputsMultiLanguageGetItemPipe, LibsUiComponentsInputsValidComponent, LibsUiComponentsInputsMultiLanguageComponent, LibsUiComponentsButtonsButtonComponent], template: "<div class=\"mt-[4px]\">\n @for (item of dataMultiLanguage(); track item) {\n <div\n class=\"flex w-full\"\n [class.mt-[12px]]=\"!$first\">\n <div\n class=\"libs-ui-border-general\"\n [class.w-full]=\"dataMultiLanguage().length < 2\"\n [class.w-[calc(100%-28px)]]=\"dataMultiLanguage().length > 1\">\n @if (configHeader(); as configHeader) {\n <div class=\"flex bg-[#e6eef5] px-[12px] py-[4px]\">\n <div class=\"libs-ui-font-h6m h-[32px] flex items-center\">\n @let constHtmlTitle = configHeader.title ?? ' ';\n {{ constHtmlTitle | translate }}\n </div>\n <div\n (click)=\"handlerClick($event)\"\n class=\"pl-[8px]\">\n @if (configHeader.keyBindData | LibsUiComponentsInputsMultiLanguageGetItemPipe: item; as itemMap) {\n <libs_ui-components-inputs-valid\n [(item)]=\"itemMap\"\n [dataType]=\"configHeader.type && configHeader.type === 'number' ? 'int' : 'string'\"\n [fieldNameBind]=\"langDefault()\"\n [emitEmptyInDataTypeNumber]=\"true\"\n [validRequired]=\"{ isRequired: configItems()[0].validRequired?.isRequired ?? false }\"\n [placeholder]=\"'i18n_enter_value'\"\n [acceptNegativeValue]=\"acceptNegativeValue() ?? true\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [maxValueNumber]=\"maxValueNumber()\"\n [fixedFloat]=\"15\"\n (outValueChange)=\"handlerChangeValue($event, 'input')\"\n (outFunctionsControl)=\"handlerFunctionsControlInputValid($event)\" />\n }\n </div>\n </div>\n <div class=\"px-[12px] pt-[8px] pb-[12px] flex w-full\">\n <libs_ui-components-inputs-multi_language\n class=\"w-full\"\n [singleLanguage]=\"singleLanguage() || false\"\n [multiLine]=\"false\"\n [titleField]=\"configItems()[0].titleField || ''\"\n [keyHeader]=\"configHeader.keyBindData ?? ''\"\n [placeholder]=\"'i18n_import_content'\"\n [classIncludeValue]=\"'libs-ui-font-h4r'\"\n [data]=\"dataMultiKey()[$index]\"\n [validRequired]=\"validRequiredWhenInputHasValue() || configItems()[0].validRequired\"\n [dataLanguage]=\"item\"\n [zIndex]=\"1203\"\n [acceptNegativeValue]=\"acceptNegativeValue() ?? true\"\n [valueUpDownNumber]=\"valueUpDownNumber() || 1\"\n [maxValueNumber]=\"maxValueNumber()\"\n [onlyAcceptNegativeValue]=\"onlyAcceptNegativeValue()\"\n [viewType]=\"configItems()[0].type ? (configItems()[0].type === 'number' ? 'number' : configItems()[0].type === 'float' ? 'float' : 'text') : 'text'\"\n (outEventMultiLanguage)=\"handlerChangeValue()\"\n (outChangeValueInput)=\"handlerChangeValue()\"\n (outFunctionsControl)=\"handlerFunctionsControlInputLanguage($event)\" />\n </div>\n }\n </div>\n @if (!$first) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-custom'\"\n [buttonCustom]=\"{\n configStepColor: {\n text: '#071631',\n text_hover: '#ee2d41',\n text_active: '#ee2d41',\n text_disable: '071631',\n },\n rootColor: '#071631',\n }\"\n [iconOnlyType]=\"true\"\n [popover]=\"{ config: { content: 'i18n_delete', zIndex: 1205 } }\"\n [classIconLeft]=\"'libs-ui-icon-remove'\"\n [classInclude]=\"'!p-0 ml-[8px] mt-[12px]'\"\n (outClick)=\"handlerRemove($index)\" />\n }\n </div>\n }\n @if (!ignoreAdd()) {\n <libs_ui-components-buttons-button\n [type]=\"'button-link-primary'\"\n [classIconLeft]=\"'libs-ui-icon-add mr-[8px]'\"\n [classLabel]=\"'libs-ui-font-h5r'\"\n [classInclude]=\"'!px-0 mt-[8px]'\"\n [label]=\"labelAddItem() || ''\"\n (outClick)=\"handlerAdd()\" />\n }\n</div>\n" }]
|
|
149
149
|
}], ctorParameters: () => [] });
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvaXRlbXMvaXRlbXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvaXRlbXMvaXRlbXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SCxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQW1ELG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekksT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNGLE9BQU8sRUFBRSw4Q0FBOEMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFVeEYsTUFBTSxPQUFPLGlEQUFpRDtJQUM1RCw4REFBOEQ7SUFDcEQsWUFBWSxHQUFHLE1BQU0sQ0FBYSxFQUFFLENBQUMsQ0FBQztJQUN0QyxXQUFXLEdBQUcsTUFBTSxDQUFTLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELFlBQVksR0FBRyxNQUFNLENBQXlDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pFLGFBQWEsR0FBRyxNQUFNLENBQWlCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDOUQsOEJBQThCLEdBQUcsTUFBTSxDQUE2QixTQUFTLENBQUMsQ0FBQztJQUMvRSxVQUFVLEdBQUcsTUFBTSxDQUFxQixTQUFTLENBQUMsQ0FBQztJQUNuRCw0QkFBNEIsR0FBRyxNQUFNLENBQWlELEVBQUUsQ0FBQyxDQUFDO0lBQzFGLHlCQUF5QixHQUFHLE1BQU0sQ0FBeUMsRUFBRSxDQUFDLENBQUM7SUFFaEYsV0FBVyxHQUFHLEtBQUssQ0FBbUIsRUFBRSxDQUFDLENBQUM7SUFDMUMsaUJBQWlCLEdBQUcsS0FBSyxDQUE0QixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3pCLFNBQVMsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUM3QixZQUFZLEdBQUcsS0FBSyxFQUFVLENBQUM7SUFDL0IsY0FBYyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ2xDLG1CQUFtQixHQUFHLEtBQUssRUFBVyxDQUFDO0lBQ3ZDLGlCQUFpQixHQUFHLEtBQUssRUFBVSxDQUFDO0lBQ3BDLGNBQWMsR0FBRyxLQUFLLEVBQVUsQ0FBQztJQUNqQyx1QkFBdUIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUUzQyxRQUFRLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFDMUIsa0JBQWtCLEdBQUcsTUFBTSxFQUEyQyxDQUFDO0lBQ3ZFLGNBQWMsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUV6QztRQUNFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDdkMsU0FBUyxDQUFDLEdBQUcsRUFBRTtnQkFDYixJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDL0MsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNuRCxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNiLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDakMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUN6QyxJQUFJLFlBQVksSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7d0JBQzdDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEUsQ0FBQztnQkFDSCxDQUFDO2dCQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksV0FBVyxJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU87WUFDTCxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDakMsQ0FBQztJQUNKLENBQUM7SUFFUyxLQUFLLENBQUMsa0JBQWtCO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3ZDLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFUyxLQUFLLENBQUMsVUFBVTtRQUN4QixJQUFJLFlBQVksR0FBdUIsRUFBRSxDQUFDO1FBQzFDLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QyxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLFlBQVksR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDbkUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRVMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFhO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN2QixPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztRQUNwQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFUyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQVE7UUFDbkMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVTLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxLQUE4QztRQUNqRyxJQUFJLENBQUMsNEJBQTRCLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFUyxLQUFLLENBQUMsaUNBQWlDLENBQUMsS0FBc0M7UUFDdEYsSUFBSSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUTtRQUNwQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7UUFDM0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDcEMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNoQixDQUFDO1FBQ0gsQ0FBQztRQUNELEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxDQUFDLDRCQUE0QixFQUFFLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUyxLQUFLLENBQUMsT0FBTztRQUNyQixNQUFNLGlCQUFpQixHQUF5QixFQUFFLENBQUM7UUFDbkQsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsRUFBRSxDQUFDO1lBQzFELGlCQUFpQixDQUFDLElBQUksQ0FBRSxDQUFDLE1BQU0sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUF3QixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFDRCxzREFBc0Q7UUFDdEQsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRVMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLEtBQXVCLEVBQUUsSUFBYTtRQUN2RSxJQUFJLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFlLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1DQUFtQyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRVMsS0FBSyxDQUFDLG1DQUFtQztRQUNqRCxJQUFJLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7d0dBcEpVLGlEQUFpRDs0RkFBakQsaURBQWlELHV0RENqQjlELGtvSUF5RkEsMkNEMUVZLGVBQWUsdUZBQUUsOENBQThDLHVGQUFFLG9DQUFvQyxzMURBQUUsNENBQTRDLCtzQkFBRSxzQ0FBc0M7OzRGQUUxTCxpREFBaUQ7a0JBUjdELFNBQVM7K0JBRUUsZ0RBQWdELGNBRTlDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSw4Q0FBOEMsRUFBRSxvQ0FBb0MsRUFBRSw0Q0FBNEMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGVmZmVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBpc05pbCwgVXRpbHNDYWNoZSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VDb21wb25lbnQgfSBmcm9tICcuLi9tdWx0aS1sYW5ndWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUNvbmZpZ011bHRpTGFuZ3VhZ2VIZWFkZXIsIElEYXRhSXRlbSwgSURhdGFNdWx0aUxhbmd1YWdlLCBJSW5wdXRNdWx0aUxhbmd1YWdlRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL211bHRpLWxhbmd1YWdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlIH0gZnJvbSAnLi4vcGlwZXMvZ2V0LWl0ZW0ucGlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtbXVsdGlfbGFuZ3VhZ2UtaXRlbXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vaXRlbXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUl0ZW1zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvdGVjdGVkIGRhdGFNdWx0aUtleSA9IHNpZ25hbDxBcnJheTxhbnk+PihbXSk7XG4gIHByb3RlY3RlZCBsYW5nRGVmYXVsdCA9IHNpZ25hbDxzdHJpbmc+KFV0aWxzQ2FjaGUuZ2V0TGFuZygpKTtcbiAgcHJvdGVjdGVkIGNvbmZpZ0hlYWRlciA9IHNpZ25hbDxJQ29uZmlnTXVsdGlMYW5ndWFnZUhlYWRlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHZhbGlkUmVxdWlyZWQgPSBzaWduYWw8SVZhbGlkUmVxdWlyZWQ+KHsgaXNSZXF1aXJlZDogZmFsc2UgfSk7XG4gIHByb3RlY3RlZCB2YWxpZFJlcXVpcmVkV2hlbklucHV0SGFzVmFsdWUgPSBzaWduYWw8SVZhbGlkUmVxdWlyZWQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBkYXRhSGVhZGVyID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIG11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8QXJyYXk8SUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50Pj4oW10pO1xuICBwcm90ZWN0ZWQgaW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxBcnJheTxJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50Pj4oW10pO1xuXG4gIHJlYWRvbmx5IGNvbmZpZ0l0ZW1zID0gaW5wdXQ8QXJyYXk8SURhdGFJdGVtPj4oW10pO1xuICByZWFkb25seSBkYXRhTXVsdGlMYW5ndWFnZSA9IG1vZGVsPEFycmF5PElEYXRhTXVsdGlMYW5ndWFnZT4+KFt7fV0pO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUFkZCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQWRkSXRlbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2luZ2xlTGFuZ3VhZ2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsdWVVcERvd25OdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG1heFZhbHVlTnVtYmVyID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgb3V0Q2xpY2sgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVmFsdWUgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnSXRlbXMgPSB0aGlzLmNvbmZpZ0l0ZW1zKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoY29uZmlnSXRlbXMgJiYgY29uZmlnSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5jb25maWdIZWFkZXIuc2V0KGNvbmZpZ0l0ZW1zWzBdLmhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFNdWx0aUxhbmd1YWdlID0gdGhpcy5kYXRhTXVsdGlMYW5ndWFnZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKCFkYXRhTXVsdGlMYW5ndWFnZSB8fCAhZGF0YU11bHRpTGFuZ3VhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhTXVsdGlMYW5ndWFnZS5zZXQoW3t9XSk7XG4gICAgICAgICAgY29uc3QgY29uZmlnSGVhZGVyID0gdGhpcy5jb25maWdIZWFkZXIoKTtcbiAgICAgICAgICBpZiAoY29uZmlnSGVhZGVyICYmIGNvbmZpZ0hlYWRlci5kYXRhRGVmYXVsdCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhTXVsdGlMYW5ndWFnZS5zZXQoW2Nsb25lRGVlcChjb25maWdIZWFkZXIuZGF0YURlZmF1bHQpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFuZGxlckNvbmZpZ011bHRpKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgICBjb25zdCBjb25maWdJdGVtcyA9IHRoaXMuY29uZmlnSXRlbXMoKTtcbiAgICBpZiAoY29uZmlnSXRlbXMgJiYgY29uZmlnSXRlbXMubGVuZ3RoICYmIGNvbmZpZ0l0ZW1zWzBdLnZhbGlkUmVxdWlyZWQpIHtcbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZC5zZXQoY29uZmlnSXRlbXNbMF0udmFsaWRSZXF1aXJlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgZ2V0RGF0YTogdGhpcy5nZXREYXRhLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ29uZmlnTXVsdGkoKSB7XG4gICAgdGhpcy5kYXRhTXVsdGlLZXkuc2V0KFtdKTtcbiAgICB0aGlzLmRhdGFNdWx0aUxhbmd1YWdlKCkuZm9yRWFjaCgoKSA9PiB7XG4gICAgICBjb25zdCBjb25maWdJdGVtcyA9IHRoaXMuY29uZmlnSXRlbXMoKTtcbiAgICAgIGlmIChjb25maWdJdGVtcykge1xuICAgICAgICB0aGlzLmRhdGFNdWx0aUtleSgpLnB1c2goY29uZmlnSXRlbXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZGF0YU11bHRpS2V5LnVwZGF0ZSgoaXRlbXMpID0+IFsuLi5pdGVtc10pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJBZGQoKSB7XG4gICAgbGV0IGRhdGFMYW5ndWFnZTogSURhdGFNdWx0aUxhbmd1YWdlID0ge307XG4gICAgY29uc3QgY29uZmlnSGVhZGVyID0gdGhpcy5jb25maWdIZWFkZXIoKTtcbiAgICBpZiAoY29uZmlnSGVhZGVyKSB7XG4gICAgICBkYXRhTGFuZ3VhZ2UgPSBjbG9uZURlZXAoY29uZmlnSGVhZGVyLmRhdGFEZWZhdWx0KTtcbiAgICB9XG4gICAgdGhpcy5kYXRhTXVsdGlMYW5ndWFnZS51cGRhdGUoKGl0ZW1zKSA9PiBbLi4uaXRlbXMsIGRhdGFMYW5ndWFnZV0pO1xuICAgIHRoaXMuZGF0YU11bHRpS2V5LnVwZGF0ZSgoaXRlbXMpID0+IFsuLi5pdGVtcywgdGhpcy5jb25maWdJdGVtcygpXSk7XG4gICAgdGhpcy5oYW5kbGVyQ2hhbmdlVmFsdWUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRhdGFNdWx0aUxhbmd1YWdlLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICB9KTtcbiAgICB0aGlzLmhhbmRsZXJDaGFuZ2VWYWx1ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDbGljayhlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5vdXRDbGljay5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2xJbnB1dExhbmd1YWdlKGV2ZW50OiBJSW5wdXRNdWx0aUxhbmd1YWdlRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLm11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2wudXBkYXRlKChpdGVtcykgPT4gWy4uLml0ZW1zLCBldmVudF0pO1xuICAgIGNvbnNvbGUubG9nKHRoaXMubXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25zQ29udHJvbElucHV0VmFsaWQoZXZlbnQ6IElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2wudXBkYXRlKChpdGVtcykgPT4gWy4uLml0ZW1zLCBldmVudF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIHRoaXMuY2hlY2tWYWxpZFJlcXVpcmVkV2hlbklucHV0SGFzVmFsdWUoKTtcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLm11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2woKSkge1xuICAgICAgaWYgKCEoYXdhaXQgY29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldERhdGEoKTogUHJvbWlzZTxJRGF0YU11bHRpTGFuZ3VhZ2VbXT4ge1xuICAgIGNvbnN0IGRhdGFNdWx0aUxhbmd1YWdlOiBJRGF0YU11bHRpTGFuZ3VhZ2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLm11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2woKSkge1xuICAgICAgZGF0YU11bHRpTGFuZ3VhZ2UucHVzaCgoKGF3YWl0IGVsZW1lbnQuZ2V0RGF0YSgpKSBhcyBJRGF0YU11bHRpTGFuZ3VhZ2UpIHx8IHt9KTtcbiAgICB9XG4gICAgLy8gdGhpcy5kYXRhTXVsdGlMYW5ndWFnZS51cGRhdGUoaXRlbXMgPT4gWy4uLml0ZW1zXSk7XG4gICAgcmV0dXJuIGRhdGFNdWx0aUxhbmd1YWdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDaGFuZ2VWYWx1ZSh2YWx1ZT86IHN0cmluZyB8IG51bWJlciwgdHlwZT86IHN0cmluZykge1xuICAgIGlmICh0eXBlID09PSAnaW5wdXQnKSB7XG4gICAgICB0aGlzLmRhdGFIZWFkZXIuc2V0KHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tWYWxpZFJlcXVpcmVkV2hlbklucHV0SGFzVmFsdWUoKTtcbiAgICB0aGlzLm91dENoYW5nZVZhbHVlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjaGVja1ZhbGlkUmVxdWlyZWRXaGVuSW5wdXRIYXNWYWx1ZSgpIHtcbiAgICB0aGlzLnZhbGlkUmVxdWlyZWRXaGVuSW5wdXRIYXNWYWx1ZS5zZXQodW5kZWZpbmVkKTtcbiAgICBpZiAoIWlzTmlsKHRoaXMuZGF0YUhlYWRlcigpKSkge1xuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkV2hlbklucHV0SGFzVmFsdWUuc2V0KHsgaXNSZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtdC1bNHB4XVwiPlxuICBAZm9yIChpdGVtIG9mIGRhdGFNdWx0aUxhbmd1YWdlKCk7IHRyYWNrIGl0ZW0pIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggdy1mdWxsXCJcbiAgICAgIFtjbGFzcy5tdC1bMTJweF1dPVwiISRmaXJzdFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImxpYnMtdWktYm9yZGVyLWdlbmVyYWxcIlxuICAgICAgICBbY2xhc3Mudy1mdWxsXT1cImRhdGFNdWx0aUxhbmd1YWdlKCkubGVuZ3RoIDwgMlwiXG4gICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMjhweCldXT1cImRhdGFNdWx0aUxhbmd1YWdlKCkubGVuZ3RoID4gMVwiPlxuICAgICAgICBAaWYgKGNvbmZpZ0hlYWRlcigpOyBhcyBjb25maWdIZWFkZXIpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBiZy1bI2U2ZWVmNV0gcHgtWzEycHhdIHB5LVs0cHhdXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg2bSBoLVszMnB4XSBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFRpdGxlID0gY29uZmlnSGVhZGVyLnRpdGxlID8/ICcgJztcbiAgICAgICAgICAgICAge3sgY29uc3RIdG1sVGl0bGUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cInBsLVs4cHhdXCI+XG4gICAgICAgICAgICAgIEBpZiAoY29uZmlnSGVhZGVyLmtleUJpbmREYXRhIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZTogaXRlbTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgW2RhdGFUeXBlXT1cImNvbmZpZ0hlYWRlci50eXBlICYmIGNvbmZpZ0hlYWRlci50eXBlID09PSAnbnVtYmVyJyA/ICdpbnQnIDogJ3N0cmluZydcIlxuICAgICAgICAgICAgICAgICAgW2ZpZWxkTmFtZUJpbmRdPVwibGFuZ0RlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cInsgaXNSZXF1aXJlZDogY29uZmlnSXRlbXMoKVswXS52YWxpZFJlcXVpcmVkPy5pc1JlcXVpcmVkID8/IGZhbHNlIH1cIlxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidpMThuX2VudGVyX3ZhbHVlJ1wiXG4gICAgICAgICAgICAgICAgICBbYWNjZXB0TmVnYXRpdmVWYWx1ZV09XCJhY2NlcHROZWdhdGl2ZVZhbHVlKCkgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKSB8fCAxXCJcbiAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCJtYXhWYWx1ZU51bWJlcigpXCJcbiAgICAgICAgICAgICAgICAgIFtmaXhlZEZsb2F0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgIChvdXRWYWx1ZUNoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVmFsdWUoJGV2ZW50LCAnaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbElucHV0VmFsaWQoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC1bMTJweF0gcHQtWzhweF0gcGItWzEycHhdIGZsZXggdy1mdWxsXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1tdWx0aV9sYW5ndWFnZVxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgICAgIFtzaW5nbGVMYW5ndWFnZV09XCJzaW5nbGVMYW5ndWFnZSgpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW211bHRpTGluZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFt0aXRsZUZpZWxkXT1cImNvbmZpZ0l0ZW1zKClbMF0udGl0bGVGaWVsZCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtrZXlIZWFkZXJdPVwiY29uZmlnSGVhZGVyLmtleUJpbmREYXRhID8/ICcnXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidpMThuX2ltcG9ydF9jb250ZW50J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVWYWx1ZV09XCInbGlicy11aS1mb250LWg0cidcIlxuICAgICAgICAgICAgICBbZGF0YV09XCJkYXRhTXVsdGlLZXkoKVskaW5kZXhdXCJcbiAgICAgICAgICAgICAgW3ZhbGlkUmVxdWlyZWRdPVwidmFsaWRSZXF1aXJlZFdoZW5JbnB1dEhhc1ZhbHVlKCkgfHwgY29uZmlnSXRlbXMoKVswXS52YWxpZFJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgW2RhdGFMYW5ndWFnZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCIxMjAzXCJcbiAgICAgICAgICAgICAgW2FjY2VwdE5lZ2F0aXZlVmFsdWVdPVwiYWNjZXB0TmVnYXRpdmVWYWx1ZSgpID8/IHRydWVcIlxuICAgICAgICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKSB8fCAxXCJcbiAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIm1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICAgICAgICBbb25seUFjY2VwdE5lZ2F0aXZlVmFsdWVdPVwib25seUFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgIFt2aWV3VHlwZV09XCJjb25maWdJdGVtcygpWzBdLnR5cGUgPyAoY29uZmlnSXRlbXMoKVswXS50eXBlID09PSAnbnVtYmVyJyA/ICdudW1iZXInIDogY29uZmlnSXRlbXMoKVswXS50eXBlID09PSAnZmxvYXQnID8gJ2Zsb2F0JyA6ICd0ZXh0JykgOiAndGV4dCdcIlxuICAgICAgICAgICAgICAob3V0RXZlbnRNdWx0aUxhbmd1YWdlKT1cImhhbmRsZXJDaGFuZ2VWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZVZhbHVlSW5wdXQpPVwiaGFuZGxlckNoYW5nZVZhbHVlKClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbElucHV0TGFuZ3VhZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmICghJGZpcnN0KSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstY3VzdG9tJ1wiXG4gICAgICAgICAgW2J1dHRvbkN1c3RvbV09XCJ7XG4gICAgICAgICAgICBjb25maWdTdGVwQ29sb3I6IHtcbiAgICAgICAgICAgICAgdGV4dDogJyMwNzE2MzEnLFxuICAgICAgICAgICAgICB0ZXh0X2hvdmVyOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICAgIHRleHRfYWN0aXZlOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICAgIHRleHRfZGlzYWJsZTogJzA3MTYzMScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm9vdENvbG9yOiAnIzA3MTYzMScsXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiAnaTE4bl9kZWxldGUnLCB6SW5kZXg6IDEyMDUgfSB9XCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLXJlbW92ZSdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAgbWwtWzhweF0gbXQtWzEycHhdJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJSZW1vdmUoJGluZGV4KVwiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmICghaWdub3JlQWRkKCkpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQgbXItWzhweF0nXCJcbiAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cIichcHgtMCBtdC1bOHB4XSdcIlxuICAgICAgW2xhYmVsXT1cImxhYmVsQWRkSXRlbSgpIHx8ICcnXCJcbiAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQWRkKClcIiAvPlxuICB9XG48L2Rpdj5cbiJdfQ==
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvaXRlbXMvaXRlbXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9tdWx0aS1sYW5ndWFnZS9zcmMvaXRlbXMvaXRlbXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1SCxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQW1ELG9DQUFvQyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDekksT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSw0Q0FBNEMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNGLE9BQU8sRUFBRSw4Q0FBOEMsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7QUFVeEYsTUFBTSxPQUFPLGlEQUFpRDtJQUM1RCw4REFBOEQ7SUFDcEQsWUFBWSxHQUFHLE1BQU0sQ0FBYSxFQUFFLENBQUMsQ0FBQztJQUN0QyxXQUFXLEdBQUcsTUFBTSxDQUFTLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELFlBQVksR0FBRyxNQUFNLENBQXlDLFNBQVMsQ0FBQyxDQUFDO0lBQ3pFLGFBQWEsR0FBRyxNQUFNLENBQWlCLEVBQUUsVUFBVSxFQUFFLEtB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QUMsOEJBQThCLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7d0dBcEpVLGlEQUFpRDs0RkFBakQsaURBQWlELHV0RENqQjlELGtvSUF5RkEsMkNEMUVZLGVBQWUsdUZBQUUsOENBQThDLHVGQUFFLG9DQUFvQyxzMURBQUUsNENBQTRDLGt3QkFBRSxzQ0FBc0M7OzRGQUUxTCxpREFBaUQ7a0JBUjdELFNBQVM7K0JBRUUsZ0RBQWdELGNBRTlDLElBQUksbUJBQ0MsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLGVBQWUsRUFBRSw4Q0FBOEMsRUFBRSxvQ0FBb0MsRUFBRSw0Q0FBNEMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGVmZmVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB1bnRyYWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1idXR0b25zLWJ1dHRvbic7XG5pbXBvcnQgeyBJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50LCBJVmFsaWRSZXF1aXJlZCwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50IH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1pbnB1dHMtdmFsaWQnO1xuaW1wb3J0IHsgY2xvbmVEZWVwLCBpc05pbCwgVXRpbHNDYWNoZSB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VDb21wb25lbnQgfSBmcm9tICcuLi9tdWx0aS1sYW5ndWFnZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSUNvbmZpZ011bHRpTGFuZ3VhZ2VIZWFkZXIsIElEYXRhSXRlbSwgSURhdGFNdWx0aUxhbmd1YWdlLCBJSW5wdXRNdWx0aUxhbmd1YWdlRnVuY3Rpb25Db250cm9sRXZlbnQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL211bHRpLWxhbmd1YWdlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUdldEl0ZW1QaXBlIH0gZnJvbSAnLi4vcGlwZXMvZ2V0LWl0ZW0ucGlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2xpYnNfdWktY29tcG9uZW50cy1pbnB1dHMtbXVsdGlfbGFuZ3VhZ2UtaXRlbXMnLFxuICB0ZW1wbGF0ZVVybDogJy4vaXRlbXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZSwgTGlic1VpQ29tcG9uZW50c0lucHV0c1ZhbGlkQ29tcG9uZW50LCBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzTXVsdGlMYW5ndWFnZUl0ZW1zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJvdGVjdGVkIGRhdGFNdWx0aUtleSA9IHNpZ25hbDxBcnJheTxhbnk+PihbXSk7XG4gIHByb3RlY3RlZCBsYW5nRGVmYXVsdCA9IHNpZ25hbDxzdHJpbmc+KFV0aWxzQ2FjaGUuZ2V0TGFuZygpKTtcbiAgcHJvdGVjdGVkIGNvbmZpZ0hlYWRlciA9IHNpZ25hbDxJQ29uZmlnTXVsdGlMYW5ndWFnZUhlYWRlciB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIHZhbGlkUmVxdWlyZWQgPSBzaWduYWw8SVZhbGlkUmVxdWlyZWQ+KHsgaXNSZXF1aXJlZDogZmFsc2UgfSk7XG4gIHByb3RlY3RlZCB2YWxpZFJlcXVpcmVkV2hlbklucHV0SGFzVmFsdWUgPSBzaWduYWw8SVZhbGlkUmVxdWlyZWQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByb3RlY3RlZCBkYXRhSGVhZGVyID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcbiAgcHJvdGVjdGVkIG11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2wgPSBzaWduYWw8QXJyYXk8SUlucHV0TXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbEV2ZW50Pj4oW10pO1xuICBwcm90ZWN0ZWQgaW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbCA9IHNpZ25hbDxBcnJheTxJSW5wdXRWYWxpZEZ1bmN0aW9uQ29udHJvbEV2ZW50Pj4oW10pO1xuXG4gIHJlYWRvbmx5IGNvbmZpZ0l0ZW1zID0gaW5wdXQ8QXJyYXk8SURhdGFJdGVtPj4oW10pO1xuICByZWFkb25seSBkYXRhTXVsdGlMYW5ndWFnZSA9IG1vZGVsPEFycmF5PElEYXRhTXVsdGlMYW5ndWFnZT4+KFt7fV0pO1xuICByZWFkb25seSB6SW5kZXggPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGlnbm9yZUFkZCA9IGlucHV0PGJvb2xlYW4+KCk7XG4gIHJlYWRvbmx5IGxhYmVsQWRkSXRlbSA9IGlucHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgc2luZ2xlTGFuZ3VhZ2UgPSBpbnB1dDxib29sZWFuPigpO1xuICByZWFkb25seSBhY2NlcHROZWdhdGl2ZVZhbHVlID0gaW5wdXQ8Ym9vbGVhbj4oKTtcbiAgcmVhZG9ubHkgdmFsdWVVcERvd25OdW1iZXIgPSBpbnB1dDxudW1iZXI+KCk7XG4gIHJlYWRvbmx5IG1heFZhbHVlTnVtYmVyID0gaW5wdXQ8bnVtYmVyPigpO1xuICByZWFkb25seSBvbmx5QWNjZXB0TmVnYXRpdmVWYWx1ZSA9IGlucHV0PGJvb2xlYW4+KCk7XG5cbiAgcmVhZG9ubHkgb3V0Q2xpY2sgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgb3V0RnVuY3Rpb25Db250cm9sID0gb3V0cHV0PElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudD4oKTtcbiAgcmVhZG9ubHkgb3V0Q2hhbmdlVmFsdWUgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3QgY29uZmlnSXRlbXMgPSB0aGlzLmNvbmZpZ0l0ZW1zKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4ge1xuICAgICAgICBpZiAoY29uZmlnSXRlbXMgJiYgY29uZmlnSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5jb25maWdIZWFkZXIuc2V0KGNvbmZpZ0l0ZW1zWzBdLmhlYWRlcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFNdWx0aUxhbmd1YWdlID0gdGhpcy5kYXRhTXVsdGlMYW5ndWFnZSgpO1xuICAgICAgdW50cmFja2VkKCgpID0+IHtcbiAgICAgICAgaWYgKCFkYXRhTXVsdGlMYW5ndWFnZSB8fCAhZGF0YU11bHRpTGFuZ3VhZ2UubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5kYXRhTXVsdGlMYW5ndWFnZS5zZXQoW3t9XSk7XG4gICAgICAgICAgY29uc3QgY29uZmlnSGVhZGVyID0gdGhpcy5jb25maWdIZWFkZXIoKTtcbiAgICAgICAgICBpZiAoY29uZmlnSGVhZGVyICYmIGNvbmZpZ0hlYWRlci5kYXRhRGVmYXVsdCkge1xuICAgICAgICAgICAgdGhpcy5kYXRhTXVsdGlMYW5ndWFnZS5zZXQoW2Nsb25lRGVlcChjb25maWdIZWFkZXIuZGF0YURlZmF1bHQpXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFuZGxlckNvbmZpZ011bHRpKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMub3V0RnVuY3Rpb25Db250cm9sLmVtaXQodGhpcy5GdW5jdGlvbnNDb250cm9sKTtcbiAgICBjb25zdCBjb25maWdJdGVtcyA9IHRoaXMuY29uZmlnSXRlbXMoKTtcbiAgICBpZiAoY29uZmlnSXRlbXMgJiYgY29uZmlnSXRlbXMubGVuZ3RoICYmIGNvbmZpZ0l0ZW1zWzBdLnZhbGlkUmVxdWlyZWQpIHtcbiAgICAgIHRoaXMudmFsaWRSZXF1aXJlZC5zZXQoY29uZmlnSXRlbXNbMF0udmFsaWRSZXF1aXJlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBGdW5jdGlvbnNDb250cm9sKCk6IElJbnB1dE11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2xFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNoZWNrSXNWYWxpZDogdGhpcy52YWxpZGF0ZS5iaW5kKHRoaXMpLFxuICAgICAgZ2V0RGF0YTogdGhpcy5nZXREYXRhLmJpbmQodGhpcyksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyQ29uZmlnTXVsdGkoKSB7XG4gICAgdGhpcy5kYXRhTXVsdGlLZXkuc2V0KFtdKTtcbiAgICB0aGlzLmRhdGFNdWx0aUxhbmd1YWdlKCkuZm9yRWFjaCgoKSA9PiB7XG4gICAgICBjb25zdCBjb25maWdJdGVtcyA9IHRoaXMuY29uZmlnSXRlbXMoKTtcbiAgICAgIGlmIChjb25maWdJdGVtcykge1xuICAgICAgICB0aGlzLmRhdGFNdWx0aUtleSgpLnB1c2goY29uZmlnSXRlbXMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuZGF0YU11bHRpS2V5LnVwZGF0ZSgoaXRlbXMpID0+IFsuLi5pdGVtc10pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJBZGQoKSB7XG4gICAgbGV0IGRhdGFMYW5ndWFnZTogSURhdGFNdWx0aUxhbmd1YWdlID0ge307XG4gICAgY29uc3QgY29uZmlnSGVhZGVyID0gdGhpcy5jb25maWdIZWFkZXIoKTtcbiAgICBpZiAoY29uZmlnSGVhZGVyKSB7XG4gICAgICBkYXRhTGFuZ3VhZ2UgPSBjbG9uZURlZXAoY29uZmlnSGVhZGVyLmRhdGFEZWZhdWx0KTtcbiAgICB9XG4gICAgdGhpcy5kYXRhTXVsdGlMYW5ndWFnZS51cGRhdGUoKGl0ZW1zKSA9PiBbLi4uaXRlbXMsIGRhdGFMYW5ndWFnZV0pO1xuICAgIHRoaXMuZGF0YU11bHRpS2V5LnVwZGF0ZSgoaXRlbXMpID0+IFsuLi5pdGVtcywgdGhpcy5jb25maWdJdGVtcygpXSk7XG4gICAgdGhpcy5oYW5kbGVyQ2hhbmdlVmFsdWUoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyUmVtb3ZlKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmRhdGFNdWx0aUxhbmd1YWdlLnVwZGF0ZSgoaXRlbXMpID0+IHtcbiAgICAgIGl0ZW1zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICByZXR1cm4gWy4uLml0ZW1zXTtcbiAgICB9KTtcbiAgICB0aGlzLmhhbmRsZXJDaGFuZ2VWYWx1ZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDbGljayhlOiBFdmVudCkge1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5vdXRDbGljay5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlckZ1bmN0aW9uc0NvbnRyb2xJbnB1dExhbmd1YWdlKGV2ZW50OiBJSW5wdXRNdWx0aUxhbmd1YWdlRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLm11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2wudXBkYXRlKChpdGVtcykgPT4gWy4uLml0ZW1zLCBldmVudF0pO1xuICAgIGNvbnNvbGUubG9nKHRoaXMubXVsdGlMYW5ndWFnZUZ1bmN0aW9uQ29udHJvbCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyRnVuY3Rpb25zQ29udHJvbElucHV0VmFsaWQoZXZlbnQ6IElJbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sRXZlbnQpIHtcbiAgICB0aGlzLmlucHV0VmFsaWRGdW5jdGlvbkNvbnRyb2wudXBkYXRlKChpdGVtcykgPT4gWy4uLml0ZW1zLCBldmVudF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB2YWxpZGF0ZSgpIHtcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xuICAgIHRoaXMuY2hlY2tWYWxpZFJlcXVpcmVkV2hlbklucHV0SGFzVmFsdWUoKTtcbiAgICBmb3IgKGNvbnN0IGNvbnRyb2wgb2YgdGhpcy5pbnB1dFZhbGlkRnVuY3Rpb25Db250cm9sKCkpIHtcbiAgICAgIGlmICghKGF3YWl0IGNvbnRyb2wuY2hlY2tJc1ZhbGlkKCkpKSB7XG4gICAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgY29udHJvbCBvZiB0aGlzLm11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2woKSkge1xuICAgICAgaWYgKCEoYXdhaXQgY29udHJvbC5jaGVja0lzVmFsaWQoKSkpIHtcbiAgICAgICAgdmFsaWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGdldERhdGEoKTogUHJvbWlzZTxJRGF0YU11bHRpTGFuZ3VhZ2VbXT4ge1xuICAgIGNvbnN0IGRhdGFNdWx0aUxhbmd1YWdlOiBJRGF0YU11bHRpTGFuZ3VhZ2VbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0aGlzLm11bHRpTGFuZ3VhZ2VGdW5jdGlvbkNvbnRyb2woKSkge1xuICAgICAgZGF0YU11bHRpTGFuZ3VhZ2UucHVzaCgoKGF3YWl0IGVsZW1lbnQuZ2V0RGF0YSgpKSBhcyBJRGF0YU11bHRpTGFuZ3VhZ2UpIHx8IHt9KTtcbiAgICB9XG4gICAgLy8gdGhpcy5kYXRhTXVsdGlMYW5ndWFnZS51cGRhdGUoaXRlbXMgPT4gWy4uLml0ZW1zXSk7XG4gICAgcmV0dXJuIGRhdGFNdWx0aUxhbmd1YWdlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJDaGFuZ2VWYWx1ZSh2YWx1ZT86IHN0cmluZyB8IG51bWJlciwgdHlwZT86IHN0cmluZykge1xuICAgIGlmICh0eXBlID09PSAnaW5wdXQnKSB7XG4gICAgICB0aGlzLmRhdGFIZWFkZXIuc2V0KHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIHRoaXMuY2hlY2tWYWxpZFJlcXVpcmVkV2hlbklucHV0SGFzVmFsdWUoKTtcbiAgICB0aGlzLm91dENoYW5nZVZhbHVlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjaGVja1ZhbGlkUmVxdWlyZWRXaGVuSW5wdXRIYXNWYWx1ZSgpIHtcbiAgICB0aGlzLnZhbGlkUmVxdWlyZWRXaGVuSW5wdXRIYXNWYWx1ZS5zZXQodW5kZWZpbmVkKTtcbiAgICBpZiAoIWlzTmlsKHRoaXMuZGF0YUhlYWRlcigpKSkge1xuICAgICAgdGhpcy52YWxpZFJlcXVpcmVkV2hlbklucHV0SGFzVmFsdWUuc2V0KHsgaXNSZXF1aXJlZDogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtdC1bNHB4XVwiPlxuICBAZm9yIChpdGVtIG9mIGRhdGFNdWx0aUxhbmd1YWdlKCk7IHRyYWNrIGl0ZW0pIHtcbiAgICA8ZGl2XG4gICAgICBjbGFzcz1cImZsZXggdy1mdWxsXCJcbiAgICAgIFtjbGFzcy5tdC1bMTJweF1dPVwiISRmaXJzdFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzcz1cImxpYnMtdWktYm9yZGVyLWdlbmVyYWxcIlxuICAgICAgICBbY2xhc3Mudy1mdWxsXT1cImRhdGFNdWx0aUxhbmd1YWdlKCkubGVuZ3RoIDwgMlwiXG4gICAgICAgIFtjbGFzcy53LVtjYWxjKDEwMCUtMjhweCldXT1cImRhdGFNdWx0aUxhbmd1YWdlKCkubGVuZ3RoID4gMVwiPlxuICAgICAgICBAaWYgKGNvbmZpZ0hlYWRlcigpOyBhcyBjb25maWdIZWFkZXIpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBiZy1bI2U2ZWVmNV0gcHgtWzEycHhdIHB5LVs0cHhdXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlicy11aS1mb250LWg2bSBoLVszMnB4XSBmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICBAbGV0IGNvbnN0SHRtbFRpdGxlID0gY29uZmlnSGVhZGVyLnRpdGxlID8/ICcgJztcbiAgICAgICAgICAgICAge3sgY29uc3RIdG1sVGl0bGUgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlckNsaWNrKCRldmVudClcIlxuICAgICAgICAgICAgICBjbGFzcz1cInBsLVs4cHhdXCI+XG4gICAgICAgICAgICAgIEBpZiAoY29uZmlnSGVhZGVyLmtleUJpbmREYXRhIHwgTGlic1VpQ29tcG9uZW50c0lucHV0c011bHRpTGFuZ3VhZ2VHZXRJdGVtUGlwZTogaXRlbTsgYXMgaXRlbU1hcCkge1xuICAgICAgICAgICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtaW5wdXRzLXZhbGlkXG4gICAgICAgICAgICAgICAgICBbKGl0ZW0pXT1cIml0ZW1NYXBcIlxuICAgICAgICAgICAgICAgICAgW2RhdGFUeXBlXT1cImNvbmZpZ0hlYWRlci50eXBlICYmIGNvbmZpZ0hlYWRlci50eXBlID09PSAnbnVtYmVyJyA/ICdpbnQnIDogJ3N0cmluZydcIlxuICAgICAgICAgICAgICAgICAgW2ZpZWxkTmFtZUJpbmRdPVwibGFuZ0RlZmF1bHQoKVwiXG4gICAgICAgICAgICAgICAgICBbZW1pdEVtcHR5SW5EYXRhVHlwZU51bWJlcl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIFt2YWxpZFJlcXVpcmVkXT1cInsgaXNSZXF1aXJlZDogY29uZmlnSXRlbXMoKVswXS52YWxpZFJlcXVpcmVkPy5pc1JlcXVpcmVkID8/IGZhbHNlIH1cIlxuICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidpMThuX2VudGVyX3ZhbHVlJ1wiXG4gICAgICAgICAgICAgICAgICBbYWNjZXB0TmVnYXRpdmVWYWx1ZV09XCJhY2NlcHROZWdhdGl2ZVZhbHVlKCkgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKSB8fCAxXCJcbiAgICAgICAgICAgICAgICAgIFttYXhWYWx1ZU51bWJlcl09XCJtYXhWYWx1ZU51bWJlcigpXCJcbiAgICAgICAgICAgICAgICAgIFtmaXhlZEZsb2F0XT1cIjE1XCJcbiAgICAgICAgICAgICAgICAgIChvdXRWYWx1ZUNoYW5nZSk9XCJoYW5kbGVyQ2hhbmdlVmFsdWUoJGV2ZW50LCAnaW5wdXQnKVwiXG4gICAgICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbElucHV0VmFsaWQoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJweC1bMTJweF0gcHQtWzhweF0gcGItWzEycHhdIGZsZXggdy1mdWxsXCI+XG4gICAgICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWlucHV0cy1tdWx0aV9sYW5ndWFnZVxuICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgICAgIFtzaW5nbGVMYW5ndWFnZV09XCJzaW5nbGVMYW5ndWFnZSgpIHx8IGZhbHNlXCJcbiAgICAgICAgICAgICAgW211bHRpTGluZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFt0aXRsZUZpZWxkXT1cImNvbmZpZ0l0ZW1zKClbMF0udGl0bGVGaWVsZCB8fCAnJ1wiXG4gICAgICAgICAgICAgIFtrZXlIZWFkZXJdPVwiY29uZmlnSGVhZGVyLmtleUJpbmREYXRhID8/ICcnXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidpMThuX2ltcG9ydF9jb250ZW50J1wiXG4gICAgICAgICAgICAgIFtjbGFzc0luY2x1ZGVWYWx1ZV09XCInbGlicy11aS1mb250LWg0cidcIlxuICAgICAgICAgICAgICBbZGF0YV09XCJkYXRhTXVsdGlLZXkoKVskaW5kZXhdXCJcbiAgICAgICAgICAgICAgW3ZhbGlkUmVxdWlyZWRdPVwidmFsaWRSZXF1aXJlZFdoZW5JbnB1dEhhc1ZhbHVlKCkgfHwgY29uZmlnSXRlbXMoKVswXS52YWxpZFJlcXVpcmVkXCJcbiAgICAgICAgICAgICAgW2RhdGFMYW5ndWFnZV09XCJpdGVtXCJcbiAgICAgICAgICAgICAgW3pJbmRleF09XCIxMjAzXCJcbiAgICAgICAgICAgICAgW2FjY2VwdE5lZ2F0aXZlVmFsdWVdPVwiYWNjZXB0TmVnYXRpdmVWYWx1ZSgpID8/IHRydWVcIlxuICAgICAgICAgICAgICBbdmFsdWVVcERvd25OdW1iZXJdPVwidmFsdWVVcERvd25OdW1iZXIoKSB8fCAxXCJcbiAgICAgICAgICAgICAgW21heFZhbHVlTnVtYmVyXT1cIm1heFZhbHVlTnVtYmVyKClcIlxuICAgICAgICAgICAgICBbb25seUFjY2VwdE5lZ2F0aXZlVmFsdWVdPVwib25seUFjY2VwdE5lZ2F0aXZlVmFsdWUoKVwiXG4gICAgICAgICAgICAgIFt2aWV3VHlwZV09XCJjb25maWdJdGVtcygpWzBdLnR5cGUgPyAoY29uZmlnSXRlbXMoKVswXS50eXBlID09PSAnbnVtYmVyJyA/ICdudW1iZXInIDogY29uZmlnSXRlbXMoKVswXS50eXBlID09PSAnZmxvYXQnID8gJ2Zsb2F0JyA6ICd0ZXh0JykgOiAndGV4dCdcIlxuICAgICAgICAgICAgICAob3V0RXZlbnRNdWx0aUxhbmd1YWdlKT1cImhhbmRsZXJDaGFuZ2VWYWx1ZSgpXCJcbiAgICAgICAgICAgICAgKG91dENoYW5nZVZhbHVlSW5wdXQpPVwiaGFuZGxlckNoYW5nZVZhbHVlKClcIlxuICAgICAgICAgICAgICAob3V0RnVuY3Rpb25zQ29udHJvbCk9XCJoYW5kbGVyRnVuY3Rpb25zQ29udHJvbElucHV0TGFuZ3VhZ2UoJGV2ZW50KVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgQGlmICghJGZpcnN0KSB7XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstY3VzdG9tJ1wiXG4gICAgICAgICAgW2J1dHRvbkN1c3RvbV09XCJ7XG4gICAgICAgICAgICBjb25maWdTdGVwQ29sb3I6IHtcbiAgICAgICAgICAgICAgdGV4dDogJyMwNzE2MzEnLFxuICAgICAgICAgICAgICB0ZXh0X2hvdmVyOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICAgIHRleHRfYWN0aXZlOiAnI2VlMmQ0MScsXG4gICAgICAgICAgICAgIHRleHRfZGlzYWJsZTogJzA3MTYzMScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm9vdENvbG9yOiAnIzA3MTYzMScsXG4gICAgICAgICAgfVwiXG4gICAgICAgICAgW2ljb25Pbmx5VHlwZV09XCJ0cnVlXCJcbiAgICAgICAgICBbcG9wb3Zlcl09XCJ7IGNvbmZpZzogeyBjb250ZW50OiAnaTE4bl9kZWxldGUnLCB6SW5kZXg6IDEyMDUgfSB9XCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLXJlbW92ZSdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLTAgbWwtWzhweF0gbXQtWzEycHhdJ1wiXG4gICAgICAgICAgKG91dENsaWNrKT1cImhhbmRsZXJSZW1vdmUoJGluZGV4KVwiIC8+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbiAgQGlmICghaWdub3JlQWRkKCkpIHtcbiAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstcHJpbWFyeSdcIlxuICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiJ2xpYnMtdWktaWNvbi1hZGQgbXItWzhweF0nXCJcbiAgICAgIFtjbGFzc0xhYmVsXT1cIidsaWJzLXVpLWZvbnQtaDVyJ1wiXG4gICAgICBbY2xhc3NJbmNsdWRlXT1cIichcHgtMCBtdC1bOHB4XSdcIlxuICAgICAgW2xhYmVsXT1cImxhYmVsQWRkSXRlbSgpIHx8ICcnXCJcbiAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQWRkKClcIiAvPlxuICB9XG48L2Rpdj5cbiJdfQ==
|