atr-components 0.2.417 → 2.0.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/atr-components.module.d.ts +9 -9
- package/atr-public-api.d.ts +53 -53
- package/core/animations/animations.d.ts +1 -1
- package/core/animations/fly-in.d.ts +1 -1
- package/core/animations/scroll-screen.d.ts +1 -1
- package/core/auth/auth.guard.d.ts +11 -11
- package/core/base/atr-common.d.ts +347 -347
- package/core/directive/error-img.directive.d.ts +10 -10
- package/core/directive/hq-spin.directive.d.ts +13 -13
- package/core/directive/role.directive.d.ts +16 -16
- package/core/interceptor/base.interceptor.d.ts +17 -17
- package/core/ngz-module/cus-zorro-antd.module.d.ts +75 -75
- package/core/pipe/china-num.pipe.d.ts +7 -7
- package/core/pipe/count.pipe.d.ts +7 -7
- package/core/pipe/day.pipe.d.ts +8 -8
- package/core/pipe/defaultVal.pipe.d.ts +7 -7
- package/core/pipe/dicts.pipe.d.ts +10 -10
- package/core/pipe/image-pipe.pipe.d.ts +8 -8
- package/core/pipe/is-empty.pipe.d.ts +7 -7
- package/core/pipe/is-not-empty.pipe.d.ts +7 -7
- package/core/pipe/oss.pipe.d.ts +7 -7
- package/core/pipe/ossStatic.pipe.d.ts +7 -7
- package/core/pipe/pipe-module.module.d.ts +21 -21
- package/core/pipe/remove-html.pipe.d.ts +10 -10
- package/core/pipe/safe-compute.pipe.d.ts +7 -7
- package/core/pipe/safe-html.pipe.d.ts +10 -10
- package/core/pipe/safe-url.pipe.d.ts +10 -10
- package/core/routereuse/atr-reuse-strategy.d.ts +19 -19
- package/core/services/dict/dict.service.d.ts +20 -20
- package/core/services/http.service.d.ts +31 -31
- package/core/services/menu.service.d.ts +29 -29
- package/core/services/upload-oss.service.d.ts +14 -14
- package/core/utils/ToolsUtil.d.ts +180 -180
- package/core/utils/localstorage.util.d.ts +15 -15
- package/core/utils/sessionstorage.util.d.ts +15 -15
- package/{esm2020 → esm2022}/atr-components.mjs +4 -4
- package/esm2022/atr-components.module.mjs +36 -0
- package/{esm2020 → esm2022}/atr-public-api.mjs +54 -54
- package/{esm2020 → esm2022}/core/animations/animations.mjs +9 -9
- package/{esm2020 → esm2022}/core/animations/fly-in.mjs +18 -18
- package/{esm2020 → esm2022}/core/animations/scroll-screen.mjs +22 -22
- package/{esm2020 → esm2022}/core/auth/auth.guard.mjs +37 -37
- package/esm2022/core/base/atr-common.mjs +47 -0
- package/{esm2020 → esm2022}/core/directive/error-img.directive.mjs +31 -31
- package/{esm2020 → esm2022}/core/directive/hq-spin.directive.mjs +48 -48
- package/esm2022/core/directive/role.directive.mjs +69 -0
- package/{esm2020 → esm2022}/core/interceptor/base.interceptor.mjs +165 -165
- package/{esm2020 → esm2022}/core/ngz-module/cus-zorro-antd.module.mjs +292 -292
- package/{esm2020 → esm2022}/core/pipe/china-num.pipe.mjs +36 -36
- package/{esm2020 → esm2022}/core/pipe/count.pipe.mjs +34 -34
- package/{esm2020 → esm2022}/core/pipe/day.pipe.mjs +24 -24
- package/{esm2020 → esm2022}/core/pipe/defaultVal.pipe.mjs +23 -23
- package/{esm2020 → esm2022}/core/pipe/dicts.pipe.mjs +28 -28
- package/{esm2020 → esm2022}/core/pipe/image-pipe.pipe.mjs +17 -17
- package/{esm2020 → esm2022}/core/pipe/is-empty.pipe.mjs +20 -20
- package/{esm2020 → esm2022}/core/pipe/is-not-empty.pipe.mjs +17 -17
- package/{esm2020 → esm2022}/core/pipe/oss.pipe.mjs +17 -17
- package/{esm2020 → esm2022}/core/pipe/ossStatic.pipe.mjs +17 -17
- package/esm2022/core/pipe/pipe-module.module.mjs +38 -0
- package/{esm2020 → esm2022}/core/pipe/remove-html.pipe.mjs +21 -21
- package/{esm2020 → esm2022}/core/pipe/safe-compute.pipe.mjs +23 -23
- package/{esm2020 → esm2022}/core/pipe/safe-html.pipe.mjs +20 -20
- package/{esm2020 → esm2022}/core/pipe/safe-url.pipe.mjs +20 -20
- package/esm2022/core/routereuse/atr-reuse-strategy.mjs +79 -0
- package/esm2022/core/services/dict/dict.service.mjs +152 -0
- package/{esm2020 → esm2022}/core/services/http.service.mjs +306 -306
- package/{esm2020 → esm2022}/core/services/menu.service.mjs +130 -130
- package/{esm2020 → esm2022}/core/services/upload-oss.service.mjs +74 -74
- package/esm2022/core/utils/ToolsUtil.mjs +622 -0
- package/{esm2020 → esm2022}/core/utils/localstorage.util.mjs +94 -94
- package/{esm2020 → esm2022}/core/utils/sessionstorage.util.mjs +72 -72
- package/{esm2020 → esm2022}/lib/hello/hello.component.mjs +15 -15
- package/esm2022/lib/hello/hello.module.mjs +20 -0
- package/esm2022/lib/shared/atr-shared.module.mjs +204 -0
- package/esm2022/lib/shared/echarts/echarts.component.mjs +77 -0
- package/esm2022/lib/shared/form/form.component.mjs +574 -0
- package/esm2022/lib/shared/img-canvas/img-canvas.component.mjs +132 -0
- package/esm2022/lib/shared/local-upload/local-upload.component.mjs +68 -0
- package/esm2022/lib/shared/quill-editor/quill-editor.component.mjs +248 -0
- package/esm2022/lib/shared/select-icons/select-icons.component.mjs +90 -0
- package/{esm2020 → esm2022}/lib/shared/select-tree/select-tree.component.mjs +55 -55
- package/{esm2020 → esm2022}/lib/shared/service/busi.service.mjs +69 -69
- package/{esm2020 → esm2022}/lib/shared/share.service.mjs +107 -107
- package/esm2022/lib/shared/table/table-form-item/table-form-item.component.mjs +96 -0
- package/esm2022/lib/shared/table/table-td/table-td.component.mjs +165 -0
- package/esm2022/lib/shared/table/table.component.mjs +749 -0
- package/{esm2020 → esm2022}/lib/shared/upload/upload.component.mjs +274 -274
- package/{esm2020 → esm2022}/lib/shared/validators/atr-validtors.mjs +8 -8
- package/esm2022/lib/shared/video/video.component.mjs +16 -0
- package/esm2022/lib/shared/view-form/view-form.component.mjs +181 -0
- package/{fesm2020 → fesm2022}/atr-components.mjs +5311 -5312
- package/fesm2022/atr-components.mjs.map +1 -0
- package/{atr-components.d.ts → index.d.ts} +5 -5
- package/lib/hello/hello.component.d.ts +8 -8
- package/lib/hello/hello.module.d.ts +8 -8
- package/lib/shared/atr-shared.module.d.ts +36 -33
- package/lib/shared/echarts/echarts.component.d.ts +34 -34
- package/lib/shared/form/form.component.d.ts +45 -45
- package/lib/shared/img-canvas/img-canvas.component.d.ts +28 -28
- package/lib/shared/local-upload/local-upload.component.d.ts +22 -22
- package/lib/shared/quill-editor/quill-editor.component.d.ts +45 -45
- package/lib/shared/select-icons/select-icons.component.d.ts +24 -24
- package/lib/shared/select-tree/select-tree.component.d.ts +23 -23
- package/lib/shared/service/busi.service.d.ts +20 -20
- package/lib/shared/share.service.d.ts +14 -14
- package/lib/shared/table/table-form-item/table-form-item.component.d.ts +25 -25
- package/lib/shared/table/table-td/table-td.component.d.ts +26 -26
- package/lib/shared/table/table.component.d.ts +94 -94
- package/lib/shared/upload/upload.component.d.ts +53 -53
- package/lib/shared/validators/atr-validtors.d.ts +2 -2
- package/lib/shared/video/video.component.d.ts +7 -7
- package/lib/shared/view-form/view-form.component.d.ts +28 -28
- package/package.json +14 -22
- package/esm2020/atr-components.module.mjs +0 -38
- package/esm2020/core/base/atr-common.mjs +0 -47
- package/esm2020/core/directive/role.directive.mjs +0 -69
- package/esm2020/core/pipe/pipe-module.module.mjs +0 -40
- package/esm2020/core/routereuse/atr-reuse-strategy.mjs +0 -79
- package/esm2020/core/services/dict/dict.service.mjs +0 -152
- package/esm2020/core/utils/ToolsUtil.mjs +0 -622
- package/esm2020/lib/hello/hello.module.mjs +0 -22
- package/esm2020/lib/shared/atr-shared.module.mjs +0 -199
- package/esm2020/lib/shared/echarts/echarts.component.mjs +0 -77
- package/esm2020/lib/shared/form/form.component.mjs +0 -574
- package/esm2020/lib/shared/img-canvas/img-canvas.component.mjs +0 -132
- package/esm2020/lib/shared/local-upload/local-upload.component.mjs +0 -68
- package/esm2020/lib/shared/quill-editor/quill-editor.component.mjs +0 -248
- package/esm2020/lib/shared/select-icons/select-icons.component.mjs +0 -90
- package/esm2020/lib/shared/table/table-form-item/table-form-item.component.mjs +0 -96
- package/esm2020/lib/shared/table/table-td/table-td.component.mjs +0 -165
- package/esm2020/lib/shared/table/table.component.mjs +0 -749
- package/esm2020/lib/shared/video/video.component.mjs +0 -15
- package/esm2020/lib/shared/view-form/view-form.component.mjs +0 -181
- package/fesm2015/atr-components.mjs +0 -5522
- package/fesm2015/atr-components.mjs.map +0 -1
- package/fesm2020/atr-components.mjs.map +0 -1
|
@@ -1,574 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Inject, LOCALE_ID, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { FormControl, Validators } from '@angular/forms';
|
|
3
|
-
import { telphoneValidator } from '../validators/atr-validtors';
|
|
4
|
-
import { formatDate } from '@angular/common';
|
|
5
|
-
import { atr_static_datas } from "../../../core/base/atr-common";
|
|
6
|
-
import { ToolsUtil } from "../../../core/utils/ToolsUtil";
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "../share.service";
|
|
9
|
-
import * as i2 from "../../../core/services/http.service";
|
|
10
|
-
import * as i3 from "@angular/forms";
|
|
11
|
-
import * as i4 from "../../../core/services/dict/dict.service";
|
|
12
|
-
import * as i5 from "../view-form/view-form.component";
|
|
13
|
-
import * as i6 from "ng-zorro-antd/form";
|
|
14
|
-
import * as i7 from "ng-zorro-antd/tree-select";
|
|
15
|
-
import * as i8 from "../select-icons/select-icons.component";
|
|
16
|
-
import * as i9 from "ng-zorro-antd/input-number";
|
|
17
|
-
import * as i10 from "ng-zorro-antd/radio";
|
|
18
|
-
import * as i11 from "ng-zorro-antd/checkbox";
|
|
19
|
-
import * as i12 from "ng-zorro-antd/select";
|
|
20
|
-
import * as i13 from "ng-zorro-antd/cascader";
|
|
21
|
-
import * as i14 from "ng-zorro-antd/date-picker";
|
|
22
|
-
import * as i15 from "../upload/upload.component";
|
|
23
|
-
import * as i16 from "../quill-editor/quill-editor.component";
|
|
24
|
-
import * as i17 from "ng-zorro-antd/button";
|
|
25
|
-
import * as i18 from "@angular/common";
|
|
26
|
-
import * as i19 from "ng-zorro-antd/grid";
|
|
27
|
-
import * as i20 from "ng-zorro-antd/input";
|
|
28
|
-
import * as i21 from "ng-zorro-antd/core/wave";
|
|
29
|
-
import * as i22 from "ng-zorro-antd/core/transition-patch";
|
|
30
|
-
import * as i23 from "../../../core/pipe/safe-html.pipe";
|
|
31
|
-
import * as i24 from "../../../core/pipe/defaultVal.pipe";
|
|
32
|
-
export class AtrFormComponent {
|
|
33
|
-
// tslint:disable-next-line:max-line-length
|
|
34
|
-
constructor(shareService, httpService, fb, dictService, injector, locale) {
|
|
35
|
-
this.shareService = shareService;
|
|
36
|
-
this.httpService = httpService;
|
|
37
|
-
this.fb = fb;
|
|
38
|
-
this.dictService = dictService;
|
|
39
|
-
this.injector = injector;
|
|
40
|
-
this.locale = locale;
|
|
41
|
-
this.dicts = {};
|
|
42
|
-
this.formAction = new EventEmitter();
|
|
43
|
-
this.uploadAction = new EventEmitter();
|
|
44
|
-
this.quillChange = new EventEmitter();
|
|
45
|
-
this.atrForm = this.fb.group({});
|
|
46
|
-
}
|
|
47
|
-
resetLayout(item) {
|
|
48
|
-
if (!item.lspan) {
|
|
49
|
-
item.lspan = 24;
|
|
50
|
-
}
|
|
51
|
-
if (!item.cspan) {
|
|
52
|
-
item.cspan = 24;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
selectChange(event, item) {
|
|
56
|
-
event.preventDefault();
|
|
57
|
-
if (event.stopPropagation) {
|
|
58
|
-
event.stopPropagation();
|
|
59
|
-
}
|
|
60
|
-
let action = {
|
|
61
|
-
name: item.key,
|
|
62
|
-
code: 'selectChagne',
|
|
63
|
-
};
|
|
64
|
-
this.formAction.emit(action);
|
|
65
|
-
}
|
|
66
|
-
formChange(event, item) {
|
|
67
|
-
this.formAction.emit({
|
|
68
|
-
name: 'formChange',
|
|
69
|
-
code: item.key,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
doAction(item, event) {
|
|
73
|
-
event.preventDefault();
|
|
74
|
-
if (event.stopPropagation) {
|
|
75
|
-
event.stopPropagation();
|
|
76
|
-
}
|
|
77
|
-
let action = {
|
|
78
|
-
name: item.name,
|
|
79
|
-
code: item.code,
|
|
80
|
-
};
|
|
81
|
-
this.formAction.emit(action);
|
|
82
|
-
}
|
|
83
|
-
setValue(key, value) {
|
|
84
|
-
this.atrForm.get(key)?.setValue(value);
|
|
85
|
-
}
|
|
86
|
-
getDicList(item) {
|
|
87
|
-
this.shareService.getDicList(item).subscribe(res => {
|
|
88
|
-
if (res.status == 200 && res.item) {
|
|
89
|
-
item = res.item;
|
|
90
|
-
this.resetForm();
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
conv(datas, keys) {
|
|
95
|
-
return datas.map((child) => {
|
|
96
|
-
let item = {};
|
|
97
|
-
if (keys) {
|
|
98
|
-
keys.forEach((v) => {
|
|
99
|
-
let vs = v.split("|");
|
|
100
|
-
child[vs[0]] = child[vs[1]];
|
|
101
|
-
item[vs[0]] = child[vs[1]];
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
item = child;
|
|
106
|
-
}
|
|
107
|
-
child.nzValueProperty = item;
|
|
108
|
-
if (child.children) {
|
|
109
|
-
child.children = this.conv(child.children, keys);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
child.isLeaf = true;
|
|
113
|
-
}
|
|
114
|
-
return child;
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
getCascaderDefaultValue(list, index, value) {
|
|
118
|
-
list.forEach((dic) => {
|
|
119
|
-
if (dic.value == value[index]) {
|
|
120
|
-
value[index] = dic.nzValueProperty;
|
|
121
|
-
if (dic.children) {
|
|
122
|
-
value = this.getCascaderDefaultValue(dic.children, index + 1, value);
|
|
123
|
-
}
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
});
|
|
127
|
-
return value;
|
|
128
|
-
}
|
|
129
|
-
ngOnInit() {
|
|
130
|
-
if (this.formOpts && this.formOpts.items) {
|
|
131
|
-
for (let item of this.formOpts.items) {
|
|
132
|
-
// this.atrForm.addControl(item.key, new FormControl());
|
|
133
|
-
this.resetLayout(item);
|
|
134
|
-
let value = this.formOpts.type == 'add' ? item.defaultValue : item.value;
|
|
135
|
-
console.log(value);
|
|
136
|
-
if (item.type == 'checkbox') {
|
|
137
|
-
if (this.formOpts.type == 'add') {
|
|
138
|
-
value = item.dictList.filter((v) => v.isSelect).map((dic) => dic.value);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
if (item.type == 'treeSelect' && item.selectUrl.url) {
|
|
142
|
-
let keys = item.selectUrl.convert.split(',');
|
|
143
|
-
this.httpService.post(item.selectUrl.url, {}, ToolsUtil.getHttpOptions()).subscribe(res => {
|
|
144
|
-
item.treeList = res.data.filter((child) => {
|
|
145
|
-
keys.forEach((v) => {
|
|
146
|
-
let vs = v.split("|");
|
|
147
|
-
child[vs[0]] = child[vs[1]];
|
|
148
|
-
});
|
|
149
|
-
return true;
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
if (item.type == 'cascader' && item.selectUrl.url) {
|
|
154
|
-
let keys = null;
|
|
155
|
-
if (item.selectUrl.convert) {
|
|
156
|
-
keys = item.selectUrl.convert.split(',');
|
|
157
|
-
}
|
|
158
|
-
if (item.selectUrl.url) {
|
|
159
|
-
let selectUrl = item.selectUrl;
|
|
160
|
-
if (selectUrl.host == 'oss') {
|
|
161
|
-
this.httpService.getOss(selectUrl.url).subscribe(res => {
|
|
162
|
-
item.dictList = this.conv(JSON.parse(res), keys);
|
|
163
|
-
if (value && value.length > 0) {
|
|
164
|
-
value = this.getCascaderDefaultValue(item.dictList, 0, value);
|
|
165
|
-
this.setValue(item.key, value);
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
this.httpService.post(selectUrl.url, {}, ToolsUtil.getHttpOptions()).subscribe(res => {
|
|
171
|
-
item.dictList = this.conv(res.data, keys);
|
|
172
|
-
if (value && value.length > 0) {
|
|
173
|
-
value = this.getCascaderDefaultValue(item.dictList, 0, value);
|
|
174
|
-
this.setValue(item.key, value);
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
if (item.type == "select") {
|
|
181
|
-
this.getDictValue(item.dictCode);
|
|
182
|
-
}
|
|
183
|
-
if (item.type == 'selectc') {
|
|
184
|
-
if (!item.dictList || (item.selectUrl && item.selectUrl.ignoreDictList)) {
|
|
185
|
-
this.getDicList(item);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
if (item.type == "textarea" && !item.rows)
|
|
189
|
-
item.rows = 5;
|
|
190
|
-
if (item.type == "image") {
|
|
191
|
-
item.imageOpts.key = item.key;
|
|
192
|
-
if (value) {
|
|
193
|
-
let images = [];
|
|
194
|
-
let list = value.split(",");
|
|
195
|
-
for (let key of list) {
|
|
196
|
-
images.push({
|
|
197
|
-
key: key,
|
|
198
|
-
uid: "-1",
|
|
199
|
-
url: atr_static_datas.OSS_URL + key
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
item.imageOpts.imageList = images;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
if (item.type == 'editor') {
|
|
206
|
-
if (!value)
|
|
207
|
-
value = "";
|
|
208
|
-
if (!item.height)
|
|
209
|
-
item.height = 300;
|
|
210
|
-
}
|
|
211
|
-
if (!item.span)
|
|
212
|
-
item.span = 8;
|
|
213
|
-
if (typeof item.isRequired != 'string') {
|
|
214
|
-
item.isRequired = false;
|
|
215
|
-
}
|
|
216
|
-
let tempValidators = [];
|
|
217
|
-
if (item.validators) {
|
|
218
|
-
for (let validator of item.validators) {
|
|
219
|
-
if (validator.type == "required") {
|
|
220
|
-
item.isRequired = true;
|
|
221
|
-
tempValidators.push(Validators.required);
|
|
222
|
-
}
|
|
223
|
-
else if (validator.type == "email") {
|
|
224
|
-
tempValidators.push(Validators.email);
|
|
225
|
-
}
|
|
226
|
-
else if (validator.type == "maxlength") {
|
|
227
|
-
tempValidators.push(Validators.maxLength(validator.maxlength ? validator.maxlength : 1));
|
|
228
|
-
}
|
|
229
|
-
else if (validator.type == "minlength") {
|
|
230
|
-
tempValidators.push(Validators.minLength(validator.minlength ? validator.minlength : 1));
|
|
231
|
-
}
|
|
232
|
-
else if (validator.type == "telphone") {
|
|
233
|
-
tempValidators.push(telphoneValidator());
|
|
234
|
-
}
|
|
235
|
-
else if (validator.type == "pattern") {
|
|
236
|
-
tempValidators.push(Validators.pattern(validator.patternValue));
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
let defaultValue = { value: value != undefined ? value : null, disabled: item.disable ? item.disable : false };
|
|
241
|
-
if (tempValidators.length > 0) {
|
|
242
|
-
this.atrForm.addControl(item.key, new FormControl(defaultValue, tempValidators));
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
this.atrForm.addControl(item.key, new FormControl(defaultValue));
|
|
246
|
-
}
|
|
247
|
-
console.log(" this.atrForm", this.atrForm);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
compare(value, operator, target) {
|
|
252
|
-
let isRight = false;
|
|
253
|
-
switch (operator) {
|
|
254
|
-
case 'eq':
|
|
255
|
-
if (value == target) {
|
|
256
|
-
isRight = true;
|
|
257
|
-
}
|
|
258
|
-
break;
|
|
259
|
-
case 'gh':
|
|
260
|
-
if (value >= target) {
|
|
261
|
-
isRight = true;
|
|
262
|
-
}
|
|
263
|
-
break;
|
|
264
|
-
case 'notEmpty':
|
|
265
|
-
isRight = false;
|
|
266
|
-
if (value) {
|
|
267
|
-
isRight = true;
|
|
268
|
-
}
|
|
269
|
-
break;
|
|
270
|
-
case 'empty':
|
|
271
|
-
isRight = true;
|
|
272
|
-
console.log('empty', !!value);
|
|
273
|
-
if (!!value) {
|
|
274
|
-
isRight = false;
|
|
275
|
-
}
|
|
276
|
-
break;
|
|
277
|
-
default:
|
|
278
|
-
isRight = false;
|
|
279
|
-
break;
|
|
280
|
-
}
|
|
281
|
-
return isRight;
|
|
282
|
-
}
|
|
283
|
-
checkIsShowBase(op) {
|
|
284
|
-
let isShow = false;
|
|
285
|
-
if (op.length > 1) {
|
|
286
|
-
let value = this.atrForm.get(op[0]).value;
|
|
287
|
-
isShow = this.compare(value, op[1], op[2]);
|
|
288
|
-
}
|
|
289
|
-
else
|
|
290
|
-
isShow = false;
|
|
291
|
-
return isShow;
|
|
292
|
-
}
|
|
293
|
-
isRequired(item) {
|
|
294
|
-
let result = false;
|
|
295
|
-
let isRequired = item.isRequired;
|
|
296
|
-
let type = typeof isRequired;
|
|
297
|
-
if (type == "boolean") {
|
|
298
|
-
return isRequired;
|
|
299
|
-
}
|
|
300
|
-
else if (type == "string") {
|
|
301
|
-
result = this.isShow(false, isRequired);
|
|
302
|
-
}
|
|
303
|
-
console.log("isRequired", result);
|
|
304
|
-
return result;
|
|
305
|
-
}
|
|
306
|
-
isShow(isHidden, operator) {
|
|
307
|
-
if (isHidden) {
|
|
308
|
-
return false;
|
|
309
|
-
}
|
|
310
|
-
let isShow = false;
|
|
311
|
-
if (!operator || operator == null || operator == "") {
|
|
312
|
-
return true;
|
|
313
|
-
}
|
|
314
|
-
else if (operator.indexOf('&&') > 0) {
|
|
315
|
-
// a|eq|b &&c|eq|d
|
|
316
|
-
const ops = operator.split('&&');
|
|
317
|
-
if (ops.length > 1) {
|
|
318
|
-
// tslint:disable-next-line:prefer-for-of
|
|
319
|
-
for (let i = 0; i < ops.length; i++) {
|
|
320
|
-
isShow = true;
|
|
321
|
-
if (!this.checkIsShowBase(ops[i].split('|'))) {
|
|
322
|
-
isShow = false;
|
|
323
|
-
break;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
else if (operator.indexOf('||') > 0) {
|
|
329
|
-
// a|eq|b||c|eq|d
|
|
330
|
-
const ops = operator.split('&&');
|
|
331
|
-
if (ops.length > 1) {
|
|
332
|
-
for (let i = 0; i < ops.length; i++) {
|
|
333
|
-
isShow = false;
|
|
334
|
-
if (this.checkIsShowBase(ops[i].split('|'))) {
|
|
335
|
-
isShow = true;
|
|
336
|
-
break;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
let op = operator.split("|");
|
|
343
|
-
isShow = this.checkIsShowBase(op);
|
|
344
|
-
}
|
|
345
|
-
return isShow;
|
|
346
|
-
}
|
|
347
|
-
getDictValue(code) {
|
|
348
|
-
// console.log("9999");
|
|
349
|
-
this.dictService.getDictBycode(code).subscribe(result => {
|
|
350
|
-
if (result && result != null)
|
|
351
|
-
this.dicts[code] = result.dicts;
|
|
352
|
-
}, error => {
|
|
353
|
-
this.dicts[code] = [];
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
imageUploadChange(e) {
|
|
357
|
-
if (e.key) {
|
|
358
|
-
this.atrForm.get(e.key).setValue(e.values);
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
onBeforeUpload(e, item) {
|
|
362
|
-
this.uploadAction.emit({ code: 'onBeforeUpload', data: { ...e.data, key: item.key } });
|
|
363
|
-
}
|
|
364
|
-
resetForm() {
|
|
365
|
-
// this.atrForm.reset();
|
|
366
|
-
// console.log("editor reset")
|
|
367
|
-
if (this.formOpts && this.formOpts.items) {
|
|
368
|
-
for (let item of this.formOpts.items) {
|
|
369
|
-
let value = this.formOpts.type == 'add' ? item.defaultValue : item.value;
|
|
370
|
-
if (item.type == "image") {
|
|
371
|
-
item.imageOpts.key = item.key;
|
|
372
|
-
let images = [];
|
|
373
|
-
if (!value)
|
|
374
|
-
value = "";
|
|
375
|
-
let list = value.split(",");
|
|
376
|
-
for (let key of list) {
|
|
377
|
-
if (key != "") {
|
|
378
|
-
images.push({
|
|
379
|
-
key: key,
|
|
380
|
-
uid: "-1",
|
|
381
|
-
url: atr_static_datas.OSS_URL + key
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
item.imageOpts.imageList = images;
|
|
386
|
-
// console.log(images)
|
|
387
|
-
}
|
|
388
|
-
else if (item.type == "editor") {
|
|
389
|
-
// console.log("editor")
|
|
390
|
-
if (!value)
|
|
391
|
-
value = "";
|
|
392
|
-
}
|
|
393
|
-
else if (item.type == "select" && value == "") {
|
|
394
|
-
value = null;
|
|
395
|
-
}
|
|
396
|
-
else if (item.type == "checkbox" && !value) {
|
|
397
|
-
value = null;
|
|
398
|
-
}
|
|
399
|
-
this.atrForm.get(item.key).setValue(value != undefined ? value : null);
|
|
400
|
-
}
|
|
401
|
-
for (const i in this.atrForm.controls) {
|
|
402
|
-
this.atrForm.controls[i].markAsUntouched();
|
|
403
|
-
this.atrForm.controls[i].markAsPristine();
|
|
404
|
-
this.atrForm.controls[i].updateValueAndValidity();
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
editChange(data, item) {
|
|
409
|
-
this.quillChange.emit({ code: 'quillChange', e: data, formItem: item });
|
|
410
|
-
}
|
|
411
|
-
getFormValue() {
|
|
412
|
-
let obj = {
|
|
413
|
-
isValid: false,
|
|
414
|
-
mode: this.formOpts.type,
|
|
415
|
-
value: {}
|
|
416
|
-
};
|
|
417
|
-
let value = this.atrForm.value;
|
|
418
|
-
for (const key of Object.keys(value)) {
|
|
419
|
-
// //console.log(key);
|
|
420
|
-
if (value.hasOwnProperty(key) && value[key] != null && value[key] != undefined) {
|
|
421
|
-
if (value[key] instanceof Date) {
|
|
422
|
-
for (let item of this.formOpts.items) {
|
|
423
|
-
if (item.key != key) {
|
|
424
|
-
continue;
|
|
425
|
-
}
|
|
426
|
-
if (item.dateFormat) {
|
|
427
|
-
obj.value[key] = formatDate(new Date(Number(value[key])), item.dateFormat, this.locale);
|
|
428
|
-
}
|
|
429
|
-
else if (item.type == 'date') {
|
|
430
|
-
obj.value[key] = formatDate(new Date(Number(value[key])), 'yyyy-MM-dd 00:00:00', this.locale);
|
|
431
|
-
}
|
|
432
|
-
else if (item.type == 'dateTime') {
|
|
433
|
-
obj.value[key] = formatDate(new Date(Number(value[key])), 'yyyy-MM-dd HH:mm:ss', this.locale);
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
else if (value[key] instanceof Array) {
|
|
438
|
-
for (let item of this.formOpts.items) {
|
|
439
|
-
if (item.key != key) {
|
|
440
|
-
continue;
|
|
441
|
-
}
|
|
442
|
-
let dateFormat = item.dateFormat ? item.dateFormat : 'yyyy-MM-dd 00:00:00';
|
|
443
|
-
if (item.type == 'dateRange') {
|
|
444
|
-
let dateArr = [];
|
|
445
|
-
let nzShowTime = item.nzShowTime;
|
|
446
|
-
if (nzShowTime) {
|
|
447
|
-
dateFormat = 'yyyy-MM-dd HH:mm:ss';
|
|
448
|
-
if (nzShowTime.nzFormat) {
|
|
449
|
-
dateFormat = 'yyyy-MM-dd ' + nzShowTime.nzFormat;
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
for (let d of value[key]) {
|
|
453
|
-
dateArr.push(formatDate(d, dateFormat, this.locale));
|
|
454
|
-
}
|
|
455
|
-
obj.value[key] = dateArr;
|
|
456
|
-
}
|
|
457
|
-
else if (item.type == 'cascader') {
|
|
458
|
-
obj.value[key] = value[key];
|
|
459
|
-
}
|
|
460
|
-
else if (item.type == 'select' && item.nzMode == 'multiple') {
|
|
461
|
-
obj.value[key] = value[key].toString();
|
|
462
|
-
}
|
|
463
|
-
else {
|
|
464
|
-
obj.value[key] = value[key];
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
else {
|
|
469
|
-
obj.value[key] = value[key];
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
return obj;
|
|
474
|
-
}
|
|
475
|
-
getFormVaild() {
|
|
476
|
-
let obj = {
|
|
477
|
-
isValid: false,
|
|
478
|
-
mode: this.formOpts.type,
|
|
479
|
-
value: {}
|
|
480
|
-
};
|
|
481
|
-
for (const i in this.atrForm.controls) {
|
|
482
|
-
this.atrForm.controls[i].markAsDirty();
|
|
483
|
-
this.atrForm.controls[i].updateValueAndValidity();
|
|
484
|
-
}
|
|
485
|
-
obj.isValid = this.atrForm.valid;
|
|
486
|
-
let value = this.atrForm.value;
|
|
487
|
-
for (const key of Object.keys(value)) {
|
|
488
|
-
console.log(key);
|
|
489
|
-
if (value.hasOwnProperty(key) && value[key] != null && value[key] != undefined) {
|
|
490
|
-
if (value[key] instanceof Date) {
|
|
491
|
-
for (let item of this.formOpts.items) {
|
|
492
|
-
if (item.key != key) {
|
|
493
|
-
continue;
|
|
494
|
-
}
|
|
495
|
-
if (item.dateFormat) {
|
|
496
|
-
obj.value[key] = formatDate(new Date(Number(value[key])), item.dateFormat, this.locale);
|
|
497
|
-
}
|
|
498
|
-
else if (item.type == 'date') {
|
|
499
|
-
obj.value[key] = formatDate(new Date(Number(value[key])), 'yyyy-MM-dd 00:00:00', this.locale);
|
|
500
|
-
}
|
|
501
|
-
else if (item.type == 'dateTime') {
|
|
502
|
-
obj.value[key] = formatDate(new Date(Number(value[key])), 'yyyy-MM-dd HH:mm:ss', this.locale);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
else if (value[key] instanceof Array) {
|
|
507
|
-
for (let item of this.formOpts.items) {
|
|
508
|
-
if (item.key != key) {
|
|
509
|
-
continue;
|
|
510
|
-
}
|
|
511
|
-
let dateFormat = item.dateFormat ? item.dateFormat : 'yyyy-MM-dd 00:00:00';
|
|
512
|
-
if (item.type == 'dateRange') {
|
|
513
|
-
let dateArr = [];
|
|
514
|
-
for (let d of value[key]) {
|
|
515
|
-
dateArr.push(formatDate(d, dateFormat, this.locale));
|
|
516
|
-
}
|
|
517
|
-
obj.value[key] = dateArr;
|
|
518
|
-
}
|
|
519
|
-
else if (item.type == 'cascader') {
|
|
520
|
-
obj.value[key] = value[key];
|
|
521
|
-
}
|
|
522
|
-
else if (item.type == 'select' && item.nzMode == 'multiple') {
|
|
523
|
-
obj.value[key] = value[key].toString();
|
|
524
|
-
}
|
|
525
|
-
else {
|
|
526
|
-
obj.value[key] = value[key];
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
}
|
|
530
|
-
else {
|
|
531
|
-
obj.value[key] = value[key];
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
return obj;
|
|
536
|
-
}
|
|
537
|
-
showTime(item) {
|
|
538
|
-
if (item.nzShowTime) {
|
|
539
|
-
return item.nzShowTime;
|
|
540
|
-
}
|
|
541
|
-
if (!item.dateFormat || item.dateFormat == "yyyy-MM-dd") {
|
|
542
|
-
return false;
|
|
543
|
-
}
|
|
544
|
-
let format = item.dateFormat;
|
|
545
|
-
if (format.indexOf("HH")) {
|
|
546
|
-
return true;
|
|
547
|
-
}
|
|
548
|
-
if (format.indexOf("mm")) {
|
|
549
|
-
return true;
|
|
550
|
-
}
|
|
551
|
-
if (format.indexOf("ss")) {
|
|
552
|
-
return true;
|
|
553
|
-
}
|
|
554
|
-
return false;
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
AtrFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AtrFormComponent, deps: [{ token: i1.ShareService }, { token: i2.HttpService }, { token: i3.FormBuilder }, { token: i4.DictService }, { token: i0.Injector }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Component });
|
|
558
|
-
AtrFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: AtrFormComponent, selector: "atr-form", inputs: { formOpts: "formOpts" }, outputs: { formAction: "formAction", uploadAction: "uploadAction", quillChange: "quillChange" }, ngImport: i0, template: "<atr-view-form *ngIf=\"formOpts.type == 'view'\" [dicts]=\"dicts\" [atrForm]=\"atrForm\"\r\n [formOpts]=\"formOpts\"></atr-view-form>\r\n\r\n<form nz-form [formGroup]=\"atrForm\" *ngIf=\"formOpts.type != 'view'\">\r\n <div nz-row nzGutter=\"8\" nzType=\"flex\" nzAlign=\"top\">\r\n <ng-container *ngFor=\"let item of formOpts.items\">\r\n <div nz-col nzSpan=\"24\" class=\"form-title\" *ngIf=\"item.type == 'title'\">\r\n {{item.label}}\r\n </div>\r\n <div nz-col [nzSpan]=\"item.span\" *ngIf=\"isShow(item.isHidden,item.operator)\">\r\n <ng-content *ngTemplateOutlet=\"item.firstTemp\"></ng-content>\r\n <nz-form-item *ngIf=\"item.type != 'title'\">\r\n <nz-form-label [nzSm]=\"item.lspan\" [nzXs]=\"24\" [nzRequired]=\"isRequired(item)\">{{item.label}}</nz-form-label>\r\n <nz-form-control [nzSm]=\"item.cspan\" [nzXs]=\"24\">\r\n <div style=\"display: flex;width: 100%\">\r\n <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\"\r\n nzVirtualHeight=\"330px\"\r\n style=\"flex: 1\"\r\n >\r\n </nz-tree-select>\r\n <!-- <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\" style=\"flex: 1\"\r\n >\r\n </nz-tree-select> -->\r\n <app-select-icons *ngIf=\"item.type == 'selectIcon'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n [readonly]=\"item.readonly \"\r\n style=\"flex: 1\"\r\n [formControlName]=\"item.key\">\r\n </app-select-icons>\r\n <input *ngIf=\"item.type == 'text'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n (ngModelChange)=\"formChange($event,item)\"\r\n [readonly]=\"item.readonly || formOpts.type == 'view'\"\r\n [formControlName]=\"item.key\"/>\r\n <textarea *ngIf=\"item.type == 'textarea'\" nz-input [rows]=\"item.rows\" placeholder=\"{{item.placeholder}}\"\r\n [formControlName]=\"item.key\" [readonly]=\"item.readonly|| formOpts.type == 'view'\"></textarea>\r\n <nz-input-number *ngIf=\"item.type == 'number'\" nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzMin]=\"item.minNumber\" [nzMax]=\"item.maxNumber\"\r\n [formControlName]=\"item.key\"></nz-input-number>\r\n <nz-radio-group *ngIf=\"item.type == 'radio'\" [formControlName]=\"item.key\">\r\n <label nz-radio *ngFor=\"let o of item.dictList\" [nzValue]=\"o.value\">{{o.label}}</label>\r\n </nz-radio-group>\r\n <nz-checkbox-wrapper *ngIf=\"item.type == 'checkbox'\" [formControlName]=\"item.key\">\r\n <div nz-row>\r\n <div *ngFor=\"let o of item.dictList\" nz-col>\r\n <label nz-checkbox [nzValue]=\"o.value\">{{o.label}}</label></div>\r\n </div>\r\n </nz-checkbox-wrapper>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'select'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n >\r\n <nz-option *ngFor=\"let o of dicts[item.dictCode]\" [nzLabel]=\"o.typeName\" [nzValue]=\"o.id\"></nz-option>\r\n </nz-select>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'selectc'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n (ngModelChange)=\"selectChange($event,item)\"\r\n >\r\n <nz-option *ngFor=\"let o of item.dictList\" [nzLabel]=\"o.label\" [nzValue]=\"o.value\"></nz-option>\r\n </nz-select>\r\n <nz-cascader [nzDisabled]=\"item.readonly\" style=\"flex: 1\" [nzAllowClear]=\"!item.notNull\"\r\n [nzValueProperty]=\"'nzValueProperty'\"\r\n [nzShowSearch]=\"true\" *ngIf=\"item.type == 'cascader'\"\r\n [nzChangeOnSelect] = \"item.allowSelectNode\"\r\n [nzOptions]=\"item.dictList\" [formControlName]=\"item.key\"></nz-cascader>\r\n <nz-date-picker *ngIf=\"item.type == 'date'\" [nzFormat]=\"item.dateFormat ? item.dateFormat : 'yyyy-MM-dd'\"\r\n [nzShowTime]=\"showTime(item)\" style=\"flex: 1\"\r\n [nzDisabled]=\"formOpts.type == 'view' || item.readonly \"\r\n [formControlName]=\"item.key\"></nz-date-picker>\r\n <nz-range-picker *ngIf=\"item.type == 'dateRange'\" style=\"flex: 1\"\r\n [nzShowTime]=\"item.nzShowTime? item.nzShowTime : false\"\r\n [formControlName]=\"item.key\"\r\n [nzFormat]=\"item.nzShowTime && item.nzShowTime.nzFormat ? ('yyyy-MM-dd '+ item.nzShowTime.nzFormat) : 'yyyy-MM-dd'\"\r\n [nzPlaceHolder]=\"['\u5F00\u59CB\u65F6\u95F4', '\u7ED3\u675F\u65F6\u95F4']\"></nz-range-picker>\r\n\r\n <input *ngIf=\"item.type == 'image'\" nz-input [formControlName]=\"item.key\" [hidden]=\"true\"/>\r\n <atr-img-upload *ngIf=\"item.type == 'image'\" [(opts)]=\"item.imageOpts\"\r\n (onBeforeUpload)=\"onBeforeUpload($event,item)\"\r\n (afterChange)=\"imageUploadChange($event)\"></atr-img-upload>\r\n\r\n <!-- <editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" [config]=\"{initialFrameHeight:item.height}\" ></editor>-->\r\n <app-quill-editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" (ngModelChange)=\"editChange($event,item)\"\r\n [styles]=\"{height:item.height > 0 ? item.height + 'px' : '250px'}\"></app-quill-editor>\r\n <div *ngIf=\"item.type == 'word'\" [innerHTML]=\"item.value |defVal:item.defaultValue |safeHtml\">\r\n </div>\r\n <div *ngIf=\"item.type == 'buttons'\">\r\n <ng-container *ngFor=\"let btn of item.buttons\">\r\n <button nz-button type=\"button\" [nzType]=\"btn.btnType |defVal: 'default'\"\r\n class=\"ant-btn ant-btn-primary\"\r\n style=\"margin-right: 5px\" *ngIf=\"btn.isShow || isShow(false,btn.operator)\"\r\n (click)=\"doAction(btn,$event)\">\r\n <span>{{btn.name}}</span></button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngFor=\"let valid of item.validators\">\r\n <ng-container *ngIf=\"atrForm.get(item.key).hasError(valid.type) && (atrForm.get(item.key).dirty )\">\r\n <div style=\"color:red; height: 15px;margin: 0;line-height: 15px;\">{{valid.errorLabel}}</div>\r\n </ng-container>\r\n </ng-container>\r\n <button nz-button nzType=\"default\" style=\"cursor: default;background-color: #fafafa;color: black\"\r\n *ngIf=\"item.ends\" disabled>\r\n {{item.ends}}\r\n </button>\r\n <button *ngIf=\"item.button?.isShow\" type=\"button\" class=\"ant-btn ant-btn-primary\"\r\n (click)=\"doAction(item.button,$event)\">\r\n <span>{{item.button.name}}</span></button>\r\n </div>\r\n <div *ngIf=\"item.proposal\" style=\"color: red;width: 100%\">{{item.proposal}}</div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <ng-content *ngTemplateOutlet=\"item.temp\"></ng-content>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n</form>\r\n", styles: [":host ::ng-deep .ant-form-item{margin:0 0 10px}:host ::ng-deep .ant-form-item-label{text-align:left}:host ::ng-deep nz-input-number{width:100%}:host .form-title{height:50px;line-height:50px;font-weight:500;font-size:20px;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0;margin-bottom:14px;margin-top:11px}\n"], components: [{ type: i5.ViewFormComponent, selector: "atr-view-form", inputs: ["formOpts", "atrForm", "dicts", "items"] }, { type: i6.NzFormItemComponent, selector: "nz-form-item", exportAs: ["nzFormItem"] }, { type: i6.NzFormLabelComponent, selector: "nz-form-label", inputs: ["nzFor", "nzRequired", "nzNoColon", "nzTooltipTitle", "nzTooltipIcon"], exportAs: ["nzFormLabel"] }, { type: i6.NzFormControlComponent, selector: "nz-form-control", inputs: ["nzSuccessTip", "nzWarningTip", "nzErrorTip", "nzValidatingTip", "nzExtra", "nzAutoTips", "nzDisableAutoTips", "nzHasFeedback", "nzValidateStatus"], exportAs: ["nzFormControl"] }, { type: i7.NzTreeSelectComponent, selector: "nz-tree-select", inputs: ["nzId", "nzAllowClear", "nzShowExpand", "nzShowLine", "nzDropdownMatchSelectWidth", "nzCheckable", "nzHideUnMatched", "nzShowIcon", "nzShowSearch", "nzDisabled", "nzAsyncData", "nzMultiple", "nzDefaultExpandAll", "nzCheckStrictly", "nzVirtualItemSize", "nzVirtualMaxBufferPx", "nzVirtualMinBufferPx", "nzVirtualHeight", "nzExpandedIcon", "nzNotFoundContent", "nzNodes", "nzOpen", "nzSize", "nzPlaceHolder", "nzDropdownStyle", "nzDropdownClassName", "nzBackdrop", "nzStatus", "nzExpandedKeys", "nzDisplayWith", "nzMaxTagCount", "nzMaxTagPlaceholder", "nzTreeTemplate"], outputs: ["nzOpenChange", "nzCleared", "nzRemoved", "nzExpandChange", "nzTreeClick", "nzTreeCheckBoxChange"], exportAs: ["nzTreeSelect"] }, { type: i8.SelectIconsComponent, selector: "app-select-icons", inputs: ["readonly", "placeholder"] }, { type: i9.NzInputNumberComponent, selector: "nz-input-number", inputs: ["nzSize", "nzMin", "nzMax", "nzParser", "nzPrecision", "nzPrecisionMode", "nzPlaceHolder", "nzStatus", "nzStep", "nzInputMode", "nzId", "nzDisabled", "nzReadOnly", "nzAutoFocus", "nzBorderless", "nzFormatter"], outputs: ["nzBlur", "nzFocus"], exportAs: ["nzInputNumber"] }, { type: i10.NzRadioGroupComponent, selector: "nz-radio-group", inputs: ["nzDisabled", "nzButtonStyle", "nzSize", "nzName"], exportAs: ["nzRadioGroup"] }, { type: i10.NzRadioComponent, selector: "[nz-radio],[nz-radio-button]", inputs: ["nzValue", "nzDisabled", "nzAutoFocus"], exportAs: ["nzRadio"] }, { type: i11.NzCheckboxWrapperComponent, selector: "nz-checkbox-wrapper", outputs: ["nzOnChange"], exportAs: ["nzCheckboxWrapper"] }, { type: i11.NzCheckboxComponent, selector: "[nz-checkbox]", inputs: ["nzValue", "nzAutoFocus", "nzDisabled", "nzIndeterminate", "nzChecked", "nzId"], outputs: ["nzCheckedChange"], exportAs: ["nzCheckbox"] }, { type: i12.NzSelectComponent, selector: "nz-select", inputs: ["nzId", "nzSize", "nzStatus", "nzOptionHeightPx", "nzOptionOverflowSize", "nzDropdownClassName", "nzDropdownMatchSelectWidth", "nzDropdownStyle", "nzNotFoundContent", "nzPlaceHolder", "nzMaxTagCount", "nzDropdownRender", "nzCustomTemplate", "nzSuffixIcon", "nzClearIcon", "nzRemoveIcon", "nzMenuItemSelectedIcon", "nzTokenSeparators", "nzMaxTagPlaceholder", "nzMaxMultipleCount", "nzMode", "nzFilterOption", "compareWith", "nzAllowClear", "nzBorderless", "nzShowSearch", "nzLoading", "nzAutoFocus", "nzAutoClearSearchValue", "nzServerSearch", "nzDisabled", "nzOpen", "nzBackdrop", "nzOptions", "nzShowArrow"], outputs: ["nzOnSearch", "nzScrollToBottom", "nzOpenChange", "nzBlur", "nzFocus"], exportAs: ["nzSelect"] }, { type: i12.NzOptionComponent, selector: "nz-option", inputs: ["nzLabel", "nzValue", "nzDisabled", "nzHide", "nzCustomContent"], exportAs: ["nzOption"] }, { type: i13.NzCascaderComponent, selector: "nz-cascader, [nz-cascader]", inputs: ["nzOptionRender", "nzShowInput", "nzShowArrow", "nzAllowClear", "nzAutoFocus", "nzChangeOnSelect", "nzDisabled", "nzColumnClassName", "nzExpandTrigger", "nzValueProperty", "nzLabelRender", "nzLabelProperty", "nzNotFoundContent", "nzSize", "nzBackdrop", "nzShowSearch", "nzPlaceHolder", "nzMenuClassName", "nzMenuStyle", "nzMouseEnterDelay", "nzMouseLeaveDelay", "nzStatus", "nzTriggerAction", "nzChangeOn", "nzLoadData", "nzSuffixIcon", "nzExpandIcon", "nzOptions"], outputs: ["nzVisibleChange", "nzSelectionChange", "nzSelect", "nzClear"], exportAs: ["nzCascader"] }, { type: i14.NzDatePickerComponent, selector: "nz-date-picker,nz-week-picker,nz-month-picker,nz-year-picker,nz-range-picker", inputs: ["nzAllowClear", "nzAutoFocus", "nzDisabled", "nzBorderless", "nzInputReadOnly", "nzInline", "nzOpen", "nzDisabledDate", "nzLocale", "nzPlaceHolder", "nzPopupStyle", "nzDropdownClassName", "nzSize", "nzStatus", "nzFormat", "nzDateRender", "nzDisabledTime", "nzRenderExtraFooter", "nzShowToday", "nzMode", "nzShowNow", "nzRanges", "nzDefaultPickerValue", "nzSeparator", "nzSuffixIcon", "nzBackdrop", "nzId", "nzPlacement", "nzShowTime"], outputs: ["nzOnPanelChange", "nzOnCalendarChange", "nzOnOk", "nzOnOpenChange"], exportAs: ["nzDatePicker"] }, { type: i15.UploadComponent, selector: "atr-img-upload", inputs: ["opts", "isEdit", "allowChangSeq", "showUploadList"], outputs: ["afterChange", "optsChange", "onBeforeUpload"] }, { type: i16.QuillEditorComponent, selector: "app-quill-editor", inputs: ["placeholder", "styles", "value", "readOnly", "needImgSeq"] }, { type: i17.NzButtonComponent, selector: "button[nz-button], a[nz-button]", inputs: ["nzBlock", "nzGhost", "nzSearch", "nzLoading", "nzDanger", "disabled", "tabIndex", "nzType", "nzShape", "nzSize"], exportAs: ["nzButton"] }], directives: [{ type: i18.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i6.NzFormDirective, selector: "[nz-form]", inputs: ["nzLayout", "nzNoColon", "nzAutoTips", "nzDisableAutoTips", "nzTooltipIcon"], exportAs: ["nzForm"] }, { type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i19.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { type: i18.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i19.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { type: i18.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i20.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i14.NzRangePickerComponent, selector: "nz-range-picker", exportAs: ["nzRangePicker"] }, { type: i21.NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: ["nzWaveExtraNode"], exportAs: ["nzWave"] }, { type: i22.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }], pipes: { "safeHtml": i23.SafeHtmlPipe, "defVal": i24.DefaultValPipe } });
|
|
559
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: AtrFormComponent, decorators: [{
|
|
560
|
-
type: Component,
|
|
561
|
-
args: [{ selector: 'atr-form', template: "<atr-view-form *ngIf=\"formOpts.type == 'view'\" [dicts]=\"dicts\" [atrForm]=\"atrForm\"\r\n [formOpts]=\"formOpts\"></atr-view-form>\r\n\r\n<form nz-form [formGroup]=\"atrForm\" *ngIf=\"formOpts.type != 'view'\">\r\n <div nz-row nzGutter=\"8\" nzType=\"flex\" nzAlign=\"top\">\r\n <ng-container *ngFor=\"let item of formOpts.items\">\r\n <div nz-col nzSpan=\"24\" class=\"form-title\" *ngIf=\"item.type == 'title'\">\r\n {{item.label}}\r\n </div>\r\n <div nz-col [nzSpan]=\"item.span\" *ngIf=\"isShow(item.isHidden,item.operator)\">\r\n <ng-content *ngTemplateOutlet=\"item.firstTemp\"></ng-content>\r\n <nz-form-item *ngIf=\"item.type != 'title'\">\r\n <nz-form-label [nzSm]=\"item.lspan\" [nzXs]=\"24\" [nzRequired]=\"isRequired(item)\">{{item.label}}</nz-form-label>\r\n <nz-form-control [nzSm]=\"item.cspan\" [nzXs]=\"24\">\r\n <div style=\"display: flex;width: 100%\">\r\n <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\"\r\n nzVirtualHeight=\"330px\"\r\n style=\"flex: 1\"\r\n >\r\n </nz-tree-select>\r\n <!-- <nz-tree-select *ngIf=\"item.type == 'treeSelect'\"\r\n [nzAllowClear]=\"!item.notNull\"\r\n [nzNodes]=\"item.treeList\"\r\n nzShowSearch=\"true\"\r\n nzHideUnMatched=\"true\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzShowSearch]=\"true\"\r\n [formControlName]=\"item.key\"\r\n [nzMultiple]=\"item.selectUrl.isMultiple\"\r\n [nzDisabled]=\"item.readonly\" style=\"flex: 1\"\r\n >\r\n </nz-tree-select> -->\r\n <app-select-icons *ngIf=\"item.type == 'selectIcon'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n [readonly]=\"item.readonly \"\r\n style=\"flex: 1\"\r\n [formControlName]=\"item.key\">\r\n </app-select-icons>\r\n <input *ngIf=\"item.type == 'text'\" nz-input placeholder=\"{{item.placeholder}}\"\r\n (ngModelChange)=\"formChange($event,item)\"\r\n [readonly]=\"item.readonly || formOpts.type == 'view'\"\r\n [formControlName]=\"item.key\"/>\r\n <textarea *ngIf=\"item.type == 'textarea'\" nz-input [rows]=\"item.rows\" placeholder=\"{{item.placeholder}}\"\r\n [formControlName]=\"item.key\" [readonly]=\"item.readonly|| formOpts.type == 'view'\"></textarea>\r\n <nz-input-number *ngIf=\"item.type == 'number'\" nzPlaceHolder=\"{{item.placeholder}}\"\r\n [nzMin]=\"item.minNumber\" [nzMax]=\"item.maxNumber\"\r\n [formControlName]=\"item.key\"></nz-input-number>\r\n <nz-radio-group *ngIf=\"item.type == 'radio'\" [formControlName]=\"item.key\">\r\n <label nz-radio *ngFor=\"let o of item.dictList\" [nzValue]=\"o.value\">{{o.label}}</label>\r\n </nz-radio-group>\r\n <nz-checkbox-wrapper *ngIf=\"item.type == 'checkbox'\" [formControlName]=\"item.key\">\r\n <div nz-row>\r\n <div *ngFor=\"let o of item.dictList\" nz-col>\r\n <label nz-checkbox [nzValue]=\"o.value\">{{o.label}}</label></div>\r\n </div>\r\n </nz-checkbox-wrapper>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'select'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n >\r\n <nz-option *ngFor=\"let o of dicts[item.dictCode]\" [nzLabel]=\"o.typeName\" [nzValue]=\"o.id\"></nz-option>\r\n </nz-select>\r\n <nz-select\r\n [nzShowSearch]=\"true\"\r\n *ngIf=\"item.type == 'selectc'\"\r\n nzPlaceHolder=\"{{item.placeholder}}\"\r\n nzAllowClear=\"true\"\r\n [formControlName]=\"item.key\"\r\n nzServerSearch\r\n [nzMode]=\"item.nzMode || 'default'\"\r\n nzDisabled=\"{{item.readonly|| formOpts.type == 'view'}}\"\r\n (ngModelChange)=\"selectChange($event,item)\"\r\n >\r\n <nz-option *ngFor=\"let o of item.dictList\" [nzLabel]=\"o.label\" [nzValue]=\"o.value\"></nz-option>\r\n </nz-select>\r\n <nz-cascader [nzDisabled]=\"item.readonly\" style=\"flex: 1\" [nzAllowClear]=\"!item.notNull\"\r\n [nzValueProperty]=\"'nzValueProperty'\"\r\n [nzShowSearch]=\"true\" *ngIf=\"item.type == 'cascader'\"\r\n [nzChangeOnSelect] = \"item.allowSelectNode\"\r\n [nzOptions]=\"item.dictList\" [formControlName]=\"item.key\"></nz-cascader>\r\n <nz-date-picker *ngIf=\"item.type == 'date'\" [nzFormat]=\"item.dateFormat ? item.dateFormat : 'yyyy-MM-dd'\"\r\n [nzShowTime]=\"showTime(item)\" style=\"flex: 1\"\r\n [nzDisabled]=\"formOpts.type == 'view' || item.readonly \"\r\n [formControlName]=\"item.key\"></nz-date-picker>\r\n <nz-range-picker *ngIf=\"item.type == 'dateRange'\" style=\"flex: 1\"\r\n [nzShowTime]=\"item.nzShowTime? item.nzShowTime : false\"\r\n [formControlName]=\"item.key\"\r\n [nzFormat]=\"item.nzShowTime && item.nzShowTime.nzFormat ? ('yyyy-MM-dd '+ item.nzShowTime.nzFormat) : 'yyyy-MM-dd'\"\r\n [nzPlaceHolder]=\"['\u5F00\u59CB\u65F6\u95F4', '\u7ED3\u675F\u65F6\u95F4']\"></nz-range-picker>\r\n\r\n <input *ngIf=\"item.type == 'image'\" nz-input [formControlName]=\"item.key\" [hidden]=\"true\"/>\r\n <atr-img-upload *ngIf=\"item.type == 'image'\" [(opts)]=\"item.imageOpts\"\r\n (onBeforeUpload)=\"onBeforeUpload($event,item)\"\r\n (afterChange)=\"imageUploadChange($event)\"></atr-img-upload>\r\n\r\n <!-- <editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" [config]=\"{initialFrameHeight:item.height}\" ></editor>-->\r\n <app-quill-editor *ngIf=\"item.type == 'editor'\" [formControlName]=\"item.key\" (ngModelChange)=\"editChange($event,item)\"\r\n [styles]=\"{height:item.height > 0 ? item.height + 'px' : '250px'}\"></app-quill-editor>\r\n <div *ngIf=\"item.type == 'word'\" [innerHTML]=\"item.value |defVal:item.defaultValue |safeHtml\">\r\n </div>\r\n <div *ngIf=\"item.type == 'buttons'\">\r\n <ng-container *ngFor=\"let btn of item.buttons\">\r\n <button nz-button type=\"button\" [nzType]=\"btn.btnType |defVal: 'default'\"\r\n class=\"ant-btn ant-btn-primary\"\r\n style=\"margin-right: 5px\" *ngIf=\"btn.isShow || isShow(false,btn.operator)\"\r\n (click)=\"doAction(btn,$event)\">\r\n <span>{{btn.name}}</span></button>\r\n </ng-container>\r\n </div>\r\n <ng-container *ngFor=\"let valid of item.validators\">\r\n <ng-container *ngIf=\"atrForm.get(item.key).hasError(valid.type) && (atrForm.get(item.key).dirty )\">\r\n <div style=\"color:red; height: 15px;margin: 0;line-height: 15px;\">{{valid.errorLabel}}</div>\r\n </ng-container>\r\n </ng-container>\r\n <button nz-button nzType=\"default\" style=\"cursor: default;background-color: #fafafa;color: black\"\r\n *ngIf=\"item.ends\" disabled>\r\n {{item.ends}}\r\n </button>\r\n <button *ngIf=\"item.button?.isShow\" type=\"button\" class=\"ant-btn ant-btn-primary\"\r\n (click)=\"doAction(item.button,$event)\">\r\n <span>{{item.button.name}}</span></button>\r\n </div>\r\n <div *ngIf=\"item.proposal\" style=\"color: red;width: 100%\">{{item.proposal}}</div>\r\n </nz-form-control>\r\n </nz-form-item>\r\n <ng-content *ngTemplateOutlet=\"item.temp\"></ng-content>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n</form>\r\n", styles: [":host ::ng-deep .ant-form-item{margin:0 0 10px}:host ::ng-deep .ant-form-item-label{text-align:left}:host ::ng-deep nz-input-number{width:100%}:host .form-title{height:50px;line-height:50px;font-weight:500;font-size:20px;border-bottom:1px solid #e8e8e8;border-radius:4px 4px 0 0;margin-bottom:14px;margin-top:11px}\n"] }]
|
|
562
|
-
}], ctorParameters: function () { return [{ type: i1.ShareService }, { type: i2.HttpService }, { type: i3.FormBuilder }, { type: i4.DictService }, { type: i0.Injector }, { type: undefined, decorators: [{
|
|
563
|
-
type: Inject,
|
|
564
|
-
args: [LOCALE_ID]
|
|
565
|
-
}] }]; }, propDecorators: { formOpts: [{
|
|
566
|
-
type: Input
|
|
567
|
-
}], formAction: [{
|
|
568
|
-
type: Output
|
|
569
|
-
}], uploadAction: [{
|
|
570
|
-
type: Output
|
|
571
|
-
}], quillChange: [{
|
|
572
|
-
type: Output
|
|
573
|
-
}] } });
|
|
574
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2Zvcm0vZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL2Zvcm0vZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLEtBQUssRUFBWSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUcsT0FBTyxFQUF5QixXQUFXLEVBQUUsVUFBVSxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUYsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDOUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRzNDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBb0QsTUFBTSwrQkFBK0IsQ0FBQztBQUVsSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXhELE1BQU0sT0FBTyxnQkFBZ0I7SUFTM0IsMkNBQTJDO0lBQzNDLFlBQW9CLFlBQTBCLEVBQVUsV0FBd0IsRUFDNUQsRUFBZSxFQUFVLFdBQXdCLEVBQVUsUUFBa0IsRUFBNkIsTUFBYztRQUR4SCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQzVELE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7UUFBNkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQVQ1SSxVQUFLLEdBQVEsRUFBRSxDQUFDO1FBR04sZUFBVSxHQUFH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LCBJbmplY3QsIExPQ0FMRV9JRCwgT3V0cHV0LCBFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0Zvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzLCBWYWxpZGF0b3JGbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge3RlbHBob25lVmFsaWRhdG9yfSBmcm9tICcuLi92YWxpZGF0b3JzL2F0ci12YWxpZHRvcnMnO1xyXG5pbXBvcnQge2Zvcm1hdERhdGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7U2hhcmVTZXJ2aWNlfSBmcm9tICcuLi9zaGFyZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtlbnZpcm9ubWVudH0gZnJvbSBcIm5nLXpvcnJvLWFudGQvY29yZS9lbnZpcm9ubWVudHNcIjtcclxuaW1wb3J0IHthdHJfc3RhdGljX2RhdGFzLCBBdHJGb3JtRGV0YWlsLCBBdHJGb3JtT3B0LCBGb3JtQWN0aW9uLCBmb3JtQnV0dG9ufSBmcm9tIFwiLi4vLi4vLi4vY29yZS9iYXNlL2F0ci1jb21tb25cIjtcclxuaW1wb3J0IHtEaWN0U2VydmljZX0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvc2VydmljZXMvZGljdC9kaWN0LnNlcnZpY2VcIjtcclxuaW1wb3J0IHtUb29sc1V0aWx9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3V0aWxzL1Rvb2xzVXRpbFwiO1xyXG5pbXBvcnQge0h0dHBTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9odHRwLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXRyLWZvcm0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9mb3JtLmNvbXBvbmVudC5sZXNzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEF0ckZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICBkaWN0czogYW55ID0ge307XHJcbiAgYXRyRm9ybTogRm9ybUdyb3VwIHwgYW55O1xyXG4gIEBJbnB1dCgpIGZvcm1PcHRzOiBBdHJGb3JtT3B0IHwgYW55O1xyXG4gIEBPdXRwdXQoKSBmb3JtQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtQWN0aW9uPigpO1xyXG4gIEBPdXRwdXQoKSB1cGxvYWRBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgcXVpbGxDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2hhcmVTZXJ2aWNlOiBTaGFyZVNlcnZpY2UsIHByaXZhdGUgaHR0cFNlcnZpY2U6IEh0dHBTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIGRpY3RTZXJ2aWNlOiBEaWN0U2VydmljZSwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsIEBJbmplY3QoTE9DQUxFX0lEKSBwcml2YXRlIGxvY2FsZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmF0ckZvcm0gPSB0aGlzLmZiLmdyb3VwKHt9KTtcclxuICB9XHJcblxyXG4gIHJlc2V0TGF5b3V0KGl0ZW06IGFueSkge1xyXG4gICAgaWYgKCFpdGVtLmxzcGFuKSB7XHJcbiAgICAgIGl0ZW0ubHNwYW4gPSAyNDtcclxuICAgIH1cclxuICAgIGlmICghaXRlbS5jc3Bhbikge1xyXG4gICAgICBpdGVtLmNzcGFuID0gMjQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RDaGFuZ2UoZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IGFueSkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGlmIChldmVudC5zdG9wUHJvcGFnYXRpb24pIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcclxuICAgIH1cclxuICAgIGxldCBhY3Rpb246IEZvcm1BY3Rpb24gPSB7XHJcbiAgICAgIG5hbWU6IGl0ZW0ua2V5LFxyXG4gICAgICBjb2RlOiAnc2VsZWN0Q2hhZ25lJyxcclxuICAgIH07XHJcbiAgICB0aGlzLmZvcm1BY3Rpb24uZW1pdChhY3Rpb24pO1xyXG4gIH1cclxuICBmb3JtQ2hhbmdlKGV2ZW50OiBhbnksIGl0ZW06IGFueSl7XHJcbiAgICB0aGlzLmZvcm1BY3Rpb24uZW1pdCgge1xyXG4gICAgICBuYW1lOiAnZm9ybUNoYW5nZScsXHJcbiAgICAgIGNvZGU6IGl0ZW0ua2V5LFxyXG4gICAgfSk7XHJcbiAgfVxyXG4gIGRvQWN0aW9uKGl0ZW06IGZvcm1CdXR0b24sIGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgaWYgKGV2ZW50LnN0b3BQcm9wYWdhdGlvbikge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgfVxyXG4gICAgbGV0IGFjdGlvbjogRm9ybUFjdGlvbiA9IHtcclxuICAgICAgbmFtZTogaXRlbS5uYW1lLFxyXG4gICAgICBjb2RlOiBpdGVtLmNvZGUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5mb3JtQWN0aW9uLmVtaXQoYWN0aW9uKTtcclxuICB9XHJcblxyXG4gIHNldFZhbHVlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLmF0ckZvcm0uZ2V0KGtleSk/LnNldFZhbHVlKHZhbHVlKTtcclxuICB9XHJcblxyXG5cclxuICBnZXREaWNMaXN0KGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5zaGFyZVNlcnZpY2UuZ2V0RGljTGlzdChpdGVtKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMjAwICYmIHJlcy5pdGVtKSB7XHJcbiAgICAgICAgaXRlbSA9IHJlcy5pdGVtXHJcbiAgICAgICAgdGhpcy5yZXNldEZvcm0oKTtcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgfVxyXG5cclxuICBjb252KGRhdGFzOiBhbnksIGtleXM6IGFueSk6IGFueSB7XHJcbiAgICByZXR1cm4gZGF0YXMubWFwKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgIGxldCBpdGVtOiBhbnkgPSB7fTtcclxuICAgICAgaWYgKGtleXMpIHtcclxuICAgICAgICBrZXlzLmZvckVhY2goKHY6IGFueSkgPT4ge1xyXG4gICAgICAgICAgbGV0IHZzID0gdi5zcGxpdChcInxcIik7XHJcbiAgICAgICAgICBjaGlsZFt2c1swXV0gPSBjaGlsZFt2c1sxXV07XHJcbiAgICAgICAgICBpdGVtW3ZzWzBdXSA9IGNoaWxkW3ZzWzFdXTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtID0gY2hpbGQ7XHJcbiAgICAgIH1cclxuICAgICAgY2hpbGQubnpWYWx1ZVByb3BlcnR5ID0gaXRlbTtcclxuICAgICAgaWYgKGNoaWxkLmNoaWxkcmVuKSB7XHJcbiAgICAgICAgY2hpbGQuY2hpbGRyZW4gPSB0aGlzLmNvbnYoY2hpbGQuY2hpbGRyZW4sIGtleXMpXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2hpbGQuaXNMZWFmID0gdHJ1ZVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBjaGlsZDtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBnZXRDYXNjYWRlckRlZmF1bHRWYWx1ZShsaXN0OiBhbnksIGluZGV4OiBhbnksIHZhbHVlOiBhbnkpIHtcclxuICAgIGxpc3QuZm9yRWFjaCgoZGljOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRpYy52YWx1ZSA9PSB2YWx1ZVtpbmRleF0pIHtcclxuICAgICAgICB2YWx1ZVtpbmRleF0gPSBkaWMubnpWYWx1ZVByb3BlcnR5XHJcbiAgICAgICAgaWYgKGRpYy5jaGlsZHJlbikge1xyXG4gICAgICAgICAgdmFsdWUgPSB0aGlzLmdldENhc2NhZGVyRGVmYXVsdFZhbHVlKGRpYy5jaGlsZHJlbiwgaW5kZXggKyAxLCB2YWx1ZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICByZXR1cm4gdmFsdWVcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMuZm9ybU9wdHMgJiYgdGhpcy5mb3JtT3B0cy5pdGVtcykge1xyXG4gICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgICAvLyB0aGlzLmF0ckZvcm0uYWRkQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1Db250cm9sKCkpO1xyXG4gICAgICAgIHRoaXMucmVzZXRMYXlvdXQoaXRlbSlcclxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmZvcm1PcHRzLnR5cGUgPT0gJ2FkZCcgPyBpdGVtLmRlZmF1bHRWYWx1ZSA6IGl0ZW0udmFsdWU7XHJcbiAgICAgICAgY29uc29sZS5sb2codmFsdWUpO1xyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ2NoZWNrYm94Jykge1xyXG4gICAgICAgICAgaWYgKHRoaXMuZm9ybU9wdHMudHlwZSA9PSAnYWRkJykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IGl0ZW0uZGljdExpc3QuZmlsdGVyKCh2OiBhbnkpID0+IHYuaXNTZWxlY3QpLm1hcCgoZGljOiBhbnkpID0+IGRpYy52YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ3RyZWVTZWxlY3QnICYmIGl0ZW0uc2VsZWN0VXJsLnVybCkge1xyXG4gICAgICAgICAgbGV0IGtleXMgPSBpdGVtLnNlbGVjdFVybC5jb252ZXJ0LnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlLnBvc3QoaXRlbS5zZWxlY3RVcmwudXJsLCB7fSwgVG9vbHNVdGlsLmdldEh0dHBPcHRpb25zKCkpLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLnRyZWVMaXN0ID0gcmVzLmRhdGEuZmlsdGVyKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAga2V5cy5mb3JFYWNoKCh2OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB2cyA9IHYuc3BsaXQoXCJ8XCIpO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRbdnNbMF1dID0gY2hpbGRbdnNbMV1dO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PSAnY2FzY2FkZXInICYmIGl0ZW0uc2VsZWN0VXJsLnVybCkge1xyXG4gICAgICAgICAgbGV0IGtleXM6IGFueSA9IG51bGxcclxuICAgICAgICAgIGlmIChpdGVtLnNlbGVjdFVybC5jb252ZXJ0KSB7XHJcbiAgICAgICAgICAgIGtleXMgPSBpdGVtLnNlbGVjdFVybC5jb252ZXJ0LnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaXRlbS5zZWxlY3RVcmwudXJsKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RVcmwgPSBpdGVtLnNlbGVjdFVybDtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdFVybC5ob3N0ID09ICdvc3MnKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5odHRwU2VydmljZS5nZXRPc3Moc2VsZWN0VXJsLnVybCkuc3Vic2NyaWJlKHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpdGVtLmRpY3RMaXN0ID0gdGhpcy5jb252KEpTT04ucGFyc2UocmVzKSwga2V5cylcclxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRDYXNjYWRlckRlZmF1bHRWYWx1ZShpdGVtLmRpY3RMaXN0LCAwLCB2YWx1ZSlcclxuICAgICAgICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZShpdGVtLmtleSwgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmh0dHBTZXJ2aWNlLnBvc3Qoc2VsZWN0VXJsLnVybCwge30sIFRvb2xzVXRpbC5nZXRIdHRwT3B0aW9ucygpKS5zdWJzY3JpYmUocmVzID0+IHtcclxuICAgICAgICAgICAgICAgIGl0ZW0uZGljdExpc3QgPSB0aGlzLmNvbnYocmVzLmRhdGEsIGtleXMpXHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0Q2FzY2FkZXJEZWZhdWx0VmFsdWUoaXRlbS5kaWN0TGlzdCwgMCwgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUoaXRlbS5rZXksIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS50eXBlID09IFwic2VsZWN0XCIpIHtcclxuICAgICAgICAgIHRoaXMuZ2V0RGljdFZhbHVlKGl0ZW0uZGljdENvZGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS50eXBlID09ICdzZWxlY3RjJykge1xyXG4gICAgICAgICAgaWYgKCFpdGVtLmRpY3RMaXN0IHx8IChpdGVtLnNlbGVjdFVybCAmJiBpdGVtLnNlbGVjdFVybC5pZ25vcmVEaWN0TGlzdCkpIHtcclxuICAgICAgICAgICAgdGhpcy5nZXREaWNMaXN0KGl0ZW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaXRlbS50eXBlID09IFwidGV4dGFyZWFcIiAmJiAhaXRlbS5yb3dzKVxyXG4gICAgICAgICAgaXRlbS5yb3dzID0gNTtcclxuICAgICAgICBpZiAoaXRlbS50eXBlID09IFwiaW1hZ2VcIikge1xyXG4gICAgICAgICAgaXRlbS5pbWFnZU9wdHMua2V5ID0gaXRlbS5rZXlcclxuICAgICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBsZXQgaW1hZ2VzOiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgbGV0IGxpc3QgPSB2YWx1ZS5zcGxpdChcIixcIik7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiBsaXN0KSB7XHJcbiAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgICAgICB1aWQ6IFwiLTFcIixcclxuICAgICAgICAgICAgICAgIHVybDogYXRyX3N0YXRpY19kYXRhcy5PU1NfVVJMICsga2V5XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpdGVtLmltYWdlT3B0cy5pbWFnZUxpc3QgPSBpbWFnZXM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ2VkaXRvcicpIHtcclxuICAgICAgICAgIGlmICghdmFsdWUpIHZhbHVlID0gXCJcIlxyXG4gICAgICAgICAgaWYgKCFpdGVtLmhlaWdodClcclxuICAgICAgICAgICAgaXRlbS5oZWlnaHQgPSAzMDBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghaXRlbS5zcGFuKVxyXG4gICAgICAgICAgaXRlbS5zcGFuID0gOFxyXG4gICAgICAgIGlmICh0eXBlb2YgaXRlbS5pc1JlcXVpcmVkICE9ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBpdGVtLmlzUmVxdWlyZWQgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgdGVtcFZhbGlkYXRvcnM6IFZhbGlkYXRvckZuW10gPSBbXTtcclxuICAgICAgICBpZiAoaXRlbS52YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCB2YWxpZGF0b3Igb2YgaXRlbS52YWxpZGF0b3JzKSB7XHJcbiAgICAgICAgICAgIGlmICh2YWxpZGF0b3IudHlwZSA9PSBcInJlcXVpcmVkXCIpIHtcclxuICAgICAgICAgICAgICBpdGVtLmlzUmVxdWlyZWQgPSB0cnVlXHJcbiAgICAgICAgICAgICAgdGVtcFZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRvci50eXBlID09IFwiZW1haWxcIikge1xyXG4gICAgICAgICAgICAgIHRlbXBWYWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5lbWFpbClcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxpZGF0b3IudHlwZSA9PSBcIm1heGxlbmd0aFwiKSB7XHJcbiAgICAgICAgICAgICAgdGVtcFZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCh2YWxpZGF0b3IubWF4bGVuZ3RoID8gdmFsaWRhdG9yLm1heGxlbmd0aCA6IDEpKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRvci50eXBlID09IFwibWlubGVuZ3RoXCIpIHtcclxuICAgICAgICAgICAgICB0ZW1wVmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKHZhbGlkYXRvci5taW5sZW5ndGggPyB2YWxpZGF0b3IubWlubGVuZ3RoIDogMSkpXHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsaWRhdG9yLnR5cGUgPT0gXCJ0ZWxwaG9uZVwiKSB7XHJcbiAgICAgICAgICAgICAgdGVtcFZhbGlkYXRvcnMucHVzaCh0ZWxwaG9uZVZhbGlkYXRvcigpKVxyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbGlkYXRvci50eXBlID09IFwicGF0dGVyblwiKSB7XHJcbiAgICAgICAgICAgICAgdGVtcFZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnBhdHRlcm4odmFsaWRhdG9yLnBhdHRlcm5WYWx1ZSkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSB7dmFsdWU6IHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogbnVsbCwgZGlzYWJsZWQ6IGl0ZW0uZGlzYWJsZSA/IGl0ZW0uZGlzYWJsZSA6IGZhbHNlfVxyXG4gICAgICAgIGlmICh0ZW1wVmFsaWRhdG9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmF0ckZvcm0uYWRkQ29udHJvbChpdGVtLmtleSwgbmV3IEZvcm1Db250cm9sKGRlZmF1bHRWYWx1ZSwgdGVtcFZhbGlkYXRvcnMpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hdHJGb3JtLmFkZENvbnRyb2woaXRlbS5rZXksIG5ldyBGb3JtQ29udHJvbChkZWZhdWx0VmFsdWUpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCIgdGhpcy5hdHJGb3JtXCIsIHRoaXMuYXRyRm9ybSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbXBhcmUodmFsdWU6IGFueSwgb3BlcmF0b3I6IGFueSwgdGFyZ2V0OiBhbnkpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1JpZ2h0ID0gZmFsc2U7XHJcbiAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XHJcbiAgICAgIGNhc2UgJ2VxJyA6XHJcbiAgICAgICAgaWYgKHZhbHVlID09IHRhcmdldCkge1xyXG4gICAgICAgICAgaXNSaWdodCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdnaCcgOlxyXG4gICAgICAgIGlmICh2YWx1ZSA+PSB0YXJnZXQpIHtcclxuICAgICAgICAgIGlzUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbm90RW1wdHknOlxyXG4gICAgICAgIGlzUmlnaHQgPSBmYWxzZTtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgIGlzUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnZW1wdHknOlxyXG4gICAgICAgIGlzUmlnaHQgPSB0cnVlO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdlbXB0eScsICEhdmFsdWUpXHJcbiAgICAgICAgaWYgKCEhdmFsdWUpIHtcclxuXHJcbiAgICAgICAgICBpc1JpZ2h0ID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0IDpcclxuICAgICAgICBpc1JpZ2h0ID0gZmFsc2U7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gaXNSaWdodDtcclxuICB9XHJcblxyXG4gIGNoZWNrSXNTaG93QmFzZShvcDogYW55KTogYm9vbGVhbiB7XHJcbiAgICBsZXQgaXNTaG93ID0gZmFsc2U7XHJcbiAgICBpZiAob3AubGVuZ3RoID4gMSkge1xyXG4gICAgICBsZXQgdmFsdWUgPSB0aGlzLmF0ckZvcm0uZ2V0KG9wWzBdKS52YWx1ZTtcclxuICAgICAgaXNTaG93ID0gdGhpcy5jb21wYXJlKHZhbHVlLCBvcFsxXSwgb3BbMl0pXHJcbiAgICB9IGVsc2VcclxuICAgICAgaXNTaG93ID0gZmFsc2U7XHJcblxyXG4gICAgcmV0dXJuIGlzU2hvdztcclxuICB9XHJcblxyXG4gIGlzUmVxdWlyZWQoaXRlbTogQXRyRm9ybURldGFpbCkge1xyXG4gICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xyXG4gICAgbGV0IGlzUmVxdWlyZWQgPSBpdGVtLmlzUmVxdWlyZWQ7XHJcbiAgICBsZXQgdHlwZSA9IHR5cGVvZiBpc1JlcXVpcmVkO1xyXG4gICAgaWYgKHR5cGUgPT0gXCJib29sZWFuXCIpIHtcclxuICAgICAgcmV0dXJuIGlzUmVxdWlyZWRcclxuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInN0cmluZ1wiKSB7XHJcblxyXG4gICAgICByZXN1bHQgPSB0aGlzLmlzU2hvdyhmYWxzZSwgaXNSZXF1aXJlZCk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcImlzUmVxdWlyZWRcIiwgcmVzdWx0KTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBpc1Nob3coaXNIaWRkZW46IGFueSwgb3BlcmF0b3I6IGFueSkge1xyXG4gICAgaWYgKGlzSGlkZGVuKSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIGxldCBpc1Nob3cgPSBmYWxzZTtcclxuICAgIGlmICghb3BlcmF0b3IgfHwgb3BlcmF0b3IgPT0gbnVsbCB8fCBvcGVyYXRvciA9PSBcIlwiKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIGlmIChvcGVyYXRvci5pbmRleE9mKCcmJicpID4gMCkge1xyXG4gICAgICAvLyBhfGVxfGIgJiZjfGVxfGRcclxuICAgICAgY29uc3Qgb3BzID0gb3BlcmF0b3Iuc3BsaXQoJyYmJyk7XHJcbiAgICAgIGlmIChvcHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpwcmVmZXItZm9yLW9mXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGlzU2hvdyA9IHRydWVcclxuICAgICAgICAgIGlmICghdGhpcy5jaGVja0lzU2hvd0Jhc2Uob3BzW2ldLnNwbGl0KCd8JykpKSB7XHJcbiAgICAgICAgICAgIGlzU2hvdyA9IGZhbHNlO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAob3BlcmF0b3IuaW5kZXhPZignfHwnKSA+IDApIHtcclxuICAgICAgLy8gYXxlcXxifHxjfGVxfGRcclxuICAgICAgY29uc3Qgb3BzID0gb3BlcmF0b3Iuc3BsaXQoJyYmJyk7XHJcbiAgICAgIGlmIChvcHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpc1Nob3cgPSBmYWxzZTtcclxuICAgICAgICAgIGlmICh0aGlzLmNoZWNrSXNTaG93QmFzZShvcHNbaV0uc3BsaXQoJ3wnKSkpIHtcclxuICAgICAgICAgICAgaXNTaG93ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgb3AgPSBvcGVyYXRvci5zcGxpdChcInxcIik7XHJcbiAgICAgIGlzU2hvdyA9IHRoaXMuY2hlY2tJc1Nob3dCYXNlKG9wKTtcclxuICAgIH1cclxuICAgIHJldHVybiBpc1Nob3c7XHJcbiAgfVxyXG5cclxuICBnZXREaWN0VmFsdWUoY29kZTogc3RyaW5nKSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcIjk5OTlcIik7XHJcbiAgICB0aGlzLmRpY3RTZXJ2aWNlLmdldERpY3RCeWNvZGUoY29kZSkuc3Vic2NyaWJlKFxyXG4gICAgICByZXN1bHQgPT4ge1xyXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0ICE9IG51bGwpXHJcbiAgICAgICAgICB0aGlzLmRpY3RzW2NvZGVdID0gcmVzdWx0LmRpY3RzO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgdGhpcy5kaWN0c1tjb2RlXSA9IFtdO1xyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBpbWFnZVVwbG9hZENoYW5nZShlOiBhbnkpIHtcclxuICAgIGlmIChlLmtleSkge1xyXG4gICAgICB0aGlzLmF0ckZvcm0uZ2V0KGUua2V5KS5zZXRWYWx1ZShlLnZhbHVlcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkJlZm9yZVVwbG9hZChlOiBhbnksIGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy51cGxvYWRBY3Rpb24uZW1pdCh7Y29kZTogJ29uQmVmb3JlVXBsb2FkJywgZGF0YTogey4uLmUuZGF0YSwga2V5OiBpdGVtLmtleX19KVxyXG4gIH1cclxuXHJcbiAgcmVzZXRGb3JtKCkge1xyXG4gICAgLy8gdGhpcy5hdHJGb3JtLnJlc2V0KCk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhcImVkaXRvciByZXNldFwiKVxyXG4gICAgaWYgKHRoaXMuZm9ybU9wdHMgJiYgdGhpcy5mb3JtT3B0cy5pdGVtcykge1xyXG4gICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmZvcm1PcHRzLnR5cGUgPT0gJ2FkZCcgPyBpdGVtLmRlZmF1bHRWYWx1ZSA6IGl0ZW0udmFsdWU7XHJcbiAgICAgICAgaWYgKGl0ZW0udHlwZSA9PSBcImltYWdlXCIpIHtcclxuICAgICAgICAgIGl0ZW0uaW1hZ2VPcHRzLmtleSA9IGl0ZW0ua2V5XHJcbiAgICAgICAgICBsZXQgaW1hZ2VzOiBhbnkgPSBbXTtcclxuICAgICAgICAgIGlmICghdmFsdWUpIHZhbHVlID0gXCJcIjtcclxuICAgICAgICAgIGxldCBsaXN0ID0gdmFsdWUuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgZm9yIChsZXQga2V5IG9mIGxpc3QpIHtcclxuICAgICAgICAgICAgaWYgKGtleSAhPSBcIlwiKSB7XHJcbiAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAga2V5OiBrZXksXHJcbiAgICAgICAgICAgICAgICB1aWQ6IFwiLTFcIixcclxuICAgICAgICAgICAgICAgIHVybDogYXRyX3N0YXRpY19kYXRhcy5PU1NfVVJMICsga2V5XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaXRlbS5pbWFnZU9wdHMuaW1hZ2VMaXN0ID0gaW1hZ2VzO1xyXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coaW1hZ2VzKVxyXG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09IFwiZWRpdG9yXCIpIHtcclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWRpdG9yXCIpXHJcbiAgICAgICAgICBpZiAoIXZhbHVlKSB2YWx1ZSA9IFwiXCJcclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSBcInNlbGVjdFwiICYmIHZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICAgIHZhbHVlID0gbnVsbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSBcImNoZWNrYm94XCIgJiYgIXZhbHVlKSB7XHJcbiAgICAgICAgICB2YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXRyRm9ybS5nZXQoaXRlbS5rZXkpLnNldFZhbHVlKHZhbHVlICE9IHVuZGVmaW5lZCA/IHZhbHVlIDogbnVsbClcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGNvbnN0IGkgaW4gdGhpcy5hdHJGb3JtLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgdGhpcy5hdHJGb3JtLmNvbnRyb2xzW2ldLm1hcmtBc1VudG91Y2hlZCgpO1xyXG4gICAgICAgIHRoaXMuYXRyRm9ybS5jb250cm9sc1tpXS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgIHRoaXMuYXRyRm9ybS5jb250cm9sc1tpXS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBlZGl0Q2hhbmdlKGRhdGE6IGFueSwgaXRlbTogYW55KSB7XHJcbiAgICB0aGlzLnF1aWxsQ2hhbmdlLmVtaXQoe2NvZGU6ICdxdWlsbENoYW5nZScsIGU6IGRhdGEsIGZvcm1JdGVtOiBpdGVtfSk7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtVmFsdWUoKSB7XHJcbiAgICBsZXQgb2JqOiBhbnkgPSB7XHJcbiAgICAgIGlzVmFsaWQ6IGZhbHNlLFxyXG4gICAgICBtb2RlOiB0aGlzLmZvcm1PcHRzLnR5cGUsXHJcbiAgICAgIHZhbHVlOiB7fVxyXG4gICAgfTtcclxuICAgIGxldCB2YWx1ZSA9IHRoaXMuYXRyRm9ybS52YWx1ZTtcclxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHZhbHVlKSkge1xyXG4gICAgICAvLyAvL2NvbnNvbGUubG9nKGtleSk7XHJcbiAgICAgIGlmICh2YWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIHZhbHVlW2tleV0gIT0gbnVsbCAmJiB2YWx1ZVtrZXldICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGlmICh2YWx1ZVtrZXldIGluc3RhbmNlb2YgRGF0ZSkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmZvcm1PcHRzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmtleSAhPSBrZXkpIHtcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXRlbS5kYXRlRm9ybWF0KSB7XHJcbiAgICAgICAgICAgICAgb2JqLnZhbHVlW2tleV0gPSBmb3JtYXREYXRlKG5ldyBEYXRlKE51bWJlcih2YWx1ZVtrZXldKSksIGl0ZW0uZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PSAnZGF0ZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGZvcm1hdERhdGUobmV3IERhdGUoTnVtYmVyKHZhbHVlW2tleV0pKSwgJ3l5eXktTU0tZGQgMDA6MDA6MDAnLCB0aGlzLmxvY2FsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdkYXRlVGltZScpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGZvcm1hdERhdGUobmV3IERhdGUoTnVtYmVyKHZhbHVlW2tleV0pKSwgJ3l5eXktTU0tZGQgSEg6bW06c3MnLCB0aGlzLmxvY2FsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtrZXldIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgdGhpcy5mb3JtT3B0cy5pdGVtcykge1xyXG4gICAgICAgICAgICBpZiAoaXRlbS5rZXkgIT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGRhdGVGb3JtYXQgPSBpdGVtLmRhdGVGb3JtYXQgPyBpdGVtLmRhdGVGb3JtYXQgOiAneXl5eS1NTS1kZCAwMDowMDowMCc7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLnR5cGUgPT0gJ2RhdGVSYW5nZScpIHtcclxuICAgICAgICAgICAgICBsZXQgZGF0ZUFycjogYW55ID0gW107XHJcbiAgICAgICAgICAgICAgbGV0IG56U2hvd1RpbWUgPSBpdGVtLm56U2hvd1RpbWVcclxuICAgICAgICAgICAgICBpZiAobnpTaG93VGltZSkge1xyXG4gICAgICAgICAgICAgICAgZGF0ZUZvcm1hdCA9ICd5eXl5LU1NLWRkIEhIOm1tOnNzJ1xyXG4gICAgICAgICAgICAgICAgaWYgKG56U2hvd1RpbWUubnpGb3JtYXQpIHtcclxuICAgICAgICAgICAgICAgICAgZGF0ZUZvcm1hdCA9ICd5eXl5LU1NLWRkICcgKyBuelNob3dUaW1lLm56Rm9ybWF0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBmb3IgKGxldCBkIG9mIHZhbHVlW2tleV0pIHtcclxuICAgICAgICAgICAgICAgIGRhdGVBcnIucHVzaChmb3JtYXREYXRlKChkIGFzIERhdGUpLCBkYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGRhdGVBcnI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdjYXNjYWRlcicpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gJ3NlbGVjdCcgJiYgaXRlbS5uek1vZGUgPT0gJ211bHRpcGxlJykge1xyXG4gICAgICAgICAgICAgIG9iai52YWx1ZVtrZXldID0gdmFsdWVba2V5XS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG9iai52YWx1ZVtrZXldID0gdmFsdWVba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBnZXRGb3JtVmFpbGQoKTogYW55IHtcclxuICAgIGxldCBvYmo6IGFueSA9IHtcclxuICAgICAgaXNWYWxpZDogZmFsc2UsXHJcbiAgICAgIG1vZGU6IHRoaXMuZm9ybU9wdHMudHlwZSxcclxuICAgICAgdmFsdWU6IHt9XHJcbiAgICB9O1xyXG4gICAgZm9yIChjb25zdCBpIGluIHRoaXMuYXRyRm9ybS5jb250cm9scykge1xyXG4gICAgICB0aGlzLmF0ckZvcm0uY29udHJvbHNbaV0ubWFya0FzRGlydHkoKTtcclxuICAgICAgdGhpcy5hdHJGb3JtLmNvbnRyb2xzW2ldLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIH1cclxuICAgIG9iai5pc1ZhbGlkID0gdGhpcy5hdHJGb3JtLnZhbGlkXHJcbiAgICBsZXQgdmFsdWUgPSB0aGlzLmF0ckZvcm0udmFsdWU7XHJcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh2YWx1ZSkpIHtcclxuICAgICAgY29uc29sZS5sb2coa2V5KTtcclxuICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KGtleSkgJiYgdmFsdWVba2V5XSAhPSBudWxsICYmIHZhbHVlW2tleV0gIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlW2tleV0gaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHRoaXMuZm9ybU9wdHMuaXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKGl0ZW0ua2V5ICE9IGtleSkge1xyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmRhdGVGb3JtYXQpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGZvcm1hdERhdGUobmV3IERhdGUoTnVtYmVyKHZhbHVlW2tleV0pKSwgaXRlbS5kYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdkYXRlJykge1xyXG4gICAgICAgICAgICAgIG9iai52YWx1ZVtrZXldID0gZm9ybWF0RGF0ZShuZXcgRGF0ZShOdW1iZXIodmFsdWVba2V5XSkpLCAneXl5eS1NTS1kZCAwMDowMDowMCcsIHRoaXMubG9jYWxlKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gJ2RhdGVUaW1lJykge1xyXG4gICAgICAgICAgICAgIG9iai52YWx1ZVtrZXldID0gZm9ybWF0RGF0ZShuZXcgRGF0ZShOdW1iZXIodmFsdWVba2V5XSkpLCAneXl5eS1NTS1kZCBISDptbTpzcycsIHRoaXMubG9jYWxlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlW2tleV0gaW5zdGFuY2VvZiBBcnJheSkge1xyXG4gICAgICAgICAgZm9yIChsZXQgaXRlbSBvZiB0aGlzLmZvcm1PcHRzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtLmtleSAhPSBrZXkpIHtcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgZGF0ZUZvcm1hdCA9IGl0ZW0uZGF0ZUZvcm1hdCA/IGl0ZW0uZGF0ZUZvcm1hdCA6ICd5eXl5LU1NLWRkIDAwOjAwOjAwJztcclxuICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PSAnZGF0ZVJhbmdlJykge1xyXG4gICAgICAgICAgICAgIGxldCBkYXRlQXJyOiBhbnkgPSBbXTtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBkIG9mIHZhbHVlW2tleV0pIHtcclxuICAgICAgICAgICAgICAgIGRhdGVBcnIucHVzaChmb3JtYXREYXRlKChkIGFzIERhdGUpLCBkYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IGRhdGVBcnI7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09ICdjYXNjYWRlcicpIHtcclxuICAgICAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV1cclxuICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT0gJ3NlbGVjdCcgJiYgaXRlbS5uek1vZGUgPT0gJ211bHRpcGxlJykge1xyXG4gICAgICAgICAgICAgIG9iai52YWx1ZVtrZXldID0gdmFsdWVba2V5XS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG9iai52YWx1ZVtrZXldID0gdmFsdWVba2V5XTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBvYmoudmFsdWVba2V5XSA9IHZhbHVlW2tleV1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBzaG93VGltZShpdGVtOiBhbnkpIHtcclxuICAgIGlmIChpdGVtLm56U2hvd1RpbWUpIHtcclxuICAgICAgcmV0dXJuIGl0ZW0ubnpTaG93VGltZTtcclxuICAgIH1cclxuICAgIGlmICghaXRlbS5kYXRlRm9ybWF0IHx8IGl0ZW0uZGF0ZUZvcm1hdCA9PSBcInl5eXktTU0tZGRcIikge1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICAgIGxldCBmb3JtYXQgPSBpdGVtLmRhdGVGb3JtYXQ7XHJcbiAgICBpZiAoZm9ybWF0LmluZGV4T2YoXCJISFwiKSkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChmb3JtYXQuaW5kZXhPZihcIm1tXCIpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKGZvcm1hdC5pbmRleE9mKFwic3NcIikpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG59XHJcbiIsIjxhdHItdmlldy1mb3JtICpuZ0lmPVwiZm9ybU9wdHMudHlwZSA9PSAndmlldydcIiBbZGljdHNdPVwiZGljdHNcIiBbYXRyRm9ybV09XCJhdHJGb3JtXCJcclxuICAgICAgICAgICAgICAgW2Zvcm1PcHRzXT1cImZvcm1PcHRzXCI+PC9hdHItdmlldy1mb3JtPlxyXG5cclxuPGZvcm0gbnotZm9ybSBbZm9ybUdyb3VwXT1cImF0ckZvcm1cIiAqbmdJZj1cImZvcm1PcHRzLnR5cGUgIT0gJ3ZpZXcnXCI+XHJcbiAgPGRpdiBuei1yb3cgbnpHdXR0ZXI9XCI4XCIgbnpUeXBlPVwiZmxleFwiIG56QWxpZ249XCJ0b3BcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZm9ybU9wdHMuaXRlbXNcIj5cclxuICAgICAgPGRpdiBuei1jb2wgbnpTcGFuPVwiMjRcIiBjbGFzcz1cImZvcm0tdGl0bGVcIiAqbmdJZj1cIml0ZW0udHlwZSA9PSAndGl0bGUnXCI+XHJcbiAgICAgICAge3tpdGVtLmxhYmVsfX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgbnotY29sIFtuelNwYW5dPVwiaXRlbS5zcGFuXCIgKm5nSWY9XCJpc1Nob3coaXRlbS5pc0hpZGRlbixpdGVtLm9wZXJhdG9yKVwiPlxyXG4gICAgICAgIDxuZy1jb250ZW50ICpuZ1RlbXBsYXRlT3V0bGV0PVwiaXRlbS5maXJzdFRlbXBcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgPG56LWZvcm0taXRlbSAqbmdJZj1cIml0ZW0udHlwZSAhPSAndGl0bGUnXCI+XHJcbiAgICAgICAgICA8bnotZm9ybS1sYWJlbCBbbnpTbV09XCJpdGVtLmxzcGFuXCIgW256WHNdPVwiMjRcIiBbbnpSZXF1aXJlZF09XCJpc1JlcXVpcmVkKGl0ZW0pXCI+e3tpdGVtLmxhYmVsfX08L256LWZvcm0tbGFiZWw+XHJcbiAgICAgICAgICA8bnotZm9ybS1jb250cm9sIFtuelNtXT1cIml0ZW0uY3NwYW5cIiBbbnpYc109XCIyNFwiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDt3aWR0aDogMTAwJVwiPlxyXG4gICAgICAgICAgICAgIDxuei10cmVlLXNlbGVjdCAqbmdJZj1cIml0ZW0udHlwZSA9PSAndHJlZVNlbGVjdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpOb2Rlc109XCJpdGVtLnRyZWVMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnpTaG93U2VhcmNoPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG56SGlkZVVuTWF0Y2hlZD1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuelBsYWNlSG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpTaG93U2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCIhaXRlbS5ub3ROdWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256TXVsdGlwbGVdPVwiaXRlbS5zZWxlY3RVcmwuaXNNdWx0aXBsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuekRpc2FibGVkXT1cIml0ZW0ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuelZpcnR1YWxIZWlnaHQ9XCIzMzBweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDwvbnotdHJlZS1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPCEtLSA8bnotdHJlZS1zZWxlY3QgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3RyZWVTZWxlY3QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256QWxsb3dDbGVhcl09XCIhaXRlbS5ub3ROdWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256Tm9kZXNdPVwiaXRlbS50cmVlTGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG56U2hvd1NlYXJjaD1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuekhpZGVVbk1hdGNoZWQ9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnpQbGFjZUhvbGRlcj1cInt7aXRlbS5wbGFjZWhvbGRlcn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuek11bHRpcGxlXT1cIml0ZW0uc2VsZWN0VXJsLmlzTXVsdGlwbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpEaXNhYmxlZF09XCJpdGVtLnJlYWRvbmx5XCIgc3R5bGU9XCJmbGV4OiAxXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPC9uei10cmVlLXNlbGVjdD4gLS0+XHJcbiAgICAgICAgICAgICAgPGFwcC1zZWxlY3QtaWNvbnMgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3NlbGVjdEljb24nXCIgbnotaW5wdXQgcGxhY2Vob2xkZXI9XCJ7e2l0ZW0ucGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cIml0ZW0ucmVhZG9ubHkgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXg6IDFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj5cclxuICAgICAgICAgICAgICA8L2FwcC1zZWxlY3QtaWNvbnM+XHJcbiAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiaXRlbS50eXBlID09ICd0ZXh0J1wiIG56LWlucHV0IHBsYWNlaG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmb3JtQ2hhbmdlKCRldmVudCxpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJpdGVtLnJlYWRvbmx5IHx8IGZvcm1PcHRzLnR5cGUgPT0gJ3ZpZXcnXCJcclxuICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiLz5cclxuICAgICAgICAgICAgICA8dGV4dGFyZWEgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3RleHRhcmVhJ1wiIG56LWlucHV0IFtyb3dzXT1cIml0ZW0ucm93c1wiIHBsYWNlaG9sZGVyPVwie3tpdGVtLnBsYWNlaG9sZGVyfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW3JlYWRvbmx5XT1cIml0ZW0ucmVhZG9ubHl8fCBmb3JtT3B0cy50eXBlID09ICd2aWV3J1wiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgPG56LWlucHV0LW51bWJlciAqbmdJZj1cIml0ZW0udHlwZSA9PSAnbnVtYmVyJ1wiIG56UGxhY2VIb2xkZXI9XCJ7e2l0ZW0ucGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpNaW5dPVwiaXRlbS5taW5OdW1iZXJcIiBbbnpNYXhdPVwiaXRlbS5tYXhOdW1iZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiPjwvbnotaW5wdXQtbnVtYmVyPlxyXG4gICAgICAgICAgICAgIDxuei1yYWRpby1ncm91cCAqbmdJZj1cIml0ZW0udHlwZSA9PSAncmFkaW8nXCIgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIG56LXJhZGlvICpuZ0Zvcj1cImxldCBvIG9mIGl0ZW0uZGljdExpc3RcIiBbbnpWYWx1ZV09XCJvLnZhbHVlXCI+e3tvLmxhYmVsfX08L2xhYmVsPlxyXG4gICAgICAgICAgICAgIDwvbnotcmFkaW8tZ3JvdXA+XHJcbiAgICAgICAgICAgICAgPG56LWNoZWNrYm94LXdyYXBwZXIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2NoZWNrYm94J1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgbnotcm93PlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvIG9mIGl0ZW0uZGljdExpc3RcIiBuei1jb2w+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIG56LWNoZWNrYm94IFtuelZhbHVlXT1cIm8udmFsdWVcIj57e28ubGFiZWx9fTwvbGFiZWw+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L256LWNoZWNrYm94LXdyYXBwZXI+XHJcbiAgICAgICAgICAgICAgPG56LXNlbGVjdFxyXG4gICAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiaXRlbS50eXBlID09ICdzZWxlY3QnXCJcclxuICAgICAgICAgICAgICAgIG56UGxhY2VIb2xkZXI9XCJ7e2l0ZW0ucGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgICAgICBuekFsbG93Q2xlYXI9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIlxyXG4gICAgICAgICAgICAgICAgbnpTZXJ2ZXJTZWFyY2hcclxuICAgICAgICAgICAgICAgIFtuek1vZGVdPVwiaXRlbS5uek1vZGUgfHwgJ2RlZmF1bHQnXCJcclxuICAgICAgICAgICAgICAgIG56RGlzYWJsZWQ9XCJ7e2l0ZW0ucmVhZG9ubHl8fCBmb3JtT3B0cy50eXBlID09ICd2aWV3J319XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bnotb3B0aW9uICpuZ0Zvcj1cImxldCBvIG9mIGRpY3RzW2l0ZW0uZGljdENvZGVdXCIgW256TGFiZWxdPVwiby50eXBlTmFtZVwiIFtuelZhbHVlXT1cIm8uaWRcIj48L256LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L256LXNlbGVjdD5cclxuICAgICAgICAgICAgICA8bnotc2VsZWN0XHJcbiAgICAgICAgICAgICAgICBbbnpTaG93U2VhcmNoXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3NlbGVjdGMnXCJcclxuICAgICAgICAgICAgICAgIG56UGxhY2VIb2xkZXI9XCJ7e2l0ZW0ucGxhY2Vob2xkZXJ9fVwiXHJcbiAgICAgICAgICAgICAgICBuekFsbG93Q2xlYXI9XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIlxyXG4gICAgICAgICAgICAgICAgbnpTZXJ2ZXJTZWFyY2hcclxuICAgICAgICAgICAgICAgIFtuek1vZGVdPVwiaXRlbS5uek1vZGUgfHwgJ2RlZmF1bHQnXCJcclxuICAgICAgICAgICAgICAgIG56RGlzYWJsZWQ9XCJ7e2l0ZW0ucmVhZG9ubHl8fCBmb3JtT3B0cy50eXBlID09ICd2aWV3J319XCJcclxuICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInNlbGVjdENoYW5nZSgkZXZlbnQsaXRlbSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxuei1vcHRpb24gKm5nRm9yPVwibGV0IG8gb2YgaXRlbS5kaWN0TGlzdFwiIFtuekxhYmVsXT1cIm8ubGFiZWxcIiBbbnpWYWx1ZV09XCJvLnZhbHVlXCI+PC9uei1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPC9uei1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPG56LWNhc2NhZGVyIFtuekRpc2FibGVkXT1cIml0ZW0ucmVhZG9ubHlcIiBzdHlsZT1cImZsZXg6IDFcIiBbbnpBbGxvd0NsZWFyXT1cIiFpdGVtLm5vdE51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpWYWx1ZVByb3BlcnR5XT1cIiduelZhbHVlUHJvcGVydHknXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW256U2hvd1NlYXJjaF09XCJ0cnVlXCIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2Nhc2NhZGVyJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuekNoYW5nZU9uU2VsZWN0XSA9IFwiaXRlbS5hbGxvd1NlbGVjdE5vZGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpPcHRpb25zXT1cIml0ZW0uZGljdExpc3RcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+PC9uei1jYXNjYWRlcj5cclxuICAgICAgICAgICAgICA8bnotZGF0ZS1waWNrZXIgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2RhdGUnXCIgW256Rm9ybWF0XT1cIml0ZW0uZGF0ZUZvcm1hdCA/IGl0ZW0uZGF0ZUZvcm1hdCA6ICd5eXl5LU1NLWRkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelNob3dUaW1lXT1cInNob3dUaW1lKGl0ZW0pXCIgc3R5bGU9XCJmbGV4OiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW256RGlzYWJsZWRdPVwiZm9ybU9wdHMudHlwZSA9PSAndmlldycgfHwgaXRlbS5yZWFkb25seSBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCI+PC9uei1kYXRlLXBpY2tlcj5cclxuICAgICAgICAgICAgICA8bnotcmFuZ2UtcGlja2VyICpuZ0lmPVwiaXRlbS50eXBlID09ICdkYXRlUmFuZ2UnXCIgc3R5bGU9XCJmbGV4OiAxXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelNob3dUaW1lXT1cIml0ZW0ubnpTaG93VGltZT8gaXRlbS5uelNob3dUaW1lIDogZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbnpGb3JtYXRdPVwiaXRlbS5uelNob3dUaW1lICYmIGl0ZW0ubnpTaG93VGltZS5uekZvcm1hdCA/ICgneXl5eS1NTS1kZCAnKyBpdGVtLm56U2hvd1RpbWUubnpGb3JtYXQpIDogJ3l5eXktTU0tZGQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuelBsYWNlSG9sZGVyXT1cIlsn5byA5aeL5pe26Ze0JywgJ+e7k+adn+aXtumXtCddXCI+PC9uei1yYW5nZS1waWNrZXI+XHJcblxyXG4gICAgICAgICAgICAgIDxpbnB1dCAqbmdJZj1cIml0ZW0udHlwZSA9PSAnaW1hZ2UnXCIgbnotaW5wdXQgW2Zvcm1Db250cm9sTmFtZV09XCJpdGVtLmtleVwiIFtoaWRkZW5dPVwidHJ1ZVwiLz5cclxuICAgICAgICAgICAgICA8YXRyLWltZy11cGxvYWQgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2ltYWdlJ1wiIFsob3B0cyldPVwiaXRlbS5pbWFnZU9wdHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25CZWZvcmVVcGxvYWQpPVwib25CZWZvcmVVcGxvYWQoJGV2ZW50LGl0ZW0pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFmdGVyQ2hhbmdlKT1cImltYWdlVXBsb2FkQ2hhbmdlKCRldmVudClcIj48L2F0ci1pbWctdXBsb2FkPlxyXG5cclxuICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgIDxlZGl0b3IgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ2VkaXRvcidcIiBbZm9ybUNvbnRyb2xOYW1lXT1cIml0ZW0ua2V5XCIgW2NvbmZpZ109XCJ7aW5pdGlhbEZyYW1lSGVpZ2h0Oml0ZW0uaGVpZ2h0fVwiID48L2VkaXRvcj4tLT5cclxuICAgICAgICAgICAgICA8YXBwLXF1aWxsLWVkaXRvciAqbmdJZj1cIml0ZW0udHlwZSA9PSAnZWRpdG9yJ1wiIFtmb3JtQ29udHJvbE5hbWVdPVwiaXRlbS5rZXlcIiAobmdNb2RlbENoYW5nZSk9XCJlZGl0Q2hhbmdlKCRldmVudCxpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlc109XCJ7aGVpZ2h0Oml0ZW0uaGVpZ2h0ID4gMCA/IGl0ZW0uaGVpZ2h0ICsgJ3B4JyA6ICcyNTBweCd9XCI+PC9hcHAtcXVpbGwtZWRpdG9yPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnR5cGUgPT0gJ3dvcmQnXCIgW2lubmVySFRNTF09XCJpdGVtLnZhbHVlIHxkZWZWYWw6aXRlbS5kZWZhdWx0VmFsdWUgfHNhZmVIdG1sXCI+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0udHlwZSA9PSAnYnV0dG9ucydcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGJ0biBvZiBpdGVtLmJ1dHRvbnNcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBuei1idXR0b24gdHlwZT1cImJ1dHRvblwiIFtuelR5cGVdPVwiYnRuLmJ0blR5cGUgfGRlZlZhbDogJ2RlZmF1bHQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFudC1idG4gYW50LWJ0bi1wcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cIm1hcmdpbi1yaWdodDogNXB4XCIgKm5nSWY9XCJidG4uaXNTaG93IHx8IGlzU2hvdyhmYWxzZSxidG4ub3BlcmF0b3IpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG9BY3Rpb24oYnRuLCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e2J0bi5uYW1lfX08L3NwYW4+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2YWxpZCBvZiBpdGVtLnZhbGlkYXRvcnNcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhdHJGb3JtLmdldChpdGVtLmtleSkuaGFzRXJyb3IodmFsaWQudHlwZSkgJiYgKGF0ckZvcm0uZ2V0KGl0ZW0ua2V5KS5kaXJ0eSApXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjpyZWQ7ICAgIGhlaWdodDogMTVweDttYXJnaW46IDA7bGluZS1oZWlnaHQ6IDE1cHg7XCI+e3t2YWxpZC5lcnJvckxhYmVsfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gbnotYnV0dG9uIG56VHlwZT1cImRlZmF1bHRcIiBzdHlsZT1cImN1cnNvcjogZGVmYXVsdDtiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhO2NvbG9yOiBibGFja1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIml0ZW0uZW5kc1wiIGRpc2FibGVkPlxyXG4gICAgICAgICAgICAgICAge3tpdGVtLmVuZHN9fVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpdGVtLmJ1dHRvbj8uaXNTaG93XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYW50LWJ0biBhbnQtYnRuLXByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRvQWN0aW9uKGl0ZW0uYnV0dG9uLCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPnt7aXRlbS5idXR0b24ubmFtZX19PC9zcGFuPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0ucHJvcG9zYWxcIiBzdHlsZT1cImNvbG9yOiByZWQ7d2lkdGg6IDEwMCVcIj57e2l0ZW0ucHJvcG9zYWx9fTwvZGl2PlxyXG4gICAgICAgICAgPC9uei1mb3JtLWNvbnRyb2w+XHJcbiAgICAgICAgPC9uei1mb3JtLWl0ZW0+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgKm5nVGVtcGxhdGVPdXRsZXQ9XCJpdGVtLnRlbXBcIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcblxyXG48L2Zvcm0+XHJcbiJdfQ==
|